From 4587cee18956bb8ca0afe787b373e226646119ee Mon Sep 17 00:00:00 2001 From: Andrew Bastin Date: Wed, 11 Oct 2023 12:04:43 +0530 Subject: [PATCH] feat: initial desktop app commit --- .../hoppscotch-common/src/components.d.ts | 6 - .../hoppscotch-selfhost-desktop/.gitignore | 24 + .../.sitemap-gen/robots.txt | 4 + .../.sitemap-gen/sitemap.xml | 1 + .../.vscode/extensions.json | 7 + .../hoppscotch-selfhost-desktop/README.md | 16 + .../hoppscotch-selfhost-desktop/index.html | 26 + packages/hoppscotch-selfhost-desktop/meta.ts | 118 + .../hoppscotch-selfhost-desktop/package.json | 63 + .../public/tauri.svg | 6 + .../public/vite.svg | 1 + .../src-tauri/.gitignore | 4 + .../src-tauri/Cargo.lock | 4217 ++++++++++++++ .../src-tauri/Cargo.toml | 35 + .../src-tauri/Info.plist | 19 + .../src-tauri/build.rs | 3 + .../src-tauri/icons/128x128.png | Bin 0 -> 3512 bytes .../src-tauri/icons/128x128@2x.png | Bin 0 -> 7012 bytes .../src-tauri/icons/32x32.png | Bin 0 -> 974 bytes .../src-tauri/icons/Square107x107Logo.png | Bin 0 -> 2863 bytes .../src-tauri/icons/Square142x142Logo.png | Bin 0 -> 3858 bytes .../src-tauri/icons/Square150x150Logo.png | Bin 0 -> 3966 bytes .../src-tauri/icons/Square284x284Logo.png | Bin 0 -> 7737 bytes .../src-tauri/icons/Square30x30Logo.png | Bin 0 -> 903 bytes .../src-tauri/icons/Square310x310Logo.png | Bin 0 -> 8591 bytes .../src-tauri/icons/Square44x44Logo.png | Bin 0 -> 1299 bytes .../src-tauri/icons/Square71x71Logo.png | Bin 0 -> 2011 bytes .../src-tauri/icons/Square89x89Logo.png | Bin 0 -> 2468 bytes .../src-tauri/icons/StoreLogo.png | Bin 0 -> 1523 bytes .../src-tauri/icons/icon.icns | Bin 0 -> 98451 bytes .../src-tauri/icons/icon.ico | Bin 0 -> 86642 bytes .../src-tauri/icons/icon.png | Bin 0 -> 14183 bytes .../src-tauri/src/mac/mod.rs | 1 + .../src-tauri/src/mac/window.rs | 345 ++ .../src-tauri/src/main.rs | 48 + .../src-tauri/src/win/mod.rs | 1 + .../src-tauri/src/win/window.rs | 86 + .../src-tauri/tauri.conf.json | 65 + .../src/api/generated/backend-schema.json | 5088 +++++++++++++++++ .../src/api/generated/graphql.ts | 1857 ++++++ .../mutations/ClearGlobalEnvironments.graphql | 5 + .../CreateGQLChildUserCollection.graphql | 11 + .../CreateGQLRootUserCollection.graphql | 5 + .../mutations/CreateGQLUserRequest.graphql | 13 + .../CreateRESTChildUserCollection.graphql | 11 + .../CreateRESTRootUserCollection.graphql | 5 + .../mutations/CreateRESTUserRequest.graphql | 13 + .../mutations/CreateUserEnvironment.graphql | 9 + .../CreateUserGlobalEnvironment.graphql | 5 + .../api/mutations/CreateUserHistory.graphql | 13 + .../api/mutations/CreateUserSettings.graphql | 5 + .../mutations/DeleteAllUserHistory.graphql | 6 + .../mutations/DeleteUserCollection.graphql | 3 + .../mutations/DeleteUserEnvironments.graphql | 3 + .../api/mutations/DeleteUserRequest.graphql | 3 + .../api/mutations/MoveUserCollection.graphql | 8 + .../src/api/mutations/MoveUserRequest.graphql | 15 + .../RemoveRequestFromHistory.graphql | 5 + .../mutations/RenameUserCollection.graphql | 8 + .../mutations/ToggleHistoryStarStatus.graphql | 5 + .../mutations/UpdateGQLUserRequest.graphql | 5 + .../mutations/UpdateRESTUserRequest.graphql | 7 + .../UpdateUserCollectionOrder.graphql | 6 + .../mutations/UpdateUserEnvironment.graphql | 9 + .../api/mutations/UpdateUserSession.graphql | 11 + .../api/mutations/UpdateUserSettings.graphql | 5 + .../api/queries/CreateUserEnvironment.graphql | 9 + .../ExportUserCollectionsToJSON.graphql | 12 + .../api/queries/GetCurrentRESTSession.graphql | 5 + .../api/queries/GetGlobalEnvironments.graphql | 11 + .../api/queries/GetRestUserHistory.graphql | 23 + .../queries/GetRootGQLUserCollections.graphql | 13 + .../api/queries/GetUserEnvironments.graphql | 11 + .../queries/GetUserRootCollections.graphql | 13 + .../src/api/queries/GetUserSettings.graphql | 8 + .../UserCollectionCreated.graphql | 10 + .../subscriptions/UserCollectionMoved.graphql | 9 + .../UserCollectionOrderUpdated.graphql | 17 + .../UserCollectionRemoved.graphql | 6 + .../UserCollectionUpdated.graphql | 10 + .../UserEnvironmentCreated.graphql | 9 + .../UserEnvironmentDeleted.graphql | 5 + .../UserEnvironmentUpdated.graphql | 9 + .../subscriptions/UserHistoryCreated.graphql | 10 + .../subscriptions/UserHistoryDeleted.graphql | 6 + .../UserHistoryDeletedMany.graphql | 6 + .../subscriptions/UserHistoryUpdated.graphql | 10 + .../subscriptions/UserRequestCreated.graphql | 9 + .../subscriptions/UserRequestDeleted.graphql | 9 + .../subscriptions/UserRequestMoved.graphql | 13 + .../subscriptions/UserRequestUpdated.graphql | 9 + .../subscriptions/UserSettingsUpdated.graphql | 6 + .../src/lib/sync/index.ts | 102 + .../src/lib/sync/mapper.ts | 42 + .../hoppscotch-selfhost-desktop/src/main.ts | 114 + .../src/platform/auth.ts | 373 ++ .../platform/collections/collections.api.ts | 305 + .../collections/collections.platform.ts | 789 +++ .../platform/collections/collections.sync.ts | 543 ++ .../collections/gqlCollections.sync.ts | 269 + .../platform/environments/environments.api.ts | 117 + .../environments/environments.platform.ts | 200 + .../environments/environments.sync.ts | 117 + .../src/platform/history/history.api.ts | 100 + .../src/platform/history/history.platform.ts | 261 + .../src/platform/history/history.sync.ts | 101 + .../src/platform/settings/settings.api.ts | 51 + .../platform/settings/settings.platform.ts | 88 + .../src/platform/settings/settings.sync.ts | 21 + .../platform/std/interceptors/localclient.ts | 142 + .../src/platform/tabState/tabState.api.ts | 36 + .../platform/tabState/tabState.platform.ts | 37 + .../src/vite-env.d.ts | 7 + .../hoppscotch-selfhost-desktop/tsconfig.json | 25 + .../tsconfig.node.json | 9 + .../vite.config.ts | 201 + .../vite.config.ts.bak | 201 + .../vite.config.ts.bak2 | 201 + pnpm-lock.yaml | 1172 +++- 119 files changed, 18023 insertions(+), 94 deletions(-) create mode 100644 packages/hoppscotch-selfhost-desktop/.gitignore create mode 100644 packages/hoppscotch-selfhost-desktop/.sitemap-gen/robots.txt create mode 100644 packages/hoppscotch-selfhost-desktop/.sitemap-gen/sitemap.xml create mode 100644 packages/hoppscotch-selfhost-desktop/.vscode/extensions.json create mode 100644 packages/hoppscotch-selfhost-desktop/README.md create mode 100644 packages/hoppscotch-selfhost-desktop/index.html create mode 100644 packages/hoppscotch-selfhost-desktop/meta.ts create mode 100644 packages/hoppscotch-selfhost-desktop/package.json create mode 100644 packages/hoppscotch-selfhost-desktop/public/tauri.svg create mode 100644 packages/hoppscotch-selfhost-desktop/public/vite.svg create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/.gitignore create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.lock create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.toml create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/Info.plist create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/build.rs create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/icons/128x128.png create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/icons/128x128@2x.png create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/icons/32x32.png create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/icons/Square107x107Logo.png create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/icons/Square142x142Logo.png create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/icons/Square150x150Logo.png create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/icons/Square284x284Logo.png create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/icons/Square30x30Logo.png create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/icons/Square310x310Logo.png create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/icons/Square44x44Logo.png create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/icons/Square71x71Logo.png create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/icons/Square89x89Logo.png create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/icons/StoreLogo.png create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/icons/icon.icns create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/icons/icon.ico create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/icons/icon.png create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/src/mac/mod.rs create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/src/mac/window.rs create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/src/main.rs create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/src/win/mod.rs create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/src/win/window.rs create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/tauri.conf.json create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/generated/backend-schema.json create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/generated/graphql.ts create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/mutations/ClearGlobalEnvironments.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateGQLChildUserCollection.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateGQLRootUserCollection.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateGQLUserRequest.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateRESTChildUserCollection.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateRESTRootUserCollection.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateRESTUserRequest.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateUserEnvironment.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateUserGlobalEnvironment.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateUserHistory.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateUserSettings.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/mutations/DeleteAllUserHistory.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/mutations/DeleteUserCollection.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/mutations/DeleteUserEnvironments.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/mutations/DeleteUserRequest.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/mutations/MoveUserCollection.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/mutations/MoveUserRequest.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/mutations/RemoveRequestFromHistory.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/mutations/RenameUserCollection.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/mutations/ToggleHistoryStarStatus.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/mutations/UpdateGQLUserRequest.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/mutations/UpdateRESTUserRequest.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/mutations/UpdateUserCollectionOrder.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/mutations/UpdateUserEnvironment.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/mutations/UpdateUserSession.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/mutations/UpdateUserSettings.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/queries/CreateUserEnvironment.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/queries/ExportUserCollectionsToJSON.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/queries/GetCurrentRESTSession.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/queries/GetGlobalEnvironments.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/queries/GetRestUserHistory.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/queries/GetRootGQLUserCollections.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/queries/GetUserEnvironments.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/queries/GetUserRootCollections.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/queries/GetUserSettings.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserCollectionCreated.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserCollectionMoved.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserCollectionOrderUpdated.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserCollectionRemoved.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserCollectionUpdated.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserEnvironmentCreated.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserEnvironmentDeleted.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserEnvironmentUpdated.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserHistoryCreated.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserHistoryDeleted.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserHistoryDeletedMany.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserHistoryUpdated.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserRequestCreated.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserRequestDeleted.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserRequestMoved.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserRequestUpdated.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserSettingsUpdated.graphql create mode 100644 packages/hoppscotch-selfhost-desktop/src/lib/sync/index.ts create mode 100644 packages/hoppscotch-selfhost-desktop/src/lib/sync/mapper.ts create mode 100644 packages/hoppscotch-selfhost-desktop/src/main.ts create mode 100644 packages/hoppscotch-selfhost-desktop/src/platform/auth.ts create mode 100644 packages/hoppscotch-selfhost-desktop/src/platform/collections/collections.api.ts create mode 100644 packages/hoppscotch-selfhost-desktop/src/platform/collections/collections.platform.ts create mode 100644 packages/hoppscotch-selfhost-desktop/src/platform/collections/collections.sync.ts create mode 100644 packages/hoppscotch-selfhost-desktop/src/platform/collections/gqlCollections.sync.ts create mode 100644 packages/hoppscotch-selfhost-desktop/src/platform/environments/environments.api.ts create mode 100644 packages/hoppscotch-selfhost-desktop/src/platform/environments/environments.platform.ts create mode 100644 packages/hoppscotch-selfhost-desktop/src/platform/environments/environments.sync.ts create mode 100644 packages/hoppscotch-selfhost-desktop/src/platform/history/history.api.ts create mode 100644 packages/hoppscotch-selfhost-desktop/src/platform/history/history.platform.ts create mode 100644 packages/hoppscotch-selfhost-desktop/src/platform/history/history.sync.ts create mode 100644 packages/hoppscotch-selfhost-desktop/src/platform/settings/settings.api.ts create mode 100644 packages/hoppscotch-selfhost-desktop/src/platform/settings/settings.platform.ts create mode 100644 packages/hoppscotch-selfhost-desktop/src/platform/settings/settings.sync.ts create mode 100644 packages/hoppscotch-selfhost-desktop/src/platform/std/interceptors/localclient.ts create mode 100644 packages/hoppscotch-selfhost-desktop/src/platform/tabState/tabState.api.ts create mode 100644 packages/hoppscotch-selfhost-desktop/src/platform/tabState/tabState.platform.ts create mode 100644 packages/hoppscotch-selfhost-desktop/src/vite-env.d.ts create mode 100644 packages/hoppscotch-selfhost-desktop/tsconfig.json create mode 100644 packages/hoppscotch-selfhost-desktop/tsconfig.node.json create mode 100644 packages/hoppscotch-selfhost-desktop/vite.config.ts create mode 100644 packages/hoppscotch-selfhost-desktop/vite.config.ts.bak create mode 100644 packages/hoppscotch-selfhost-desktop/vite.config.ts.bak2 diff --git a/packages/hoppscotch-common/src/components.d.ts b/packages/hoppscotch-common/src/components.d.ts index 65647463a..b7a89789a 100644 --- a/packages/hoppscotch-common/src/components.d.ts +++ b/packages/hoppscotch-common/src/components.d.ts @@ -93,13 +93,11 @@ declare module 'vue' { HoppButtonPrimary: typeof import('@hoppscotch/ui')['HoppButtonPrimary'] HoppButtonSecondary: typeof import('@hoppscotch/ui')['HoppButtonSecondary'] HoppSmartAnchor: typeof import('@hoppscotch/ui')['HoppSmartAnchor'] - HoppSmartAutoComplete: typeof import('@hoppscotch/ui')['HoppSmartAutoComplete'] HoppSmartCheckbox: typeof import('@hoppscotch/ui')['HoppSmartCheckbox'] HoppSmartConfirmModal: typeof import('@hoppscotch/ui')['HoppSmartConfirmModal'] HoppSmartExpand: typeof import('@hoppscotch/ui')['HoppSmartExpand'] HoppSmartFileChip: typeof import('@hoppscotch/ui')['HoppSmartFileChip'] HoppSmartInput: typeof import('@hoppscotch/ui')['HoppSmartInput'] - HoppSmartIntersection: typeof import('@hoppscotch/ui')['HoppSmartIntersection'] HoppSmartItem: typeof import('@hoppscotch/ui')['HoppSmartItem'] HoppSmartLink: typeof import('@hoppscotch/ui')['HoppSmartLink'] HoppSmartModal: typeof import('@hoppscotch/ui')['HoppSmartModal'] @@ -146,7 +144,6 @@ declare module 'vue' { IconLucideAlertTriangle: typeof import('~icons/lucide/alert-triangle')['default'] IconLucideArrowLeft: typeof import('~icons/lucide/arrow-left')['default'] IconLucideArrowUpRight: typeof import('~icons/lucide/arrow-up-right')['default'] - IconLucideBrush: typeof import('~icons/lucide/brush')['default'] IconLucideCheckCircle: typeof import('~icons/lucide/check-circle')['default'] IconLucideChevronRight: typeof import('~icons/lucide/chevron-right')['default'] IconLucideGlobe: typeof import('~icons/lucide/globe')['default'] @@ -156,10 +153,8 @@ declare module 'vue' { IconLucideLayers: typeof import('~icons/lucide/layers')['default'] IconLucideListEnd: typeof import('~icons/lucide/list-end')['default'] IconLucideMinus: typeof import('~icons/lucide/minus')['default'] - IconLucideRss: typeof import('~icons/lucide/rss')['default'] IconLucideSearch: typeof import('~icons/lucide/search')['default'] IconLucideUsers: typeof import('~icons/lucide/users')['default'] - IconLucideVerified: typeof import('~icons/lucide/verified')['default'] InterceptorsExtensionSubtitle: typeof import('./components/interceptors/ExtensionSubtitle.vue')['default'] LensesHeadersRenderer: typeof import('./components/lenses/HeadersRenderer.vue')['default'] LensesHeadersRendererEntry: typeof import('./components/lenses/HeadersRendererEntry.vue')['default'] @@ -192,7 +187,6 @@ declare module 'vue' { SmartEnvInput: typeof import('./components/smart/EnvInput.vue')['default'] SmartExpand: typeof import('./../../hoppscotch-ui/src/components/smart/Expand.vue')['default'] SmartFileChip: typeof import('./../../hoppscotch-ui/src/components/smart/FileChip.vue')['default'] - SmartFontSizePicker: typeof import('./components/smart/FontSizePicker.vue')['default'] SmartInput: typeof import('./../../hoppscotch-ui/src/components/smart/Input.vue')['default'] SmartIntersection: typeof import('./../../hoppscotch-ui/src/components/smart/Intersection.vue')['default'] SmartItem: typeof import('./../../hoppscotch-ui/src/components/smart/Item.vue')['default'] diff --git a/packages/hoppscotch-selfhost-desktop/.gitignore b/packages/hoppscotch-selfhost-desktop/.gitignore new file mode 100644 index 000000000..a547bf36d --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/packages/hoppscotch-selfhost-desktop/.sitemap-gen/robots.txt b/packages/hoppscotch-selfhost-desktop/.sitemap-gen/robots.txt new file mode 100644 index 000000000..1a472838a --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/.sitemap-gen/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: http://localhost:3000/sitemap.xml \ No newline at end of file diff --git a/packages/hoppscotch-selfhost-desktop/.sitemap-gen/sitemap.xml b/packages/hoppscotch-selfhost-desktop/.sitemap-gen/sitemap.xml new file mode 100644 index 000000000..d2df7e305 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/.sitemap-gen/sitemap.xml @@ -0,0 +1 @@ +http://localhost:3000/settings2023-10-11T06:31:17.965Zdaily1.0http://localhost:3000/realtime2023-10-11T06:31:17.965Zdaily1.0http://localhost:3000/realtime/websocket2023-10-11T06:31:17.965Zdaily1.0http://localhost:3000/realtime/sse2023-10-11T06:31:17.965Zdaily1.0http://localhost:3000/realtime/socketio2023-10-11T06:31:17.965Zdaily1.0http://localhost:3000/realtime/mqtt2023-10-11T06:31:17.965Zdaily1.0http://localhost:3000/profile2023-10-11T06:31:17.965Zdaily1.0http://localhost:3000/join-team2023-10-11T06:31:17.965Zdaily1.0http://localhost:3000/2023-10-11T06:31:17.965Zdaily1.0http://localhost:3000/import2023-10-11T06:31:17.965Zdaily1.0http://localhost:3000/graphql2023-10-11T06:31:17.965Zdaily1.0http://localhost:3000/enter2023-10-11T06:31:17.965Zdaily1.0 \ No newline at end of file diff --git a/packages/hoppscotch-selfhost-desktop/.vscode/extensions.json b/packages/hoppscotch-selfhost-desktop/.vscode/extensions.json new file mode 100644 index 000000000..cf4385bdd --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "Vue.volar", + "tauri-apps.tauri-vscode", + "rust-lang.rust-analyzer" + ] +} diff --git a/packages/hoppscotch-selfhost-desktop/README.md b/packages/hoppscotch-selfhost-desktop/README.md new file mode 100644 index 000000000..e6b0bd5e8 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/README.md @@ -0,0 +1,16 @@ +# Tauri + Vue 3 + TypeScript + +This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` + + + + \ No newline at end of file diff --git a/packages/hoppscotch-selfhost-desktop/meta.ts b/packages/hoppscotch-selfhost-desktop/meta.ts new file mode 100644 index 000000000..529fbcb1d --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/meta.ts @@ -0,0 +1,118 @@ +import { IHTMLTag } from "vite-plugin-html-config" + +export const APP_INFO = { + name: "Hoppscotch", + shortDescription: "Open source API development ecosystem", + description: + "Helps you create requests faster, saving precious time on development.", + keywords: + "hoppscotch, hopp scotch, hoppscotch online, hoppscotch app, postwoman, postwoman chrome, postwoman online, postwoman for mac, postwoman app, postwoman for windows, postwoman google chrome, postwoman chrome app, get postwoman, postwoman web, postwoman android, postwoman app for chrome, postwoman mobile app, postwoman web app, api, request, testing, tool, rest, websocket, sse, graphql, socketio", + app: { + background: "#202124", + }, + social: { + twitter: "@hoppscotch_io", + }, +} as const + +export const META_TAGS = (env: Record): IHTMLTag[] => [ + { + name: "keywords", + content: APP_INFO.keywords, + }, + { + name: "X-UA-Compatible", + content: "IE=edge, chrome=1", + }, + { + name: "name", + content: `${APP_INFO.name} • ${APP_INFO.shortDescription}`, + }, + { + name: "description", + content: APP_INFO.description, + }, + { + name: "image", + content: `${env.VITE_BASE_URL}/banner.png`, + }, + // Open Graph tags + { + name: "og:title", + content: `${APP_INFO.name} • ${APP_INFO.shortDescription}`, + }, + { + name: "og:description", + content: APP_INFO.description, + }, + { + name: "og:image", + content: `${env.VITE_BASE_URL}/banner.png`, + }, + // Twitter tags + { + name: "twitter:card", + content: "summary_large_image", + }, + { + name: "twitter:site", + content: APP_INFO.social.twitter, + }, + { + name: "twitter:creator", + content: APP_INFO.social.twitter, + }, + { + name: "twitter:title", + content: `${APP_INFO.name} • ${APP_INFO.shortDescription}`, + }, + { + name: "twitter:description", + content: APP_INFO.description, + }, + { + name: "twitter:image", + content: `${env.VITE_BASE_URL}/banner.png`, + }, + // Add to homescreen for Chrome on Android. Fallback for PWA (handled by nuxt) + { + name: "application-name", + content: APP_INFO.name, + }, + // Windows phone tile icon + { + name: "msapplication-TileImage", + content: `${env.VITE_BASE_URL}/icon.png`, + }, + { + name: "msapplication-TileColor", + content: APP_INFO.app.background, + }, + { + name: "msapplication-tap-highlight", + content: "no", + }, + // iOS Safari + { + name: "apple-mobile-web-app-title", + content: APP_INFO.name, + }, + { + name: "apple-mobile-web-app-capable", + content: "yes", + }, + { + name: "apple-mobile-web-app-status-bar-style", + content: "black-translucent", + }, + // PWA + { + name: "theme-color", + content: APP_INFO.app.background, + }, + { + name: "mask-icon", + content: "/icon.png", + color: APP_INFO.app.background, + }, +] \ No newline at end of file diff --git a/packages/hoppscotch-selfhost-desktop/package.json b/packages/hoppscotch-selfhost-desktop/package.json new file mode 100644 index 000000000..3367c5972 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/package.json @@ -0,0 +1,63 @@ +{ + "name": "@hoppscotch/desktop", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "node --max_old_space_size=16384 ./node_modules/vite/bin/vite.js build", + "preview": "vite preview", + "tauri": "tauri" + }, + "dependencies": { + "@hoppscotch/common": "workspace:^", + "@platform/auth": "^0.1.106", + "@tauri-apps/api": "^1.3.0", + "@tauri-apps/cli": "^1.3.0", + "@vueuse/core": "^10.4.1", + "axios": "^0.21.4", + "buffer": "^6.0.3", + "environments.api": "link:@platform/environments/environments.api", + "event": "link:@tauri-apps/api/event", + "fp-ts": "^2.16.0", + "lodash-es": "^4.17.21", + "process": "^0.11.10", + "rxjs": "^7.8.1", + "shell": "link:@tauri-apps/api/shell", + "stream-browserify": "^3.0.0", + "tauri": "link:@tauri-apps/api/tauri", + "tauri-plugin-store-api": "github:tauri-apps/tauri-plugin-store#v1", + "util": "^0.12.4", + "vue": "^3.2.45", + "workbox-window": "^6.5.4" + }, + "devDependencies": { + "@intlify/vite-plugin-vue-i18n": "^6.0.1", + "@rushstack/eslint-patch": "^1.1.4", + "@types/node": "^18.7.10", + "@typescript-eslint/eslint-plugin": "^5.19.0", + "@typescript-eslint/parser": "^5.19.0", + "@vitejs/plugin-legacy": "^2.3.0", + "@vitejs/plugin-vue": "^4.0.0", + "@vue/eslint-config-typescript": "^11.0.1", + "cross-env": "^7.0.3", + "eslint": "^8.28.0", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-vue": "^9.5.1", + "typescript": "^4.9.5", + "unplugin-icons": "^0.14.9", + "unplugin-vue-components": "^0.21.0", + "vite": "^4.2.1", + "vite-plugin-fonts": "^0.6.0", + "vite-plugin-html-config": "^1.0.10", + "vite-plugin-inspect": "^0.7.4", + "vite-plugin-pages": "^0.26.0", + "vite-plugin-pages-sitemap": "^1.4.0", + "vite-plugin-pwa": "^0.13.1", + "vite-plugin-static-copy": "^0.12.0", + "vite-plugin-vue-layouts": "^0.7.0", + "vite-plugin-windicss": "^1.8.8", + "vue-tsc": "^1.0.11", + "windicss": "^3.5.6" + } +} diff --git a/packages/hoppscotch-selfhost-desktop/public/tauri.svg b/packages/hoppscotch-selfhost-desktop/public/tauri.svg new file mode 100644 index 000000000..31b62c928 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/public/tauri.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/packages/hoppscotch-selfhost-desktop/public/vite.svg b/packages/hoppscotch-selfhost-desktop/public/vite.svg new file mode 100644 index 000000000..e7b8dfb1b --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/.gitignore b/packages/hoppscotch-selfhost-desktop/src-tauri/.gitignore new file mode 100644 index 000000000..f4dfb82b2 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src-tauri/.gitignore @@ -0,0 +1,4 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ + diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.lock b/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.lock new file mode 100644 index 000000000..a301a9ad8 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.lock @@ -0,0 +1,4217 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aho-corasick" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" + +[[package]] +name = "atk" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd" +dependencies = [ + "atk-sys", + "bitflags 1.3.2", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.1.1", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backtrace" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "brotli" +version = "3.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "2.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bstr" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "bumpalo" +version = "3.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" + +[[package]] +name = "bytemuck" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +dependencies = [ + "serde", +] + +[[package]] +name = "cairo-rs" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "glib", + "libc", + "thiserror", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" +dependencies = [ + "glib-sys", + "libc", + "system-deps 6.1.1", +] + +[[package]] +name = "cargo_toml" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "599aa35200ffff8f04c1925aa1acc92fa2e08874379ef42e210a80e527e60838" +dependencies = [ + "serde", + "toml 0.7.6", +] + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cfg-expr" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3431df59f28accaf4cb4eed4a9acc66bea3f3c3753aa6cdc2f024174ef232af7" +dependencies = [ + "smallvec", +] + +[[package]] +name = "cfg-expr" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "215c0072ecc28f92eeb0eea38ba63ddfcb65c2828c46311d646f1a3ff5f9841c" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "winapi", +] + +[[package]] +name = "cocoa" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" +dependencies = [ + "bitflags 1.3.2", + "block", + "cocoa-foundation", + "core-foundation", + "core-graphics 0.22.3", + "foreign-types 0.3.2", + "libc", + "objc", +] + +[[package]] +name = "cocoa" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6140449f97a6e97f9511815c5632d84c8aacf8ac271ad77c559218161a1373c" +dependencies = [ + "bitflags 1.3.2", + "block", + "cocoa-foundation", + "core-foundation", + "core-graphics 0.23.1", + "foreign-types 0.5.0", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "931d3837c286f56e3c58423ce4eba12d08db2374461a785c86f672b08b5650d6" +dependencies = [ + "bitflags 1.3.2", + "block", + "core-foundation", + "core-graphics-types", + "foreign-types 0.3.2", + "libc", + "objc", +] + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "combine" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" + +[[package]] +name = "core-graphics" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types 0.3.2", + "libc", +] + +[[package]] +name = "core-graphics" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "970a29baf4110c26fedbc7f82107d42c23f7e88e404c4577ed73fe99ff85a212" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types 0.5.0", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bb142d41022986c1d8ff29103a1411c8a3dfad3552f87a4f8dc50d61d4f4e33" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa 0.4.8", + "matches", + "phf 0.8.0", + "proc-macro2", + "quote", + "smallvec", + "syn 1.0.109", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.26", +] + +[[package]] +name = "ctor" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "darling" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.26", +] + +[[package]] +name = "darling_macro" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.26", +] + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 1.0.109", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dtoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" + +[[package]] +name = "dtoa-short" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbaceec3c6e4211c79e7b1800fb9680527106beb2f9c51904a3210c03a448c74" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dunce" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" + +[[package]] +name = "embed-resource" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7f1e82a60222fc67bfd50d752a9c89da5cce4c39ed39decc84a443b07bbd69a" +dependencies = [ + "cc", + "rustc_version", + "toml 0.7.6", + "vswhom", + "winreg 0.11.0", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "encoding_rs" +version = "0.8.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "fdeflate" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d329bdeac514ee06249dabc27877490f17f5d371ec693360768b838e19f3ae10" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "filetime" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.2.16", + "windows-sys 0.48.0", +] + +[[package]] +name = "flate2" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared 0.1.1", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared 0.3.1", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.26", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "futures-channel" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" + +[[package]] +name = "futures-executor" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" + +[[package]] +name = "futures-macro" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.26", +] + +[[package]] +name = "futures-sink" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" + +[[package]] +name = "futures-task" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" + +[[package]] +name = "futures-util" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "gdk" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a" +dependencies = [ + "bitflags 1.3.2", + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.1.1", +] + +[[package]] +name = "gdk-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps 6.1.1", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cca49a59ad8cfdf36ef7330fe7bdfbe1d34323220cc16a0de2679ee773aee2c2" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps 6.1.1", +] + +[[package]] +name = "gdkx11-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4b7f8c7a84b407aa9b143877e267e848ff34106578b64d1e0a24bf550716178" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps 6.1.1", + "x11", +] + +[[package]] +name = "generator" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e" +dependencies = [ + "cc", + "libc", + "log", + "rustversion", + "windows 0.48.0", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" + +[[package]] +name = "gio" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b" +dependencies = [ + "bitflags 1.3.2", + "futures-channel", + "futures-core", + "futures-io", + "gio-sys", + "glib", + "libc", + "once_cell", + "thiserror", +] + +[[package]] +name = "gio-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.1.1", + "winapi", +] + +[[package]] +name = "glib" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d" +dependencies = [ + "bitflags 1.3.2", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "once_cell", + "smallvec", + "thiserror", +] + +[[package]] +name = "glib-macros" +version = "0.15.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10c6ae9f6fa26f4fb2ac16b528d138d971ead56141de489f8111e259b9df3c4a" +dependencies = [ + "anyhow", + "heck 0.4.1", + "proc-macro-crate", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "glib-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" +dependencies = [ + "libc", + "system-deps 6.1.1", +] + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "globset" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1391ab1f92ffcc08911957149833e682aa3fe252b9f45f966d2ef972274c97df" +dependencies = [ + "aho-corasick", + "bstr", + "fnv", + "log", + "regex", +] + +[[package]] +name = "gobject-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" +dependencies = [ + "glib-sys", + "libc", + "system-deps 6.1.1", +] + +[[package]] +name = "gtk" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0" +dependencies = [ + "atk", + "bitflags 1.3.2", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "once_cell", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps 6.1.1", +] + +[[package]] +name = "gtk3-macros" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "684c0456c086e8e7e9af73ec5b84e35938df394712054550e81558d21c44ab0d" +dependencies = [ + "anyhow", + "proc-macro-crate", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "h2" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap 1.9.3", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hex_color" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff917051cbc87800de93ddcf39b59c9f2a0a4d809411a341c0ac422771219808" +dependencies = [ + "rand 0.8.5", +] + +[[package]] +name = "hoppscotch-desktop" +version = "0.0.0" +dependencies = [ + "cocoa 0.25.0", + "hex_color", + "objc", + "reqwest", + "serde_json", + "tauri", + "tauri-build", + "tauri-plugin-deep-link", + "tauri-plugin-store", + "tauri-plugin-window-state", + "url", +] + +[[package]] +name = "html5ever" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5c13fb08e5d4dfc151ee5e88bae63f7773d61852f3bdc73c9f4b9e1bde03148" +dependencies = [ + "log", + "mac", + "markup5ever", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "http" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +dependencies = [ + "bytes", + "fnv", + "itoa 1.0.9", +] + +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "http-range" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa 1.0.9", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows 0.48.0", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ico" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3804960be0bb5e4edb1e1ad67afd321a9ecfd875c3e65c099468fd2717d7cae" +dependencies = [ + "byteorder", + "png", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "ignore" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbe7873dab538a9a44ad79ede1faf5f30d49f9a5c883ddbab48bce81b64b7492" +dependencies = [ + "globset", + "lazy_static", + "log", + "memchr", + "regex", + "same-file", + "thread_local", + "walkdir", + "winapi-util", +] + +[[package]] +name = "image" +version = "0.24.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527909aa81e20ac3a44803521443a765550f09b5130c2c2fa1ea59c2f8f50a3a" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "num-rational", + "num-traits", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +dependencies = [ + "equivalent", + "hashbrown 0.14.0", +] + +[[package]] +name = "infer" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a898e4b7951673fce96614ce5751d13c40fc5674bc2d759288e46c3ab62598b3" +dependencies = [ + "cfb", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "interprocess" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81f2533f3be42fffe3b5e63b71aeca416c1c3bc33e4e27be018521e76b1f38fb" +dependencies = [ + "cfg-if", + "libc", + "rustc_version", + "to_method", + "winapi", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "ipnet" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" + +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + +[[package]] +name = "itoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" + +[[package]] +name = "javascriptcore-rs" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf053e7843f2812ff03ef5afe34bb9c06ffee120385caad4f6b9967fcd37d41c" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "905fbb87419c5cde6e3269537e4ea7d46431f3008c5d057e915ef3f115e7793c" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 5.0.0", +] + +[[package]] +name = "jni" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "js-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f54898088ccb91df1b492cc80029a6fdf1c48ca0db7c6822a8babad69c94658" +dependencies = [ + "serde", + "serde_json", + "thiserror", + "treediff", +] + +[[package]] +name = "kuchiki" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ea8e9c6e031377cff82ee3001dc8026cdf431ed4e2e6b51f98ab8c73484a358" +dependencies = [ + "cssparser", + "html5ever", + "matches", + "selectors", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.147" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" + +[[package]] +name = "line-wrap" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" +dependencies = [ + "safemem", +] + +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + +[[package]] +name = "lock_api" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" + +[[package]] +name = "loom" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "serde", + "serde_json", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "markup5ever" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a24f40fb03852d1cdd84330cddcaf98e9ec08a7b7768e952fad3b4cf048ec8fd" +dependencies = [ + "log", + "phf 0.8.0", + "phf_codegen", + "string_cache", + "string_cache_codegen", + "tendril", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.48.0", +] + +[[package]] +name = "native-tls" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "ndk" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" +dependencies = [ + "bitflags 1.3.2", + "jni-sys", + "ndk-sys", + "num_enum", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", + "objc_exception", +] + +[[package]] +name = "objc-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99e1d07c6eab1ce8b6382b8e3c7246fe117ff3f8b34be065f5ebace6749fe845" + +[[package]] +name = "objc2" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "559c5a40fdd30eb5e344fbceacf7595a81e242529fb4e21cf5f43fb4f11ff98d" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2-encode" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d079845b37af429bfe5dfa76e6d087d788031045b25cfc6fd898486fd9847666" + +[[package]] +name = "objc_exception" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +dependencies = [ + "cc", +] + +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] + +[[package]] +name = "object" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "open" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2078c0039e6a54a0c42c28faa984e115fb4c2d5bf2208f77d1961002df8576f8" +dependencies = [ + "pathdiff", + "windows-sys 0.42.0", +] + +[[package]] +name = "openssl" +version = "0.10.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bac25ee399abb46215765b1cb35bc0212377e58a061560d8b29b024fd0430e7c" +dependencies = [ + "bitflags 2.4.0", + "cfg-if", + "foreign-types 0.3.2", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.26", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db7e971c2c2bba161b2d2fdf37080177eff520b3bc044787c7f1f5f9e78d869b" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "os_info" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "006e42d5b888366f1880eda20371fedde764ed2213dc8496f49622fa0c99cd5e" +dependencies = [ + "log", + "serde", + "winapi", +] + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "pango" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" +dependencies = [ + "bitflags 1.3.2", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.1.1", +] + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.3.5", + "smallvec", + "windows-targets 0.48.1", +] + +[[package]] +name = "pathdiff" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" + +[[package]] +name = "percent-encoding" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" + +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_macros 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_macros 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_macros" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" + +[[package]] +name = "plist" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdc0001cfea3db57a2e24bc0d818e9e20e554b5f97fabb9bc231dc240269ae06" +dependencies = [ + "base64 0.21.2", + "indexmap 1.9.3", + "line-wrap", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59871cc5b6cce7eaccca5a802b4173377a1c2ba90654246789a8fa2334426d11" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro2" +version = "1.0.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81b9228215d82c7b61490fec1de287136b5de6f5700f6e58ea9ad61a7964ca51" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fe8a65d69dd0808184ebb5f836ab526bb259db23c657efa38711b1072ee47f0" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.10", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "raw-window-handle" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom 0.2.10", + "redox_syscall 0.2.16", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.3.3", + "regex-syntax 0.7.4", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.7.4", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" + +[[package]] +name = "reqwest" +version = "0.11.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e9ad3fe7488d7e34558a2033d45a0c90b72d97b4f80705666fea71472e2e6a1" +dependencies = [ + "base64 0.21.2", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "mime_guess", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-native-tls", + "tokio-util", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "winreg 0.50.0", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.37.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + +[[package]] +name = "ryu" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" + +[[package]] +name = "safemem" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "security-framework" +version = "2.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "selectors" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" +dependencies = [ + "bitflags 1.3.2", + "cssparser", + "derive_more", + "fxhash", + "log", + "matches", + "phf 0.8.0", + "phf_codegen", + "precomputed-hash", + "servo_arc", + "smallvec", + "thin-slice", +] + +[[package]] +name = "semver" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" +dependencies = [ + "serde", +] + +[[package]] +name = "serde" +version = "1.0.171" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30e27d1e4fd7659406c492fd6cfaf2066ba8773de45ca75e855590f856dc34a9" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.171" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389894603bd18c46fa56231694f8d827779c0951a667087194cf9de94ed24682" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.26", +] + +[[package]] +name = "serde_json" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" +dependencies = [ + "itoa 1.0.9", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d89a8107374290037607734c0b73a85db7ed80cae314b3c5791f192a496e731" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.26", +] + +[[package]] +name = "serde_spanned" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa 1.0.9", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f02d8aa6e3c385bf084924f660ce2a3a6bd333ba55b35e8590b321f35d88513" +dependencies = [ + "base64 0.21.2", + "chrono", + "hex", + "indexmap 1.9.3", + "serde", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edc7d5d3932fb12ce722ee5e64dd38c504efba37567f0c402f6ca728c3b8b070" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.26", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "servo_arc" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + +[[package]] +name = "sha2" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "simd-adler32" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "238abfbb77c1915110ad968465608b68e869e0772622c9656714e73e5a1a522f" + +[[package]] +name = "siphasher" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" + +[[package]] +name = "slab" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" + +[[package]] +name = "socket2" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "soup2" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0" +dependencies = [ + "bitflags 1.3.2", + "gio", + "glib", + "libc", + "once_cell", + "soup2-sys", +] + +[[package]] +name = "soup2-sys" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf" +dependencies = [ + "bitflags 1.3.2", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps 5.0.0", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "state" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" +dependencies = [ + "loom", +] + +[[package]] +name = "string_cache" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +dependencies = [ + "new_debug_unreachable", + "once_cell", + "parking_lot", + "phf_shared 0.10.0", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45c3457aacde3c65315de5031ec191ce46604304d2446e803d71ade03308d970" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sys-locale" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8a11bd9c338fdba09f7881ab41551932ad42e405f61d01e8406baea71c07aee" +dependencies = [ + "js-sys", + "libc", + "wasm-bindgen", + "web-sys", + "windows-sys 0.45.0", +] + +[[package]] +name = "system-deps" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18db855554db7bd0e73e06cf7ba3df39f97812cb11d3f75e71c39bf45171797e" +dependencies = [ + "cfg-expr 0.9.1", + "heck 0.3.3", + "pkg-config", + "toml 0.5.11", + "version-compare 0.0.11", +] + +[[package]] +name = "system-deps" +version = "6.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30c2de8a4d8f4b823d634affc9cd2a74ec98c53a756f317e529a48046cbf71f3" +dependencies = [ + "cfg-expr 0.15.3", + "heck 0.4.1", + "pkg-config", + "toml 0.7.6", + "version-compare 0.1.1", +] + +[[package]] +name = "tao" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6d198e01085564cea63e976ad1566c1ba2c2e4cc79578e35d9f05521505e31" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "cc", + "cocoa 0.24.1", + "core-foundation", + "core-graphics 0.22.3", + "crossbeam-channel", + "dispatch", + "gdk", + "gdk-pixbuf", + "gdk-sys", + "gdkwayland-sys", + "gdkx11-sys", + "gio", + "glib", + "glib-sys", + "gtk", + "image", + "instant", + "jni", + "lazy_static", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "objc", + "once_cell", + "parking_lot", + "png", + "raw-window-handle", + "scopeguard", + "serde", + "tao-macros", + "unicode-segmentation", + "uuid", + "windows 0.39.0", + "windows-implement", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b27a4bcc5eb524658234589bdffc7e7bfb996dbae6ce9393bfd39cb4159b445" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "tar" +version = "0.4.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec96d2ffad078296368d46ff1cb309be1c23c513b4ab0e22a45de0185275ac96" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "target-lexicon" +version = "0.12.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8e77cb757a61f51b947ec4a7e3646efd825b73561db1c232a8ccb639e611a0" + +[[package]] +name = "tauri" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fbe522898e35407a8e60dc3870f7579fea2fc262a6a6072eccdd37ae1e1d91e" +dependencies = [ + "anyhow", + "bytes", + "cocoa 0.24.1", + "dirs-next", + "embed_plist", + "encoding_rs", + "flate2", + "futures-util", + "glib", + "glob", + "gtk", + "heck 0.4.1", + "http", + "ignore", + "objc", + "once_cell", + "open", + "os_info", + "percent-encoding", + "rand 0.8.5", + "raw-window-handle", + "regex", + "reqwest", + "semver", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "state", + "sys-locale", + "tar", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "tempfile", + "thiserror", + "tokio", + "url", + "uuid", + "webkit2gtk", + "webview2-com", + "windows 0.39.0", +] + +[[package]] +name = "tauri-build" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d2edd6a259b5591c8efdeb9d5702cb53515b82a6affebd55c7fd6d3a27b7d1b" +dependencies = [ + "anyhow", + "cargo_toml", + "heck 0.4.1", + "json-patch", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", +] + +[[package]] +name = "tauri-codegen" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54ad2d49fdeab4a08717f5b49a163bdc72efc3b1950b6758245fcde79b645e1a" +dependencies = [ + "base64 0.21.2", + "brotli", + "ico", + "json-patch", + "plist", + "png", + "proc-macro2", + "quote", + "regex", + "semver", + "serde", + "serde_json", + "sha2", + "tauri-utils", + "thiserror", + "time", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eb12a2454e747896929338d93b0642144bb51e0dddbb36e579035731f0d76b7" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 1.0.109", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-plugin-deep-link" +version = "0.1.2" +source = "git+https://github.com/FabianLars/tauri-plugin-deep-link?branch=main#0c28b75ac663b4ba0fb1f0d1ea4220f82a583764" +dependencies = [ + "dirs", + "interprocess", + "log", + "objc2", + "once_cell", + "tauri-utils", + "windows-sys 0.48.0", + "winreg 0.50.0", +] + +[[package]] +name = "tauri-plugin-store" +version = "0.0.0" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#5b814f56e6368fdec46c4ddb04a07e0923ff995a" +dependencies = [ + "log", + "serde", + "serde_json", + "tauri", + "thiserror", +] + +[[package]] +name = "tauri-plugin-window-state" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f15dab0be2ce3ce8a57d0d2de17d201d0c2f3230d68981ff3f0942684de03eb" +dependencies = [ + "bincode", + "serde", + "tauri", + "thiserror", +] + +[[package]] +name = "tauri-runtime" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "108683199cb18f96d2d4134187bb789964143c845d2d154848dda209191fd769" +dependencies = [ + "gtk", + "http", + "http-range", + "rand 0.8.5", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror", + "url", + "uuid", + "webview2-com", + "windows 0.39.0", +] + +[[package]] +name = "tauri-runtime-wry" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7aa256a1407a3a091b5d843eccc1a5042289baf0a43d1179d9f0fcfea37c1b" +dependencies = [ + "cocoa 0.24.1", + "gtk", + "percent-encoding", + "rand 0.8.5", + "raw-window-handle", + "tauri-runtime", + "tauri-utils", + "uuid", + "webkit2gtk", + "webview2-com", + "windows 0.39.0", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03fc02bb6072bb397e1d473c6f76c953cda48b4a2d0cce605df284aa74a12e84" +dependencies = [ + "brotli", + "ctor", + "dunce", + "glob", + "heck 0.4.1", + "html5ever", + "infer", + "json-patch", + "kuchiki", + "memchr", + "phf 0.10.1", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "serde_with", + "thiserror", + "url", + "walkdir", + "windows 0.39.0", +] + +[[package]] +name = "tauri-winres" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5993dc129e544393574288923d1ec447c857f3f644187f4fbf7d9a875fbfc4fb" +dependencies = [ + "embed-resource", + "toml 0.7.6", +] + +[[package]] +name = "tempfile" +version = "3.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" +dependencies = [ + "autocfg", + "cfg-if", + "fastrand", + "redox_syscall 0.3.5", + "rustix", + "windows-sys 0.48.0", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "thin-slice" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" + +[[package]] +name = "thiserror" +version = "1.0.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a35fc5b8971143ca348fa6df4f024d4d55264f3468c71ad1c2f365b0a4d58c42" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "463fe12d7993d3b327787537ce8dd4dfa058de32fc2b195ef3cde03dc4771e8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.26", +] + +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "time" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59e399c068f43a5d116fedaf73b203fa4f9c519f17e2b34f63221d3792f81446" +dependencies = [ + "itoa 1.0.9", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" + +[[package]] +name = "time-macros" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96ba15a897f3c86766b757e5ac7221554c6750054d74d5b28844fce5fb36a6c4" +dependencies = [ + "time-core", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "to_method" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c4ceeeca15c8384bbc3e011dbd8fccb7f068a440b752b7d9b32ceb0ca0e2e8" + +[[package]] +name = "tokio" +version = "1.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" +dependencies = [ + "autocfg", + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "pin-project-lite", + "socket2", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" +dependencies = [ + "indexmap 2.0.0", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.26", +] + +[[package]] +name = "tracing-core" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "treediff" +version = "4.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52984d277bdf2a751072b5df30ec0377febdb02f7696d64c2d7d54630bac4303" +dependencies = [ + "serde_json", +] + +[[package]] +name = "try-lock" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" + +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + +[[package]] +name = "unicase" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +dependencies = [ + "version_check", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" + +[[package]] +name = "url" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "uuid" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" +dependencies = [ + "getrandom 0.2.10", +] + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version-compare" +version = "0.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b" + +[[package]] +name = "version-compare" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3b17ae1f6c8a2b28506cd96d412eebf83b4a0ff2cbefeeb952f2f9dfa44ba18" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "walkdir" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.26", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.26", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" + +[[package]] +name = "wasm-streams" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4609d447824375f43e1ffbc051b50ad8f4b3ae8219680c94452ea05eb240ac7" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webkit2gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8f859735e4a452aeb28c6c56a852967a8a76c8eb1cc32dbf931ad28a13d6370" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup2", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3" +dependencies = [ + "atk-sys", + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pango-sys", + "pkg-config", + "soup2-sys", + "system-deps 6.1.1", +] + +[[package]] +name = "webview2-com" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4a769c9f1a64a8734bde70caafac2b96cada12cd4aefa49196b3a386b8b4178" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows 0.39.0", + "windows-implement", +] + +[[package]] +name = "webview2-com-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "webview2-com-sys" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac48ef20ddf657755fdcda8dfed2a7b4fc7e4581acce6fe9b88c3d64f29dee7" +dependencies = [ + "regex", + "serde", + "serde_json", + "thiserror", + "windows 0.39.0", + "windows-bindgen", + "windows-metadata", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a" +dependencies = [ + "windows-implement", + "windows_aarch64_msvc 0.39.0", + "windows_i686_gnu 0.39.0", + "windows_i686_msvc 0.39.0", + "windows_x86_64_gnu 0.39.0", + "windows_x86_64_msvc 0.39.0", +] + +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets 0.48.1", +] + +[[package]] +name = "windows-bindgen" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68003dbd0e38abc0fb85b939240f4bce37c43a5981d3df37ccbaaa981b47cb41" +dependencies = [ + "windows-metadata", + "windows-tokens", +] + +[[package]] +name = "windows-implement" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba01f98f509cb5dc05f4e5fc95e535f78260f15fea8fe1a8abdd08f774f1cee7" +dependencies = [ + "syn 1.0.109", + "windows-tokens", +] + +[[package]] +name = "windows-metadata" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278" + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.1", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + +[[package]] +name = "windows-tokens" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f838de2fe15fe6bac988e74b798f26499a8b21a9d97edec321e79b28d1d7f597" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "winnow" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fac9742fd1ad1bd9643b991319f72dd031016d44b77039a26977eb667141e7" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a1a57ff50e9b408431e8f97d5456f2807f8eb2a2cd79b06068fc87f8ecf189" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "wry" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33748f35413c8a98d45f7a08832d848c0c5915501803d1faade5a4ebcd258cea" +dependencies = [ + "base64 0.13.1", + "block", + "cocoa 0.24.1", + "core-graphics 0.22.3", + "crossbeam-channel", + "dunce", + "gdk", + "gio", + "glib", + "gtk", + "html5ever", + "http", + "kuchiki", + "libc", + "log", + "objc", + "objc_id", + "once_cell", + "serde", + "serde_json", + "sha2", + "soup2", + "tao", + "thiserror", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows 0.39.0", + "windows-implement", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "xattr" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" +dependencies = [ + "libc", +] diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.toml b/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.toml new file mode 100644 index 000000000..bbcec6aec --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.toml @@ -0,0 +1,35 @@ +[package] +name = "hoppscotch-desktop" +version = "0.0.0" +description = "A Tauri App" +authors = ["you"] +license = "" +repository = "" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[build-dependencies] +tauri-build = { version = "1.4.0", features = [] } + +[dependencies] +tauri = { version = "1.4.1", features = ["http-all", "os-all", "shell-open", "window-start-dragging", "http-multipart"] } +tauri-plugin-store = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1" } +tauri-plugin-deep-link = { git = "https://github.com/FabianLars/tauri-plugin-deep-link", branch = "main" } +tauri-plugin-window-state = "0.1.0" +reqwest = "0.11.20" +serde_json = "1.0.107" +url = "2.4.1" + +[target.'cfg(target_os = "macos")'.dependencies] +cocoa = "0.25.0" +objc = "0.2.7" + +[target.'cfg(target_os = "windows")'.dependencies] +# windows = { version = "0.51.1", features = ["Win32_Graphics_Dwm", "Win32_Foundation", "Win32_UI_Controls"] } +hex_color = "2.0.0" + +[features] +# this feature is used for production builds or when `devPath` points to the filesystem +# DO NOT REMOVE!! +custom-protocol = ["tauri/custom-protocol"] diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/Info.plist b/packages/hoppscotch-selfhost-desktop/src-tauri/Info.plist new file mode 100644 index 000000000..2af419d4e --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src-tauri/Info.plist @@ -0,0 +1,19 @@ + + + + + CFBundleURLTypes + + + CFBundleURLName + + io.hoppscotch.desktop + CFBundleURLSchemes + + + hoppscotch + + + + + \ No newline at end of file diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/build.rs b/packages/hoppscotch-selfhost-desktop/src-tauri/build.rs new file mode 100644 index 000000000..795b9b7c8 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/icons/128x128.png b/packages/hoppscotch-selfhost-desktop/src-tauri/icons/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..6be5e50e9b9ae84d9e2ee433f32ef446495eaf3b GIT binary patch literal 3512 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 literal 0 HcmV?d00001 diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/icons/128x128@2x.png b/packages/hoppscotch-selfhost-desktop/src-tauri/icons/128x128@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e81becee571e96f76aa5667f9324c05e5e7a4479 GIT binary patch literal 7012 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 Sh@|Ye~|0>}wMPLT8jm@Y!H33Sz}5aFI6 zM9Lzqz|;A*0sGs=2A1uU!1nk2dGF7knQwr99SAFen)x(eCO;F8y2C~0FD1YxRTPcy zPWVxkUYmeuz}Tv?7&Fe-!UE{)ZW)Mb;H)^#eHDv$`dkZGguJz@^MA!ZNGAUqt{|0H zpZ7Ch9S`q5!>R%}>}62!+(T^evyO+ImSo2wpu)su4^3nw5(%)KD%gbSev^*HZZ&3( z#&c@Z0gH|}Ck)w6fh0&NBJ62ib%R}(3@$VFl*_#l2W$wQ-~4RmZZAt5O*^2Q5}Xr8Hy@c`#pM?kc?hFWxRXr*mUfUCXf4ka5DD~ zat6d85COB05l#(P9*cQZ3EC8fVdS~?&vN#rce(aF9@xp80O2{{FBvU+{X>Hoh;xI` z{$e^Nw1y*VbO8wv`8|-m?NwNaKGTGaF{P^JLB^DbOYWIbn%eT`*!^C1H36=O8Z-M> zkD~88ry`eSo`tEBN4>w7OWZwUzlh{WM1m8R6zepqGcGMaV7vWY9b?K4b6~|HVG)ec wi>I@ws#sZo7or4_*4M>7;p5{nr2pZ?Uu4>Krr0kU)&Kwi07*qoM6N<$f)&@lf&c&j literal 0 HcmV?d00001 diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/icons/Square107x107Logo.png b/packages/hoppscotch-selfhost-desktop/src-tauri/icons/Square107x107Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0ca4f27198838968bd60ed7d371bfa23496b7fe5 GIT binary patch literal 2863 zcmV+~3()k5P)2T^I$?x zaYQg&pCHVGsw{hVJKeJjnTAPVzIJy&@2@ONDhmw*aGfYREZIehxXjQGW&);l}730_NI?Rf^MxPP7h0n@|X4 z$_NmLkmcX9a6<@;g%^uO5`jK11zHAwB&Be>EL;Ksu&`nkBH@=nY)w^zz@pJ^)7G|d zV$~|rGzj}F+LNX%ZDGVxdr}k)_)lLzh3c`h#W_(^eXY~ZT43UAX$(I<@?8A1#RQ{=o_ejpu|#}HSYmnj#$wSetLWep5SNMwiJ!? zjkH#Uml%v#YF3+jeQZ56;FrWNKj@^lDv= zi&X}cvF7lk385w!3&!DqN|kvc0L!A!H3v2-)Pz#7EhwtX^YLh1jqX`<_Nqx>I|3yX z9P$S>fDYiDqA2`qxzp;Tyn#!OW~FV+sU>T3L+`2B2vBaMm0 zGqWdIYbau+r))W2hu*LEc6P1pCg1kKUosnTBr3%Uwf+Ss~=TGkbT?9EOw z;k9i=s|#)G@~{+Md$Edk0G`!|n`{9w6nkW%92cT}A4yl&G|2fgr_N zeRaaK6+Yt+x0l`MY@glx>yI{Hr=0bY7@k$TaxTwn=MRf~p|wZbs#2e}V6a9E)gu|}{C0M=qP9u$j6tFKQE*v7>T-cdsR$`C9l zvId4VF^>1jdX_O|45j1g#o$0=mUZ{lS)5`j0dfDzK^P6e2D7B_gk{b)$m?vKfCT34 zTjVBIBbLS1G+?15Anwl^hgkMZ7*KW_#bATv@}$&n^;(+0ydlnWLS|B{WhrZl(&yqh z=#0;nItiH4iP$kAuqIVK^XBmo8r8e3sLir&AN_kXh3r^YD8bITpcq^*c)lrg_AIB4 zs#?U7We+KOKIJ@AgX6wnO%DIl7!|fyA`~wX-b>t9Qp0j|DG~fdW0X^Fuu`#Hg^G`l z&1a&{Mn4O*j)QcbHB7NqzdPBn7K->yAqZ`1ou&!|cG=nLv7){psD>>HSsr zZq|&RfcY#=c(zzg5QSb5(rJnIE>`D#HXsA{S*(elqCdWW=ZV#_cL^$4nk&I{kuKUT zTdOi?iU~)o?#r_t8k|fNp)$%g#-DV(7a;kA-(vw*U|uJZv=TUG!&L%WhvFIsYrK|7 zy06D)x>hw2DtY*~1S*DJ^f;RjlQfk4Ixl-Y_I*^Uf7eTLInMPgZ|SD)tGC-B3MJsD zBk}Ouyu>Rgm%w=bK(=5<{4Im1+1t%-d7VO4j&5I|97S@(i)EQu6=%{1$%E@5l*;hy zUh$B-TecU=;@C*Ht9Jk7!JSG^ebkC>lV=gXIeWU!VyOTa^k!E|sfjxsG)6u85$=Hp zoW;s8*K%8VncTZB`;<}J06P}GdLy01BFHy&#<5djpB)H@@|>1_+dyP|YVt~)91KY< z!TYqYF?8s|s-(F__QweFzWkj~4lkhO6ZgHOspepOpicIx^^v!L-$|^cpVFRASj`{i z9ylPG5$dF}nfFl^)X6t3s`ou4+PwXGJczP<>*Ud$N=}-Tz4_9E80)_Xysjp0%V5z5 zHxrp`uJ?bAQ%27BQv{9^XD1>w2cz(2IN9=7-a1;QPeBQ@UyOX#Bjql<`U= zTXFi}&I(wd8f>I*!z6>xK{w{K;lsjI>$S9}5oqnp7f3j@Wc8kB;T9Cr{0|WUtv@s_ zwXnx!T55r1wlG;Ttq%c|*X8Y~>+;CBZ(?$k)jLkhAnIf-ENeJoRcw{pU`JoIV;dq4 zgo>XcJS$yu^R@zqQp-G?#Nv%Uo;L<9tE0N{+m%FQ^ZI3LkrcFDZf8!JdataE}(QMS@ zfVV%Yz0~984I-Xv42r>m@x$&AY!B1%B(iG4k)K&I^9z$|!m0WuwySWnEW#0gFuhr0 z=KcFDmMDFk!biuZJ&4ja05-_AtCww)A`+>4I%-?;F2ixpn!m5GqY$rr{~xOZYCmwM z9`nuyTc@^5Egikq8UBmMebnX0G*Fj~^hb|FxQfWhvUK;ArJqyDtywJ{Cy!P}cVGQ$ zErZU%to>1zK8$et^pjPqq_HZ06n8~E4eg$&2~LSzsb?*{PyeeibU1#{b4>8 z_mdlxUIWw;tH1i)4?E+3+9yY`Z};_Vbk_x0N| zo%)uP-BVav3t>4lX&Z29Pw<7mM6PZp50~9Lm>tALCvRhjP(~*-QGP03vv@t9wR&`- ze<=xP#nb$wttKpNB9zGyrKYV)@LM9uLBE%su-AlznF=LzkQ#H>FXB}!74%BFMiXhc z5y84I-&!YoO%P|oR46%^{`UUIPRC1q;l22n-dNg|I+yPFNpq&U;G`nN9l!m0{8a8V zG(DW2-gp;GkG|JEYr=;vTEo%?dy|P=R^qd7UGj-?D$~fCiicsZHC+qoXOC}qGfsK(8d8N1KS;bdtcaI?j@y`Iu1LSP?=Z)dx!Fqx(DEf?1Nn7%nzd!lj*i- zb&};L4hN#2dkE2b>5cZm1)eCjH{4W7rD6%51gnogg%T-9Z|JWn^*#u=Q$vqU7oKUl}X9A7U8^etzu0GW?2k;*_);j zu>`TQG+O$~;-H!jhFnB^ylA%vG$z)B)qkF>b53ypuI{!TL(bU@s(K~#7F?VW#e z6vq|EU(c=tNk~~ffk#0iPF1SV@<)Jjm9;tn;sh)wK%9W(1eQ*KI051WTDi(W_>b)R zuOvuB!wFat>=I~ZI`8$&f)GMd_q?8&9`&aRW6Z9+(th{7*Y8&Ycsw4D$K&yMJRXn7 zMukPW)DcC{Gnq=;g$LwU?i4CV`wN| zILClO2~ixkP#6m!WfwBRm@vkl@Cd)g00p&$LK;9r@WRPKv2>vo+`>0`8O()p8YH9v z{y#QQNKak1NatEO$^`|%3jW(2uqT!;Bg8r+=^6@X1deeog>y(S_kd!Ssv#?sND|Nn zIKsISPVEG9luSVPU9dpsMmTco8VTkB)KM@;$z0e&6i@^;rSZa1C#05m1QNR777@Ps zzE~VRh8ogn;W%YwzC>ny?$_-E)>z@7Xjb!BrU^ul%B4EFuEq%`3xLHY{_6rX3(QK( z+jU7I2GAg~jIS6%^F%|a4}{!WxC1qyF~Z43LzX6lMkChI4fmm98sVy}i$=-_|2a@~ zr>v0q3rvgGpFHNh{2EVhU*TgH)a#IF^@QkxHDs^K6PNSC$zvLFPa$wZg-HP$&=wow zyWuM^K)tpWETYhsQAAV&<2~JFF;6AgX7`2jV`q~wM}tRRxr%S}nvLTx3aN)8r}RJw zJW#;gsp7Qdv~V(CuktiSu_~COFbgQk#ZzjY$64XzKm12f6mm%t?pE=s#S;>WNA#g6 z=u*Y^!`o0IP6~%97#`;-{WYi%w!l7B#nDwL2{(oF<29^3$sU+fyG$%vpC9n;SOIfN zjdz^O<0uzZOf;ja0?Ly>%XgnFAeb|win%4>UIH)+Doq*XmZp|1n<$=#|xgeSeS&(b&w!$*%S?*YzAn1Xa zwHdo4nhDBnQRdq0*?q8#L#|58+Ke%Prg^4y6wTeb1;S@0k#|9L0%{Z5j&+sz3MuRF#}i;PW@vX`sOq1(iPoNhl0j) zB^pqttVk7M^`F@TOVr*~k;QQ~xMd{oJ9@4C#Oy>l0A^}$aq27@5_SH|`uL5qvNY+b zO8{5F0)AVC1|LRVgO0{*w!S1(Fx1a>8dfp35R<#Q~L+YG7wj3g~;yB z`2jGYJ#(JTfLqBQ$*s<7&nI z!+jLYK4GsLN!S8iEW|lZ31|MAcLzeFow=nEFBS%H>~0qDa% zpy-5fCW4VdJdz;8lO8K22B-`$G>lDPZLrGYCcQkCL9#W~BIcLu^ z)vi|c?X$fw7BQLjE@*;QDFO}xbxLDKO>&xd_I>iDv|BAgV5U|UhfYf|B-&PHf&dW# z2SV7`cEOopuDn)P8{y3TeP>0TmV~sPzCQzYUc>J|#uKOeMm({QTd`%%U0KchcRxais$csI~~s(ghKSb>Jcpq0Ynejbf~np2tyn znl!-*uLK52F#X-X&FdHbP9u?Pd7p1_q}&jTBfi%t4J!4_lx}enkrY01Q=(6b^!DzJ z`6Vl&0cCYIn5@niUocPN4<-|>nlX-W+*PSE!WnB$C$N!R__g!$`kz_*T#hA?w5%wC zBJd9c>L(|;-7b_U94c5AjcWwR6|^$9qfV!k%&9sBrIOk%BhY88HiL36ccjbMbV-1H zK(RcF(@LIzDH6uyns#nnDSdkuSqrf^oYh(apsrGs9V_c(v#TC;7~2@iD@8a|PB3;+ zC>nvE`choe3FNzLG6B(G;OC6hta>*8Wo6r!QPuwV*IF3srz$!{VL*Hjg##v#Xm-B4 zV&$9HB^SfP{1?cdI@xW&m=P{zNU#;$K_O^8#eCz%$ygUo3~>((%lZ`4)I~JMQRZ@k zY!up{BQXUlr%tP`imZ(g!mL?aK);HZrnY4L&$>jmmJV1IP67vAlh}sxG`rX5AA(0= zY;8bViwo@r$HM4Sg6WgQ+FlnYF|#)0rmR_PYr?twe0SOCB!w=DYc8q@7*AVZO2Fpa zy*1$kQolLdyQoje2LjEkjevEqh!x?`XfBGN2fB!$51x;-1a(D*pigA`E-Nd-X}wRn zpb1%A^Z_A$D2g_K=^^Lu{b{X{ZtfnW^1?I ztKfA?Q5iSq*-8L*K@&VlS&MCG>_!z>rNBaKtXdLeOF;Ww441ceBmCnak*$Z(&DjVl zM*et>g5d(iVEfjFU|(~R57g~xJqhH9t9$P-N-#7%arVZi)%e2OhhknHZ*$junQYH!14#BO?FyHo72B1vy$InTx{f+TvW+7{qYM&YWEWlfDzTx%tKejNEV>J8niMP2TBrn zQOg#U>7pj^pQ_Z!Me8um7Ko}chb-LF{E@8HbpQ-x3n<}^x__MWy6cLrh~&38x)ThH zQp5pW*k=GP^kelkzA`u=xZ5gTEC1C`oaEZUnA=dWDd6F z3VS2G2CTxlxWBLe!;zB3RVmS0Sdo%KP%Lo$2xD%j`fIN%-^e8bo*(Gc0fa2Gp+^wF z7Bewf9oZ|Rq;MLwzjo-Xw37XCEE@Ce90%Ryuq?i393?J5<@<4@6d^FMfAOM~G67=@ z7J@mEn$!AzSPRh*tirMN=A8vq<(9(2aD7_sltp&0Xs2$s=&%aMq(y--hM@EKIxuq} zlc!J+!_Derb#lU@WgRbevr(&xbRN&;suU>{ev^+dVCsJkbsn5snc1pOPA9=G94YkN zg@BanxC{AJLj&LZU6xo!$W^xDt2iYW z^ieQNbqat_!bWvmJD6IQmvAUquF~Lk=7fvdq z{ya7F3jCMX=Qhw~-Zr#60~E~?R~KL&7>D^E$Jr7|*~?>?`>qLQ0(pJ^V=`)(G`-dAhB>?7B5y}9AfVI&JWt|3S*A=;@jEt|-AQ3-TRbOLg+o3Ye^{%a3H87v z7yj3A)n(-afw!pgualOrmCv$))kdy^3&CTP>}@^}SI;YnPT|A6I=Uk5T$V%ofvgHg z_2&dq+v4P`s5`A3BHyxVbUD3i`+=;tj>gmNHREcvfCrbK@0zW3K1gWMX*Dy)ghmtW^5BEi48PB@947_yVdOc$ z^H}DA(f;ORP&eZ^e91}a!XfCIMHv*o)OEr{K*@CLDfjx>4;xF1TFJxUYju5td?msm z=AXUjNyB8>7r}gyq>H^o@-&&A9+-;g(;}n@ftL-sR}>tlGT{(d1bu+!q7Syf{D_pn zC;%}^Mf^&n!B{QE4yKf#rqY9%v@OFR6*DprS5@4SZ4|T9P?k+kEH$BRq*CD!*2Pm7 z8YCK`@@*B$*NesrXV4_k5S3e;3AFf8r0~d^o2Uw!2)%x#agAxU5e~t5RIdZBAGuGW za#wX28sBZnWC?%Z>)rdsPX zcMcx+g>x8kWmu0|z(AFT-a^A+K(+dWN(2GO(fjG&p8Bm8pVKJe9EG-DO#SwUP)>=j z0-1&>1mV%g1dvAbyNtyz@$cHNy+!eOJRXn7@4+ho|*60M_6IeO{(g_$&fH(oe2@ogH;0Q1FK3LF!E58aL5C{YUfj}S-2m}Iw zKp+qZ1OkCTAP@)y0s%`P1WKWHdza~tK1A>*z$m7->F+8A1@U|DjF1#>B%rbcGWeDL zlHl5S3@s-J>jFqfF^T9FiKquk_358tumQq|KHrGM_LPJ+f|e14bq3lhMbRdpS|v-= z2YHSFaR<`uQCmb7gmnTER3AEcwlBgnELi7Ww63Bm#`sC9@)P`2EhEf9xf z#qRkiu(=kNvw}K}hXR{RVUeJE3SV%j%fZW9qezW)QSwB$MA3Jze7qU5jhS&!gSX?VjyTw)sODIsM z6PFrtkr=<-dkU7&=?~q0Ba-=VJmzYRut-#!^!t6V2McN&GI$_;oEIuBjSF!#l8R`B zu!`j8Ay`8V>JZd>|Eq0*A#UThzidGRcrUEHcMA8w#*4v?cM3L|j!)Fn9*GMFU5bIDGHJ}&Z9ymf_g?FL)1Jg(_AA!ec*HK+mNA!60T@n?eg+MWq zK7m$)Pooc^X1umolv?1pDh6}B=oBE=NQV;Kgeqj}JNiC%peDSvSb1up{i0&Xnr`U> zMHM2vUrZR)f|tU|b3p12nB$G8rsS?#RcVvqX`?DXvr_nJu{seS$xWZWBi}?dMO&^) zF&A#uWwpE$mbO-v0(Lt6c|83BsrnA!R84YrF4twX{IgiOwJHnO_^2?eHtDH<03M^0 zwwV@}>1U|LYIVUk@@eD`k&B3322xq0gX1#AVjtk{1v)7X43nsAwYW$x`hazS|hS_TwaZ$pQN;O!%NS&$ABwV$(F&4YIg;&}43Nnrp`Z~Xb>fLv$-X!-9C%QT- zltk2Ba-m>dTp2u}hpW7>I--F=$XbVVJ$!VZGGWYx<`t+`;N;y2Nj{U1fYe+!gq-T+J((5bPNJ` zA*?T-9mY#P?e8kYhl+Qq&&Xuq`LAFNWqZ0hrnt!N=gi0bOMZ;ZYA5G~we;8h%?VEU zDBUmfaU8fOD=SulQgT}y$Hib9w4VJ=pgb`M;B4^DR*D40?xGJSpv5{^qyt?0DCltx z%G#+cga4E^6^Jni;H1Uk^uYvD9zyMd3&?GXVK)?mJrZyP=Y++skF3q^EW!DQP<(%l zErd=^nht&nEyO8daTDYY;5rvCxj&-DoT#pJ4Wk43?Wiw zF(u;8R_MlsC1e)l_s0dB3LZWQ_(Tro~Q~zP5$tF@!(lR>isq_{LScme3?Ef--&Y zjU-4}R4JxZ(6tl?q1v8YdU4NIru|GZctDTgCRnoyYTJ6_pEA16B>@2%u~;OkyUIok zgldebS~<9WWlL04@MZ$pPPe5}JGLjXi)Fbnlm%NNEbdSsQLRH&*h+o$Vr~DMD{?2c z)BmO3FI91!5RY6bkZ1=ss}7_fGE7mcu=2PnsvK8QDq*t@D|P1o&Fh3R!^Ip*4aGJY zccNQRo+GKD)mnvB*#&Zd9zlQq#+61FduYqWYaCf9v%o{P`Ap=7*u;*~6E|f)M$FpR z*7II;E10j$CQ%{1n030oS$K010P4wNetR0+k9GWF`Qm|dzJ_(P#zDF5JGGq(ixwDT zRFrKT-2B2RQ8C5IZdm+khIe;b%uXhj_^roc=_wlSSTKZRs;1qat5mo=L2UGksVBy& zl3l0MUl7#?=olV`l;uH_Q;1uvDzOy>`pLg;ToHS!e5cY?FMOB~jQzwd7M}#ckW{6j z%fY;-gQmS}iS&U&R9HL%s1%ex27|U%!{p{y2?Wk0zm>!6XKNwJdm*C2T6lSU+oZ*q zT_9O2r>-DziNXb%$E|{=!6~BY28C!eH;0JBT<@4{s7^PdlFF9Rus9Z_-lrrwJ_MO-_xZe;Otu z%ad3coio;^^#gUmyGK| zb5nO+%jB_);w!t|jCmWh#hFENi`~~Bi`@0cZcoQj)~u8!5$dg<2^nEw`4K5P_9tKw za)I_mkin)+tHmylEYxEX)bBIxi=UmwZ;_RWv6Ml5(Bi(({A)n_F%dm5o!6h33@w}u zyFBAU@(0M&M$@;*%EVZJF*Jzos<64c;RFbom6)wSVr+jsA5&`w@A&o+r_#YIsuLM5H7w6K)I7%WlT zPdEYzEEURiEznF@oTK`V;;Ak13pOhtRMIJLu_BdO4Y;|l3M|9D_!jG#F_a}=DzfN8 zI^iOO5~Ssmof$+{Qv}DCqDKgp_iJJ_0DHtUzh@mwMJyv^u~g}A-g4qmyF+rX)@o&X zc=q~|z2p2W*QmS|)SC1hplxIZkMbAvkuZC?(4k}seA zJx;N6S8?aVhg*9_^vDe)I$9a4SIIewg}83DPFVxuJ@2|VDl)w5kB3B~FF=L}k19T@$qoQ%pYU zJ}^u@=&6{_t53YW*}n2EvUXc_YNHlmRkB);uM{etdaqdi@vx^?CmG_awPI=;|EgrQ z7<%e`5*Ld~MXB*MFB(s+6;qqAwADgYZS#pI;^LJ@T2xr+YT}Wv)`}576`sbZ>*0NN zCYPRXG;tB;Md+BSg8Q2?QIkcVFHop`61uA<8hYz86|!7IXc?TR!c48TT~v&77V9LH+M3LO*yJr za9&tbmVVmbB=>m7CxMac8>W|DY|V?6I*B*JV%{wE09*&R5nU?c16~Phio*h%dqGX{ zQdm=RfqirfAl+=tMN$lLOYrtdry-i+XwS7om(h{?=0q_^B2frZK1} zCXt*YHl*UTP7x##WQm&Kug8CUkpv+H0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAkYy1 Y2S8W#vM)6=T>t<807*qoM6N<$f*y@n<^TWy literal 0 HcmV?d00001 diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/icons/Square284x284Logo.png b/packages/hoppscotch-selfhost-desktop/src-tauri/icons/Square284x284Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c021d2ba76619c08969ab688db3b27f29257aa6f GIT binary patch literal 7737 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 literal 0 HcmV?d00001 diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/icons/Square30x30Logo.png b/packages/hoppscotch-selfhost-desktop/src-tauri/icons/Square30x30Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..621970023096ed9f494ba18ace15421a45cd65fa GIT binary patch literal 903 zcmV;219<$2P)2 z+CUKPMqaqGiH;zb!R4$B-WXS^YzQr=@UH>k4?*L)&R=zYjBrZenKdc9|JlS$SO*RJ zKt8FSTDAdk1g_WPAO!p^V!AuL;Lm;uQyV;zKq)J3i(;q*;k+pD%f3eltU`PYdy9(k0&%` zuWAPcV6|-y?|?7O1W!KSK}pbk8#~!|FA@(VJkt^V@0lio{afoAeo*f&$W2s6${5!1eKvAGD2$GZwSB98L2ZVS- zKn8ENRkZ*sb!@QugOrQNK3(sy1v%J#m|rpB+h|Nkqa3FRT>74xSs{#&saU2Lf!_Iq zKmuKAESh`gs!fneGWn+nf}l?7jE$HW!Af&vE5=G!QU)U2v&HLIBGXKk4nQx{hsHjL zLPMAo5=*uInFbq7(aa`Y2VX5wCmaeqvECOFv)a>0t>ZaEb*cJccER=BB?KFZhV$c^ znL*l8x*UYZv4WK|j?~Jt6~~F%{pk~z5A*>^M`?r5m9@RJ_x|uEtX(6Vk@Y()MVto* z93wr)%3m%|#OZ~srm>zF(JvDuTq*@;d&^>_BJm5hOU`3FjG70L#Vzv9I?`<7$T@

jU?lMi@tgxr7CqX_r3uw^y4tVU3Pm0sw;|1WSUO%?=bG`*Kmz6u4{#ti;T7AWIBAEh!(Y zz>O01&#X?Ds@L)Sb{CkG#Yz4$3o d@96)?#cz^xWoA}>B$xmI002ovPDHLkV1l3&k#zt7 literal 0 HcmV?d00001 diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/icons/Square310x310Logo.png b/packages/hoppscotch-selfhost-desktop/src-tauri/icons/Square310x310Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f9bc04839491e66c07b16ab03743c0c53b4109cc GIT binary patch literal 8591 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 JPDHLkV1lm|RXG3v literal 0 HcmV?d00001 diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/icons/Square71x71Logo.png b/packages/hoppscotch-selfhost-desktop/src-tauri/icons/Square71x71Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..63440d7984936a9caa89275928d8dce97e4d033b GIT binary patch literal 2011 zcmV<12PF83P) zNQT)H*aaHEvPo@cmXa#lOYSVWlpR1nAeK#0OX|;=*_qi5z??aA=FFLM-4Sq2kUOhO z__7Kf+yUXO;t~3LY3h_?kg^Ly_=vx^#d`M`3g*hiK~ZY3AT~jwFz3ZcM?f3JYN1%a z6(!V_i6eLKHt^>r*a)I0z_0NJhQk($6o5l!E{?JkPrSxoeQ-;Fqc_D`_YF8=rsANr zG)LA_971eEG~9CGYBLi@?p9m)@)Tx607JQ+*Ue@kj-@a(D+T!4#k)I>|5h&OqgB`h z?c4$tE)KfVHvW8WK2f$Y7BwM~AJbeyzOSy~m#(8wbuiN%36#mj3KfSHV@MPU&upJC z26nV0*ffeHL`yvW^BH8IFmcq)d*U$Vl;hFt@(S`@2NOr}7Sd+Fp?rbjZ-XVpiL+ZJ zVf=)*k4NU-1sB(fAHUA1R4M)eyT=i=ZEY{1xRDA;0LLFcXEjsGBO-LlIJ_9C(9GAXuL zTaWXYBX?I{f^r>rHH*sm()GzY;)y_KC4pG$l!1wRaq#9`i86Kr+wt%Lp<83lq@x7B zc+~kD7&vz;-52pYhf9^cUJaN~#g4OG2QA=;{?W`wITJf(pw%Y67s?G_QcOUGi6G6& zes8BV2#>7foT{<4uXDpmrPUS?Y#N*Dc@w_-L=?H*HrkF$d z3#j0$2Sp3K2%hvFtymS9Sa)qEdq;w&zs&Xs0O0ycQ zotoD}7%D-MawgdX3vAu0raMUP)Mv~{MWbR(S_xv|QUu#_sO6A2bqlWvmiXwRRCa(P zrkd;tCrIm!27Jr$U`;uIDWY{FbGBTGA*OV zaq5*ndh8t-G|j7}W|J`FP8pl}HkPBUggH&DxJAlnPY$8scRI#6B;VhC88^|5Yw+Yw zFCZhin_c2;@Q?8%idU?`0AtcEb2~yxj9bROOps?20l^aI_TFE9(tF{z-yMMgA%zc2 z&=P-y{B&LH&tZx4DR**bcD>1&f?pVFQJX093q$1Y1bU|txk2hWkd(uZoI-_?$%A_< zj9#-AT7##pEbqV(?3jbINuVFV+y(4ETyBH8=ZjV&T43g4Od410WtYMbY;mOUw5}mR zm}em*yjgmZBrt*Rwfgs$&57DLxX0`84J8Wpfr?mqW>@9Q`v=b@3@>-;s2ay^AGb|G z<6sHfKvDhCp|(Ve;bzEcvl3O;*J%g4%2fpH=m(LF-ZdyZU1QbHsqFQSE-uy)Xaxb* zSL{BCOVmU2;8(hf{{5BA37-zT*~-HPxP<1#!&DztK74BQf4R+BWyl2;uM4NAH38ll z)?^!My^IQCPqXx!6D!LZt!(O(KGg{Rd}Pcg?FQ!DagHC3ltZvYG*|f@ACA5 z(y$gMwjP<7kBkLc{{3_A^=#U;p=LeX-Jli8g)Q4S zGsR5xg_uRQNQ?m0(5Dd4a{mz+l&#zm6l9G~=l9G~=k}HOSD-3Se z=jhwnuK|Cl<(>yq#FY^_60{B#=L!9<4oE+T!cL+`@6H3nF8HuR!uOycre0(cw+R)s zrXgw)9=+XH;QO7tEq!W5CUINfkhlOY*hZ-ijQkgQi9K~92bSxob%4Nfvqh88H~~nx4}GW7*L4jK^Py8nIo~x?+DryN$BTbk-|idT*N-e1Rex&uYxV8 zs;+vp|9Rr`zilkh+9til7D(?B%R(0-awITYu&enHvQ*rlq~fJXBoGMhV~fOV=|9Sz zk1j^!w~cK|E}ELFSzIe&R%qSO0o{x1yR+jkFgySCIvN*o&;lgREZ5PMw8rCoZ%QaX64C6^AXjaDf@M)O$fvw-Xm4 zt^`?V3UU)UuwtamC!Smc9uo<@k+`s;bllrS^0Va7iZ6r1vL1bPqV(2-93i1s$!T_D z7tto2#+s{;0~f3~jCJXYVqMD{n-L>?PJ6{s>>3BCj-7BZCXma<7nLp7)5N-2qp=YV z=uVqAdF{DaGK9W%ej3I74qbe*Ru1bXZOmb3#=x4dbdQe->(6ixLJ_>E)#QNzWXYcvW6ai{SG;$nFpf0nwv+(Nj!yGQQA zUjKFVWcY)R=mSTSED7eq+Po4|hgBUmOg zkxAe-S?M+cy74QOzJD{YBEl8BjD+U{A(=!MwcUdbDtM-|mVC1Zx*)wlldbxix&h}~ zRB>33<*kdnuy;t-t6PvK<3wNI%9No1-|!#7YMWLcVAWl)1%p7~kc$3Nj$`HYL?M?0 zHxgEOAjF!;?1ND$Ef*2drN7=hd~o}v;4!>O3aweAlzARE_O}LilNFK4f?FK>YAxny zg2e4Vs4e$@uZb#ffkjd|RPYdw(%@GhA!(do1fM}jYLPj~0OjZkyfM7?RV?ngr&#W7 zX>~NBj1Qz>{1lVP2ySYTM{2Z|9H#MIhAaKWJF8x!k$U$IIvSxxdzUT<8vqS)N*xyF z<7b`?NEKahvOxm3lGd@nhY#*Zd~YHoV28eSq9K;?>@rv3-WZouE6y`|u9yYXY%m~Q z2&dzR6|@f*?FxME>BG)S>h6kG4^pWuFu>SduoXjcxYq42)?UC>ppv++c&4o~W06%- zxJK2rAr7q$?q!9R6{DG}V2niO%37i?c3{JM_^St3fp9J_9t7h%(n#c) zI1GAp+(Mf4lE_tjdT?hR1hBxA)FjuQ$)d=r+mM2As#CFx(5bUnnd%h#WNL!Or=6fg zSrK0}ErG))U%UPO@26l$bbO7cO7#j^KK@~2RzxhaN)kiZv!lDBr6utA>3wGtgs`~5 z;JIkJAKSK$3X4VN4Jr2bC=;11U)JbUFc&34T41-n8HlSr*&jTr9Zr1O!FrERIr{b1 zDBgBKiUUj9Yo+yH4%aLS%;Y-+{sXhe$40FlMCA&W3q&RhZuYEasfCVd9na1V$R~po zrGm42x@cZVTpyFZk|kE=HRcDjk$NCS2_`F5;_C^+w2TC1x+ucV%B0sb2s$ib9Bd_un1t9}B+W_q;KcXHeqea5`f}#vwDo;9E(yh-Bp~2o zJ1Nz{OB2MFJe;k@UUh{iN*35uR)R_oo=Nz~RRkam&4m)cMMec9L)|06# z%}rAOmFG@q1~y+tYxV$h!wE+OQ_4x7-z({de9*XF4mQVf1=dWz@46 zg>a{{Gg}lEOcsz*-|DxY^8T0`EjT4#cz?KFJsuq;l?ZHMe4HWCWw13vwc$OS_n<(= z7R%@GcvBwlB_<_VQ;ah{M0~}k_$Mx4Ylb1a6!{cSN^b4;TaLmf6tUFtWatK_6f^cE&b_un2M|G?W_mkF9Cw)GzMsK>bTBr9#h4x_TJ_mxiyvpcx z(mHY#ojg0~sYK?TnQqBW;=&w+W((Hou&^&4;V9REo74rO)9W*EFf?P;`-M{5ebqtk(uz+ljul8XxR$4c;uCf zPh2p%Y@JJ++Klp_Aoy&xO%M?I;pL*n#;l6Wme+33E;?q zyB_qeHy|InYJ`nx5}3)GqQV0000N?3#xh7$lMzK8K=2xV( zktZjJ6YWNPc&1V{V~9QO?wPSoe)&new!5c$`gL_xy=nl)7-I|@5S|!RE;#(*f`XTT z%IP$>fC3K!xWbiM1xA1;A;OEF0;RS9X&Hz~*wF&SQ}Ba5Cgs6^7&#F-f3wB^@9@_t z$O^=xK?#kFNN9x|9p)QaAUVyy&=;T|sk zwhJjSG?B<3unKw-yl^_;g;(&W>UnIOJn!-fHn`t4%wEFf+A*ZS@I>Cf;p0RlP0s;G zB{}b{#5u}^5^sk1l@se~@i8l=@tL8BbQW-^>Dl6){24N!b39M@YXN#!DArs_8n0j& zM7tPYQf3l@aMuHp1$({Ify*S_r11k239S(w1##jdA;7!m4npDq;V}$oy{{vu+pySJ z7!XWki(gQUJMkz$=Y@S<+E!0v+E`2_>}$m~UZ zH-FM*u>cn2AtPR2G@Z6;pKvrONJx2ntwR0z zRj_HCj7Ti`&d}?{ep{75CX38{XcpSwS0fTBLDmIK(TCzoZBGDy#h(QWQWFtNkn+nc z&HE=LXekQxj*eiAG$2mDRQ&_=D~l7fDuh%-goKX<5(vBP$9+U0P%XB-$mzC<2akVu51 zlgo=P^}d5VpZt~UrEfh*fsW{#ruW6=u)(J*o0#lK5~p_(u+}HZ7D4Ej2dH+vxAPuk zL~0d~!_BUM7$E@bSgVhSZvgbx+-!}b>xJ1=HNqeWHC(*PWG$B@<*gR+F<6baDgVwY z3MJd;Z`$GcZY<7KAOo00fqkhzNfPWOjkQ{Ykla{Ht-kb~(Ya?X8wdH@_Mdzl%kqzZ zH=W3;i3t573JATCF@-e*3E{UlQc00xdQv0{%aqOD$H~cY*mkN_V=|LcnYGw~mV|^{ zf^A3vJCRrjL^8*6MBLD}Gnr?%FSLCfE3nEXos98pqB4$55+y*To%Hp^?@m0=^o#># zlQcSOJ&^DqC59_?JGhygkor0+MRoPyBssdv=ttOB9g>F{=5yuOz}46V&w& zb7%Z<1{okpGn%*@BeMw&Uq4`weLC;GC04vZCMN~FHmn!ET^;!t{M z=&o?zkssvFyM5mj+0|(Jpy#B&oYVj^Dir- z2+^5u8u=)#@r}uT;vy4YOh@+p>sMuNwv2% zV`mX&0RVvA!ra6W0KlhHFaTpb9S)*@kxmy`T9_C*N9S!&S!d3=xyV1=_B!lXe$8uc z4wlWdGBTItapnO_-~O!KZO(TF#Q%JBHz8%{(mp%(X-@^}N}rvXgUL=pRL&DHONu#q z=N>0>n3?2~bOw~i);4&Vbbp*ioNJh{Q z^{t-yi7pEDX@5PJcJJx`oBm&qgRyWqHl9?otN8zKrYldLFZ{vuVZqFLDRE$SXzz8+ z@Z4e4E$W;7_(v|EXWtPgpLRY(eIGQCA8W`Y+ZxyO+`n*B=^SS!S3 ze^OWD4-VhhKv(Vu4+$}MnFC)x7$JteaQkTLyX@uv?dYPeY{I$qjAF*c%sFvCSwQ7- z%icb+?_HtyMC3tBvEs#*#zmbCd?WU{M?7|MH|E8rZaO|N=_VhFk-o7~yyd80-)7hnVq7j=Ji?5o%544B;xp(Il zD4w~0H%NP@9N^1~Hmqi>Mkif3$ zN8x|bQoAK`TG~0&clT#-we#K~5@e#%+rGB9eV)-BFXKB(Tz2Io)n3>GnB$F3v5tW` z8sSMz>th~{D=9)1}@ z3g$b{MPBt85o0-CAhXGWnu%96nSq_!!>dM6Z61vr*vR%JO&-ZifMrDoj4;$^+Bk>_ zgtz2FLYQ~tq%)_nGT@`%;&>@pbXLkilx*L(EVPoLIZgxt7ft{8#}2srLc`t><74cj zLYW0qw_fncrc;SJmq*R2t2!8A335z1LZO7=yX%j+p33^l0*fmE)u7mbg~GS9>(^S< zLxwp{4_e4NxopE5 z@qSLnC_{#M=03^OtsiUfLYir2{~(^DZMi@aDJu!+c#I~eAU=I~@eL%%-H$<~>4lQ( zme&uomBhF~MKsd-wLS#(Auidp;L zZ&i91s%QbjT^}~C9u8Xx@D!H!CCET>pi8dQnRuNH1zEHWuOtt!omv8RNJ5bG?sHsr zY{y?=G1&VP>rIEy7h8y7P~R8*ICI7;;Lz@bc(q@{5061B_sr>0K1Y<0W_n<&L~O0o z)*(c9fb^*uh;gVU7X>CT1b`24+s-US6sb}4;u+=);K7Q4rVH-w_du4g%7>y-8A&MQ zK3z11aI|^hGqv>-!zS@=11M7f$D2|2?ECU^KOo0&(9H1+L9}qv%mjeAw3|1_SiVsr zeznoRzDe)c8bHlb=Y2@|=`$myj4cOXnKMGnIA##Z3o6+(l}uKrQkPMEF~r&ehk}UT zP4AzRK6xMl17v+2O0O$23so@@fGBR+LUoX~xGdso5mAmwrx;hpDqB>jSy}-xV+kul zT8e(2u-I;{_=JES^HFqm#KALpKnAbidEYtK<8QHiGcjFpx6aC2_rs)M7ysSc2@uP~ z6q!i6nQEkE0(W$IMi?kOD?OH-?$_XhU>*g>X=|PlBJx%Y-XjIahvVcB!&bsy%uvNm|R z>WU=ew>1fBz9g6IYamY=P&NEiTS>iiUh4eLUHIXv2}dw`dpY9&gQXEd@jy!$Q8UB zWf84B$mI~9iKbWMn~qwWD-gN9p`tRN$&0eSu$|5=E%oD&`wg|fkMe$l2d;#GHJ~{H zW&DJKHxHq|9^}hGo|rQ&9l^abfmLLBvPK=J#fr>Pb{n*`4khuSaETk;WKo7{CN9kd zT}VYZ%lCt#gO`#Ljt@O+;t|gQezuQgiCMOWq&uU#0e&*%?bmILDS$j+dC8Li`L!R&qAAKU}BIAVS$Nx9FlJFikZx>c`}s2 zVK*hspd>D|sVPfK74)Mo)`4I)9EG8v$Ked|HJV)gK(07!n7q9y4VL;hI@4HMVZqr( zUyP!1ICF=ZptFF==07PHPjeiz5e|dmI9_kaj#WM(XQN$s8UGanPoz&jF!Cp;KCWXh z1@_~$_)2|oF1kI)hodgM49#QM4}#n9pB*??r+?)+-TQ+tmoDtFtWu>;w<$UH0FgH;7! zcsVH^X-pprYF-u;6XR+C@t~Kl44D;%tcoi`mS9($r7Ln?iWi~;U8&q2*Ne|!xQ>y5 zx6wag2iz=aD;IdsWdQ2)FbK|wdbb8&m*PZyt2rdmHk05_p?uBMOBm=KMHmOKF^`z7Z5-3p{$M4_ur;(#Ocd}y++ZQ&{JRn zaq#l3a$LwPsbh9brsIMdnHxhumm5CkqT?V6Q?$j&bI!%K5dy>>l=lVgi0h|e1UkVPBMS#ma zEO5mpN%d`TF3_2ZOX|WJb`KFgHh>BE1qNzPj?jV>n_#}Qo|$6dWQbaA&;caCYsfrE zWh$5Vwar2So_P@8;_MenKXKT0DvY9iF-~w+#EHod906>8TaZ zp-XeI4mL>wqsWX7tO+A20KDSAX3RmlFZe@;+46U{aTjVbX?j!}28uKRw`?T(b2Ee` z0qu>s;f0bcy|M|9A%U`Jo&*`*$b;WhGt{;SmijF>;C;166~mQJ!pyk0nLw~E6YcBE zy=`wIozk85vy*lr3X1@dK9)in6GU&)w*)@%{DYxC-H^!Qc=@pKPNR0H0AX8YFB@jG z73q1?a9}%%J3;MyS37Y*!Ru{%owFDk3Xyj zboWC*D&VF%VkV+d{L35=;2>qCck=Bed(x3dYft`xFdj*mhO2fdxLZ1m!55j`Z}Lj5 zQXjow9$N!ap$84O#jBVnZxfg#hdkJps~EKj!!B$GtEw5-28X4^d&!|Dh>t>zMe$Zc zBzIUi0c*p4P$|4pBAC&SIdDHbU`2Ery7EezKq`EIIgTlGA9bmmp7w5WU2M zXtJoL;bTvR^|#hLXb!cR^2buLl4ii8EFhKb>}9b~a+l-m!FcR18=vN%`W^d6wawFz zCVWBL5e}o<^!MarxwfXaX28bTXP2)A?w-3-4{7W%s6)0sBNyZC>mQajDQ-n$UW@8 zGN~^sJM7A0t^~3W)W|wD_$>5T2Tu3wM{OP?!#hQ+$+c~&%oT6ZLzx&;W=Qf|@RoLf zXg})Tg$agG`jUT$YZJZ!Baiu#?7$lF^|yTd*}LlH*rM0*FL;mwTjw_3c*{YiY8LP| z)5Jlz+wEiW=Fvm(+U|lkdwwk;+K(bB+Lt?M&EPglIdNyVz}l{?!SO@ik1aQ=@+7D7 ziTO)8-cLfB@w0cEsz;_$P_0~P^%1szhrb11kfucUYk>-zqXsy{BOVlOwTIZ~A4im_ z8TfnUhpnkaGG@RkS+Bc&6VE2r*8hF^R5BxrdBzha0%ayag_#M^g!_{LI2HOIy+mGE z+Ulv}cZ7F-E^F^#Y13qKExjZ+ABkxEJHB_&8v0Z8#lW=D)nA%t{Ebfp^B-6SB#|O3R^59ZCTO!P&AY>oa?!7 zD$FkQEb%l*t;zz4@S08fBL(^|kzb?^@^|01mzQ@31sJ=Ro0kdK59ibIO8~tp9pxc* zc`StCY-Fg&`L6J6je;4$a~4D}{frxJ7M0EvFRDr~?=D6cTme2Whm8X6W&Y`z&X0e8 zuQs6Nx5lrB21m4AGDy~z9trvSNoA^N`GCTn3Rr`VJ+dW2Hp1t1V!=|{bSd&>P`lk< zK#OCon%R5~zAy4H2lyoTwS~(XEWfrA>2sNqV9jK2YlG0exC@4dcFyTG}CRhl(axm;Lc=h`A4kf(C}TIO5mO0yhI?6kmh zf_ggNIX>)F+-P2W;c$T8{*=FVopYv0tu@pVrZ#iwcrpsvad0W+4V&pz;9ncg04%i8 z%m?tpI7S(sCY@ec+A$JaL=fFyZ$Gv+l(*@XoB0G>Oyh|>LKqAT+sAXWgeqnjI{3sR- zf=!3t4b^R#kaNJUGQIK+`IFZ!7G!D=X@c>#l!+|M-8gC(dom9Vn@&Dx+!o}8Dv6;7 z@4H8Ju*IOSM?!NABD}n4{bFmBaN@vCNdEk$Nvq-ma-?u~4?wz}NCUjMlGvqkU= zjf$N5{O4T0g!1VJtN_!2*D%OHfh&(;C;1(%j0)Om?gz{mKPv*i8BG$IwW3UsllWI? zGq)9NK~M7xDq>5J+D*}6y95O-nPdRKWB?b zNiqCmyZ+q;Mwl401lrb?VM(RTg-Mb#q|TGFT5%B-=oPRA{Maf1&OssO)5SO_6C;)> z5V~mw+SG+fv~~Gn(-i7^t3g?s=qrrPZRMzq z&ZAS{*PcNor9gbgpaZ#`awtL?Ebufah~uM$Y~hoL8I8f!PCC-9Ix2qU$wKc$d0tvV z2On+N6c8}vx%CW8cpi^cL|nw<8E$t&Rhfa)z+)8JRt1(N*!7~=CO^iY^hTFkrtkIH zmp=gCFH3jJS@I;9Bq4{Zk6VAJ9rF$*>RmT45JY<_e^>dnW10BxLa8j!_@@F_uRdK} z5c=)g2@7~W%GZK%kG-&Iha~HW_Wtg|6sr2Ds6Et&=ad!71lVeJ%L(u#=n^7sE&|QR zeB88NX|+(-cwU>l1}BmZJYFP7aflH>-A z_)6R2=HUn~2+P3Xis$wIF0SxGDQ{k6O=`0--P%NQkEswzvIz8@i1izJ)Q5q2#yN)Y zpz-Nmf3oXP&Qtx|S3cR?mgTc$z)Is}0T}Kj2iMN32_sEu((Y($w)K`BI5wy$O0zXo;XiJD|Csl;V34Nw^ElH5_8Nxnd+RjgHFf-P{9(&Phu3T~{r;tU zXBaiuTU-XzeRH<7{&aPCvAg+7yq`AZYm0Z?DaVQxLuf17^-aZzWM-9DJn`}XAPwJkW}`h1>=Y!b3V1NjJFdQM9}kdX?c}CzPA>i% zHY3I|8Tn3y3rJvh%tHBaNsC3JI)Q|#QTdIMQKpYKakLjL0fzl1oe!m!@6=D7Tk`B) z&c4DVBmsG_@S7$xJ^VZFr~Ic7>)1JwaUO7!>$uo5JILO6OXN!qgVEhMSzJ*1xgYwE zVz#>_hL5H&xlKe)@tR*u@Nkp%#S*h$9r>2|;r}@HUOm*|M0!)+G`!E4f2}$q`YZ0z z)EPvPBH}aqvin(B(h9EK_A2>>KXMsa1&{7=t9{+EeW2tu9WygGb%I19^{op9AONea ziKyPZ6L5S^>jbnz|GiD_fWsrbun&owBFq^{n4UKa{h3MANBH*!ButdqLWf$$pw3p8 ztipSA3l1Cf_D0AA%TKG5*~7S+IF;}BGgS)R8QoXnqFbulp8Y95Ti)sIl6)_78r1?oucV`U3Q^C9t|(vKK>J`Ye?JaQpJD<+kmN;!}DP3l-{?v3zS2cZDTS zwwn1~@g1oz@EFFm|5#+=La9j&*F-kGN|)riiO;=5CNXWhsz-lST6^j=@y8N9gJ(sV zt+}9s@9AErw3A-Iy2G&@^E<=gw+u_naLl#4!!L}Gug-Lpof(j{ME=Jj?4swEwyD{ADCg3-iaB5P>Y~;}Vy5zan1F67h_$Qu1 z#R&g`SeTS=58cz->-G?DnZ9ZsWm7!S9id`i+p4Q6!CEZQq@SO?8M(p(MbSznz= zb^;Ch{~irL=x|i7zIO2yS^L*8vS4L@kxQ@j>Lm``<}!N|$n+`QcB!4v5$wcppkLCb zDVCY^)<#?XwRsZ#E+zge1kOP=QzqWH_>W^gp4c?n*E21t>T3bS+WvZ_nWn$rz!~-C zR^Pv-(fL@Byb#~`UH3vk5#XVHJisdM$(k<@W_e%CXN(z&&0|S1xSGWj&~y#Q>CSK+ z#d$k}1&x}~`qwCE`cH4ZhaUX~ql0OG`7(vHR|xfk8mt~?A&2Zx`YR7 zASkZm!UTjis3`|Au;GdkJ0>P-b;|dd@fN2417bhFMj5Xqt)yeTs>c!NAz-NC%*sz=37pn zjpwpSnyVKNJc{|-Z>xasRQYDqrwa!&_O^>BQf9b;FHNtW`LAo50@d^t&xhmjQZL6V z?n}5a7e1DKu5lntaAd$J{U;3>jqxdM*!~RV8X~HFLFG=W>3lUhz^MEb`M9_IH7ai3 zV$BR25jOL@PKLdU`e;TOJIlnK->)L+ClU8axg+ApsU~LQVA73?Ib#NF_o)iatHyx) zOI13iZ+$PItG0?C9Z#5};hfAb`_8Tm$(SDQ<?&)>k?a$RAO}R^keyZq&NYIn>EDLMoa2w2{4A33MoE-4$ z>(7BYyDVjdGQEPQF#WH_1AX)*23nWWTkBN`x%w>suY~>Q5T`V@d!?-00L$0?EZ~~z zX`QiQ5zDSI$M~mHp_z-tMdB9|qNSnd0W^XDU?*9__J8+Sr^5mIyk z>igxoZIxYl5h?JPjR`;2Y**%+&OZ`oX_!25nc5_ zWqf`D`1+3C%@}n7Oa3)rYicKi)%=>`6AL_lJ=ah_-FZ=wfnboHJ}ubdBL{Hon=NNr zgghzMkJp}h)~!1h!=t83rE*1m_PC_|ms zMbMpHTlplB4)Qg-=3RB#ZV+3I^;tkHx8>_of`YQ@)9KOvPb)+)ocdacxQH;Y-U%q1{pT`mF}!^Sm!F{T zMNM{8l&1_o2X3>^duDS9n7+MIvtbuo_Da9QQp9?k=?GUC6Qgl7ERyN1zt?C0B~?otAHaok5)tpAtf1}Y%Wo1ilAv3 zHf6kyQ%m=rXq;3RuBCN#43c>ek+Dq;Tf*MUpkff1Ki5;5hq3n3O5Vt^-r1`e0Wz$C zN|NQ7m0nd>`mVB+CE7weftn|L6z0^imuyY{J-D*_H&$pzD`&>E@1wrFO)O*)?xP~h zR%=Xv2Wb+rFNucBCF1w$X4gt*;~yC>cRC0oCyJ^66niBKAUC+EG=`J756l^kcQqv| zTk>d8dmV>;*f`RwkirK*Y;5rh#sV%Sw87ta0m|Judi-($*^m9gn#ezVTLdnj+*wQ` zsLy2ykxGMa%vvr7WI3JO9XraKXJ)_Gvh8`%NX?dM#El_;KWO-3;%aDqj~piAn$ko6 z*0Xmm$jdt_U4zj}s(`XIA16s5vgQ47vmDi1iXRBXs7+XW^KdA8&8fh4Hc10M`>09A z@lhlwOF(kk=w%BeD+N&u@g0LZC>NRuqkl4+%f*ITZAMKumobbNO`#2-Ql-$2dGC!7 zqwnO>3~TuZjfp=NS25`F+&yFDFbzWx@J(@6h6TFWEyk} zKB%>ULs3`Zhl$HR$Dc!DQ+HLOF9bZqM|B>9hfKj+Q>c2M_2xIMLh-yx+{a?GTNiizz9@eB*%{cWuExBF^$A2$vVZ-)B8pzq3EWb+YNY-VmLMHyUW*Sn7h>N_#uvjenHEF*)iK{`% z$D60Kq4puaM!UghbC(?Odgv#xOyN;0Wc99U&{U47&GX2YHcCSyR>}7IGYbKTW6B&? zig(}LHKm&K=!%3K@JhCDfD^c(WhF0vK@WT#_5MbE`K`aTMzWHYOc|#QHK>hq-Fqmm z5-{iAaR13!CvS*4AU1iu-;leMPp8JpRRW^=b2TNCLq4`^TNAbcgKPM?rd#j`{Ot$b z&ej<>jT&tpFgnWrm~T`~+Jx&F&}dDSJ~SV7wtN4AjMlr`1j8_F|dJz&N{b^-`TVF!9d3T<<(yxAoj>LXOj>bP<{b;q} zUNkk{VPtxI)Lb0kMjgd3a9rLVRe4X_wUjVH*0FCnNub41YL~Gq%6O{Nd;XC6F%{`_ z6pCFQZG)f4`VeaCKK2w2t5N7_msvl!CWeY3R!P?-9j zpT2PDzd$~iNxr2UDi%FAzLRCFtY2<6krVm`B2a?^>6?aYHP@gcsqz7k!xYArVH_VgC>Zx}~MP zCQ|MJtlznXm1abo7r{ct?Qm9FBV~9cptEpnLLPY*!}cmpP8xijUKI=v|NE}s@n>bp zsI_w`*rXj+aoly046r5F&P7sz=%~55u*-I=AJ%&uWGT0tfYh%!59^gO31m6f&XvOS zQ-1_mW3>EJ^oqtnp`}H{HOb5p-Q^Fuh3(tlL5o3G%9mA<*0G!G7p=uX{+i!J-hSg@ zDQX?QCBQ<{n4@4~f9?Bp_{=^iTw|0u@G1_s3Y6F4Bl5uD{2w{eOfWPd+gxBX$J`3wv26J#dmTwghWu+(UZxYz|qWh8SSot&ghzr zz#%NHC&XeJH2uN#Z6|X)8x{hIGTA6Kg!x3{|9N$9i|Bzgn2k*&FAuTlsPun(_8#4{ ze4)Sb^+oPtVZhjl8#XzLq(o&`oVi-*WaZPp40-8S_~V2L8fxtcW1qh5-U8qLOnZ|2 zi@rZlyDJNn8!9RF_9mH(><|-SU<&ODt4-nvd3)AF?`RQ)91T}x1ei05f&b}FM)^r0 zHC9en8O@F9Iy|^%-+r9_NF$wVF11f^5_VibTBr&}Z!@*v3CBvYZY^oA0YcYnu)@%IWk~|X;AkadOz8qKS4$w)O@iey1SS6 z{2;N1_SUv%897yOBcq%jwBw!|b2l)jCzAK0-aRK=;q|3{32!ipXRTZc88;mbj_$g# zg$`XRmbt^)qeGqV^F1ngtht{$yWO!4Ac2q^fy}Wh{0J-mW^;!2tuytq zr%WCjlAr@bS<6amJPd#^`ijIL)?(SdzA*w{o&kG+c}!DM7}2Seq?yitV&JIvmH89x zyKhjHr-{&w;j}mS&1@q5W*45ek{&I ze@rD0Dy>*0A+Ba(=y75(qbl6JUUJ|mwLm^=7bT~6AIKv_D{0}+*yg0p$#XS|ALr*x zp#S!^WTz0S2^Oiobqp_(Fj+hH(W2edojf`R7bs<@q2*-R;D6ymf6IYv7EVR4I!kaN z;60LIC=N65PO~8H>iGFUL^Wk;#&p5ZoH=PCj3ex+5J%%83=na+P#RQrrLn_0mCgIG zep#0X2vdpouBgbCHyC~FwOf4<;PUPa5=6STrSG65iAEJoIqF%ejp1X34C`bG{_&{J zmXm*p8x2f15EQZEm1O5&6;HYlMQ0i3WT%Ebobu7#enTz=H~Lu+8fAb3vjtbW00s5e z&S&q5$hxksEB!q4ig4Z)bXsRD^-cbJb;dX~ik*Up(}cCHe!li~RHZcTxnhw^?vcuE ze^+N08d$lQ*fjk=l2Nh@;`@eSt>NS5UyjyzMfCs3HjW~B! zgn~cQSMC40s9s;0;Abfob5jq=--`#g{mvKPNJ=Ya`W%K{11nZtyK7oB`Bztf-rSe{ zdN#R3m1$|7c$U@mI%h)L#R+ePQ^m&*$zD4K%>3bFyTiK19-*6=ZiZIgV>_sQ>fbn& zc3)9CD3uT4jP|ZhWdbfMbX#^@RJG>?73TE$|74KYZ`8Uiz=zKDcxAR0hY4jnlf11{ z6~AT2*(i&aB5DQI&t$!nT~hZ-UTH}l04AA|5+q^0mB3T6X?{wR7>JNV2WXp1W#9cN zKkA2d{(?9uQAl+A6R5M83d&Y7fZqPkrPjf%lW6=+xpP(7^`mkuk#tpo8x6gqd%Iy5 zX>%*QiG7@-$0UUa2_rO4WXs-|j|0}2Um>RLQD*_!>>Km30OB^l%cWHMWDLA>wS_aE zqH~_R3ixCZ3qd>L*P&rbjQ67pm(3G+DdX|iye^q^{fe=GoBnqyyz6|sa~0gwdSPrn z1}q1jF=*abzDjiy%_uYnoc8+5Zc2w?T&a`gQkJZL`(@-3R<<2?WjW}rnubM-cfV~{ zJ7uA(!S-dKSmb$924jT7XKck`^TjSvMJF3f+|$1!4pMp( z5TqK`p6kE(vXQ4T0U^Q=5Z|KBQa4)-Zj6MYt52G&x2Lf?cj*kZv~wv|4fL@NQRbB@ zj^kFh_9@J%8Urv(bnQPD*m8Srkq2A{d#hNNE``)p!327*^Zz#m1D?3yUh7X1xtVUv zOUOZ^wMVf`56VgEFCS^ln0&)%H&2!kAImd+6mz9S7%dsm?~ADN@+JRbNH1{GGU$vm zL1b?pcko4ixrdCvQ+pMK39cgzqMBTh5EIjv&i)ngL)ke8fA_jZ*F5=mV|~Xaw9NmS zM^F)#pmIe`aNHCG5tYNvxUZ0Pd#CcDqBLSCb1I;jnInV$*2CfElY7%yK^TxHF#e7! z1SG@F7}nXzBg*A4C7mIoEHB%{NKH<~hHVHeH~bT__Id7%cu<~MSy7bc zIf%!Kusf$@1II1(+oJ4*-js?Nl@AVOMFy3u!f_Lh-=W>x*KYS@gSWJnLjJSCg!O4i z^KYtBdXjK~5SH=ckN<8ToF4^Igo<=kNKWsz)RCOAekd6)lbHC9!3#>OA_138hbK%# z-TC4kC%gK*Y}9dJ(PZGBKhrUjUdd&ilqkx*Qyo($^k@eT7?^PO27O&|9#2P$OfUX( zgmP!vU;bnJC83aM@~kv26J5H&nb>Bbug6pEcZ1iOnQI(8`N6;3wiu{`KLg(>H^((f z0SC$RmO8$N>4y1PK=4COvP*#OCO_Io3t1m7zF4grt1BN({?H7HN^?Px#TPC z?*9EhbTTMn>NwWt%q%3xitA>2swz9#s{2x!#t2XQRPR;D21kGXup+;i@k!n;r@&CE z<%11aKZWCyGQj(6P#UBje<*g_uQ=^dXHN=bwITf*aAXO?+f)n`iGviv_wgf~EKX5e8f~ zAA5?N106ul*}n(4+`uN4K=3z?QoDvFpqu^-B3|J8e5S7P>SmsaTa=+($ z!}aD~U-}c^;IZ`5+7^`>I;-e>>oJf=f+mqQhlfwV8DvSWrv?}NZ~iJd$7PFj*eOw= zC&3POKj69%jP`;yjPE=~w%g`$Lo-nvgP4BN3=@X)mFz5}`E^@*q9Vf0gK(b*63hw) zy5T9n$V}&(v*qx$DTefDFw+onfVR^S-O6|F6pi1Is460D+~<+g(8K-bck)#*27~0L zeNQnXs?bOY?@VtXP~x;JVJmiE0ZAgBItP%<5AVQp1sQIDB!}odo2BPR{nVC3GC^;D zUKQB*wr+eZVWZqqV@#7^1=~0rDDWehRNeM*J|D&2t|6d#?sc+-XDi6Q4@C+dZALQg z#G(ym)d%Qqk&@ui$L&@1j4lnSseTdSa zvU~wCPnSwaCw4k`yN2IT zBSnV79VjVFIEbySMCv|k8U9w*vaPhq{~_do*4Ff(o$4itfVAb&RM)7P*^F+Hkm_-o zu0sBDq!Cw=W@4;uB%KlHwh$5<15Yivk@8}=q@YD*8V5{>4v|f}>kE89lx=2sT0Qv1 z)XCVzF75MNN03?&h$q2fME;Nsx7dVQaE_!k$NJfE@lOjvDt>N%MG|*Tx|n$)Z;k&T zBFV|y$25t!(MY$^7hRsM1Q&^*X%OY!DmI6VI{F^J-nZ?EN4mZWYz{21W5MX=u5)f% zm;f(Q?ES*tciL~7Asgk~6G z?CP&|0Q|u)yV?lt%jC^qIHfDb?th4g-x}Y z%?_`t(BtbeX~%QO$%;2`q4Qfkma}2L3tRZmH;z8-C63sZc}04=`JrK}vLNkd>DzQ0 zWI~A?mz*;6K#H2-ovkM8sfs3fTp}@%I$r*g?kVDk`X;>1+gM^iAE#BXFUEpU$+O9bR%+Bqpn?y>SThir1IrSu>+Za#iq}r z<#yAvQ*blz95tQJH$XKK7U9Kky{I*!hqCM--Nx!#%C85wZ;Ehoc-}&_#7* zCSVO8ZO87J04Z;v|LHP>b$|*?pw+&!83|uYEXtSbm;P?&Y%4#o9@gccgq0;)FiRod zGsUq{ykrs5QZxIZ_yE-nM9=rG+?1`}(fx0pf|1629^qJF!X(on%CguA? zI{@b`TtX=6g%Iui4!UO*PzBStp28NJA&-!8YmldoB#nM=aCFI5wv-rojZ%|FI{}}C z(Qn+zTtcE-=`a9!_TitvQUpuUt4+)DsD{sKtVAgtj4Sota|JP!`Xo@o%#JYQ|fhF}`C~i4E?}#Jtozy71v#2_Wj6F(2sSsG|IV`;k20GkH4$r%FPDc2^s*RO*dQ z3)Vd?j?I#PhM$$V1eMSe7q^`h6`h?VZ}s3*Fz_|OLO%RhZq43L`*?CZLrDoH1yRv# z_8QYMiY}VMTtX2FR!>?=Mj;1se9h|;X(cz$JpGE?YNx$i9aMRZots!FH%B*e zuH0vazPhW;ZhuQ!C{-ggjXRa=|?dd5MV@w^TN8(G?gS<7m--hntMV>I0oB-R#Ntnje5q>wZ zW12sW7(_P>LPDQ_HVvlbSn9@v(FR}P=_D+DfBOE$%m)$oXskIP56;n8(gfX)TdSXV z)Q0-e_vYKwVeAKAuN-cr0Hcg&2z7Lf!xeAPCmG3H*U(CEA|A52%z$RC&Y}Xo*+j5+D$SZuXTle}At6Iq0)Hj?P zj@zVPChfb%W^XewKbn1SJ6~q54xU}R9}tgy0XVMva@@(t7|}nXO0bAEUEYGC7@@}5 z5@o#xpm&Z1?(1Q}nCS6z84l#YQEBG%@M|db+cnM&wn|{8IRgeM(F9iS6*|Yotweo+ zb_Ig1Wf=1eD7kN)d}X+&gB{SPq04?6|BoqY9OaUS>S|7p%C2Jn``UfO?dVunXso3Q z!Xfcl{};KZ%+T~3*U?u5XQ;^3>Ukp^7cF_>i*# ztEDvpum(vb%Ohnzqk`v-lU?AK1zd5&PgVoG@nv}bN$0M5iKZTEeI}+e9{(XjKBdKj zbkyFkTYb%b+t1#NU|S8I5@%ABw$ENUeL@p_EgNi}r*~$LRVlF|wm^n+&d^E8`M1Kv z$WJoJq&eJO@SR2mX>VAVJ;Phj5ybgNFzQ?{H2Hz7Mm4RQF8}Za`JrZQP!;5zQ0Qf1 zTSX;fKrcFvEA)AvWjR24ME8OM@{T_{U!YWF4i=9(|4HD-+^JcK-}Ti}$Fw=7-M&4> zW`S!&?Pa>8av2NfA1EI$-ae&Yv{lj1ziYAs1kO2Nl6}PBE6(maNRA*V1354dzmNfX z4PLQixbypzmBnj&{e`d22d%}b&3Wrk-wRzd-FcCIry|`u>MWzhP2Rj5i1KrT7s_C5 zbV^06sMcmf~Ji@3@nbaKD& zF~)V3ll?ItCy7lb1Hd<=yNh`_`2RK(cj&)Zc#tZ#KhQ(||RqzUg(<(23MmKkS1J2|4A zz-Ny+JuS3UsKRCWugL<(sHN%Ozv??9`#w+Md#^h|)#D$%mz^xCX$~%?Eeu>y!9A}} zu#!|b_UobCJXANREwbRo|57RUujCe*;J$9&v)}9uN~Nkd|JKgnbYRL?#AbEsuh&%q zR= zdPR)!Ifl3SKl?~{`VZ8Dzz>bT^+G`W=cd7#AYegyCY|{H%$27So!f~M73y&W$ja5< zNBbt|;psoRuB%7H(y~{Q?~aFqFStZx-ChfPFY=MlD8ehu+{}kGD=Anr_9C9_}mZbDxdyh}o2(oEq$ z`0IR=aW>v(yrdI+#|dSS7;!!Nr|s6Dzrw8KdURNQOq`bgR~(pbr*|)zG$=7uCLT-E zJZd&bpzjL3xS5Z-RatN{nZFiap0oDoT2SP&)XxIP{y&^GQfxb0anI-U2HI63sC}0) z2xu5Q2Il|fpM+<%Wz+ELt+aFElUlF#KPiAOx4AwfzxFnZj)i{OjJMY+q_&;8Cunk3 z(^&HJuyLPYu*+Jj+FXhC@uxvmwUGPxGaala$lC|)Gx*do2Kj>Wa`L-Xk~i5FP9ArQ z-}#sLQxP5LYdmp;|N8Yxb4Q1FtmtcZ&yP*j5jC}*q93dxnQcT14(s82k`3W*JhbE# zK!Blf_?usrChT@!L&!;NM7LJ8Yoc03#g;g>QSry7>zcAF(drpm7^q4Jmu$PV!BovZ z<6$q@_P+KfRMK%?nxQVN{O`qpi!4fjm683BL=c-N2`~lSfdZ^xDSbdCc3BJiX< z@4oJqS4$63s20@stG!JAq~*hmen7nN0BwIUXkmIJkgIx+RaR71y8Er^y*?eai2kQ{ zVn;1s9u4+2g-VP;fFF9HH%WUX_j|V5b36-@>1s5+F?_>TI-T?|_IP_x6PDQd%t<_y zQZbnsB)c?(F%xeH1Zt%s0)a-u5#_fa*EAr)gHGyWh@h2-k)%80ukAheP#T*ElO>eU zk8d^LFOj;sYP&yqZEDm7fqqDj7T7`T-8zNZzW)xJXoZG7GTJdH1mW6go9_qdesxh~ zgev?l@!A`6CVSR;-nKd0;FqGINnbtcjB;C7<=mCeXlHkT9yRg2;QN7OLK~EVH{dX0 zt1ae@EaNAYcqU3`!~l%)-5P4Ez~A?^7s)W9ERF~Fw{j#Y+MwM??jmR{z}H^3U^wIF zmEwy)C(zq5Y`_>*nUf~NH0qi0GhIP0T8R)<1_>Lcl0>#rJJr`x%$*>qW%93U!8otjT*PpcP|Z@)s!8=)!2Ni_dcW`fMp_Ewgv|0@ zNNS`s+Da|rk-0vF>+P|eS?*2HiS#Fgn-mxb&k-6Cen*jYcAlx*?O>le)}biTSzWH~ ztcI~}B``m+(k*H0t-U5C2&OXuzBTi}x8_#g{(LiM|M5?MOrJK3r^N&Q9*~k!yC`v> z@3C1C`Jc4herExy{<>6P2)~1LXE^=eip55=N!U~LvMnS_4@~?fDhv(M)_3B!d$fXw)()N$V^R3@X zl>Gba-_vjwL51$;wm-|IdJ${9f)97Lk^IzzS7su0e44w#AGPOVzCa-hs{pw{Uz0@Uddaj+U4aM-U^XN5iZ9KIqSai`x*bxu8v#*XpxHrK}b9*A*? zn{(@?7}luAtSXoDhn?p_rUSC@@%<@wNn9K95fR1=gZn8P882%A7RtL) z`-gd(*&D{ap|4h;27ZDZbsje82Z7skFCuF)nU)y-1YCsuP_cM6{&<-+a_4J#a@|bI z$E#njrYlJGFn01Ptp9O+y}nQ)olkM6UiPP#cvAOZ$?Jolnj}_`93_7kTDwnPZwD(5qYhz%M__z=3c7p-oDCs9fj_$hpRa(>GPwGiddP#z>uvLuFV0lq`cx~}>kt5oo3Yg_sPhx~{MYyh zcR1N{QUi4LHqlbnA2H{^1Fzqds!1c78vhHx24PO%3)$qb zWz2LjI6dZBB1Z{Ckec4zzK`0GZ`M5)=u;hyKEbmO43CvIh$6G${`J6gO{I#9<9qHA z{ihzXJbp{@d_W^&v2he+_i!Ii|40A6oe(3*Elvq=IV1{8rIl+n7R>IN#skD%V22~1 zj46>Cw`r_(*GZB?Y6Id3_Hk-iT!r`s5);oNX74q3`%-8X1ZB6L&S29uc6EC0GWJre z0tK&+vdLhc18%?+JMv-_x>*W0O3828!lRs#P62^T)yOtQx z(o!T@h-e=X$bR7s+Q=4cdw7!b{^aPannj*RIV@rm^{ViqUtixZF{=_5<u%oFUn&Hh~ zqsk+#0zvj!1svpX^1)a?D&;S8oNhTg%!vn_s#&T=q5QAHoyUIm8P%7-nG$95&mDs% z$(qR0PaaqoS|H{9@09S0a}~My{wx}sNWdOg|KeGY2|R%CVt_Em4EZ`_RWl=2a(u2k zWIx3{E*$Vw7u;ay4r=*m`nCS^}fR<@5yet_-q?Zr{+U9(x&*(3R7*@p^Uf9O<<4&Q3ekMI) z9usDi0q=0ftG?c|_PkiVN23(S@6yeTD_62a7i_-y$U&PKKQ4)uq|Jom zTC7$DbeNea8HscnWPuaP;@5!{fIBYbAz$n4#A+^Io5hv; z(xT7`lUwNKoy(o95Q}30)g{v`GVGqjGyPNQ#f9^~4%sqmb&=_O#IRD!s35Vk>W_H# zX*46AL2V{HEAf2oliNKU9}7~C{Ovu`0AIsj2E6Q_q9d;z7{97t&?CR?!19HRd*ZIr zJ~>tWItaXzLRzr+68rZN$WwT#B-(DlX!mel*@-(|H`{ylDi~37L-$77Jz)cixESn> zs1-m#9Ni0zj$k&o8)zNi?xE<&{5HNTMhm!}U!mTw8bG0bBD)MC{pJSI2&A+1Nk-TQ z#6@;|pTQ1%z9YxP1p+3Wr_{bSBVtd}GTf&U%zHO)UPXHgm`iRMM493Wrxp*2im)zH z81DfE)c((QF`r*+Wh8Ch(2c|i$!6RT(Czq zu8=H{3x8oJ8lV5&{lSZa#t}FddcZfWr&bSxeK~8*<>Kq++eZ}xLSSa0@ z3l}=-gjPoiw}n+qDugEpgI|I*70IT2K=|vn&6RwxMt#9%(BDAZlWbk98IU+y zMUnWNX2IcX)& zc&1%-TS3dXj%80r7`df7Ha22mdfrxc^R_ZTAa;S#VPS0Yzl}h8hJ?DI;6)*$R;6(aMfz3JXc!g?S19$&8ze9y>lZ|2mof=g%}`&tnDg$b<)>M3z0ym_>d%);=fo1((=9()zr8428+H9m zc<$E)X^x&5c)IVul9ZwVML1S?js7^II2b)*35xID`$#>yRb3vCRtHyQ!U^5uleo}X zvTQnZ>dDVIy-m-z%2@o12~g`t{sV%*%6N+ouyN%$A`R+UWol9eA{OC?R@D`e6SNtj z5eyqHjRLJdgAhN`;?E)sJ?YqoAT~b0by~rA+PB%`zB*in#QAn3A?l0R2Kd!CX7QIR zPd)am`|=Z<9EsYU(Ge`(f?TrE8#=f=8J0pB7rIy_yJXOX@*S22*4xNQK!2%xxtg z9E!{SykzLH-}d^R%w+IriY>?yyFzb$gv$F~_zY?T29CzX8w#(+J^NNh7ORQt&eOpa zBSaxW4273ti#@{fHcN1p2^|A=ks)XIkND|=1)}k$W9SopPj*11y0Ylh>MwQBaG4kP zEwX%*QZ12mO!oV673_8(5Zqj>M>t!ortIm|A!0c@8qBSfXm3o+{B_Zi`#EQK!XB;p z>a3;>ShU7DE|_g01PeulY069?E)*Y{;1Bagq2`m|jDEfot`OlGAIt5ab)^p{$v7EQ zn5owf7k11m+W-F5f`iXiOYDQX*B?T0O8~fmS9nYR7|RDDJ%}ng!S=~hQ7i`yf>&`r zq=!zhUdLA)4_%Z9DO)}!fdIS^l&9^RmJa!B7TkranE0|Otpqdcpy)|0U_*W|?JuI5 zeQJ04yY*tVQ!2s;`}FZEr*G~P5~y!FgaLK_=tEKDPn{r}xRl)uWNeAsIf&G*7C#OP zHUt+Gqn^p5BCrfcBO*W>Q;7uWR}n~5HVRqyuL&00AB9NZA7CTgf5w87AX+wGBXd$kaqonyujdwJ68^5Y6nxMI|VibBFA(>?5(ta@PHR$>R&Y zN)I6NS7l$kim$ndZu*gDg#H&3k#=DkmBRQ$O%)a4ZT2%-)Db1fZ+hx>V?=*FYI_Ex zh#3ZMfs=MAE>eQoiuiuoJBB)}HTUnbftI`&A9PC_fE+9!=qte6nG4FGl?#m=s6XDL zl$YCaa10HRrd>d%amfso3ftJddoub_LPBluw%*BLtBn%y?16BWbvbSPczr6Rq`w3k zdC1n&5=#f-7utFa!pj2vGpXPu5MuslW=VaN9vC z-s-8VTR#@f{;Hu%3URwz{SJ%@0WyC$^|qy5&pX2>1(yQc8*-^}e5~z+fc*TgUK+{! zs?3(OMYu;5dh8gna3K03utKV8DcQyKl|a;LEXfD_!DH@|SR#2~LqO-=18E?tu?2;v zPokCa*ea<%dpxG`qlgQ$YA@h$Fn*#c0{-zD`S7wou$Y=5Lh4V8oRW6;XYV@vZG{T$ z;{m@J!8xsTgRt51X#O?#Dc^#cs7^E?Od*`7fGj?XnbMQj#bB(;_baDR9K0 z4){TdX2yjCM;VW`zHAY(hDPMZ?@gcOnU;l4xH#&y@ve2dY@nF=n{l z^%)KDP%G%RcyO_%!yd3!YpB3M!^E$YFMmv-{zR=^%_c^-%^NhqKRJ<(<6LqL1)|i% zK;xj)Rk#T)C{-Z%S(5W{3aLLOmw9BRiW(5mJ`etm|2jITtp&SU%poM;5v>fvsUzVZ{TGUJg4XWXNEKTVfw?lMi``4?MbNSbvo{aGNUJMl{=3= z?LjeU?l0llH!uDOM(h{z(bk~l_nAtoPtC)ae(z{w!CqKap3mttzK0UF|MEc2B$}s~ zCm(EVteE!3zv3(_BY%(jj-96UVeO8(dCmsT{m;Ro{Q$!O_ulNUs)KeWH3M3rz4e!K zu-VBgF_0j~IY=EX>H)>lZy5avB$oEiXj$jCG&;C98<(fJV$H+%lVAS3zI{CMhcLJi z*cW~!C_m%Me(GsRLa3WW&gTiHy$Vu{>B@|Z-R zpeLDv7MMu8_c3?S;V8gx=+j9=|WJ zRbr%c^vSOlVnfm#^ZTy&PAgfd*Q0&vC+Rr7?Tr~l$N*GAQ^QH*w=JPTnlL^&lU5b^ zCHv-u-O9Ucr}miy5cyFIc7Hz$5?)^L9B@~=wI*eF%&yJ&J83D#@OOm^?+srA*X{Rr zvWG3@Mv9nS9kcUnOP}_;Y6=a}Jco|YEF}r3W$uA{(m>|il75&;nt-SWG``-BXH8=8 zM0vI@bZ;a54OY@j?W>~3be)a=GL+gEiwDbg`z!yAvHneE6`l4UkEk!n4yl<8~>7${x8VM{Es)Fv2Nd($msw2>I+OrUnZw z7*t}@lW`SdOszQSjL|nEpUuChj9L_T`^pAngNB^FzgXIWp7Nz}0xXeeu$tiPhD@v| z;q+h^wPybB<);V11C+S?DkEV!AK&Pxzv^Y;uMGRTT6F(?{%B+flUW=8@6AumUi-hw znak@V3V$E;1pFEaM)`+NW`LZ-{SVoVrnlwez()aS%b19Y071C~TLwR*!U!_k*T;kE+cO|4DOxj?|g{P&w}SH+_rcxv!(puZ@wYh06FCJJY`b@P{Zdpr#MhjS!-4(%73a> zqPPGA$ex!4_q5R9B_53sExPw_ra6&T*Y_-7o?x*?aUv9uv?&W)&e*b+z zS<|SRP~F zZ59uJ&H^q1|L<(AWv=XTqzqq^Wf^~SQa<=ll+biw>qnkR2cT!koCLN4VF?7&Zh%b0 zn!vzk9eHq9zp3_W?hB`SOtpPxsqDb+TA}-xWcr5V@oV;mcwAe9)Y9R#V|fh?fUiUd zWGKUZ$u4;9MS`W~7Iu32p@i1Q@^i07gZ(|Fs?!bd z(mMQE`?gXI1Nc-&le`V{Q%$$+_aZB=1S&_}T^<`~ui-U|-|X^FN=swMyjO%#}N}zg2IA$^RDucRT|&b zbzUmwp!XK#!FBv2qoy9YL}s4hY4 z*a^PJ=e2)CD-Lp{aTBsrL5^^-j;LmAKZR z?oTYt*I6;V2<^o~=CbC^-|=Wo1CW(E#((*A6#JKjFi~oj^IhQ@P6uYxQ~uUpl6UxAZ(QpOtDT(`+_;ROwFUWFfsheObHnMXy~PMv|a{G9F4pZdg?p zu0)y1$rj0ArJ)t3%IJnK+Us@S#yaV5z45%09m_ouRQ}6;p&^f6iIE6q109NM6Lzi) zEgyZ^oUD6@?f_H1laJ$1vU$spAb+9jPDPJ}k*(|3FFzAiyd^m1E)|TDVGykss$bVd zc~|piKtuY{fpVUZdHqMF`5}M3gT6JEQ+S=zPs&j>j^}Fve+Do5bmmfO+i0X0*L{)C zY!H}^xnzlN-vT(mfw^N0U9%Bw@n}*nE#&PXZsyvHQd!?6cc3V(_@QUu?z%Gb(iG`Z zWarEr>PqOd)%|5ZIs;4~*oC;H5kCy+>$776xugWCQFN6^3(jp024>jGPLu`))!fnD zc?}{nR}QQICrW#5sRHTau;y;LTV500-v0`3Z)KxDcshdY&MjTRZ@-~);yI1rD;j$= zM1F_}d%*+%pL$S9d9<|XbAJ!J_b+ZF<-ENees+}~U~9$VC*Q1u*z=!f_+Ilex9^VA zq9<#7|1#8erE{upJ6&sLaB)_|U9C9cBxS<^bsR_I`eLq(`O2-D+X}%y3U1mh)jm%B zdj-+{h+Bi+jFeN${q=TW;jrM(eXgdTV^{1!6{89(2HevbFOQCPPXg*wIZ*ddKR(fm zi{c??t&DgFj|wgR*kT435yE2=;_K=^toY__<*EjT0pvc4aT7A0>&5zxLIc5GyQ7<5 z3@cEm98?6%-e0?SP?8*K_KD_s0XRI2Ml_BP?~^;nTfO&A7dc6ayQC@bs4ev0{qu*( z6xHcKgK)}~3#8!18}{A6rjMT}P6R@$IA>(7T}-bwzgL?W5g?L{G$LHAsIf)YPZn&( zoNs@Rq+o^*PkZ*+_D9^CZCjRtj2&Jh#&-`U1!hfwW$y8yYhOlN#KZYv?h|e9D>69z zg%)u@dH6ST1~?B)B63kbjEE`iDMUK)YlQA-!MikC=q-ug!}85yTfHoR+Q2|`drBR= z!4}g`rTVh?asbkD>kt;fWIAZNRc#+mOvC}Swb((nUkGSejLt-tQY2FRf&gW3hxWP% zdfsJQZ3ySK*x_Tyn@GQwr;PjyYO9vRX+RcU({~X>o;@_gs^mBI&e?Bj7q{+?F}-Vh zayWRDDHHS61|Yx0=>X+&JADZ+0))BHgx@cgp6@Z?_orkhPG|##M?a>eK+j(S3>ZtcC8%07 z6ks8J-KRVXIBUKsjE3SjTJwD?m@q>(t?36rF5n&(klb~Wc|`B0Gs_Bul{6^W1QstA z5O^b7Yj4|di5D&wiEd)Idn(0NI0#5W%nP9EGV{wSxyG*cgZV#qQRk|gHk8fWWR2Tx z(4&nfl}A}RNl<7Sp_dQk-^$+l7o2b50(0+Bw-!o#ddb9|#%bPhECJ>{!oh3^OV4-a zdhl{C%Lg@|JeOOg{waMC&jBN^Fuy9?sPoZ=Ke)xn$1jmi7vBrN_9bFU3&96@yUL9o zCM*h`bS;6m&XGI_Y>EUp4~51{GZnDvTgtWW)V=Lv&1sX&SppW>dmh9+Ck`KDZzL^o z;@m|*IT_l9=H|j6wo!p67em$#4EFoe@O$5cwFI)rk8$;BU=k&8$@LpGUk8a`6`)d3TCMTeG8gmmD$uCb9$Gy5DFlA?~l^Kq#A~2UcY*?3MB^I zKHFQ2dGC-uHZT$?Bn1+7=?n!OxzR>gGlRa`5{qFE9>3D=D_5zA-)C7|D`c}75{(D9 zAr6+bC*-1oE?s2k4V%w&!WiAwzJfIFV0>9i+*0I^4}lJ&#)AXZZJ;5?3kVMK~CF{{!p{+R!+M zw*}l}&?3;;<2>i5wJSGY&UdxZd|R&0!gFI>i9~_NR(rTzmRpSm|LYt}zxr&>Q z=8F07pSbbqW?q9A-hKprw)5X3)px+nzt7vf#jYYU5@Fa8!-1G>#t)QVWy+lNq`_h+ z__CzZ%o7^Of8K}XM_J*bV0MRjJ5AzwrMy5qKTHf`iAY3}H}#Di?o~iR+#Ll94U>|@ zuV?_wib>{Y#4&ZC@^(w~h`w@f&Liarf*VvxPCyIntAom(WbXe>2cq=jTPUXQEpWL# zY?lRJy$dMU$deD>A*}PnVH;)EQ)y7o z&0TtKW!}k(1?O%F#aU11kz;?@pqx%0UDYs*aQ0s@U6wRJ)Gz@M9UXDgM3LP%_v2&{ z3*H(tDG-%_-ZA_rOrFd+^7d4kgLWw1RL$GYDcj*IWo-Z`FlWoVKaQgiIKgeHO>+IdXzf1r{QvUb1XzqpoNl8~!h*73Qei|>A1!G2B z&58g-%b4yGE%6^-jWWZt()|ysCxzK9wwLL%4jNKUJ)dn{(z9q~%n%y|rG6U+>99fW z$Ur#F=}Hk+8Bc>p^(ddJsA_-v08RA}18eus8jde$t8)t6IKeMHAS65i>TeYINJyyP=Qz=oMo$RvQmioDWmw>`Iox+iz^D5TI#bJ}2#|@zmEx$0i4L(4{p;PI14_SaJo28kuAP13v2}dVda>khHlqiA?wK7faj#saDOpoXGU)I1yS}7T~66-=pyoy$bZ! zU9xXoFYMtxQj5hjORK7E#;t@5uTJuyRywXIp+IXkCsId{>wt@>iewnxlm8aFy=Zao ztI@d8fCh~?BC`Ua($T=+ng~>MIGrdGuXRZBmFlw-EUET4aL&yCf*i=$^tXEw&pnV8 zAqm?ne=^CASfSi20$g&`Ml2mq)Ku^KWO$-y#CU?+?t_g!s#Gx`QdWOnyE@23m5#^l zi2dPXC%w^R+40X?%EqIvanwlF^5_Q>y-&4;<^8D+U+g5~WMFC@{Ji{;=Lrg_W>*Wn zY|mbzjiPl9(~D%e_}}!~DiR~q1jLSpWtb`%Xlsh_4bp%fIZXiP(S_sxMNG9I{ERNx zWwwXcUVsd>^b@jlTJ5Lnp_{{yt;zluuLnNGeDIlEAbTMDS;0@9@(R2d4Ni060S}Zs zD@fsih=IZp5WpC*$aQXd(QQ3$4>xm%;&%ZTdP3fa%$uGlMi)3^u6+_rVW+r8wwEed zF*39T{HOdel6e+u#2;g>{B~{LraZay0w-qm9o*2n zDZuGw|7zo@ErUjDeuLhxXy0F#<6~V}s8O5c<@69*_7CG}3sqt_Qg0E=e>x+${OP(@ zz;0Wr#;29i^&tlKAQR-c)P+$E4(q>xk-Cpa?7n|4D}VkX_Xu_=@N-fnRN)oyQCK0nc8-+@9mh)HINvEKQ@Dee%n#5X{y7WzU>aOc`+#C=C~#vlPdZ zfGh}I)P1_HM~J;n+PBZ2I9a_9TEcF>X7tdrTkCDR|3#p3ddnrrJfPGPupgS+(Y+vq zxYZt|lX~S*k^7hn*PUO9Gfo2-|b%Jg#n$GZbN6gib5Y@xS<);SBbFTeAc`8(V`BjUGOp1X!-ry zeBmr`?6QzToGMZADai3UgoIb~1XKdCT*N9nppRnPk9|UABp#VZ6!p`>mUWn@gdi`v zy}acVF_7m2bL+=0YL;E?TzqY}vrPhA&9Y1ig*^odnYF^t-ti_k&D{Sj1Fg^<7#3)b zESbEA&?fb-719hQ9z1Jxhtfq8WU@|2_C``4S7a9-QIcUA_WvI!xiP z0TlJ0KlX0_Yi(XC3}s;H73%lL!&ZG00H6}*W1U20u(@!=q;=^AbMCLr$}bUVBfKzCigzOcuz$7 zMbMB9@-cb%{N56U656{%Pq}o2B|H3#-F^3%p5}pzKuEG+yaujSCii6~qaFv|>L*AF zWNc(@CYYxh#2N6hEBd0y%a6rPxT$T^WX*tS({mQ@&vjC4E(?KZB$QQ2vrDOzfs@?gS z|6s3n>t_+Tz#A)i)_)CZ+b$pu%DmJN#k_!0*<*%_>o6jxfS|MKK^Sc)mVUwWpTIeB zT#?%l{-K~<=x11>umN0n#xGYQ&xoerE4nob({OuQ=9s}eP7et6#ZpBudt)iUd6%Ni zC4U&?89?SdQ%AmKldfDY&Um=kFS-Qt{nPf&D=h?vR4`KqqzHX@>t@eUFNl{YGFlqn zbO2!|Z-jhwoZH?zVY3eFrj+FI% z_&4B%)A?UTU786=b^&$7$-_%{E3{jKL;H>oNuyDis2UmMYj@CH1c!TpzPbScOv}K* zyOu&xjEO$Miaho!+^GNkDH{q%<|fKIQHIW6t`aMluH@!j@bR>EJi1q{$I5BA$ ze_i|Cy3HUm#n73O;!aPw@wZ?u5fmG;hl*9SFC7m` z1F*thhd-aRJVgYiMf)dlK@y8@2qL~Ph1qBlo02~omqy}N*@!3RZ={DR;y}NjLjsdS z#AIXq)C(zVTc2C%UgEgg{2H5SbvC8KhLYU2``zAl(WbUCl|UwjP_ODSa7^`8J38)X zxGieK9=Jv0xfZ{B>xwyT2wGKo=7;Q**&q%i3UJnZH-kES;p9 zf&|z4X@Ng8zubOW8id**OumB~5qPQ>@AqH;ay0qjf!?`_O=`v8^+!jh*3yCv5bDG* zd3k%4qzt}Z6HTlpZwJ_M0Yrg^HysWK!?K|!rOlWu&Wy>c%uOlQmdzoLTht$DH`^+=O4at{QJF0 z3QxC1F=hIATO@fzcC|*&$(b{!f~4&$VTKKT5+5tL$b+oH3g{xzOo!3>Ul!aquvs4tLHde{_Y|G14JLMc z`j~fxAj(k40tmte1bbfXa{ky(Z1w7eNfdkHFUpz3)PmLYfE4>YIs{br3zPTnEL8Sp zT({%}q-$+FlH>+jGh{f4E3;^io(4A%Qal_f-!&fC=9l)l+g$ulF!ps&K!R29(=@^g4;$viy=1rREA4L&pQ)_Sz=pRueKf5vKIpzI#G3(+KQoYv+}R zoO^7RQ?C#Qtipt&ShKV%1R;a`OrF>~da0aNhN6-TeRw*15QcClLq@V7S|H{}V`68k zZ)ujOSf8ZG5uFhD8g;t_nkuqLq*D}|oAO_WxM-lkSm4wOUYa)6hCvvtp4^i_dt<*T zE1cjTWZ|fF_Dn!r(wX0?9uN>$wC}Qpv^8~4g7z-+EahSD8-44KAVo4t*(kD{fpcui zO;iW=RR;?nK;Yj$pVTM%d9DoCa&kBbl}_teSMav}W`t?cGDwB&X50-$EsKut2QLk| zeSnCHMIHxO-R^H*QhWET!~I)07<}Z{(N>V!%z3PYSEj%IYZ{cD=d84VhSu2sEtSZl zd2=m={f4US5|vrzqi+x)F2~cwg5TuAvN@IZ-DEmS&5dki)A{TUzXMKHrb1MRbo4e)qDZ-Ujws`^>>h%Li72g?}St zWN}>guD#q1EJ4TDn--#lX@?RgwC}E*CGyM|X9={+)<{mAzR3TKQPfT61fu^R(obhT2T>lb>IVRQx_v35jmP)@*)IjGvLHl5QrPa-=`L;#2)U;c}dX8Msu zJ8{ZMYFq(*{+j~us?rGy3aCTMgeN4fpJ(*I7sZhM+v4{i&)Q$H!9M(I&jVlL+Tp@| zjeV5;c%RbYDBzbAzSYJ0E-5I@F~2inATdiS=q*|@f#%c`+$HB9>7(Ur*8S(M8SqA! z5T#lZUgq>C62qTYUP@}k>am9!fFH19D1YisTe9CPQgd!{AtbqjaRXvv=lS&#szC@c z37cKY@q~yLMHwKyM399I)Ut|QvW*Az4HSnWa@avmDY++P% zQfw;B3y5yl0Y7%FA@o)1`G3`IUWH8-_EiQE`f-6yCj28D+j00Z92lIjT5xSGiyjM7A-zSFiP zs0|!F|MGDHJPBJS5lL0ASE8dxXa ze_Z_Y@a^fWdhjh711DyDQ7e@^}Q6`8SNsFsTy4EAxJQLmg zk^y|4A*dA^;xaNY)}S#Ertbyaq&p>7hf}PBe#dA|m4&_ddYh}NJiFzg>z~JmvGrR& zm8VVj!Gl4TWi;uJ!A0PgWQs=kW>4aHt-*Ls>2&}SE(m*J-)3hM-zI+qfw}_i%!l07 z?%S!RC`4Td9_SQ8O_=? zbK0}hFnT_DwqZY}jHbjmO9#z83}Tx;bX&kv7o>s0=EIXs(cgjGL*KTWvd?E@x*L}1 zApWdQ0jB}?@KY+u3W3kZ|E*D6L?v7EkzkKKA;lZtZw;}>CzaU+tpy9F0bd!ut$^Gp z?w0<^PrfUz-F-Y!q&bq`c2k70dQ!wfpDYgF!BAxKBp!?l7$cU#qe5f3V+~3lvEV^` z8Ndo$(h#inLH}xG!D^aI?pn|!TQ_x|gYOS8dHiqv7&*KE6tOSxiuW}Gi6acLoRN-Z z8lT&(c>We-=(0dlfL`SSWGH=G<>k<=Y8tg*nbTi<@vM4a0H<8Q${7bwO zVR1_(W(wS?^Ua4f1NU?1tX}4{-@pb>%E09 z?4GLBno1x)G#3`m76yEHTke3!1PFm7LN%dGs}d47sZu zXfMHfI;aBOZPk#zfV4CT=cd1B7gj6^xMb|v&j zqt_cMqT?$JhaKG~hd8p`?yXzi^cv@|co4Ow%OHLcOis&^a<#{G)&Jp|C`5eT$zN&J**XgdULX`71&!z_+1lhBDu-jb|$$f8wj*SFGYHy zO5~0*dDY!3O$SD^tK{vasb#nIoF#0Oa=0C(i1sqS5zf19p2hs|V)Tqeli1|ecD|kX zhMh?d#PxT80q!Z>q%*Qr@@&KWC*S-4U^*%S&V)wF#z;xwH5 zm6C*;YFugmee3hrp#ER=Y9FlP7O=`QTm;V@imQi{+?W7y1{BN!RHCaBenhS$!iY*R zL3dt{x)g^KxgXM%$VTxU@4Qpz{-8P$`AL4$d-MGRe z$$YCni`_}Y2DfojabVd&l20aK+$vSR;pSH7V>tpX8OfphK-e zAkYwa&U2Ri8XzIij&Vgdn;*^8Z=Oaghlz_6Io83R&|MoshWIXXOmc`m@@mTv| z{tF&!L4cyq{pe?>pbmR^cYTjg*S`p}5T43eT^1B!>LMlUUcR@T&`Gv~I$^+n_0xwE z{hIpK|9ejUtwnCuQMPt`;{Vs-IH4_y68`3I=WLVr?ud}YH`e?+L((rc?kMQi)eS#u zK!m=%Sp^w{)LXu)BLBxpWK|1z?8gTqx#edLH1^9H0KRj4uJI&9TbR?aehM`#F<^=F zzB6O72yzvsH7&xWo^tJjksN{oKOQkX89hyIJox-w@qxi#P)T;x8y3g!DI$=A&)z+r zd@oaQ7alSX0&f^nli&ljpjLZnQ20qsG0)u#>W_I5(LrgjVMhU_rzoz`FL{tEQ@qG18{N)f7D_kb4w(z#r$S>px^*54H(; zEfV#uH;?6KCCA6=*KgY_HP2^L)eXIcT4zqIw-{+A+p=f^C#P#{cC{dq2h*M6 zk=36LA3Xtl!$Fcf*?~a#Da?R?dW-N?0$(2z3W84&TPW+&(~}f460!?(OSlWLkjU17 zSXxlWQ#U(*JqRPDkU52*3A^rg+3uqCH#9LHPJDRJ?6$)cE`Uy&3T01!>QJnvT0vBOOsA8i3hOPD^FN6TZ_|pT5}BeM zO7?QzYAllc;o(E~Yz5z)#Y=G&E}B-!qqDPWYLkqh{w$D<0zTSb`K7Dx1cKne?}atK6|5;>OhOR`5yS8A+}>} zEBLaXnagQ~vxg@oX4U;}p22^M0cO`1<5{^U#tQmwEPZeW`Dn5blAr^UIM?IF6Y>>s zd(WE`Kwpw&uirEVnukbzU1Ru3!cc2)f0?zrs&_mK`?Y%J>G_09I0phW4S$EL1rrhr zKu3C1r1#b?UW@Rny&-EW%Ho}YM;6D9>+$l7QgJ_CxLt%{xAqo3B=WxvT8VI9O3S#NmIm@zo%jAjvK7UnoJsW#=CqA<+4Q_HM@g zcg>=I8|k`e2{f-fzAR=(qtslxf9WH`(Ug^Xs!VQX>-`#-T&Tk=VLNSAVq?mMQtRWJrLiGh%3pv2tN1x+B^eZo>K}y0nEDrpoD?emVgZ@nZbWudE zYvxSq6_}@N^$}a*-_CSvC^1gg)os9-?m8t-Wpp-P?@gB{jk&OCN!|0HuUGMO#Wd=) zl)D^9+I=al!1!JFAFg@Nxi-CSy3Dt%|60DKs0NT~dp(XAGfDpl>Rd`UwL2JO;6ek1Hk z8z5p^z%4}yO9eh@`Q|>$I(7)71|GT1z$Z*9V9ZafIe!OboXlkzIu68JhzeoNp$ZpkFr%Yu6p~o!y?W@tWEoJ)NV}}3I5|Z@>`MmAiMpI(&N9t;iCTjCpd}v6? zfh>iyv@~05enLrjQRLhN^iccIvn=7`_)i|hKb@yXho=AG1|&<37%S<>Q&|>L&Eb_l z+?mzW1n0?}DqmTho)!A;KOH_r!knIa1kr9^j#Byjo+N*XRmtYJ$Q$<%^HUmyXrOw< zkQA$Euo2{X^;yrU(FQgY=jk-Cu*ZLs4wH;$c5~#w8GwJqSb5w{5LBe3q1zFa*1GIH zS5<71>Xz)DLjr7QF)@*Lb$l^z?#8PO^Z?=}j6zm^(*h>6WvsZ9*{(3$OHf)XX)2m7 zzblq_lNPo4ro zAK*s+Zm@0*f9tHYqKoM8;!3VldojDN^antT#svI6ELeFmq=xXh|K)MCb-+0UjUo(9 zsW>vC4`(%)A{MLpZR8)X8qt#*Bi4scv)rX@Kt;Lk=`~bhrW)82^%NG7eNn+LTKI92 zhk06#xJad7x!^MJ^8$?&N0g&vb1r1OD8POs`rrYbs1bAFiO$d_e&c2Q5VzZ49Q(jx zGc+nZh^w{&`Sk;p&u{_f1=J`Y`>wFLG-OImWL4ew+PB4*P0y#u(Oh9&dp=4XZd2(2foF(XxX3xqs9f@knQs&zKkj z1NK3MsofZXpeIT}(qOS$ARFGJ_quvIQ~i1Qw^z8Ac!rQy?}#dW`{ct}VCA~#OkMYz z22_11H}E=@-0@q|I(rh7WKx)D3;XdMlCl(!9tkq{7sYrq!yWDwG4nDCEfSKzm%bD4 z0pIjdE1&LO=iNq%mF6nxeq>HAF1!dbHP%%CONVU!A4z8!*W~-Z{cAyYBNC%Kr9l`7 zN|yqPASkGGm((^&LK>vMAR!$pO0yA4N|)qBx|Oc&zu$d7-;=#|y*@jy&w0Gx2hy|J zg+YnhtWm!|L28Cy>iFuw0sJ-4a9zrk5Ab=XEnQA<=-z|!-GN!Fy-(-7@CEV;8ysls zaHZ3=p%$WtK~AZOOLYQ2RfEbaBDSc;L42j*YUH#aQ@Se}J8_MFxSkjt*NZ2Ghdd3` zwL9gHq+%MCJ07Cg+w_Agw7$iG%uJR!2<)|ytV|Dgtc5p~b}h(FOlm*;i2 zfqJ*h|9)}obDBBfq1(!rERkQcjow?EK84c;uidMSbBQz9#GC& zGQg~exk#>+xygW9@MbZHU}HL0h=dZ}16gT#q_g7$Nw2NCtNWUg9ba3@y`uj?hs=YK z!-WSP4B*OeAkM9SQybZ93SdUaN% z%r1Ero1h0*CvyC`4-pO91I=YnvWb&}wRw;>pcHe@$0rP*0pff6O)^WM-+{UA^#=_p z%zCEHOm{X4Y^D6ahYp_zeTC2g3qg%WcZdk9VrERqpG)$BuVOuC*be;y5zy1h7O_8F zU*g3~?jy+!tFFbFc8HSY3An2FNqk*J@{XW6$eK^P(zz2+JQ}Ye(asAMReWy+jd?o- z9CL$IK2~+t`eH6A<$7c(4UBv83hU}t3dk!;++W#recUDDG0@SzU-H(?;W^nX1A_2pB!YyQfn5O0HXU?Ai-S>I_tU>p?!?axT7Q+1T2d8-B0>dk= zrRzID{`i504IOO}4J73(0#1v~`c}eSd(hjAKUH*m26GH~!*0(!X`ZxvcAY$Yw`~u1 zW;UGtw;}D_Q`7(a;!b-j9}(gPUQ=xUqbGLUl`A_ubJy|A6HfsT!Sh>b#(d;MbgcVF z0X5UbE)}QIAa&+kO@34!1aJ9REt+c^(XH>w40t>e{ zh3II+i&XwjWr(OB8LJ*(-x*%1pN2kY#iBS3%$Ef6tJ>Ua$l}NmTvCW6*)@T)#WyY z9828`APGn6=Nt!_rxYeHGgJvmcmLfNbLCS@-=kIWA4ZftMMIT03z#zH1CU&n6b)#U zQx1_+ej{6{Fz7OG{RpS)!?7&W#KJwPD*e41+;Q@v9^=)S-2&rhbtvfCZ`GS_=W1bWz2=s20_!`IyN|gPI4@;0-YBtX}hG0IBo*&o0U+geHE` z2gW!h-zwy|oq$|twGjqfy33>T%(zSmo1%IxJM_M#7i+$2<>oO<*($v9=lVGL`0~0y z?gvBEZj{q^R4AL%s3Wkq#RXrc2OTi7YT`?jfgqAez~Y@KtT6%1+nV&1LV{dFi)5iV z(HA(+YGzW~rs$;86r(o?3qV-!I)l`13xEw};YXpM!+?Rc+fKK*V>u&Z^tG5h849da zSxPhh>b8=fH0bM*TpqRj`ZZ(gy>B!F>y>{U^qr}9(!5~V#I{}k?+-k=<_%$iDAr_X0evi?6a-Jf zEnDJNGaR+}I4MpiupgSDnCwot>j`~o{vc9&lZ;Tj`-;OJYL`ppG+vlS#F9F)rXmLx zHN0N*IYrC5jS9ZNpp=OUB(SdqwRET^-HuA`(-c~z6zUTJiWd?N4pWjDqnT`$Ng#dDD|AmF<#-JJctQd&sn);}W&I zzv=r=oQuJuMp<$el_|AfYrD76RjLZye-iY3p_{OBU3?*sA-@8XN(ajPj^H?(Bf z|I#jrSMSg8H0xLMw_#C0*zd0ug^#KD{n05xV% zh4?^mHLUeF*5_(5VC}=#T^D5B$;aSy(#=VmIupOV7PFAvfiL?tlXW=ElDLz#eSb8O z*3$x9-m>~^36XLP{I|V+)8r)G_i|r3wZ?j86oZ$^QwlYKOkAsPiRCJHt)@?n#S0LOQGw5I* z@#7#WfF09efr*EKY+#c4g*LT_z3U|dw%VT_WA7=Dj+X7q5VO3bFJb*pm1O2C(PVgcmfPDdVWJjDV$yc3k9cQV2 zC*fuL3;*gH45`{~5W5f2e?RhW*DW{FMYuDL2=cVG5XgEZ57Ip9deIOVNSH2BJHqTC zY(J=X3)~M5c`^=QNe;7bCk?2O{jA6l{l#}W<%@8?twju`8}-`=5y>e2IO4?ICtSV( ze>Ugt=lJr;ao495Uhimg3=<9?p(tvrNfPsfF~zPL79XU1rMi>U&e-!w=D4%lFBk4O*i5^B50bTGh1s{jlGe#mJtloXQ9tzlh z9Oo&^DcKZ~2@%Ys$H;dghbimrHFD4lLNtbSkv=B0)ZQ&9_QMA$a5G^TnQvw(8x~Z? z^bnl<3za&&a3PpiXLzjpb?)|*1r63r^E8lJEdB>z#0%2h=yvEhDCgXCBvFk6HdqzG zQmcM8rhrP*hWPoJG{ry^cCT_t=$9OoL`WVn&Be~C)< zKz0Gf-Z2&SIyOpnD}P_vI6bC z{fT-Y$Y$joZ&-9|fqq!wkkYe4b&){& zOwn3TMAwkARyJY@tP85P9@mxuBJ8gcrH!F>F(d#b+4WbN8JcXq5(e30WG7XW?6xGf zAD9MtZh=0njvC3B=ijGP2CTOSlRQdekmsCPP$`E(VY+Io-xeB{{}!!)-z2(Ku;`UJlj%!rejaKBvVx;GH#b;=OR6iM$YK~#T>A0hS1&02vT zh`zg~10N#fid;RcO2rLDJ9!QFOn%LLiT~k!&!^;d5k&(tkKHa;bMYIRwEUM+N3&Nu1SGg|B zgAIY|b3!=UGm|iMt5zip0cSNRbLT=BH+j)q$c{|(jSnA|043k7=O%flY5s4HiMIWd z#OCDG*z=HV8x|xqUC@#|GTWS6T1Euy4W)e3^o@O+@cH;3?Qg5c6IYRx*Z~x6g4WEN zpXqhuGOzW(n;xmQ>HUT%A>l0Z^VcWNa46haz0xM-2CWt}Se-1RAP)J>zedVI&(rl2~k(yz(i$+`BGc8!yh>{)Y* z{@1H){16*Ih7S4Z)@UAtx^NX5(`oIEA8ZEejjS0w^JIW2#8&xFB|JSFANJDNv+c=W z$2c?l0<>QBSI^avwM%=U7Pw<2%JsYhb>d5QjY0=*uq0i(=(i8FF;`v7L)Xj|rRBDJ z2hEK+A-!ipN1}C)T-5O|EbGvlri;fOwJgBh*IftuPxD^T_|oFFdyv5%wUNnA#OWac z+tlUbv21m?krvClMEIH!l@Xb0sYC8E-nU$nuoxb1ln7@WElW8s2Yk#&e$@<`eyE?& zTv(CJCve@9Ib_B@?=v!&Ey??FBdg-VN4ia(|Ff%tPJsaC07NI%f~YO#S5RLW(U<_s ziogpz*0;h8QBoEOd&muTPoTMtybNQ_NLD!De#y?X8`S~)Hx+$d7d!aGQyG*-8c35z zj1fg-DIWG43;w6})8GY|>Ft3JH8POjxE~0UU}4f(ZqudXV=(NSdH;MWnQEqJxeJUA z`}bvXj<6aQDZu^FThlvVzeUixrQ@|Xhy`T7K}Xf@(}9DZ%_2_2(swNVR+y3(4n7m@ zPv|3Ezxd(4O}d-+9^90rnPFa6LL6Ix5H)_os6PK8@e=MQWcpXS*pnqhzSwuKuT=Rw zg#r~nUHOr|wd2H=IiQf#E}tN(We990h;1Zo>)YeCk!3BofXbl?UTW#DZ)zv;dg-X^d znFMq4OLmsr{u}!O^E}Qf#L`{&>;>pk5 z?%P|+Fmc|_zr6A30eSQ$6>sdGtW4qTe#O16ZK(_n;H_RflYcV$dmKo;UpV+)L5sen zrS?NC@l#@j_JjE{w?xF=+XD2Ps?b;I1^BFjV*|6=p2dKYks4gCy?DiyQ+8oFSzm%g zJLdSy<4iQcC3^NPtH%`)jt&{o;!xH@X8c_;&J()jfjpl}7LTm(fw^csWE2}q-~kne zpUtZW`?Rl_X5TShds^^1_nlXfI>JF3%cA|D0dT75N;eR%&2Hw+CJCl?CT`$BJ-gl? zy#DQZ?vPT-q|^=&tw_D*fv@iddsV;|*1J%T9w0k8(!!Ieg-C_V9}XHs&R$TUs&XwV zVyUaQeXs?PvLK{sBP39U>}~(tWQr%Pz+wNdjf%?+#Nyg{lHj?@xYtBxAI(5^Ov#2Z z5KuslVFQt$9(&0vBkz^P8RYna^TXbk*|gY~-opnz9?Nliqy>tNuijJeuf#@D z#P(Zi{-j5Je8`o)zFBSKS+Xw}iJ}kBdt=h-b1S1Psvl%L-Vtx}b;H42{YKFIfT1X9V7uF0cz)bX_u(6k7o+LgZ+JyfPv-)qVq?G+(@Gqe$fRj-$Isgdt0($ki* z#+(AnR?>E*anFjf9BzB_7L$#B3|l_$H{HLGjJguu^r3_9=m-t}WW0R)yhSWJ^Y&B0A1UNNA9%^x;`zrNcNtP}`okeYvDTe%AtN9iM8!oFgN1 zOk=^FIUDo~J_{i{Ze<&nuW@^`X6z#mjh->6w+boVComV#56&3j%cv!$g$ox4Ua88^ z?Mh^-YuJ|0B%fnz8Th>#Sc)%1W~>{Xs0EgS>o=x2(!>&LPf7`K6Pw=kWqLr_AVyie z?}I1}!_7RpNRwRfMcHoDgW-7_XUN3)972O3U!nO)nv8}fo0u>Xao8lZZku9_>zfk0 z+F_F?A64NSs<@1kU6zz1E*h!HP^F6*-e`HX!MeTYb!0O*3jjvVo=swD0~=U!UQn9FT+wco`(e*rUU_=XL1wgBz;jX z!cULPArfE{<`fc8`*{)Ca^~8;Hq0vTj-TMD4@UAETXYU$eI=m}^K$vm&g`PmO&RePNoZSytkDB=$G$q|qG^`lKX z_<}Hh8muWqQ4qryXWnP3(zcvZZ1@^e!%3rT<8D0}vTU`l6^CNW)U1+kEXX3e*xR-5 zoPWVXD?x_+EzN=}C|f(w0py<#ITsW1HJ9ahX;MK3CEm%1t3W?4&MOg6&b@9mkdj$S z6)DC}bApV~A z1kFNC3fYsXr)TQBAvzO~O|J^)|AeGQs9uZz+>s33JRP{1_`7-Z%K9$LCsrvz>U4?Q z+fc;{Gf!ij*l=ku{A*(X*RLR0%UOrqX$xgevF5%wYJ=0A6zP*yWZaX-R8n@SX_M2v|}J-z9jtC4i^5b_)NcnZEhXu zqqr34ig21yMuy?u8nPAfc4jh)?d@BqHR|tGX5Kx%6nv8uQ?zP;KyJQiqA`W+3Y(;v z!L7-n8VrSRVQp}V8ZcUDtk6)L?V$4eF!@bq(n)Rbw2n^2Aif|K5F_p44kMpC|1>|+ zL)m=%b!P=<(2K4-olpJ&yUdm7l3JvB7xD2b^CjKJ#Z8Z;o`A5F%h;Ns4ew#CHnuDr zE-XG8@Hh%_vHH5)J6=2N*C+h+t0~)DUvI59_!wH?@DE56zIeJ_R)vdZoa|%(f`}60NB3&}%)o;%NSy36ife_#X3$idmPEtKOX9i;E$e$^#@5BI%IaSguZNe8$l zmNd-D(UuW4B_j%OfW>CxsgLB6cNAjdjn}zJI+*l6JWflw>Arc(pM@_sU{5Vz3xt&x zAZrMMu{bHcu}l+O-v2X{CfY1!;Jj0_;tp?Oq}_pFb+>tRB&7*iLMN0nCv7~z-@e;y z_9vZZqQdy{+D)sP8KkOq;Ie)`xhI0I)h_&pYVwV6aK@5 zw@@z4mY)!sx0;a5Z+p~!z;=F)P&_v7M;#FfnQ;KSy`{{LAv{GCo>)MXwI*<)AkWSD zhjF{f;%UeDw>-J}`Tcu1=l^imy-u6mXMrj&@+VJv!?tRu0fxvX*SK@=rlJ*XDcEEH z{*SniuJ`Q{;wl2oK@*Hk)Jpj;Z)4Z>aZe=Reiz#+q`{%UoVxVhg|&x{h%!gRK=CGE zf<6$0A)zjGHdDcR+6GZS&7KHRKUM0i!GzKvi-a^8;`#ArAE6}PGX9r}Sp3cgl})pw7uuJ}N; z(S1W7pFA+_DwG`Gl5Jxx(L78Lv=|0iGr9$$kz}Uv+z85l-}cc}O34%#lK0-&jy&fD zqF!}f2Ko_D+!&ZvZ}?v#Qf%#Z{Yvj8Kz-i*X(&>N%X9AZ5q`pJU04}B-E1-Gx5EH9 zAi;{_CBH3BtEEjA)p|=A-V^ir&aFw^3X>=irv9W>P?1a?`7=U2kux$b0&Fh8sLkU$ zY{gX7z$8T+woTu+S8xt>kSdoR<1> z=w_>UDxiI(z^;!8;qx{t1*_E$eJO|T$Nub9EP`MX3gUZ`^mK$r%RxLWjZ#5$_Ynmh= z>SFIIoe1A7))(Xq9QZq91IiU`y6G}3ZxicnE<5E(*n>&JI; zL-3_Zwo1rfZ>|i>?`0<%BBeA)8M2HLA{fz#7i>K-BN(nit9;5OFAl+jb*8hu$fbi& zu>X|bU~sG?T#Ga&-&5w7v$xYrEuTR<60tD4-;X~pM-4UCca_bjF8AHeA9H@^X#3$0 z>`bXaS`4X=p~gu1(Yw+Ze>$nT-6#se*x%s=R`SG}0PicOg7_|B(9oj~&$!Ac*keRH zeoCpObUSzGoP8;zj@AfVrWKKxqxjWcn`9--%Sb62YMe#Rw?{QE!ymqX^z^WiD#QY| zJVH$+9+xokGN%d0RkL5L2Z%8CtRb~10PKhpAf)8U=kcQ)A>Zd1i#}^-}Ia1ejZWCbn5)a6gk}q8b0{j0Adjsox zyD+1wG2FKbL5^}ve)viV^jxV7KFk&nv0>G*Bm#%1c{gj! z-U3fa4zGqia-kU7f*e*Z`=(QZx#6X#-)FLJY=y?kg{mkqqXXsY&k3JDW0Jj2D*pOC zYIxrnxF-1?zs5!;&3*WC(xqu6#wuZAQ_m=bTikwo(uP*NdhS^N=STXI(}6Aa z+~`XuM%WBP;UI-wO3jY3BN*8Vl6ZmH=EDE^kstKnOe-bZ!0x4lp>nk)f<^|Y3KpSU zRVJDb6_!R4>MfadG;`$+IFKNYw>KJ;S^88>BS%?+)#>Bt5#W%70}i-q8>A!~BT4@m zkOS%k)mXm;KGFbY*Rc0Z-|IQ_(=3-(pS$_;OBEGi_z=~xY63Z8_TDDFj4(qwhh2qK zv3Yu&thF!?@ssOpL9KUrS88ofxmvV2pcGL-#I#ROVsw%(m`9ptNlBMIaL-yU%T_Q8 ze`=*IKts~e{*Ya^g#mRz%3UAR7t&lCQzQ9UnS$AOHc(17;ue0LX%A(J{7< zwTz%z(!+TkjY7Sj5tGFQo0GWtm#({NzwqwS=Jb$c!F^Jx-zddu`oq~Pj)0elnM$Ni!;$*ilgiz&K?;5gF+|^$WPwqz^a?Fq( zb~@rF8TrYSGI~`>6PXZJe_22dC6XC^tbXJcDeOc_2TTQNta{%xE z<2SXs^OM`|WuV2U=?{n3{FRcB&_kvz&X`Emv0!~80i_Jz&B9kju`~wZy90=Ml)3_4 zlTYCu743;e?+V=hMGEXorE$>%0bY^gA~>Og(ek=h2Dtg5u=qqwJNMU5&H}XggBiC> z<$Rl|(XaGxC%2n;VCi4{Y>nLW8iIGqUIo`qnvax6?>8p!+p}IfIdM(!k(xmo zTwnr_!&!ORfg0SF+)qF7stCl}{v9A@XR_YV7eRi35F_3FM;6nwD7Q^z!bm5KNu%00 zp1InGigK+BJ~w%~jJE0I5@GEc zKvq8scdK@?yh)_>3IhSVgv@=bBsU~QgVtSO)lw$I>4enM7TsP9SlY7O9vRJ(B{|>q z;7L#OI|bjL=Sy(2E)6Tj1G4>XtTs=}#p@k- zA|Dccm?d7r|HVXN92d7}kXJ;m1VYCg$d#6&!^}rh=FIn|C6;WG4BB0D`c6Gd*M1*) zd<*!O%vP8J&MKu(9nl6H|6_ zC?*}pf0ept-7lCZ`$3;2=(dne)=}10-RA10ozh%i!WK-XKkS<0Aa$V1rj9hSGcO-B(aSdo;KV|MT zl-z|^Y1n*VdTT%<1FaPYMr(!@dTSi3Rpy7c{;vQM+LE76XA$Fzv8OmU%|LQ_v;_q} z0G9rKD$d7tEoMd{^E2S9Eu@)r5!ZyvYVyzG@x+BczO|jIIcpCqi3{|8anHY2{OhAN zZNL!^GB;qws_iip21(3`_5DFyw@Ju~+UF3Ra1_&xf`7c4wCLLAS~l|Kte0->`4Faz zA{0qf=6-*r(afz)?fnt~%8OGRqG@~~3-?rthreY2clm2E4~6c}C|-JN|jMknCo=7QW7@4{p*|roO!ULXk;>XxLSdqH$XH(!R zpJH*J5X+h{=avvG4&snDGby&dvsbBGY$rEx!QwUBvVX`h_a)d(cusyf@afLbM$v8g zGxuZ~%_lKO_O-i8#1>3%prgK4TEw0t8agCd%G?l}6TFfo#u|Zq(v2S!gIYgbqgaxE zF&gxZA_}awFt_(0Lk~GuI}X}xPPDWE!woeZYc4+(jt$Iqb&6Tiu`^i`54L`1jr7JFPi~HF(6e&`l`p)0FvfU3$ z`mm#yU346d5hfe`8jKL({GI_uTqkyKr}{K<=>`+R5s#(He&cIj$EngWs@sEjjkX~2L(zWWozIC z5oZp405Rh6NkA-UetD74AERquC`_D@eJJAYs6dZILEaiM*Hrf)X_B1Ix!~yR2^arV zY>Ng1x{P|lUdM{eiUHabo z(N3|4S4rL1kN6a&TB5!Ja45l9m`fZ;0216p4-pe`y_4brA0-er{7CkCePohtuQpXG z`j0NK&%^pHA`P}R?Z%~keq5ve9~K;Qgb!S++YB$SO{lm4y(RAxkCL~zz;6@r}NL-h=zrP4$q|v zwk18!lf9JyG|*C~fVeo3`rFrc2F2As25_CeM6_Hy`zi>UO>C@yI_n>lyh)re^b*cF z{l3Ayc)8phFpW;44^nX6Q{+3!o>-G1&LPmWx1^MUX*;wz%I}^dG}o$ z&^&cd_S0sfFX#d3p-+?SXc-HkiuO$s;(F6zO%%Mljjvm3<*t=z?YeBH_Ri~gn{ckd zm;B^L<*>vnEKp*KywXNx<~@&yeUghJ^~b~koTs@~(Wi1VUd~GuY;!6blwTgrdQLa` zU_SU8@Z&=m8xbZ2U}M_+vZC-K=6UWXj>C8MbnSphTEIEP8-qeKYk6Ax!YrTez6*<+ zUgnBWckLe0kOYL8U`l{@Br-U0KVlH9Ee?`p0FNy{{I9vC2tDs%p0*sCBJ%8VdFpbn zu>?+=5$>ObR5UeX`{&VvY-`QhVX>Q0))9n(RY^|&4l$@dAc~rlc--rb`d=;em;+j` zn|$iOqbrgxSI7LI!zTTooHq2DuT|e|Hn}F=P?E=zmbI$w?_~0dUPV2vbZzyt=FDOr z`7BIVVhY64M!Ho_0d{7z*`&JhO7|&7iLOJV$25HZSc5dG=yOkwwDsD=4ls z2m#|B-QhuGdES+tCdD2WLr!ySPaZVB%ua?bc+oOI^q{*gtw{DdoYNidAY1l{HuTp^ zoA1wSLmqzFMxXxKJ?KMyy>86~{w-{yx2WujXnEQ`y7|pLhYUT&#{~hMLVY*W|3RCU zXQQ6vZgd1bsCah1U260&?hio%=+}j=bxDKd=RIX73K7;r`urZdV$#%qUb`bO_e#O$ z*l*A@`?;w0;l>|~+P{048DpCVDS**o-o)$C&u9ySsv=Si=sCNz-MX(Mc_f*}Fbh1l zNgcBZ4P<{yg#YPG67r~~BHuYxbtXfi&<20_y)XsQ^wCh9&`eDS{Mp&zCZ|2QEi}04 zF^)FP5&?UW&6d`pj+^UgcqBw~&(5mCPA)AkRnb(I-%8qREBE_jz-?G+X3T$&NTB+5 zQ!S9``x}dZ4--hK7oOiCnMI_HzB=}K<`ZE`i1bYHfS9k{HqkWaJ~w}yqTrT)*i8F} zwScbBxi<_E>h$BxLZAI{*@LFwz|~E@5E2En6KYb3=@-$T&`s$w3VtU$Dh-N9eobrt zy{?-dvX+n|?Xu{cly4FxhdrOw0ba4QUbFm$##mkux;ttvTV(-%CJ+3W06d)!+aE51 zYwZIbK}WCZ*@(=5LMj$kBKMZAMksjZhQM10fay>$BP2m%r(oG0Z*#&DWAgjTm&dp} z!>do78#Kz1yt`3EB;p^{tyT2KZKR*Sk&8tRpqIL7h0*s^Ak{|Y=2H4QC+!nbO*dEEU7MHW{ao^S*R)5Gol6aXEaV}4X3*iT4%i)(-V zS$Y67><0tN@^*T9(j@Tg^rPMq_-CsBzEgQJf`%1aWP#}@r_JEGdiBPEku`kt=-p&O zUA-K|iUpBw)lv&l&;tqI*0}(zdV6UPuw?(@GV}%}l2_~fJp}!es@rF>h}r+m08O>U z68=!byd7tpep$6lR)wp*FQo*JDfnY~v*)mO4{unvIV!<=MiVm*77|mxgDqZ`Ss?fC z(%{>Cn?TvNyO&lf2ny{)k9cH3__x^m*(juE5dTySA%(qzsrX(dp!r*$qKHYBmBAOR zBXBmalhhm+ALA=s8?Gb{oPaS^!8#Q1IHWq)u_IB4>H`*^&-dX!C`EsIiXu>Fz66H^ z=3tyCGPI4ikh{IM^Y|?rMU*O{31^UcHG}Ocn~Mw2b4;!RBd-{>7UYNJ2BUG76-x-V ze|5M`MAgdROqBhwp_Gyx;rzCKZU5onbx3ed7VW>J$S6Nofgbue_QNwbDZaMhUnIe( z!uFfR#`&~APgBSJ*2Xe|YyYsH1y3BqheZJbgk|td2T3fqXZ6bqugEEQE4;pW?!w6cLB_H*X(9bp9gZpRbKRBWnwxD*75uS z@aF#tk!DPdLXp>qRStK0PZC3T zI(gqYvF8m)kq1K$4qC7fIzAY<`gno+np>-%_@6TBK|Ix8eF(Ny-?(^@{=-o!bfx zA5+iwn9r|@Ewe#Ms0AoZ+ZS9k+W+lB8!h5z_dlFpik#=6C!M5s%g9f2O3@=FaVnJZ z;d7^I9i>$vgnh!@5hrN07U;epM(M{Zc2$ahFOzhkb;n*!To$MXw_su1k(oJDu6Y%vUg&x6zL#=%xy!rh{ZffstJF$4=-^o7_ zt}l&yyhmu0wAsqDUQ(J75_&+{%;Z#?LOTr_)j=(WZM_*Z#e4KmpEPDqmvN0+KfVxj zDBSRRos=Z?+PgQf2Gb72oqkzgmu3VNW&k#&C`D~4hj%=L?j-#ioVH=2(;8jX@7WRV(G;K~803`U!5VI!CDpnl(; zQNDbVfi7A4n5JL5_(c}guWmF}_c{<3CQwPPBdC{eyO)}nm`?}RCBYVShr^o?6Zuh> zTy=L>ES7s!*z8b!76R9^TN_EFUs@dH$T@`u1 zQfJh%yvXNv@_prT3@tIfJV=wN-3-i#O;ZkQNczg~V`vZ?poOVyT z@B|$I9YlFtv}tSbE@K3>wt7qZbFI9hD_r0V)9nAEBFJHhaiDR&C^+ z#1Co!VZha`dGN02i-NuRk)U_k|A8M-vI>xP&I&5`-(IuRGO?Bn%)ierR8EqLojdzh z*XV$uE6X{f6ym&z%#ga4t_!LVsSA4Bt*`n-KU%_!)0-~g`P|vKtNLG7thBI{YYq|| zFfNgi1Ky$@$M|x(vV-Ssyht?kpt#fS2a{*&l_r_$-o2Xo)2`+C0b{O*9(lNg)*z$I z(9Qw~V@_`La#&4YfuzkAi93Q0quTUL`EKIic={Hhog;9jtHr7N_GGBt%QlO{cAD)R z!SO@R)i)Kf4~sI>dBmaDJ{u&&-fVLlL0}UzWTRve@1712DGj}TTa6>cL4R>s;HP{= zN`9JeI&(e%moTZz-+*{f6Hu!%CEPi*x;UfbMIIpDr*I{E)#3|^BgUq}&HFwe^ufpE z1hL|I6-_&D%j9jQ&!#S=%-t=4GPlSt&BUeLI5j&9z-^Pf$Y3g@oG-%=wXl}1F0coS z5ir#iw6BB2kmmW-IqhG5*xCL}F=GwM<%YeoytK5ntsv}b8VW};{JiETcdZhnNG2Cg zaLs2UYmHaul-M6igY>vYbietG(cHDVj8L3Ax3)?7}s2<8efC(}XKwA+YY zY5yrwKbRM*WAcL@U+3jm5L14oAlT#u61eG*A3oq~Z^RE(OcX>)fL;3si^*9xrLjIe$ne%Qt@F^FAe=lCu!_9PY#mWJC}A7)n+vHP{326XQ1HY~6&m`avZEj5ToawpCN&jh5VXTq8g3HVRJ~b4CTZSyg*%NArf;@Q3FW zwd)h~%(vfNE$dedN-lk3oOvh(h$I&#f>oIy^pcQweR-f4%xz=AgrO5G^hRQIncxJq<+9iGV#xvw|!;mSdXq1Ngs-g4MxY;)jlxu6i`3jzb~%Ux_~3U zFPfY?6r3-ZlSFCYoFEXE_L#)yg~qT@3@U~Ac!qkd=%q7I?Im$!A|p`9@(Q+v7a2^#YJ9>(|5L4)y3 zsK?k1vaOq+8h-wA_p}4M{95Nt=%saS1lC`K$U6HOpt||>CGyLAyx+(J?WbfI)l5L; zD9M5v(_!`m7JzP+DlxIRW+RiWw?t0JPg3b(!Zn_rmbslHVmp_wCtQkjzkV|XRx5?p zynJ}j)>LN(1$VT-IemaDg(*szdM7>uQtk|(13uU7k3EVpvcAK+h4j|V8})2v zVWFcHY^R0@=_XH~uwB-{IPSV|*dAo6J8z7~;9avfSUQ|}q<)AVK`Z_`Kbvxe!P=G- zRJS233u-PeFE{v&i?r#%?&_D=eF87kGB@u>P$%?V^z-ZdQ@B zjHF4XYnUu4J61|~wB$oV=q?YWqW~Zni>}}~#gF$ts~^QyrN7y!%C$%3ge%6|*whcZ zx-NTltAPFeS#xtKVWX1g)b^)man+G`=)$q|<&V?@K3m^-*X|UmFLMaP5oK1B$IsW3 z7JmQtH}x`CAAbz;H(+Z~9@8EJ+r$V9wEna(6B`ViDH9k9`Qs64v{I$8u76u1O$bfmaAc5@HRNM02*m3qK+Z#!jUj-+ph^d3946*9#npeMS zaGiE#Bw0EP-kEo$9tcI#gPe)-00n2h9#q(8!$B=>tKTE#&eXy{?&&|L|J{`JM0_bB zIli8t-D4QhhPJ#zc=LgF^jdPJJsXej%#Nd9ZeEl8xm)l{Cpm3>gL{p>Co_iDB*PZm zLE3D}Z+97Rc|Gl?fSEWe0gUe98%`wUNmg=52@7QgEIZ^3jLieKl4XG-N62pED-8yV z{?lo9pS{4F5`D|-@yY^qQ$Of{CjcW)ptm5 z2h=ll&P~vQmle{26nl(}XUkf1^z6R**gh}_O~srrW6t;`fhIh`Y}YQ^`#l=(cELro zQ~rj#E+%K;Y<8A0c_Ynh^T(WD#9iwi>-DV;92EQgem*PfW^yZB|xYr-!!>*_p zXbpvBBAz%XBiHfVa&TS%Snv-Py08x-#kwVEqM0C{-BIBZ00TINUQ4jHkt+K6JPAqX zZ^rXIpJcr4`V{)jO@UB5UQ}a~SP9XTghJocwtOKHW^zA?1%`-KSwmd>*Cgq{(ZjOiJCSO8UISl?a(#~eG$wd#$0}@eKfA1-eg@l zg+6(aC7Mz@$D|-Yey&@~S5JX)N=Hg_IDC)Rqrxi_gj^|6PgKG8>9FsLt61O?_|HOy zNFsbP?->JI2{Bg9{Axls>4*#yS*Rt#BCidfyxBXO;o(N6BSpEjs;=b>t0O{XF~ayv zy6d`-v`V*Tu9$^uG;pp)4x}KH!J{pAEcHb}pY!L}d4Rtj(`4r&!$%}jt@{L-zAsOx z6=dQcyoDnLNPHYQfczt!aV$p`?u+D3^i&gEZrm>3x$e{gn_)wTbMZHj!LP88!3Xj$ z7`WoPR=qy!el-Vk8=4Fj4ln94MG^H&H4y@UTM=qwAghfek5)FEt3pJfTQLY@M{~wv z%DgG&qx(3`hbS^bg_(q!?rdx57KIxUq$<|8Ap$=1IkXDo@W1-9N=zCa)>E8$0L@yz zad~<$0?-f(3j)WcD67AFL0f#1O6aladUh#F(Dm^_nHxgsHHLjOehgy2a-<0kh$W?5 z0FtHV7+L`m{}ag*BFx#|-r2Ly9kK%m73=fmO#G+5 zCnX=kT7II!G>(~xjCtT#kaBNYWadIAo2No0@4-OnyhSij z>sBC_06#1n+UyeH#0MSuNwgYD7NJiuC2aR$zQZlDR4?U8D{@z#QS13hENCzd#SCJeiMIk8>JeK_rD zSsH5$xOqV!3kvGf9}8#Sw1)-gAqFtF>|w)Fqz5h*QIQ!tBVoO?WwD{YqzIqUU&t1X;&=2art+rx)&vCE2=JJ!zmpYJKF>L>Y#U z1_Ri8egG40%mt~YFo7kFNTyCE1rfczd@Mq<_Xph9UdN$+l&|vM`NX4FMQ!X$Q{0!$ zqj{w?m{lB^5mNWk&P=dSqGm;j1H~wfRokZ3#F!Hg$@~yOD*Z5_0&MpFIAUJ05_zTF zN}$HbCyLb{C{^$PG;0Vy4mzkcbDtbd5giCd@mK-7gujk|??I?wxl#GTmG-xN136HO zyL))A6p)}>1u32cjrjTG#!s?xHh^Z8=IyAl6W==bLZuT%O*hob9ZX2^_pz_tjWXX#qw`a2m>f zsCu3(K`x(1qp8t0-g}DHPP!G#M${~Vd|>;{7u`y6^AOWn6=pzMC<6@OKVr}y=f>ed zxx66Xe+T4rG##^_OJk+W6_~r6&_IZ&IZ@MIGmVfrF@cr;KaS4B5z7C8=X&Yk;w-sAQD zddF8#Ac9svaRQyO93g^qe=y?kYTvn*7~b_StmWKt>1OzC!l}n;T&H>X^V1D`eiizV z>I*biIQTK~V@~JLI+QkD1GiD6PnoqCJgtFYAdXb~8~2Ja@MByDxc?W#i(?9Zp>4M2 zS0Wnd%YCuhM;Cv`yV3TXQQIrVS+*F!(7|-eqTs^0g2>~MT=J8ex$%4CHunR-fwy(Y zONsVAw&qTg<2fdmn}tQcux+U^uk0Z+{avTuO6_&5=!lJa#Y+yulgdh(vAkn{|Beej zgxzDstYg;Bn5Mpa*MqW4;vBxSdIpinVTto~pXTCPB{Lm`KohZF?DoBrxhSXqx|N21 z7ied4!fk>hfs&90_G+(;o|l_c8R_g>MLNie1oV*={`A(Y1Hp@rnC^uLi67TNfXaON z6*749(&TSA;E(4|RJ2gqDMT8xq<|ZtXX$_h8$wnnU;Zh$)d|nEpHgkh)Jkh6x;ABq zx+!R(wbOlfWI!$YM`PMUA8yzH?gcFnDSwCOS`<7~@Qu5a4<(pNOqaFq)TGV8>CSDU z1;csYlTWH&Wq!0wx>q24c+?axm1en$ZA--7dAoSu>qtym)M6OP1_ z1@8Gim}lV_aAn+3R^ZdHOMQ&}y_K^2ppKaRhc3!)^B`=knxT9F8@8X2x6;?FMj744 z!erc9pOnLu0A-?TRk~5>jo^=EZiTQR?w6{&nHSM@uv>FIWuV3@;Y}glxUP#Nh-%AY zm{MQ11AI4?l{hh^$~a-AVfG{ci5QTvY$ihycnBr-$={1ZEW7g*9y|nRhahL*{i*Pc z5Qn|)Tg6!IxzKOQ)b6=2-((2F!f$iii(zvnq#%-IkN=Z1<(EEb#7|S`+fF(s_7hyG#DFNNi75i8b~TXJK=Gk7oTGQJ6|#`01-^TQ|1SJdu~_}yI4jePm# z2wHsqttIC)vXUh$Tn*~7n-4!R5yolK)Io^YYi*3Ievn_s!?Xn#TWOve(;Ztx&iEFd z<5dZJjyRFtUNMZbI>io`JYGp|uEF{p$b!s!5d2m2MY&JU&&{dux-mB&0^zSh1i>=xoc-syAu@(>n0=F-s!ug3u%8$`ws&4~ZJkVgM|sH!{x9E~uh| zt=PJ$z)eagC3M7gpz6<>hradaBAyb(R9-tS<>UHkEvy`nnAb{@rZRYmbv$zCopTfk zRKo%Z?l;$SDZ!%!xQGb-gA0R@nH(7Bg3`GrSAapXn#RtlI*08MxN3TN;jm~qt*hnaQigf{pDoQZ=(($%)p&jzf zNE$Y_eQIWMO6h3bpq<7L$1_N$hcxwAp+fyQdHJBq)2;s&%23S(5m@cjweHIdy&@`1 z8zm7na#a!7r!E*lh&E2!gz>(m)>wgbp!QD+6*2fVWV=C43DC_uvl=Ff@OHYr^Flu1 ztTSGaCIoBp6cHjTwkDnOGH$%2sNn)i#r^ca^ScgOm*k#qAGjeEi-d1$%sg#8f1zvk ztKLQ6J3tHtTKZQC^Ip*UkLz{+LOXj&E=~|~q46Qap>-LC?JLW`))ya$g&X^%_lHdL ziyL+=mo6XHT6{R0w`3vs6HsaraGs_+P7 z^Fa&DK%I0ecRZI zMNS5ew1?P;W-%PBi~t4oxKe%y~e33da&Qq9wcu z5ytax$wLFUD_YGDfosMSaV3A!82&BE0CkQ)xNt(0(huDOXUW%xth_Rj4ZwfbW`_YA{B^_&{eq& zWA;ks$kJ+t)SE#*K>0(P4xNk)f3r8pM_bl}`EBO#0$?bEVbgCct+4s6Csx}%=)-cSe)BXAH(Tg%G$14aH24p7wb|>roZIj?sI{Q_l@nm!`2)>`0ZONBx=~>g87+-IsTS+RnXV zwxWA*gG6Ih`+Ecp#-tZVj*EB6f@%KY7NW!T~?rNKDOi)lnoy$po78TN#~ve1}vSNmXw{eklr z3f1!Bqs;&&RR~t>IES=G4kYakbyht=10MC1ojRc>z=n%ap7gqkYcb%&&6xp%FZbKF zZypVuJ=}87sJo_cvW1KP3jdVRgt55(f~#!VY$7Z}oJUWPTZ#AZRTMtvZTY&5KCCZk3j>O6HrfQ6$%T$lXR0lLGLNPxIf zl@!P`8Eyn3-?9+5BxQwlD%YI06G35Dx@mtvqZ7zQ0KeDfW9r@rHwvKssOG%Xjj(q* zrEOrLKeeUVC}7%1XNx5(}A8VZXb6OwtDVd-n+)4omHbJ2%Ik05WK zvgljoo}p+EOh_X+Jq~f$e-SIRlnrsnj6)}&5ttbpJtBpRa)*Q}%qtcmul@9ZTJ^wt zYWK5Kryc>LbF>&amEQpUNocT}>*MWiCQq>!9J(b^uuW~Va@3pJV~HJHW@eE<(B%9k z!`ZkS^fl9F;7idf01hevsMmW?!*+culdd5Z!sNl~;{()Wj-&ft#$0g>51;hm2Ae0o z&*RgURNwQc!ciaAOPG#+>k^|8wIMpHAkVq`yDQx}3r^udd9}f@O8@0#IEdkdI@{T_ zLfuP8D?xQd5@5BZxxGU&6A89$O=qykf+ivGr&mbKFW+svO{hCwNrf=Jgit-O5XM?C zKM7_^oTohmcRO+@0-E?~3p?`F7oRPQ?Zq9rQ+gg+-6=3ZUp+3F${l{aOsQeH^1CZ| z=Q+DPdR+c68*ulH?cK<9KPSTB^)ir8i1oFWD(9jSZScomXHk{k3wLUlu(%3CG>Wuh zr*qnQe(u<%=^x>n%IfHTuRw!3XY*{mERz`c)({adjHYgv0!U9}HuKH;1LhdC)nT8% zSSi8X0CjLh`*HgiOQvII%UMzgax<>e7#YwlOA{VtwNwVrBhlL8gqQpkPU;gw^`nqS zu7-$y%M1i?$N~=uzyFo>y1;*KpAnz54Q?d`$4SoX2jT>XuBog*WycQc5j`MEbc5P+ z#pz^F=f<$N%Q8RfZ8J3NcYn#EprVK9Cern5eE)Q2T!yqohwvzWq66FfpB$84MI)g- zaOR(OR|>K1YaXOjkHB|bF9p=qFk&nwl(mDgfpy)-01A$+Tfsp;h^q6OJ!J^9hnu=U z8m%h}MYjA}Izj;mmU@1ut6;7Od` zk8T?5sTM{T)E)ZB0A}#Em|@s*Pgja*T#Nu4Say|I@eopx7vB~^PNC}HDEC5g2@63| zuvJ&VqJTGRAD-1*7Glx@u$nM!%hztc;?3IRaRVwaEKh-{*!*=7f-`I>2iMUpK1Xpl zWtkt2(Usf3T)CyyeD%ZLsb>9g+mLM`W4t6rE68dn0G!rCteVjbYB|0;e!v)fLPLVHN8K`rYSCJ)$Bi^wZnLTPMQn1=}&)OEsy}Lmb zs@^c0L#j0=-oD8J6#lin-em*iU>0%K`(PIOiWw9W&pOCtKtLHW2e4dWha!t8EJY7jf%h^%Rb3I?5)1rEfxo;7r!VDv z;2t%$N5v-OT2ua(RW+szJj7D|{0?%zydFSWN1UA9Ho;d~Bp2Z}Zwuv+bb=)cFubJ< zFrl~4Zmg_z2grK9p8vq|eeF8sZ)q71X@R<(iN)?21A!eQ$>XsaV~iT-pW>Qb2%8W# z*Z^bYwdV7g&$zHvT+fyiPv>DT(Mh{dIyyx6D|%h%vtl}4m3ziaA8(*T7#Yb|W`Q5V zXI`F^Da1WTwE|=}U%V_6>%hiY;w68undu$^T`Ad+-IR&IWg}xyKy(JL#`Obd7MJ_; zjqUrR!`{qAf*`h%#wOjB7tVY;OjEVd#PF7%4E8q88YjyY+V=PNM-$ZW&snO>+xvl> z<6ZS&>$rHJ07ZK1>4pfo9)HMfLQ`q~hLaCj$_(x7aQHO#Q;TV&+`z4>WI4uK0Q9(f z)P9^+^y7^!Q8o!z@4q* zwDG>At^n9T&{Z}XK@mE;>O@5w#*c2Er@}2%TIRpExmMo6^nZ&FvJu`pO81KIDU+4K zh(WxcmzXh-WtHUU8oZ6Es`IK>f#^+970G?tPoZwtTEcP}==-!LT(omw)niHL49Ag7 z#zwK}Q)g&7YZ}!0lgRN3qp#{6WVH$j9D-x%gv>GNb_y)i8(Q9^oQzMUe9}{?w?= zL+I}&?rn?JA$tifgz6Y|#I-5a3|1n{Z3OM_jLN%u-M8+vlsXR%<4q!m$QtfvB5JIXY*eo`izE!c^ z-oX`zKfsWtGKS|Np}whxXPXgE4CoOI1%Sg=8N$!w;m@0liGf@M=Px3rH8F=pzfLtp zaXcYt`WYF{0=71#(^@jnc7WdM-D3=l@0MV5V&*&kjjGGA!m_xEe)0kDs^Al}19snj zUk(!_WTxhJs~P=Z1?MR^KarVxN1Z`gK7a0A(RDu01_(&3y7C3~@Z}ySZE0V;61?eq z$At3dTT|o@lrRIPTBji-0!x3g-ReN(7i-dnppk40rW(Qtt+1U?ZFr2C08!UO=}&jTk#&>+ zbvA5`r9qAv_p6+r|I&*>gG>J3B93w0wnz3if1Um~zzD5Nq5LFz<{$VNemcVm-t+=8 z2jr<0&JVatzPOtZc3WgqI5l+Ct%&QclU2FIlX`%I-!&I#IEOqjuRmy&ZxL*MJNWC^ zgEDXB?!4U+K`A1Qe%vXUb}aja2G69VM&)b45Xdr617` zR_mE@LW4h}2fDY^dut;|@hCgsrkBHxo3kc$vyvZEbWqF`uOW}lkXt4QCTK8igxG^I z7oZrGUO{M(2N1NEUKm0$SpBDaFncUK`ki9^kMhXXHDj5$3()pA$+SPXsqs#UL1a6V z8VjAI&n|*9`!R<7neNW>KWCu>d3_2U+9I0j`L|~V4442$uov_9gOU^1fT~XQmjXCf z{!J_iJ6}?G+WK>Ic|whvq7_>!*FIVJdy_#F)j9^u7)X}pRK!>?6Ju_Yi@JnNVOC)4 zmC%AM#h9}mDZkL6_!Ogf&!5!wl~9%6w1F!?;V5+>4UlH}V@8LD6aMb7Xe`j-1k*+U zVA8ycvUuS`?T}_RzCahB>68Tx$tT>rj6Ay)U_j9@!ocG<)hY_Res-4}?Jz}bucpwC ziLhnG#}wZPWX`U=7sc$PQ-3U7A^vN%E()HNHwEkcHyq@>PrC∓t$dRJGIadE?vc zx9WD#yZ&gK=iVbgW=x8$s!dnTwR z$LA6KX5PB94SQsTt@_0w)Wp*>DZooc+yn+wArY_n0v(5fU_{T9ilTv24DWI$xV`nc z3{+|u-7xq9YO*)nq&|JG$+uorM!36j`Y_YDq7b@e;EE`e_kBn+VeD__Tpy`5H};b8 zRl=EXaa0(9Hf_7B3FT5hA>o%w4iFCnvaX(!)Em=eMd*2R;xj*67fnoKFGCuh8wdTk zJU$%WZS+#OOBT>vfumpIf@qCCyAu5Sng<@)D@i~a<+9Fl)S9-Ht1*o<$A3(PJoxe# zwee^q>8J&|+KY>%tnSK1r_9$)rHMkq4qA;{5)nhIz&lAFKGQ-^W4D-MG4%z&s504giKVGtnX*-@y{u^)!Ca)GbmhT#Kgf*P!v zb&~2|&D66J&D&xpn@0t{dVG%uvL4|!at=KB{%h>IFcI7?0XH7?oCWF(8)~*tEt%Iq z3#PbMs{}U~nBbXz?lhKHsp^P@HGZd2;!@Q-^@X}wp`UsZ`Up<9OA0;h14Pme)lJ9CQR9oDm<~vvW!%9C9n;!y{&=Q^l{eXx8X3O{l}Yddf$f!uZMP z8W8CbIatsQ%(2v;T-iWXu?8OGmC+5ULb9L~XBuvrdy@M3hNdwPY2IOfz94+p>WDv` zf;xTR?o5D12Pnh!^T_A7hs~+j5KAUsFqgY|EDwM^ur>SM+J}Vgc9ZIL{VF*2{T;Vk zmb@u{8W7}RPh%16;Ywm0IaVV*OH%r-JvMmLJ4H`;faq{4;oDhz?Xt*0^z76*+6511 zalExG1Q}-Y&H3edzkkSdd+H4!ed(@%M*G@IC{TCM@j3i-2?0vbuwPo`xPrlIY;hwj z<0Z?-S;f(<#mIe*;X-qTA}+lD<&Y~5^A6w4QddrePX69G zTQ^F`TcXefc_cmIt&}01K%4CSzh7H;;U6>;#xt}THDa{I_OE?vASq=H zt8>y%5W_1KEmSu4kLK<)`Gct5EyY3sb%C*|ZGVhlOVbeV~h)3A9lIQkd^lOz$t=Ltmo8ga4=s-)5 zD2Y8$H)=S8#LkY{hNVQ&}g5#RH%qCRR;h%7eG z5)p<%pi5e0{J>IC2&3WPZ0Fc|?GeF4)bUWIT9za3ZH&b~axrIv9J>zg8Vx6NjIch& zmu(?9UX{ z8OQVBu<3MEN5F6#jHzF!qX)rOqdCl)G(|WO3)}vE3Xp-56hvY}_h*gT0X{hI89Hhk zE+jok@GYOb$KPtgoSXKd)G zPTbudXYmXC$itH9Z=2ax2nf!%O`}d>-fwQZZ zas7L2#C@h~dV#@=6={aVZ;K_St~#+xmL{UxdFZ*iZ3exc_rAq2^2EH?k}R1dwM{Ud zxq%bSGG^WOYFrBtgz)y27Sp*`264>AKpEHQDy zqA&r|(Frqr5w+YUF1oJJ>bL&od-Zhp9XCl|fQ^S~`w}jThG;hQ@gcKx2$k)$Ebu9W z6o}3&f$mP4IP`1=_%&;?@~}B^KVKKUC%;E}Bb!Q8)FAzw<<)#g)Ve=ngxEpgmXg&V z?2{}Pc^Z&&c?czfkP$5o!5G0}2x~W1pjTpG`~Tlv#2!c!YN+lbFxNyOHd=UG+=3w_ zublxk+IP9o0<;qCevC!@<9-G}c-m4F8p98JwUMBWh;ttAqP$@Tz~wSi03O+HZAgrC?JJbEDez&8C0 zlAR=R34+-3vTfkIUg)Y++d>(|t_$rwsptG01W~enA*0hPq;bZEA^S0G|6KiH2jSUV zpKRnGC?QT`)=|tKm|^$V3${pOR+_J#Kr-+wBhkw3VdKD=O4h`%((EpQaQS;zJ>k0Y6wqslbamifF zR}G5!BukwvOhLW`4cZyg6RF3rkw(Y^q5L1e#+RsS4K-NvDo~0L2d$GroI?5VmQqTd z0Eo0>9=adrHV(jdieYh(t_>D^0A=klCF3cbtYYMN5l)94yef#xmt1wa_&u5V_EFFU z1+VVtuD}TLcK$HqP|V~G+E$sh`aI($GJpBCz&Y+gSB+aJ3gz(r_v!i6V`6J!YK0X% z`^h$n^h{Y6`v+la8Q;32$H(;9cWyV3Nj1!+d!CED0(gkhe7!?I`AAwx0_HcoaYsP* zGCc6D8lW4=Zom(CZ#%RGVl!NT=J;Mg}#S4E`EpKlo~A7Vm7QbLsW9XDTl1P8X@z; zpACB9JIgW+GfAop*XjW*A@hOTw1=;2Vr;ty@9nf5R2)P(Kup_6y18H)K)L=MkW*{o zqmm^f(^+^!!>n7{>~NhaHhh?c9>M)r!w?{-Kr4%IMU+NWYv_DqH?_N?Tb6=natf`& zh#eZdhsqB4-~N%ubmyhyw~dzPyfDJ~+rBvQlGi5L0YydWbysJb^-0|e7p_!vC;W|p zEFRp}f>jfxd1d@nTUlko=A#rVh+Hhswy+B|nU#LGZ;na`EPUvz5`lc;=qaav(GTRP zzhX;x-PV--K#W;@m%76w`8JdO8r0M%)imA^BD1bKbrAW%5ShomdRYzK1QmqAMF9b} z264Pnb|P$Y-yrQw2@UbCP^+^Z%7>HlzYbJU0v7nX&1=HY54NiNC8INJ@_VVs8HGDr zbV$X`%b}q$&-Ma1{HcMqq!GOt<0ox$y9-fP>C(V)M(FLlSniJJSDxPxfM=6RlawT{ zXYlGL_Nc;`RiS8BD{Y@PG0@S&v8IBu?@3E8e)vc`@NFx5U8?wN{d#PT(GDA=m4%d; zf-7oeyr9U~z`@*U5)DIFOA?5R<@BZFS|*G)Q;Ob@K1?4!V!kU~8&3TXw1I3D?CVz@ z+FxzVCqiCnrSK2##?q~#Xvwn2x&H3nMS8&QJzW?WZ5ZB20~d>B^%G&Gi5$`8Pk#H z$bc~*4<04-u4Nebs~NGP>vGvd?mJM@Cly0Ua-rrzZr#{jUc=9G@~j+SYi2LWc3>XQ znRsWae3v&lM$&#IK%N~&H}vX@@a$tTt~Q@oAZt{ba7P@JH2`RQfX2cOixk=M5+cii z0gEr>5DELrMt4Gf^n0+jIC{k-aCK9jva!pkwwt!fMSMpRhalsk6j|c@t$@Ho?2tJ7 zcqN0Oh#6njN1O5tG&QS75*K->%$0}-2oFjY=Gn9!L#rx6p11U=7W`DuS<9z zq^s+}cm>Z5xsQD_E867gq=m$`@APfN^{DXfw`9t08DI*^KOY{+pYo%HZmHsTy33-v zAAKGiou28R+Z__hZ!`*Y}s{m!|)?FA^>OQp{rS zv=hq(!J<~*X0LRIdwxklFVIn6=qZWw`Q{L4C<=L-_mvV?F4!QzCeDr;<%BOMwRYjqBHLE;aoRW-g8%xXWqI1GtS`(&sF z-+5H~OTtSS3F4`dSfv_CDy-0Lh}Vs#vT4To7J)DU>B=;q>_z}lW-xZN2+`Uc?kyto z+3DWfJyke9e9K2F>Za7QD%h(39Tg=rWEu6wO`KlNd1`#QIphq1z2L&oim(^bnowjh zRa*f(eb0|qeBFKd-}$G0G4q>0HSRSxQ>g2PpQ=v$KNWE_-y789JKZEJ+jfHw~-Xb2bf_x*1*S9&rw7lt-ypnPW`tM@aNbuWJ7`OEMXZ~hqb0a znpg(Z;A^kRTz%{*KpZSFyAC>&TzkS(&V#-L0Q}7cv$+9tkBI?wk$EntXh&}1-{Jv# z1ZS6oY@M?;I*SYFkAKz7*Z`;Cx$@n&yq~{rqK?q4_;noWY_u>}v3NN4VFLawsd22e z0B&fB1iDK=ASrDGS==bieF$!w7~cO=a$)H5C1j^C-BBpp3)(Ci0N>{VxWEaI!0zK@ z(vN=d%I=hVvF(^h$<=qqF(2Y?nc?dkZ?JU+!wB&dya2t_3H1~&7`s@Yqqs+@D8;35 z57C3nt(wF>9q5gVP{O1}=(V$^IL)mEhR^Ej(#j?<(?=?c@W2 zS3M|e=^hSh0O|5tYwCk*bd31?<@Sa1+r}CTx;f14ecwohucvQSA%@PL{C5WFptzld zmU&Mqmb&@*9ajho6+*XJ`esq+azQcDo>nIEvUt2wB+>u1_8HmegxaQtDDG zE^sz+0XMlf9amxC1GJH<@QaWlZdDlMFR{x+m>uu|2INv6(*}#yHi zwRB?0c>ggB=Z%BjUY+$IH9}rO2yNIknDimcX6Mp=sQK3j*sfNdwkS|SgQ>w4g|c&` z#)V!r{lz2ce{9gBQ^7<$fh+akbD<3}LYIr2$7dM?y`OWuB(J2x48z9$vBT|C5=DF! z)4$NnpFZ~If>(M_r24#H7h5K#1g80EaUMes-C+-oyKjeyk9z!i_a<{om1cn~byBZB zQ~ye9etyay4Uy^1@`$>U#{}>p+DO4#x1KPXQSiro*T7I%==i+5+{4x^a)J_yoBpxx zPaqed5`pKT&7Olmfly#ByvbS+e*u+257WnWS*I`uUc*1n|1l5iwie#5cnS#|^fvO90mh5vrN zrlDuSm);YE%b<3bojo%+ZrG9@?BqB#=;2pXope{KEEqHR7{4-F%;COl2nzH|?;Da0CqzE7D0E zrKjE)FupBqDKx{}LrPJm9AmICFlShkEou8yll293_re-0C23G(mA2Wo@w_q6yhse{ z$C`p)dEvOM=<8D}4fln&l0RUn{>=(OfQ^8~&e@{FM)zDPUWJkOYG6)D5B>T7(CO>I z2XgBXt)~wE;g3!;(|qEJe!907dW4;)jlZb9e01@$h!d0X^b;=PL{VGYS%C3GF=qPS z)$Ur;#yBCb&Iu#L@ z|6a$nG7HA`I-bs%RY1PFdX)5^wir^Ej|=0m#s8k-vaG7AO~pSw8N=9OVxW}@NPxx= z(%{K##^(eQ;oi3gRE-@^xDS~o{H>fKjHemq4ulELA;r|ix{iJm5ieOg@Ir@tveq*a>~PD~Vr!doF2m?J64g3`{MeF@FqOcDM%~SP z&6ruH3$7Yk)h7N3k%EvP8{WDHutF*3a}G&dC_s(o4s+{<`g#IKC^!zBGCL}y#0i>0 zGw6xiv9~V~3|T~#GF2_Lav&qG_3Oly*yltV?r~k9Mu5EDKC=D<{1)IX;~1L%nAy8F zZ< zbs_3Jk3}R@Rf;43biBfLyS$OLFIS}e6`&@|Z1zxHcg)HAtRcmfYAmplZ zDt%L7Hp#p*6*Nc1Xn+YY@ZQ0J|NE8K@T;X zkdk_b1vU|bai%u;BF`VgIMdgPv}gugMF6iSB>**LM?(T^s9@!23szn#(e|xkC_`P- z;^}eCYN;JtaY~}nvR4=#kc^9cU2h33I3>Q607kn#HfL+96KGdxeiwUvA_d2QmHtWy z=mzB*s?*p$%F6aXwhvbea2+#3Bdf~k}%?5eM8-FqA-De%-A+M9C zNinC4dX-(#B{D7fKr7qo@2jX6R=;%k=Y=D7^LlDht$D^$r zf7@Qee9Cg?arg_YwPR4wTYd3*7O>4XeU;_|&*js697))y@q3Y5-Bx2{11*|J`^3RT z+X*L&U%K>JdMtKH^fj?R#enM%>8ZoUVZYkL#lamiZ|PrpYM8S2V;?-T9r}psJ9oMv11d~M zX6&b!+k4LLs`J&JzwC1Ws1SZ#z`t5zRezc`{w`~{P!!) z5v+BROI2wl#2P$@SDXMS+7-NObUsq<0fP{|W zP)84se0uI3prYQSqJ;?wqzgvQjYN;}Z(dfbH(MN=NYdQf8?nGK>;8%vD6yR!8aG|> zv@rt9NZi%s+P$bxg&E>+f;7QH;4WmKT5Nt3+hNK>G_UwOe=`y1dFMfT{7|OQpormV z=GN#4VO8v+Ai&2?Fao&C{*!@#{YF;!b;nbb0c7TWQEg%Y4=|g2_we%eN6XmiKuF73 z2&vw93TG?(_`~8H^i3)A*Nql62|rgkSYs^k)5lwSugTRY%j07|?(REjQTD6?kFD4@ zPba_kP$zp1Vp?ulU;|vsFggtP6W`|R=~6ghA@v&uqM}4Nd$H~G1VFGbpQP?gP;gBv zG1RWILIvf>HGK-pGS;)czs0$+m(gu*c*{)uWhL&5 z1rs75L!n@le)em$3}b;;V;i~k)#Vp!wDHt0NZPAFeeqRP#blp+5+6H~jw|Fh?pJ$$ zBeo;~vCHR0kEx+)Srf*p=+X+77JqMz%`{UXe%f-)}jreB~7L6+^*0ekKroQUlBuCu^d zGn@I)5}7<4penxH1fD!=OKv%M&O`X?w-Te6*Npy&qt+%nA%S*;a+sv!m8$-V3zvVJ z3wIw8P?md6;oUn^nbwr(Xx&9uB=|6@==bfTFVy`j<*Yex?m;PF0#CP%$2cBjMhy4R zY(w)~XWVLe5Xc0u>lcbep|^J)^iTeT`x{!O9>~PA+1CFM;4>^~6g|s!t;Zu6%mIWL z;3Ql`QB13yMLmO#L@1Z#Iie}}osRV~{vNEdb_(T-uxojTK07%05ZCn^x4%7ZUn&CfrF?QMA2 z?|Gcosc`4Zvo*kOKCA-y*C<2U_Is%{x#V|J6)ROfaj}tDfBHg>apU6F5JUPT^UMXc z8C}~m)P#o;{ZYc4vB)_Q%F%&vHAhK)sRb*@d&>W9%c*aqa2@;${DlXinFup-!MWx{G51^j+sdW2Q3=Xhq>xq8fI~E;k0r6{n){k zPhgtn^n41(5VPqm8{(2R6g1oc*x0E*DqVS5%MT75?29`6>aY0KyZBAig$#6V6_WOk zyP~Y0S8Ii>*=Uc4HAL-3m(z$2{BW7KTJE#Gg!!w7xb1IFh-C z*4_Q>Nk=qoOt5nln@A#LQqe;{|8^1ls~3^^i-7ae6iForqVolJ?W~PVyL%$jJ(!$~ zj*=_zE9*%D;FW|`(lbq=B^cs;>@e_#Wn2{-?jnRWf&MS^j3(>X<51h?u2}Z-Ls2(O zta#O#G4#C8M40h!msMQT=0d;w=~X-N5c{$zkvT$-7a;_hAuGuN6`~u>4J4msXV)ET zbDBFs0qbI`=LQ`Y)5QDV+E`gh;#l?R@vz&N6MR9zam*tR)>#{qCue*-U3|sPBwo2T4x|lhNnE%jr zd#G!84y0S3CTX*Qg_|u1_AGfI*BD}2U}bu3wpi|adhe#_^q z&44Y=W1)3&H`9;yP_Oc5D0)&|U8muPIE-*jZ1taT-P6I?;Mp!n!l|ei7@zv?16g(YFZsSjgX{s(%4@il{r}5dpoFZ@sztr#yi6 z!bgbBRQv1{In@EUgWo;)ke$~AX|>bEoNN=X;w$6|)!APtLx9zMRt(CK?IP`as*uLU zaw}$I<@_MAOBa` z2Bdl1NaqULrF;))C8Es`(nt6Q$=fTDAMStEoH&(StvG86X|zq5WCQ2nkPeWT5GY<{*3vDg}?ySgop^}$kv4$Tuihu^h&MuSqmaMozb zF0Y*F3<7XGdpOTVohz zT$-zXg#0BWX&pH~m;-BB=u4Txlz5*3?)J22x+eatXD~Wt8G!LQysFJvR?(>FuWcjX ziUdP?K)1BMpLxSA>$LX>%#iUcWlfTKwYOF26_&k~HZ!Tg<5kjq$}MLIKnRcrs^oF- zmkfSKx_1ywVolf3Jd26Eep2ZNAEr=a%!GPXU;Z`5T^h~tI#Cw$usz!IgE}22Z3#$o zwGL;syU}g}oEmF!e1B&rMTd?SYr52sT#eb1S9L6?NaCk_7})ow#BxjrjM<)U86BO1 zwizK@7sMymSW8!)b)jdplZpOd6qNGaIspcKfg{9*9q{R7eVEd9f}G@=V60}rNh9EK z95LeT-J$(H>u;xd!jFCk-#Dwm>Jf13)o`_NH~3G!9s7^>5A*lG@4S`Sai0MvrW>zd zw|?CrxZbB`VqHa%mWi(}a{1HZXf1{3pdv#SWYt38)nJjIq@7aRsRn{|uGeoP*z+a- zyNv{?%}YUmq+nonN)sfX(1Q5%6wqV*{>FDpV0F+8_6R{+#SZ|2@1elWkflfK4t!#C zp{S{U@sGefg_O@%<4FIs{qxhlR}jDEvJ0tD%oT7wu5svI0WVusy`O}+*ak)iNbSR` zO10nHV=mDEaO;qi@hdELet9wVzU~K7W?M7kP#e;Z_AlZ$zre!@nc#EZJzD{Qm4>-- z!&~6&tM>^m;Eg6kdSpIBA?y(SwcUCk(5BpVKNIEsf%6kg>XbfyNe*on+DvjR}3idg^aoxMn{v=b$Rpp$+( zyVO9Rb<%ej4%rZq3edzhqe!Br03Cg)QNl^{SfhQaxYE*jBwT=x;5G0t&gDSOy*=X} zrQY5$6Sj0JA&SoAxZoYe#h#$PAoTOEc6`cJ2&71t!@?m)!kU#;<&PEL55Dqv2&5yJ(qZ~NpKdDfPnNO^~MZQfKoATdvB}+sHeS6_+CGw$`%6Fiy4xP>jI4y0x{~t%! z9Z%K&|Igj_UYVB=k&&5jFB)cKXWo*^%0;r`-b+PfluhOOgzUY=y~;=f*<{=hvSqJ( zfA{E!fy4QpUj`WNvEFfF^fUOXkzVoB8b=RMv?DOm4 zH+j61c#g{PYEJpb~tpANn%782DQ~naray^BQ4GRY6dzRzvInDEgLTOI*sKLU*@B;U?wVzM9(z}Ic;yx+(E6>sD092}_~syrUxU0Wn#2UT zWrDu>?@w6vp11ars@i3R$Zhx7@7U_*?JN0;O{TnbTWe|kW$)8=k{9W%Ty>NR+QrV(0Of`QVaI-S!v@}p;Rp>+k${LDa9 zN(eTx831#VDePv1MtOp@@;H$EqhEw0BIg@}(lAKM4p88O9+zJ4pJ{5x5rJiPZUPV|Fxdc^gU!?B?2Ueract^A!0yO-u-?u`BZpZ;@1i*w~=ct&AO zO%x_B7p>G`75>p(Kx8)Kh3T&edgTSkaHt(eYY?2#sr6oa?>?U`=@vF?f>xh4{7Qo~Kfx zo!V-UJDuT6%>`0|dSq9txGRYXZ>J9iYu+~SuqVBdupj-Y*vp5%B>8x&fIaY*@|1X^ zCLZ%v^gb_O0_@VfYFQoOg_*Bcc#~eMOyTPF<6pjgnVAJtUHp`te<_I;-}T*7YvIiP zQzo?tS3h<_?T{YUu<^9X9=}_8zJH+I#qFwe=s_8E-?)G#9)}-V^(4oWZ-Kt2G+v7= zZrr+dnU>GTzMKkvIGYw#k1?kmmv)(7kdN${!Bgvf!>fxGPWZfL#e{@NkEi&DVpnEd z0ZLXQL7M9+BI_~l2wh0ghT%)oG-zZ#vBzLd9!OvqTYq}vSN90WOYMp+lT%8}Yo^w6CSnK}F7nh3~a93yrPUH4?N@Gi8s{~evoA$s;6ZVo;s-wHz8 zw$Y-8C*CFg5(Qb$nXhqa@~|tJed$<@aJ9N zTBXyD$?~`firlqeO`f8S8-(QqIJdHS|wbR8omZv*`3e<%`;qwYesj};(A~lc`(6yLA8T~r#f z)v9-vV5sUIA+6?&&HH8Qz2XeNqPg%`s|jK0^=eRRPLL zM=)qnq?$N`aYz}-@=J;@I;_lx^Qswb>;jU2l0p#b*{=W_XFHOxvRPb=l-V24OX2X7 zOI*Me%uPuo0@N$()&c@A%>}B8U@PwsRUbTB8jT)8n}YN7_=kA<^}mz9V9*~EvJQ(% z=>F5^pLXe4$&v4!1q#I4{9uJea%8rlm_yowjGg;+z>trN5bZLN?!F0L)*3p>SHSUn zl+s70GIf31(Zo)-g}HFIH4N`(jo4t$J*H|MjvA(-wR^(So0WfWOuDOu26l}buW7lc zb-AmFh+%m(j@Gj&Brcjln3?Jf4kcXZu@0)vsS~xnXhggMRIGep<*RqWZ&+bc5C-5_ zBLQ!Fd%@9xfk^1?)md=ih9thg)%$125xAnl6xEqGogsNt_Dql@Yx$$ahVBEDCorR>l#nnHhG^7nin5mDM!wu6rHbRUqyKHL} zbt*XuvQw}RR;aAsa73&qd3`F)Uh2BX`iRf{aH9I~G+pOc+QgJMcZw|0W;&#%<;FF+ z@-_BNlH4_LVH{eN=*^j%xo{;-lE?WC(Do@o;6X!a?isFs8vzrj=>$f?e0H~uFeKe# zDoBcz5F!6f(r4PqC;>so+SvMw-~;)}0-q5?zW{Ym%zqYAORQCdAtklJu*GLWB}x~} zvzzY;F&cH;-h6UX8+gPcysSp4=n13Uv6}w%?`uxIdt}orx>kV0xd0G@Y}gxN*6rh# zh42uF6gZYqpXbZ%GaA&~j@&bbFFLzB=E33RkEhhdE&3k@1Rkx~tMd___X*0x;Bw@k zcWWaGYe?fA+UMF>)KvMassElMf*pjAbzC!VSi_zRvi;s5`hf`2<<@;*awm|t%Dod< z*y2w%aDSf>}ET* zAj11!_ePUEA;Sj0##o+`!6fj_zY1}`ic_0Seua>mp{o)14Ic+*XD(ccVkTfhqJ}LZnv#GU% z-uckKUpHv%BP7xp*gJM}Wa@e;h-25a5&7jmll({g1!uvUKG^91i8`=kB=QC5i5m$2 z6>rAb48>x_MuiQ(GHm_`lOet@Kp$j0d-%~E-^^_3c=ZF6*3(BZPGR|O3|0^0pcF_0 zRl0zsEM>D`YXZdzo?nKko@H90v=={Hy1!gf?FUt0xMwPY_lugyKUj)*3D|LC1|2{t zafrs%zoMH}QUK{re|HDn1k`9h{b zg$8)KqBzp+m~3Tz8Ixwz*mQ#MS)RU^@@}sp7|b{VhzZ+oUWk4VBXnu=Ulr8jz}YER z3F2BucHuxePzJ%QWNJp@+q2KYHOY#=1FnPaAMb}8VqFp2CryE-j;_=Yr`@~%3#E?0 z$VvzE6mxzTI>GEzbu&?pVMZ}ms|i^xTWywf@SH8FO}N8yM_zni1F26s5--5!E}2MkAQGozuU zo#;CBMi0R#NWmcpUnO9uKoIu=dCM7MZcjbpm8dFm^%U1hex8E{TgF1;r9k6gr4M;d zXa?}h%uPQXpn1l^n3%AWyKrLpNJpB?mLPQ)PmbUY`f76$~|KSv1*2o6ClBnA9O?D0?g^1DD8+bMgg4D@us z09?rnM1_98iY$xj_Ok4nt5^z?ol4Bkxu30a*$%kRT6oPC{2hv6Git(fK)(>Q>;OYg z-Zz$F$a{|m%ygD2W+QJshi{ceT%ae=+w!r*77Vk*?m{9=sd`(}rfq(4`0M&qX%8wD zYOxmn?sa?cY>tK~u+OkW(2Yd^YwsSPxf?*uccAVE13Z;+CwHT zRWpEL$K49>(cNmu(;ZUoCCw4+`M+6AnV<{?mYMWF>+r_>0s5W);Vu|U-)vG3_JYYC zzjM@D%;e?!$Ou$kb-$ABthv2I(F0}SE+&qLjEG6`Tgs)Ykmkje^c1ZIRWlZ!D+ zT2tCb=>f-6LpsxJWHoUHA{$eC$ZHgN7eRLM!=OpSuXI)&T`P(2G;)UsjfU!A>n+`*Z*DO0UoneM%4e=;1Q~c$brTFiB^l`B;^npC!b-X{LymO`;os_}} zv^^32!|oBTlpa8(68lImJ_Xr=rt)~3Vlvw-N7!{&0|gH5yRl+zG-6mAm-|w+=3 zfYn*_zwAL(JtRZi0}jbG_IU}1gL^WpRbtaz98r-TPF^Jpv-W_3n$k6n2j`Le&=^aa zy+1)7;*^grWjuaFG85eLb)OL_KI)&T*^iwz@TA^1N>nW6ZlJT?lA9w$tDZ$Vg#Y0vu2YoaFh)*Rb+=?Du~T8guWathw+6RHq=>s2(UC zeW9XGxJl>J<{UVw$sO@9qI=<&y6 z+ zTNz(No~R0ah?AnMhyRUUFafi_f-Eyt1|GvUyI-c4+_)NUZ5fNH2x=ZuPwfftxpveS zxpB1)MA306N9~A~z%D=-mDYg_rS1_}lJrD~JgoJ>W)=Ir-0@%l2|Mj6Spw__rj;A5 zwp&w<%^9Imu&d(S%*`ava4LO4gMJki)b9EfV#+#yOHd34v?5Ta^pG9o3e@J7c(~Ys z;685uqU}M#{2Uz&JQp9#o+>foiKGlEVoMtAvbk}9sF#hv?Y$fgX$;@VS13|KHV|k; zq7^1wml*_Bco^^79t|aLXXbLe1 zn^rM(r2VxYk(pAV3v`UPAh?V`@Ca?+n?FP}SUnf@d`e)w=eZaK4A}TyxMl*9Uqh8- z1d%f846_SX*3=N1389h{8&ZDk zb=@2CT#`5T%zh3|JSXd@|Lt-@jNN_NSG0H$^995PXW46iM!*ZBzul&Tu9njsH%4#H zprpW$G9#|3*lbW#o`2N+-Qw^A$Bj5S%y}k6RRUgI7Pcfudjl^l9MTO%;4tZioO{gc z-}zhgtpwk@2@q5hSeH1VJo1`X;FueES(jm9HLYcQg{Q8oCkwnk^_2#g{x=shW{Ubx z0bu-YrAPhJn;c5qAjR=8T*Qsg{-~au|NYu{%{)2_{4*L(>eb(7r>j-1#CA!{D5dOh-D$^0!Ihr;1kLLitVYO*JNLSX||kKG309x zPHHH2(g0`XGd&~OaHmdGy=H%TTbh0iSV^1=ijs1>m{JUx^~71C09iL={#Iw<3+Pp! zx$nRV(^$~{Bg>QRKN;j7zKtg#p1%TI=HF8<$pO-^F>n&NH!kB%mHH)VIXZ|dgYk?V zN5^rdyVCCo7Lc7H*%2nGPfleMT}BoLiXE6z56Zc%w_dxB4e?S#?|^B0)3FK>ouk{B zNO1n~m=KENq~P8om?S>z{3S|nPGkhOB)9i7&s_q?!9Q{g$J51|VUb9J_Qyr~c!U$b zJL!kMp>;T4dp}hiVGsx&VJ2M!pNpPo8N z=}odGK@PC!?Qa>9@?W{oQ&7wq&7E9Yjc_^8*kInIzjl&3Q{xc{{8PS|bdkW;`eCK$ zv6MTwqZ*7=2c#hfsbJKqFDmN$k-9BVF?X`>G$+Qg!AKYWM z%q(hlV(Uy~+wSS*GE}fH1L*oR&rJC1=F|sRnXo=a&KMi3m#?mS4v0y-twh02$1=K~ zVq^rxyp{(ZdoS?!5xhSrLk-IDSApaIw&b|+m(ExR&QM#VlEfrHJHDgqh+us86@VM! z%}K=csljH8X?ohAKnTV{%u=^%1+&hGCG#|?mIEC8!kSGxvLHsox083w@OeGi*};E< z3|HPtN2L5VDM2l03 z_=|vFkbecsz~o9@F?(g~i?Qelp!^|FE|zqM)6h&d|4Q;%8K)EGeN%xlG5kymv|z(+ zqBZ^u#}_axC|L^K;MR}e2N)9gi4O^gH&4FG4B{*+G2!ziaa|Rrz=&SnYf^?le=&YD zVzl?gIgs^AHy`MuDCF_y9n=Tsa=d(pF?_Jkk3y394TkzL{&o+50gUz`?dG@A$zRJw zbkRzD+)Ap9387?(a@a%CSdhOTC|HOG{BHtf+V=3Zx)Q_>!XYy@^+W^_UXJ9DWn_`Y zIga8OBTp->H=dYq9Pm5Qnwdtq>HFGG)c&05!t-TB=4_yz23@r1d6r!KnH;Bi)O9$W z9Orn6bIfs&bQT9{ zCJSHO=!{c4&2`6zT_8+BpQ}Z9{_AeTIVmSSMx>mF&%Oi~@k)=1cuji)xQCHleP!L{ zcr#~ddyY9SC5OLXVeBjBnik?%rYwq}{goz)fNau0XJeqjU9<$OGH19~_)?{V!047@ z+P;_^=W1Fuvx0+GGKqA}%F=Q5Fry_#3a9wykaT?ngZtm146ttJLc?E09s9Jull!m| z172jKT;$qp{2j|<^eb{k>2%wn#gWYr-M>Pr`sFPQgmzNo5BJ^3W(|HLkY-UwP;YQQ z1dLhK!}{E-R+6Nr@zL@}vve^MV+Jgms5|Ff1#pyhSLl%a3hcLI2VpIQsdHeb`|VXa zkWbO)+TIQxupY4A0%rx0+_(7|W;>do^{te1;of-8N;rB;L`&I{0vyDgH9JVH;OEFXUdi(VrGY(RKoC0UV?7&C2RHP1(tgMciBo?@Cj6vB3QceLZ+ zF=c9GXpsaq;p*OJEvC&K71ap*J)ob3pwjmHKs4q9__&nbgF&#BdKZYd)k2X~+{Aoe zxuBWAeR~NcFH^M!POIwhkUbT$Pz{nXBLBrJZ|izT_kF%!*=24NWi6P|+N5I7@JK)X zq7}06NQ_kfBv~h^#zfHzwDS5xml#`@q;dKsi*)G+fBOH&Uct=tv>2J(yH<691LhGACMT6hmfbUuR zWA}g0k@$pc=>VJ630lE9U;+Fvg+1R+{b1h8e(l{J16>+K9>!%aRM}v~@D)x0Bksd! zA?`BB&Hf7wh0D&qw;Z^DDv%s%f2K^0-sz}C_gOGel5CJ8|HHREFblbu8?gAttj^RH zokWcuNtA%1nXJ9m6>|ze$_ZiZTl8|vehjd< z*sT{qM?>+Vwp|@odUl#G)CiDpyH&X5?n)fG`Dpjf<%lGi5m?N72qu;e!gdUR?v;4LFNnO*r*T7TBeOy->M-AnNn3LZU}UrI}fE~Gbl1Td!(A7S=Tk=Y5NZh{2Q zRuxk1t&k5<3JhMRA2b}K`hiR3JWF~JOzZcAfL8x2z{nX2A|6+QC;iyR9cPE_Ka0H2 zdLhkF3+c^F$Yt<^?4Wf+YbI>lEi~vc1$rUXW{ihn60AJR<$Nyw()yEpKU4ZpF{5Mo zZy7AFkfV;x0*8~=tVBisT@rra30MH>S!Lrlmf#?5+Lub>6=ln-PS7SuagYV?eR811XtL}#zTY^s9fT?mhZMOmfzKogZ?fSbqOv0k3 z4r@bb32mr^@<=tL2~h!2(;tp!XYm^C7(MD3@e+G|}g9k>Uom zew$(}1w!$Qhz4ASN}^N64<9re*~#VJ>L2R7>Exez-c)erbvKsf>#u3zkl83J-tTky ziU;k{8B&9xQ_oD*$lB=27W+5gq+h{4Hjh&@Xo1cZjWVXF_hvr^5qzgp&**8!=EC`7qm@gMRm%brm1^Ej&q(H(ZDIS|VSw zK=(#QJ!8nd&Q>i;m&yuoTlwE^HQt9SbJC9Jl70IUS+5cF%k~Gm4RoiSP$*y#boMKr z;gQGlXQtW=n{&D#r$Dqf<7OT}ySCrNNN%o8vH>DNYMHb`IaQDKcwTd!7zi6& z`}mCtg5aXvM%*2o6X*=MC~GHmv5rL#Z<0Rtfb2RkBCP9QGTpYeb2U6&+TqpENcw51 zg)9fDyX~}G5xvA!7?X|1A@6P$jDyE`k+(Ry8~{@cGJ#b|64PBi=W{r9L2*#oGRyBy z#7g_A`lpZTHy1Q;ope*Re;ph7NO{IFw|RUUf~?r9{mb+4F}=Fqj$k=4>mczht6?RP zk`6MnQ`*n_k%mpc`8VqJR{w|{$9-uVuo{%Sn*@+^^Av8-9^z<1h;yxk63!*M$pfv6 z&R_VJrui?3Tbz2!^h%xQ-OYXYwAUTksTnBOr%U@JLuYuMa$GWewFY3 zP=ZKz-QU3OSkv}l>rOd8_m4%-h~q)g=U_*a)8e*2*XprxJQ^I#zzznbw)iU}b?QS= z56_a%=CtyEzq`pZDTl+51z$$tV?kd|09Udr=POP&*UOa&na6h$}rM?5bTTB1u_Z(kD zw%wuPm=5B+#k>=Rs$zwY250ORx$I_a0TnQkpG`fi{xlt0^O_+%DWaTt<1igz0^}!(V&*NaZ3LvJX zi?fgO&`1#VLY)Bm8e#C{b4c}>(u=agbZzgc=Whp>oT6urFZJ#SiN}7;dti@e4?iAo z;&?=o1I9~%;{hQ_uVwu2LC!P1hHpX|BdEma~UaCBh31#`h zQ(FglD6I0%BtU`fB)VEzbJL{kBSR*zrfedn2oS|oA+fIry4BBb0SuGMeh<{1O!-6w zgJ>azNP)gx-G4Vyad`N%Q9X(~rhjk!0X445e1yepS!6b@RD+|&J6QUTCJK7sg z*Z-xn^j51sKQh#NpCxn9)Oi7B)+V&1kmA_R%y;Lr7_q1Mpmc$269>lhlup9#KIr zUsf6gye9TOb#Y;&7v*n_2%UJquClFKg=rXe<0DbPItIi*|3`eQ&F~R%L#xW}iYlK2 z-X>V64K$N%<>2jE#^i zD9F+k?+voYQ{oJdTpcvG$QaE=kTdq2j%q(7RqCrFO#{=r^^&H z_w{Z#pHBv~uW=NXid+hI-v1R>=yA>w;FEvNOy;?(B>!C%>X07ysAy8-9mMN}FxD2- zET+JACE$U00GXkdt4l9Z^&hS<4#V`#rB*m%=ulMSA8rbo2`B6R9Aj3VV0@lB_~Ppe0Q2i1=1X2E zz=)_p-kV~#Zn+VG=9zR8)R{^TGk1oh@FFyRupY!t>K2KiqpSMJ zk0%g#b?_%+&w4-}{r&1oXTw1bhRBN#j~4qTFRtuk%?Ma5Q8x2@PtsoBAM$MA*wv)h zHyGI26eOSa0B_&l2?Q*?K-eirw*wpgZ+0VKrQR4i=T&dY-!3mCUr^Pz;+ng|kKzXB zc*e~I>vMn}el%N-M`;o)OTg8F6fzm3!^+fwF?Vee1gVTTt-k>#y14V>;7UN5|5Zzp({z43 zO!LY7$gQ?$FD9NRVhZb@@K0XyU?Wtsq-9{^*k9=5ZX$aXh(pp|ma6v&5MyR|$r%}9 z0yl8Ndm!(sHkyK~UvgUc{ES4Y?zI!`dA>ZIkp$_A(DaNaF)Apo2i*Xbc$NG{rP`kI zN3@@N?cHm!UNxnZKT5VAdqiJB=^KZ{?V->bZsE8!ON zrZa9`1veZuw2Qz3cI{!D^FMU+_f~F?LxSHQgK%nE(t)s!VkWN5^hu;TZ~y7<#hmQq zQj@F6A>Vgk7~Rj2UW0+?)CKW}ZU60ijGg2>WaQ}48$4J*HHzq@y7yDlp9B4IMs+wV z)_(TMGhU#)n6`u0I82F%dtHYi_&F z_ULmuLOnksaIk^N{(=L$%Q^4f3MXA;gu*wYzmR`VJdsVJ91LUGITl*tZ$DT16Y7r3 z#f<0M{^}|#eafUsnUG7zK?ruyiO-4ocT(>RTs)xB7r}!1?yPmqZ!mteVst+x-KpU5 z+M6=`72`Aj7E#WsECr{}6OMlp1-wOKI^h;IZ9Eo@G5B_{nM^z6@o>xVgyO0FW5&CT zorlL}m12O?W){*VE^n7A#Csu84y29B^e+f`%~WVjasdp$p~wVs>*YshN7%_10>XAd z{eDH4#7O#2N%Q}`e=Q<-$jKI{t zJvK|kj)pzUbUaGKr|h8Z5i7nQ|4^s%Bw^5d%;d!mz!(2Ahy@5g}PflQnKppN@7k^Io&Yb)&EX-f^Td8CwD zQd`C6-Y|^F1I8P3GbXU8muloj26;}b0!U_Lj#2MsE&&)tQ>`w zdHG$+6gM+w!adQXDK>8 z+8F4T2MwtrF4d_n@^KTyb9CcjF|etQk^DxcN+AG&h*ZPS{g|pJa$X$u`mY++EPAdm z6_Xmz36R|Ny3X1$R>a&V<-MF^6V8;uDM+KW3~gXjps-XhV=e<25Rt8npjrm`0b^kO zxKnf`(#|vnkJ~)6lbx%oWVTxqU~+S3F{?R;mRM0@XB(R&2@r?@@G}1_f6}|q&i!1k zrcVx_i4b>9QRFqSDI6_Nw~_M%|FP)Nw5Vn<~7KdHF!?3UW+A!66?9`jP_J*8_?$HTjt?1k)=bFU{>=h7&gY zLcn3=k?dyniev{!%=1J-&RNK0$>YDz;uYR@m9P10j6RK3wBFo4JP8!&e`AR?&2qd$ z_{Kij>Zr5xky#?**l!)63OEDE#>^sG&RIH)s4_uc1r$oala5M8Q|N3={`Knny>Gba zXq>5QkkdO`5am0dyLSrRmFy0#OTcTAB8L>BhIld3+!-`HGGh#XO4_k%dPu(bZD`VW zedg8Z$FZX$kv#`Y0|>X?8lK;_UMzQHFm(gN8xybRp|k5}!V7Am)U|IY0lxT|yb&8` z0@52)>7aWTVY=UW1z*R|C=amg(YdznSGrbbaMVEJnw1=gZUyX8WH6`;J%9yRI-k}5 znPXSjnbfOjunoI$8aMjS)krk$^<@AClOyQOAMXE0Q~vU6 zzwnzV+?x)xK(lsZ?~)-A!yKd6xdH74)ApGM$2=zx35q;~^6NuHcqIeH>pJ8#Z@;SP z^8=cB@T^-HS_HA5#E{3wq-Dt)blTvG8~xC7dz7vzZv40U0nOwpkQc|az(2|JV!1AWc8D7@<&XjCmoE@Iwm;Msrn`kQ-qM zA5ViW5a+!KW^5+~&uKflWz=EE6kTkNYofA<7cC;&$RJ=P{zVS6(=$z=<=w$?t0R$8 zhT+=8%+&HgFr&k~Dph+{RO~uR;gmTGw;6JU3E9t%lSV=g_WyfH4@uZ=x`i~rj$xO^ zd0$XkQ9Tmo7eY^gto@P}c-OVq*P=HPtq-m%%(ZZ32F*&M#m4v5-mhh&$O5uJzabrq z6V=fS9?%2=lGP>H$o8PG-*Q^Uj9$MW=C5=!;k7wH4+K+Y-zV1_*+BV!s*nNgVM$=e z2dQfC+|(SDd;xRPlgZ$%Psy21AD)S*E8h56hBzW_nMjU0g7HXuR0ydLmIM)0B*VJ> zq$=_+)(C9MjMwGp3AWC#S;-B|7tv6_Zf+>}ix$U~U2E7!h^Yyu>dnl&p7Gf~FWUJ9j_Z@g5f8gxmg2Vrp{I2IxHM z5xvGCrcg+w#{xI$pInaPh9+?KvO@Skp|oC+L>;K$82ioO3SOP{lTOp$$47W$x>(Hp z`_xlO6~GX06Z|C*1%3}3Ep+O-?1Uq0bs;X7Qme|o8Jm;fhYB+qI8{!@hk=d zWkA^y0}}H%22OMhvCX~I-@uQ*&ctn)t$N-LX{c$g+co%E%f1}7f_*x9UXZpXe38=# zzeW3y2DqrprmsCsyu7X%_QBT9Zmr4O*Yq#-`>&pzx=aV?*T1fQCn|0GrT-4NdtEmI zip_PW_8MH}Ap#MCwM8btv4_ZOP}#3w;A7&i=b&2UqIk18!jQbzgWlZFBzQRMbizy@ ztKhX{G{SSUnq75ZFX)yD;aB;ZVwDUA<+{;gB68RfZPT>)zBtp{j!s0ldu3XNLOOyJ zhmJbhsO@g?2hFg3{sz{N*LYpO=zqEu5fKs^-Kyr=aGVwIKAwQM%rkkgJO7CTJoPAK zb;+;&n^MGEiHuIB3MJE%s}37RF>|Ib#>aA6c0#X)Fb^+54M zD8|{mK!dJ8Zu9QZ*H_N`sO7&a;Wv_}T2iUYyPmrVzed+C14CP3KlLeOF}Ru(>plJ2 z`uOPR+MA~@0z@~vi4|uN)!eba*eYzdeI0T>ynPb;_~Nsf=Er?H z#njagDQ!nN)-~I~Hmh1Uir#j+r?}K+6jJv|jyAZR(7L^%M47-*A048v<-Opt_s1a? zwS?T}UnGx{#*QoX7G}V~BU87^?m59IO>HqWTu@cCsVY&;wdKcylZP*lH1X1_hrZqA zQp^(xzu||5o8^x$Z;Qt01+@vf4geGa1J<&!N$+B z=mN><#;UJId*t#Osl@j2S|#gS+jsw1@~dqyRAqIw?NPCl%fn9lA;ZGj{q+Q!xhT8j z9F-L5m^tujt75z9v;*gA3ETTVH@8|vk;C7_*a(ecT+Ti3ez!BpuYJvTCgP}BrAW52v~1P7#C5Djq5DI@ zlZrnkf+~Tm{iiRx^5V#Xm>*fqDw%w2*myozR^rITezyxo?~N>y1FgM`t3>T<+J=|4 zevth5KyLjdPkWrXb>6!;TkZaEz3C+uLOQ?qq%@HIZV6e_Z=y|hy5^{jR<``h_vZ4K z-{`q*g)`=x{pyeyv(Q?ZMJ@ae+6`9OS@z~oOdd2XMbwJJUorg=;T8DduSo$;$;WM5 zSDG!@Dc~UpMP)VSS7^y+s0)S6?wzK5R6PsvbleV0*8w&h%Ur{P0JUScIDA9O(E6Hw#b?HPkrx%ZJ{h*l`0Yp(?5sudcwp$*_J=0z9XchVmuY~-5vz>A@usF2b z79IzQ07BTL&X7n4A=SMfn9fgi!XB)tz%bxHriH=&pW6l_e+x%xKRr012bY6}nW^9g z{53yNma@X9&?l42(_uDsi^-mAQMiiOY*J~K>?N7UIqI#ieqH>cLY#RrFJ`^l;A`i# zaiC-4d`vGU_TMQ?cf90BtO5rkvqP#8EVut=bxp*mjV8JKihQiY9&i6|~Uf{;ktiA3>WM6pz{e+7# z8G$pPtn{;@_y0yXet3qUm|XBlVaWJ`yACZaNc=(Dxol>O=InxyU2NV*X`VGTq^mlt zmEcU*ChAmxM?D{1$1Zt4lLB-3_1E7XjGcMdwLa16TDO4vV@i8Vo8ba`QM;jJnGf)s zv>sSx3Lmf?TLzTv`Cb5Vb0d_(DNGtYzL#x8%7e7m#%XOoLk)T>nkaW{TuvkEn(L8+ z_m@LdkbRud#6EnD1UeTPtaSSmv`BcRdkY*7Yy#8dg)sD_%H0RQ7r&5%B7rjV;lp#6 zeXMGrz(_!MT^;-(&A|jdO&b+Cqd9T`!m~rd#(VBfb2{W$a7dd{0jfGfDwi&Sn0giE zf_}ecw68*Tb)=sFX!ABmg7^Yfg4T-+7MA06C}rx}NbJGiI~kqkqSPK!eh$i5RC?-> zh5}s&&++4(b1ovT3VX)O6+=gWoKat5pU0`N5k8Rcn0Z%n-fxvLO4+*94zI6!(Sd(>Ewuw%tS2%9}-R0i#38 z@ennrHGF$|r(mXvxtkF!59G1xL)c~iDCYAl>wn>0zQOkfah~nUF(c2}@cy04whF-+ z=M{n*2l%x=QGEiHb;DOiNqgJHSq?Rg7%MH8&Ct!Cg93P$0J)MiTafY&pCo+ehjKpI zZbF+mE#EWEvX!amq;CFSz8fqV;68^&u|tU(5zc^Xe(i>)Ah!dbrVTcbq;7{Q1>te* zc4GLW?QmXnt?2Qo$2cXUAAFSqf-$Ahb^{gJanZ9(io1TJNr0?6k>lbK9y;Vz5~QwKj+;C{=&isT0ZK=|i@-xlEZ%}8`3+43gRF4v zV9GzLcyHre@{{(+iy~H32WEFp^Hhe2rz@KAyF5fsolTx6?q2F;q7*C>O2%~#}XFjHXi63z1+5COjxl&e# z99ZZ7zxK}huc`kJ`)5gaN={NrKt&LQ4e3%8>6(CqNOx|80+I$uhaaR%r4<;8AcBCj zgqxs*w8UV8?cVqP3+_MQ-cS4CJkIub=Q;1!bv>^H4OaaZU=HV#e{vHmSeX~M&0o^$ zuRV@EE=IVS9SW(WY|7i*75-%8-frb=v+3JlUfN+d%@tBwQzLBg+@hnivo$92U8oHa zb$hduP{T&O8SpVB^Ji6%#s{LveD{&3JB-=O^vzk*bf$E0!|kMI-wP!5P$AzNPoBaG zB>@_&zRBmtcjf2r)E4wyf{`{V%iU}K-~<1w znVzHfm9azWOTE5p@qtBDC-PQ3sM?CI!BtB0mMI`%f-{E=**K>mv=Eo{A$%Y)kh%UW z_SCrAeSFiR&zhE@#;v*{mwvMLn)L^{bq9w#da4AE2cX(f6k`bY&G zxo<2%Qw3kwY1w0bSVuNY-(wE!)_c*ae7+vzYSpgoDgaqjCCP-nYl0{gTDD~HN>cO^ zcDyBRV+{9KeRJLQ|?ybnL!X6RX7dB6?ih-8Awd`nbQ=1`# z9xJxqyj<2F;t~tFRG&gU9(IOrM_gX<_w)0Q+ohc!^x})( zmDUrt^(6lItpy!lp33sIZAtVu zs0B46jMzm$dG}U2UsnG*Kd}Jzr-JoMQzISrN^}#wzkp^2OLE@nx5#B8W`u}*cSz91 zb+yJtO(9C#X1paIz;G^s)U9jpPpRkksc%WtEk8S}6)>OBdr%rvX-qL#6$gz6jgtNg zJ6)S(++9l7nmO}3o?^+QGc3xLyo2DNuhATQ-tYgk^u=N4IX-C=1eCD69*c?NKVSM> zB399?)OBVerj*mwY`F24U!A)E*Hs>cH_K1b7p`(_KzgGm^-xA1n0==v&n>M`kJJ^a(YrfR z_0!iAa`Q`K9%>9!^AJ1>H-1Yt+J(;(dXsX!m`n#j#B*2uhXQ?mzBG=CFyV^a)LaE) z5BK2=;58jS?FSsV`o{(wb=Oc%b{>oT{gY4P8yRQPK7Zh?QZ_L}2k+)H?&_8OP`(EW ztA|lrm+V!gc8TxyK+InJnlkH3rEIv8VmSjP!ez=_d&A3M=LY5J+$dp}u@k-zQGs#`Wp-|D+@ZO#$<&6C!c(8JJ<(IE|i;iRb^fkazPpM_okkalCz;NGh zZ1(YCJLvm<$v!s|Wof_AvpMG|pcTtz&;wb3 zO$A4uPpAHyzr$)rkAEJldv9M4oUf-geP8vOgWrl>v7TxuNtUAPOczW0jKQMjwTOtruI z(L`RBrMeZCK(vkZ-($Uxb3L|KG0orVr%prS#(T3muDhJQnNL5u_4TGSm&#)a<2S(1 z`<7KzD%fXW0RvnMv|{ygg_+O8!jEUrJKiW!b>_&dFl7jQc&n2ZW^}oS{vh(hBQWY3 z?bW5~!j zIQS#5T1BWXqn`?FE!MATDCMBN@*&v$&%@1yQgx0IQ>~Mp^#8KGbr^?SU23a#M7<4M z;~YsW2O1Z~tkbv8R?g!x9p!+i{B>Lhz2|$+n%iXMdyIp+rU%MdX|Ts1iFBZ_l^C99 zHm28`U~!!0YP=$t;On1SBmUZ%hdq_7u>AIuZyDaSiguxkUp1#|{F6x6VsjlZ5GYrB zSr(8<^)~|n!96q@W)m-VP?Sv7-dA<$JdGK>+g%bg#AA$6c&de)6i>xPZtjm2Y`-%m=s$q)O`Qirjm2R%hPThlb%uTf=?Rc6S zsLyhY2tW8mX9ZeyS0bi)-)Bk0%0-zC*rkPg)h8(5OZe(ghPYmAY+yX>UFPswYs$-W z*Xh~@iUY`VSLwJ)!cXh1mT&}*-rHQlyS*%^;A0~Yz4J?p+F|>z>ObRA0u2uav0Xe3 z9+10`L=x4*F}$1fMwEIF+09t7K5XAG_$2!%P2BtlLndOXemQH6n5uYcWJ zj-~_)x4_L=STVfbo0DR|&@3mdMwtUef(&X>Z}-$vZwm0keW#>`IZGQC62E#;V_k&K zc|JlKw8(X4?onMud(Pi$<;aLqnfG>lJCo?t7+)Uyz1bj|m7=+~Vd1QyI?`^F8E?kG zGypfi#$Sl8ocd(*+r?p5E4(mpxzMg;H@rNDKGN~O(f^t<>nk!Fls$K@-b8n@7#vR! z!!e}d2c&vQ)6`YBo>5TraEzXU<+G@v=dASq#FyKzGhgr!%oih|D zxje9;Vw~?IcJT|%9er4E^kdX3GJ;wEf4YPWX)qcHwjbr-? z5`L_ZY_N2<>B!mB2h@eWnPKnONY{?dI;69Qf#Xw01mVvz4~U~xL2_lQczamzy1cTF z5B7OzNnJ7dxuRudaZ~LYkJ)nv{ZN`WXO_NKc z^-bj2A=m_^ax`w;O!HM14{jQkt7RkT0|I`Wr0v+NnxHtX+2z6GS5L3i{Q310WG)Bz zv2D|VOG?)=FWMlLpf`J?dXS{(VOby!6ZNg^!(HV?w2n+Jbtrxder(<{KhP@6pf^ZQ`QnmrefF zn#8>dzs?Qa{c&d|1lhzh^3li>W$H(r_ld_m(1waz!O`;r2lKrVZ3=Bsnl-+DO{;c3Tss z_r%LdwMbgY{4GCvOBCF1wrOKZR?Vlr^`>qe+q!^`U~hm)Mj#0L2CPOqtN}-#wa&Bc zv>yykGonN1XrhBw6{Y|Fq$(s9wO~nMF<)Okh(`JWwoF$VCIp(@J_{5|!m2FgJjuTg zz(a9<^~Pu8PJ)%l+g3w3BAYN&d!jafm&beZVAdvz=pNJ`CQvB7jNut#;@TR!nL`6V z&7?aSV7eTsVe6+!r_+xg@9ZT!8+3dy>uJSWMA549SaNAtZd#yvO3Cg^8x1PjjM(ml! zCDBvoZ@fF@Qowj|=1}V^uDXP}zpIB3kmm<|Zh0r%m(3<72_cpea{^lim%8T1R^B;d=Cbo@@~ztG#H3ALv5dsO z-sFhHAgmDW9=!L94skX#BBc)R2TNQBcrJjW8~*1>>PNp?!zNMH46jJ^^7Pcjza{;g zC|>5cQ(Rv+X;Hm&R?S5NKCQ<*r$Dmp;IOgCYtF~81_>m!d-6j~0-UDVX z!HX)8Mh}c^ggKs8ReoA+O_M}OG76JV19n0IWxHNH;{3-?@P*Ef;*c)?Fd5%C!~ z9^~;#x=XI$nEmRNFjgSE{WyfK6k%+C#(Ez%)($)pdBW~6cI`XXxUrtM4B542SUyuz zgcq#?^7pnrv9m1e1UIpz3wjDYy?asW)l}r|P;klt5y!l`Hqz#m-&BdwZq}__oco&M zIlL59;c9)^t7i66U$+4zEOK-!rZs?nOH*+%w`9$#Hi;Q@yr||{s@X`>mE*eH>h7XJ z7dAt@d)V?Zq#*wtK_n_4i<;dZm|qB0%VB|EF`0N1^>6$69dMsosTDhu zfiA2E6$JC2e&aHW*bXR>f_B0UBPiVQZoY zTfG)G720?GwQ|+acW`icXEVxl2rSycL=TO}#c?^VVz`X#H%vRzCs2zg2qh-N=Rrom z7?}RkCxbZQOq$*fYWE(NJeLVlB9ifm4j=`ks~}}hFfoP9YG8BP@oK+sb>6pD6C`KY z(#~^{et}v)rc2v#Ytb13crPHbr&li9i-JD3}GcQB7ooB0R zW+8{Yk$R+}`TEA#RO$U%rN4OZES8eCj25GviRpX5vwFrgDFUmTfL{cC^mkp21B6@W zx{8w5kt>*6OyJ=u0AbWL0Uh!^C#H{gZRq2JltB&-U`uKs@ zKBXlEI9f1oIux>W_BccXBaKAj4`gk+BCi|frQpP@thpL(N_?$nb5U5he8+{;JI*E| z6)QSQzoucnmH!p(4P?a+Xr1i+JwZ}jEE^vxURay)seL2DK`_JyCXTkl)>>^sfs9i+ zIUE%;6-AjaKpuUzFFL~5=>4O-IlWD|WG%;tbzeUdU!WCBL@%$qC3L6bd57+5>Kj-T<1ak)F+BMH;N~y506R z);Iil2FcqC{6%`WP3aEsCOMvs^#Cu*9iy!arAq?+K-pcvYSsO>DU}9lH!O&TGK9-v?+72)-Yi(f7RPr>t=4?es`#+;XY|AgzCgx~K81{M znqT_XTv>iW6i6}9#pz00E`^qa5e!MXgQ|iJNyryNFr8P`Mi#fbSF}EtrlzziK6Tu%P)dfx zT=_Ll=s|-$PU{xSm$5_Sah(#yan8Ae5>ai8n4HGQKt;i zAmJY;4{A4L_mHLAZ&pw$&o5@`gPLB0RK~n6y(Ygkl6?<@C07# zKz*oCjSX4VTH~3zw|y;zOyA&#dix-lHCH#Zp>CS}WLmZ1Dl1N0I?pkhsW;?F1L{;I2!!OUZ3_ZDk}77)x=O<~p#H+SmbGu0zx}QXhtF?~&GxiVg7LY7wG8}(f z;`t{nei^@RI9<6QfHP_zq9T$|G_( z3%&k+qT(c}i^r(;rzqUb*TI~RQz|t)ck%)-`Tq58uEaS2*hC3=DKNgi;S%o(R=UQ* z2&?v82<}?tJkvsL4*1^K=ZK zlNAR3!o(tSp;y4yj;E!aYZ}78vsKd-2H!C+KvmmJQv0*8qYjt>d;D1x=2Y2@gk;vk zxX@~}yeB=c8F1$EfDLE?V!5QRO<+{p9+$SJ2^=95mN16Gi0Q|lVTR{Gbt{=>UB-t} zv;)w|3t|QN)&V#kKK3ebAojFjM0#VtH`Uy=0u=E~s@CX9Zkv?SMW6|KF#PFG0?%vG zI<`DmNo8-M0tKqRU3N68HP*?{z(oV%uRkgD|K`1`@@d6eNavTz&EUp(u{$+#b2>vB z6L4+rHI+cv_l*pY(0d-nsn0TF2fDy*s&F}hO#^-#g=Q~UvT)Jx&JO*Sv>Op;pRiA) z;}yN}*Cj_T+6i?%I-$H`dkJ>e19l+~&~NXTl--25WAJh)89yHL4DN8gEOGkz(1#ZI z*pnWMTM;8clOshM;7fK0c2Tpcvsdd`h!7P27*su5eRMM)SrY@F8 zX|wxH&5;6h-T=8!ZUvU@4)FHLd|2!eX!N+4t{@}s3S!r@4?4S3+zD-U3_a<557i|Y zD1+i8v7V8PW*JV;^?gCtd!snbU;H#S&%)wv5T)hPBRRs`9&KM~x+=+N*)JXgIlZ>T z`SFUhpyds@?|vXv)Fa%Jn_~9d?_u3P1=ro`9OlVPzfP za#(YUd-bC_B%UI*ollaDEB{-pUvV1$d+Jjl+gj?_+42BOSE%px8-2*MIPlbY>|Q(s z;^qDXb6?%`!VRvjE>S`!Uv^|04#KQ}VuTjwy=a-VJ> zq}(rFF5T0;9d*b2ebn6Xagnd1HXzzw_*wgpQtVJ9eik#?axbM;GfJPt4|P17(o-!bm0F-^jb07pn4_-J3t zZpH%jAGg|EVv^h!@Sivto0n?~RY#5NGEMmv1-l?@ujGyS>bJb~i;7aZqivO%jNfO1 zg~wDLjhx#SoCzzD3#l7xDLZ5--^mf%446dLg9w7e;53C~(B4M$B7Cvqo_`;*FY&^i zcTK;-q zC@j{oe=MkPGcTXLCuUFX(#cY2bdG06!#r4Th}uDknl*~15g|rzwTgc;Q;iOsd44hK zIxFM#x!$-Vx0zl6f=V>W7$;1}IF42zv9=lfVw9nq)R7LQ^OEMfz%D;Nk0we7UBW|04+0i5C%OybMKF_8uAv! zaPER*W%TQADG9^g^>suH7chU;zCD$h)GCT)k+^GSeuIAr)SUH`XkK}U{Qb)BJPHrG zS}w&aZiq`fx&I~?tHKknB?&4aCH0U7iKkO^zJobQ2Zs}!LIS{$q=41Ds%nHRi zH97$<=D*nTii`#w>m(;Wnrl0Pp#Gqa;MGTi;PTQ)Z}?Yw23dYEX#B$=$b*#-FaR68 z`n!W+94h>Sx%knmH5aQFti|c@mm_-1Qi#;upLu6q=1%q(+gTgV833M2=!D|^*87U5 zz6i%J3fSng%&1wWw<}Y zeRVAvb7x$LUR>}6)p>n)M}^;5p+^xe-+w@Feg~mPofuTj9fNMMU#SUQVmoW7ss3yj zP5(?bgzknKyLlNub_6p=8z$4fq%(?_6c)ODIb(QUJr}&yPLRjCyUv z=K?GfX+)m1t09?HXcs~~j~++6BDa_+|3P(!C>QMJoX^|tUjgn-tUX^zCl z7a+3>e%;H}qn!?p0e|+VbQIgsV|}8Km`>#3;Xpj>Pw>axmoeKU`=6wIKFYy-#Y~{e z60x!T3C8}%4#t!Nh!#(B09{dOdJWQhLyXz!ns$S4UiS$bQ|E_JzBki07UaJC2Cvc? z)XKLffSZHx0CeyG!cIj>LECR2B-p*0v2k3LSpEZn*1G{OH5MH|2}t3kO!r^$#xc^p9ek&5!tBx)7X%`V#D)L+92cj* z-)K3rep~h4DJWD2^}G!C7svBfd-X@^g7sN0;FZQLF^;!SFuZxaJvMs4Sl8-}V6{Jw zoL587oqI>x#6`3DhL>4Sv4{&(wJE<`Z?P-m1j5k0=kr8RLMo9*{y5QY)nDq(nWJ!e z#{l2b3o>~9_f?obuP7{g5o@s38osW7Jbwi*M!vXXQIGsQim&S4iM^np^jScOV?^*d zc7A6rY)Y<}IF2ugr{0@bzomDFvT#__f$OPfr3sHf*a9ynFDo4C0XiW8Y~~J>(*;(? z9UOY5tV^S7=o>Z{8l=d+X5wImB1pC9Rr&)9Qw=Ktjncd9+&1(wm^UGs6N>BBxGkn1M#C*rf&Dij+Nr29GxAwpJeD^G7HSftSGjO%uCQUwQ`pD_-7M^ zEBHyrJ;4R1PHh$5ctS^mxn-lb$n&Kn1;`VVp}TJ_QO_R&If0iYfP&NX!pn#I7;-kU z{9?@XJNaD*`mQnS5iMEd#b5A)J$_Rb*1jEA-*^ZS-?nN%dnWX*?78<1b|xI^6Kj_5 ztm#Hl4U|8oWXga67kVIr4%YxksWb&c2H-FOspwJs=@ef^)M;D&jdTEVG=KOsCr{+{ zPf(#v8}1RCpdM5LBmGl973i(ywGVm53@nHj2lJI@FOm=yHcKdJ_maPl#9GdXYfZ-) zGXh3@s;uTrOH{=W%-cpsWnMv@QuY1dt;<}w(SBv6Y%I;okxa?Nw--q1Zg*|O0SI3! zKzNWr;4EGBa#gs?G3}IvOP*Fh(2&XJ89BAf-v9#lW6i^EqYMZ40<>lG8OFrR^y98* z2YRO2ie65!Ewz>Xs$%jFE!=Vx^|!m;AcaIyb4J?3Ii5g^%CkwYZt$M`AU1 zRdL9vV?}bA=$%Yj8&0KE7IFf*|o}HuBlmD^9F&B6JY7fYwlN%Y2M2-BaBG`s3a@t(z?m9N+B6Z*uT=v&O zV7bJ8mZnd21>0|9)bp}KEPXI*)YEsO3x~S~ANVukQUD^wbLdwWv1(;*wEAxsri^uy z97!UeRQmT4ja5Xh%Phxq@Pmz^yNP}~I?qFIPCCeisPvJ;4kzCen?-u)uE4*P+MzS` zCS?7Re{-8H4!!jF_UCDg8lE(EBJ~E-uZeAoL!|-H*7YX0gxWW*Y@CddR}$3o-WU#W zFWgdxuZLv!J3ri{)6G3c-PQc5cRr0c8&+A&#|{`Xuf1i{cl**V@$&jQ=OJOhspclN zBIymm^xMweDEX-Qle24MtJ7xiZqY`_uIhR${8V^Xus#WXmJ*9W00Uqt5eq0*98xWT z?)+fZ;*-!ekJWzNYF5(3APE{mK{pfr?PXT|T^7Ad*YN&ogjoM`r>}0j1q*1}3%Gd3 zr>Ag6_Hj94!7Sb+^&c}}Z?v&4j;k)}pNjXK*G(p~vTjDnBtTF|x!phsoEecJiusPR6^2B^h3-Ps$YN|@{N1<<1|*!^Cz(T0s%D((Jx+Jc+UM_ zL=f@iMK-t{D?4C=ywdM#*G(6;f71C^)xl+31BSUdu_Luxv5{!#!m32D*j06>_(k+z zp4v`|c_&*C{4F*a@JD6fGg}0hIk1iRkX1`0MHBgNqkq+J{LH+shmBNlQ53w}MzmBq z6HT=VH>I5e!<8762yD7EmXtrm@59OZ;eRE^C9OMl>j|4u(%{ziZ^86Joh#0hbH%r0 zyH=O~;(A-O*_~eSV9BRhSM|*r7CLSNjAHXNv$f^^j-yHW`oy1`2^T-`pfzz(-{V`N zYYqn%fNHE<7wgkFZVUAm5wz0F?dsoFOLgepw?o|YS_WrF$7*Q|$YYiiC@NBs0|p_n zMSg6nWfIw6OR)Hc@c@RuseN;L(yzEGL6edJ;;OMH@PfY{xRQy}^J{D~Cz)~7H^0fq z6$V@u58@FND@mAq*?s!-eF-_fWM;mt=pu-E$p)4den|;^j{jdr5ZA$V-^3R?IY(vP zON2uHCQ&g4eu9Oe_V5Q$@pH=m&VS}8=Vb78e)w~su_?W{=f}!>W_@|Vjr%Ogwt&mB z+|=B-;4SFd`n7=7M=h}sVEyPE*{z{e^wG zM2SI)2wx+}gPvuVuD7uG2A$oDi6H4rc4U%x55F*t-j*(m>ZXgyrfDmnKS z%={E&l``CX)7hYNG|M23aUmD+Yc=~Yd0vdp?utM?%dL@MAp+) zn9x==l8!U!*&S8q#=qXk#>sAtNs7HMkF$Gj7w3h$&rt z7UT5mN^}Z60K%iB0f0;4M5ciw%e%_FJE0*NMO!@knbi1Ud z>tzZ7BTu4S1{os2uJWK9cF!&rLtM3D%!w*3lBkuF19*pMLFAey_(b{nz9cR#U;KNf zU^M&tlGpTPesS{7UL^ZF;iFF*@9IhlXCIDuto5}7XkG(m*$T%a*+rx0WO4={MiGo) zY-=h^|7s^Z{FxcDfUsmBO%n8G=bRWzTg=H&Kc1Sg?(*m>nIwjMho!z@CglO_xXRn5 zu7ZOZ{OCP~TxmUjpAa5XN=bnhCdsU+1cbS{f6M3)vWuKnrgb^=hEjqg zE_bueo91WE4~Y5Sn)qHiGwNgZ5HCVa(ThM2jV0{G%70<#(}o6Vx~S3e>-3TL1P-~X zJmAr!YsRuy#c_>#msEC-jN*U9T4jmOdGMM=I&mr;wXZB>nvQx1GW|WQ+99-#>Huq$ zeK`DMcUbI6XB%Y{fAYKs^c+b`amq*5@6zE)RH!t7jXr#rocOl)jsxJ$GW$Rm1wQ@G zi&X}?lVkXsel~gcvt!@nfKwzM^17gUf6ALc&+Ee<8)Bi)bV|}~!D>ool0d2yXfLSl z^A6$5u(69|_ap&ls{jg)^=z8?9|LrLnPj9?` zd;D}6-E@od${s(1&A~}#3pDLKFuqe-(y{(Cp(Jv{ zkJ2khj3vah$yOdtENRJdZc5X(4~Jj0u7`n;BD$OmSnG=yQ4AMBmyara<0h`P;jCJi z%~=xSNe&m|^w{IlpD-CpfZyekTz3Zg_=iov!^*9-E!s^3a~N3=fGC{$jckr#PR(lzwaZc@{(#A<+8nbb^6}I?38kB?0p8BL2gq$W-58}Z&(@6^(XdldAO~F$IE^J;h z&W01^2u8Eegl000q}MO`qzjMNTz^FxyJJQavP_v>c;iC*lM}SsVt?JTFLWqp$J+Kr zIGL-WqQlj*2T(=vWO;mC3eLQg@F54wA4iLc#l@4<2cW}&lxiBez&GZODJpN*UMuKZ zPyT~gs;B7s(GOh5nSSKS*|WitcqBVE%^?qvFNER(85x?m8c|UHPQ-Q9ics7jo?OUx zPpoOG4m3%{LuBEEjJT1UN(IgOIzPW2hjZr1&AO$7|#F1$d7X`fq8F4lHY7rDH z=m8@XYtW3s;O%ZAaAnL1DHE*I` zJFF_SME1@KPTw93=vrGob+bYWgn%E%ev0ga5)J_hU1pughm)hO9m=j>*DuAQyb@Tf zsSD?di!oaI7qvt=_(`gBEqNavr>2LGKIYu(@mgUvu$0xX`uezIcj) z=-KQl*r!K$z{l8`{6VNp012mr77OvMy^N#%{(r2L>Wd(o3@Afu(7Y0dc`oy&+D6@g zyenM0E)#(5mop|*p8@WmXx3v3l=@VN5_mU>5%&6GWxP*K)cMed{P`<^8>NxO#TS!fY;ve33IW_#mL)&Yd$3@uQ^|K4C#YVxetWH=_)9pxkMEj^NjyM zvR)L2{O^_&U}6NVQbAuu^iu_;d}_DSrMSm@?swfWB;3q4}XaMRkw|u)!JA@qQt8R~GT$4RNf1a=1MjO&L-xxDVb2cIWBG!qB3iXw^1d zl^9}P2#6w2TkKVKT`yY=E1(9kzeNBstTuiWlfjH@C1`p`u5l&sU*nfxwtegNL&>O~ z%jwZ&4BdhLh1vHV36N;lDN9nA@VKgC-Z6+u+l3dt{|d0&lAx)lj!3eEXuk&zv>8&A;r=kzw5^YOVH+) z#2bDP^zBlVF&uTr2$YAgVfWCI9xk|QU-m>;&Ll@Zg-Zpr`z5F?=lDcr{T(NvZQnqB zP4FoeZ@B%VhoRrH8!D*iaCgJJ5cndWSQ?{5z6d$Ui#O$!L6n$6{|S#iyPsjC&T(o< z_m@i#C>DqFuciB=Z}k*_ueV(+IC<&$@Q+E;i3G1SI`J8HJFedP@w8DnkoXJ|me%V6 z%DvJ)SvsihSp4&MYj273Z{?X~hqn&{;#N(-A^RWh_|ugk@S4kJipOliLGEL!Vlo;h zH$`Fwp=hq5I;*(tvTb|1;RHc(*e{)i=gncJ0>jWxPm?2{QdbaS!Fk)Cy81JQVnn9D z8)eUDj3(HR7D0%%>){J0*WcKm>U)y}dD3=-OP$926{~r5JKAC~k zv#aVE(^0aQ$`!|a>T)>^T`lZRg}VI}n$=LX#ir?o<<^0sg5 zN|-@JdGY{GL;`XeNW08l_wf?EikSl}`;3gBb&#N(&gd_jOIhFp{l~`p?&+8lTDK}l zRR=(1F6Br(ybl7u7*)p4+<$%-TPb#5`hFH({TTy}b4Z?TSuDBNMp^fx=?&C{@;~ya zMF)H_j;;gOr?;1{&&2z#9#xLg$7W0~6W#ogS0%ZyuDXv!w)N~--?|OHz2?TdrO6fN zYVahQA)_b-@h6UkEc`P|p}o4O2m9)9jg5Jfj}D9||9S7)Tahm&) z1wC&y8OS?qtK3u_g%(G~OnZxVet5e2CV6=z@}g@=*NcsplC;J!QAkBFq~>pWtW2ARe Kx8Vjl{{H|h@<;Lj literal 0 HcmV?d00001 diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/icons/icon.ico b/packages/hoppscotch-selfhost-desktop/src-tauri/icons/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b3636e4b22ba65db9061cd60a77b02c92022dfd6 GIT binary patch literal 86642 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 AKmY&$ literal 0 HcmV?d00001 diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/icons/icon.png b/packages/hoppscotch-selfhost-desktop/src-tauri/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e1cd2619e0b5ec089cbba5ec7b03ddf2b1dfceb6 GIT binary patch literal 14183 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

5l#v3A#xI3*z~1~fvo9Q(N^(==!|_FZ z*duZ=+M1~)8E|otX8KNZlr?qels#x_1Xq@9IIw~@9uAREJVH)Xw^}UclF6327}E42 zT)E&?U%TK?(+K7%R!`H5oX0i)4Qn5??Iw3p5J~6_u+aWehY{DSn}3V2p$bgjnAu?o)v@iC254fXeMv50$9YrpU`N?u@QIWs)T?SP|fa}(|9 zqAX+!7`cx=4)cCBg5h~pu(?@9`)aCr#oyz$ld=#RFxYCNZCZls@4v2~*e-t6PEVvV z&bbK3b3wt(Coc!ufAbXXC<**#HQ%J9k`New6iG<5RjtO4XVO?dCvwxD{kJ#tfQr(X zg^NTwF-FwAeS_{V4bfel8l`~NbfrTR2s!G>WduFWxH(t~aK4q=6rEE^$+Uox>gJO2 z{L<;6Q6nHa5#ZEM>H58not!)z(6*_=^~8}jWf*IG$AUKVWOZ4?)GfF z+BM#*wKKmLFD7E~W3U!$IVm$k_k1f&Kz6WV8@55P?r~bcg-Za-!rvW?ns&)KOGT2~ zlkAyqhQj=P$Eg3w#K~}zH@J5bo-BfHjInKSz$@?+Z)NPD4pHj^_Qxmi`UqoTy=`sV zLVxrXGuBr=QRm|}wg75yetQQK4fY3#P_~J}zEfPnb2C4Wo!E(d*(cA;b?7$g2in<( zPn)ghX}nzJPmb6(3Dpeg_GW~Hc}Lt=lgsSZz z!5QXyz7KaR;D`3Ee}d`af{H>WWZ|Io1QI3~4Ll_`g1(cRnhLK73Ro)7zPCd={1W2x zRp%Xlvv4>!<2@}$hz|!V{T}_eHx2xkLl^hQoZTCnsjCl|W_@5Fx2(+j0ogy&Y+;L- z<)G$*CiN7hOm^s!{U>1F7U=iNk{+u~dAC!eDz%=|glFW0jEZU1&o(G_c#wTxUjnG} z#cg3>jEpUi#Mlq@t?Msg_#geK^Lx@DyHWf7=AS5vVyM7YOjvUVCfcpVR<(+5!H?9- zySI6s>o3m&*zr||=wcPGyBkQV`EWJl@bH8qobjOp+sXL*)=&yX)8aAbf~tGv?a2SN zu^Ddo-z?DWk9h9Yz#5p^NU#x~wYSd?H@w@!2Gb4G)6-utEMV~~M85Br5ff(v5O1|T z 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 WindowExt for Window { + #[cfg(target_os = "macos")] + fn set_transparent_titlebar(&self) { + unsafe { + let id = self.ns_window().unwrap() as cocoa::base::id; + + set_transparent_titlebar(id); + + set_window_controls_pos(id, WINDOW_CONTROL_PAD_X, WINDOW_CONTROL_PAD_Y); + } + } +} + +#[cfg(target_os = "macos")] +#[derive(Debug)] +struct HoppAppState { + window: Window, +} + +#[cfg(target_os = "macos")] +pub fn setup_mac_window(app: &mut App) { + use cocoa::appkit::NSWindow; + use cocoa::base::{id, BOOL}; + use cocoa::foundation::NSUInteger; + use objc::runtime::{Object, Sel}; + use std::ffi::c_void; + + fn with_hopp_app T, T>(this: &Object, func: F) { + let ptr = unsafe { + let x: *mut c_void = *this.get_ivar("hoppApp"); + &mut *(x as *mut HoppAppState) + }; + func(ptr); + } + + let window = app.get_window("main").unwrap(); + + unsafe { + let ns_win = window.ns_window().unwrap() as id; + + let current_delegate: id = ns_win.delegate(); + + extern "C" fn on_window_should_close(this: &Object, _cmd: Sel, sender: id) -> BOOL { + unsafe { + let super_del: id = *this.get_ivar("super_delegate"); + msg_send![super_del, windowShouldClose: sender] + } + } + extern "C" fn on_window_will_close(this: &Object, _cmd: Sel, notification: id) { + unsafe { + let super_del: id = *this.get_ivar("super_delegate"); + let _: () = msg_send![super_del, windowWillClose: notification]; + } + } + extern "C" fn on_window_did_resize(this: &Object, _cmd: Sel, notification: id) { + unsafe { + with_hopp_app(&*this, |state| { + let id = state.window.ns_window().unwrap() as id; + + set_window_controls_pos(id, WINDOW_CONTROL_PAD_X, WINDOW_CONTROL_PAD_Y); + }); + + let super_del: id = *this.get_ivar("super_delegate"); + let _: () = msg_send![super_del, windowDidResize: notification]; + } + } + extern "C" fn on_window_did_move(this: &Object, _cmd: Sel, notification: id) { + unsafe { + let super_del: id = *this.get_ivar("super_delegate"); + let _: () = msg_send![super_del, windowDidMove: notification]; + } + } + extern "C" fn on_window_did_change_backing_properties( + this: &Object, + _cmd: Sel, + notification: id, + ) { + unsafe { + let super_del: id = *this.get_ivar("super_delegate"); + let _: () = msg_send![super_del, windowDidChangeBackingProperties: notification]; + } + } + extern "C" fn on_window_did_become_key(this: &Object, _cmd: Sel, notification: id) { + unsafe { + let super_del: id = *this.get_ivar("super_delegate"); + let _: () = msg_send![super_del, windowDidBecomeKey: notification]; + } + } + extern "C" fn on_window_did_resign_key(this: &Object, _cmd: Sel, notification: id) { + unsafe { + let super_del: id = *this.get_ivar("super_delegate"); + let _: () = msg_send![super_del, windowDidResignKey: notification]; + } + } + extern "C" fn on_dragging_entered(this: &Object, _cmd: Sel, notification: id) -> BOOL { + unsafe { + let super_del: id = *this.get_ivar("super_delegate"); + msg_send![super_del, draggingEntered: notification] + } + } + extern "C" fn on_prepare_for_drag_operation( + this: &Object, + _cmd: Sel, + notification: id, + ) -> BOOL { + unsafe { + let super_del: id = *this.get_ivar("super_delegate"); + msg_send![super_del, prepareForDragOperation: notification] + } + } + extern "C" fn on_perform_drag_operation(this: &Object, _cmd: Sel, sender: id) -> BOOL { + unsafe { + let super_del: id = *this.get_ivar("super_delegate"); + msg_send![super_del, performDragOperation: sender] + } + } + extern "C" fn on_conclude_drag_operation(this: &Object, _cmd: Sel, notification: id) { + unsafe { + let super_del: id = *this.get_ivar("super_delegate"); + let _: () = msg_send![super_del, concludeDragOperation: notification]; + } + } + extern "C" fn on_dragging_exited(this: &Object, _cmd: Sel, notification: id) { + unsafe { + let super_del: id = *this.get_ivar("super_delegate"); + let _: () = msg_send![super_del, draggingExited: notification]; + } + } + extern "C" fn on_window_will_use_full_screen_presentation_options( + this: &Object, + _cmd: Sel, + window: id, + proposed_options: NSUInteger, + ) -> NSUInteger { + unsafe { + let super_del: id = *this.get_ivar("super_delegate"); + msg_send![super_del, window: window willUseFullScreenPresentationOptions: proposed_options] + } + } + extern "C" fn on_window_did_enter_full_screen(this: &Object, _cmd: Sel, notification: id) { + unsafe { + with_hopp_app(&*this, |state| { + state.window.emit("did-enter-fullscreen", ()).unwrap(); + }); + + let super_del: id = *this.get_ivar("super_delegate"); + let _: () = msg_send![super_del, windowDidEnterFullScreen: notification]; + } + } + extern "C" fn on_window_will_enter_full_screen(this: &Object, _cmd: Sel, notification: id) { + unsafe { + with_hopp_app(&*this, |state| { + state.window.emit("will-enter-fullscreen", ()).unwrap(); + }); + + let super_del: id = *this.get_ivar("super_delegate"); + let _: () = msg_send![super_del, windowWillEnterFullScreen: notification]; + } + } + extern "C" fn on_window_did_exit_full_screen(this: &Object, _cmd: Sel, notification: id) { + unsafe { + with_hopp_app(&*this, |state| { + state.window.emit("did-exit-fullscreen", ()).unwrap(); + + let id = state.window.ns_window().unwrap() as id; + set_window_controls_pos(id, WINDOW_CONTROL_PAD_X, WINDOW_CONTROL_PAD_Y); + }); + + let super_del: id = *this.get_ivar("super_delegate"); + let _: () = msg_send![super_del, windowDidExitFullScreen: notification]; + } + } + extern "C" fn on_window_will_exit_full_screen(this: &Object, _cmd: Sel, notification: id) { + unsafe { + with_hopp_app(&*this, |state| { + state.window.emit("will-exit-fullscreen", ()).unwrap(); + }); + + let super_del: id = *this.get_ivar("super_delegate"); + let _: () = msg_send![super_del, windowWillExitFullScreen: notification]; + } + } + extern "C" fn on_window_did_fail_to_enter_full_screen( + this: &Object, + _cmd: Sel, + window: id, + ) { + unsafe { + let super_del: id = *this.get_ivar("super_delegate"); + let _: () = msg_send![super_del, windowDidFailToEnterFullScreen: window]; + } + } + extern "C" fn on_effective_appearance_did_change( + this: &Object, + _cmd: Sel, + notification: id, + ) { + unsafe { + let super_del: id = *this.get_ivar("super_delegate"); + let _: () = msg_send![super_del, effectiveAppearanceDidChange: notification]; + } + } + extern "C" fn on_effective_appearance_did_changed_on_main_thread( + this: &Object, + _cmd: Sel, + notification: id, + ) { + unsafe { + let super_del: id = *this.get_ivar("super_delegate"); + let _: () = msg_send![ + super_del, + effectiveAppearanceDidChangedOnMainThread: notification + ]; + } + } + + // extern fn on_dealloc(this: &Object, cmd: Sel) { + // unsafe { + // let super_del: id = *this.get_ivar("super_delegate"); + // let _: () = msg_send![super_del, dealloc]; + // } + // } + + // extern fn on_mark_is_checking_zoomed_in(this: &Object, cmd: Sel) { + // unsafe { + // let super_del: id = *this.get_ivar("super_delegate"); + // let _: () = msg_send![super_del, markIsCheckingZoomedIn]; + // } + // } + + // extern fn on_clear_is_checking_zoomed_in(this: &Object, cmd: Sel) { + // unsafe { + // let super_del: id = *this.get_ivar("super_delegate"); + // let _: () = msg_send![super_del, clearIsCheckingZoomedIn]; + // } + // } + + // Are we deallocing this properly ? (I miss safe Rust :( ) + let app_state = HoppAppState { + window, + }; + let app_box = Box::into_raw(Box::new(app_state)) as *mut c_void; + + ns_win.setDelegate_(delegate!("MainWindowDelegate", { + window: id = ns_win, + hoppApp: *mut c_void = app_box, + toolbar: id = cocoa::base::nil, + super_delegate: id = current_delegate, + // (dealloc) => on_dealloc as extern fn(&Object, Sel), + // (markIsCheckingZoomedIn) => on_mark_is_checking_zoomed_in as extern fn(&Object, Sel), + // (clearIsCheckingZoomedIn) => on_clear_is_checking_zoomed_in as extern fn(&Object, Sel), + (windowShouldClose:) => on_window_should_close as extern fn(&Object, Sel, id) -> BOOL, + (windowWillClose:) => on_window_will_close as extern fn(&Object, Sel, id), + (windowDidResize:) => on_window_did_resize as extern fn(&Object, Sel, id), + (windowDidMove:) => on_window_did_move as extern fn(&Object, Sel, id), + (windowDidChangeBackingProperties:) => on_window_did_change_backing_properties as extern fn(&Object, Sel, id), + (windowDidBecomeKey:) => on_window_did_become_key as extern fn(&Object, Sel, id), + (windowDidResignKey:) => on_window_did_resign_key as extern fn(&Object, Sel, id), + (draggingEntered:) => on_dragging_entered as extern fn(&Object, Sel, id) -> BOOL, + (prepareForDragOperation:) => on_prepare_for_drag_operation as extern fn(&Object, Sel, id) -> BOOL, + (performDragOperation:) => on_perform_drag_operation as extern fn(&Object, Sel, id) -> BOOL, + (concludeDragOperation:) => on_conclude_drag_operation as extern fn(&Object, Sel, id), + (draggingExited:) => on_dragging_exited as extern fn(&Object, Sel, id), + (window:willUseFullScreenPresentationOptions:) => on_window_will_use_full_screen_presentation_options as extern fn(&Object, Sel, id, NSUInteger) -> NSUInteger, + (windowDidEnterFullScreen:) => on_window_did_enter_full_screen as extern fn(&Object, Sel, id), + (windowWillEnterFullScreen:) => on_window_will_enter_full_screen as extern fn(&Object, Sel, id), + (windowDidExitFullScreen:) => on_window_did_exit_full_screen as extern fn(&Object, Sel, id), + (windowWillExitFullScreen:) => on_window_will_exit_full_screen as extern fn(&Object, Sel, id), + (windowDidFailToEnterFullScreen:) => on_window_did_fail_to_enter_full_screen as extern fn(&Object, Sel, id), + (effectiveAppearanceDidChange:) => on_effective_appearance_did_change as extern fn(&Object, Sel, id), + (effectiveAppearanceDidChangedOnMainThread:) => on_effective_appearance_did_changed_on_main_thread as extern fn(&Object, Sel, id) + })) + } + + app.get_window("main") + .unwrap() + .set_transparent_titlebar(); +} diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/src/main.rs b/packages/hoppscotch-selfhost-desktop/src-tauri/src/main.rs new file mode 100644 index 000000000..8d5d2358e --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src-tauri/src/main.rs @@ -0,0 +1,48 @@ +// Prevents additional console window on Windows in release, DO NOT REMOVE!! +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + +#[cfg(target_os = "macos")] +#[macro_use] +extern crate cocoa; + +#[cfg(target_os = "macos")] +#[macro_use] +extern crate objc; + +#[cfg(target_os = "macos")] +mod mac; + +#[cfg(target_os = "windows")] +mod windows; + +use tauri::Manager; + +fn main() { + tauri_plugin_deep_link::prepare("io.hoppscotch.desktop"); + + tauri::Builder::default() + .setup(|app| { + if cfg!(target_os = "macos") { + use mac::window::setup_mac_window; + + setup_mac_window(app); + } else if cfg!(target_os = "windows") { + #[cfg(target_os = "windows")] + setup_win_window(app); + } + + let handle = app.handle(); + tauri_plugin_deep_link::register( + "hoppscotch", + move |request| { + println!("{:?}", request); + handle.emit_all("scheme-request-received", request).unwrap(); + }, + ).unwrap(); + + Ok(()) + }) + .plugin(tauri_plugin_store::Builder::default().build()) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/src/win/mod.rs b/packages/hoppscotch-selfhost-desktop/src-tauri/src/win/mod.rs new file mode 100644 index 000000000..61b63f177 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src-tauri/src/win/mod.rs @@ -0,0 +1 @@ +pub mod window; diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/src/win/window.rs b/packages/hoppscotch-selfhost-desktop/src-tauri/src/win/window.rs new file mode 100644 index 000000000..bff1408c5 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src-tauri/src/win/window.rs @@ -0,0 +1,86 @@ +use hex_color::HexColor; +use tauri::App; +use tauri::Manager; + +use std::mem::transmute; +use std::{ptr, ffi::c_void, mem::size_of}; + +use windows::Win32::UI::Controls::{WTA_NONCLIENT, WTNCA_NODRAWICON, WTNCA_NOSYSMENU, WTNCA_NOMIRRORHELP}; + +use windows::Win32::UI::Controls::SetWindowThemeAttribute; +use windows::Win32::UI::Controls::WTNCA_NODRAWCAPTION; +use windows::Win32::Graphics::Dwm::DWMWA_CAPTION_COLOR; +use windows::Win32::Foundation::COLORREF; +use windows::Win32::Foundation::BOOL; +use windows::Win32::Graphics::Dwm::DwmSetWindowAttribute; +use windows::Win32::Foundation::HWND; +use windows::Win32::Graphics::Dwm::{DWMWA_USE_IMMERSIVE_DARK_MODE}; + +fn hex_color_to_colorref(color: HexColor) -> COLORREF { + // TODO: Remove this unsafe, This operation doesn't need to be unsafe! + unsafe { + COLORREF(transmute::<[u8; 4], u32>([color.r, color.g, color.b, 0])) + } +} + +struct WinThemeAttribute { + flag: u32, + mask: u32 +} + +#[cfg(target_os = "windows")] +fn update_bg_color(hwnd: &HWND, bg_color: HexColor) { + + let use_dark_mode = BOOL::from(true); + + let final_color = hex_color_to_colorref(bg_color); + + unsafe { + DwmSetWindowAttribute( + HWND(hwnd.0), + DWMWA_USE_IMMERSIVE_DARK_MODE, + ptr::addr_of!(use_dark_mode) as *const c_void, + size_of::().try_into().unwrap() + ).unwrap(); + + DwmSetWindowAttribute( + HWND(hwnd.0), + DWMWA_CAPTION_COLOR, + ptr::addr_of!(final_color) as *const c_void, + size_of::().try_into().unwrap() + ).unwrap(); + + let flags = WTNCA_NODRAWCAPTION | WTNCA_NODRAWICON; + let mask = WTNCA_NODRAWCAPTION | WTNCA_NODRAWICON | WTNCA_NOSYSMENU | WTNCA_NOMIRRORHELP; + let options = WinThemeAttribute { flag: flags, mask }; + + SetWindowThemeAttribute( + HWND(hwnd.0), + WTA_NONCLIENT, + ptr::addr_of!(options) as *const c_void, + size_of::().try_into().unwrap() + ).unwrap(); + } +} + +#[cfg(target_os = "windows")] +pub fn setup_win_window(app: &mut App) { + + let window = app.get_window("main").unwrap(); + let win_handle = window.hwnd().unwrap(); + + let win_clone = win_handle.clone(); + + app.listen_global("hopp-bg-changed", move |ev| { + + let payload = serde_json::from_str::<&str>(ev.payload().unwrap()) + .unwrap() + .trim(); + + let color = HexColor::parse_rgb(payload).unwrap(); + + update_bg_color(&HWND(win_clone.0), color); + }); + + update_bg_color(&HWND(win_handle.0), HexColor::rgb(23, 23, 23)); +} diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/tauri.conf.json b/packages/hoppscotch-selfhost-desktop/src-tauri/tauri.conf.json new file mode 100644 index 000000000..da68333b4 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src-tauri/tauri.conf.json @@ -0,0 +1,65 @@ +{ + "build": { + "beforeDevCommand": "pnpm dev", + "beforeBuildCommand": "pnpm build", + "devPath": "http://localhost:3000", + "distDir": "../dist", + "withGlobalTauri": false + }, + "package": { + "productName": "hoppscotch-desktop", + "version": "0.0.0" + }, + "tauri": { + "allowlist": { + "all": false, + "shell": { + "all": false, + "open": true + }, + "os": { + "all": true + }, + "http": { + "all": true, + "request": true, + "scope": [ + "http://*", + "https://*", + "wss://*" + ] + }, + "window": { + "startDragging": true + } + }, + "bundle": { + "active": true, + "category": "DeveloperTool", + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ], + "identifier": "io.hoppscotch.desktop", + "targets": "all" + }, + "security": { + "csp": "none" + }, + "updater": { + "active": false + }, + "windows": [ + { + "fullscreen": false, + "resizable": true, + "title": "Hoppscotch", + "width": 800, + "height": 600 + } + ] + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/generated/backend-schema.json b/packages/hoppscotch-selfhost-desktop/src/api/generated/backend-schema.json new file mode 100644 index 000000000..50f3f661a --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/generated/backend-schema.json @@ -0,0 +1,5088 @@ +{ + "__schema": { + "queryType": { + "name": "Query" + }, + "mutationType": { + "name": "Mutation" + }, + "subscriptionType": { + "name": "Subscription" + }, + "types": [ + { + "kind": "OBJECT", + "name": "Admin", + "fields": [ + { + "name": "admins", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "LIST", + "ofType": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "User", + "ofType": null + } + } + } + }, + "args": [] + }, + { + "name": "allTeams", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "LIST", + "ofType": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "Team", + "ofType": null + } + } + } + }, + "args": [ + { + "name": "cursor", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "take", + "type": { + "kind": "SCALAR", + "name": "Any" + } + } + ] + }, + { + "name": "allUsers", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "LIST", + "ofType": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "User", + "ofType": null + } + } + } + }, + "args": [ + { + "name": "cursor", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "take", + "type": { + "kind": "SCALAR", + "name": "Any" + } + } + ] + }, + { + "name": "collectionCountInTeam", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "environmentCountInTeam", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "invitedUsers", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "LIST", + "ofType": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "InvitedUser", + "ofType": null + } + } + } + }, + "args": [] + }, + { + "name": "membersCountInTeam", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "pendingInvitationCountInTeam", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "LIST", + "ofType": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamInvitation", + "ofType": null + } + } + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "requestCountInTeam", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "teamCollectionsCount", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "teamInfo", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "Team", + "ofType": null + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "teamRequestsCount", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "teamsCount", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "userInfo", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "User", + "ofType": null + } + }, + "args": [ + { + "name": "userUid", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "usersCount", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + } + ], + "interfaces": [] + }, + { + "kind": "OBJECT", + "name": "CollectionReorderData", + "fields": [ + { + "name": "collection", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamCollection", + "ofType": null + } + }, + "args": [] + }, + { + "name": "nextCollection", + "type": { + "kind": "OBJECT", + "name": "TeamCollection", + "ofType": null + }, + "args": [] + } + ], + "interfaces": [] + }, + { + "kind": "OBJECT", + "name": "InvitedUser", + "fields": [ + { + "name": "adminEmail", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "adminUid", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "invitedOn", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "inviteeEmail", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + } + ], + "interfaces": [] + }, + { + "kind": "OBJECT", + "name": "Mutation", + "fields": [ + { + "name": "acceptTeamInvitation", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamMember", + "ofType": null + } + }, + "args": [ + { + "name": "inviteID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "addUserToTeamByAdmin", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamMember", + "ofType": null + } + }, + "args": [ + { + "name": "role", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "userEmail", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "changeUserRoleInTeamByAdmin", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamMember", + "ofType": null + } + }, + "args": [ + { + "name": "newRole", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "userUID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "clearGlobalEnvironments", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserEnvironment", + "ofType": null + } + }, + "args": [ + { + "name": "id", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "createChildCollection", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamCollection", + "ofType": null + } + }, + "args": [ + { + "name": "childTitle", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "collectionID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "createDuplicateEnvironment", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamEnvironment", + "ofType": null + } + }, + "args": [ + { + "name": "id", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "createGQLChildUserCollection", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserCollection", + "ofType": null + } + }, + "args": [ + { + "name": "parentUserCollectionID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "title", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "createGQLRootUserCollection", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserCollection", + "ofType": null + } + }, + "args": [ + { + "name": "title", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "createGQLUserRequest", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserRequest", + "ofType": null + } + }, + "args": [ + { + "name": "collectionID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "request", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "title", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "createRESTChildUserCollection", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserCollection", + "ofType": null + } + }, + "args": [ + { + "name": "parentUserCollectionID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "title", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "createRESTRootUserCollection", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserCollection", + "ofType": null + } + }, + "args": [ + { + "name": "title", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "createRESTUserRequest", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserRequest", + "ofType": null + } + }, + "args": [ + { + "name": "collectionID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "request", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "title", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "createRequestInCollection", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamRequest", + "ofType": null + } + }, + "args": [ + { + "name": "collectionID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "data", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "createRootCollection", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamCollection", + "ofType": null + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "title", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "createShortcode", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "Shortcode", + "ofType": null + } + }, + "args": [ + { + "name": "request", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "createTeam", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "Team", + "ofType": null + } + }, + "args": [ + { + "name": "name", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "createTeamByAdmin", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "Team", + "ofType": null + } + }, + "args": [ + { + "name": "name", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "userUid", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "createTeamEnvironment", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamEnvironment", + "ofType": null + } + }, + "args": [ + { + "name": "name", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "variables", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "createTeamInvitation", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamInvitation", + "ofType": null + } + }, + "args": [ + { + "name": "inviteeEmail", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "inviteeRole", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "createUserEnvironment", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserEnvironment", + "ofType": null + } + }, + "args": [ + { + "name": "name", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "variables", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "createUserGlobalEnvironment", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserEnvironment", + "ofType": null + } + }, + "args": [ + { + "name": "variables", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "createUserHistory", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserHistory", + "ofType": null + } + }, + "args": [ + { + "name": "reqData", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "reqType", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "resMetadata", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "createUserSettings", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserSettings", + "ofType": null + } + }, + "args": [ + { + "name": "properties", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "deleteAllUserHistory", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserHistoryDeletedManyData", + "ofType": null + } + }, + "args": [ + { + "name": "reqType", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "deleteAllVariablesFromTeamEnvironment", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamEnvironment", + "ofType": null + } + }, + "args": [ + { + "name": "id", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "deleteCollection", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "collectionID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "deleteRequest", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "requestID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "deleteTeam", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "deleteTeamByAdmin", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "deleteTeamEnvironment", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "id", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "deleteUser", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "deleteUserCollection", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "userCollectionID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "deleteUserEnvironment", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "id", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "deleteUserEnvironments", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "deleteUserRequest", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "id", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "importCollectionsFromJSON", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "jsonString", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "parentCollectionID", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "importUserCollectionsFromJSON", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "jsonString", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "parentCollectionID", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "reqType", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "inviteNewUser", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "InvitedUser", + "ofType": null + } + }, + "args": [ + { + "name": "inviteeEmail", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "leaveTeam", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "makeUserAdmin", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "userUID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "moveCollection", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamCollection", + "ofType": null + } + }, + "args": [ + { + "name": "collectionID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "parentCollectionID", + "type": { + "kind": "SCALAR", + "name": "Any" + } + } + ] + }, + { + "name": "moveRequest", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamRequest", + "ofType": null + } + }, + "args": [ + { + "name": "destCollID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "nextRequestID", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "requestID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "srcCollID", + "type": { + "kind": "SCALAR", + "name": "Any" + } + } + ] + }, + { + "name": "moveUserCollection", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserCollection", + "ofType": null + } + }, + "args": [ + { + "name": "destCollectionID", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "userCollectionID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "moveUserRequest", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserRequest", + "ofType": null + } + }, + "args": [ + { + "name": "destinationCollectionID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "nextRequestID", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "requestID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "sourceCollectionID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "removeRequestFromHistory", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserHistory", + "ofType": null + } + }, + "args": [ + { + "name": "id", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "removeTeamMember", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "userUid", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "removeUserAsAdmin", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "userUID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "removeUserByAdmin", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "userUID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "removeUserFromTeamByAdmin", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "userUid", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "renameCollection", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamCollection", + "ofType": null + } + }, + "args": [ + { + "name": "collectionID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "newTitle", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "renameTeam", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "Team", + "ofType": null + } + }, + "args": [ + { + "name": "newName", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "renameTeamByAdmin", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "Team", + "ofType": null + } + }, + "args": [ + { + "name": "newName", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "renameUserCollection", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserCollection", + "ofType": null + } + }, + "args": [ + { + "name": "newTitle", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "userCollectionID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "replaceCollectionsWithJSON", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "jsonString", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "parentCollectionID", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "revokeShortcode", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "code", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "revokeTeamInvitation", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "inviteID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "toggleHistoryStarStatus", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserHistory", + "ofType": null + } + }, + "args": [ + { + "name": "id", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "updateCollectionOrder", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "collectionID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "destCollID", + "type": { + "kind": "SCALAR", + "name": "Any" + } + } + ] + }, + { + "name": "updateGQLUserRequest", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserRequest", + "ofType": null + } + }, + "args": [ + { + "name": "id", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "request", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "title", + "type": { + "kind": "SCALAR", + "name": "Any" + } + } + ] + }, + { + "name": "updateLookUpRequestOrder", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "collectionID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "nextRequestID", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "requestID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "updateRESTUserRequest", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserRequest", + "ofType": null + } + }, + "args": [ + { + "name": "id", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "request", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "title", + "type": { + "kind": "SCALAR", + "name": "Any" + } + } + ] + }, + { + "name": "updateRequest", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamRequest", + "ofType": null + } + }, + "args": [ + { + "name": "data", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "requestID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "updateTeamEnvironment", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamEnvironment", + "ofType": null + } + }, + "args": [ + { + "name": "id", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "name", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "variables", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "updateTeamMemberRole", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamMember", + "ofType": null + } + }, + "args": [ + { + "name": "newRole", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "userUid", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "updateUserCollectionOrder", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "collectionID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "nextCollectionID", + "type": { + "kind": "SCALAR", + "name": "Any" + } + } + ] + }, + { + "name": "updateUserEnvironment", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserEnvironment", + "ofType": null + } + }, + "args": [ + { + "name": "id", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "name", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "variables", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "updateUserSessions", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "User", + "ofType": null + } + }, + "args": [ + { + "name": "currentSession", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "sessionType", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "updateUserSettings", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserSettings", + "ofType": null + } + }, + "args": [ + { + "name": "properties", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + } + ], + "interfaces": [] + }, + { + "kind": "OBJECT", + "name": "Query", + "fields": [ + { + "name": "admin", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "Admin", + "ofType": null + } + }, + "args": [] + }, + { + "name": "collection", + "type": { + "kind": "OBJECT", + "name": "TeamCollection", + "ofType": null + }, + "args": [ + { + "name": "collectionID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "exportCollectionsToJSON", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "exportUserCollectionsToJSON", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserCollectionExportJSONData", + "ofType": null + } + }, + "args": [ + { + "name": "collectionID", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "collectionType", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "me", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "User", + "ofType": null + } + }, + "args": [] + }, + { + "name": "myShortcodes", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "LIST", + "ofType": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "Shortcode", + "ofType": null + } + } + } + }, + "args": [ + { + "name": "cursor", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "take", + "type": { + "kind": "SCALAR", + "name": "Any" + } + } + ] + }, + { + "name": "myTeams", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "LIST", + "ofType": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "Team", + "ofType": null + } + } + } + }, + "args": [ + { + "name": "cursor", + "type": { + "kind": "SCALAR", + "name": "Any" + } + } + ] + }, + { + "name": "request", + "type": { + "kind": "OBJECT", + "name": "TeamRequest", + "ofType": null + }, + "args": [ + { + "name": "requestID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "requestsInCollection", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "LIST", + "ofType": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamRequest", + "ofType": null + } + } + } + }, + "args": [ + { + "name": "collectionID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "cursor", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "take", + "type": { + "kind": "SCALAR", + "name": "Any" + } + } + ] + }, + { + "name": "rootCollectionsOfTeam", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "LIST", + "ofType": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamCollection", + "ofType": null + } + } + } + }, + "args": [ + { + "name": "cursor", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "take", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "rootGQLUserCollections", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "LIST", + "ofType": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserCollection", + "ofType": null + } + } + } + }, + "args": [ + { + "name": "cursor", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "take", + "type": { + "kind": "SCALAR", + "name": "Any" + } + } + ] + }, + { + "name": "rootRESTUserCollections", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "LIST", + "ofType": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserCollection", + "ofType": null + } + } + } + }, + "args": [ + { + "name": "cursor", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "take", + "type": { + "kind": "SCALAR", + "name": "Any" + } + } + ] + }, + { + "name": "searchForRequest", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "LIST", + "ofType": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamRequest", + "ofType": null + } + } + } + }, + "args": [ + { + "name": "cursor", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "searchTerm", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + }, + { + "name": "take", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "shortcode", + "type": { + "kind": "OBJECT", + "name": "Shortcode", + "ofType": null + }, + "args": [ + { + "name": "code", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "team", + "type": { + "kind": "OBJECT", + "name": "Team", + "ofType": null + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "teamInvitation", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamInvitation", + "ofType": null + } + }, + "args": [ + { + "name": "inviteID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "userCollection", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserCollection", + "ofType": null + } + }, + "args": [ + { + "name": "userCollectionID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "userGQLRequests", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "LIST", + "ofType": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserRequest", + "ofType": null + } + } + } + }, + "args": [ + { + "name": "collectionID", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "cursor", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "take", + "type": { + "kind": "SCALAR", + "name": "Any" + } + } + ] + }, + { + "name": "userRESTRequests", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "LIST", + "ofType": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserRequest", + "ofType": null + } + } + } + }, + "args": [ + { + "name": "collectionID", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "cursor", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "take", + "type": { + "kind": "SCALAR", + "name": "Any" + } + } + ] + }, + { + "name": "userRequest", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserRequest", + "ofType": null + } + }, + "args": [ + { + "name": "id", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + } + ], + "interfaces": [] + }, + { + "kind": "OBJECT", + "name": "RequestReorderData", + "fields": [ + { + "name": "nextRequest", + "type": { + "kind": "OBJECT", + "name": "TeamRequest", + "ofType": null + }, + "args": [] + }, + { + "name": "request", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamRequest", + "ofType": null + } + }, + "args": [] + } + ], + "interfaces": [] + }, + { + "kind": "OBJECT", + "name": "Shortcode", + "fields": [ + { + "name": "createdOn", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "id", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "request", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + } + ], + "interfaces": [] + }, + { + "kind": "OBJECT", + "name": "Subscription", + "fields": [ + { + "name": "collectionOrderUpdated", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "CollectionReorderData", + "ofType": null + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "myShortcodesCreated", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "Shortcode", + "ofType": null + } + }, + "args": [] + }, + { + "name": "myShortcodesRevoked", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "Shortcode", + "ofType": null + } + }, + "args": [] + }, + { + "name": "requestMoved", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamRequest", + "ofType": null + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "requestOrderUpdated", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "RequestReorderData", + "ofType": null + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "teamCollectionAdded", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamCollection", + "ofType": null + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "teamCollectionMoved", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamCollection", + "ofType": null + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "teamCollectionRemoved", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "teamCollectionUpdated", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamCollection", + "ofType": null + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "teamEnvironmentCreated", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamEnvironment", + "ofType": null + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "teamEnvironmentDeleted", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamEnvironment", + "ofType": null + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "teamEnvironmentUpdated", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamEnvironment", + "ofType": null + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "teamInvitationAdded", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamInvitation", + "ofType": null + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "teamInvitationRemoved", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "teamMemberAdded", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamMember", + "ofType": null + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "teamMemberRemoved", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "teamMemberUpdated", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamMember", + "ofType": null + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "teamRequestAdded", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamRequest", + "ofType": null + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "teamRequestDeleted", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "teamRequestUpdated", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamRequest", + "ofType": null + } + }, + "args": [ + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + } + } + ] + }, + { + "name": "userCollectionCreated", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserCollection", + "ofType": null + } + }, + "args": [] + }, + { + "name": "userCollectionMoved", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserCollection", + "ofType": null + } + }, + "args": [] + }, + { + "name": "userCollectionOrderUpdated", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserCollectionReorderData", + "ofType": null + } + }, + "args": [] + }, + { + "name": "userCollectionRemoved", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserCollectionRemovedData", + "ofType": null + } + }, + "args": [] + }, + { + "name": "userCollectionUpdated", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserCollection", + "ofType": null + } + }, + "args": [] + }, + { + "name": "userDeleted", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "User", + "ofType": null + } + }, + "args": [] + }, + { + "name": "userEnvironmentCreated", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserEnvironment", + "ofType": null + } + }, + "args": [] + }, + { + "name": "userEnvironmentDeleteMany", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "userEnvironmentDeleted", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserEnvironment", + "ofType": null + } + }, + "args": [] + }, + { + "name": "userEnvironmentUpdated", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserEnvironment", + "ofType": null + } + }, + "args": [] + }, + { + "name": "userHistoryCreated", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserHistory", + "ofType": null + } + }, + "args": [] + }, + { + "name": "userHistoryDeleted", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserHistory", + "ofType": null + } + }, + "args": [] + }, + { + "name": "userHistoryDeletedMany", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserHistoryDeletedManyData", + "ofType": null + } + }, + "args": [] + }, + { + "name": "userHistoryUpdated", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserHistory", + "ofType": null + } + }, + "args": [] + }, + { + "name": "userInvited", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "InvitedUser", + "ofType": null + } + }, + "args": [] + }, + { + "name": "userRequestCreated", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserRequest", + "ofType": null + } + }, + "args": [] + }, + { + "name": "userRequestDeleted", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserRequest", + "ofType": null + } + }, + "args": [] + }, + { + "name": "userRequestMoved", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserRequestReorderData", + "ofType": null + } + }, + "args": [] + }, + { + "name": "userRequestUpdated", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserRequest", + "ofType": null + } + }, + "args": [] + }, + { + "name": "userSettingsCreated", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserSettings", + "ofType": null + } + }, + "args": [] + }, + { + "name": "userSettingsUpdated", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserSettings", + "ofType": null + } + }, + "args": [] + }, + { + "name": "userUpdated", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "User", + "ofType": null + } + }, + "args": [] + } + ], + "interfaces": [] + }, + { + "kind": "OBJECT", + "name": "Team", + "fields": [ + { + "name": "editorsCount", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "id", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "members", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "LIST", + "ofType": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamMember", + "ofType": null + } + } + } + }, + "args": [ + { + "name": "cursor", + "type": { + "kind": "SCALAR", + "name": "Any" + } + } + ] + }, + { + "name": "myRole", + "type": { + "kind": "SCALAR", + "name": "Any" + }, + "args": [] + }, + { + "name": "name", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "ownersCount", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "teamEnvironments", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "LIST", + "ofType": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamEnvironment", + "ofType": null + } + } + } + }, + "args": [] + }, + { + "name": "teamInvitations", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "LIST", + "ofType": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamInvitation", + "ofType": null + } + } + } + }, + "args": [] + }, + { + "name": "teamMembers", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "LIST", + "ofType": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamMember", + "ofType": null + } + } + } + }, + "args": [] + }, + { + "name": "viewersCount", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + } + ], + "interfaces": [] + }, + { + "kind": "OBJECT", + "name": "TeamCollection", + "fields": [ + { + "name": "children", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "LIST", + "ofType": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamCollection", + "ofType": null + } + } + } + }, + "args": [ + { + "name": "cursor", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "take", + "type": { + "kind": "SCALAR", + "name": "Any" + } + } + ] + }, + { + "name": "id", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "parent", + "type": { + "kind": "OBJECT", + "name": "TeamCollection", + "ofType": null + }, + "args": [] + }, + { + "name": "parentID", + "type": { + "kind": "SCALAR", + "name": "Any" + }, + "args": [] + }, + { + "name": "team", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "Team", + "ofType": null + } + }, + "args": [] + }, + { + "name": "title", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + } + ], + "interfaces": [] + }, + { + "kind": "OBJECT", + "name": "TeamEnvironment", + "fields": [ + { + "name": "id", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "name", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "variables", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + } + ], + "interfaces": [] + }, + { + "kind": "OBJECT", + "name": "TeamInvitation", + "fields": [ + { + "name": "creator", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "User", + "ofType": null + } + }, + "args": [] + }, + { + "name": "creatorUid", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "id", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "inviteeEmail", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "inviteeRole", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "team", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "Team", + "ofType": null + } + }, + "args": [] + }, + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + } + ], + "interfaces": [] + }, + { + "kind": "OBJECT", + "name": "TeamMember", + "fields": [ + { + "name": "membershipID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "role", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "user", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "User", + "ofType": null + } + }, + "args": [] + } + ], + "interfaces": [] + }, + { + "kind": "OBJECT", + "name": "TeamRequest", + "fields": [ + { + "name": "collection", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "TeamCollection", + "ofType": null + } + }, + "args": [] + }, + { + "name": "collectionID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "id", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "request", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "team", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "Team", + "ofType": null + } + }, + "args": [] + }, + { + "name": "teamID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "title", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + } + ], + "interfaces": [] + }, + { + "kind": "OBJECT", + "name": "User", + "fields": [ + { + "name": "GQLHistory", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "LIST", + "ofType": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserHistory", + "ofType": null + } + } + } + }, + "args": [ + { + "name": "cursor", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "take", + "type": { + "kind": "SCALAR", + "name": "Any" + } + } + ] + }, + { + "name": "RESTHistory", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "LIST", + "ofType": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserHistory", + "ofType": null + } + } + } + }, + "args": [ + { + "name": "cursor", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "take", + "type": { + "kind": "SCALAR", + "name": "Any" + } + } + ] + }, + { + "name": "createdOn", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "currentGQLSession", + "type": { + "kind": "SCALAR", + "name": "Any" + }, + "args": [] + }, + { + "name": "currentRESTSession", + "type": { + "kind": "SCALAR", + "name": "Any" + }, + "args": [] + }, + { + "name": "displayName", + "type": { + "kind": "SCALAR", + "name": "Any" + }, + "args": [] + }, + { + "name": "email", + "type": { + "kind": "SCALAR", + "name": "Any" + }, + "args": [] + }, + { + "name": "environments", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "LIST", + "ofType": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserEnvironment", + "ofType": null + } + } + } + }, + "args": [] + }, + { + "name": "globalEnvironments", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserEnvironment", + "ofType": null + } + }, + "args": [] + }, + { + "name": "isAdmin", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "photoURL", + "type": { + "kind": "SCALAR", + "name": "Any" + }, + "args": [] + }, + { + "name": "settings", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserSettings", + "ofType": null + } + }, + "args": [] + }, + { + "name": "uid", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + } + ], + "interfaces": [] + }, + { + "kind": "OBJECT", + "name": "UserCollection", + "fields": [ + { + "name": "childrenGQL", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "LIST", + "ofType": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserCollection", + "ofType": null + } + } + } + }, + "args": [ + { + "name": "cursor", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "take", + "type": { + "kind": "SCALAR", + "name": "Any" + } + } + ] + }, + { + "name": "childrenREST", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "LIST", + "ofType": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserCollection", + "ofType": null + } + } + } + }, + "args": [ + { + "name": "cursor", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "take", + "type": { + "kind": "SCALAR", + "name": "Any" + } + } + ] + }, + { + "name": "id", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "parent", + "type": { + "kind": "OBJECT", + "name": "UserCollection", + "ofType": null + }, + "args": [] + }, + { + "name": "requests", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "LIST", + "ofType": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserRequest", + "ofType": null + } + } + } + }, + "args": [ + { + "name": "cursor", + "type": { + "kind": "SCALAR", + "name": "Any" + } + }, + { + "name": "take", + "type": { + "kind": "SCALAR", + "name": "Any" + } + } + ] + }, + { + "name": "title", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "type", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "user", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "User", + "ofType": null + } + }, + "args": [] + } + ], + "interfaces": [] + }, + { + "kind": "OBJECT", + "name": "UserCollectionExportJSONData", + "fields": [ + { + "name": "collectionType", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "exportedCollection", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + } + ], + "interfaces": [] + }, + { + "kind": "OBJECT", + "name": "UserCollectionRemovedData", + "fields": [ + { + "name": "id", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "type", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + } + ], + "interfaces": [] + }, + { + "kind": "OBJECT", + "name": "UserCollectionReorderData", + "fields": [ + { + "name": "nextUserCollection", + "type": { + "kind": "OBJECT", + "name": "UserCollection", + "ofType": null + }, + "args": [] + }, + { + "name": "userCollection", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserCollection", + "ofType": null + } + }, + "args": [] + } + ], + "interfaces": [] + }, + { + "kind": "OBJECT", + "name": "UserEnvironment", + "fields": [ + { + "name": "id", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "isGlobal", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "name", + "type": { + "kind": "SCALAR", + "name": "Any" + }, + "args": [] + }, + { + "name": "userUid", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "variables", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + } + ], + "interfaces": [] + }, + { + "kind": "OBJECT", + "name": "UserHistory", + "fields": [ + { + "name": "executedOn", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "id", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "isStarred", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "reqType", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "request", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "responseMetadata", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "userUid", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + } + ], + "interfaces": [] + }, + { + "kind": "OBJECT", + "name": "UserHistoryDeletedManyData", + "fields": [ + { + "name": "count", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "reqType", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + } + ], + "interfaces": [] + }, + { + "kind": "OBJECT", + "name": "UserRequest", + "fields": [ + { + "name": "collectionID", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "createdOn", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "id", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "request", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "title", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "type", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "user", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "User", + "ofType": null + } + }, + "args": [] + } + ], + "interfaces": [] + }, + { + "kind": "OBJECT", + "name": "UserRequestReorderData", + "fields": [ + { + "name": "nextRequest", + "type": { + "kind": "OBJECT", + "name": "UserRequest", + "ofType": null + }, + "args": [] + }, + { + "name": "request", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "OBJECT", + "name": "UserRequest", + "ofType": null + } + }, + "args": [] + } + ], + "interfaces": [] + }, + { + "kind": "OBJECT", + "name": "UserSettings", + "fields": [ + { + "name": "id", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "properties", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "updatedOn", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + }, + { + "name": "userUid", + "type": { + "kind": "NON_NULL", + "ofType": { + "kind": "SCALAR", + "name": "Any" + } + }, + "args": [] + } + ], + "interfaces": [] + }, + { + "kind": "SCALAR", + "name": "Any" + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/hoppscotch-selfhost-desktop/src/api/generated/graphql.ts b/packages/hoppscotch-selfhost-desktop/src/api/generated/graphql.ts new file mode 100644 index 000000000..134374bab --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/generated/graphql.ts @@ -0,0 +1,1857 @@ +/* eslint-disable */ // Auto-generated file (DO NOT EDIT!!!), refer gql-codegen.yml + +import { Resolver as GraphCacheResolver, UpdateResolver as GraphCacheUpdateResolver, OptimisticMutationResolver as GraphCacheOptimisticMutationResolver, StorageAdapter as GraphCacheStorageAdapter } from '@urql/exchange-graphcache'; +import { IntrospectionData } from '@urql/exchange-graphcache/dist/types/ast'; +import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; +export type Maybe = T | null; +export type InputMaybe = Maybe; +export type Exact = { [K in keyof T]: T[K] }; +export type MakeOptional = Omit & { [SubKey in K]?: Maybe }; +export type MakeMaybe = Omit & { [SubKey in K]: Maybe }; +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: string; + String: string; + Boolean: boolean; + Int: number; + Float: number; + DateTime: any; +}; + +export type Admin = { + __typename?: 'Admin'; + admins: Array; + allTeams: Array; + allUsers: Array; + collectionCountInTeam: Scalars['Int']; + environmentCountInTeam: Scalars['Int']; + invitedUsers: Array; + membersCountInTeam: Scalars['Int']; + pendingInvitationCountInTeam: Array; + requestCountInTeam: Scalars['Int']; + teamCollectionsCount: Scalars['Int']; + teamInfo: Team; + teamRequestsCount: Scalars['Int']; + teamsCount: Scalars['Int']; + userInfo: User; + usersCount: Scalars['Int']; +}; + + +export type AdminAllTeamsArgs = { + cursor?: InputMaybe; + take?: InputMaybe; +}; + + +export type AdminAllUsersArgs = { + cursor?: InputMaybe; + take?: InputMaybe; +}; + + +export type AdminCollectionCountInTeamArgs = { + teamID: Scalars['ID']; +}; + + +export type AdminEnvironmentCountInTeamArgs = { + teamID: Scalars['ID']; +}; + + +export type AdminMembersCountInTeamArgs = { + teamID: Scalars['ID']; +}; + + +export type AdminPendingInvitationCountInTeamArgs = { + teamID: Scalars['ID']; +}; + + +export type AdminRequestCountInTeamArgs = { + teamID: Scalars['ID']; +}; + + +export type AdminTeamInfoArgs = { + teamID: Scalars['ID']; +}; + + +export type AdminUserInfoArgs = { + userUid: Scalars['ID']; +}; + +export type CollectionReorderData = { + __typename?: 'CollectionReorderData'; + collection: TeamCollection; + nextCollection?: Maybe; +}; + +export type CreateTeamRequestInput = { + request: Scalars['String']; + teamID: Scalars['ID']; + title: Scalars['String']; +}; + +export type InvitedUser = { + __typename?: 'InvitedUser'; + adminEmail: Scalars['String']; + adminUid: Scalars['ID']; + invitedOn: Scalars['DateTime']; + inviteeEmail: Scalars['String']; +}; + +export type Mutation = { + __typename?: 'Mutation'; + acceptTeamInvitation: TeamMember; + addUserToTeamByAdmin: TeamMember; + changeUserRoleInTeamByAdmin: TeamMember; + clearGlobalEnvironments: UserEnvironment; + createChildCollection: TeamCollection; + createDuplicateEnvironment: TeamEnvironment; + createGQLChildUserCollection: UserCollection; + createGQLRootUserCollection: UserCollection; + createGQLUserRequest: UserRequest; + createRESTChildUserCollection: UserCollection; + createRESTRootUserCollection: UserCollection; + createRESTUserRequest: UserRequest; + createRequestInCollection: TeamRequest; + createRootCollection: TeamCollection; + createShortcode: Shortcode; + createTeam: Team; + createTeamByAdmin: Team; + createTeamEnvironment: TeamEnvironment; + createTeamInvitation: TeamInvitation; + createUserEnvironment: UserEnvironment; + createUserGlobalEnvironment: UserEnvironment; + createUserHistory: UserHistory; + createUserSettings: UserSettings; + deleteAllUserHistory: UserHistoryDeletedManyData; + deleteAllVariablesFromTeamEnvironment: TeamEnvironment; + deleteCollection: Scalars['Boolean']; + deleteRequest: Scalars['Boolean']; + deleteTeam: Scalars['Boolean']; + deleteTeamByAdmin: Scalars['Boolean']; + deleteTeamEnvironment: Scalars['Boolean']; + deleteUser: Scalars['Boolean']; + deleteUserCollection: Scalars['Boolean']; + deleteUserEnvironment: Scalars['Boolean']; + deleteUserEnvironments: Scalars['Int']; + deleteUserRequest: Scalars['Boolean']; + importCollectionsFromJSON: Scalars['Boolean']; + importUserCollectionsFromJSON: Scalars['Boolean']; + inviteNewUser: InvitedUser; + leaveTeam: Scalars['Boolean']; + makeUserAdmin: Scalars['Boolean']; + moveCollection: TeamCollection; + moveRequest: TeamRequest; + moveUserCollection: UserCollection; + moveUserRequest: UserRequest; + removeRequestFromHistory: UserHistory; + removeTeamMember: Scalars['Boolean']; + removeUserAsAdmin: Scalars['Boolean']; + removeUserByAdmin: Scalars['Boolean']; + removeUserFromTeamByAdmin: Scalars['Boolean']; + renameCollection: TeamCollection; + renameTeam: Team; + renameTeamByAdmin: Team; + renameUserCollection: UserCollection; + replaceCollectionsWithJSON: Scalars['Boolean']; + revokeShortcode: Scalars['Boolean']; + revokeTeamInvitation: Scalars['Boolean']; + toggleHistoryStarStatus: UserHistory; + updateCollectionOrder: Scalars['Boolean']; + updateGQLUserRequest: UserRequest; + updateLookUpRequestOrder: Scalars['Boolean']; + updateRESTUserRequest: UserRequest; + updateRequest: TeamRequest; + updateTeamEnvironment: TeamEnvironment; + updateTeamMemberRole: TeamMember; + updateUserCollectionOrder: Scalars['Boolean']; + updateUserEnvironment: UserEnvironment; + updateUserSessions: User; + updateUserSettings: UserSettings; +}; + + +export type MutationAcceptTeamInvitationArgs = { + inviteID: Scalars['ID']; +}; + + +export type MutationAddUserToTeamByAdminArgs = { + role: TeamMemberRole; + teamID: Scalars['ID']; + userEmail: Scalars['String']; +}; + + +export type MutationChangeUserRoleInTeamByAdminArgs = { + newRole: TeamMemberRole; + teamID: Scalars['ID']; + userUID: Scalars['ID']; +}; + + +export type MutationClearGlobalEnvironmentsArgs = { + id: Scalars['ID']; +}; + + +export type MutationCreateChildCollectionArgs = { + childTitle: Scalars['String']; + collectionID: Scalars['ID']; +}; + + +export type MutationCreateDuplicateEnvironmentArgs = { + id: Scalars['ID']; +}; + + +export type MutationCreateGqlChildUserCollectionArgs = { + parentUserCollectionID: Scalars['ID']; + title: Scalars['String']; +}; + + +export type MutationCreateGqlRootUserCollectionArgs = { + title: Scalars['String']; +}; + + +export type MutationCreateGqlUserRequestArgs = { + collectionID: Scalars['ID']; + request: Scalars['String']; + title: Scalars['String']; +}; + + +export type MutationCreateRestChildUserCollectionArgs = { + parentUserCollectionID: Scalars['ID']; + title: Scalars['String']; +}; + + +export type MutationCreateRestRootUserCollectionArgs = { + title: Scalars['String']; +}; + + +export type MutationCreateRestUserRequestArgs = { + collectionID: Scalars['ID']; + request: Scalars['String']; + title: Scalars['String']; +}; + + +export type MutationCreateRequestInCollectionArgs = { + collectionID: Scalars['ID']; + data: CreateTeamRequestInput; +}; + + +export type MutationCreateRootCollectionArgs = { + teamID: Scalars['ID']; + title: Scalars['String']; +}; + + +export type MutationCreateShortcodeArgs = { + request: Scalars['String']; +}; + + +export type MutationCreateTeamArgs = { + name: Scalars['String']; +}; + + +export type MutationCreateTeamByAdminArgs = { + name: Scalars['String']; + userUid: Scalars['ID']; +}; + + +export type MutationCreateTeamEnvironmentArgs = { + name: Scalars['String']; + teamID: Scalars['ID']; + variables: Scalars['String']; +}; + + +export type MutationCreateTeamInvitationArgs = { + inviteeEmail: Scalars['String']; + inviteeRole: TeamMemberRole; + teamID: Scalars['ID']; +}; + + +export type MutationCreateUserEnvironmentArgs = { + name: Scalars['String']; + variables: Scalars['String']; +}; + + +export type MutationCreateUserGlobalEnvironmentArgs = { + variables: Scalars['String']; +}; + + +export type MutationCreateUserHistoryArgs = { + reqData: Scalars['String']; + reqType: ReqType; + resMetadata: Scalars['String']; +}; + + +export type MutationCreateUserSettingsArgs = { + properties: Scalars['String']; +}; + + +export type MutationDeleteAllUserHistoryArgs = { + reqType: ReqType; +}; + + +export type MutationDeleteAllVariablesFromTeamEnvironmentArgs = { + id: Scalars['ID']; +}; + + +export type MutationDeleteCollectionArgs = { + collectionID: Scalars['ID']; +}; + + +export type MutationDeleteRequestArgs = { + requestID: Scalars['ID']; +}; + + +export type MutationDeleteTeamArgs = { + teamID: Scalars['ID']; +}; + + +export type MutationDeleteTeamByAdminArgs = { + teamID: Scalars['ID']; +}; + + +export type MutationDeleteTeamEnvironmentArgs = { + id: Scalars['ID']; +}; + + +export type MutationDeleteUserCollectionArgs = { + userCollectionID: Scalars['ID']; +}; + + +export type MutationDeleteUserEnvironmentArgs = { + id: Scalars['ID']; +}; + + +export type MutationDeleteUserRequestArgs = { + id: Scalars['ID']; +}; + + +export type MutationImportCollectionsFromJsonArgs = { + jsonString: Scalars['String']; + parentCollectionID?: InputMaybe; + teamID: Scalars['ID']; +}; + + +export type MutationImportUserCollectionsFromJsonArgs = { + jsonString: Scalars['String']; + parentCollectionID?: InputMaybe; + reqType: ReqType; +}; + + +export type MutationInviteNewUserArgs = { + inviteeEmail: Scalars['String']; +}; + + +export type MutationLeaveTeamArgs = { + teamID: Scalars['ID']; +}; + + +export type MutationMakeUserAdminArgs = { + userUID: Scalars['ID']; +}; + + +export type MutationMoveCollectionArgs = { + collectionID: Scalars['ID']; + parentCollectionID?: InputMaybe; +}; + + +export type MutationMoveRequestArgs = { + destCollID: Scalars['ID']; + nextRequestID?: InputMaybe; + requestID: Scalars['ID']; + srcCollID?: InputMaybe; +}; + + +export type MutationMoveUserCollectionArgs = { + destCollectionID?: InputMaybe; + userCollectionID: Scalars['ID']; +}; + + +export type MutationMoveUserRequestArgs = { + destinationCollectionID: Scalars['ID']; + nextRequestID?: InputMaybe; + requestID: Scalars['ID']; + sourceCollectionID: Scalars['ID']; +}; + + +export type MutationRemoveRequestFromHistoryArgs = { + id: Scalars['ID']; +}; + + +export type MutationRemoveTeamMemberArgs = { + teamID: Scalars['ID']; + userUid: Scalars['ID']; +}; + + +export type MutationRemoveUserAsAdminArgs = { + userUID: Scalars['ID']; +}; + + +export type MutationRemoveUserByAdminArgs = { + userUID: Scalars['ID']; +}; + + +export type MutationRemoveUserFromTeamByAdminArgs = { + teamID: Scalars['ID']; + userUid: Scalars['ID']; +}; + + +export type MutationRenameCollectionArgs = { + collectionID: Scalars['ID']; + newTitle: Scalars['String']; +}; + + +export type MutationRenameTeamArgs = { + newName: Scalars['String']; + teamID: Scalars['ID']; +}; + + +export type MutationRenameTeamByAdminArgs = { + newName: Scalars['String']; + teamID: Scalars['ID']; +}; + + +export type MutationRenameUserCollectionArgs = { + newTitle: Scalars['String']; + userCollectionID: Scalars['ID']; +}; + + +export type MutationReplaceCollectionsWithJsonArgs = { + jsonString: Scalars['String']; + parentCollectionID?: InputMaybe; + teamID: Scalars['ID']; +}; + + +export type MutationRevokeShortcodeArgs = { + code: Scalars['ID']; +}; + + +export type MutationRevokeTeamInvitationArgs = { + inviteID: Scalars['ID']; +}; + + +export type MutationToggleHistoryStarStatusArgs = { + id: Scalars['ID']; +}; + + +export type MutationUpdateCollectionOrderArgs = { + collectionID: Scalars['ID']; + destCollID?: InputMaybe; +}; + + +export type MutationUpdateGqlUserRequestArgs = { + id: Scalars['ID']; + request?: InputMaybe; + title?: InputMaybe; +}; + + +export type MutationUpdateLookUpRequestOrderArgs = { + collectionID: Scalars['ID']; + nextRequestID?: InputMaybe; + requestID: Scalars['ID']; +}; + + +export type MutationUpdateRestUserRequestArgs = { + id: Scalars['ID']; + request?: InputMaybe; + title?: InputMaybe; +}; + + +export type MutationUpdateRequestArgs = { + data: UpdateTeamRequestInput; + requestID: Scalars['ID']; +}; + + +export type MutationUpdateTeamEnvironmentArgs = { + id: Scalars['ID']; + name: Scalars['String']; + variables: Scalars['String']; +}; + + +export type MutationUpdateTeamMemberRoleArgs = { + newRole: TeamMemberRole; + teamID: Scalars['ID']; + userUid: Scalars['ID']; +}; + + +export type MutationUpdateUserCollectionOrderArgs = { + collectionID: Scalars['ID']; + nextCollectionID?: InputMaybe; +}; + + +export type MutationUpdateUserEnvironmentArgs = { + id: Scalars['ID']; + name: Scalars['String']; + variables: Scalars['String']; +}; + + +export type MutationUpdateUserSessionsArgs = { + currentSession: Scalars['String']; + sessionType: SessionType; +}; + + +export type MutationUpdateUserSettingsArgs = { + properties: Scalars['String']; +}; + +export type Query = { + __typename?: 'Query'; + admin: Admin; + collection?: Maybe; + exportCollectionsToJSON: Scalars['String']; + exportUserCollectionsToJSON: UserCollectionExportJsonData; + me: User; + myShortcodes: Array; + myTeams: Array; + request?: Maybe; + requestsInCollection: Array; + rootCollectionsOfTeam: Array; + rootGQLUserCollections: Array; + rootRESTUserCollections: Array; + searchForRequest: Array; + shortcode?: Maybe; + team?: Maybe; + teamInvitation: TeamInvitation; + userCollection: UserCollection; + userGQLRequests: Array; + userRESTRequests: Array; + userRequest: UserRequest; +}; + + +export type QueryCollectionArgs = { + collectionID: Scalars['ID']; +}; + + +export type QueryExportCollectionsToJsonArgs = { + teamID: Scalars['ID']; +}; + + +export type QueryExportUserCollectionsToJsonArgs = { + collectionID?: InputMaybe; + collectionType: ReqType; +}; + + +export type QueryMyShortcodesArgs = { + cursor?: InputMaybe; + take?: InputMaybe; +}; + + +export type QueryMyTeamsArgs = { + cursor?: InputMaybe; +}; + + +export type QueryRequestArgs = { + requestID: Scalars['ID']; +}; + + +export type QueryRequestsInCollectionArgs = { + collectionID: Scalars['ID']; + cursor?: InputMaybe; + take?: InputMaybe; +}; + + +export type QueryRootCollectionsOfTeamArgs = { + cursor?: InputMaybe; + take?: InputMaybe; + teamID: Scalars['ID']; +}; + + +export type QueryRootGqlUserCollectionsArgs = { + cursor?: InputMaybe; + take?: InputMaybe; +}; + + +export type QueryRootRestUserCollectionsArgs = { + cursor?: InputMaybe; + take?: InputMaybe; +}; + + +export type QuerySearchForRequestArgs = { + cursor?: InputMaybe; + searchTerm: Scalars['String']; + take?: InputMaybe; + teamID: Scalars['ID']; +}; + + +export type QueryShortcodeArgs = { + code: Scalars['ID']; +}; + + +export type QueryTeamArgs = { + teamID: Scalars['ID']; +}; + + +export type QueryTeamInvitationArgs = { + inviteID: Scalars['ID']; +}; + + +export type QueryUserCollectionArgs = { + userCollectionID: Scalars['ID']; +}; + + +export type QueryUserGqlRequestsArgs = { + collectionID?: InputMaybe; + cursor?: InputMaybe; + take?: InputMaybe; +}; + + +export type QueryUserRestRequestsArgs = { + collectionID?: InputMaybe; + cursor?: InputMaybe; + take?: InputMaybe; +}; + + +export type QueryUserRequestArgs = { + id: Scalars['ID']; +}; + +export enum ReqType { + Gql = 'GQL', + Rest = 'REST' +} + +export type RequestReorderData = { + __typename?: 'RequestReorderData'; + nextRequest?: Maybe; + request: TeamRequest; +}; + +export enum SessionType { + Gql = 'GQL', + Rest = 'REST' +} + +export type Shortcode = { + __typename?: 'Shortcode'; + createdOn: Scalars['DateTime']; + id: Scalars['ID']; + request: Scalars['String']; +}; + +export type Subscription = { + __typename?: 'Subscription'; + collectionOrderUpdated: CollectionReorderData; + myShortcodesCreated: Shortcode; + myShortcodesRevoked: Shortcode; + requestMoved: TeamRequest; + requestOrderUpdated: RequestReorderData; + teamCollectionAdded: TeamCollection; + teamCollectionMoved: TeamCollection; + teamCollectionRemoved: Scalars['ID']; + teamCollectionUpdated: TeamCollection; + teamEnvironmentCreated: TeamEnvironment; + teamEnvironmentDeleted: TeamEnvironment; + teamEnvironmentUpdated: TeamEnvironment; + teamInvitationAdded: TeamInvitation; + teamInvitationRemoved: Scalars['ID']; + teamMemberAdded: TeamMember; + teamMemberRemoved: Scalars['ID']; + teamMemberUpdated: TeamMember; + teamRequestAdded: TeamRequest; + teamRequestDeleted: Scalars['ID']; + teamRequestUpdated: TeamRequest; + userCollectionCreated: UserCollection; + userCollectionMoved: UserCollection; + userCollectionOrderUpdated: UserCollectionReorderData; + userCollectionRemoved: UserCollectionRemovedData; + userCollectionUpdated: UserCollection; + userDeleted: User; + userEnvironmentCreated: UserEnvironment; + userEnvironmentDeleteMany: Scalars['Int']; + userEnvironmentDeleted: UserEnvironment; + userEnvironmentUpdated: UserEnvironment; + userHistoryCreated: UserHistory; + userHistoryDeleted: UserHistory; + userHistoryDeletedMany: UserHistoryDeletedManyData; + userHistoryUpdated: UserHistory; + userInvited: InvitedUser; + userRequestCreated: UserRequest; + userRequestDeleted: UserRequest; + userRequestMoved: UserRequestReorderData; + userRequestUpdated: UserRequest; + userSettingsCreated: UserSettings; + userSettingsUpdated: UserSettings; + userUpdated: User; +}; + + +export type SubscriptionCollectionOrderUpdatedArgs = { + teamID: Scalars['ID']; +}; + + +export type SubscriptionRequestMovedArgs = { + teamID: Scalars['ID']; +}; + + +export type SubscriptionRequestOrderUpdatedArgs = { + teamID: Scalars['ID']; +}; + + +export type SubscriptionTeamCollectionAddedArgs = { + teamID: Scalars['ID']; +}; + + +export type SubscriptionTeamCollectionMovedArgs = { + teamID: Scalars['ID']; +}; + + +export type SubscriptionTeamCollectionRemovedArgs = { + teamID: Scalars['ID']; +}; + + +export type SubscriptionTeamCollectionUpdatedArgs = { + teamID: Scalars['ID']; +}; + + +export type SubscriptionTeamEnvironmentCreatedArgs = { + teamID: Scalars['ID']; +}; + + +export type SubscriptionTeamEnvironmentDeletedArgs = { + teamID: Scalars['ID']; +}; + + +export type SubscriptionTeamEnvironmentUpdatedArgs = { + teamID: Scalars['ID']; +}; + + +export type SubscriptionTeamInvitationAddedArgs = { + teamID: Scalars['ID']; +}; + + +export type SubscriptionTeamInvitationRemovedArgs = { + teamID: Scalars['ID']; +}; + + +export type SubscriptionTeamMemberAddedArgs = { + teamID: Scalars['ID']; +}; + + +export type SubscriptionTeamMemberRemovedArgs = { + teamID: Scalars['ID']; +}; + + +export type SubscriptionTeamMemberUpdatedArgs = { + teamID: Scalars['ID']; +}; + + +export type SubscriptionTeamRequestAddedArgs = { + teamID: Scalars['ID']; +}; + + +export type SubscriptionTeamRequestDeletedArgs = { + teamID: Scalars['ID']; +}; + + +export type SubscriptionTeamRequestUpdatedArgs = { + teamID: Scalars['ID']; +}; + +export type Team = { + __typename?: 'Team'; + editorsCount: Scalars['Int']; + id: Scalars['ID']; + members: Array; + myRole?: Maybe; + name: Scalars['String']; + ownersCount: Scalars['Int']; + teamEnvironments: Array; + teamInvitations: Array; + teamMembers: Array; + viewersCount: Scalars['Int']; +}; + + +export type TeamMembersArgs = { + cursor?: InputMaybe; +}; + +export type TeamCollection = { + __typename?: 'TeamCollection'; + children: Array; + id: Scalars['ID']; + parent?: Maybe; + parentID?: Maybe; + team: Team; + title: Scalars['String']; +}; + + +export type TeamCollectionChildrenArgs = { + cursor?: InputMaybe; + take?: InputMaybe; +}; + +export type TeamEnvironment = { + __typename?: 'TeamEnvironment'; + id: Scalars['ID']; + name: Scalars['String']; + teamID: Scalars['ID']; + variables: Scalars['String']; +}; + +export type TeamInvitation = { + __typename?: 'TeamInvitation'; + creator: User; + creatorUid: Scalars['ID']; + id: Scalars['ID']; + inviteeEmail: Scalars['String']; + inviteeRole: TeamMemberRole; + team: Team; + teamID: Scalars['ID']; +}; + +export type TeamMember = { + __typename?: 'TeamMember'; + membershipID: Scalars['ID']; + role: TeamMemberRole; + user: User; +}; + +export enum TeamMemberRole { + Editor = 'EDITOR', + Owner = 'OWNER', + Viewer = 'VIEWER' +} + +export type TeamRequest = { + __typename?: 'TeamRequest'; + collection: TeamCollection; + collectionID: Scalars['ID']; + id: Scalars['ID']; + request: Scalars['String']; + team: Team; + teamID: Scalars['ID']; + title: Scalars['String']; +}; + +export type UpdateTeamRequestInput = { + request?: InputMaybe; + title?: InputMaybe; +}; + +export type User = { + __typename?: 'User'; + GQLHistory: Array; + RESTHistory: Array; + createdOn: Scalars['DateTime']; + currentGQLSession?: Maybe; + currentRESTSession?: Maybe; + displayName?: Maybe; + email?: Maybe; + environments: Array; + globalEnvironments: UserEnvironment; + isAdmin: Scalars['Boolean']; + photoURL?: Maybe; + settings: UserSettings; + uid: Scalars['ID']; +}; + + +export type UserGqlHistoryArgs = { + cursor?: InputMaybe; + take?: InputMaybe; +}; + + +export type UserRestHistoryArgs = { + cursor?: InputMaybe; + take?: InputMaybe; +}; + +export type UserCollection = { + __typename?: 'UserCollection'; + childrenGQL: Array; + childrenREST: Array; + id: Scalars['ID']; + parent?: Maybe; + requests: Array; + title: Scalars['String']; + type: ReqType; + user: User; +}; + + +export type UserCollectionChildrenGqlArgs = { + cursor?: InputMaybe; + take?: InputMaybe; +}; + + +export type UserCollectionChildrenRestArgs = { + cursor?: InputMaybe; + take?: InputMaybe; +}; + + +export type UserCollectionRequestsArgs = { + cursor?: InputMaybe; + take?: InputMaybe; +}; + +export type UserCollectionExportJsonData = { + __typename?: 'UserCollectionExportJSONData'; + collectionType: ReqType; + exportedCollection: Scalars['ID']; +}; + +export type UserCollectionRemovedData = { + __typename?: 'UserCollectionRemovedData'; + id: Scalars['ID']; + type: ReqType; +}; + +export type UserCollectionReorderData = { + __typename?: 'UserCollectionReorderData'; + nextUserCollection?: Maybe; + userCollection: UserCollection; +}; + +export type UserEnvironment = { + __typename?: 'UserEnvironment'; + id: Scalars['ID']; + isGlobal: Scalars['Boolean']; + name?: Maybe; + userUid: Scalars['ID']; + variables: Scalars['String']; +}; + +export type UserHistory = { + __typename?: 'UserHistory'; + executedOn: Scalars['DateTime']; + id: Scalars['ID']; + isStarred: Scalars['Boolean']; + reqType: ReqType; + request: Scalars['String']; + responseMetadata: Scalars['String']; + userUid: Scalars['ID']; +}; + +export type UserHistoryDeletedManyData = { + __typename?: 'UserHistoryDeletedManyData'; + count: Scalars['Int']; + reqType: ReqType; +}; + +export type UserRequest = { + __typename?: 'UserRequest'; + collectionID: Scalars['ID']; + createdOn: Scalars['DateTime']; + id: Scalars['ID']; + request: Scalars['String']; + title: Scalars['String']; + type: ReqType; + user: User; +}; + +export type UserRequestReorderData = { + __typename?: 'UserRequestReorderData'; + nextRequest?: Maybe; + request: UserRequest; +}; + +export type UserSettings = { + __typename?: 'UserSettings'; + id: Scalars['ID']; + properties: Scalars['String']; + updatedOn: Scalars['DateTime']; + userUid: Scalars['ID']; +}; + +export type ClearGlobalEnvironmentsMutationVariables = Exact<{ + id: Scalars['ID']; +}>; + + +export type ClearGlobalEnvironmentsMutation = { __typename?: 'Mutation', clearGlobalEnvironments: { __typename?: 'UserEnvironment', id: string } }; + +export type CreateGqlChildUserCollectionMutationVariables = Exact<{ + title: Scalars['String']; + parentUserCollectionID: Scalars['ID']; +}>; + + +export type CreateGqlChildUserCollectionMutation = { __typename?: 'Mutation', createGQLChildUserCollection: { __typename?: 'UserCollection', id: string } }; + +export type CreateGqlRootUserCollectionMutationVariables = Exact<{ + title: Scalars['String']; +}>; + + +export type CreateGqlRootUserCollectionMutation = { __typename?: 'Mutation', createGQLRootUserCollection: { __typename?: 'UserCollection', id: string } }; + +export type CreateGqlUserRequestMutationVariables = Exact<{ + title: Scalars['String']; + request: Scalars['String']; + collectionID: Scalars['ID']; +}>; + + +export type CreateGqlUserRequestMutation = { __typename?: 'Mutation', createGQLUserRequest: { __typename?: 'UserRequest', id: string } }; + +export type CreateRestChildUserCollectionMutationVariables = Exact<{ + title: Scalars['String']; + parentUserCollectionID: Scalars['ID']; +}>; + + +export type CreateRestChildUserCollectionMutation = { __typename?: 'Mutation', createRESTChildUserCollection: { __typename?: 'UserCollection', id: string } }; + +export type CreateRestRootUserCollectionMutationVariables = Exact<{ + title: Scalars['String']; +}>; + + +export type CreateRestRootUserCollectionMutation = { __typename?: 'Mutation', createRESTRootUserCollection: { __typename?: 'UserCollection', id: string } }; + +export type CreateRestUserRequestMutationVariables = Exact<{ + collectionID: Scalars['ID']; + title: Scalars['String']; + request: Scalars['String']; +}>; + + +export type CreateRestUserRequestMutation = { __typename?: 'Mutation', createRESTUserRequest: { __typename?: 'UserRequest', id: string } }; + +export type CreateUserEnvironmentMutationVariables = Exact<{ + name: Scalars['String']; + variables: Scalars['String']; +}>; + + +export type CreateUserEnvironmentMutation = { __typename?: 'Mutation', createUserEnvironment: { __typename?: 'UserEnvironment', id: string, userUid: string, name?: string | null, variables: string, isGlobal: boolean } }; + +export type CreateUserGlobalEnvironmentMutationVariables = Exact<{ + variables: Scalars['String']; +}>; + + +export type CreateUserGlobalEnvironmentMutation = { __typename?: 'Mutation', createUserGlobalEnvironment: { __typename?: 'UserEnvironment', id: string } }; + +export type CreateUserHistoryMutationVariables = Exact<{ + reqData: Scalars['String']; + resMetadata: Scalars['String']; + reqType: ReqType; +}>; + + +export type CreateUserHistoryMutation = { __typename?: 'Mutation', createUserHistory: { __typename?: 'UserHistory', id: string } }; + +export type CreateUserSettingsMutationVariables = Exact<{ + properties: Scalars['String']; +}>; + + +export type CreateUserSettingsMutation = { __typename?: 'Mutation', createUserSettings: { __typename?: 'UserSettings', id: string } }; + +export type DeleteAllUserHistoryMutationVariables = Exact<{ + reqType: ReqType; +}>; + + +export type DeleteAllUserHistoryMutation = { __typename?: 'Mutation', deleteAllUserHistory: { __typename?: 'UserHistoryDeletedManyData', count: number, reqType: ReqType } }; + +export type DeleteUserCollectionMutationVariables = Exact<{ + userCollectionID: Scalars['ID']; +}>; + + +export type DeleteUserCollectionMutation = { __typename?: 'Mutation', deleteUserCollection: boolean }; + +export type DeleteUserEnvironmentMutationVariables = Exact<{ + id: Scalars['ID']; +}>; + + +export type DeleteUserEnvironmentMutation = { __typename?: 'Mutation', deleteUserEnvironment: boolean }; + +export type DeleteUserRequestMutationVariables = Exact<{ + requestID: Scalars['ID']; +}>; + + +export type DeleteUserRequestMutation = { __typename?: 'Mutation', deleteUserRequest: boolean }; + +export type MoveUserCollectionMutationVariables = Exact<{ + destCollectionID?: InputMaybe; + userCollectionID: Scalars['ID']; +}>; + + +export type MoveUserCollectionMutation = { __typename?: 'Mutation', moveUserCollection: { __typename?: 'UserCollection', id: string } }; + +export type MoveUserRequestMutationVariables = Exact<{ + sourceCollectionID: Scalars['ID']; + requestID: Scalars['ID']; + destinationCollectionID: Scalars['ID']; + nextRequestID?: InputMaybe; +}>; + + +export type MoveUserRequestMutation = { __typename?: 'Mutation', moveUserRequest: { __typename?: 'UserRequest', id: string } }; + +export type RemoveRequestFromHistoryMutationVariables = Exact<{ + id: Scalars['ID']; +}>; + + +export type RemoveRequestFromHistoryMutation = { __typename?: 'Mutation', removeRequestFromHistory: { __typename?: 'UserHistory', id: string } }; + +export type RenameUserCollectionMutationVariables = Exact<{ + userCollectionID: Scalars['ID']; + newTitle: Scalars['String']; +}>; + + +export type RenameUserCollectionMutation = { __typename?: 'Mutation', renameUserCollection: { __typename?: 'UserCollection', id: string } }; + +export type ToggleHistoryStarStatusMutationVariables = Exact<{ + id: Scalars['ID']; +}>; + + +export type ToggleHistoryStarStatusMutation = { __typename?: 'Mutation', toggleHistoryStarStatus: { __typename?: 'UserHistory', id: string } }; + +export type UpdateGqlUserRequestMutationVariables = Exact<{ + id: Scalars['ID']; + request: Scalars['String']; + title?: InputMaybe; +}>; + + +export type UpdateGqlUserRequestMutation = { __typename?: 'Mutation', updateGQLUserRequest: { __typename?: 'UserRequest', id: string } }; + +export type UpdateRestUserRequestMutationVariables = Exact<{ + id: Scalars['ID']; + title: Scalars['String']; + request: Scalars['String']; +}>; + + +export type UpdateRestUserRequestMutation = { __typename?: 'Mutation', updateRESTUserRequest: { __typename?: 'UserRequest', id: string, collectionID: string, request: string } }; + +export type UpdateUserCollectionOrderMutationVariables = Exact<{ + collectionID: Scalars['ID']; + nextCollectionID?: InputMaybe; +}>; + + +export type UpdateUserCollectionOrderMutation = { __typename?: 'Mutation', updateUserCollectionOrder: boolean }; + +export type UpdateUserEnvironmentMutationVariables = Exact<{ + id: Scalars['ID']; + name: Scalars['String']; + variables: Scalars['String']; +}>; + + +export type UpdateUserEnvironmentMutation = { __typename?: 'Mutation', updateUserEnvironment: { __typename?: 'UserEnvironment', id: string, userUid: string, name?: string | null, variables: string, isGlobal: boolean } }; + +export type UpdateUserSessionMutationVariables = Exact<{ + currentSession: Scalars['String']; + sessionType: SessionType; +}>; + + +export type UpdateUserSessionMutation = { __typename?: 'Mutation', updateUserSessions: { __typename?: 'User', currentRESTSession?: string | null } }; + +export type UpdateUserSettingsMutationVariables = Exact<{ + properties: Scalars['String']; +}>; + + +export type UpdateUserSettingsMutation = { __typename?: 'Mutation', updateUserSettings: { __typename?: 'UserSettings', id: string } }; + +export type ExportUserCollectionsToJsonQueryVariables = Exact<{ + collectionID?: InputMaybe; + collectionType: ReqType; +}>; + + +export type ExportUserCollectionsToJsonQuery = { __typename?: 'Query', exportUserCollectionsToJSON: { __typename?: 'UserCollectionExportJSONData', collectionType: ReqType, exportedCollection: string } }; + +export type GetCurrentRestSessionQueryVariables = Exact<{ [key: string]: never; }>; + + +export type GetCurrentRestSessionQuery = { __typename?: 'Query', me: { __typename?: 'User', currentRESTSession?: string | null } }; + +export type GetGlobalEnvironmentsQueryVariables = Exact<{ [key: string]: never; }>; + + +export type GetGlobalEnvironmentsQuery = { __typename?: 'Query', me: { __typename?: 'User', globalEnvironments: { __typename?: 'UserEnvironment', id: string, isGlobal: boolean, name?: string | null, userUid: string, variables: string } } }; + +export type GetRestUserHistoryQueryVariables = Exact<{ [key: string]: never; }>; + + +export type GetRestUserHistoryQuery = { __typename?: 'Query', me: { __typename?: 'User', RESTHistory: Array<{ __typename?: 'UserHistory', id: string, userUid: string, reqType: ReqType, request: string, responseMetadata: string, isStarred: boolean, executedOn: any }>, GQLHistory: Array<{ __typename?: 'UserHistory', id: string, userUid: string, reqType: ReqType, request: string, responseMetadata: string, isStarred: boolean, executedOn: any }> } }; + +export type GetGqlRootUserCollectionsQueryVariables = Exact<{ [key: string]: never; }>; + + +export type GetGqlRootUserCollectionsQuery = { __typename?: 'Query', rootGQLUserCollections: Array<{ __typename?: 'UserCollection', id: string, title: string, type: ReqType, childrenGQL: Array<{ __typename?: 'UserCollection', id: string, title: string, type: ReqType }> }> }; + +export type GetUserEnvironmentsQueryVariables = Exact<{ [key: string]: never; }>; + + +export type GetUserEnvironmentsQuery = { __typename?: 'Query', me: { __typename?: 'User', environments: Array<{ __typename?: 'UserEnvironment', id: string, isGlobal: boolean, name?: string | null, userUid: string, variables: string }> } }; + +export type GetUserRootCollectionsQueryVariables = Exact<{ [key: string]: never; }>; + + +export type GetUserRootCollectionsQuery = { __typename?: 'Query', rootRESTUserCollections: Array<{ __typename?: 'UserCollection', id: string, title: string, type: ReqType, childrenREST: Array<{ __typename?: 'UserCollection', id: string, title: string, type: ReqType }> }> }; + +export type GetUserSettingsQueryVariables = Exact<{ [key: string]: never; }>; + + +export type GetUserSettingsQuery = { __typename?: 'Query', me: { __typename?: 'User', settings: { __typename?: 'UserSettings', id: string, properties: string } } }; + +export type UserCollectionCreatedSubscriptionVariables = Exact<{ [key: string]: never; }>; + + +export type UserCollectionCreatedSubscription = { __typename?: 'Subscription', userCollectionCreated: { __typename?: 'UserCollection', id: string, title: string, type: ReqType, parent?: { __typename?: 'UserCollection', id: string } | null } }; + +export type UserCollectionMovedSubscriptionVariables = Exact<{ [key: string]: never; }>; + + +export type UserCollectionMovedSubscription = { __typename?: 'Subscription', userCollectionMoved: { __typename?: 'UserCollection', id: string, type: ReqType, parent?: { __typename?: 'UserCollection', id: string } | null } }; + +export type UserCollectionOrderUpdatedSubscriptionVariables = Exact<{ [key: string]: never; }>; + + +export type UserCollectionOrderUpdatedSubscription = { __typename?: 'Subscription', userCollectionOrderUpdated: { __typename?: 'UserCollectionReorderData', userCollection: { __typename?: 'UserCollection', id: string, parent?: { __typename?: 'UserCollection', id: string } | null }, nextUserCollection?: { __typename?: 'UserCollection', id: string, parent?: { __typename?: 'UserCollection', id: string } | null } | null } }; + +export type UserCollectionRemovedSubscriptionVariables = Exact<{ [key: string]: never; }>; + + +export type UserCollectionRemovedSubscription = { __typename?: 'Subscription', userCollectionRemoved: { __typename?: 'UserCollectionRemovedData', id: string, type: ReqType } }; + +export type UserCollectionUpdatedSubscriptionVariables = Exact<{ [key: string]: never; }>; + + +export type UserCollectionUpdatedSubscription = { __typename?: 'Subscription', userCollectionUpdated: { __typename?: 'UserCollection', id: string, title: string, type: ReqType, parent?: { __typename?: 'UserCollection', id: string } | null } }; + +export type UserEnvironmentCreatedSubscriptionVariables = Exact<{ [key: string]: never; }>; + + +export type UserEnvironmentCreatedSubscription = { __typename?: 'Subscription', userEnvironmentCreated: { __typename?: 'UserEnvironment', id: string, isGlobal: boolean, name?: string | null, userUid: string, variables: string } }; + +export type UserEnvironmentDeletedSubscriptionVariables = Exact<{ [key: string]: never; }>; + + +export type UserEnvironmentDeletedSubscription = { __typename?: 'Subscription', userEnvironmentDeleted: { __typename?: 'UserEnvironment', id: string } }; + +export type UserEnvironmentUpdatedSubscriptionVariables = Exact<{ [key: string]: never; }>; + + +export type UserEnvironmentUpdatedSubscription = { __typename?: 'Subscription', userEnvironmentUpdated: { __typename?: 'UserEnvironment', id: string, userUid: string, name?: string | null, variables: string, isGlobal: boolean } }; + +export type UserHistoryCreatedSubscriptionVariables = Exact<{ [key: string]: never; }>; + + +export type UserHistoryCreatedSubscription = { __typename?: 'Subscription', userHistoryCreated: { __typename?: 'UserHistory', id: string, reqType: ReqType, request: string, responseMetadata: string, isStarred: boolean, executedOn: any } }; + +export type UserHistoryDeletedSubscriptionVariables = Exact<{ [key: string]: never; }>; + + +export type UserHistoryDeletedSubscription = { __typename?: 'Subscription', userHistoryDeleted: { __typename?: 'UserHistory', id: string, reqType: ReqType } }; + +export type UserHistoryDeletedManySubscriptionVariables = Exact<{ [key: string]: never; }>; + + +export type UserHistoryDeletedManySubscription = { __typename?: 'Subscription', userHistoryDeletedMany: { __typename?: 'UserHistoryDeletedManyData', count: number, reqType: ReqType } }; + +export type UserHistoryUpdatedSubscriptionVariables = Exact<{ [key: string]: never; }>; + + +export type UserHistoryUpdatedSubscription = { __typename?: 'Subscription', userHistoryUpdated: { __typename?: 'UserHistory', id: string, reqType: ReqType, request: string, responseMetadata: string, isStarred: boolean, executedOn: any } }; + +export type UserRequestCreatedSubscriptionVariables = Exact<{ [key: string]: never; }>; + + +export type UserRequestCreatedSubscription = { __typename?: 'Subscription', userRequestCreated: { __typename?: 'UserRequest', id: string, collectionID: string, title: string, request: string, type: ReqType } }; + +export type UserRequestDeletedSubscriptionVariables = Exact<{ [key: string]: never; }>; + + +export type UserRequestDeletedSubscription = { __typename?: 'Subscription', userRequestDeleted: { __typename?: 'UserRequest', id: string, collectionID: string, title: string, request: string, type: ReqType } }; + +export type UserRequestMovedSubscriptionVariables = Exact<{ [key: string]: never; }>; + + +export type UserRequestMovedSubscription = { __typename?: 'Subscription', userRequestMoved: { __typename?: 'UserRequestReorderData', request: { __typename?: 'UserRequest', id: string, collectionID: string, type: ReqType }, nextRequest?: { __typename?: 'UserRequest', id: string, collectionID: string } | null } }; + +export type UserRequestUpdatedSubscriptionVariables = Exact<{ [key: string]: never; }>; + + +export type UserRequestUpdatedSubscription = { __typename?: 'Subscription', userRequestUpdated: { __typename?: 'UserRequest', id: string, collectionID: string, title: string, request: string, type: ReqType } }; + +export type UserSettingsUpdatedSubscriptionVariables = Exact<{ [key: string]: never; }>; + + +export type UserSettingsUpdatedSubscription = { __typename?: 'Subscription', userSettingsUpdated: { __typename?: 'UserSettings', id: string, properties: string } }; + + +export const ClearGlobalEnvironmentsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"ClearGlobalEnvironments"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"clearGlobalEnvironments"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode; +export const CreateGqlChildUserCollectionDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateGQLChildUserCollection"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"title"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"parentUserCollectionID"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createGQLChildUserCollection"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"title"},"value":{"kind":"Variable","name":{"kind":"Name","value":"title"}}},{"kind":"Argument","name":{"kind":"Name","value":"parentUserCollectionID"},"value":{"kind":"Variable","name":{"kind":"Name","value":"parentUserCollectionID"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode; +export const CreateGqlRootUserCollectionDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateGQLRootUserCollection"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"title"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createGQLRootUserCollection"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"title"},"value":{"kind":"Variable","name":{"kind":"Name","value":"title"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode; +export const CreateGqlUserRequestDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateGQLUserRequest"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"title"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"request"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"collectionID"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createGQLUserRequest"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"title"},"value":{"kind":"Variable","name":{"kind":"Name","value":"title"}}},{"kind":"Argument","name":{"kind":"Name","value":"request"},"value":{"kind":"Variable","name":{"kind":"Name","value":"request"}}},{"kind":"Argument","name":{"kind":"Name","value":"collectionID"},"value":{"kind":"Variable","name":{"kind":"Name","value":"collectionID"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode; +export const CreateRestChildUserCollectionDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateRESTChildUserCollection"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"title"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"parentUserCollectionID"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createRESTChildUserCollection"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"title"},"value":{"kind":"Variable","name":{"kind":"Name","value":"title"}}},{"kind":"Argument","name":{"kind":"Name","value":"parentUserCollectionID"},"value":{"kind":"Variable","name":{"kind":"Name","value":"parentUserCollectionID"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode; +export const CreateRestRootUserCollectionDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateRESTRootUserCollection"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"title"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createRESTRootUserCollection"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"title"},"value":{"kind":"Variable","name":{"kind":"Name","value":"title"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode; +export const CreateRestUserRequestDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateRESTUserRequest"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"collectionID"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"title"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"request"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createRESTUserRequest"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"collectionID"},"value":{"kind":"Variable","name":{"kind":"Name","value":"collectionID"}}},{"kind":"Argument","name":{"kind":"Name","value":"title"},"value":{"kind":"Variable","name":{"kind":"Name","value":"title"}}},{"kind":"Argument","name":{"kind":"Name","value":"request"},"value":{"kind":"Variable","name":{"kind":"Name","value":"request"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode; +export const CreateUserEnvironmentDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateUserEnvironment"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"name"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"variables"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createUserEnvironment"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"name"},"value":{"kind":"Variable","name":{"kind":"Name","value":"name"}}},{"kind":"Argument","name":{"kind":"Name","value":"variables"},"value":{"kind":"Variable","name":{"kind":"Name","value":"variables"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"userUid"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"variables"}},{"kind":"Field","name":{"kind":"Name","value":"isGlobal"}}]}}]}}]} as unknown as DocumentNode; +export const CreateUserGlobalEnvironmentDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateUserGlobalEnvironment"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"variables"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createUserGlobalEnvironment"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"variables"},"value":{"kind":"Variable","name":{"kind":"Name","value":"variables"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode; +export const CreateUserHistoryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateUserHistory"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"reqData"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"resMetadata"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"reqType"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ReqType"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createUserHistory"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"reqData"},"value":{"kind":"Variable","name":{"kind":"Name","value":"reqData"}}},{"kind":"Argument","name":{"kind":"Name","value":"resMetadata"},"value":{"kind":"Variable","name":{"kind":"Name","value":"resMetadata"}}},{"kind":"Argument","name":{"kind":"Name","value":"reqType"},"value":{"kind":"Variable","name":{"kind":"Name","value":"reqType"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode; +export const CreateUserSettingsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateUserSettings"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"properties"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createUserSettings"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"properties"},"value":{"kind":"Variable","name":{"kind":"Name","value":"properties"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode; +export const DeleteAllUserHistoryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteAllUserHistory"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"reqType"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ReqType"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"deleteAllUserHistory"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"reqType"},"value":{"kind":"Variable","name":{"kind":"Name","value":"reqType"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"count"}},{"kind":"Field","name":{"kind":"Name","value":"reqType"}}]}}]}}]} as unknown as DocumentNode; +export const DeleteUserCollectionDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteUserCollection"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"userCollectionID"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"deleteUserCollection"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"userCollectionID"},"value":{"kind":"Variable","name":{"kind":"Name","value":"userCollectionID"}}}]}]}}]} as unknown as DocumentNode; +export const DeleteUserEnvironmentDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteUserEnvironment"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"deleteUserEnvironment"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}]}]}}]} as unknown as DocumentNode; +export const DeleteUserRequestDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteUserRequest"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"requestID"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"deleteUserRequest"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"requestID"}}}]}]}}]} as unknown as DocumentNode; +export const MoveUserCollectionDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"MoveUserCollection"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"destCollectionID"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"userCollectionID"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"moveUserCollection"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"destCollectionID"},"value":{"kind":"Variable","name":{"kind":"Name","value":"destCollectionID"}}},{"kind":"Argument","name":{"kind":"Name","value":"userCollectionID"},"value":{"kind":"Variable","name":{"kind":"Name","value":"userCollectionID"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode; +export const MoveUserRequestDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"MoveUserRequest"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"sourceCollectionID"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"requestID"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"destinationCollectionID"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"nextRequestID"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"moveUserRequest"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"sourceCollectionID"},"value":{"kind":"Variable","name":{"kind":"Name","value":"sourceCollectionID"}}},{"kind":"Argument","name":{"kind":"Name","value":"requestID"},"value":{"kind":"Variable","name":{"kind":"Name","value":"requestID"}}},{"kind":"Argument","name":{"kind":"Name","value":"destinationCollectionID"},"value":{"kind":"Variable","name":{"kind":"Name","value":"destinationCollectionID"}}},{"kind":"Argument","name":{"kind":"Name","value":"nextRequestID"},"value":{"kind":"Variable","name":{"kind":"Name","value":"nextRequestID"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode; +export const RemoveRequestFromHistoryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"RemoveRequestFromHistory"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"removeRequestFromHistory"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode; +export const RenameUserCollectionDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"RenameUserCollection"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"userCollectionID"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"newTitle"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"renameUserCollection"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"userCollectionID"},"value":{"kind":"Variable","name":{"kind":"Name","value":"userCollectionID"}}},{"kind":"Argument","name":{"kind":"Name","value":"newTitle"},"value":{"kind":"Variable","name":{"kind":"Name","value":"newTitle"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode; +export const ToggleHistoryStarStatusDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"ToggleHistoryStarStatus"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"toggleHistoryStarStatus"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode; +export const UpdateGqlUserRequestDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateGQLUserRequest"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"request"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"title"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateGQLUserRequest"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}},{"kind":"Argument","name":{"kind":"Name","value":"request"},"value":{"kind":"Variable","name":{"kind":"Name","value":"request"}}},{"kind":"Argument","name":{"kind":"Name","value":"title"},"value":{"kind":"Variable","name":{"kind":"Name","value":"title"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode; +export const UpdateRestUserRequestDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateRESTUserRequest"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"title"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"request"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateRESTUserRequest"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}},{"kind":"Argument","name":{"kind":"Name","value":"title"},"value":{"kind":"Variable","name":{"kind":"Name","value":"title"}}},{"kind":"Argument","name":{"kind":"Name","value":"request"},"value":{"kind":"Variable","name":{"kind":"Name","value":"request"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"collectionID"}},{"kind":"Field","name":{"kind":"Name","value":"request"}}]}}]}}]} as unknown as DocumentNode; +export const UpdateUserCollectionOrderDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateUserCollectionOrder"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"collectionID"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"nextCollectionID"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateUserCollectionOrder"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"collectionID"},"value":{"kind":"Variable","name":{"kind":"Name","value":"collectionID"}}},{"kind":"Argument","name":{"kind":"Name","value":"nextCollectionID"},"value":{"kind":"Variable","name":{"kind":"Name","value":"nextCollectionID"}}}]}]}}]} as unknown as DocumentNode; +export const UpdateUserEnvironmentDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateUserEnvironment"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"name"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"variables"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateUserEnvironment"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}},{"kind":"Argument","name":{"kind":"Name","value":"name"},"value":{"kind":"Variable","name":{"kind":"Name","value":"name"}}},{"kind":"Argument","name":{"kind":"Name","value":"variables"},"value":{"kind":"Variable","name":{"kind":"Name","value":"variables"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"userUid"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"variables"}},{"kind":"Field","name":{"kind":"Name","value":"isGlobal"}}]}}]}}]} as unknown as DocumentNode; +export const UpdateUserSessionDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateUserSession"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"currentSession"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"sessionType"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SessionType"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateUserSessions"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"currentSession"},"value":{"kind":"Variable","name":{"kind":"Name","value":"currentSession"}}},{"kind":"Argument","name":{"kind":"Name","value":"sessionType"},"value":{"kind":"Variable","name":{"kind":"Name","value":"sessionType"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"currentRESTSession"}}]}}]}}]} as unknown as DocumentNode; +export const UpdateUserSettingsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateUserSettings"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"properties"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateUserSettings"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"properties"},"value":{"kind":"Variable","name":{"kind":"Name","value":"properties"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode; +export const ExportUserCollectionsToJsonDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ExportUserCollectionsToJSON"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"collectionID"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"collectionType"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ReqType"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"exportUserCollectionsToJSON"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"collectionID"},"value":{"kind":"Variable","name":{"kind":"Name","value":"collectionID"}}},{"kind":"Argument","name":{"kind":"Name","value":"collectionType"},"value":{"kind":"Variable","name":{"kind":"Name","value":"collectionType"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"collectionType"}},{"kind":"Field","name":{"kind":"Name","value":"exportedCollection"}}]}}]}}]} as unknown as DocumentNode; +export const GetCurrentRestSessionDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetCurrentRESTSession"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"me"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"currentRESTSession"}}]}}]}}]} as unknown as DocumentNode; +export const GetGlobalEnvironmentsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetGlobalEnvironments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"me"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"globalEnvironments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"isGlobal"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"userUid"}},{"kind":"Field","name":{"kind":"Name","value":"variables"}}]}}]}}]}}]} as unknown as DocumentNode; +export const GetRestUserHistoryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetRESTUserHistory"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"me"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"RESTHistory"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"userUid"}},{"kind":"Field","name":{"kind":"Name","value":"reqType"}},{"kind":"Field","name":{"kind":"Name","value":"request"}},{"kind":"Field","name":{"kind":"Name","value":"responseMetadata"}},{"kind":"Field","name":{"kind":"Name","value":"isStarred"}},{"kind":"Field","name":{"kind":"Name","value":"executedOn"}}]}},{"kind":"Field","name":{"kind":"Name","value":"GQLHistory"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"userUid"}},{"kind":"Field","name":{"kind":"Name","value":"reqType"}},{"kind":"Field","name":{"kind":"Name","value":"request"}},{"kind":"Field","name":{"kind":"Name","value":"responseMetadata"}},{"kind":"Field","name":{"kind":"Name","value":"isStarred"}},{"kind":"Field","name":{"kind":"Name","value":"executedOn"}}]}}]}}]}}]} as unknown as DocumentNode; +export const GetGqlRootUserCollectionsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetGQLRootUserCollections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"rootGQLUserCollections"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"take"},"value":{"kind":"IntValue","value":"99999"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"childrenGQL"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"type"}}]}}]}}]}}]} as unknown as DocumentNode; +export const GetUserEnvironmentsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetUserEnvironments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"me"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"environments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"isGlobal"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"userUid"}},{"kind":"Field","name":{"kind":"Name","value":"variables"}}]}}]}}]}}]} as unknown as DocumentNode; +export const GetUserRootCollectionsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetUserRootCollections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"rootRESTUserCollections"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"take"},"value":{"kind":"IntValue","value":"99999"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"childrenREST"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"type"}}]}}]}}]}}]} as unknown as DocumentNode; +export const GetUserSettingsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetUserSettings"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"me"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"settings"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"properties"}}]}}]}}]}}]} as unknown as DocumentNode; +export const UserCollectionCreatedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"UserCollectionCreated"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userCollectionCreated"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"type"}}]}}]}}]} as unknown as DocumentNode; +export const UserCollectionMovedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"UserCollectionMoved"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userCollectionMoved"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"type"}}]}}]}}]} as unknown as DocumentNode; +export const UserCollectionOrderUpdatedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"UserCollectionOrderUpdated"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userCollectionOrderUpdated"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userCollection"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"nextUserCollection"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]}}]}}]} as unknown as DocumentNode; +export const UserCollectionRemovedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"UserCollectionRemoved"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userCollectionRemoved"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"type"}}]}}]}}]} as unknown as DocumentNode; +export const UserCollectionUpdatedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"userCollectionUpdated"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userCollectionUpdated"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"parent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]}}]} as unknown as DocumentNode; +export const UserEnvironmentCreatedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"UserEnvironmentCreated"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userEnvironmentCreated"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"isGlobal"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"userUid"}},{"kind":"Field","name":{"kind":"Name","value":"variables"}}]}}]}}]} as unknown as DocumentNode; +export const UserEnvironmentDeletedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"UserEnvironmentDeleted"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userEnvironmentDeleted"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode; +export const UserEnvironmentUpdatedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"UserEnvironmentUpdated"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userEnvironmentUpdated"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"userUid"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"variables"}},{"kind":"Field","name":{"kind":"Name","value":"isGlobal"}}]}}]}}]} as unknown as DocumentNode; +export const UserHistoryCreatedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"UserHistoryCreated"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userHistoryCreated"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"reqType"}},{"kind":"Field","name":{"kind":"Name","value":"request"}},{"kind":"Field","name":{"kind":"Name","value":"responseMetadata"}},{"kind":"Field","name":{"kind":"Name","value":"isStarred"}},{"kind":"Field","name":{"kind":"Name","value":"executedOn"}}]}}]}}]} as unknown as DocumentNode; +export const UserHistoryDeletedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"userHistoryDeleted"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userHistoryDeleted"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"reqType"}}]}}]}}]} as unknown as DocumentNode; +export const UserHistoryDeletedManyDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"UserHistoryDeletedMany"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userHistoryDeletedMany"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"count"}},{"kind":"Field","name":{"kind":"Name","value":"reqType"}}]}}]}}]} as unknown as DocumentNode; +export const UserHistoryUpdatedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"UserHistoryUpdated"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userHistoryUpdated"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"reqType"}},{"kind":"Field","name":{"kind":"Name","value":"request"}},{"kind":"Field","name":{"kind":"Name","value":"responseMetadata"}},{"kind":"Field","name":{"kind":"Name","value":"isStarred"}},{"kind":"Field","name":{"kind":"Name","value":"executedOn"}}]}}]}}]} as unknown as DocumentNode; +export const UserRequestCreatedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"UserRequestCreated"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userRequestCreated"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"collectionID"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"request"}},{"kind":"Field","name":{"kind":"Name","value":"type"}}]}}]}}]} as unknown as DocumentNode; +export const UserRequestDeletedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"UserRequestDeleted"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userRequestDeleted"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"collectionID"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"request"}},{"kind":"Field","name":{"kind":"Name","value":"type"}}]}}]}}]} as unknown as DocumentNode; +export const UserRequestMovedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"UserRequestMoved"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userRequestMoved"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"request"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"collectionID"}},{"kind":"Field","name":{"kind":"Name","value":"type"}}]}},{"kind":"Field","name":{"kind":"Name","value":"nextRequest"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"collectionID"}}]}}]}}]}}]} as unknown as DocumentNode; +export const UserRequestUpdatedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"UserRequestUpdated"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userRequestUpdated"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"collectionID"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"request"}},{"kind":"Field","name":{"kind":"Name","value":"type"}}]}}]}}]} as unknown as DocumentNode; +export const UserSettingsUpdatedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"UserSettingsUpdated"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userSettingsUpdated"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"properties"}}]}}]}}]} as unknown as DocumentNode; +export type WithTypename = Partial & { __typename: NonNullable }; + +export type GraphCacheKeysConfig = { + Admin?: (data: WithTypename) => null | string, + CollectionReorderData?: (data: WithTypename) => null | string, + InvitedUser?: (data: WithTypename) => null | string, + RequestReorderData?: (data: WithTypename) => null | string, + Shortcode?: (data: WithTypename) => null | string, + Team?: (data: WithTypename) => null | string, + TeamCollection?: (data: WithTypename) => null | string, + TeamEnvironment?: (data: WithTypename) => null | string, + TeamInvitation?: (data: WithTypename) => null | string, + TeamMember?: (data: WithTypename) => null | string, + TeamRequest?: (data: WithTypename) => null | string, + User?: (data: WithTypename) => null | string, + UserCollection?: (data: WithTypename) => null | string, + UserCollectionExportJSONData?: (data: WithTypename) => null | string, + UserCollectionRemovedData?: (data: WithTypename) => null | string, + UserCollectionReorderData?: (data: WithTypename) => null | string, + UserEnvironment?: (data: WithTypename) => null | string, + UserHistory?: (data: WithTypename) => null | string, + UserHistoryDeletedManyData?: (data: WithTypename) => null | string, + UserRequest?: (data: WithTypename) => null | string, + UserRequestReorderData?: (data: WithTypename) => null | string, + UserSettings?: (data: WithTypename) => null | string +} + +export type GraphCacheResolvers = { + Query?: { + admin?: GraphCacheResolver, Record, WithTypename | string>, + collection?: GraphCacheResolver, QueryCollectionArgs, WithTypename | string>, + exportCollectionsToJSON?: GraphCacheResolver, QueryExportCollectionsToJsonArgs, Scalars['String'] | string>, + exportUserCollectionsToJSON?: GraphCacheResolver, QueryExportUserCollectionsToJsonArgs, WithTypename | string>, + me?: GraphCacheResolver, Record, WithTypename | string>, + myShortcodes?: GraphCacheResolver, QueryMyShortcodesArgs, Array | string>>, + myTeams?: GraphCacheResolver, QueryMyTeamsArgs, Array | string>>, + request?: GraphCacheResolver, QueryRequestArgs, WithTypename | string>, + requestsInCollection?: GraphCacheResolver, QueryRequestsInCollectionArgs, Array | string>>, + rootCollectionsOfTeam?: GraphCacheResolver, QueryRootCollectionsOfTeamArgs, Array | string>>, + rootGQLUserCollections?: GraphCacheResolver, QueryRootGqlUserCollectionsArgs, Array | string>>, + rootRESTUserCollections?: GraphCacheResolver, QueryRootRestUserCollectionsArgs, Array | string>>, + searchForRequest?: GraphCacheResolver, QuerySearchForRequestArgs, Array | string>>, + shortcode?: GraphCacheResolver, QueryShortcodeArgs, WithTypename | string>, + team?: GraphCacheResolver, QueryTeamArgs, WithTypename | string>, + teamInvitation?: GraphCacheResolver, QueryTeamInvitationArgs, WithTypename | string>, + userCollection?: GraphCacheResolver, QueryUserCollectionArgs, WithTypename | string>, + userGQLRequests?: GraphCacheResolver, QueryUserGqlRequestsArgs, Array | string>>, + userRESTRequests?: GraphCacheResolver, QueryUserRestRequestsArgs, Array | string>>, + userRequest?: GraphCacheResolver, QueryUserRequestArgs, WithTypename | string> + }, + Admin?: { + admins?: GraphCacheResolver, Record, Array | string>>, + allTeams?: GraphCacheResolver, AdminAllTeamsArgs, Array | string>>, + allUsers?: GraphCacheResolver, AdminAllUsersArgs, Array | string>>, + collectionCountInTeam?: GraphCacheResolver, AdminCollectionCountInTeamArgs, Scalars['Int'] | string>, + environmentCountInTeam?: GraphCacheResolver, AdminEnvironmentCountInTeamArgs, Scalars['Int'] | string>, + invitedUsers?: GraphCacheResolver, Record, Array | string>>, + membersCountInTeam?: GraphCacheResolver, AdminMembersCountInTeamArgs, Scalars['Int'] | string>, + pendingInvitationCountInTeam?: GraphCacheResolver, AdminPendingInvitationCountInTeamArgs, Array | string>>, + requestCountInTeam?: GraphCacheResolver, AdminRequestCountInTeamArgs, Scalars['Int'] | string>, + teamCollectionsCount?: GraphCacheResolver, Record, Scalars['Int'] | string>, + teamInfo?: GraphCacheResolver, AdminTeamInfoArgs, WithTypename | string>, + teamRequestsCount?: GraphCacheResolver, Record, Scalars['Int'] | string>, + teamsCount?: GraphCacheResolver, Record, Scalars['Int'] | string>, + userInfo?: GraphCacheResolver, AdminUserInfoArgs, WithTypename | string>, + usersCount?: GraphCacheResolver, Record, Scalars['Int'] | string> + }, + CollectionReorderData?: { + collection?: GraphCacheResolver, Record, WithTypename | string>, + nextCollection?: GraphCacheResolver, Record, WithTypename | string> + }, + InvitedUser?: { + adminEmail?: GraphCacheResolver, Record, Scalars['String'] | string>, + adminUid?: GraphCacheResolver, Record, Scalars['ID'] | string>, + invitedOn?: GraphCacheResolver, Record, Scalars['DateTime'] | string>, + inviteeEmail?: GraphCacheResolver, Record, Scalars['String'] | string> + }, + RequestReorderData?: { + nextRequest?: GraphCacheResolver, Record, WithTypename | string>, + request?: GraphCacheResolver, Record, WithTypename | string> + }, + Shortcode?: { + createdOn?: GraphCacheResolver, Record, Scalars['DateTime'] | string>, + id?: GraphCacheResolver, Record, Scalars['ID'] | string>, + request?: GraphCacheResolver, Record, Scalars['String'] | string> + }, + Team?: { + editorsCount?: GraphCacheResolver, Record, Scalars['Int'] | string>, + id?: GraphCacheResolver, Record, Scalars['ID'] | string>, + members?: GraphCacheResolver, TeamMembersArgs, Array | string>>, + myRole?: GraphCacheResolver, Record, TeamMemberRole | string>, + name?: GraphCacheResolver, Record, Scalars['String'] | string>, + ownersCount?: GraphCacheResolver, Record, Scalars['Int'] | string>, + teamEnvironments?: GraphCacheResolver, Record, Array | string>>, + teamInvitations?: GraphCacheResolver, Record, Array | string>>, + teamMembers?: GraphCacheResolver, Record, Array | string>>, + viewersCount?: GraphCacheResolver, Record, Scalars['Int'] | string> + }, + TeamCollection?: { + children?: GraphCacheResolver, TeamCollectionChildrenArgs, Array | string>>, + id?: GraphCacheResolver, Record, Scalars['ID'] | string>, + parent?: GraphCacheResolver, Record, WithTypename | string>, + parentID?: GraphCacheResolver, Record, Scalars['ID'] | string>, + team?: GraphCacheResolver, Record, WithTypename | string>, + title?: GraphCacheResolver, Record, Scalars['String'] | string> + }, + TeamEnvironment?: { + id?: GraphCacheResolver, Record, Scalars['ID'] | string>, + name?: GraphCacheResolver, Record, Scalars['String'] | string>, + teamID?: GraphCacheResolver, Record, Scalars['ID'] | string>, + variables?: GraphCacheResolver, Record, Scalars['String'] | string> + }, + TeamInvitation?: { + creator?: GraphCacheResolver, Record, WithTypename | string>, + creatorUid?: GraphCacheResolver, Record, Scalars['ID'] | string>, + id?: GraphCacheResolver, Record, Scalars['ID'] | string>, + inviteeEmail?: GraphCacheResolver, Record, Scalars['String'] | string>, + inviteeRole?: GraphCacheResolver, Record, TeamMemberRole | string>, + team?: GraphCacheResolver, Record, WithTypename | string>, + teamID?: GraphCacheResolver, Record, Scalars['ID'] | string> + }, + TeamMember?: { + membershipID?: GraphCacheResolver, Record, Scalars['ID'] | string>, + role?: GraphCacheResolver, Record, TeamMemberRole | string>, + user?: GraphCacheResolver, Record, WithTypename | string> + }, + TeamRequest?: { + collection?: GraphCacheResolver, Record, WithTypename | string>, + collectionID?: GraphCacheResolver, Record, Scalars['ID'] | string>, + id?: GraphCacheResolver, Record, Scalars['ID'] | string>, + request?: GraphCacheResolver, Record, Scalars['String'] | string>, + team?: GraphCacheResolver, Record, WithTypename | string>, + teamID?: GraphCacheResolver, Record, Scalars['ID'] | string>, + title?: GraphCacheResolver, Record, Scalars['String'] | string> + }, + User?: { + GQLHistory?: GraphCacheResolver, UserGqlHistoryArgs, Array | string>>, + RESTHistory?: GraphCacheResolver, UserRestHistoryArgs, Array | string>>, + createdOn?: GraphCacheResolver, Record, Scalars['DateTime'] | string>, + currentGQLSession?: GraphCacheResolver, Record, Scalars['String'] | string>, + currentRESTSession?: GraphCacheResolver, Record, Scalars['String'] | string>, + displayName?: GraphCacheResolver, Record, Scalars['String'] | string>, + email?: GraphCacheResolver, Record, Scalars['String'] | string>, + environments?: GraphCacheResolver, Record, Array | string>>, + globalEnvironments?: GraphCacheResolver, Record, WithTypename | string>, + isAdmin?: GraphCacheResolver, Record, Scalars['Boolean'] | string>, + photoURL?: GraphCacheResolver, Record, Scalars['String'] | string>, + settings?: GraphCacheResolver, Record, WithTypename | string>, + uid?: GraphCacheResolver, Record, Scalars['ID'] | string> + }, + UserCollection?: { + childrenGQL?: GraphCacheResolver, UserCollectionChildrenGqlArgs, Array | string>>, + childrenREST?: GraphCacheResolver, UserCollectionChildrenRestArgs, Array | string>>, + id?: GraphCacheResolver, Record, Scalars['ID'] | string>, + parent?: GraphCacheResolver, Record, WithTypename | string>, + requests?: GraphCacheResolver, UserCollectionRequestsArgs, Array | string>>, + title?: GraphCacheResolver, Record, Scalars['String'] | string>, + type?: GraphCacheResolver, Record, ReqType | string>, + user?: GraphCacheResolver, Record, WithTypename | string> + }, + UserCollectionExportJSONData?: { + collectionType?: GraphCacheResolver, Record, ReqType | string>, + exportedCollection?: GraphCacheResolver, Record, Scalars['ID'] | string> + }, + UserCollectionRemovedData?: { + id?: GraphCacheResolver, Record, Scalars['ID'] | string>, + type?: GraphCacheResolver, Record, ReqType | string> + }, + UserCollectionReorderData?: { + nextUserCollection?: GraphCacheResolver, Record, WithTypename | string>, + userCollection?: GraphCacheResolver, Record, WithTypename | string> + }, + UserEnvironment?: { + id?: GraphCacheResolver, Record, Scalars['ID'] | string>, + isGlobal?: GraphCacheResolver, Record, Scalars['Boolean'] | string>, + name?: GraphCacheResolver, Record, Scalars['String'] | string>, + userUid?: GraphCacheResolver, Record, Scalars['ID'] | string>, + variables?: GraphCacheResolver, Record, Scalars['String'] | string> + }, + UserHistory?: { + executedOn?: GraphCacheResolver, Record, Scalars['DateTime'] | string>, + id?: GraphCacheResolver, Record, Scalars['ID'] | string>, + isStarred?: GraphCacheResolver, Record, Scalars['Boolean'] | string>, + reqType?: GraphCacheResolver, Record, ReqType | string>, + request?: GraphCacheResolver, Record, Scalars['String'] | string>, + responseMetadata?: GraphCacheResolver, Record, Scalars['String'] | string>, + userUid?: GraphCacheResolver, Record, Scalars['ID'] | string> + }, + UserHistoryDeletedManyData?: { + count?: GraphCacheResolver, Record, Scalars['Int'] | string>, + reqType?: GraphCacheResolver, Record, ReqType | string> + }, + UserRequest?: { + collectionID?: GraphCacheResolver, Record, Scalars['ID'] | string>, + createdOn?: GraphCacheResolver, Record, Scalars['DateTime'] | string>, + id?: GraphCacheResolver, Record, Scalars['ID'] | string>, + request?: GraphCacheResolver, Record, Scalars['String'] | string>, + title?: GraphCacheResolver, Record, Scalars['String'] | string>, + type?: GraphCacheResolver, Record, ReqType | string>, + user?: GraphCacheResolver, Record, WithTypename | string> + }, + UserRequestReorderData?: { + nextRequest?: GraphCacheResolver, Record, WithTypename | string>, + request?: GraphCacheResolver, Record, WithTypename | string> + }, + UserSettings?: { + id?: GraphCacheResolver, Record, Scalars['ID'] | string>, + properties?: GraphCacheResolver, Record, Scalars['String'] | string>, + updatedOn?: GraphCacheResolver, Record, Scalars['DateTime'] | string>, + userUid?: GraphCacheResolver, Record, Scalars['ID'] | string> + } +}; + +export type GraphCacheOptimisticUpdaters = { + acceptTeamInvitation?: GraphCacheOptimisticMutationResolver>, + addUserToTeamByAdmin?: GraphCacheOptimisticMutationResolver>, + changeUserRoleInTeamByAdmin?: GraphCacheOptimisticMutationResolver>, + clearGlobalEnvironments?: GraphCacheOptimisticMutationResolver>, + createChildCollection?: GraphCacheOptimisticMutationResolver>, + createDuplicateEnvironment?: GraphCacheOptimisticMutationResolver>, + createGQLChildUserCollection?: GraphCacheOptimisticMutationResolver>, + createGQLRootUserCollection?: GraphCacheOptimisticMutationResolver>, + createGQLUserRequest?: GraphCacheOptimisticMutationResolver>, + createRESTChildUserCollection?: GraphCacheOptimisticMutationResolver>, + createRESTRootUserCollection?: GraphCacheOptimisticMutationResolver>, + createRESTUserRequest?: GraphCacheOptimisticMutationResolver>, + createRequestInCollection?: GraphCacheOptimisticMutationResolver>, + createRootCollection?: GraphCacheOptimisticMutationResolver>, + createShortcode?: GraphCacheOptimisticMutationResolver>, + createTeam?: GraphCacheOptimisticMutationResolver>, + createTeamByAdmin?: GraphCacheOptimisticMutationResolver>, + createTeamEnvironment?: GraphCacheOptimisticMutationResolver>, + createTeamInvitation?: GraphCacheOptimisticMutationResolver>, + createUserEnvironment?: GraphCacheOptimisticMutationResolver>, + createUserGlobalEnvironment?: GraphCacheOptimisticMutationResolver>, + createUserHistory?: GraphCacheOptimisticMutationResolver>, + createUserSettings?: GraphCacheOptimisticMutationResolver>, + deleteAllUserHistory?: GraphCacheOptimisticMutationResolver>, + deleteAllVariablesFromTeamEnvironment?: GraphCacheOptimisticMutationResolver>, + deleteCollection?: GraphCacheOptimisticMutationResolver, + deleteRequest?: GraphCacheOptimisticMutationResolver, + deleteTeam?: GraphCacheOptimisticMutationResolver, + deleteTeamByAdmin?: GraphCacheOptimisticMutationResolver, + deleteTeamEnvironment?: GraphCacheOptimisticMutationResolver, + deleteUser?: GraphCacheOptimisticMutationResolver, Scalars['Boolean']>, + deleteUserCollection?: GraphCacheOptimisticMutationResolver, + deleteUserEnvironment?: GraphCacheOptimisticMutationResolver, + deleteUserEnvironments?: GraphCacheOptimisticMutationResolver, Scalars['Int']>, + deleteUserRequest?: GraphCacheOptimisticMutationResolver, + importCollectionsFromJSON?: GraphCacheOptimisticMutationResolver, + importUserCollectionsFromJSON?: GraphCacheOptimisticMutationResolver, + inviteNewUser?: GraphCacheOptimisticMutationResolver>, + leaveTeam?: GraphCacheOptimisticMutationResolver, + makeUserAdmin?: GraphCacheOptimisticMutationResolver, + moveCollection?: GraphCacheOptimisticMutationResolver>, + moveRequest?: GraphCacheOptimisticMutationResolver>, + moveUserCollection?: GraphCacheOptimisticMutationResolver>, + moveUserRequest?: GraphCacheOptimisticMutationResolver>, + removeRequestFromHistory?: GraphCacheOptimisticMutationResolver>, + removeTeamMember?: GraphCacheOptimisticMutationResolver, + removeUserAsAdmin?: GraphCacheOptimisticMutationResolver, + removeUserByAdmin?: GraphCacheOptimisticMutationResolver, + removeUserFromTeamByAdmin?: GraphCacheOptimisticMutationResolver, + renameCollection?: GraphCacheOptimisticMutationResolver>, + renameTeam?: GraphCacheOptimisticMutationResolver>, + renameTeamByAdmin?: GraphCacheOptimisticMutationResolver>, + renameUserCollection?: GraphCacheOptimisticMutationResolver>, + replaceCollectionsWithJSON?: GraphCacheOptimisticMutationResolver, + revokeShortcode?: GraphCacheOptimisticMutationResolver, + revokeTeamInvitation?: GraphCacheOptimisticMutationResolver, + toggleHistoryStarStatus?: GraphCacheOptimisticMutationResolver>, + updateCollectionOrder?: GraphCacheOptimisticMutationResolver, + updateGQLUserRequest?: GraphCacheOptimisticMutationResolver>, + updateLookUpRequestOrder?: GraphCacheOptimisticMutationResolver, + updateRESTUserRequest?: GraphCacheOptimisticMutationResolver>, + updateRequest?: GraphCacheOptimisticMutationResolver>, + updateTeamEnvironment?: GraphCacheOptimisticMutationResolver>, + updateTeamMemberRole?: GraphCacheOptimisticMutationResolver>, + updateUserCollectionOrder?: GraphCacheOptimisticMutationResolver, + updateUserEnvironment?: GraphCacheOptimisticMutationResolver>, + updateUserSessions?: GraphCacheOptimisticMutationResolver>, + updateUserSettings?: GraphCacheOptimisticMutationResolver> +}; + +export type GraphCacheUpdaters = { + Mutation?: { + acceptTeamInvitation?: GraphCacheUpdateResolver<{ acceptTeamInvitation: WithTypename }, MutationAcceptTeamInvitationArgs>, + addUserToTeamByAdmin?: GraphCacheUpdateResolver<{ addUserToTeamByAdmin: WithTypename }, MutationAddUserToTeamByAdminArgs>, + changeUserRoleInTeamByAdmin?: GraphCacheUpdateResolver<{ changeUserRoleInTeamByAdmin: WithTypename }, MutationChangeUserRoleInTeamByAdminArgs>, + clearGlobalEnvironments?: GraphCacheUpdateResolver<{ clearGlobalEnvironments: WithTypename }, MutationClearGlobalEnvironmentsArgs>, + createChildCollection?: GraphCacheUpdateResolver<{ createChildCollection: WithTypename }, MutationCreateChildCollectionArgs>, + createDuplicateEnvironment?: GraphCacheUpdateResolver<{ createDuplicateEnvironment: WithTypename }, MutationCreateDuplicateEnvironmentArgs>, + createGQLChildUserCollection?: GraphCacheUpdateResolver<{ createGQLChildUserCollection: WithTypename }, MutationCreateGqlChildUserCollectionArgs>, + createGQLRootUserCollection?: GraphCacheUpdateResolver<{ createGQLRootUserCollection: WithTypename }, MutationCreateGqlRootUserCollectionArgs>, + createGQLUserRequest?: GraphCacheUpdateResolver<{ createGQLUserRequest: WithTypename }, MutationCreateGqlUserRequestArgs>, + createRESTChildUserCollection?: GraphCacheUpdateResolver<{ createRESTChildUserCollection: WithTypename }, MutationCreateRestChildUserCollectionArgs>, + createRESTRootUserCollection?: GraphCacheUpdateResolver<{ createRESTRootUserCollection: WithTypename }, MutationCreateRestRootUserCollectionArgs>, + createRESTUserRequest?: GraphCacheUpdateResolver<{ createRESTUserRequest: WithTypename }, MutationCreateRestUserRequestArgs>, + createRequestInCollection?: GraphCacheUpdateResolver<{ createRequestInCollection: WithTypename }, MutationCreateRequestInCollectionArgs>, + createRootCollection?: GraphCacheUpdateResolver<{ createRootCollection: WithTypename }, MutationCreateRootCollectionArgs>, + createShortcode?: GraphCacheUpdateResolver<{ createShortcode: WithTypename }, MutationCreateShortcodeArgs>, + createTeam?: GraphCacheUpdateResolver<{ createTeam: WithTypename }, MutationCreateTeamArgs>, + createTeamByAdmin?: GraphCacheUpdateResolver<{ createTeamByAdmin: WithTypename }, MutationCreateTeamByAdminArgs>, + createTeamEnvironment?: GraphCacheUpdateResolver<{ createTeamEnvironment: WithTypename }, MutationCreateTeamEnvironmentArgs>, + createTeamInvitation?: GraphCacheUpdateResolver<{ createTeamInvitation: WithTypename }, MutationCreateTeamInvitationArgs>, + createUserEnvironment?: GraphCacheUpdateResolver<{ createUserEnvironment: WithTypename }, MutationCreateUserEnvironmentArgs>, + createUserGlobalEnvironment?: GraphCacheUpdateResolver<{ createUserGlobalEnvironment: WithTypename }, MutationCreateUserGlobalEnvironmentArgs>, + createUserHistory?: GraphCacheUpdateResolver<{ createUserHistory: WithTypename }, MutationCreateUserHistoryArgs>, + createUserSettings?: GraphCacheUpdateResolver<{ createUserSettings: WithTypename }, MutationCreateUserSettingsArgs>, + deleteAllUserHistory?: GraphCacheUpdateResolver<{ deleteAllUserHistory: WithTypename }, MutationDeleteAllUserHistoryArgs>, + deleteAllVariablesFromTeamEnvironment?: GraphCacheUpdateResolver<{ deleteAllVariablesFromTeamEnvironment: WithTypename }, MutationDeleteAllVariablesFromTeamEnvironmentArgs>, + deleteCollection?: GraphCacheUpdateResolver<{ deleteCollection: Scalars['Boolean'] }, MutationDeleteCollectionArgs>, + deleteRequest?: GraphCacheUpdateResolver<{ deleteRequest: Scalars['Boolean'] }, MutationDeleteRequestArgs>, + deleteTeam?: GraphCacheUpdateResolver<{ deleteTeam: Scalars['Boolean'] }, MutationDeleteTeamArgs>, + deleteTeamByAdmin?: GraphCacheUpdateResolver<{ deleteTeamByAdmin: Scalars['Boolean'] }, MutationDeleteTeamByAdminArgs>, + deleteTeamEnvironment?: GraphCacheUpdateResolver<{ deleteTeamEnvironment: Scalars['Boolean'] }, MutationDeleteTeamEnvironmentArgs>, + deleteUser?: GraphCacheUpdateResolver<{ deleteUser: Scalars['Boolean'] }, Record>, + deleteUserCollection?: GraphCacheUpdateResolver<{ deleteUserCollection: Scalars['Boolean'] }, MutationDeleteUserCollectionArgs>, + deleteUserEnvironment?: GraphCacheUpdateResolver<{ deleteUserEnvironment: Scalars['Boolean'] }, MutationDeleteUserEnvironmentArgs>, + deleteUserEnvironments?: GraphCacheUpdateResolver<{ deleteUserEnvironments: Scalars['Int'] }, Record>, + deleteUserRequest?: GraphCacheUpdateResolver<{ deleteUserRequest: Scalars['Boolean'] }, MutationDeleteUserRequestArgs>, + importCollectionsFromJSON?: GraphCacheUpdateResolver<{ importCollectionsFromJSON: Scalars['Boolean'] }, MutationImportCollectionsFromJsonArgs>, + importUserCollectionsFromJSON?: GraphCacheUpdateResolver<{ importUserCollectionsFromJSON: Scalars['Boolean'] }, MutationImportUserCollectionsFromJsonArgs>, + inviteNewUser?: GraphCacheUpdateResolver<{ inviteNewUser: WithTypename }, MutationInviteNewUserArgs>, + leaveTeam?: GraphCacheUpdateResolver<{ leaveTeam: Scalars['Boolean'] }, MutationLeaveTeamArgs>, + makeUserAdmin?: GraphCacheUpdateResolver<{ makeUserAdmin: Scalars['Boolean'] }, MutationMakeUserAdminArgs>, + moveCollection?: GraphCacheUpdateResolver<{ moveCollection: WithTypename }, MutationMoveCollectionArgs>, + moveRequest?: GraphCacheUpdateResolver<{ moveRequest: WithTypename }, MutationMoveRequestArgs>, + moveUserCollection?: GraphCacheUpdateResolver<{ moveUserCollection: WithTypename }, MutationMoveUserCollectionArgs>, + moveUserRequest?: GraphCacheUpdateResolver<{ moveUserRequest: WithTypename }, MutationMoveUserRequestArgs>, + removeRequestFromHistory?: GraphCacheUpdateResolver<{ removeRequestFromHistory: WithTypename }, MutationRemoveRequestFromHistoryArgs>, + removeTeamMember?: GraphCacheUpdateResolver<{ removeTeamMember: Scalars['Boolean'] }, MutationRemoveTeamMemberArgs>, + removeUserAsAdmin?: GraphCacheUpdateResolver<{ removeUserAsAdmin: Scalars['Boolean'] }, MutationRemoveUserAsAdminArgs>, + removeUserByAdmin?: GraphCacheUpdateResolver<{ removeUserByAdmin: Scalars['Boolean'] }, MutationRemoveUserByAdminArgs>, + removeUserFromTeamByAdmin?: GraphCacheUpdateResolver<{ removeUserFromTeamByAdmin: Scalars['Boolean'] }, MutationRemoveUserFromTeamByAdminArgs>, + renameCollection?: GraphCacheUpdateResolver<{ renameCollection: WithTypename }, MutationRenameCollectionArgs>, + renameTeam?: GraphCacheUpdateResolver<{ renameTeam: WithTypename }, MutationRenameTeamArgs>, + renameTeamByAdmin?: GraphCacheUpdateResolver<{ renameTeamByAdmin: WithTypename }, MutationRenameTeamByAdminArgs>, + renameUserCollection?: GraphCacheUpdateResolver<{ renameUserCollection: WithTypename }, MutationRenameUserCollectionArgs>, + replaceCollectionsWithJSON?: GraphCacheUpdateResolver<{ replaceCollectionsWithJSON: Scalars['Boolean'] }, MutationReplaceCollectionsWithJsonArgs>, + revokeShortcode?: GraphCacheUpdateResolver<{ revokeShortcode: Scalars['Boolean'] }, MutationRevokeShortcodeArgs>, + revokeTeamInvitation?: GraphCacheUpdateResolver<{ revokeTeamInvitation: Scalars['Boolean'] }, MutationRevokeTeamInvitationArgs>, + toggleHistoryStarStatus?: GraphCacheUpdateResolver<{ toggleHistoryStarStatus: WithTypename }, MutationToggleHistoryStarStatusArgs>, + updateCollectionOrder?: GraphCacheUpdateResolver<{ updateCollectionOrder: Scalars['Boolean'] }, MutationUpdateCollectionOrderArgs>, + updateGQLUserRequest?: GraphCacheUpdateResolver<{ updateGQLUserRequest: WithTypename }, MutationUpdateGqlUserRequestArgs>, + updateLookUpRequestOrder?: GraphCacheUpdateResolver<{ updateLookUpRequestOrder: Scalars['Boolean'] }, MutationUpdateLookUpRequestOrderArgs>, + updateRESTUserRequest?: GraphCacheUpdateResolver<{ updateRESTUserRequest: WithTypename }, MutationUpdateRestUserRequestArgs>, + updateRequest?: GraphCacheUpdateResolver<{ updateRequest: WithTypename }, MutationUpdateRequestArgs>, + updateTeamEnvironment?: GraphCacheUpdateResolver<{ updateTeamEnvironment: WithTypename }, MutationUpdateTeamEnvironmentArgs>, + updateTeamMemberRole?: GraphCacheUpdateResolver<{ updateTeamMemberRole: WithTypename }, MutationUpdateTeamMemberRoleArgs>, + updateUserCollectionOrder?: GraphCacheUpdateResolver<{ updateUserCollectionOrder: Scalars['Boolean'] }, MutationUpdateUserCollectionOrderArgs>, + updateUserEnvironment?: GraphCacheUpdateResolver<{ updateUserEnvironment: WithTypename }, MutationUpdateUserEnvironmentArgs>, + updateUserSessions?: GraphCacheUpdateResolver<{ updateUserSessions: WithTypename }, MutationUpdateUserSessionsArgs>, + updateUserSettings?: GraphCacheUpdateResolver<{ updateUserSettings: WithTypename }, MutationUpdateUserSettingsArgs> + }, + Subscription?: { + collectionOrderUpdated?: GraphCacheUpdateResolver<{ collectionOrderUpdated: WithTypename }, SubscriptionCollectionOrderUpdatedArgs>, + myShortcodesCreated?: GraphCacheUpdateResolver<{ myShortcodesCreated: WithTypename }, Record>, + myShortcodesRevoked?: GraphCacheUpdateResolver<{ myShortcodesRevoked: WithTypename }, Record>, + requestMoved?: GraphCacheUpdateResolver<{ requestMoved: WithTypename }, SubscriptionRequestMovedArgs>, + requestOrderUpdated?: GraphCacheUpdateResolver<{ requestOrderUpdated: WithTypename }, SubscriptionRequestOrderUpdatedArgs>, + teamCollectionAdded?: GraphCacheUpdateResolver<{ teamCollectionAdded: WithTypename }, SubscriptionTeamCollectionAddedArgs>, + teamCollectionMoved?: GraphCacheUpdateResolver<{ teamCollectionMoved: WithTypename }, SubscriptionTeamCollectionMovedArgs>, + teamCollectionRemoved?: GraphCacheUpdateResolver<{ teamCollectionRemoved: Scalars['ID'] }, SubscriptionTeamCollectionRemovedArgs>, + teamCollectionUpdated?: GraphCacheUpdateResolver<{ teamCollectionUpdated: WithTypename }, SubscriptionTeamCollectionUpdatedArgs>, + teamEnvironmentCreated?: GraphCacheUpdateResolver<{ teamEnvironmentCreated: WithTypename }, SubscriptionTeamEnvironmentCreatedArgs>, + teamEnvironmentDeleted?: GraphCacheUpdateResolver<{ teamEnvironmentDeleted: WithTypename }, SubscriptionTeamEnvironmentDeletedArgs>, + teamEnvironmentUpdated?: GraphCacheUpdateResolver<{ teamEnvironmentUpdated: WithTypename }, SubscriptionTeamEnvironmentUpdatedArgs>, + teamInvitationAdded?: GraphCacheUpdateResolver<{ teamInvitationAdded: WithTypename }, SubscriptionTeamInvitationAddedArgs>, + teamInvitationRemoved?: GraphCacheUpdateResolver<{ teamInvitationRemoved: Scalars['ID'] }, SubscriptionTeamInvitationRemovedArgs>, + teamMemberAdded?: GraphCacheUpdateResolver<{ teamMemberAdded: WithTypename }, SubscriptionTeamMemberAddedArgs>, + teamMemberRemoved?: GraphCacheUpdateResolver<{ teamMemberRemoved: Scalars['ID'] }, SubscriptionTeamMemberRemovedArgs>, + teamMemberUpdated?: GraphCacheUpdateResolver<{ teamMemberUpdated: WithTypename }, SubscriptionTeamMemberUpdatedArgs>, + teamRequestAdded?: GraphCacheUpdateResolver<{ teamRequestAdded: WithTypename }, SubscriptionTeamRequestAddedArgs>, + teamRequestDeleted?: GraphCacheUpdateResolver<{ teamRequestDeleted: Scalars['ID'] }, SubscriptionTeamRequestDeletedArgs>, + teamRequestUpdated?: GraphCacheUpdateResolver<{ teamRequestUpdated: WithTypename }, SubscriptionTeamRequestUpdatedArgs>, + userCollectionCreated?: GraphCacheUpdateResolver<{ userCollectionCreated: WithTypename }, Record>, + userCollectionMoved?: GraphCacheUpdateResolver<{ userCollectionMoved: WithTypename }, Record>, + userCollectionOrderUpdated?: GraphCacheUpdateResolver<{ userCollectionOrderUpdated: WithTypename }, Record>, + userCollectionRemoved?: GraphCacheUpdateResolver<{ userCollectionRemoved: WithTypename }, Record>, + userCollectionUpdated?: GraphCacheUpdateResolver<{ userCollectionUpdated: WithTypename }, Record>, + userDeleted?: GraphCacheUpdateResolver<{ userDeleted: WithTypename }, Record>, + userEnvironmentCreated?: GraphCacheUpdateResolver<{ userEnvironmentCreated: WithTypename }, Record>, + userEnvironmentDeleteMany?: GraphCacheUpdateResolver<{ userEnvironmentDeleteMany: Scalars['Int'] }, Record>, + userEnvironmentDeleted?: GraphCacheUpdateResolver<{ userEnvironmentDeleted: WithTypename }, Record>, + userEnvironmentUpdated?: GraphCacheUpdateResolver<{ userEnvironmentUpdated: WithTypename }, Record>, + userHistoryCreated?: GraphCacheUpdateResolver<{ userHistoryCreated: WithTypename }, Record>, + userHistoryDeleted?: GraphCacheUpdateResolver<{ userHistoryDeleted: WithTypename }, Record>, + userHistoryDeletedMany?: GraphCacheUpdateResolver<{ userHistoryDeletedMany: WithTypename }, Record>, + userHistoryUpdated?: GraphCacheUpdateResolver<{ userHistoryUpdated: WithTypename }, Record>, + userInvited?: GraphCacheUpdateResolver<{ userInvited: WithTypename }, Record>, + userRequestCreated?: GraphCacheUpdateResolver<{ userRequestCreated: WithTypename }, Record>, + userRequestDeleted?: GraphCacheUpdateResolver<{ userRequestDeleted: WithTypename }, Record>, + userRequestMoved?: GraphCacheUpdateResolver<{ userRequestMoved: WithTypename }, Record>, + userRequestUpdated?: GraphCacheUpdateResolver<{ userRequestUpdated: WithTypename }, Record>, + userSettingsCreated?: GraphCacheUpdateResolver<{ userSettingsCreated: WithTypename }, Record>, + userSettingsUpdated?: GraphCacheUpdateResolver<{ userSettingsUpdated: WithTypename }, Record>, + userUpdated?: GraphCacheUpdateResolver<{ userUpdated: WithTypename }, Record> + }, +}; + +export type GraphCacheConfig = { + schema?: IntrospectionData, + updates?: GraphCacheUpdaters, + keys?: GraphCacheKeysConfig, + optimistic?: GraphCacheOptimisticUpdaters, + resolvers?: GraphCacheResolvers, + storage?: GraphCacheStorageAdapter +}; \ No newline at end of file diff --git a/packages/hoppscotch-selfhost-desktop/src/api/mutations/ClearGlobalEnvironments.graphql b/packages/hoppscotch-selfhost-desktop/src/api/mutations/ClearGlobalEnvironments.graphql new file mode 100644 index 000000000..5a184fcf8 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/mutations/ClearGlobalEnvironments.graphql @@ -0,0 +1,5 @@ +mutation ClearGlobalEnvironments($id: ID!) { + clearGlobalEnvironments(id: $id) { + id + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateGQLChildUserCollection.graphql b/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateGQLChildUserCollection.graphql new file mode 100644 index 000000000..54dc80c48 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateGQLChildUserCollection.graphql @@ -0,0 +1,11 @@ +mutation CreateGQLChildUserCollection( + $title: String! + $parentUserCollectionID: ID! +) { + createGQLChildUserCollection( + title: $title + parentUserCollectionID: $parentUserCollectionID + ) { + id + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateGQLRootUserCollection.graphql b/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateGQLRootUserCollection.graphql new file mode 100644 index 000000000..eecdebe17 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateGQLRootUserCollection.graphql @@ -0,0 +1,5 @@ +mutation CreateGQLRootUserCollection($title: String!) { + createGQLRootUserCollection(title: $title) { + id + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateGQLUserRequest.graphql b/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateGQLUserRequest.graphql new file mode 100644 index 000000000..02423e864 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateGQLUserRequest.graphql @@ -0,0 +1,13 @@ +mutation CreateGQLUserRequest( + $title: String! + $request: String! + $collectionID: ID! +) { + createGQLUserRequest( + title: $title + request: $request + collectionID: $collectionID + ) { + id + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateRESTChildUserCollection.graphql b/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateRESTChildUserCollection.graphql new file mode 100644 index 000000000..40b38aca7 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateRESTChildUserCollection.graphql @@ -0,0 +1,11 @@ +mutation CreateRESTChildUserCollection( + $title: String! + $parentUserCollectionID: ID! +) { + createRESTChildUserCollection( + title: $title + parentUserCollectionID: $parentUserCollectionID + ) { + id + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateRESTRootUserCollection.graphql b/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateRESTRootUserCollection.graphql new file mode 100644 index 000000000..8c54f0c2b --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateRESTRootUserCollection.graphql @@ -0,0 +1,5 @@ +mutation CreateRESTRootUserCollection($title: String!) { + createRESTRootUserCollection(title: $title) { + id + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateRESTUserRequest.graphql b/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateRESTUserRequest.graphql new file mode 100644 index 000000000..01d51b0c0 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateRESTUserRequest.graphql @@ -0,0 +1,13 @@ +mutation CreateRESTUserRequest( + $collectionID: ID! + $title: String! + $request: String! +) { + createRESTUserRequest( + collectionID: $collectionID + title: $title + request: $request + ) { + id + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateUserEnvironment.graphql b/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateUserEnvironment.graphql new file mode 100644 index 000000000..186510644 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateUserEnvironment.graphql @@ -0,0 +1,9 @@ +mutation CreateUserEnvironment($name: String!, $variables: String!) { + createUserEnvironment(name: $name, variables: $variables) { + id + userUid + name + variables + isGlobal + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateUserGlobalEnvironment.graphql b/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateUserGlobalEnvironment.graphql new file mode 100644 index 000000000..8e7553f32 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateUserGlobalEnvironment.graphql @@ -0,0 +1,5 @@ +mutation CreateUserGlobalEnvironment($variables: String!) { + createUserGlobalEnvironment(variables: $variables) { + id + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateUserHistory.graphql b/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateUserHistory.graphql new file mode 100644 index 000000000..ef9da5c66 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateUserHistory.graphql @@ -0,0 +1,13 @@ +mutation CreateUserHistory( + $reqData: String! + $resMetadata: String! + $reqType: ReqType! +) { + createUserHistory( + reqData: $reqData + resMetadata: $resMetadata + reqType: $reqType + ) { + id + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateUserSettings.graphql b/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateUserSettings.graphql new file mode 100644 index 000000000..2ada8a1fa --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/mutations/CreateUserSettings.graphql @@ -0,0 +1,5 @@ +mutation CreateUserSettings($properties: String!) { + createUserSettings(properties: $properties) { + id + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/mutations/DeleteAllUserHistory.graphql b/packages/hoppscotch-selfhost-desktop/src/api/mutations/DeleteAllUserHistory.graphql new file mode 100644 index 000000000..3e5085870 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/mutations/DeleteAllUserHistory.graphql @@ -0,0 +1,6 @@ +mutation DeleteAllUserHistory($reqType: ReqType!) { + deleteAllUserHistory(reqType: $reqType) { + count + reqType + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/mutations/DeleteUserCollection.graphql b/packages/hoppscotch-selfhost-desktop/src/api/mutations/DeleteUserCollection.graphql new file mode 100644 index 000000000..cafa7b08a --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/mutations/DeleteUserCollection.graphql @@ -0,0 +1,3 @@ +mutation DeleteUserCollection($userCollectionID: ID!) { + deleteUserCollection(userCollectionID: $userCollectionID) +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/mutations/DeleteUserEnvironments.graphql b/packages/hoppscotch-selfhost-desktop/src/api/mutations/DeleteUserEnvironments.graphql new file mode 100644 index 000000000..148971933 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/mutations/DeleteUserEnvironments.graphql @@ -0,0 +1,3 @@ +mutation DeleteUserEnvironment($id: ID!) { + deleteUserEnvironment(id: $id) +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/mutations/DeleteUserRequest.graphql b/packages/hoppscotch-selfhost-desktop/src/api/mutations/DeleteUserRequest.graphql new file mode 100644 index 000000000..c4855e807 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/mutations/DeleteUserRequest.graphql @@ -0,0 +1,3 @@ +mutation DeleteUserRequest($requestID: ID!) { + deleteUserRequest(id: $requestID) +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/mutations/MoveUserCollection.graphql b/packages/hoppscotch-selfhost-desktop/src/api/mutations/MoveUserCollection.graphql new file mode 100644 index 000000000..ac280122f --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/mutations/MoveUserCollection.graphql @@ -0,0 +1,8 @@ +mutation MoveUserCollection($destCollectionID: ID, $userCollectionID: ID!) { + moveUserCollection( + destCollectionID: $destCollectionID + userCollectionID: $userCollectionID + ) { + id + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/mutations/MoveUserRequest.graphql b/packages/hoppscotch-selfhost-desktop/src/api/mutations/MoveUserRequest.graphql new file mode 100644 index 000000000..38f8e6ca7 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/mutations/MoveUserRequest.graphql @@ -0,0 +1,15 @@ +mutation MoveUserRequest( + $sourceCollectionID: ID! + $requestID: ID! + $destinationCollectionID: ID! + $nextRequestID: ID +) { + moveUserRequest( + sourceCollectionID: $sourceCollectionID + requestID: $requestID + destinationCollectionID: $destinationCollectionID + nextRequestID: $nextRequestID + ) { + id + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/mutations/RemoveRequestFromHistory.graphql b/packages/hoppscotch-selfhost-desktop/src/api/mutations/RemoveRequestFromHistory.graphql new file mode 100644 index 000000000..a0dd3e988 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/mutations/RemoveRequestFromHistory.graphql @@ -0,0 +1,5 @@ +mutation RemoveRequestFromHistory($id: ID!) { + removeRequestFromHistory(id: $id) { + id + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/mutations/RenameUserCollection.graphql b/packages/hoppscotch-selfhost-desktop/src/api/mutations/RenameUserCollection.graphql new file mode 100644 index 000000000..35603cea6 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/mutations/RenameUserCollection.graphql @@ -0,0 +1,8 @@ +mutation RenameUserCollection($userCollectionID: ID!, $newTitle: String!) { + renameUserCollection( + userCollectionID: $userCollectionID + newTitle: $newTitle + ) { + id + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/mutations/ToggleHistoryStarStatus.graphql b/packages/hoppscotch-selfhost-desktop/src/api/mutations/ToggleHistoryStarStatus.graphql new file mode 100644 index 000000000..33bf9c173 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/mutations/ToggleHistoryStarStatus.graphql @@ -0,0 +1,5 @@ +mutation ToggleHistoryStarStatus($id: ID!) { + toggleHistoryStarStatus(id: $id) { + id + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/mutations/UpdateGQLUserRequest.graphql b/packages/hoppscotch-selfhost-desktop/src/api/mutations/UpdateGQLUserRequest.graphql new file mode 100644 index 000000000..253fed7db --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/mutations/UpdateGQLUserRequest.graphql @@ -0,0 +1,5 @@ +mutation UpdateGQLUserRequest($id: ID!, $request: String!, $title: String) { + updateGQLUserRequest(id: $id, request: $request, title: $title) { + id + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/mutations/UpdateRESTUserRequest.graphql b/packages/hoppscotch-selfhost-desktop/src/api/mutations/UpdateRESTUserRequest.graphql new file mode 100644 index 000000000..b7899df9e --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/mutations/UpdateRESTUserRequest.graphql @@ -0,0 +1,7 @@ +mutation UpdateRESTUserRequest($id: ID!, $title: String!, $request: String!) { + updateRESTUserRequest(id: $id, title: $title, request: $request) { + id + collectionID + request + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/mutations/UpdateUserCollectionOrder.graphql b/packages/hoppscotch-selfhost-desktop/src/api/mutations/UpdateUserCollectionOrder.graphql new file mode 100644 index 000000000..c9e665be0 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/mutations/UpdateUserCollectionOrder.graphql @@ -0,0 +1,6 @@ +mutation UpdateUserCollectionOrder($collectionID: ID!, $nextCollectionID: ID) { + updateUserCollectionOrder( + collectionID: $collectionID + nextCollectionID: $nextCollectionID + ) +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/mutations/UpdateUserEnvironment.graphql b/packages/hoppscotch-selfhost-desktop/src/api/mutations/UpdateUserEnvironment.graphql new file mode 100644 index 000000000..c849a1541 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/mutations/UpdateUserEnvironment.graphql @@ -0,0 +1,9 @@ +mutation UpdateUserEnvironment($id: ID!, $name: String!, $variables: String!) { + updateUserEnvironment(id: $id, name: $name, variables: $variables) { + id + userUid + name + variables + isGlobal + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/mutations/UpdateUserSession.graphql b/packages/hoppscotch-selfhost-desktop/src/api/mutations/UpdateUserSession.graphql new file mode 100644 index 000000000..5ce87e5b6 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/mutations/UpdateUserSession.graphql @@ -0,0 +1,11 @@ +mutation UpdateUserSession( + $currentSession: String! + $sessionType: SessionType! +) { + updateUserSessions( + currentSession: $currentSession + sessionType: $sessionType + ) { + currentRESTSession + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/mutations/UpdateUserSettings.graphql b/packages/hoppscotch-selfhost-desktop/src/api/mutations/UpdateUserSettings.graphql new file mode 100644 index 000000000..85bb4b0e6 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/mutations/UpdateUserSettings.graphql @@ -0,0 +1,5 @@ +mutation UpdateUserSettings($properties: String!) { + updateUserSettings(properties: $properties) { + id + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/queries/CreateUserEnvironment.graphql b/packages/hoppscotch-selfhost-desktop/src/api/queries/CreateUserEnvironment.graphql new file mode 100644 index 000000000..186510644 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/queries/CreateUserEnvironment.graphql @@ -0,0 +1,9 @@ +mutation CreateUserEnvironment($name: String!, $variables: String!) { + createUserEnvironment(name: $name, variables: $variables) { + id + userUid + name + variables + isGlobal + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/queries/ExportUserCollectionsToJSON.graphql b/packages/hoppscotch-selfhost-desktop/src/api/queries/ExportUserCollectionsToJSON.graphql new file mode 100644 index 000000000..09f54adb9 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/queries/ExportUserCollectionsToJSON.graphql @@ -0,0 +1,12 @@ +query ExportUserCollectionsToJSON( + $collectionID: ID + $collectionType: ReqType! +) { + exportUserCollectionsToJSON( + collectionID: $collectionID + collectionType: $collectionType + ) { + collectionType + exportedCollection + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/queries/GetCurrentRESTSession.graphql b/packages/hoppscotch-selfhost-desktop/src/api/queries/GetCurrentRESTSession.graphql new file mode 100644 index 000000000..fee09e491 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/queries/GetCurrentRESTSession.graphql @@ -0,0 +1,5 @@ +query GetCurrentRESTSession { + me { + currentRESTSession + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/queries/GetGlobalEnvironments.graphql b/packages/hoppscotch-selfhost-desktop/src/api/queries/GetGlobalEnvironments.graphql new file mode 100644 index 000000000..08d3c2143 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/queries/GetGlobalEnvironments.graphql @@ -0,0 +1,11 @@ +query GetGlobalEnvironments { + me { + globalEnvironments { + id + isGlobal + name + userUid + variables + } + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/queries/GetRestUserHistory.graphql b/packages/hoppscotch-selfhost-desktop/src/api/queries/GetRestUserHistory.graphql new file mode 100644 index 000000000..144861594 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/queries/GetRestUserHistory.graphql @@ -0,0 +1,23 @@ +query GetRESTUserHistory { + me { + RESTHistory { + id + userUid + reqType + request + responseMetadata + isStarred + executedOn + } + + GQLHistory { + id + userUid + reqType + request + responseMetadata + isStarred + executedOn + } + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/queries/GetRootGQLUserCollections.graphql b/packages/hoppscotch-selfhost-desktop/src/api/queries/GetRootGQLUserCollections.graphql new file mode 100644 index 000000000..fcc80d993 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/queries/GetRootGQLUserCollections.graphql @@ -0,0 +1,13 @@ +query GetGQLRootUserCollections { + # the frontend doesnt paginate right now, so giving take a big enough value to get all collections at once + rootGQLUserCollections(take: 99999) { + id + title + type + childrenGQL { + id + title + type + } + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/queries/GetUserEnvironments.graphql b/packages/hoppscotch-selfhost-desktop/src/api/queries/GetUserEnvironments.graphql new file mode 100644 index 000000000..0bbeddbb4 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/queries/GetUserEnvironments.graphql @@ -0,0 +1,11 @@ +query GetUserEnvironments { + me { + environments { + id + isGlobal + name + userUid + variables + } + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/queries/GetUserRootCollections.graphql b/packages/hoppscotch-selfhost-desktop/src/api/queries/GetUserRootCollections.graphql new file mode 100644 index 000000000..0b6842339 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/queries/GetUserRootCollections.graphql @@ -0,0 +1,13 @@ +query GetUserRootCollections { + # the frontend doesnt paginate right now, so giving take a big enough value to get all collections at once + rootRESTUserCollections(take: 99999) { + id + title + type + childrenREST { + id + title + type + } + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/queries/GetUserSettings.graphql b/packages/hoppscotch-selfhost-desktop/src/api/queries/GetUserSettings.graphql new file mode 100644 index 000000000..1ac94553e --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/queries/GetUserSettings.graphql @@ -0,0 +1,8 @@ +query GetUserSettings { + me { + settings { + id + properties + } + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserCollectionCreated.graphql b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserCollectionCreated.graphql new file mode 100644 index 000000000..99870281c --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserCollectionCreated.graphql @@ -0,0 +1,10 @@ +subscription UserCollectionCreated { + userCollectionCreated { + parent { + id + } + id + title + type + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserCollectionMoved.graphql b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserCollectionMoved.graphql new file mode 100644 index 000000000..ed69fa99b --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserCollectionMoved.graphql @@ -0,0 +1,9 @@ +subscription UserCollectionMoved { + userCollectionMoved { + id + parent { + id + } + type + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserCollectionOrderUpdated.graphql b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserCollectionOrderUpdated.graphql new file mode 100644 index 000000000..6b181af88 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserCollectionOrderUpdated.graphql @@ -0,0 +1,17 @@ +subscription UserCollectionOrderUpdated { + userCollectionOrderUpdated { + userCollection { + id + parent { + id + } + } + + nextUserCollection { + id + parent { + id + } + } + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserCollectionRemoved.graphql b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserCollectionRemoved.graphql new file mode 100644 index 000000000..a3deba560 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserCollectionRemoved.graphql @@ -0,0 +1,6 @@ +subscription UserCollectionRemoved { + userCollectionRemoved { + id + type + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserCollectionUpdated.graphql b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserCollectionUpdated.graphql new file mode 100644 index 000000000..3fd8487d0 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserCollectionUpdated.graphql @@ -0,0 +1,10 @@ +subscription userCollectionUpdated { + userCollectionUpdated { + id + title + type + parent { + id + } + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserEnvironmentCreated.graphql b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserEnvironmentCreated.graphql new file mode 100644 index 000000000..49fb4b651 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserEnvironmentCreated.graphql @@ -0,0 +1,9 @@ +subscription UserEnvironmentCreated { + userEnvironmentCreated { + id + isGlobal + name + userUid + variables + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserEnvironmentDeleted.graphql b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserEnvironmentDeleted.graphql new file mode 100644 index 000000000..1ceb27e21 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserEnvironmentDeleted.graphql @@ -0,0 +1,5 @@ +subscription UserEnvironmentDeleted { + userEnvironmentDeleted { + id + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserEnvironmentUpdated.graphql b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserEnvironmentUpdated.graphql new file mode 100644 index 000000000..730c33e57 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserEnvironmentUpdated.graphql @@ -0,0 +1,9 @@ +subscription UserEnvironmentUpdated { + userEnvironmentUpdated { + id + userUid + name + variables + isGlobal + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserHistoryCreated.graphql b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserHistoryCreated.graphql new file mode 100644 index 000000000..f513671ab --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserHistoryCreated.graphql @@ -0,0 +1,10 @@ +subscription UserHistoryCreated { + userHistoryCreated { + id + reqType + request + responseMetadata + isStarred + executedOn + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserHistoryDeleted.graphql b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserHistoryDeleted.graphql new file mode 100644 index 000000000..ba6540fe2 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserHistoryDeleted.graphql @@ -0,0 +1,6 @@ +subscription userHistoryDeleted { + userHistoryDeleted { + id + reqType + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserHistoryDeletedMany.graphql b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserHistoryDeletedMany.graphql new file mode 100644 index 000000000..fae7aca62 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserHistoryDeletedMany.graphql @@ -0,0 +1,6 @@ +subscription UserHistoryDeletedMany { + userHistoryDeletedMany { + count + reqType + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserHistoryUpdated.graphql b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserHistoryUpdated.graphql new file mode 100644 index 000000000..a673edb72 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserHistoryUpdated.graphql @@ -0,0 +1,10 @@ +subscription UserHistoryUpdated { + userHistoryUpdated { + id + reqType + request + responseMetadata + isStarred + executedOn + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserRequestCreated.graphql b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserRequestCreated.graphql new file mode 100644 index 000000000..462bc2461 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserRequestCreated.graphql @@ -0,0 +1,9 @@ +subscription UserRequestCreated { + userRequestCreated { + id + collectionID + title + request + type + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserRequestDeleted.graphql b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserRequestDeleted.graphql new file mode 100644 index 000000000..6ef26f14c --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserRequestDeleted.graphql @@ -0,0 +1,9 @@ +subscription UserRequestDeleted { + userRequestDeleted { + id + collectionID + title + request + type + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserRequestMoved.graphql b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserRequestMoved.graphql new file mode 100644 index 000000000..01a0fb24a --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserRequestMoved.graphql @@ -0,0 +1,13 @@ +subscription UserRequestMoved { + userRequestMoved { + request { + id + collectionID + type + } + nextRequest { + id + collectionID + } + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserRequestUpdated.graphql b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserRequestUpdated.graphql new file mode 100644 index 000000000..b8c7f6e27 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserRequestUpdated.graphql @@ -0,0 +1,9 @@ +subscription UserRequestUpdated { + userRequestUpdated { + id + collectionID + title + request + type + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserSettingsUpdated.graphql b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserSettingsUpdated.graphql new file mode 100644 index 000000000..4b8f6a6e7 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/api/subscriptions/UserSettingsUpdated.graphql @@ -0,0 +1,6 @@ +subscription UserSettingsUpdated { + userSettingsUpdated { + id + properties + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/lib/sync/index.ts b/packages/hoppscotch-selfhost-desktop/src/lib/sync/index.ts new file mode 100644 index 000000000..1427e600d --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/lib/sync/index.ts @@ -0,0 +1,102 @@ +import { Observable } from "rxjs" +import DispatchingStore from "@hoppscotch/common/newstore/DispatchingStore" + +export type DispatchersOf> = + T extends DispatchingStore + ? U extends Record + ? D + : never + : never + +export type StoreSyncDefinitionOf> = { + [x in DispatchersOf]?: T extends DispatchingStore + ? U extends Record + ? U[x] extends (x: any, y: infer Y) => any + ? (payload: Y) => void + : never + : never + : never +} + +let _isRunningDispatchWithoutSyncing = true + +export function runDispatchWithOutSyncing(func: () => void) { + _isRunningDispatchWithoutSyncing = false + func() + _isRunningDispatchWithoutSyncing = true +} + +export const getSyncInitFunction = >( + store: T, + storeSyncDefinition: StoreSyncDefinitionOf, + shouldSyncValue: () => boolean, + shouldSyncObservable?: Observable +) => { + let startSubscriptions: () => () => void | undefined + let stopSubscriptions: () => void | undefined + + let oldSyncStatus = shouldSyncValue() + + // Start and stop the subscriptions according to the sync settings from profile + shouldSyncObservable && + shouldSyncObservable.subscribe((newSyncStatus) => { + if (oldSyncStatus === true && newSyncStatus === false) { + stopListeningToSubscriptions() + } else if (oldSyncStatus === false && newSyncStatus === true) { + startListeningToSubscriptions() + } + + oldSyncStatus = newSyncStatus + }) + + function startStoreSync() { + store.dispatches$.subscribe((actionParams) => { + // typescript cannot understand that the dispatcher can be the index, so casting to any + if ((storeSyncDefinition as any)[actionParams.dispatcher]) { + const dispatcher = actionParams.dispatcher + const payload = actionParams.payload + + const operationMapperFunction = (storeSyncDefinition as any)[dispatcher] + + if ( + operationMapperFunction && + _isRunningDispatchWithoutSyncing && + shouldSyncValue() + ) { + operationMapperFunction(payload) + } + } + }) + } + + function setupSubscriptions(func: () => () => void) { + startSubscriptions = func + } + + function startListeningToSubscriptions() { + if (!startSubscriptions) { + console.warn( + "We don't have a function to start subscriptions. Please use `setupSubscriptions` to setup the start function." + ) + } + + stopSubscriptions = startSubscriptions() + } + + function stopListeningToSubscriptions() { + if (!stopSubscriptions) { + console.warn( + "We don't have a function to unsubscribe. make sure you return the unsubscribe function when using setupSubscriptions" + ) + } + + stopSubscriptions() + } + + return { + startStoreSync, + setupSubscriptions, + startListeningToSubscriptions, + stopListeningToSubscriptions, + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/lib/sync/mapper.ts b/packages/hoppscotch-selfhost-desktop/src/lib/sync/mapper.ts new file mode 100644 index 000000000..b303243a6 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/lib/sync/mapper.ts @@ -0,0 +1,42 @@ +export const createMapper = < + LocalIDType extends string | number, + BackendIDType extends string | number +>() => { + const backendIDByLocalIDMap = new Map< + LocalIDType, + BackendIDType | undefined + >() + const localIDByBackendIDMap = new Map< + BackendIDType, + LocalIDType | undefined + >() + + return { + addEntry(localIdentifier: LocalIDType, backendIdentifier: BackendIDType) { + backendIDByLocalIDMap.set(localIdentifier, backendIdentifier) + localIDByBackendIDMap.set(backendIdentifier, localIdentifier) + }, + getValue() { + return backendIDByLocalIDMap + }, + getBackendIDByLocalID(localIdentifier: LocalIDType) { + return backendIDByLocalIDMap.get(localIdentifier) + }, + getLocalIDByBackendID(backendId: BackendIDType) { + return localIDByBackendIDMap.get(backendId) + }, + removeEntry(backendId?: BackendIDType, index?: LocalIDType) { + if (backendId) { + const index = localIDByBackendIDMap.get(backendId) + + localIDByBackendIDMap.delete(backendId) + index && backendIDByLocalIDMap.delete(index) + } else if (index) { + const backendId = backendIDByLocalIDMap.get(index) + + backendIDByLocalIDMap.delete(index) + backendId && localIDByBackendIDMap.delete(backendId) + } + }, + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/main.ts b/packages/hoppscotch-selfhost-desktop/src/main.ts new file mode 100644 index 000000000..6eb3ceb5a --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/main.ts @@ -0,0 +1,114 @@ +import { createHoppApp } from "@hoppscotch/common" +import { def as authDef } from "./platform/auth" +import { def as environmentsDef } from "./platform/environments/environments.platform" +import { def as collectionsDef } from "./platform/collections/collections.platform" +import { def as settingsDef } from "./platform/settings/settings.platform" +import { def as historyDef } from "./platform/history/history.platform" +import { def as tabStateDef } from "./platform/tabState/tabState.platform" +import { localclientInterceptor } from "./platform/std/interceptors/localclient" +import { browserInterceptor } from "@hoppscotch/common/platform/std/interceptors/browser" +import { proxyInterceptor } from "@hoppscotch/common/platform/std/interceptors/proxy" +import { ExtensionInspectorService } from "@hoppscotch/common/platform/std/inspections/extension.inspector" +import { ExtensionInterceptorService } from "@hoppscotch/common/platform/std/interceptors/extension" +import { nextTick, ref, watch } from "vue" +import { emit, listen } from "@tauri-apps/api/event" +import { type } from "@tauri-apps/api/os" +import { useSettingStatic } from "@hoppscotch/common/composables/settings" +import { appWindow } from "@tauri-apps/api/window" +import { stdFooterItems } from "@hoppscotch/common/platform/std/ui/footerItem" +import { stdSupportOptionItems } from "@hoppscotch/common/platform/std/ui/supportOptionsItem" +import { useMousePressed } from "@vueuse/core" + +const headerPaddingLeft = ref("0px") +const headerPaddingTop = ref("0px") + +createHoppApp("#app", { + ui: { + additionalFooterMenuItems: stdFooterItems, + additionalSupportOptionsMenuItems: stdSupportOptionItems, + appHeader: { + paddingLeft: headerPaddingLeft, + paddingTop: headerPaddingTop, + }, + }, + auth: authDef, + sync: { + environments: environmentsDef, + collections: collectionsDef, + settings: settingsDef, + history: historyDef, + tabState: tabStateDef, + }, + interceptors: { + default: "localclient", + interceptors: [ + { type: "standalone", interceptor: localclientInterceptor }, + { type: "standalone", interceptor: browserInterceptor }, + { type: "standalone", interceptor: proxyInterceptor }, + { type: "service", service: ExtensionInterceptorService }, + ], + }, + additionalInspectors: [ + { type: "service", service: ExtensionInspectorService }, + ], + platformFeatureFlags: { + exportAsGIST: false, + hasTelemetry: false, + }, +}) + +watch( + useSettingStatic("BG_COLOR")[0], + async () => { + await nextTick() + + await emit( + "hopp-bg-changed", + getComputedStyle(document.documentElement).getPropertyValue( + "--primary-color" + ) + ) + }, + { immediate: true } +) +;(async () => { + const platform = await type() + + if (platform === "Darwin") { + listen("will-enter-fullscreen", () => { + headerPaddingTop.value = "0px" + headerPaddingLeft.value = "0px" + }) + + listen("will-exit-fullscreen", () => { + headerPaddingTop.value = "2px" + headerPaddingLeft.value = "70px" + }) + + headerPaddingTop.value = "2px" + headerPaddingLeft.value = "70px" + } +})() + +const { pressed } = useMousePressed() + +document.addEventListener("mousemove", (ev) => { + const { clientX, clientY } = ev + + const el = document.querySelector("header") + + if (!el) return + + const { left, top, width, height } = el.getBoundingClientRect() + + if ( + clientX >= left && + clientX <= left + width && + clientY >= top && + clientY <= top + height + ) { + if (pressed.value) { + appWindow.startDragging() + } + } +}) diff --git a/packages/hoppscotch-selfhost-desktop/src/platform/auth.ts b/packages/hoppscotch-selfhost-desktop/src/platform/auth.ts new file mode 100644 index 000000000..b91eb01c4 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/platform/auth.ts @@ -0,0 +1,373 @@ +import axios from "axios" +import { + AuthEvent, + AuthPlatformDef, + HoppUser, +} from "@hoppscotch/common/platform/auth" +import { BehaviorSubject, Subject } from "rxjs" +import { + getLocalConfig, + removeLocalConfig, + setLocalConfig, +} from "@hoppscotch/common/newstore/localpersistence" +import { Ref, ref, watch } from "vue" +import { open } from '@tauri-apps/api/shell' +import { Body, getClient } from '@tauri-apps/api/http' +import { listen } from '@tauri-apps/api/event' +import { Store } from "tauri-plugin-store-api"; +import { P } from "@tauri-apps/api/event-41a9edf5" + +export const authEvents$ = new Subject() +const currentUser$ = new BehaviorSubject(null) +export const probableUser$ = new BehaviorSubject(null) + +async function logout() { + let client = await getClient(); + await client.get(`${import.meta.env.VITE_BACKEND_API_URL}/auth/logout`) + + const store = new Store("/Users/vivek/.creds.dat") + await store.set("refresh_token", {}) + await store.set("access_token", {}) + await store.save() +} + +async function signInUserWithGithubFB() { + await open(`${import.meta.env.VITE_BACKEND_API_URL}/auth/github?redirect_uri=desktop`); +} + +async function signInUserWithGoogleFB() { + await open(`${import.meta.env.VITE_BACKEND_API_URL}/auth/google?redirect_uri=desktop`); +} + +async function signInUserWithMicrosoftFB() { + await open(`${import.meta.env.VITE_BACKEND_API_URL}/auth/microsoft?redirect_uri=desktop`); +} + +async function getInitialUserDetails() { + const store = new Store("/Users/vivek/.creds.dat"); + + try { + const accessToken = await store.get("access_token") + let client = await getClient() + let body = { + query: `query Me { + me { + uid + displayName + email + photoURL + isAdmin + createdOn + } + }`} + + let res = await client.post(`${import.meta.env.VITE_BACKEND_GQL_URL}`, + Body.json(body), { + headers: { + "Cookie": `access_token=${accessToken.value}`, + } + } + ) + + return res.data + } catch (error) { + let res = { + error: "auth/cookies_not_found" + } + + return res + } +} + +const isGettingInitialUser: Ref = ref(null) + +function setUser(user: HoppUser | null) { + currentUser$.next(user) + probableUser$.next(user) + + setLocalConfig("login_state", JSON.stringify(user)) +} + +async function setInitialUser() { + isGettingInitialUser.value = true + const res = await getInitialUserDetails() + + const error = res.errors && res.errors[0] + + // no cookies sent. so the user is not logged in + if (error && error.message === "auth/cookies_not_found") { + setUser(null) + isGettingInitialUser.value = false + return + } + + if (error && error.message === "user/not_found") { + setUser(null) + isGettingInitialUser.value = false + return + } + + // cookies sent, but it is expired, we need to refresh the token + if (error && error.message === "Unauthorized") { + const isRefreshSuccess = await refreshToken() + + if (isRefreshSuccess) { + setInitialUser() + } else { + setUser(null) + isGettingInitialUser.value = false + } + + return + } + + // no errors, we have a valid user + if (res.data && res.data.me) { + const hoppBackendUser = res.data.me + + const hoppUser: HoppUser = { + uid: hoppBackendUser.uid, + displayName: hoppBackendUser.displayName, + email: hoppBackendUser.email, + photoURL: hoppBackendUser.photoURL, + // all our signin methods currently guarantees the email is verified + emailVerified: true, + } + + setUser(hoppUser) + + isGettingInitialUser.value = false + + authEvents$.next({ + event: "login", + user: hoppUser, + }) + + return + } +} + +async function refreshToken() { + const store = new Store("/Users/vivek/.creds.dat"); + try { + const refreshToken = await store.get("refresh_token") + + let client = await getClient() + let res = await client.get(`${import.meta.env.VITE_BACKEND_API_URL}/auth/refresh`, { + headers: { "Cookie": `refresh_token=${refreshToken.value}` } + }) + + setAuthCookies(res.rawHeaders) + + const isSuccessful = res.status === 200 + + if (isSuccessful) { + authEvents$.next({ + event: "token_refresh", + }) + } + + return isSuccessful + } catch (err) { + return false + } +} + +async function sendMagicLink(email: string) { + const client = await getClient(); + let url = `${import.meta.env.VITE_BACKEND_API_URL}/auth/signin?origin=desktop`; + + const res = await client.post(url, Body.json({ email })); + + if (res.data && res.data.deviceIdentifier) { + setLocalConfig("deviceIdentifier", res.data.deviceIdentifier) + } else { + throw new Error("test: does not get device identifier") + } + + return res.data +} + +async function setAuthCookies(rawHeaders: Array) { + let cookies = rawHeaders['set-cookie'].join("|") + + const accessTokenMatch = cookies.match(/access_token=([^;]+)/); + const refreshTokenMatch = cookies.match(/refresh_token=([^;]+)/); + + const store = new Store("/Users/vivek/.creds.dat") + + if (accessTokenMatch) { + const accessToken = accessTokenMatch[1]; + await store.set("access_token", { value: accessToken }) + } + + if (refreshTokenMatch) { + const refreshToken = refreshTokenMatch[1]; + await store.set("refresh_token", { value: refreshToken }) + } + + await store.save() +} + + +export const def: AuthPlatformDef = { + getCurrentUserStream: () => currentUser$, + getAuthEventsStream: () => authEvents$, + getProbableUserStream: () => probableUser$, + + getCurrentUser: () => currentUser$.value, + getProbableUser: () => probableUser$.value, + + getBackendHeaders() { + return {} + }, + getGQLClientOptions() { + return { + fetchOptions: { + credentials: "include", + }, + } + }, + + /** + * it is not possible for us to know if the current cookie is expired because we cannot access http-only cookies from js + * hence just returning if the currentUser$ has a value associated with it + */ + willBackendHaveAuthError() { + return !currentUser$.value + }, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + onBackendGQLClientShouldReconnect(func) { + authEvents$.subscribe((event) => { + if ( + event.event == "login" || + event.event == "logout" || + event.event == "token_refresh" + ) { + func() + } + }) + }, + + /** + * we cannot access our auth cookies from javascript, so leaving this as null + */ + getDevOptsBackendIDToken() { + return null + }, + async performAuthInit() { + const probableUser = JSON.parse(getLocalConfig("login_state") ?? "null") + probableUser$.next(probableUser) + await setInitialUser() + + await listen('scheme-request-received', async (event: any) => { + let deep_link = event.payload as string; + + const params = new URLSearchParams(deep_link.split('?')[1]); + const accessToken = params.get('access_token'); + const refreshToken = params.get('refresh_token'); + const token = params.get('token'); + + function isNotNullOrUndefined(x: any) { + return x !== null && x !== undefined; + } + + if (isNotNullOrUndefined(accessToken) && isNotNullOrUndefined(refreshToken)) { + const store = new Store("/Users/vivek/.creds.dat") + + await store.set("access_token", { value: accessToken }); + await store.set("refresh_token", { value: refreshToken } ); + await store.save() + + window.location.href = "/" + return; + } + + if (isNotNullOrUndefined(token)) { + setLocalConfig("verifyToken", token) + await this.signInWithEmailLink("", "") + await setInitialUser() + } + }); + }, + + waitProbableLoginToConfirm() { + return new Promise((resolve, reject) => { + if (this.getCurrentUser()) { + resolve() + } + + if (!probableUser$.value) reject(new Error("no_probable_user")) + + const unwatch = watch(isGettingInitialUser, (val) => { + if (val === true || val === false) { + resolve() + unwatch() + } + }) + }) + }, + + async signInWithEmail(email: string) { + await sendMagicLink(email) + }, + + async verifyEmailAddress() { + return + }, + async signInUserWithGoogle() { + await signInUserWithGoogleFB() + }, + async signInUserWithGithub() { + await signInUserWithGithubFB() + return undefined + }, + async signInUserWithMicrosoft() { + await signInUserWithMicrosoftFB() + }, + async signInWithEmailLink(_email, _url) { + const deviceIdentifier = getLocalConfig("deviceIdentifier") + + if (!deviceIdentifier) { + throw new Error( + "Device Identifier not found, you can only signin from the browser you generated the magic link" + ) + } + + let verifyToken = getLocalConfig("verifyToken") + + const client = await getClient(); + let res = await client.post(`${import.meta.env.VITE_BACKEND_API_URL}/auth/verify`, Body.json({ + token: verifyToken, + deviceIdentifier + })); + + setAuthCookies(res.rawHeaders) + + removeLocalConfig("deviceIdentifier") + removeLocalConfig("verifyToken") + window.location.href = "/" + }, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async setEmailAddress(_email: string) { + return + }, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async setDisplayName(name: string) { + return + }, + + async signOutUser() { + // if (!currentUser$.value) throw new Error("No user has logged in") + + await logout() + + probableUser$.next(null) + currentUser$.next(null) + removeLocalConfig("login_state") + + authEvents$.next({ + event: "logout", + }) + }, +} diff --git a/packages/hoppscotch-selfhost-desktop/src/platform/collections/collections.api.ts b/packages/hoppscotch-selfhost-desktop/src/platform/collections/collections.api.ts new file mode 100644 index 000000000..2373d7d06 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/platform/collections/collections.api.ts @@ -0,0 +1,305 @@ +import { + runGQLQuery, + runGQLSubscription, + runMutation, +} from "@hoppscotch/common/helpers/backend/GQLClient" +import { + CreateRestRootUserCollectionDocument, + CreateRestRootUserCollectionMutation, + CreateRestRootUserCollectionMutationVariables, + CreateRestUserRequestMutation, + CreateRestUserRequestMutationVariables, + CreateRestUserRequestDocument, + CreateRestChildUserCollectionMutation, + CreateRestChildUserCollectionMutationVariables, + CreateRestChildUserCollectionDocument, + DeleteUserCollectionMutation, + DeleteUserCollectionMutationVariables, + DeleteUserCollectionDocument, + RenameUserCollectionMutation, + RenameUserCollectionMutationVariables, + RenameUserCollectionDocument, + MoveUserCollectionMutation, + MoveUserCollectionMutationVariables, + MoveUserCollectionDocument, + DeleteUserRequestMutation, + DeleteUserRequestMutationVariables, + DeleteUserRequestDocument, + MoveUserRequestDocument, + MoveUserRequestMutation, + MoveUserRequestMutationVariables, + UpdateUserCollectionOrderMutation, + UpdateUserCollectionOrderMutationVariables, + UpdateUserCollectionOrderDocument, + GetUserRootCollectionsQuery, + GetUserRootCollectionsQueryVariables, + GetUserRootCollectionsDocument, + UserCollectionCreatedDocument, + UserCollectionUpdatedDocument, + UserCollectionRemovedDocument, + UserCollectionMovedDocument, + UserCollectionOrderUpdatedDocument, + ExportUserCollectionsToJsonQuery, + ExportUserCollectionsToJsonQueryVariables, + ExportUserCollectionsToJsonDocument, + UserRequestCreatedDocument, + UserRequestUpdatedDocument, + UserRequestMovedDocument, + UserRequestDeletedDocument, + UpdateRestUserRequestMutation, + UpdateRestUserRequestMutationVariables, + UpdateRestUserRequestDocument, + CreateGqlRootUserCollectionMutation, + CreateGqlRootUserCollectionMutationVariables, + CreateGqlRootUserCollectionDocument, + CreateGqlUserRequestMutation, + CreateGqlUserRequestMutationVariables, + CreateGqlUserRequestDocument, + CreateGqlChildUserCollectionMutation, + CreateGqlChildUserCollectionMutationVariables, + CreateGqlChildUserCollectionDocument, + UpdateGqlUserRequestMutation, + UpdateGqlUserRequestMutationVariables, + UpdateGqlUserRequestDocument, + GetGqlRootUserCollectionsQuery, + GetGqlRootUserCollectionsQueryVariables, + GetGqlRootUserCollectionsDocument, + ReqType, +} from "../../api/generated/graphql" + +export const createRESTRootUserCollection = (title: string) => + runMutation< + CreateRestRootUserCollectionMutation, + CreateRestRootUserCollectionMutationVariables, + "" + >(CreateRestRootUserCollectionDocument, { + title, + })() + +export const createGQLRootUserCollection = (title: string) => + runMutation< + CreateGqlRootUserCollectionMutation, + CreateGqlRootUserCollectionMutationVariables, + "" + >(CreateGqlRootUserCollectionDocument, { + title, + })() + +export const createRESTUserRequest = ( + title: string, + request: string, + collectionID: string +) => + runMutation< + CreateRestUserRequestMutation, + CreateRestUserRequestMutationVariables, + "" + >(CreateRestUserRequestDocument, { + title, + request, + collectionID, + })() + +export const createGQLUserRequest = ( + title: string, + request: string, + collectionID: string +) => + runMutation< + CreateGqlUserRequestMutation, + CreateGqlUserRequestMutationVariables, + "" + >(CreateGqlUserRequestDocument, { + title, + request, + collectionID, + })() + +export const createRESTChildUserCollection = ( + title: string, + parentUserCollectionID: string +) => + runMutation< + CreateRestChildUserCollectionMutation, + CreateRestChildUserCollectionMutationVariables, + "" + >(CreateRestChildUserCollectionDocument, { + title, + parentUserCollectionID, + })() + +export const createGQLChildUserCollection = ( + title: string, + parentUserCollectionID: string +) => + runMutation< + CreateGqlChildUserCollectionMutation, + CreateGqlChildUserCollectionMutationVariables, + "" + >(CreateGqlChildUserCollectionDocument, { + title, + parentUserCollectionID, + })() + +export const deleteUserCollection = (userCollectionID: string) => + runMutation< + DeleteUserCollectionMutation, + DeleteUserCollectionMutationVariables, + "" + >(DeleteUserCollectionDocument, { + userCollectionID, + })() + +export const renameUserCollection = ( + userCollectionID: string, + newTitle: string +) => + runMutation< + RenameUserCollectionMutation, + RenameUserCollectionMutationVariables, + "" + >(RenameUserCollectionDocument, { userCollectionID, newTitle })() + +export const moveUserCollection = ( + sourceCollectionID: string, + destinationCollectionID?: string +) => + runMutation< + MoveUserCollectionMutation, + MoveUserCollectionMutationVariables, + "" + >(MoveUserCollectionDocument, { + userCollectionID: sourceCollectionID, + destCollectionID: destinationCollectionID, + })() + +export const editUserRequest = ( + requestID: string, + title: string, + request: string +) => + runMutation< + UpdateRestUserRequestMutation, + UpdateRestUserRequestMutationVariables, + "" + >(UpdateRestUserRequestDocument, { + id: requestID, + request, + title, + })() + +export const editGQLUserRequest = ( + requestID: string, + title: string, + request: string +) => + runMutation< + UpdateGqlUserRequestMutation, + UpdateGqlUserRequestMutationVariables, + "" + >(UpdateGqlUserRequestDocument, { + id: requestID, + request, + title, + })() + +export const deleteUserRequest = (requestID: string) => + runMutation< + DeleteUserRequestMutation, + DeleteUserRequestMutationVariables, + "" + >(DeleteUserRequestDocument, { + requestID, + })() + +export const moveUserRequest = ( + sourceCollectionID: string, + destinationCollectionID: string, + requestID: string, + nextRequestID?: string +) => + runMutation( + MoveUserRequestDocument, + { + sourceCollectionID, + destinationCollectionID, + requestID, + nextRequestID, + } + )() + +export const updateUserCollectionOrder = ( + collectionID: string, + nextCollectionID?: string +) => + runMutation< + UpdateUserCollectionOrderMutation, + UpdateUserCollectionOrderMutationVariables, + "" + >(UpdateUserCollectionOrderDocument, { + collectionID, + nextCollectionID, + })() + +export const getUserRootCollections = () => + runGQLQuery< + GetUserRootCollectionsQuery, + GetUserRootCollectionsQueryVariables, + "" + >({ + query: GetUserRootCollectionsDocument, + variables: {}, + }) + +export const getGQLRootUserCollections = () => + runGQLQuery< + GetGqlRootUserCollectionsQuery, + GetGqlRootUserCollectionsQueryVariables, + "" + >({ + query: GetGqlRootUserCollectionsDocument, + variables: {}, + }) + +export const exportUserCollectionsToJSON = ( + collectionID?: string, + collectionType: ReqType.Rest | ReqType.Gql = ReqType.Rest +) => + runGQLQuery< + ExportUserCollectionsToJsonQuery, + ExportUserCollectionsToJsonQueryVariables, + "" + >({ + query: ExportUserCollectionsToJsonDocument, + variables: { collectionID, collectionType }, + }) + +export const runUserCollectionCreatedSubscription = () => + runGQLSubscription({ query: UserCollectionCreatedDocument, variables: {} }) + +export const runUserCollectionUpdatedSubscription = () => + runGQLSubscription({ query: UserCollectionUpdatedDocument, variables: {} }) + +export const runUserCollectionRemovedSubscription = () => + runGQLSubscription({ query: UserCollectionRemovedDocument, variables: {} }) + +export const runUserCollectionMovedSubscription = () => + runGQLSubscription({ query: UserCollectionMovedDocument, variables: {} }) + +export const runUserCollectionOrderUpdatedSubscription = () => + runGQLSubscription({ + query: UserCollectionOrderUpdatedDocument, + variables: {}, + }) + +export const runUserRequestCreatedSubscription = () => + runGQLSubscription({ query: UserRequestCreatedDocument, variables: {} }) + +export const runUserRequestUpdatedSubscription = () => + runGQLSubscription({ query: UserRequestUpdatedDocument, variables: {} }) + +export const runUserRequestMovedSubscription = () => + runGQLSubscription({ query: UserRequestMovedDocument, variables: {} }) + +export const runUserRequestDeletedSubscription = () => + runGQLSubscription({ query: UserRequestDeletedDocument, variables: {} }) diff --git a/packages/hoppscotch-selfhost-desktop/src/platform/collections/collections.platform.ts b/packages/hoppscotch-selfhost-desktop/src/platform/collections/collections.platform.ts new file mode 100644 index 000000000..59d3ce965 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/platform/collections/collections.platform.ts @@ -0,0 +1,789 @@ +import { authEvents$, def as platformAuth } from "@platform/auth" +import { CollectionsPlatformDef } from "@hoppscotch/common/platform/collections" +import { runDispatchWithOutSyncing } from "../../lib/sync" + +import { + exportUserCollectionsToJSON, + runUserCollectionCreatedSubscription, + runUserCollectionMovedSubscription, + runUserCollectionOrderUpdatedSubscription, + runUserCollectionRemovedSubscription, + runUserCollectionUpdatedSubscription, + runUserRequestCreatedSubscription, + runUserRequestDeletedSubscription, + runUserRequestMovedSubscription, + runUserRequestUpdatedSubscription, +} from "./collections.api" +import { collectionsSyncer, getStoreByCollectionType } from "./collections.sync" + +import * as E from "fp-ts/Either" +import { + addRESTCollection, + setRESTCollections, + editRESTCollection, + removeRESTCollection, + moveRESTFolder, + updateRESTCollectionOrder, + saveRESTRequestAs, + navigateToFolderWithIndexPath, + editRESTRequest, + removeRESTRequest, + moveRESTRequest, + updateRESTRequestOrder, + addRESTFolder, + editRESTFolder, + removeRESTFolder, + addGraphqlFolder, + addGraphqlCollection, + editGraphqlFolder, + editGraphqlCollection, + removeGraphqlFolder, + removeGraphqlCollection, + saveGraphqlRequestAs, + editGraphqlRequest, + moveGraphqlRequest, + removeGraphqlRequest, + setGraphqlCollections, + restCollectionStore, +} from "@hoppscotch/common/newstore/collections" +import { runGQLSubscription } from "@hoppscotch/common/helpers/backend/GQLClient" +import { + HoppCollection, + HoppGQLRequest, + HoppRESTRequest, +} from "@hoppscotch/data" +import { gqlCollectionsSyncer } from "./gqlCollections.sync" +import { ReqType } from "../../api/generated/graphql" + +function initCollectionsSync() { + const currentUser$ = platformAuth.getCurrentUserStream() + collectionsSyncer.startStoreSync() + collectionsSyncer.setupSubscriptions(setupSubscriptions) + + gqlCollectionsSyncer.startStoreSync() + + loadUserCollections("REST") + loadUserCollections("GQL") + + // TODO: test & make sure the auth thing is working properly + currentUser$.subscribe(async (user) => { + if (user) { + loadUserCollections("REST") + loadUserCollections("GQL") + } + }) + + authEvents$.subscribe((event) => { + if (event.event == "login" || event.event == "token_refresh") { + collectionsSyncer.startListeningToSubscriptions() + } + + if (event.event == "logout") { + collectionsSyncer.stopListeningToSubscriptions() + } + }) +} + +type ExportedUserCollectionREST = { + id?: string + folders: ExportedUserCollectionREST[] + requests: Array + name: string +} + +type ExportedUserCollectionGQL = { + id?: string + folders: ExportedUserCollectionGQL[] + requests: Array + name: string +} + +function exportedCollectionToHoppCollection( + collection: ExportedUserCollectionREST | ExportedUserCollectionGQL, + collectionType: "REST" | "GQL" +): HoppCollection { + if (collectionType == "REST") { + const restCollection = collection as ExportedUserCollectionREST + + return { + id: restCollection.id, + v: 1, + name: restCollection.name, + folders: restCollection.folders.map((folder) => + exportedCollectionToHoppCollection(folder, collectionType) + ), + requests: restCollection.requests.map( + ({ + id, + v, + auth, + body, + endpoint, + headers, + method, + name, + params, + preRequestScript, + testScript, + }) => ({ + id, + v, + auth, + body, + endpoint, + headers, + method, + name, + params, + preRequestScript, + testScript, + }) + ), + } + } else { + const gqlCollection = collection as ExportedUserCollectionGQL + + return { + id: gqlCollection.id, + v: 1, + name: gqlCollection.name, + folders: gqlCollection.folders.map((folder) => + exportedCollectionToHoppCollection(folder, collectionType) + ), + requests: gqlCollection.requests.map( + ({ v, auth, headers, name, id }) => ({ + id, + v, + auth, + headers, + name, + }) + ) as HoppGQLRequest[], + } + } +} + +async function loadUserCollections(collectionType: "REST" | "GQL") { + const res = await exportUserCollectionsToJSON( + undefined, + collectionType == "REST" ? ReqType.Rest : ReqType.Gql + ) + + if (E.isRight(res)) { + const collectionsJSONString = + res.right.exportUserCollectionsToJSON.exportedCollection + const exportedCollections = ( + JSON.parse(collectionsJSONString) as Array< + ExportedUserCollectionGQL | ExportedUserCollectionREST + > + ).map((collection) => ({ v: 1, ...collection })) + + runDispatchWithOutSyncing(() => { + collectionType == "REST" + ? setRESTCollections( + exportedCollections.map( + (collection) => + exportedCollectionToHoppCollection( + collection, + "REST" + ) as HoppCollection + ) + ) + : setGraphqlCollections( + exportedCollections.map( + (collection) => + exportedCollectionToHoppCollection( + collection, + "GQL" + ) as HoppCollection + ) + ) + }) + } +} + +function setupSubscriptions() { + let subs: ReturnType[1][] = [] + + const userCollectionCreatedSub = setupUserCollectionCreatedSubscription() + const userCollectionUpdatedSub = setupUserCollectionUpdatedSubscription() + const userCollectionRemovedSub = setupUserCollectionRemovedSubscription() + const userCollectionMovedSub = setupUserCollectionMovedSubscription() + const userCollectionOrderUpdatedSub = + setupUserCollectionOrderUpdatedSubscription() + const userRequestCreatedSub = setupUserRequestCreatedSubscription() + const userRequestUpdatedSub = setupUserRequestUpdatedSubscription() + const userRequestDeletedSub = setupUserRequestDeletedSubscription() + const userRequestMovedSub = setupUserRequestMovedSubscription() + + subs = [ + userCollectionCreatedSub, + userCollectionUpdatedSub, + userCollectionRemovedSub, + userCollectionMovedSub, + userCollectionOrderUpdatedSub, + userRequestCreatedSub, + userRequestUpdatedSub, + userRequestDeletedSub, + userRequestMovedSub, + ] + + return () => { + subs.forEach((sub) => sub.unsubscribe()) + } +} + +function setupUserCollectionCreatedSubscription() { + const [userCollectionCreated$, userCollectionCreatedSub] = + runUserCollectionCreatedSubscription() + + userCollectionCreated$.subscribe((res) => { + if (E.isRight(res)) { + const collectionType = res.right.userCollectionCreated.type + + const { collectionStore } = getStoreByCollectionType(collectionType) + + const userCollectionBackendID = res.right.userCollectionCreated.id + const parentCollectionID = res.right.userCollectionCreated.parent?.id + + const userCollectionLocalID = getCollectionPathFromCollectionID( + userCollectionBackendID, + collectionStore.value.state + ) + + // collection already exists in store ( this instance created it ) + if (userCollectionLocalID) { + return + } + + const parentCollectionPath = + parentCollectionID && + getCollectionPathFromCollectionID( + parentCollectionID, + collectionStore.value.state + ) + + // only folders will have parent collection id + if (parentCollectionID && parentCollectionPath) { + runDispatchWithOutSyncing(() => { + collectionType == "GQL" + ? addGraphqlFolder( + res.right.userCollectionCreated.title, + parentCollectionPath + ) + : addRESTFolder( + res.right.userCollectionCreated.title, + parentCollectionPath + ) + + const parentCollection = navigateToFolderWithIndexPath( + collectionStore.value.state, + parentCollectionPath + .split("/") + .map((pathIndex) => parseInt(pathIndex)) + ) + + if (parentCollection) { + const folderIndex = parentCollection.folders.length - 1 + + const addedFolder = parentCollection.folders[folderIndex] + addedFolder.id = userCollectionBackendID + } + }) + } else { + // root collections won't have parentCollectionID + runDispatchWithOutSyncing(() => { + collectionType == "GQL" + ? addGraphqlCollection({ + name: res.right.userCollectionCreated.title, + folders: [], + requests: [], + v: 1, + }) + : addRESTCollection({ + name: res.right.userCollectionCreated.title, + folders: [], + requests: [], + v: 1, + }) + + const localIndex = collectionStore.value.state.length - 1 + + const addedCollection = collectionStore.value.state[localIndex] + addedCollection.id = userCollectionBackendID + }) + } + } + }) + + return userCollectionCreatedSub +} + +function setupUserCollectionUpdatedSubscription() { + const [userCollectionUpdated$, userCollectionUpdatedSub] = + runUserCollectionUpdatedSubscription() + + userCollectionUpdated$.subscribe((res) => { + if (E.isRight(res)) { + const collectionType = res.right.userCollectionUpdated.type + + const { collectionStore } = getStoreByCollectionType(collectionType) + + const updatedCollectionBackendID = res.right.userCollectionUpdated.id + const updatedCollectionLocalPath = getCollectionPathFromCollectionID( + updatedCollectionBackendID, + collectionStore.value.state + ) + + const isFolder = + updatedCollectionLocalPath && + updatedCollectionLocalPath.split("/").length > 1 + + // updated collection is a folder + if (isFolder) { + runDispatchWithOutSyncing(() => { + collectionType == "REST" + ? editRESTFolder(updatedCollectionLocalPath, { + name: res.right.userCollectionUpdated.title, + }) + : editGraphqlFolder(updatedCollectionLocalPath, { + name: res.right.userCollectionUpdated.title, + }) + }) + } + + // updated collection is a root collection + if (updatedCollectionLocalPath && !isFolder) { + runDispatchWithOutSyncing(() => { + collectionType == "REST" + ? editRESTCollection(parseInt(updatedCollectionLocalPath), { + name: res.right.userCollectionUpdated.title, + }) + : editGraphqlCollection(parseInt(updatedCollectionLocalPath), { + name: res.right.userCollectionUpdated.title, + }) + }) + } + } + }) + + return userCollectionUpdatedSub +} + +function setupUserCollectionMovedSubscription() { + const [userCollectionMoved$, userCollectionMovedSub] = + runUserCollectionMovedSubscription() + + userCollectionMoved$.subscribe((res) => { + if (E.isRight(res)) { + const movedMetadata = res.right.userCollectionMoved + + const sourcePath = getCollectionPathFromCollectionID( + movedMetadata.id, + restCollectionStore.value.state + ) + + let destinationPath: string | undefined + + if (movedMetadata.parent?.id) { + destinationPath = + getCollectionPathFromCollectionID( + movedMetadata.parent?.id, + restCollectionStore.value.state + ) ?? undefined + } + + sourcePath && + runDispatchWithOutSyncing(() => { + moveRESTFolder(sourcePath, destinationPath ?? null) + }) + } + }) + + return userCollectionMovedSub +} + +function setupUserCollectionRemovedSubscription() { + const [userCollectionRemoved$, userCollectionRemovedSub] = + runUserCollectionRemovedSubscription() + + userCollectionRemoved$.subscribe((res) => { + if (E.isRight(res)) { + const removedCollectionBackendID = res.right.userCollectionRemoved.id + const collectionType = res.right.userCollectionRemoved.type + + const { collectionStore } = getStoreByCollectionType(collectionType) + + const removedCollectionLocalPath = getCollectionPathFromCollectionID( + removedCollectionBackendID, + collectionStore.value.state + ) + + const isFolder = + removedCollectionLocalPath && + removedCollectionLocalPath.split("/").length > 1 + + if (removedCollectionLocalPath && isFolder) { + runDispatchWithOutSyncing(() => { + collectionType == "REST" + ? removeRESTFolder(removedCollectionLocalPath) + : removeGraphqlFolder(removedCollectionLocalPath) + }) + } + + if (removedCollectionLocalPath && !isFolder) { + runDispatchWithOutSyncing(() => { + collectionType == "REST" + ? removeRESTCollection(parseInt(removedCollectionLocalPath)) + : removeGraphqlCollection(parseInt(removedCollectionLocalPath)) + }) + } + } + }) + + return userCollectionRemovedSub +} + +function setupUserCollectionOrderUpdatedSubscription() { + const [userCollectionOrderUpdated$, userCollectionOrderUpdatedSub] = + runUserCollectionOrderUpdatedSubscription() + + userCollectionOrderUpdated$.subscribe((res) => { + if (E.isRight(res)) { + const { userCollection, nextUserCollection } = + res.right.userCollectionOrderUpdated + + const sourceCollectionID = userCollection.id + const destinationCollectionID = nextUserCollection?.id + + const sourcePath = getCollectionPathFromCollectionID( + sourceCollectionID, + restCollectionStore.value.state + ) + + let destinationPath: string | null | undefined + + if (destinationCollectionID) { + destinationPath = getCollectionPathFromCollectionID( + destinationCollectionID, + restCollectionStore.value.state + ) + } + + runDispatchWithOutSyncing(() => { + if (sourcePath) { + updateRESTCollectionOrder(sourcePath, destinationPath ?? null) + } + }) + } + }) + + return userCollectionOrderUpdatedSub +} + +function setupUserRequestCreatedSubscription() { + const [userRequestCreated$, userRequestCreatedSub] = + runUserRequestCreatedSubscription() + + userRequestCreated$.subscribe((res) => { + if (E.isRight(res)) { + const collectionID = res.right.userRequestCreated.collectionID + const request = JSON.parse(res.right.userRequestCreated.request) + const requestID = res.right.userRequestCreated.id + + const requestType = res.right.userRequestCreated.type + + const { collectionStore } = getStoreByCollectionType(requestType) + + const hasAlreadyHappened = getRequestPathFromRequestID( + requestID, + collectionStore.value.state + ) + + if (!!hasAlreadyHappened) { + return + } + + const collectionPath = getCollectionPathFromCollectionID( + collectionID, + collectionStore.value.state + ) + + if (collectionID && collectionPath) { + runDispatchWithOutSyncing(() => { + requestType == "REST" + ? saveRESTRequestAs(collectionPath, request) + : saveGraphqlRequestAs(collectionPath, request) + + const target = navigateToFolderWithIndexPath( + collectionStore.value.state, + collectionPath.split("/").map((index) => parseInt(index)) + ) + + const targetRequest = target?.requests[target?.requests.length - 1] + + if (targetRequest) { + targetRequest.id = requestID + } + }) + } + } + }) + + return userRequestCreatedSub +} + +function setupUserRequestUpdatedSubscription() { + const [userRequestUpdated$, userRequestUpdatedSub] = + runUserRequestUpdatedSubscription() + + userRequestUpdated$.subscribe((res) => { + if (E.isRight(res)) { + const requestType = res.right.userRequestUpdated.type + + const { collectionStore } = getStoreByCollectionType(requestType) + + const requestPath = getRequestPathFromRequestID( + res.right.userRequestUpdated.id, + collectionStore.value.state + ) + + const collectionPath = requestPath?.collectionPath + const requestIndex = requestPath?.requestIndex + + ;(requestIndex || requestIndex == 0) && + collectionPath && + runDispatchWithOutSyncing(() => { + requestType == "REST" + ? editRESTRequest( + collectionPath, + requestIndex, + JSON.parse(res.right.userRequestUpdated.request) + ) + : editGraphqlRequest( + collectionPath, + requestIndex, + JSON.parse(res.right.userRequestUpdated.request) + ) + }) + } + }) + + return userRequestUpdatedSub +} + +function setupUserRequestMovedSubscription() { + const [userRequestMoved$, userRequestMovedSub] = + runUserRequestMovedSubscription() + + userRequestMoved$.subscribe((res) => { + if (E.isRight(res)) { + const { request, nextRequest } = res.right.userRequestMoved + + const { + collectionID: destinationCollectionID, + id: sourceRequestID, + type: requestType, + } = request + + const { collectionStore } = getStoreByCollectionType(requestType) + + const sourceRequestPath = getRequestPathFromRequestID( + sourceRequestID, + collectionStore.value.state + ) + + const destinationCollectionPath = getCollectionPathFromCollectionID( + destinationCollectionID, + collectionStore.value.state + ) + + const destinationRequestIndex = destinationCollectionPath + ? (() => { + const requestsLength = navigateToFolderWithIndexPath( + collectionStore.value.state, + destinationCollectionPath + .split("/") + .map((index) => parseInt(index)) + )?.requests.length + + return requestsLength || requestsLength == 0 + ? requestsLength - 1 + : undefined + })() + : undefined + + // there is no nextRequest, so request is moved + if ( + (destinationRequestIndex || destinationRequestIndex == 0) && + destinationCollectionPath && + sourceRequestPath && + !nextRequest + ) { + runDispatchWithOutSyncing(() => { + requestType == "REST" + ? moveRESTRequest( + sourceRequestPath.collectionPath, + sourceRequestPath.requestIndex, + destinationCollectionPath + ) + : moveGraphqlRequest( + sourceRequestPath.collectionPath, + sourceRequestPath.requestIndex, + destinationCollectionPath + ) + }) + } + + // there is nextRequest, so request is reordered + if ( + (destinationRequestIndex || destinationRequestIndex == 0) && + destinationCollectionPath && + nextRequest && + // we don't have request reordering for graphql yet + requestType == "REST" + ) { + const { collectionID: nextCollectionID, id: nextRequestID } = + nextRequest + + const nextCollectionPath = + getCollectionPathFromCollectionID( + nextCollectionID, + collectionStore.value.state + ) ?? undefined + + const nextRequestIndex = nextCollectionPath + ? getRequestIndex( + nextRequestID, + nextCollectionPath, + collectionStore.value.state + ) + : undefined + + nextRequestIndex && + nextCollectionPath && + sourceRequestPath && + runDispatchWithOutSyncing(() => { + updateRESTRequestOrder( + sourceRequestPath?.requestIndex, + nextRequestIndex, + nextCollectionPath + ) + }) + } + } + }) + + return userRequestMovedSub +} + +function setupUserRequestDeletedSubscription() { + const [userRequestDeleted$, userRequestDeletedSub] = + runUserRequestDeletedSubscription() + + userRequestDeleted$.subscribe((res) => { + if (E.isRight(res)) { + const requestType = res.right.userRequestDeleted.type + + const { collectionStore } = getStoreByCollectionType(requestType) + + const deletedRequestPath = getRequestPathFromRequestID( + res.right.userRequestDeleted.id, + collectionStore.value.state + ) + + ;(deletedRequestPath?.requestIndex || + deletedRequestPath?.requestIndex == 0) && + deletedRequestPath.collectionPath && + runDispatchWithOutSyncing(() => { + requestType == "REST" + ? removeRESTRequest( + deletedRequestPath.collectionPath, + deletedRequestPath.requestIndex + ) + : removeGraphqlRequest( + deletedRequestPath.collectionPath, + deletedRequestPath.requestIndex + ) + }) + } + }) + + return userRequestDeletedSub +} + +export const def: CollectionsPlatformDef = { + initCollectionsSync, +} + +function getCollectionPathFromCollectionID( + collectionID: string, + collections: HoppCollection[], + parentPath?: string +): string | null { + for (const collectionIndex in collections) { + if (collections[collectionIndex].id == collectionID) { + return parentPath + ? `${parentPath}/${collectionIndex}` + : `${collectionIndex}` + } else { + const collectionPath = getCollectionPathFromCollectionID( + collectionID, + collections[collectionIndex].folders, + parentPath ? `${parentPath}/${collectionIndex}` : `${collectionIndex}` + ) + + if (collectionPath) return collectionPath + } + } + + return null +} + +function getRequestPathFromRequestID( + requestID: string, + collections: HoppCollection[], + parentPath?: string +): { collectionPath: string; requestIndex: number } | null { + for (const collectionIndex in collections) { + const requestIndex = collections[collectionIndex].requests.findIndex( + (request) => request.id == requestID + ) + + if (requestIndex != -1) { + return { + collectionPath: parentPath + ? `${parentPath}/${collectionIndex}` + : `${collectionIndex}`, + requestIndex, + } + } else { + const requestPath = getRequestPathFromRequestID( + requestID, + collections[collectionIndex].folders, + parentPath ? `${parentPath}/${collectionIndex}` : `${collectionIndex}` + ) + + if (requestPath) return requestPath + } + } + + return null +} + +function getRequestIndex( + requestID: string, + parentCollectionPath: string, + collections: HoppCollection[] +) { + const collection = navigateToFolderWithIndexPath( + collections, + parentCollectionPath?.split("/").map((index) => parseInt(index)) + ) + + const requestIndex = collection?.requests.findIndex( + (request) => request.id == requestID + ) + + return requestIndex +} diff --git a/packages/hoppscotch-selfhost-desktop/src/platform/collections/collections.sync.ts b/packages/hoppscotch-selfhost-desktop/src/platform/collections/collections.sync.ts new file mode 100644 index 000000000..218cb2251 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/platform/collections/collections.sync.ts @@ -0,0 +1,543 @@ +import { + graphqlCollectionStore, + navigateToFolderWithIndexPath, + removeDuplicateRESTCollectionOrFolder, + restCollectionStore, +} from "@hoppscotch/common/newstore/collections" +import { + getSettingSubject, + settingsStore, +} from "@hoppscotch/common/newstore/settings" + +import { HoppCollection, HoppRESTRequest } from "@hoppscotch/data" + +import { getSyncInitFunction } from "../../lib/sync" + +import { StoreSyncDefinitionOf } from "../../lib/sync" +import { createMapper } from "../../lib/sync/mapper" +import { + createRESTChildUserCollection, + createRESTRootUserCollection, + createRESTUserRequest, + deleteUserCollection, + deleteUserRequest, + editUserRequest, + moveUserCollection, + moveUserRequest, + renameUserCollection, + updateUserCollectionOrder, +} from "./collections.api" + +import * as E from "fp-ts/Either" + +// restCollectionsMapper uses the collectionPath as the local identifier +export const restCollectionsMapper = createMapper() + +// restRequestsMapper uses the collectionPath/requestIndex as the local identifier +export const restRequestsMapper = createMapper() + +// temp implementation untill the backend implements an endpoint that accepts an entire collection +// TODO: use importCollectionsJSON to do this +const recursivelySyncCollections = async ( + collection: HoppCollection, + collectionPath: string, + parentUserCollectionID?: string +) => { + let parentCollectionID = parentUserCollectionID + + // if parentUserCollectionID does not exist, create the collection as a root collection + if (!parentUserCollectionID) { + const res = await createRESTRootUserCollection(collection.name) + + if (E.isRight(res)) { + parentCollectionID = res.right.createRESTRootUserCollection.id + + collection.id = parentCollectionID + removeDuplicateRESTCollectionOrFolder(parentCollectionID, collectionPath) + } else { + parentCollectionID = undefined + } + } else { + // if parentUserCollectionID exists, create the collection as a child collection + const res = await createRESTChildUserCollection( + collection.name, + parentUserCollectionID + ) + + if (E.isRight(res)) { + const childCollectionId = res.right.createRESTChildUserCollection.id + + collection.id = childCollectionId + + removeDuplicateRESTCollectionOrFolder( + childCollectionId, + `${collectionPath}` + ) + } + } + + // create the requests + if (parentCollectionID) { + collection.requests.forEach(async (request) => { + const res = + parentCollectionID && + (await createRESTUserRequest( + request.name, + JSON.stringify(request), + parentCollectionID + )) + + if (res && E.isRight(res)) { + const requestId = res.right.createRESTUserRequest.id + + request.id = requestId + } + }) + } + + // create the folders aka child collections + if (parentCollectionID) + collection.folders.forEach(async (folder, index) => { + recursivelySyncCollections( + folder, + `${collectionPath}/${index}`, + parentCollectionID + ) + }) +} + +// TODO: generalize this +// TODO: ask backend to send enough info on the subscription to not need this +export const collectionReorderOrMovingOperations: { + sourceCollectionID: string + destinationCollectionID?: string + reorderOperation: { + fromPath: string + toPath?: string + } +}[] = [] + +type OperationStatus = "pending" | "completed" + +type OperationCollectionRemoved = { + type: "COLLECTION_REMOVED" + collectionBackendID: string + status: OperationStatus +} + +export const restCollectionsOperations: Array = [] + +export const storeSyncDefinition: StoreSyncDefinitionOf< + typeof restCollectionStore +> = { + appendCollections({ entries }) { + let indexStart = restCollectionStore.value.state.length - entries.length + + entries.forEach((collection) => { + recursivelySyncCollections(collection, `${indexStart}`) + indexStart++ + }) + }, + async addCollection({ collection }) { + const lastCreatedCollectionIndex = + restCollectionStore.value.state.length - 1 + + recursivelySyncCollections(collection, `${lastCreatedCollectionIndex}`) + }, + async removeCollection({ collectionID }) { + if (collectionID) { + await deleteUserCollection(collectionID) + } + }, + editCollection({ partialCollection: collection, collectionIndex }) { + const collectionID = navigateToFolderWithIndexPath( + restCollectionStore.value.state, + [collectionIndex] + )?.id + + if (collectionID && collection.name) { + renameUserCollection(collectionID, collection.name) + } + }, + async addFolder({ name, path }) { + const parentCollection = navigateToFolderWithIndexPath( + restCollectionStore.value.state, + path.split("/").map((index) => parseInt(index)) + ) + + const parentCollectionBackendID = parentCollection?.id + + if (parentCollectionBackendID) { + const foldersLength = parentCollection.folders.length + + const res = await createRESTChildUserCollection( + name, + parentCollectionBackendID + ) + + if (E.isRight(res)) { + const { id } = res.right.createRESTChildUserCollection + + if (foldersLength) { + parentCollection.folders[foldersLength - 1].id = id + removeDuplicateRESTCollectionOrFolder( + id, + `${path}/${foldersLength - 1}` + ) + } + } + } + }, + editFolder({ folder, path }) { + const folderID = navigateToFolderWithIndexPath( + restCollectionStore.value.state, + path.split("/").map((index) => parseInt(index)) + )?.id + + const folderName = folder.name + + if (folderID && folderName) { + renameUserCollection(folderID, folderName) + } + }, + async removeFolder({ folderID }) { + if (folderID) { + await deleteUserCollection(folderID) + } + }, + async moveFolder({ destinationPath, path }) { + const { newSourcePath, newDestinationPath } = getPathsAfterMoving( + path, + destinationPath ?? undefined + ) + + if (newSourcePath) { + const sourceCollectionID = navigateToFolderWithIndexPath( + restCollectionStore.value.state, + newSourcePath.split("/").map((index) => parseInt(index)) + )?.id + + const destinationCollectionID = destinationPath + ? newDestinationPath && + navigateToFolderWithIndexPath( + restCollectionStore.value.state, + newDestinationPath.split("/").map((index) => parseInt(index)) + )?.id + : undefined + + if (sourceCollectionID) { + await moveUserCollection(sourceCollectionID, destinationCollectionID) + } + } + }, + editRequest({ path, requestIndex, requestNew }) { + const request = navigateToFolderWithIndexPath( + restCollectionStore.value.state, + path.split("/").map((index) => parseInt(index)) + )?.requests[requestIndex] + + const requestBackendID = request?.id + + if (requestBackendID) { + editUserRequest( + requestBackendID, + (requestNew as HoppRESTRequest).name, + JSON.stringify(requestNew) + ) + } + }, + async saveRequestAs({ path, request }) { + const folder = navigateToFolderWithIndexPath( + restCollectionStore.value.state, + path.split("/").map((index) => parseInt(index)) + ) + + const parentCollectionBackendID = folder?.id + + if (parentCollectionBackendID) { + const newRequest = folder.requests[folder.requests.length - 1] + + const res = await createRESTUserRequest( + (request as HoppRESTRequest).name, + JSON.stringify(request), + parentCollectionBackendID + ) + + if (E.isRight(res)) { + const { id } = res.right.createRESTUserRequest + + newRequest.id = id + removeDuplicateRESTCollectionOrFolder( + id, + `${path}/${folder.requests.length - 1}`, + "request" + ) + } + } + }, + async removeRequest({ requestID }) { + if (requestID) { + await deleteUserRequest(requestID) + } + }, + moveRequest({ destinationPath, path, requestIndex }) { + moveOrReorderRequests(requestIndex, path, destinationPath) + }, + updateRequestOrder({ + destinationCollectionPath, + destinationRequestIndex, + requestIndex, + }) { + /** + * currently the FE implementation only supports reordering requests between the same collection, + * so destinationCollectionPath and sourceCollectionPath will be same + */ + moveOrReorderRequests( + requestIndex, + destinationCollectionPath, + destinationCollectionPath, + destinationRequestIndex ?? undefined + ) + }, + async updateCollectionOrder({ + collectionIndex: collectionPath, + destinationCollectionIndex: destinationCollectionPath, + }) { + const collections = restCollectionStore.value.state + + const sourcePathIndexes = getParentPathIndexesFromPath(collectionPath) + const sourceCollectionIndex = getCollectionIndexFromPath(collectionPath) + + const destinationCollectionIndex = !!destinationCollectionPath + ? getCollectionIndexFromPath(destinationCollectionPath) + : undefined + + let updatedCollectionIndexs: + | [newSourceIndex: number, newDestinationIndex: number | undefined] + | undefined + + if ( + (sourceCollectionIndex || sourceCollectionIndex == 0) && + (destinationCollectionIndex || destinationCollectionIndex == 0) + ) { + updatedCollectionIndexs = getIndexesAfterReorder( + sourceCollectionIndex, + destinationCollectionIndex + ) + } else if (sourceCollectionIndex || sourceCollectionIndex == 0) { + if (sourcePathIndexes.length == 0) { + // we're reordering root collections + updatedCollectionIndexs = [collections.length - 1, undefined] + } else { + const sourceCollection = navigateToFolderWithIndexPath(collections, [ + ...sourcePathIndexes, + ]) + + if (sourceCollection && sourceCollection.folders.length > 0) { + updatedCollectionIndexs = [ + sourceCollection.folders.length - 1, + undefined, + ] + } + } + } + + const sourceCollectionID = + updatedCollectionIndexs && + navigateToFolderWithIndexPath(collections, [ + ...sourcePathIndexes, + updatedCollectionIndexs[0], + ])?.id + + const destinationCollectionID = + updatedCollectionIndexs && + (updatedCollectionIndexs[1] || updatedCollectionIndexs[1] == 0) + ? navigateToFolderWithIndexPath(collections, [ + ...sourcePathIndexes, + updatedCollectionIndexs[1], + ])?.id + : undefined + + if (sourceCollectionID) { + await updateUserCollectionOrder( + sourceCollectionID, + destinationCollectionID + ) + } + }, +} + +export const collectionsSyncer = getSyncInitFunction( + restCollectionStore, + storeSyncDefinition, + () => settingsStore.value.syncCollections, + getSettingSubject("syncCollections") +) + +export async function moveOrReorderRequests( + requestIndex: number, + path: string, + destinationPath: string, + nextRequestIndex?: number, + requestType: "REST" | "GQL" = "REST" +) { + const { collectionStore } = getStoreByCollectionType(requestType) + + const sourceCollectionBackendID = navigateToFolderWithIndexPath( + collectionStore.value.state, + path.split("/").map((index) => parseInt(index)) + )?.id + + const destinationCollection = navigateToFolderWithIndexPath( + collectionStore.value.state, + destinationPath.split("/").map((index) => parseInt(index)) + ) + + const destinationCollectionBackendID = destinationCollection?.id + + let requestBackendID: string | undefined + + let nextRequestBackendID: string | undefined + + // we only need this for reordering requests, not for moving requests + if (nextRequestIndex) { + // reordering + const [newRequestIndex, newDestinationIndex] = getIndexesAfterReorder( + requestIndex, + nextRequestIndex + ) + + requestBackendID = + destinationCollection?.requests[newRequestIndex]?.id ?? undefined + + nextRequestBackendID = + destinationCollection?.requests[newDestinationIndex]?.id ?? undefined + } else { + // moving + const requests = destinationCollection?.requests + requestBackendID = + requests && requests.length > 0 + ? requests[requests.length - 1]?.id + : undefined + } + + if ( + sourceCollectionBackendID && + destinationCollectionBackendID && + requestBackendID + ) { + await moveUserRequest( + sourceCollectionBackendID, + destinationCollectionBackendID, + requestBackendID, + nextRequestBackendID + ) + } +} + +function getParentPathIndexesFromPath(path: string) { + const indexes = path.split("/") + indexes.pop() + return indexes.map((index) => parseInt(index)) +} + +export function getCollectionIndexFromPath(collectionPath: string) { + const sourceCollectionIndexString = collectionPath.split("/").pop() + const sourceCollectionIndex = sourceCollectionIndexString + ? parseInt(sourceCollectionIndexString) + : undefined + + return sourceCollectionIndex +} + +/** + * the sync function is called after the reordering has happened on the store + * because of this we need to find the new source and destination indexes after the reordering + */ +function getIndexesAfterReorder( + oldSourceIndex: number, + oldDestinationIndex: number +): [newSourceIndex: number, newDestinationIndex: number] { + // Source Becomes Destination -1 + // Destination Remains Same + if (oldSourceIndex < oldDestinationIndex) { + return [oldDestinationIndex - 1, oldDestinationIndex] + } + + // Source Becomes The Destination + // Destintion Becomes Source + 1 + if (oldSourceIndex > oldDestinationIndex) { + return [oldDestinationIndex, oldDestinationIndex + 1] + } + + throw new Error("Source and Destination are the same") +} + +/** + * the sync function is called after moving a folder has happened on the store, + * because of this the source index given to the sync function is not the live one + * we need to find the new source index after the moving + */ +function getPathsAfterMoving(sourcePath: string, destinationPath?: string) { + if (!destinationPath) { + return { + newSourcePath: `${restCollectionStore.value.state.length - 1}`, + newDestinationPath: destinationPath, + } + } + + const sourceParentPath = getParentPathFromPath(sourcePath) + const destinationParentPath = getParentPathFromPath(destinationPath) + + const isSameParentPath = sourceParentPath === destinationParentPath + + let newDestinationPath: string + + if (isSameParentPath) { + const sourceIndex = getCollectionIndexFromPath(sourcePath) + const destinationIndex = getCollectionIndexFromPath(destinationPath) + + if ( + (sourceIndex || sourceIndex == 0) && + (destinationIndex || destinationIndex == 0) && + sourceIndex < destinationIndex + ) { + newDestinationPath = destinationParentPath + ? `${destinationParentPath}/${destinationIndex - 1}` + : `${destinationIndex - 1}` + } else { + newDestinationPath = destinationPath + } + } else { + newDestinationPath = destinationPath + } + + const destinationFolder = navigateToFolderWithIndexPath( + restCollectionStore.value.state, + newDestinationPath.split("/").map((index) => parseInt(index)) + ) + + const newSourcePath = destinationFolder + ? `${newDestinationPath}/${destinationFolder?.folders.length - 1}` + : undefined + + return { + newSourcePath, + newDestinationPath, + } +} + +function getParentPathFromPath(path: string | undefined) { + const indexes = path ? path.split("/") : [] + indexes.pop() + + return indexes.join("/") +} + +export function getStoreByCollectionType(type: "GQL" | "REST") { + const isGQL = type == "GQL" + + const collectionStore = isGQL ? graphqlCollectionStore : restCollectionStore + + return { collectionStore } +} diff --git a/packages/hoppscotch-selfhost-desktop/src/platform/collections/gqlCollections.sync.ts b/packages/hoppscotch-selfhost-desktop/src/platform/collections/gqlCollections.sync.ts new file mode 100644 index 000000000..d65970dcc --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/platform/collections/gqlCollections.sync.ts @@ -0,0 +1,269 @@ +import { + graphqlCollectionStore, + navigateToFolderWithIndexPath, + removeDuplicateGraphqlCollectionOrFolder, +} from "@hoppscotch/common/newstore/collections" +import { + getSettingSubject, + settingsStore, +} from "@hoppscotch/common/newstore/settings" + +import { HoppCollection, HoppRESTRequest } from "@hoppscotch/data" + +import { getSyncInitFunction } from "../../lib/sync" + +import { StoreSyncDefinitionOf } from "../../lib/sync" +import { createMapper } from "../../lib/sync/mapper" +import { + createGQLChildUserCollection, + createGQLRootUserCollection, + createGQLUserRequest, + deleteUserCollection, + deleteUserRequest, + editGQLUserRequest, + renameUserCollection, +} from "./collections.api" + +import * as E from "fp-ts/Either" +import { moveOrReorderRequests } from "./collections.sync" + +// gqlCollectionsMapper uses the collectionPath as the local identifier +export const gqlCollectionsMapper = createMapper() + +// gqlRequestsMapper uses the collectionPath/requestIndex as the local identifier +export const gqlRequestsMapper = createMapper() + +// temp implementation untill the backend implements an endpoint that accepts an entire collection +// TODO: use importCollectionsJSON to do this +const recursivelySyncCollections = async ( + collection: HoppCollection, + collectionPath: string, + parentUserCollectionID?: string +) => { + let parentCollectionID = parentUserCollectionID + + // if parentUserCollectionID does not exist, create the collection as a root collection + if (!parentUserCollectionID) { + const res = await createGQLRootUserCollection(collection.name) + + if (E.isRight(res)) { + parentCollectionID = res.right.createGQLRootUserCollection.id + + collection.id = parentCollectionID + removeDuplicateGraphqlCollectionOrFolder( + parentCollectionID, + collectionPath + ) + } else { + parentCollectionID = undefined + } + } else { + // if parentUserCollectionID exists, create the collection as a child collection + const res = await createGQLChildUserCollection( + collection.name, + parentUserCollectionID + ) + + if (E.isRight(res)) { + const childCollectionId = res.right.createGQLChildUserCollection.id + + collection.id = childCollectionId + + removeDuplicateGraphqlCollectionOrFolder( + childCollectionId, + `${collectionPath}` + ) + } + } + + // create the requests + if (parentCollectionID) { + collection.requests.forEach(async (request) => { + const res = + parentCollectionID && + (await createGQLUserRequest( + request.name, + JSON.stringify(request), + parentCollectionID + )) + + if (res && E.isRight(res)) { + const requestId = res.right.createGQLUserRequest.id + + request.id = requestId + } + }) + } + + // create the folders aka child collections + if (parentCollectionID) + collection.folders.forEach(async (folder, index) => { + recursivelySyncCollections( + folder, + `${collectionPath}/${index}`, + parentCollectionID + ) + }) +} + +// TODO: generalize this +// TODO: ask backend to send enough info on the subscription to not need this +export const collectionReorderOrMovingOperations: { + sourceCollectionID: string + destinationCollectionID?: string + reorderOperation: { + fromPath: string + toPath?: string + } +}[] = [] + +type OperationStatus = "pending" | "completed" + +type OperationCollectionRemoved = { + type: "COLLECTION_REMOVED" + collectionBackendID: string + status: OperationStatus +} + +export const gqlCollectionsOperations: Array = [] + +export const storeSyncDefinition: StoreSyncDefinitionOf< + typeof graphqlCollectionStore +> = { + appendCollections({ entries }) { + let indexStart = graphqlCollectionStore.value.state.length - entries.length + + entries.forEach((collection) => { + recursivelySyncCollections(collection, `${indexStart}`) + indexStart++ + }) + }, + async addCollection({ collection }) { + const lastCreatedCollectionIndex = + graphqlCollectionStore.value.state.length - 1 + + await recursivelySyncCollections( + collection, + `${lastCreatedCollectionIndex}` + ) + }, + async removeCollection({ collectionID }) { + if (collectionID) { + await deleteUserCollection(collectionID) + } + }, + editCollection({ collection, collectionIndex }) { + const collectionID = navigateToFolderWithIndexPath( + graphqlCollectionStore.value.state, + [collectionIndex] + )?.id + + if (collectionID && collection.name) { + renameUserCollection(collectionID, collection.name) + } + }, + async addFolder({ name, path }) { + const parentCollection = navigateToFolderWithIndexPath( + graphqlCollectionStore.value.state, + path.split("/").map((index) => parseInt(index)) + ) + + const parentCollectionBackendID = parentCollection?.id + + if (parentCollectionBackendID) { + const foldersLength = parentCollection.folders.length + + const res = await createGQLChildUserCollection( + name, + parentCollectionBackendID + ) + + if (E.isRight(res)) { + const { id } = res.right.createGQLChildUserCollection + + if (foldersLength) { + parentCollection.folders[foldersLength - 1].id = id + removeDuplicateGraphqlCollectionOrFolder( + id, + `${path}/${foldersLength - 1}` + ) + } + } + } + }, + editFolder({ folder, path }) { + const folderBackendId = navigateToFolderWithIndexPath( + graphqlCollectionStore.value.state, + path.split("/").map((index) => parseInt(index)) + )?.id + + if (folderBackendId && folder.name) { + renameUserCollection(folderBackendId, folder.name) + } + }, + async removeFolder({ folderID }) { + if (folderID) { + await deleteUserCollection(folderID) + } + }, + editRequest({ path, requestIndex, requestNew }) { + const request = navigateToFolderWithIndexPath( + graphqlCollectionStore.value.state, + path.split("/").map((index) => parseInt(index)) + )?.requests[requestIndex] + + const requestBackendID = request?.id + + if (requestBackendID) { + editGQLUserRequest( + requestBackendID, + (requestNew as HoppRESTRequest).name, + JSON.stringify(requestNew) + ) + } + }, + async saveRequestAs({ path, request }) { + const folder = navigateToFolderWithIndexPath( + graphqlCollectionStore.value.state, + path.split("/").map((index) => parseInt(index)) + ) + + const parentCollectionBackendID = folder?.id + + if (parentCollectionBackendID) { + const newRequest = folder.requests[folder.requests.length - 1] + + const res = await createGQLUserRequest( + (request as HoppRESTRequest).name, + JSON.stringify(request), + parentCollectionBackendID + ) + + if (E.isRight(res)) { + const { id } = res.right.createGQLUserRequest + + newRequest.id = id + removeDuplicateGraphqlCollectionOrFolder( + id, + `${path}/${folder.requests.length - 1}`, + "request" + ) + } + } + }, + async removeRequest({ requestID }) { + if (requestID) { + await deleteUserRequest(requestID) + } + }, + moveRequest({ destinationPath, path, requestIndex }) { + moveOrReorderRequests(requestIndex, path, destinationPath, undefined, "GQL") + }, +} + +export const gqlCollectionsSyncer = getSyncInitFunction( + graphqlCollectionStore, + storeSyncDefinition, + () => settingsStore.value.syncCollections, + getSettingSubject("syncCollections") +) diff --git a/packages/hoppscotch-selfhost-desktop/src/platform/environments/environments.api.ts b/packages/hoppscotch-selfhost-desktop/src/platform/environments/environments.api.ts new file mode 100644 index 000000000..a6ed2530f --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/platform/environments/environments.api.ts @@ -0,0 +1,117 @@ +import { + runMutation, + runGQLQuery, + runGQLSubscription, +} from "@hoppscotch/common/helpers/backend/GQLClient" + +import { + CreateUserEnvironmentDocument, + CreateUserEnvironmentMutation, + CreateUserEnvironmentMutationVariables, + UpdateUserEnvironmentMutation, + UpdateUserEnvironmentMutationVariables, + UpdateUserEnvironmentDocument, + DeleteUserEnvironmentMutation, + DeleteUserEnvironmentMutationVariables, + DeleteUserEnvironmentDocument, + ClearGlobalEnvironmentsMutation, + ClearGlobalEnvironmentsMutationVariables, + ClearGlobalEnvironmentsDocument, + CreateUserGlobalEnvironmentMutation, + CreateUserGlobalEnvironmentMutationVariables, + CreateUserGlobalEnvironmentDocument, + GetGlobalEnvironmentsDocument, + GetGlobalEnvironmentsQueryVariables, + GetGlobalEnvironmentsQuery, + GetUserEnvironmentsDocument, + UserEnvironmentCreatedDocument, + UserEnvironmentUpdatedDocument, + UserEnvironmentDeletedDocument, +} from "./../../api/generated/graphql" + +import { Environment } from "@hoppscotch/data" + +export const createUserEnvironment = (name: string, variables: string) => + runMutation< + CreateUserEnvironmentMutation, + CreateUserEnvironmentMutationVariables, + "" + >(CreateUserEnvironmentDocument, { + name, + variables, + })() + +export const updateUserEnvironment = ( + id: string, + { name, variables }: Environment +) => + runMutation< + UpdateUserEnvironmentMutation, + UpdateUserEnvironmentMutationVariables, + "" + >(UpdateUserEnvironmentDocument, { + id, + name, + variables: JSON.stringify(variables), + }) + +export const deleteUserEnvironment = (id: string) => + runMutation< + DeleteUserEnvironmentMutation, + DeleteUserEnvironmentMutationVariables, + "" + >(DeleteUserEnvironmentDocument, { + id, + }) + +export const clearGlobalEnvironmentVariables = (id: string) => + runMutation< + ClearGlobalEnvironmentsMutation, + ClearGlobalEnvironmentsMutationVariables, + "" + >(ClearGlobalEnvironmentsDocument, { + id, + })() + +export const getUserEnvironments = () => + runGQLQuery({ + query: GetUserEnvironmentsDocument, + variables: {}, + }) + +export const getGlobalEnvironments = () => + runGQLQuery< + GetGlobalEnvironmentsQuery, + GetGlobalEnvironmentsQueryVariables, + "user_environment/user_env_does_not_exists" + >({ + query: GetGlobalEnvironmentsDocument, + variables: {}, + }) + +export const createUserGlobalEnvironment = (variables: string) => + runMutation< + CreateUserGlobalEnvironmentMutation, + CreateUserGlobalEnvironmentMutationVariables, + "" + >(CreateUserGlobalEnvironmentDocument, { + variables, + })() + +export const runUserEnvironmentCreatedSubscription = () => + runGQLSubscription({ + query: UserEnvironmentCreatedDocument, + variables: {}, + }) + +export const runUserEnvironmentUpdatedSubscription = () => + runGQLSubscription({ + query: UserEnvironmentUpdatedDocument, + variables: {}, + }) + +export const runUserEnvironmentDeletedSubscription = () => + runGQLSubscription({ + query: UserEnvironmentDeletedDocument, + variables: {}, + }) diff --git a/packages/hoppscotch-selfhost-desktop/src/platform/environments/environments.platform.ts b/packages/hoppscotch-selfhost-desktop/src/platform/environments/environments.platform.ts new file mode 100644 index 000000000..8d5042228 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/platform/environments/environments.platform.ts @@ -0,0 +1,200 @@ +import { authEvents$, def as platformAuth } from "@platform/auth" +import { + createEnvironment, + deleteEnvironment, + environmentsStore, + getLocalIndexByEnvironmentID, + replaceEnvironments, + setGlobalEnvID, + setGlobalEnvVariables, + updateEnvironment, +} from "@hoppscotch/common/newstore/environments" + +import { EnvironmentsPlatformDef } from "@hoppscotch/common/src/platform/environments" +import { runGQLSubscription } from "@hoppscotch/common/helpers/backend/GQLClient" + +import { environnmentsSyncer } from "@platform/environments/environments.sync" + +import * as E from "fp-ts/Either" +import { runDispatchWithOutSyncing } from "@lib/sync" +import { + createUserGlobalEnvironment, + getGlobalEnvironments, + getUserEnvironments, + runUserEnvironmentCreatedSubscription, + runUserEnvironmentDeletedSubscription, + runUserEnvironmentUpdatedSubscription, +} from "@platform/environments/environments.api" + +export function initEnvironmentsSync() { + const currentUser$ = platformAuth.getCurrentUserStream() + + environnmentsSyncer.startStoreSync() + environnmentsSyncer.setupSubscriptions(setupSubscriptions) + + currentUser$.subscribe(async (user) => { + if (user) { + await loadAllEnvironments() + } + }) + + authEvents$.subscribe((event) => { + if (event.event == "login" || event.event == "token_refresh") { + environnmentsSyncer.startListeningToSubscriptions() + } + + if (event.event == "logout") { + environnmentsSyncer.stopListeningToSubscriptions() + } + }) +} + +export const def: EnvironmentsPlatformDef = { + initEnvironmentsSync, +} + +function setupSubscriptions() { + let subs: ReturnType[1][] = [] + + const userEnvironmentCreatedSub = setupUserEnvironmentCreatedSubscription() + const userEnvironmentUpdatedSub = setupUserEnvironmentUpdatedSubscription() + const userEnvironmentDeletedSub = setupUserEnvironmentDeletedSubscription() + + subs = [ + userEnvironmentCreatedSub, + userEnvironmentUpdatedSub, + userEnvironmentDeletedSub, + ] + + return () => { + subs.forEach((sub) => sub.unsubscribe()) + } +} + +async function loadUserEnvironments() { + const res = await getUserEnvironments() + + if (E.isRight(res)) { + const environments = res.right.me.environments + + if (environments.length > 0) { + runDispatchWithOutSyncing(() => { + replaceEnvironments( + environments.map(({ id, variables, name }) => ({ + id, + name, + variables: JSON.parse(variables), + })) + ) + }) + } + } +} + +async function loadGlobalEnvironments() { + const res = await getGlobalEnvironments() + + if (E.isRight(res)) { + const globalEnv = res.right.me.globalEnvironments + + if (globalEnv) { + runDispatchWithOutSyncing(() => { + setGlobalEnvVariables(JSON.parse(globalEnv.variables)) + setGlobalEnvID(globalEnv.id) + }) + } + } else if (res.left.error == "user_environment/user_env_does_not_exists") { + const res = await createUserGlobalEnvironment(JSON.stringify([])) + + if (E.isRight(res)) { + const backendId = res.right.createUserGlobalEnvironment.id + setGlobalEnvID(backendId) + } + } +} + +async function loadAllEnvironments() { + await loadUserEnvironments() + await loadGlobalEnvironments() +} + +function setupUserEnvironmentCreatedSubscription() { + const [userEnvironmentCreated$, userEnvironmentCreatedSub] = + runUserEnvironmentCreatedSubscription() + + userEnvironmentCreated$.subscribe((res) => { + if (E.isRight(res)) { + const { name, variables, id } = res.right.userEnvironmentCreated + + const isAlreadyExisting = environmentsStore.value.environments.some( + (env) => env.id == id + ) + + if (name && !isAlreadyExisting) { + runDispatchWithOutSyncing(() => { + createEnvironment(name, JSON.parse(variables), id) + }) + } + } + }) + + return userEnvironmentCreatedSub +} + +function setupUserEnvironmentUpdatedSubscription() { + const [userEnvironmentUpdated$, userEnvironmentUpdatedSub] = + runUserEnvironmentUpdatedSubscription() + + userEnvironmentUpdated$.subscribe((res) => { + if (E.isRight(res)) { + const { name, variables, id, isGlobal } = res.right.userEnvironmentUpdated + + // handle the case for global environments + if (isGlobal) { + runDispatchWithOutSyncing(() => { + setGlobalEnvVariables(JSON.parse(variables)) + }) + } else { + // handle the case for normal environments + + const localIndex = environmentsStore.value.environments.findIndex( + (env) => env.id == id + ) + + if ((localIndex || localIndex == 0) && name) { + runDispatchWithOutSyncing(() => { + updateEnvironment(localIndex, { + id, + name, + variables: JSON.parse(variables), + }) + }) + } + } + } + }) + + return userEnvironmentUpdatedSub +} + +function setupUserEnvironmentDeletedSubscription() { + const [userEnvironmentDeleted$, userEnvironmentDeletedSub] = + runUserEnvironmentDeletedSubscription() + + userEnvironmentDeleted$.subscribe((res) => { + if (E.isRight(res)) { + const { id } = res.right.userEnvironmentDeleted + + // TODO: move getLocalIndexByID to a getter in the environmentsStore + const localIndex = getLocalIndexByEnvironmentID(id) + + if (localIndex || localIndex === 0) { + runDispatchWithOutSyncing(() => { + deleteEnvironment(localIndex) + }) + } + } + }) + + return userEnvironmentDeletedSub +} diff --git a/packages/hoppscotch-selfhost-desktop/src/platform/environments/environments.sync.ts b/packages/hoppscotch-selfhost-desktop/src/platform/environments/environments.sync.ts new file mode 100644 index 000000000..fb4094204 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/platform/environments/environments.sync.ts @@ -0,0 +1,117 @@ +import { + environmentsStore, + getGlobalVariableID, + removeDuplicateEntry, +} from "@hoppscotch/common/newstore/environments" +import { + getSettingSubject, + settingsStore, +} from "@hoppscotch/common/newstore/settings" + +import { getSyncInitFunction } from "../../lib/sync" + +import * as E from "fp-ts/Either" + +import { StoreSyncDefinitionOf } from "../../lib/sync" +import { createMapper } from "../../lib/sync/mapper" +import { + clearGlobalEnvironmentVariables, + createUserEnvironment, + deleteUserEnvironment, + updateUserEnvironment, +} from "./environments.api" + +export const environmentsMapper = createMapper() +export const globalEnvironmentMapper = createMapper() + +export const storeSyncDefinition: StoreSyncDefinitionOf< + typeof environmentsStore +> = { + async createEnvironment({ name, variables }) { + const lastCreatedEnvIndex = environmentsStore.value.environments.length - 1 + + const res = await createUserEnvironment(name, JSON.stringify(variables)) + + if (E.isRight(res)) { + const id = res.right.createUserEnvironment.id + environmentsStore.value.environments[lastCreatedEnvIndex].id = id + removeDuplicateEntry(id) + } + }, + async appendEnvironments({ envs }) { + const appendListLength = envs.length + let appendStart = + environmentsStore.value.environments.length - appendListLength - 1 + + envs.forEach((env) => { + const envId = ++appendStart + + ;(async function () { + const res = await createUserEnvironment( + env.name, + JSON.stringify(env.variables) + ) + + if (E.isRight(res)) { + const id = res.right.createUserEnvironment.id + environmentsStore.value.environments[envId].id = id + + removeDuplicateEntry(id) + } + })() + }) + }, + async duplicateEnvironment({ envIndex }) { + const environmentToDuplicate = environmentsStore.value.environments.find( + (_, index) => index === envIndex + ) + + const lastCreatedEnvIndex = environmentsStore.value.environments.length - 1 + + if (environmentToDuplicate) { + const res = await createUserEnvironment( + `${environmentToDuplicate?.name} - Duplicate`, + JSON.stringify(environmentToDuplicate?.variables) + ) + + if (E.isRight(res)) { + const id = res.right.createUserEnvironment.id + environmentsStore.value.environments[lastCreatedEnvIndex].id = id + + removeDuplicateEntry(id) + } + } + }, + updateEnvironment({ envIndex, updatedEnv }) { + const backendId = environmentsStore.value.environments[envIndex].id + + if (backendId) { + updateUserEnvironment(backendId, updatedEnv)() + } + }, + async deleteEnvironment({ envID }) { + if (envID) { + await deleteUserEnvironment(envID)() + } + }, + setGlobalVariables({ entries }) { + const backendId = getGlobalVariableID() + if (backendId) { + updateUserEnvironment(backendId, { name: "", variables: entries })() + } + }, + clearGlobalVariables() { + const backendId = getGlobalVariableID() + + if (backendId) { + clearGlobalEnvironmentVariables(backendId) + } + }, +} + +export const environnmentsSyncer = getSyncInitFunction( + environmentsStore, + storeSyncDefinition, + () => settingsStore.value.syncEnvironments, + getSettingSubject("syncEnvironments") +) diff --git a/packages/hoppscotch-selfhost-desktop/src/platform/history/history.api.ts b/packages/hoppscotch-selfhost-desktop/src/platform/history/history.api.ts new file mode 100644 index 000000000..862f776f7 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/platform/history/history.api.ts @@ -0,0 +1,100 @@ +import { + runMutation, + runGQLQuery, + runGQLSubscription, +} from "@hoppscotch/common/helpers/backend/GQLClient" + +import { + CreateUserHistoryDocument, + CreateUserHistoryMutation, + CreateUserHistoryMutationVariables, + DeleteAllUserHistoryDocument, + DeleteAllUserHistoryMutation, + DeleteAllUserHistoryMutationVariables, + GetRestUserHistoryDocument, + GetRestUserHistoryQuery, + GetRestUserHistoryQueryVariables, + RemoveRequestFromHistoryDocument, + RemoveRequestFromHistoryMutation, + RemoveRequestFromHistoryMutationVariables, + ReqType, + ToggleHistoryStarStatusDocument, + ToggleHistoryStarStatusMutation, + ToggleHistoryStarStatusMutationVariables, + UserHistoryCreatedDocument, + UserHistoryDeletedDocument, + UserHistoryDeletedManyDocument, + UserHistoryUpdatedDocument, +} from "../../api/generated/graphql" + +export const getUserHistoryEntries = () => + runGQLQuery({ + query: GetRestUserHistoryDocument, + variables: {}, + }) + +export const createUserHistory = ( + reqData: string, + resMetadata: string, + reqType: ReqType +) => + runMutation< + CreateUserHistoryMutation, + CreateUserHistoryMutationVariables, + "" + >(CreateUserHistoryDocument, { + reqData, + resMetadata, + reqType, + })() + +export const toggleHistoryStarStatus = (id: string) => + runMutation< + ToggleHistoryStarStatusMutation, + ToggleHistoryStarStatusMutationVariables, + "" + >(ToggleHistoryStarStatusDocument, { + id, + })() + +export const removeRequestFromHistory = (id: string) => + runMutation< + RemoveRequestFromHistoryMutation, + RemoveRequestFromHistoryMutationVariables, + "" + >(RemoveRequestFromHistoryDocument, { + id, + })() + +export const deleteAllUserHistory = (reqType: ReqType) => + runMutation< + DeleteAllUserHistoryMutation, + DeleteAllUserHistoryMutationVariables, + "" + >(DeleteAllUserHistoryDocument, { + reqType, + })() + +export const runUserHistoryCreatedSubscription = () => + runGQLSubscription({ + query: UserHistoryCreatedDocument, + variables: {}, + }) + +export const runUserHistoryUpdatedSubscription = () => + runGQLSubscription({ + query: UserHistoryUpdatedDocument, + variables: {}, + }) + +export const runUserHistoryDeletedSubscription = () => + runGQLSubscription({ + query: UserHistoryDeletedDocument, + variables: {}, + }) + +export const runUserHistoryDeletedManySubscription = () => + runGQLSubscription({ + query: UserHistoryDeletedManyDocument, + variables: {}, + }) diff --git a/packages/hoppscotch-selfhost-desktop/src/platform/history/history.platform.ts b/packages/hoppscotch-selfhost-desktop/src/platform/history/history.platform.ts new file mode 100644 index 000000000..fd0042a71 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/platform/history/history.platform.ts @@ -0,0 +1,261 @@ +import { authEvents$, def as platformAuth } from "@platform/auth" +import { + restHistoryStore, + RESTHistoryEntry, + setRESTHistoryEntries, + addRESTHistoryEntry, + toggleRESTHistoryEntryStar, + deleteRESTHistoryEntry, + clearRESTHistory, + setGraphqlHistoryEntries, + GQLHistoryEntry, + addGraphqlHistoryEntry, + toggleGraphqlHistoryEntryStar, + graphqlHistoryStore, + deleteGraphqlHistoryEntry, + clearGraphqlHistory, +} from "@hoppscotch/common/newstore/history" +import { HistoryPlatformDef } from "@hoppscotch/common/platform/history" +import { + getUserHistoryEntries, + runUserHistoryCreatedSubscription, + runUserHistoryDeletedManySubscription, + runUserHistoryDeletedSubscription, + runUserHistoryUpdatedSubscription, +} from "./history.api" + +import * as E from "fp-ts/Either" +import { restHistorySyncer, gqlHistorySyncer } from "./history.sync" +import { runGQLSubscription } from "@hoppscotch/common/helpers/backend/GQLClient" +import { runDispatchWithOutSyncing } from "@lib/sync" +import { ReqType } from "../../api/generated/graphql" + +function initHistorySync() { + const currentUser$ = platformAuth.getCurrentUserStream() + + restHistorySyncer.startStoreSync() + restHistorySyncer.setupSubscriptions(setupSubscriptions) + + gqlHistorySyncer.startStoreSync() + + loadHistoryEntries() + + currentUser$.subscribe(async (user) => { + if (user) { + await loadHistoryEntries() + } + }) + + authEvents$.subscribe((event) => { + if (event.event == "login" || event.event == "token_refresh") { + restHistorySyncer.startListeningToSubscriptions() + } + + if (event.event == "logout") { + restHistorySyncer.stopListeningToSubscriptions() + } + }) +} + +function setupSubscriptions() { + let subs: ReturnType[1][] = [] + + const userHistoryCreatedSub = setupUserHistoryCreatedSubscription() + const userHistoryUpdatedSub = setupUserHistoryUpdatedSubscription() + const userHistoryDeletedSub = setupUserHistoryDeletedSubscription() + const userHistoryDeletedManySub = setupUserHistoryDeletedManySubscription() + + subs = [ + userHistoryCreatedSub, + userHistoryUpdatedSub, + userHistoryDeletedSub, + userHistoryDeletedManySub, + ] + + return () => { + subs.forEach((sub) => sub.unsubscribe()) + } +} + +async function loadHistoryEntries() { + const res = await getUserHistoryEntries() + + if (E.isRight(res)) { + const restEntries = res.right.me.RESTHistory + const gqlEntries = res.right.me.GQLHistory + + const restHistoryEntries: RESTHistoryEntry[] = restEntries.map((entry) => ({ + v: 1, + request: JSON.parse(entry.request), + responseMeta: JSON.parse(entry.responseMetadata), + star: entry.isStarred, + updatedOn: new Date(entry.executedOn), + id: entry.id, + })) + + const gqlHistoryEntries: GQLHistoryEntry[] = gqlEntries.map((entry) => ({ + v: 1, + request: JSON.parse(entry.request), + response: JSON.parse(entry.responseMetadata), + star: entry.isStarred, + updatedOn: new Date(entry.executedOn), + id: entry.id, + })) + + runDispatchWithOutSyncing(() => { + setRESTHistoryEntries(restHistoryEntries) + setGraphqlHistoryEntries(gqlHistoryEntries) + }) + } +} + +function setupUserHistoryCreatedSubscription() { + const [userHistoryCreated$, userHistoryCreatedSub] = + runUserHistoryCreatedSubscription() + + userHistoryCreated$.subscribe((res) => { + if (E.isRight(res)) { + const { id, reqType, request, responseMetadata, isStarred, executedOn } = + res.right.userHistoryCreated + + const hasAlreadyBeenAdded = + reqType == ReqType.Rest + ? restHistoryStore.value.state.some((entry) => entry.id == id) + : graphqlHistoryStore.value.state.some((entry) => entry.id == id) + + !hasAlreadyBeenAdded && + runDispatchWithOutSyncing(() => { + reqType == ReqType.Rest + ? addRESTHistoryEntry({ + v: 1, + id, + request: JSON.parse(request), + responseMeta: JSON.parse(responseMetadata), + star: isStarred, + updatedOn: new Date(executedOn), + }) + : addGraphqlHistoryEntry({ + v: 1, + id, + request: JSON.parse(request), + response: JSON.parse(responseMetadata), + star: isStarred, + updatedOn: new Date(executedOn), + }) + }) + } + }) + + return userHistoryCreatedSub +} + +// currently the updates are only for toggling the star +function setupUserHistoryUpdatedSubscription() { + const [userHistoryUpdated$, userHistoryUpdatedSub] = + runUserHistoryUpdatedSubscription() + + userHistoryUpdated$.subscribe((res) => { + if (E.isRight(res)) { + const { id, executedOn, isStarred, request, responseMetadata, reqType } = + res.right.userHistoryUpdated + + if (reqType == ReqType.Rest) { + const updatedRestEntryIndex = restHistoryStore.value.state.findIndex( + (entry) => entry.id == id + ) + + if (updatedRestEntryIndex != -1) { + runDispatchWithOutSyncing(() => { + toggleRESTHistoryEntryStar({ + v: 1, + id, + request: JSON.parse(request), + responseMeta: JSON.parse(responseMetadata), + // because the star will be toggled in the store, we need to pass the opposite value + star: !isStarred, + updatedOn: new Date(executedOn), + }) + }) + } + } + + if (reqType == ReqType.Gql) { + const updatedGQLEntryIndex = graphqlHistoryStore.value.state.findIndex( + (entry) => entry.id == id + ) + + if (updatedGQLEntryIndex != -1) { + runDispatchWithOutSyncing(() => { + toggleGraphqlHistoryEntryStar({ + v: 1, + id, + request: JSON.parse(request), + response: JSON.parse(responseMetadata), + // because the star will be toggled in the store, we need to pass the opposite value + star: !isStarred, + updatedOn: new Date(executedOn), + }) + }) + } + } + } + }) + + return userHistoryUpdatedSub +} + +function setupUserHistoryDeletedSubscription() { + const [userHistoryDeleted$, userHistoryDeletedSub] = + runUserHistoryDeletedSubscription() + + userHistoryDeleted$.subscribe((res) => { + if (E.isRight(res)) { + const { id, reqType } = res.right.userHistoryDeleted + + if (reqType == ReqType.Gql) { + const deletedEntry = graphqlHistoryStore.value.state.find( + (entry) => entry.id == id + ) + + deletedEntry && + runDispatchWithOutSyncing(() => { + deleteGraphqlHistoryEntry(deletedEntry) + }) + } + + if (reqType == ReqType.Rest) { + const deletedEntry = restHistoryStore.value.state.find( + (entry) => entry.id == id + ) + + deletedEntry && + runDispatchWithOutSyncing(() => { + deleteRESTHistoryEntry(deletedEntry) + }) + } + } + }) + + return userHistoryDeletedSub +} + +function setupUserHistoryDeletedManySubscription() { + const [userHistoryDeletedMany$, userHistoryDeletedManySub] = + runUserHistoryDeletedManySubscription() + + userHistoryDeletedMany$.subscribe((res) => { + if (E.isRight(res)) { + const { reqType } = res.right.userHistoryDeletedMany + + runDispatchWithOutSyncing(() => { + reqType == ReqType.Rest ? clearRESTHistory() : clearGraphqlHistory() + }) + } + }) + + return userHistoryDeletedManySub +} + +export const def: HistoryPlatformDef = { + initHistorySync, +} diff --git a/packages/hoppscotch-selfhost-desktop/src/platform/history/history.sync.ts b/packages/hoppscotch-selfhost-desktop/src/platform/history/history.sync.ts new file mode 100644 index 000000000..340c185a5 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/platform/history/history.sync.ts @@ -0,0 +1,101 @@ +import { + graphqlHistoryStore, + removeDuplicateRestHistoryEntry, + removeDuplicateGraphqlHistoryEntry, + restHistoryStore, +} from "@hoppscotch/common/newstore/history" +import { + getSettingSubject, + settingsStore, +} from "@hoppscotch/common/newstore/settings" + +import { getSyncInitFunction } from "../../lib/sync" + +import * as E from "fp-ts/Either" + +import { StoreSyncDefinitionOf } from "../../lib/sync" +import { + createUserHistory, + deleteAllUserHistory, + removeRequestFromHistory, + toggleHistoryStarStatus, +} from "./history.api" +import { ReqType } from "../../api/generated/graphql" + +export const restHistoryStoreSyncDefinition: StoreSyncDefinitionOf< + typeof restHistoryStore +> = { + async addEntry({ entry }) { + const res = await createUserHistory( + JSON.stringify(entry.request), + JSON.stringify(entry.responseMeta), + ReqType.Rest + ) + + if (E.isRight(res)) { + entry.id = res.right.createUserHistory.id + + // preventing double insertion from here and subscription + removeDuplicateRestHistoryEntry(entry.id) + } + }, + deleteEntry({ entry }) { + if (entry.id) { + removeRequestFromHistory(entry.id) + } + }, + toggleStar({ entry }) { + if (entry.id) { + toggleHistoryStarStatus(entry.id) + } + }, + clearHistory() { + deleteAllUserHistory(ReqType.Rest) + }, +} + +export const gqlHistoryStoreSyncDefinition: StoreSyncDefinitionOf< + typeof graphqlHistoryStore +> = { + async addEntry({ entry }) { + const res = await createUserHistory( + JSON.stringify(entry.request), + JSON.stringify(entry.response), + ReqType.Gql + ) + + if (E.isRight(res)) { + entry.id = res.right.createUserHistory.id + + // preventing double insertion from here and subscription + removeDuplicateGraphqlHistoryEntry(entry.id) + } + }, + deleteEntry({ entry }) { + if (entry.id) { + removeRequestFromHistory(entry.id) + } + }, + toggleStar({ entry }) { + if (entry.id) { + toggleHistoryStarStatus(entry.id) + } + }, + clearHistory() { + deleteAllUserHistory(ReqType.Gql) + }, +} + +export const restHistorySyncer = getSyncInitFunction( + restHistoryStore, + restHistoryStoreSyncDefinition, + () => settingsStore.value.syncHistory, + getSettingSubject("syncHistory") +) + +export const gqlHistorySyncer = getSyncInitFunction( + graphqlHistoryStore, + gqlHistoryStoreSyncDefinition, + () => settingsStore.value.syncHistory, + getSettingSubject("syncHistory") +) diff --git a/packages/hoppscotch-selfhost-desktop/src/platform/settings/settings.api.ts b/packages/hoppscotch-selfhost-desktop/src/platform/settings/settings.api.ts new file mode 100644 index 000000000..198701a56 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/platform/settings/settings.api.ts @@ -0,0 +1,51 @@ +import { + runGQLQuery, + runGQLSubscription, + runMutation, +} from "@hoppscotch/common/helpers/backend/GQLClient" +import { + CreateUserSettingsDocument, + CreateUserSettingsMutation, + CreateUserSettingsMutationVariables, + GetUserSettingsDocument, + GetUserSettingsQuery, + GetUserSettingsQueryVariables, + UpdateUserSettingsDocument, + UpdateUserSettingsMutation, + UpdateUserSettingsMutationVariables, + UserSettingsUpdatedDocument, +} from "../../api/generated/graphql" + +export const getUserSettings = () => + runGQLQuery< + GetUserSettingsQuery, + GetUserSettingsQueryVariables, + "user_settings/not_found" + >({ + query: GetUserSettingsDocument, + variables: {}, + }) + +export const createUserSettings = (properties: string) => + runMutation< + CreateUserSettingsMutation, + CreateUserSettingsMutationVariables, + "" + >(CreateUserSettingsDocument, { + properties, + })() + +export const updateUserSettings = (properties: string) => + runMutation< + UpdateUserSettingsMutation, + UpdateUserSettingsMutationVariables, + "" + >(UpdateUserSettingsDocument, { + properties, + })() + +export const runUserSettingsUpdatedSubscription = () => + runGQLSubscription({ + query: UserSettingsUpdatedDocument, + variables: {}, + }) diff --git a/packages/hoppscotch-selfhost-desktop/src/platform/settings/settings.platform.ts b/packages/hoppscotch-selfhost-desktop/src/platform/settings/settings.platform.ts new file mode 100644 index 000000000..a8aca2e72 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/platform/settings/settings.platform.ts @@ -0,0 +1,88 @@ +import { SettingsPlatformDef } from "@hoppscotch/common/platform/settings" +import { settingsSyncer } from "./settings.sync" +import { authEvents$, def as platformAuth } from "@platform/auth" +import { + createUserSettings, + getUserSettings, + runUserSettingsUpdatedSubscription, +} from "./settings.api" +import * as E from "fp-ts/Either" +import { runGQLSubscription } from "@hoppscotch/common/helpers/backend/GQLClient" +import { + bulkApplySettings, + getDefaultSettings, +} from "@hoppscotch/common/newstore/settings" +import { runDispatchWithOutSyncing } from "@lib/sync" + +function initSettingsSync() { + const currentUser$ = platformAuth.getCurrentUserStream() + settingsSyncer.startStoreSync() + settingsSyncer.setupSubscriptions(setupSubscriptions) + + // load the settings + + loadUserSettings() + + currentUser$.subscribe(async (user) => { + if (user) { + // load the settings + loadUserSettings() + } + }) + + authEvents$.subscribe((event) => { + if (event.event == "login" || event.event == "token_refresh") { + settingsSyncer.startListeningToSubscriptions() + } + + if (event.event == "logout") { + settingsSyncer.stopListeningToSubscriptions() + } + }) +} + +async function loadUserSettings() { + const res = await getUserSettings() + + // create user settings if it doesn't exist + E.isLeft(res) && + res.left.error == "user_settings/not_found" && + (await createUserSettings(JSON.stringify(getDefaultSettings()))) + + if (E.isRight(res)) { + runDispatchWithOutSyncing(() => { + bulkApplySettings(JSON.parse(res.right.me.settings.properties)) + }) + } +} + +function setupSubscriptions() { + let subs: ReturnType[1][] = [] + + const userSettingsUpdatedSub = setupUserSettingsUpdatedSubscription() + + subs = [userSettingsUpdatedSub] + + return () => { + subs.forEach((sub) => sub.unsubscribe()) + } +} + +function setupUserSettingsUpdatedSubscription() { + const [userSettingsUpdated$, userSettingsUpdatedSub] = + runUserSettingsUpdatedSubscription() + + userSettingsUpdated$.subscribe((res) => { + if (E.isRight(res)) { + runDispatchWithOutSyncing(() => { + bulkApplySettings(JSON.parse(res.right.userSettingsUpdated.properties)) + }) + } + }) + + return userSettingsUpdatedSub +} + +export const def: SettingsPlatformDef = { + initSettingsSync, +} diff --git a/packages/hoppscotch-selfhost-desktop/src/platform/settings/settings.sync.ts b/packages/hoppscotch-selfhost-desktop/src/platform/settings/settings.sync.ts new file mode 100644 index 000000000..19df5001a --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/platform/settings/settings.sync.ts @@ -0,0 +1,21 @@ +import { settingsStore } from "@hoppscotch/common/newstore/settings" + +import { getSyncInitFunction } from "../../lib/sync" + +import { StoreSyncDefinitionOf } from "../../lib/sync" + +import { updateUserSettings } from "./settings.api" + +export const settingsSyncDefinition: StoreSyncDefinitionOf< + typeof settingsStore +> = { + applySetting() { + updateUserSettings(JSON.stringify(settingsStore.value)) + }, +} + +export const settingsSyncer = getSyncInitFunction( + settingsStore, + settingsSyncDefinition, + () => true +) diff --git a/packages/hoppscotch-selfhost-desktop/src/platform/std/interceptors/localclient.ts b/packages/hoppscotch-selfhost-desktop/src/platform/std/interceptors/localclient.ts new file mode 100644 index 000000000..157a43834 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/platform/std/interceptors/localclient.ts @@ -0,0 +1,142 @@ +import * as E from "fp-ts/Either" +import { + Interceptor, + InterceptorError, + RequestRunResult, +} from "../../../services/interceptor.service" +import axios, { AxiosRequestConfig, CancelToken } from "axios" +import { cloneDeep } from "lodash-es" +import { Body, HttpVerb, ResponseType, getClient } from '@tauri-apps/api/http' + +export const preProcessRequest = ( + req: AxiosRequestConfig +): AxiosRequestConfig => { + const reqClone = cloneDeep(req) + + // If the parameters are URLSearchParams, inject them to URL instead + // This prevents issues of marshalling the URLSearchParams to the proxy + if (reqClone.params instanceof URLSearchParams) { + try { + const url = new URL(reqClone.url ?? "") + + for (const [key, value] of reqClone.params.entries()) { + url.searchParams.append(key, value) + } + + reqClone.url = url.toString() + } catch (e) { + // making this a non-empty block, so we can make the linter happy. + // we should probably use, allowEmptyCatch, or take the time to do something with the caught errors :) + } + + reqClone.params = {} + } + + return reqClone +} + +async function runRequest( + req: AxiosRequestConfig, + cancelled: () => boolean +): RequestRunResult["response"] { + const timeStart = Date.now() + + const processedReq = preProcessRequest(req) + try { + const client = await getClient() + + if (cancelled()) { + client.drop() + return E.left("cancellation") + } + + let body = Body.text(processedReq.data ?? "") + + if (processedReq.data instanceof FormData) { + let body_data = {} + for (const entry of processedReq.data.entries()) { + const [name, value] = entry; + + if (value instanceof File) { + let file_data = await value.arrayBuffer() + + body_data[name] = { + file: new Uint8Array(file_data as number[]), + fileName: value.name + } + } + } + + body = Body.form(body_data); + } + + const res = await client.request({ + method: processedReq.method as HttpVerb, + url: processedReq.url ?? "", + responseType: ResponseType.Binary, + headers: processedReq.headers, + body: body + }); + + if (cancelled()) { + client.drop() + return E.left("cancellation") + } + + res.data = new Uint8Array(res.data as number[]).buffer; + + const timeEnd = Date.now() + + return E.right({ + ...res, + config: { + timeData: { + startTime: timeStart, + endTime: timeEnd, + }, + }, + }) + } catch (e) { + const timeEnd = Date.now() + + if (axios.isAxiosError(e) && e.response) { + return E.right({ + ...e.response, + config: { + timeData: { + startTime: timeStart, + endTime: timeEnd, + }, + }, + }) + } else if (axios.isCancel(e)) { + return E.left("cancellation") + } else { + return E.left({ + humanMessage: { + heading: (t) => t("error.network_fail"), + description: (t) => t("helpers.network_fail"), + }, + error: e, + }) + } + } +} + +export const localclientInterceptor: Interceptor = { + interceptorID: "localclient", + name: () => "localclient", + selectable: { type: "selectable" }, + runRequest(req) { + const processedReq = preProcessRequest(req) + + let cancelled = false + + const checkCancelled = () => { return cancelled } + + return { + cancel: () => { cancelled = true }, + response: runRequest(processedReq, checkCancelled), + } + }, +} diff --git a/packages/hoppscotch-selfhost-desktop/src/platform/tabState/tabState.api.ts b/packages/hoppscotch-selfhost-desktop/src/platform/tabState/tabState.api.ts new file mode 100644 index 000000000..89d87a537 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/platform/tabState/tabState.api.ts @@ -0,0 +1,36 @@ +import { + runMutation, + runGQLQuery, +} from "@hoppscotch/common/helpers/backend/GQLClient" +import { + GetCurrentRestSessionDocument, + GetCurrentRestSessionQuery, + GetCurrentRestSessionQueryVariables, + SessionType, + UpdateUserSessionDocument, + UpdateUserSessionMutation, + UpdateUserSessionMutationVariables, +} from "../../api/generated/graphql" + +export const updateUserSession = ( + currentSession: string, + sessionType: SessionType +) => + runMutation< + UpdateUserSessionMutation, + UpdateUserSessionMutationVariables, + "" + >(UpdateUserSessionDocument, { + sessionType, + currentSession, + })() + +export const getCurrentRestSession = () => + runGQLQuery< + GetCurrentRestSessionQuery, + GetCurrentRestSessionQueryVariables, + "" + >({ + query: GetCurrentRestSessionDocument, + variables: {}, + }) diff --git a/packages/hoppscotch-selfhost-desktop/src/platform/tabState/tabState.platform.ts b/packages/hoppscotch-selfhost-desktop/src/platform/tabState/tabState.platform.ts new file mode 100644 index 000000000..30420da0d --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/platform/tabState/tabState.platform.ts @@ -0,0 +1,37 @@ +import { PersistableRESTTabState } from "@hoppscotch/common/helpers/rest/tab" +import { HoppUser } from "@hoppscotch/common/platform/auth" +import { TabStatePlatformDef } from "@hoppscotch/common/platform/tab" +import { def as platformAuth } from "@platform/auth" +import { getCurrentRestSession, updateUserSession } from "./tabState.api" +import { SessionType } from "../../api/generated/graphql" +import * as E from "fp-ts/Either" + +async function writeCurrentTabState( + _: HoppUser, + persistableTabState: PersistableRESTTabState +) { + await updateUserSession(JSON.stringify(persistableTabState), SessionType.Rest) +} + +async function loadTabStateFromSync(): Promise { + const currentUser = platformAuth.getCurrentUser() + + if (!currentUser) + throw new Error("Cannot load request from sync without login") + + const res = await getCurrentRestSession() + + if (E.isRight(res)) { + const currentRESTSession = res.right.me.currentRESTSession + + return currentRESTSession ? JSON.parse(currentRESTSession) : null + } else { + } + + return null +} + +export const def: TabStatePlatformDef = { + loadTabStateFromSync, + writeCurrentTabState, +} diff --git a/packages/hoppscotch-selfhost-desktop/src/vite-env.d.ts b/packages/hoppscotch-selfhost-desktop/src/vite-env.d.ts new file mode 100644 index 000000000..fc812394b --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/vite-env.d.ts @@ -0,0 +1,7 @@ +/// + +declare module "*.vue" { + import type { DefineComponent } from "vue"; + const component: DefineComponent<{}, {}, any>; + export default component; +} diff --git a/packages/hoppscotch-selfhost-desktop/tsconfig.json b/packages/hoppscotch-selfhost-desktop/tsconfig.json new file mode 100644 index 000000000..969f1e100 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "moduleResolution": "Node", + "strict": true, + "jsx": "preserve", + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "lib": ["ESNext", "DOM"], + "skipLibCheck": true, + "noEmit": true, + "paths": { + "@hoppscotch/common": [ "../hoppscotch-common/src/index.ts" ], + "@hoppscotch/common/*": [ "../hoppscotch-common/src/*" ], + "@platform/*": ["./src/platform/*"], + "@lib/*": ["./src/lib/*"], + } + + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/packages/hoppscotch-selfhost-desktop/tsconfig.node.json b/packages/hoppscotch-selfhost-desktop/tsconfig.node.json new file mode 100644 index 000000000..28e5a5e9b --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts", "meta.ts"] +} diff --git a/packages/hoppscotch-selfhost-desktop/vite.config.ts b/packages/hoppscotch-selfhost-desktop/vite.config.ts new file mode 100644 index 000000000..ca6e5ac77 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/vite.config.ts @@ -0,0 +1,201 @@ +import { defineConfig, loadEnv, normalizePath } from "vite" +import { APP_INFO, META_TAGS } from "./meta" +import { viteStaticCopy as StaticCopy } from "vite-plugin-static-copy" +import generateSitemap from "vite-plugin-pages-sitemap" +import HtmlConfig from "vite-plugin-html-config" +import Vue from "@vitejs/plugin-vue" +import VueI18n from "@intlify/vite-plugin-vue-i18n" +import Components from "unplugin-vue-components/vite" +import Icons from "unplugin-icons/vite" +import Inspect from "vite-plugin-inspect" +import WindiCSS from "vite-plugin-windicss" +import { VitePWA } from "vite-plugin-pwa" +import Pages from "vite-plugin-pages" +import Layouts from "vite-plugin-vue-layouts" +import IconResolver from "unplugin-icons/resolver" +import { FileSystemIconLoader } from "unplugin-icons/loaders" +import * as path from "path" +import { VitePluginFonts } from "vite-plugin-fonts" +import legacy from "@vitejs/plugin-legacy" + +const ENV = loadEnv("development", path.resolve(__dirname, "../../")) + +export default defineConfig({ + envDir: path.resolve(__dirname, "../../"), + // TODO: Migrate @hoppscotch/data to full ESM + define: { + // For 'util' polyfill required by dep of '@apidevtools/swagger-parser' + "process.env": {}, + }, + server: { + port: 3000, + }, + preview: { + port: 3000, + }, + publicDir: path.resolve(__dirname, "../hoppscotch-common/public"), + build: { + sourcemap: true, + emptyOutDir: true, + rollupOptions: { + maxParallelFileOps: 2, + }, + }, + resolve: { + alias: { + // TODO: Maybe leave ~ only for individual apps and not use on common + "~": path.resolve(__dirname, "../hoppscotch-common/src"), + "@hoppscotch/common": "@hoppscotch/common/src", + "@composables": path.resolve( + __dirname, + "../hoppscotch-common/src/composables" + ), + "@modules": path.resolve(__dirname, "../hoppscotch-common/src/modules"), + "@components": path.resolve( + __dirname, + "../hoppscotch-common/src/components" + ), + "@helpers": path.resolve(__dirname, "../hoppscotch-common/src/helpers"), + "@functional": path.resolve( + __dirname, + "../hoppscotch-common/src/helpers/functional" + ), + "@workers": path.resolve(__dirname, "../hoppscotch-common/src/workers"), + "@platform": path.resolve(__dirname, "./src/platform"), + "@lib": path.resolve(__dirname, "./src/lib"), + stream: "stream-browserify", + util: "util", + }, + dedupe: ["vue"], + }, + plugins: [ + Inspect(), // go to url -> /__inspect + HtmlConfig({ + metas: META_TAGS(ENV), + }), + Vue(), + Pages({ + routeStyle: "nuxt", + dirs: "../hoppscotch-common/src/pages", + importMode: "async", + onRoutesGenerated(routes) { + return ((generateSitemap as any) as typeof generateSitemap)({ + routes, + nuxtStyle: true, + allowRobots: true, + dest: ".sitemap-gen", + hostname: ENV.VITE_BASE_URL, + }) + }, + }), + StaticCopy({ + targets: [ + { + src: normalizePath(path.resolve(__dirname, "./.sitemap-gen/*")), + dest: normalizePath(path.resolve(__dirname, "./dist")), + }, + ], + }), + Layouts({ + layoutsDirs: "../hoppscotch-common/src/layouts", + defaultLayout: "default", + }), + VueI18n({ + runtimeOnly: false, + compositionOnly: true, + include: [path.resolve(__dirname, "locales")], + }), + WindiCSS({ + root: path.resolve(__dirname, "../hoppscotch-common"), + }), + Components({ + dts: "../hoppscotch-common/src/components.d.ts", + dirs: [ + "../hoppscotch-common/src/components", + "../hoppscotch-ui/src/components", + ], + directoryAsNamespace: true, + resolvers: [ + IconResolver({ + prefix: "icon", + customCollections: ["hopp", "auth", "brands"], + }), + (compName: string) => { + if (compName.startsWith("Hopp")) + return { name: compName, from: "@hoppscotch/ui" } + else return undefined + }, + ], + types: [ + { + from: "vue-tippy", + names: ["Tippy"], + }, + ], + }), + Icons({ + compiler: "vue3", + customCollections: { + hopp: FileSystemIconLoader("../hoppscotch-common/assets/icons"), + auth: FileSystemIconLoader("../hoppscotch-common/assets/icons/auth"), + brands: FileSystemIconLoader( + "../hoppscotch-common/assets/icons/brands" + ), + }, + }), + VitePWA({ + manifest: { + name: APP_INFO.name, + short_name: APP_INFO.name, + description: APP_INFO.shortDescription, + start_url: "/?source=pwa", + background_color: APP_INFO.app.background, + theme_color: APP_INFO.app.background, + icons: [ + { + src: "/icon.png", + sizes: "512x512", + type: "image/png", + purpose: "any maskable", + }, + { + src: "/logo.svg", + sizes: "48x48 72x72 96x96 128x128 256x256 512x512", + type: "image/svg+xml", + purpose: "any maskable", + }, + ], + }, + registerType: "prompt", + workbox: { + cleanupOutdatedCaches: true, + maximumFileSizeToCacheInBytes: 4194304, + navigateFallbackDenylist: [ + /robots.txt/, + /sitemap.xml/, + /discord/, + /telegram/, + /beta/, + /careers/, + /newsletter/, + /twitter/, + /github/, + /announcements/, + ], + }, + }), + VitePluginFonts({ + google: { + families: [ + "Inter:wght@400;500;600;700;800", + "Roboto+Mono:wght@400;500", + "Material+Icons", + ], + }, + }), + legacy({ + modernPolyfills: ["es.string.replace-all"], + renderLegacyChunks: false, + }), + ], +}) diff --git a/packages/hoppscotch-selfhost-desktop/vite.config.ts.bak b/packages/hoppscotch-selfhost-desktop/vite.config.ts.bak new file mode 100644 index 000000000..ca6e5ac77 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/vite.config.ts.bak @@ -0,0 +1,201 @@ +import { defineConfig, loadEnv, normalizePath } from "vite" +import { APP_INFO, META_TAGS } from "./meta" +import { viteStaticCopy as StaticCopy } from "vite-plugin-static-copy" +import generateSitemap from "vite-plugin-pages-sitemap" +import HtmlConfig from "vite-plugin-html-config" +import Vue from "@vitejs/plugin-vue" +import VueI18n from "@intlify/vite-plugin-vue-i18n" +import Components from "unplugin-vue-components/vite" +import Icons from "unplugin-icons/vite" +import Inspect from "vite-plugin-inspect" +import WindiCSS from "vite-plugin-windicss" +import { VitePWA } from "vite-plugin-pwa" +import Pages from "vite-plugin-pages" +import Layouts from "vite-plugin-vue-layouts" +import IconResolver from "unplugin-icons/resolver" +import { FileSystemIconLoader } from "unplugin-icons/loaders" +import * as path from "path" +import { VitePluginFonts } from "vite-plugin-fonts" +import legacy from "@vitejs/plugin-legacy" + +const ENV = loadEnv("development", path.resolve(__dirname, "../../")) + +export default defineConfig({ + envDir: path.resolve(__dirname, "../../"), + // TODO: Migrate @hoppscotch/data to full ESM + define: { + // For 'util' polyfill required by dep of '@apidevtools/swagger-parser' + "process.env": {}, + }, + server: { + port: 3000, + }, + preview: { + port: 3000, + }, + publicDir: path.resolve(__dirname, "../hoppscotch-common/public"), + build: { + sourcemap: true, + emptyOutDir: true, + rollupOptions: { + maxParallelFileOps: 2, + }, + }, + resolve: { + alias: { + // TODO: Maybe leave ~ only for individual apps and not use on common + "~": path.resolve(__dirname, "../hoppscotch-common/src"), + "@hoppscotch/common": "@hoppscotch/common/src", + "@composables": path.resolve( + __dirname, + "../hoppscotch-common/src/composables" + ), + "@modules": path.resolve(__dirname, "../hoppscotch-common/src/modules"), + "@components": path.resolve( + __dirname, + "../hoppscotch-common/src/components" + ), + "@helpers": path.resolve(__dirname, "../hoppscotch-common/src/helpers"), + "@functional": path.resolve( + __dirname, + "../hoppscotch-common/src/helpers/functional" + ), + "@workers": path.resolve(__dirname, "../hoppscotch-common/src/workers"), + "@platform": path.resolve(__dirname, "./src/platform"), + "@lib": path.resolve(__dirname, "./src/lib"), + stream: "stream-browserify", + util: "util", + }, + dedupe: ["vue"], + }, + plugins: [ + Inspect(), // go to url -> /__inspect + HtmlConfig({ + metas: META_TAGS(ENV), + }), + Vue(), + Pages({ + routeStyle: "nuxt", + dirs: "../hoppscotch-common/src/pages", + importMode: "async", + onRoutesGenerated(routes) { + return ((generateSitemap as any) as typeof generateSitemap)({ + routes, + nuxtStyle: true, + allowRobots: true, + dest: ".sitemap-gen", + hostname: ENV.VITE_BASE_URL, + }) + }, + }), + StaticCopy({ + targets: [ + { + src: normalizePath(path.resolve(__dirname, "./.sitemap-gen/*")), + dest: normalizePath(path.resolve(__dirname, "./dist")), + }, + ], + }), + Layouts({ + layoutsDirs: "../hoppscotch-common/src/layouts", + defaultLayout: "default", + }), + VueI18n({ + runtimeOnly: false, + compositionOnly: true, + include: [path.resolve(__dirname, "locales")], + }), + WindiCSS({ + root: path.resolve(__dirname, "../hoppscotch-common"), + }), + Components({ + dts: "../hoppscotch-common/src/components.d.ts", + dirs: [ + "../hoppscotch-common/src/components", + "../hoppscotch-ui/src/components", + ], + directoryAsNamespace: true, + resolvers: [ + IconResolver({ + prefix: "icon", + customCollections: ["hopp", "auth", "brands"], + }), + (compName: string) => { + if (compName.startsWith("Hopp")) + return { name: compName, from: "@hoppscotch/ui" } + else return undefined + }, + ], + types: [ + { + from: "vue-tippy", + names: ["Tippy"], + }, + ], + }), + Icons({ + compiler: "vue3", + customCollections: { + hopp: FileSystemIconLoader("../hoppscotch-common/assets/icons"), + auth: FileSystemIconLoader("../hoppscotch-common/assets/icons/auth"), + brands: FileSystemIconLoader( + "../hoppscotch-common/assets/icons/brands" + ), + }, + }), + VitePWA({ + manifest: { + name: APP_INFO.name, + short_name: APP_INFO.name, + description: APP_INFO.shortDescription, + start_url: "/?source=pwa", + background_color: APP_INFO.app.background, + theme_color: APP_INFO.app.background, + icons: [ + { + src: "/icon.png", + sizes: "512x512", + type: "image/png", + purpose: "any maskable", + }, + { + src: "/logo.svg", + sizes: "48x48 72x72 96x96 128x128 256x256 512x512", + type: "image/svg+xml", + purpose: "any maskable", + }, + ], + }, + registerType: "prompt", + workbox: { + cleanupOutdatedCaches: true, + maximumFileSizeToCacheInBytes: 4194304, + navigateFallbackDenylist: [ + /robots.txt/, + /sitemap.xml/, + /discord/, + /telegram/, + /beta/, + /careers/, + /newsletter/, + /twitter/, + /github/, + /announcements/, + ], + }, + }), + VitePluginFonts({ + google: { + families: [ + "Inter:wght@400;500;600;700;800", + "Roboto+Mono:wght@400;500", + "Material+Icons", + ], + }, + }), + legacy({ + modernPolyfills: ["es.string.replace-all"], + renderLegacyChunks: false, + }), + ], +}) diff --git a/packages/hoppscotch-selfhost-desktop/vite.config.ts.bak2 b/packages/hoppscotch-selfhost-desktop/vite.config.ts.bak2 new file mode 100644 index 000000000..ca6e5ac77 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/vite.config.ts.bak2 @@ -0,0 +1,201 @@ +import { defineConfig, loadEnv, normalizePath } from "vite" +import { APP_INFO, META_TAGS } from "./meta" +import { viteStaticCopy as StaticCopy } from "vite-plugin-static-copy" +import generateSitemap from "vite-plugin-pages-sitemap" +import HtmlConfig from "vite-plugin-html-config" +import Vue from "@vitejs/plugin-vue" +import VueI18n from "@intlify/vite-plugin-vue-i18n" +import Components from "unplugin-vue-components/vite" +import Icons from "unplugin-icons/vite" +import Inspect from "vite-plugin-inspect" +import WindiCSS from "vite-plugin-windicss" +import { VitePWA } from "vite-plugin-pwa" +import Pages from "vite-plugin-pages" +import Layouts from "vite-plugin-vue-layouts" +import IconResolver from "unplugin-icons/resolver" +import { FileSystemIconLoader } from "unplugin-icons/loaders" +import * as path from "path" +import { VitePluginFonts } from "vite-plugin-fonts" +import legacy from "@vitejs/plugin-legacy" + +const ENV = loadEnv("development", path.resolve(__dirname, "../../")) + +export default defineConfig({ + envDir: path.resolve(__dirname, "../../"), + // TODO: Migrate @hoppscotch/data to full ESM + define: { + // For 'util' polyfill required by dep of '@apidevtools/swagger-parser' + "process.env": {}, + }, + server: { + port: 3000, + }, + preview: { + port: 3000, + }, + publicDir: path.resolve(__dirname, "../hoppscotch-common/public"), + build: { + sourcemap: true, + emptyOutDir: true, + rollupOptions: { + maxParallelFileOps: 2, + }, + }, + resolve: { + alias: { + // TODO: Maybe leave ~ only for individual apps and not use on common + "~": path.resolve(__dirname, "../hoppscotch-common/src"), + "@hoppscotch/common": "@hoppscotch/common/src", + "@composables": path.resolve( + __dirname, + "../hoppscotch-common/src/composables" + ), + "@modules": path.resolve(__dirname, "../hoppscotch-common/src/modules"), + "@components": path.resolve( + __dirname, + "../hoppscotch-common/src/components" + ), + "@helpers": path.resolve(__dirname, "../hoppscotch-common/src/helpers"), + "@functional": path.resolve( + __dirname, + "../hoppscotch-common/src/helpers/functional" + ), + "@workers": path.resolve(__dirname, "../hoppscotch-common/src/workers"), + "@platform": path.resolve(__dirname, "./src/platform"), + "@lib": path.resolve(__dirname, "./src/lib"), + stream: "stream-browserify", + util: "util", + }, + dedupe: ["vue"], + }, + plugins: [ + Inspect(), // go to url -> /__inspect + HtmlConfig({ + metas: META_TAGS(ENV), + }), + Vue(), + Pages({ + routeStyle: "nuxt", + dirs: "../hoppscotch-common/src/pages", + importMode: "async", + onRoutesGenerated(routes) { + return ((generateSitemap as any) as typeof generateSitemap)({ + routes, + nuxtStyle: true, + allowRobots: true, + dest: ".sitemap-gen", + hostname: ENV.VITE_BASE_URL, + }) + }, + }), + StaticCopy({ + targets: [ + { + src: normalizePath(path.resolve(__dirname, "./.sitemap-gen/*")), + dest: normalizePath(path.resolve(__dirname, "./dist")), + }, + ], + }), + Layouts({ + layoutsDirs: "../hoppscotch-common/src/layouts", + defaultLayout: "default", + }), + VueI18n({ + runtimeOnly: false, + compositionOnly: true, + include: [path.resolve(__dirname, "locales")], + }), + WindiCSS({ + root: path.resolve(__dirname, "../hoppscotch-common"), + }), + Components({ + dts: "../hoppscotch-common/src/components.d.ts", + dirs: [ + "../hoppscotch-common/src/components", + "../hoppscotch-ui/src/components", + ], + directoryAsNamespace: true, + resolvers: [ + IconResolver({ + prefix: "icon", + customCollections: ["hopp", "auth", "brands"], + }), + (compName: string) => { + if (compName.startsWith("Hopp")) + return { name: compName, from: "@hoppscotch/ui" } + else return undefined + }, + ], + types: [ + { + from: "vue-tippy", + names: ["Tippy"], + }, + ], + }), + Icons({ + compiler: "vue3", + customCollections: { + hopp: FileSystemIconLoader("../hoppscotch-common/assets/icons"), + auth: FileSystemIconLoader("../hoppscotch-common/assets/icons/auth"), + brands: FileSystemIconLoader( + "../hoppscotch-common/assets/icons/brands" + ), + }, + }), + VitePWA({ + manifest: { + name: APP_INFO.name, + short_name: APP_INFO.name, + description: APP_INFO.shortDescription, + start_url: "/?source=pwa", + background_color: APP_INFO.app.background, + theme_color: APP_INFO.app.background, + icons: [ + { + src: "/icon.png", + sizes: "512x512", + type: "image/png", + purpose: "any maskable", + }, + { + src: "/logo.svg", + sizes: "48x48 72x72 96x96 128x128 256x256 512x512", + type: "image/svg+xml", + purpose: "any maskable", + }, + ], + }, + registerType: "prompt", + workbox: { + cleanupOutdatedCaches: true, + maximumFileSizeToCacheInBytes: 4194304, + navigateFallbackDenylist: [ + /robots.txt/, + /sitemap.xml/, + /discord/, + /telegram/, + /beta/, + /careers/, + /newsletter/, + /twitter/, + /github/, + /announcements/, + ], + }, + }), + VitePluginFonts({ + google: { + families: [ + "Inter:wght@400;500;600;700;800", + "Roboto+Mono:wght@400;500", + "Material+Icons", + ], + }, + }), + legacy({ + modernPolyfills: ["es.string.replace-all"], + renderLegacyChunks: false, + }), + ], +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 34ce0c1b1..e8f2ac811 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -878,6 +878,151 @@ importers: specifier: ^4.6.3 version: 4.7.4 + packages/hoppscotch-selfhost-desktop: + dependencies: + '@hoppscotch/common': + specifier: workspace:^ + version: link:../hoppscotch-common + '@platform/auth': + specifier: ^0.1.106 + version: 0.1.106 + '@tauri-apps/api': + specifier: ^1.3.0 + version: 1.5.1 + '@tauri-apps/cli': + specifier: ^1.3.0 + version: 1.5.6 + '@vueuse/core': + specifier: ^10.4.1 + version: 10.5.0(vue@3.3.4) + axios: + specifier: ^0.21.4 + version: 0.21.4 + buffer: + specifier: ^6.0.3 + version: 6.0.3 + environments.api: + specifier: link:@platform/environments/environments.api + version: link:@platform/environments/environments.api + event: + specifier: link:@tauri-apps/api/event + version: link:@tauri-apps/api/event + fp-ts: + specifier: ^2.16.0 + version: 2.16.1 + lodash-es: + specifier: ^4.17.21 + version: 4.17.21 + process: + specifier: ^0.11.10 + version: 0.11.10 + rxjs: + specifier: ^7.8.1 + version: 7.8.1 + shell: + specifier: link:@tauri-apps/api/shell + version: link:@tauri-apps/api/shell + stream-browserify: + specifier: ^3.0.0 + version: 3.0.0 + tauri: + specifier: link:@tauri-apps/api/tauri + version: link:@tauri-apps/api/tauri + tauri-plugin-store-api: + specifier: github:tauri-apps/tauri-plugin-store#v1 + version: github.com/tauri-apps/tauri-plugin-store/6e19887b1bdea9b921a31993d72396a350731e07 + util: + specifier: ^0.12.4 + version: 0.12.5 + vue: + specifier: ^3.2.45 + version: 3.3.4 + workbox-window: + specifier: ^6.5.4 + version: 6.6.0 + devDependencies: + '@intlify/vite-plugin-vue-i18n': + specifier: ^6.0.1 + version: 6.0.1(vite@4.5.0) + '@rushstack/eslint-patch': + specifier: ^1.1.4 + version: 1.3.3 + '@types/node': + specifier: ^18.7.10 + version: 18.18.8 + '@typescript-eslint/eslint-plugin': + specifier: ^5.19.0 + version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.47.0)(typescript@4.9.5) + '@typescript-eslint/parser': + specifier: ^5.19.0 + version: 5.62.0(eslint@8.47.0)(typescript@4.9.5) + '@vitejs/plugin-legacy': + specifier: ^2.3.0 + version: 2.3.0(terser@5.24.0)(vite@4.5.0) + '@vitejs/plugin-vue': + specifier: ^4.0.0 + version: 4.3.1(vite@4.5.0)(vue@3.3.4) + '@vue/eslint-config-typescript': + specifier: ^11.0.1 + version: 11.0.3(eslint-plugin-vue@9.17.0)(eslint@8.47.0)(typescript@4.9.5) + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + eslint: + specifier: ^8.28.0 + version: 8.47.0 + eslint-plugin-prettier: + specifier: ^4.2.1 + version: 4.2.1(eslint@8.47.0)(prettier@2.8.4) + eslint-plugin-vue: + specifier: ^9.5.1 + version: 9.17.0(eslint@8.47.0) + typescript: + specifier: ^4.9.5 + version: 4.9.5 + unplugin-icons: + specifier: ^0.14.9 + version: 0.14.9(rollup@2.79.1)(vite@4.5.0) + unplugin-vue-components: + specifier: ^0.21.0 + version: 0.21.0(rollup@2.79.1)(vite@4.5.0)(vue@3.3.4) + vite: + specifier: ^4.2.1 + version: 4.5.0(@types/node@18.18.8)(terser@5.24.0) + vite-plugin-fonts: + specifier: ^0.6.0 + version: 0.6.0(vite@4.5.0) + vite-plugin-html-config: + specifier: ^1.0.10 + version: 1.0.11(vite@4.5.0) + vite-plugin-inspect: + specifier: ^0.7.4 + version: 0.7.38(rollup@2.79.1)(vite@4.5.0) + vite-plugin-pages: + specifier: ^0.26.0 + version: 0.26.0(vite@4.5.0) + vite-plugin-pages-sitemap: + specifier: ^1.4.0 + version: 1.6.1 + vite-plugin-pwa: + specifier: ^0.13.1 + version: 0.13.1(vite@4.5.0)(workbox-build@6.6.0)(workbox-window@6.6.0) + vite-plugin-static-copy: + specifier: ^0.12.0 + version: 0.12.0(vite@4.5.0) + vite-plugin-vue-layouts: + specifier: ^0.7.0 + version: 0.7.0(vite@4.5.0)(vue-router@4.2.5)(vue@3.3.4) + vite-plugin-windicss: + specifier: ^1.8.8 + version: 1.9.1(vite@4.5.0) + vue-tsc: + specifier: ^1.0.11 + version: 1.8.8(typescript@4.9.5) + windicss: + specifier: ^3.5.6 + version: 3.5.6 + packages/hoppscotch-selfhost-web: dependencies: '@fontsource-variable/inter': @@ -1030,7 +1175,7 @@ importers: version: 1.9.1(vite@4.4.9) vitest: specifier: ^0.34.2 - version: 0.34.2(sass@1.66.0)(terser@5.24.0) + version: 0.34.2(terser@5.24.0) vue-tsc: specifier: ^1.8.8 version: 1.8.8(typescript@5.1.6) @@ -1454,7 +1599,6 @@ packages: dependencies: execa: 5.1.1 find-up: 5.0.0 - dev: false /@antfu/install-pkg@0.1.1: resolution: {integrity: sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==} @@ -4101,7 +4245,6 @@ packages: /@babel/standalone@7.20.0: resolution: {integrity: sha512-8toFReoMyknVN538KZYS9HJLUlpvibQiPQqt8TYFeyV+FlZUmM8TG2zcS8q4vAijCRLoAKT1EzeBVvbxjMfi9A==} engines: {node: '>=6.9.0'} - dev: false /@babel/template@7.20.7: resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} @@ -4398,10 +4541,10 @@ packages: '@commitlint/execute-rule': 16.2.1 '@commitlint/resolve-extends': 16.2.1 '@commitlint/types': 16.2.1 - '@types/node': 17.0.27 + '@types/node': 18.18.8 chalk: 4.1.2 cosmiconfig: 7.0.1 - cosmiconfig-typescript-loader: 2.0.2(@types/node@17.0.27)(cosmiconfig@7.0.1)(typescript@4.9.5) + cosmiconfig-typescript-loader: 2.0.2(@types/node@18.18.8)(cosmiconfig@7.0.1)(typescript@4.9.5) lodash: 4.17.21 resolve-from: 5.0.0 typescript: 4.9.5 @@ -7773,7 +7916,6 @@ packages: /@iconify/types@1.1.0: resolution: {integrity: sha512-Jh0llaK2LRXQoYsorIH8maClebsnzTcve+7U3rQUSnC11X4jtPnFuyatqFLvMxZ8MLG8dB4zfHsbPfuvxluONw==} - dev: false /@iconify/types@2.0.0: resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -7790,7 +7932,6 @@ packages: local-pkg: 0.4.2 transitivePeerDependencies: - supports-color - dev: false /@iconify/utils@2.1.4: resolution: {integrity: sha512-7vzsYIvxv5Hng0MNEtSSnyMBD/+zqnORqmKiYsSgpMBGSz1r93URgBZHPYCZ1/gpoaVstYW4/SVLGCMJBNMCLQ==} @@ -8037,6 +8178,32 @@ packages: - supports-color dev: true + /@intlify/vite-plugin-vue-i18n@6.0.1(vite@4.5.0): + resolution: {integrity: sha512-FFVcxVU4bR9vdDLNbltM5mrhndnXMErO01i0RrpdyMegEt3Nu/YLoH0sFdjRun7/RY4vaEnhTnFvVf9uO0dQvg==} + engines: {node: '>= 14.6'} + peerDependencies: + petite-vue-i18n: '*' + vite: ^2.9.0 || ^3.0.0 + vue-i18n: '*' + peerDependenciesMeta: + petite-vue-i18n: + optional: true + vite: + optional: true + vue-i18n: + optional: true + dependencies: + '@intlify/bundle-utils': 7.0.0 + '@intlify/shared': 9.4.1 + '@rollup/pluginutils': 4.2.1 + debug: 4.3.4(supports-color@9.2.2) + fast-glob: 3.2.11 + source-map: 0.6.1 + vite: 4.5.0(@types/node@18.18.8)(terser@5.24.0) + transitivePeerDependencies: + - supports-color + dev: true + /@intlify/vite-plugin-vue-i18n@7.0.0(vite@4.4.9)(vue-i18n@9.2.2): resolution: {integrity: sha512-2TbDOQ8XD+vkc0s5OFmr+IY/k4mYMC7pzvx0xGQn+cU/ev314+yi7Z7N7rWcBgiYk1WOUalbGSo3d4nJDxOOyw==} engines: {node: '>= 14.6'} @@ -8110,7 +8277,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 17.0.27 + '@types/node': 18.18.8 chalk: 4.1.2 jest-message-util: 27.5.1 jest-util: 27.5.1 @@ -8122,7 +8289,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.5.0 - '@types/node': 17.0.27 + '@types/node': 18.18.8 chalk: 4.1.2 jest-message-util: 29.5.0 jest-util: 29.5.0 @@ -8143,7 +8310,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 17.0.27 + '@types/node': 18.18.8 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.8.1 @@ -8188,14 +8355,14 @@ packages: '@jest/test-result': 29.4.1 '@jest/transform': 29.4.1 '@jest/types': 29.4.1 - '@types/node': 17.0.27 + '@types/node': 18.18.8 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.3.2 exit: 0.1.2 graceful-fs: 4.2.10 jest-changed-files: 29.4.0 - jest-config: 29.4.1(@types/node@17.0.27)(ts-node@10.9.1) + jest-config: 29.4.1(@types/node@18.18.8)(ts-node@10.9.1) jest-haste-map: 29.4.1 jest-message-util: 29.4.1 jest-regex-util: 29.2.0 @@ -8222,7 +8389,7 @@ packages: dependencies: '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 17.0.27 + '@types/node': 18.18.8 jest-mock: 27.5.1 dev: true @@ -8232,7 +8399,7 @@ packages: dependencies: '@jest/fake-timers': 29.4.1 '@jest/types': 29.5.0 - '@types/node': 17.0.27 + '@types/node': 18.18.8 jest-mock: 29.4.1 dev: true @@ -8273,7 +8440,7 @@ packages: dependencies: '@jest/types': 27.5.1 '@sinonjs/fake-timers': 8.1.0 - '@types/node': 17.0.27 + '@types/node': 18.18.8 jest-message-util: 27.5.1 jest-mock: 27.5.1 jest-util: 27.5.1 @@ -8285,7 +8452,7 @@ packages: dependencies: '@jest/types': 29.5.0 '@sinonjs/fake-timers': 10.0.2 - '@types/node': 17.0.27 + '@types/node': 18.18.8 jest-message-util: 29.5.0 jest-mock: 29.4.1 jest-util: 29.5.0 @@ -8326,7 +8493,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 17.0.27 + '@types/node': 18.18.8 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -8365,7 +8532,7 @@ packages: '@jest/transform': 29.4.1 '@jest/types': 29.5.0 '@jridgewell/trace-mapping': 0.3.17 - '@types/node': 17.0.27 + '@types/node': 18.18.8 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -8527,7 +8694,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 17.0.27 + '@types/node': 18.18.8 '@types/yargs': 16.0.4 chalk: 4.1.2 dev: true @@ -8539,7 +8706,7 @@ packages: '@jest/schemas': 28.0.2 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 17.0.27 + '@types/node': 18.18.8 '@types/yargs': 17.0.10 chalk: 4.1.2 dev: true @@ -8551,7 +8718,7 @@ packages: '@jest/schemas': 29.4.0 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 17.0.27 + '@types/node': 18.18.8 '@types/yargs': 17.0.10 chalk: 4.1.2 dev: true @@ -8563,7 +8730,7 @@ packages: '@jest/schemas': 29.4.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 17.0.27 + '@types/node': 18.18.8 '@types/yargs': 17.0.10 chalk: 4.1.2 dev: true @@ -8755,7 +8922,7 @@ packages: '@rushstack/ts-command-line': 4.15.1 colors: 1.2.5 lodash: 4.17.21 - resolve: 1.22.4 + resolve: 1.22.8 semver: 7.5.4 source-map: 0.6.1 typescript: 5.0.4 @@ -9186,6 +9353,27 @@ packages: tslib: 2.6.2 dev: true + /@platform/auth@0.1.106: + resolution: {integrity: sha512-Z3lgZYBybBBki0bH2Xr8ceX49okscoowui+nkUWbs7YTWI0Cx8KnW6pwwsOVFJvG8FPEh624ItvAfacEovF6GQ==} + deprecated: pre-release module deprecation + dependencies: + '@platform/libs': 0.3.2 + '@platform/util.is': 0.0.165 + dev: false + + /@platform/libs@0.3.2: + resolution: {integrity: sha512-Iwdzd/XizT0Gytnpird5aVkImnTSXM1tGHa+RI4XgLVC6ONVGTevGDCtrvY+ABO4B8UxCvVqOcabRFpQ7WwBzw==} + dependencies: + '@types/ramda': 0.28.15 + ramda: 0.28.0 + rxjs: 7.5.6 + dev: false + + /@platform/util.is@0.0.165: + resolution: {integrity: sha512-zWh8OsTydmUZiwFT2Fqc5BYCzoO9pVVty6nTxC6YS75rWqQ5Ig0VR9ey97h4yV8DUdVXrP2XHH/ADAByHdsktA==} + deprecated: pre-release module deprecation + dev: false + /@polka/url@1.0.0-next.21: resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} dev: true @@ -9458,7 +9646,7 @@ packages: fs-extra: 7.0.1 import-lazy: 4.0.0 jju: 1.4.0 - resolve: 1.22.4 + resolve: 1.22.8 semver: 7.5.4 z-schema: 5.0.5 dev: true @@ -9466,7 +9654,7 @@ packages: /@rushstack/rig-package@0.4.0: resolution: {integrity: sha512-FnM1TQLJYwSiurP6aYSnansprK5l8WUK8VG38CmAaZs29ZeL1msjK0AP1VS4ejD33G0kE/2cpsPsS9jDenBMxw==} dependencies: - resolve: 1.22.6 + resolve: 1.22.8 strip-json-comments: 3.1.1 dev: true @@ -9658,6 +9846,118 @@ packages: '@swc/core-win32-ia32-msvc': 1.2.213 '@swc/core-win32-x64-msvc': 1.2.213 + /@tauri-apps/api@1.5.1: + resolution: {integrity: sha512-6unsZDOdlXTmauU3NhWhn+Cx0rODV+rvNvTdvolE5Kls5ybA6cqndQENDt1+FS0tF7ozCP66jwWoH6a5h90BrA==} + engines: {node: '>= 14.6.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'} + dev: false + + /@tauri-apps/cli-darwin-arm64@1.5.6: + resolution: {integrity: sha512-NNvG3XLtciCMsBahbDNUEvq184VZmOveTGOuy0So2R33b/6FDkuWaSgWZsR1mISpOuP034htQYW0VITCLelfqg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@tauri-apps/cli-darwin-x64@1.5.6: + resolution: {integrity: sha512-nkiqmtUQw3N1j4WoVjv81q6zWuZFhBLya/RNGUL94oafORloOZoSY0uTZJAoeieb3Y1YK0rCHSDl02MyV2Fi4A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@tauri-apps/cli-linux-arm-gnueabihf@1.5.6: + resolution: {integrity: sha512-z6SPx+axZexmWXTIVPNs4Tg7FtvdJl9EKxYN6JPjOmDZcqA13iyqWBQal2DA/GMZ1Xqo3vyJf6EoEaKaliymPQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@tauri-apps/cli-linux-arm64-gnu@1.5.6: + resolution: {integrity: sha512-QuQjMQmpsCbzBrmtQiG4uhnfAbdFx3nzm+9LtqjuZlurc12+Mj5MTgqQ3AOwQedH3f7C+KlvbqD2AdXpwTg7VA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@tauri-apps/cli-linux-arm64-musl@1.5.6: + resolution: {integrity: sha512-8j5dH3odweFeom7bRGlfzDApWVOT4jIq8/214Wl+JeiNVehouIBo9lZGeghZBH3XKFRwEvU23i7sRVjuh2s8mg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@tauri-apps/cli-linux-x64-gnu@1.5.6: + resolution: {integrity: sha512-gbFHYHfdEGW0ffk8SigDsoXks6USpilF6wR0nqB/JbWzbzFR/sBuLVNQlJl1RKNakyJHu+lsFxGy0fcTdoX8xA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@tauri-apps/cli-linux-x64-musl@1.5.6: + resolution: {integrity: sha512-9v688ogoLkeFYQNgqiSErfhTreLUd8B3prIBSYUt+x4+5Kcw91zWvIh+VSxL1n3KCGGsM7cuXhkGPaxwlEh1ug==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@tauri-apps/cli-win32-arm64-msvc@1.5.6: + resolution: {integrity: sha512-DRNDXFNZb6y5IZrw+lhTTA9l4wbzO4TNRBAlHAiXUrH+pRFZ/ZJtv5WEuAj9ocVSahVw2NaK5Yaold4NPAxHog==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@tauri-apps/cli-win32-ia32-msvc@1.5.6: + resolution: {integrity: sha512-oUYKNR/IZjF4fsOzRpw0xesl2lOjhsQEyWlgbpT25T83EU113Xgck9UjtI7xemNI/OPCv1tPiaM1e7/ABdg5iA==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@tauri-apps/cli-win32-x64-msvc@1.5.6: + resolution: {integrity: sha512-RmEf1os9C8//uq2hbjXi7Vgz9ne7798ZxqemAZdUwo1pv3oLVZSz1/IvZmUHPdy2e6zSeySqWu1D0Y3QRNN+dg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@tauri-apps/cli@1.5.6: + resolution: {integrity: sha512-k4Y19oVCnt7WZb2TnDzLqfs7o98Jq0tUoVMv+JQSzuRDJqaVu2xMBZ8dYplEn+EccdR5SOMyzaLBJWu38TVK1A==} + engines: {node: '>= 10'} + hasBin: true + optionalDependencies: + '@tauri-apps/cli-darwin-arm64': 1.5.6 + '@tauri-apps/cli-darwin-x64': 1.5.6 + '@tauri-apps/cli-linux-arm-gnueabihf': 1.5.6 + '@tauri-apps/cli-linux-arm64-gnu': 1.5.6 + '@tauri-apps/cli-linux-arm64-musl': 1.5.6 + '@tauri-apps/cli-linux-x64-gnu': 1.5.6 + '@tauri-apps/cli-linux-x64-musl': 1.5.6 + '@tauri-apps/cli-win32-arm64-msvc': 1.5.6 + '@tauri-apps/cli-win32-ia32-msvc': 1.5.6 + '@tauri-apps/cli-win32-x64-msvc': 1.5.6 + dev: false + /@tootallnate/once@1.1.2: resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} engines: {node: '>= 6'} @@ -9732,7 +10032,7 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 17.0.27 + '@types/node': 18.18.8 /@types/chai-subset@1.3.3: resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} @@ -9755,7 +10055,7 @@ packages: /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 17.0.27 + '@types/node': 18.18.8 /@types/cookie-parser@1.4.3: resolution: {integrity: sha512-CqSKwFwefj4PzZ5n/iwad/bow2hTCh0FlNAeWLtQM3JA/NX/iYagIpWG2cf1bQKQ2c9gU2log5VUCrn7LDOs0w==} @@ -9774,7 +10074,7 @@ packages: /@types/cors@2.8.13: resolution: {integrity: sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==} dependencies: - '@types/node': 18.11.10 + '@types/node': 18.18.8 dev: false /@types/debug@4.1.8: @@ -9828,7 +10128,7 @@ packages: /@types/express-serve-static-core@4.17.31: resolution: {integrity: sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==} dependencies: - '@types/node': 17.0.27 + '@types/node': 18.18.8 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 @@ -9857,13 +10157,13 @@ packages: /@types/fs-extra@9.0.13: resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} dependencies: - '@types/node': 17.0.27 + '@types/node': 18.18.8 dev: true /@types/graceful-fs@4.1.5: resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} dependencies: - '@types/node': 17.0.27 + '@types/node': 18.18.8 dev: true /@types/har-format@1.2.12: @@ -9921,19 +10221,19 @@ packages: /@types/jsonwebtoken@8.5.9: resolution: {integrity: sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==} dependencies: - '@types/node': 17.0.27 + '@types/node': 18.18.8 dev: true /@types/jsonwebtoken@9.0.1: resolution: {integrity: sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw==} dependencies: - '@types/node': 17.0.27 + '@types/node': 18.18.8 dev: true /@types/jsonwebtoken@9.0.2: resolution: {integrity: sha512-drE6uz7QBKq1fYqqoFKTDRdFCPHd5TCub75BM+D+cMx7NU9hUz7SESLfC2fSCXVFMO5Yj8sOWHuGqPgjc+fz0Q==} dependencies: - '@types/node': 17.0.27 + '@types/node': 18.18.8 dev: false /@types/linkify-it@3.0.2: @@ -9997,7 +10297,7 @@ packages: /@types/node-fetch@2.6.8: resolution: {integrity: sha512-nnH5lV9QCMPsbEVdTb5Y+F3GQxLSw1xQgIydrb2gSfEavRPs50FnMr+KUaa+LoPSqibm2N+ZZxH7lavZlAT4GA==} dependencies: - '@types/node': 17.0.27 + '@types/node': 18.18.8 form-data: 4.0.0 dev: false @@ -10010,6 +10310,7 @@ packages: /@types/node@18.11.10: resolution: {integrity: sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==} + dev: true /@types/node@18.17.6: resolution: {integrity: sha512-fGmT/P7z7ecA6bv/ia5DlaWCH4YeZvAQMNpUhrJjtAhOhZfoxS1VLUgU2pdk63efSjQaOJWdXMuAJsws+8I6dg==} @@ -10037,7 +10338,7 @@ packages: /@types/oauth@0.9.1: resolution: {integrity: sha512-a1iY62/a3yhZ7qH7cNUsxoI3U/0Fe9+RnuFrpTKr+0WVOzbKlSLojShCKe20aOD1Sppv+i8Zlq0pLDuTJnwS4A==} dependencies: - '@types/node': 17.0.27 + '@types/node': 18.18.8 dev: true /@types/object-path@0.11.1: @@ -10121,13 +10422,19 @@ packages: /@types/qs@6.9.7: resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} + /@types/ramda@0.28.15: + resolution: {integrity: sha512-FCaLNVZry65jW8x/FDnKgjgkCNQxgc5AYMQwdNn6yW5M+62R+0nt2Y36U43dTNora9hcquemfrY5gxhE5pcilQ==} + dependencies: + ts-toolbelt: 6.15.5 + dev: false + /@types/range-parser@1.2.4: resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} /@types/resolve@1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: - '@types/node': 17.0.27 + '@types/node': 18.18.8 dev: true /@types/semver@7.5.0: @@ -10138,7 +10445,7 @@ packages: resolution: {integrity: sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==} dependencies: '@types/mime': 3.0.1 - '@types/node': 17.0.27 + '@types/node': 18.18.8 /@types/splitpanes@2.2.1: resolution: {integrity: sha512-H5BgO6UdJRzz5ddRzuGvLBiPSPEuuHXb5ET+7avLLrEx1uc7f5Ut5oLMDQsfvGtHBBAFczt1QNYuDf27wHbvDQ==} @@ -10162,7 +10469,7 @@ packages: resolution: {integrity: sha512-tLfnlJf6A5mB6ddqF159GqcDizfzbMUB1/DeT59/wBNqzRTNNKsaw79A/1TZ84X+f/EwWH8FeuSkjlCLyqS/zQ==} dependencies: '@types/cookiejar': 2.1.2 - '@types/node': 17.0.27 + '@types/node': 18.18.8 dev: true /@types/supertest@2.0.12: @@ -10176,7 +10483,6 @@ packages: /@types/trusted-types@2.0.5: resolution: {integrity: sha512-I3pkr8j/6tmQtKV/ZzHtuaqYSQvyjGRKH4go60Rr0IDLlFxuRT5V32uvB1mecM5G1EVAUyF/4r4QZ1GHgz+mxA==} - dev: true /@types/ua-parser-js@0.7.36: resolution: {integrity: sha512-N1rW+njavs70y2cApeIw1vLMYXRwfBy+7trgavGuuTfOd7j1Yh7QTRc/yqsPl6ncokt72ZXuxEU0PiCp9bSwNQ==} @@ -10198,16 +10504,20 @@ packages: resolution: {integrity: sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==} dev: false + /@types/web-bluetooth@0.0.18: + resolution: {integrity: sha512-v/ZHEj9xh82usl8LMR3GarzFY1IrbXJw5L4QfQhokjRV91q+SelFqxQWSep1ucXEZ22+dSTwLFkXeur25sPIbw==} + dev: false + /@types/ws@8.5.3: resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} dependencies: - '@types/node': 17.0.27 + '@types/node': 18.18.8 dev: false /@types/ws@8.5.5: resolution: {integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==} dependencies: - '@types/node': 17.0.27 + '@types/node': 18.18.8 dev: true /@types/yargs-parser@21.0.0: @@ -10308,6 +10618,34 @@ packages: - supports-color dev: true + /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.47.0)(typescript@4.9.5): + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.6.2 + '@typescript-eslint/parser': 5.62.0(eslint@8.47.0)(typescript@4.9.5) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@8.47.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.47.0)(typescript@4.9.5) + debug: 4.3.4(supports-color@9.2.2) + eslint: 8.47.0 + graphemer: 1.4.0 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 + semver: 7.5.4 + tsutils: 3.21.0(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.47.0)(typescript@5.1.6): resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -10425,6 +10763,26 @@ packages: - supports-color dev: true + /@typescript-eslint/parser@5.62.0(eslint@8.47.0)(typescript@4.9.5): + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + debug: 4.3.4(supports-color@9.2.2) + eslint: 8.47.0 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/parser@5.62.0(eslint@8.47.0)(typescript@5.1.6): resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -10557,6 +10915,26 @@ packages: - supports-color dev: true + /@typescript-eslint/type-utils@5.62.0(eslint@8.47.0)(typescript@4.9.5): + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.47.0)(typescript@4.9.5) + debug: 4.3.4(supports-color@9.2.2) + eslint: 8.47.0 + tsutils: 3.21.0(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/type-utils@5.62.0(eslint@8.47.0)(typescript@5.1.6): resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -10680,6 +11058,27 @@ packages: - supports-color dev: true + /@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5): + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.4(supports-color@9.2.2) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + tsutils: 3.21.0(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.1.6): resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -10780,6 +11179,26 @@ packages: - typescript dev: true + /@typescript-eslint/utils@5.62.0(eslint@8.47.0)(typescript@4.9.5): + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + eslint: 8.47.0 + eslint-scope: 5.1.1 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /@typescript-eslint/utils@5.62.0(eslint@8.47.0)(typescript@5.1.6): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -11029,6 +11448,22 @@ packages: vite: 3.2.4(@types/node@17.0.27)(sass@1.53.0)(terser@5.24.0) dev: false + /@vitejs/plugin-legacy@2.3.0(terser@5.24.0)(vite@4.5.0): + resolution: {integrity: sha512-Bh62i0gzQvvT8AeAAb78nOnqSYXypkRmQmOTImdPZ39meHR9e2une3AIFmVo4s1SDmcmJ6qj18Sa/lRc/14KaA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + terser: ^5.4.0 + vite: ^3.0.0 + dependencies: + '@babel/standalone': 7.20.0 + core-js: 3.32.1 + magic-string: 0.26.7 + regenerator-runtime: 0.13.11 + systemjs: 6.14.2 + terser: 5.24.0 + vite: 4.5.0(@types/node@18.18.8)(terser@5.24.0) + dev: true + /@vitejs/plugin-legacy@4.1.1(terser@5.24.0)(vite@4.4.9): resolution: {integrity: sha512-um3gbVouD2Q/g19C0qpDfHwveXDCAHzs8OC3e9g6aXpKoD1H14himgs7wkMnhAynBJy7QqUoZNAXDuqN8zLR2g==} engines: {node: ^14.18.0 || >=16.0.0} @@ -11070,6 +11505,17 @@ packages: vue: 3.3.4 dev: true + /@vitejs/plugin-vue@4.3.1(vite@4.5.0)(vue@3.3.4): + resolution: {integrity: sha512-tUBEtWcF7wFtII7ayNiLNDTCE1X1afySEo+XNVMNkFXaThENyCowIEX095QqbJZGTgoOcSVDJGlnde2NG4jtbQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.0.0 + vue: ^3.2.25 + dependencies: + vite: 4.5.0(@types/node@18.18.8)(terser@5.24.0) + vue: 3.3.4 + dev: true + /@vitest/expect@0.29.8: resolution: {integrity: sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==} dependencies: @@ -11342,6 +11788,27 @@ packages: - supports-color dev: true + /@vue/eslint-config-typescript@11.0.3(eslint-plugin-vue@9.17.0)(eslint@8.47.0)(typescript@4.9.5): + resolution: {integrity: sha512-dkt6W0PX6H/4Xuxg/BlFj5xHvksjpSlVjtkQCpaYJBIEuKj2hOVU7r+TIe+ysCwRYFz/lGqvklntRkCAibsbPw==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 + eslint-plugin-vue: ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.47.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.62.0(eslint@8.47.0)(typescript@4.9.5) + eslint: 8.47.0 + eslint-plugin-vue: 9.17.0(eslint@8.47.0) + typescript: 4.9.5 + vue-eslint-parser: 9.3.1(eslint@8.47.0) + transitivePeerDependencies: + - supports-color + dev: true + /@vue/eslint-config-typescript@11.0.3(eslint-plugin-vue@9.17.0)(eslint@8.47.0)(typescript@5.1.6): resolution: {integrity: sha512-dkt6W0PX6H/4Xuxg/BlFj5xHvksjpSlVjtkQCpaYJBIEuKj2hOVU7r+TIe+ysCwRYFz/lGqvklntRkCAibsbPw==} engines: {node: ^14.17.0 || >=16.0.0} @@ -11382,6 +11849,25 @@ packages: vue-template-compiler: 2.7.14 dev: true + /@vue/language-core@1.8.8(typescript@4.9.5): + resolution: {integrity: sha512-i4KMTuPazf48yMdYoebTkgSOJdFraE4pQf0B+FTOFkbB+6hAfjrSou/UmYWRsWyZV6r4Rc6DDZdI39CJwL0rWw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@volar/language-core': 1.10.1 + '@volar/source-map': 1.10.1 + '@vue/compiler-dom': 3.3.4 + '@vue/reactivity': 3.3.4 + '@vue/shared': 3.3.4 + minimatch: 9.0.3 + muggle-string: 0.3.1 + typescript: 4.9.5 + vue-template-compiler: 2.7.14 + dev: true + /@vue/language-core@1.8.8(typescript@5.1.6): resolution: {integrity: sha512-i4KMTuPazf48yMdYoebTkgSOJdFraE4pQf0B+FTOFkbB+6hAfjrSou/UmYWRsWyZV6r4Rc6DDZdI39CJwL0rWw==} peerDependencies: @@ -11488,6 +11974,15 @@ packages: - typescript dev: true + /@vue/typescript@1.8.8(typescript@4.9.5): + resolution: {integrity: sha512-jUnmMB6egu5wl342eaUH236v8tdcEPXXkPgj+eI/F6JwW/lb+yAU6U07ZbQ3MVabZRlupIlPESB7ajgAGixhow==} + dependencies: + '@volar/typescript': 1.10.1 + '@vue/language-core': 1.8.8(typescript@4.9.5) + transitivePeerDependencies: + - typescript + dev: true + /@vue/typescript@1.8.8(typescript@5.1.6): resolution: {integrity: sha512-jUnmMB6egu5wl342eaUH236v8tdcEPXXkPgj+eI/F6JwW/lb+yAU6U07ZbQ3MVabZRlupIlPESB7ajgAGixhow==} dependencies: @@ -11509,6 +12004,18 @@ packages: - vue dev: false + /@vueuse/core@10.5.0(vue@3.3.4): + resolution: {integrity: sha512-z/tI2eSvxwLRjOhDm0h/SXAjNm8N5ld6/SC/JQs6o6kpJ6Ya50LnEL8g5hoYu005i28L0zqB5L5yAl8Jl26K3A==} + dependencies: + '@types/web-bluetooth': 0.0.18 + '@vueuse/metadata': 10.5.0 + '@vueuse/shared': 10.5.0(vue@3.3.4) + vue-demi: 0.14.6(vue@3.3.4) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: false + /@vueuse/core@8.7.5(vue@3.2.45): resolution: {integrity: sha512-tqgzeZGoZcXzoit4kOGLWJibDMLp0vdm6ZO41SSUQhkhtrPhAg6dbIEPiahhUu6sZAmSYvVrZgEr5aKD51nrLA==} peerDependencies: @@ -11555,6 +12062,10 @@ packages: resolution: {integrity: sha512-Ema3YhNOa4swDsV0V7CEY5JXvK19JI/o1szFO1iWxdFg3vhdFtCtSTP26PCvbUpnUtNHBY2wx5y3WDXND5Pvnw==} dev: false + /@vueuse/metadata@10.5.0: + resolution: {integrity: sha512-fEbElR+MaIYyCkeM0SzWkdoMtOpIwO72x8WsZHRE7IggiOlILttqttM69AS13nrDxosnDBYdyy3C5mR1LCxHsw==} + dev: false + /@vueuse/metadata@8.7.5: resolution: {integrity: sha512-emJZKRQSaEnVqmlu39NpNp8iaW+bPC2kWykWoWOZMSlO/0QVEmO/rt8A5VhOEJTKLX3vwTevqbiRy9WJRwVOQg==} dev: false @@ -11572,6 +12083,15 @@ packages: - vue dev: false + /@vueuse/shared@10.5.0(vue@3.3.4): + resolution: {integrity: sha512-18iyxbbHYLst9MqU1X1QNdMHIjks6wC7XTVf0KNOv5es/Ms6gjVFCAAWTVP2JStuGqydg3DT+ExpFORUEi9yhg==} + dependencies: + vue-demi: 0.14.6(vue@3.3.4) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: false + /@vueuse/shared@8.7.5(vue@3.2.45): resolution: {integrity: sha512-THXPvMBFmg6Gf6AwRn/EdTh2mhqwjGsB2Yfp374LNQSQVKRHtnJ0I42bsZTn7nuEliBxqUrGQm/lN6qUHmhJLw==} peerDependencies: @@ -13414,7 +13934,7 @@ packages: '@iarna/toml': 2.2.5 dev: false - /cosmiconfig-typescript-loader@2.0.2(@types/node@17.0.27)(cosmiconfig@7.0.1)(typescript@4.9.5): + /cosmiconfig-typescript-loader@2.0.2(@types/node@18.18.8)(cosmiconfig@7.0.1)(typescript@4.9.5): resolution: {integrity: sha512-KmE+bMjWMXJbkWCeY4FJX/npHuZPNr9XF9q9CIQ/bpFwi1qHfCmSiKarrCcRa0LO4fWjk93pVoeRtJAkTGcYNw==} engines: {node: '>=12', npm: '>=6'} peerDependencies: @@ -13422,9 +13942,9 @@ packages: cosmiconfig: '>=7' typescript: '>=3' dependencies: - '@types/node': 17.0.27 + '@types/node': 18.18.8 cosmiconfig: 7.0.1 - ts-node: 10.8.2(@types/node@17.0.27)(typescript@4.9.5) + ts-node: 10.8.2(@types/node@18.18.8)(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - '@swc/core' @@ -14942,6 +15462,22 @@ packages: prettier-linter-helpers: 1.0.0 dev: true + /eslint-plugin-prettier@4.2.1(eslint@8.47.0)(prettier@2.8.4): + resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + eslint: '>=7.28.0' + eslint-config-prettier: '*' + prettier: '>=2.0.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.47.0 + prettier: 2.8.4 + prettier-linter-helpers: 1.0.0 + dev: true + /eslint-plugin-prettier@5.0.0(eslint@8.47.0)(prettier@3.0.3): resolution: {integrity: sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==} engines: {node: ^14.18.0 || >=16.0.0} @@ -16776,6 +17312,7 @@ packages: - bufferutil - canvas - less + - lightningcss - sass - stylus - sugarss @@ -17764,7 +18301,7 @@ packages: '@jest/environment': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 17.0.27 + '@types/node': 18.18.8 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -17792,7 +18329,7 @@ packages: '@jest/expect': 29.4.1 '@jest/test-result': 29.4.1 '@jest/types': 29.5.0 - '@types/node': 17.0.27 + '@types/node': 18.18.8 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -17909,7 +18446,7 @@ packages: - utf-8-validate dev: true - /jest-config@29.4.1(@types/node@17.0.27)(ts-node@10.9.1): + /jest-config@29.4.1(@types/node@18.11.10)(ts-node@10.9.1): resolution: {integrity: sha512-g7p3q4NuXiM4hrS4XFATTkd+2z0Ml2RhFmFPM8c3WyKwVDNszbl4E7cV7WIx1YZeqqCtqbtTtZhGZWJlJqngzg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -17924,7 +18461,7 @@ packages: '@babel/core': 7.22.10 '@jest/test-sequencer': 29.4.1 '@jest/types': 29.5.0 - '@types/node': 17.0.27 + '@types/node': 18.11.10 babel-jest: 29.4.1(@babel/core@7.22.10) chalk: 4.1.2 ci-info: 3.3.2 @@ -17949,7 +18486,7 @@ packages: - supports-color dev: true - /jest-config@29.4.1(@types/node@18.11.10)(ts-node@10.9.1): + /jest-config@29.4.1(@types/node@18.18.8)(ts-node@10.9.1): resolution: {integrity: sha512-g7p3q4NuXiM4hrS4XFATTkd+2z0Ml2RhFmFPM8c3WyKwVDNszbl4E7cV7WIx1YZeqqCtqbtTtZhGZWJlJqngzg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -17964,7 +18501,7 @@ packages: '@babel/core': 7.22.10 '@jest/test-sequencer': 29.4.1 '@jest/types': 29.5.0 - '@types/node': 18.11.10 + '@types/node': 18.18.8 babel-jest: 29.4.1(@babel/core@7.22.10) chalk: 4.1.2 ci-info: 3.3.2 @@ -18062,7 +18599,7 @@ packages: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 17.0.27 + '@types/node': 18.18.8 jest-mock: 27.5.1 jest-util: 27.5.1 jsdom: 16.7.0 @@ -18080,7 +18617,7 @@ packages: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 17.0.27 + '@types/node': 18.18.8 jest-mock: 27.5.1 jest-util: 27.5.1 dev: true @@ -18092,7 +18629,7 @@ packages: '@jest/environment': 29.4.1 '@jest/fake-timers': 29.4.1 '@jest/types': 29.5.0 - '@types/node': 17.0.27 + '@types/node': 18.18.8 jest-mock: 29.4.1 jest-util: 29.5.0 dev: true @@ -18123,7 +18660,7 @@ packages: dependencies: '@jest/types': 27.5.1 '@types/graceful-fs': 4.1.5 - '@types/node': 17.0.27 + '@types/node': 18.18.8 anymatch: 3.1.3 fb-watchman: 2.0.1 graceful-fs: 4.2.11 @@ -18143,7 +18680,7 @@ packages: dependencies: '@jest/types': 29.5.0 '@types/graceful-fs': 4.1.5 - '@types/node': 17.0.27 + '@types/node': 18.18.8 anymatch: 3.1.3 fb-watchman: 2.0.1 graceful-fs: 4.2.10 @@ -18164,7 +18701,7 @@ packages: '@jest/source-map': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 17.0.27 + '@types/node': 18.18.8 chalk: 4.1.2 co: 4.6.0 expect: 27.5.1 @@ -18328,7 +18865,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 17.0.27 + '@types/node': 18.18.8 dev: true /jest-mock@29.4.1: @@ -18336,7 +18873,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.5.0 - '@types/node': 17.0.27 + '@types/node': 18.18.8 jest-util: 29.5.0 dev: true @@ -18406,7 +18943,7 @@ packages: jest-pnp-resolver: 1.2.2(jest-resolve@27.5.1) jest-util: 27.5.1 jest-validate: 27.5.1 - resolve: 1.22.1 + resolve: 1.22.8 resolve.exports: 1.1.0 slash: 3.0.0 dev: true @@ -18421,7 +18958,7 @@ packages: jest-pnp-resolver: 1.2.2(jest-resolve@29.4.1) jest-util: 29.5.0 jest-validate: 29.4.1 - resolve: 1.22.1 + resolve: 1.22.8 resolve.exports: 2.0.0 slash: 3.0.0 dev: true @@ -18435,7 +18972,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 17.0.27 + '@types/node': 18.18.8 chalk: 4.1.2 emittery: 0.8.1 graceful-fs: 4.2.11 @@ -18467,7 +19004,7 @@ packages: '@jest/test-result': 29.4.1 '@jest/transform': 29.4.1 '@jest/types': 29.5.0 - '@types/node': 17.0.27 + '@types/node': 18.18.8 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.10 @@ -18528,7 +19065,7 @@ packages: '@jest/test-result': 29.4.1 '@jest/transform': 29.4.1 '@jest/types': 29.5.0 - '@types/node': 17.0.27 + '@types/node': 18.18.8 chalk: 4.1.2 cjs-module-lexer: 1.2.2 collect-v8-coverage: 1.0.1 @@ -18552,7 +19089,7 @@ packages: resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@types/node': 17.0.27 + '@types/node': 18.18.8 graceful-fs: 4.2.11 dev: true @@ -18623,7 +19160,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 17.0.27 + '@types/node': 18.18.8 chalk: 4.1.2 ci-info: 3.3.2 graceful-fs: 4.2.10 @@ -18635,7 +19172,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@jest/types': 28.1.1 - '@types/node': 17.0.27 + '@types/node': 18.18.8 chalk: 4.1.2 ci-info: 3.3.2 graceful-fs: 4.2.11 @@ -18647,7 +19184,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.4.1 - '@types/node': 17.0.27 + '@types/node': 18.18.8 chalk: 4.1.2 ci-info: 3.3.2 graceful-fs: 4.2.10 @@ -18659,7 +19196,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.5.0 - '@types/node': 17.0.27 + '@types/node': 18.18.8 chalk: 4.1.2 ci-info: 3.3.2 graceful-fs: 4.2.10 @@ -18671,7 +19208,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.5.0 - '@types/node': 17.0.27 + '@types/node': 18.18.8 chalk: 4.1.2 ci-info: 3.3.2 graceful-fs: 4.2.11 @@ -18708,7 +19245,7 @@ packages: dependencies: '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 17.0.27 + '@types/node': 18.18.8 ansi-escapes: 4.3.2 chalk: 4.1.2 jest-util: 27.5.1 @@ -18721,7 +19258,7 @@ packages: dependencies: '@jest/test-result': 29.4.1 '@jest/types': 29.5.0 - '@types/node': 17.0.27 + '@types/node': 18.18.8 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -18733,7 +19270,7 @@ packages: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 17.0.27 + '@types/node': 18.18.8 merge-stream: 2.0.0 supports-color: 7.2.0 dev: true @@ -18742,7 +19279,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 17.0.27 + '@types/node': 18.18.8 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -18751,7 +19288,7 @@ packages: resolution: {integrity: sha512-O9doU/S1EBe+yp/mstQ0VpPwpv0Clgn68TkNwGxL6/usX/KUW9Arnn4ag8C3jc6qHcXznhsT5Na1liYzAsuAbQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 17.0.27 + '@types/node': 18.18.8 jest-util: 29.5.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -18869,7 +19406,7 @@ packages: optional: true dependencies: abab: 2.0.6 - acorn: 8.10.0 + acorn: 8.11.2 acorn-globals: 6.0.0 cssom: 0.4.4 cssstyle: 2.3.0 @@ -19129,7 +19666,6 @@ packages: /kolorist@1.5.1: resolution: {integrity: sha512-lxpCM3HTvquGxKGzHeknB/sUjuVoUElLlfYnXZT73K8geR9jQbroGlSCFBax9/0mpGoD3kzcMLnOlGQPJJNyqQ==} - dev: false /kolorist@1.7.0: resolution: {integrity: sha512-ymToLHqL02udwVdbkowNpzjFd6UzozMtshPQKVi5k1EjKRqKqBrOnE9QbLEb0/pV76SAiIT13hdL8R6suc+f3g==} @@ -19294,7 +19830,6 @@ packages: /local-pkg@0.4.2: resolution: {integrity: sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==} engines: {node: '>=14'} - dev: false /local-pkg@0.4.3: resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} @@ -21562,6 +22097,10 @@ packages: resolution: {integrity: sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==} dev: false + /ramda@0.28.0: + resolution: {integrity: sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA==} + dev: false + /random-bytes@1.0.0: resolution: {integrity: sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==} engines: {node: '>= 0.8'} @@ -21880,7 +22419,7 @@ packages: /resolve@1.19.0: resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} dependencies: - is-core-module: 2.13.0 + is-core-module: 2.13.1 path-parse: 1.0.7 dev: true @@ -22107,6 +22646,12 @@ packages: dependencies: queue-microtask: 1.2.3 + /rxjs@7.5.6: + resolution: {integrity: sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==} + dependencies: + tslib: 2.6.2 + dev: false + /rxjs@7.6.0: resolution: {integrity: sha512-DDa7d8TFNUalGC9VqXvQ1euWNN7sc63TrUCuM9J998+ViviahMIjKSOU7rfcgFOF+FCD71BhDRv4hrFz+ImDLQ==} dependencies: @@ -23593,7 +24138,7 @@ packages: - '@types/node' dev: false - /ts-node@10.8.2(@types/node@17.0.27)(typescript@4.9.5): + /ts-node@10.8.2(@types/node@18.18.8)(typescript@4.9.5): resolution: {integrity: sha512-LYdGnoGddf1D6v8REPtIH+5iq/gTDuZqv2/UJUU7tKjuEU8xVZorBM+buCGNjj+pGEud+sOoM4CX3/YzINpENA==} hasBin: true peerDependencies: @@ -23612,7 +24157,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 17.0.27 + '@types/node': 18.18.8 acorn: 8.10.0 acorn-walk: 8.2.0 arg: 4.1.3 @@ -23701,6 +24246,10 @@ packages: yn: 3.1.1 dev: false + /ts-toolbelt@6.15.5: + resolution: {integrity: sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==} + dev: false + /tsconfig-paths-webpack-plugin@4.1.0: resolution: {integrity: sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==} engines: {node: '>=10.13.0'} @@ -23808,6 +24357,16 @@ packages: typescript: 4.9.3 dev: true + /tsutils@3.21.0(typescript@4.9.5): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 4.9.5 + dev: true + /tsutils@3.21.0(typescript@5.1.6): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} @@ -24156,6 +24715,38 @@ packages: - webpack dev: false + /unplugin-icons@0.14.9(rollup@2.79.1)(vite@4.5.0): + resolution: {integrity: sha512-vPyVfNREH88dP6gszdaoGkAEFPpiScXj1A8eWN905jQgT53A3tsiPEiqJjCHOUVcsUaREt2JSudzumFOsCA78A==} + peerDependencies: + '@svgr/core': '>=5.5.0' + '@vue/compiler-sfc': ^3.0.2 + vue-template-compiler: ^2.6.12 + vue-template-es2015-compiler: ^1.9.0 + peerDependenciesMeta: + '@svgr/core': + optional: true + '@vue/compiler-sfc': + optional: true + vue-template-compiler: + optional: true + vue-template-es2015-compiler: + optional: true + dependencies: + '@antfu/install-pkg': 0.1.1 + '@antfu/utils': 0.5.2 + '@iconify/utils': 1.0.33 + debug: 4.3.4(supports-color@9.2.2) + kolorist: 1.8.0 + local-pkg: 0.4.3 + unplugin: 0.9.5(rollup@2.79.1)(vite@4.5.0) + transitivePeerDependencies: + - esbuild + - rollup + - supports-color + - vite + - webpack + dev: true + /unplugin-icons@0.15.3(@vue/compiler-sfc@3.2.45): resolution: {integrity: sha512-YWgJqv5AahrokeOnta8uX/m1damZA6Rf6zPClgHg2Fa/45iyOe3Lj+Wn/Ba+CSsq9yBffn17YfKfJNyWCNZPvw==} peerDependencies: @@ -24235,7 +24826,7 @@ packages: local-pkg: 0.4.3 magic-string: 0.26.7 minimatch: 5.1.6 - resolve: 1.22.4 + resolve: 1.22.8 unplugin: 0.7.1(esbuild@0.19.5)(rollup@2.79.1)(vite@3.2.4) vue: 3.2.45 transitivePeerDependencies: @@ -24246,6 +24837,35 @@ packages: - webpack dev: true + /unplugin-vue-components@0.21.0(rollup@2.79.1)(vite@4.5.0)(vue@3.3.4): + resolution: {integrity: sha512-U7uOMNmRJ2eAv9CNjP8QRvxs6nAe3FVQUEIUphC1FGguBp3BWSLgGAcSHaX2nQy0gFoDY2mLF2M52W/t/eDaKg==} + engines: {node: '>=14'} + peerDependencies: + '@babel/parser': ^7.15.8 + vue: 2 || 3 + peerDependenciesMeta: + '@babel/parser': + optional: true + dependencies: + '@antfu/utils': 0.5.2 + '@rollup/pluginutils': 4.2.1 + chokidar: 3.5.3 + debug: 4.3.4(supports-color@9.2.2) + fast-glob: 3.3.1 + local-pkg: 0.4.3 + magic-string: 0.26.7 + minimatch: 5.1.6 + resolve: 1.22.8 + unplugin: 0.7.1(rollup@2.79.1)(vite@4.5.0) + vue: 3.3.4 + transitivePeerDependencies: + - esbuild + - rollup + - supports-color + - vite + - webpack + dev: true + /unplugin-vue-components@0.21.0(vite@3.2.4)(vue@3.2.45): resolution: {integrity: sha512-U7uOMNmRJ2eAv9CNjP8QRvxs6nAe3FVQUEIUphC1FGguBp3BWSLgGAcSHaX2nQy0gFoDY2mLF2M52W/t/eDaKg==} engines: {node: '>=14'} @@ -24350,7 +24970,7 @@ packages: webpack: optional: true dependencies: - acorn: 8.10.0 + acorn: 8.11.2 chokidar: 3.5.3 esbuild: 0.19.5 rollup: 2.79.1 @@ -24359,6 +24979,31 @@ packages: webpack-virtual-modules: 0.4.4 dev: true + /unplugin@0.7.1(rollup@2.79.1)(vite@4.5.0): + resolution: {integrity: sha512-Z6hNDXDNh9aimMkPU1mEjtk+2ova8gh0y7rJeJdGH1vWZOHwF2lLQiQ/R97rv9ymmzEQXsR2fyMet72T8jy6ew==} + peerDependencies: + esbuild: '>=0.13' + rollup: ^2.50.0 + vite: ^2.3.0 || ^3.0.0-0 + webpack: 4 || 5 + peerDependenciesMeta: + esbuild: + optional: true + rollup: + optional: true + vite: + optional: true + webpack: + optional: true + dependencies: + acorn: 8.11.2 + chokidar: 3.5.3 + rollup: 2.79.1 + vite: 4.5.0(@types/node@18.18.8)(terser@5.24.0) + webpack-sources: 3.2.3 + webpack-virtual-modules: 0.4.4 + dev: true + /unplugin@0.7.1(vite@3.2.4): resolution: {integrity: sha512-Z6hNDXDNh9aimMkPU1mEjtk+2ova8gh0y7rJeJdGH1vWZOHwF2lLQiQ/R97rv9ymmzEQXsR2fyMet72T8jy6ew==} peerDependencies: @@ -24383,6 +25028,31 @@ packages: webpack-virtual-modules: 0.4.4 dev: false + /unplugin@0.9.5(rollup@2.79.1)(vite@4.5.0): + resolution: {integrity: sha512-luraheyfxwtvkvHpsOvMNv7IjLdORTWKZp0gWYNHGLi2ImON3iIZOj464qEyyEwLA/EMt12fC415HW9zRpOfTg==} + peerDependencies: + esbuild: '>=0.13' + rollup: ^2.50.0 + vite: ^2.3.0 || ^3.0.0-0 + webpack: 4 || 5 + peerDependenciesMeta: + esbuild: + optional: true + rollup: + optional: true + vite: + optional: true + webpack: + optional: true + dependencies: + acorn: 8.11.2 + chokidar: 3.5.3 + rollup: 2.79.1 + vite: 4.5.0(@types/node@18.18.8)(terser@5.24.0) + webpack-sources: 3.2.3 + webpack-virtual-modules: 0.4.4 + dev: true + /unplugin@0.9.5(vite@3.2.4): resolution: {integrity: sha512-luraheyfxwtvkvHpsOvMNv7IjLdORTWKZp0gWYNHGLi2ImON3iIZOj464qEyyEwLA/EMt12fC415HW9zRpOfTg==} peerDependencies: @@ -24628,10 +25298,11 @@ packages: pathe: 0.2.0 source-map: 0.6.1 source-map-support: 0.5.21 - vite: 3.2.4(@types/node@17.0.27)(sass@1.53.0)(terser@5.24.0) + vite: 4.5.0(@types/node@17.0.27)(sass@1.53.0)(terser@5.24.0) transitivePeerDependencies: - '@types/node' - less + - lightningcss - sass - stylus - sugarss @@ -24649,10 +25320,11 @@ packages: mlly: 1.2.0 pathe: 1.1.0 picocolors: 1.0.0 - vite: 4.0.4(@types/node@18.17.6) + vite: 4.5.0(@types/node@18.17.6)(sass@1.66.0)(terser@5.24.0) transitivePeerDependencies: - '@types/node' - less + - lightningcss - sass - stylus - sugarss @@ -24670,7 +25342,29 @@ packages: mlly: 1.4.0 pathe: 1.1.1 picocolors: 1.0.0 - vite: 4.4.9(@types/node@18.17.6)(sass@1.66.0)(terser@5.24.0) + vite: 4.5.0(@types/node@18.17.6)(sass@1.66.0)(terser@5.24.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite-node@0.34.2(@types/node@18.18.8)(terser@5.24.0): + resolution: {integrity: sha512-JtW249Zm3FB+F7pQfH56uWSdlltCo1IOkZW5oHBzeQo0iX4jtC7o1t9aILMGd9kVekXBP2lfJBEQt9rBh07ebA==} + engines: {node: '>=v14.18.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4(supports-color@9.2.2) + mlly: 1.4.0 + pathe: 1.1.1 + picocolors: 1.0.0 + vite: 4.5.0(@types/node@18.18.8)(terser@5.24.0) transitivePeerDependencies: - '@types/node' - less @@ -24836,6 +25530,16 @@ packages: vite: 4.4.9(@types/node@17.0.27)(sass@1.66.0)(terser@5.24.0) dev: true + /vite-plugin-fonts@0.6.0(vite@4.5.0): + resolution: {integrity: sha512-dV6nnLEju8k5EmvlBH6egxkVZ+rgc5zWsJr9+cNRXBMEDnpRGHcZPI260UEDNg2yB99wSTNER2eduEvZFbMIGw==} + deprecated: renamed to `unplugin-fonts`, see https://github.com/cssninjaStudio/unplugin-fonts/releases/tag/v1.0.0 + peerDependencies: + vite: ^2.0.0 || ^3.0.0 + dependencies: + fast-glob: 3.3.1 + vite: 4.5.0(@types/node@18.18.8)(terser@5.24.0) + dev: true + /vite-plugin-html-config@1.0.10(vite@3.2.4): resolution: {integrity: sha512-qJCVKC/mR4BIy4EG7AHQ3nGo1BF+3fOjVIka0kXKQMlxT12dl9G5YKmjhLohDzySijOb03R2PzYiAdavwKkqQQ==} engines: {node: '>=12.0.0'} @@ -24854,6 +25558,15 @@ packages: vite: 4.4.9(@types/node@17.0.27)(sass@1.66.0)(terser@5.24.0) dev: true + /vite-plugin-html-config@1.0.11(vite@4.5.0): + resolution: {integrity: sha512-hUybhgI+/LQQ5q6xoMMsTvI4PBuQD/Wv6Z1vtDPVWjanS8weCIexXuLLYNGD/93f0v8W2hpNfXpmxgpZMahJ0g==} + engines: {node: '>=12.0.0'} + peerDependencies: + vite: '>=2.0.0' + dependencies: + vite: 4.5.0(@types/node@18.18.8)(terser@5.24.0) + dev: true + /vite-plugin-inspect@0.7.38(rollup@2.79.1)(vite@4.4.9): resolution: {integrity: sha512-+p6pJVtBOLGv+RBrcKAFUdx+euizg0bjL35HhPyM0MjtKlqoC5V9xkCmO9Ctc8JrTyXqODbHqiLWJKumu5zJ7g==} engines: {node: '>=14'} @@ -24878,6 +25591,30 @@ packages: - supports-color dev: true + /vite-plugin-inspect@0.7.38(rollup@2.79.1)(vite@4.5.0): + resolution: {integrity: sha512-+p6pJVtBOLGv+RBrcKAFUdx+euizg0bjL35HhPyM0MjtKlqoC5V9xkCmO9Ctc8JrTyXqODbHqiLWJKumu5zJ7g==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': '*' + vite: ^3.1.0 || ^4.0.0 + peerDependenciesMeta: + '@nuxt/kit': + optional: true + dependencies: + '@antfu/utils': 0.7.6 + '@rollup/pluginutils': 5.0.3(rollup@2.79.1) + debug: 4.3.4(supports-color@9.2.2) + error-stack-parser-es: 0.1.1 + fs-extra: 11.1.1 + open: 9.1.0 + picocolors: 1.0.0 + sirv: 2.0.3 + vite: 4.5.0(@types/node@18.18.8)(terser@5.24.0) + transitivePeerDependencies: + - rollup + - supports-color + dev: true + /vite-plugin-inspect@0.7.38(rollup@3.29.4)(vite@4.4.9): resolution: {integrity: sha512-+p6pJVtBOLGv+RBrcKAFUdx+euizg0bjL35HhPyM0MjtKlqoC5V9xkCmO9Ctc8JrTyXqODbHqiLWJKumu5zJ7g==} engines: {node: '>=14'} @@ -24951,6 +25688,29 @@ packages: - supports-color dev: true + /vite-plugin-pages@0.26.0(vite@4.5.0): + resolution: {integrity: sha512-yJZvwHEt7puYIf19S89IvkDsWPjWleSied4H8hmdW6i8buCA93z1UAU1ipW1d8fNKrC4FzXsUHHbPm6+kl1p9w==} + peerDependencies: + '@vue/compiler-sfc': ^2.7.0 || ^3.0.0 + vite: ^2.0.0 || ^3.0.0-0 + peerDependenciesMeta: + '@vue/compiler-sfc': + optional: true + dependencies: + '@types/debug': 4.1.8 + debug: 4.3.4(supports-color@9.2.2) + deep-equal: 2.2.2 + extract-comments: 1.1.0 + fast-glob: 3.3.1 + json5: 2.2.3 + local-pkg: 0.4.3 + picocolors: 1.0.0 + vite: 4.5.0(@types/node@18.18.8)(terser@5.24.0) + yaml: 2.3.1 + transitivePeerDependencies: + - supports-color + dev: true + /vite-plugin-pages@0.31.0(@vue/compiler-sfc@3.3.4)(vite@4.4.9): resolution: {integrity: sha512-fw3onBfVTXQI7rOzAbSZhmfwvk50+3qNnGZpERjmD93c8nEjrGLyd53eFXYMxcJV4KA1vzi4qIHt2+6tS4dEMw==} peerDependencies: @@ -24993,6 +25753,24 @@ packages: - supports-color dev: true + /vite-plugin-pwa@0.13.1(vite@4.5.0)(workbox-build@6.6.0)(workbox-window@6.6.0): + resolution: {integrity: sha512-NR3dIa+o2hzlzo4lF4Gu0cYvoMjSw2DdRc6Epw1yjmCqWaGuN86WK9JqZie4arNlE1ZuWT3CLiMdiX5wcmmUmg==} + peerDependencies: + vite: ^3.1.0 + workbox-build: ^6.5.4 + workbox-window: ^6.5.4 + dependencies: + debug: 4.3.4(supports-color@9.2.2) + fast-glob: 3.3.1 + pretty-bytes: 6.1.1 + rollup: 2.79.1 + vite: 4.5.0(@types/node@18.18.8)(terser@5.24.0) + workbox-build: 6.6.0 + workbox-window: 6.6.0 + transitivePeerDependencies: + - supports-color + dev: true + /vite-plugin-pwa@0.16.4(vite@4.4.9)(workbox-build@7.0.0)(workbox-window@7.0.0): resolution: {integrity: sha512-lmwHFIs9zI2H9bXJld/zVTbCqCQHZ9WrpyDMqosICDV0FVnCJwniX1NMDB79HGTIZzOQkY4gSZaVTJTw6maz/Q==} engines: {node: '>=16.0.0'} @@ -25011,6 +25789,19 @@ packages: - supports-color dev: true + /vite-plugin-static-copy@0.12.0(vite@4.5.0): + resolution: {integrity: sha512-5a8hCjYJdf/rl8s7ct/YWt97gXdGPGNSOoJtkY5IYhbnSq04X1gTt5GpFHKfAxhHoed1Grfw3Ed13t7AjJi7gw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^3.0.0 + dependencies: + chokidar: 3.5.3 + fast-glob: 3.3.1 + fs-extra: 10.1.0 + picocolors: 1.0.0 + vite: 4.5.0(@types/node@18.18.8)(terser@5.24.0) + dev: true + /vite-plugin-static-copy@0.17.0(vite@4.4.9): resolution: {integrity: sha512-2HpNbHfDt8SDy393AGXh9llHkc8FJMQkI8s3T5WsH3SWLMO+f5cFIyPErl4yGKU9Uh3Vaqsd4lHZYTf042fQ2A==} engines: {node: ^14.18.0 || >=16.0.0} @@ -25058,6 +25849,23 @@ packages: - supports-color dev: true + /vite-plugin-vue-layouts@0.7.0(vite@4.5.0)(vue-router@4.2.5)(vue@3.3.4): + resolution: {integrity: sha512-k5XDmRNFo4M/GmUjhbRXj2WmJiFcGoVI8l/uZ72RHyRDQr4wE/6Zq/KFq0lqXomWQxTSzakQRUswzNwtvZLE8A==} + peerDependencies: + vite: ^2.5.0 || ^3.0.0-0 + vue: ^2.6.12 || ^3.2.4 + vue-router: ^3.5.1 || ^ 4.0.11 + dependencies: + '@vue/compiler-sfc': 3.3.4 + debug: 4.3.4(supports-color@9.2.2) + fast-glob: 3.3.1 + vite: 4.5.0(@types/node@18.18.8)(terser@5.24.0) + vue: 3.3.4 + vue-router: 4.2.5(vue@3.3.4) + transitivePeerDependencies: + - supports-color + dev: true + /vite-plugin-vue-layouts@0.8.0(vite@4.4.9)(vue-router@4.2.4)(vue@3.3.4): resolution: {integrity: sha512-UZW2nSV2LraTSe7gsAL46hfdi7a0X1RvkGGoJVtA2O8beu7anzpXFwQLou8+kHy31CzVycT4gIPySBsHhtBN5g==} peerDependencies: @@ -25120,6 +25928,20 @@ packages: - supports-color dev: true + /vite-plugin-windicss@1.9.1(vite@4.5.0): + resolution: {integrity: sha512-CWm1b/tXVCJTbEGn4oB8B7Gev9xDuY9k4E/KiJqDuLYspBUFQyZKPF2mSZ3DfNdojsfqgzxu9ervqvlb9jJ7fw==} + peerDependencies: + vite: ^2.0.1 || ^3.0.0 || ^4.0.0 + dependencies: + '@windicss/plugin-utils': 1.9.1 + debug: 4.3.4(supports-color@9.2.2) + kolorist: 1.8.0 + vite: 4.5.0(@types/node@18.18.8)(terser@5.24.0) + windicss: 3.5.6 + transitivePeerDependencies: + - supports-color + dev: true + /vite@3.2.4(@types/node@17.0.27)(sass@1.53.0)(terser@5.24.0): resolution: {integrity: sha512-Z2X6SRAffOUYTa+sLy3NQ7nlHFU100xwanq1WDwqaiFiCe+25zdxP1TfCS5ojPV2oDDcXudHIoPnI1Z/66B7Yw==} engines: {node: ^14.18.0 || >=16.0.0} @@ -25370,6 +26192,81 @@ packages: fsevents: 2.3.3 dev: true + /vite@4.5.0(@types/node@18.17.6)(sass@1.66.0)(terser@5.24.0): + resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.17.6 + esbuild: 0.18.20 + postcss: 8.4.31 + rollup: 3.29.4 + sass: 1.66.0 + terser: 5.24.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vite@4.5.0(@types/node@18.18.8)(terser@5.24.0): + resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.18.8 + esbuild: 0.18.20 + postcss: 8.4.31 + rollup: 3.29.4 + terser: 5.24.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + /vitest@0.29.8: resolution: {integrity: sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==} engines: {node: '>=v14.16.0'} @@ -25427,6 +26324,7 @@ packages: why-is-node-running: 2.2.2 transitivePeerDependencies: - less + - lightningcss - sass - stylus - sugarss @@ -25499,6 +26397,71 @@ packages: - terser dev: true + /vitest@0.34.2(terser@5.24.0): + resolution: {integrity: sha512-WgaIvBbjsSYMq/oiMlXUI7KflELmzM43BEvkdC/8b5CAod4ryAiY2z8uR6Crbi5Pjnu5oOmhKa9sy7uk6paBxQ==} + engines: {node: '>=v14.18.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.5 + '@types/chai-subset': 1.3.3 + '@types/node': 18.18.8 + '@vitest/expect': 0.34.2 + '@vitest/runner': 0.34.2 + '@vitest/snapshot': 0.34.2 + '@vitest/spy': 0.34.2 + '@vitest/utils': 0.34.2 + acorn: 8.10.0 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.7 + debug: 4.3.4(supports-color@9.2.2) + local-pkg: 0.4.3 + magic-string: 0.30.2 + pathe: 1.1.1 + picocolors: 1.0.0 + std-env: 3.4.0 + strip-literal: 1.3.0 + tinybench: 2.5.0 + tinypool: 0.7.0 + vite: 4.5.0(@types/node@18.18.8)(terser@5.24.0) + vite-node: 0.34.2(@types/node@18.18.8)(terser@5.24.0) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + /vm2@3.9.14: resolution: {integrity: sha512-HgvPHYHeQy8+QhzlFryvSteA4uQLBCOub02mgqdR+0bN/akRZ48TGB1v0aCv7ksyc0HXx16AZtMHKS38alc6TA==} engines: {node: '>=6.0'} @@ -25718,6 +26681,21 @@ packages: vue: 3.3.4 dev: false + /vue-demi@0.14.6(vue@3.3.4): + resolution: {integrity: sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + dependencies: + vue: 3.3.4 + dev: false + /vue-eslint-parser@9.1.0(eslint@8.29.0): resolution: {integrity: sha512-NGn/iQy8/Wb7RrRa4aRkokyCZfOUWk19OP5HP6JEozQFX5AoS/t+Z0ZN7FY4LlmWc4FNI922V7cvX28zctN8dQ==} engines: {node: ^14.17.0 || >=16.0.0} @@ -25896,6 +26874,18 @@ packages: typescript: 4.9.3 dev: true + /vue-tsc@1.8.8(typescript@4.9.5): + resolution: {integrity: sha512-bSydNFQsF7AMvwWsRXD7cBIXaNs/KSjvzWLymq/UtKE36697sboX4EccSHFVxvgdBlI1frYPc/VMKJNB7DFeDQ==} + hasBin: true + peerDependencies: + typescript: '*' + dependencies: + '@vue/language-core': 1.8.8(typescript@4.9.5) + '@vue/typescript': 1.8.8(typescript@4.9.5) + semver: 7.5.4 + typescript: 4.9.5 + dev: true + /vue-tsc@1.8.8(typescript@5.1.6): resolution: {integrity: sha512-bSydNFQsF7AMvwWsRXD7cBIXaNs/KSjvzWLymq/UtKE36697sboX4EccSHFVxvgdBlI1frYPc/VMKJNB7DFeDQ==} hasBin: true @@ -26406,7 +27396,6 @@ packages: /workbox-core@6.6.0: resolution: {integrity: sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==} - dev: true /workbox-core@7.0.0: resolution: {integrity: sha512-81JkAAZtfVP8darBpfRTovHg8DGAVrKFgHpOArZbdFd78VqHr5Iw65f2guwjE2NlCFbPFDoez3D3/6ZvhI/rwQ==} @@ -26556,7 +27545,6 @@ packages: dependencies: '@types/trusted-types': 2.0.5 workbox-core: 6.6.0 - dev: true /workbox-window@7.0.0: resolution: {integrity: sha512-j7P/bsAWE/a7sxqTzXo3P2ALb1reTfZdvVp6OJ/uLr/C2kZAMvjeWGm8V4htQhor7DOvYg0sSbFN2+flT5U0qA==} @@ -26950,3 +27938,11 @@ packages: /zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} dev: false + + github.com/tauri-apps/tauri-plugin-store/6e19887b1bdea9b921a31993d72396a350731e07: + resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-store/tar.gz/6e19887b1bdea9b921a31993d72396a350731e07} + name: tauri-plugin-store-api + version: 0.0.0 + dependencies: + '@tauri-apps/api': 1.5.1 + dev: false