@knotpad/app 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/(app)/calendar/page.tsx +57 -0
- package/app/(app)/error.tsx +35 -0
- package/app/(app)/graph/page.tsx +32 -0
- package/app/(app)/guide/page.tsx +21 -0
- package/app/(app)/kanban/loading.tsx +24 -0
- package/app/(app)/kanban/page.tsx +59 -0
- package/app/(app)/layout.tsx +122 -0
- package/app/(app)/list/loading.tsx +21 -0
- package/app/(app)/list/page.tsx +137 -0
- package/app/(app)/loading.tsx +18 -0
- package/app/(app)/notes/[noteId]/page.tsx +84 -0
- package/app/(app)/notes/layout.tsx +30 -0
- package/app/(app)/notes/page.tsx +39 -0
- package/app/(app)/page.tsx +5 -0
- package/app/(app)/settings/agent-token/page.tsx +59 -0
- package/app/(app)/settings/backup/page.tsx +49 -0
- package/app/(app)/settings/billing/page.tsx +53 -0
- package/app/(app)/settings/calendar/page.tsx +41 -0
- package/app/(app)/settings/layout.test.tsx +39 -0
- package/app/(app)/settings/layout.tsx +71 -0
- package/app/(app)/settings/page.tsx +4 -0
- package/app/(app)/settings/security/page.tsx +43 -0
- package/app/(app)/settings/team/page.tsx +74 -0
- package/app/(app)/settings/workspace/page.tsx +27 -0
- package/app/(app)/tasks/[taskId]/page.tsx +79 -0
- package/app/(auth)/forgot-password/page.tsx +106 -0
- package/app/(auth)/guest/page.tsx +56 -0
- package/app/(auth)/layout.tsx +13 -0
- package/app/(auth)/login/page.tsx +14 -0
- package/app/(auth)/register/page.tsx +193 -0
- package/app/(auth)/reset-password/page.tsx +138 -0
- package/app/api/account/claim/route.tsx +135 -0
- package/app/api/admin/backfill-encryption/route.tsx +43 -0
- package/app/api/admin/license/route.tsx +42 -0
- package/app/api/auth/2fa/route.tsx +148 -0
- package/app/api/auth/[...nextauth]/route.tsx +3 -0
- package/app/api/auth/change-password/route.tsx +61 -0
- package/app/api/auth/check-2fa/route.tsx +19 -0
- package/app/api/auth/forgot-password/route.tsx +65 -0
- package/app/api/auth/reset-password/route.tsx +52 -0
- package/app/api/auth/verify-2fa/route.tsx +88 -0
- package/app/api/backup/download/db/route.ts +29 -0
- package/app/api/backup/download/notes/route.ts +25 -0
- package/app/api/backup/settings/route.ts +92 -0
- package/app/api/billing/checkout/route.tsx +81 -0
- package/app/api/billing/migrate/route.tsx +163 -0
- package/app/api/billing/portal/route.tsx +24 -0
- package/app/api/billing/setup-intent/route.tsx +55 -0
- package/app/api/billing/status/route.tsx +36 -0
- package/app/api/billing/subscribe/route.tsx +85 -0
- package/app/api/billing/webhook/route.tsx +199 -0
- package/app/api/calendar-feeds/[feedId]/route.tsx +67 -0
- package/app/api/calendar-feeds/[feedId]/sync/route.tsx +37 -0
- package/app/api/calendar-feeds/events/route.tsx +82 -0
- package/app/api/calendar-feeds/route.tsx +52 -0
- package/app/api/calendar-feeds/sync-all/route.tsx +34 -0
- package/app/api/cron/calendar-feeds/route.tsx +31 -0
- package/app/api/cron/stale-tasks/route.tsx +51 -0
- package/app/api/cron/sync/route.tsx +34 -0
- package/app/api/devices/[deviceId]/route.tsx +25 -0
- package/app/api/devices/route.tsx +41 -0
- package/app/api/export/route.tsx +40 -0
- package/app/api/feedback/route.tsx +54 -0
- package/app/api/folders/[folderId]/route.tsx +51 -0
- package/app/api/folders/route.tsx +37 -0
- package/app/api/graph/route.tsx +242 -0
- package/app/api/guest/route.tsx +58 -0
- package/app/api/health/route.tsx +10 -0
- package/app/api/holidays/countries/route.tsx +14 -0
- package/app/api/holidays/route.tsx +49 -0
- package/app/api/holidays/states/route.tsx +21 -0
- package/app/api/invites/[token]/route.tsx +131 -0
- package/app/api/invites/route.tsx +74 -0
- package/app/api/mcp/generate-token/route.tsx +55 -0
- package/app/api/mcp/revoke-token/[tokenId]/route.tsx +30 -0
- package/app/api/mcp/update-alias/[tokenId]/route.tsx +22 -0
- package/app/api/notes/[noteId]/export/route.tsx +45 -0
- package/app/api/notes/[noteId]/route.tsx +360 -0
- package/app/api/notes/route.tsx +112 -0
- package/app/api/notifications/route.tsx +44 -0
- package/app/api/register/route.tsx +67 -0
- package/app/api/restore/route.tsx +148 -0
- package/app/api/sync/conflicts/[conflictId]/route.tsx +134 -0
- package/app/api/sync/conflicts/route.tsx +48 -0
- package/app/api/sync/status/route.tsx +49 -0
- package/app/api/sync/trigger/route.tsx +15 -0
- package/app/api/tasks/[taskId]/detail/route.tsx +68 -0
- package/app/api/tasks/[taskId]/route.tsx +259 -0
- package/app/api/tasks/bulk/route.tsx +133 -0
- package/app/api/tasks/route.tsx +36 -0
- package/app/api/workspace/active/route.tsx +39 -0
- package/app/api/workspace/create-team/route.tsx +42 -0
- package/app/api/workspace/kanban-statuses/route.tsx +71 -0
- package/app/api/workspace/members/[memberId]/route.tsx +69 -0
- package/app/api/workspace/route.tsx +24 -0
- package/app/download/page.tsx +170 -0
- package/app/favicon.ico +0 -0
- package/app/generated/prisma/client.d.ts +1 -0
- package/app/generated/prisma/client.js +5 -0
- package/app/generated/prisma/default.d.ts +1 -0
- package/app/generated/prisma/default.js +5 -0
- package/app/generated/prisma/edge.d.ts +1 -0
- package/app/generated/prisma/edge.js +497 -0
- package/app/generated/prisma/index-browser.js +523 -0
- package/app/generated/prisma/index.d.ts +46376 -0
- package/app/generated/prisma/index.js +497 -0
- package/app/generated/prisma/package.json +144 -0
- package/app/generated/prisma/query_compiler_fast_bg.js +2 -0
- package/app/generated/prisma/query_compiler_fast_bg.wasm +0 -0
- package/app/generated/prisma/query_compiler_fast_bg.wasm-base64.js +2 -0
- package/app/generated/prisma/runtime/client.d.ts +3386 -0
- package/app/generated/prisma/runtime/client.js +86 -0
- package/app/generated/prisma/runtime/index-browser.d.ts +90 -0
- package/app/generated/prisma/runtime/index-browser.js +6 -0
- package/app/generated/prisma/runtime/wasm-compiler-edge.js +76 -0
- package/app/generated/prisma/schema.prisma +456 -0
- package/app/generated/prisma/wasm-edge-light-loader.mjs +5 -0
- package/app/generated/prisma/wasm-worker-loader.mjs +5 -0
- package/app/globals.css +54 -0
- package/app/invite/[token]/page.tsx +52 -0
- package/app/layout.tsx +90 -0
- package/app/mcp/route.tsx +430 -0
- package/app/opengraph-image.tsx +120 -0
- package/app/page.tsx +398 -0
- package/app/privacy/page.tsx +69 -0
- package/app/robots.tsx +25 -0
- package/app/sitemap.tsx +36 -0
- package/app/terms/page.tsx +69 -0
- package/app/upgrade/page.tsx +75 -0
- package/auth.config.ts +33 -0
- package/auth.ts +79 -0
- package/bin/brief.js +224 -0
- package/components/auth/login-form.tsx +302 -0
- package/components/auth/password-checklist.tsx +31 -0
- package/components/auth/password-input.tsx +36 -0
- package/components/auth/switch-account-button.test.tsx +22 -0
- package/components/auth/switch-account-button.tsx +19 -0
- package/components/auth/two-factor-input.tsx +116 -0
- package/components/billing/billing-dashboard.tsx +265 -0
- package/components/billing/card-form.tsx +210 -0
- package/components/billing/claim-account-form.tsx +99 -0
- package/components/branding/app-logo.test.tsx +20 -0
- package/components/branding/app-logo.tsx +25 -0
- package/components/calendar/calendar-agenda.tsx +150 -0
- package/components/calendar/calendar-drag.test.tsx +177 -0
- package/components/calendar/calendar-grid.tsx +357 -0
- package/components/calendar/calendar-hooks.test.tsx +27 -0
- package/components/calendar/calendar-hooks.ts +351 -0
- package/components/calendar/calendar-toolbar.test.tsx +68 -0
- package/components/calendar/calendar-toolbar.tsx +291 -0
- package/components/calendar/calendar-types.ts +148 -0
- package/components/calendar/calendar-view.test.tsx +295 -0
- package/components/calendar/calendar-view.tsx +307 -0
- package/components/calendar/day-detail-popover.tsx +174 -0
- package/components/calendar/task-chip.tsx +86 -0
- package/components/command/command-palette.test.tsx +33 -0
- package/components/command/command-palette.tsx +310 -0
- package/components/download-cta.tsx +87 -0
- package/components/feedback/feedback-popup.tsx +207 -0
- package/components/graph/graph-draw.ts +337 -0
- package/components/graph/graph-overlays.tsx +160 -0
- package/components/graph/graph-page.test.tsx +131 -0
- package/components/graph/graph-page.tsx +263 -0
- package/components/graph/graph-types.ts +47 -0
- package/components/graph/graph-view.tsx +322 -0
- package/components/guide/guide-view.tsx +522 -0
- package/components/kanban/kanban-board.test.tsx +128 -0
- package/components/kanban/kanban-board.tsx +361 -0
- package/components/kanban/kanban-card-menu.tsx +102 -0
- package/components/kanban/kanban-card.tsx +227 -0
- package/components/kanban/kanban-column.tsx +49 -0
- package/components/kanban/kanban-status-context.tsx +28 -0
- package/components/landing/calendar-sandbox.test.tsx +15 -0
- package/components/landing/calendar-sandbox.tsx +107 -0
- package/components/landing/graph-sandbox.test.tsx +27 -0
- package/components/landing/graph-sandbox.tsx +80 -0
- package/components/landing/kanban-sandbox.test.tsx +24 -0
- package/components/landing/kanban-sandbox.tsx +101 -0
- package/components/landing/landing-showcase.test.tsx +21 -0
- package/components/landing/landing-showcase.tsx +54 -0
- package/components/landing/list-sandbox.tsx +86 -0
- package/components/landing/mock-workspace.ts +168 -0
- package/components/landing/notes-sandbox.test.tsx +14 -0
- package/components/landing/notes-sandbox.tsx +88 -0
- package/components/layout/app-shell.tsx +83 -0
- package/components/layout/backup-scheduler.tsx +122 -0
- package/components/layout/bottom-nav.tsx +43 -0
- package/components/layout/icon-bar.test.tsx +29 -0
- package/components/layout/icon-bar.tsx +118 -0
- package/components/layout/mobile-top-bar.tsx +68 -0
- package/components/layout/notes-panel-folder.tsx +127 -0
- package/components/layout/notes-panel-note-item.tsx +140 -0
- package/components/layout/notes-panel-task-tab.tsx +63 -0
- package/components/layout/notes-panel-types.ts +44 -0
- package/components/layout/notes-panel.tsx +476 -0
- package/components/layout/notification-bell.tsx +251 -0
- package/components/layout/paywall-screen.tsx +41 -0
- package/components/layout/pro-banner.tsx +76 -0
- package/components/layout/sw-register.tsx +27 -0
- package/components/layout/workspace-switcher.tsx +90 -0
- package/components/notes/mobile-bottom-sheet.tsx +99 -0
- package/components/notes/note-editor-context-menu.tsx +47 -0
- package/components/notes/note-editor-dom.ts +33 -0
- package/components/notes/note-editor-dropdowns.tsx +484 -0
- package/components/notes/note-editor-hooks.ts +692 -0
- package/components/notes/note-editor-keyboard.ts +305 -0
- package/components/notes/note-editor-overlay.tsx +90 -0
- package/components/notes/note-editor.test.tsx +372 -0
- package/components/notes/note-editor.tsx +662 -0
- package/components/notes/note-preview-pane.tsx +156 -0
- package/components/notes/note-tabs.tsx +120 -0
- package/components/notes/note-types.tsx +157 -0
- package/components/settings/accept-invite.tsx +108 -0
- package/components/settings/agent-token-settings.tsx +369 -0
- package/components/settings/backup-restore-settings.test.tsx +25 -0
- package/components/settings/backup-restore-settings.tsx +327 -0
- package/components/settings/calendar-feeds-settings.tsx +489 -0
- package/components/settings/calendar-general-settings.tsx +174 -0
- package/components/settings/confirm-danger-action.test.tsx +215 -0
- package/components/settings/confirm-danger-action.tsx +65 -0
- package/components/settings/security-settings.tsx +252 -0
- package/components/settings/settings-guidance.test.tsx +98 -0
- package/components/settings/team-settings.tsx +319 -0
- package/components/settings/two-factor-auth.tsx +296 -0
- package/components/settings/workspace-settings-client.tsx +363 -0
- package/components/settings/workspace-settings-form.tsx +73 -0
- package/components/sync/conflict-viewer.tsx +247 -0
- package/components/sync/sync-indicator.tsx +171 -0
- package/components/tasks/snippet-thread.tsx +119 -0
- package/components/tasks/status-dot.tsx +47 -0
- package/components/tasks/task-badge.tsx +43 -0
- package/components/tasks/task-detail.test.tsx +187 -0
- package/components/tasks/task-detail.tsx +458 -0
- package/components/tasks/task-list-filters.test.tsx +75 -0
- package/components/tasks/task-list-filters.tsx +163 -0
- package/components/tasks/task-list-types.ts +20 -0
- package/components/tasks/task-list.test.tsx +175 -0
- package/components/tasks/task-list.tsx +481 -0
- package/components/tasks/task-row.tsx +85 -0
- package/components/tasks/task-table-row.tsx +259 -0
- package/components/ui/skeleton.tsx +3 -0
- package/components/ui/toast.test.tsx +42 -0
- package/components/ui/toast.tsx +70 -0
- package/instrumentation.tsx +23 -0
- package/lib/api-error.ts +50 -0
- package/lib/backup/backup-runner.test.ts +32 -0
- package/lib/backup/backup-runner.ts +19 -0
- package/lib/backup/backup-schedule.test.ts +23 -0
- package/lib/backup/backup-schedule.ts +55 -0
- package/lib/backup/backup-settings.test.ts +30 -0
- package/lib/backup/backup-settings.ts +27 -0
- package/lib/backup/export-notes-zip.test.ts +26 -0
- package/lib/backup/export-notes-zip.ts +82 -0
- package/lib/backup/export-workspace-backup.test.ts +17 -0
- package/lib/backup/export-workspace-backup.ts +77 -0
- package/lib/backup/restore-workspace-from-export.test.ts +18 -0
- package/lib/backup/restore-workspace-from-export.ts +183 -0
- package/lib/backup/types.ts +14 -0
- package/lib/brand-icons.ts +1 -0
- package/lib/calendar-feed-crypto.ts +38 -0
- package/lib/calendar-feed.ts +239 -0
- package/lib/client/online-status.ts +47 -0
- package/lib/conflict-resolver.test.ts +57 -0
- package/lib/conflict-resolver.ts +240 -0
- package/lib/db-init.ts +79 -0
- package/lib/email.ts +159 -0
- package/lib/encryption.test.ts +41 -0
- package/lib/encryption.ts +98 -0
- package/lib/extract-snippet.test.ts +123 -0
- package/lib/extract-snippet.ts +69 -0
- package/lib/kanban-status.ts +55 -0
- package/lib/license.ts +21 -0
- package/lib/limits.ts +31 -0
- package/lib/mcp-auth.test.ts +58 -0
- package/lib/mcp-auth.ts +65 -0
- package/lib/mcp-contract.test.ts +25 -0
- package/lib/mcp-contract.ts +210 -0
- package/lib/mcp-handler.ts +31 -0
- package/lib/mcp-url.test.ts +12 -0
- package/lib/mcp-url.ts +7 -0
- package/lib/mentions.test.ts +45 -0
- package/lib/mentions.ts +73 -0
- package/lib/note-crypto.ts +108 -0
- package/lib/note-sync.ts +201 -0
- package/lib/note-title.ts +93 -0
- package/lib/prisma.ts +193 -0
- package/lib/pro-flush.ts +292 -0
- package/lib/rate-limit.ts +57 -0
- package/lib/stripe.ts +38 -0
- package/lib/sync-worker.ts +388 -0
- package/lib/task-parser.test.ts +91 -0
- package/lib/task-parser.ts +81 -0
- package/lib/task-utils.ts +52 -0
- package/lib/use-is-electron.ts +19 -0
- package/lib/use-is-mobile.ts +22 -0
- package/lib/validation/calendar-feed.ts +31 -0
- package/lib/validation/note.ts +27 -0
- package/lib/validation/task.ts +26 -0
- package/lib/view-preferences.test.ts +54 -0
- package/lib/view-preferences.ts +28 -0
- package/lib/workspace.ts +66 -0
- package/next.config.ts +21 -0
- package/package.json +49 -3
- package/postcss.config.mjs +7 -0
- package/prisma/migrations/20260519021916_init/migration.sql +388 -0
- package/prisma/migrations/20260519061113_drop_sync_password/migration.sql +8 -0
- package/prisma/migrations/20260520065016_add_task_start_date/migration.sql +2 -0
- package/prisma/migrations/20260529010600_remove_encryption_fields/migration.sql +12 -0
- package/prisma/migrations/20260529020000_restore_encryption_salt/migration.sql +3 -0
- package/prisma/migrations/20260529030000_add_folders/migration.sql +17 -0
- package/prisma/migrations/20260605000000_deferred_fixes/migration.sql +31 -0
- package/prisma/migrations/20260605020806_add_pending_sync_to_note_and_task/migration.sql +5 -0
- package/prisma/migrations/20260605063634_add_stripe_webhook_event_sync_lock/migration.sql +14 -0
- package/prisma/migrations/20260605100000_add_prod_indexes/migration.sql +26 -0
- package/prisma/migrations/20260608081404_add_kanban_statuses/migration.sql +23 -0
- package/prisma/migrations/20260611032723_add_calendar_feeds/migration.sql +43 -0
- package/prisma/migrations/20260611040000_add_calendar_feed_color/migration.sql +2 -0
- package/prisma/migrations/20260611050000_add_task_priority/migration.sql +14 -0
- package/prisma/migrations/20260612060000_add_critical_priority/migration.sql +2 -0
- package/prisma/migrations/20260613090000_add_backup_settings/migration.sql +25 -0
- package/prisma/migrations/20260614160000_add_feedback/migration.sql +20 -0
- package/prisma/migrations/20260614210000_add_2fa/migration.sql +4 -0
- package/prisma/migrations/migration_lock.toml +3 -0
- package/prisma/schema.prisma +457 -0
- package/public/Logo_icon.svg +1 -0
- package/public/file.svg +1 -0
- package/public/globe.svg +1 -0
- package/public/icon-192.png +0 -0
- package/public/icon-512.png +0 -0
- package/public/icon.svg +4 -0
- package/public/icon_dark.svg +1 -0
- package/public/knotpad_icon.svg +1 -0
- package/public/knotpad_logo_full.svg +1 -0
- package/public/manifest.json +14 -0
- package/public/next.svg +1 -0
- package/public/sw.js +137 -0
- package/public/vercel.svg +1 -0
- package/public/window.svg +1 -0
- package/tsconfig.json +35 -0
- package/brief.js +0 -311
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
generator client {
|
|
2
|
+
provider = "prisma-client-js"
|
|
3
|
+
output = "../app/generated/prisma"
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
datasource db {
|
|
7
|
+
provider = "postgresql"
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
enum Role {
|
|
11
|
+
OWNER
|
|
12
|
+
ADMIN
|
|
13
|
+
MEMBER
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
enum TaskStatus {
|
|
17
|
+
OPEN
|
|
18
|
+
CLAIMED
|
|
19
|
+
IN_PROGRESS
|
|
20
|
+
REVIEW
|
|
21
|
+
DONE
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
enum AssigneeType {
|
|
25
|
+
HUMAN
|
|
26
|
+
AGENT
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
enum Priority {
|
|
30
|
+
CRITICAL
|
|
31
|
+
HIGH
|
|
32
|
+
MEDIUM
|
|
33
|
+
LOW
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
enum WorkspaceType {
|
|
37
|
+
PERSONAL
|
|
38
|
+
TEAM
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
enum PlanType {
|
|
42
|
+
FREE
|
|
43
|
+
PERSONAL_PRO
|
|
44
|
+
TEAM_PRO
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
enum LicenseType {
|
|
48
|
+
STANDARD
|
|
49
|
+
COMPLIMENTARY
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
enum BackupCadence {
|
|
53
|
+
DAILY
|
|
54
|
+
WEEKLY
|
|
55
|
+
MONTHLY
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
model User {
|
|
59
|
+
id String @id @default(cuid())
|
|
60
|
+
email String? @unique
|
|
61
|
+
name String?
|
|
62
|
+
passwordHash String?
|
|
63
|
+
image String?
|
|
64
|
+
isPro Boolean @default(false)
|
|
65
|
+
role Role @default(MEMBER)
|
|
66
|
+
createdAt DateTime @default(now())
|
|
67
|
+
workspaces WorkspaceMember[]
|
|
68
|
+
mcpTokens McpToken[]
|
|
69
|
+
tasksAssigned Task[] @relation("AssignedTo")
|
|
70
|
+
auditLogs AuditLog[]
|
|
71
|
+
deviceSessions DeviceSession[]
|
|
72
|
+
accounts Account[]
|
|
73
|
+
sessions Session[]
|
|
74
|
+
invitesSent InviteToken[] @relation("InvitedBy")
|
|
75
|
+
notifications Notification[]
|
|
76
|
+
passwordResetTokens PasswordResetToken[]
|
|
77
|
+
calendarFeeds CalendarFeed[]
|
|
78
|
+
feedback Feedback[]
|
|
79
|
+
twoFactorSecret String?
|
|
80
|
+
twoFactorEnabled Boolean @default(false)
|
|
81
|
+
twoFactorVerified Boolean @default(false)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
model Workspace {
|
|
85
|
+
id String @id @default(cuid())
|
|
86
|
+
name String
|
|
87
|
+
slug String @unique
|
|
88
|
+
type WorkspaceType @default(PERSONAL)
|
|
89
|
+
planType PlanType @default(FREE)
|
|
90
|
+
licenseType LicenseType @default(STANDARD)
|
|
91
|
+
isCloud Boolean @default(false) // derived: planType != FREE || licenseType == COMPLIMENTARY
|
|
92
|
+
isPro Boolean @default(false) // derived: planType != FREE || licenseType == COMPLIMENTARY
|
|
93
|
+
seatCount Int @default(1) // mirrors Stripe subscription quantity
|
|
94
|
+
stripeId String? // Stripe customer ID
|
|
95
|
+
stripeSubId String? // Stripe subscription ID
|
|
96
|
+
encryptionSalt String? // per-workspace salt for at-rest note encryption (non-sensitive)
|
|
97
|
+
createdAt DateTime @default(now())
|
|
98
|
+
members WorkspaceMember[]
|
|
99
|
+
notes Note[]
|
|
100
|
+
folders Folder[]
|
|
101
|
+
tasks Task[]
|
|
102
|
+
mcpTokens McpToken[]
|
|
103
|
+
syncState SyncState?
|
|
104
|
+
conflictLogs ConflictLog[]
|
|
105
|
+
tombstones Tombstone[]
|
|
106
|
+
invites InviteToken[]
|
|
107
|
+
kanbanStatuses KanbanStatus[]
|
|
108
|
+
backupSettings WorkspaceBackupSettings?
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
model WorkspaceBackupSettings {
|
|
112
|
+
id String @id @default(cuid())
|
|
113
|
+
workspaceId String @unique
|
|
114
|
+
scheduleEnabled Boolean @default(false)
|
|
115
|
+
scheduleCadence BackupCadence @default(WEEKLY)
|
|
116
|
+
destinationPath String?
|
|
117
|
+
includeMarkdownZip Boolean @default(false)
|
|
118
|
+
lastBackupAt DateTime?
|
|
119
|
+
lastBackupStatus String @default("idle")
|
|
120
|
+
lastBackupError String?
|
|
121
|
+
createdAt DateTime @default(now())
|
|
122
|
+
updatedAt DateTime @updatedAt
|
|
123
|
+
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
model KanbanStatus {
|
|
127
|
+
id String @id @default(cuid())
|
|
128
|
+
workspaceId String
|
|
129
|
+
key String // e.g. OPEN, CLAIMED, IN_PROGRESS, REVIEW, DONE
|
|
130
|
+
label String
|
|
131
|
+
color String // Tailwind border class, e.g. border-zinc-700
|
|
132
|
+
order Int @default(0)
|
|
133
|
+
isVisible Boolean @default(true)
|
|
134
|
+
createdAt DateTime @default(now())
|
|
135
|
+
updatedAt DateTime @updatedAt
|
|
136
|
+
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
|
137
|
+
|
|
138
|
+
@@unique([workspaceId, key])
|
|
139
|
+
@@index([workspaceId])
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
model WorkspaceMember {
|
|
143
|
+
id String @id @default(cuid())
|
|
144
|
+
userId String
|
|
145
|
+
workspaceId String
|
|
146
|
+
role Role @default(MEMBER)
|
|
147
|
+
mcpAlias String?
|
|
148
|
+
joinedAt DateTime @default(now())
|
|
149
|
+
revokedAt DateTime?
|
|
150
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
151
|
+
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
|
152
|
+
|
|
153
|
+
@@unique([userId, workspaceId])
|
|
154
|
+
@@index([userId])
|
|
155
|
+
@@index([workspaceId])
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
model Note {
|
|
159
|
+
id String @id @default(cuid())
|
|
160
|
+
title String
|
|
161
|
+
content String @db.Text
|
|
162
|
+
workspaceId String
|
|
163
|
+
folderId String?
|
|
164
|
+
isLocked Boolean @default(false)
|
|
165
|
+
cloudOnly Boolean @default(false)
|
|
166
|
+
pendingSync Boolean @default(false)
|
|
167
|
+
version Int @default(0)
|
|
168
|
+
deviceId String?
|
|
169
|
+
createdAt DateTime @default(now())
|
|
170
|
+
updatedAt DateTime @updatedAt
|
|
171
|
+
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
|
172
|
+
folder Folder? @relation(fields: [folderId], references: [id], onDelete: SetNull)
|
|
173
|
+
tasks Task[]
|
|
174
|
+
references TaskReference[]
|
|
175
|
+
|
|
176
|
+
@@index([workspaceId])
|
|
177
|
+
@@index([workspaceId, updatedAt])
|
|
178
|
+
@@index([folderId])
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
model Folder {
|
|
182
|
+
id String @id @default(cuid())
|
|
183
|
+
name String
|
|
184
|
+
workspaceId String
|
|
185
|
+
createdAt DateTime @default(now())
|
|
186
|
+
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
|
187
|
+
notes Note[]
|
|
188
|
+
|
|
189
|
+
@@index([workspaceId])
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
model Task {
|
|
193
|
+
id String @id @default(cuid())
|
|
194
|
+
title String
|
|
195
|
+
status TaskStatus @default(OPEN)
|
|
196
|
+
priority Priority @default(MEDIUM)
|
|
197
|
+
noteId String
|
|
198
|
+
workspaceId String
|
|
199
|
+
assigneeId String?
|
|
200
|
+
assigneeType AssigneeType @default(HUMAN)
|
|
201
|
+
claimedBy String?
|
|
202
|
+
claimedByAlias String?
|
|
203
|
+
claimedAt DateTime?
|
|
204
|
+
lastHeartbeat DateTime?
|
|
205
|
+
fileRefs String[]
|
|
206
|
+
startDate DateTime?
|
|
207
|
+
dueDate DateTime?
|
|
208
|
+
syncLocal Boolean @default(true) // false = cloud-only, won't be pulled to local
|
|
209
|
+
pendingSync Boolean @default(false)
|
|
210
|
+
version Int @default(0)
|
|
211
|
+
deviceId String?
|
|
212
|
+
createdAt DateTime @default(now())
|
|
213
|
+
updatedAt DateTime @updatedAt
|
|
214
|
+
note Note @relation(fields: [noteId], references: [id], onDelete: Cascade)
|
|
215
|
+
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
|
216
|
+
assignee User? @relation("AssignedTo", fields: [assigneeId], references: [id])
|
|
217
|
+
auditLogs AuditLog[]
|
|
218
|
+
references TaskReference[]
|
|
219
|
+
|
|
220
|
+
@@index([workspaceId])
|
|
221
|
+
@@index([noteId])
|
|
222
|
+
@@index([workspaceId, status])
|
|
223
|
+
@@index([workspaceId, assigneeType, status])
|
|
224
|
+
@@index([workspaceId, priority])
|
|
225
|
+
@@index([claimedBy])
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
model TaskReference {
|
|
229
|
+
id String @id @default(cuid())
|
|
230
|
+
taskId String
|
|
231
|
+
noteId String
|
|
232
|
+
snippet String @db.Text
|
|
233
|
+
task Task @relation(fields: [taskId], references: [id], onDelete: Cascade)
|
|
234
|
+
note Note @relation(fields: [noteId], references: [id], onDelete: Cascade)
|
|
235
|
+
|
|
236
|
+
@@index([taskId])
|
|
237
|
+
@@index([noteId])
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
model McpToken {
|
|
241
|
+
id String @id @default(cuid())
|
|
242
|
+
token String @unique
|
|
243
|
+
userId String
|
|
244
|
+
workspaceId String
|
|
245
|
+
alias String?
|
|
246
|
+
lastUsed DateTime?
|
|
247
|
+
revokedAt DateTime?
|
|
248
|
+
createdAt DateTime @default(now())
|
|
249
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
250
|
+
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
|
251
|
+
|
|
252
|
+
@@index([userId])
|
|
253
|
+
@@index([workspaceId])
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
model DeviceSession {
|
|
257
|
+
id String @id @default(cuid())
|
|
258
|
+
userId String
|
|
259
|
+
deviceName String
|
|
260
|
+
deviceId String @unique
|
|
261
|
+
lastActive DateTime @default(now())
|
|
262
|
+
revokedAt DateTime?
|
|
263
|
+
createdAt DateTime @default(now())
|
|
264
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
model AuditLog {
|
|
268
|
+
id String @id @default(cuid())
|
|
269
|
+
taskId String
|
|
270
|
+
userId String?
|
|
271
|
+
action String
|
|
272
|
+
detail String?
|
|
273
|
+
deviceId String?
|
|
274
|
+
createdAt DateTime @default(now())
|
|
275
|
+
task Task @relation(fields: [taskId], references: [id], onDelete: Cascade)
|
|
276
|
+
user User? @relation(fields: [userId], references: [id])
|
|
277
|
+
|
|
278
|
+
@@index([taskId])
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
model SyncState {
|
|
282
|
+
id String @id @default(cuid())
|
|
283
|
+
workspaceId String @unique
|
|
284
|
+
lastSyncedAt DateTime?
|
|
285
|
+
localVersion Int @default(0)
|
|
286
|
+
cloudVersion Int @default(0)
|
|
287
|
+
noteSnapshots String? @db.Text
|
|
288
|
+
snapshotVersion Int @default(0)
|
|
289
|
+
/// Distributed sync lock. Set to now() when a flush starts; cleared when done.
|
|
290
|
+
/// Any instance that finds a lock < 120s old will skip the flush to avoid races.
|
|
291
|
+
syncLockedAt DateTime?
|
|
292
|
+
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
model ConflictLog {
|
|
296
|
+
id String @id @default(cuid())
|
|
297
|
+
workspaceId String
|
|
298
|
+
entityType String
|
|
299
|
+
entityId String
|
|
300
|
+
localValue String @db.Text
|
|
301
|
+
cloudValue String @db.Text
|
|
302
|
+
resolvedBy String?
|
|
303
|
+
resolvedAt DateTime?
|
|
304
|
+
createdAt DateTime @default(now())
|
|
305
|
+
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
|
306
|
+
|
|
307
|
+
@@unique([workspaceId, entityType, entityId])
|
|
308
|
+
@@index([workspaceId, resolvedAt])
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
model Tombstone {
|
|
312
|
+
id String @id @default(cuid())
|
|
313
|
+
workspaceId String
|
|
314
|
+
entityType String
|
|
315
|
+
entityId String
|
|
316
|
+
deletedAt DateTime @default(now())
|
|
317
|
+
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
|
318
|
+
|
|
319
|
+
@@index([workspaceId, entityType, entityId])
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
model Account {
|
|
323
|
+
id String @id @default(cuid())
|
|
324
|
+
userId String
|
|
325
|
+
type String
|
|
326
|
+
provider String
|
|
327
|
+
providerAccountId String
|
|
328
|
+
refresh_token String? @db.Text
|
|
329
|
+
access_token String? @db.Text
|
|
330
|
+
expires_at Int?
|
|
331
|
+
token_type String?
|
|
332
|
+
scope String?
|
|
333
|
+
id_token String? @db.Text
|
|
334
|
+
session_state String?
|
|
335
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
336
|
+
|
|
337
|
+
@@unique([provider, providerAccountId])
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
model Session {
|
|
341
|
+
id String @id @default(cuid())
|
|
342
|
+
sessionToken String @unique
|
|
343
|
+
userId String
|
|
344
|
+
expires DateTime
|
|
345
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
model VerificationToken {
|
|
349
|
+
identifier String
|
|
350
|
+
token String @unique
|
|
351
|
+
expires DateTime
|
|
352
|
+
|
|
353
|
+
@@unique([identifier, token])
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
model PasswordResetToken {
|
|
357
|
+
id String @id @default(cuid())
|
|
358
|
+
token String @unique @default(cuid())
|
|
359
|
+
userId String
|
|
360
|
+
expiresAt DateTime
|
|
361
|
+
usedAt DateTime?
|
|
362
|
+
createdAt DateTime @default(now())
|
|
363
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
model InviteToken {
|
|
367
|
+
id String @id @default(cuid())
|
|
368
|
+
token String @unique @default(cuid())
|
|
369
|
+
email String
|
|
370
|
+
workspaceId String
|
|
371
|
+
role Role @default(MEMBER)
|
|
372
|
+
invitedById String
|
|
373
|
+
expiresAt DateTime
|
|
374
|
+
acceptedAt DateTime?
|
|
375
|
+
createdAt DateTime @default(now())
|
|
376
|
+
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
|
377
|
+
invitedBy User @relation("InvitedBy", fields: [invitedById], references: [id])
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
model Notification {
|
|
381
|
+
id String @id @default(cuid())
|
|
382
|
+
userId String
|
|
383
|
+
type String
|
|
384
|
+
title String
|
|
385
|
+
body String?
|
|
386
|
+
read Boolean @default(false)
|
|
387
|
+
taskId String?
|
|
388
|
+
noteId String?
|
|
389
|
+
createdAt DateTime @default(now())
|
|
390
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
391
|
+
|
|
392
|
+
@@index([userId])
|
|
393
|
+
@@index([userId, read])
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/// A user's personal read-only calendar subscription (Google/Apple "secret
|
|
397
|
+
/// address in iCal format"). The URL is a credential — anyone with it can read
|
|
398
|
+
/// the calendar — so it's encrypted at rest with a per-row salt.
|
|
399
|
+
model CalendarFeed {
|
|
400
|
+
id String @id @default(cuid())
|
|
401
|
+
userId String
|
|
402
|
+
label String
|
|
403
|
+
encryptedUrl String @db.Text
|
|
404
|
+
urlSalt String
|
|
405
|
+
color String @default("sky")
|
|
406
|
+
enabled Boolean @default(true)
|
|
407
|
+
lastFetchedAt DateTime?
|
|
408
|
+
lastError String?
|
|
409
|
+
createdAt DateTime @default(now())
|
|
410
|
+
updatedAt DateTime @updatedAt
|
|
411
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
412
|
+
events CalendarFeedEvent[]
|
|
413
|
+
|
|
414
|
+
@@index([userId])
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
/// Cached events parsed from a CalendarFeed's .ics source, including expanded
|
|
418
|
+
/// recurring-event occurrences within the sync window.
|
|
419
|
+
model CalendarFeedEvent {
|
|
420
|
+
id String @id @default(cuid())
|
|
421
|
+
feedId String
|
|
422
|
+
uid String
|
|
423
|
+
title String
|
|
424
|
+
start DateTime
|
|
425
|
+
end DateTime
|
|
426
|
+
allDay Boolean @default(false)
|
|
427
|
+
feed CalendarFeed @relation(fields: [feedId], references: [id], onDelete: Cascade)
|
|
428
|
+
|
|
429
|
+
@@unique([feedId, uid])
|
|
430
|
+
@@index([feedId, start])
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
/// Idempotency log for Stripe webhook events.
|
|
434
|
+
/// Stripe retries events on non-2xx responses for up to 3 days; storing the
|
|
435
|
+
/// event ID here ensures each event is processed exactly once.
|
|
436
|
+
model StripeWebhookEvent {
|
|
437
|
+
id String @id // Stripe event ID (evt_...)
|
|
438
|
+
type String // e.g. "checkout.session.completed"
|
|
439
|
+
processedAt DateTime @default(now())
|
|
440
|
+
|
|
441
|
+
@@index([processedAt])
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
|
|
445
|
+
/// User feedback and issue reports
|
|
446
|
+
model Feedback {
|
|
447
|
+
id String @id @default(cuid())
|
|
448
|
+
userId String
|
|
449
|
+
type String // "feedback", "bug", "feature_request"
|
|
450
|
+
subject String
|
|
451
|
+
message String @db.Text
|
|
452
|
+
createdAt DateTime @default(now())
|
|
453
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
454
|
+
|
|
455
|
+
@@index([userId])
|
|
456
|
+
@@index([createdAt])
|
|
457
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="500" zoomAndPan="magnify" viewBox="0 0 375 374.999991" height="500" preserveAspectRatio="xMidYMid meet" version="1.0"><defs><filter x="0%" y="0%" width="100%" height="100%" id="75d4a94d5c"><feColorMatrix values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0" color-interpolation-filters="sRGB"/></filter><filter x="0%" y="0%" width="100%" height="100%" id="1e26bff2d7"><feColorMatrix values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0.2126 0.7152 0.0722 0 0" color-interpolation-filters="sRGB"/></filter><mask id="6cd3f78027"><g filter="url(#75d4a94d5c)"><g filter="url(#1e26bff2d7)" transform="matrix(0.375, 0, 0, 0.375, 0.0000045, 0)"><image x="0" y="0" width="1000" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+gAAAPoCAAAAABoyIs4AAAAAmJLR0QA/4ePzL8AACAASURBVHic7d3bb9T1/u/x79q/fYEgoiwWa6G4QNopJe0OJG0CCU1oAlcCKgcREQERQUVE8ICCeOCkIIIiooCIgIjIyQN4VZKSlKTslKTslLTMTCssUZaIKCLI3eyLhUsOPcy03++8Pofn4w8gr5I+8/3OxbsTBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwDI3qQcAjvlf6gGNGXR8tHoCgKgNT6UqCtQjAERreCqVSq3top4BIErDU6lUKvXLbPUOABH6T+ipVN2d6iUAIvNH6KlUWUy9BUBE/gw9lVrZSb0GQCSuDD314zT1HABRuCr0VKpmoHoQgPBdE3oqtbOHehKAsF0Xeur3Re3VowCE6/rQU6nvHlSvAhCqxkJPpaqK1LsAhKjx0FOpTd3UywCEpqnQU+fnqqcBCEuToadSDSPV4wCEo5nQU6lyDlgBJzQbeir1Xmf1QABt10LoqZ9nqhcCaLOWQk+l4oPVGwGbGPk341oWK9vLASuQNktDD4Kh8eUd1RsAtEHLr+6pVCqV+uER9VAArZdm6KlUNQesQDqsfXUPgiAI+lZ81l29AbCA3aEHwb3xBRywAlZK+9U9lUqlUt+OU+8FTGf7Ez0Igu5bKzlgBZrlQOhB0L9qY1f1BsBkToQeBJOSz6snAMhMZp/RL6u/Rz0bMJYjT/QgCHrtKc9XbwAM5U7oQTCo9l0OWIHGuBR6EDyenKGeAJjIrdCDW1bVcsAKXMex0IMgv+zLXuoNgGmcCz0Ihtcv44AVuIqDoQfBs4mH1RMAozgZevD3D6r7qzcABnEz9CDoW7mNA1bgD66GHgRj46+0U28ADOFu6MENL8fHqjcAZnA49CC4fVtlX/UGwAROhx4E/as3cMAKuB56EExOPKueAMg5H3pw07LEXeoNgJj7oQdB7hdlHLDCbz6EHgSDa1d1Um8AhPwIPQhmNExXTwB0fAk96Ly6dpB6A6DiTehBkF++hwNWeMqj0IPgnvrXO6g3AApehR4Ec5KT1BMAAc9CD/6xsYoDVvjHt9CDoKhyazf1BiDL/As9CMYl53PACr/4GHrQfsGxMeoNQDZ5GXoQ/HN7BQes8IinoQfBwOr1XdQbgGzxNvQgmJJ8Wj0ByBKPQw86LT82VL0ByAqfQw+CvL1lMfUGIAv8Dj0IBsff4oAV7vM99CCYmXxMPQGIGqEHXdbUcMAKxxF6EAQF5bt6qDcAUSL0IAiCYOTxJRywwmGEftkLiQnqCUBkCP0P3TZVFak3ABEh9D8VVW3hgBVuIvQrjU/MU08AokDoV+mw6JvR6g1A+Aj9Gj13VBSoNwBhI/TrDKx5nwNWOIbQGzEtMUs9AQgVoTfm5hXxweoNQIgIvXGxsn0csMIdhN6UO+MrOqo3ACEh9KbNqp+qngCEg9Cb8be1NQPVG4AwEHqzCip2cMAKBxB6C0bXLWyv3gC0FaG3pN2L8fHqDUAbEXrLbttSyQEr7Ebo6ehftamregPQBoSengn1L6gnAK1H6Gm6cUnDCPUGoLUIPW137C7ngBWWIvQMDKpZ01m9AWgNQs/IY8kn1ROAViD0zNzyNgessBChZypW9lUv9QYgQ4SeuWH1yzlghV0IvTWeTk5RTwAyQeit0nV9NQessAiht1Lfiu3d1RuAdP1v9QB7jRn+xtKL6hFo3G3Cv/j3f/mtSNPwlCW+Haf+r0LjnhT+VvRW//CN4dW9Lbpvreyr3gCkgdDbpn/1hxywwnyE3lYPJeeoJwAtIfQ26/h68m71BqB5hB6CnM/L89UbgOYQeigG1a7mgBUGI/SQTE88oZ4ANInQw9L5ndpB6g1AEwg9PPnlX3DACjMRepjuql/aQb0BaAShh+u5+snqCcD1CD1kf99Q3V+9AbgWoYeub+UnHLDCMIQegfuPvdxOvQG4EqFHof0rx+5TbwCuQOjR+OenHLDCIIQelf7VH3RRbwAuI/ToPFz/jHoC8B+EHqGb3ogPV28AgoDQIxb7sowDVhiA0CM2uHZVJ/UGgNAjN6P+cfUEeI/Qo/fXdzlghRihZ0N++Z4e6g3wGqFnxz3HX+OAFTqEni3PJyapJ8BfhJ413TZWccAKEULPoqLKj7upN8BPhJ5VDyTnc8AKAULPrvYL6u5Vb4CHCD3benxWUaDeAO8QevYNrFnHASuyi9AVHknOVk+AXwhdotObx4aqN8AnhC6St7cspt4AfxC6zOD4Sg5YkSWELvRU8lH1BHiC0JW6vFfDASuygdC1Csp3csCK6BG62qi6xe3VG+A8QpdrNzfxoHoDXEfoBrh1c1WRegPcRuhGKKrazAErIkTohngwMVc9AQ4jdFN0WNwwSr0BziJ0c9yxkwNWRITQTTKw5r3O6g1wEqGb5dH6p9QT4CJCN8zNK+OD1RvgHkI3TqxsHwesCBmhG+jO+Jsd1RvgFkI30uz6R9QT4BRCN9Pf1tUMVG+AQwjdVAUVn3VXb4AzCN1c9yYWcsCKcBC6wdq9GH9AvQFuIHSj3fZxJQesCAGhG65/1Udd1RtgP0I33sT659UTYD1CN9+Nr9WPUG+A5QjdBr12l+erN8BqhG6HQbXvcsCK1iN0WzyefFI9AfYidGvc8nYtB6xoJUK3SH7Zl73UG2AnQrfK8Po3OGBFKxC6ZZ5JPqyeAAsRum26flDNASsyRej26VvxKQesyAyh2+i++Cvt1BtgFUK30g0vx+9Xb4BNCN1St39S2Ve9AfYgdGv1r97AASvSROgWm5x8Tj0BliB0m3VcmrhLvQFWIHS75X7BASvSQOi2G1T7Tif1BhiP0O33RMN09QSYjtAd0Hl17SD1BpiN0J2QX/45B6xoBqE74u76pR3UG2AuQnfGc8mH1BNgLEJ3xz8+rO6v3gBDEbpL+lZ+0k29AUYidLfcn3yJA1Zcj9Ad0/7VY2PUG2AeQnfOP7dXcMCKaxC6gwZWr++i3gCzELqTptQ/o54AoxC6m256Iz5MvQEGIXRXxb4q44AVfyB0dw2ufZsDVvwHobvsyfrH1BNgBkJ32l/X1HDAioDQnVdQvruHegP0CN15I44v4YDVe4TugRcSE9UTIEboPuj2URUHrH4jdD8UVW7hgNVnhO6L8YkX1ROgQ+je6LDwm9HqDVAhdI/03FFRoN4ADUL3ysCatRyweonQPTM1OUs9AQKE7ptOK+ruVG9A1hG6f3rvK4upNyDLCN1Hg+MrOqo3IKsI3U+zGqapJyCbCN1TXd6vGajegOwhdG8VVOzkgNUbhO6xUXWL2qs3IDsI3Wft5iXGqzcgKwjdb7duqSpSb0AWELrviqo2dVVvQOQIHRPq56onIGqEjuDGxQ0j1RsQLUJHEAR37CrngNVphI4gCIJgUM17ndUbEB1Cx2WP1s9UT0BkCB1/uPmt+GD1BkSE0PGnWNleDljdROi40tD4cg5YXUTouNrTyUfUExA+Qsc1uq6r5oDVOYSO6/St2N5dvQHhInQ0Ykx8AQesTiF0NOaG+cfGqTcgRISOxnXfWskBqzsIHU3pX7WRA1ZXEDqaNik5Rz0B4SB0NKPj68l71BsQBkJHs3L2lOerN6DtCB0tGFS7mgNW6xE6WjQ9OUM9AW1E6GjZLatqOWC1G6EjHfllX/RSb0AbEPo1ZuxTLzDUXfXLOqg3oNUI/RqJYUMS6g2GerZ+snoCWovQr7M/76lf1BvM9PcN1f3VG9A6hN6It3PeU08wVN/KbRywWonQG3P28cID6g2GGht/uZ16AzJH6I07WjrqG/UGM93wSnysegMyRuhN2d1r7m/qDWa6fVtlX/UGZIjQm/Zazmb1BEP1r97AAatdCL0ZpycWH1ZvMNTkxLPqCcgEoTfrcPGD36k3mOmmZYnh6g1IH6G34OO8RZfUG8yU+2UZB6zWIPSWXJyfv1O9wVCDa1d1Um9Aegi9ZSfuLTmq3mCoGfXT1ROQFkJPx8HCaT+qN5jpr6trB6k3IA2Enp51OSvVEwyVX76HA1bzEXqazs/O+1q9wVD31L/OAavpCD1tiaEcsDZhTnKSegKaR+gZ2J83mwPWRv1jYxUHrEYj9IysjK1VTzBUUeXWbuoNaBqhZ+bMo4UH1RsMNS45nwNWYxF6po6WjD6u3mCm9gvqxqg3oAmEnrldd7x4Qb3BTD22V3DAaiZCb43FsS3qCYYaWL2ui3oDGkHorXJqAgesTXgk+bR6Aq5H6K10uHji9+oNZuq0/NhQ9QZci9BbbXNsiXqCofL2lsXUG3A1Qm+9i/N67lZvMNTg+FscsBqF0NvixKhSDlgbNzP5qHoCrkDobXOg8LEz6g1m6vJeDQes5iD0tno/9231BEMVlO/qod6Aywi9zc49lbdfvcFQI48vbq/egCAICD0UiSHD4uoNhpqbmKCegCAg9JDs6/30OfUGM926qapIvQGEHpoVuevVEwxVVLWFA1Y5Qg/LmakcsDZhfGKeeoL3CD08R0vGnFBvMFOHRd+MUm/wHKGHaUf+SxywNqrnzs7qCX4j9FBdWhjbqt4AXI/QQ3Zq/AAOWGEcQg/doeJJp9QbgKsRegQ2xV5XTwCuQuhRuPBCzz3qDcAVCD0aJ0ZywAqDEHpUDhRO/0m9AbiM0KOzJmeVegLwH4QeoXMz+3DACiMQeqTqhgznG1hhAEKP2N68Z39VbwAIPXLLczaoJ8B7hB69M1P6ccAKLULPhiMlY/+l3gCvEXp2bO/98kX1BniM0LPk0oLe29Qb4C9Cz5qT4wYcUW+Arwg9iw71m/xv9Qb4idCzamPuMvUEeInQs+vCnJwv1BvgIULPtoZ7SuvUG+AdQs++A32eOKveAM8QusK7vVarJ8AvhC5xbkafA+oN8Amhi9SV3p1Ub4A/CF3my9ic8+oN8AWhCy3L/VA9AZ4gdKXTD/c7pN4ALxC61pEB475Vb4AHCF1tW96rv6s3wHmELnfplbzt6g1wHaEb4ORYDlgRLUI3wqF+U35Qb4DLCN0QG2JvqCfAYYRuivPP5Xyl3gBnEbo5Gu4awgErokHoJtnf58mf1RvgJEI3yzu5a9QT4CJCN8zZ6RywInyEbpy60hH16g1wDaEb6PPc5zlgRagI3UhLcz9ST4BTCN1Mpx8q5oAV4SF0Ux0e8MBJ9QY4g9DN9UnvhRywIhyEbrCLL+V9pt4ANxC60U7eV8IBK0JA6IY72G/qafUG2I/Qjbc+9031BFiP0M13/pmcfeoNsByh26Bh2JCEegOsRuh22J/31C/qDbAYodvi7Zz31BNgL0K3xtnHCzlgRSsRukWOlo76Rr0BdiJ0q+zuNfc39QbYiNAt81rOZvUEWIjQbXN6YvFh9QZYh9Dtc7j4we/UG2AZQrfRx3mLLqk3wCqEbqWL8/N3qjfAJoRuqRP3lhxVb4A9CN1aBwun/ajeAFsQusXW5axUT4AlCN1m52fnfa3eACsQut0SQzlgRRoI3Xb782ZzwIqWELr9VsbWqifAdITugDOPFh5Ub4DZCN0JR0tGH1dvgMkI3RG77njxgnoDzEXozlgc26KeAGMRujtOTeCAFU0gdJccLp74vXoDjETobtkcW6KeABMRumMuzuu5W70B5iF055wYVcoBK65B6A46UPjYGfUGmIXQnfR+7lvqCTAKobvp3Ky8/eoNMAihuyoxZFhcvQHGIHR37ev99Dn1BhiC0F22Ine9egLMQOhOOzOVA1YEAaE772jJmBPqDdAjdOftyH+JA1bvEbr7Li2MbVVvgBih++DU+AEcsPqN0P1wqHjSKfUGCBG6LzbFXldPgA6he+PCCz33qDdAhdA9cmIkB6y+InSvHCic/pN6AxQI3TNrclapJ0CA0H1zbmYfDlj9Q+j+qRsynG9g9Q2h+2hv3rO/qjcgqwjdT8tzNqgnIJsI3VNnpvTjgNUjhO6tIyVj/6XegGwhdI9t7/3yRfUGZAeh++zSgt7b1BuQFYTut5PjBhxRb0AWELrvDvWb/G/1BkSO0LExd5l6AqJG6AguzMn5Qr0B0SJ0BEHQcE9pnXoDokToCIIgCA70eeKsegOiQ+i47N1eq9UTEBlCxx/OzehzQL0BESF0/Kmu9O6kegMiQei40pexOefVGxABQsfVluV+qJ6A8BE6rnH64X6H1BsQNkLHdY4MGPetegPCRehoxLa8V39Xb0CYCB2NufRK3nb1BoSI0NG4k2M5YHUIoaMph/pN+UG9ASEhdDRtQ+wN9QSEg9DRjPPP5Xyl3oAwEDqa1XDXEA5YHUDoaMH+Pk/+rN6AtiJ0tOid3DXqCWgjQkfLzk7ngNVyhI501JWOqFdvQBsQOtLzee7zHLDai9CRrqW5H6knoLUIHWk7/VAxB6yWInRk4PCAB06qN6A1CB0Z+aT3Qg5YLUToyMzFl/I+U29AxggdmTp5XwkHrLYhdGTuYL+pp9UbkBFCR2usz31TPQGZIHS0yvlncvapNyB9hI5Wahg2JKHegHQROlptf95Tv6g3ID2EjjZ4O+c99QSkhdDRFmcfL+SA1QaEjrY5WjrqG/UGtIjQ0Va7e839Tb0BLSB0tN1rOZvVE9A8QkcITk8sPqzegOYQOkJxuPjB79Qb0DRCl7pRPSBEH+ctuqTe8F8p9QDTELrU/6kZpJ4Qnovz83eqN/zhL+oBpiF0rYLyXT3UG8Jz4t6So+oNaBShq408vri9ekN4DhZO+1G9AY0gdL25iQnqCSFal7NSPQHXI3QD3Lqpqki9ITznZ+d9rd6AaxG6EYqqNndTbwhPYigHrKYhdEM8mJinnhCi/XmzOWA1CqGbosOib0apN4RoZWytegKuQOjm6LmzokC9ITxnHi08qN6A/yJ0kwyseb+LekN4jpaMPq7egMsI3SzTErPUE0K0644XL6g3IAgCQjfOzSvig9UbQrQ4tkU9AUFA6AaKle2LqTeE59QEDlhNQOgGujO+oqN6Q3gOF0/8Xr0BhG6kWfVT1RNCtDm2RD3Be4Rupr+trRmo3hCei/N67uZwVIrQTVVQscOlA9ZRP6kn+I3QzTW6bqFDB6yQInSDtXsxPl69AW4gdKPdtsWlA1boELrhiqo2dVVvgP0I3XgT6l9QT4D1CN18Ny5pGKneAMsRug3u2FXu0AErBAjdDoNq1nRWb4DFCN0Wj9XPVE+AvQjdGje/5dQBK7KK0C0SK9vbS70BdiJ0qwytX+7QASuyh9At83RyinoCLETotum6vtqhA1ZkCaHbp2/F9u7qDbAModtoTHwBB6zIBKFb6Yb5x8apN8AmhG6p7lsrOWBF2gjdWv2rNnLAijQRusUmJeeoJ8AShG6zjq8n71FvgBUI3W45e8rz1RtgAUK33aDadzlgRUsI3X6PJ2eoJ8B0hO6AW1bVcsCKZhG6E/LLvuSAFc0gdEcMr1/GASuaROjOeDbxsHoCjEXo7vj7B9X91RtgKEJ3Sd/KbRywojGE7pax8VfaqTfAQITumBtejo9Vb4B5CN05t2+r7KveANMQuoP6V2/ggBVXIXQnTU4+p54AoxC6mzouTdyl3gCDELqrcr/ggBX/RejuGlT7Tif1BhiC0F32RMN09QSYgdCd1nl17SD1BpiA0B2XX/45B6wgdPfdXb+0g3oD1AjdA88lH1JPgBih++AfH3LA6jlC90Pfyk84YPUZofvi/mMvccDqL0L3RvtXj92n3gAVQvfIPz+t4IDVU4TulYHV67uoN0CB0D0zpf4Z9QQIELpvbnojPky9AVlH6P6JfVXGAatvCN1Hg2vf5oDVL4TupyfrH1dPQDYRuqf++m4NB6weIXRvFZTv7qHegGwhdI+NOP4aB6yeIHSvPZ+YqJ6ArCB0v3X7qIoDVh8Quu+KKj/upt6AyBE6HkjM54DVdYSOoMOCunvVGxAtQkcQBD0+qyhQb0CUCB1BEATBwJp1HLA6jNBx2SPJ2eoJiAyh4w+d3jw2VL0BESF0/Clvb1lMvQGRIHRcaXB8JQesLiJ0XO2p5KPqCQgfoeMaXd7jgNU9hI7rFJTv4oDVMYSORow8vri9egPCROho1NzEBPUEhIjQ0bhbN1UVqTcgNISOphRVbeaA1RWEjqY9mJinnoBwEDqa0WHRN6PUGxAGQkezeu7kgNUFhI4WDKx5nwNW6xE6WjQtMUs9AW1E6GjZzSvig9Ub0CaEjnTEyvZxwGozQkd67oyv6KjegFYjdKRrVv1U9QS0FqEjbX9bWzNQvQGtQ+jIQEHFDg5YrUToyMjouoUcsFqI0JGZdi/Gx6s3IGOEjkzdtoUDVusQOjJXVLWpq3oDMkLoaI0J9S+oJyAThI5WuXFJw0j1BqSP0NFKd+wq54DVGoSOVhtUs6azegPSQ+hog8fqZ6onIC2Ejra4+S0OWK1A6GibWNneXuoNaBGho62G1i/ngNV0hI62ezo5RT0BzSN0hKDr+moOWI1G6AhF34rt3dUb0DRCR0jGxBdwwGosQkdYbph/bJx6A5pA6AhP962VHLCaidARpv5VGzlgNRGhI1yTknPUE3A9QkfIOr6evEe9AdcidIQuZ095vnoDrkboiMCg2nc5YDUKoSMSjydnqCfgCoSOaNyyqpYDVnMQOqKSX/YlB6ymIHREZ3j9Mg5YzUDoiNKziYfVExAEhI6I/f2D6v7qDSB0RK5v5TYOWOUIHZEbG3+lnXqD7wgd0bvh5fhY9QbPETqy4fZtlX3VG7xG6MiO/tUbOGDVIXRky+Tkc+oJ/iJ0ZE3HpYm71Bt8RejIotwvOGDVIHRk1aDadzqpN/iI0JFlTzRMV0/wEKEj2zqvrh2k3uAdQkf25Zd/zgFrdhE6FO6uX9pBvcErhA6N55IPqSf4hNAh8o8POWDNHkKHTN/KTzhgzRJCh9D9x17igDUrCB1K7V89dp96gxcIHVr//LSCA9boETrUBlav76Le4DxCh96U+mfUE1xH6DDATW/Eh6k3uI3QYYTYV2UcsEaI0GGIwbVvc8AaGUKHMZ6sf1w9wVmEDnP89d0aDlijQegwSUH57h7qDU4idJhlxPHXOGANH6HDNM8nJqonuIfQYZxuH1VxwBoyQpe6oB5gqKLKT29t0z+QCmmIMwhd6v8VHlBPMNR98fltOWD9S2hDHEHoWkdLR32j3mCmDgvq7lVvcAihq+3uNe839QYz9fisokC9wRmErrckb4t6gqEG1qzjgDUchG6AUxOKD6s3GOqR5Gz1BDcQuhEOF0/4Xr3BTJ3ePDZUvcEFhG6ILbHFl9QbzJS3tyym3mA/QjfFxRfzd6k3GGpwfCUHrG1E6OY4MbrkqHqDoZ5KPqqeYDlCN8nBwkfPqDeYqct7HLC2CaGbZW3uW+oJhioo38UBa+sRumHOzcrbr95gqJHHF7dXb7AWoRsnMWToMfUGQ81NTFBPsBWhG+jr/KfPqTeY6dZNVUXqDXYidCOtyF2nnmCooqrN3dQbbEToZjozrfCgeoOhHkzMU0+wEKGb6mjJmBPqDWbqsOibUeoN1iF0c+3In89foGlUz50csGaI0A12aVFsq3qDoQbWvM8BayYI3Winxg/ggLVx0xKz1BNsQuiGO1Q86ZR6g5luXhEfrN5gD0I33qbY6+oJhoqV7eOANU2Ebr4LL/Tco95gqDvjKzqqN9iB0G1wYmQpB6yNm1U/VT3BCoRuhwOF039SbzDT39bWDFRvsACh22JNzir1BEMVVOzggLUlhG6NczP7cMDauNF1CzlgbR6hW6RuyPCEeoOZ2r0YH6/eYDZCt8revGd/VW8w021bOGBtDqFbZnnOBvUEQxVVbeqq3mAuQrfNmSn9OGBt3IT6F9QTjEXo9jlSMvZf6g1munFJw0j1BkMRuo22937lonqDme7YVc4Ba2MI3UqXXu29Tb3BUINq1nRWbzAQoVvq5LgBR9QbDPVY/Uz1BPMQurUO9Zv8g3qDmW5+q3aAeoNpCN1iG3OWqScYKv9+9QLTELrNLszJ+VK9AVYgdLs13F1ap94ACxC67Q70mXFWvQHGI3T7rY6tVk+A6QjdAWdn9Dmg3gCzEboT6krvqVdvgMkI3RFf5M45r94AcxG6M5blblRPgLEI3R2nJ/c7pN4AQxG6S44MGHdSvQFGInS3bIst+F29AQYidMdcejlvu3oDzEPozjk5toQDVlyD0B10sN8jp9UbYBZCd9IHucvVE2AUQnfT+Wdz9qo3wCCE7qqG4UM4YMUfCN1d+/vM/Fm9AYYgdJetyn1PPQFmIHSnnX28kANWBITuvKOlIxvUG6BH6M7bkzP3N/UGqBG6B17L2aSeADFC98HpScUcsPqN0P1weMD479QbIETovtiat+iSegNkCN0bF+fn71RvgAqhe+TEvSVH1RugQeheOVg47Uf1BigQumfW5axQT4AAofvm/NN5X6s3IOsI3T+JoUMS6g3IMkL30f68Wb+oNyCrCN1Pb8XWqicgmwjdU2ceLTyo3oDsIXRvHS0ZfVy9AdlC6B7bdceLF9QbkB2E7rXFsS3qCcgKQvfbqQnFh9UbkAWE7rvDxRO/V29A5Agdm2NL1BMQNUJHcHFez93qDYgWoSMIghOjSjlgdRqhIwiCIDhQ+NgZ9QZEh9Bx2fu5b6snIDKEjj+ceypvv3oDIkLo+FNiyLC4egMiQei40r7ez5xTb0AECB1XezN3vXoCwkfouMaZqf04YHUOoeM6R0ruO6HegHAROhrxWf5LF9UbECZCR2MuLcz9RL0BISJ0NO7UAwM4YHUHoaMph4of+rd6A0JC6GjaR7lL1RMQDkJHMy48n/O5egPCQOhoVsOI0jr1BrQdoaMFB/pM/0m9AW1F6GjRmpx31BPQRoSOlp17sg8HrHYjdKSjbshdSfUGtAGhIz1fxZ77Vb0BrUboSNcbMv8JNAAABtJJREFUORvUE9BahI60nZnS75B6A1qH0JGBIwPu/1a9Aa1B6MjIp3mv/K7egMwROjJz6dW8T9UbkDFCR6ZO3j/giHoDMkToyNyhfg//oN6AjBA6WuPDnDfUE5AJQkerXHgu50v1BqSP0NFKDXcP4YDVGoSOVtvf58mf1RuQHkJHG7yT+656AtJC6GiLs0/0OaDegDQQOtqmrnREvXoDWkToaKvPc58/r96AFhA62m5p7kfqCWgeoSMEpx8q5oDVaISOUBwe8MBJ9QY0jdARkk96L+SA1ViEjrBcfCnvM/UGNIHQEZ6T95VwwGomQkeYDvZ75LR6AxpB6AjXB7lvqifgeoSOkJ1/Jm+fegOuRegIXWLYkIR6A65G6IjA/rynflFvwJUIHZF4O+d99QRcgdARjbOPFXLAag5CR1SOlo76Rr0BlxE6orO719zf1BsQBAGhI1qv5WxWT0AQEDoidnpi8WH1BhA6Ine4+MHv1RtA6Ijcx7HFl9QbfEfoiN7FF/N3qjd4jtCRDSfuLTmq3uA1Qkd2HCx89Ef1Bo8ROrJlbc5K9QR/ETqy5vzsvP3qDb4idGRRYsjQY+oNfiJ0ZNXX+bPPqTf4iNCRZStz16kneIjQkW1nphUeVG/wDqEj+46W3HtcvcEzhA6FnXfMv6De4BVCh8ai2MfqCT4hdIicenAAB6xZQ+iQOVQ86ZR6gy8IHUKbYq+pJ3iC0KF0YW7PPeoNXiB0aJ0YWcoBa/QIHWoHCh//Sb3BeYQOvfdyVqknuI7QYYBzMzlgjRahwwiJIcP5BtYIEToMsTfvmV/VG9xF6DDGmzkfqCc4i9BhjjOP9OOANRqEDpMcKbnvX+oNTiJ0mOWz3i9fVG9wEKHDMJcW5H6i3uAeQodxTj0w4Ih6g2sIHQY61G/yv9Ub3ELoMNLG3KXqCU4hdJjpwvM5X6g3OITQYaqGe0rr1BucQegw14E+T5xVb3AEocNk7/ZarZ7gBkKH0c7N6HNAvcEFhA7D1ZXenVRvsB+hw3hfxuacV2+wHaHDAstyP1RPsByhwwanH+53SL3Ban9RDwDSdP/S29UT0pJ/TL2gETzRYYttea/+rt5gLUKHNS69krddvcFWhA6LnBzLAWvrEDqscqjflB/UG2xE6LDMhthy9QQLETpsc/7ZnK/UG6xD6LBPw11DOGDNDKHDRvv7zPxZvcEqhA47rcpdo55gE0KHpc5O54A1fYQOa9WVjmhQb7AFocNin+e88Jt6gx0IHVZ7PWeTeoIVCB12Oz2pmAPWlhE6bHd4wPjv1BuMR+iw39a8hZfUGwxH6HDAxZdiO9QbzEbocMLJMSVH1RtMRuhwxMHCqT+qN5iL0OGM9Tkr1BOMRehwx/mn8/apNxiK0OGSxLAhCfUGIxE63LI/b9Yv6g0GInS45q2c99UTzEPocM7ZxwoPqjeYhtDhoKMlo79RbzALocNJu3rNu6DeYBJCh6OWxLaoJxiE0OGqUxOKD6s3GIPQ4a7DxRO+V28wBKHDZVtiSzhgDQJCh+Muzsvfpd5gAkKH406M5oCV0OGBg4WPnVFvUCN0eOD93LfUE8QIHT44Nytvv3qDFKHDD4khQ+PqDUKEDl983fvpc+oNMoQOf6zIXa+eoELo8MiZqb4esBI6vHK0ZMwJ9QYFQodnduTP54AV8EC3j1MR6q3+8RrDEx3+OTV+gG8HrIQOHx0qnnRKvSGrCB1+2hR7XT0BQBb02MNndMB5J0aU1qk3ZAuhw2MH+kz/Sb0BQPQ6ve3Fqzvgu/wyD0Ln1R2+qxtyF9/ACvjgmXOOP9EBBEHQ5QNCBzzQt8Ll0PmMDgRBEARHSsb+S70BQPTavXzB1Sc6gD91/4TQAQ/0ryZ0wAOT/03ogPs6LCV0wAO9viB0wAODagkd8MATPxE64L7Oqwkd8EB+OaEDHrg7SeiAB+b8SuiA+7p+SOiAB/pWEjrggfu/JXTAfe1fvUjogPu6byd0wAMD0zxgJXTAalN+IHTAfR3fIHTAA72+InTAA4PjhA544MmzhA64r/MaQgc8UNDMASuhA84YUU/ogAdeOE/ogPu6fkTogAeKGjtgJXTANeNPEjrgvvYLfyd0wH09dhA64IGBNYQOeGDqaUIH3NdxBaEDHojtI3TAA5cPWAkdcNusnwkdcF+X9wkd8EBBBaEDHvgf9QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJCp/w/Esk5STUt/PwAAAABJRU5ErkJggg==" height="1000" preserveAspectRatio="xMidYMid meet"/></g></g></mask></defs><g mask="url(#6cd3f78027)"><g transform="matrix(0.375, 0, 0, 0.375, 0.0000045, 0)"><image x="0" y="0" width="1000" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+gAAAPoCAIAAADCwUOzAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOzdX29bV5bm4Xcf0mrUXAZwSCo137JgS3YECIhFykF9x7oojyjFg7qcQss6Z8+F6PypjhNbpnS4yee5MJRBo7HQGNs/by0uJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPI0y9gAAwCH6v6/TJzWpYuSp1JKUpMvx+dij8CDd2AMAAIdoSCaq/WmVmnSpw9hz8FDTsQcAAA5RTe6SIiKf1nBn36JhXtwBgBHUsQc4XP5P3yzhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADhDgAADRDuAADQAOEOAAANEO4AANAA4Q4AAA0Q7gAA0ADh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" height="1000" preserveAspectRatio="xMidYMid meet"/></g></g></svg>
|
package/public/file.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M14.5 13.5V5.41a1 1 0 0 0-.3-.7L9.8.29A1 1 0 0 0 9.08 0H1.5v13.5A2.5 2.5 0 0 0 4 16h8a2.5 2.5 0 0 0 2.5-2.5m-1.5 0v-7H8v-5H3v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1M9.5 5V2.12L12.38 5zM5.13 5h-.62v1.25h2.12V5zm-.62 3h7.12v1.25H4.5zm.62 3h-.62v1.25h7.12V11z" clip-rule="evenodd" fill="#666" fill-rule="evenodd"/></svg>
|
package/public/globe.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.27 14.1a6.5 6.5 0 0 0 3.67-3.45q-1.24.21-2.7.34-.31 1.83-.97 3.1M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.48-1.52a7 7 0 0 1-.96 0H7.5a4 4 0 0 1-.84-1.32q-.38-.89-.63-2.08a40 40 0 0 0 3.92 0q-.25 1.2-.63 2.08a4 4 0 0 1-.84 1.31zm2.94-4.76q1.66-.15 2.95-.43a7 7 0 0 0 0-2.58q-1.3-.27-2.95-.43a18 18 0 0 1 0 3.44m-1.27-3.54a17 17 0 0 1 0 3.64 39 39 0 0 1-4.3 0 17 17 0 0 1 0-3.64 39 39 0 0 1 4.3 0m1.1-1.17q1.45.13 2.69.34a6.5 6.5 0 0 0-3.67-3.44q.65 1.26.98 3.1M8.48 1.5l.01.02q.41.37.84 1.31.38.89.63 2.08a40 40 0 0 0-3.92 0q.25-1.2.63-2.08a4 4 0 0 1 .85-1.32 7 7 0 0 1 .96 0m-2.75.4a6.5 6.5 0 0 0-3.67 3.44 29 29 0 0 1 2.7-.34q.31-1.83.97-3.1M4.58 6.28q-1.66.16-2.95.43a7 7 0 0 0 0 2.58q1.3.27 2.95.43a18 18 0 0 1 0-3.44m.17 4.71q-1.45-.12-2.69-.34a6.5 6.5 0 0 0 3.67 3.44q-.65-1.27-.98-3.1" fill="#666"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>
|
|
Binary file
|
|
Binary file
|
package/public/icon.svg
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 192 192" width="192" height="192">
|
|
2
|
+
<rect width="192" height="192" rx="40" fill="#09090b"/>
|
|
3
|
+
<text x="96" y="134" font-family="system-ui, -apple-system, sans-serif" font-weight="700" font-size="110" fill="#fafafa" text-anchor="middle">B</text>
|
|
4
|
+
</svg>
|