diff --git a/.dockerignore b/.dockerignore index fe773e5..7b88c31 100644 --- a/.dockerignore +++ b/.dockerignore @@ -9,3 +9,4 @@ src-tauri docs *.log readme +deploy diff --git a/.gitignore b/.gitignore index bd42204..c7b750c 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,7 @@ server/mihome/.cache/ # 本地 pnpm 安装产物 (项目使用 package-lock.json) /.pnpm-store + +# 0.2.1 验证部署: 服务器本地数据卷与密钥 (绝不入库) +deploy/0.2.1/data/ +deploy/0.2.1/.env diff --git a/Dockerfile b/Dockerfile index ffec25c..8b8f0ab 100644 --- a/Dockerfile +++ b/Dockerfile @@ -50,9 +50,9 @@ WORKDIR /app # 阿里源加速 RUN npm config set registry https://registry.npmmirror.com -# 只装运行时依赖 +# 只装运行时依赖 (better-sqlite3 是 @powersync/node 的 devOptional peer, 需同时 omit optional 才能跳过) COPY package*.json ./ -RUN --mount=type=cache,target=/root/.npm npm ci --omit=dev +RUN --mount=type=cache,target=/root/.npm npm ci --omit=dev --omit=optional # 拷贝构建产物 COPY --from=builder /app/dist ./dist @@ -72,9 +72,9 @@ ENV OTA_PACKAGE_DIR=/app/ota-package # 生产为 http 明文 (无 https), 客户端 tauri.conf.json 的 hotswap.require_https 已设为 false 放行 http ENV OTA_PUBLIC_BASE=http://bh.vps.honor3.com:3001 -# 健康检查 +# 健康检查 (端口跟随 PORT 环境变量, 0.2.1 部署为 13001) HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ - CMD wget -qO- http://127.0.0.1:3001/api/health || exit 1 + CMD wget -qO- http://127.0.0.1:${PORT:-3001}/api/health || exit 1 EXPOSE 3001 diff --git a/deploy/0.2.1/.env.example b/deploy/0.2.1/.env.example new file mode 100644 index 0000000..11a8879 --- /dev/null +++ b/deploy/0.2.1/.env.example @@ -0,0 +1,11 @@ +# 复制为 .env (服务器上 chmod 600, 已 gitignore)。 +# POWERSYNC_JWT_KEY_B64 = base64url(POWERSYNC_JWT_SECRET 的 UTF-8 字节) +# 生成: printf %s "$POWERSYNC_JWT_SECRET" | openssl base64 -A | tr '+/' '-_' | tr -d '=' + +PG_PASSWORD=change-me +PS_STORAGE_PASSWORD=change-me +JWT_SECRET_021=change-me +POWERSYNC_JWT_SECRET=change-me +POWERSYNC_JWT_KEY_B64=change-me +POWERSYNC_URL=https://bh.vps.honor3.com:13443 +OTA_PUBLIC_BASE=http://bh.vps.honor3.com:13001 diff --git a/deploy/0.2.1/README.md b/deploy/0.2.1/README.md new file mode 100644 index 0000000..aad14ac --- /dev/null +++ b/deploy/0.2.1/README.md @@ -0,0 +1,61 @@ +# 0.2.1 独立验证部署 (baihu /app/iboard-0.2.1) + +与现网 `/app/iboard`(3001/宿主 MySQL) 完全隔离:本栈使用独立 PG 容器、端口 13443/13001/13002,不写原库。 + +**浏览器入口: `https://bh.vps.honor3.com:13443`**(自签证书,首次访问需在浏览器"高级→继续访问"接受一次;PowerSync 网页端必须运行在安全上下文,http://13001 入口仅供接口调试,任务模块会报 Navigator locks 错误)。 +正式启用需替换受信证书:把 `bh.pem/bh.key` 换成受信证书后 `docker compose restart tls-front`(例如 Let's Encrypt DNS-01,80/443 已被 gateway 占用无法 HTTP-01)。 + +## 栈 + +| 服务 | 说明 | +| --- | --- | +| `pg` | postgres:16-alpine,`wal_level=logical`(供 PowerSync 逻辑复制),数据在 `./data/pg`,**不对外暴露端口** | +| `app` | 本仓库 Dockerfile 构建,13001 对外;启动时先 `prisma migrate deploy`;`DISABLE_CRON=1` 关闭定时任务 | +| `powersync` | journeyapps/powersync-service,13002 对外;源库=pg,bucket storage=同实例 PG 的 powersync schema | + +## 首次部署 + +```bash +# 服务器上 (源码已上传到 /app/iboard-0.2.1) +cd /app/iboard-0.2.1/deploy/0.2.1 + +# 1. 生成 .env (参照 .env.example; POWERSYNC_JWT_KEY_B64 由 secret 派生) +umask 077 +PG_PASSWORD=$(openssl rand -hex 16) +PS_STORAGE_PASSWORD=$(openssl rand -hex 16) +JWT_SECRET_021=$(openssl rand -hex 32) +POWERSYNC_JWT_SECRET=$(openssl rand -hex 32) +POWERSYNC_JWT_KEY_B64=$(printf %s "$POWERSYNC_JWT_SECRET" | openssl base64 -A | tr '+/' '-_' | tr -d '=') +cat > .env < 从现网 MariaDB 只读快照导入 +# 现网连接串从 iboard 容器环境变量读取 (不回显), 源库仅 SELECT +set -e +cd /app/iboard-0.2.1/deploy/0.2.1 +SRC=$(docker inspect iboard --format '{{range .Config.Env}}{{println .}}{{end}}' | grep '^DATABASE_URL=' | cut -d= -f2-) +[ -n "$SRC" ] || { echo '未取到现网 DATABASE_URL'; exit 1; } + +echo '--- truncate 0.2.1 库 ---' +docker compose exec -T pg psql -U iboard021 -d iboard021 -c "TRUNCATE TABLE \"User\",\"Project\",\"ProjectMember\",\"BoardColumn\",\"Task\",\"TaskMember\",\"TaskTag\",\"Habit\",\"CheckIn\",\"CheckList\",\"CheckListItem\",\"CheckListTemplate\",\"Article\",\"Strategy\",\"Indicator\",\"IndicatorPoint\",\"News\",\"Alert\",\"ServerNode\",\"ServerNodeHistory\",\"ServiceCheck\",\"Econ_SowInventory\",\"ScraperCache\",\"OilPriceHistory\",\"MihomeAccount\",\"MihomeHome\",\"MihomeDevice\",\"MihomeEnvSample\",\"MihomeEnvHour\" RESTART IDENTITY CASCADE;" + +echo '--- etl run ---' +docker compose exec -T -e SRC_DATABASE_URL="$SRC" app node scripts/etl-mariadb-to-pg.mjs diff --git a/deploy/0.2.1/initdb/01-powersync-storage.sh b/deploy/0.2.1/initdb/01-powersync-storage.sh new file mode 100644 index 0000000..3521fb6 --- /dev/null +++ b/deploy/0.2.1/initdb/01-powersync-storage.sh @@ -0,0 +1,18 @@ +#!/bin/bash +# 一次性初始化 (仅首次建库时执行): 创建 powersync bucket storage 专用用户 +# PG >= 14 允许源库与 bucket storage 同实例 (powersync schema 由 service 自建) +set -e +: "${PS_STORAGE_PASSWORD:?PS_STORAGE_PASSWORD missing}" + +psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL + DO \$\$ + BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'powersync_storage') THEN + CREATE USER powersync_storage WITH PASSWORD '$PS_STORAGE_PASSWORD'; + END IF; + END + \$\$; + GRANT CREATE ON DATABASE $POSTGRES_DB TO powersync_storage; +EOSQL + +echo "[initdb] powersync_storage user ready." diff --git a/deploy/0.2.1/initdb/02-publication.sql b/deploy/0.2.1/initdb/02-publication.sql new file mode 100644 index 0000000..2911281 --- /dev/null +++ b/deploy/0.2.1/initdb/02-publication.sql @@ -0,0 +1,10 @@ +-- 一次性初始化: PowerSync 逻辑复制所需 publication (服务不自建, 见 PSYNC_S1141) +-- 仅发布任务域 + User; 新增同步表时需 ALTER PUBLICATION powersync ADD TABLE ... +CREATE PUBLICATION powersync FOR TABLE + "Project", + "ProjectMember", + "BoardColumn", + "Task", + "TaskMember", + "TaskTag", + "User"; diff --git a/deploy/0.2.1/powersync/service.yaml b/deploy/0.2.1/powersync/service.yaml new file mode 100644 index 0000000..757674d --- /dev/null +++ b/deploy/0.2.1/powersync/service.yaml @@ -0,0 +1,41 @@ +# PowerSync Service 主配置 (0.2.1 验证部署) +# 参考: https://docs.powersync.com/configuration/powersync-service/self-hosted-instances +# 注意: !env 是 YAML 整值标签, 只能整个值替换变量, 不能内嵌在 URI 字符串中; +# 完整连接串由 docker-compose 以 PS_* 环境变量注入。 + +replication: + connections: + - type: postgresql + # 源库: 本栈 pg 容器 (0.2.1 独立实例), 复制走 iboard021 账号 + uri: !env PS_SOURCE_URI + sslmode: disable + +# bucket storage: 同实例 PG (16 >= 14 允许同库不同 schema, service 自建 powersync schema) +storage: + type: postgresql + uri: !env PS_STORAGE_URI + sslmode: disable + +port: 8080 + +sync_config: + path: /config/sync-config.yaml + +# 客户端鉴权: app 后端 /api/powersync/token 签发 HS256 JWT (aud=powersync) +# oct 密钥 k = base64url(POWERSYNC_JWT_SECRET) +client_auth: + jwks: + keys: + - kty: oct + k: !env PS_JWT_KEY_B64 + alg: HS256 + audience: + - powersync + +telemetry: + disable_telemetry_sharing: true + +system: + logging: + level: info + format: text diff --git a/deploy/0.2.1/powersync/sync-config.yaml b/deploy/0.2.1/powersync/sync-config.yaml new file mode 100644 index 0000000..041834e --- /dev/null +++ b/deploy/0.2.1/powersync/sync-config.yaml @@ -0,0 +1,25 @@ +# Sync Streams (edition 3): 任务模块 6 表 + User (展示用) +# Sequential ID Mapping (见 docs/V0.2/离线编辑模块/0.2.1实施方案.md §3): +# - 客户端主键 = uuid 列 (离线新建行同步回填后 id 稳定); int 自增 id 不下发 +# - 外键输出 uuid 镜像列, 别名回 projectId/columnId/parentId/taskId (客户端字段名不变) +# - 引号保留 PG PascalCase 标识; 可见性按 ProjectMember 过滤 + +config: + edition: 3 + +streams: + iboard_users: + auto_subscribe: true + query: SELECT CAST("id" AS TEXT) AS "id", "name", "email" FROM "User" + + iboard_task_data: + auto_subscribe: true + with: + my_projects: SELECT "projectId" FROM "ProjectMember" WHERE CAST("userId" AS TEXT) = auth.user_id() + queries: + - SELECT "uuid" AS "id", "uuid", "code", "name", CAST("ownerId" AS TEXT) AS "ownerId", "isPersonal", "archived", "notes", "taskKinds", "icon", "autoArchive", "createdAt", "updatedAt" FROM "Project" WHERE "id" IN my_projects + - SELECT "uuid" AS "id", "uuid", "projectUuid" AS "projectId", CAST("userId" AS TEXT) AS "userId", "permission", "createdAt" FROM "ProjectMember" WHERE "projectId" IN my_projects + - SELECT "uuid" AS "id", "uuid", "projectUuid" AS "projectId", "name", "sortOrder", "boundStatus", "retention", "createdAt", "updatedAt" FROM "BoardColumn" WHERE "projectId" IN my_projects + - SELECT "uuid" AS "id", "uuid", "projectUuid" AS "projectId", "columnUuid" AS "columnId", "parentUuid" AS "parentId", "title", "description", "kind", "markDate", "status", "doneAt", CAST("assigneeId" AS TEXT) AS "assigneeId", CAST("creatorId" AS TEXT) AS "creatorId", "extras", "sortOrder", "number", "archived", "archivedAt", "archiveSource", "createdAt", "updatedAt" FROM "Task" WHERE "projectId" IN my_projects + - SELECT "uuid" AS "id", "uuid", "taskUuid" AS "taskId", CAST("userId" AS TEXT) AS "userId" FROM "TaskMember" WHERE "taskId" IN (SELECT "id" FROM "Task" WHERE "projectId" IN my_projects) + - SELECT "uuid" AS "id", "uuid", "taskUuid" AS "taskId", "name" FROM "TaskTag" WHERE "taskId" IN (SELECT "id" FROM "Task" WHERE "projectId" IN my_projects) diff --git a/deploy/0.2.1/tls/nginx.conf b/deploy/0.2.1/tls/nginx.conf new file mode 100644 index 0000000..22f61e1 --- /dev/null +++ b/deploy/0.2.1/tls/nginx.conf @@ -0,0 +1,37 @@ +# 0.2.1 TLS 前置: 单端口 13443, 按路径分流 (自签证书, 见 README) +# PowerSync 页面必须在安全上下文运行 (navigator.locks 仅 HTTPS/localhost), 故 app 与 sync 统一走 TLS +server { + listen 443 ssl; + server_name bh.vps.honor3.com; + + ssl_certificate /etc/nginx/certs/bh.pem; + ssl_certificate_key /etc/nginx/certs/bh.key; + + # PowerSync (HTTP 流式 + WebSocket 兜底) + location /sync/ { + proxy_pass http://powersync:8080; + proxy_http_version 1.1; + proxy_set_header Connection ''; + proxy_buffering off; + proxy_read_timeout 3600s; + } + location /socket/ { + proxy_pass http://powersync:8080; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_read_timeout 3600s; + } + location /health { + proxy_pass http://powersync:8080; + } + + # 应用 (静态前端 + API) + location / { + proxy_pass http://app:13001; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $host; + } +} diff --git a/docs/V0.2/离线编辑模块/0.2.1实施方案.md b/docs/V0.2/离线编辑模块/0.2.1实施方案.md new file mode 100644 index 0000000..7229d34 --- /dev/null +++ b/docs/V0.2/离线编辑模块/0.2.1实施方案.md @@ -0,0 +1,103 @@ +# 0.2.1 实施方案:PostgreSQL 迁移 + 任务模块离线编辑 (PowerSync) + +| 项 | 内容 | +| --- | --- | +| 分支 | `dev-0.2.1`(worktree `iboard-dev-0.2.1`,独立临时分支,与 master / dev-0.2 隔离) | +| 日期 | 2026-10-25 | +| 依据 | [PowerSync可行性研究报告](./PowerSync可行性研究报告.md),按其 5.2.2 路线执行 | +| 目标 | 在现网应用与数据不受影响的前提下,验证任务模块离线编辑 + 联网后自动双向同步;数据库由 MariaDB 迁移至 PostgreSQL | + +## 1. 已确认决策(2026-10-25 与需求方对齐) + +| 决策点 | 结论 | +| --- | --- | +| 技术路线 | PowerSync 全链路(自部署 powersync-service) | +| 离线范围 | 仅任务模块(Project / ProjectMember / BoardColumn / Task / TaskMember / TaskTag);打卡、清单本阶段不纳入;新闻/指标/监控等时序域仅做普通缓存 | +| 客户端 | 先 Web / Windows 外壳(WebView2)跑通全链路;Android 真机后续验证 | +| 编号 | 项目短前缀由用户自拟(2~8 位,全局唯一);任务号 = 项目内自增整数,展示 `前缀-序号`;编号由服务端统一分配,离线创建的任务在同步定号前显示临时标识 | +| 初始数据 | 从现网 MariaDB 只读快照导出并转换导入新 PG;0.2.1 期间产生的新数据不回写现网 | +| 端口 | Web/API 13001、PowerSync WebSocket 13002、PG 仅容器内网(调试绑 127.0.0.1:15432) | +| 部署 | 源码上传 baihu `/app/iboard-0.2.1`,服务器上 `docker compose build`;不使用原 CI/CD | +| 现网保护 | `/app/iboard`、宿主 3306 MySQL、3001 端口、原 CI/CD 一律不使用(快照导出仅 SELECT) | +| 磁盘 | 允许在 baihu 执行 docker 悬空镜像/构建缓存的安全清理(磁盘仅剩 9.9G) | + +## 2. 目标架构 + +``` +[Web / Tauri WebView2] + React + @powersync/react + 本地 WASM SQLite (OPFS 持久化) + │ 离线: 直接读写本地库; 写操作进入 upload queue + │ 联网: 批量 POST 上行到 Express API (按 uuid 幂等 upsert) + ▼ +[iboard-0.2.1 Express :13001] ── Prisma (adapter-pg) ──┐ + + /api/powersync/token (为登录用户签发同步 JWT) ▼ + [PostgreSQL 容器] (wal_level=logical) + ▲ 逻辑复制 (publication + replication slot) +[powersync-service :13002] ── Sync Rules: 任务域 6 表 + User 只读引用, 按 ProjectMember 过滤 +``` + +- 写路径:客户端本地写 → upload queue → 上行 API → Prisma 写 PG → 逻辑复制捕获 → 广播各端; +- 读路径:任务模块页面全部改读本地 SQLite(@powersync/react 响应式查询),其余页面维持 axios REST; +- 认证:复用现有 jsonwebtoken 体系,新增 `/api/powersync/token` 签发 PowerSync 校验的 JWT。 + +## 3. 数据模型改造(原则:只增不改) + +采用报告 3.2 中的「新增 uuid 列 + 应用层幂等 upsert」选项,不做全表主键 UUID 化:外键关系全部保留,存量数据迁移风险最小。 + +- 任务域 6 表各加 `uuid varchar(36) unique`(客户端创建时生成;存量行导入时回填); +- `Project` 加 `code varchar(8) unique`(用户自拟短前缀;存量项目导入时回填自动码,后续可改); +- `Task` 加 `number int`,`@@unique([projectId, number])`(服务端按项目 max+1 分配;离线创建的任务上行时定号,本地未定号行显示临时标识); +- 主键仍为自增 Int,业务外键不动;客户端上行一律以 uuid 引用父子行,服务端解析为内部 id; +- Prisma datasource: `mysql` → `postgresql`;本分支重建基线迁移(旧 MySQL 迁移文件移除,历史保留在 git)。 + +### 3.1 Sequential ID Mapping(落地时按官方模式补充) + +按 PowerSync 官方 [Sequential ID Mapping](https://docs.powersync.com/client-sdks/advanced/sequential-id-mapping) 模式实施,解决"离线新建行同步回填后本地 id 变化"问题: + +- 任务域 6 表再加**外键 uuid 镜像列**(`Task.projectUuid/columnUuid/parentUuid`、`BoardColumn.projectUuid`、`ProjectMember.projectUuid`、`TaskMember/TaskTag.taskUuid`),由 **PG 触发器**在写入时按 int 外键自动回填(迁移 `20261026010000_uuid_fk_mapping`),库级 NOT NULL; +- Sync Streams 以 **`uuid` 作为客户端主键**(`SELECT "uuid" AS "id"`),镜像列别名输出回 `projectId/columnId/parentId/taskId` —— 客户端 schema 与页面代码**零改动**; +- 服务端 upload 处理器按 uuid 解析父行(`findUnique({ where: { uuid } })`),解析后再写 int 外键 → 触发器回填镜像,两侧闭环一致; +- 镜像列在 Prisma 模型中声明为可空(触发器保证库级非空),避免 create 校验拦截。 + +## 4. 同步与冲突 + +- Sync Rules 仅下发任务域 6 表 + `User`(展示名称/头像用),按 `ProjectMember.userId = auth.parameters.userId` 过滤项目可见性;时序/监控/米家等表不纳入; +- 上行:`POST /api/powersync/upload` 批处理客户端 CRUD 操作,按 uuid 幂等 upsert,更新时以服务端时间戳做 LWW 仲裁; +- 冲突:字段级 LWW 为主;`BoardColumn.sortOrder` / `Task.sortOrder` 由服务端重排仲裁;并发唯一冲突(项目前缀、看板列名)返回明确错误,客户端提示重试; +- `Task.number` / `Project.code` 由服务端唯一分配,多端并发下天然无冲突。 + +## 5. 部署拓扑(baihu `/app/iboard-0.2.1`) + +docker compose 三服务: + +| 服务 | 镜像 | 端口 | 说明 | +| --- | --- | --- | --- | +| `pg-021` | postgres:16-alpine | 仅容器内网 | `wal_level=logical`;数据卷 `./data/pg` | +| `powersync-021` | powersync 官方镜像 | 13002 对外 | 连接 PG 逻辑复制 + WebSocket 下发 | +| `app-021` | 本仓库 Dockerfile 构建 | 13001 对外 | `OTA_PUBLIC_BASE=http://bh.vps.honor3:13001` | + +- 环境变量由 compose 注入:`DATABASE_URL`(指向 pg-021)、`JWT_SECRET`(0.2.1 独立新设)、`PORT=13001`; +- 0.2.1 容器内 cron/米家调度预计无凭证或产生重复外呼,部署时以环境开关关闭(实现于 M4)。 + +## 6. 数据迁移(一次性) + +1. 在 baihu 上用仓库自带 `mariadb` 驱动以只读 SQL 从宿主 MySQL(3306) 导出全表 JSON(仅 SELECT); +2. 转换:回填 uuid / `Project.code`(按名称自动生成,可后改)/ `Task.number`(按项目内 createdAt 顺序);时间字段转 PG 时间戳; +3. PG 侧先 `prisma migrate deploy` 建基线表,再执行 ETL 写入; +4. 校验:逐表行数比对 + 抽样字段比对,输出核对报告。 + +## 7. 里程碑 + +1. **M1** schema/适配层切 PG(本提交):schema 字段、db.js 适配器、基线迁移重建、本地 `prisma generate` 通过; +2. **M2** 服务端:powersync token 端点、upload 幂等上行端点、任务域路由幂等化与编号分配逻辑; +3. **M3** 前端:任务模块数据层切 PowerSync(本地库 + useQuery + 上传队列),桌面端联调; +4. **M4** compose 编排 + ETL 导数 + baihu 部署,端口/现网隔离验证; +5. **M5** 离线-联网闭环验证(断网编辑 → 恢复自动同步 → 多端一致),Android 真机评估。 + +## 8. 开放问题 / 风险 + +- powersync-service 的元数据存储(bucket storage)对 MongoDB 的依赖需在部署阶段核实;若当前版本不支持用 PG 存元数据,则加一个 mongo 容器; +- Android System WebView 的 OPFS/WASM SQLite 兼容性(M5 评估,先桌面); +- 项目前缀全局唯一在多端并发下的冲突提示体验(上行返回结构化错误码); +- 0.2.1 验证期数据与现网彻底隔离,不回迁;若验证后需并回主线,另行决策迁移口径。 diff --git a/generated/prisma/commonInputTypes.ts b/generated/prisma/commonInputTypes.ts index d0d5081..3deecf5 100644 --- a/generated/prisma/commonInputTypes.ts +++ b/generated/prisma/commonInputTypes.ts @@ -16,8 +16,8 @@ import type * as Prisma from "./internal/prismaNamespace.ts" export type IntFilter<$PrismaModel = never> = { equals?: number | Prisma.IntFieldRefInput<$PrismaModel> - in?: number[] - notIn?: number[] + in?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel> + notIn?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel> lt?: number | Prisma.IntFieldRefInput<$PrismaModel> lte?: number | Prisma.IntFieldRefInput<$PrismaModel> gt?: number | Prisma.IntFieldRefInput<$PrismaModel> @@ -27,8 +27,8 @@ export type IntFilter<$PrismaModel = never> = { export type StringFilter<$PrismaModel = never> = { equals?: string | Prisma.StringFieldRefInput<$PrismaModel> - in?: string[] - notIn?: string[] + in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> + notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> lt?: string | Prisma.StringFieldRefInput<$PrismaModel> lte?: string | Prisma.StringFieldRefInput<$PrismaModel> gt?: string | Prisma.StringFieldRefInput<$PrismaModel> @@ -36,14 +36,14 @@ export type StringFilter<$PrismaModel = never> = { contains?: string | Prisma.StringFieldRefInput<$PrismaModel> startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel> endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel> - search?: string + mode?: Prisma.QueryMode not?: Prisma.NestedStringFilter<$PrismaModel> | string } export type DateTimeFilter<$PrismaModel = never> = { equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - in?: Date[] | string[] - notIn?: Date[] | string[] + in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> + notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> @@ -53,8 +53,8 @@ export type DateTimeFilter<$PrismaModel = never> = { export type IntWithAggregatesFilter<$PrismaModel = never> = { equals?: number | Prisma.IntFieldRefInput<$PrismaModel> - in?: number[] - notIn?: number[] + in?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel> + notIn?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel> lt?: number | Prisma.IntFieldRefInput<$PrismaModel> lte?: number | Prisma.IntFieldRefInput<$PrismaModel> gt?: number | Prisma.IntFieldRefInput<$PrismaModel> @@ -69,8 +69,8 @@ export type IntWithAggregatesFilter<$PrismaModel = never> = { export type StringWithAggregatesFilter<$PrismaModel = never> = { equals?: string | Prisma.StringFieldRefInput<$PrismaModel> - in?: string[] - notIn?: string[] + in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> + notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> lt?: string | Prisma.StringFieldRefInput<$PrismaModel> lte?: string | Prisma.StringFieldRefInput<$PrismaModel> gt?: string | Prisma.StringFieldRefInput<$PrismaModel> @@ -78,7 +78,7 @@ export type StringWithAggregatesFilter<$PrismaModel = never> = { contains?: string | Prisma.StringFieldRefInput<$PrismaModel> startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel> endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel> - search?: string + mode?: Prisma.QueryMode not?: Prisma.NestedStringWithAggregatesFilter<$PrismaModel> | string _count?: Prisma.NestedIntFilter<$PrismaModel> _min?: Prisma.NestedStringFilter<$PrismaModel> @@ -87,8 +87,8 @@ export type StringWithAggregatesFilter<$PrismaModel = never> = { export type DateTimeWithAggregatesFilter<$PrismaModel = never> = { equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - in?: Date[] | string[] - notIn?: Date[] | string[] + in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> + notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> @@ -108,7 +108,7 @@ export type JsonFilter<$PrismaModel = never> = export type JsonFilterBase<$PrismaModel = never> = { equals?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter - path?: string + path?: string[] mode?: Prisma.QueryMode | Prisma.EnumQueryModeFieldRefInput<$PrismaModel> string_contains?: string | Prisma.StringFieldRefInput<$PrismaModel> string_starts_with?: string | Prisma.StringFieldRefInput<$PrismaModel> @@ -116,10 +116,10 @@ export type JsonFilterBase<$PrismaModel = never> = { array_starts_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null array_ends_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null array_contains?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null - lt?: runtime.InputJsonValue - lte?: runtime.InputJsonValue - gt?: runtime.InputJsonValue - gte?: runtime.InputJsonValue + lt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + lte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + gt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + gte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> not?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter } @@ -132,7 +132,7 @@ export type JsonWithAggregatesFilter<$PrismaModel = never> = export type JsonWithAggregatesFilterBase<$PrismaModel = never> = { equals?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter - path?: string + path?: string[] mode?: Prisma.QueryMode | Prisma.EnumQueryModeFieldRefInput<$PrismaModel> string_contains?: string | Prisma.StringFieldRefInput<$PrismaModel> string_starts_with?: string | Prisma.StringFieldRefInput<$PrismaModel> @@ -140,10 +140,10 @@ export type JsonWithAggregatesFilterBase<$PrismaModel = never> = { array_starts_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null array_ends_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null array_contains?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null - lt?: runtime.InputJsonValue - lte?: runtime.InputJsonValue - gt?: runtime.InputJsonValue - gte?: runtime.InputJsonValue + lt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + lte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + gt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + gte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> not?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter _count?: Prisma.NestedIntFilter<$PrismaModel> _min?: Prisma.NestedJsonFilter<$PrismaModel> @@ -165,8 +165,8 @@ export type BoolWithAggregatesFilter<$PrismaModel = never> = { export type FloatFilter<$PrismaModel = never> = { equals?: number | Prisma.FloatFieldRefInput<$PrismaModel> - in?: number[] - notIn?: number[] + in?: number[] | Prisma.ListFloatFieldRefInput<$PrismaModel> + notIn?: number[] | Prisma.ListFloatFieldRefInput<$PrismaModel> lt?: number | Prisma.FloatFieldRefInput<$PrismaModel> lte?: number | Prisma.FloatFieldRefInput<$PrismaModel> gt?: number | Prisma.FloatFieldRefInput<$PrismaModel> @@ -176,8 +176,8 @@ export type FloatFilter<$PrismaModel = never> = { export type FloatWithAggregatesFilter<$PrismaModel = never> = { equals?: number | Prisma.FloatFieldRefInput<$PrismaModel> - in?: number[] - notIn?: number[] + in?: number[] | Prisma.ListFloatFieldRefInput<$PrismaModel> + notIn?: number[] | Prisma.ListFloatFieldRefInput<$PrismaModel> lt?: number | Prisma.FloatFieldRefInput<$PrismaModel> lte?: number | Prisma.FloatFieldRefInput<$PrismaModel> gt?: number | Prisma.FloatFieldRefInput<$PrismaModel> @@ -192,8 +192,8 @@ export type FloatWithAggregatesFilter<$PrismaModel = never> = { export type StringNullableFilter<$PrismaModel = never> = { equals?: string | Prisma.StringFieldRefInput<$PrismaModel> | null - in?: string[] | null - notIn?: string[] | null + in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> | null + notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> | null lt?: string | Prisma.StringFieldRefInput<$PrismaModel> lte?: string | Prisma.StringFieldRefInput<$PrismaModel> gt?: string | Prisma.StringFieldRefInput<$PrismaModel> @@ -201,7 +201,7 @@ export type StringNullableFilter<$PrismaModel = never> = { contains?: string | Prisma.StringFieldRefInput<$PrismaModel> startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel> endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel> - search?: string + mode?: Prisma.QueryMode not?: Prisma.NestedStringNullableFilter<$PrismaModel> | string | null } @@ -212,8 +212,8 @@ export type SortOrderInput = { export type StringNullableWithAggregatesFilter<$PrismaModel = never> = { equals?: string | Prisma.StringFieldRefInput<$PrismaModel> | null - in?: string[] | null - notIn?: string[] | null + in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> | null + notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> | null lt?: string | Prisma.StringFieldRefInput<$PrismaModel> lte?: string | Prisma.StringFieldRefInput<$PrismaModel> gt?: string | Prisma.StringFieldRefInput<$PrismaModel> @@ -221,7 +221,7 @@ export type StringNullableWithAggregatesFilter<$PrismaModel = never> = { contains?: string | Prisma.StringFieldRefInput<$PrismaModel> startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel> endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel> - search?: string + mode?: Prisma.QueryMode not?: Prisma.NestedStringNullableWithAggregatesFilter<$PrismaModel> | string | null _count?: Prisma.NestedIntNullableFilter<$PrismaModel> _min?: Prisma.NestedStringNullableFilter<$PrismaModel> @@ -230,8 +230,8 @@ export type StringNullableWithAggregatesFilter<$PrismaModel = never> = { export type BigIntFilter<$PrismaModel = never> = { equals?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel> - in?: bigint[] | number[] - notIn?: bigint[] | number[] + in?: bigint[] | number[] | Prisma.ListBigIntFieldRefInput<$PrismaModel> + notIn?: bigint[] | number[] | Prisma.ListBigIntFieldRefInput<$PrismaModel> lt?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel> lte?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel> gt?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel> @@ -241,8 +241,8 @@ export type BigIntFilter<$PrismaModel = never> = { export type BigIntWithAggregatesFilter<$PrismaModel = never> = { equals?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel> - in?: bigint[] | number[] - notIn?: bigint[] | number[] + in?: bigint[] | number[] | Prisma.ListBigIntFieldRefInput<$PrismaModel> + notIn?: bigint[] | number[] | Prisma.ListBigIntFieldRefInput<$PrismaModel> lt?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel> lte?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel> gt?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel> @@ -264,7 +264,7 @@ export type JsonNullableFilter<$PrismaModel = never> = export type JsonNullableFilterBase<$PrismaModel = never> = { equals?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter - path?: string + path?: string[] mode?: Prisma.QueryMode | Prisma.EnumQueryModeFieldRefInput<$PrismaModel> string_contains?: string | Prisma.StringFieldRefInput<$PrismaModel> string_starts_with?: string | Prisma.StringFieldRefInput<$PrismaModel> @@ -272,10 +272,10 @@ export type JsonNullableFilterBase<$PrismaModel = never> = { array_starts_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null array_ends_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null array_contains?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null - lt?: runtime.InputJsonValue - lte?: runtime.InputJsonValue - gt?: runtime.InputJsonValue - gte?: runtime.InputJsonValue + lt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + lte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + gt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + gte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> not?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter } @@ -288,7 +288,7 @@ export type JsonNullableWithAggregatesFilter<$PrismaModel = never> = export type JsonNullableWithAggregatesFilterBase<$PrismaModel = never> = { equals?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter - path?: string + path?: string[] mode?: Prisma.QueryMode | Prisma.EnumQueryModeFieldRefInput<$PrismaModel> string_contains?: string | Prisma.StringFieldRefInput<$PrismaModel> string_starts_with?: string | Prisma.StringFieldRefInput<$PrismaModel> @@ -296,10 +296,10 @@ export type JsonNullableWithAggregatesFilterBase<$PrismaModel = never> = { array_starts_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null array_ends_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null array_contains?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null - lt?: runtime.InputJsonValue - lte?: runtime.InputJsonValue - gt?: runtime.InputJsonValue - gte?: runtime.InputJsonValue + lt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + lte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + gt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + gte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> not?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter _count?: Prisma.NestedIntNullableFilter<$PrismaModel> _min?: Prisma.NestedJsonNullableFilter<$PrismaModel> @@ -308,8 +308,8 @@ export type JsonNullableWithAggregatesFilterBase<$PrismaModel = never> = { export type IntNullableFilter<$PrismaModel = never> = { equals?: number | Prisma.IntFieldRefInput<$PrismaModel> | null - in?: number[] | null - notIn?: number[] | null + in?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel> | null + notIn?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel> | null lt?: number | Prisma.IntFieldRefInput<$PrismaModel> lte?: number | Prisma.IntFieldRefInput<$PrismaModel> gt?: number | Prisma.IntFieldRefInput<$PrismaModel> @@ -319,8 +319,8 @@ export type IntNullableFilter<$PrismaModel = never> = { export type DateTimeNullableFilter<$PrismaModel = never> = { equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null - in?: Date[] | string[] | null - notIn?: Date[] | string[] | null + in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null + notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> @@ -330,8 +330,8 @@ export type DateTimeNullableFilter<$PrismaModel = never> = { export type IntNullableWithAggregatesFilter<$PrismaModel = never> = { equals?: number | Prisma.IntFieldRefInput<$PrismaModel> | null - in?: number[] | null - notIn?: number[] | null + in?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel> | null + notIn?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel> | null lt?: number | Prisma.IntFieldRefInput<$PrismaModel> lte?: number | Prisma.IntFieldRefInput<$PrismaModel> gt?: number | Prisma.IntFieldRefInput<$PrismaModel> @@ -346,8 +346,8 @@ export type IntNullableWithAggregatesFilter<$PrismaModel = never> = { export type DateTimeNullableWithAggregatesFilter<$PrismaModel = never> = { equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null - in?: Date[] | string[] | null - notIn?: Date[] | string[] | null + in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null + notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> @@ -360,8 +360,8 @@ export type DateTimeNullableWithAggregatesFilter<$PrismaModel = never> = { export type FloatNullableFilter<$PrismaModel = never> = { equals?: number | Prisma.FloatFieldRefInput<$PrismaModel> | null - in?: number[] | null - notIn?: number[] | null + in?: number[] | Prisma.ListFloatFieldRefInput<$PrismaModel> | null + notIn?: number[] | Prisma.ListFloatFieldRefInput<$PrismaModel> | null lt?: number | Prisma.FloatFieldRefInput<$PrismaModel> lte?: number | Prisma.FloatFieldRefInput<$PrismaModel> gt?: number | Prisma.FloatFieldRefInput<$PrismaModel> @@ -371,8 +371,8 @@ export type FloatNullableFilter<$PrismaModel = never> = { export type FloatNullableWithAggregatesFilter<$PrismaModel = never> = { equals?: number | Prisma.FloatFieldRefInput<$PrismaModel> | null - in?: number[] | null - notIn?: number[] | null + in?: number[] | Prisma.ListFloatFieldRefInput<$PrismaModel> | null + notIn?: number[] | Prisma.ListFloatFieldRefInput<$PrismaModel> | null lt?: number | Prisma.FloatFieldRefInput<$PrismaModel> lte?: number | Prisma.FloatFieldRefInput<$PrismaModel> gt?: number | Prisma.FloatFieldRefInput<$PrismaModel> @@ -387,8 +387,8 @@ export type FloatNullableWithAggregatesFilter<$PrismaModel = never> = { export type NestedIntFilter<$PrismaModel = never> = { equals?: number | Prisma.IntFieldRefInput<$PrismaModel> - in?: number[] - notIn?: number[] + in?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel> + notIn?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel> lt?: number | Prisma.IntFieldRefInput<$PrismaModel> lte?: number | Prisma.IntFieldRefInput<$PrismaModel> gt?: number | Prisma.IntFieldRefInput<$PrismaModel> @@ -398,8 +398,8 @@ export type NestedIntFilter<$PrismaModel = never> = { export type NestedStringFilter<$PrismaModel = never> = { equals?: string | Prisma.StringFieldRefInput<$PrismaModel> - in?: string[] - notIn?: string[] + in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> + notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> lt?: string | Prisma.StringFieldRefInput<$PrismaModel> lte?: string | Prisma.StringFieldRefInput<$PrismaModel> gt?: string | Prisma.StringFieldRefInput<$PrismaModel> @@ -407,14 +407,13 @@ export type NestedStringFilter<$PrismaModel = never> = { contains?: string | Prisma.StringFieldRefInput<$PrismaModel> startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel> endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel> - search?: string not?: Prisma.NestedStringFilter<$PrismaModel> | string } export type NestedDateTimeFilter<$PrismaModel = never> = { equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - in?: Date[] | string[] - notIn?: Date[] | string[] + in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> + notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> @@ -424,8 +423,8 @@ export type NestedDateTimeFilter<$PrismaModel = never> = { export type NestedIntWithAggregatesFilter<$PrismaModel = never> = { equals?: number | Prisma.IntFieldRefInput<$PrismaModel> - in?: number[] - notIn?: number[] + in?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel> + notIn?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel> lt?: number | Prisma.IntFieldRefInput<$PrismaModel> lte?: number | Prisma.IntFieldRefInput<$PrismaModel> gt?: number | Prisma.IntFieldRefInput<$PrismaModel> @@ -440,8 +439,8 @@ export type NestedIntWithAggregatesFilter<$PrismaModel = never> = { export type NestedFloatFilter<$PrismaModel = never> = { equals?: number | Prisma.FloatFieldRefInput<$PrismaModel> - in?: number[] - notIn?: number[] + in?: number[] | Prisma.ListFloatFieldRefInput<$PrismaModel> + notIn?: number[] | Prisma.ListFloatFieldRefInput<$PrismaModel> lt?: number | Prisma.FloatFieldRefInput<$PrismaModel> lte?: number | Prisma.FloatFieldRefInput<$PrismaModel> gt?: number | Prisma.FloatFieldRefInput<$PrismaModel> @@ -451,8 +450,8 @@ export type NestedFloatFilter<$PrismaModel = never> = { export type NestedStringWithAggregatesFilter<$PrismaModel = never> = { equals?: string | Prisma.StringFieldRefInput<$PrismaModel> - in?: string[] - notIn?: string[] + in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> + notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> lt?: string | Prisma.StringFieldRefInput<$PrismaModel> lte?: string | Prisma.StringFieldRefInput<$PrismaModel> gt?: string | Prisma.StringFieldRefInput<$PrismaModel> @@ -460,7 +459,6 @@ export type NestedStringWithAggregatesFilter<$PrismaModel = never> = { contains?: string | Prisma.StringFieldRefInput<$PrismaModel> startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel> endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel> - search?: string not?: Prisma.NestedStringWithAggregatesFilter<$PrismaModel> | string _count?: Prisma.NestedIntFilter<$PrismaModel> _min?: Prisma.NestedStringFilter<$PrismaModel> @@ -469,8 +467,8 @@ export type NestedStringWithAggregatesFilter<$PrismaModel = never> = { export type NestedDateTimeWithAggregatesFilter<$PrismaModel = never> = { equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - in?: Date[] | string[] - notIn?: Date[] | string[] + in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> + notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> @@ -490,7 +488,7 @@ export type NestedJsonFilter<$PrismaModel = never> = export type NestedJsonFilterBase<$PrismaModel = never> = { equals?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter - path?: string + path?: string[] mode?: Prisma.QueryMode | Prisma.EnumQueryModeFieldRefInput<$PrismaModel> string_contains?: string | Prisma.StringFieldRefInput<$PrismaModel> string_starts_with?: string | Prisma.StringFieldRefInput<$PrismaModel> @@ -498,10 +496,10 @@ export type NestedJsonFilterBase<$PrismaModel = never> = { array_starts_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null array_ends_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null array_contains?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null - lt?: runtime.InputJsonValue - lte?: runtime.InputJsonValue - gt?: runtime.InputJsonValue - gte?: runtime.InputJsonValue + lt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + lte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + gt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + gte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> not?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter } @@ -520,8 +518,8 @@ export type NestedBoolWithAggregatesFilter<$PrismaModel = never> = { export type NestedFloatWithAggregatesFilter<$PrismaModel = never> = { equals?: number | Prisma.FloatFieldRefInput<$PrismaModel> - in?: number[] - notIn?: number[] + in?: number[] | Prisma.ListFloatFieldRefInput<$PrismaModel> + notIn?: number[] | Prisma.ListFloatFieldRefInput<$PrismaModel> lt?: number | Prisma.FloatFieldRefInput<$PrismaModel> lte?: number | Prisma.FloatFieldRefInput<$PrismaModel> gt?: number | Prisma.FloatFieldRefInput<$PrismaModel> @@ -536,8 +534,8 @@ export type NestedFloatWithAggregatesFilter<$PrismaModel = never> = { export type NestedStringNullableFilter<$PrismaModel = never> = { equals?: string | Prisma.StringFieldRefInput<$PrismaModel> | null - in?: string[] | null - notIn?: string[] | null + in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> | null + notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> | null lt?: string | Prisma.StringFieldRefInput<$PrismaModel> lte?: string | Prisma.StringFieldRefInput<$PrismaModel> gt?: string | Prisma.StringFieldRefInput<$PrismaModel> @@ -545,14 +543,13 @@ export type NestedStringNullableFilter<$PrismaModel = never> = { contains?: string | Prisma.StringFieldRefInput<$PrismaModel> startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel> endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel> - search?: string not?: Prisma.NestedStringNullableFilter<$PrismaModel> | string | null } export type NestedStringNullableWithAggregatesFilter<$PrismaModel = never> = { equals?: string | Prisma.StringFieldRefInput<$PrismaModel> | null - in?: string[] | null - notIn?: string[] | null + in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> | null + notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> | null lt?: string | Prisma.StringFieldRefInput<$PrismaModel> lte?: string | Prisma.StringFieldRefInput<$PrismaModel> gt?: string | Prisma.StringFieldRefInput<$PrismaModel> @@ -560,7 +557,6 @@ export type NestedStringNullableWithAggregatesFilter<$PrismaModel = never> = { contains?: string | Prisma.StringFieldRefInput<$PrismaModel> startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel> endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel> - search?: string not?: Prisma.NestedStringNullableWithAggregatesFilter<$PrismaModel> | string | null _count?: Prisma.NestedIntNullableFilter<$PrismaModel> _min?: Prisma.NestedStringNullableFilter<$PrismaModel> @@ -569,8 +565,8 @@ export type NestedStringNullableWithAggregatesFilter<$PrismaModel = never> = { export type NestedIntNullableFilter<$PrismaModel = never> = { equals?: number | Prisma.IntFieldRefInput<$PrismaModel> | null - in?: number[] | null - notIn?: number[] | null + in?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel> | null + notIn?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel> | null lt?: number | Prisma.IntFieldRefInput<$PrismaModel> lte?: number | Prisma.IntFieldRefInput<$PrismaModel> gt?: number | Prisma.IntFieldRefInput<$PrismaModel> @@ -580,8 +576,8 @@ export type NestedIntNullableFilter<$PrismaModel = never> = { export type NestedBigIntFilter<$PrismaModel = never> = { equals?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel> - in?: bigint[] | number[] - notIn?: bigint[] | number[] + in?: bigint[] | number[] | Prisma.ListBigIntFieldRefInput<$PrismaModel> + notIn?: bigint[] | number[] | Prisma.ListBigIntFieldRefInput<$PrismaModel> lt?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel> lte?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel> gt?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel> @@ -591,8 +587,8 @@ export type NestedBigIntFilter<$PrismaModel = never> = { export type NestedBigIntWithAggregatesFilter<$PrismaModel = never> = { equals?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel> - in?: bigint[] | number[] - notIn?: bigint[] | number[] + in?: bigint[] | number[] | Prisma.ListBigIntFieldRefInput<$PrismaModel> + notIn?: bigint[] | number[] | Prisma.ListBigIntFieldRefInput<$PrismaModel> lt?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel> lte?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel> gt?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel> @@ -614,7 +610,7 @@ export type NestedJsonNullableFilter<$PrismaModel = never> = export type NestedJsonNullableFilterBase<$PrismaModel = never> = { equals?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter - path?: string + path?: string[] mode?: Prisma.QueryMode | Prisma.EnumQueryModeFieldRefInput<$PrismaModel> string_contains?: string | Prisma.StringFieldRefInput<$PrismaModel> string_starts_with?: string | Prisma.StringFieldRefInput<$PrismaModel> @@ -622,17 +618,17 @@ export type NestedJsonNullableFilterBase<$PrismaModel = never> = { array_starts_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null array_ends_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null array_contains?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null - lt?: runtime.InputJsonValue - lte?: runtime.InputJsonValue - gt?: runtime.InputJsonValue - gte?: runtime.InputJsonValue + lt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + lte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + gt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + gte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> not?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter } export type NestedDateTimeNullableFilter<$PrismaModel = never> = { equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null - in?: Date[] | string[] | null - notIn?: Date[] | string[] | null + in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null + notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> @@ -642,8 +638,8 @@ export type NestedDateTimeNullableFilter<$PrismaModel = never> = { export type NestedIntNullableWithAggregatesFilter<$PrismaModel = never> = { equals?: number | Prisma.IntFieldRefInput<$PrismaModel> | null - in?: number[] | null - notIn?: number[] | null + in?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel> | null + notIn?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel> | null lt?: number | Prisma.IntFieldRefInput<$PrismaModel> lte?: number | Prisma.IntFieldRefInput<$PrismaModel> gt?: number | Prisma.IntFieldRefInput<$PrismaModel> @@ -658,8 +654,8 @@ export type NestedIntNullableWithAggregatesFilter<$PrismaModel = never> = { export type NestedFloatNullableFilter<$PrismaModel = never> = { equals?: number | Prisma.FloatFieldRefInput<$PrismaModel> | null - in?: number[] | null - notIn?: number[] | null + in?: number[] | Prisma.ListFloatFieldRefInput<$PrismaModel> | null + notIn?: number[] | Prisma.ListFloatFieldRefInput<$PrismaModel> | null lt?: number | Prisma.FloatFieldRefInput<$PrismaModel> lte?: number | Prisma.FloatFieldRefInput<$PrismaModel> gt?: number | Prisma.FloatFieldRefInput<$PrismaModel> @@ -669,8 +665,8 @@ export type NestedFloatNullableFilter<$PrismaModel = never> = { export type NestedDateTimeNullableWithAggregatesFilter<$PrismaModel = never> = { equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null - in?: Date[] | string[] | null - notIn?: Date[] | string[] | null + in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null + notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> @@ -683,8 +679,8 @@ export type NestedDateTimeNullableWithAggregatesFilter<$PrismaModel = never> = { export type NestedFloatNullableWithAggregatesFilter<$PrismaModel = never> = { equals?: number | Prisma.FloatFieldRefInput<$PrismaModel> | null - in?: number[] | null - notIn?: number[] | null + in?: number[] | Prisma.ListFloatFieldRefInput<$PrismaModel> | null + notIn?: number[] | Prisma.ListFloatFieldRefInput<$PrismaModel> | null lt?: number | Prisma.FloatFieldRefInput<$PrismaModel> lte?: number | Prisma.FloatFieldRefInput<$PrismaModel> gt?: number | Prisma.FloatFieldRefInput<$PrismaModel> diff --git a/generated/prisma/internal/class.ts b/generated/prisma/internal/class.ts index 8aedbb9..c64d7b8 100644 --- a/generated/prisma/internal/class.ts +++ b/generated/prisma/internal/class.ts @@ -19,8 +19,8 @@ const config: runtime.GetPrismaClientConfig = { "previewFeatures": [], "clientVersion": "7.7.0", "engineVersion": "75cbdc1eb7150937890ad5465d861175c6624711", - "activeProvider": "mysql", - "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Get a free hosted Postgres database in seconds: `npx create-db`\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"../generated/prisma\"\n}\n\ndatasource db {\n provider = \"mysql\"\n}\n\nmodel User {\n id Int @id @default(autoincrement())\n name String\n email String @unique\n password String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n // V0.2 打卡 / 清单: 用户删除时级联清理\n habits Habit[]\n checkIns CheckIn[]\n checkLists CheckList[]\n templates CheckListTemplate[]\n\n // V0.2 任务模块\n ownedProjects Project[] @relation(\"ProjectOwner\")\n projectMembers ProjectMember[]\n assignedTasks Task[] @relation(\"TaskAssignee\")\n createdTasks Task[] @relation(\"TaskCreator\")\n taskMembers TaskMember[]\n}\n\nmodel Article {\n id Int @id @default(autoincrement())\n title String\n slug String @unique\n content String\n date String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Strategy {\n id Int @id @default(autoincrement())\n name String\n description String\n data Json\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Indicator {\n id Int @id @default(autoincrement())\n name String @unique\n groupName String\n title String @default(\"\")\n unit String @default(\"\")\n source String @default(\"\")\n frequency String @default(\"month\") // year | quarter | month | day\n hidden Boolean @default(false) // true = 数据/脚本保留, 但不在前端展示\n points IndicatorPoint[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel IndicatorPoint {\n id Int @id @default(autoincrement())\n indicatorId Int\n indicator Indicator @relation(fields: [indicatorId], references: [id], onDelete: Cascade)\n period String // \"2024\" | \"2024-Q1\" | \"2024-01\" | \"2024-01-15\"\n value Float\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@unique([indicatorId, period])\n}\n\n// 新闻: 每天 3 点由 mx_finance_search_news 拉取, 按影响大小排序, 累加多日供首页无限滚动\nmodel News {\n id Int @id @default(autoincrement())\n title String\n summary String @default(\"\")\n content String? @db.Text\n source String @default(\"\")\n url String @default(\"\")\n publishedAt DateTime\n impactRank Int\n createdAt DateTime @default(now())\n\n @@unique([title, publishedAt])\n @@index([publishedAt])\n}\n\n// 报警: refresh 写库时比对同 (indicatorName, period) 的跨源数据, 差异超阈值记录\nmodel Alert {\n id Int @id @default(autoincrement())\n indicatorName String\n period String\n valueA Float\n valueB Float\n sourceA String\n sourceB String\n diff Float\n diffRatio Float\n createdAt DateTime @default(now())\n\n @@index([createdAt])\n}\n\n// 服务器监控: 对接 komari 公开 API\nmodel ServerNode {\n id Int @id @default(autoincrement())\n uuid String @unique\n name String\n cpuName String @default(\"\")\n os String @default(\"\")\n region String @default(\"\")\n memTotal BigInt @default(0)\n diskTotal BigInt @default(0)\n cpuCores Int @default(0)\n // 最新实时快照\n cpuUsage Float @default(0)\n ramUsed BigInt @default(0)\n swapUsed BigInt @default(0)\n load1 Float @default(0)\n load5 Float @default(0)\n load15 Float @default(0)\n diskUsed BigInt @default(0)\n netIn BigInt @default(0)\n netOut BigInt @default(0)\n uptime BigInt @default(0)\n process Int @default(0)\n connections Int @default(0)\n status String @default(\"unknown\") // online | offline | unknown\n recordedAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// 时序历史: 每节点每分钟一条 (komari records 1 分钟粒度)\nmodel ServerNodeHistory {\n id Int @id @default(autoincrement())\n uuid String\n period DateTime\n cpu Float @default(0)\n ram BigInt @default(0)\n load Float @default(0)\n disk BigInt @default(0)\n netIn BigInt @default(0)\n netOut BigInt @default(0)\n process Int @default(0)\n connections Int @default(0)\n createdAt DateTime @default(now())\n\n @@unique([uuid, period])\n @@index([uuid, period])\n}\n\n// 服务健康检查: 本应用自检 (健康端点 / DB / 第三方)\nmodel ServiceCheck {\n id Int @id @default(autoincrement())\n name String @unique\n url String\n status String @default(\"unknown\") // up | down | unknown\n latencyMs Int @default(0)\n message String @default(\"\")\n lastCheckAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Econ_SowInventory {\n id Int @id @default(autoincrement())\n month String @unique\n inventory Int // 能繁母猪数量(万头)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel ScraperCache {\n id Int @id @default(autoincrement())\n scraperName String @unique // 爬虫名称,如:sow-inventory\n lastDataHash String? // 上次数据指纹\n lastUpdateAt DateTime // 上次更新时间\n metadata Json? // 其他元数据\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// 浙江省油价历史 (apizero price 接口每日抓取)\n// 每天 04:00 cron 触发: 检查 schedule 里待定且 <= 昨天的调价日, 抓 price?province=浙江 存本表\n// unique (date, province, fuel) 防重复\nmodel OilPriceHistory {\n id Int @id @default(autoincrement())\n date DateTime // 调价日次日 (即数据实际抓取日)\n province String // '浙江'\n fuel String // '92' | '95' | '0'\n price Float // 油价 (元/升, 4 位小数足够)\n source String @default(\"apizero\")\n createdAt DateTime @default(now())\n\n @@unique([date, province, fuel])\n @@index([province, fuel, date])\n}\n\n// ==================== 环境监控:米家 ====================\n\n// 米家授权状态 (DiskCache 存凭证, 本表只存状态/错误供前端展示)\nmodel MihomeAccount {\n id Int @id @default(autoincrement())\n key String @unique @default(\"default\")\n userId String @default(\"\")\n status String @default(\"unknown\") // ok | pending | expired\n lastError String @default(\"\")\n updatedAt DateTime @updatedAt\n}\n\nmodel MihomeHome {\n id Int @id @default(autoincrement())\n homeId String @unique\n name String\n createdAt DateTime @default(now())\n devices MihomeDevice[]\n}\n\nmodel MihomeDevice {\n id Int @id @default(autoincrement())\n did String @unique\n homeId String\n home MihomeHome @relation(fields: [homeId], references: [homeId])\n model String\n name String\n alias String? // 用户别名, 仅本应用展示\n tempSiid Int\n tempPiid Int\n humSiid Int\n humPiid Int\n battSiid Int // 电池电量属性 (炎米 3.1003 / 青萍 2.3)\n battPiid Int\n battery Int? // 最近一次电量 (每天读一次, 标题展示用)\n batteryAt DateTime? // 电量读取时间 (当天缓存, 不频繁更新)\n enabled Boolean @default(true)\n lastSyncAt DateTime?\n createdAt DateTime @default(now())\n samples MihomeEnvSample[]\n hours MihomeEnvHour[]\n}\n\n// 日档: 月视图(逐日)数据源; unique (deviceId, date) 防重\nmodel MihomeEnvSample {\n id Int @id @default(autoincrement())\n deviceId Int\n device MihomeDevice @relation(fields: [deviceId], references: [id], onDelete: Cascade)\n date DateTime // 采样日 (Asia/Shanghai 当日 00:00 存 UTC)\n temperature Float? // 当日最后一次实时值 (或 vendor hour 均值)\n humidity Float?\n temperatureAvg Float? // 当日均值 (由小时档聚合, 或 vendor_hour)\n humidityAvg Float?\n temperatureMin Float? // 当日最低\n temperatureMax Float? // 当日最高\n humidityMin Float?\n humidityMax Float?\n origin String @default(\"live\") // live | vendor_history | backfill\n sampledAt DateTime?\n raw Json?\n createdAt DateTime @default(now())\n\n @@unique([deviceId, date])\n @@index([deviceId, date])\n}\n\n// 小时档: 当天视图(逐小时)数据源; unique (deviceId, hour) 防重\nmodel MihomeEnvHour {\n id Int @id @default(autoincrement())\n deviceId Int\n device MihomeDevice @relation(fields: [deviceId], references: [id], onDelete: Cascade)\n hour DateTime // Asia/Shanghai 整点 (存 UTC)\n temperatureAvg Float? // 该小时均值 (live 采样点, 或 vendor_hour)\n humidityAvg Float?\n raw Json?\n createdAt DateTime @default(now())\n\n @@unique([deviceId, hour])\n @@index([deviceId, hour])\n}\n\n// ==================== 打卡 / 日历 / 清单 (V0.2) ====================\n\n// 打卡项: 周期性目标 (每天 / 每周 / 每月 / 每年 n 次)\nmodel Habit {\n id Int @id @default(autoincrement())\n userId Int\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n name String\n period String @default(\"day\") // day | week | month | year\n target Int @default(1) // 周期内目标次数 n (>=1)\n color String @default(\"#1677ff\")\n icon String @default(\"\") // emoji 或图标名, 预留\n note String @default(\"\")\n archived Boolean @default(false) // 归档: 不出现在今日待办, 历史保留\n sortOrder Int @default(0)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n records CheckIn[]\n\n @@index([userId, archived, sortOrder])\n}\n\n// 打卡记录: 一次打卡 = 一条; 同日多次 => seq 递增 (1..n, 超额继续累加)\nmodel CheckIn {\n id Int @id @default(autoincrement())\n habitId Int\n habit Habit @relation(fields: [habitId], references: [id], onDelete: Cascade)\n userId Int\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n date String @db.VarChar(10) // 本地日历日 \"YYYY-MM-DD\" (Asia/Shanghai)\n seq Int @default(1) // 当日第几次\n note String @default(\"\")\n source String @default(\"user\") // user | backfill (补打)\n createdAt DateTime @default(now())\n\n @@unique([habitId, date, seq])\n @@index([userId, date])\n @@index([habitId, date])\n}\n\n// 检查清单: 出差 / 回老家 等场景的一次性清单\nmodel CheckList {\n id Int @id @default(autoincrement())\n userId Int\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n title String\n scene String @default(\"\") // 出差 | 回老家 | 自定义\n note String @default(\"\")\n archived Boolean @default(false)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n items CheckListItem[]\n\n @@index([userId, archived])\n}\n\n// 检查项: 勾选即完成\nmodel CheckListItem {\n id Int @id @default(autoincrement())\n listId Int\n list CheckList @relation(fields: [listId], references: [id], onDelete: Cascade)\n title String\n note String @default(\"\")\n done Boolean @default(false)\n doneAt DateTime?\n sortOrder Int @default(0)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([listId, sortOrder])\n}\n\n// 清单模板: builtin = 系统预置 (userId 为空); 否则为用户自定义\nmodel CheckListTemplate {\n id Int @id @default(autoincrement())\n userId Int?\n user User? @relation(fields: [userId], references: [id], onDelete: Cascade)\n name String\n scene String @default(\"\")\n items Json // [{ title, note }]\n builtin Boolean @default(false)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userId, builtin])\n}\n\n// ================== 任务模块 (V0.2 任务模块需求文档 T-*) ==================\n// 口径见 docs/V0.2/任务模块/任务模块数据库设计文档.md\n// 项目 = 隔离 + 权限单位; 看板列是实体(可增删改排序);\n// 任务状态(todo/doing/done) 与 看板列 是两个正交维度, 由列的 boundStatus 决定是否联动.\n\nmodel Project {\n id Int @id @default(autoincrement())\n name String @db.VarChar(50)\n ownerId Int\n owner User @relation(\"ProjectOwner\", fields: [ownerId], references: [id], onDelete: Cascade)\n isPersonal Boolean @default(false)\n archived Boolean @default(false)\n notes Json @default(\"[]\") // 项目信息块 [{ title, content }] (T-PJ-13)\n taskKinds Json? // 任务类型标签列表 (未配置时服务端回落默认四类)\n icon String? @db.Text // 项目图标 (data URL, 客户端裁剪为 96x96 JPEG)\n autoArchive String @default(\"never\") @db.VarChar(8) // 自动归档档位: 3d/1w/1m/never (T-ARC-02)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n members ProjectMember[]\n columns BoardColumn[]\n tasks Task[]\n\n @@index([ownerId])\n @@index([archived])\n}\n\nmodel ProjectMember {\n id Int @id @default(autoincrement())\n projectId Int\n project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)\n userId Int\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n permission String @default(\"member\")\n createdAt DateTime @default(now())\n\n @@unique([projectId, userId])\n @@index([userId])\n}\n\nmodel BoardColumn {\n id Int @id @default(autoincrement())\n projectId Int\n project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)\n name String @db.VarChar(20)\n sortOrder Int @default(0)\n boundStatus String? @db.VarChar(8)\n retention String @default(\"forever\") @db.VarChar(8)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n tasks Task[]\n\n @@unique([projectId, name])\n @@index([projectId, sortOrder])\n}\n\nmodel Task {\n id Int @id @default(autoincrement())\n projectId Int\n project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)\n columnId Int\n column BoardColumn @relation(fields: [columnId], references: [id], onDelete: Restrict)\n parentId Int?\n parent Task? @relation(\"Subtask\", fields: [parentId], references: [id], onDelete: Cascade)\n children Task[] @relation(\"Subtask\")\n\n title String @db.VarChar(200)\n description String @default(\"\") @db.Text\n kind String? @db.VarChar(20) // 任务类型标签 (项目 taskKinds 之一)\n markDate DateTime? // 时间标记 (完整日期存储, 展示为 MM-dd)\n status String @default(\"todo\") @db.VarChar(8)\n doneAt DateTime?\n\n assigneeId Int?\n assignee User? @relation(\"TaskAssignee\", fields: [assigneeId], references: [id], onDelete: SetNull)\n creatorId Int\n creator User @relation(\"TaskCreator\", fields: [creatorId], references: [id], onDelete: Cascade)\n\n extras Json @default(\"[]\")\n sortOrder Int @default(0)\n archived Boolean @default(false)\n archivedAt DateTime?\n archiveSource String? @db.VarChar(8) // manual | auto (T-ARC)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n members TaskMember[]\n tags TaskTag[]\n\n @@index([projectId, columnId])\n @@index([projectId, status])\n @@index([parentId])\n @@index([projectId, doneAt])\n @@index([projectId, archived, archivedAt])\n @@index([projectId, status, archived])\n}\n\nmodel TaskMember {\n id Int @id @default(autoincrement())\n taskId Int\n task Task @relation(fields: [taskId], references: [id], onDelete: Cascade)\n userId Int\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([taskId, userId])\n}\n\nmodel TaskTag {\n id Int @id @default(autoincrement())\n taskId Int\n task Task @relation(fields: [taskId], references: [id], onDelete: Cascade)\n name String @db.VarChar(20)\n\n @@index([taskId])\n}\n", + "activeProvider": "postgresql", + "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Get a free hosted Postgres database in seconds: `npx create-db`\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"../generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\nmodel User {\n id Int @id @default(autoincrement())\n name String\n email String @unique\n password String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n // V0.2 打卡 / 清单: 用户删除时级联清理\n habits Habit[]\n checkIns CheckIn[]\n checkLists CheckList[]\n templates CheckListTemplate[]\n\n // V0.2 任务模块\n ownedProjects Project[] @relation(\"ProjectOwner\")\n projectMembers ProjectMember[]\n assignedTasks Task[] @relation(\"TaskAssignee\")\n createdTasks Task[] @relation(\"TaskCreator\")\n taskMembers TaskMember[]\n}\n\nmodel Article {\n id Int @id @default(autoincrement())\n title String\n slug String @unique\n content String\n date String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Strategy {\n id Int @id @default(autoincrement())\n name String\n description String\n data Json\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Indicator {\n id Int @id @default(autoincrement())\n name String @unique\n groupName String\n title String @default(\"\")\n unit String @default(\"\")\n source String @default(\"\")\n frequency String @default(\"month\") // year | quarter | month | day\n hidden Boolean @default(false) // true = 数据/脚本保留, 但不在前端展示\n points IndicatorPoint[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel IndicatorPoint {\n id Int @id @default(autoincrement())\n indicatorId Int\n indicator Indicator @relation(fields: [indicatorId], references: [id], onDelete: Cascade)\n period String // \"2024\" | \"2024-Q1\" | \"2024-01\" | \"2024-01-15\"\n value Float\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@unique([indicatorId, period])\n}\n\n// 新闻: 每天 3 点由 mx_finance_search_news 拉取, 按影响大小排序, 累加多日供首页无限滚动\nmodel News {\n id Int @id @default(autoincrement())\n title String\n summary String @default(\"\")\n content String? @db.Text\n source String @default(\"\")\n url String @default(\"\")\n publishedAt DateTime\n impactRank Int\n createdAt DateTime @default(now())\n\n @@unique([title, publishedAt])\n @@index([publishedAt])\n}\n\n// 报警: refresh 写库时比对同 (indicatorName, period) 的跨源数据, 差异超阈值记录\nmodel Alert {\n id Int @id @default(autoincrement())\n indicatorName String\n period String\n valueA Float\n valueB Float\n sourceA String\n sourceB String\n diff Float\n diffRatio Float\n createdAt DateTime @default(now())\n\n @@index([createdAt])\n}\n\n// 服务器监控: 对接 komari 公开 API\nmodel ServerNode {\n id Int @id @default(autoincrement())\n uuid String @unique\n name String\n cpuName String @default(\"\")\n os String @default(\"\")\n region String @default(\"\")\n memTotal BigInt @default(0)\n diskTotal BigInt @default(0)\n cpuCores Int @default(0)\n // 最新实时快照\n cpuUsage Float @default(0)\n ramUsed BigInt @default(0)\n swapUsed BigInt @default(0)\n load1 Float @default(0)\n load5 Float @default(0)\n load15 Float @default(0)\n diskUsed BigInt @default(0)\n netIn BigInt @default(0)\n netOut BigInt @default(0)\n uptime BigInt @default(0)\n process Int @default(0)\n connections Int @default(0)\n status String @default(\"unknown\") // online | offline | unknown\n recordedAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// 时序历史: 每节点每分钟一条 (komari records 1 分钟粒度)\nmodel ServerNodeHistory {\n id Int @id @default(autoincrement())\n uuid String\n period DateTime\n cpu Float @default(0)\n ram BigInt @default(0)\n load Float @default(0)\n disk BigInt @default(0)\n netIn BigInt @default(0)\n netOut BigInt @default(0)\n process Int @default(0)\n connections Int @default(0)\n createdAt DateTime @default(now())\n\n @@unique([uuid, period])\n @@index([uuid, period])\n}\n\n// 服务健康检查: 本应用自检 (健康端点 / DB / 第三方)\nmodel ServiceCheck {\n id Int @id @default(autoincrement())\n name String @unique\n url String\n status String @default(\"unknown\") // up | down | unknown\n latencyMs Int @default(0)\n message String @default(\"\")\n lastCheckAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Econ_SowInventory {\n id Int @id @default(autoincrement())\n month String @unique\n inventory Int // 能繁母猪数量(万头)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel ScraperCache {\n id Int @id @default(autoincrement())\n scraperName String @unique // 爬虫名称,如:sow-inventory\n lastDataHash String? // 上次数据指纹\n lastUpdateAt DateTime // 上次更新时间\n metadata Json? // 其他元数据\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// 浙江省油价历史 (apizero price 接口每日抓取)\n// 每天 04:00 cron 触发: 检查 schedule 里待定且 <= 昨天的调价日, 抓 price?province=浙江 存本表\n// unique (date, province, fuel) 防重复\nmodel OilPriceHistory {\n id Int @id @default(autoincrement())\n date DateTime // 调价日次日 (即数据实际抓取日)\n province String // '浙江'\n fuel String // '92' | '95' | '0'\n price Float // 油价 (元/升, 4 位小数足够)\n source String @default(\"apizero\")\n createdAt DateTime @default(now())\n\n @@unique([date, province, fuel])\n @@index([province, fuel, date])\n}\n\n// ==================== 环境监控:米家 ====================\n\n// 米家授权状态 (DiskCache 存凭证, 本表只存状态/错误供前端展示)\nmodel MihomeAccount {\n id Int @id @default(autoincrement())\n key String @unique @default(\"default\")\n userId String @default(\"\")\n status String @default(\"unknown\") // ok | pending | expired\n lastError String @default(\"\")\n updatedAt DateTime @updatedAt\n}\n\nmodel MihomeHome {\n id Int @id @default(autoincrement())\n homeId String @unique\n name String\n createdAt DateTime @default(now())\n devices MihomeDevice[]\n}\n\nmodel MihomeDevice {\n id Int @id @default(autoincrement())\n did String @unique\n homeId String\n home MihomeHome @relation(fields: [homeId], references: [homeId])\n model String\n name String\n alias String? // 用户别名, 仅本应用展示\n tempSiid Int\n tempPiid Int\n humSiid Int\n humPiid Int\n battSiid Int // 电池电量属性 (炎米 3.1003 / 青萍 2.3)\n battPiid Int\n battery Int? // 最近一次电量 (每天读一次, 标题展示用)\n batteryAt DateTime? // 电量读取时间 (当天缓存, 不频繁更新)\n enabled Boolean @default(true)\n lastSyncAt DateTime?\n createdAt DateTime @default(now())\n samples MihomeEnvSample[]\n hours MihomeEnvHour[]\n}\n\n// 日档: 月视图(逐日)数据源; unique (deviceId, date) 防重\nmodel MihomeEnvSample {\n id Int @id @default(autoincrement())\n deviceId Int\n device MihomeDevice @relation(fields: [deviceId], references: [id], onDelete: Cascade)\n date DateTime // 采样日 (Asia/Shanghai 当日 00:00 存 UTC)\n temperature Float? // 当日最后一次实时值 (或 vendor hour 均值)\n humidity Float?\n temperatureAvg Float? // 当日均值 (由小时档聚合, 或 vendor_hour)\n humidityAvg Float?\n temperatureMin Float? // 当日最低\n temperatureMax Float? // 当日最高\n humidityMin Float?\n humidityMax Float?\n origin String @default(\"live\") // live | vendor_history | backfill\n sampledAt DateTime?\n raw Json?\n createdAt DateTime @default(now())\n\n @@unique([deviceId, date])\n @@index([deviceId, date])\n}\n\n// 小时档: 当天视图(逐小时)数据源; unique (deviceId, hour) 防重\nmodel MihomeEnvHour {\n id Int @id @default(autoincrement())\n deviceId Int\n device MihomeDevice @relation(fields: [deviceId], references: [id], onDelete: Cascade)\n hour DateTime // Asia/Shanghai 整点 (存 UTC)\n temperatureAvg Float? // 该小时均值 (live 采样点, 或 vendor_hour)\n humidityAvg Float?\n raw Json?\n createdAt DateTime @default(now())\n\n @@unique([deviceId, hour])\n @@index([deviceId, hour])\n}\n\n// ==================== 打卡 / 日历 / 清单 (V0.2) ====================\n\n// 打卡项: 周期性目标 (每天 / 每周 / 每月 / 每年 n 次)\nmodel Habit {\n id Int @id @default(autoincrement())\n userId Int\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n name String\n period String @default(\"day\") // day | week | month | year\n target Int @default(1) // 周期内目标次数 n (>=1)\n color String @default(\"#1677ff\")\n icon String @default(\"\") // emoji 或图标名, 预留\n note String @default(\"\")\n archived Boolean @default(false) // 归档: 不出现在今日待办, 历史保留\n sortOrder Int @default(0)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n records CheckIn[]\n\n @@index([userId, archived, sortOrder])\n}\n\n// 打卡记录: 一次打卡 = 一条; 同日多次 => seq 递增 (1..n, 超额继续累加)\nmodel CheckIn {\n id Int @id @default(autoincrement())\n habitId Int\n habit Habit @relation(fields: [habitId], references: [id], onDelete: Cascade)\n userId Int\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n date String @db.VarChar(10) // 本地日历日 \"YYYY-MM-DD\" (Asia/Shanghai)\n seq Int @default(1) // 当日第几次\n note String @default(\"\")\n source String @default(\"user\") // user | backfill (补打)\n createdAt DateTime @default(now())\n\n @@unique([habitId, date, seq])\n @@index([userId, date])\n @@index([habitId, date])\n}\n\n// 检查清单: 出差 / 回老家 等场景的一次性清单\nmodel CheckList {\n id Int @id @default(autoincrement())\n userId Int\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n title String\n scene String @default(\"\") // 出差 | 回老家 | 自定义\n note String @default(\"\")\n archived Boolean @default(false)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n items CheckListItem[]\n\n @@index([userId, archived])\n}\n\n// 检查项: 勾选即完成\nmodel CheckListItem {\n id Int @id @default(autoincrement())\n listId Int\n list CheckList @relation(fields: [listId], references: [id], onDelete: Cascade)\n title String\n note String @default(\"\")\n done Boolean @default(false)\n doneAt DateTime?\n sortOrder Int @default(0)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([listId, sortOrder])\n}\n\n// 清单模板: builtin = 系统预置 (userId 为空); 否则为用户自定义\nmodel CheckListTemplate {\n id Int @id @default(autoincrement())\n userId Int?\n user User? @relation(fields: [userId], references: [id], onDelete: Cascade)\n name String\n scene String @default(\"\")\n items Json // [{ title, note }]\n builtin Boolean @default(false)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userId, builtin])\n}\n\n// ================== 任务模块 (V0.2 任务模块需求文档 T-*) ==================\n// 口径见 docs/V0.2/任务模块/任务模块数据库设计文档.md\n// 项目 = 隔离 + 权限单位; 看板列是实体(可增删改排序);\n// 任务状态(todo/doing/done) 与 看板列 是两个正交维度, 由列的 boundStatus 决定是否联动.\n\nmodel Project {\n id Int @id @default(autoincrement())\n uuid String @unique @db.VarChar(36) // 同步标识: 客户端生成 (0.2.1 离线编辑, 见 docs/V0.2/离线编辑模块)\n code String @unique @db.VarChar(8) // 项目短编号: 用户自拟 2~8 位前缀, 全局唯一, 服务端分配\n name String @db.VarChar(50)\n ownerId Int\n owner User @relation(\"ProjectOwner\", fields: [ownerId], references: [id], onDelete: Cascade)\n isPersonal Boolean @default(false)\n archived Boolean @default(false)\n notes Json @default(\"[]\") // 项目信息块 [{ title, content }] (T-PJ-13)\n taskKinds Json? // 任务类型标签列表 (未配置时服务端回落默认四类)\n icon String? @db.Text // 项目图标 (data URL, 客户端裁剪为 96x96 JPEG)\n autoArchive String @default(\"never\") @db.VarChar(8) // 自动归档档位: 3d/1w/1m/never (T-ARC-02)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n members ProjectMember[]\n columns BoardColumn[]\n tasks Task[]\n\n @@index([ownerId])\n @@index([archived])\n}\n\nmodel ProjectMember {\n id Int @id @default(autoincrement())\n uuid String @unique @db.VarChar(36) // 同步标识: 客户端生成 (0.2.1 离线编辑)\n projectUuid String? @db.VarChar(36) // 外键 uuid 镜像 (触发器维护, 库级 NOT NULL)\n projectId Int\n project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)\n userId Int\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n permission String @default(\"member\")\n createdAt DateTime @default(now())\n\n @@unique([projectId, userId])\n @@index([userId])\n}\n\nmodel BoardColumn {\n id Int @id @default(autoincrement())\n uuid String @unique @db.VarChar(36) // 同步标识: 客户端生成 (0.2.1 离线编辑)\n projectUuid String? @db.VarChar(36) // projectId 的 uuid 镜像 (触发器维护, 库级 NOT NULL; Prisma 侧可空以便触发器填充)\n projectId Int\n project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)\n name String @db.VarChar(20)\n sortOrder Int @default(0)\n boundStatus String? @db.VarChar(8)\n retention String @default(\"forever\") @db.VarChar(8)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n tasks Task[]\n\n @@unique([projectId, name])\n @@index([projectId, sortOrder])\n}\n\nmodel Task {\n id Int @id @default(autoincrement())\n uuid String @unique @db.VarChar(36) // 同步标识: 客户端生成 (0.2.1 离线编辑)\n projectUuid String? @db.VarChar(36) // 外键 uuid 镜像 (触发器维护, 库级 NOT NULL)\n columnUuid String? @db.VarChar(36)\n parentUuid String? @db.VarChar(36)\n projectId Int\n project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)\n columnId Int\n column BoardColumn @relation(fields: [columnId], references: [id], onDelete: Restrict)\n parentId Int?\n parent Task? @relation(\"Subtask\", fields: [parentId], references: [id], onDelete: Cascade)\n children Task[] @relation(\"Subtask\")\n\n title String @db.VarChar(200)\n description String @default(\"\") @db.Text\n kind String? @db.VarChar(20) // 任务类型标签 (项目 taskKinds 之一)\n markDate DateTime? // 时间标记 (完整日期存储, 展示为 MM-dd)\n status String @default(\"todo\") @db.VarChar(8)\n doneAt DateTime?\n\n assigneeId Int?\n assignee User? @relation(\"TaskAssignee\", fields: [assigneeId], references: [id], onDelete: SetNull)\n creatorId Int\n creator User @relation(\"TaskCreator\", fields: [creatorId], references: [id], onDelete: Cascade)\n\n extras Json @default(\"[]\")\n sortOrder Int @default(0)\n archived Boolean @default(false)\n archivedAt DateTime?\n archiveSource String? @db.VarChar(8) // manual | auto (T-ARC)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n members TaskMember[]\n tags TaskTag[]\n\n number Int? // 项目内自增编号 (服务端分配, 展示为 `code-number`); 本地未定号的离线新建任务为空\n\n @@unique([projectId, number])\n @@index([projectId, columnId])\n @@index([projectId, status])\n @@index([parentId])\n @@index([projectId, doneAt])\n @@index([projectId, archived, archivedAt])\n @@index([projectId, status, archived])\n}\n\nmodel TaskMember {\n id Int @id @default(autoincrement())\n uuid String @unique @db.VarChar(36) // 同步标识: 客户端生成 (0.2.1 离线编辑)\n taskUuid String? @db.VarChar(36) // 外键 uuid 镜像 (触发器维护, 库级 NOT NULL)\n taskId Int\n task Task @relation(fields: [taskId], references: [id], onDelete: Cascade)\n userId Int\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([taskId, userId])\n}\n\nmodel TaskTag {\n id Int @id @default(autoincrement())\n uuid String @unique @db.VarChar(36) // 同步标识: 客户端生成 (0.2.1 离线编辑)\n taskUuid String? @db.VarChar(36) // 外键 uuid 镜像 (触发器维护, 库级 NOT NULL)\n taskId Int\n task Task @relation(fields: [taskId], references: [id], onDelete: Cascade)\n name String @db.VarChar(20)\n\n @@index([taskId])\n}\n", "runtimeDataModel": { "models": {}, "enums": {}, @@ -32,10 +32,10 @@ const config: runtime.GetPrismaClientConfig = { } } -config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"habits\",\"kind\":\"object\",\"type\":\"Habit\",\"relationName\":\"HabitToUser\"},{\"name\":\"checkIns\",\"kind\":\"object\",\"type\":\"CheckIn\",\"relationName\":\"CheckInToUser\"},{\"name\":\"checkLists\",\"kind\":\"object\",\"type\":\"CheckList\",\"relationName\":\"CheckListToUser\"},{\"name\":\"templates\",\"kind\":\"object\",\"type\":\"CheckListTemplate\",\"relationName\":\"CheckListTemplateToUser\"},{\"name\":\"ownedProjects\",\"kind\":\"object\",\"type\":\"Project\",\"relationName\":\"ProjectOwner\"},{\"name\":\"projectMembers\",\"kind\":\"object\",\"type\":\"ProjectMember\",\"relationName\":\"ProjectMemberToUser\"},{\"name\":\"assignedTasks\",\"kind\":\"object\",\"type\":\"Task\",\"relationName\":\"TaskAssignee\"},{\"name\":\"createdTasks\",\"kind\":\"object\",\"type\":\"Task\",\"relationName\":\"TaskCreator\"},{\"name\":\"taskMembers\",\"kind\":\"object\",\"type\":\"TaskMember\",\"relationName\":\"TaskMemberToUser\"}],\"dbName\":null},\"Article\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slug\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"content\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Strategy\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"data\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Indicator\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"groupName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"unit\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"frequency\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"hidden\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"points\",\"kind\":\"object\",\"type\":\"IndicatorPoint\",\"relationName\":\"IndicatorToIndicatorPoint\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"IndicatorPoint\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"indicatorId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"indicator\",\"kind\":\"object\",\"type\":\"Indicator\",\"relationName\":\"IndicatorToIndicatorPoint\"},{\"name\":\"period\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"News\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"summary\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"content\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"url\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"publishedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"impactRank\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Alert\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"indicatorName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"period\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"valueA\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"valueB\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"sourceA\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sourceB\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"diff\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"diffRatio\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ServerNode\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"uuid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"cpuName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"os\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"region\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memTotal\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"diskTotal\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"cpuCores\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"cpuUsage\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"ramUsed\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"swapUsed\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"load1\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"load5\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"load15\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"diskUsed\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netIn\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netOut\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"uptime\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"process\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"connections\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"recordedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ServerNodeHistory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"uuid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"period\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"cpu\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"ram\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"load\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"disk\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netIn\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netOut\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"process\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"connections\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ServiceCheck\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"url\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"latencyMs\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"message\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastCheckAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Econ_SowInventory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"month\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"inventory\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ScraperCache\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"scraperName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastDataHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastUpdateAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"metadata\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"OilPriceHistory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"province\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"fuel\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"price\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"MihomeAccount\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"key\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastError\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"MihomeHome\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"homeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"devices\",\"kind\":\"object\",\"type\":\"MihomeDevice\",\"relationName\":\"MihomeDeviceToMihomeHome\"}],\"dbName\":null},\"MihomeDevice\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"did\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"homeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"home\",\"kind\":\"object\",\"type\":\"MihomeHome\",\"relationName\":\"MihomeDeviceToMihomeHome\"},{\"name\":\"model\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"alias\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"tempSiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"tempPiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"humSiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"humPiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"battSiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"battPiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"battery\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"batteryAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"enabled\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"lastSyncAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"samples\",\"kind\":\"object\",\"type\":\"MihomeEnvSample\",\"relationName\":\"MihomeDeviceToMihomeEnvSample\"},{\"name\":\"hours\",\"kind\":\"object\",\"type\":\"MihomeEnvHour\",\"relationName\":\"MihomeDeviceToMihomeEnvHour\"}],\"dbName\":null},\"MihomeEnvSample\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"deviceId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"device\",\"kind\":\"object\",\"type\":\"MihomeDevice\",\"relationName\":\"MihomeDeviceToMihomeEnvSample\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"temperature\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidity\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"temperatureAvg\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidityAvg\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"temperatureMin\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"temperatureMax\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidityMin\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidityMax\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"origin\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sampledAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"raw\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"MihomeEnvHour\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"deviceId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"device\",\"kind\":\"object\",\"type\":\"MihomeDevice\",\"relationName\":\"MihomeDeviceToMihomeEnvHour\"},{\"name\":\"hour\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"temperatureAvg\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidityAvg\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"raw\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Habit\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"HabitToUser\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"period\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"target\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"color\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"icon\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"note\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"archived\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"records\",\"kind\":\"object\",\"type\":\"CheckIn\",\"relationName\":\"CheckInToHabit\"}],\"dbName\":null},\"CheckIn\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"habitId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"habit\",\"kind\":\"object\",\"type\":\"Habit\",\"relationName\":\"CheckInToHabit\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"CheckInToUser\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"seq\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"note\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"CheckList\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"CheckListToUser\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"scene\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"note\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"archived\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"items\",\"kind\":\"object\",\"type\":\"CheckListItem\",\"relationName\":\"CheckListToCheckListItem\"}],\"dbName\":null},\"CheckListItem\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"listId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"list\",\"kind\":\"object\",\"type\":\"CheckList\",\"relationName\":\"CheckListToCheckListItem\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"note\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"done\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"doneAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"CheckListTemplate\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"CheckListTemplateToUser\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"scene\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"items\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"builtin\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Project\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"ownerId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"owner\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ProjectOwner\"},{\"name\":\"isPersonal\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"archived\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"notes\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"taskKinds\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"icon\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"autoArchive\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"members\",\"kind\":\"object\",\"type\":\"ProjectMember\",\"relationName\":\"ProjectToProjectMember\"},{\"name\":\"columns\",\"kind\":\"object\",\"type\":\"BoardColumn\",\"relationName\":\"BoardColumnToProject\"},{\"name\":\"tasks\",\"kind\":\"object\",\"type\":\"Task\",\"relationName\":\"ProjectToTask\"}],\"dbName\":null},\"ProjectMember\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"projectId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"project\",\"kind\":\"object\",\"type\":\"Project\",\"relationName\":\"ProjectToProjectMember\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ProjectMemberToUser\"},{\"name\":\"permission\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"BoardColumn\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"projectId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"project\",\"kind\":\"object\",\"type\":\"Project\",\"relationName\":\"BoardColumnToProject\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"boundStatus\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"retention\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"tasks\",\"kind\":\"object\",\"type\":\"Task\",\"relationName\":\"BoardColumnToTask\"}],\"dbName\":null},\"Task\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"projectId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"project\",\"kind\":\"object\",\"type\":\"Project\",\"relationName\":\"ProjectToTask\"},{\"name\":\"columnId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"column\",\"kind\":\"object\",\"type\":\"BoardColumn\",\"relationName\":\"BoardColumnToTask\"},{\"name\":\"parentId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"parent\",\"kind\":\"object\",\"type\":\"Task\",\"relationName\":\"Subtask\"},{\"name\":\"children\",\"kind\":\"object\",\"type\":\"Task\",\"relationName\":\"Subtask\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"kind\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"markDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"doneAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"assigneeId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"assignee\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"TaskAssignee\"},{\"name\":\"creatorId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"creator\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"TaskCreator\"},{\"name\":\"extras\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"archived\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"archivedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"archiveSource\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"members\",\"kind\":\"object\",\"type\":\"TaskMember\",\"relationName\":\"TaskToTaskMember\"},{\"name\":\"tags\",\"kind\":\"object\",\"type\":\"TaskTag\",\"relationName\":\"TaskToTaskTag\"}],\"dbName\":null},\"TaskMember\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"taskId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"task\",\"kind\":\"object\",\"type\":\"Task\",\"relationName\":\"TaskToTaskMember\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"TaskMemberToUser\"}],\"dbName\":null},\"TaskTag\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"taskId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"task\",\"kind\":\"object\",\"type\":\"Task\",\"relationName\":\"TaskToTaskTag\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"habits\",\"kind\":\"object\",\"type\":\"Habit\",\"relationName\":\"HabitToUser\"},{\"name\":\"checkIns\",\"kind\":\"object\",\"type\":\"CheckIn\",\"relationName\":\"CheckInToUser\"},{\"name\":\"checkLists\",\"kind\":\"object\",\"type\":\"CheckList\",\"relationName\":\"CheckListToUser\"},{\"name\":\"templates\",\"kind\":\"object\",\"type\":\"CheckListTemplate\",\"relationName\":\"CheckListTemplateToUser\"},{\"name\":\"ownedProjects\",\"kind\":\"object\",\"type\":\"Project\",\"relationName\":\"ProjectOwner\"},{\"name\":\"projectMembers\",\"kind\":\"object\",\"type\":\"ProjectMember\",\"relationName\":\"ProjectMemberToUser\"},{\"name\":\"assignedTasks\",\"kind\":\"object\",\"type\":\"Task\",\"relationName\":\"TaskAssignee\"},{\"name\":\"createdTasks\",\"kind\":\"object\",\"type\":\"Task\",\"relationName\":\"TaskCreator\"},{\"name\":\"taskMembers\",\"kind\":\"object\",\"type\":\"TaskMember\",\"relationName\":\"TaskMemberToUser\"}],\"dbName\":null},\"Article\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slug\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"content\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Strategy\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"data\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Indicator\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"groupName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"unit\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"frequency\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"hidden\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"points\",\"kind\":\"object\",\"type\":\"IndicatorPoint\",\"relationName\":\"IndicatorToIndicatorPoint\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"IndicatorPoint\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"indicatorId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"indicator\",\"kind\":\"object\",\"type\":\"Indicator\",\"relationName\":\"IndicatorToIndicatorPoint\"},{\"name\":\"period\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"News\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"summary\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"content\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"url\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"publishedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"impactRank\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Alert\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"indicatorName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"period\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"valueA\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"valueB\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"sourceA\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sourceB\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"diff\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"diffRatio\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ServerNode\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"uuid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"cpuName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"os\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"region\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memTotal\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"diskTotal\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"cpuCores\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"cpuUsage\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"ramUsed\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"swapUsed\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"load1\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"load5\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"load15\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"diskUsed\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netIn\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netOut\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"uptime\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"process\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"connections\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"recordedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ServerNodeHistory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"uuid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"period\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"cpu\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"ram\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"load\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"disk\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netIn\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netOut\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"process\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"connections\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ServiceCheck\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"url\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"latencyMs\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"message\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastCheckAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Econ_SowInventory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"month\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"inventory\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ScraperCache\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"scraperName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastDataHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastUpdateAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"metadata\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"OilPriceHistory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"province\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"fuel\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"price\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"MihomeAccount\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"key\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastError\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"MihomeHome\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"homeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"devices\",\"kind\":\"object\",\"type\":\"MihomeDevice\",\"relationName\":\"MihomeDeviceToMihomeHome\"}],\"dbName\":null},\"MihomeDevice\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"did\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"homeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"home\",\"kind\":\"object\",\"type\":\"MihomeHome\",\"relationName\":\"MihomeDeviceToMihomeHome\"},{\"name\":\"model\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"alias\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"tempSiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"tempPiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"humSiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"humPiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"battSiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"battPiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"battery\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"batteryAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"enabled\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"lastSyncAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"samples\",\"kind\":\"object\",\"type\":\"MihomeEnvSample\",\"relationName\":\"MihomeDeviceToMihomeEnvSample\"},{\"name\":\"hours\",\"kind\":\"object\",\"type\":\"MihomeEnvHour\",\"relationName\":\"MihomeDeviceToMihomeEnvHour\"}],\"dbName\":null},\"MihomeEnvSample\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"deviceId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"device\",\"kind\":\"object\",\"type\":\"MihomeDevice\",\"relationName\":\"MihomeDeviceToMihomeEnvSample\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"temperature\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidity\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"temperatureAvg\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidityAvg\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"temperatureMin\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"temperatureMax\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidityMin\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidityMax\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"origin\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sampledAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"raw\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"MihomeEnvHour\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"deviceId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"device\",\"kind\":\"object\",\"type\":\"MihomeDevice\",\"relationName\":\"MihomeDeviceToMihomeEnvHour\"},{\"name\":\"hour\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"temperatureAvg\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidityAvg\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"raw\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Habit\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"HabitToUser\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"period\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"target\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"color\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"icon\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"note\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"archived\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"records\",\"kind\":\"object\",\"type\":\"CheckIn\",\"relationName\":\"CheckInToHabit\"}],\"dbName\":null},\"CheckIn\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"habitId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"habit\",\"kind\":\"object\",\"type\":\"Habit\",\"relationName\":\"CheckInToHabit\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"CheckInToUser\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"seq\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"note\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"CheckList\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"CheckListToUser\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"scene\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"note\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"archived\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"items\",\"kind\":\"object\",\"type\":\"CheckListItem\",\"relationName\":\"CheckListToCheckListItem\"}],\"dbName\":null},\"CheckListItem\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"listId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"list\",\"kind\":\"object\",\"type\":\"CheckList\",\"relationName\":\"CheckListToCheckListItem\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"note\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"done\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"doneAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"CheckListTemplate\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"CheckListTemplateToUser\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"scene\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"items\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"builtin\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Project\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"uuid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"code\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"ownerId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"owner\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ProjectOwner\"},{\"name\":\"isPersonal\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"archived\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"notes\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"taskKinds\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"icon\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"autoArchive\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"members\",\"kind\":\"object\",\"type\":\"ProjectMember\",\"relationName\":\"ProjectToProjectMember\"},{\"name\":\"columns\",\"kind\":\"object\",\"type\":\"BoardColumn\",\"relationName\":\"BoardColumnToProject\"},{\"name\":\"tasks\",\"kind\":\"object\",\"type\":\"Task\",\"relationName\":\"ProjectToTask\"}],\"dbName\":null},\"ProjectMember\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"uuid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"projectUuid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"projectId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"project\",\"kind\":\"object\",\"type\":\"Project\",\"relationName\":\"ProjectToProjectMember\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ProjectMemberToUser\"},{\"name\":\"permission\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"BoardColumn\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"uuid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"projectUuid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"projectId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"project\",\"kind\":\"object\",\"type\":\"Project\",\"relationName\":\"BoardColumnToProject\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"boundStatus\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"retention\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"tasks\",\"kind\":\"object\",\"type\":\"Task\",\"relationName\":\"BoardColumnToTask\"}],\"dbName\":null},\"Task\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"uuid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"projectUuid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"columnUuid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"parentUuid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"projectId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"project\",\"kind\":\"object\",\"type\":\"Project\",\"relationName\":\"ProjectToTask\"},{\"name\":\"columnId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"column\",\"kind\":\"object\",\"type\":\"BoardColumn\",\"relationName\":\"BoardColumnToTask\"},{\"name\":\"parentId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"parent\",\"kind\":\"object\",\"type\":\"Task\",\"relationName\":\"Subtask\"},{\"name\":\"children\",\"kind\":\"object\",\"type\":\"Task\",\"relationName\":\"Subtask\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"kind\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"markDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"doneAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"assigneeId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"assignee\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"TaskAssignee\"},{\"name\":\"creatorId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"creator\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"TaskCreator\"},{\"name\":\"extras\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"archived\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"archivedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"archiveSource\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"members\",\"kind\":\"object\",\"type\":\"TaskMember\",\"relationName\":\"TaskToTaskMember\"},{\"name\":\"tags\",\"kind\":\"object\",\"type\":\"TaskTag\",\"relationName\":\"TaskToTaskTag\"},{\"name\":\"number\",\"kind\":\"scalar\",\"type\":\"Int\"}],\"dbName\":null},\"TaskMember\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"uuid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"taskUuid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"taskId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"task\",\"kind\":\"object\",\"type\":\"Task\",\"relationName\":\"TaskToTaskMember\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"TaskMemberToUser\"}],\"dbName\":null},\"TaskTag\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"uuid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"taskUuid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"taskId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"task\",\"kind\":\"object\",\"type\":\"Task\",\"relationName\":\"TaskToTaskTag\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}") config.parameterizationSchema = { - strings: JSON.parse("[\"where\",\"orderBy\",\"cursor\",\"user\",\"habit\",\"records\",\"_count\",\"habits\",\"checkIns\",\"list\",\"items\",\"checkLists\",\"templates\",\"owner\",\"project\",\"members\",\"column\",\"parent\",\"children\",\"assignee\",\"creator\",\"task\",\"tags\",\"tasks\",\"columns\",\"ownedProjects\",\"projectMembers\",\"assignedTasks\",\"createdTasks\",\"taskMembers\",\"User.findUnique\",\"User.findUniqueOrThrow\",\"User.findFirst\",\"User.findFirstOrThrow\",\"User.findMany\",\"data\",\"User.createOne\",\"User.createMany\",\"User.updateOne\",\"User.updateMany\",\"create\",\"update\",\"User.upsertOne\",\"User.deleteOne\",\"User.deleteMany\",\"having\",\"_avg\",\"_sum\",\"_min\",\"_max\",\"User.groupBy\",\"User.aggregate\",\"Article.findUnique\",\"Article.findUniqueOrThrow\",\"Article.findFirst\",\"Article.findFirstOrThrow\",\"Article.findMany\",\"Article.createOne\",\"Article.createMany\",\"Article.updateOne\",\"Article.updateMany\",\"Article.upsertOne\",\"Article.deleteOne\",\"Article.deleteMany\",\"Article.groupBy\",\"Article.aggregate\",\"Strategy.findUnique\",\"Strategy.findUniqueOrThrow\",\"Strategy.findFirst\",\"Strategy.findFirstOrThrow\",\"Strategy.findMany\",\"Strategy.createOne\",\"Strategy.createMany\",\"Strategy.updateOne\",\"Strategy.updateMany\",\"Strategy.upsertOne\",\"Strategy.deleteOne\",\"Strategy.deleteMany\",\"Strategy.groupBy\",\"Strategy.aggregate\",\"indicator\",\"points\",\"Indicator.findUnique\",\"Indicator.findUniqueOrThrow\",\"Indicator.findFirst\",\"Indicator.findFirstOrThrow\",\"Indicator.findMany\",\"Indicator.createOne\",\"Indicator.createMany\",\"Indicator.updateOne\",\"Indicator.updateMany\",\"Indicator.upsertOne\",\"Indicator.deleteOne\",\"Indicator.deleteMany\",\"Indicator.groupBy\",\"Indicator.aggregate\",\"IndicatorPoint.findUnique\",\"IndicatorPoint.findUniqueOrThrow\",\"IndicatorPoint.findFirst\",\"IndicatorPoint.findFirstOrThrow\",\"IndicatorPoint.findMany\",\"IndicatorPoint.createOne\",\"IndicatorPoint.createMany\",\"IndicatorPoint.updateOne\",\"IndicatorPoint.updateMany\",\"IndicatorPoint.upsertOne\",\"IndicatorPoint.deleteOne\",\"IndicatorPoint.deleteMany\",\"IndicatorPoint.groupBy\",\"IndicatorPoint.aggregate\",\"News.findUnique\",\"News.findUniqueOrThrow\",\"News.findFirst\",\"News.findFirstOrThrow\",\"News.findMany\",\"News.createOne\",\"News.createMany\",\"News.updateOne\",\"News.updateMany\",\"News.upsertOne\",\"News.deleteOne\",\"News.deleteMany\",\"News.groupBy\",\"News.aggregate\",\"Alert.findUnique\",\"Alert.findUniqueOrThrow\",\"Alert.findFirst\",\"Alert.findFirstOrThrow\",\"Alert.findMany\",\"Alert.createOne\",\"Alert.createMany\",\"Alert.updateOne\",\"Alert.updateMany\",\"Alert.upsertOne\",\"Alert.deleteOne\",\"Alert.deleteMany\",\"Alert.groupBy\",\"Alert.aggregate\",\"ServerNode.findUnique\",\"ServerNode.findUniqueOrThrow\",\"ServerNode.findFirst\",\"ServerNode.findFirstOrThrow\",\"ServerNode.findMany\",\"ServerNode.createOne\",\"ServerNode.createMany\",\"ServerNode.updateOne\",\"ServerNode.updateMany\",\"ServerNode.upsertOne\",\"ServerNode.deleteOne\",\"ServerNode.deleteMany\",\"ServerNode.groupBy\",\"ServerNode.aggregate\",\"ServerNodeHistory.findUnique\",\"ServerNodeHistory.findUniqueOrThrow\",\"ServerNodeHistory.findFirst\",\"ServerNodeHistory.findFirstOrThrow\",\"ServerNodeHistory.findMany\",\"ServerNodeHistory.createOne\",\"ServerNodeHistory.createMany\",\"ServerNodeHistory.updateOne\",\"ServerNodeHistory.updateMany\",\"ServerNodeHistory.upsertOne\",\"ServerNodeHistory.deleteOne\",\"ServerNodeHistory.deleteMany\",\"ServerNodeHistory.groupBy\",\"ServerNodeHistory.aggregate\",\"ServiceCheck.findUnique\",\"ServiceCheck.findUniqueOrThrow\",\"ServiceCheck.findFirst\",\"ServiceCheck.findFirstOrThrow\",\"ServiceCheck.findMany\",\"ServiceCheck.createOne\",\"ServiceCheck.createMany\",\"ServiceCheck.updateOne\",\"ServiceCheck.updateMany\",\"ServiceCheck.upsertOne\",\"ServiceCheck.deleteOne\",\"ServiceCheck.deleteMany\",\"ServiceCheck.groupBy\",\"ServiceCheck.aggregate\",\"Econ_SowInventory.findUnique\",\"Econ_SowInventory.findUniqueOrThrow\",\"Econ_SowInventory.findFirst\",\"Econ_SowInventory.findFirstOrThrow\",\"Econ_SowInventory.findMany\",\"Econ_SowInventory.createOne\",\"Econ_SowInventory.createMany\",\"Econ_SowInventory.updateOne\",\"Econ_SowInventory.updateMany\",\"Econ_SowInventory.upsertOne\",\"Econ_SowInventory.deleteOne\",\"Econ_SowInventory.deleteMany\",\"Econ_SowInventory.groupBy\",\"Econ_SowInventory.aggregate\",\"ScraperCache.findUnique\",\"ScraperCache.findUniqueOrThrow\",\"ScraperCache.findFirst\",\"ScraperCache.findFirstOrThrow\",\"ScraperCache.findMany\",\"ScraperCache.createOne\",\"ScraperCache.createMany\",\"ScraperCache.updateOne\",\"ScraperCache.updateMany\",\"ScraperCache.upsertOne\",\"ScraperCache.deleteOne\",\"ScraperCache.deleteMany\",\"ScraperCache.groupBy\",\"ScraperCache.aggregate\",\"OilPriceHistory.findUnique\",\"OilPriceHistory.findUniqueOrThrow\",\"OilPriceHistory.findFirst\",\"OilPriceHistory.findFirstOrThrow\",\"OilPriceHistory.findMany\",\"OilPriceHistory.createOne\",\"OilPriceHistory.createMany\",\"OilPriceHistory.updateOne\",\"OilPriceHistory.updateMany\",\"OilPriceHistory.upsertOne\",\"OilPriceHistory.deleteOne\",\"OilPriceHistory.deleteMany\",\"OilPriceHistory.groupBy\",\"OilPriceHistory.aggregate\",\"MihomeAccount.findUnique\",\"MihomeAccount.findUniqueOrThrow\",\"MihomeAccount.findFirst\",\"MihomeAccount.findFirstOrThrow\",\"MihomeAccount.findMany\",\"MihomeAccount.createOne\",\"MihomeAccount.createMany\",\"MihomeAccount.updateOne\",\"MihomeAccount.updateMany\",\"MihomeAccount.upsertOne\",\"MihomeAccount.deleteOne\",\"MihomeAccount.deleteMany\",\"MihomeAccount.groupBy\",\"MihomeAccount.aggregate\",\"home\",\"device\",\"samples\",\"hours\",\"devices\",\"MihomeHome.findUnique\",\"MihomeHome.findUniqueOrThrow\",\"MihomeHome.findFirst\",\"MihomeHome.findFirstOrThrow\",\"MihomeHome.findMany\",\"MihomeHome.createOne\",\"MihomeHome.createMany\",\"MihomeHome.updateOne\",\"MihomeHome.updateMany\",\"MihomeHome.upsertOne\",\"MihomeHome.deleteOne\",\"MihomeHome.deleteMany\",\"MihomeHome.groupBy\",\"MihomeHome.aggregate\",\"MihomeDevice.findUnique\",\"MihomeDevice.findUniqueOrThrow\",\"MihomeDevice.findFirst\",\"MihomeDevice.findFirstOrThrow\",\"MihomeDevice.findMany\",\"MihomeDevice.createOne\",\"MihomeDevice.createMany\",\"MihomeDevice.updateOne\",\"MihomeDevice.updateMany\",\"MihomeDevice.upsertOne\",\"MihomeDevice.deleteOne\",\"MihomeDevice.deleteMany\",\"MihomeDevice.groupBy\",\"MihomeDevice.aggregate\",\"MihomeEnvSample.findUnique\",\"MihomeEnvSample.findUniqueOrThrow\",\"MihomeEnvSample.findFirst\",\"MihomeEnvSample.findFirstOrThrow\",\"MihomeEnvSample.findMany\",\"MihomeEnvSample.createOne\",\"MihomeEnvSample.createMany\",\"MihomeEnvSample.updateOne\",\"MihomeEnvSample.updateMany\",\"MihomeEnvSample.upsertOne\",\"MihomeEnvSample.deleteOne\",\"MihomeEnvSample.deleteMany\",\"MihomeEnvSample.groupBy\",\"MihomeEnvSample.aggregate\",\"MihomeEnvHour.findUnique\",\"MihomeEnvHour.findUniqueOrThrow\",\"MihomeEnvHour.findFirst\",\"MihomeEnvHour.findFirstOrThrow\",\"MihomeEnvHour.findMany\",\"MihomeEnvHour.createOne\",\"MihomeEnvHour.createMany\",\"MihomeEnvHour.updateOne\",\"MihomeEnvHour.updateMany\",\"MihomeEnvHour.upsertOne\",\"MihomeEnvHour.deleteOne\",\"MihomeEnvHour.deleteMany\",\"MihomeEnvHour.groupBy\",\"MihomeEnvHour.aggregate\",\"Habit.findUnique\",\"Habit.findUniqueOrThrow\",\"Habit.findFirst\",\"Habit.findFirstOrThrow\",\"Habit.findMany\",\"Habit.createOne\",\"Habit.createMany\",\"Habit.updateOne\",\"Habit.updateMany\",\"Habit.upsertOne\",\"Habit.deleteOne\",\"Habit.deleteMany\",\"Habit.groupBy\",\"Habit.aggregate\",\"CheckIn.findUnique\",\"CheckIn.findUniqueOrThrow\",\"CheckIn.findFirst\",\"CheckIn.findFirstOrThrow\",\"CheckIn.findMany\",\"CheckIn.createOne\",\"CheckIn.createMany\",\"CheckIn.updateOne\",\"CheckIn.updateMany\",\"CheckIn.upsertOne\",\"CheckIn.deleteOne\",\"CheckIn.deleteMany\",\"CheckIn.groupBy\",\"CheckIn.aggregate\",\"CheckList.findUnique\",\"CheckList.findUniqueOrThrow\",\"CheckList.findFirst\",\"CheckList.findFirstOrThrow\",\"CheckList.findMany\",\"CheckList.createOne\",\"CheckList.createMany\",\"CheckList.updateOne\",\"CheckList.updateMany\",\"CheckList.upsertOne\",\"CheckList.deleteOne\",\"CheckList.deleteMany\",\"CheckList.groupBy\",\"CheckList.aggregate\",\"CheckListItem.findUnique\",\"CheckListItem.findUniqueOrThrow\",\"CheckListItem.findFirst\",\"CheckListItem.findFirstOrThrow\",\"CheckListItem.findMany\",\"CheckListItem.createOne\",\"CheckListItem.createMany\",\"CheckListItem.updateOne\",\"CheckListItem.updateMany\",\"CheckListItem.upsertOne\",\"CheckListItem.deleteOne\",\"CheckListItem.deleteMany\",\"CheckListItem.groupBy\",\"CheckListItem.aggregate\",\"CheckListTemplate.findUnique\",\"CheckListTemplate.findUniqueOrThrow\",\"CheckListTemplate.findFirst\",\"CheckListTemplate.findFirstOrThrow\",\"CheckListTemplate.findMany\",\"CheckListTemplate.createOne\",\"CheckListTemplate.createMany\",\"CheckListTemplate.updateOne\",\"CheckListTemplate.updateMany\",\"CheckListTemplate.upsertOne\",\"CheckListTemplate.deleteOne\",\"CheckListTemplate.deleteMany\",\"CheckListTemplate.groupBy\",\"CheckListTemplate.aggregate\",\"Project.findUnique\",\"Project.findUniqueOrThrow\",\"Project.findFirst\",\"Project.findFirstOrThrow\",\"Project.findMany\",\"Project.createOne\",\"Project.createMany\",\"Project.updateOne\",\"Project.updateMany\",\"Project.upsertOne\",\"Project.deleteOne\",\"Project.deleteMany\",\"Project.groupBy\",\"Project.aggregate\",\"ProjectMember.findUnique\",\"ProjectMember.findUniqueOrThrow\",\"ProjectMember.findFirst\",\"ProjectMember.findFirstOrThrow\",\"ProjectMember.findMany\",\"ProjectMember.createOne\",\"ProjectMember.createMany\",\"ProjectMember.updateOne\",\"ProjectMember.updateMany\",\"ProjectMember.upsertOne\",\"ProjectMember.deleteOne\",\"ProjectMember.deleteMany\",\"ProjectMember.groupBy\",\"ProjectMember.aggregate\",\"BoardColumn.findUnique\",\"BoardColumn.findUniqueOrThrow\",\"BoardColumn.findFirst\",\"BoardColumn.findFirstOrThrow\",\"BoardColumn.findMany\",\"BoardColumn.createOne\",\"BoardColumn.createMany\",\"BoardColumn.updateOne\",\"BoardColumn.updateMany\",\"BoardColumn.upsertOne\",\"BoardColumn.deleteOne\",\"BoardColumn.deleteMany\",\"BoardColumn.groupBy\",\"BoardColumn.aggregate\",\"Task.findUnique\",\"Task.findUniqueOrThrow\",\"Task.findFirst\",\"Task.findFirstOrThrow\",\"Task.findMany\",\"Task.createOne\",\"Task.createMany\",\"Task.updateOne\",\"Task.updateMany\",\"Task.upsertOne\",\"Task.deleteOne\",\"Task.deleteMany\",\"Task.groupBy\",\"Task.aggregate\",\"TaskMember.findUnique\",\"TaskMember.findUniqueOrThrow\",\"TaskMember.findFirst\",\"TaskMember.findFirstOrThrow\",\"TaskMember.findMany\",\"TaskMember.createOne\",\"TaskMember.createMany\",\"TaskMember.updateOne\",\"TaskMember.updateMany\",\"TaskMember.upsertOne\",\"TaskMember.deleteOne\",\"TaskMember.deleteMany\",\"TaskMember.groupBy\",\"TaskMember.aggregate\",\"TaskTag.findUnique\",\"TaskTag.findUniqueOrThrow\",\"TaskTag.findFirst\",\"TaskTag.findFirstOrThrow\",\"TaskTag.findMany\",\"TaskTag.createOne\",\"TaskTag.createMany\",\"TaskTag.updateOne\",\"TaskTag.updateMany\",\"TaskTag.upsertOne\",\"TaskTag.deleteOne\",\"TaskTag.deleteMany\",\"TaskTag.groupBy\",\"TaskTag.aggregate\",\"AND\",\"OR\",\"NOT\",\"id\",\"taskId\",\"name\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"contains\",\"startsWith\",\"endsWith\",\"search\",\"not\",\"userId\",\"projectId\",\"columnId\",\"parentId\",\"title\",\"description\",\"kind\",\"markDate\",\"status\",\"doneAt\",\"assigneeId\",\"creatorId\",\"extras\",\"sortOrder\",\"archived\",\"archivedAt\",\"archiveSource\",\"createdAt\",\"updatedAt\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"boundStatus\",\"retention\",\"permission\",\"ownerId\",\"isPersonal\",\"notes\",\"taskKinds\",\"icon\",\"autoArchive\",\"scene\",\"builtin\",\"listId\",\"note\",\"done\",\"habitId\",\"date\",\"seq\",\"source\",\"period\",\"target\",\"color\",\"deviceId\",\"hour\",\"temperatureAvg\",\"humidityAvg\",\"raw\",\"temperature\",\"humidity\",\"temperatureMin\",\"temperatureMax\",\"humidityMin\",\"humidityMax\",\"origin\",\"sampledAt\",\"did\",\"homeId\",\"model\",\"alias\",\"tempSiid\",\"tempPiid\",\"humSiid\",\"humPiid\",\"battSiid\",\"battPiid\",\"battery\",\"batteryAt\",\"enabled\",\"lastSyncAt\",\"every\",\"some\",\"none\",\"deviceId_hour\",\"deviceId_date\",\"key\",\"lastError\",\"province\",\"fuel\",\"price\",\"date_province_fuel\",\"scraperName\",\"lastDataHash\",\"lastUpdateAt\",\"metadata\",\"month\",\"inventory\",\"url\",\"latencyMs\",\"message\",\"lastCheckAt\",\"uuid\",\"cpu\",\"ram\",\"load\",\"disk\",\"netIn\",\"netOut\",\"process\",\"connections\",\"uuid_period\",\"cpuName\",\"os\",\"region\",\"memTotal\",\"diskTotal\",\"cpuCores\",\"cpuUsage\",\"ramUsed\",\"swapUsed\",\"load1\",\"load5\",\"load15\",\"diskUsed\",\"uptime\",\"recordedAt\",\"indicatorName\",\"valueA\",\"valueB\",\"sourceA\",\"sourceB\",\"diff\",\"diffRatio\",\"summary\",\"content\",\"publishedAt\",\"impactRank\",\"title_publishedAt\",\"indicatorId\",\"value\",\"groupName\",\"unit\",\"frequency\",\"hidden\",\"indicatorId_period\",\"slug\",\"email\",\"password\",\"taskId_userId\",\"projectId_name\",\"projectId_userId\",\"habitId_date_seq\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"_relevance\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), - graph: "9AvyAZYDEgcAAMkGACAIAADKBgAgCwAAywYAIAwAAMwGACAZAADNBgAgGgAAxgYAIBsAAL0GACAcAAC9BgAgHQAAvwYAIMMDAADIBgAwxAMAABoAEMUDAADIBgAwxgMCAAAAAcgDAQD5BQAh5gNAAPoFACHnA0AA-gUAIeAEAQAAAAHhBAEA-QUAIQEAAAABACARAwAAuAYAIAUAAMoGACDDAwAA1gYAMMQDAAADABDFAwAA1gYAMMYDAgD4BQAhyAMBAPkFACHVAwIA-AUAIeIDAgD4BQAh4wMgAIcGACHmA0AA-gUAIecDQAD6BQAh9QMBAPkFACH6AwEA-QUAIYAEAQD5BQAhgQQCAPgFACGCBAEA-QUAIQMDAADgCgAgBQAA1goAIPEEAADwCgAgEQMAALgGACAFAADKBgAgwwMAANYGADDEAwAAAwAQxQMAANYGADDGAwIAAAAByAMBAPkFACHVAwIA-AUAIeIDAgD4BQAh4wMgAIcGACHmA0AA-gUAIecDQAD6BQAh9QMBAPkFACH6AwEA-QUAIYAEAQD5BQAhgQQCAPgFACGCBAEA-QUAIQMAAAADACABAAAEADACAAAFACANAwAAuAYAIAQAANUGACDDAwAA1AYAMMQDAAAHABDFAwAA1AYAMMYDAgD4BQAh1QMCAPgFACHmA0AA-gUAIfoDAQD5BQAh_AMCAPgFACH9AwEA-QUAIf4DAgD4BQAh_wMBAPkFACEDAwAA4AoAIAQAAO4KACDxBAAA7woAIA4DAAC4BgAgBAAA1QYAIMMDAADUBgAwxAMAAAcAEMUDAADUBgAwxgMCAAAAAdUDAgD4BQAh5gNAAPoFACH6AwEA-QUAIfwDAgD4BQAh_QMBAPkFACH-AwIA-AUAIf8DAQD5BQAh5QQAANMGACADAAAABwAgAQAACAAwAgAACQAgAQAAAAcAIAMAAAAHACABAAAIADACAAAJACANAwAAuAYAIAoAANIGACDDAwAA0QYAMMQDAAANABDFAwAA0QYAMMYDAgD4BQAh1QMCAPgFACHZAwEA-QUAIeMDIACHBgAh5gNAAPoFACHnA0AA-gUAIfcDAQD5BQAh-gMBAPkFACEDAwAA4AoAIAoAAOwKACDxBAAA7QoAIA0DAAC4BgAgCgAA0gYAIMMDAADRBgAwxAMAAA0AEMUDAADRBgAwxgMCAAAAAdUDAgD4BQAh2QMBAPkFACHjAyAAhwYAIeYDQAD6BQAh5wNAAPoFACH3AwEA-QUAIfoDAQD5BQAhAwAAAA0AIAEAAA4AMAIAAA8AIA0JAADQBgAgwwMAAM8GADDEAwAAEQAQxQMAAM8GADDGAwIA-AUAIdkDAQD5BQAh3gNAAIMGACHiAwIA-AUAIeYDQAD6BQAh5wNAAPoFACH5AwIA-AUAIfoDAQD5BQAh-wMgAIcGACEDCQAA6goAIN4DAADpBgAg8QQAAOsKACANCQAA0AYAIMMDAADPBgAwxAMAABEAEMUDAADPBgAwxgMCAAAAAdkDAQD5BQAh3gNAAIMGACHiAwIA-AUAIeYDQAD6BQAh5wNAAPoFACH5AwIA-AUAIfoDAQD5BQAh-wMgAIcGACEDAAAAEQAgAQAAEgAwAgAAEwAgAQAAABEAIAwDAAC-BgAgCgAAsAYAIMMDAADOBgAwxAMAABYAEMUDAADOBgAwxgMCAPgFACHIAwEA-QUAIdUDAgCGBgAh5gNAAPoFACHnA0AA-gUAIfcDAQD5BQAh-AMgAIcGACEDAwAA4AoAINUDAADpBgAg8QQAAOkKACAMAwAAvgYAIAoAALAGACDDAwAAzgYAMMQDAAAWABDFAwAAzgYAMMYDAgAAAAHIAwEA-QUAIdUDAgCGBgAh5gNAAPoFACHnA0AA-gUAIfcDAQD5BQAh-AMgAIcGACEDAAAAFgAgAQAAFwAwAgAAGAAgEgcAAMkGACAIAADKBgAgCwAAywYAIAwAAMwGACAZAADNBgAgGgAAxgYAIBsAAL0GACAcAAC9BgAgHQAAvwYAIMMDAADIBgAwxAMAABoAEMUDAADIBgAwxgMCAPgFACHIAwEA-QUAIeYDQAD6BQAh5wNAAPoFACHgBAEA-QUAIeEEAQD5BQAhAQAAABoAIBINAAC4BgAgDwAAxgYAIBcAAL0GACAYAADHBgAgwwMAAMUGADDEAwAAHAAQxQMAAMUGADDGAwIA-AUAIcgDAQD5BQAh4wMgAIcGACHmA0AA-gUAIecDQAD6BQAh8QMCAPgFACHyAyAAhwYAIfMDAACwBgAg9AMAAP8FACD1AwEAhQYAIfYDAQD5BQAhBw0AAOAKACAPAADaCgAgFwAA2woAIBgAAOcKACD0AwAA6QYAIPUDAADpBgAg8QQAAOgKACASDQAAuAYAIA8AAMYGACAXAAC9BgAgGAAAxwYAIMMDAADFBgAwxAMAABwAEMUDAADFBgAwxgMCAAAAAcgDAQD5BQAh4wMgAIcGACHmA0AA-gUAIecDQAD6BQAh8QMCAPgFACHyAyAAhwYAIfMDAACwBgAg9AMAAP8FACD1AwEAhQYAIfYDAQD5BQAhAwAAABwAIAEAAB0AMAIAAB4AIAoDAAC4BgAgDgAAugYAIMMDAADEBgAwxAMAACAAEMUDAADEBgAwxgMCAPgFACHVAwIA-AUAIdYDAgD4BQAh5gNAAPoFACHwAwEA-QUAIQMDAADgCgAgDgAA4QoAIPEEAADmCgAgCwMAALgGACAOAAC6BgAgwwMAAMQGADDEAwAAIAAQxQMAAMQGADDGAwIAAAAB1QMCAPgFACHWAwIA-AUAIeYDQAD6BQAh8AMBAPkFACHkBAAAwwYAIAMAAAAgACABAAAhADACAAAiACANDgAAugYAIBcAAL0GACDDAwAAwgYAMMQDAAAkABDFAwAAwgYAMMYDAgD4BQAhyAMBAPkFACHWAwIA-AUAIeIDAgD4BQAh5gNAAPoFACHnA0AA-gUAIe4DAQCFBgAh7wMBAPkFACEEDgAA4QoAIBcAANsKACDuAwAA6QYAIPEEAADlCgAgDg4AALoGACAXAAC9BgAgwwMAAMIGADDEAwAAJAAQxQMAAMIGADDGAwIAAAAByAMBAPkFACHWAwIA-AUAIeIDAgD4BQAh5gNAAPoFACHnA0AA-gUAIe4DAQCFBgAh7wMBAPkFACHjBAAAwQYAIAMAAAAkACABAAAlADACAAAmACAeDgAAugYAIA8AAL8GACAQAAC7BgAgEQAAvAYAIBIAAL0GACATAAC-BgAgFAAAuAYAIBYAAMAGACDDAwAAuQYAMMQDAAAoABDFAwAAuQYAMMYDAgD4BQAh1gMCAPgFACHXAwIA-AUAIdgDAgCGBgAh2QMBAPkFACHaAwEA-QUAIdsDAQCFBgAh3ANAAIMGACHdAwEA-QUAId4DQACDBgAh3wMCAIYGACHgAwIA-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-QUAIeYDQAD6BQAh5wNAAPoFACH9AwEA-QUAIdQEAQD5BQAh3wQBAAAAAQEAAABgACABAAAAYAAgCsMDAACyBgAwxAMAAGMAEMUDAACyBgAwxgMCAPgFACHZAwEA-QUAIeYDQAD6BQAh5wNAAPoFACH9AwEA-QUAIdQEAQD5BQAh3wQBAPkFACEB8QQAAOAJACADAAAAYwAgAQAAZAAwAgAAYAAgAwAAAGMAIAEAAGQAMAIAAGAAIAMAAABjACABAABkADACAABgACAHxgMCAAAAAdkDAQAAAAHmA0AAAAAB5wNAAAAAAf0DAQAAAAHUBAEAAAAB3wQBAAAAAQEjAABoACAHxgMCAAAAAdkDAQAAAAHmA0AAAAAB5wNAAAAAAf0DAQAAAAHUBAEAAAAB3wQBAAAAAQEjAABqADAHxgMCAN0GACHZAwEA3AYAIeYDQADyBgAh5wNAAPIGACH9AwEA3AYAIdQEAQDcBgAh3wQBANwGACECAAAAYAAgIwAAbAAgB8YDAgDdBgAh2QMBANwGACHmA0AA8gYAIecDQADyBgAh_QMBANwGACHUBAEA3AYAId8EAQDcBgAhAgAAAGMAICMAAG4AIAMAAABgACAoAABoACApAABsACABAAAAYAAgAQAAAGMAIAUGAADbCQAgLgAA3AkAIC8AAN8JACAwAADeCQAgMQAA3QkAIArDAwAAsQYAMMQDAAB0ABDFAwAAsQYAMMYDAgDMBQAh2QMBAM0FACHmA0AA2gUAIecDQADaBQAh_QMBAM0FACHUBAEAzQUAId8EAQDNBQAhAwAAAGMAIAEAAHMAMC0AAHQAIAMAAABjACABAABkADACAABgACAJIwAAsAYAIMMDAACvBgAwxAMAAHoAEMUDAACvBgAwxgMCAAAAAcgDAQD5BQAh2gMBAPkFACHmA0AA-gUAIecDQAD6BQAhAQAAAHcAIAEAAAB3ACAJIwAAsAYAIMMDAACvBgAwxAMAAHoAEMUDAACvBgAwxgMCAPgFACHIAwEA-QUAIdoDAQD5BQAh5gNAAPoFACHnA0AA-gUAIQHxBAAA2gkAIAMAAAB6ACABAAB7ADACAAB3ACADAAAAegAgAQAAewAwAgAAdwAgAwAAAHoAIAEAAHsAMAIAAHcAIAYjgAAAAAHGAwIAAAAByAMBAAAAAdoDAQAAAAHmA0AAAAAB5wNAAAAAAQEjAAB_ACAGI4AAAAABxgMCAAAAAcgDAQAAAAHaAwEAAAAB5gNAAAAAAecDQAAAAAEBIwAAgQEAMAYjgAAAAAHGAwIA3QYAIcgDAQDcBgAh2gMBANwGACHmA0AA8gYAIecDQADyBgAhAgAAAHcAICMAAIMBACAGI4AAAAABxgMCAN0GACHIAwEA3AYAIdoDAQDcBgAh5gNAAPIGACHnA0AA8gYAIQIAAAB6ACAjAACFAQAgAwAAAHcAICgAAH8AICkAAIMBACABAAAAdwAgAQAAAHoAIAUGAADVCQAgLgAA1gkAIC8AANkJACAwAADYCQAgMQAA1wkAIAkjAADYBQAgwwMAAK4GADDEAwAAiwEAEMUDAACuBgAwxgMCAMwFACHIAwEAzQUAIdoDAQDNBQAh5gNAANoFACHnA0AA2gUAIQMAAAB6ACABAACKAQAwLQAAiwEAIAMAAAB6ACABAAB7ADACAAB3ACAOUQAAqgYAIMMDAACpBgAwxAMAAJYBABDFAwAAqQYAMMYDAgAAAAHIAwEAAAAB2QMBAPkFACHmA0AA-gUAIecDQAD6BQAh_wMBAPkFACHaBAEA-QUAIdsEAQD5BQAh3AQBAPkFACHdBCAAhwYAIQEAAACOAQAgClAAAK0GACDDAwAArAYAMMQDAACQAQAQxQMAAKwGADDGAwIA-AUAIeYDQAD6BQAh5wNAAPoFACGABAEA-QUAIdgEAgD4BQAh2QQIAJEGACECUAAA0wkAIPEEAADUCQAgC1AAAK0GACDDAwAArAYAMMQDAACQAQAQxQMAAKwGADDGAwIAAAAB5gNAAPoFACHnA0AA-gUAIYAEAQD5BQAh2AQCAPgFACHZBAgAkQYAId4EAACrBgAgAwAAAJABACABAACRAQAwAgAAkgEAIAEAAACQAQAgAQAAAI4BACAOUQAAqgYAIMMDAACpBgAwxAMAAJYBABDFAwAAqQYAMMYDAgD4BQAhyAMBAPkFACHZAwEA-QUAIeYDQAD6BQAh5wNAAPoFACH_AwEA-QUAIdoEAQD5BQAh2wQBAPkFACHcBAEA-QUAId0EIACHBgAhAlEAANEJACDxBAAA0gkAIAMAAACWAQAgAQAAlwEAMAIAAI4BACADAAAAlgEAIAEAAJcBADACAACOAQAgAwAAAJYBACABAACXAQAwAgAAjgEAIAtRAADQCQAgxgMCAAAAAcgDAQAAAAHZAwEAAAAB5gNAAAAAAecDQAAAAAH_AwEAAAAB2gQBAAAAAdsEAQAAAAHcBAEAAAAB3QQgAAAAAQEjAACbAQAgCsYDAgAAAAHIAwEAAAAB2QMBAAAAAeYDQAAAAAHnA0AAAAAB_wMBAAAAAdoEAQAAAAHbBAEAAAAB3AQBAAAAAd0EIAAAAAEBIwAAnQEAMAtRAADDCQAgxgMCAN0GACHIAwEA3AYAIdkDAQDcBgAh5gNAAPIGACHnA0AA8gYAIf8DAQDcBgAh2gQBANwGACHbBAEA3AYAIdwEAQDcBgAh3QQgAPEGACECAAAAjgEAICMAAJ8BACAKxgMCAN0GACHIAwEA3AYAIdkDAQDcBgAh5gNAAPIGACHnA0AA8gYAIf8DAQDcBgAh2gQBANwGACHbBAEA3AYAIdwEAQDcBgAh3QQgAPEGACECAAAAlgEAICMAAKEBACADAAAAjgEAICgAAJsBACApAACfAQAgAQAAAI4BACABAAAAlgEAIAUGAAC-CQAgLgAAvwkAIC8AAMIJACAwAADBCQAgMQAAwAkAIA3DAwAAqAYAMMQDAACnAQAQxQMAAKgGADDGAwIAzAUAIcgDAQDNBQAh2QMBAM0FACHmA0AA2gUAIecDQADaBQAh_wMBAM0FACHaBAEAzQUAIdsEAQDNBQAh3AQBAM0FACHdBCAA2QUAIQMAAACWAQAgAQAApgEAMC0AAKcBACADAAAAlgEAIAEAAJcBADACAACOAQAgAQAAAJIBACABAAAAkgEAIAMAAACQAQAgAQAAkQEAMAIAAJIBACADAAAAkAEAIAEAAJEBADACAACSAQAgAwAAAJABACABAACRAQAwAgAAkgEAIAdQAAC9CQAgxgMCAAAAAeYDQAAAAAHnA0AAAAABgAQBAAAAAdgEAgAAAAHZBAgAAAABASMAAK8BACAGxgMCAAAAAeYDQAAAAAHnA0AAAAABgAQBAAAAAdgEAgAAAAHZBAgAAAABASMAALEBADAHUAAAvAkAIMYDAgDdBgAh5gNAAPIGACHnA0AA8gYAIYAEAQDcBgAh2AQCAN0GACHZBAgAigkAIQIAAACSAQAgIwAAswEAIAbGAwIA3QYAIeYDQADyBgAh5wNAAPIGACGABAEA3AYAIdgEAgDdBgAh2QQIAIoJACECAAAAkAEAICMAALUBACADAAAAkgEAICgAAK8BACApAACzAQAgAQAAAJIBACABAAAAkAEAIAUGAAC3CQAgLgAAuAkAIC8AALsJACAwAAC6CQAgMQAAuQkAIAnDAwAApwYAMMQDAAC7AQAQxQMAAKcGADDGAwIAzAUAIeYDQADaBQAh5wNAANoFACGABAEAzQUAIdgEAgDMBQAh2QQIAI4GACEDAAAAkAEAIAEAALoBADAtAAC7AQAgAwAAAJABACABAACRAQAwAgAAkgEAIA3DAwAApQYAMMQDAADBAQAQxQMAAKUGADDGAwIAAAAB2QMBAPkFACHmA0AA-gUAIf8DAQD5BQAhrwQBAPkFACHTBAEA-QUAIdQEAQCFBgAh1QRAAPoFACHWBAIA-AUAIdcEAACmBgAgAQAAAL4BACABAAAAvgEAIAzDAwAApQYAMMQDAADBAQAQxQMAAKUGADDGAwIA-AUAIdkDAQD5BQAh5gNAAPoFACH_AwEA-QUAIa8EAQD5BQAh0wQBAPkFACHUBAEAhQYAIdUEQAD6BQAh1gQCAPgFACEC1AQAAOkGACDxBAAAtgkAIAMAAADBAQAgAQAAwgEAMAIAAL4BACADAAAAwQEAIAEAAMIBADACAAC-AQAgAwAAAMEBACABAADCAQAwAgAAvgEAIAnGAwIAAAAB2QMBAAAAAeYDQAAAAAH_AwEAAAABrwQBAAAAAdMEAQAAAAHUBAEAAAAB1QRAAAAAAdYEAgAAAAEBIwAAxgEAIAnGAwIAAAAB2QMBAAAAAeYDQAAAAAH_AwEAAAABrwQBAAAAAdMEAQAAAAHUBAEAAAAB1QRAAAAAAdYEAgAAAAEBIwAAyAEAMAnGAwIA3QYAIdkDAQDcBgAh5gNAAPIGACH_AwEA3AYAIa8EAQDcBgAh0wQBANwGACHUBAEA7wYAIdUEQADyBgAh1gQCAN0GACECAAAAvgEAICMAAMoBACAJxgMCAN0GACHZAwEA3AYAIeYDQADyBgAh_wMBANwGACGvBAEA3AYAIdMEAQDcBgAh1AQBAO8GACHVBEAA8gYAIdYEAgDdBgAhAgAAAMEBACAjAADMAQAgAwAAAL4BACAoAADGAQAgKQAAygEAIAEAAAC-AQAgAQAAAMEBACAGBgAAsQkAIC4AALIJACAvAAC1CQAgMAAAtAkAIDEAALMJACDUBAAA6QYAIAzDAwAApAYAMMQDAADSAQAQxQMAAKQGADDGAwIAzAUAIdkDAQDNBQAh5gNAANoFACH_AwEAzQUAIa8EAQDNBQAh0wQBAM0FACHUBAEA1gUAIdUEQADaBQAh1gQCAMwFACEDAAAAwQEAIAEAANEBADAtAADSAQAgAwAAAMEBACABAADCAQAwAgAAvgEAIA3DAwAAowYAMMQDAADYAQAQxQMAAKMGADDGAwIAAAAB5gNAAPoFACGABAEA-QUAIcwEAQD5BQAhzQQIAJEGACHOBAgAkQYAIc8EAQD5BQAh0AQBAPkFACHRBAgAkQYAIdIECACRBgAhAQAAANUBACABAAAA1QEAIA3DAwAAowYAMMQDAADYAQAQxQMAAKMGADDGAwIA-AUAIeYDQAD6BQAhgAQBAPkFACHMBAEA-QUAIc0ECACRBgAhzgQIAJEGACHPBAEA-QUAIdAEAQD5BQAh0QQIAJEGACHSBAgAkQYAIQHxBAAAsAkAIAMAAADYAQAgAQAA2QEAMAIAANUBACADAAAA2AEAIAEAANkBADACAADVAQAgAwAAANgBACABAADZAQAwAgAA1QEAIArGAwIAAAAB5gNAAAAAAYAEAQAAAAHMBAEAAAABzQQIAAAAAc4ECAAAAAHPBAEAAAAB0AQBAAAAAdEECAAAAAHSBAgAAAABASMAAN0BACAKxgMCAAAAAeYDQAAAAAGABAEAAAABzAQBAAAAAc0ECAAAAAHOBAgAAAABzwQBAAAAAdAEAQAAAAHRBAgAAAAB0gQIAAAAAQEjAADfAQAwCsYDAgDdBgAh5gNAAPIGACGABAEA3AYAIcwEAQDcBgAhzQQIAIoJACHOBAgAigkAIc8EAQDcBgAh0AQBANwGACHRBAgAigkAIdIECACKCQAhAgAAANUBACAjAADhAQAgCsYDAgDdBgAh5gNAAPIGACGABAEA3AYAIcwEAQDcBgAhzQQIAIoJACHOBAgAigkAIc8EAQDcBgAh0AQBANwGACHRBAgAigkAIdIECACKCQAhAgAAANgBACAjAADjAQAgAwAAANUBACAoAADdAQAgKQAA4QEAIAEAAADVAQAgAQAAANgBACAFBgAAqwkAIC4AAKwJACAvAACvCQAgMAAArgkAIDEAAK0JACANwwMAAKIGADDEAwAA6QEAEMUDAACiBgAwxgMCAMwFACHmA0AA2gUAIYAEAQDNBQAhzAQBAM0FACHNBAgAjgYAIc4ECACOBgAhzwQBAM0FACHQBAEAzQUAIdEECACOBgAh0gQIAI4GACEDAAAA2AEAIAEAAOgBADAtAADpAQAgAwAAANgBACABAADZAQAwAgAA1QEAIBzDAwAAoQYAMMQDAADvAQAQxQMAAKEGADDGAwIAAAAByAMBAPkFACHdAwEA-QUAIeYDQAD6BQAh5wNAAPoFACGzBAEAAAABuAQEAJ4GACG5BAQAngYAIboEAgD4BQAhuwQCAPgFACG9BAEA-QUAIb4EAQD5BQAhvwQBAPkFACHABAQAngYAIcEEBACeBgAhwgQCAPgFACHDBAgAkQYAIcQEBACeBgAhxQQEAJ4GACHGBAgAkQYAIccECACRBgAhyAQIAJEGACHJBAQAngYAIcoEBACeBgAhywRAAPoFACEBAAAA7AEAIAEAAADsAQAgHMMDAAChBgAwxAMAAO8BABDFAwAAoQYAMMYDAgD4BQAhyAMBAPkFACHdAwEA-QUAIeYDQAD6BQAh5wNAAPoFACGzBAEA-QUAIbgEBACeBgAhuQQEAJ4GACG6BAIA-AUAIbsEAgD4BQAhvQQBAPkFACG-BAEA-QUAIb8EAQD5BQAhwAQEAJ4GACHBBAQAngYAIcIEAgD4BQAhwwQIAJEGACHEBAQAngYAIcUEBACeBgAhxgQIAJEGACHHBAgAkQYAIcgECACRBgAhyQQEAJ4GACHKBAQAngYAIcsEQAD6BQAhAfEEAACqCQAgAwAAAO8BACABAADwAQAwAgAA7AEAIAMAAADvAQAgAQAA8AEAMAIAAOwBACADAAAA7wEAIAEAAPABADACAADsAQAgGcYDAgAAAAHIAwEAAAAB3QMBAAAAAeYDQAAAAAHnA0AAAAABswQBAAAAAbgEBAAAAAG5BAQAAAABugQCAAAAAbsEAgAAAAG9BAEAAAABvgQBAAAAAb8EAQAAAAHABAQAAAABwQQEAAAAAcIEAgAAAAHDBAgAAAABxAQEAAAAAcUEBAAAAAHGBAgAAAABxwQIAAAAAcgECAAAAAHJBAQAAAABygQEAAAAAcsEQAAAAAEBIwAA9AEAIBnGAwIAAAAByAMBAAAAAd0DAQAAAAHmA0AAAAAB5wNAAAAAAbMEAQAAAAG4BAQAAAABuQQEAAAAAboEAgAAAAG7BAIAAAABvQQBAAAAAb4EAQAAAAG_BAEAAAABwAQEAAAAAcEEBAAAAAHCBAIAAAABwwQIAAAAAcQEBAAAAAHFBAQAAAABxgQIAAAAAccECAAAAAHIBAgAAAAByQQEAAAAAcoEBAAAAAHLBEAAAAABASMAAPYBADAZxgMCAN0GACHIAwEA3AYAId0DAQDcBgAh5gNAAPIGACHnA0AA8gYAIbMEAQDcBgAhuAQEAKMJACG5BAQAowkAIboEAgDdBgAhuwQCAN0GACG9BAEA3AYAIb4EAQDcBgAhvwQBANwGACHABAQAowkAIcEEBACjCQAhwgQCAN0GACHDBAgAigkAIcQEBACjCQAhxQQEAKMJACHGBAgAigkAIccECACKCQAhyAQIAIoJACHJBAQAowkAIcoEBACjCQAhywRAAPIGACECAAAA7AEAICMAAPgBACAZxgMCAN0GACHIAwEA3AYAId0DAQDcBgAh5gNAAPIGACHnA0AA8gYAIbMEAQDcBgAhuAQEAKMJACG5BAQAowkAIboEAgDdBgAhuwQCAN0GACG9BAEA3AYAIb4EAQDcBgAhvwQBANwGACHABAQAowkAIcEEBACjCQAhwgQCAN0GACHDBAgAigkAIcQEBACjCQAhxQQEAKMJACHGBAgAigkAIccECACKCQAhyAQIAIoJACHJBAQAowkAIcoEBACjCQAhywRAAPIGACECAAAA7wEAICMAAPoBACADAAAA7AEAICgAAPQBACApAAD4AQAgAQAAAOwBACABAAAA7wEAIAUGAAClCQAgLgAApgkAIC8AAKkJACAwAACoCQAgMQAApwkAIBzDAwAAoAYAMMQDAACAAgAQxQMAAKAGADDGAwIAzAUAIcgDAQDNBQAh3QMBAM0FACHmA0AA2gUAIecDQADaBQAhswQBAM0FACG4BAQAmgYAIbkEBACaBgAhugQCAMwFACG7BAIAzAUAIb0EAQDNBQAhvgQBAM0FACG_BAEAzQUAIcAEBACaBgAhwQQEAJoGACHCBAIAzAUAIcMECACOBgAhxAQEAJoGACHFBAQAmgYAIcYECACOBgAhxwQIAI4GACHIBAgAjgYAIckEBACaBgAhygQEAJoGACHLBEAA2gUAIQMAAADvAQAgAQAA_wEAMC0AAIACACADAAAA7wEAIAEAAPABADACAADsAQAgEMMDAACdBgAwxAMAAIYCABDFAwAAnQYAMMYDAgAAAAHmA0AA-gUAIYAEQAD6BQAhswQBAPkFACG0BAgAkQYAIbUEBACeBgAhtgQIAJEGACG3BAQAngYAIbgEBACeBgAhuQQEAJ4GACG6BAIA-AUAIbsEAgD4BQAhvAQAAJ8GACABAAAAgwIAIAEAAACDAgAgD8MDAACdBgAwxAMAAIYCABDFAwAAnQYAMMYDAgD4BQAh5gNAAPoFACGABEAA-gUAIbMEAQD5BQAhtAQIAJEGACG1BAQAngYAIbYECACRBgAhtwQEAJ4GACG4BAQAngYAIbkEBACeBgAhugQCAPgFACG7BAIA-AUAIQHxBAAApAkAIAMAAACGAgAgAQAAhwIAMAIAAIMCACADAAAAhgIAIAEAAIcCADACAACDAgAgAwAAAIYCACABAACHAgAwAgAAgwIAIAzGAwIAAAAB5gNAAAAAAYAEQAAAAAGzBAEAAAABtAQIAAAAAbUEBAAAAAG2BAgAAAABtwQEAAAAAbgEBAAAAAG5BAQAAAABugQCAAAAAbsEAgAAAAEBIwAAiwIAIAzGAwIAAAAB5gNAAAAAAYAEQAAAAAGzBAEAAAABtAQIAAAAAbUEBAAAAAG2BAgAAAABtwQEAAAAAbgEBAAAAAG5BAQAAAABugQCAAAAAbsEAgAAAAEBIwAAjQIAMAzGAwIA3QYAIeYDQADyBgAhgARAAPIGACGzBAEA3AYAIbQECACKCQAhtQQEAKMJACG2BAgAigkAIbcEBACjCQAhuAQEAKMJACG5BAQAowkAIboEAgDdBgAhuwQCAN0GACECAAAAgwIAICMAAI8CACAMxgMCAN0GACHmA0AA8gYAIYAEQADyBgAhswQBANwGACG0BAgAigkAIbUEBACjCQAhtgQIAIoJACG3BAQAowkAIbgEBACjCQAhuQQEAKMJACG6BAIA3QYAIbsEAgDdBgAhAgAAAIYCACAjAACRAgAgAwAAAIMCACAoAACLAgAgKQAAjwIAIAEAAACDAgAgAQAAAIYCACAFBgAAngkAIC4AAJ8JACAvAACiCQAgMAAAoQkAIDEAAKAJACAPwwMAAJkGADDEAwAAlwIAEMUDAACZBgAwxgMCAMwFACHmA0AA2gUAIYAEQADaBQAhswQBAM0FACG0BAgAjgYAIbUEBACaBgAhtgQIAI4GACG3BAQAmgYAIbgEBACaBgAhuQQEAJoGACG6BAIAzAUAIbsEAgDMBQAhAwAAAIYCACABAACWAgAwLQAAlwIAIAMAAACGAgAgAQAAhwIAMAIAAIMCACAMwwMAAJgGADDEAwAAnQIAEMUDAACYBgAwxgMCAAAAAcgDAQAAAAHdAwEA-QUAIeYDQAD6BQAh5wNAAPoFACGvBAEA-QUAIbAEAgD4BQAhsQQBAPkFACGyBEAA-gUAIQEAAACaAgAgAQAAAJoCACAMwwMAAJgGADDEAwAAnQIAEMUDAACYBgAwxgMCAPgFACHIAwEA-QUAId0DAQD5BQAh5gNAAPoFACHnA0AA-gUAIa8EAQD5BQAhsAQCAPgFACGxBAEA-QUAIbIEQAD6BQAhAfEEAACdCQAgAwAAAJ0CACABAACeAgAwAgAAmgIAIAMAAACdAgAgAQAAngIAMAIAAJoCACADAAAAnQIAIAEAAJ4CADACAACaAgAgCcYDAgAAAAHIAwEAAAAB3QMBAAAAAeYDQAAAAAHnA0AAAAABrwQBAAAAAbAEAgAAAAGxBAEAAAABsgRAAAAAAQEjAACiAgAgCcYDAgAAAAHIAwEAAAAB3QMBAAAAAeYDQAAAAAHnA0AAAAABrwQBAAAAAbAEAgAAAAGxBAEAAAABsgRAAAAAAQEjAACkAgAwCcYDAgDdBgAhyAMBANwGACHdAwEA3AYAIeYDQADyBgAh5wNAAPIGACGvBAEA3AYAIbAEAgDdBgAhsQQBANwGACGyBEAA8gYAIQIAAACaAgAgIwAApgIAIAnGAwIA3QYAIcgDAQDcBgAh3QMBANwGACHmA0AA8gYAIecDQADyBgAhrwQBANwGACGwBAIA3QYAIbEEAQDcBgAhsgRAAPIGACECAAAAnQIAICMAAKgCACADAAAAmgIAICgAAKICACApAACmAgAgAQAAAJoCACABAAAAnQIAIAUGAACYCQAgLgAAmQkAIC8AAJwJACAwAACbCQAgMQAAmgkAIAzDAwAAlwYAMMQDAACuAgAQxQMAAJcGADDGAwIAzAUAIcgDAQDNBQAh3QMBAM0FACHmA0AA2gUAIecDQADaBQAhrwQBAM0FACGwBAIAzAUAIbEEAQDNBQAhsgRAANoFACEDAAAAnQIAIAEAAK0CADAtAACuAgAgAwAAAJ0CACABAACeAgAwAgAAmgIAIAjDAwAAlgYAMMQDAAC0AgAQxQMAAJYGADDGAwIAAAAB5gNAAPoFACHnA0AA-gUAIa0EAQAAAAGuBAIA-AUAIQEAAACxAgAgAQAAALECACAIwwMAAJYGADDEAwAAtAIAEMUDAACWBgAwxgMCAPgFACHmA0AA-gUAIecDQAD6BQAhrQQBAPkFACGuBAIA-AUAIQHxBAAAlwkAIAMAAAC0AgAgAQAAtQIAMAIAALECACADAAAAtAIAIAEAALUCADACAACxAgAgAwAAALQCACABAAC1AgAwAgAAsQIAIAXGAwIAAAAB5gNAAAAAAecDQAAAAAGtBAEAAAABrgQCAAAAAQEjAAC5AgAgBcYDAgAAAAHmA0AAAAAB5wNAAAAAAa0EAQAAAAGuBAIAAAABASMAALsCADAFxgMCAN0GACHmA0AA8gYAIecDQADyBgAhrQQBANwGACGuBAIA3QYAIQIAAACxAgAgIwAAvQIAIAXGAwIA3QYAIeYDQADyBgAh5wNAAPIGACGtBAEA3AYAIa4EAgDdBgAhAgAAALQCACAjAAC_AgAgAwAAALECACAoAAC5AgAgKQAAvQIAIAEAAACxAgAgAQAAALQCACAFBgAAkgkAIC4AAJMJACAvAACWCQAgMAAAlQkAIDEAAJQJACAIwwMAAJUGADDEAwAAxQIAEMUDAACVBgAwxgMCAMwFACHmA0AA2gUAIecDQADaBQAhrQQBAM0FACGuBAIAzAUAIQMAAAC0AgAgAQAAxAIAMC0AAMUCACADAAAAtAIAIAEAALUCADACAACxAgAgCsMDAACUBgAwxAMAAMsCABDFAwAAlAYAMMYDAgAAAAHmA0AA-gUAIecDQAD6BQAhqQQBAAAAAaoEAQCFBgAhqwRAAPoFACGsBAAA_wUAIAEAAADIAgAgAQAAAMgCACAKwwMAAJQGADDEAwAAywIAEMUDAACUBgAwxgMCAPgFACHmA0AA-gUAIecDQAD6BQAhqQQBAPkFACGqBAEAhQYAIasEQAD6BQAhrAQAAP8FACADqgQAAOkGACCsBAAA6QYAIPEEAACRCQAgAwAAAMsCACABAADMAgAwAgAAyAIAIAMAAADLAgAgAQAAzAIAMAIAAMgCACADAAAAywIAIAEAAMwCADACAADIAgAgB8YDAgAAAAHmA0AAAAAB5wNAAAAAAakEAQAAAAGqBAEAAAABqwRAAAAAAawEgAAAAAEBIwAA0AIAIAfGAwIAAAAB5gNAAAAAAecDQAAAAAGpBAEAAAABqgQBAAAAAasEQAAAAAGsBIAAAAABASMAANICADAHxgMCAN0GACHmA0AA8gYAIecDQADyBgAhqQQBANwGACGqBAEA7wYAIasEQADyBgAhrASAAAAAAQIAAADIAgAgIwAA1AIAIAfGAwIA3QYAIeYDQADyBgAh5wNAAPIGACGpBAEA3AYAIaoEAQDvBgAhqwRAAPIGACGsBIAAAAABAgAAAMsCACAjAADWAgAgAwAAAMgCACAoAADQAgAgKQAA1AIAIAEAAADIAgAgAQAAAMsCACAHBgAAjAkAIC4AAI0JACAvAACQCQAgMAAAjwkAIDEAAI4JACCqBAAA6QYAIKwEAADpBgAgCsMDAACTBgAwxAMAANwCABDFAwAAkwYAMMYDAgDMBQAh5gNAANoFACHnA0AA2gUAIakEAQDNBQAhqgQBANYFACGrBEAA2gUAIawEAADqBQAgAwAAAMsCACABAADbAgAwLQAA3AIAIAMAAADLAgAgAQAAzAIAMAIAAMgCACALwwMAAJAGADDEAwAA4gIAEMUDAACQBgAwxgMCAAAAAeYDQAD6BQAh_QNAAPoFACH_AwEA-QUAIaUEAQD5BQAhpgQBAPkFACGnBAgAkQYAIagEAACSBgAgAQAAAN8CACABAAAA3wIAIArDAwAAkAYAMMQDAADiAgAQxQMAAJAGADDGAwIA-AUAIeYDQAD6BQAh_QNAAPoFACH_AwEA-QUAIaUEAQD5BQAhpgQBAPkFACGnBAgAkQYAIQHxBAAAiwkAIAMAAADiAgAgAQAA4wIAMAIAAN8CACADAAAA4gIAIAEAAOMCADACAADfAgAgAwAAAOICACABAADjAgAwAgAA3wIAIAfGAwIAAAAB5gNAAAAAAf0DQAAAAAH_AwEAAAABpQQBAAAAAaYEAQAAAAGnBAgAAAABASMAAOcCACAHxgMCAAAAAeYDQAAAAAH9A0AAAAAB_wMBAAAAAaUEAQAAAAGmBAEAAAABpwQIAAAAAQEjAADpAgAwB8YDAgDdBgAh5gNAAPIGACH9A0AA8gYAIf8DAQDcBgAhpQQBANwGACGmBAEA3AYAIacECACKCQAhAgAAAN8CACAjAADrAgAgB8YDAgDdBgAh5gNAAPIGACH9A0AA8gYAIf8DAQDcBgAhpQQBANwGACGmBAEA3AYAIacECACKCQAhAgAAAOICACAjAADtAgAgAwAAAN8CACAoAADnAgAgKQAA6wIAIAEAAADfAgAgAQAAAOICACAFBgAAhQkAIC4AAIYJACAvAACJCQAgMAAAiAkAIDEAAIcJACAKwwMAAI0GADDEAwAA8wIAEMUDAACNBgAwxgMCAMwFACHmA0AA2gUAIf0DQADaBQAh_wMBAM0FACGlBAEAzQUAIaYEAQDNBQAhpwQIAI4GACEDAAAA4gIAIAEAAPICADAtAADzAgAgAwAAAOICACABAADjAgAwAgAA3wIAIAnDAwAAjAYAMMQDAAD5AgAQxQMAAIwGADDGAwIAAAAB1QMBAPkFACHdAwEA-QUAIecDQAD6BQAhowQBAAAAAaQEAQD5BQAhAQAAAPYCACABAAAA9gIAIAnDAwAAjAYAMMQDAAD5AgAQxQMAAIwGADDGAwIA-AUAIdUDAQD5BQAh3QMBAPkFACHnA0AA-gUAIaMEAQD5BQAhpAQBAPkFACEB8QQAAIQJACADAAAA-QIAIAEAAPoCADACAAD2AgAgAwAAAPkCACABAAD6AgAwAgAA9gIAIAMAAAD5AgAgAQAA-gIAMAIAAPYCACAGxgMCAAAAAdUDAQAAAAHdAwEAAAAB5wNAAAAAAaMEAQAAAAGkBAEAAAABASMAAP4CACAGxgMCAAAAAdUDAQAAAAHdAwEAAAAB5wNAAAAAAaMEAQAAAAGkBAEAAAABASMAAIADADAGxgMCAN0GACHVAwEA3AYAId0DAQDcBgAh5wNAAPIGACGjBAEA3AYAIaQEAQDcBgAhAgAAAPYCACAjAACCAwAgBsYDAgDdBgAh1QMBANwGACHdAwEA3AYAIecDQADyBgAhowQBANwGACGkBAEA3AYAIQIAAAD5AgAgIwAAhAMAIAMAAAD2AgAgKAAA_gIAICkAAIIDACABAAAA9gIAIAEAAAD5AgAgBQYAAP8IACAuAACACQAgLwAAgwkAIDAAAIIJACAxAACBCQAgCcMDAACLBgAwxAMAAIoDABDFAwAAiwYAMMYDAgDMBQAh1QMBAM0FACHdAwEAzQUAIecDQADaBQAhowQBAM0FACGkBAEAzQUAIQMAAAD5AgAgAQAAiQMAMC0AAIoDACADAAAA-QIAIAEAAPoCADACAAD2AgAgCPABAAD7BQAgwwMAAPcFADDEAwAAnwMAEMUDAAD3BQAwxgMCAAAAAcgDAQD5BQAh5gNAAPoFACGRBAEAAAABAQAAAI0DACAX7AEAAIgGACDuAQAAiQYAIO8BAACKBgAgwwMAAIQGADDEAwAAjwMAEMUDAACEBgAwxgMCAPgFACHIAwEA-QUAIeYDQAD6BQAhkAQBAPkFACGRBAEA-QUAIZIEAQD5BQAhkwQBAIUGACGUBAIA-AUAIZUEAgD4BQAhlgQCAPgFACGXBAIA-AUAIZgEAgD4BQAhmQQCAPgFACGaBAIAhgYAIZsEQACDBgAhnAQgAIcGACGdBEAAgwYAIQjsAQAA-wgAIO4BAAD8CAAg7wEAAP0IACCTBAAA6QYAIJoEAADpBgAgmwQAAOkGACCdBAAA6QYAIPEEAAD-CAAgF-wBAACIBgAg7gEAAIkGACDvAQAAigYAIMMDAACEBgAwxAMAAI8DABDFAwAAhAYAMMYDAgAAAAHIAwEA-QUAIeYDQAD6BQAhkAQBAAAAAZEEAQD5BQAhkgQBAPkFACGTBAEAhQYAIZQEAgD4BQAhlQQCAPgFACGWBAIA-AUAIZcEAgD4BQAhmAQCAPgFACGZBAIA-AUAIZoEAgCGBgAhmwRAAIMGACGcBCAAhwYAIZ0EQACDBgAhAwAAAI8DACABAACQAwAwAgAAkQMAIBPtAQAAgAYAIMMDAACCBgAwxAMAAJMDABDFAwAAggYAMMYDAgD4BQAh5gNAAPoFACH9A0AA-gUAIYMEAgD4BQAhhQQIAP4FACGGBAgA_gUAIYcEAAD_BQAgiAQIAP4FACGJBAgA_gUAIYoECAD-BQAhiwQIAP4FACGMBAgA_gUAIY0ECAD-BQAhjgQBAPkFACGPBEAAgwYAIQztAQAA-QgAIIUEAADpBgAghgQAAOkGACCHBAAA6QYAIIgEAADpBgAgiQQAAOkGACCKBAAA6QYAIIsEAADpBgAgjAQAAOkGACCNBAAA6QYAII8EAADpBgAg8QQAAPoIACAU7QEAAIAGACDDAwAAggYAMMQDAACTAwAQxQMAAIIGADDGAwIAAAAB5gNAAPoFACH9A0AA-gUAIYMEAgD4BQAhhQQIAP4FACGGBAgA_gUAIYcEAAD_BQAgiAQIAP4FACGJBAgA_gUAIYoECAD-BQAhiwQIAP4FACGMBAgA_gUAIY0ECAD-BQAhjgQBAPkFACGPBEAAgwYAIaIEAACBBgAgAwAAAJMDACABAACUAwAwAgAAlQMAIAvtAQAAgAYAIMMDAAD9BQAwxAMAAJcDABDFAwAA_QUAMMYDAgD4BQAh5gNAAPoFACGDBAIA-AUAIYQEQAD6BQAhhQQIAP4FACGGBAgA_gUAIYcEAAD_BQAgBO0BAAD5CAAghQQAAOkGACCGBAAA6QYAIIcEAADpBgAgDO0BAACABgAgwwMAAP0FADDEAwAAlwMAEMUDAAD9BQAwxgMCAAAAAeYDQAD6BQAhgwQCAPgFACGEBEAA-gUAIYUECAD-BQAhhgQIAP4FACGHBAAA_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_GAwIAAAAB5gNAAAAAAf0DQAAAAAGDBAIAAAABhQQIAAAAAYYECAAAAAGHBIAAAAABiAQIAAAAAYkECAAAAAGKBAgAAAABiwQIAAAAAYwECAAAAAGNBAgAAAABjgQBAAAAAY8EQAAAAAEBIwAAzgMAMBDtAQAAvwgAIMYDAgDdBgAh5gNAAPIGACH9A0AA8gYAIYMEAgDdBgAhhQQIALcIACGGBAgAtwgAIYcEgAAAAAGIBAgAtwgAIYkECAC3CAAhigQIALcIACGLBAgAtwgAIYwECAC3CAAhjQQIALcIACGOBAEA3AYAIY8EQADwBgAhAgAAAJUDACAjAADQAwAgD8YDAgDdBgAh5gNAAPIGACH9A0AA8gYAIYMEAgDdBgAhhQQIALcIACGGBAgAtwgAIYcEgAAAAAGIBAgAtwgAIYkECAC3CAAhigQIALcIACGLBAgAtwgAIYwECAC3CAAhjQQIALcIACGOBAEA3AYAIY8EQADwBgAhAgAAAJMDACAjAADSAwAgAwAAAJUDACAoAADMAwAgKQAA0AMAIAEAAACVAwAgAQAAAJMDACAPBgAAuggAIC4AALsIACAvAAC-CAAgMAAAvQgAIDEAALwIACCFBAAA6QYAIIYEAADpBgAghwQAAOkGACCIBAAA6QYAIIkEAADpBgAgigQAAOkGACCLBAAA6QYAIIwEAADpBgAgjQQAAOkGACCPBAAA6QYAIBLDAwAA9AUAMMQDAADYAwAQxQMAAPQFADDGAwIAzAUAIeYDQADaBQAh_QNAANoFACGDBAIAzAUAIYUECADyBQAhhgQIAPIFACGHBAAA6gUAIIgECADyBQAhiQQIAPIFACGKBAgA8gUAIYsECADyBQAhjAQIAPIFACGNBAgA8gUAIY4EAQDNBQAhjwRAANcFACEDAAAAkwMAIAEAANcDADAtAADYAwAgAwAAAJMDACABAACUAwAwAgAAlQMAIAEAAACZAwAgAQAAAJkDACADAAAAlwMAIAEAAJgDADACAACZAwAgAwAAAJcDACABAACYAwAwAgAAmQMAIAMAAACXAwAgAQAAmAMAMAIAAJkDACAI7QEAALkIACDGAwIAAAAB5gNAAAAAAYMEAgAAAAGEBEAAAAABhQQIAAAAAYYECAAAAAGHBIAAAAABASMAAOADACAHxgMCAAAAAeYDQAAAAAGDBAIAAAABhARAAAAAAYUECAAAAAGGBAgAAAABhwSAAAAAAQEjAADiAwAwCO0BAAC4CAAgxgMCAN0GACHmA0AA8gYAIYMEAgDdBgAhhARAAPIGACGFBAgAtwgAIYYECAC3CAAhhwSAAAAAAQIAAACZAwAgIwAA5AMAIAfGAwIA3QYAIeYDQADyBgAhgwQCAN0GACGEBEAA8gYAIYUECAC3CAAhhgQIALcIACGHBIAAAAABAgAAAJcDACAjAADmAwAgAwAAAJkDACAoAADgAwAgKQAA5AMAIAEAAACZAwAgAQAAAJcDACAIBgAAsggAIC4AALMIACAvAAC2CAAgMAAAtQgAIDEAALQIACCFBAAA6QYAIIYEAADpBgAghwQAAOkGACAKwwMAAPEFADDEAwAA7AMAEMUDAADxBQAwxgMCAMwFACHmA0AA2gUAIYMEAgDMBQAhhARAANoFACGFBAgA8gUAIYYECADyBQAhhwQAAOoFACADAAAAlwMAIAEAAOsDADAtAADsAwAgAwAAAJcDACABAACYAwAwAgAAmQMAIAEAAAAFACABAAAABQAgAwAAAAMAIAEAAAQAMAIAAAUAIAMAAAADACABAAAEADACAAAFACADAAAAAwAgAQAABAAwAgAABQAgDgMAALAIACAFAACxCAAgxgMCAAAAAcgDAQAAAAHVAwIAAAAB4gMCAAAAAeMDIAAAAAHmA0AAAAAB5wNAAAAAAfUDAQAAAAH6AwEAAAABgAQBAAAAAYEEAgAAAAGCBAEAAAABASMAAPQDACAMxgMCAAAAAcgDAQAAAAHVAwIAAAAB4gMCAAAAAeMDIAAAAAHmA0AAAAAB5wNAAAAAAfUDAQAAAAH6AwEAAAABgAQBAAAAAYEEAgAAAAGCBAEAAAABASMAAPYDADAOAwAAoggAIAUAAKMIACDGAwIA3QYAIcgDAQDcBgAh1QMCAN0GACHiAwIA3QYAIeMDIADxBgAh5gNAAPIGACHnA0AA8gYAIfUDAQDcBgAh-gMBANwGACGABAEA3AYAIYEEAgDdBgAhggQBANwGACECAAAABQAgIwAA-AMAIAzGAwIA3QYAIcgDAQDcBgAh1QMCAN0GACHiAwIA3QYAIeMDIADxBgAh5gNAAPIGACHnA0AA8gYAIfUDAQDcBgAh-gMBANwGACGABAEA3AYAIYEEAgDdBgAhggQBANwGACECAAAAAwAgIwAA-gMAIAMAAAAFACAoAAD0AwAgKQAA-AMAIAEAAAAFACABAAAAAwAgBQYAAJ0IACAuAACeCAAgLwAAoQgAIDAAAKAIACAxAACfCAAgD8MDAADwBQAwxAMAAIAEABDFAwAA8AUAMMYDAgDMBQAhyAMBAM0FACHVAwIAzAUAIeIDAgDMBQAh4wMgANkFACHmA0AA2gUAIecDQADaBQAh9QMBAM0FACH6AwEAzQUAIYAEAQDNBQAhgQQCAMwFACGCBAEAzQUAIQMAAAADACABAAD_AwAwLQAAgAQAIAMAAAADACABAAAEADACAAAFACABAAAACQAgAQAAAAkAIAMAAAAHACABAAAIADACAAAJACADAAAABwAgAQAACAAwAgAACQAgAwAAAAcAIAEAAAgAMAIAAAkAIAoDAACcCAAgBAAAmwgAIMYDAgAAAAHVAwIAAAAB5gNAAAAAAfoDAQAAAAH8AwIAAAAB_QMBAAAAAf4DAgAAAAH_AwEAAAABASMAAIgEACAIxgMCAAAAAdUDAgAAAAHmA0AAAAAB-gMBAAAAAfwDAgAAAAH9AwEAAAAB_gMCAAAAAf8DAQAAAAEBIwAAigQAMAoDAACaCAAgBAAAmQgAIMYDAgDdBgAh1QMCAN0GACHmA0AA8gYAIfoDAQDcBgAh_AMCAN0GACH9AwEA3AYAIf4DAgDdBgAh_wMBANwGACECAAAACQAgIwAAjAQAIAjGAwIA3QYAIdUDAgDdBgAh5gNAAPIGACH6AwEA3AYAIfwDAgDdBgAh_QMBANwGACH-AwIA3QYAIf8DAQDcBgAhAgAAAAcAICMAAI4EACADAAAACQAgKAAAiAQAICkAAIwEACABAAAACQAgAQAAAAcAIAUGAACUCAAgLgAAlQgAIC8AAJgIACAwAACXCAAgMQAAlggAIAvDAwAA7wUAMMQDAACUBAAQxQMAAO8FADDGAwIAzAUAIdUDAgDMBQAh5gNAANoFACH6AwEAzQUAIfwDAgDMBQAh_QMBAM0FACH-AwIAzAUAIf8DAQDNBQAhAwAAAAcAIAEAAJMEADAtAACUBAAgAwAAAAcAIAEAAAgAMAIAAAkAIAEAAAAPACABAAAADwAgAwAAAA0AIAEAAA4AMAIAAA8AIAMAAAANACABAAAOADACAAAPACADAAAADQAgAQAADgAwAgAADwAgCgMAAJIIACAKAACTCAAgxgMCAAAAAdUDAgAAAAHZAwEAAAAB4wMgAAAAAeYDQAAAAAHnA0AAAAAB9wMBAAAAAfoDAQAAAAEBIwAAnAQAIAjGAwIAAAAB1QMCAAAAAdkDAQAAAAHjAyAAAAAB5gNAAAAAAecDQAAAAAH3AwEAAAAB-gMBAAAAAQEjAACeBAAwCgMAAIQIACAKAACFCAAgxgMCAN0GACHVAwIA3QYAIdkDAQDcBgAh4wMgAPEGACHmA0AA8gYAIecDQADyBgAh9wMBANwGACH6AwEA3AYAIQIAAAAPACAjAACgBAAgCMYDAgDdBgAh1QMCAN0GACHZAwEA3AYAIeMDIADxBgAh5gNAAPIGACHnA0AA8gYAIfcDAQDcBgAh-gMBANwGACECAAAADQAgIwAAogQAIAMAAAAPACAoAACcBAAgKQAAoAQAIAEAAAAPACABAAAADQAgBQYAAP8HACAuAACACAAgLwAAgwgAIDAAAIIIACAxAACBCAAgC8MDAADuBQAwxAMAAKgEABDFAwAA7gUAMMYDAgDMBQAh1QMCAMwFACHZAwEAzQUAIeMDIADZBQAh5gNAANoFACHnA0AA2gUAIfcDAQDNBQAh-gMBAM0FACEDAAAADQAgAQAApwQAMC0AAKgEACADAAAADQAgAQAADgAwAgAADwAgAQAAABMAIAEAAAATACADAAAAEQAgAQAAEgAwAgAAEwAgAwAAABEAIAEAABIAMAIAABMAIAMAAAARACABAAASADACAAATACAKCQAA_gcAIMYDAgAAAAHZAwEAAAAB3gNAAAAAAeIDAgAAAAHmA0AAAAAB5wNAAAAAAfkDAgAAAAH6AwEAAAAB-wMgAAAAAQEjAACwBAAgCcYDAgAAAAHZAwEAAAAB3gNAAAAAAeIDAgAAAAHmA0AAAAAB5wNAAAAAAfkDAgAAAAH6AwEAAAAB-wMgAAAAAQEjAACyBAAwCgkAAP0HACDGAwIA3QYAIdkDAQDcBgAh3gNAAPAGACHiAwIA3QYAIeYDQADyBgAh5wNAAPIGACH5AwIA3QYAIfoDAQDcBgAh-wMgAPEGACECAAAAEwAgIwAAtAQAIAnGAwIA3QYAIdkDAQDcBgAh3gNAAPAGACHiAwIA3QYAIeYDQADyBgAh5wNAAPIGACH5AwIA3QYAIfoDAQDcBgAh-wMgAPEGACECAAAAEQAgIwAAtgQAIAMAAAATACAoAACwBAAgKQAAtAQAIAEAAAATACABAAAAEQAgBgYAAPgHACAuAAD5BwAgLwAA_AcAIDAAAPsHACAxAAD6BwAg3gMAAOkGACAMwwMAAO0FADDEAwAAvAQAEMUDAADtBQAwxgMCAMwFACHZAwEAzQUAId4DQADXBQAh4gMCAMwFACHmA0AA2gUAIecDQADaBQAh-QMCAMwFACH6AwEAzQUAIfsDIADZBQAhAwAAABEAIAEAALsEADAtAAC8BAAgAwAAABEAIAEAABIAMAIAABMAIAEAAAAYACABAAAAGAAgAwAAABYAIAEAABcAMAIAABgAIAMAAAAWACABAAAXADACAAAYACADAAAAFgAgAQAAFwAwAgAAGAAgCQMAAPcHACAKgAAAAAHGAwIAAAAByAMBAAAAAdUDAgAAAAHmA0AAAAAB5wNAAAAAAfcDAQAAAAH4AyAAAAABASMAAMQEACAICoAAAAABxgMCAAAAAcgDAQAAAAHVAwIAAAAB5gNAAAAAAecDQAAAAAH3AwEAAAAB-AMgAAAAAQEjAADGBAAwCQMAAPYHACAKgAAAAAHGAwIA3QYAIcgDAQDcBgAh1QMCAPMGACHmA0AA8gYAIecDQADyBgAh9wMBANwGACH4AyAA8QYAIQIAAAAYACAjAADIBAAgCAqAAAAAAcYDAgDdBgAhyAMBANwGACHVAwIA8wYAIeYDQADyBgAh5wNAAPIGACH3AwEA3AYAIfgDIADxBgAhAgAAABYAICMAAMoEACADAAAAGAAgKAAAxAQAICkAAMgEACABAAAAGAAgAQAAABYAIAYGAADxBwAgLgAA8gcAIC8AAPUHACAwAAD0BwAgMQAA8wcAINUDAADpBgAgCwoAANgFACDDAwAA7AUAMMQDAADQBAAQxQMAAOwFADDGAwIAzAUAIcgDAQDNBQAh1QMCANUFACHmA0AA2gUAIecDQADaBQAh9wMBAM0FACH4AyAA2QUAIQMAAAAWACABAADPBAAwLQAA0AQAIAMAAAAWACABAAAXADACAAAYACABAAAAHgAgAQAAAB4AIAMAAAAcACABAAAdADACAAAeACADAAAAHAAgAQAAHQAwAgAAHgAgAwAAABwAIAEAAB0AMAIAAB4AIA8NAADtBwAgDwAA7gcAIBcAAPAHACAYAADvBwAgxgMCAAAAAcgDAQAAAAHjAyAAAAAB5gNAAAAAAecDQAAAAAHxAwIAAAAB8gMgAAAAAfMDgAAAAAH0A4AAAAAB9QMBAAAAAfYDAQAAAAEBIwAA2AQAIAvGAwIAAAAByAMBAAAAAeMDIAAAAAHmA0AAAAAB5wNAAAAAAfEDAgAAAAHyAyAAAAAB8wOAAAAAAfQDgAAAAAH1AwEAAAAB9gMBAAAAAQEjAADaBAAwDw0AAMgHACAPAADJBwAgFwAAywcAIBgAAMoHACDGAwIA3QYAIcgDAQDcBgAh4wMgAPEGACHmA0AA8gYAIecDQADyBgAh8QMCAN0GACHyAyAA8QYAIfMDgAAAAAH0A4AAAAAB9QMBAO8GACH2AwEA3AYAIQIAAAAeACAjAADcBAAgC8YDAgDdBgAhyAMBANwGACHjAyAA8QYAIeYDQADyBgAh5wNAAPIGACHxAwIA3QYAIfIDIADxBgAh8wOAAAAAAfQDgAAAAAH1AwEA7wYAIfYDAQDcBgAhAgAAABwAICMAAN4EACADAAAAHgAgKAAA2AQAICkAANwEACABAAAAHgAgAQAAABwAIAcGAADDBwAgLgAAxAcAIC8AAMcHACAwAADGBwAgMQAAxQcAIPQDAADpBgAg9QMAAOkGACAOwwMAAOkFADDEAwAA5AQAEMUDAADpBQAwxgMCAMwFACHIAwEAzQUAIeMDIADZBQAh5gNAANoFACHnA0AA2gUAIfEDAgDMBQAh8gMgANkFACHzAwAA2AUAIPQDAADqBQAg9QMBANYFACH2AwEAzQUAIQMAAAAcACABAADjBAAwLQAA5AQAIAMAAAAcACABAAAdADACAAAeACABAAAAIgAgAQAAACIAIAMAAAAgACABAAAhADACAAAiACADAAAAIAAgAQAAIQAwAgAAIgAgAwAAACAAIAEAACEAMAIAACIAIAcDAADCBwAgDgAAwQcAIMYDAgAAAAHVAwIAAAAB1gMCAAAAAeYDQAAAAAHwAwEAAAABASMAAOwEACAFxgMCAAAAAdUDAgAAAAHWAwIAAAAB5gNAAAAAAfADAQAAAAEBIwAA7gQAMAcDAADABwAgDgAAvwcAIMYDAgDdBgAh1QMCAN0GACHWAwIA3QYAIeYDQADyBgAh8AMBANwGACECAAAAIgAgIwAA8AQAIAXGAwIA3QYAIdUDAgDdBgAh1gMCAN0GACHmA0AA8gYAIfADAQDcBgAhAgAAACAAICMAAPIEACADAAAAIgAgKAAA7AQAICkAAPAEACABAAAAIgAgAQAAACAAIAUGAAC6BwAgLgAAuwcAIC8AAL4HACAwAAC9BwAgMQAAvAcAIAjDAwAA6AUAMMQDAAD4BAAQxQMAAOgFADDGAwIAzAUAIdUDAgDMBQAh1gMCAMwFACHmA0AA2gUAIfADAQDNBQAhAwAAACAAIAEAAPcEADAtAAD4BAAgAwAAACAAIAEAACEAMAIAACIAIAEAAAAmACABAAAAJgAgAwAAACQAIAEAACUAMAIAACYAIAMAAAAkACABAAAlADACAAAmACADAAAAJAAgAQAAJQAwAgAAJgAgCg4AALgHACAXAAC5BwAgxgMCAAAAAcgDAQAAAAHWAwIAAAAB4gMCAAAAAeYDQAAAAAHnA0AAAAAB7gMBAAAAAe8DAQAAAAEBIwAAgAUAIAjGAwIAAAAByAMBAAAAAdYDAgAAAAHiAwIAAAAB5gNAAAAAAecDQAAAAAHuAwEAAAAB7wMBAAAAAQEjAACCBQAwCg4AAK0HACAXAACuBwAgxgMCAN0GACHIAwEA3AYAIdYDAgDdBgAh4gMCAN0GACHmA0AA8gYAIecDQADyBgAh7gMBAO8GACHvAwEA3AYAIQIAAAAmACAjAACEBQAgCMYDAgDdBgAhyAMBANwGACHWAwIA3QYAIeIDAgDdBgAh5gNAAPIGACHnA0AA8gYAIe4DAQDvBgAh7wMBANwGACECAAAAJAAgIwAAhgUAIAMAAAAmACAoAACABQAgKQAAhAUAIAEAAAAmACABAAAAJAAgBgYAAKgHACAuAACpBwAgLwAArAcAIDAAAKsHACAxAACqBwAg7gMAAOkGACALwwMAAOcFADDEAwAAjAUAEMUDAADnBQAwxgMCAMwFACHIAwEAzQUAIdYDAgDMBQAh4gMCAMwFACHmA0AA2gUAIecDQADaBQAh7gMBANYFACHvAwEAzQUAIQMAAAAkACABAACLBQAwLQAAjAUAIAMAAAAkACABAAAlADACAAAmACABAAAAKgAgAQAAACoAIAMAAAAoACABAAApADACAAAqACADAAAAKAAgAQAAKQAwAgAAKgAgAwAAACgAIAEAACkAMAIAACoAIBsOAACgBwAgDwAApQcAIBAAAKEHACARAACnBwAgEgAAogcAIBMAAKMHACAUAACkBwAgFgAApgcAIMYDAgAAAAHWAwIAAAAB1wMCAAAAAdgDAgAAAAHZAwEAAAAB2gMBAAAAAdsDAQAAAAHcA0AAAAAB3QMBAAAAAd4DQAAAAAHfAwIAAAAB4AMCAAAAAeEDgAAAAAHiAwIAAAAB4wMgAAAAAeQDQAAAAAHlAwEAAAAB5gNAAAAAAecDQAAAAAEBIwAAlAUAIBPGAwIAAAAB1gMCAAAAAdcDAgAAAAHYAwIAAAAB2QMBAAAAAdoDAQAAAAHbAwEAAAAB3ANAAAAAAd0DAQAAAAHeA0AAAAAB3wMCAAAAAeADAgAAAAHhA4AAAAAB4gMCAAAAAeMDIAAAAAHkA0AAAAAB5QMBAAAAAeYDQAAAAAHnA0AAAAABASMAAJYFADAbDgAA9AYAIA8AAPoGACAQAAD1BgAgEQAA9gYAIBIAAPcGACATAAD4BgAgFAAA-QYAIBYAAPsGACDGAwIA3QYAIdYDAgDdBgAh1wMCAN0GACHYAwIA8wYAIdkDAQDcBgAh2gMBANwGACHbAwEA7wYAIdwDQADwBgAh3QMBANwGACHeA0AA8AYAId8DAgDzBgAh4AMCAN0GACHhA4AAAAAB4gMCAN0GACHjAyAA8QYAIeQDQADwBgAh5QMBAO8GACHmA0AA8gYAIecDQADyBgAhAgAAACoAICMAAJgFACATxgMCAN0GACHWAwIA3QYAIdcDAgDdBgAh2AMCAPMGACHZAwEA3AYAIdoDAQDcBgAh2wMBAO8GACHcA0AA8AYAId0DAQDcBgAh3gNAAPAGACHfAwIA8wYAIeADAgDdBgAh4QOAAAAAAeIDAgDdBgAh4wMgAPEGACHkA0AA8AYAIeUDAQDvBgAh5gNAAPIGACHnA0AA8gYAIQIAAAAoACAjAACaBQAgAwAAACoAICgAAJQFACApAACYBQAgAQAAACoAIAEAAAAoACAMBgAA6gYAIC4AAOsGACAvAADuBgAgMAAA7QYAIDEAAOwGACDYAwAA6QYAINsDAADpBgAg3AMAAOkGACDeAwAA6QYAIN8DAADpBgAg5AMAAOkGACDlAwAA6QYAIBbDAwAA1AUAMMQDAACgBQAQxQMAANQFADDGAwIAzAUAIdYDAgDMBQAh1wMCAMwFACHYAwIA1QUAIdkDAQDNBQAh2gMBAM0FACHbAwEA1gUAIdwDQADXBQAh3QMBAM0FACHeA0AA1wUAId8DAgDVBQAh4AMCAMwFACHhAwAA2AUAIOIDAgDMBQAh4wMgANkFACHkA0AA1wUAIeUDAQDWBQAh5gNAANoFACHnA0AA2gUAIQMAAAAoACABAACfBQAwLQAAoAUAIAMAAAAoACABAAApADACAAAqACABAAAAMQAgAQAAADEAIAMAAAAvACABAAAwADACAAAxACADAAAALwAgAQAAMAAwAgAAMQAgAwAAAC8AIAEAADAAMAIAADEAIAUDAADoBgAgFQAA5wYAIMYDAgAAAAHHAwIAAAAB1QMCAAAAAQEjAACoBQAgA8YDAgAAAAHHAwIAAAAB1QMCAAAAAQEjAACqBQAwBQMAAOYGACAVAADlBgAgxgMCAN0GACHHAwIA3QYAIdUDAgDdBgAhAgAAADEAICMAAKwFACADxgMCAN0GACHHAwIA3QYAIdUDAgDdBgAhAgAAAC8AICMAAK4FACADAAAAMQAgKAAAqAUAICkAAKwFACABAAAAMQAgAQAAAC8AIAUGAADgBgAgLgAA4QYAIC8AAOQGACAwAADjBgAgMQAA4gYAIAbDAwAA0wUAMMQDAAC0BQAQxQMAANMFADDGAwIAzAUAIccDAgDMBQAh1QMCAMwFACEDAAAALwAgAQAAswUAMC0AALQFACADAAAALwAgAQAAMAAwAgAAMQAgAQAAADUAIAEAAAA1ACADAAAAMwAgAQAANAAwAgAANQAgAwAAADMAIAEAADQAMAIAADUAIAMAAAAzACABAAA0ADACAAA1ACAEFQAA3wYAIMYDAgAAAAHHAwIAAAAByAMBAAAAAQEjAAC8BQAgA8YDAgAAAAHHAwIAAAAByAMBAAAAAQEjAAC-BQAwBBUAAN4GACDGAwIA3QYAIccDAgDdBgAhyAMBANwGACECAAAANQAgIwAAwAUAIAPGAwIA3QYAIccDAgDdBgAhyAMBANwGACECAAAAMwAgIwAAwgUAIAMAAAA1ACAoAAC8BQAgKQAAwAUAIAEAAAA1ACABAAAAMwAgBQYAANcGACAuAADYBgAgLwAA2wYAIDAAANoGACAxAADZBgAgBsMDAADLBQAwxAMAAMgFABDFAwAAywUAMMYDAgDMBQAhxwMCAMwFACHIAwEAzQUAIQMAAAAzACABAADHBQAwLQAAyAUAIAMAAAAzACABAAA0ADACAAA1ACAGwwMAAMsFADDEAwAAyAUAEMUDAADLBQAwxgMCAMwFACHHAwIAzAUAIcgDAQDNBQAhDQYAAM8FACAuAADSBQAgLwAAzwUAIDAAAM8FACAxAADPBQAgyQMCAAAAAcoDAgAAAATLAwIAAAAEzAMCAAAAAc0DAgAAAAHOAwIAAAABzwMCAAAAAdQDAgDRBQAhDwYAAM8FACAwAADQBQAgMQAA0AUAIMkDAQAAAAHKAwEAAAAEywMBAAAABMwDAQAAAAHNAwEAAAABzgMBAAAAAc8DAQAAAAHQAwEAAAAB0QMBAAAAAdIDAQAAAAHTAwEAAAAB1AMBAM4FACEPBgAAzwUAIDAAANAFACAxAADQBQAgyQMBAAAAAcoDAQAAAATLAwEAAAAEzAMBAAAAAc0DAQAAAAHOAwEAAAABzwMBAAAAAdADAQAAAAHRAwEAAAAB0gMBAAAAAdMDAQAAAAHUAwEAzgUAIQjJAwIAAAABygMCAAAABMsDAgAAAATMAwIAAAABzQMCAAAAAc4DAgAAAAHPAwIAAAAB1AMCAM8FACEMyQMBAAAAAcoDAQAAAATLAwEAAAAEzAMBAAAAAc0DAQAAAAHOAwEAAAABzwMBAAAAAdADAQAAAAHRAwEAAAAB0gMBAAAAAdMDAQAAAAHUAwEA0AUAIQ0GAADPBQAgLgAA0gUAIC8AAM8FACAwAADPBQAgMQAAzwUAIMkDAgAAAAHKAwIAAAAEywMCAAAABMwDAgAAAAHNAwIAAAABzgMCAAAAAc8DAgAAAAHUAwIA0QUAIQjJAwgAAAABygMIAAAABMsDCAAAAATMAwgAAAABzQMIAAAAAc4DCAAAAAHPAwgAAAAB1AMIANIFACEGwwMAANMFADDEAwAAtAUAEMUDAADTBQAwxgMCAMwFACHHAwIAzAUAIdUDAgDMBQAhFsMDAADUBQAwxAMAAKAFABDFAwAA1AUAMMYDAgDMBQAh1gMCAMwFACHXAwIAzAUAIdgDAgDVBQAh2QMBAM0FACHaAwEAzQUAIdsDAQDWBQAh3ANAANcFACHdAwEAzQUAId4DQADXBQAh3wMCANUFACHgAwIAzAUAIeEDAADYBQAg4gMCAMwFACHjAyAA2QUAIeQDQADXBQAh5QMBANYFACHmA0AA2gUAIecDQADaBQAhDQYAAOEFACAuAADmBQAgLwAA4QUAIDAAAOEFACAxAADhBQAgyQMCAAAAAcoDAgAAAAXLAwIAAAAFzAMCAAAAAc0DAgAAAAHOAwIAAAABzwMCAAAAAdQDAgDlBQAhDwYAAOEFACAwAADkBQAgMQAA5AUAIMkDAQAAAAHKAwEAAAAFywMBAAAABcwDAQAAAAHNAwEAAAABzgMBAAAAAc8DAQAAAAHQAwEAAAAB0QMBAAAAAdIDAQAAAAHTAwEAAAAB1AMBAOMFACELBgAA4QUAIDAAAOIFACAxAADiBQAgyQNAAAAAAcoDQAAAAAXLA0AAAAAFzANAAAAAAc0DQAAAAAHOA0AAAAABzwNAAAAAAdQDQADgBQAhDwYAAM8FACAwAADfBQAgMQAA3wUAIMkDgAAAAAHMA4AAAAABzQOAAAAAAc4DgAAAAAHPA4AAAAAB1AOAAAAAAegDAQAAAAHpAwEAAAAB6gMBAAAAAesDgAAAAAHsA4AAAAAB7QOAAAAAAQUGAADPBQAgMAAA3gUAIDEAAN4FACDJAyAAAAAB1AMgAN0FACELBgAAzwUAIDAAANwFACAxAADcBQAgyQNAAAAAAcoDQAAAAATLA0AAAAAEzANAAAAAAc0DQAAAAAHOA0AAAAABzwNAAAAAAdQDQADbBQAhCwYAAM8FACAwAADcBQAgMQAA3AUAIMkDQAAAAAHKA0AAAAAEywNAAAAABMwDQAAAAAHNA0AAAAABzgNAAAAAAc8DQAAAAAHUA0AA2wUAIQjJA0AAAAABygNAAAAABMsDQAAAAATMA0AAAAABzQNAAAAAAc4DQAAAAAHPA0AAAAAB1ANAANwFACEFBgAAzwUAIDAAAN4FACAxAADeBQAgyQMgAAAAAdQDIADdBQAhAskDIAAAAAHUAyAA3gUAIQzJA4AAAAABzAOAAAAAAc0DgAAAAAHOA4AAAAABzwOAAAAAAdQDgAAAAAHoAwEAAAAB6QMBAAAAAeoDAQAAAAHrA4AAAAAB7AOAAAAAAe0DgAAAAAELBgAA4QUAIDAAAOIFACAxAADiBQAgyQNAAAAAAcoDQAAAAAXLA0AAAAAFzANAAAAAAc0DQAAAAAHOA0AAAAABzwNAAAAAAdQDQADgBQAhCMkDAgAAAAHKAwIAAAAFywMCAAAABcwDAgAAAAHNAwIAAAABzgMCAAAAAc8DAgAAAAHUAwIA4QUAIQjJA0AAAAABygNAAAAABcsDQAAAAAXMA0AAAAABzQNAAAAAAc4DQAAAAAHPA0AAAAAB1ANAAOIFACEPBgAA4QUAIDAAAOQFACAxAADkBQAgyQMBAAAAAcoDAQAAAAXLAwEAAAAFzAMBAAAAAc0DAQAAAAHOAwEAAAABzwMBAAAAAdADAQAAAAHRAwEAAAAB0gMBAAAAAdMDAQAAAAHUAwEA4wUAIQzJAwEAAAABygMBAAAABcsDAQAAAAXMAwEAAAABzQMBAAAAAc4DAQAAAAHPAwEAAAAB0AMBAAAAAdEDAQAAAAHSAwEAAAAB0wMBAAAAAdQDAQDkBQAhDQYAAOEFACAuAADmBQAgLwAA4QUAIDAAAOEFACAxAADhBQAgyQMCAAAAAcoDAgAAAAXLAwIAAAAFzAMCAAAAAc0DAgAAAAHOAwIAAAABzwMCAAAAAdQDAgDlBQAhCMkDCAAAAAHKAwgAAAAFywMIAAAABcwDCAAAAAHNAwgAAAABzgMIAAAAAc8DCAAAAAHUAwgA5gUAIQvDAwAA5wUAMMQDAACMBQAQxQMAAOcFADDGAwIAzAUAIcgDAQDNBQAh1gMCAMwFACHiAwIAzAUAIeYDQADaBQAh5wNAANoFACHuAwEA1gUAIe8DAQDNBQAhCMMDAADoBQAwxAMAAPgEABDFAwAA6AUAMMYDAgDMBQAh1QMCAMwFACHWAwIAzAUAIeYDQADaBQAh8AMBAM0FACEOwwMAAOkFADDEAwAA5AQAEMUDAADpBQAwxgMCAMwFACHIAwEAzQUAIeMDIADZBQAh5gNAANoFACHnA0AA2gUAIfEDAgDMBQAh8gMgANkFACHzAwAA2AUAIPQDAADqBQAg9QMBANYFACH2AwEAzQUAIQ8GAADhBQAgMAAA6wUAIDEAAOsFACDJA4AAAAABzAOAAAAAAc0DgAAAAAHOA4AAAAABzwOAAAAAAdQDgAAAAAHoAwEAAAAB6QMBAAAAAeoDAQAAAAHrA4AAAAAB7AOAAAAAAe0DgAAAAAEMyQOAAAAAAcwDgAAAAAHNA4AAAAABzgOAAAAAAc8DgAAAAAHUA4AAAAAB6AMBAAAAAekDAQAAAAHqAwEAAAAB6wOAAAAAAewDgAAAAAHtA4AAAAABCwoAANgFACDDAwAA7AUAMMQDAADQBAAQxQMAAOwFADDGAwIAzAUAIcgDAQDNBQAh1QMCANUFACHmA0AA2gUAIecDQADaBQAh9wMBAM0FACH4AyAA2QUAIQzDAwAA7QUAMMQDAAC8BAAQxQMAAO0FADDGAwIAzAUAIdkDAQDNBQAh3gNAANcFACHiAwIAzAUAIeYDQADaBQAh5wNAANoFACH5AwIAzAUAIfoDAQDNBQAh-wMgANkFACELwwMAAO4FADDEAwAAqAQAEMUDAADuBQAwxgMCAMwFACHVAwIAzAUAIdkDAQDNBQAh4wMgANkFACHmA0AA2gUAIecDQADaBQAh9wMBAM0FACH6AwEAzQUAIQvDAwAA7wUAMMQDAACUBAAQxQMAAO8FADDGAwIAzAUAIdUDAgDMBQAh5gNAANoFACH6AwEAzQUAIfwDAgDMBQAh_QMBAM0FACH-AwIAzAUAIf8DAQDNBQAhD8MDAADwBQAwxAMAAIAEABDFAwAA8AUAMMYDAgDMBQAhyAMBAM0FACHVAwIAzAUAIeIDAgDMBQAh4wMgANkFACHmA0AA2gUAIecDQADaBQAh9QMBAM0FACH6AwEAzQUAIYAEAQDNBQAhgQQCAMwFACGCBAEAzQUAIQrDAwAA8QUAMMQDAADsAwAQxQMAAPEFADDGAwIAzAUAIeYDQADaBQAhgwQCAMwFACGEBEAA2gUAIYUECADyBQAhhgQIAPIFACGHBAAA6gUAIA0GAADhBQAgLgAA5gUAIC8AAOYFACAwAADmBQAgMQAA5gUAIMkDCAAAAAHKAwgAAAAFywMIAAAABcwDCAAAAAHNAwgAAAABzgMIAAAAAc8DCAAAAAHUAwgA8wUAIQ0GAADhBQAgLgAA5gUAIC8AAOYFACAwAADmBQAgMQAA5gUAIMkDCAAAAAHKAwgAAAAFywMIAAAABcwDCAAAAAHNAwgAAAABzgMIAAAAAc8DCAAAAAHUAwgA8wUAIRLDAwAA9AUAMMQDAADYAwAQxQMAAPQFADDGAwIAzAUAIeYDQADaBQAh_QNAANoFACGDBAIAzAUAIYUECADyBQAhhgQIAPIFACGHBAAA6gUAIIgECADyBQAhiQQIAPIFACGKBAgA8gUAIYsECADyBQAhjAQIAPIFACGNBAgA8gUAIY4EAQDNBQAhjwRAANcFACEUwwMAAPUFADDEAwAAxAMAEMUDAAD1BQAwxgMCAMwFACHIAwEAzQUAIeYDQADaBQAhkAQBAM0FACGRBAEAzQUAIZIEAQDNBQAhkwQBANYFACGUBAIAzAUAIZUEAgDMBQAhlgQCAMwFACGXBAIAzAUAIZgEAgDMBQAhmQQCAMwFACGaBAIA1QUAIZsEQADXBQAhnAQgANkFACGdBEAA1wUAIQfDAwAA9gUAMMQDAACwAwAQxQMAAPYFADDGAwIAzAUAIcgDAQDNBQAh5gNAANoFACGRBAEAzQUAIQjwAQAA-wUAIMMDAAD3BQAwxAMAAJ8DABDFAwAA9wUAMMYDAgD4BQAhyAMBAPkFACHmA0AA-gUAIZEEAQD5BQAhCMkDAgAAAAHKAwIAAAAEywMCAAAABMwDAgAAAAHNAwIAAAABzgMCAAAAAc8DAgAAAAHUAwIAzwUAIQzJAwEAAAABygMBAAAABMsDAQAAAATMAwEAAAABzQMBAAAAAc4DAQAAAAHPAwEAAAAB0AMBAAAAAdEDAQAAAAHSAwEAAAAB0wMBAAAAAdQDAQDQBQAhCMkDQAAAAAHKA0AAAAAEywNAAAAABMwDQAAAAAHNA0AAAAABzgNAAAAAAc8DQAAAAAHUA0AA3AUAIQOeBAAAjwMAIJ8EAACPAwAgoAQAAI8DACACgwQCAAAAAYQEQAAAAAEL7QEAAIAGACDDAwAA_QUAMMQDAACXAwAQxQMAAP0FADDGAwIA-AUAIeYDQAD6BQAhgwQCAPgFACGEBEAA-gUAIYUECAD-BQAhhgQIAP4FACGHBAAA_wUAIAjJAwgAAAABygMIAAAABcsDCAAAAAXMAwgAAAABzQMIAAAAAc4DCAAAAAHPAwgAAAAB1AMIAOYFACEMyQOAAAAAAcwDgAAAAAHNA4AAAAABzgOAAAAAAc8DgAAAAAHUA4AAAAAB6AMBAAAAAekDAQAAAAHqAwEAAAAB6wOAAAAAAewDgAAAAAHtA4AAAAABGewBAACIBgAg7gEAAIkGACDvAQAAigYAIMMDAACEBgAwxAMAAI8DABDFAwAAhAYAMMYDAgD4BQAhyAMBAPkFACHmA0AA-gUAIZAEAQD5BQAhkQQBAPkFACGSBAEA-QUAIZMEAQCFBgAhlAQCAPgFACGVBAIA-AUAIZYEAgD4BQAhlwQCAPgFACGYBAIA-AUAIZkEAgD4BQAhmgQCAIYGACGbBEAAgwYAIZwEIACHBgAhnQRAAIMGACHmBAAAjwMAIOcEAACPAwAgAv0DQAAAAAGDBAIAAAABE-0BAACABgAgwwMAAIIGADDEAwAAkwMAEMUDAACCBgAwxgMCAPgFACHmA0AA-gUAIf0DQAD6BQAhgwQCAPgFACGFBAgA_gUAIYYECAD-BQAhhwQAAP8FACCIBAgA_gUAIYkECAD-BQAhigQIAP4FACGLBAgA_gUAIYwECAD-BQAhjQQIAP4FACGOBAEA-QUAIY8EQACDBgAhCMkDQAAAAAHKA0AAAAAFywNAAAAABcwDQAAAAAHNA0AAAAABzgNAAAAAAc8DQAAAAAHUA0AA4gUAIRfsAQAAiAYAIO4BAACJBgAg7wEAAIoGACDDAwAAhAYAMMQDAACPAwAQxQMAAIQGADDGAwIA-AUAIcgDAQD5BQAh5gNAAPoFACGQBAEA-QUAIZEEAQD5BQAhkgQBAPkFACGTBAEAhQYAIZQEAgD4BQAhlQQCAPgFACGWBAIA-AUAIZcEAgD4BQAhmAQCAPgFACGZBAIA-AUAIZoEAgCGBgAhmwRAAIMGACGcBCAAhwYAIZ0EQACDBgAhDMkDAQAAAAHKAwEAAAAFywMBAAAABcwDAQAAAAHNAwEAAAABzgMBAAAAAc8DAQAAAAHQAwEAAAAB0QMBAAAAAdIDAQAAAAHTAwEAAAAB1AMBAOQFACEIyQMCAAAAAcoDAgAAAAXLAwIAAAAFzAMCAAAAAc0DAgAAAAHOAwIAAAABzwMCAAAAAdQDAgDhBQAhAskDIAAAAAHUAyAA3gUAIQrwAQAA-wUAIMMDAAD3BQAwxAMAAJ8DABDFAwAA9wUAMMYDAgD4BQAhyAMBAPkFACHmA0AA-gUAIZEEAQD5BQAh5gQAAJ8DACDnBAAAnwMAIAOeBAAAkwMAIJ8EAACTAwAgoAQAAJMDACADngQAAJcDACCfBAAAlwMAIKAEAACXAwAgCcMDAACLBgAwxAMAAIoDABDFAwAAiwYAMMYDAgDMBQAh1QMBAM0FACHdAwEAzQUAIecDQADaBQAhowQBAM0FACGkBAEAzQUAIQnDAwAAjAYAMMQDAAD5AgAQxQMAAIwGADDGAwIA-AUAIdUDAQD5BQAh3QMBAPkFACHnA0AA-gUAIaMEAQD5BQAhpAQBAPkFACEKwwMAAI0GADDEAwAA8wIAEMUDAACNBgAwxgMCAMwFACHmA0AA2gUAIf0DQADaBQAh_wMBAM0FACGlBAEAzQUAIaYEAQDNBQAhpwQIAI4GACENBgAAzwUAIC4AANIFACAvAADSBQAgMAAA0gUAIDEAANIFACDJAwgAAAABygMIAAAABMsDCAAAAATMAwgAAAABzQMIAAAAAc4DCAAAAAHPAwgAAAAB1AMIAI8GACENBgAAzwUAIC4AANIFACAvAADSBQAgMAAA0gUAIDEAANIFACDJAwgAAAABygMIAAAABMsDCAAAAATMAwgAAAABzQMIAAAAAc4DCAAAAAHPAwgAAAAB1AMIAI8GACEKwwMAAJAGADDEAwAA4gIAEMUDAACQBgAwxgMCAPgFACHmA0AA-gUAIf0DQAD6BQAh_wMBAPkFACGlBAEA-QUAIaYEAQD5BQAhpwQIAJEGACEIyQMIAAAAAcoDCAAAAATLAwgAAAAEzAMIAAAAAc0DCAAAAAHOAwgAAAABzwMIAAAAAdQDCADSBQAhA_0DQAAAAAGlBAEAAAABpgQBAAAAAQrDAwAAkwYAMMQDAADcAgAQxQMAAJMGADDGAwIAzAUAIeYDQADaBQAh5wNAANoFACGpBAEAzQUAIaoEAQDWBQAhqwRAANoFACGsBAAA6gUAIArDAwAAlAYAMMQDAADLAgAQxQMAAJQGADDGAwIA-AUAIeYDQAD6BQAh5wNAAPoFACGpBAEA-QUAIaoEAQCFBgAhqwRAAPoFACGsBAAA_wUAIAjDAwAAlQYAMMQDAADFAgAQxQMAAJUGADDGAwIAzAUAIeYDQADaBQAh5wNAANoFACGtBAEAzQUAIa4EAgDMBQAhCMMDAACWBgAwxAMAALQCABDFAwAAlgYAMMYDAgD4BQAh5gNAAPoFACHnA0AA-gUAIa0EAQD5BQAhrgQCAPgFACEMwwMAAJcGADDEAwAArgIAEMUDAACXBgAwxgMCAMwFACHIAwEAzQUAId0DAQDNBQAh5gNAANoFACHnA0AA2gUAIa8EAQDNBQAhsAQCAMwFACGxBAEAzQUAIbIEQADaBQAhDMMDAACYBgAwxAMAAJ0CABDFAwAAmAYAMMYDAgD4BQAhyAMBAPkFACHdAwEA-QUAIeYDQAD6BQAh5wNAAPoFACGvBAEA-QUAIbAEAgD4BQAhsQQBAPkFACGyBEAA-gUAIQ_DAwAAmQYAMMQDAACXAgAQxQMAAJkGADDGAwIAzAUAIeYDQADaBQAhgARAANoFACGzBAEAzQUAIbQECACOBgAhtQQEAJoGACG2BAgAjgYAIbcEBACaBgAhuAQEAJoGACG5BAQAmgYAIboEAgDMBQAhuwQCAMwFACENBgAAzwUAIC4AANIFACAvAACcBgAgMAAAnAYAIDEAAJwGACDJAwQAAAABygMEAAAABMsDBAAAAATMAwQAAAABzQMEAAAAAc4DBAAAAAHPAwQAAAAB1AMEAJsGACENBgAAzwUAIC4AANIFACAvAACcBgAgMAAAnAYAIDEAAJwGACDJAwQAAAABygMEAAAABMsDBAAAAATMAwQAAAABzQMEAAAAAc4DBAAAAAHPAwQAAAAB1AMEAJsGACEIyQMEAAAAAcoDBAAAAATLAwQAAAAEzAMEAAAAAc0DBAAAAAHOAwQAAAABzwMEAAAAAdQDBACcBgAhD8MDAACdBgAwxAMAAIYCABDFAwAAnQYAMMYDAgD4BQAh5gNAAPoFACGABEAA-gUAIbMEAQD5BQAhtAQIAJEGACG1BAQAngYAIbYECACRBgAhtwQEAJ4GACG4BAQAngYAIbkEBACeBgAhugQCAPgFACG7BAIA-AUAIQjJAwQAAAABygMEAAAABMsDBAAAAATMAwQAAAABzQMEAAAAAc4DBAAAAAHPAwQAAAAB1AMEAJwGACECgARAAAAAAbMEAQAAAAEcwwMAAKAGADDEAwAAgAIAEMUDAACgBgAwxgMCAMwFACHIAwEAzQUAId0DAQDNBQAh5gNAANoFACHnA0AA2gUAIbMEAQDNBQAhuAQEAJoGACG5BAQAmgYAIboEAgDMBQAhuwQCAMwFACG9BAEAzQUAIb4EAQDNBQAhvwQBAM0FACHABAQAmgYAIcEEBACaBgAhwgQCAMwFACHDBAgAjgYAIcQEBACaBgAhxQQEAJoGACHGBAgAjgYAIccECACOBgAhyAQIAI4GACHJBAQAmgYAIcoEBACaBgAhywRAANoFACEcwwMAAKEGADDEAwAA7wEAEMUDAAChBgAwxgMCAPgFACHIAwEA-QUAId0DAQD5BQAh5gNAAPoFACHnA0AA-gUAIbMEAQD5BQAhuAQEAJ4GACG5BAQAngYAIboEAgD4BQAhuwQCAPgFACG9BAEA-QUAIb4EAQD5BQAhvwQBAPkFACHABAQAngYAIcEEBACeBgAhwgQCAPgFACHDBAgAkQYAIcQEBACeBgAhxQQEAJ4GACHGBAgAkQYAIccECACRBgAhyAQIAJEGACHJBAQAngYAIcoEBACeBgAhywRAAPoFACENwwMAAKIGADDEAwAA6QEAEMUDAACiBgAwxgMCAMwFACHmA0AA2gUAIYAEAQDNBQAhzAQBAM0FACHNBAgAjgYAIc4ECACOBgAhzwQBAM0FACHQBAEAzQUAIdEECACOBgAh0gQIAI4GACENwwMAAKMGADDEAwAA2AEAEMUDAACjBgAwxgMCAPgFACHmA0AA-gUAIYAEAQD5BQAhzAQBAPkFACHNBAgAkQYAIc4ECACRBgAhzwQBAPkFACHQBAEA-QUAIdEECACRBgAh0gQIAJEGACEMwwMAAKQGADDEAwAA0gEAEMUDAACkBgAwxgMCAMwFACHZAwEAzQUAIeYDQADaBQAh_wMBAM0FACGvBAEAzQUAIdMEAQDNBQAh1AQBANYFACHVBEAA2gUAIdYEAgDMBQAhDMMDAAClBgAwxAMAAMEBABDFAwAApQYAMMYDAgD4BQAh2QMBAPkFACHmA0AA-gUAIf8DAQD5BQAhrwQBAPkFACHTBAEA-QUAIdQEAQCFBgAh1QRAAPoFACHWBAIA-AUAIQLZAwEAAAAB1QRAAAAAAQnDAwAApwYAMMQDAAC7AQAQxQMAAKcGADDGAwIAzAUAIeYDQADaBQAh5wNAANoFACGABAEAzQUAIdgEAgDMBQAh2QQIAI4GACENwwMAAKgGADDEAwAApwEAEMUDAACoBgAwxgMCAMwFACHIAwEAzQUAIdkDAQDNBQAh5gNAANoFACHnA0AA2gUAIf8DAQDNBQAh2gQBAM0FACHbBAEAzQUAIdwEAQDNBQAh3QQgANkFACEOUQAAqgYAIMMDAACpBgAwxAMAAJYBABDFAwAAqQYAMMYDAgD4BQAhyAMBAPkFACHZAwEA-QUAIeYDQAD6BQAh5wNAAPoFACH_AwEA-QUAIdoEAQD5BQAh2wQBAPkFACHcBAEA-QUAId0EIACHBgAhA54EAACQAQAgnwQAAJABACCgBAAAkAEAIAKABAEAAAAB2AQCAAAAAQpQAACtBgAgwwMAAKwGADDEAwAAkAEAEMUDAACsBgAwxgMCAPgFACHmA0AA-gUAIecDQAD6BQAhgAQBAPkFACHYBAIA-AUAIdkECACRBgAhEFEAAKoGACDDAwAAqQYAMMQDAACWAQAQxQMAAKkGADDGAwIA-AUAIcgDAQD5BQAh2QMBAPkFACHmA0AA-gUAIecDQAD6BQAh_wMBAPkFACHaBAEA-QUAIdsEAQD5BQAh3AQBAPkFACHdBCAAhwYAIeYEAACWAQAg5wQAAJYBACAJIwAA2AUAIMMDAACuBgAwxAMAAIsBABDFAwAArgYAMMYDAgDMBQAhyAMBAM0FACHaAwEAzQUAIeYDQADaBQAh5wNAANoFACEJIwAAsAYAIMMDAACvBgAwxAMAAHoAEMUDAACvBgAwxgMCAPgFACHIAwEA-QUAIdoDAQD5BQAh5gNAAPoFACHnA0AA-gUAIQzJA4AAAAABzAOAAAAAAc0DgAAAAAHOA4AAAAABzwOAAAAAAdQDgAAAAAHoAwEAAAAB6QMBAAAAAeoDAQAAAAHrA4AAAAAB7AOAAAAAAe0DgAAAAAEKwwMAALEGADDEAwAAdAAQxQMAALEGADDGAwIAzAUAIdkDAQDNBQAh5gNAANoFACHnA0AA2gUAIf0DAQDNBQAh1AQBAM0FACHfBAEAzQUAIQrDAwAAsgYAMMQDAABjABDFAwAAsgYAMMYDAgD4BQAh2QMBAPkFACHmA0AA-gUAIecDQAD6BQAh_QMBAPkFACHUBAEA-QUAId8EAQD5BQAhCcMDAACzBgAwxAMAAF0AEMUDAACzBgAwxgMCAMwFACHIAwEAzQUAIeYDQADaBQAh5wNAANoFACHgBAEAzQUAIeEEAQDNBQAhBxUAALUGACDDAwAAtAYAMMQDAAAzABDFAwAAtAYAMMYDAgD4BQAhxwMCAPgFACHIAwEA-QUAISAOAAC6BgAgDwAAvwYAIBAAALsGACARAAC8BgAgEgAAvQYAIBMAAL4GACAUAAC4BgAgFgAAwAYAIMMDAAC5BgAwxAMAACgAEMUDAAC5BgAwxgMCAPgFACHWAwIA-AUAIdcDAgD4BQAh2AMCAIYGACHZAwEA-QUAIdoDAQD5BQAh2wMBAIUGACHcA0AAgwYAId0DAQD5BQAh3gNAAIMGACHfAwIAhgYAIeADAgD4BQAh4QMAALAGACDiAwIA-AUAIeMDIACHBgAh5ANAAIMGACHlAwEAhQYAIeYDQAD6BQAh5wNAAPoFACHmBAAAKAAg5wQAACgAIALHAwIAAAAB1QMCAAAAAQgDAAC4BgAgFQAAtQYAIMMDAAC3BgAwxAMAAC8AEMUDAAC3BgAwxgMCAPgFACHHAwIA-AUAIdUDAgD4BQAhFAcAAMkGACAIAADKBgAgCwAAywYAIAwAAMwGACAZAADNBgAgGgAAxgYAIBsAAL0GACAcAAC9BgAgHQAAvwYAIMMDAADIBgAwxAMAABoAEMUDAADIBgAwxgMCAPgFACHIAwEA-QUAIeYDQAD6BQAh5wNAAPoFACHgBAEA-QUAIeEEAQD5BQAh5gQAABoAIOcEAAAaACAeDgAAugYAIA8AAL8GACAQAAC7BgAgEQAAvAYAIBIAAL0GACATAAC-BgAgFAAAuAYAIBYAAMAGACDDAwAAuQYAMMQDAAAoABDFAwAAuQYAMMYDAgD4BQAh1gMCAPgFACHXAwIA-AUAIdgDAgCGBgAh2QMBAPkFACHaAwEA-QUAIdsDAQCFBgAh3ANAAIMGACHdAwEA-QUAId4DQACDBgAh3wMCAIYGACHgAwIA-AUAIeEDAACwBgAg4gMCAPgFACHjAyAAhwYAIeQDQACDBgAh5QMBAIUGACHmA0AA-gUAIecDQAD6BQAhFA0AALgGACAPAADGBgAgFwAAvQYAIBgAAMcGACDDAwAAxQYAMMQDAAAcABDFAwAAxQYAMMYDAgD4BQAhyAMBAPkFACHjAyAAhwYAIeYDQAD6BQAh5wNAAPoFACHxAwIA-AUAIfIDIACHBgAh8wMAALAGACD0AwAA_wUAIPUDAQCFBgAh9gMBAPkFACHmBAAAHAAg5wQAABwAIA8OAAC6BgAgFwAAvQYAIMMDAADCBgAwxAMAACQAEMUDAADCBgAwxgMCAPgFACHIAwEA-QUAIdYDAgD4BQAh4gMCAPgFACHmA0AA-gUAIecDQAD6BQAh7gMBAIUGACHvAwEA-QUAIeYEAAAkACDnBAAAJAAgIA4AALoGACAPAAC_BgAgEAAAuwYAIBEAALwGACASAAC9BgAgEwAAvgYAIBQAALgGACAWAADABgAgwwMAALkGADDEAwAAKAAQxQMAALkGADDGAwIA-AUAIdYDAgD4BQAh1wMCAPgFACHYAwIAhgYAIdkDAQD5BQAh2gMBAPkFACHbAwEAhQYAIdwDQACDBgAh3QMBAPkFACHeA0AAgwYAId8DAgCGBgAh4AMCAPgFACHhAwAAsAYAIOIDAgD4BQAh4wMgAIcGACHkA0AAgwYAIeUDAQCFBgAh5gNAAPoFACHnA0AA-gUAIeYEAAAoACDnBAAAKAAgA54EAAAoACCfBAAAKAAgoAQAACgAIBQHAADJBgAgCAAAygYAIAsAAMsGACAMAADMBgAgGQAAzQYAIBoAAMYGACAbAAC9BgAgHAAAvQYAIB0AAL8GACDDAwAAyAYAMMQDAAAaABDFAwAAyAYAMMYDAgD4BQAhyAMBAPkFACHmA0AA-gUAIecDQAD6BQAh4AQBAPkFACHhBAEA-QUAIeYEAAAaACDnBAAAGgAgA54EAAAvACCfBAAALwAgoAQAAC8AIAOeBAAAMwAgnwQAADMAIKAEAAAzACACyAMBAAAAAdYDAgAAAAENDgAAugYAIBcAAL0GACDDAwAAwgYAMMQDAAAkABDFAwAAwgYAMMYDAgD4BQAhyAMBAPkFACHWAwIA-AUAIeIDAgD4BQAh5gNAAPoFACHnA0AA-gUAIe4DAQCFBgAh7wMBAPkFACEC1QMCAAAAAdYDAgAAAAEKAwAAuAYAIA4AALoGACDDAwAAxAYAMMQDAAAgABDFAwAAxAYAMMYDAgD4BQAh1QMCAPgFACHWAwIA-AUAIeYDQAD6BQAh8AMBAPkFACESDQAAuAYAIA8AAMYGACAXAAC9BgAgGAAAxwYAIMMDAADFBgAwxAMAABwAEMUDAADFBgAwxgMCAPgFACHIAwEA-QUAIeMDIACHBgAh5gNAAPoFACHnA0AA-gUAIfEDAgD4BQAh8gMgAIcGACHzAwAAsAYAIPQDAAD_BQAg9QMBAIUGACH2AwEA-QUAIQOeBAAAIAAgnwQAACAAIKAEAAAgACADngQAACQAIJ8EAAAkACCgBAAAJAAgEgcAAMkGACAIAADKBgAgCwAAywYAIAwAAMwGACAZAADNBgAgGgAAxgYAIBsAAL0GACAcAAC9BgAgHQAAvwYAIMMDAADIBgAwxAMAABoAEMUDAADIBgAwxgMCAPgFACHIAwEA-QUAIeYDQAD6BQAh5wNAAPoFACHgBAEA-QUAIeEEAQD5BQAhA54EAAADACCfBAAAAwAgoAQAAAMAIAOeBAAABwAgnwQAAAcAIKAEAAAHACADngQAAA0AIJ8EAAANACCgBAAADQAgA54EAAAWACCfBAAAFgAgoAQAABYAIAOeBAAAHAAgnwQAABwAIKAEAAAcACAMAwAAvgYAIAoAALAGACDDAwAAzgYAMMQDAAAWABDFAwAAzgYAMMYDAgD4BQAhyAMBAPkFACHVAwIAhgYAIeYDQAD6BQAh5wNAAPoFACH3AwEA-QUAIfgDIACHBgAhDQkAANAGACDDAwAAzwYAMMQDAAARABDFAwAAzwYAMMYDAgD4BQAh2QMBAPkFACHeA0AAgwYAIeIDAgD4BQAh5gNAAPoFACHnA0AA-gUAIfkDAgD4BQAh-gMBAPkFACH7AyAAhwYAIQ8DAAC4BgAgCgAA0gYAIMMDAADRBgAwxAMAAA0AEMUDAADRBgAwxgMCAPgFACHVAwIA-AUAIdkDAQD5BQAh4wMgAIcGACHmA0AA-gUAIecDQAD6BQAh9wMBAPkFACH6AwEA-QUAIeYEAAANACDnBAAADQAgDQMAALgGACAKAADSBgAgwwMAANEGADDEAwAADQAQxQMAANEGADDGAwIA-AUAIdUDAgD4BQAh2QMBAPkFACHjAyAAhwYAIeYDQAD6BQAh5wNAAPoFACH3AwEA-QUAIfoDAQD5BQAhA54EAAARACCfBAAAEQAgoAQAABEAIAP8AwIAAAAB_QMBAAAAAf4DAgAAAAENAwAAuAYAIAQAANUGACDDAwAA1AYAMMQDAAAHABDFAwAA1AYAMMYDAgD4BQAh1QMCAPgFACHmA0AA-gUAIfoDAQD5BQAh_AMCAPgFACH9AwEA-QUAIf4DAgD4BQAh_wMBAPkFACETAwAAuAYAIAUAAMoGACDDAwAA1gYAMMQDAAADABDFAwAA1gYAMMYDAgD4BQAhyAMBAPkFACHVAwIA-AUAIeIDAgD4BQAh4wMgAIcGACHmA0AA-gUAIecDQAD6BQAh9QMBAPkFACH6AwEA-QUAIYAEAQD5BQAhgQQCAPgFACGCBAEA-QUAIeYEAAADACDnBAAAAwAgEQMAALgGACAFAADKBgAgwwMAANYGADDEAwAAAwAQxQMAANYGADDGAwIA-AUAIcgDAQD5BQAh1QMCAPgFACHiAwIA-AUAIeMDIACHBgAh5gNAAPoFACHnA0AA-gUAIfUDAQD5BQAh-gMBAPkFACGABAEA-QUAIYEEAgD4BQAhggQBAPkFACEAAAAAAAHrBAEAAAABBesEAgAAAAHyBAIAAAAB8wQCAAAAAfQEAgAAAAH1BAIAAAABBSgAAPALACApAADzCwAg6AQAAPELACDpBAAA8gsAIO4EAAAqACADKAAA8AsAIOgEAADxCwAg7gQAACoAIAAAAAAABSgAAOgLACApAADuCwAg6AQAAOkLACDpBAAA7QsAIO4EAAAqACAFKAAA5gsAICkAAOsLACDoBAAA5wsAIOkEAADqCwAg7gQAAAEAIAMoAADoCwAg6AQAAOkLACDuBAAAKgAgAygAAOYLACDoBAAA5wsAIO4EAAABACAAAAAAAAAB6wQBAAAAAQHrBEAAAAABAesEIAAAAAEB6wRAAAAAAQXrBAIAAAAB8gQCAAAAAfMEAgAAAAH0BAIAAAAB9QQCAAAAAQUoAADSCwAgKQAA5AsAIOgEAADTCwAg6QQAAOMLACDuBAAAHgAgBSgAANALACApAADhCwAg6AQAANELACDpBAAA4AsAIO4EAAAmACAHKAAAygsAICkAAN4LACDoBAAAywsAIOkEAADdCwAg7AQAACgAIO0EAAAoACDuBAAAKgAgCygAAJQHADApAACZBwAw6AQAAJUHADDpBAAAlgcAMOoEAACXBwAg6wQAAJgHADDsBAAAmAcAMO0EAACYBwAw7gQAAJgHADDvBAAAmgcAMPAEAACbBwAwBygAAM4LACApAADbCwAg6AQAAM8LACDpBAAA2gsAIOwEAAAaACDtBAAAGgAg7gQAAAEAIAUoAADMCwAgKQAA2AsAIOgEAADNCwAg6QQAANcLACDuBAAAAQAgCygAAIgHADApAACNBwAw6AQAAIkHADDpBAAAigcAMOoEAACLBwAg6wQAAIwHADDsBAAAjAcAMO0EAACMBwAw7gQAAIwHADDvBAAAjgcAMPAEAACPBwAwCygAAPwGADApAACBBwAw6AQAAP0GADDpBAAA_gYAMOoEAAD_BgAg6wQAAIAHADDsBAAAgAcAMO0EAACABwAw7gQAAIAHADDvBAAAggcAMPAEAACDBwAwAsYDAgAAAAHIAwEAAAABAgAAADUAICgAAIcHACADAAAANQAgKAAAhwcAICkAAIYHACABIwAA1gsAMAcVAAC1BgAgwwMAALQGADDEAwAAMwAQxQMAALQGADDGAwIAAAABxwMCAPgFACHIAwEA-QUAIQIAAAA1ACAjAACGBwAgAgAAAIQHACAjAACFBwAgBsMDAACDBwAwxAMAAIQHABDFAwAAgwcAMMYDAgD4BQAhxwMCAPgFACHIAwEA-QUAIQbDAwAAgwcAMMQDAACEBwAQxQMAAIMHADDGAwIA-AUAIccDAgD4BQAhyAMBAPkFACECxgMCAN0GACHIAwEA3AYAIQLGAwIA3QYAIcgDAQDcBgAhAsYDAgAAAAHIAwEAAAABAwMAAOgGACDGAwIAAAAB1QMCAAAAAQIAAAAxACAoAACTBwAgAwAAADEAICgAAJMHACApAACSBwAgASMAANULADAJAwAAuAYAIBUAALUGACDDAwAAtwYAMMQDAAAvABDFAwAAtwYAMMYDAgAAAAHHAwIA-AUAIdUDAgD4BQAh4gQAALYGACACAAAAMQAgIwAAkgcAIAIAAACQBwAgIwAAkQcAIAbDAwAAjwcAMMQDAACQBwAQxQMAAI8HADDGAwIA-AUAIccDAgD4BQAh1QMCAPgFACEGwwMAAI8HADDEAwAAkAcAEMUDAACPBwAwxgMCAPgFACHHAwIA-AUAIdUDAgD4BQAhAsYDAgDdBgAh1QMCAN0GACEDAwAA5gYAIMYDAgDdBgAh1QMCAN0GACEDAwAA6AYAIMYDAgAAAAHVAwIAAAABGQ4AAKAHACAPAAClBwAgEAAAoQcAIBIAAKIHACATAACjBwAgFAAApAcAIBYAAKYHACDGAwIAAAAB1gMCAAAAAdcDAgAAAAHZAwEAAAAB2gMBAAAAAdsDAQAAAAHcA0AAAAAB3QMBAAAAAd4DQAAAAAHfAwIAAAAB4AMCAAAAAeEDgAAAAAHiAwIAAAAB4wMgAAAAAeQDQAAAAAHlAwEAAAAB5gNAAAAAAecDQAAAAAECAAAAKgAgKAAAnwcAIAMAAAAqACAoAACfBwAgKQAAngcAIAEjAADUCwAwHg4AALoGACAPAAC_BgAgEAAAuwYAIBEAALwGACASAAC9BgAgEwAAvgYAIBQAALgGACAWAADABgAgwwMAALkGADDEAwAAKAAQxQMAALkGADDGAwIAAAAB1gMCAPgFACHXAwIA-AUAIdgDAgCGBgAh2QMBAPkFACHaAwEA-QUAIdsDAQCFBgAh3ANAAIMGACHdAwEA-QUAId4DQACDBgAh3wMCAIYGACHgAwIA-AUAIeEDAACwBgAg4gMCAPgFACHjAyAAhwYAIeQDQACDBgAh5QMBAIUGACHmA0AA-gUAIecDQAD6BQAhAgAAACoAICMAAJ4HACACAAAAnAcAICMAAJ0HACAWwwMAAJsHADDEAwAAnAcAEMUDAACbBwAwxgMCAPgFACHWAwIA-AUAIdcDAgD4BQAh2AMCAIYGACHZAwEA-QUAIdoDAQD5BQAh2wMBAIUGACHcA0AAgwYAId0DAQD5BQAh3gNAAIMGACHfAwIAhgYAIeADAgD4BQAh4QMAALAGACDiAwIA-AUAIeMDIACHBgAh5ANAAIMGACHlAwEAhQYAIeYDQAD6BQAh5wNAAPoFACEWwwMAAJsHADDEAwAAnAcAEMUDAACbBwAwxgMCAPgFACHWAwIA-AUAIdcDAgD4BQAh2AMCAIYGACHZAwEA-QUAIdoDAQD5BQAh2wMBAIUGACHcA0AAgwYAId0DAQD5BQAh3gNAAIMGACHfAwIAhgYAIeADAgD4BQAh4QMAALAGACDiAwIA-AUAIeMDIACHBgAh5ANAAIMGACHlAwEAhQYAIeYDQAD6BQAh5wNAAPoFACESxgMCAN0GACHWAwIA3QYAIdcDAgDdBgAh2QMBANwGACHaAwEA3AYAIdsDAQDvBgAh3ANAAPAGACHdAwEA3AYAId4DQADwBgAh3wMCAPMGACHgAwIA3QYAIeEDgAAAAAHiAwIA3QYAIeMDIADxBgAh5ANAAPAGACHlAwEA7wYAIeYDQADyBgAh5wNAAPIGACEZDgAA9AYAIA8AAPoGACAQAAD1BgAgEgAA9wYAIBMAAPgGACAUAAD5BgAgFgAA-wYAIMYDAgDdBgAh1gMCAN0GACHXAwIA3QYAIdkDAQDcBgAh2gMBANwGACHbAwEA7wYAIdwDQADwBgAh3QMBANwGACHeA0AA8AYAId8DAgDzBgAh4AMCAN0GACHhA4AAAAAB4gMCAN0GACHjAyAA8QYAIeQDQADwBgAh5QMBAO8GACHmA0AA8gYAIecDQADyBgAhGQ4AAKAHACAPAAClBwAgEAAAoQcAIBIAAKIHACATAACjBwAgFAAApAcAIBYAAKYHACDGAwIAAAAB1gMCAAAAAdcDAgAAAAHZAwEAAAAB2gMBAAAAAdsDAQAAAAHcA0AAAAAB3QMBAAAAAd4DQAAAAAHfAwIAAAAB4AMCAAAAAeEDgAAAAAHiAwIAAAAB4wMgAAAAAeQDQAAAAAHlAwEAAAAB5gNAAAAAAecDQAAAAAEDKAAA0gsAIOgEAADTCwAg7gQAAB4AIAMoAADQCwAg6AQAANELACDuBAAAJgAgBCgAAJQHADDoBAAAlQcAMOoEAACXBwAg7gQAAJgHADADKAAAzgsAIOgEAADPCwAg7gQAAAEAIAMoAADMCwAg6AQAAM0LACDuBAAAAQAgBCgAAIgHADDoBAAAiQcAMOoEAACLBwAg7gQAAIwHADAEKAAA_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-AUAIeIDAgD4BQAh5gNAAPoFACHnA0AA-gUAIe4DAQCFBgAh7wMBAPkFACHjBAAAwQYAIAIAAAAmACAjAADfBwAgAgAAAN0HACAjAADeBwAgC8MDAADcBwAwxAMAAN0HABDFAwAA3AcAMMYDAgD4BQAhyAMBAPkFACHWAwIA-AUAIeIDAgD4BQAh5gNAAPoFACHnA0AA-gUAIe4DAQCFBgAh7wMBAPkFACELwwMAANwHADDEAwAA3QcAEMUDAADcBwAwxgMCAPgFACHIAwEA-QUAIdYDAgD4BQAh4gMCAPgFACHmA0AA-gUAIecDQAD6BQAh7gMBAIUGACHvAwEA-QUAIQfGAwIA3QYAIcgDAQDcBgAh4gMCAN0GACHmA0AA8gYAIecDQADyBgAh7gMBAO8GACHvAwEA3AYAIQgXAACuBwAgxgMCAN0GACHIAwEA3AYAIeIDAgDdBgAh5gNAAPIGACHnA0AA8gYAIe4DAQDvBgAh7wMBANwGACEIFwAAuQcAIMYDAgAAAAHIAwEAAAAB4gMCAAAAAeYDQAAAAAHnA0AAAAAB7gMBAAAAAe8DAQAAAAEFAwAAwgcAIMYDAgAAAAHVAwIAAAAB5gNAAAAAAfADAQAAAAECAAAAIgAgKAAA7AcAIAMAAAAiACAoAADsBwAgKQAA6wcAIAEjAAC0CwAwCwMAALgGACAOAAC6BgAgwwMAAMQGADDEAwAAIAAQxQMAAMQGADDGAwIAAAAB1QMCAPgFACHWAwIA-AUAIeYDQAD6BQAh8AMBAPkFACHkBAAAwwYAIAIAAAAiACAjAADrBwAgAgAAAOkHACAjAADqBwAgCMMDAADoBwAwxAMAAOkHABDFAwAA6AcAMMYDAgD4BQAh1QMCAPgFACHWAwIA-AUAIeYDQAD6BQAh8AMBAPkFACEIwwMAAOgHADDEAwAA6QcAEMUDAADoBwAwxgMCAPgFACHVAwIA-AUAIdYDAgD4BQAh5gNAAPoFACHwAwEA-QUAIQTGAwIA3QYAIdUDAgDdBgAh5gNAAPIGACHwAwEA3AYAIQUDAADABwAgxgMCAN0GACHVAwIA3QYAIeYDQADyBgAh8AMBANwGACEFAwAAwgcAIMYDAgAAAAHVAwIAAAAB5gNAAAAAAfADAQAAAAEDKAAAsgsAIOgEAACzCwAg7gQAAAEAIAQoAADhBwAw6AQAAOIHADDqBAAA5AcAIO4EAADlBwAwBCgAANUHADDoBAAA1gcAMOoEAADYBwAg7gQAANkHADAEKAAAzAcAMOgEAADNBwAw6gQAAM8HACDuBAAAmAcAMAAAAAAABygAAK0LACApAACwCwAg6AQAAK4LACDpBAAArwsAIOwEAAAaACDtBAAAGgAg7gQAAAEAIAMoAACtCwAg6AQAAK4LACDuBAAAAQAgAAAAAAAFKAAAqAsAICkAAKsLACDoBAAAqQsAIOkEAACqCwAg7gQAAA8AIAMoAACoCwAg6AQAAKkLACDuBAAADwAgAAAAAAAFKAAAogsAICkAAKYLACDoBAAAowsAIOkEAAClCwAg7gQAAAEAIAsoAACGCAAwKQAAiwgAMOgEAACHCAAw6QQAAIgIADDqBAAAiQgAIOsEAACKCAAw7AQAAIoIADDtBAAAiggAMO4EAACKCAAw7wQAAIwIADDwBAAAjQgAMAjGAwIAAAAB2QMBAAAAAd4DQAAAAAHiAwIAAAAB5gNAAAAAAecDQAAAAAH6AwEAAAAB-wMgAAAAAQIAAAATACAoAACRCAAgAwAAABMAICgAAJEIACApAACQCAAgASMAAKQLADANCQAA0AYAIMMDAADPBgAwxAMAABEAEMUDAADPBgAwxgMCAAAAAdkDAQD5BQAh3gNAAIMGACHiAwIA-AUAIeYDQAD6BQAh5wNAAPoFACH5AwIA-AUAIfoDAQD5BQAh-wMgAIcGACECAAAAEwAgIwAAkAgAIAIAAACOCAAgIwAAjwgAIAzDAwAAjQgAMMQDAACOCAAQxQMAAI0IADDGAwIA-AUAIdkDAQD5BQAh3gNAAIMGACHiAwIA-AUAIeYDQAD6BQAh5wNAAPoFACH5AwIA-AUAIfoDAQD5BQAh-wMgAIcGACEMwwMAAI0IADDEAwAAjggAEMUDAACNCAAwxgMCAPgFACHZAwEA-QUAId4DQACDBgAh4gMCAPgFACHmA0AA-gUAIecDQAD6BQAh-QMCAPgFACH6AwEA-QUAIfsDIACHBgAhCMYDAgDdBgAh2QMBANwGACHeA0AA8AYAIeIDAgDdBgAh5gNAAPIGACHnA0AA8gYAIfoDAQDcBgAh-wMgAPEGACEIxgMCAN0GACHZAwEA3AYAId4DQADwBgAh4gMCAN0GACHmA0AA8gYAIecDQADyBgAh-gMBANwGACH7AyAA8QYAIQjGAwIAAAAB2QMBAAAAAd4DQAAAAAHiAwIAAAAB5gNAAAAAAecDQAAAAAH6AwEAAAAB-wMgAAAAAQMoAACiCwAg6AQAAKMLACDuBAAAAQAgBCgAAIYIADDoBAAAhwgAMOoEAACJCAAg7gQAAIoIADAAAAAAAAUoAACaCwAgKQAAoAsAIOgEAACbCwAg6QQAAJ8LACDuBAAABQAgBSgAAJgLACApAACdCwAg6AQAAJkLACDpBAAAnAsAIO4EAAABACADKAAAmgsAIOgEAACbCwAg7gQAAAUAIAMoAACYCwAg6AQAAJkLACDuBAAAAQAgAAAAAAAFKAAAkgsAICkAAJYLACDoBAAAkwsAIOkEAACVCwAg7gQAAAEAIAsoAACkCAAwKQAAqQgAMOgEAAClCAAw6QQAAKYIADDqBAAApwgAIOsEAACoCAAw7AQAAKgIADDtBAAAqAgAMO4EAACoCAAw7wQAAKoIADDwBAAAqwgAMAgDAACcCAAgxgMCAAAAAdUDAgAAAAHmA0AAAAAB-gMBAAAAAf0DAQAAAAH-AwIAAAAB_wMBAAAAAQIAAAAJACAoAACvCAAgAwAAAAkAICgAAK8IACApAACuCAAgASMAAJQLADAOAwAAuAYAIAQAANUGACDDAwAA1AYAMMQDAAAHABDFAwAA1AYAMMYDAgAAAAHVAwIA-AUAIeYDQAD6BQAh-gMBAPkFACH8AwIA-AUAIf0DAQD5BQAh_gMCAPgFACH_AwEA-QUAIeUEAADTBgAgAgAAAAkAICMAAK4IACACAAAArAgAICMAAK0IACALwwMAAKsIADDEAwAArAgAEMUDAACrCAAwxgMCAPgFACHVAwIA-AUAIeYDQAD6BQAh-gMBAPkFACH8AwIA-AUAIf0DAQD5BQAh_gMCAPgFACH_AwEA-QUAIQvDAwAAqwgAMMQDAACsCAAQxQMAAKsIADDGAwIA-AUAIdUDAgD4BQAh5gNAAPoFACH6AwEA-QUAIfwDAgD4BQAh_QMBAPkFACH-AwIA-AUAIf8DAQD5BQAhB8YDAgDdBgAh1QMCAN0GACHmA0AA8gYAIfoDAQDcBgAh_QMBANwGACH-AwIA3QYAIf8DAQDcBgAhCAMAAJoIACDGAwIA3QYAIdUDAgDdBgAh5gNAAPIGACH6AwEA3AYAIf0DAQDcBgAh_gMCAN0GACH_AwEA3AYAIQgDAACcCAAgxgMCAAAAAdUDAgAAAAHmA0AAAAAB-gMBAAAAAf0DAQAAAAH-AwIAAAAB_wMBAAAAAQMoAACSCwAg6AQAAJMLACDuBAAAAQAgBCgAAKQIADDoBAAApQgAMOoEAACnCAAg7gQAAKgIADAAAAAAAAXrBAgAAAAB8gQIAAAAAfMECAAAAAH0BAgAAAAB9QQIAAAAAQUoAACNCwAgKQAAkAsAIOgEAACOCwAg6QQAAI8LACDuBAAAkQMAIAMoAACNCwAg6AQAAI4LACDuBAAAkQMAIAAAAAAABSgAAIgLACApAACLCwAg6AQAAIkLACDpBAAAigsAIO4EAACRAwAgAygAAIgLACDoBAAAiQsAIO4EAACRAwAgAAAAAAAFKAAAgQsAICkAAIYLACDoBAAAggsAIOkEAACFCwAg7gQAAI0DACALKAAA1QgAMCkAANoIADDoBAAA1ggAMOkEAADXCAAw6gQAANgIACDrBAAA2QgAMOwEAADZCAAw7QQAANkIADDuBAAA2QgAMO8EAADbCAAw8AQAANwIADALKAAAyQgAMCkAAM4IADDoBAAAyggAMOkEAADLCAAw6gQAAMwIACDrBAAAzQgAMOwEAADNCAAw7QQAAM0IADDuBAAAzQgAMO8EAADPCAAw8AQAANAIADAGxgMCAAAAAeYDQAAAAAGEBEAAAAABhQQIAAAAAYYECAAAAAGHBIAAAAABAgAAAJkDACAoAADUCAAgAwAAAJkDACAoAADUCAAgKQAA0wgAIAEjAACECwAwDO0BAACABgAgwwMAAP0FADDEAwAAlwMAEMUDAAD9BQAwxgMCAAAAAeYDQAD6BQAhgwQCAPgFACGEBEAA-gUAIYUECAD-BQAhhgQIAP4FACGHBAAA_wUAIKEEAAD8BQAgAgAAAJkDACAjAADTCAAgAgAAANEIACAjAADSCAAgCsMDAADQCAAwxAMAANEIABDFAwAA0AgAMMYDAgD4BQAh5gNAAPoFACGDBAIA-AUAIYQEQAD6BQAhhQQIAP4FACGGBAgA_gUAIYcEAAD_BQAgCsMDAADQCAAwxAMAANEIABDFAwAA0AgAMMYDAgD4BQAh5gNAAPoFACGDBAIA-AUAIYQEQAD6BQAhhQQIAP4FACGGBAgA_gUAIYcEAAD_BQAgBsYDAgDdBgAh5gNAAPIGACGEBEAA8gYAIYUECAC3CAAhhgQIALcIACGHBIAAAAABBsYDAgDdBgAh5gNAAPIGACGEBEAA8gYAIYUECAC3CAAhhgQIALcIACGHBIAAAAABBsYDAgAAAAHmA0AAAAABhARAAAAAAYUECAAAAAGGBAgAAAABhwSAAAAAAQ7GAwIAAAAB5gNAAAAAAf0DQAAAAAGFBAgAAAABhgQIAAAAAYcEgAAAAAGIBAgAAAABiQQIAAAAAYoECAAAAAGLBAgAAAABjAQIAAAAAY0ECAAAAAGOBAEAAAABjwRAAAAAAQIAAACVAwAgKAAA4AgAIAMAAACVAwAgKAAA4AgAICkAAN8IACABIwAAgwsAMBTtAQAAgAYAIMMDAACCBgAwxAMAAJMDABDFAwAAggYAMMYDAgAAAAHmA0AA-gUAIf0DQAD6BQAhgwQCAPgFACGFBAgA_gUAIYYECAD-BQAhhwQAAP8FACCIBAgA_gUAIYkECAD-BQAhigQIAP4FACGLBAgA_gUAIYwECAD-BQAhjQQIAP4FACGOBAEA-QUAIY8EQACDBgAhogQAAIEGACACAAAAlQMAICMAAN8IACACAAAA3QgAICMAAN4IACASwwMAANwIADDEAwAA3QgAEMUDAADcCAAwxgMCAPgFACHmA0AA-gUAIf0DQAD6BQAhgwQCAPgFACGFBAgA_gUAIYYECAD-BQAhhwQAAP8FACCIBAgA_gUAIYkECAD-BQAhigQIAP4FACGLBAgA_gUAIYwECAD-BQAhjQQIAP4FACGOBAEA-QUAIY8EQACDBgAhEsMDAADcCAAwxAMAAN0IABDFAwAA3AgAMMYDAgD4BQAh5gNAAPoFACH9A0AA-gUAIYMEAgD4BQAhhQQIAP4FACGGBAgA_gUAIYcEAAD_BQAgiAQIAP4FACGJBAgA_gUAIYoECAD-BQAhiwQIAP4FACGMBAgA_gUAIY0ECAD-BQAhjgQBAPkFACGPBEAAgwYAIQ7GAwIA3QYAIeYDQADyBgAh_QNAAPIGACGFBAgAtwgAIYYECAC3CAAhhwSAAAAAAYgECAC3CAAhiQQIALcIACGKBAgAtwgAIYsECAC3CAAhjAQIALcIACGNBAgAtwgAIY4EAQDcBgAhjwRAAPAGACEOxgMCAN0GACHmA0AA8gYAIf0DQADyBgAhhQQIALcIACGGBAgAtwgAIYcEgAAAAAGIBAgAtwgAIYkECAC3CAAhigQIALcIACGLBAgAtwgAIYwECAC3CAAhjQQIALcIACGOBAEA3AYAIY8EQADwBgAhDsYDAgAAAAHmA0AAAAAB_QNAAAAAAYUECAAAAAGGBAgAAAABhwSAAAAAAYgECAAAAAGJBAgAAAABigQIAAAAAYsECAAAAAGMBAgAAAABjQQIAAAAAY4EAQAAAAGPBEAAAAABAygAAIELACDoBAAAggsAIO4EAACNAwAgBCgAANUIADDoBAAA1ggAMOoEAADYCAAg7gQAANkIADAEKAAAyQgAMOgEAADKCAAw6gQAAMwIACDuBAAAzQgAMAAAAAAACygAAOoIADApAADvCAAw6AQAAOsIADDpBAAA7AgAMOoEAADtCAAg6wQAAO4IADDsBAAA7ggAMO0EAADuCAAw7gQAAO4IADDvBAAA8AgAMPAEAADxCAAwEu4BAADiCAAg7wEAAOMIACDGAwIAAAAByAMBAAAAAeYDQAAAAAGQBAEAAAABkgQBAAAAAZMEAQAAAAGUBAIAAAABlQQCAAAAAZYEAgAAAAGXBAIAAAABmAQCAAAAAZkEAgAAAAGaBAIAAAABmwRAAAAAAZwEIAAAAAGdBEAAAAABAgAAAJEDACAoAAD1CAAgAwAAAJEDACAoAAD1CAAgKQAA9AgAIAEjAACACwAwF-wBAACIBgAg7gEAAIkGACDvAQAAigYAIMMDAACEBgAwxAMAAI8DABDFAwAAhAYAMMYDAgAAAAHIAwEA-QUAIeYDQAD6BQAhkAQBAAAAAZEEAQD5BQAhkgQBAPkFACGTBAEAhQYAIZQEAgD4BQAhlQQCAPgFACGWBAIA-AUAIZcEAgD4BQAhmAQCAPgFACGZBAIA-AUAIZoEAgCGBgAhmwRAAIMGACGcBCAAhwYAIZ0EQACDBgAhAgAAAJEDACAjAAD0CAAgAgAAAPIIACAjAADzCAAgFMMDAADxCAAwxAMAAPIIABDFAwAA8QgAMMYDAgD4BQAhyAMBAPkFACHmA0AA-gUAIZAEAQD5BQAhkQQBAPkFACGSBAEA-QUAIZMEAQCFBgAhlAQCAPgFACGVBAIA-AUAIZYEAgD4BQAhlwQCAPgFACGYBAIA-AUAIZkEAgD4BQAhmgQCAIYGACGbBEAAgwYAIZwEIACHBgAhnQRAAIMGACEUwwMAAPEIADDEAwAA8ggAEMUDAADxCAAwxgMCAPgFACHIAwEA-QUAIeYDQAD6BQAhkAQBAPkFACGRBAEA-QUAIZIEAQD5BQAhkwQBAIUGACGUBAIA-AUAIZUEAgD4BQAhlgQCAPgFACGXBAIA-AUAIZgEAgD4BQAhmQQCAPgFACGaBAIAhgYAIZsEQACDBgAhnAQgAIcGACGdBEAAgwYAIRDGAwIA3QYAIcgDAQDcBgAh5gNAAPIGACGQBAEA3AYAIZIEAQDcBgAhkwQBAO8GACGUBAIA3QYAIZUEAgDdBgAhlgQCAN0GACGXBAIA3QYAIZgEAgDdBgAhmQQCAN0GACGaBAIA8wYAIZsEQADwBgAhnAQgAPEGACGdBEAA8AYAIRLuAQAAxwgAIO8BAADICAAgxgMCAN0GACHIAwEA3AYAIeYDQADyBgAhkAQBANwGACGSBAEA3AYAIZMEAQDvBgAhlAQCAN0GACGVBAIA3QYAIZYEAgDdBgAhlwQCAN0GACGYBAIA3QYAIZkEAgDdBgAhmgQCAPMGACGbBEAA8AYAIZwEIADxBgAhnQRAAPAGACES7gEAAOIIACDvAQAA4wgAIMYDAgAAAAHIAwEAAAAB5gNAAAAAAZAEAQAAAAGSBAEAAAABkwQBAAAAAZQEAgAAAAGVBAIAAAABlgQCAAAAAZcEAgAAAAGYBAIAAAABmQQCAAAAAZoEAgAAAAGbBEAAAAABnAQgAAAAAZ0EQAAAAAEEKAAA6ggAMOgEAADrCAAw6gQAAO0IACDuBAAA7ggAMAAB0wMBAAAAAQjsAQAA-wgAIO4BAAD8CAAg7wEAAP0IACCTBAAA6QYAIJoEAADpBgAgmwQAAOkGACCdBAAA6QYAIPEEAAD-CAAgAdMDAQAAAAEC8AEAAPcIACDxBAAA-AgAIAAAAdMDAQAAAAEAAAAAAAHTAwEAAAABAAAAAAAF6wQIAAAAAfIECAAAAAHzBAgAAAAB9AQIAAAAAfUECAAAAAEB0wMBAAAAAQAAAAAAAdMDAQAAAAEAAAAAAAHTAwEAAAABAAAAAAAB0wMBAAAAAQAAAAAABesEBAAAAAHyBAQAAAAB8wQEAAAAAfQEBAAAAAH1BAQAAAABAdMDAQAAAAEAAAAAAAHTAwEAAAABAAAAAAAB0wMBAAAAAQAAAAAAAdMDAQAAAAEAAAAAAAUoAAD7CgAgKQAA_goAIOgEAAD8CgAg6QQAAP0KACDuBAAAjgEAIAMoAAD7CgAg6AQAAPwKACDuBAAAjgEAIAAAAAAACygAAMQJADApAADJCQAw6AQAAMUJADDpBAAAxgkAMOoEAADHCQAg6wQAAMgJADDsBAAAyAkAMO0EAADICQAw7gQAAMgJADDvBAAAygkAMPAEAADLCQAwBcYDAgAAAAHmA0AAAAAB5wNAAAAAAYAEAQAAAAHZBAgAAAABAgAAAJIBACAoAADPCQAgAwAAAJIBACAoAADPCQAgKQAAzgkAIAEjAAD6CgAwC1AAAK0GACDDAwAArAYAMMQDAACQAQAQxQMAAKwGADDGAwIAAAAB5gNAAPoFACHnA0AA-gUAIYAEAQD5BQAh2AQCAPgFACHZBAgAkQYAId4EAACrBgAgAgAAAJIBACAjAADOCQAgAgAAAMwJACAjAADNCQAgCcMDAADLCQAwxAMAAMwJABDFAwAAywkAMMYDAgD4BQAh5gNAAPoFACHnA0AA-gUAIYAEAQD5BQAh2AQCAPgFACHZBAgAkQYAIQnDAwAAywkAMMQDAADMCQAQxQMAAMsJADDGAwIA-AUAIeYDQAD6BQAh5wNAAPoFACGABAEA-QUAIdgEAgD4BQAh2QQIAJEGACEFxgMCAN0GACHmA0AA8gYAIecDQADyBgAhgAQBANwGACHZBAgAigkAIQXGAwIA3QYAIeYDQADyBgAh5wNAAPIGACGABAEA3AYAIdkECACKCQAhBcYDAgAAAAHmA0AAAAAB5wNAAAAAAYAEAQAAAAHZBAgAAAABBCgAAMQJADDoBAAAxQkAMOoEAADHCQAg7gQAAMgJADAAAdMDAQAAAAECUQAA0QkAIPEEAADSCQAgAdMDAQAAAAEAAAAAAAHTAwEAAAABAAAAAAAB0wMBAAAAAQAAAAAACygAAMAKADApAADFCgAw6AQAAMEKADDpBAAAwgoAMOoEAADDCgAg6wQAAMQKADDsBAAAxAoAMO0EAADECgAw7gQAAMQKADDvBAAAxgoAMPAEAADHCgAwCygAALcKADApAAC7CgAw6AQAALgKADDpBAAAuQoAMOoEAAC6CgAg6wQAAKgIADDsBAAAqAgAMO0EAACoCAAw7gQAAKgIADDvBAAAvAoAMPAEAACrCAAwCygAAKsKADApAACwCgAw6AQAAKwKADDpBAAArQoAMOoEAACuCgAg6wQAAK8KADDsBAAArwoAMO0EAACvCgAw7gQAAK8KADDvBAAAsQoAMPAEAACyCgAwCygAAJ8KADApAACkCgAw6AQAAKAKADDpBAAAoQoAMOoEAACiCgAg6wQAAKMKADDsBAAAowoAMO0EAACjCgAw7gQAAKMKADDvBAAApQoAMPAEAACmCgAwCygAAJMKADApAACYCgAw6AQAAJQKADDpBAAAlQoAMOoEAACWCgAg6wQAAJcKADDsBAAAlwoAMO0EAACXCgAw7gQAAJcKADDvBAAAmQoAMPAEAACaCgAwCygAAIoKADApAACOCgAw6AQAAIsKADDpBAAAjAoAMOoEAACNCgAg6wQAAOUHADDsBAAA5QcAMO0EAADlBwAw7gQAAOUHADDvBAAAjwoAMPAEAADoBwAwCygAAIEKADApAACFCgAw6AQAAIIKADDpBAAAgwoAMOoEAACECgAg6wQAAJgHADDsBAAAmAcAMO0EAACYBwAw7gQAAJgHADDvBAAAhgoAMPAEAACbBwAwCygAAPgJADApAAD8CQAw6AQAAPkJADDpBAAA-gkAMOoEAAD7CQAg6wQAAJgHADDsBAAAmAcAMO0EAACYBwAw7gQAAJgHADDvBAAA_QkAMPAEAACbBwAwCygAAO8JADApAADzCQAw6AQAAPAJADDpBAAA8QkAMOoEAADyCQAg6wQAAIwHADDsBAAAjAcAMO0EAACMBwAw7gQAAIwHADDvBAAA9AkAMPAEAACPBwAwAxUAAOcGACDGAwIAAAABxwMCAAAAAQIAAAAxACAoAAD3CQAgAwAAADEAICgAAPcJACApAAD2CQAgASMAAPkKADACAAAAMQAgIwAA9gkAIAIAAACQBwAgIwAA9QkAIALGAwIA3QYAIccDAgDdBgAhAxUAAOUGACDGAwIA3QYAIccDAgDdBgAhAxUAAOcGACDGAwIAAAABxwMCAAAAARkOAACgBwAgDwAApQcAIBAAAKEHACARAACnBwAgEgAAogcAIBMAAKMHACAWAACmBwAgxgMCAAAAAdYDAgAAAAHXAwIAAAAB2AMCAAAAAdkDAQAAAAHaAwEAAAAB2wMBAAAAAdwDQAAAAAHdAwEAAAAB3gNAAAAAAd8DAgAAAAHhA4AAAAAB4gMCAAAAAeMDIAAAAAHkA0AAAAAB5QMBAAAAAeYDQAAAAAHnA0AAAAABAgAAACoAICgAAIAKACADAAAAKgAgKAAAgAoAICkAAP8JACABIwAA-AoAMAIAAAAqACAjAAD_CQAgAgAAAJwHACAjAAD-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-QUAIeMDIACHBgAh5gNAAPoFACHnA0AA-gUAIfEDAgD4BQAh8gMgAIcGACHzAwAAsAYAIPQDAAD_BQAg9QMBAIUGACH2AwEA-QUAIQIAAAAeACAjAACdCgAgAgAAAJsKACAjAACcCgAgDsMDAACaCgAwxAMAAJsKABDFAwAAmgoAMMYDAgD4BQAhyAMBAPkFACHjAyAAhwYAIeYDQAD6BQAh5wNAAPoFACHxAwIA-AUAIfIDIACHBgAh8wMAALAGACD0AwAA_wUAIPUDAQCFBgAh9gMBAPkFACEOwwMAAJoKADDEAwAAmwoAEMUDAACaCgAwxgMCAPgFACHIAwEA-QUAIeMDIACHBgAh5gNAAPoFACHnA0AA-gUAIfEDAgD4BQAh8gMgAIcGACHzAwAAsAYAIPQDAAD_BQAg9QMBAIUGACH2AwEA-QUAIQrGAwIA3QYAIcgDAQDcBgAh4wMgAPEGACHmA0AA8gYAIecDQADyBgAh8gMgAPEGACHzA4AAAAAB9AOAAAAAAfUDAQDvBgAh9gMBANwGACENDwAAyQcAIBcAAMsHACAYAADKBwAgxgMCAN0GACHIAwEA3AYAIeMDIADxBgAh5gNAAPIGACHnA0AA8gYAIfIDIADxBgAh8wOAAAAAAfQDgAAAAAH1AwEA7wYAIfYDAQDcBgAhDQ8AAO4HACAXAADwBwAgGAAA7wcAIMYDAgAAAAHIAwEAAAAB4wMgAAAAAeYDQAAAAAHnA0AAAAAB8gMgAAAAAfMDgAAAAAH0A4AAAAAB9QMBAAAAAfYDAQAAAAEHCoAAAAABxgMCAAAAAcgDAQAAAAHmA0AAAAAB5wNAAAAAAfcDAQAAAAH4AyAAAAABAgAAABgAICgAAKoKACADAAAAGAAgKAAAqgoAICkAAKkKACABIwAA9AoAMAwDAAC-BgAgCgAAsAYAIMMDAADOBgAwxAMAABYAEMUDAADOBgAwxgMCAAAAAcgDAQD5BQAh1QMCAIYGACHmA0AA-gUAIecDQAD6BQAh9wMBAPkFACH4AyAAhwYAIQIAAAAYACAjAACpCgAgAgAAAKcKACAjAACoCgAgCwoAALAGACDDAwAApgoAMMQDAACnCgAQxQMAAKYKADDGAwIA-AUAIcgDAQD5BQAh1QMCAIYGACHmA0AA-gUAIecDQAD6BQAh9wMBAPkFACH4AyAAhwYAIQsKAACwBgAgwwMAAKYKADDEAwAApwoAEMUDAACmCgAwxgMCAPgFACHIAwEA-QUAIdUDAgCGBgAh5gNAAPoFACHnA0AA-gUAIfcDAQD5BQAh-AMgAIcGACEHCoAAAAABxgMCAN0GACHIAwEA3AYAIeYDQADyBgAh5wNAAPIGACH3AwEA3AYAIfgDIADxBgAhBwqAAAAAAcYDAgDdBgAhyAMBANwGACHmA0AA8gYAIecDQADyBgAh9wMBANwGACH4AyAA8QYAIQcKgAAAAAHGAwIAAAAByAMBAAAAAeYDQAAAAAHnA0AAAAAB9wMBAAAAAfgDIAAAAAEICgAAkwgAIMYDAgAAAAHZAwEAAAAB4wMgAAAAAeYDQAAAAAHnA0AAAAAB9wMBAAAAAfoDAQAAAAECAAAADwAgKAAAtgoAIAMAAAAPACAoAAC2CgAgKQAAtQoAIAEjAADzCgAwDQMAALgGACAKAADSBgAgwwMAANEGADDEAwAADQAQxQMAANEGADDGAwIAAAAB1QMCAPgFACHZAwEA-QUAIeMDIACHBgAh5gNAAPoFACHnA0AA-gUAIfcDAQD5BQAh-gMBAPkFACECAAAADwAgIwAAtQoAIAIAAACzCgAgIwAAtAoAIAvDAwAAsgoAMMQDAACzCgAQxQMAALIKADDGAwIA-AUAIdUDAgD4BQAh2QMBAPkFACHjAyAAhwYAIeYDQAD6BQAh5wNAAPoFACH3AwEA-QUAIfoDAQD5BQAhC8MDAACyCgAwxAMAALMKABDFAwAAsgoAMMYDAgD4BQAh1QMCAPgFACHZAwEA-QUAIeMDIACHBgAh5gNAAPoFACHnA0AA-gUAIfcDAQD5BQAh-gMBAPkFACEHxgMCAN0GACHZAwEA3AYAIeMDIADxBgAh5gNAAPIGACHnA0AA8gYAIfcDAQDcBgAh-gMBANwGACEICgAAhQgAIMYDAgDdBgAh2QMBANwGACHjAyAA8QYAIeYDQADyBgAh5wNAAPIGACH3AwEA3AYAIfoDAQDcBgAhCAoAAJMIACDGAwIAAAAB2QMBAAAAAeMDIAAAAAHmA0AAAAAB5wNAAAAAAfcDAQAAAAH6AwEAAAABCAQAAJsIACDGAwIAAAAB5gNAAAAAAfoDAQAAAAH8AwIAAAAB_QMBAAAAAf4DAgAAAAH_AwEAAAABAgAAAAkAICgAAL8KACADAAAACQAgKAAAvwoAICkAAL4KACABIwAA8goAMAIAAAAJACAjAAC-CgAgAgAAAKwIACAjAAC9CgAgB8YDAgDdBgAh5gNAAPIGACH6AwEA3AYAIfwDAgDdBgAh_QMBANwGACH-AwIA3QYAIf8DAQDcBgAhCAQAAJkIACDGAwIA3QYAIeYDQADyBgAh-gMBANwGACH8AwIA3QYAIf0DAQDcBgAh_gMCAN0GACH_AwEA3AYAIQgEAACbCAAgxgMCAAAAAeYDQAAAAAH6AwEAAAAB_AMCAAAAAf0DAQAAAAH-AwIAAAAB_wMBAAAAAQwFAACxCAAgxgMCAAAAAcgDAQAAAAHiAwIAAAAB4wMgAAAAAeYDQAAAAAHnA0AAAAAB9QMBAAAAAfoDAQAAAAGABAEAAAABgQQCAAAAAYIEAQAAAAECAAAABQAgKAAAywoAIAMAAAAFACAoAADLCgAgKQAAygoAIAEjAADxCgAwEQMAALgGACAFAADKBgAgwwMAANYGADDEAwAAAwAQxQMAANYGADDGAwIAAAAByAMBAPkFACHVAwIA-AUAIeIDAgD4BQAh4wMgAIcGACHmA0AA-gUAIecDQAD6BQAh9QMBAPkFACH6AwEA-QUAIYAEAQD5BQAhgQQCAPgFACGCBAEA-QUAIQIAAAAFACAjAADKCgAgAgAAAMgKACAjAADJCgAgD8MDAADHCgAwxAMAAMgKABDFAwAAxwoAMMYDAgD4BQAhyAMBAPkFACHVAwIA-AUAIeIDAgD4BQAh4wMgAIcGACHmA0AA-gUAIecDQAD6BQAh9QMBAPkFACH6AwEA-QUAIYAEAQD5BQAhgQQCAPgFACGCBAEA-QUAIQ_DAwAAxwoAMMQDAADICgAQxQMAAMcKADDGAwIA-AUAIcgDAQD5BQAh1QMCAPgFACHiAwIA-AUAIeMDIACHBgAh5gNAAPoFACHnA0AA-gUAIfUDAQD5BQAh-gMBAPkFACGABAEA-QUAIYEEAgD4BQAhggQBAPkFACELxgMCAN0GACHIAwEA3AYAIeIDAgDdBgAh4wMgAPEGACHmA0AA8gYAIecDQADyBgAh9QMBANwGACH6AwEA3AYAIYAEAQDcBgAhgQQCAN0GACGCBAEA3AYAIQwFAACjCAAgxgMCAN0GACHIAwEA3AYAIeIDAgDdBgAh4wMgAPEGACHmA0AA8gYAIecDQADyBgAh9QMBANwGACH6AwEA3AYAIYAEAQDcBgAhgQQCAN0GACGCBAEA3AYAIQwFAACxCAAgxgMCAAAAAcgDAQAAAAHiAwIAAAAB4wMgAAAAAeYDQAAAAAHnA0AAAAAB9QMBAAAAAfoDAQAAAAGABAEAAAABgQQCAAAAAYIEAQAAAAEEKAAAwAoAMOgEAADBCgAw6gQAAMMKACDuBAAAxAoAMAQoAAC3CgAw6AQAALgKADDqBAAAugoAIO4EAACoCAAwBCgAAKsKADDoBAAArAoAMOoEAACuCgAg7gQAAK8KADAEKAAAnwoAMOgEAACgCgAw6gQAAKIKACDuBAAAowoAMAQoAACTCgAw6AQAAJQKADDqBAAAlgoAIO4EAACXCgAwBCgAAIoKADDoBAAAiwoAMOoEAACNCgAg7gQAAOUHADAEKAAAgQoAMOgEAACCCgAw6gQAAIQKACDuBAAAmAcAMAQoAAD4CQAw6AQAAPkJADDqBAAA-wkAIO4EAACYBwAwBCgAAO8JADDoBAAA8AkAMOoEAADyCQAg7gQAAIwHADAAAAAAAAAAAAHTAwEAAAABEA4AAOEKACAPAADcCgAgEAAA4goAIBEAAN4KACASAADbCgAgEwAA4AoAIBQAAOAKACAWAADjCgAg2AMAAOkGACDbAwAA6QYAINwDAADpBgAg3gMAAOkGACDfAwAA6QYAIOQDAADpBgAg5QMAAOkGACDxBAAA5AoAIAHTAwEAAAABCgcAANUKACAIAADWCgAgCwAA1woAIAwAANgKACAZAADZCgAgGgAA2goAIBsAANsKACAcAADbCgAgHQAA3AoAIPEEAADdCgAgBw0AAOAKACAPAADaCgAgFwAA2woAIBgAAOcKACD0AwAA6QYAIPUDAADpBgAg8QQAAOgKACAEDgAA4QoAIBcAANsKACDuAwAA6QYAIPEEAADlCgAgAAHTAwEAAAABAdMDAQAAAAEB0wMBAAAAAQAB0wMBAAAAAQHTAwEAAAABAwMAAOAKACAKAADsCgAg8QQAAO0KACAB0wMBAAAAAQAB0wMBAAAAAQMDAADgCgAgBQAA1goAIPEEAADwCgAgAdMDAQAAAAEB0wMBAAAAAQvGAwIAAAAByAMBAAAAAeIDAgAAAAHjAyAAAAAB5gNAAAAAAecDQAAAAAH1AwEAAAAB-gMBAAAAAYAEAQAAAAGBBAIAAAABggQBAAAAAQfGAwIAAAAB5gNAAAAAAfoDAQAAAAH8AwIAAAAB_QMBAAAAAf4DAgAAAAH_AwEAAAABB8YDAgAAAAHZAwEAAAAB4wMgAAAAAeYDQAAAAAHnA0AAAAAB9wMBAAAAAfoDAQAAAAEHCoAAAAABxgMCAAAAAcgDAQAAAAHmA0AAAAAB5wNAAAAAAfcDAQAAAAH4AyAAAAABCsYDAgAAAAHIAwEAAAAB4wMgAAAAAeYDQAAAAAHnA0AAAAAB8gMgAAAAAfMDgAAAAAH0A4AAAAAB9QMBAAAAAfYDAQAAAAEExgMCAAAAAdYDAgAAAAHmA0AAAAAB8AMBAAAAARLGAwIAAAAB1gMCAAAAAdcDAgAAAAHYAwIAAAAB2QMBAAAAAdoDAQAAAAHbAwEAAAAB3ANAAAAAAd0DAQAAAAHeA0AAAAAB4AMCAAAAAeEDgAAAAAHiAwIAAAAB4wMgAAAAAeQDQAAAAAHlAwEAAAAB5gNAAAAAAecDQAAAAAESxgMCAAAAAdYDAgAAAAHXAwIAAAAB2AMCAAAAAdkDAQAAAAHaAwEAAAAB2wMBAAAAAdwDQAAAAAHdAwEAAAAB3gNAAAAAAd8DAgAAAAHhA4AAAAAB4gMCAAAAAeMDIAAAAAHkA0AAAAAB5QMBAAAAAeYDQAAAAAHnA0AAAAABAsYDAgAAAAHHAwIAAAABBcYDAgAAAAHmA0AAAAAB5wNAAAAAAYAEAQAAAAHZBAgAAAABCsYDAgAAAAHIAwEAAAAB2QMBAAAAAeYDQAAAAAHnA0AAAAAB_wMBAAAAAdoEAQAAAAHbBAEAAAAB3AQBAAAAAd0EIAAAAAECAAAAjgEAICgAAPsKACADAAAAlgEAICgAAPsKACApAAD_CgAgDAAAAJYBACAjAAD_CgAgxgMCAN0GACHIAwEA3AYAIdkDAQDcBgAh5gNAAPIGACHnA0AA8gYAIf8DAQDcBgAh2gQBANwGACHbBAEA3AYAIdwEAQDcBgAh3QQgAPEGACEKxgMCAN0GACHIAwEA3AYAIdkDAQDcBgAh5gNAAPIGACHnA0AA8gYAIf8DAQDcBgAh2gQBANwGACHbBAEA3AYAIdwEAQDcBgAh3QQgAPEGACEQxgMCAAAAAcgDAQAAAAHmA0AAAAABkAQBAAAAAZIEAQAAAAGTBAEAAAABlAQCAAAAAZUEAgAAAAGWBAIAAAABlwQCAAAAAZgEAgAAAAGZBAIAAAABmgQCAAAAAZsEQAAAAAGcBCAAAAABnQRAAAAAAQTGAwIAAAAByAMBAAAAAeYDQAAAAAGRBAEAAAABAgAAAI0DACAoAACBCwAgDsYDAgAAAAHmA0AAAAAB_QNAAAAAAYUECAAAAAGGBAgAAAABhwSAAAAAAYgECAAAAAGJBAgAAAABigQIAAAAAYsECAAAAAGMBAgAAAABjQQIAAAAAY4EAQAAAAGPBEAAAAABBsYDAgAAAAHmA0AAAAABhARAAAAAAYUECAAAAAGGBAgAAAABhwSAAAAAAQMAAACfAwAgKAAAgQsAICkAAIcLACAGAAAAnwMAICMAAIcLACDGAwIA3QYAIcgDAQDcBgAh5gNAAPIGACGRBAEA3AYAIQTGAwIA3QYAIcgDAQDcBgAh5gNAAPIGACGRBAEA3AYAIRPsAQAA4QgAIO8BAADjCAAgxgMCAAAAAcgDAQAAAAHmA0AAAAABkAQBAAAAAZEEAQAAAAGSBAEAAAABkwQBAAAAAZQEAgAAAAGVBAIAAAABlgQCAAAAAZcEAgAAAAGYBAIAAAABmQQCAAAAAZoEAgAAAAGbBEAAAAABnAQgAAAAAZ0EQAAAAAECAAAAkQMAICgAAIgLACADAAAAjwMAICgAAIgLACApAACMCwAgFQAAAI8DACAjAACMCwAg7AEAAMYIACDvAQAAyAgAIMYDAgDdBgAhyAMBANwGACHmA0AA8gYAIZAEAQDcBgAhkQQBANwGACGSBAEA3AYAIZMEAQDvBgAhlAQCAN0GACGVBAIA3QYAIZYEAgDdBgAhlwQCAN0GACGYBAIA3QYAIZkEAgDdBgAhmgQCAPMGACGbBEAA8AYAIZwEIADxBgAhnQRAAPAGACET7AEAAMYIACDvAQAAyAgAIMYDAgDdBgAhyAMBANwGACHmA0AA8gYAIZAEAQDcBgAhkQQBANwGACGSBAEA3AYAIZMEAQDvBgAhlAQCAN0GACGVBAIA3QYAIZYEAgDdBgAhlwQCAN0GACGYBAIA3QYAIZkEAgDdBgAhmgQCAPMGACGbBEAA8AYAIZwEIADxBgAhnQRAAPAGACET7AEAAOEIACDuAQAA4ggAIMYDAgAAAAHIAwEAAAAB5gNAAAAAAZAEAQAAAAGRBAEAAAABkgQBAAAAAZMEAQAAAAGUBAIAAAABlQQCAAAAAZYEAgAAAAGXBAIAAAABmAQCAAAAAZkEAgAAAAGaBAIAAAABmwRAAAAAAZwEIAAAAAGdBEAAAAABAgAAAJEDACAoAACNCwAgAwAAAI8DACAoAACNCwAgKQAAkQsAIBUAAACPAwAgIwAAkQsAIOwBAADGCAAg7gEAAMcIACDGAwIA3QYAIcgDAQDcBgAh5gNAAPIGACGQBAEA3AYAIZEEAQDcBgAhkgQBANwGACGTBAEA7wYAIZQEAgDdBgAhlQQCAN0GACGWBAIA3QYAIZcEAgDdBgAhmAQCAN0GACGZBAIA3QYAIZoEAgDzBgAhmwRAAPAGACGcBCAA8QYAIZ0EQADwBgAhE-wBAADGCAAg7gEAAMcIACDGAwIA3QYAIcgDAQDcBgAh5gNAAPIGACGQBAEA3AYAIZEEAQDcBgAhkgQBANwGACGTBAEA7wYAIZQEAgDdBgAhlQQCAN0GACGWBAIA3QYAIZcEAgDdBgAhmAQCAN0GACGZBAIA3QYAIZoEAgDzBgAhmwRAAPAGACGcBCAA8QYAIZ0EQADwBgAhDggAAM0KACALAADOCgAgDAAAzwoAIBkAANAKACAaAADRCgAgGwAA0goAIBwAANMKACAdAADUCgAgxgMCAAAAAcgDAQAAAAHmA0AAAAAB5wNAAAAAAeAEAQAAAAHhBAEAAAABAgAAAAEAICgAAJILACAHxgMCAAAAAdUDAgAAAAHmA0AAAAAB-gMBAAAAAf0DAQAAAAH-AwIAAAAB_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-LgB_LwCAATAAgQExAIIBAAAAAAAFBgB-LgB_LwCAATAAgQExAIIBAgYAiQHwAZIDhQEEBgCIAewBAIQB7gGWA4YB7wGaA4cBAe0BAIUBAe0BAIUBAu4BmwMA7wGcAwAB8AGdAwAFBgCLAS4AjAEvAI0BMACOATEAjwEAAAAAAAUGAIsBLgCMAS8AjQEwAI4BMQCPAQUGAJIBLgCTAS8AlAEwAJUBMQCWAQAAAAAABQYAkgEuAJMBLwCUATAAlQExAJYBBQYAmQEuAJoBLwCbATAAnAExAJ0BAAAAAAAFBgCZAS4AmgEvAJsBMACcATEAnQEFBgCgAS4AoQEvAKIBMACjATEApAEAAAAAAAUGAKABLgChAS8AogEwAKMBMQCkAQUGAKcBLgCoAS8AqQEwAKoBMQCrAQAAAAAABQYApwEuAKgBLwCpATAAqgExAKsBBQYArgEuAK8BLwCwATAAsQExALIBAAAAAAAFBgCuAS4ArwEvALABMACxATEAsgEFBgC1AS4AtgEvALcBMAC4ATEAuQEAAAAAAAUGALUBLgC2AS8AtwEwALgBMQC5AQUGALwBLgC9AS8AvgEwAL8BMQDAAQAAAAAABQYAvAEuAL0BLwC-ATAAvwExAMABBQYAwwEuAMQBLwDFATAAxgExAMcBAAAAAAAFBgDDAS4AxAEvAMUBMADGATEAxwEFBgDKAS4AywEvAMwBMADNATEAzgEAAAAAAAUGAMoBLgDLAS8AzAEwAM0BMQDOAQUGANEBLgDSAS8A0wEwANQBMQDVAQAAAAAABQYA0QEuANIBLwDTATAA1AExANUBBQYA2AEuANkBLwDaATAA2wExANwBAAAAAAAFBgDYAS4A2QEvANoBMADbATEA3AEFBgDfAS4A4AEvAOEBMADiATEA4wEAAAAAAAUGAN8BLgDgAS8A4QEwAOIBMQDjAQUGAOYBLgDnAS8A6AEwAOkBMQDqAQAAAAAABQYA5gEuAOcBLwDoATAA6QExAOoBBQYA7QEuAO4BLwDvATAA8AExAPEBAAAAAAAFBgDtAS4A7gEvAO8BMADwATEA8QEeAgEfTAEgTgEhTwEiUAEkUgElVBMmVgEnWBMqWQErWgEsWxMyXhQzXxo0YRs1Yhs2ZRs3Zhs4Zxs5aRs6axM7bRs8bxM9cBs-cRs_chNAdRxBdiJCeCNDeSNEfCNFfSNGfiNHgAEjSIIBE0mEASNKhgETS4cBI0yIASNNiQETTowBJE-NASpSjwErU5UBK1SYAStVmQErVpoBK1ecAStYngETWaABK1qiARNbowErXKQBK12lARNeqAEuX6kBNGCqASxhqwEsYqwBLGOtASxkrgEsZbABLGayARNntAEsaLYBE2m3ASxquAEsa7kBE2y8ATVtvQE7br8BPG_AATxwwwE8ccQBPHLFATxzxwE8dMkBE3XLATx2zQETd84BPHjPATx50AETetMBPXvUAUN81gFEfdcBRH7aAUR_2wFEgAHcAUSBAd4BRIIB4AETgwHiAUSEAeQBE4UB5QFEhgHmAUSHAecBE4gB6gFFiQHrAUuKAe0BTIsB7gFMjAHxAUyNAfIBTI4B8wFMjwH1AUyQAfcBE5EB-QFMkgH7AROTAfwBTJQB_QFMlQH-AROWAYECTZcBggJTmAGEAlSZAYUCVJoBiAJUmwGJAlScAYoCVJ0BjAJUngGOAhOfAZACVKABkgIToQGTAlSiAZQCVKMBlQITpAGYAlWlAZkCW6YBmwJcpwGcAlyoAZ8CXKkBoAJcqgGhAlyrAaMCXKwBpQITrQGnAlyuAakCE68BqgJcsAGrAlyxAawCE7IBrwJdswGwAmO0AbICZLUBswJktgG2AmS3AbcCZLgBuAJkuQG6AmS6AbwCE7sBvgJkvAHAAhO9AcECZL4BwgJkvwHDAhPAAcYCZcEBxwJrwgHJAmzDAcoCbMQBzQJsxQHOAmzGAc8CbMcB0QJsyAHTAhPJAdUCbMoB1wITywHYAmzMAdkCbM0B2gITzgHdAm3PAd4Cc9AB4AJ00QHhAnTSAeQCdNMB5QJ01AHmAnTVAegCdNYB6gIT1wHsAnTYAe4CE9kB7wJ02gHwAnTbAfECE9wB9AJ13QH1AnveAfcCfN8B-AJ84AH7AnzhAfwCfOIB_QJ84wH_AnzkAYEDE-UBgwN85gGFAxPnAYYDfOgBhwN86QGIAxPqAYsDfesBjAODAfEBjgOEAfIBngOEAfMBoQOEAfQBogOEAfUBowOEAfYBpQOEAfcBpwMT-AGpA4QB-QGrAxP6AawDhAH7Aa0DhAH8Aa4DE_0BsQOKAf4BsgOQAf8BswOFAYACtAOFAYECtQOFAYICtgOFAYMCtwOFAYQCuQOFAYUCuwMThgK9A4UBhwK_AxOIAsADhQGJAsEDhQGKAsIDE4sCxQORAYwCxgOXAY0CxwOGAY4CyAOGAY8CyQOGAZACygOGAZECywOGAZICzQOGAZMCzwMTlALRA4YBlQLTAxOWAtQDhgGXAtUDhgGYAtYDE5kC2QOYAZoC2gOeAZsC2wOHAZwC3AOHAZ0C3QOHAZ4C3gOHAZ8C3wOHAaAC4QOHAaEC4wMTogLlA4cBowLnAxOkAugDhwGlAukDhwGmAuoDE6cC7QOfAagC7gOlAakC7wMCqgLwAwKrAvEDAqwC8gMCrQLzAwKuAvUDAq8C9wMTsAL5AwKxAvsDE7IC_AMCswL9AwK0Av4DE7UCgQSmAbYCggSsAbcCgwQDuAKEBAO5AoUEA7oChgQDuwKHBAO8AokEA70CiwQTvgKNBAO_Ao8EE8ACkAQDwQKRBAPCApIEE8MClQStAcQClgSzAcUClwQFxgKYBAXHApkEBcgCmgQFyQKbBAXKAp0EBcsCnwQTzAKhBAXNAqMEE84CpAQFzwKlBAXQAqYEE9ECqQS0AdICqgS6AdMCqwQG1AKsBAbVAq0EBtYCrgQG1wKvBAbYArEEBtkCswQT2gK1BAbbArcEE9wCuAQG3QK5BAbeAroEE98CvQS7AeACvgTBAeECvwQI4gLABAjjAsEECOQCwgQI5QLDBAjmAsUECOcCxwQT6ALJBAjpAssEE-oCzAQI6wLNBAjsAs4EE-0C0QTCAe4C0gTIAe8C0wQJ8ALUBAnxAtUECfIC1gQJ8wLXBAn0AtkECfUC2wQT9gLdBAn3At8EE_gC4AQJ-QLhBAn6AuIEE_sC5QTJAfwC5gTPAf0C5wQK_gLoBAr_AukECoAD6gQKgQPrBAqCA-0ECoMD7wQThAPxBAqFA_MEE4YD9AQKhwP1BAqIA_YEE4kD-QTQAYoD-gTWAYsD-wQLjAP8BAuNA_0EC44D_gQLjwP_BAuQA4EFC5EDgwUTkgOFBQuTA4cFE5QDiAULlQOJBQuWA4oFE5cDjQXXAZgDjgXdAZkDjwUMmgOQBQybA5EFDJwDkgUMnQOTBQyeA5UFDJ8DlwUToAOZBQyhA5sFE6IDnAUMowOdBQykA54FE6UDoQXeAaYDogXkAacDowUNqAOkBQ2pA6UFDaoDpgUNqwOnBQ2sA6kFDa0DqwUTrgOtBQ2vA68FE7ADsAUNsQOxBQ2yA7IFE7MDtQXlAbQDtgXrAbUDtwUOtgO4BQ63A7kFDrgDugUOuQO7BQ66A70FDrsDvwUTvAPBBQ69A8MFE74DxAUOvwPFBQ7AA8YFE8EDyQXsAcIDygXyAQ" + strings: JSON.parse("[\"where\",\"orderBy\",\"cursor\",\"user\",\"habit\",\"records\",\"_count\",\"habits\",\"checkIns\",\"list\",\"items\",\"checkLists\",\"templates\",\"owner\",\"project\",\"members\",\"column\",\"parent\",\"children\",\"assignee\",\"creator\",\"task\",\"tags\",\"tasks\",\"columns\",\"ownedProjects\",\"projectMembers\",\"assignedTasks\",\"createdTasks\",\"taskMembers\",\"User.findUnique\",\"User.findUniqueOrThrow\",\"User.findFirst\",\"User.findFirstOrThrow\",\"User.findMany\",\"data\",\"User.createOne\",\"User.createMany\",\"User.createManyAndReturn\",\"User.updateOne\",\"User.updateMany\",\"User.updateManyAndReturn\",\"create\",\"update\",\"User.upsertOne\",\"User.deleteOne\",\"User.deleteMany\",\"having\",\"_avg\",\"_sum\",\"_min\",\"_max\",\"User.groupBy\",\"User.aggregate\",\"Article.findUnique\",\"Article.findUniqueOrThrow\",\"Article.findFirst\",\"Article.findFirstOrThrow\",\"Article.findMany\",\"Article.createOne\",\"Article.createMany\",\"Article.createManyAndReturn\",\"Article.updateOne\",\"Article.updateMany\",\"Article.updateManyAndReturn\",\"Article.upsertOne\",\"Article.deleteOne\",\"Article.deleteMany\",\"Article.groupBy\",\"Article.aggregate\",\"Strategy.findUnique\",\"Strategy.findUniqueOrThrow\",\"Strategy.findFirst\",\"Strategy.findFirstOrThrow\",\"Strategy.findMany\",\"Strategy.createOne\",\"Strategy.createMany\",\"Strategy.createManyAndReturn\",\"Strategy.updateOne\",\"Strategy.updateMany\",\"Strategy.updateManyAndReturn\",\"Strategy.upsertOne\",\"Strategy.deleteOne\",\"Strategy.deleteMany\",\"Strategy.groupBy\",\"Strategy.aggregate\",\"indicator\",\"points\",\"Indicator.findUnique\",\"Indicator.findUniqueOrThrow\",\"Indicator.findFirst\",\"Indicator.findFirstOrThrow\",\"Indicator.findMany\",\"Indicator.createOne\",\"Indicator.createMany\",\"Indicator.createManyAndReturn\",\"Indicator.updateOne\",\"Indicator.updateMany\",\"Indicator.updateManyAndReturn\",\"Indicator.upsertOne\",\"Indicator.deleteOne\",\"Indicator.deleteMany\",\"Indicator.groupBy\",\"Indicator.aggregate\",\"IndicatorPoint.findUnique\",\"IndicatorPoint.findUniqueOrThrow\",\"IndicatorPoint.findFirst\",\"IndicatorPoint.findFirstOrThrow\",\"IndicatorPoint.findMany\",\"IndicatorPoint.createOne\",\"IndicatorPoint.createMany\",\"IndicatorPoint.createManyAndReturn\",\"IndicatorPoint.updateOne\",\"IndicatorPoint.updateMany\",\"IndicatorPoint.updateManyAndReturn\",\"IndicatorPoint.upsertOne\",\"IndicatorPoint.deleteOne\",\"IndicatorPoint.deleteMany\",\"IndicatorPoint.groupBy\",\"IndicatorPoint.aggregate\",\"News.findUnique\",\"News.findUniqueOrThrow\",\"News.findFirst\",\"News.findFirstOrThrow\",\"News.findMany\",\"News.createOne\",\"News.createMany\",\"News.createManyAndReturn\",\"News.updateOne\",\"News.updateMany\",\"News.updateManyAndReturn\",\"News.upsertOne\",\"News.deleteOne\",\"News.deleteMany\",\"News.groupBy\",\"News.aggregate\",\"Alert.findUnique\",\"Alert.findUniqueOrThrow\",\"Alert.findFirst\",\"Alert.findFirstOrThrow\",\"Alert.findMany\",\"Alert.createOne\",\"Alert.createMany\",\"Alert.createManyAndReturn\",\"Alert.updateOne\",\"Alert.updateMany\",\"Alert.updateManyAndReturn\",\"Alert.upsertOne\",\"Alert.deleteOne\",\"Alert.deleteMany\",\"Alert.groupBy\",\"Alert.aggregate\",\"ServerNode.findUnique\",\"ServerNode.findUniqueOrThrow\",\"ServerNode.findFirst\",\"ServerNode.findFirstOrThrow\",\"ServerNode.findMany\",\"ServerNode.createOne\",\"ServerNode.createMany\",\"ServerNode.createManyAndReturn\",\"ServerNode.updateOne\",\"ServerNode.updateMany\",\"ServerNode.updateManyAndReturn\",\"ServerNode.upsertOne\",\"ServerNode.deleteOne\",\"ServerNode.deleteMany\",\"ServerNode.groupBy\",\"ServerNode.aggregate\",\"ServerNodeHistory.findUnique\",\"ServerNodeHistory.findUniqueOrThrow\",\"ServerNodeHistory.findFirst\",\"ServerNodeHistory.findFirstOrThrow\",\"ServerNodeHistory.findMany\",\"ServerNodeHistory.createOne\",\"ServerNodeHistory.createMany\",\"ServerNodeHistory.createManyAndReturn\",\"ServerNodeHistory.updateOne\",\"ServerNodeHistory.updateMany\",\"ServerNodeHistory.updateManyAndReturn\",\"ServerNodeHistory.upsertOne\",\"ServerNodeHistory.deleteOne\",\"ServerNodeHistory.deleteMany\",\"ServerNodeHistory.groupBy\",\"ServerNodeHistory.aggregate\",\"ServiceCheck.findUnique\",\"ServiceCheck.findUniqueOrThrow\",\"ServiceCheck.findFirst\",\"ServiceCheck.findFirstOrThrow\",\"ServiceCheck.findMany\",\"ServiceCheck.createOne\",\"ServiceCheck.createMany\",\"ServiceCheck.createManyAndReturn\",\"ServiceCheck.updateOne\",\"ServiceCheck.updateMany\",\"ServiceCheck.updateManyAndReturn\",\"ServiceCheck.upsertOne\",\"ServiceCheck.deleteOne\",\"ServiceCheck.deleteMany\",\"ServiceCheck.groupBy\",\"ServiceCheck.aggregate\",\"Econ_SowInventory.findUnique\",\"Econ_SowInventory.findUniqueOrThrow\",\"Econ_SowInventory.findFirst\",\"Econ_SowInventory.findFirstOrThrow\",\"Econ_SowInventory.findMany\",\"Econ_SowInventory.createOne\",\"Econ_SowInventory.createMany\",\"Econ_SowInventory.createManyAndReturn\",\"Econ_SowInventory.updateOne\",\"Econ_SowInventory.updateMany\",\"Econ_SowInventory.updateManyAndReturn\",\"Econ_SowInventory.upsertOne\",\"Econ_SowInventory.deleteOne\",\"Econ_SowInventory.deleteMany\",\"Econ_SowInventory.groupBy\",\"Econ_SowInventory.aggregate\",\"ScraperCache.findUnique\",\"ScraperCache.findUniqueOrThrow\",\"ScraperCache.findFirst\",\"ScraperCache.findFirstOrThrow\",\"ScraperCache.findMany\",\"ScraperCache.createOne\",\"ScraperCache.createMany\",\"ScraperCache.createManyAndReturn\",\"ScraperCache.updateOne\",\"ScraperCache.updateMany\",\"ScraperCache.updateManyAndReturn\",\"ScraperCache.upsertOne\",\"ScraperCache.deleteOne\",\"ScraperCache.deleteMany\",\"ScraperCache.groupBy\",\"ScraperCache.aggregate\",\"OilPriceHistory.findUnique\",\"OilPriceHistory.findUniqueOrThrow\",\"OilPriceHistory.findFirst\",\"OilPriceHistory.findFirstOrThrow\",\"OilPriceHistory.findMany\",\"OilPriceHistory.createOne\",\"OilPriceHistory.createMany\",\"OilPriceHistory.createManyAndReturn\",\"OilPriceHistory.updateOne\",\"OilPriceHistory.updateMany\",\"OilPriceHistory.updateManyAndReturn\",\"OilPriceHistory.upsertOne\",\"OilPriceHistory.deleteOne\",\"OilPriceHistory.deleteMany\",\"OilPriceHistory.groupBy\",\"OilPriceHistory.aggregate\",\"MihomeAccount.findUnique\",\"MihomeAccount.findUniqueOrThrow\",\"MihomeAccount.findFirst\",\"MihomeAccount.findFirstOrThrow\",\"MihomeAccount.findMany\",\"MihomeAccount.createOne\",\"MihomeAccount.createMany\",\"MihomeAccount.createManyAndReturn\",\"MihomeAccount.updateOne\",\"MihomeAccount.updateMany\",\"MihomeAccount.updateManyAndReturn\",\"MihomeAccount.upsertOne\",\"MihomeAccount.deleteOne\",\"MihomeAccount.deleteMany\",\"MihomeAccount.groupBy\",\"MihomeAccount.aggregate\",\"home\",\"device\",\"samples\",\"hours\",\"devices\",\"MihomeHome.findUnique\",\"MihomeHome.findUniqueOrThrow\",\"MihomeHome.findFirst\",\"MihomeHome.findFirstOrThrow\",\"MihomeHome.findMany\",\"MihomeHome.createOne\",\"MihomeHome.createMany\",\"MihomeHome.createManyAndReturn\",\"MihomeHome.updateOne\",\"MihomeHome.updateMany\",\"MihomeHome.updateManyAndReturn\",\"MihomeHome.upsertOne\",\"MihomeHome.deleteOne\",\"MihomeHome.deleteMany\",\"MihomeHome.groupBy\",\"MihomeHome.aggregate\",\"MihomeDevice.findUnique\",\"MihomeDevice.findUniqueOrThrow\",\"MihomeDevice.findFirst\",\"MihomeDevice.findFirstOrThrow\",\"MihomeDevice.findMany\",\"MihomeDevice.createOne\",\"MihomeDevice.createMany\",\"MihomeDevice.createManyAndReturn\",\"MihomeDevice.updateOne\",\"MihomeDevice.updateMany\",\"MihomeDevice.updateManyAndReturn\",\"MihomeDevice.upsertOne\",\"MihomeDevice.deleteOne\",\"MihomeDevice.deleteMany\",\"MihomeDevice.groupBy\",\"MihomeDevice.aggregate\",\"MihomeEnvSample.findUnique\",\"MihomeEnvSample.findUniqueOrThrow\",\"MihomeEnvSample.findFirst\",\"MihomeEnvSample.findFirstOrThrow\",\"MihomeEnvSample.findMany\",\"MihomeEnvSample.createOne\",\"MihomeEnvSample.createMany\",\"MihomeEnvSample.createManyAndReturn\",\"MihomeEnvSample.updateOne\",\"MihomeEnvSample.updateMany\",\"MihomeEnvSample.updateManyAndReturn\",\"MihomeEnvSample.upsertOne\",\"MihomeEnvSample.deleteOne\",\"MihomeEnvSample.deleteMany\",\"MihomeEnvSample.groupBy\",\"MihomeEnvSample.aggregate\",\"MihomeEnvHour.findUnique\",\"MihomeEnvHour.findUniqueOrThrow\",\"MihomeEnvHour.findFirst\",\"MihomeEnvHour.findFirstOrThrow\",\"MihomeEnvHour.findMany\",\"MihomeEnvHour.createOne\",\"MihomeEnvHour.createMany\",\"MihomeEnvHour.createManyAndReturn\",\"MihomeEnvHour.updateOne\",\"MihomeEnvHour.updateMany\",\"MihomeEnvHour.updateManyAndReturn\",\"MihomeEnvHour.upsertOne\",\"MihomeEnvHour.deleteOne\",\"MihomeEnvHour.deleteMany\",\"MihomeEnvHour.groupBy\",\"MihomeEnvHour.aggregate\",\"Habit.findUnique\",\"Habit.findUniqueOrThrow\",\"Habit.findFirst\",\"Habit.findFirstOrThrow\",\"Habit.findMany\",\"Habit.createOne\",\"Habit.createMany\",\"Habit.createManyAndReturn\",\"Habit.updateOne\",\"Habit.updateMany\",\"Habit.updateManyAndReturn\",\"Habit.upsertOne\",\"Habit.deleteOne\",\"Habit.deleteMany\",\"Habit.groupBy\",\"Habit.aggregate\",\"CheckIn.findUnique\",\"CheckIn.findUniqueOrThrow\",\"CheckIn.findFirst\",\"CheckIn.findFirstOrThrow\",\"CheckIn.findMany\",\"CheckIn.createOne\",\"CheckIn.createMany\",\"CheckIn.createManyAndReturn\",\"CheckIn.updateOne\",\"CheckIn.updateMany\",\"CheckIn.updateManyAndReturn\",\"CheckIn.upsertOne\",\"CheckIn.deleteOne\",\"CheckIn.deleteMany\",\"CheckIn.groupBy\",\"CheckIn.aggregate\",\"CheckList.findUnique\",\"CheckList.findUniqueOrThrow\",\"CheckList.findFirst\",\"CheckList.findFirstOrThrow\",\"CheckList.findMany\",\"CheckList.createOne\",\"CheckList.createMany\",\"CheckList.createManyAndReturn\",\"CheckList.updateOne\",\"CheckList.updateMany\",\"CheckList.updateManyAndReturn\",\"CheckList.upsertOne\",\"CheckList.deleteOne\",\"CheckList.deleteMany\",\"CheckList.groupBy\",\"CheckList.aggregate\",\"CheckListItem.findUnique\",\"CheckListItem.findUniqueOrThrow\",\"CheckListItem.findFirst\",\"CheckListItem.findFirstOrThrow\",\"CheckListItem.findMany\",\"CheckListItem.createOne\",\"CheckListItem.createMany\",\"CheckListItem.createManyAndReturn\",\"CheckListItem.updateOne\",\"CheckListItem.updateMany\",\"CheckListItem.updateManyAndReturn\",\"CheckListItem.upsertOne\",\"CheckListItem.deleteOne\",\"CheckListItem.deleteMany\",\"CheckListItem.groupBy\",\"CheckListItem.aggregate\",\"CheckListTemplate.findUnique\",\"CheckListTemplate.findUniqueOrThrow\",\"CheckListTemplate.findFirst\",\"CheckListTemplate.findFirstOrThrow\",\"CheckListTemplate.findMany\",\"CheckListTemplate.createOne\",\"CheckListTemplate.createMany\",\"CheckListTemplate.createManyAndReturn\",\"CheckListTemplate.updateOne\",\"CheckListTemplate.updateMany\",\"CheckListTemplate.updateManyAndReturn\",\"CheckListTemplate.upsertOne\",\"CheckListTemplate.deleteOne\",\"CheckListTemplate.deleteMany\",\"CheckListTemplate.groupBy\",\"CheckListTemplate.aggregate\",\"Project.findUnique\",\"Project.findUniqueOrThrow\",\"Project.findFirst\",\"Project.findFirstOrThrow\",\"Project.findMany\",\"Project.createOne\",\"Project.createMany\",\"Project.createManyAndReturn\",\"Project.updateOne\",\"Project.updateMany\",\"Project.updateManyAndReturn\",\"Project.upsertOne\",\"Project.deleteOne\",\"Project.deleteMany\",\"Project.groupBy\",\"Project.aggregate\",\"ProjectMember.findUnique\",\"ProjectMember.findUniqueOrThrow\",\"ProjectMember.findFirst\",\"ProjectMember.findFirstOrThrow\",\"ProjectMember.findMany\",\"ProjectMember.createOne\",\"ProjectMember.createMany\",\"ProjectMember.createManyAndReturn\",\"ProjectMember.updateOne\",\"ProjectMember.updateMany\",\"ProjectMember.updateManyAndReturn\",\"ProjectMember.upsertOne\",\"ProjectMember.deleteOne\",\"ProjectMember.deleteMany\",\"ProjectMember.groupBy\",\"ProjectMember.aggregate\",\"BoardColumn.findUnique\",\"BoardColumn.findUniqueOrThrow\",\"BoardColumn.findFirst\",\"BoardColumn.findFirstOrThrow\",\"BoardColumn.findMany\",\"BoardColumn.createOne\",\"BoardColumn.createMany\",\"BoardColumn.createManyAndReturn\",\"BoardColumn.updateOne\",\"BoardColumn.updateMany\",\"BoardColumn.updateManyAndReturn\",\"BoardColumn.upsertOne\",\"BoardColumn.deleteOne\",\"BoardColumn.deleteMany\",\"BoardColumn.groupBy\",\"BoardColumn.aggregate\",\"Task.findUnique\",\"Task.findUniqueOrThrow\",\"Task.findFirst\",\"Task.findFirstOrThrow\",\"Task.findMany\",\"Task.createOne\",\"Task.createMany\",\"Task.createManyAndReturn\",\"Task.updateOne\",\"Task.updateMany\",\"Task.updateManyAndReturn\",\"Task.upsertOne\",\"Task.deleteOne\",\"Task.deleteMany\",\"Task.groupBy\",\"Task.aggregate\",\"TaskMember.findUnique\",\"TaskMember.findUniqueOrThrow\",\"TaskMember.findFirst\",\"TaskMember.findFirstOrThrow\",\"TaskMember.findMany\",\"TaskMember.createOne\",\"TaskMember.createMany\",\"TaskMember.createManyAndReturn\",\"TaskMember.updateOne\",\"TaskMember.updateMany\",\"TaskMember.updateManyAndReturn\",\"TaskMember.upsertOne\",\"TaskMember.deleteOne\",\"TaskMember.deleteMany\",\"TaskMember.groupBy\",\"TaskMember.aggregate\",\"TaskTag.findUnique\",\"TaskTag.findUniqueOrThrow\",\"TaskTag.findFirst\",\"TaskTag.findFirstOrThrow\",\"TaskTag.findMany\",\"TaskTag.createOne\",\"TaskTag.createMany\",\"TaskTag.createManyAndReturn\",\"TaskTag.updateOne\",\"TaskTag.updateMany\",\"TaskTag.updateManyAndReturn\",\"TaskTag.upsertOne\",\"TaskTag.deleteOne\",\"TaskTag.deleteMany\",\"TaskTag.groupBy\",\"TaskTag.aggregate\",\"AND\",\"OR\",\"NOT\",\"id\",\"uuid\",\"taskUuid\",\"taskId\",\"name\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"contains\",\"startsWith\",\"endsWith\",\"not\",\"userId\",\"projectUuid\",\"columnUuid\",\"parentUuid\",\"projectId\",\"columnId\",\"parentId\",\"title\",\"description\",\"kind\",\"markDate\",\"status\",\"doneAt\",\"assigneeId\",\"creatorId\",\"extras\",\"sortOrder\",\"archived\",\"archivedAt\",\"archiveSource\",\"createdAt\",\"updatedAt\",\"number\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"boundStatus\",\"retention\",\"permission\",\"code\",\"ownerId\",\"isPersonal\",\"notes\",\"taskKinds\",\"icon\",\"autoArchive\",\"scene\",\"builtin\",\"listId\",\"note\",\"done\",\"habitId\",\"date\",\"seq\",\"source\",\"period\",\"target\",\"color\",\"deviceId\",\"hour\",\"temperatureAvg\",\"humidityAvg\",\"raw\",\"temperature\",\"humidity\",\"temperatureMin\",\"temperatureMax\",\"humidityMin\",\"humidityMax\",\"origin\",\"sampledAt\",\"did\",\"homeId\",\"model\",\"alias\",\"tempSiid\",\"tempPiid\",\"humSiid\",\"humPiid\",\"battSiid\",\"battPiid\",\"battery\",\"batteryAt\",\"enabled\",\"lastSyncAt\",\"every\",\"some\",\"none\",\"deviceId_hour\",\"deviceId_date\",\"key\",\"lastError\",\"province\",\"fuel\",\"price\",\"date_province_fuel\",\"scraperName\",\"lastDataHash\",\"lastUpdateAt\",\"metadata\",\"month\",\"inventory\",\"url\",\"latencyMs\",\"message\",\"lastCheckAt\",\"cpu\",\"ram\",\"load\",\"disk\",\"netIn\",\"netOut\",\"process\",\"connections\",\"uuid_period\",\"cpuName\",\"os\",\"region\",\"memTotal\",\"diskTotal\",\"cpuCores\",\"cpuUsage\",\"ramUsed\",\"swapUsed\",\"load1\",\"load5\",\"load15\",\"diskUsed\",\"uptime\",\"recordedAt\",\"indicatorName\",\"valueA\",\"valueB\",\"sourceA\",\"sourceB\",\"diff\",\"diffRatio\",\"summary\",\"content\",\"publishedAt\",\"impactRank\",\"title_publishedAt\",\"indicatorId\",\"value\",\"groupName\",\"unit\",\"frequency\",\"hidden\",\"indicatorId_period\",\"slug\",\"email\",\"password\",\"taskId_userId\",\"projectId_number\",\"projectId_name\",\"projectId_userId\",\"habitId_date_seq\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), + graph: "mgysAtADEgcAAIoHACAIAACLBwAgCwAAjAcAIAwAAI0HACAZAACOBwAgGgAAhwcAIBsAAP4GACAcAAD-BgAgHQAAgAcAIP0DAACJBwAw_gMAABoAEP8DAACJBwAwgAQCAAAAAYQEAQC5BgAhpARAALoGACGlBEAAugYAIZ8FAQAAAAGgBQEAuQYAIQEAAAABACARAwAA-AYAIAUAAIsHACD9AwAAlwcAMP4DAAADABD_AwAAlwcAMIAEAgC4BgAhhAQBALkGACGQBAIAuAYAIaAEAgC4BgAhoQQgAMcGACGkBEAAugYAIaUEQAC6BgAhtQQBALkGACG6BAEAuQYAIcAEAQC5BgAhwQQCALgGACHCBAEAuQYAIQIDAACPCwAgBQAAhwsAIBEDAAD4BgAgBQAAiwcAIP0DAACXBwAw_gMAAAMAEP8DAACXBwAwgAQCAAAAAYQEAQC5BgAhkAQCALgGACGgBAIAuAYAIaEEIADHBgAhpARAALoGACGlBEAAugYAIbUEAQC5BgAhugQBALkGACHABAEAuQYAIcEEAgC4BgAhwgQBALkGACEDAAAAAwAgAQAABAAwAgAABQAgDQMAAPgGACAEAACWBwAg_QMAAJUHADD-AwAABwAQ_wMAAJUHADCABAIAuAYAIZAEAgC4BgAhpARAALoGACG6BAEAuQYAIbwEAgC4BgAhvQQBALkGACG-BAIAuAYAIb8EAQC5BgAhAgMAAI8LACAEAACWCwAgDgMAAPgGACAEAACWBwAg_QMAAJUHADD-AwAABwAQ_wMAAJUHADCABAIAAAABkAQCALgGACGkBEAAugYAIboEAQC5BgAhvAQCALgGACG9BAEAuQYAIb4EAgC4BgAhvwQBALkGACGlBQAAlAcAIAMAAAAHACABAAAIADACAAAJACABAAAABwAgAwAAAAcAIAEAAAgAMAIAAAkAIA0DAAD4BgAgCgAAkwcAIP0DAACSBwAw_gMAAA0AEP8DAACSBwAwgAQCALgGACGQBAIAuAYAIZcEAQC5BgAhoQQgAMcGACGkBEAAugYAIaUEQAC6BgAhtwQBALkGACG6BAEAuQYAIQIDAACPCwAgCgAAlQsAIA0DAAD4BgAgCgAAkwcAIP0DAACSBwAw_gMAAA0AEP8DAACSBwAwgAQCAAAAAZAEAgC4BgAhlwQBALkGACGhBCAAxwYAIaQEQAC6BgAhpQRAALoGACG3BAEAuQYAIboEAQC5BgAhAwAAAA0AIAEAAA4AMAIAAA8AIA0JAACRBwAg_QMAAJAHADD-AwAAEQAQ_wMAAJAHADCABAIAuAYAIZcEAQC5BgAhnARAAMMGACGgBAIAuAYAIaQEQAC6BgAhpQRAALoGACG5BAIAuAYAIboEAQC5BgAhuwQgAMcGACECCQAAlAsAIJwEAACYBwAgDQkAAJEHACD9AwAAkAcAMP4DAAARABD_AwAAkAcAMIAEAgAAAAGXBAEAuQYAIZwEQADDBgAhoAQCALgGACGkBEAAugYAIaUEQAC6BgAhuQQCALgGACG6BAEAuQYAIbsEIADHBgAhAwAAABEAIAEAABIAMAIAABMAIAEAAAARACAMAwAA_wYAIAoAAPAGACD9AwAAjwcAMP4DAAAWABD_AwAAjwcAMIAEAgC4BgAhhAQBALkGACGQBAIAxgYAIaQEQAC6BgAhpQRAALoGACG3BAEAuQYAIbgEIADHBgAhAgMAAI8LACCQBAAAmAcAIAwDAAD_BgAgCgAA8AYAIP0DAACPBwAw_gMAABYAEP8DAACPBwAwgAQCAAAAAYQEAQC5BgAhkAQCAMYGACGkBEAAugYAIaUEQAC6BgAhtwQBALkGACG4BCAAxwYAIQMAAAAWACABAAAXADACAAAYACASBwAAigcAIAgAAIsHACALAACMBwAgDAAAjQcAIBkAAI4HACAaAACHBwAgGwAA_gYAIBwAAP4GACAdAACABwAg_QMAAIkHADD-AwAAGgAQ_wMAAIkHADCABAIAuAYAIYQEAQC5BgAhpARAALoGACGlBEAAugYAIZ8FAQC5BgAhoAUBALkGACEBAAAAGgAgFA0AAPgGACAPAACHBwAgFwAA_gYAIBgAAIgHACD9AwAAhgcAMP4DAAAcABD_AwAAhgcAMIAEAgC4BgAhgQQBALkGACGEBAEAuQYAIaEEIADHBgAhpARAALoGACGlBEAAugYAIbAEAQC5BgAhsQQCALgGACGyBCAAxwYAIbMEAADwBgAgtAQAAL8GACC1BAEAxQYAIbYEAQC5BgAhBg0AAI8LACAPAACLCwAgFwAAjAsAIBgAAJMLACC0BAAAmAcAILUEAACYBwAgFA0AAPgGACAPAACHBwAgFwAA_gYAIBgAAIgHACD9AwAAhgcAMP4DAAAcABD_AwAAhgcAMIAEAgAAAAGBBAEAAAABhAQBALkGACGhBCAAxwYAIaQEQAC6BgAhpQRAALoGACGwBAEAAAABsQQCALgGACGyBCAAxwYAIbMEAADwBgAgtAQAAL8GACC1BAEAxQYAIbYEAQC5BgAhAwAAABwAIAEAAB0AMAIAAB4AIAwDAAD4BgAgDgAA-wYAIP0DAACFBwAw_gMAACAAEP8DAACFBwAwgAQCALgGACGBBAEAuQYAIZAEAgC4BgAhkQQBAMUGACGUBAIAuAYAIaQEQAC6BgAhrwQBALkGACEDAwAAjwsAIA4AAJALACCRBAAAmAcAIA0DAAD4BgAgDgAA-wYAIP0DAACFBwAw_gMAACAAEP8DAACFBwAwgAQCAAAAAYEEAQAAAAGQBAIAuAYAIZEEAQDFBgAhlAQCALgGACGkBEAAugYAIa8EAQC5BgAhpAUAAIQHACADAAAAIAAgAQAAIQAwAgAAIgAgDw4AAPsGACAXAAD-BgAg_QMAAIMHADD-AwAAJAAQ_wMAAIMHADCABAIAuAYAIYEEAQC5BgAhhAQBALkGACGRBAEAxQYAIZQEAgC4BgAhoAQCALgGACGkBEAAugYAIaUEQAC6BgAhrQQBAMUGACGuBAEAuQYAIQQOAACQCwAgFwAAjAsAIJEEAACYBwAgrQQAAJgHACAQDgAA-wYAIBcAAP4GACD9AwAAgwcAMP4DAAAkABD_AwAAgwcAMIAEAgAAAAGBBAEAAAABhAQBALkGACGRBAEAxQYAIZQEAgC4BgAhoAQCALgGACGkBEAAugYAIaUEQAC6BgAhrQQBAMUGACGuBAEAuQYAIaMFAACCBwAgAwAAACQAIAEAACUAMAIAACYAICMOAAD7BgAgDwAAgAcAIBAAAPwGACARAAD9BgAgEgAA_gYAIBMAAP8GACAUAAD4BgAgFgAAgQcAIP0DAAD6BgAw_gMAACgAEP8DAAD6BgAwgAQCALgGACGBBAEAuQYAIZEEAQDFBgAhkgQBAMUGACGTBAEAxQYAIZQEAgC4BgAhlQQCALgGACGWBAIAxgYAIZcEAQC5BgAhmAQBALkGACGZBAEAxQYAIZoEQADDBgAhmwQBALkGACGcBEAAwwYAIZ0EAgDGBgAhngQCALgGACGfBAAA8AYAIKAEAgC4BgAhoQQgAMcGACGiBEAAwwYAIaMEAQDFBgAhpARAALoGACGlBEAAugYAIaYEAgDGBgAhEw4AAJALACAPAACNCwAgEAAAkQsAIBEAAI4LACASAACMCwAgEwAAjwsAIBQAAI8LACAWAACSCwAgkQQAAJgHACCSBAAAmAcAIJMEAACYBwAglgQAAJgHACCZBAAAmAcAIJoEAACYBwAgnAQAAJgHACCdBAAAmAcAIKIEAACYBwAgowQAAJgHACCmBAAAmAcAICQOAAD7BgAgDwAAgAcAIBAAAPwGACARAAD9BgAgEgAA_gYAIBMAAP8GACAUAAD4BgAgFgAAgQcAIP0DAAD6BgAw_gMAACgAEP8DAAD6BgAwgAQCAAAAAYEEAQAAAAGRBAEAxQYAIZIEAQDFBgAhkwQBAMUGACGUBAIAuAYAIZUEAgC4BgAhlgQCAMYGACGXBAEAuQYAIZgEAQC5BgAhmQQBAMUGACGaBEAAwwYAIZsEAQC5BgAhnARAAMMGACGdBAIAxgYAIZ4EAgC4BgAhnwQAAPAGACCgBAIAuAYAIaEEIADHBgAhogRAAMMGACGjBAEAxQYAIaQEQAC6BgAhpQRAALoGACGmBAIAxgYAIaIFAAD5BgAgAwAAACgAIAEAACkAMAIAACoAIAEAAAAoACADAAAAKAAgAQAAKQAwAgAAKgAgAQAAABoAIAoDAAD4BgAgFQAA9QYAIP0DAAD3BgAw_gMAAC8AEP8DAAD3BgAwgAQCALgGACGBBAEAuQYAIYIEAQDFBgAhgwQCALgGACGQBAIAuAYAIQMDAACPCwAgFQAAjgsAIIIEAACYBwAgCwMAAPgGACAVAAD1BgAg_QMAAPcGADD-AwAALwAQ_wMAAPcGADCABAIAAAABgQQBAAAAAYIEAQDFBgAhgwQCALgGACGQBAIAuAYAIaEFAAD2BgAgAwAAAC8AIAEAADAAMAIAADEAIAkVAAD1BgAg_QMAAPQGADD-AwAAMwAQ_wMAAPQGADCABAIAuAYAIYEEAQC5BgAhggQBAMUGACGDBAIAuAYAIYQEAQC5BgAhAhUAAI4LACCCBAAAmAcAIAkVAAD1BgAg_QMAAPQGADD-AwAAMwAQ_wMAAPQGADCABAIAAAABgQQBAAAAAYIEAQDFBgAhgwQCALgGACGEBAEAuQYAIQMAAAAzACABAAA0ADACAAA1ACABAAAAKAAgAQAAAC8AIAEAAAAzACABAAAAKAAgAwAAACgAIAEAACkAMAIAACoAIAEAAAAgACABAAAAJAAgAQAAACgAIAMAAAAgACABAAAhADACAAAiACADAAAAKAAgAQAAKQAwAgAAKgAgAwAAACgAIAEAACkAMAIAACoAIAMAAAAvACABAAAwADACAAAxACABAAAAAwAgAQAAAAcAIAEAAAANACABAAAAFgAgAQAAABwAIAEAAAAgACABAAAAKAAgAQAAACgAIAEAAAAvACABAAAAAQAgCQcAAIYLACAIAACHCwAgCwAAiAsAIAwAAIkLACAZAACKCwAgGgAAiwsAIBsAAIwLACAcAACMCwAgHQAAjQsAIAMAAAAaACABAABNADACAAABACADAAAAGgAgAQAATQAwAgAAAQAgAwAAABoAIAEAAE0AMAIAAAEAIA8HAAD9CgAgCAAA_goAIAsAAP8KACAMAACACwAgGQAAgQsAIBoAAIILACAbAACDCwAgHAAAhAsAIB0AAIULACCABAIAAAABhAQBAAAAAaQEQAAAAAGlBEAAAAABnwUBAAAAAaAFAQAAAAEBIwAAUQAgBoAEAgAAAAGEBAEAAAABpARAAAAAAaUEQAAAAAGfBQEAAAABoAUBAAAAAQEjAABTADABIwAAUwAwDwcAAJcKACAIAACYCgAgCwAAmQoAIAwAAJoKACAZAACbCgAgGgAAnAoAIBsAAJ0KACAcAACeCgAgHQAAnwoAIIAEAgCgBwAhhAQBAJ4HACGkBEAAswcAIaUEQACzBwAhnwUBAJ4HACGgBQEAngcAIQIAAAABACAjAABWACAGgAQCAKAHACGEBAEAngcAIaQEQACzBwAhpQRAALMHACGfBQEAngcAIaAFAQCeBwAhAgAAABoAICMAAFgAIAIAAAAaACAjAABYACADAAAAAQAgKgAAUQAgKwAAVgAgAQAAAAEAIAEAAAAaACAFBgAAkgoAIDAAAJMKACAxAACWCgAgMgAAlQoAIDMAAJQKACAJ_QMAAPMGADD-AwAAXwAQ_wMAAPMGADCABAIAjAYAIYQEAQCNBgAhpARAAJ0GACGlBEAAnQYAIZ8FAQCNBgAhoAUBAI0GACEDAAAAGgAgAQAAXgAwLwAAXwAgAwAAABoAIAEAAE0AMAIAAAEAIAr9AwAA8gYAMP4DAABlABD_AwAA8gYAMIAEAgAAAAGXBAEAuQYAIaQEQAC6BgAhpQRAALoGACG9BAEAuQYAIZMFAQC5BgAhngUBAAAAAQEAAABiACABAAAAYgAgCv0DAADyBgAw_gMAAGUAEP8DAADyBgAwgAQCALgGACGXBAEAuQYAIaQEQAC6BgAhpQRAALoGACG9BAEAuQYAIZMFAQC5BgAhngUBALkGACEAAwAAAGUAIAEAAGYAMAIAAGIAIAMAAABlACABAABmADACAABiACADAAAAZQAgAQAAZgAwAgAAYgAgB4AEAgAAAAGXBAEAAAABpARAAAAAAaUEQAAAAAG9BAEAAAABkwUBAAAAAZ4FAQAAAAEBIwAAagAgB4AEAgAAAAGXBAEAAAABpARAAAAAAaUEQAAAAAG9BAEAAAABkwUBAAAAAZ4FAQAAAAEBIwAAbAAwASMAAGwAMAeABAIAoAcAIZcEAQCeBwAhpARAALMHACGlBEAAswcAIb0EAQCeBwAhkwUBAJ4HACGeBQEAngcAIQIAAABiACAjAABvACAHgAQCAKAHACGXBAEAngcAIaQEQACzBwAhpQRAALMHACG9BAEAngcAIZMFAQCeBwAhngUBAJ4HACECAAAAZQAgIwAAcQAgAgAAAGUAICMAAHEAIAMAAABiACAqAABqACArAABvACABAAAAYgAgAQAAAGUAIAUGAACNCgAgMAAAjgoAIDEAAJEKACAyAACQCgAgMwAAjwoAIAr9AwAA8QYAMP4DAAB4ABD_AwAA8QYAMIAEAgCMBgAhlwQBAI0GACGkBEAAnQYAIaUEQACdBgAhvQQBAI0GACGTBQEAjQYAIZ4FAQCNBgAhAwAAAGUAIAEAAHcAMC8AAHgAIAMAAABlACABAABmADACAABiACAJIwAA8AYAIP0DAADvBgAw_gMAAH4AEP8DAADvBgAwgAQCAAAAAYQEAQC5BgAhmAQBALkGACGkBEAAugYAIaUEQAC6BgAhAQAAAHsAIAEAAAB7ACAJIwAA8AYAIP0DAADvBgAw_gMAAH4AEP8DAADvBgAwgAQCALgGACGEBAEAuQYAIZgEAQC5BgAhpARAALoGACGlBEAAugYAIQADAAAAfgAgAQAAfwAwAgAAewAgAwAAAH4AIAEAAH8AMAIAAHsAIAMAAAB-ACABAAB_ADACAAB7ACAGI4AAAAABgAQCAAAAAYQEAQAAAAGYBAEAAAABpARAAAAAAaUEQAAAAAEBIwAAgwEAIAYjgAAAAAGABAIAAAABhAQBAAAAAZgEAQAAAAGkBEAAAAABpQRAAAAAAQEjAACFAQAwASMAAIUBADAGI4AAAAABgAQCAKAHACGEBAEAngcAIZgEAQCeBwAhpARAALMHACGlBEAAswcAIQIAAAB7ACAjAACIAQAgBiOAAAAAAYAEAgCgBwAhhAQBAJ4HACGYBAEAngcAIaQEQACzBwAhpQRAALMHACECAAAAfgAgIwAAigEAIAIAAAB-ACAjAACKAQAgAwAAAHsAICoAAIMBACArAACIAQAgAQAAAHsAIAEAAAB-ACAFBgAAiAoAIDAAAIkKACAxAACMCgAgMgAAiwoAIDMAAIoKACAJIwAAmwYAIP0DAADuBgAw_gMAAJEBABD_AwAA7gYAMIAEAgCMBgAhhAQBAI0GACGYBAEAjQYAIaQEQACdBgAhpQRAAJ0GACEDAAAAfgAgAQAAkAEAMC8AAJEBACADAAAAfgAgAQAAfwAwAgAAewAgDlcAAOoGACD9AwAA6QYAMP4DAACcAQAQ_wMAAOkGADCABAIAAAABhAQBAAAAAZcEAQC5BgAhpARAALoGACGlBEAAugYAIb8EAQC5BgAhmQUBALkGACGaBQEAuQYAIZsFAQC5BgAhnAUgAMcGACEBAAAAlAEAIApWAADtBgAg_QMAAOwGADD-AwAAlgEAEP8DAADsBgAwgAQCALgGACGkBEAAugYAIaUEQAC6BgAhwAQBALkGACGXBQIAuAYAIZgFCADRBgAhAVYAAIcKACALVgAA7QYAIP0DAADsBgAw_gMAAJYBABD_AwAA7AYAMIAEAgAAAAGkBEAAugYAIaUEQAC6BgAhwAQBALkGACGXBQIAuAYAIZgFCADRBgAhnQUAAOsGACADAAAAlgEAIAEAAJcBADACAACYAQAgAQAAAJYBACABAAAAlAEAIA5XAADqBgAg_QMAAOkGADD-AwAAnAEAEP8DAADpBgAwgAQCALgGACGEBAEAuQYAIZcEAQC5BgAhpARAALoGACGlBEAAugYAIb8EAQC5BgAhmQUBALkGACGaBQEAuQYAIZsFAQC5BgAhnAUgAMcGACEBVwAAhgoAIAMAAACcAQAgAQAAnQEAMAIAAJQBACADAAAAnAEAIAEAAJ0BADACAACUAQAgAwAAAJwBACABAACdAQAwAgAAlAEAIAtXAACFCgAggAQCAAAAAYQEAQAAAAGXBAEAAAABpARAAAAAAaUEQAAAAAG_BAEAAAABmQUBAAAAAZoFAQAAAAGbBQEAAAABnAUgAAAAAQEjAAChAQAgCoAEAgAAAAGEBAEAAAABlwQBAAAAAaQEQAAAAAGlBEAAAAABvwQBAAAAAZkFAQAAAAGaBQEAAAABmwUBAAAAAZwFIAAAAAEBIwAAowEAMAEjAACjAQAwC1cAAPgJACCABAIAoAcAIYQEAQCeBwAhlwQBAJ4HACGkBEAAswcAIaUEQACzBwAhvwQBAJ4HACGZBQEAngcAIZoFAQCeBwAhmwUBAJ4HACGcBSAAsgcAIQIAAACUAQAgIwAApgEAIAqABAIAoAcAIYQEAQCeBwAhlwQBAJ4HACGkBEAAswcAIaUEQACzBwAhvwQBAJ4HACGZBQEAngcAIZoFAQCeBwAhmwUBAJ4HACGcBSAAsgcAIQIAAACcAQAgIwAAqAEAIAIAAACcAQAgIwAAqAEAIAMAAACUAQAgKgAAoQEAICsAAKYBACABAAAAlAEAIAEAAACcAQAgBQYAAPMJACAwAAD0CQAgMQAA9wkAIDIAAPYJACAzAAD1CQAgDf0DAADoBgAw_gMAAK8BABD_AwAA6AYAMIAEAgCMBgAhhAQBAI0GACGXBAEAjQYAIaQEQACdBgAhpQRAAJ0GACG_BAEAjQYAIZkFAQCNBgAhmgUBAI0GACGbBQEAjQYAIZwFIACcBgAhAwAAAJwBACABAACuAQAwLwAArwEAIAMAAACcAQAgAQAAnQEAMAIAAJQBACABAAAAmAEAIAEAAACYAQAgAwAAAJYBACABAACXAQAwAgAAmAEAIAMAAACWAQAgAQAAlwEAMAIAAJgBACADAAAAlgEAIAEAAJcBADACAACYAQAgB1YAAPIJACCABAIAAAABpARAAAAAAaUEQAAAAAHABAEAAAABlwUCAAAAAZgFCAAAAAEBIwAAtwEAIAaABAIAAAABpARAAAAAAaUEQAAAAAHABAEAAAABlwUCAAAAAZgFCAAAAAEBIwAAuQEAMAEjAAC5AQAwB1YAAPEJACCABAIAoAcAIaQEQACzBwAhpQRAALMHACHABAEAngcAIZcFAgCgBwAhmAUIAMcJACECAAAAmAEAICMAALwBACAGgAQCAKAHACGkBEAAswcAIaUEQACzBwAhwAQBAJ4HACGXBQIAoAcAIZgFCADHCQAhAgAAAJYBACAjAAC-AQAgAgAAAJYBACAjAAC-AQAgAwAAAJgBACAqAAC3AQAgKwAAvAEAIAEAAACYAQAgAQAAAJYBACAFBgAA7AkAIDAAAO0JACAxAADwCQAgMgAA7wkAIDMAAO4JACAJ_QMAAOcGADD-AwAAxQEAEP8DAADnBgAwgAQCAIwGACGkBEAAnQYAIaUEQACdBgAhwAQBAI0GACGXBQIAjAYAIZgFCADOBgAhAwAAAJYBACABAADEAQAwLwAAxQEAIAMAAACWAQAgAQAAlwEAMAIAAJgBACAN_QMAAOUGADD-AwAAywEAEP8DAADlBgAwgAQCAAAAAZcEAQC5BgAhpARAALoGACG_BAEAuQYAIe8EAQC5BgAhkgUBALkGACGTBQEAxQYAIZQFQAC6BgAhlQUCALgGACGWBQAA5gYAIAEAAADIAQAgAQAAAMgBACAM_QMAAOUGADD-AwAAywEAEP8DAADlBgAwgAQCALgGACGXBAEAuQYAIaQEQAC6BgAhvwQBALkGACHvBAEAuQYAIZIFAQC5BgAhkwUBAMUGACGUBUAAugYAIZUFAgC4BgAhAZMFAACYBwAgAwAAAMsBACABAADMAQAwAgAAyAEAIAMAAADLAQAgAQAAzAEAMAIAAMgBACADAAAAywEAIAEAAMwBADACAADIAQAgCYAEAgAAAAGXBAEAAAABpARAAAAAAb8EAQAAAAHvBAEAAAABkgUBAAAAAZMFAQAAAAGUBUAAAAABlQUCAAAAAQEjAADQAQAgCYAEAgAAAAGXBAEAAAABpARAAAAAAb8EAQAAAAHvBAEAAAABkgUBAAAAAZMFAQAAAAGUBUAAAAABlQUCAAAAAQEjAADSAQAwASMAANIBADAJgAQCAKAHACGXBAEAngcAIaQEQACzBwAhvwQBAJ4HACHvBAEAngcAIZIFAQCeBwAhkwUBAJ8HACGUBUAAswcAIZUFAgCgBwAhAgAAAMgBACAjAADVAQAgCYAEAgCgBwAhlwQBAJ4HACGkBEAAswcAIb8EAQCeBwAh7wQBAJ4HACGSBQEAngcAIZMFAQCfBwAhlAVAALMHACGVBQIAoAcAIQIAAADLAQAgIwAA1wEAIAIAAADLAQAgIwAA1wEAIAMAAADIAQAgKgAA0AEAICsAANUBACABAAAAyAEAIAEAAADLAQAgBgYAAOcJACAwAADoCQAgMQAA6wkAIDIAAOoJACAzAADpCQAgkwUAAJgHACAM_QMAAOQGADD-AwAA3gEAEP8DAADkBgAwgAQCAIwGACGXBAEAjQYAIaQEQACdBgAhvwQBAI0GACHvBAEAjQYAIZIFAQCNBgAhkwUBAI4GACGUBUAAnQYAIZUFAgCMBgAhAwAAAMsBACABAADdAQAwLwAA3gEAIAMAAADLAQAgAQAAzAEAMAIAAMgBACAN_QMAAOMGADD-AwAA5AEAEP8DAADjBgAwgAQCAAAAAaQEQAC6BgAhwAQBALkGACGLBQEAuQYAIYwFCADRBgAhjQUIANEGACGOBQEAuQYAIY8FAQC5BgAhkAUIANEGACGRBQgA0QYAIQEAAADhAQAgAQAAAOEBACAN_QMAAOMGADD-AwAA5AEAEP8DAADjBgAwgAQCALgGACGkBEAAugYAIcAEAQC5BgAhiwUBALkGACGMBQgA0QYAIY0FCADRBgAhjgUBALkGACGPBQEAuQYAIZAFCADRBgAhkQUIANEGACEAAwAAAOQBACABAADlAQAwAgAA4QEAIAMAAADkAQAgAQAA5QEAMAIAAOEBACADAAAA5AEAIAEAAOUBADACAADhAQAgCoAEAgAAAAGkBEAAAAABwAQBAAAAAYsFAQAAAAGMBQgAAAABjQUIAAAAAY4FAQAAAAGPBQEAAAABkAUIAAAAAZEFCAAAAAEBIwAA6QEAIAqABAIAAAABpARAAAAAAcAEAQAAAAGLBQEAAAABjAUIAAAAAY0FCAAAAAGOBQEAAAABjwUBAAAAAZAFCAAAAAGRBQgAAAABASMAAOsBADABIwAA6wEAMAqABAIAoAcAIaQEQACzBwAhwAQBAJ4HACGLBQEAngcAIYwFCADHCQAhjQUIAMcJACGOBQEAngcAIY8FAQCeBwAhkAUIAMcJACGRBQgAxwkAIQIAAADhAQAgIwAA7gEAIAqABAIAoAcAIaQEQACzBwAhwAQBAJ4HACGLBQEAngcAIYwFCADHCQAhjQUIAMcJACGOBQEAngcAIY8FAQCeBwAhkAUIAMcJACGRBQgAxwkAIQIAAADkAQAgIwAA8AEAIAIAAADkAQAgIwAA8AEAIAMAAADhAQAgKgAA6QEAICsAAO4BACABAAAA4QEAIAEAAADkAQAgBQYAAOIJACAwAADjCQAgMQAA5gkAIDIAAOUJACAzAADkCQAgDf0DAADiBgAw_gMAAPcBABD_AwAA4gYAMIAEAgCMBgAhpARAAJ0GACHABAEAjQYAIYsFAQCNBgAhjAUIAM4GACGNBQgAzgYAIY4FAQCNBgAhjwUBAI0GACGQBQgAzgYAIZEFCADOBgAhAwAAAOQBACABAAD2AQAwLwAA9wEAIAMAAADkAQAgAQAA5QEAMAIAAOEBACAc_QMAAOEGADD-AwAA_QEAEP8DAADhBgAwgAQCAAAAAYEEAQAAAAGEBAEAuQYAIZsEAQC5BgAhpARAALoGACGlBEAAugYAIfcEBADeBgAh-AQEAN4GACH5BAIAuAYAIfoEAgC4BgAh_AQBALkGACH9BAEAuQYAIf4EAQC5BgAh_wQEAN4GACGABQQA3gYAIYEFAgC4BgAhggUIANEGACGDBQQA3gYAIYQFBADeBgAhhQUIANEGACGGBQgA0QYAIYcFCADRBgAhiAUEAN4GACGJBQQA3gYAIYoFQAC6BgAhAQAAAPoBACABAAAA-gEAIBz9AwAA4QYAMP4DAAD9AQAQ_wMAAOEGADCABAIAuAYAIYEEAQC5BgAhhAQBALkGACGbBAEAuQYAIaQEQAC6BgAhpQRAALoGACH3BAQA3gYAIfgEBADeBgAh-QQCALgGACH6BAIAuAYAIfwEAQC5BgAh_QQBALkGACH-BAEAuQYAIf8EBADeBgAhgAUEAN4GACGBBQIAuAYAIYIFCADRBgAhgwUEAN4GACGEBQQA3gYAIYUFCADRBgAhhgUIANEGACGHBQgA0QYAIYgFBADeBgAhiQUEAN4GACGKBUAAugYAIQADAAAA_QEAIAEAAP4BADACAAD6AQAgAwAAAP0BACABAAD-AQAwAgAA-gEAIAMAAAD9AQAgAQAA_gEAMAIAAPoBACAZgAQCAAAAAYEEAQAAAAGEBAEAAAABmwQBAAAAAaQEQAAAAAGlBEAAAAAB9wQEAAAAAfgEBAAAAAH5BAIAAAAB-gQCAAAAAfwEAQAAAAH9BAEAAAAB_gQBAAAAAf8EBAAAAAGABQQAAAABgQUCAAAAAYIFCAAAAAGDBQQAAAABhAUEAAAAAYUFCAAAAAGGBQgAAAABhwUIAAAAAYgFBAAAAAGJBQQAAAABigVAAAAAAQEjAACCAgAgGYAEAgAAAAGBBAEAAAABhAQBAAAAAZsEAQAAAAGkBEAAAAABpQRAAAAAAfcEBAAAAAH4BAQAAAAB-QQCAAAAAfoEAgAAAAH8BAEAAAAB_QQBAAAAAf4EAQAAAAH_BAQAAAABgAUEAAAAAYEFAgAAAAGCBQgAAAABgwUEAAAAAYQFBAAAAAGFBQgAAAABhgUIAAAAAYcFCAAAAAGIBQQAAAABiQUEAAAAAYoFQAAAAAEBIwAAhAIAMAEjAACEAgAwGYAEAgCgBwAhgQQBAJ4HACGEBAEAngcAIZsEAQCeBwAhpARAALMHACGlBEAAswcAIfcEBADcCQAh-AQEANwJACH5BAIAoAcAIfoEAgCgBwAh_AQBAJ4HACH9BAEAngcAIf4EAQCeBwAh_wQEANwJACGABQQA3AkAIYEFAgCgBwAhggUIAMcJACGDBQQA3AkAIYQFBADcCQAhhQUIAMcJACGGBQgAxwkAIYcFCADHCQAhiAUEANwJACGJBQQA3AkAIYoFQACzBwAhAgAAAPoBACAjAACHAgAgGYAEAgCgBwAhgQQBAJ4HACGEBAEAngcAIZsEAQCeBwAhpARAALMHACGlBEAAswcAIfcEBADcCQAh-AQEANwJACH5BAIAoAcAIfoEAgCgBwAh_AQBAJ4HACH9BAEAngcAIf4EAQCeBwAh_wQEANwJACGABQQA3AkAIYEFAgCgBwAhggUIAMcJACGDBQQA3AkAIYQFBADcCQAhhQUIAMcJACGGBQgAxwkAIYcFCADHCQAhiAUEANwJACGJBQQA3AkAIYoFQACzBwAhAgAAAP0BACAjAACJAgAgAgAAAP0BACAjAACJAgAgAwAAAPoBACAqAACCAgAgKwAAhwIAIAEAAAD6AQAgAQAAAP0BACAFBgAA3QkAIDAAAN4JACAxAADhCQAgMgAA4AkAIDMAAN8JACAc_QMAAOAGADD-AwAAkAIAEP8DAADgBgAwgAQCAIwGACGBBAEAjQYAIYQEAQCNBgAhmwQBAI0GACGkBEAAnQYAIaUEQACdBgAh9wQEANoGACH4BAQA2gYAIfkEAgCMBgAh-gQCAIwGACH8BAEAjQYAIf0EAQCNBgAh_gQBAI0GACH_BAQA2gYAIYAFBADaBgAhgQUCAIwGACGCBQgAzgYAIYMFBADaBgAhhAUEANoGACGFBQgAzgYAIYYFCADOBgAhhwUIAM4GACGIBQQA2gYAIYkFBADaBgAhigVAAJ0GACEDAAAA_QEAIAEAAI8CADAvAACQAgAgAwAAAP0BACABAAD-AQAwAgAA-gEAIBD9AwAA3QYAMP4DAACWAgAQ_wMAAN0GADCABAIAAAABgQQBALkGACGkBEAAugYAIcAEQAC6BgAh8wQIANEGACH0BAQA3gYAIfUECADRBgAh9gQEAN4GACH3BAQA3gYAIfgEBADeBgAh-QQCALgGACH6BAIAuAYAIfsEAADfBgAgAQAAAJMCACABAAAAkwIAIA_9AwAA3QYAMP4DAACWAgAQ_wMAAN0GADCABAIAuAYAIYEEAQC5BgAhpARAALoGACHABEAAugYAIfMECADRBgAh9AQEAN4GACH1BAgA0QYAIfYEBADeBgAh9wQEAN4GACH4BAQA3gYAIfkEAgC4BgAh-gQCALgGACEAAwAAAJYCACABAACXAgAwAgAAkwIAIAMAAACWAgAgAQAAlwIAMAIAAJMCACADAAAAlgIAIAEAAJcCADACAACTAgAgDIAEAgAAAAGBBAEAAAABpARAAAAAAcAEQAAAAAHzBAgAAAAB9AQEAAAAAfUECAAAAAH2BAQAAAAB9wQEAAAAAfgEBAAAAAH5BAIAAAAB-gQCAAAAAQEjAACbAgAgDIAEAgAAAAGBBAEAAAABpARAAAAAAcAEQAAAAAHzBAgAAAAB9AQEAAAAAfUECAAAAAH2BAQAAAAB9wQEAAAAAfgEBAAAAAH5BAIAAAAB-gQCAAAAAQEjAACdAgAwASMAAJ0CADAMgAQCAKAHACGBBAEAngcAIaQEQACzBwAhwARAALMHACHzBAgAxwkAIfQEBADcCQAh9QQIAMcJACH2BAQA3AkAIfcEBADcCQAh-AQEANwJACH5BAIAoAcAIfoEAgCgBwAhAgAAAJMCACAjAACgAgAgDIAEAgCgBwAhgQQBAJ4HACGkBEAAswcAIcAEQACzBwAh8wQIAMcJACH0BAQA3AkAIfUECADHCQAh9gQEANwJACH3BAQA3AkAIfgEBADcCQAh-QQCAKAHACH6BAIAoAcAIQIAAACWAgAgIwAAogIAIAIAAACWAgAgIwAAogIAIAMAAACTAgAgKgAAmwIAICsAAKACACABAAAAkwIAIAEAAACWAgAgBQYAANcJACAwAADYCQAgMQAA2wkAIDIAANoJACAzAADZCQAgD_0DAADZBgAw_gMAAKkCABD_AwAA2QYAMIAEAgCMBgAhgQQBAI0GACGkBEAAnQYAIcAEQACdBgAh8wQIAM4GACH0BAQA2gYAIfUECADOBgAh9gQEANoGACH3BAQA2gYAIfgEBADaBgAh-QQCAIwGACH6BAIAjAYAIQMAAACWAgAgAQAAqAIAMC8AAKkCACADAAAAlgIAIAEAAJcCADACAACTAgAgDP0DAADYBgAw_gMAAK8CABD_AwAA2AYAMIAEAgAAAAGEBAEAAAABmwQBALkGACGkBEAAugYAIaUEQAC6BgAh7wQBALkGACHwBAIAuAYAIfEEAQC5BgAh8gRAALoGACEBAAAArAIAIAEAAACsAgAgDP0DAADYBgAw_gMAAK8CABD_AwAA2AYAMIAEAgC4BgAhhAQBALkGACGbBAEAuQYAIaQEQAC6BgAhpQRAALoGACHvBAEAuQYAIfAEAgC4BgAh8QQBALkGACHyBEAAugYAIQADAAAArwIAIAEAALACADACAACsAgAgAwAAAK8CACABAACwAgAwAgAArAIAIAMAAACvAgAgAQAAsAIAMAIAAKwCACAJgAQCAAAAAYQEAQAAAAGbBAEAAAABpARAAAAAAaUEQAAAAAHvBAEAAAAB8AQCAAAAAfEEAQAAAAHyBEAAAAABASMAALQCACAJgAQCAAAAAYQEAQAAAAGbBAEAAAABpARAAAAAAaUEQAAAAAHvBAEAAAAB8AQCAAAAAfEEAQAAAAHyBEAAAAABASMAALYCADABIwAAtgIAMAmABAIAoAcAIYQEAQCeBwAhmwQBAJ4HACGkBEAAswcAIaUEQACzBwAh7wQBAJ4HACHwBAIAoAcAIfEEAQCeBwAh8gRAALMHACECAAAArAIAICMAALkCACAJgAQCAKAHACGEBAEAngcAIZsEAQCeBwAhpARAALMHACGlBEAAswcAIe8EAQCeBwAh8AQCAKAHACHxBAEAngcAIfIEQACzBwAhAgAAAK8CACAjAAC7AgAgAgAAAK8CACAjAAC7AgAgAwAAAKwCACAqAAC0AgAgKwAAuQIAIAEAAACsAgAgAQAAAK8CACAFBgAA0gkAIDAAANMJACAxAADWCQAgMgAA1QkAIDMAANQJACAM_QMAANcGADD-AwAAwgIAEP8DAADXBgAwgAQCAIwGACGEBAEAjQYAIZsEAQCNBgAhpARAAJ0GACGlBEAAnQYAIe8EAQCNBgAh8AQCAIwGACHxBAEAjQYAIfIEQACdBgAhAwAAAK8CACABAADBAgAwLwAAwgIAIAMAAACvAgAgAQAAsAIAMAIAAKwCACAI_QMAANYGADD-AwAAyAIAEP8DAADWBgAwgAQCAAAAAaQEQAC6BgAhpQRAALoGACHtBAEAAAAB7gQCALgGACEBAAAAxQIAIAEAAADFAgAgCP0DAADWBgAw_gMAAMgCABD_AwAA1gYAMIAEAgC4BgAhpARAALoGACGlBEAAugYAIe0EAQC5BgAh7gQCALgGACEAAwAAAMgCACABAADJAgAwAgAAxQIAIAMAAADIAgAgAQAAyQIAMAIAAMUCACADAAAAyAIAIAEAAMkCADACAADFAgAgBYAEAgAAAAGkBEAAAAABpQRAAAAAAe0EAQAAAAHuBAIAAAABASMAAM0CACAFgAQCAAAAAaQEQAAAAAGlBEAAAAAB7QQBAAAAAe4EAgAAAAEBIwAAzwIAMAEjAADPAgAwBYAEAgCgBwAhpARAALMHACGlBEAAswcAIe0EAQCeBwAh7gQCAKAHACECAAAAxQIAICMAANICACAFgAQCAKAHACGkBEAAswcAIaUEQACzBwAh7QQBAJ4HACHuBAIAoAcAIQIAAADIAgAgIwAA1AIAIAIAAADIAgAgIwAA1AIAIAMAAADFAgAgKgAAzQIAICsAANICACABAAAAxQIAIAEAAADIAgAgBQYAAM0JACAwAADOCQAgMQAA0QkAIDIAANAJACAzAADPCQAgCP0DAADVBgAw_gMAANsCABD_AwAA1QYAMIAEAgCMBgAhpARAAJ0GACGlBEAAnQYAIe0EAQCNBgAh7gQCAIwGACEDAAAAyAIAIAEAANoCADAvAADbAgAgAwAAAMgCACABAADJAgAwAgAAxQIAIAr9AwAA1AYAMP4DAADhAgAQ_wMAANQGADCABAIAAAABpARAALoGACGlBEAAugYAIekEAQAAAAHqBAEAxQYAIesEQAC6BgAh7AQAAL8GACABAAAA3gIAIAEAAADeAgAgCv0DAADUBgAw_gMAAOECABD_AwAA1AYAMIAEAgC4BgAhpARAALoGACGlBEAAugYAIekEAQC5BgAh6gQBAMUGACHrBEAAugYAIewEAAC_BgAgAuoEAACYBwAg7AQAAJgHACADAAAA4QIAIAEAAOICADACAADeAgAgAwAAAOECACABAADiAgAwAgAA3gIAIAMAAADhAgAgAQAA4gIAMAIAAN4CACAHgAQCAAAAAaQEQAAAAAGlBEAAAAAB6QQBAAAAAeoEAQAAAAHrBEAAAAAB7ASAAAAAAQEjAADmAgAgB4AEAgAAAAGkBEAAAAABpQRAAAAAAekEAQAAAAHqBAEAAAAB6wRAAAAAAewEgAAAAAEBIwAA6AIAMAEjAADoAgAwB4AEAgCgBwAhpARAALMHACGlBEAAswcAIekEAQCeBwAh6gQBAJ8HACHrBEAAswcAIewEgAAAAAECAAAA3gIAICMAAOsCACAHgAQCAKAHACGkBEAAswcAIaUEQACzBwAh6QQBAJ4HACHqBAEAnwcAIesEQACzBwAh7ASAAAAAAQIAAADhAgAgIwAA7QIAIAIAAADhAgAgIwAA7QIAIAMAAADeAgAgKgAA5gIAICsAAOsCACABAAAA3gIAIAEAAADhAgAgBwYAAMgJACAwAADJCQAgMQAAzAkAIDIAAMsJACAzAADKCQAg6gQAAJgHACDsBAAAmAcAIAr9AwAA0wYAMP4DAAD0AgAQ_wMAANMGADCABAIAjAYAIaQEQACdBgAhpQRAAJ0GACHpBAEAjQYAIeoEAQCOBgAh6wRAAJ0GACHsBAAAqgYAIAMAAADhAgAgAQAA8wIAMC8AAPQCACADAAAA4QIAIAEAAOICADACAADeAgAgC_0DAADQBgAw_gMAAPoCABD_AwAA0AYAMIAEAgAAAAGkBEAAugYAIb0EQAC6BgAhvwQBALkGACHlBAEAuQYAIeYEAQC5BgAh5wQIANEGACHoBAAA0gYAIAEAAAD3AgAgAQAAAPcCACAK_QMAANAGADD-AwAA-gIAEP8DAADQBgAwgAQCALgGACGkBEAAugYAIb0EQAC6BgAhvwQBALkGACHlBAEAuQYAIeYEAQC5BgAh5wQIANEGACEAAwAAAPoCACABAAD7AgAwAgAA9wIAIAMAAAD6AgAgAQAA-wIAMAIAAPcCACADAAAA-gIAIAEAAPsCADACAAD3AgAgB4AEAgAAAAGkBEAAAAABvQRAAAAAAb8EAQAAAAHlBAEAAAAB5gQBAAAAAecECAAAAAEBIwAA_wIAIAeABAIAAAABpARAAAAAAb0EQAAAAAG_BAEAAAAB5QQBAAAAAeYEAQAAAAHnBAgAAAABASMAAIEDADABIwAAgQMAMAeABAIAoAcAIaQEQACzBwAhvQRAALMHACG_BAEAngcAIeUEAQCeBwAh5gQBAJ4HACHnBAgAxwkAIQIAAAD3AgAgIwAAhAMAIAeABAIAoAcAIaQEQACzBwAhvQRAALMHACG_BAEAngcAIeUEAQCeBwAh5gQBAJ4HACHnBAgAxwkAIQIAAAD6AgAgIwAAhgMAIAIAAAD6AgAgIwAAhgMAIAMAAAD3AgAgKgAA_wIAICsAAIQDACABAAAA9wIAIAEAAAD6AgAgBQYAAMIJACAwAADDCQAgMQAAxgkAIDIAAMUJACAzAADECQAgCv0DAADNBgAw_gMAAI0DABD_AwAAzQYAMIAEAgCMBgAhpARAAJ0GACG9BEAAnQYAIb8EAQCNBgAh5QQBAI0GACHmBAEAjQYAIecECADOBgAhAwAAAPoCACABAACMAwAwLwAAjQMAIAMAAAD6AgAgAQAA-wIAMAIAAPcCACAJ_QMAAMwGADD-AwAAkwMAEP8DAADMBgAwgAQCAAAAAZAEAQC5BgAhmwQBALkGACGlBEAAugYAIeMEAQAAAAHkBAEAuQYAIQEAAACQAwAgAQAAAJADACAJ_QMAAMwGADD-AwAAkwMAEP8DAADMBgAwgAQCALgGACGQBAEAuQYAIZsEAQC5BgAhpQRAALoGACHjBAEAuQYAIeQEAQC5BgAhAAMAAACTAwAgAQAAlAMAMAIAAJADACADAAAAkwMAIAEAAJQDADACAACQAwAgAwAAAJMDACABAACUAwAwAgAAkAMAIAaABAIAAAABkAQBAAAAAZsEAQAAAAGlBEAAAAAB4wQBAAAAAeQEAQAAAAEBIwAAmAMAIAaABAIAAAABkAQBAAAAAZsEAQAAAAGlBEAAAAAB4wQBAAAAAeQEAQAAAAEBIwAAmgMAMAEjAACaAwAwBoAEAgCgBwAhkAQBAJ4HACGbBAEAngcAIaUEQACzBwAh4wQBAJ4HACHkBAEAngcAIQIAAACQAwAgIwAAnQMAIAaABAIAoAcAIZAEAQCeBwAhmwQBAJ4HACGlBEAAswcAIeMEAQCeBwAh5AQBAJ4HACECAAAAkwMAICMAAJ8DACACAAAAkwMAICMAAJ8DACADAAAAkAMAICoAAJgDACArAACdAwAgAQAAAJADACABAAAAkwMAIAUGAAC9CQAgMAAAvgkAIDEAAMEJACAyAADACQAgMwAAvwkAIAn9AwAAywYAMP4DAACmAwAQ_wMAAMsGADCABAIAjAYAIZAEAQCNBgAhmwQBAI0GACGlBEAAnQYAIeMEAQCNBgAh5AQBAI0GACEDAAAAkwMAIAEAAKUDADAvAACmAwAgAwAAAJMDACABAACUAwAwAgAAkAMAIAiMAgAAuwYAIP0DAAC3BgAw_gMAALsDABD_AwAAtwYAMIAEAgAAAAGEBAEAuQYAIaQEQAC6BgAh0QQBAAAAAQEAAACpAwAgF4gCAADIBgAgigIAAMkGACCLAgAAygYAIP0DAADEBgAw_gMAAKsDABD_AwAAxAYAMIAEAgC4BgAhhAQBALkGACGkBEAAugYAIdAEAQC5BgAh0QQBALkGACHSBAEAuQYAIdMEAQDFBgAh1AQCALgGACHVBAIAuAYAIdYEAgC4BgAh1wQCALgGACHYBAIAuAYAIdkEAgC4BgAh2gQCAMYGACHbBEAAwwYAIdwEIADHBgAh3QRAAMMGACEHiAIAALoJACCKAgAAuwkAIIsCAAC8CQAg0wQAAJgHACDaBAAAmAcAINsEAACYBwAg3QQAAJgHACAXiAIAAMgGACCKAgAAyQYAIIsCAADKBgAg_QMAAMQGADD-AwAAqwMAEP8DAADEBgAwgAQCAAAAAYQEAQC5BgAhpARAALoGACHQBAEAAAAB0QQBALkGACHSBAEAuQYAIdMEAQDFBgAh1AQCALgGACHVBAIAuAYAIdYEAgC4BgAh1wQCALgGACHYBAIAuAYAIdkEAgC4BgAh2gQCAMYGACHbBEAAwwYAIdwEIADHBgAh3QRAAMMGACEDAAAAqwMAIAEAAKwDADACAACtAwAgE4kCAADABgAg_QMAAMIGADD-AwAArwMAEP8DAADCBgAwgAQCALgGACGkBEAAugYAIb0EQAC6BgAhwwQCALgGACHFBAgAvgYAIcYECAC-BgAhxwQAAL8GACDIBAgAvgYAIckECAC-BgAhygQIAL4GACHLBAgAvgYAIcwECAC-BgAhzQQIAL4GACHOBAEAuQYAIc8EQADDBgAhC4kCAAC5CQAgxQQAAJgHACDGBAAAmAcAIMcEAACYBwAgyAQAAJgHACDJBAAAmAcAIMoEAACYBwAgywQAAJgHACDMBAAAmAcAIM0EAACYBwAgzwQAAJgHACAUiQIAAMAGACD9AwAAwgYAMP4DAACvAwAQ_wMAAMIGADCABAIAAAABpARAALoGACG9BEAAugYAIcMEAgC4BgAhxQQIAL4GACHGBAgAvgYAIccEAAC_BgAgyAQIAL4GACHJBAgAvgYAIcoECAC-BgAhywQIAL4GACHMBAgAvgYAIc0ECAC-BgAhzgQBALkGACHPBEAAwwYAIeIEAADBBgAgAwAAAK8DACABAACwAwAwAgAAsQMAIAuJAgAAwAYAIP0DAAC9BgAw_gMAALMDABD_AwAAvQYAMIAEAgC4BgAhpARAALoGACHDBAIAuAYAIcQEQAC6BgAhxQQIAL4GACHGBAgAvgYAIccEAAC_BgAgBIkCAAC5CQAgxQQAAJgHACDGBAAAmAcAIMcEAACYBwAgDIkCAADABgAg_QMAAL0GADD-AwAAswMAEP8DAAC9BgAwgAQCAAAAAaQEQAC6BgAhwwQCALgGACHEBEAAugYAIcUECAC-BgAhxgQIAL4GACHHBAAAvwYAIOEEAAC8BgAgAwAAALMDACABAAC0AwAwAgAAtQMAIAEAAACvAwAgAQAAALMDACABAAAAqwMAIAEAAACpAwAgCIwCAAC7BgAg_QMAALcGADD-AwAAuwMAEP8DAAC3BgAwgAQCALgGACGEBAEAuQYAIaQEQAC6BgAh0QQBALkGACEBjAIAALgJACADAAAAuwMAIAEAALwDADACAACpAwAgAwAAALsDACABAAC8AwAwAgAAqQMAIAMAAAC7AwAgAQAAvAMAMAIAAKkDACAFjAIAALcJACCABAIAAAABhAQBAAAAAaQEQAAAAAHRBAEAAAABASMAAMADACAEgAQCAAAAAYQEAQAAAAGkBEAAAAAB0QQBAAAAAQEjAADCAwAwASMAAMIDADAFjAIAAKoJACCABAIAoAcAIYQEAQCeBwAhpARAALMHACHRBAEAngcAIQIAAACpAwAgIwAAxQMAIASABAIAoAcAIYQEAQCeBwAhpARAALMHACHRBAEAngcAIQIAAAC7AwAgIwAAxwMAIAIAAAC7AwAgIwAAxwMAIAMAAACpAwAgKgAAwAMAICsAAMUDACABAAAAqQMAIAEAAAC7AwAgBQYAAKUJACAwAACmCQAgMQAAqQkAIDIAAKgJACAzAACnCQAgB_0DAAC2BgAw_gMAAM4DABD_AwAAtgYAMIAEAgCMBgAhhAQBAI0GACGkBEAAnQYAIdEEAQCNBgAhAwAAALsDACABAADNAwAwLwAAzgMAIAMAAAC7AwAgAQAAvAMAMAIAAKkDACABAAAArQMAIAEAAACtAwAgAwAAAKsDACABAACsAwAwAgAArQMAIAMAAACrAwAgAQAArAMAMAIAAK0DACADAAAAqwMAIAEAAKwDADACAACtAwAgFIgCAACiCQAgigIAAKMJACCLAgAApAkAIIAEAgAAAAGEBAEAAAABpARAAAAAAdAEAQAAAAHRBAEAAAAB0gQBAAAAAdMEAQAAAAHUBAIAAAAB1QQCAAAAAdYEAgAAAAHXBAIAAAAB2AQCAAAAAdkEAgAAAAHaBAIAAAAB2wRAAAAAAdwEIAAAAAHdBEAAAAABASMAANYDACARgAQCAAAAAYQEAQAAAAGkBEAAAAAB0AQBAAAAAdEEAQAAAAHSBAEAAAAB0wQBAAAAAdQEAgAAAAHVBAIAAAAB1gQCAAAAAdcEAgAAAAHYBAIAAAAB2QQCAAAAAdoEAgAAAAHbBEAAAAAB3AQgAAAAAd0EQAAAAAEBIwAA2AMAMAEjAADYAwAwFIgCAACHCQAgigIAAIgJACCLAgAAiQkAIIAEAgCgBwAhhAQBAJ4HACGkBEAAswcAIdAEAQCeBwAh0QQBAJ4HACHSBAEAngcAIdMEAQCfBwAh1AQCAKAHACHVBAIAoAcAIdYEAgCgBwAh1wQCAKAHACHYBAIAoAcAIdkEAgCgBwAh2gQCALQHACHbBEAAsQcAIdwEIACyBwAh3QRAALEHACECAAAArQMAICMAANsDACARgAQCAKAHACGEBAEAngcAIaQEQACzBwAh0AQBAJ4HACHRBAEAngcAIdIEAQCeBwAh0wQBAJ8HACHUBAIAoAcAIdUEAgCgBwAh1gQCAKAHACHXBAIAoAcAIdgEAgCgBwAh2QQCAKAHACHaBAIAtAcAIdsEQACxBwAh3AQgALIHACHdBEAAsQcAIQIAAACrAwAgIwAA3QMAIAIAAACrAwAgIwAA3QMAIAMAAACtAwAgKgAA1gMAICsAANsDACABAAAArQMAIAEAAACrAwAgCQYAAIIJACAwAACDCQAgMQAAhgkAIDIAAIUJACAzAACECQAg0wQAAJgHACDaBAAAmAcAINsEAACYBwAg3QQAAJgHACAU_QMAALUGADD-AwAA5AMAEP8DAAC1BgAwgAQCAIwGACGEBAEAjQYAIaQEQACdBgAh0AQBAI0GACHRBAEAjQYAIdIEAQCNBgAh0wQBAI4GACHUBAIAjAYAIdUEAgCMBgAh1gQCAIwGACHXBAIAjAYAIdgEAgCMBgAh2QQCAIwGACHaBAIAmQYAIdsEQACaBgAh3AQgAJwGACHdBEAAmgYAIQMAAACrAwAgAQAA4wMAMC8AAOQDACADAAAAqwMAIAEAAKwDADACAACtAwAgAQAAALEDACABAAAAsQMAIAMAAACvAwAgAQAAsAMAMAIAALEDACADAAAArwMAIAEAALADADACAACxAwAgAwAAAK8DACABAACwAwAwAgAAsQMAIBCJAgAAgQkAIIAEAgAAAAGkBEAAAAABvQRAAAAAAcMEAgAAAAHFBAgAAAABxgQIAAAAAccEgAAAAAHIBAgAAAAByQQIAAAAAcoECAAAAAHLBAgAAAABzAQIAAAAAc0ECAAAAAHOBAEAAAABzwRAAAAAAQEjAADsAwAgD4AEAgAAAAGkBEAAAAABvQRAAAAAAcMEAgAAAAHFBAgAAAABxgQIAAAAAccEgAAAAAHIBAgAAAAByQQIAAAAAcoECAAAAAHLBAgAAAABzAQIAAAAAc0ECAAAAAHOBAEAAAABzwRAAAAAAQEjAADuAwAwASMAAO4DADAQiQIAAIAJACCABAIAoAcAIaQEQACzBwAhvQRAALMHACHDBAIAoAcAIcUECAD4CAAhxgQIAPgIACHHBIAAAAAByAQIAPgIACHJBAgA-AgAIcoECAD4CAAhywQIAPgIACHMBAgA-AgAIc0ECAD4CAAhzgQBAJ4HACHPBEAAsQcAIQIAAACxAwAgIwAA8QMAIA-ABAIAoAcAIaQEQACzBwAhvQRAALMHACHDBAIAoAcAIcUECAD4CAAhxgQIAPgIACHHBIAAAAAByAQIAPgIACHJBAgA-AgAIcoECAD4CAAhywQIAPgIACHMBAgA-AgAIc0ECAD4CAAhzgQBAJ4HACHPBEAAsQcAIQIAAACvAwAgIwAA8wMAIAIAAACvAwAgIwAA8wMAIAMAAACxAwAgKgAA7AMAICsAAPEDACABAAAAsQMAIAEAAACvAwAgDwYAAPsIACAwAAD8CAAgMQAA_wgAIDIAAP4IACAzAAD9CAAgxQQAAJgHACDGBAAAmAcAIMcEAACYBwAgyAQAAJgHACDJBAAAmAcAIMoEAACYBwAgywQAAJgHACDMBAAAmAcAIM0EAACYBwAgzwQAAJgHACAS_QMAALQGADD-AwAA-gMAEP8DAAC0BgAwgAQCAIwGACGkBEAAnQYAIb0EQACdBgAhwwQCAIwGACHFBAgAsgYAIcYECACyBgAhxwQAAKoGACDIBAgAsgYAIckECACyBgAhygQIALIGACHLBAgAsgYAIcwECACyBgAhzQQIALIGACHOBAEAjQYAIc8EQACaBgAhAwAAAK8DACABAAD5AwAwLwAA-gMAIAMAAACvAwAgAQAAsAMAMAIAALEDACABAAAAtQMAIAEAAAC1AwAgAwAAALMDACABAAC0AwAwAgAAtQMAIAMAAACzAwAgAQAAtAMAMAIAALUDACADAAAAswMAIAEAALQDADACAAC1AwAgCIkCAAD6CAAggAQCAAAAAaQEQAAAAAHDBAIAAAABxARAAAAAAcUECAAAAAHGBAgAAAABxwSAAAAAAQEjAACCBAAgB4AEAgAAAAGkBEAAAAABwwQCAAAAAcQEQAAAAAHFBAgAAAABxgQIAAAAAccEgAAAAAEBIwAAhAQAMAEjAACEBAAwCIkCAAD5CAAggAQCAKAHACGkBEAAswcAIcMEAgCgBwAhxARAALMHACHFBAgA-AgAIcYECAD4CAAhxwSAAAAAAQIAAAC1AwAgIwAAhwQAIAeABAIAoAcAIaQEQACzBwAhwwQCAKAHACHEBEAAswcAIcUECAD4CAAhxgQIAPgIACHHBIAAAAABAgAAALMDACAjAACJBAAgAgAAALMDACAjAACJBAAgAwAAALUDACAqAACCBAAgKwAAhwQAIAEAAAC1AwAgAQAAALMDACAIBgAA8wgAIDAAAPQIACAxAAD3CAAgMgAA9ggAIDMAAPUIACDFBAAAmAcAIMYEAACYBwAgxwQAAJgHACAK_QMAALEGADD-AwAAkAQAEP8DAACxBgAwgAQCAIwGACGkBEAAnQYAIcMEAgCMBgAhxARAAJ0GACHFBAgAsgYAIcYECACyBgAhxwQAAKoGACADAAAAswMAIAEAAI8EADAvAACQBAAgAwAAALMDACABAAC0AwAwAgAAtQMAIAEAAAAFACABAAAABQAgAwAAAAMAIAEAAAQAMAIAAAUAIAMAAAADACABAAAEADACAAAFACADAAAAAwAgAQAABAAwAgAABQAgDgMAAPEIACAFAADyCAAggAQCAAAAAYQEAQAAAAGQBAIAAAABoAQCAAAAAaEEIAAAAAGkBEAAAAABpQRAAAAAAbUEAQAAAAG6BAEAAAABwAQBAAAAAcEEAgAAAAHCBAEAAAABASMAAJgEACAMgAQCAAAAAYQEAQAAAAGQBAIAAAABoAQCAAAAAaEEIAAAAAGkBEAAAAABpQRAAAAAAbUEAQAAAAG6BAEAAAABwAQBAAAAAcEEAgAAAAHCBAEAAAABASMAAJoEADABIwAAmgQAMA4DAADjCAAgBQAA5AgAIIAEAgCgBwAhhAQBAJ4HACGQBAIAoAcAIaAEAgCgBwAhoQQgALIHACGkBEAAswcAIaUEQACzBwAhtQQBAJ4HACG6BAEAngcAIcAEAQCeBwAhwQQCAKAHACHCBAEAngcAIQIAAAAFACAjAACdBAAgDIAEAgCgBwAhhAQBAJ4HACGQBAIAoAcAIaAEAgCgBwAhoQQgALIHACGkBEAAswcAIaUEQACzBwAhtQQBAJ4HACG6BAEAngcAIcAEAQCeBwAhwQQCAKAHACHCBAEAngcAIQIAAAADACAjAACfBAAgAgAAAAMAICMAAJ8EACADAAAABQAgKgAAmAQAICsAAJ0EACABAAAABQAgAQAAAAMAIAUGAADeCAAgMAAA3wgAIDEAAOIIACAyAADhCAAgMwAA4AgAIA_9AwAAsAYAMP4DAACmBAAQ_wMAALAGADCABAIAjAYAIYQEAQCNBgAhkAQCAIwGACGgBAIAjAYAIaEEIACcBgAhpARAAJ0GACGlBEAAnQYAIbUEAQCNBgAhugQBAI0GACHABAEAjQYAIcEEAgCMBgAhwgQBAI0GACEDAAAAAwAgAQAApQQAMC8AAKYEACADAAAAAwAgAQAABAAwAgAABQAgAQAAAAkAIAEAAAAJACADAAAABwAgAQAACAAwAgAACQAgAwAAAAcAIAEAAAgAMAIAAAkAIAMAAAAHACABAAAIADACAAAJACAKAwAA3QgAIAQAANwIACCABAIAAAABkAQCAAAAAaQEQAAAAAG6BAEAAAABvAQCAAAAAb0EAQAAAAG-BAIAAAABvwQBAAAAAQEjAACuBAAgCIAEAgAAAAGQBAIAAAABpARAAAAAAboEAQAAAAG8BAIAAAABvQQBAAAAAb4EAgAAAAG_BAEAAAABASMAALAEADABIwAAsAQAMAoDAADbCAAgBAAA2ggAIIAEAgCgBwAhkAQCAKAHACGkBEAAswcAIboEAQCeBwAhvAQCAKAHACG9BAEAngcAIb4EAgCgBwAhvwQBAJ4HACECAAAACQAgIwAAswQAIAiABAIAoAcAIZAEAgCgBwAhpARAALMHACG6BAEAngcAIbwEAgCgBwAhvQQBAJ4HACG-BAIAoAcAIb8EAQCeBwAhAgAAAAcAICMAALUEACACAAAABwAgIwAAtQQAIAMAAAAJACAqAACuBAAgKwAAswQAIAEAAAAJACABAAAABwAgBQYAANUIACAwAADWCAAgMQAA2QgAIDIAANgIACAzAADXCAAgC_0DAACvBgAw_gMAALwEABD_AwAArwYAMIAEAgCMBgAhkAQCAIwGACGkBEAAnQYAIboEAQCNBgAhvAQCAIwGACG9BAEAjQYAIb4EAgCMBgAhvwQBAI0GACEDAAAABwAgAQAAuwQAMC8AALwEACADAAAABwAgAQAACAAwAgAACQAgAQAAAA8AIAEAAAAPACADAAAADQAgAQAADgAwAgAADwAgAwAAAA0AIAEAAA4AMAIAAA8AIAMAAAANACABAAAOADACAAAPACAKAwAA0wgAIAoAANQIACCABAIAAAABkAQCAAAAAZcEAQAAAAGhBCAAAAABpARAAAAAAaUEQAAAAAG3BAEAAAABugQBAAAAAQEjAADEBAAgCIAEAgAAAAGQBAIAAAABlwQBAAAAAaEEIAAAAAGkBEAAAAABpQRAAAAAAbcEAQAAAAG6BAEAAAABASMAAMYEADABIwAAxgQAMAoDAADFCAAgCgAAxggAIIAEAgCgBwAhkAQCAKAHACGXBAEAngcAIaEEIACyBwAhpARAALMHACGlBEAAswcAIbcEAQCeBwAhugQBAJ4HACECAAAADwAgIwAAyQQAIAiABAIAoAcAIZAEAgCgBwAhlwQBAJ4HACGhBCAAsgcAIaQEQACzBwAhpQRAALMHACG3BAEAngcAIboEAQCeBwAhAgAAAA0AICMAAMsEACACAAAADQAgIwAAywQAIAMAAAAPACAqAADEBAAgKwAAyQQAIAEAAAAPACABAAAADQAgBQYAAMAIACAwAADBCAAgMQAAxAgAIDIAAMMIACAzAADCCAAgC_0DAACuBgAw_gMAANIEABD_AwAArgYAMIAEAgCMBgAhkAQCAIwGACGXBAEAjQYAIaEEIACcBgAhpARAAJ0GACGlBEAAnQYAIbcEAQCNBgAhugQBAI0GACEDAAAADQAgAQAA0QQAMC8AANIEACADAAAADQAgAQAADgAwAgAADwAgAQAAABMAIAEAAAATACADAAAAEQAgAQAAEgAwAgAAEwAgAwAAABEAIAEAABIAMAIAABMAIAMAAAARACABAAASADACAAATACAKCQAAvwgAIIAEAgAAAAGXBAEAAAABnARAAAAAAaAEAgAAAAGkBEAAAAABpQRAAAAAAbkEAgAAAAG6BAEAAAABuwQgAAAAAQEjAADaBAAgCYAEAgAAAAGXBAEAAAABnARAAAAAAaAEAgAAAAGkBEAAAAABpQRAAAAAAbkEAgAAAAG6BAEAAAABuwQgAAAAAQEjAADcBAAwASMAANwEADAKCQAAvggAIIAEAgCgBwAhlwQBAJ4HACGcBEAAsQcAIaAEAgCgBwAhpARAALMHACGlBEAAswcAIbkEAgCgBwAhugQBAJ4HACG7BCAAsgcAIQIAAAATACAjAADfBAAgCYAEAgCgBwAhlwQBAJ4HACGcBEAAsQcAIaAEAgCgBwAhpARAALMHACGlBEAAswcAIbkEAgCgBwAhugQBAJ4HACG7BCAAsgcAIQIAAAARACAjAADhBAAgAgAAABEAICMAAOEEACADAAAAEwAgKgAA2gQAICsAAN8EACABAAAAEwAgAQAAABEAIAYGAAC5CAAgMAAAuggAIDEAAL0IACAyAAC8CAAgMwAAuwgAIJwEAACYBwAgDP0DAACtBgAw_gMAAOgEABD_AwAArQYAMIAEAgCMBgAhlwQBAI0GACGcBEAAmgYAIaAEAgCMBgAhpARAAJ0GACGlBEAAnQYAIbkEAgCMBgAhugQBAI0GACG7BCAAnAYAIQMAAAARACABAADnBAAwLwAA6AQAIAMAAAARACABAAASADACAAATACABAAAAGAAgAQAAABgAIAMAAAAWACABAAAXADACAAAYACADAAAAFgAgAQAAFwAwAgAAGAAgAwAAABYAIAEAABcAMAIAABgAIAkDAAC4CAAgCoAAAAABgAQCAAAAAYQEAQAAAAGQBAIAAAABpARAAAAAAaUEQAAAAAG3BAEAAAABuAQgAAAAAQEjAADwBAAgCAqAAAAAAYAEAgAAAAGEBAEAAAABkAQCAAAAAaQEQAAAAAGlBEAAAAABtwQBAAAAAbgEIAAAAAEBIwAA8gQAMAEjAADyBAAwAQAAABoAIAkDAAC3CAAgCoAAAAABgAQCAKAHACGEBAEAngcAIZAEAgC0BwAhpARAALMHACGlBEAAswcAIbcEAQCeBwAhuAQgALIHACECAAAAGAAgIwAA9gQAIAgKgAAAAAGABAIAoAcAIYQEAQCeBwAhkAQCALQHACGkBEAAswcAIaUEQACzBwAhtwQBAJ4HACG4BCAAsgcAIQIAAAAWACAjAAD4BAAgAgAAABYAICMAAPgEACABAAAAGgAgAwAAABgAICoAAPAEACArAAD2BAAgAQAAABgAIAEAAAAWACAGBgAAsggAIDAAALMIACAxAAC2CAAgMgAAtQgAIDMAALQIACCQBAAAmAcAIAsKAACbBgAg_QMAAKwGADD-AwAAgAUAEP8DAACsBgAwgAQCAIwGACGEBAEAjQYAIZAEAgCZBgAhpARAAJ0GACGlBEAAnQYAIbcEAQCNBgAhuAQgAJwGACEDAAAAFgAgAQAA_wQAMC8AAIAFACADAAAAFgAgAQAAFwAwAgAAGAAgAQAAAB4AIAEAAAAeACADAAAAHAAgAQAAHQAwAgAAHgAgAwAAABwAIAEAAB0AMAIAAB4AIAMAAAAcACABAAAdADACAAAeACARDQAArggAIA8AAK8IACAXAACxCAAgGAAAsAgAIIAEAgAAAAGBBAEAAAABhAQBAAAAAaEEIAAAAAGkBEAAAAABpQRAAAAAAbAEAQAAAAGxBAIAAAABsgQgAAAAAbMEgAAAAAG0BIAAAAABtQQBAAAAAbYEAQAAAAEBIwAAiAUAIA2ABAIAAAABgQQBAAAAAYQEAQAAAAGhBCAAAAABpARAAAAAAaUEQAAAAAGwBAEAAAABsQQCAAAAAbIEIAAAAAGzBIAAAAABtASAAAAAAbUEAQAAAAG2BAEAAAABASMAAIoFADABIwAAigUAMBENAACJCAAgDwAAiggAIBcAAIwIACAYAACLCAAggAQCAKAHACGBBAEAngcAIYQEAQCeBwAhoQQgALIHACGkBEAAswcAIaUEQACzBwAhsAQBAJ4HACGxBAIAoAcAIbIEIACyBwAhswSAAAAAAbQEgAAAAAG1BAEAnwcAIbYEAQCeBwAhAgAAAB4AICMAAI0FACANgAQCAKAHACGBBAEAngcAIYQEAQCeBwAhoQQgALIHACGkBEAAswcAIaUEQACzBwAhsAQBAJ4HACGxBAIAoAcAIbIEIACyBwAhswSAAAAAAbQEgAAAAAG1BAEAnwcAIbYEAQCeBwAhAgAAABwAICMAAI8FACACAAAAHAAgIwAAjwUAIAMAAAAeACAqAACIBQAgKwAAjQUAIAEAAAAeACABAAAAHAAgBwYAAIQIACAwAACFCAAgMQAAiAgAIDIAAIcIACAzAACGCAAgtAQAAJgHACC1BAAAmAcAIBD9AwAAqQYAMP4DAACWBQAQ_wMAAKkGADCABAIAjAYAIYEEAQCNBgAhhAQBAI0GACGhBCAAnAYAIaQEQACdBgAhpQRAAJ0GACGwBAEAjQYAIbEEAgCMBgAhsgQgAJwGACGzBAAAmwYAILQEAACqBgAgtQQBAI4GACG2BAEAjQYAIQMAAAAcACABAACVBQAwLwAAlgUAIAMAAAAcACABAAAdADACAAAeACABAAAAIgAgAQAAACIAIAMAAAAgACABAAAhADACAAAiACADAAAAIAAgAQAAIQAwAgAAIgAgAwAAACAAIAEAACEAMAIAACIAIAkDAACDCAAgDgAAgggAIIAEAgAAAAGBBAEAAAABkAQCAAAAAZEEAQAAAAGUBAIAAAABpARAAAAAAa8EAQAAAAEBIwAAngUAIAeABAIAAAABgQQBAAAAAZAEAgAAAAGRBAEAAAABlAQCAAAAAaQEQAAAAAGvBAEAAAABASMAAKAFADABIwAAoAUAMAkDAACBCAAgDgAAgAgAIIAEAgCgBwAhgQQBAJ4HACGQBAIAoAcAIZEEAQCfBwAhlAQCAKAHACGkBEAAswcAIa8EAQCeBwAhAgAAACIAICMAAKMFACAHgAQCAKAHACGBBAEAngcAIZAEAgCgBwAhkQQBAJ8HACGUBAIAoAcAIaQEQACzBwAhrwQBAJ4HACECAAAAIAAgIwAApQUAIAIAAAAgACAjAAClBQAgAwAAACIAICoAAJ4FACArAACjBQAgAQAAACIAIAEAAAAgACAGBgAA-wcAIDAAAPwHACAxAAD_BwAgMgAA_gcAIDMAAP0HACCRBAAAmAcAIAr9AwAAqAYAMP4DAACsBQAQ_wMAAKgGADCABAIAjAYAIYEEAQCNBgAhkAQCAIwGACGRBAEAjgYAIZQEAgCMBgAhpARAAJ0GACGvBAEAjQYAIQMAAAAgACABAACrBQAwLwAArAUAIAMAAAAgACABAAAhADACAAAiACABAAAAJgAgAQAAACYAIAMAAAAkACABAAAlADACAAAmACADAAAAJAAgAQAAJQAwAgAAJgAgAwAAACQAIAEAACUAMAIAACYAIAwOAAD5BwAgFwAA-gcAIIAEAgAAAAGBBAEAAAABhAQBAAAAAZEEAQAAAAGUBAIAAAABoAQCAAAAAaQEQAAAAAGlBEAAAAABrQQBAAAAAa4EAQAAAAEBIwAAtAUAIAqABAIAAAABgQQBAAAAAYQEAQAAAAGRBAEAAAABlAQCAAAAAaAEAgAAAAGkBEAAAAABpQRAAAAAAa0EAQAAAAGuBAEAAAABASMAALYFADABIwAAtgUAMAwOAADuBwAgFwAA7wcAIIAEAgCgBwAhgQQBAJ4HACGEBAEAngcAIZEEAQCfBwAhlAQCAKAHACGgBAIAoAcAIaQEQACzBwAhpQRAALMHACGtBAEAnwcAIa4EAQCeBwAhAgAAACYAICMAALkFACAKgAQCAKAHACGBBAEAngcAIYQEAQCeBwAhkQQBAJ8HACGUBAIAoAcAIaAEAgCgBwAhpARAALMHACGlBEAAswcAIa0EAQCfBwAhrgQBAJ4HACECAAAAJAAgIwAAuwUAIAIAAAAkACAjAAC7BQAgAwAAACYAICoAALQFACArAAC5BQAgAQAAACYAIAEAAAAkACAHBgAA6QcAIDAAAOoHACAxAADtBwAgMgAA7AcAIDMAAOsHACCRBAAAmAcAIK0EAACYBwAgDf0DAACnBgAw_gMAAMIFABD_AwAApwYAMIAEAgCMBgAhgQQBAI0GACGEBAEAjQYAIZEEAQCOBgAhlAQCAIwGACGgBAIAjAYAIaQEQACdBgAhpQRAAJ0GACGtBAEAjgYAIa4EAQCNBgAhAwAAACQAIAEAAMEFADAvAADCBQAgAwAAACQAIAEAACUAMAIAACYAIAEAAAAqACABAAAAKgAgAwAAACgAIAEAACkAMAIAACoAIAMAAAAoACABAAApADACAAAqACADAAAAKAAgAQAAKQAwAgAAKgAgIA4AAOEHACAPAADmBwAgEAAA4gcAIBEAAOgHACASAADjBwAgEwAA5AcAIBQAAOUHACAWAADnBwAggAQCAAAAAYEEAQAAAAGRBAEAAAABkgQBAAAAAZMEAQAAAAGUBAIAAAABlQQCAAAAAZYEAgAAAAGXBAEAAAABmAQBAAAAAZkEAQAAAAGaBEAAAAABmwQBAAAAAZwEQAAAAAGdBAIAAAABngQCAAAAAZ8EgAAAAAGgBAIAAAABoQQgAAAAAaIEQAAAAAGjBAEAAAABpARAAAAAAaUEQAAAAAGmBAIAAAABASMAAMoFACAYgAQCAAAAAYEEAQAAAAGRBAEAAAABkgQBAAAAAZMEAQAAAAGUBAIAAAABlQQCAAAAAZYEAgAAAAGXBAEAAAABmAQBAAAAAZkEAQAAAAGaBEAAAAABmwQBAAAAAZwEQAAAAAGdBAIAAAABngQCAAAAAZ8EgAAAAAGgBAIAAAABoQQgAAAAAaIEQAAAAAGjBAEAAAABpARAAAAAAaUEQAAAAAGmBAIAAAABASMAAMwFADABIwAAzAUAMAEAAAAoACABAAAAGgAgIA4AALUHACAPAAC7BwAgEAAAtgcAIBEAALcHACASAAC4BwAgEwAAuQcAIBQAALoHACAWAAC8BwAggAQCAKAHACGBBAEAngcAIZEEAQCfBwAhkgQBAJ8HACGTBAEAnwcAIZQEAgCgBwAhlQQCAKAHACGWBAIAtAcAIZcEAQCeBwAhmAQBAJ4HACGZBAEAnwcAIZoEQACxBwAhmwQBAJ4HACGcBEAAsQcAIZ0EAgC0BwAhngQCAKAHACGfBIAAAAABoAQCAKAHACGhBCAAsgcAIaIEQACxBwAhowQBAJ8HACGkBEAAswcAIaUEQACzBwAhpgQCALQHACECAAAAKgAgIwAA0QUAIBiABAIAoAcAIYEEAQCeBwAhkQQBAJ8HACGSBAEAnwcAIZMEAQCfBwAhlAQCAKAHACGVBAIAoAcAIZYEAgC0BwAhlwQBAJ4HACGYBAEAngcAIZkEAQCfBwAhmgRAALEHACGbBAEAngcAIZwEQACxBwAhnQQCALQHACGeBAIAoAcAIZ8EgAAAAAGgBAIAoAcAIaEEIACyBwAhogRAALEHACGjBAEAnwcAIaQEQACzBwAhpQRAALMHACGmBAIAtAcAIQIAAAAoACAjAADTBQAgAgAAACgAICMAANMFACABAAAAKAAgAQAAABoAIAMAAAAqACAqAADKBQAgKwAA0QUAIAEAAAAqACABAAAAKAAgEAYAAKwHACAwAACtBwAgMQAAsAcAIDIAAK8HACAzAACuBwAgkQQAAJgHACCSBAAAmAcAIJMEAACYBwAglgQAAJgHACCZBAAAmAcAIJoEAACYBwAgnAQAAJgHACCdBAAAmAcAIKIEAACYBwAgowQAAJgHACCmBAAAmAcAIBv9AwAAmAYAMP4DAADcBQAQ_wMAAJgGADCABAIAjAYAIYEEAQCNBgAhkQQBAI4GACGSBAEAjgYAIZMEAQCOBgAhlAQCAIwGACGVBAIAjAYAIZYEAgCZBgAhlwQBAI0GACGYBAEAjQYAIZkEAQCOBgAhmgRAAJoGACGbBAEAjQYAIZwEQACaBgAhnQQCAJkGACGeBAIAjAYAIZ8EAACbBgAgoAQCAIwGACGhBCAAnAYAIaIEQACaBgAhowQBAI4GACGkBEAAnQYAIaUEQACdBgAhpgQCAJkGACEDAAAAKAAgAQAA2wUAMC8AANwFACADAAAAKAAgAQAAKQAwAgAAKgAgAQAAADEAIAEAAAAxACADAAAALwAgAQAAMAAwAgAAMQAgAwAAAC8AIAEAADAAMAIAADEAIAMAAAAvACABAAAwADACAAAxACAHAwAAqwcAIBUAAKoHACCABAIAAAABgQQBAAAAAYIEAQAAAAGDBAIAAAABkAQCAAAAAQEjAADkBQAgBYAEAgAAAAGBBAEAAAABggQBAAAAAYMEAgAAAAGQBAIAAAABASMAAOYFADABIwAA5gUAMAcDAACpBwAgFQAAqAcAIIAEAgCgBwAhgQQBAJ4HACGCBAEAnwcAIYMEAgCgBwAhkAQCAKAHACECAAAAMQAgIwAA6QUAIAWABAIAoAcAIYEEAQCeBwAhggQBAJ8HACGDBAIAoAcAIZAEAgCgBwAhAgAAAC8AICMAAOsFACACAAAALwAgIwAA6wUAIAMAAAAxACAqAADkBQAgKwAA6QUAIAEAAAAxACABAAAALwAgBgYAAKMHACAwAACkBwAgMQAApwcAIDIAAKYHACAzAAClBwAgggQAAJgHACAI_QMAAJcGADD-AwAA8gUAEP8DAACXBgAwgAQCAIwGACGBBAEAjQYAIYIEAQCOBgAhgwQCAIwGACGQBAIAjAYAIQMAAAAvACABAADxBQAwLwAA8gUAIAMAAAAvACABAAAwADACAAAxACABAAAANQAgAQAAADUAIAMAAAAzACABAAA0ADACAAA1ACADAAAAMwAgAQAANAAwAgAANQAgAwAAADMAIAEAADQAMAIAADUAIAYVAACiBwAggAQCAAAAAYEEAQAAAAGCBAEAAAABgwQCAAAAAYQEAQAAAAEBIwAA-gUAIAWABAIAAAABgQQBAAAAAYIEAQAAAAGDBAIAAAABhAQBAAAAAQEjAAD8BQAwASMAAPwFADAGFQAAoQcAIIAEAgCgBwAhgQQBAJ4HACGCBAEAnwcAIYMEAgCgBwAhhAQBAJ4HACECAAAANQAgIwAA_wUAIAWABAIAoAcAIYEEAQCeBwAhggQBAJ8HACGDBAIAoAcAIYQEAQCeBwAhAgAAADMAICMAAIEGACACAAAAMwAgIwAAgQYAIAMAAAA1ACAqAAD6BQAgKwAA_wUAIAEAAAA1ACABAAAAMwAgBgYAAJkHACAwAACaBwAgMQAAnQcAIDIAAJwHACAzAACbBwAgggQAAJgHACAI_QMAAIsGADD-AwAAiAYAEP8DAACLBgAwgAQCAIwGACGBBAEAjQYAIYIEAQCOBgAhgwQCAIwGACGEBAEAjQYAIQMAAAAzACABAACHBgAwLwAAiAYAIAMAAAAzACABAAA0ADACAAA1ACAI_QMAAIsGADD-AwAAiAYAEP8DAACLBgAwgAQCAIwGACGBBAEAjQYAIYIEAQCOBgAhgwQCAIwGACGEBAEAjQYAIQ0GAACTBgAgMAAAlgYAIDEAAJMGACAyAACTBgAgMwAAkwYAIIUEAgAAAAGGBAIAAAAEhwQCAAAABIgEAgAAAAGJBAIAAAABigQCAAAAAYsEAgAAAAGPBAIAlQYAIQ4GAACTBgAgMgAAlAYAIDMAAJQGACCFBAEAAAABhgQBAAAABIcEAQAAAASIBAEAAAABiQQBAAAAAYoEAQAAAAGLBAEAAAABjAQBAAAAAY0EAQAAAAGOBAEAAAABjwQBAJIGACEOBgAAkAYAIDIAAJEGACAzAACRBgAghQQBAAAAAYYEAQAAAAWHBAEAAAAFiAQBAAAAAYkEAQAAAAGKBAEAAAABiwQBAAAAAYwEAQAAAAGNBAEAAAABjgQBAAAAAY8EAQCPBgAhDgYAAJAGACAyAACRBgAgMwAAkQYAIIUEAQAAAAGGBAEAAAAFhwQBAAAABYgEAQAAAAGJBAEAAAABigQBAAAAAYsEAQAAAAGMBAEAAAABjQQBAAAAAY4EAQAAAAGPBAEAjwYAIQiFBAIAAAABhgQCAAAABYcEAgAAAAWIBAIAAAABiQQCAAAAAYoEAgAAAAGLBAIAAAABjwQCAJAGACELhQQBAAAAAYYEAQAAAAWHBAEAAAAFiAQBAAAAAYkEAQAAAAGKBAEAAAABiwQBAAAAAYwEAQAAAAGNBAEAAAABjgQBAAAAAY8EAQCRBgAhDgYAAJMGACAyAACUBgAgMwAAlAYAIIUEAQAAAAGGBAEAAAAEhwQBAAAABIgEAQAAAAGJBAEAAAABigQBAAAAAYsEAQAAAAGMBAEAAAABjQQBAAAAAY4EAQAAAAGPBAEAkgYAIQiFBAIAAAABhgQCAAAABIcEAgAAAASIBAIAAAABiQQCAAAAAYoEAgAAAAGLBAIAAAABjwQCAJMGACELhQQBAAAAAYYEAQAAAASHBAEAAAAEiAQBAAAAAYkEAQAAAAGKBAEAAAABiwQBAAAAAYwEAQAAAAGNBAEAAAABjgQBAAAAAY8EAQCUBgAhDQYAAJMGACAwAACWBgAgMQAAkwYAIDIAAJMGACAzAACTBgAghQQCAAAAAYYEAgAAAASHBAIAAAAEiAQCAAAAAYkEAgAAAAGKBAIAAAABiwQCAAAAAY8EAgCVBgAhCIUECAAAAAGGBAgAAAAEhwQIAAAABIgECAAAAAGJBAgAAAABigQIAAAAAYsECAAAAAGPBAgAlgYAIQj9AwAAlwYAMP4DAADyBQAQ_wMAAJcGADCABAIAjAYAIYEEAQCNBgAhggQBAI4GACGDBAIAjAYAIZAEAgCMBgAhG_0DAACYBgAw_gMAANwFABD_AwAAmAYAMIAEAgCMBgAhgQQBAI0GACGRBAEAjgYAIZIEAQCOBgAhkwQBAI4GACGUBAIAjAYAIZUEAgCMBgAhlgQCAJkGACGXBAEAjQYAIZgEAQCNBgAhmQQBAI4GACGaBEAAmgYAIZsEAQCNBgAhnARAAJoGACGdBAIAmQYAIZ4EAgCMBgAhnwQAAJsGACCgBAIAjAYAIaEEIACcBgAhogRAAJoGACGjBAEAjgYAIaQEQACdBgAhpQRAAJ0GACGmBAIAmQYAIQ0GAACQBgAgMAAApgYAIDEAAJAGACAyAACQBgAgMwAAkAYAIIUEAgAAAAGGBAIAAAAFhwQCAAAABYgEAgAAAAGJBAIAAAABigQCAAAAAYsEAgAAAAGPBAIApQYAIQsGAACQBgAgMgAApAYAIDMAAKQGACCFBEAAAAABhgRAAAAABYcEQAAAAAWIBEAAAAABiQRAAAAAAYoEQAAAAAGLBEAAAAABjwRAAKMGACEPBgAAkwYAIDIAAKIGACAzAACiBgAghQSAAAAAAYgEgAAAAAGJBIAAAAABigSAAAAAAYsEgAAAAAGPBIAAAAABpwQBAAAAAagEAQAAAAGpBAEAAAABqgSAAAAAAasEgAAAAAGsBIAAAAABBQYAAJMGACAyAAChBgAgMwAAoQYAIIUEIAAAAAGPBCAAoAYAIQsGAACTBgAgMgAAnwYAIDMAAJ8GACCFBEAAAAABhgRAAAAABIcEQAAAAASIBEAAAAABiQRAAAAAAYoEQAAAAAGLBEAAAAABjwRAAJ4GACELBgAAkwYAIDIAAJ8GACAzAACfBgAghQRAAAAAAYYEQAAAAASHBEAAAAAEiARAAAAAAYkEQAAAAAGKBEAAAAABiwRAAAAAAY8EQACeBgAhCIUEQAAAAAGGBEAAAAAEhwRAAAAABIgEQAAAAAGJBEAAAAABigRAAAAAAYsEQAAAAAGPBEAAnwYAIQUGAACTBgAgMgAAoQYAIDMAAKEGACCFBCAAAAABjwQgAKAGACEChQQgAAAAAY8EIAChBgAhDIUEgAAAAAGIBIAAAAABiQSAAAAAAYoEgAAAAAGLBIAAAAABjwSAAAAAAacEAQAAAAGoBAEAAAABqQQBAAAAAaoEgAAAAAGrBIAAAAABrASAAAAAAQsGAACQBgAgMgAApAYAIDMAAKQGACCFBEAAAAABhgRAAAAABYcEQAAAAAWIBEAAAAABiQRAAAAAAYoEQAAAAAGLBEAAAAABjwRAAKMGACEIhQRAAAAAAYYEQAAAAAWHBEAAAAAFiARAAAAAAYkEQAAAAAGKBEAAAAABiwRAAAAAAY8EQACkBgAhDQYAAJAGACAwAACmBgAgMQAAkAYAIDIAAJAGACAzAACQBgAghQQCAAAAAYYEAgAAAAWHBAIAAAAFiAQCAAAAAYkEAgAAAAGKBAIAAAABiwQCAAAAAY8EAgClBgAhCIUECAAAAAGGBAgAAAAFhwQIAAAABYgECAAAAAGJBAgAAAABigQIAAAAAYsECAAAAAGPBAgApgYAIQ39AwAApwYAMP4DAADCBQAQ_wMAAKcGADCABAIAjAYAIYEEAQCNBgAhhAQBAI0GACGRBAEAjgYAIZQEAgCMBgAhoAQCAIwGACGkBEAAnQYAIaUEQACdBgAhrQQBAI4GACGuBAEAjQYAIQr9AwAAqAYAMP4DAACsBQAQ_wMAAKgGADCABAIAjAYAIYEEAQCNBgAhkAQCAIwGACGRBAEAjgYAIZQEAgCMBgAhpARAAJ0GACGvBAEAjQYAIRD9AwAAqQYAMP4DAACWBQAQ_wMAAKkGADCABAIAjAYAIYEEAQCNBgAhhAQBAI0GACGhBCAAnAYAIaQEQACdBgAhpQRAAJ0GACGwBAEAjQYAIbEEAgCMBgAhsgQgAJwGACGzBAAAmwYAILQEAACqBgAgtQQBAI4GACG2BAEAjQYAIQ8GAACQBgAgMgAAqwYAIDMAAKsGACCFBIAAAAABiASAAAAAAYkEgAAAAAGKBIAAAAABiwSAAAAAAY8EgAAAAAGnBAEAAAABqAQBAAAAAakEAQAAAAGqBIAAAAABqwSAAAAAAawEgAAAAAEMhQSAAAAAAYgEgAAAAAGJBIAAAAABigSAAAAAAYsEgAAAAAGPBIAAAAABpwQBAAAAAagEAQAAAAGpBAEAAAABqgSAAAAAAasEgAAAAAGsBIAAAAABCwoAAJsGACD9AwAArAYAMP4DAACABQAQ_wMAAKwGADCABAIAjAYAIYQEAQCNBgAhkAQCAJkGACGkBEAAnQYAIaUEQACdBgAhtwQBAI0GACG4BCAAnAYAIQz9AwAArQYAMP4DAADoBAAQ_wMAAK0GADCABAIAjAYAIZcEAQCNBgAhnARAAJoGACGgBAIAjAYAIaQEQACdBgAhpQRAAJ0GACG5BAIAjAYAIboEAQCNBgAhuwQgAJwGACEL_QMAAK4GADD-AwAA0gQAEP8DAACuBgAwgAQCAIwGACGQBAIAjAYAIZcEAQCNBgAhoQQgAJwGACGkBEAAnQYAIaUEQACdBgAhtwQBAI0GACG6BAEAjQYAIQv9AwAArwYAMP4DAAC8BAAQ_wMAAK8GADCABAIAjAYAIZAEAgCMBgAhpARAAJ0GACG6BAEAjQYAIbwEAgCMBgAhvQQBAI0GACG-BAIAjAYAIb8EAQCNBgAhD_0DAACwBgAw_gMAAKYEABD_AwAAsAYAMIAEAgCMBgAhhAQBAI0GACGQBAIAjAYAIaAEAgCMBgAhoQQgAJwGACGkBEAAnQYAIaUEQACdBgAhtQQBAI0GACG6BAEAjQYAIcAEAQCNBgAhwQQCAIwGACHCBAEAjQYAIQr9AwAAsQYAMP4DAACQBAAQ_wMAALEGADCABAIAjAYAIaQEQACdBgAhwwQCAIwGACHEBEAAnQYAIcUECACyBgAhxgQIALIGACHHBAAAqgYAIA0GAACQBgAgMAAApgYAIDEAAKYGACAyAACmBgAgMwAApgYAIIUECAAAAAGGBAgAAAAFhwQIAAAABYgECAAAAAGJBAgAAAABigQIAAAAAYsECAAAAAGPBAgAswYAIQ0GAACQBgAgMAAApgYAIDEAAKYGACAyAACmBgAgMwAApgYAIIUECAAAAAGGBAgAAAAFhwQIAAAABYgECAAAAAGJBAgAAAABigQIAAAAAYsECAAAAAGPBAgAswYAIRL9AwAAtAYAMP4DAAD6AwAQ_wMAALQGADCABAIAjAYAIaQEQACdBgAhvQRAAJ0GACHDBAIAjAYAIcUECACyBgAhxgQIALIGACHHBAAAqgYAIMgECACyBgAhyQQIALIGACHKBAgAsgYAIcsECACyBgAhzAQIALIGACHNBAgAsgYAIc4EAQCNBgAhzwRAAJoGACEU_QMAALUGADD-AwAA5AMAEP8DAAC1BgAwgAQCAIwGACGEBAEAjQYAIaQEQACdBgAh0AQBAI0GACHRBAEAjQYAIdIEAQCNBgAh0wQBAI4GACHUBAIAjAYAIdUEAgCMBgAh1gQCAIwGACHXBAIAjAYAIdgEAgCMBgAh2QQCAIwGACHaBAIAmQYAIdsEQACaBgAh3AQgAJwGACHdBEAAmgYAIQf9AwAAtgYAMP4DAADOAwAQ_wMAALYGADCABAIAjAYAIYQEAQCNBgAhpARAAJ0GACHRBAEAjQYAIQiMAgAAuwYAIP0DAAC3BgAw_gMAALsDABD_AwAAtwYAMIAEAgC4BgAhhAQBALkGACGkBEAAugYAIdEEAQC5BgAhCIUEAgAAAAGGBAIAAAAEhwQCAAAABIgEAgAAAAGJBAIAAAABigQCAAAAAYsEAgAAAAGPBAIAkwYAIQuFBAEAAAABhgQBAAAABIcEAQAAAASIBAEAAAABiQQBAAAAAYoEAQAAAAGLBAEAAAABjAQBAAAAAY0EAQAAAAGOBAEAAAABjwQBAJQGACEIhQRAAAAAAYYEQAAAAASHBEAAAAAEiARAAAAAAYkEQAAAAAGKBEAAAAABiwRAAAAAAY8EQACfBgAhA94EAACrAwAg3wQAAKsDACDgBAAAqwMAIALDBAIAAAABxARAAAAAAQuJAgAAwAYAIP0DAAC9BgAw_gMAALMDABD_AwAAvQYAMIAEAgC4BgAhpARAALoGACHDBAIAuAYAIcQEQAC6BgAhxQQIAL4GACHGBAgAvgYAIccEAAC_BgAgCIUECAAAAAGGBAgAAAAFhwQIAAAABYgECAAAAAGJBAgAAAABigQIAAAAAYsECAAAAAGPBAgApgYAIQyFBIAAAAABiASAAAAAAYkEgAAAAAGKBIAAAAABiwSAAAAAAY8EgAAAAAGnBAEAAAABqAQBAAAAAakEAQAAAAGqBIAAAAABqwSAAAAAAawEgAAAAAEZiAIAAMgGACCKAgAAyQYAIIsCAADKBgAg_QMAAMQGADD-AwAAqwMAEP8DAADEBgAwgAQCALgGACGEBAEAuQYAIaQEQAC6BgAh0AQBALkGACHRBAEAuQYAIdIEAQC5BgAh0wQBAMUGACHUBAIAuAYAIdUEAgC4BgAh1gQCALgGACHXBAIAuAYAIdgEAgC4BgAh2QQCALgGACHaBAIAxgYAIdsEQADDBgAh3AQgAMcGACHdBEAAwwYAIaYFAACrAwAgpwUAAKsDACACvQRAAAAAAcMEAgAAAAETiQIAAMAGACD9AwAAwgYAMP4DAACvAwAQ_wMAAMIGADCABAIAuAYAIaQEQAC6BgAhvQRAALoGACHDBAIAuAYAIcUECAC-BgAhxgQIAL4GACHHBAAAvwYAIMgECAC-BgAhyQQIAL4GACHKBAgAvgYAIcsECAC-BgAhzAQIAL4GACHNBAgAvgYAIc4EAQC5BgAhzwRAAMMGACEIhQRAAAAAAYYEQAAAAAWHBEAAAAAFiARAAAAAAYkEQAAAAAGKBEAAAAABiwRAAAAAAY8EQACkBgAhF4gCAADIBgAgigIAAMkGACCLAgAAygYAIP0DAADEBgAw_gMAAKsDABD_AwAAxAYAMIAEAgC4BgAhhAQBALkGACGkBEAAugYAIdAEAQC5BgAh0QQBALkGACHSBAEAuQYAIdMEAQDFBgAh1AQCALgGACHVBAIAuAYAIdYEAgC4BgAh1wQCALgGACHYBAIAuAYAIdkEAgC4BgAh2gQCAMYGACHbBEAAwwYAIdwEIADHBgAh3QRAAMMGACELhQQBAAAAAYYEAQAAAAWHBAEAAAAFiAQBAAAAAYkEAQAAAAGKBAEAAAABiwQBAAAAAYwEAQAAAAGNBAEAAAABjgQBAAAAAY8EAQCRBgAhCIUEAgAAAAGGBAIAAAAFhwQCAAAABYgEAgAAAAGJBAIAAAABigQCAAAAAYsEAgAAAAGPBAIAkAYAIQKFBCAAAAABjwQgAKEGACEKjAIAALsGACD9AwAAtwYAMP4DAAC7AwAQ_wMAALcGADCABAIAuAYAIYQEAQC5BgAhpARAALoGACHRBAEAuQYAIaYFAAC7AwAgpwUAALsDACAD3gQAAK8DACDfBAAArwMAIOAEAACvAwAgA94EAACzAwAg3wQAALMDACDgBAAAswMAIAn9AwAAywYAMP4DAACmAwAQ_wMAAMsGADCABAIAjAYAIZAEAQCNBgAhmwQBAI0GACGlBEAAnQYAIeMEAQCNBgAh5AQBAI0GACEJ_QMAAMwGADD-AwAAkwMAEP8DAADMBgAwgAQCALgGACGQBAEAuQYAIZsEAQC5BgAhpQRAALoGACHjBAEAuQYAIeQEAQC5BgAhCv0DAADNBgAw_gMAAI0DABD_AwAAzQYAMIAEAgCMBgAhpARAAJ0GACG9BEAAnQYAIb8EAQCNBgAh5QQBAI0GACHmBAEAjQYAIecECADOBgAhDQYAAJMGACAwAACWBgAgMQAAlgYAIDIAAJYGACAzAACWBgAghQQIAAAAAYYECAAAAASHBAgAAAAEiAQIAAAAAYkECAAAAAGKBAgAAAABiwQIAAAAAY8ECADPBgAhDQYAAJMGACAwAACWBgAgMQAAlgYAIDIAAJYGACAzAACWBgAghQQIAAAAAYYECAAAAASHBAgAAAAEiAQIAAAAAYkECAAAAAGKBAgAAAABiwQIAAAAAY8ECADPBgAhCv0DAADQBgAw_gMAAPoCABD_AwAA0AYAMIAEAgC4BgAhpARAALoGACG9BEAAugYAIb8EAQC5BgAh5QQBALkGACHmBAEAuQYAIecECADRBgAhCIUECAAAAAGGBAgAAAAEhwQIAAAABIgECAAAAAGJBAgAAAABigQIAAAAAYsECAAAAAGPBAgAlgYAIQO9BEAAAAAB5QQBAAAAAeYEAQAAAAEK_QMAANMGADD-AwAA9AIAEP8DAADTBgAwgAQCAIwGACGkBEAAnQYAIaUEQACdBgAh6QQBAI0GACHqBAEAjgYAIesEQACdBgAh7AQAAKoGACAK_QMAANQGADD-AwAA4QIAEP8DAADUBgAwgAQCALgGACGkBEAAugYAIaUEQAC6BgAh6QQBALkGACHqBAEAxQYAIesEQAC6BgAh7AQAAL8GACAI_QMAANUGADD-AwAA2wIAEP8DAADVBgAwgAQCAIwGACGkBEAAnQYAIaUEQACdBgAh7QQBAI0GACHuBAIAjAYAIQj9AwAA1gYAMP4DAADIAgAQ_wMAANYGADCABAIAuAYAIaQEQAC6BgAhpQRAALoGACHtBAEAuQYAIe4EAgC4BgAhDP0DAADXBgAw_gMAAMICABD_AwAA1wYAMIAEAgCMBgAhhAQBAI0GACGbBAEAjQYAIaQEQACdBgAhpQRAAJ0GACHvBAEAjQYAIfAEAgCMBgAh8QQBAI0GACHyBEAAnQYAIQz9AwAA2AYAMP4DAACvAgAQ_wMAANgGADCABAIAuAYAIYQEAQC5BgAhmwQBALkGACGkBEAAugYAIaUEQAC6BgAh7wQBALkGACHwBAIAuAYAIfEEAQC5BgAh8gRAALoGACEP_QMAANkGADD-AwAAqQIAEP8DAADZBgAwgAQCAIwGACGBBAEAjQYAIaQEQACdBgAhwARAAJ0GACHzBAgAzgYAIfQEBADaBgAh9QQIAM4GACH2BAQA2gYAIfcEBADaBgAh-AQEANoGACH5BAIAjAYAIfoEAgCMBgAhDQYAAJMGACAwAACWBgAgMQAA3AYAIDIAANwGACAzAADcBgAghQQEAAAAAYYEBAAAAASHBAQAAAAEiAQEAAAAAYkEBAAAAAGKBAQAAAABiwQEAAAAAY8EBADbBgAhDQYAAJMGACAwAACWBgAgMQAA3AYAIDIAANwGACAzAADcBgAghQQEAAAAAYYEBAAAAASHBAQAAAAEiAQEAAAAAYkEBAAAAAGKBAQAAAABiwQEAAAAAY8EBADbBgAhCIUEBAAAAAGGBAQAAAAEhwQEAAAABIgEBAAAAAGJBAQAAAABigQEAAAAAYsEBAAAAAGPBAQA3AYAIQ_9AwAA3QYAMP4DAACWAgAQ_wMAAN0GADCABAIAuAYAIYEEAQC5BgAhpARAALoGACHABEAAugYAIfMECADRBgAh9AQEAN4GACH1BAgA0QYAIfYEBADeBgAh9wQEAN4GACH4BAQA3gYAIfkEAgC4BgAh-gQCALgGACEIhQQEAAAAAYYEBAAAAASHBAQAAAAEiAQEAAAAAYkEBAAAAAGKBAQAAAABiwQEAAAAAY8EBADcBgAhAoEEAQAAAAHABEAAAAABHP0DAADgBgAw_gMAAJACABD_AwAA4AYAMIAEAgCMBgAhgQQBAI0GACGEBAEAjQYAIZsEAQCNBgAhpARAAJ0GACGlBEAAnQYAIfcEBADaBgAh-AQEANoGACH5BAIAjAYAIfoEAgCMBgAh_AQBAI0GACH9BAEAjQYAIf4EAQCNBgAh_wQEANoGACGABQQA2gYAIYEFAgCMBgAhggUIAM4GACGDBQQA2gYAIYQFBADaBgAhhQUIAM4GACGGBQgAzgYAIYcFCADOBgAhiAUEANoGACGJBQQA2gYAIYoFQACdBgAhHP0DAADhBgAw_gMAAP0BABD_AwAA4QYAMIAEAgC4BgAhgQQBALkGACGEBAEAuQYAIZsEAQC5BgAhpARAALoGACGlBEAAugYAIfcEBADeBgAh-AQEAN4GACH5BAIAuAYAIfoEAgC4BgAh_AQBALkGACH9BAEAuQYAIf4EAQC5BgAh_wQEAN4GACGABQQA3gYAIYEFAgC4BgAhggUIANEGACGDBQQA3gYAIYQFBADeBgAhhQUIANEGACGGBQgA0QYAIYcFCADRBgAhiAUEAN4GACGJBQQA3gYAIYoFQAC6BgAhDf0DAADiBgAw_gMAAPcBABD_AwAA4gYAMIAEAgCMBgAhpARAAJ0GACHABAEAjQYAIYsFAQCNBgAhjAUIAM4GACGNBQgAzgYAIY4FAQCNBgAhjwUBAI0GACGQBQgAzgYAIZEFCADOBgAhDf0DAADjBgAw_gMAAOQBABD_AwAA4wYAMIAEAgC4BgAhpARAALoGACHABAEAuQYAIYsFAQC5BgAhjAUIANEGACGNBQgA0QYAIY4FAQC5BgAhjwUBALkGACGQBQgA0QYAIZEFCADRBgAhDP0DAADkBgAw_gMAAN4BABD_AwAA5AYAMIAEAgCMBgAhlwQBAI0GACGkBEAAnQYAIb8EAQCNBgAh7wQBAI0GACGSBQEAjQYAIZMFAQCOBgAhlAVAAJ0GACGVBQIAjAYAIQz9AwAA5QYAMP4DAADLAQAQ_wMAAOUGADCABAIAuAYAIZcEAQC5BgAhpARAALoGACG_BAEAuQYAIe8EAQC5BgAhkgUBALkGACGTBQEAxQYAIZQFQAC6BgAhlQUCALgGACEClwQBAAAAAZQFQAAAAAEJ_QMAAOcGADD-AwAAxQEAEP8DAADnBgAwgAQCAIwGACGkBEAAnQYAIaUEQACdBgAhwAQBAI0GACGXBQIAjAYAIZgFCADOBgAhDf0DAADoBgAw_gMAAK8BABD_AwAA6AYAMIAEAgCMBgAhhAQBAI0GACGXBAEAjQYAIaQEQACdBgAhpQRAAJ0GACG_BAEAjQYAIZkFAQCNBgAhmgUBAI0GACGbBQEAjQYAIZwFIACcBgAhDlcAAOoGACD9AwAA6QYAMP4DAACcAQAQ_wMAAOkGADCABAIAuAYAIYQEAQC5BgAhlwQBALkGACGkBEAAugYAIaUEQAC6BgAhvwQBALkGACGZBQEAuQYAIZoFAQC5BgAhmwUBALkGACGcBSAAxwYAIQPeBAAAlgEAIN8EAACWAQAg4AQAAJYBACACwAQBAAAAAZcFAgAAAAEKVgAA7QYAIP0DAADsBgAw_gMAAJYBABD_AwAA7AYAMIAEAgC4BgAhpARAALoGACGlBEAAugYAIcAEAQC5BgAhlwUCALgGACGYBQgA0QYAIRBXAADqBgAg_QMAAOkGADD-AwAAnAEAEP8DAADpBgAwgAQCALgGACGEBAEAuQYAIZcEAQC5BgAhpARAALoGACGlBEAAugYAIb8EAQC5BgAhmQUBALkGACGaBQEAuQYAIZsFAQC5BgAhnAUgAMcGACGmBQAAnAEAIKcFAACcAQAgCSMAAJsGACD9AwAA7gYAMP4DAACRAQAQ_wMAAO4GADCABAIAjAYAIYQEAQCNBgAhmAQBAI0GACGkBEAAnQYAIaUEQACdBgAhCSMAAPAGACD9AwAA7wYAMP4DAAB-ABD_AwAA7wYAMIAEAgC4BgAhhAQBALkGACGYBAEAuQYAIaQEQAC6BgAhpQRAALoGACEMhQSAAAAAAYgEgAAAAAGJBIAAAAABigSAAAAAAYsEgAAAAAGPBIAAAAABpwQBAAAAAagEAQAAAAGpBAEAAAABqgSAAAAAAasEgAAAAAGsBIAAAAABCv0DAADxBgAw_gMAAHgAEP8DAADxBgAwgAQCAIwGACGXBAEAjQYAIaQEQACdBgAhpQRAAJ0GACG9BAEAjQYAIZMFAQCNBgAhngUBAI0GACEK_QMAAPIGADD-AwAAZQAQ_wMAAPIGADCABAIAuAYAIZcEAQC5BgAhpARAALoGACGlBEAAugYAIb0EAQC5BgAhkwUBALkGACGeBQEAuQYAIQn9AwAA8wYAMP4DAABfABD_AwAA8wYAMIAEAgCMBgAhhAQBAI0GACGkBEAAnQYAIaUEQACdBgAhnwUBAI0GACGgBQEAjQYAIQkVAAD1BgAg_QMAAPQGADD-AwAAMwAQ_wMAAPQGADCABAIAuAYAIYEEAQC5BgAhggQBAMUGACGDBAIAuAYAIYQEAQC5BgAhJQ4AAPsGACAPAACABwAgEAAA_AYAIBEAAP0GACASAAD-BgAgEwAA_wYAIBQAAPgGACAWAACBBwAg_QMAAPoGADD-AwAAKAAQ_wMAAPoGADCABAIAuAYAIYEEAQC5BgAhkQQBAMUGACGSBAEAxQYAIZMEAQDFBgAhlAQCALgGACGVBAIAuAYAIZYEAgDGBgAhlwQBALkGACGYBAEAuQYAIZkEAQDFBgAhmgRAAMMGACGbBAEAuQYAIZwEQADDBgAhnQQCAMYGACGeBAIAuAYAIZ8EAADwBgAgoAQCALgGACGhBCAAxwYAIaIEQADDBgAhowQBAMUGACGkBEAAugYAIaUEQAC6BgAhpgQCAMYGACGmBQAAKAAgpwUAACgAIAKDBAIAAAABkAQCAAAAAQoDAAD4BgAgFQAA9QYAIP0DAAD3BgAw_gMAAC8AEP8DAAD3BgAwgAQCALgGACGBBAEAuQYAIYIEAQDFBgAhgwQCALgGACGQBAIAuAYAIRQHAACKBwAgCAAAiwcAIAsAAIwHACAMAACNBwAgGQAAjgcAIBoAAIcHACAbAAD-BgAgHAAA_gYAIB0AAIAHACD9AwAAiQcAMP4DAAAaABD_AwAAiQcAMIAEAgC4BgAhhAQBALkGACGkBEAAugYAIaUEQAC6BgAhnwUBALkGACGgBQEAuQYAIaYFAAAaACCnBQAAGgAgApQEAgAAAAGmBAIAAAABIw4AAPsGACAPAACABwAgEAAA_AYAIBEAAP0GACASAAD-BgAgEwAA_wYAIBQAAPgGACAWAACBBwAg_QMAAPoGADD-AwAAKAAQ_wMAAPoGADCABAIAuAYAIYEEAQC5BgAhkQQBAMUGACGSBAEAxQYAIZMEAQDFBgAhlAQCALgGACGVBAIAuAYAIZYEAgDGBgAhlwQBALkGACGYBAEAuQYAIZkEAQDFBgAhmgRAAMMGACGbBAEAuQYAIZwEQADDBgAhnQQCAMYGACGeBAIAuAYAIZ8EAADwBgAgoAQCALgGACGhBCAAxwYAIaIEQADDBgAhowQBAMUGACGkBEAAugYAIaUEQAC6BgAhpgQCAMYGACEWDQAA-AYAIA8AAIcHACAXAAD-BgAgGAAAiAcAIP0DAACGBwAw_gMAABwAEP8DAACGBwAwgAQCALgGACGBBAEAuQYAIYQEAQC5BgAhoQQgAMcGACGkBEAAugYAIaUEQAC6BgAhsAQBALkGACGxBAIAuAYAIbIEIADHBgAhswQAAPAGACC0BAAAvwYAILUEAQDFBgAhtgQBALkGACGmBQAAHAAgpwUAABwAIBEOAAD7BgAgFwAA_gYAIP0DAACDBwAw_gMAACQAEP8DAACDBwAwgAQCALgGACGBBAEAuQYAIYQEAQC5BgAhkQQBAMUGACGUBAIAuAYAIaAEAgC4BgAhpARAALoGACGlBEAAugYAIa0EAQDFBgAhrgQBALkGACGmBQAAJAAgpwUAACQAICUOAAD7BgAgDwAAgAcAIBAAAPwGACARAAD9BgAgEgAA_gYAIBMAAP8GACAUAAD4BgAgFgAAgQcAIP0DAAD6BgAw_gMAACgAEP8DAAD6BgAwgAQCALgGACGBBAEAuQYAIZEEAQDFBgAhkgQBAMUGACGTBAEAxQYAIZQEAgC4BgAhlQQCALgGACGWBAIAxgYAIZcEAQC5BgAhmAQBALkGACGZBAEAxQYAIZoEQADDBgAhmwQBALkGACGcBEAAwwYAIZ0EAgDGBgAhngQCALgGACGfBAAA8AYAIKAEAgC4BgAhoQQgAMcGACGiBEAAwwYAIaMEAQDFBgAhpARAALoGACGlBEAAugYAIaYEAgDGBgAhpgUAACgAIKcFAAAoACAD3gQAACgAIN8EAAAoACDgBAAAKAAgFAcAAIoHACAIAACLBwAgCwAAjAcAIAwAAI0HACAZAACOBwAgGgAAhwcAIBsAAP4GACAcAAD-BgAgHQAAgAcAIP0DAACJBwAw_gMAABoAEP8DAACJBwAwgAQCALgGACGEBAEAuQYAIaQEQAC6BgAhpQRAALoGACGfBQEAuQYAIaAFAQC5BgAhpgUAABoAIKcFAAAaACAD3gQAAC8AIN8EAAAvACDgBAAALwAgA94EAAAzACDfBAAAMwAg4AQAADMAIAKEBAEAAAABlAQCAAAAAQ8OAAD7BgAgFwAA_gYAIP0DAACDBwAw_gMAACQAEP8DAACDBwAwgAQCALgGACGBBAEAuQYAIYQEAQC5BgAhkQQBAMUGACGUBAIAuAYAIaAEAgC4BgAhpARAALoGACGlBEAAugYAIa0EAQDFBgAhrgQBALkGACECkAQCAAAAAZQEAgAAAAEMAwAA-AYAIA4AAPsGACD9AwAAhQcAMP4DAAAgABD_AwAAhQcAMIAEAgC4BgAhgQQBALkGACGQBAIAuAYAIZEEAQDFBgAhlAQCALgGACGkBEAAugYAIa8EAQC5BgAhFA0AAPgGACAPAACHBwAgFwAA_gYAIBgAAIgHACD9AwAAhgcAMP4DAAAcABD_AwAAhgcAMIAEAgC4BgAhgQQBALkGACGEBAEAuQYAIaEEIADHBgAhpARAALoGACGlBEAAugYAIbAEAQC5BgAhsQQCALgGACGyBCAAxwYAIbMEAADwBgAgtAQAAL8GACC1BAEAxQYAIbYEAQC5BgAhA94EAAAgACDfBAAAIAAg4AQAACAAIAPeBAAAJAAg3wQAACQAIOAEAAAkACASBwAAigcAIAgAAIsHACALAACMBwAgDAAAjQcAIBkAAI4HACAaAACHBwAgGwAA_gYAIBwAAP4GACAdAACABwAg_QMAAIkHADD-AwAAGgAQ_wMAAIkHADCABAIAuAYAIYQEAQC5BgAhpARAALoGACGlBEAAugYAIZ8FAQC5BgAhoAUBALkGACED3gQAAAMAIN8EAAADACDgBAAAAwAgA94EAAAHACDfBAAABwAg4AQAAAcAIAPeBAAADQAg3wQAAA0AIOAEAAANACAD3gQAABYAIN8EAAAWACDgBAAAFgAgA94EAAAcACDfBAAAHAAg4AQAABwAIAwDAAD_BgAgCgAA8AYAIP0DAACPBwAw_gMAABYAEP8DAACPBwAwgAQCALgGACGEBAEAuQYAIZAEAgDGBgAhpARAALoGACGlBEAAugYAIbcEAQC5BgAhuAQgAMcGACENCQAAkQcAIP0DAACQBwAw_gMAABEAEP8DAACQBwAwgAQCALgGACGXBAEAuQYAIZwEQADDBgAhoAQCALgGACGkBEAAugYAIaUEQAC6BgAhuQQCALgGACG6BAEAuQYAIbsEIADHBgAhDwMAAPgGACAKAACTBwAg_QMAAJIHADD-AwAADQAQ_wMAAJIHADCABAIAuAYAIZAEAgC4BgAhlwQBALkGACGhBCAAxwYAIaQEQAC6BgAhpQRAALoGACG3BAEAuQYAIboEAQC5BgAhpgUAAA0AIKcFAAANACANAwAA-AYAIAoAAJMHACD9AwAAkgcAMP4DAAANABD_AwAAkgcAMIAEAgC4BgAhkAQCALgGACGXBAEAuQYAIaEEIADHBgAhpARAALoGACGlBEAAugYAIbcEAQC5BgAhugQBALkGACED3gQAABEAIN8EAAARACDgBAAAEQAgA7wEAgAAAAG9BAEAAAABvgQCAAAAAQ0DAAD4BgAgBAAAlgcAIP0DAACVBwAw_gMAAAcAEP8DAACVBwAwgAQCALgGACGQBAIAuAYAIaQEQAC6BgAhugQBALkGACG8BAIAuAYAIb0EAQC5BgAhvgQCALgGACG_BAEAuQYAIRMDAAD4BgAgBQAAiwcAIP0DAACXBwAw_gMAAAMAEP8DAACXBwAwgAQCALgGACGEBAEAuQYAIZAEAgC4BgAhoAQCALgGACGhBCAAxwYAIaQEQAC6BgAhpQRAALoGACG1BAEAuQYAIboEAQC5BgAhwAQBALkGACHBBAIAuAYAIcIEAQC5BgAhpgUAAAMAIKcFAAADACARAwAA-AYAIAUAAIsHACD9AwAAlwcAMP4DAAADABD_AwAAlwcAMIAEAgC4BgAhhAQBALkGACGQBAIAuAYAIaAEAgC4BgAhoQQgAMcGACGkBEAAugYAIaUEQAC6BgAhtQQBALkGACG6BAEAuQYAIcAEAQC5BgAhwQQCALgGACHCBAEAuQYAIQAAAAAAAAGrBQEAAAABAasFAQAAAAEFqwUCAAAAAbEFAgAAAAGyBQIAAAABswUCAAAAAbQFAgAAAAEFKgAAlgwAICsAAJkMACCoBQAAlwwAIKkFAACYDAAgrgUAACoAIAMqAACWDAAgqAUAAJcMACCuBQAAKgAgAAAAAAAFKgAAjgwAICsAAJQMACCoBQAAjwwAIKkFAACTDAAgrgUAACoAIAUqAACMDAAgKwAAkQwAIKgFAACNDAAgqQUAAJAMACCuBQAAAQAgAyoAAI4MACCoBQAAjwwAIK4FAAAqACADKgAAjAwAIKgFAACNDAAgrgUAAAEAIAAAAAAAAasFQAAAAAEBqwUgAAAAAQGrBUAAAAABBasFAgAAAAGxBQIAAAABsgUCAAAAAbMFAgAAAAG0BQIAAAABBSoAAPgLACArAACKDAAgqAUAAPkLACCpBQAAiQwAIK4FAAAeACAFKgAA9gsAICsAAIcMACCoBQAA9wsAIKkFAACGDAAgrgUAACYAIAcqAADwCwAgKwAAhAwAIKgFAADxCwAgqQUAAIMMACCsBQAAKAAgrQUAACgAIK4FAAAqACALKgAA1QcAMCsAANoHADCoBQAA1gcAMKkFAADXBwAwqgUAANgHACCrBQAA2QcAMKwFAADZBwAwrQUAANkHADCuBQAA2QcAMK8FAADbBwAwsAUAANwHADAHKgAA9AsAICsAAIEMACCoBQAA9QsAIKkFAACADAAgrAUAABoAIK0FAAAaACCuBQAAAQAgBSoAAPILACArAAD-CwAgqAUAAPMLACCpBQAA_QsAIK4FAAABACALKgAAyQcAMCsAAM4HADCoBQAAygcAMKkFAADLBwAwqgUAAMwHACCrBQAAzQcAMKwFAADNBwAwrQUAAM0HADCuBQAAzQcAMK8FAADPBwAwsAUAANAHADALKgAAvQcAMCsAAMIHADCoBQAAvgcAMKkFAAC_BwAwqgUAAMAHACCrBQAAwQcAMKwFAADBBwAwrQUAAMEHADCuBQAAwQcAMK8FAADDBwAwsAUAAMQHADAEgAQCAAAAAYEEAQAAAAGCBAEAAAABhAQBAAAAAQIAAAA1ACAqAADIBwAgAwAAADUAICoAAMgHACArAADHBwAgASMAAPwLADAJFQAA9QYAIP0DAAD0BgAw_gMAADMAEP8DAAD0BgAwgAQCAAAAAYEEAQAAAAGCBAEAxQYAIYMEAgC4BgAhhAQBALkGACECAAAANQAgIwAAxwcAIAIAAADFBwAgIwAAxgcAIAj9AwAAxAcAMP4DAADFBwAQ_wMAAMQHADCABAIAuAYAIYEEAQC5BgAhggQBAMUGACGDBAIAuAYAIYQEAQC5BgAhCP0DAADEBwAw_gMAAMUHABD_AwAAxAcAMIAEAgC4BgAhgQQBALkGACGCBAEAxQYAIYMEAgC4BgAhhAQBALkGACEEgAQCAKAHACGBBAEAngcAIYIEAQCfBwAhhAQBAJ4HACEEgAQCAKAHACGBBAEAngcAIYIEAQCfBwAhhAQBAJ4HACEEgAQCAAAAAYEEAQAAAAGCBAEAAAABhAQBAAAAAQUDAACrBwAggAQCAAAAAYEEAQAAAAGCBAEAAAABkAQCAAAAAQIAAAAxACAqAADUBwAgAwAAADEAICoAANQHACArAADTBwAgASMAAPsLADALAwAA-AYAIBUAAPUGACD9AwAA9wYAMP4DAAAvABD_AwAA9wYAMIAEAgAAAAGBBAEAAAABggQBAMUGACGDBAIAuAYAIZAEAgC4BgAhoQUAAPYGACACAAAAMQAgIwAA0wcAIAIAAADRBwAgIwAA0gcAIAj9AwAA0AcAMP4DAADRBwAQ_wMAANAHADCABAIAuAYAIYEEAQC5BgAhggQBAMUGACGDBAIAuAYAIZAEAgC4BgAhCP0DAADQBwAw_gMAANEHABD_AwAA0AcAMIAEAgC4BgAhgQQBALkGACGCBAEAxQYAIYMEAgC4BgAhkAQCALgGACEEgAQCAKAHACGBBAEAngcAIYIEAQCfBwAhkAQCAKAHACEFAwAAqQcAIIAEAgCgBwAhgQQBAJ4HACGCBAEAnwcAIZAEAgCgBwAhBQMAAKsHACCABAIAAAABgQQBAAAAAYIEAQAAAAGQBAIAAAABHg4AAOEHACAPAADmBwAgEAAA4gcAIBIAAOMHACATAADkBwAgFAAA5QcAIBYAAOcHACCABAIAAAABgQQBAAAAAZEEAQAAAAGSBAEAAAABkwQBAAAAAZQEAgAAAAGVBAIAAAABlwQBAAAAAZgEAQAAAAGZBAEAAAABmgRAAAAAAZsEAQAAAAGcBEAAAAABnQQCAAAAAZ4EAgAAAAGfBIAAAAABoAQCAAAAAaEEIAAAAAGiBEAAAAABowQBAAAAAaQEQAAAAAGlBEAAAAABpgQCAAAAAQIAAAAqACAqAADgBwAgAwAAACoAICoAAOAHACArAADfBwAgASMAAPoLADAkDgAA-wYAIA8AAIAHACAQAAD8BgAgEQAA_QYAIBIAAP4GACATAAD_BgAgFAAA-AYAIBYAAIEHACD9AwAA-gYAMP4DAAAoABD_AwAA-gYAMIAEAgAAAAGBBAEAAAABkQQBAMUGACGSBAEAxQYAIZMEAQDFBgAhlAQCALgGACGVBAIAuAYAIZYEAgDGBgAhlwQBALkGACGYBAEAuQYAIZkEAQDFBgAhmgRAAMMGACGbBAEAuQYAIZwEQADDBgAhnQQCAMYGACGeBAIAuAYAIZ8EAADwBgAgoAQCALgGACGhBCAAxwYAIaIEQADDBgAhowQBAMUGACGkBEAAugYAIaUEQAC6BgAhpgQCAMYGACGiBQAA-QYAIAIAAAAqACAjAADfBwAgAgAAAN0HACAjAADeBwAgG_0DAADcBwAw_gMAAN0HABD_AwAA3AcAMIAEAgC4BgAhgQQBALkGACGRBAEAxQYAIZIEAQDFBgAhkwQBAMUGACGUBAIAuAYAIZUEAgC4BgAhlgQCAMYGACGXBAEAuQYAIZgEAQC5BgAhmQQBAMUGACGaBEAAwwYAIZsEAQC5BgAhnARAAMMGACGdBAIAxgYAIZ4EAgC4BgAhnwQAAPAGACCgBAIAuAYAIaEEIADHBgAhogRAAMMGACGjBAEAxQYAIaQEQAC6BgAhpQRAALoGACGmBAIAxgYAIRv9AwAA3AcAMP4DAADdBwAQ_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-BgAg_QMAAIMHADD-AwAAJAAQ_wMAAIMHADCABAIAAAABgQQBAAAAAYQEAQC5BgAhkQQBAMUGACGUBAIAuAYAIaAEAgC4BgAhpARAALoGACGlBEAAugYAIa0EAQDFBgAhrgQBALkGACGjBQAAggcAIAIAAAAmACAjAACgCAAgAgAAAJ4IACAjAACfCAAgDf0DAACdCAAw_gMAAJ4IABD_AwAAnQgAMIAEAgC4BgAhgQQBALkGACGEBAEAuQYAIZEEAQDFBgAhlAQCALgGACGgBAIAuAYAIaQEQAC6BgAhpQRAALoGACGtBAEAxQYAIa4EAQC5BgAhDf0DAACdCAAw_gMAAJ4IABD_AwAAnQgAMIAEAgC4BgAhgQQBALkGACGEBAEAuQYAIZEEAQDFBgAhlAQCALgGACGgBAIAuAYAIaQEQAC6BgAhpQRAALoGACGtBAEAxQYAIa4EAQC5BgAhCYAEAgCgBwAhgQQBAJ4HACGEBAEAngcAIZEEAQCfBwAhoAQCAKAHACGkBEAAswcAIaUEQACzBwAhrQQBAJ8HACGuBAEAngcAIQoXAADvBwAggAQCAKAHACGBBAEAngcAIYQEAQCeBwAhkQQBAJ8HACGgBAIAoAcAIaQEQACzBwAhpQRAALMHACGtBAEAnwcAIa4EAQCeBwAhChcAAPoHACCABAIAAAABgQQBAAAAAYQEAQAAAAGRBAEAAAABoAQCAAAAAaQEQAAAAAGlBEAAAAABrQQBAAAAAa4EAQAAAAEHAwAAgwgAIIAEAgAAAAGBBAEAAAABkAQCAAAAAZEEAQAAAAGkBEAAAAABrwQBAAAAAQIAAAAiACAqAACtCAAgAwAAACIAICoAAK0IACArAACsCAAgASMAANoLADANAwAA-AYAIA4AAPsGACD9AwAAhQcAMP4DAAAgABD_AwAAhQcAMIAEAgAAAAGBBAEAAAABkAQCALgGACGRBAEAxQYAIZQEAgC4BgAhpARAALoGACGvBAEAuQYAIaQFAACEBwAgAgAAACIAICMAAKwIACACAAAAqggAICMAAKsIACAK_QMAAKkIADD-AwAAqggAEP8DAACpCAAwgAQCALgGACGBBAEAuQYAIZAEAgC4BgAhkQQBAMUGACGUBAIAuAYAIaQEQAC6BgAhrwQBALkGACEK_QMAAKkIADD-AwAAqggAEP8DAACpCAAwgAQCALgGACGBBAEAuQYAIZAEAgC4BgAhkQQBAMUGACGUBAIAuAYAIaQEQAC6BgAhrwQBALkGACEGgAQCAKAHACGBBAEAngcAIZAEAgCgBwAhkQQBAJ8HACGkBEAAswcAIa8EAQCeBwAhBwMAAIEIACCABAIAoAcAIYEEAQCeBwAhkAQCAKAHACGRBAEAnwcAIaQEQACzBwAhrwQBAJ4HACEHAwAAgwgAIIAEAgAAAAGBBAEAAAABkAQCAAAAAZEEAQAAAAGkBEAAAAABrwQBAAAAAQMqAADYCwAgqAUAANkLACCuBQAAAQAgBCoAAKIIADCoBQAAowgAMKoFAAClCAAgrgUAAKYIADAEKgAAlggAMKgFAACXCAAwqgUAAJkIACCuBQAAmggAMAQqAACNCAAwqAUAAI4IADCqBQAAkAgAIK4FAADZBwAwAAAAAAAHKgAA0wsAICsAANYLACCoBQAA1AsAIKkFAADVCwAgrAUAABoAIK0FAAAaACCuBQAAAQAgAyoAANMLACCoBQAA1AsAIK4FAAABACAAAAAAAAUqAADOCwAgKwAA0QsAIKgFAADPCwAgqQUAANALACCuBQAADwAgAyoAAM4LACCoBQAAzwsAIK4FAAAPACAAAAAAAAUqAADICwAgKwAAzAsAIKgFAADJCwAgqQUAAMsLACCuBQAAAQAgCyoAAMcIADArAADMCAAwqAUAAMgIADCpBQAAyQgAMKoFAADKCAAgqwUAAMsIADCsBQAAywgAMK0FAADLCAAwrgUAAMsIADCvBQAAzQgAMLAFAADOCAAwCIAEAgAAAAGXBAEAAAABnARAAAAAAaAEAgAAAAGkBEAAAAABpQRAAAAAAboEAQAAAAG7BCAAAAABAgAAABMAICoAANIIACADAAAAEwAgKgAA0ggAICsAANEIACABIwAAygsAMA0JAACRBwAg_QMAAJAHADD-AwAAEQAQ_wMAAJAHADCABAIAAAABlwQBALkGACGcBEAAwwYAIaAEAgC4BgAhpARAALoGACGlBEAAugYAIbkEAgC4BgAhugQBALkGACG7BCAAxwYAIQIAAAATACAjAADRCAAgAgAAAM8IACAjAADQCAAgDP0DAADOCAAw_gMAAM8IABD_AwAAzggAMIAEAgC4BgAhlwQBALkGACGcBEAAwwYAIaAEAgC4BgAhpARAALoGACGlBEAAugYAIbkEAgC4BgAhugQBALkGACG7BCAAxwYAIQz9AwAAzggAMP4DAADPCAAQ_wMAAM4IADCABAIAuAYAIZcEAQC5BgAhnARAAMMGACGgBAIAuAYAIaQEQAC6BgAhpQRAALoGACG5BAIAuAYAIboEAQC5BgAhuwQgAMcGACEIgAQCAKAHACGXBAEAngcAIZwEQACxBwAhoAQCAKAHACGkBEAAswcAIaUEQACzBwAhugQBAJ4HACG7BCAAsgcAIQiABAIAoAcAIZcEAQCeBwAhnARAALEHACGgBAIAoAcAIaQEQACzBwAhpQRAALMHACG6BAEAngcAIbsEIACyBwAhCIAEAgAAAAGXBAEAAAABnARAAAAAAaAEAgAAAAGkBEAAAAABpQRAAAAAAboEAQAAAAG7BCAAAAABAyoAAMgLACCoBQAAyQsAIK4FAAABACAEKgAAxwgAMKgFAADICAAwqgUAAMoIACCuBQAAywgAMAAAAAAABSoAAMALACArAADGCwAgqAUAAMELACCpBQAAxQsAIK4FAAAFACAFKgAAvgsAICsAAMMLACCoBQAAvwsAIKkFAADCCwAgrgUAAAEAIAMqAADACwAgqAUAAMELACCuBQAABQAgAyoAAL4LACCoBQAAvwsAIK4FAAABACAAAAAAAAUqAAC4CwAgKwAAvAsAIKgFAAC5CwAgqQUAALsLACCuBQAAAQAgCyoAAOUIADArAADqCAAwqAUAAOYIADCpBQAA5wgAMKoFAADoCAAgqwUAAOkIADCsBQAA6QgAMK0FAADpCAAwrgUAAOkIADCvBQAA6wgAMLAFAADsCAAwCAMAAN0IACCABAIAAAABkAQCAAAAAaQEQAAAAAG6BAEAAAABvQQBAAAAAb4EAgAAAAG_BAEAAAABAgAAAAkAICoAAPAIACADAAAACQAgKgAA8AgAICsAAO8IACABIwAAugsAMA4DAAD4BgAgBAAAlgcAIP0DAACVBwAw_gMAAAcAEP8DAACVBwAwgAQCAAAAAZAEAgC4BgAhpARAALoGACG6BAEAuQYAIbwEAgC4BgAhvQQBALkGACG-BAIAuAYAIb8EAQC5BgAhpQUAAJQHACACAAAACQAgIwAA7wgAIAIAAADtCAAgIwAA7ggAIAv9AwAA7AgAMP4DAADtCAAQ_wMAAOwIADCABAIAuAYAIZAEAgC4BgAhpARAALoGACG6BAEAuQYAIbwEAgC4BgAhvQQBALkGACG-BAIAuAYAIb8EAQC5BgAhC_0DAADsCAAw_gMAAO0IABD_AwAA7AgAMIAEAgC4BgAhkAQCALgGACGkBEAAugYAIboEAQC5BgAhvAQCALgGACG9BAEAuQYAIb4EAgC4BgAhvwQBALkGACEHgAQCAKAHACGQBAIAoAcAIaQEQACzBwAhugQBAJ4HACG9BAEAngcAIb4EAgCgBwAhvwQBAJ4HACEIAwAA2wgAIIAEAgCgBwAhkAQCAKAHACGkBEAAswcAIboEAQCeBwAhvQQBAJ4HACG-BAIAoAcAIb8EAQCeBwAhCAMAAN0IACCABAIAAAABkAQCAAAAAaQEQAAAAAG6BAEAAAABvQQBAAAAAb4EAgAAAAG_BAEAAAABAyoAALgLACCoBQAAuQsAIK4FAAABACAEKgAA5QgAMKgFAADmCAAwqgUAAOgIACCuBQAA6QgAMAAAAAAABasFCAAAAAGxBQgAAAABsgUIAAAAAbMFCAAAAAG0BQgAAAABBSoAALMLACArAAC2CwAgqAUAALQLACCpBQAAtQsAIK4FAACtAwAgAyoAALMLACCoBQAAtAsAIK4FAACtAwAgAAAAAAAFKgAArgsAICsAALELACCoBQAArwsAIKkFAACwCwAgrgUAAK0DACADKgAArgsAIKgFAACvCwAgrgUAAK0DACAAAAAAAAUqAACnCwAgKwAArAsAIKgFAACoCwAgqQUAAKsLACCuBQAAqQMAIAsqAACWCQAwKwAAmwkAMKgFAACXCQAwqQUAAJgJADCqBQAAmQkAIKsFAACaCQAwrAUAAJoJADCtBQAAmgkAMK4FAACaCQAwrwUAAJwJADCwBQAAnQkAMAsqAACKCQAwKwAAjwkAMKgFAACLCQAwqQUAAIwJADCqBQAAjQkAIKsFAACOCQAwrAUAAI4JADCtBQAAjgkAMK4FAACOCQAwrwUAAJAJADCwBQAAkQkAMAaABAIAAAABpARAAAAAAcQEQAAAAAHFBAgAAAABxgQIAAAAAccEgAAAAAECAAAAtQMAICoAAJUJACADAAAAtQMAICoAAJUJACArAACUCQAgASMAAKoLADAMiQIAAMAGACD9AwAAvQYAMP4DAACzAwAQ_wMAAL0GADCABAIAAAABpARAALoGACHDBAIAuAYAIcQEQAC6BgAhxQQIAL4GACHGBAgAvgYAIccEAAC_BgAg4QQAALwGACACAAAAtQMAICMAAJQJACACAAAAkgkAICMAAJMJACAK_QMAAJEJADD-AwAAkgkAEP8DAACRCQAwgAQCALgGACGkBEAAugYAIcMEAgC4BgAhxARAALoGACHFBAgAvgYAIcYECAC-BgAhxwQAAL8GACAK_QMAAJEJADD-AwAAkgkAEP8DAACRCQAwgAQCALgGACGkBEAAugYAIcMEAgC4BgAhxARAALoGACHFBAgAvgYAIcYECAC-BgAhxwQAAL8GACAGgAQCAKAHACGkBEAAswcAIcQEQACzBwAhxQQIAPgIACHGBAgA-AgAIccEgAAAAAEGgAQCAKAHACGkBEAAswcAIcQEQACzBwAhxQQIAPgIACHGBAgA-AgAIccEgAAAAAEGgAQCAAAAAaQEQAAAAAHEBEAAAAABxQQIAAAAAcYECAAAAAHHBIAAAAABDoAEAgAAAAGkBEAAAAABvQRAAAAAAcUECAAAAAHGBAgAAAABxwSAAAAAAcgECAAAAAHJBAgAAAABygQIAAAAAcsECAAAAAHMBAgAAAABzQQIAAAAAc4EAQAAAAHPBEAAAAABAgAAALEDACAqAAChCQAgAwAAALEDACAqAAChCQAgKwAAoAkAIAEjAACpCwAwFIkCAADABgAg_QMAAMIGADD-AwAArwMAEP8DAADCBgAwgAQCAAAAAaQEQAC6BgAhvQRAALoGACHDBAIAuAYAIcUECAC-BgAhxgQIAL4GACHHBAAAvwYAIMgECAC-BgAhyQQIAL4GACHKBAgAvgYAIcsECAC-BgAhzAQIAL4GACHNBAgAvgYAIc4EAQC5BgAhzwRAAMMGACHiBAAAwQYAIAIAAACxAwAgIwAAoAkAIAIAAACeCQAgIwAAnwkAIBL9AwAAnQkAMP4DAACeCQAQ_wMAAJ0JADCABAIAuAYAIaQEQAC6BgAhvQRAALoGACHDBAIAuAYAIcUECAC-BgAhxgQIAL4GACHHBAAAvwYAIMgECAC-BgAhyQQIAL4GACHKBAgAvgYAIcsECAC-BgAhzAQIAL4GACHNBAgAvgYAIc4EAQC5BgAhzwRAAMMGACES_QMAAJ0JADD-AwAAngkAEP8DAACdCQAwgAQCALgGACGkBEAAugYAIb0EQAC6BgAhwwQCALgGACHFBAgAvgYAIcYECAC-BgAhxwQAAL8GACDIBAgAvgYAIckECAC-BgAhygQIAL4GACHLBAgAvgYAIcwECAC-BgAhzQQIAL4GACHOBAEAuQYAIc8EQADDBgAhDoAEAgCgBwAhpARAALMHACG9BEAAswcAIcUECAD4CAAhxgQIAPgIACHHBIAAAAAByAQIAPgIACHJBAgA-AgAIcoECAD4CAAhywQIAPgIACHMBAgA-AgAIc0ECAD4CAAhzgQBAJ4HACHPBEAAsQcAIQ6ABAIAoAcAIaQEQACzBwAhvQRAALMHACHFBAgA-AgAIcYECAD4CAAhxwSAAAAAAcgECAD4CAAhyQQIAPgIACHKBAgA-AgAIcsECAD4CAAhzAQIAPgIACHNBAgA-AgAIc4EAQCeBwAhzwRAALEHACEOgAQCAAAAAaQEQAAAAAG9BEAAAAABxQQIAAAAAcYECAAAAAHHBIAAAAAByAQIAAAAAckECAAAAAHKBAgAAAABywQIAAAAAcwECAAAAAHNBAgAAAABzgQBAAAAAc8EQAAAAAEDKgAApwsAIKgFAACoCwAgrgUAAKkDACAEKgAAlgkAMKgFAACXCQAwqgUAAJkJACCuBQAAmgkAMAQqAACKCQAwqAUAAIsJADCqBQAAjQkAIK4FAACOCQAwAAAAAAALKgAAqwkAMCsAALAJADCoBQAArAkAMKkFAACtCQAwqgUAAK4JACCrBQAArwkAMKwFAACvCQAwrQUAAK8JADCuBQAArwkAMK8FAACxCQAwsAUAALIJADASigIAAKMJACCLAgAApAkAIIAEAgAAAAGEBAEAAAABpARAAAAAAdAEAQAAAAHSBAEAAAAB0wQBAAAAAdQEAgAAAAHVBAIAAAAB1gQCAAAAAdcEAgAAAAHYBAIAAAAB2QQCAAAAAdoEAgAAAAHbBEAAAAAB3AQgAAAAAd0EQAAAAAECAAAArQMAICoAALYJACADAAAArQMAICoAALYJACArAAC1CQAgASMAAKYLADAXiAIAAMgGACCKAgAAyQYAIIsCAADKBgAg_QMAAMQGADD-AwAAqwMAEP8DAADEBgAwgAQCAAAAAYQEAQC5BgAhpARAALoGACHQBAEAAAAB0QQBALkGACHSBAEAuQYAIdMEAQDFBgAh1AQCALgGACHVBAIAuAYAIdYEAgC4BgAh1wQCALgGACHYBAIAuAYAIdkEAgC4BgAh2gQCAMYGACHbBEAAwwYAIdwEIADHBgAh3QRAAMMGACECAAAArQMAICMAALUJACACAAAAswkAICMAALQJACAU_QMAALIJADD-AwAAswkAEP8DAACyCQAwgAQCALgGACGEBAEAuQYAIaQEQAC6BgAh0AQBALkGACHRBAEAuQYAIdIEAQC5BgAh0wQBAMUGACHUBAIAuAYAIdUEAgC4BgAh1gQCALgGACHXBAIAuAYAIdgEAgC4BgAh2QQCALgGACHaBAIAxgYAIdsEQADDBgAh3AQgAMcGACHdBEAAwwYAIRT9AwAAsgkAMP4DAACzCQAQ_wMAALIJADCABAIAuAYAIYQEAQC5BgAhpARAALoGACHQBAEAuQYAIdEEAQC5BgAh0gQBALkGACHTBAEAxQYAIdQEAgC4BgAh1QQCALgGACHWBAIAuAYAIdcEAgC4BgAh2AQCALgGACHZBAIAuAYAIdoEAgDGBgAh2wRAAMMGACHcBCAAxwYAId0EQADDBgAhEIAEAgCgBwAhhAQBAJ4HACGkBEAAswcAIdAEAQCeBwAh0gQBAJ4HACHTBAEAnwcAIdQEAgCgBwAh1QQCAKAHACHWBAIAoAcAIdcEAgCgBwAh2AQCAKAHACHZBAIAoAcAIdoEAgC0BwAh2wRAALEHACHcBCAAsgcAId0EQACxBwAhEooCAACICQAgiwIAAIkJACCABAIAoAcAIYQEAQCeBwAhpARAALMHACHQBAEAngcAIdIEAQCeBwAh0wQBAJ8HACHUBAIAoAcAIdUEAgCgBwAh1gQCAKAHACHXBAIAoAcAIdgEAgCgBwAh2QQCAKAHACHaBAIAtAcAIdsEQACxBwAh3AQgALIHACHdBEAAsQcAIRKKAgAAowkAIIsCAACkCQAggAQCAAAAAYQEAQAAAAGkBEAAAAAB0AQBAAAAAdIEAQAAAAHTBAEAAAAB1AQCAAAAAdUEAgAAAAHWBAIAAAAB1wQCAAAAAdgEAgAAAAHZBAIAAAAB2gQCAAAAAdsEQAAAAAHcBCAAAAAB3QRAAAAAAQQqAACrCQAwqAUAAKwJADCqBQAArgkAIK4FAACvCQAwAAeIAgAAugkAIIoCAAC7CQAgiwIAALwJACDTBAAAmAcAINoEAACYBwAg2wQAAJgHACDdBAAAmAcAIAGMAgAAuAkAIAAAAAAAAAAAAAAAAAWrBQgAAAABsQUIAAAAAbIFCAAAAAGzBQgAAAABtAUIAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAABasFBAAAAAGxBQQAAAABsgUEAAAAAbMFBAAAAAG0BQQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAFKgAAoQsAICsAAKQLACCoBQAAogsAIKkFAACjCwAgrgUAAJQBACADKgAAoQsAIKgFAACiCwAgrgUAAJQBACAAAAAAAAsqAAD5CQAwKwAA_gkAMKgFAAD6CQAwqQUAAPsJADCqBQAA_AkAIKsFAAD9CQAwrAUAAP0JADCtBQAA_QkAMK4FAAD9CQAwrwUAAP8JADCwBQAAgAoAMAWABAIAAAABpARAAAAAAaUEQAAAAAHABAEAAAABmAUIAAAAAQIAAACYAQAgKgAAhAoAIAMAAACYAQAgKgAAhAoAICsAAIMKACABIwAAoAsAMAtWAADtBgAg_QMAAOwGADD-AwAAlgEAEP8DAADsBgAwgAQCAAAAAaQEQAC6BgAhpQRAALoGACHABAEAuQYAIZcFAgC4BgAhmAUIANEGACGdBQAA6wYAIAIAAACYAQAgIwAAgwoAIAIAAACBCgAgIwAAggoAIAn9AwAAgAoAMP4DAACBCgAQ_wMAAIAKADCABAIAuAYAIaQEQAC6BgAhpQRAALoGACHABAEAuQYAIZcFAgC4BgAhmAUIANEGACEJ_QMAAIAKADD-AwAAgQoAEP8DAACACgAwgAQCALgGACGkBEAAugYAIaUEQAC6BgAhwAQBALkGACGXBQIAuAYAIZgFCADRBgAhBYAEAgCgBwAhpARAALMHACGlBEAAswcAIcAEAQCeBwAhmAUIAMcJACEFgAQCAKAHACGkBEAAswcAIaUEQACzBwAhwAQBAJ4HACGYBQgAxwkAIQWABAIAAAABpARAAAAAAaUEQAAAAAHABAEAAAABmAUIAAAAAQQqAAD5CQAwqAUAAPoJADCqBQAA_AkAIK4FAAD9CQAwAAFXAACGCgAgAAAAAAAAAAAAAAAAAAAACyoAAPEKADArAAD2CgAwqAUAAPIKADCpBQAA8woAMKoFAAD0CgAgqwUAAPUKADCsBQAA9QoAMK0FAAD1CgAwrgUAAPUKADCvBQAA9woAMLAFAAD4CgAwCyoAAOgKADArAADsCgAwqAUAAOkKADCpBQAA6goAMKoFAADrCgAgqwUAAOkIADCsBQAA6QgAMK0FAADpCAAwrgUAAOkIADCvBQAA7QoAMLAFAADsCAAwCyoAANwKADArAADhCgAwqAUAAN0KADCpBQAA3goAMKoFAADfCgAgqwUAAOAKADCsBQAA4AoAMK0FAADgCgAwrgUAAOAKADCvBQAA4goAMLAFAADjCgAwCyoAANAKADArAADVCgAwqAUAANEKADCpBQAA0goAMKoFAADTCgAgqwUAANQKADCsBQAA1AoAMK0FAADUCgAwrgUAANQKADCvBQAA1goAMLAFAADXCgAwCyoAAMQKADArAADJCgAwqAUAAMUKADCpBQAAxgoAMKoFAADHCgAgqwUAAMgKADCsBQAAyAoAMK0FAADICgAwrgUAAMgKADCvBQAAygoAMLAFAADLCgAwCyoAALsKADArAAC_CgAwqAUAALwKADCpBQAAvQoAMKoFAAC-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-AYAIA8AAIcHACAXAAD-BgAgGAAAiAcAIP0DAACGBwAw_gMAABwAEP8DAACGBwAwgAQCAAAAAYEEAQAAAAGEBAEAuQYAIaEEIADHBgAhpARAALoGACGlBEAAugYAIbAEAQAAAAGxBAIAuAYAIbIEIADHBgAhswQAAPAGACC0BAAAvwYAILUEAQDFBgAhtgQBALkGACECAAAAHgAgIwAAzgoAIAIAAADMCgAgIwAAzQoAIBD9AwAAywoAMP4DAADMCgAQ_wMAAMsKADCABAIAuAYAIYEEAQC5BgAhhAQBALkGACGhBCAAxwYAIaQEQAC6BgAhpQRAALoGACGwBAEAuQYAIbEEAgC4BgAhsgQgAMcGACGzBAAA8AYAILQEAAC_BgAgtQQBAMUGACG2BAEAuQYAIRD9AwAAywoAMP4DAADMCgAQ_wMAAMsKADCABAIAuAYAIYEEAQC5BgAhhAQBALkGACGhBCAAxwYAIaQEQAC6BgAhpQRAALoGACGwBAEAuQYAIbEEAgC4BgAhsgQgAMcGACGzBAAA8AYAILQEAAC_BgAgtQQBAMUGACG2BAEAuQYAIQyABAIAoAcAIYEEAQCeBwAhhAQBAJ4HACGhBCAAsgcAIaQEQACzBwAhpQRAALMHACGwBAEAngcAIbIEIACyBwAhswSAAAAAAbQEgAAAAAG1BAEAnwcAIbYEAQCeBwAhDw8AAIoIACAXAACMCAAgGAAAiwgAIIAEAgCgBwAhgQQBAJ4HACGEBAEAngcAIaEEIACyBwAhpARAALMHACGlBEAAswcAIbAEAQCeBwAhsgQgALIHACGzBIAAAAABtASAAAAAAbUEAQCfBwAhtgQBAJ4HACEPDwAArwgAIBcAALEIACAYAACwCAAggAQCAAAAAYEEAQAAAAGEBAEAAAABoQQgAAAAAaQEQAAAAAGlBEAAAAABsAQBAAAAAbIEIAAAAAGzBIAAAAABtASAAAAAAbUEAQAAAAG2BAEAAAABBwqAAAAAAYAEAgAAAAGEBAEAAAABpARAAAAAAaUEQAAAAAG3BAEAAAABuAQgAAAAAQIAAAAYACAqAADbCgAgAwAAABgAICoAANsKACArAADaCgAgASMAAJoLADAMAwAA_wYAIAoAAPAGACD9AwAAjwcAMP4DAAAWABD_AwAAjwcAMIAEAgAAAAGEBAEAuQYAIZAEAgDGBgAhpARAALoGACGlBEAAugYAIbcEAQC5BgAhuAQgAMcGACECAAAAGAAgIwAA2goAIAIAAADYCgAgIwAA2QoAIAsKAADwBgAg_QMAANcKADD-AwAA2AoAEP8DAADXCgAwgAQCALgGACGEBAEAuQYAIZAEAgDGBgAhpARAALoGACGlBEAAugYAIbcEAQC5BgAhuAQgAMcGACELCgAA8AYAIP0DAADXCgAw_gMAANgKABD_AwAA1woAMIAEAgC4BgAhhAQBALkGACGQBAIAxgYAIaQEQAC6BgAhpQRAALoGACG3BAEAuQYAIbgEIADHBgAhBwqAAAAAAYAEAgCgBwAhhAQBAJ4HACGkBEAAswcAIaUEQACzBwAhtwQBAJ4HACG4BCAAsgcAIQcKgAAAAAGABAIAoAcAIYQEAQCeBwAhpARAALMHACGlBEAAswcAIbcEAQCeBwAhuAQgALIHACEHCoAAAAABgAQCAAAAAYQEAQAAAAGkBEAAAAABpQRAAAAAAbcEAQAAAAG4BCAAAAABCAoAANQIACCABAIAAAABlwQBAAAAAaEEIAAAAAGkBEAAAAABpQRAAAAAAbcEAQAAAAG6BAEAAAABAgAAAA8AICoAAOcKACADAAAADwAgKgAA5woAICsAAOYKACABIwAAmQsAMA0DAAD4BgAgCgAAkwcAIP0DAACSBwAw_gMAAA0AEP8DAACSBwAwgAQCAAAAAZAEAgC4BgAhlwQBALkGACGhBCAAxwYAIaQEQAC6BgAhpQRAALoGACG3BAEAuQYAIboEAQC5BgAhAgAAAA8AICMAAOYKACACAAAA5AoAICMAAOUKACAL_QMAAOMKADD-AwAA5AoAEP8DAADjCgAwgAQCALgGACGQBAIAuAYAIZcEAQC5BgAhoQQgAMcGACGkBEAAugYAIaUEQAC6BgAhtwQBALkGACG6BAEAuQYAIQv9AwAA4woAMP4DAADkCgAQ_wMAAOMKADCABAIAuAYAIZAEAgC4BgAhlwQBALkGACGhBCAAxwYAIaQEQAC6BgAhpQRAALoGACG3BAEAuQYAIboEAQC5BgAhB4AEAgCgBwAhlwQBAJ4HACGhBCAAsgcAIaQEQACzBwAhpQRAALMHACG3BAEAngcAIboEAQCeBwAhCAoAAMYIACCABAIAoAcAIZcEAQCeBwAhoQQgALIHACGkBEAAswcAIaUEQACzBwAhtwQBAJ4HACG6BAEAngcAIQgKAADUCAAggAQCAAAAAZcEAQAAAAGhBCAAAAABpARAAAAAAaUEQAAAAAG3BAEAAAABugQBAAAAAQgEAADcCAAggAQCAAAAAaQEQAAAAAG6BAEAAAABvAQCAAAAAb0EAQAAAAG-BAIAAAABvwQBAAAAAQIAAAAJACAqAADwCgAgAwAAAAkAICoAAPAKACArAADvCgAgASMAAJgLADACAAAACQAgIwAA7woAIAIAAADtCAAgIwAA7goAIAeABAIAoAcAIaQEQACzBwAhugQBAJ4HACG8BAIAoAcAIb0EAQCeBwAhvgQCAKAHACG_BAEAngcAIQgEAADaCAAggAQCAKAHACGkBEAAswcAIboEAQCeBwAhvAQCAKAHACG9BAEAngcAIb4EAgCgBwAhvwQBAJ4HACEIBAAA3AgAIIAEAgAAAAGkBEAAAAABugQBAAAAAbwEAgAAAAG9BAEAAAABvgQCAAAAAb8EAQAAAAEMBQAA8ggAIIAEAgAAAAGEBAEAAAABoAQCAAAAAaEEIAAAAAGkBEAAAAABpQRAAAAAAbUEAQAAAAG6BAEAAAABwAQBAAAAAcEEAgAAAAHCBAEAAAABAgAAAAUAICoAAPwKACADAAAABQAgKgAA_AoAICsAAPsKACABIwAAlwsAMBEDAAD4BgAgBQAAiwcAIP0DAACXBwAw_gMAAAMAEP8DAACXBwAwgAQCAAAAAYQEAQC5BgAhkAQCALgGACGgBAIAuAYAIaEEIADHBgAhpARAALoGACGlBEAAugYAIbUEAQC5BgAhugQBALkGACHABAEAuQYAIcEEAgC4BgAhwgQBALkGACECAAAABQAgIwAA-woAIAIAAAD5CgAgIwAA-goAIA_9AwAA-AoAMP4DAAD5CgAQ_wMAAPgKADCABAIAuAYAIYQEAQC5BgAhkAQCALgGACGgBAIAuAYAIaEEIADHBgAhpARAALoGACGlBEAAugYAIbUEAQC5BgAhugQBALkGACHABAEAuQYAIcEEAgC4BgAhwgQBALkGACEP_QMAAPgKADD-AwAA-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_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_goAIAsAAP8KACAMAACACwAgGQAAgQsAIBoAAIILACAbAACDCwAgHAAAhAsAIB0AAIULACCABAIAAAABhAQBAAAAAaQEQAAAAAGlBEAAAAABnwUBAAAAAaAFAQAAAAECAAAAAQAgKgAAuAsAIAeABAIAAAABkAQCAAAAAaQEQAAAAAG6BAEAAAABvQQBAAAAAb4EAgAAAAG_BAEAAAABAwAAABoAICoAALgLACArAAC9CwAgEAAAABoAIAgAAJgKACALAACZCgAgDAAAmgoAIBkAAJsKACAaAACcCgAgGwAAnQoAIBwAAJ4KACAdAACfCgAgIwAAvQsAIIAEAgCgBwAhhAQBAJ4HACGkBEAAswcAIaUEQACzBwAhnwUBAJ4HACGgBQEAngcAIQ4IAACYCgAgCwAAmQoAIAwAAJoKACAZAACbCgAgGgAAnAoAIBsAAJ0KACAcAACeCgAgHQAAnwoAIIAEAgCgBwAhhAQBAJ4HACGkBEAAswcAIaUEQACzBwAhnwUBAJ4HACGgBQEAngcAIQ4HAAD9CgAgCwAA_woAIAwAAIALACAZAACBCwAgGgAAggsAIBsAAIMLACAcAACECwAgHQAAhQsAIIAEAgAAAAGEBAEAAAABpARAAAAAAaUEQAAAAAGfBQEAAAABoAUBAAAAAQIAAAABACAqAAC-CwAgDQMAAPEIACCABAIAAAABhAQBAAAAAZAEAgAAAAGgBAIAAAABoQQgAAAAAaQEQAAAAAGlBEAAAAABtQQBAAAAAboEAQAAAAHABAEAAAABwQQCAAAAAcIEAQAAAAECAAAABQAgKgAAwAsAIAMAAAAaACAqAAC-CwAgKwAAxAsAIBAAAAAaACAHAACXCgAgCwAAmQoAIAwAAJoKACAZAACbCgAgGgAAnAoAIBsAAJ0KACAcAACeCgAgHQAAnwoAICMAAMQLACCABAIAoAcAIYQEAQCeBwAhpARAALMHACGlBEAAswcAIZ8FAQCeBwAhoAUBAJ4HACEOBwAAlwoAIAsAAJkKACAMAACaCgAgGQAAmwoAIBoAAJwKACAbAACdCgAgHAAAngoAIB0AAJ8KACCABAIAoAcAIYQEAQCeBwAhpARAALMHACGlBEAAswcAIZ8FAQCeBwAhoAUBAJ4HACEDAAAAAwAgKgAAwAsAICsAAMcLACAPAAAAAwAgAwAA4wgAICMAAMcLACCABAIAoAcAIYQEAQCeBwAhkAQCAKAHACGgBAIAoAcAIaEEIACyBwAhpARAALMHACGlBEAAswcAIbUEAQCeBwAhugQBAJ4HACHABAEAngcAIcEEAgCgBwAhwgQBAJ4HACENAwAA4wgAIIAEAgCgBwAhhAQBAJ4HACGQBAIAoAcAIaAEAgCgBwAhoQQgALIHACGkBEAAswcAIaUEQACzBwAhtQQBAJ4HACG6BAEAngcAIcAEAQCeBwAhwQQCAKAHACHCBAEAngcAIQ4HAAD9CgAgCAAA_goAIAwAAIALACAZAACBCwAgGgAAggsAIBsAAIMLACAcAACECwAgHQAAhQsAIIAEAgAAAAGEBAEAAAABpARAAAAAAaUEQAAAAAGfBQEAAAABoAUBAAAAAQIAAAABACAqAADICwAgCIAEAgAAAAGXBAEAAAABnARAAAAAAaAEAgAAAAGkBEAAAAABpQRAAAAAAboEAQAAAAG7BCAAAAABAwAAABoAICoAAMgLACArAADNCwAgEAAAABoAIAcAAJcKACAIAACYCgAgDAAAmgoAIBkAAJsKACAaAACcCgAgGwAAnQoAIBwAAJ4KACAdAACfCgAgIwAAzQsAIIAEAgCgBwAhhAQBAJ4HACGkBEAAswcAIaUEQACzBwAhnwUBAJ4HACGgBQEAngcAIQ4HAACXCgAgCAAAmAoAIAwAAJoKACAZAACbCgAgGgAAnAoAIBsAAJ0KACAcAACeCgAgHQAAnwoAIIAEAgCgBwAhhAQBAJ4HACGkBEAAswcAIaUEQACzBwAhnwUBAJ4HACGgBQEAngcAIQkDAADTCAAggAQCAAAAAZAEAgAAAAGXBAEAAAABoQQgAAAAAaQEQAAAAAGlBEAAAAABtwQBAAAAAboEAQAAAAECAAAADwAgKgAAzgsAIAMAAAANACAqAADOCwAgKwAA0gsAIAsAAAANACADAADFCAAgIwAA0gsAIIAEAgCgBwAhkAQCAKAHACGXBAEAngcAIaEEIACyBwAhpARAALMHACGlBEAAswcAIbcEAQCeBwAhugQBAJ4HACEJAwAAxQgAIIAEAgCgBwAhkAQCAKAHACGXBAEAngcAIaEEIACyBwAhpARAALMHACGlBEAAswcAIbcEAQCeBwAhugQBAJ4HACEOBwAA_QoAIAgAAP4KACALAAD_CgAgGQAAgQsAIBoAAIILACAbAACDCwAgHAAAhAsAIB0AAIULACCABAIAAAABhAQBAAAAAaQEQAAAAAGlBEAAAAABnwUBAAAAAaAFAQAAAAECAAAAAQAgKgAA0wsAIAMAAAAaACAqAADTCwAgKwAA1wsAIBAAAAAaACAHAACXCgAgCAAAmAoAIAsAAJkKACAZAACbCgAgGgAAnAoAIBsAAJ0KACAcAACeCgAgHQAAnwoAICMAANcLACCABAIAoAcAIYQEAQCeBwAhpARAALMHACGlBEAAswcAIZ8FAQCeBwAhoAUBAJ4HACEOBwAAlwoAIAgAAJgKACALAACZCgAgGQAAmwoAIBoAAJwKACAbAACdCgAgHAAAngoAIB0AAJ8KACCABAIAoAcAIYQEAQCeBwAhpARAALMHACGlBEAAswcAIZ8FAQCeBwAhoAUBAJ4HACEOBwAA_QoAIAgAAP4KACALAAD_CgAgDAAAgAsAIBoAAIILACAbAACDCwAgHAAAhAsAIB0AAIULACCABAIAAAABhAQBAAAAAaQEQAAAAAGlBEAAAAABnwUBAAAAAaAFAQAAAAECAAAAAQAgKgAA2AsAIAaABAIAAAABgQQBAAAAAZAEAgAAAAGRBAEAAAABpARAAAAAAa8EAQAAAAEJgAQCAAAAAYEEAQAAAAGEBAEAAAABkQQBAAAAAaAEAgAAAAGkBEAAAAABpQRAAAAAAa0EAQAAAAGuBAEAAAABF4AEAgAAAAGBBAEAAAABkQQBAAAAAZIEAQAAAAGTBAEAAAABlQQCAAAAAZYEAgAAAAGXBAEAAAABmAQBAAAAAZkEAQAAAAGaBEAAAAABmwQBAAAAAZwEQAAAAAGdBAIAAAABngQCAAAAAZ8EgAAAAAGgBAIAAAABoQQgAAAAAaIEQAAAAAGjBAEAAAABpARAAAAAAaUEQAAAAAGmBAIAAAABAwAAABoAICoAANgLACArAADfCwAgEAAAABoAIAcAAJcKACAIAACYCgAgCwAAmQoAIAwAAJoKACAaAACcCgAgGwAAnQoAIBwAAJ4KACAdAACfCgAgIwAA3wsAIIAEAgCgBwAhhAQBAJ4HACGkBEAAswcAIaUEQACzBwAhnwUBAJ4HACGgBQEAngcAIQ4HAACXCgAgCAAAmAoAIAsAAJkKACAMAACaCgAgGgAAnAoAIBsAAJ0KACAcAACeCgAgHQAAnwoAIIAEAgCgBwAhhAQBAJ4HACGkBEAAswcAIaUEQACzBwAhnwUBAJ4HACGgBQEAngcAIQ4HAAD9CgAgCAAA_goAIAsAAP8KACAMAACACwAgGQAAgQsAIBsAAIMLACAcAACECwAgHQAAhQsAIIAEAgAAAAGEBAEAAAABpARAAAAAAaUEQAAAAAGfBQEAAAABoAUBAAAAAQIAAAABACAqAADgCwAgEA0AAK4IACAXAACxCAAgGAAAsAgAIIAEAgAAAAGBBAEAAAABhAQBAAAAAaEEIAAAAAGkBEAAAAABpQRAAAAAAbAEAQAAAAGxBAIAAAABsgQgAAAAAbMEgAAAAAG0BIAAAAABtQQBAAAAAbYEAQAAAAECAAAAHgAgKgAA4gsAIAMAAAAaACAqAADgCwAgKwAA5gsAIBAAAAAaACAHAACXCgAgCAAAmAoAIAsAAJkKACAMAACaCgAgGQAAmwoAIBsAAJ0KACAcAACeCgAgHQAAnwoAICMAAOYLACCABAIAoAcAIYQEAQCeBwAhpARAALMHACGlBEAAswcAIZ8FAQCeBwAhoAUBAJ4HACEOBwAAlwoAIAgAAJgKACALAACZCgAgDAAAmgoAIBkAAJsKACAbAACdCgAgHAAAngoAIB0AAJ8KACCABAIAoAcAIYQEAQCeBwAhpARAALMHACGlBEAAswcAIZ8FAQCeBwAhoAUBAJ4HACEDAAAAHAAgKgAA4gsAICsAAOkLACASAAAAHAAgDQAAiQgAIBcAAIwIACAYAACLCAAgIwAA6QsAIIAEAgCgBwAhgQQBAJ4HACGEBAEAngcAIaEEIACyBwAhpARAALMHACGlBEAAswcAIbAEAQCeBwAhsQQCAKAHACGyBCAAsgcAIbMEgAAAAAG0BIAAAAABtQQBAJ8HACG2BAEAngcAIRANAACJCAAgFwAAjAgAIBgAAIsIACCABAIAoAcAIYEEAQCeBwAhhAQBAJ4HACGhBCAAsgcAIaQEQACzBwAhpQRAALMHACGwBAEAngcAIbEEAgCgBwAhsgQgALIHACGzBIAAAAABtASAAAAAAbUEAQCfBwAhtgQBAJ4HACEQDQAArggAIA8AAK8IACAXAACxCAAggAQCAAAAAYEEAQAAAAGEBAEAAAABoQQgAAAAAaQEQAAAAAGlBEAAAAABsAQBAAAAAbEEAgAAAAGyBCAAAAABswSAAAAAAbQEgAAAAAG1BAEAAAABtgQBAAAAAQIAAAAeACAqAADqCwAgF4AEAgAAAAGBBAEAAAABkQQBAAAAAZIEAQAAAAGTBAEAAAABlAQCAAAAAZYEAgAAAAGXBAEAAAABmAQBAAAAAZkEAQAAAAGaBEAAAAABmwQBAAAAAZwEQAAAAAGdBAIAAAABngQCAAAAAZ8EgAAAAAGgBAIAAAABoQQgAAAAAaIEQAAAAAGjBAEAAAABpARAAAAAAaUEQAAAAAGmBAIAAAABAwAAABwAICoAAOoLACArAADvCwAgEgAAABwAIA0AAIkIACAPAACKCAAgFwAAjAgAICMAAO8LACCABAIAoAcAIYEEAQCeBwAhhAQBAJ4HACGhBCAAsgcAIaQEQACzBwAhpQRAALMHACGwBAEAngcAIbEEAgCgBwAhsgQgALIHACGzBIAAAAABtASAAAAAAbUEAQCfBwAhtgQBAJ4HACEQDQAAiQgAIA8AAIoIACAXAACMCAAggAQCAKAHACGBBAEAngcAIYQEAQCeBwAhoQQgALIHACGkBEAAswcAIaUEQACzBwAhsAQBAJ4HACGxBAIAoAcAIbIEIACyBwAhswSAAAAAAbQEgAAAAAG1BAEAnwcAIbYEAQCeBwAhHw4AAOEHACAPAADmBwAgEAAA4gcAIBEAAOgHACATAADkBwAgFAAA5QcAIBYAAOcHACCABAIAAAABgQQBAAAAAZEEAQAAAAGSBAEAAAABkwQBAAAAAZQEAgAAAAGVBAIAAAABlgQCAAAAAZcEAQAAAAGYBAEAAAABmQQBAAAAAZoEQAAAAAGbBAEAAAABnARAAAAAAZ0EAgAAAAGeBAIAAAABnwSAAAAAAaAEAgAAAAGhBCAAAAABogRAAAAAAaMEAQAAAAGkBEAAAAABpQRAAAAAAaYEAgAAAAECAAAAKgAgKgAA8AsAIA4HAAD9CgAgCAAA_goAIAsAAP8KACAMAACACwAgGQAAgQsAIBoAAIILACAbAACDCwAgHQAAhQsAIIAEAgAAAAGEBAEAAAABpARAAAAAAaUEQAAAAAGfBQEAAAABoAUBAAAAAQIAAAABACAqAADyCwAgDgcAAP0KACAIAAD-CgAgCwAA_woAIAwAAIALACAZAACBCwAgGgAAggsAIBwAAIQLACAdAACFCwAggAQCAAAAAYQEAQAAAAGkBEAAAAABpQRAAAAAAZ8FAQAAAAGgBQEAAAABAgAAAAEAICoAAPQLACALDgAA-QcAIIAEAgAAAAGBBAEAAAABhAQBAAAAAZEEAQAAAAGUBAIAAAABoAQCAAAAAaQEQAAAAAGlBEAAAAABrQQBAAAAAa4EAQAAAAECAAAAJgAgKgAA9gsAIBANAACuCAAgDwAArwgAIBgAALAIACCABAIAAAABgQQBAAAAAYQEAQAAAAGhBCAAAAABpARAAAAAAaUEQAAAAAGwBAEAAAABsQQCAAAAAbIEIAAAAAGzBIAAAAABtASAAAAAAbUEAQAAAAG2BAEAAAABAgAAAB4AICoAAPgLACAXgAQCAAAAAYEEAQAAAAGRBAEAAAABkgQBAAAAAZMEAQAAAAGUBAIAAAABlQQCAAAAAZcEAQAAAAGYBAEAAAABmQQBAAAAAZoEQAAAAAGbBAEAAAABnARAAAAAAZ0EAgAAAAGeBAIAAAABnwSAAAAAAaAEAgAAAAGhBCAAAAABogRAAAAAAaMEAQAAAAGkBEAAAAABpQRAAAAAAaYEAgAAAAEEgAQCAAAAAYEEAQAAAAGCBAEAAAABkAQCAAAAAQSABAIAAAABgQQBAAAAAYIEAQAAAAGEBAEAAAABAwAAABoAICoAAPILACArAAD_CwAgEAAAABoAIAcAAJcKACAIAACYCgAgCwAAmQoAIAwAAJoKACAZAACbCgAgGgAAnAoAIBsAAJ0KACAdAACfCgAgIwAA_wsAIIAEAgCgBwAhhAQBAJ4HACGkBEAAswcAIaUEQACzBwAhnwUBAJ4HACGgBQEAngcAIQ4HAACXCgAgCAAAmAoAIAsAAJkKACAMAACaCgAgGQAAmwoAIBoAAJwKACAbAACdCgAgHQAAnwoAIIAEAgCgBwAhhAQBAJ4HACGkBEAAswcAIaUEQACzBwAhnwUBAJ4HACGgBQEAngcAIQMAAAAaACAqAAD0CwAgKwAAggwAIBAAAAAaACAHAACXCgAgCAAAmAoAIAsAAJkKACAMAACaCgAgGQAAmwoAIBoAAJwKACAcAACeCgAgHQAAnwoAICMAAIIMACCABAIAoAcAIYQEAQCeBwAhpARAALMHACGlBEAAswcAIZ8FAQCeBwAhoAUBAJ4HACEOBwAAlwoAIAgAAJgKACALAACZCgAgDAAAmgoAIBkAAJsKACAaAACcCgAgHAAAngoAIB0AAJ8KACCABAIAoAcAIYQEAQCeBwAhpARAALMHACGlBEAAswcAIZ8FAQCeBwAhoAUBAJ4HACEDAAAAKAAgKgAA8AsAICsAAIUMACAhAAAAKAAgDgAAtQcAIA8AALsHACAQAAC2BwAgEQAAtwcAIBMAALkHACAUAAC6BwAgFgAAvAcAICMAAIUMACCABAIAoAcAIYEEAQCeBwAhkQQBAJ8HACGSBAEAnwcAIZMEAQCfBwAhlAQCAKAHACGVBAIAoAcAIZYEAgC0BwAhlwQBAJ4HACGYBAEAngcAIZkEAQCfBwAhmgRAALEHACGbBAEAngcAIZwEQACxBwAhnQQCALQHACGeBAIAoAcAIZ8EgAAAAAGgBAIAoAcAIaEEIACyBwAhogRAALEHACGjBAEAnwcAIaQEQACzBwAhpQRAALMHACGmBAIAtAcAIR8OAAC1BwAgDwAAuwcAIBAAALYHACARAAC3BwAgEwAAuQcAIBQAALoHACAWAAC8BwAggAQCAKAHACGBBAEAngcAIZEEAQCfBwAhkgQBAJ8HACGTBAEAnwcAIZQEAgCgBwAhlQQCAKAHACGWBAIAtAcAIZcEAQCeBwAhmAQBAJ4HACGZBAEAnwcAIZoEQACxBwAhmwQBAJ4HACGcBEAAsQcAIZ0EAgC0BwAhngQCAKAHACGfBIAAAAABoAQCAKAHACGhBCAAsgcAIaIEQACxBwAhowQBAJ8HACGkBEAAswcAIaUEQACzBwAhpgQCALQHACEDAAAAJAAgKgAA9gsAICsAAIgMACANAAAAJAAgDgAA7gcAICMAAIgMACCABAIAoAcAIYEEAQCeBwAhhAQBAJ4HACGRBAEAnwcAIZQEAgCgBwAhoAQCAKAHACGkBEAAswcAIaUEQACzBwAhrQQBAJ8HACGuBAEAngcAIQsOAADuBwAggAQCAKAHACGBBAEAngcAIYQEAQCeBwAhkQQBAJ8HACGUBAIAoAcAIaAEAgCgBwAhpARAALMHACGlBEAAswcAIa0EAQCfBwAhrgQBAJ4HACEDAAAAHAAgKgAA-AsAICsAAIsMACASAAAAHAAgDQAAiQgAIA8AAIoIACAYAACLCAAgIwAAiwwAIIAEAgCgBwAhgQQBAJ4HACGEBAEAngcAIaEEIACyBwAhpARAALMHACGlBEAAswcAIbAEAQCeBwAhsQQCAKAHACGyBCAAsgcAIbMEgAAAAAG0BIAAAAABtQQBAJ8HACG2BAEAngcAIRANAACJCAAgDwAAiggAIBgAAIsIACCABAIAoAcAIYEEAQCeBwAhhAQBAJ4HACGhBCAAsgcAIaQEQACzBwAhpQRAALMHACGwBAEAngcAIbEEAgCgBwAhsgQgALIHACGzBIAAAAABtASAAAAAAbUEAQCfBwAhtgQBAJ4HACEOBwAA_QoAIAgAAP4KACALAAD_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-MgB_MwCAAQAAAAAABQYAfDAAfTEAfjIAfzMAgAEAAAAFBgCGATAAhwExAIgBMgCJATMAigEAAAAAAAUGAIYBMACHATEAiAEyAIkBMwCKAQAAAAUGAJABMACRATEAkgEyAJMBMwCUAQAAAAAABQYAkAEwAJEBMQCSATIAkwEzAJQBAAAABQYAmgEwAJsBMQCcATIAnQEzAJ4BAAAAAAAFBgCaATAAmwExAJwBMgCdATMAngECBgClAYwCrgOhAQQGAKQBiAIAoAGKArIDogGLArYDowEBiQIAoQEBiQIAoQECigK3AwCLArgDAAGMArkDAAAABQYAqQEwAKoBMQCrATIArAEzAK0BAAAAAAAFBgCpATAAqgExAKsBMgCsATMArQEBiAIAoAEBiAIAoAEFBgCyATAAswExALQBMgC1ATMAtgEAAAAAAAUGALIBMACzATEAtAEyALUBMwC2AQGJAgChAQGJAgChAQUGALsBMAC8ATEAvQEyAL4BMwC_AQAAAAAABQYAuwEwALwBMQC9ATIAvgEzAL8BAYkCAKEBAYkCAKEBBQYAxAEwAMUBMQDGATIAxwEzAMgBAAAAAAAFBgDEATAAxQExAMYBMgDHATMAyAEBAwABAQMAAQUGAM0BMADOATEAzwEyANABMwDRAQAAAAAABQYAzQEwAM4BMQDPATIA0AEzANEBAgMAAQQAAgIDAAEEAAIFBgDWATAA1wExANgBMgDZATMA2gEAAAAAAAUGANYBMADXATEA2AEyANkBMwDaAQEDAAEBAwABBQYA3wEwAOABMQDhATIA4gEzAOMBAAAAAAAFBgDfATAA4AExAOEBMgDiATMA4wEBCQAFAQkABQUGAOgBMADpATEA6gEyAOsBMwDsAQAAAAAABQYA6AEwAOkBMQDqATIA6wEzAOwBAQP1BAEBA_sEAQUGAPEBMADyATEA8wEyAPQBMwD1AQAAAAAABQYA8QEwAPIBMQDzATIA9AEzAPUBAQ0AAQENAAEFBgD6ATAA-wExAPwBMgD9ATMA_gEAAAAAAAUGAPoBMAD7ATEA_AEyAP0BMwD-AQIDAAEOAAkCAwABDgAJBQYAgwIwAIQCMQCFAjIAhgIzAIcCAAAAAAAFBgCDAjAAhAIxAIUCMgCGAjMAhwIBDgAJAQ4ACQUGAIwCMACNAjEAjgIyAI8CMwCQAgAAAAAABQYAjAIwAI0CMQCOAjIAjwIzAJACBQ4ACRAACxHPBQwT0AUBFAABBQ4ACRAACxHWBQwT1wUBFAABBQYAlQIwAJYCMQCXAjIAmAIzAJkCAAAAAAAFBgCVAjAAlgIxAJcCMgCYAjMAmQICAwABFQAMAgMAARUADAUGAJ4CMACfAjEAoAIyAKECMwCiAgAAAAAABQYAngIwAJ8CMQCgAjIAoQIzAKICARUADAEVAAwFBgCnAjAAqAIxAKkCMgCqAjMAqwIAAAAAAAUGAKcCMACoAjEAqQIyAKoCMwCrAh4CAR9MASBOASFPASJQASRSASVUEyZVFCdXAShZEylaFSxbAS1cAS5dEzRgFjVhHDZjHTdkHThnHTloHTppHTtrHTxtEz1uHj5wHT9yE0BzH0F0HUJ1HUN2E0R5IEV6JkZ8J0d9J0iAASdJgQEnSoIBJ0uEASdMhgETTYcBKE6JASdPiwETUIwBKVGNASdSjgEnU48BE1SSASpVkwEwWJUBMVmbATFangExW58BMVygATFdogExXqQBE1-lATRgpwExYakBE2KqATVjqwExZKwBMWWtARNmsAE2Z7EBPGiyATJpswEyarQBMmu1ATJstgEybbgBMm66ARNvuwE9cL0BMnG_ARNywAE-c8EBMnTCATJ1wwETdsYBP3fHAUV4yQFGecoBRnrNAUZ7zgFGfM8BRn3RAUZ-0wETf9QBR4AB1gFGgQHYAROCAdkBSIMB2gFGhAHbAUaFAdwBE4YB3wFJhwHgAU-IAeIBUIkB4wFQigHmAVCLAecBUIwB6AFQjQHqAVCOAewBE48B7QFRkAHvAVCRAfEBE5IB8gFSkwHzAVCUAfQBUJUB9QETlgH4AVOXAfkBWZgB-wFamQH8AVqaAf8BWpsBgAJanAGBAlqdAYMCWp4BhQITnwGGAlugAYgCWqEBigITogGLAlyjAYwCWqQBjQJapQGOAhOmAZECXacBkgJjqAGUAmSpAZUCZKoBmAJkqwGZAmSsAZoCZK0BnAJkrgGeAhOvAZ8CZbABoQJksQGjAhOyAaQCZrMBpQJktAGmAmS1AacCE7YBqgJntwGrAm24Aa0CbrkBrgJuugGxAm67AbICbrwBswJuvQG1Am6-AbcCE78BuAJvwAG6Am7BAbwCE8IBvQJwwwG-Am7EAb8CbsUBwAITxgHDAnHHAcQCd8gBxgJ4yQHHAnjKAcoCeMsBywJ4zAHMAnjNAc4CeM4B0AITzwHRAnnQAdMCeNEB1QIT0gHWAnrTAdcCeNQB2AJ41QHZAhPWAdwCe9cB3QKBAdgB3wKCAdkB4AKCAdoB4wKCAdsB5AKCAdwB5QKCAd0B5wKCAd4B6QIT3wHqAoMB4AHsAoIB4QHuAhPiAe8ChAHjAfACggHkAfECggHlAfICE-YB9QKFAecB9gKLAegB-AKMAekB-QKMAeoB_AKMAesB_QKMAewB_gKMAe0BgAOMAe4BggMT7wGDA40B8AGFA4wB8QGHAxPyAYgDjgHzAYkDjAH0AYoDjAH1AYsDE_YBjgOPAfcBjwOVAfgBkQOWAfkBkgOWAfoBlQOWAfsBlgOWAfwBlwOWAf0BmQOWAf4BmwMT_wGcA5cBgAKeA5YBgQKgAxOCAqEDmAGDAqIDlgGEAqMDlgGFAqQDE4YCpwOZAYcCqAOfAY0CqgOgAY4CugOgAY8CvQOgAZACvgOgAZECvwOgAZICwQOgAZMCwwMTlALEA6YBlQLGA6ABlgLIAxOXAskDpwGYAsoDoAGZAssDoAGaAswDE5sCzwOoAZwC0AOuAZ0C0QOhAZ4C0gOhAZ8C0wOhAaAC1AOhAaEC1QOhAaIC1wOhAaMC2QMTpALaA68BpQLcA6EBpgLeAxOnAt8DsAGoAuADoQGpAuEDoQGqAuIDE6sC5QOxAawC5gO3Aa0C5wOiAa4C6AOiAa8C6QOiAbAC6gOiAbEC6wOiAbIC7QOiAbMC7wMTtALwA7gBtQLyA6IBtgL0AxO3AvUDuQG4AvYDogG5AvcDogG6AvgDE7sC-wO6AbwC_APAAb0C_QOjAb4C_gOjAb8C_wOjAcACgASjAcECgQSjAcICgwSjAcMChQQTxAKGBMEBxQKIBKMBxgKKBBPHAosEwgHIAowEowHJAo0EowHKAo4EE8sCkQTDAcwCkgTJAc0CkwQCzgKUBALPApUEAtAClgQC0QKXBALSApkEAtMCmwQT1AKcBMoB1QKeBALWAqAEE9cCoQTLAdgCogQC2QKjBALaAqQEE9sCpwTMAdwCqATSAd0CqQQD3gKqBAPfAqsEA-ACrAQD4QKtBAPiAq8EA-MCsQQT5AKyBNMB5QK0BAPmArYEE-cCtwTUAegCuAQD6QK5BAPqAroEE-sCvQTVAewCvgTbAe0CvwQF7gLABAXvAsEEBfACwgQF8QLDBAXyAsUEBfMCxwQT9ALIBNwB9QLKBAX2AswEE_cCzQTdAfgCzgQF-QLPBAX6AtAEE_sC0wTeAfwC1ATkAf0C1QQG_gLWBAb_AtcEBoAD2AQGgQPZBAaCA9sEBoMD3QQThAPeBOUBhQPgBAaGA-IEE4cD4wTmAYgD5AQGiQPlBAaKA-YEE4sD6QTnAYwD6gTtAY0D6wQIjgPsBAiPA-0ECJAD7gQIkQPvBAiSA_EECJMD8wQTlAP0BO4BlQP3BAiWA_kEE5cD-gTvAZgD_AQImQP9BAiaA_4EE5sDgQXwAZwDggX2AZ0DgwUJngOEBQmfA4UFCaADhgUJoQOHBQmiA4kFCaMDiwUTpAOMBfcBpQOOBQmmA5AFE6cDkQX4AagDkgUJqQOTBQmqA5QFE6sDlwX5AawDmAX_Aa0DmQUKrgOaBQqvA5sFCrADnAUKsQOdBQqyA58FCrMDoQUTtAOiBYACtQOkBQq2A6YFE7cDpwWBArgDqAUKuQOpBQq6A6oFE7sDrQWCArwDrgWIAr0DrwULvgOwBQu_A7EFC8ADsgULwQOzBQvCA7UFC8MDtwUTxAO4BYkCxQO6BQvGA7wFE8cDvQWKAsgDvgULyQO_BQvKA8AFE8sDwwWLAswDxAWRAs0DxQUMzgPGBQzPA8cFDNADyAUM0QPJBQzSA8sFDNMDzQUT1APOBZIC1QPSBQzWA9QFE9cD1QWTAtgD2AUM2QPZBQzaA9oFE9sD3QWUAtwD3gWaAt0D3wUN3gPgBQ3fA-EFDeAD4gUN4QPjBQ3iA-UFDeMD5wUT5APoBZsC5QPqBQ3mA-wFE-cD7QWcAugD7gUN6QPvBQ3qA_AFE-sD8wWdAuwD9AWjAu0D9QUO7gP2BQ7vA_cFDvAD-AUO8QP5BQ7yA_sFDvMD_QUT9AP-BaQC9QOABg72A4IGE_cDgwalAvgDhAYO-QOFBg76A4YGE_sDiQamAvwDigasAg" } async function decodeBase64AsWasm(wasmBase64: string): Promise { @@ -45,10 +45,10 @@ async function decodeBase64AsWasm(wasmBase64: string): Promise await import("@prisma/client/runtime/query_compiler_fast_bg.mysql.mjs"), + getRuntime: async () => await import("@prisma/client/runtime/query_compiler_fast_bg.postgresql.mjs"), getQueryCompilerWasmModule: async () => { - const { wasm } = await import("@prisma/client/runtime/query_compiler_fast_bg.mysql.wasm-base64.mjs") + const { wasm } = await import("@prisma/client/runtime/query_compiler_fast_bg.postgresql.wasm-base64.mjs") return await decodeBase64AsWasm(wasm) }, diff --git a/generated/prisma/internal/prismaNamespace.ts b/generated/prisma/internal/prismaNamespace.ts index d3aff03..ab66c1f 100644 --- a/generated/prisma/internal/prismaNamespace.ts +++ b/generated/prisma/internal/prismaNamespace.ts @@ -464,6 +464,10 @@ export type TypeMap result: BatchPayload } + createManyAndReturn: { + args: Prisma.UserCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } delete: { args: Prisma.UserDeleteArgs result: runtime.Types.Utils.PayloadToResult @@ -480,6 +484,10 @@ export type TypeMap result: BatchPayload } + updateManyAndReturn: { + args: Prisma.UserUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } upsert: { args: Prisma.UserUpsertArgs result: runtime.Types.Utils.PayloadToResult @@ -530,6 +538,10 @@ export type TypeMap result: BatchPayload } + createManyAndReturn: { + args: Prisma.ArticleCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } delete: { args: Prisma.ArticleDeleteArgs result: runtime.Types.Utils.PayloadToResult @@ -546,6 +558,10 @@ export type TypeMap result: BatchPayload } + updateManyAndReturn: { + args: Prisma.ArticleUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } upsert: { args: Prisma.ArticleUpsertArgs result: runtime.Types.Utils.PayloadToResult @@ -596,6 +612,10 @@ export type TypeMap result: BatchPayload } + createManyAndReturn: { + args: Prisma.StrategyCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } delete: { args: Prisma.StrategyDeleteArgs result: runtime.Types.Utils.PayloadToResult @@ -612,6 +632,10 @@ export type TypeMap result: BatchPayload } + updateManyAndReturn: { + args: Prisma.StrategyUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } upsert: { args: Prisma.StrategyUpsertArgs result: runtime.Types.Utils.PayloadToResult @@ -662,6 +686,10 @@ export type TypeMap result: BatchPayload } + createManyAndReturn: { + args: Prisma.IndicatorCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } delete: { args: Prisma.IndicatorDeleteArgs result: runtime.Types.Utils.PayloadToResult @@ -678,6 +706,10 @@ export type TypeMap result: BatchPayload } + updateManyAndReturn: { + args: Prisma.IndicatorUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } upsert: { args: Prisma.IndicatorUpsertArgs result: runtime.Types.Utils.PayloadToResult @@ -728,6 +760,10 @@ export type TypeMap result: BatchPayload } + createManyAndReturn: { + args: Prisma.IndicatorPointCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } delete: { args: Prisma.IndicatorPointDeleteArgs result: runtime.Types.Utils.PayloadToResult @@ -744,6 +780,10 @@ export type TypeMap result: BatchPayload } + updateManyAndReturn: { + args: Prisma.IndicatorPointUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } upsert: { args: Prisma.IndicatorPointUpsertArgs result: runtime.Types.Utils.PayloadToResult @@ -794,6 +834,10 @@ export type TypeMap result: BatchPayload } + createManyAndReturn: { + args: Prisma.NewsCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } delete: { args: Prisma.NewsDeleteArgs result: runtime.Types.Utils.PayloadToResult @@ -810,6 +854,10 @@ export type TypeMap result: BatchPayload } + updateManyAndReturn: { + args: Prisma.NewsUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } upsert: { args: Prisma.NewsUpsertArgs result: runtime.Types.Utils.PayloadToResult @@ -860,6 +908,10 @@ export type TypeMap result: BatchPayload } + createManyAndReturn: { + args: Prisma.AlertCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } delete: { args: Prisma.AlertDeleteArgs result: runtime.Types.Utils.PayloadToResult @@ -876,6 +928,10 @@ export type TypeMap result: BatchPayload } + updateManyAndReturn: { + args: Prisma.AlertUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } upsert: { args: Prisma.AlertUpsertArgs result: runtime.Types.Utils.PayloadToResult @@ -926,6 +982,10 @@ export type TypeMap result: BatchPayload } + createManyAndReturn: { + args: Prisma.ServerNodeCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } delete: { args: Prisma.ServerNodeDeleteArgs result: runtime.Types.Utils.PayloadToResult @@ -942,6 +1002,10 @@ export type TypeMap result: BatchPayload } + updateManyAndReturn: { + args: Prisma.ServerNodeUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } upsert: { args: Prisma.ServerNodeUpsertArgs result: runtime.Types.Utils.PayloadToResult @@ -992,6 +1056,10 @@ export type TypeMap result: BatchPayload } + createManyAndReturn: { + args: Prisma.ServerNodeHistoryCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } delete: { args: Prisma.ServerNodeHistoryDeleteArgs result: runtime.Types.Utils.PayloadToResult @@ -1008,6 +1076,10 @@ export type TypeMap result: BatchPayload } + updateManyAndReturn: { + args: Prisma.ServerNodeHistoryUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } upsert: { args: Prisma.ServerNodeHistoryUpsertArgs result: runtime.Types.Utils.PayloadToResult @@ -1058,6 +1130,10 @@ export type TypeMap result: BatchPayload } + createManyAndReturn: { + args: Prisma.ServiceCheckCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } delete: { args: Prisma.ServiceCheckDeleteArgs result: runtime.Types.Utils.PayloadToResult @@ -1074,6 +1150,10 @@ export type TypeMap result: BatchPayload } + updateManyAndReturn: { + args: Prisma.ServiceCheckUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } upsert: { args: Prisma.ServiceCheckUpsertArgs result: runtime.Types.Utils.PayloadToResult @@ -1124,6 +1204,10 @@ export type TypeMap result: BatchPayload } + createManyAndReturn: { + args: Prisma.Econ_SowInventoryCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } delete: { args: Prisma.Econ_SowInventoryDeleteArgs result: runtime.Types.Utils.PayloadToResult @@ -1140,6 +1224,10 @@ export type TypeMap result: BatchPayload } + updateManyAndReturn: { + args: Prisma.Econ_SowInventoryUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } upsert: { args: Prisma.Econ_SowInventoryUpsertArgs result: runtime.Types.Utils.PayloadToResult @@ -1190,6 +1278,10 @@ export type TypeMap result: BatchPayload } + createManyAndReturn: { + args: Prisma.ScraperCacheCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } delete: { args: Prisma.ScraperCacheDeleteArgs result: runtime.Types.Utils.PayloadToResult @@ -1206,6 +1298,10 @@ export type TypeMap result: BatchPayload } + updateManyAndReturn: { + args: Prisma.ScraperCacheUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } upsert: { args: Prisma.ScraperCacheUpsertArgs result: runtime.Types.Utils.PayloadToResult @@ -1256,6 +1352,10 @@ export type TypeMap result: BatchPayload } + createManyAndReturn: { + args: Prisma.OilPriceHistoryCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } delete: { args: Prisma.OilPriceHistoryDeleteArgs result: runtime.Types.Utils.PayloadToResult @@ -1272,6 +1372,10 @@ export type TypeMap result: BatchPayload } + updateManyAndReturn: { + args: Prisma.OilPriceHistoryUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } upsert: { args: Prisma.OilPriceHistoryUpsertArgs result: runtime.Types.Utils.PayloadToResult @@ -1322,6 +1426,10 @@ export type TypeMap result: BatchPayload } + createManyAndReturn: { + args: Prisma.MihomeAccountCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } delete: { args: Prisma.MihomeAccountDeleteArgs result: runtime.Types.Utils.PayloadToResult @@ -1338,6 +1446,10 @@ export type TypeMap result: BatchPayload } + updateManyAndReturn: { + args: Prisma.MihomeAccountUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } upsert: { args: Prisma.MihomeAccountUpsertArgs result: runtime.Types.Utils.PayloadToResult @@ -1388,6 +1500,10 @@ export type TypeMap result: BatchPayload } + createManyAndReturn: { + args: Prisma.MihomeHomeCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } delete: { args: Prisma.MihomeHomeDeleteArgs result: runtime.Types.Utils.PayloadToResult @@ -1404,6 +1520,10 @@ export type TypeMap result: BatchPayload } + updateManyAndReturn: { + args: Prisma.MihomeHomeUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } upsert: { args: Prisma.MihomeHomeUpsertArgs result: runtime.Types.Utils.PayloadToResult @@ -1454,6 +1574,10 @@ export type TypeMap result: BatchPayload } + createManyAndReturn: { + args: Prisma.MihomeDeviceCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } delete: { args: Prisma.MihomeDeviceDeleteArgs result: runtime.Types.Utils.PayloadToResult @@ -1470,6 +1594,10 @@ export type TypeMap result: BatchPayload } + updateManyAndReturn: { + args: Prisma.MihomeDeviceUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } upsert: { args: Prisma.MihomeDeviceUpsertArgs result: runtime.Types.Utils.PayloadToResult @@ -1520,6 +1648,10 @@ export type TypeMap result: BatchPayload } + createManyAndReturn: { + args: Prisma.MihomeEnvSampleCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } delete: { args: Prisma.MihomeEnvSampleDeleteArgs result: runtime.Types.Utils.PayloadToResult @@ -1536,6 +1668,10 @@ export type TypeMap result: BatchPayload } + updateManyAndReturn: { + args: Prisma.MihomeEnvSampleUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } upsert: { args: Prisma.MihomeEnvSampleUpsertArgs result: runtime.Types.Utils.PayloadToResult @@ -1586,6 +1722,10 @@ export type TypeMap result: BatchPayload } + createManyAndReturn: { + args: Prisma.MihomeEnvHourCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } delete: { args: Prisma.MihomeEnvHourDeleteArgs result: runtime.Types.Utils.PayloadToResult @@ -1602,6 +1742,10 @@ export type TypeMap result: BatchPayload } + updateManyAndReturn: { + args: Prisma.MihomeEnvHourUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } upsert: { args: Prisma.MihomeEnvHourUpsertArgs result: runtime.Types.Utils.PayloadToResult @@ -1652,6 +1796,10 @@ export type TypeMap result: BatchPayload } + createManyAndReturn: { + args: Prisma.HabitCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } delete: { args: Prisma.HabitDeleteArgs result: runtime.Types.Utils.PayloadToResult @@ -1668,6 +1816,10 @@ export type TypeMap result: BatchPayload } + updateManyAndReturn: { + args: Prisma.HabitUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } upsert: { args: Prisma.HabitUpsertArgs result: runtime.Types.Utils.PayloadToResult @@ -1718,6 +1870,10 @@ export type TypeMap result: BatchPayload } + createManyAndReturn: { + args: Prisma.CheckInCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } delete: { args: Prisma.CheckInDeleteArgs result: runtime.Types.Utils.PayloadToResult @@ -1734,6 +1890,10 @@ export type TypeMap result: BatchPayload } + updateManyAndReturn: { + args: Prisma.CheckInUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } upsert: { args: Prisma.CheckInUpsertArgs result: runtime.Types.Utils.PayloadToResult @@ -1784,6 +1944,10 @@ export type TypeMap result: BatchPayload } + createManyAndReturn: { + args: Prisma.CheckListCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } delete: { args: Prisma.CheckListDeleteArgs result: runtime.Types.Utils.PayloadToResult @@ -1800,6 +1964,10 @@ export type TypeMap result: BatchPayload } + updateManyAndReturn: { + args: Prisma.CheckListUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } upsert: { args: Prisma.CheckListUpsertArgs result: runtime.Types.Utils.PayloadToResult @@ -1850,6 +2018,10 @@ export type TypeMap result: BatchPayload } + createManyAndReturn: { + args: Prisma.CheckListItemCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } delete: { args: Prisma.CheckListItemDeleteArgs result: runtime.Types.Utils.PayloadToResult @@ -1866,6 +2038,10 @@ export type TypeMap result: BatchPayload } + updateManyAndReturn: { + args: Prisma.CheckListItemUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } upsert: { args: Prisma.CheckListItemUpsertArgs result: runtime.Types.Utils.PayloadToResult @@ -1916,6 +2092,10 @@ export type TypeMap result: BatchPayload } + createManyAndReturn: { + args: Prisma.CheckListTemplateCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } delete: { args: Prisma.CheckListTemplateDeleteArgs result: runtime.Types.Utils.PayloadToResult @@ -1932,6 +2112,10 @@ export type TypeMap result: BatchPayload } + updateManyAndReturn: { + args: Prisma.CheckListTemplateUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } upsert: { args: Prisma.CheckListTemplateUpsertArgs result: runtime.Types.Utils.PayloadToResult @@ -1982,6 +2166,10 @@ export type TypeMap result: BatchPayload } + createManyAndReturn: { + args: Prisma.ProjectCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } delete: { args: Prisma.ProjectDeleteArgs result: runtime.Types.Utils.PayloadToResult @@ -1998,6 +2186,10 @@ export type TypeMap result: BatchPayload } + updateManyAndReturn: { + args: Prisma.ProjectUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } upsert: { args: Prisma.ProjectUpsertArgs result: runtime.Types.Utils.PayloadToResult @@ -2048,6 +2240,10 @@ export type TypeMap result: BatchPayload } + createManyAndReturn: { + args: Prisma.ProjectMemberCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } delete: { args: Prisma.ProjectMemberDeleteArgs result: runtime.Types.Utils.PayloadToResult @@ -2064,6 +2260,10 @@ export type TypeMap result: BatchPayload } + updateManyAndReturn: { + args: Prisma.ProjectMemberUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } upsert: { args: Prisma.ProjectMemberUpsertArgs result: runtime.Types.Utils.PayloadToResult @@ -2114,6 +2314,10 @@ export type TypeMap result: BatchPayload } + createManyAndReturn: { + args: Prisma.BoardColumnCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } delete: { args: Prisma.BoardColumnDeleteArgs result: runtime.Types.Utils.PayloadToResult @@ -2130,6 +2334,10 @@ export type TypeMap result: BatchPayload } + updateManyAndReturn: { + args: Prisma.BoardColumnUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } upsert: { args: Prisma.BoardColumnUpsertArgs result: runtime.Types.Utils.PayloadToResult @@ -2180,6 +2388,10 @@ export type TypeMap result: BatchPayload } + createManyAndReturn: { + args: Prisma.TaskCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } delete: { args: Prisma.TaskDeleteArgs result: runtime.Types.Utils.PayloadToResult @@ -2196,6 +2408,10 @@ export type TypeMap result: BatchPayload } + updateManyAndReturn: { + args: Prisma.TaskUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } upsert: { args: Prisma.TaskUpsertArgs result: runtime.Types.Utils.PayloadToResult @@ -2246,6 +2462,10 @@ export type TypeMap result: BatchPayload } + createManyAndReturn: { + args: Prisma.TaskMemberCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } delete: { args: Prisma.TaskMemberDeleteArgs result: runtime.Types.Utils.PayloadToResult @@ -2262,6 +2482,10 @@ export type TypeMap result: BatchPayload } + updateManyAndReturn: { + args: Prisma.TaskMemberUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } upsert: { args: Prisma.TaskMemberUpsertArgs result: runtime.Types.Utils.PayloadToResult @@ -2312,6 +2536,10 @@ export type TypeMap result: BatchPayload } + createManyAndReturn: { + args: Prisma.TaskTagCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } delete: { args: Prisma.TaskTagDeleteArgs result: runtime.Types.Utils.PayloadToResult @@ -2328,6 +2556,10 @@ export type TypeMap result: BatchPayload } + updateManyAndReturn: { + args: Prisma.TaskTagUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } upsert: { args: Prisma.TaskTagUpsertArgs result: runtime.Types.Utils.PayloadToResult @@ -2738,6 +2970,8 @@ export type CheckListTemplateScalarFieldEnum = (typeof CheckListTemplateScalarFi export const ProjectScalarFieldEnum = { id: 'id', + uuid: 'uuid', + code: 'code', name: 'name', ownerId: 'ownerId', isPersonal: 'isPersonal', @@ -2755,6 +2989,8 @@ export type ProjectScalarFieldEnum = (typeof ProjectScalarFieldEnum)[keyof typeo export const ProjectMemberScalarFieldEnum = { id: 'id', + uuid: 'uuid', + projectUuid: 'projectUuid', projectId: 'projectId', userId: 'userId', permission: 'permission', @@ -2766,6 +3002,8 @@ export type ProjectMemberScalarFieldEnum = (typeof ProjectMemberScalarFieldEnum) export const BoardColumnScalarFieldEnum = { id: 'id', + uuid: 'uuid', + projectUuid: 'projectUuid', projectId: 'projectId', name: 'name', sortOrder: 'sortOrder', @@ -2780,6 +3018,10 @@ export type BoardColumnScalarFieldEnum = (typeof BoardColumnScalarFieldEnum)[key export const TaskScalarFieldEnum = { id: 'id', + uuid: 'uuid', + projectUuid: 'projectUuid', + columnUuid: 'columnUuid', + parentUuid: 'parentUuid', projectId: 'projectId', columnId: 'columnId', parentId: 'parentId', @@ -2797,7 +3039,8 @@ export const TaskScalarFieldEnum = { archivedAt: 'archivedAt', archiveSource: 'archiveSource', createdAt: 'createdAt', - updatedAt: 'updatedAt' + updatedAt: 'updatedAt', + number: 'number' } as const export type TaskScalarFieldEnum = (typeof TaskScalarFieldEnum)[keyof typeof TaskScalarFieldEnum] @@ -2805,6 +3048,8 @@ export type TaskScalarFieldEnum = (typeof TaskScalarFieldEnum)[keyof typeof Task export const TaskMemberScalarFieldEnum = { id: 'id', + uuid: 'uuid', + taskUuid: 'taskUuid', taskId: 'taskId', userId: 'userId' } as const @@ -2814,6 +3059,8 @@ export type TaskMemberScalarFieldEnum = (typeof TaskMemberScalarFieldEnum)[keyof export const TaskTagScalarFieldEnum = { id: 'id', + uuid: 'uuid', + taskUuid: 'taskUuid', taskId: 'taskId', name: 'name' } as const @@ -2844,23 +3091,12 @@ export const NullableJsonNullValueInput = { export type NullableJsonNullValueInput = (typeof NullableJsonNullValueInput)[keyof typeof NullableJsonNullValueInput] -export const UserOrderByRelevanceFieldEnum = { - name: 'name', - email: 'email', - password: 'password' +export const QueryMode = { + default: 'default', + insensitive: 'insensitive' } as const -export type UserOrderByRelevanceFieldEnum = (typeof UserOrderByRelevanceFieldEnum)[keyof typeof UserOrderByRelevanceFieldEnum] - - -export const ArticleOrderByRelevanceFieldEnum = { - title: 'title', - slug: 'slug', - content: 'content', - date: 'date' -} as const - -export type ArticleOrderByRelevanceFieldEnum = (typeof ArticleOrderByRelevanceFieldEnum)[keyof typeof ArticleOrderByRelevanceFieldEnum] +export type QueryMode = (typeof QueryMode)[keyof typeof QueryMode] export const JsonNullValueFilter = { @@ -2872,41 +3108,6 @@ export const JsonNullValueFilter = { export type JsonNullValueFilter = (typeof JsonNullValueFilter)[keyof typeof JsonNullValueFilter] -export const QueryMode = { - default: 'default', - insensitive: 'insensitive' -} as const - -export type QueryMode = (typeof QueryMode)[keyof typeof QueryMode] - - -export const StrategyOrderByRelevanceFieldEnum = { - name: 'name', - description: 'description' -} as const - -export type StrategyOrderByRelevanceFieldEnum = (typeof StrategyOrderByRelevanceFieldEnum)[keyof typeof StrategyOrderByRelevanceFieldEnum] - - -export const IndicatorOrderByRelevanceFieldEnum = { - name: 'name', - groupName: 'groupName', - title: 'title', - unit: 'unit', - source: 'source', - frequency: 'frequency' -} as const - -export type IndicatorOrderByRelevanceFieldEnum = (typeof IndicatorOrderByRelevanceFieldEnum)[keyof typeof IndicatorOrderByRelevanceFieldEnum] - - -export const IndicatorPointOrderByRelevanceFieldEnum = { - period: 'period' -} as const - -export type IndicatorPointOrderByRelevanceFieldEnum = (typeof IndicatorPointOrderByRelevanceFieldEnum)[keyof typeof IndicatorPointOrderByRelevanceFieldEnum] - - export const NullsOrder = { first: 'first', last: 'last' @@ -2915,204 +3116,6 @@ export const NullsOrder = { export type NullsOrder = (typeof NullsOrder)[keyof typeof NullsOrder] -export const NewsOrderByRelevanceFieldEnum = { - title: 'title', - summary: 'summary', - content: 'content', - source: 'source', - url: 'url' -} as const - -export type NewsOrderByRelevanceFieldEnum = (typeof NewsOrderByRelevanceFieldEnum)[keyof typeof NewsOrderByRelevanceFieldEnum] - - -export const AlertOrderByRelevanceFieldEnum = { - indicatorName: 'indicatorName', - period: 'period', - sourceA: 'sourceA', - sourceB: 'sourceB' -} as const - -export type AlertOrderByRelevanceFieldEnum = (typeof AlertOrderByRelevanceFieldEnum)[keyof typeof AlertOrderByRelevanceFieldEnum] - - -export const ServerNodeOrderByRelevanceFieldEnum = { - uuid: 'uuid', - name: 'name', - cpuName: 'cpuName', - os: 'os', - region: 'region', - status: 'status' -} as const - -export type ServerNodeOrderByRelevanceFieldEnum = (typeof ServerNodeOrderByRelevanceFieldEnum)[keyof typeof ServerNodeOrderByRelevanceFieldEnum] - - -export const ServerNodeHistoryOrderByRelevanceFieldEnum = { - uuid: 'uuid' -} as const - -export type ServerNodeHistoryOrderByRelevanceFieldEnum = (typeof ServerNodeHistoryOrderByRelevanceFieldEnum)[keyof typeof ServerNodeHistoryOrderByRelevanceFieldEnum] - - -export const ServiceCheckOrderByRelevanceFieldEnum = { - name: 'name', - url: 'url', - status: 'status', - message: 'message' -} as const - -export type ServiceCheckOrderByRelevanceFieldEnum = (typeof ServiceCheckOrderByRelevanceFieldEnum)[keyof typeof ServiceCheckOrderByRelevanceFieldEnum] - - -export const Econ_SowInventoryOrderByRelevanceFieldEnum = { - month: 'month' -} as const - -export type Econ_SowInventoryOrderByRelevanceFieldEnum = (typeof Econ_SowInventoryOrderByRelevanceFieldEnum)[keyof typeof Econ_SowInventoryOrderByRelevanceFieldEnum] - - -export const ScraperCacheOrderByRelevanceFieldEnum = { - scraperName: 'scraperName', - lastDataHash: 'lastDataHash' -} as const - -export type ScraperCacheOrderByRelevanceFieldEnum = (typeof ScraperCacheOrderByRelevanceFieldEnum)[keyof typeof ScraperCacheOrderByRelevanceFieldEnum] - - -export const OilPriceHistoryOrderByRelevanceFieldEnum = { - province: 'province', - fuel: 'fuel', - source: 'source' -} as const - -export type OilPriceHistoryOrderByRelevanceFieldEnum = (typeof OilPriceHistoryOrderByRelevanceFieldEnum)[keyof typeof OilPriceHistoryOrderByRelevanceFieldEnum] - - -export const MihomeAccountOrderByRelevanceFieldEnum = { - key: 'key', - userId: 'userId', - status: 'status', - lastError: 'lastError' -} as const - -export type MihomeAccountOrderByRelevanceFieldEnum = (typeof MihomeAccountOrderByRelevanceFieldEnum)[keyof typeof MihomeAccountOrderByRelevanceFieldEnum] - - -export const MihomeHomeOrderByRelevanceFieldEnum = { - homeId: 'homeId', - name: 'name' -} as const - -export type MihomeHomeOrderByRelevanceFieldEnum = (typeof MihomeHomeOrderByRelevanceFieldEnum)[keyof typeof MihomeHomeOrderByRelevanceFieldEnum] - - -export const MihomeDeviceOrderByRelevanceFieldEnum = { - did: 'did', - homeId: 'homeId', - model: 'model', - name: 'name', - alias: 'alias' -} as const - -export type MihomeDeviceOrderByRelevanceFieldEnum = (typeof MihomeDeviceOrderByRelevanceFieldEnum)[keyof typeof MihomeDeviceOrderByRelevanceFieldEnum] - - -export const MihomeEnvSampleOrderByRelevanceFieldEnum = { - origin: 'origin' -} as const - -export type MihomeEnvSampleOrderByRelevanceFieldEnum = (typeof MihomeEnvSampleOrderByRelevanceFieldEnum)[keyof typeof MihomeEnvSampleOrderByRelevanceFieldEnum] - - -export const HabitOrderByRelevanceFieldEnum = { - name: 'name', - period: 'period', - color: 'color', - icon: 'icon', - note: 'note' -} as const - -export type HabitOrderByRelevanceFieldEnum = (typeof HabitOrderByRelevanceFieldEnum)[keyof typeof HabitOrderByRelevanceFieldEnum] - - -export const CheckInOrderByRelevanceFieldEnum = { - date: 'date', - note: 'note', - source: 'source' -} as const - -export type CheckInOrderByRelevanceFieldEnum = (typeof CheckInOrderByRelevanceFieldEnum)[keyof typeof CheckInOrderByRelevanceFieldEnum] - - -export const CheckListOrderByRelevanceFieldEnum = { - title: 'title', - scene: 'scene', - note: 'note' -} as const - -export type CheckListOrderByRelevanceFieldEnum = (typeof CheckListOrderByRelevanceFieldEnum)[keyof typeof CheckListOrderByRelevanceFieldEnum] - - -export const CheckListItemOrderByRelevanceFieldEnum = { - title: 'title', - note: 'note' -} as const - -export type CheckListItemOrderByRelevanceFieldEnum = (typeof CheckListItemOrderByRelevanceFieldEnum)[keyof typeof CheckListItemOrderByRelevanceFieldEnum] - - -export const CheckListTemplateOrderByRelevanceFieldEnum = { - name: 'name', - scene: 'scene' -} as const - -export type CheckListTemplateOrderByRelevanceFieldEnum = (typeof CheckListTemplateOrderByRelevanceFieldEnum)[keyof typeof CheckListTemplateOrderByRelevanceFieldEnum] - - -export const ProjectOrderByRelevanceFieldEnum = { - name: 'name', - icon: 'icon', - autoArchive: 'autoArchive' -} as const - -export type ProjectOrderByRelevanceFieldEnum = (typeof ProjectOrderByRelevanceFieldEnum)[keyof typeof ProjectOrderByRelevanceFieldEnum] - - -export const ProjectMemberOrderByRelevanceFieldEnum = { - permission: 'permission' -} as const - -export type ProjectMemberOrderByRelevanceFieldEnum = (typeof ProjectMemberOrderByRelevanceFieldEnum)[keyof typeof ProjectMemberOrderByRelevanceFieldEnum] - - -export const BoardColumnOrderByRelevanceFieldEnum = { - name: 'name', - boundStatus: 'boundStatus', - retention: 'retention' -} as const - -export type BoardColumnOrderByRelevanceFieldEnum = (typeof BoardColumnOrderByRelevanceFieldEnum)[keyof typeof BoardColumnOrderByRelevanceFieldEnum] - - -export const TaskOrderByRelevanceFieldEnum = { - title: 'title', - description: 'description', - kind: 'kind', - status: 'status', - archiveSource: 'archiveSource' -} as const - -export type TaskOrderByRelevanceFieldEnum = (typeof TaskOrderByRelevanceFieldEnum)[keyof typeof TaskOrderByRelevanceFieldEnum] - - -export const TaskTagOrderByRelevanceFieldEnum = { - name: 'name' -} as const - -export type TaskTagOrderByRelevanceFieldEnum = (typeof TaskTagOrderByRelevanceFieldEnum)[keyof typeof TaskTagOrderByRelevanceFieldEnum] - - /** * Field references @@ -3126,6 +3129,13 @@ export type IntFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'In +/** + * Reference to a field of type 'Int[]' + */ +export type ListIntFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Int[]'> + + + /** * Reference to a field of type 'String' */ @@ -3133,6 +3143,13 @@ export type StringFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, +/** + * Reference to a field of type 'String[]' + */ +export type ListStringFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'String[]'> + + + /** * Reference to a field of type 'DateTime' */ @@ -3140,6 +3157,13 @@ export type DateTimeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel +/** + * Reference to a field of type 'DateTime[]' + */ +export type ListDateTimeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'DateTime[]'> + + + /** * Reference to a field of type 'Json' */ @@ -3168,12 +3192,26 @@ export type FloatFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, ' +/** + * Reference to a field of type 'Float[]' + */ +export type ListFloatFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Float[]'> + + + /** * Reference to a field of type 'BigInt' */ export type BigIntFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'BigInt'> + +/** + * Reference to a field of type 'BigInt[]' + */ +export type ListBigIntFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'BigInt[]'> + + /** * Batch Payload for updateMany & deleteMany & createMany */ diff --git a/generated/prisma/internal/prismaNamespaceBrowser.ts b/generated/prisma/internal/prismaNamespaceBrowser.ts index 3cce066..251860c 100644 --- a/generated/prisma/internal/prismaNamespaceBrowser.ts +++ b/generated/prisma/internal/prismaNamespaceBrowser.ts @@ -451,6 +451,8 @@ export type CheckListTemplateScalarFieldEnum = (typeof CheckListTemplateScalarFi export const ProjectScalarFieldEnum = { id: 'id', + uuid: 'uuid', + code: 'code', name: 'name', ownerId: 'ownerId', isPersonal: 'isPersonal', @@ -468,6 +470,8 @@ export type ProjectScalarFieldEnum = (typeof ProjectScalarFieldEnum)[keyof typeo export const ProjectMemberScalarFieldEnum = { id: 'id', + uuid: 'uuid', + projectUuid: 'projectUuid', projectId: 'projectId', userId: 'userId', permission: 'permission', @@ -479,6 +483,8 @@ export type ProjectMemberScalarFieldEnum = (typeof ProjectMemberScalarFieldEnum) export const BoardColumnScalarFieldEnum = { id: 'id', + uuid: 'uuid', + projectUuid: 'projectUuid', projectId: 'projectId', name: 'name', sortOrder: 'sortOrder', @@ -493,6 +499,10 @@ export type BoardColumnScalarFieldEnum = (typeof BoardColumnScalarFieldEnum)[key export const TaskScalarFieldEnum = { id: 'id', + uuid: 'uuid', + projectUuid: 'projectUuid', + columnUuid: 'columnUuid', + parentUuid: 'parentUuid', projectId: 'projectId', columnId: 'columnId', parentId: 'parentId', @@ -510,7 +520,8 @@ export const TaskScalarFieldEnum = { archivedAt: 'archivedAt', archiveSource: 'archiveSource', createdAt: 'createdAt', - updatedAt: 'updatedAt' + updatedAt: 'updatedAt', + number: 'number' } as const export type TaskScalarFieldEnum = (typeof TaskScalarFieldEnum)[keyof typeof TaskScalarFieldEnum] @@ -518,6 +529,8 @@ export type TaskScalarFieldEnum = (typeof TaskScalarFieldEnum)[keyof typeof Task export const TaskMemberScalarFieldEnum = { id: 'id', + uuid: 'uuid', + taskUuid: 'taskUuid', taskId: 'taskId', userId: 'userId' } as const @@ -527,6 +540,8 @@ export type TaskMemberScalarFieldEnum = (typeof TaskMemberScalarFieldEnum)[keyof export const TaskTagScalarFieldEnum = { id: 'id', + uuid: 'uuid', + taskUuid: 'taskUuid', taskId: 'taskId', name: 'name' } as const @@ -557,23 +572,12 @@ export const NullableJsonNullValueInput = { export type NullableJsonNullValueInput = (typeof NullableJsonNullValueInput)[keyof typeof NullableJsonNullValueInput] -export const UserOrderByRelevanceFieldEnum = { - name: 'name', - email: 'email', - password: 'password' +export const QueryMode = { + default: 'default', + insensitive: 'insensitive' } as const -export type UserOrderByRelevanceFieldEnum = (typeof UserOrderByRelevanceFieldEnum)[keyof typeof UserOrderByRelevanceFieldEnum] - - -export const ArticleOrderByRelevanceFieldEnum = { - title: 'title', - slug: 'slug', - content: 'content', - date: 'date' -} as const - -export type ArticleOrderByRelevanceFieldEnum = (typeof ArticleOrderByRelevanceFieldEnum)[keyof typeof ArticleOrderByRelevanceFieldEnum] +export type QueryMode = (typeof QueryMode)[keyof typeof QueryMode] export const JsonNullValueFilter = { @@ -585,41 +589,6 @@ export const JsonNullValueFilter = { export type JsonNullValueFilter = (typeof JsonNullValueFilter)[keyof typeof JsonNullValueFilter] -export const QueryMode = { - default: 'default', - insensitive: 'insensitive' -} as const - -export type QueryMode = (typeof QueryMode)[keyof typeof QueryMode] - - -export const StrategyOrderByRelevanceFieldEnum = { - name: 'name', - description: 'description' -} as const - -export type StrategyOrderByRelevanceFieldEnum = (typeof StrategyOrderByRelevanceFieldEnum)[keyof typeof StrategyOrderByRelevanceFieldEnum] - - -export const IndicatorOrderByRelevanceFieldEnum = { - name: 'name', - groupName: 'groupName', - title: 'title', - unit: 'unit', - source: 'source', - frequency: 'frequency' -} as const - -export type IndicatorOrderByRelevanceFieldEnum = (typeof IndicatorOrderByRelevanceFieldEnum)[keyof typeof IndicatorOrderByRelevanceFieldEnum] - - -export const IndicatorPointOrderByRelevanceFieldEnum = { - period: 'period' -} as const - -export type IndicatorPointOrderByRelevanceFieldEnum = (typeof IndicatorPointOrderByRelevanceFieldEnum)[keyof typeof IndicatorPointOrderByRelevanceFieldEnum] - - export const NullsOrder = { first: 'first', last: 'last' @@ -627,201 +596,3 @@ export const NullsOrder = { export type NullsOrder = (typeof NullsOrder)[keyof typeof NullsOrder] - -export const NewsOrderByRelevanceFieldEnum = { - title: 'title', - summary: 'summary', - content: 'content', - source: 'source', - url: 'url' -} as const - -export type NewsOrderByRelevanceFieldEnum = (typeof NewsOrderByRelevanceFieldEnum)[keyof typeof NewsOrderByRelevanceFieldEnum] - - -export const AlertOrderByRelevanceFieldEnum = { - indicatorName: 'indicatorName', - period: 'period', - sourceA: 'sourceA', - sourceB: 'sourceB' -} as const - -export type AlertOrderByRelevanceFieldEnum = (typeof AlertOrderByRelevanceFieldEnum)[keyof typeof AlertOrderByRelevanceFieldEnum] - - -export const ServerNodeOrderByRelevanceFieldEnum = { - uuid: 'uuid', - name: 'name', - cpuName: 'cpuName', - os: 'os', - region: 'region', - status: 'status' -} as const - -export type ServerNodeOrderByRelevanceFieldEnum = (typeof ServerNodeOrderByRelevanceFieldEnum)[keyof typeof ServerNodeOrderByRelevanceFieldEnum] - - -export const ServerNodeHistoryOrderByRelevanceFieldEnum = { - uuid: 'uuid' -} as const - -export type ServerNodeHistoryOrderByRelevanceFieldEnum = (typeof ServerNodeHistoryOrderByRelevanceFieldEnum)[keyof typeof ServerNodeHistoryOrderByRelevanceFieldEnum] - - -export const ServiceCheckOrderByRelevanceFieldEnum = { - name: 'name', - url: 'url', - status: 'status', - message: 'message' -} as const - -export type ServiceCheckOrderByRelevanceFieldEnum = (typeof ServiceCheckOrderByRelevanceFieldEnum)[keyof typeof ServiceCheckOrderByRelevanceFieldEnum] - - -export const Econ_SowInventoryOrderByRelevanceFieldEnum = { - month: 'month' -} as const - -export type Econ_SowInventoryOrderByRelevanceFieldEnum = (typeof Econ_SowInventoryOrderByRelevanceFieldEnum)[keyof typeof Econ_SowInventoryOrderByRelevanceFieldEnum] - - -export const ScraperCacheOrderByRelevanceFieldEnum = { - scraperName: 'scraperName', - lastDataHash: 'lastDataHash' -} as const - -export type ScraperCacheOrderByRelevanceFieldEnum = (typeof ScraperCacheOrderByRelevanceFieldEnum)[keyof typeof ScraperCacheOrderByRelevanceFieldEnum] - - -export const OilPriceHistoryOrderByRelevanceFieldEnum = { - province: 'province', - fuel: 'fuel', - source: 'source' -} as const - -export type OilPriceHistoryOrderByRelevanceFieldEnum = (typeof OilPriceHistoryOrderByRelevanceFieldEnum)[keyof typeof OilPriceHistoryOrderByRelevanceFieldEnum] - - -export const MihomeAccountOrderByRelevanceFieldEnum = { - key: 'key', - userId: 'userId', - status: 'status', - lastError: 'lastError' -} as const - -export type MihomeAccountOrderByRelevanceFieldEnum = (typeof MihomeAccountOrderByRelevanceFieldEnum)[keyof typeof MihomeAccountOrderByRelevanceFieldEnum] - - -export const MihomeHomeOrderByRelevanceFieldEnum = { - homeId: 'homeId', - name: 'name' -} as const - -export type MihomeHomeOrderByRelevanceFieldEnum = (typeof MihomeHomeOrderByRelevanceFieldEnum)[keyof typeof MihomeHomeOrderByRelevanceFieldEnum] - - -export const MihomeDeviceOrderByRelevanceFieldEnum = { - did: 'did', - homeId: 'homeId', - model: 'model', - name: 'name', - alias: 'alias' -} as const - -export type MihomeDeviceOrderByRelevanceFieldEnum = (typeof MihomeDeviceOrderByRelevanceFieldEnum)[keyof typeof MihomeDeviceOrderByRelevanceFieldEnum] - - -export const MihomeEnvSampleOrderByRelevanceFieldEnum = { - origin: 'origin' -} as const - -export type MihomeEnvSampleOrderByRelevanceFieldEnum = (typeof MihomeEnvSampleOrderByRelevanceFieldEnum)[keyof typeof MihomeEnvSampleOrderByRelevanceFieldEnum] - - -export const HabitOrderByRelevanceFieldEnum = { - name: 'name', - period: 'period', - color: 'color', - icon: 'icon', - note: 'note' -} as const - -export type HabitOrderByRelevanceFieldEnum = (typeof HabitOrderByRelevanceFieldEnum)[keyof typeof HabitOrderByRelevanceFieldEnum] - - -export const CheckInOrderByRelevanceFieldEnum = { - date: 'date', - note: 'note', - source: 'source' -} as const - -export type CheckInOrderByRelevanceFieldEnum = (typeof CheckInOrderByRelevanceFieldEnum)[keyof typeof CheckInOrderByRelevanceFieldEnum] - - -export const CheckListOrderByRelevanceFieldEnum = { - title: 'title', - scene: 'scene', - note: 'note' -} as const - -export type CheckListOrderByRelevanceFieldEnum = (typeof CheckListOrderByRelevanceFieldEnum)[keyof typeof CheckListOrderByRelevanceFieldEnum] - - -export const CheckListItemOrderByRelevanceFieldEnum = { - title: 'title', - note: 'note' -} as const - -export type CheckListItemOrderByRelevanceFieldEnum = (typeof CheckListItemOrderByRelevanceFieldEnum)[keyof typeof CheckListItemOrderByRelevanceFieldEnum] - - -export const CheckListTemplateOrderByRelevanceFieldEnum = { - name: 'name', - scene: 'scene' -} as const - -export type CheckListTemplateOrderByRelevanceFieldEnum = (typeof CheckListTemplateOrderByRelevanceFieldEnum)[keyof typeof CheckListTemplateOrderByRelevanceFieldEnum] - - -export const ProjectOrderByRelevanceFieldEnum = { - name: 'name', - icon: 'icon', - autoArchive: 'autoArchive' -} as const - -export type ProjectOrderByRelevanceFieldEnum = (typeof ProjectOrderByRelevanceFieldEnum)[keyof typeof ProjectOrderByRelevanceFieldEnum] - - -export const ProjectMemberOrderByRelevanceFieldEnum = { - permission: 'permission' -} as const - -export type ProjectMemberOrderByRelevanceFieldEnum = (typeof ProjectMemberOrderByRelevanceFieldEnum)[keyof typeof ProjectMemberOrderByRelevanceFieldEnum] - - -export const BoardColumnOrderByRelevanceFieldEnum = { - name: 'name', - boundStatus: 'boundStatus', - retention: 'retention' -} as const - -export type BoardColumnOrderByRelevanceFieldEnum = (typeof BoardColumnOrderByRelevanceFieldEnum)[keyof typeof BoardColumnOrderByRelevanceFieldEnum] - - -export const TaskOrderByRelevanceFieldEnum = { - title: 'title', - description: 'description', - kind: 'kind', - status: 'status', - archiveSource: 'archiveSource' -} as const - -export type TaskOrderByRelevanceFieldEnum = (typeof TaskOrderByRelevanceFieldEnum)[keyof typeof TaskOrderByRelevanceFieldEnum] - - -export const TaskTagOrderByRelevanceFieldEnum = { - name: 'name' -} as const - -export type TaskTagOrderByRelevanceFieldEnum = (typeof TaskTagOrderByRelevanceFieldEnum)[keyof typeof TaskTagOrderByRelevanceFieldEnum] - diff --git a/generated/prisma/models/Alert.ts b/generated/prisma/models/Alert.ts index 2d2db2a..1d44094 100644 --- a/generated/prisma/models/Alert.ts +++ b/generated/prisma/models/Alert.ts @@ -285,7 +285,6 @@ export type AlertOrderByWithRelationInput = { diff?: Prisma.SortOrder diffRatio?: Prisma.SortOrder createdAt?: Prisma.SortOrder - _relevance?: Prisma.AlertOrderByRelevanceInput } export type AlertWhereUniqueInput = Prisma.AtLeast<{ @@ -426,12 +425,6 @@ export type AlertUncheckedUpdateManyInput = { createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } -export type AlertOrderByRelevanceInput = { - fields: Prisma.AlertOrderByRelevanceFieldEnum | Prisma.AlertOrderByRelevanceFieldEnum[] - sort: Prisma.SortOrder - search: string -} - export type AlertCountOrderByAggregateInput = { id?: Prisma.SortOrder indicatorName?: Prisma.SortOrder @@ -502,7 +495,31 @@ export type AlertSelect +export type AlertSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + indicatorName?: boolean + period?: boolean + valueA?: boolean + valueB?: boolean + sourceA?: boolean + sourceB?: boolean + diff?: boolean + diffRatio?: boolean + createdAt?: boolean +}, ExtArgs["result"]["alert"]> +export type AlertSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + indicatorName?: boolean + period?: boolean + valueA?: boolean + valueB?: boolean + sourceA?: boolean + sourceB?: boolean + diff?: boolean + diffRatio?: boolean + createdAt?: boolean +}, ExtArgs["result"]["alert"]> export type AlertSelectScalar = { id?: boolean @@ -650,6 +667,30 @@ export interface AlertDelegate(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Create many Alerts and returns the data saved in the database. + * @param {AlertCreateManyAndReturnArgs} args - Arguments to create many Alerts. + * @example + * // Create many Alerts + * const alert = await prisma.alert.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many Alerts and only return the `id` + * const alertWithIdOnly = await prisma.alert.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + /** * Delete a Alert. * @param {AlertDeleteArgs} args - Arguments to delete one Alert. @@ -714,6 +755,36 @@ export interface AlertDelegate(args: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Update zero or more Alerts and returns the data updated in the database. + * @param {AlertUpdateManyAndReturnArgs} args - Arguments to update many Alerts. + * @example + * // Update many Alerts + * const alert = await prisma.alert.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more Alerts and only return the `id` + * const alertWithIdOnly = await prisma.alert.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + /** * Create or update one Alert. * @param {AlertUpsertArgs} args - Arguments to update or create a Alert. @@ -1125,6 +1196,25 @@ export type AlertCreateManyArgs = { + /** + * Select specific fields to fetch from the Alert + */ + select?: Prisma.AlertSelectCreateManyAndReturn | null + /** + * Omit specific fields from the Alert + */ + omit?: Prisma.AlertOmit | null + /** + * The data used to create many Alerts. + */ + data: Prisma.AlertCreateManyInput | Prisma.AlertCreateManyInput[] + skipDuplicates?: boolean +} + /** * Alert update */ @@ -1165,6 +1255,32 @@ export type AlertUpdateManyArgs = { + /** + * Select specific fields to fetch from the Alert + */ + select?: Prisma.AlertSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the Alert + */ + omit?: Prisma.AlertOmit | null + /** + * The data used to update Alerts. + */ + data: Prisma.XOR + /** + * Filter which Alerts to update + */ + where?: Prisma.AlertWhereInput + /** + * Limit how many Alerts to update. + */ + limit?: number +} + /** * Alert upsert */ diff --git a/generated/prisma/models/Article.ts b/generated/prisma/models/Article.ts index 4a9bf6d..cc533ca 100644 --- a/generated/prisma/models/Article.ts +++ b/generated/prisma/models/Article.ts @@ -242,7 +242,6 @@ export type ArticleOrderByWithRelationInput = { date?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder - _relevance?: Prisma.ArticleOrderByRelevanceInput } export type ArticleWhereUniqueInput = Prisma.AtLeast<{ @@ -353,12 +352,6 @@ export type ArticleUncheckedUpdateManyInput = { updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } -export type ArticleOrderByRelevanceInput = { - fields: Prisma.ArticleOrderByRelevanceFieldEnum | Prisma.ArticleOrderByRelevanceFieldEnum[] - sort: Prisma.SortOrder - search: string -} - export type ArticleCountOrderByAggregateInput = { id?: Prisma.SortOrder title?: Prisma.SortOrder @@ -409,7 +402,25 @@ export type ArticleSelect +export type ArticleSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + title?: boolean + slug?: boolean + content?: boolean + date?: boolean + createdAt?: boolean + updatedAt?: boolean +}, ExtArgs["result"]["article"]> +export type ArticleSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + title?: boolean + slug?: boolean + content?: boolean + date?: boolean + createdAt?: boolean + updatedAt?: boolean +}, ExtArgs["result"]["article"]> export type ArticleSelectScalar = { id?: boolean @@ -551,6 +562,30 @@ export interface ArticleDelegate(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Create many Articles and returns the data saved in the database. + * @param {ArticleCreateManyAndReturnArgs} args - Arguments to create many Articles. + * @example + * // Create many Articles + * const article = await prisma.article.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many Articles and only return the `id` + * const articleWithIdOnly = await prisma.article.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + /** * Delete a Article. * @param {ArticleDeleteArgs} args - Arguments to delete one Article. @@ -615,6 +650,36 @@ export interface ArticleDelegate(args: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Update zero or more Articles and returns the data updated in the database. + * @param {ArticleUpdateManyAndReturnArgs} args - Arguments to update many Articles. + * @example + * // Update many Articles + * const article = await prisma.article.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more Articles and only return the `id` + * const articleWithIdOnly = await prisma.article.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + /** * Create or update one Article. * @param {ArticleUpsertArgs} args - Arguments to update or create a Article. @@ -1023,6 +1088,25 @@ export type ArticleCreateManyArgs = { + /** + * Select specific fields to fetch from the Article + */ + select?: Prisma.ArticleSelectCreateManyAndReturn | null + /** + * Omit specific fields from the Article + */ + omit?: Prisma.ArticleOmit | null + /** + * The data used to create many Articles. + */ + data: Prisma.ArticleCreateManyInput | Prisma.ArticleCreateManyInput[] + skipDuplicates?: boolean +} + /** * Article update */ @@ -1063,6 +1147,32 @@ export type ArticleUpdateManyArgs = { + /** + * Select specific fields to fetch from the Article + */ + select?: Prisma.ArticleSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the Article + */ + omit?: Prisma.ArticleOmit | null + /** + * The data used to update Articles. + */ + data: Prisma.XOR + /** + * Filter which Articles to update + */ + where?: Prisma.ArticleWhereInput + /** + * Limit how many Articles to update. + */ + limit?: number +} + /** * Article upsert */ diff --git a/generated/prisma/models/BoardColumn.ts b/generated/prisma/models/BoardColumn.ts index 6f1dc1d..42984ba 100644 --- a/generated/prisma/models/BoardColumn.ts +++ b/generated/prisma/models/BoardColumn.ts @@ -40,6 +40,8 @@ export type BoardColumnSumAggregateOutputType = { export type BoardColumnMinAggregateOutputType = { id: number | null + uuid: string | null + projectUuid: string | null projectId: number | null name: string | null sortOrder: number | null @@ -51,6 +53,8 @@ export type BoardColumnMinAggregateOutputType = { export type BoardColumnMaxAggregateOutputType = { id: number | null + uuid: string | null + projectUuid: string | null projectId: number | null name: string | null sortOrder: number | null @@ -62,6 +66,8 @@ export type BoardColumnMaxAggregateOutputType = { export type BoardColumnCountAggregateOutputType = { id: number + uuid: number + projectUuid: number projectId: number name: number sortOrder: number @@ -87,6 +93,8 @@ export type BoardColumnSumAggregateInputType = { export type BoardColumnMinAggregateInputType = { id?: true + uuid?: true + projectUuid?: true projectId?: true name?: true sortOrder?: true @@ -98,6 +106,8 @@ export type BoardColumnMinAggregateInputType = { export type BoardColumnMaxAggregateInputType = { id?: true + uuid?: true + projectUuid?: true projectId?: true name?: true sortOrder?: true @@ -109,6 +119,8 @@ export type BoardColumnMaxAggregateInputType = { export type BoardColumnCountAggregateInputType = { id?: true + uuid?: true + projectUuid?: true projectId?: true name?: true sortOrder?: true @@ -207,6 +219,8 @@ export type BoardColumnGroupByArgs | number + uuid?: Prisma.StringFilter<"BoardColumn"> | string + projectUuid?: Prisma.StringNullableFilter<"BoardColumn"> | string | null projectId?: Prisma.IntFilter<"BoardColumn"> | number name?: Prisma.StringFilter<"BoardColumn"> | string sortOrder?: Prisma.IntFilter<"BoardColumn"> | number @@ -254,6 +270,8 @@ export type BoardColumnWhereInput = { export type BoardColumnOrderByWithRelationInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + projectUuid?: Prisma.SortOrderInput | Prisma.SortOrder projectId?: Prisma.SortOrder name?: Prisma.SortOrder sortOrder?: Prisma.SortOrder @@ -263,15 +281,16 @@ export type BoardColumnOrderByWithRelationInput = { updatedAt?: Prisma.SortOrder project?: Prisma.ProjectOrderByWithRelationInput tasks?: Prisma.TaskOrderByRelationAggregateInput - _relevance?: Prisma.BoardColumnOrderByRelevanceInput } export type BoardColumnWhereUniqueInput = Prisma.AtLeast<{ id?: number + uuid?: string projectId_name?: Prisma.BoardColumnProjectIdNameCompoundUniqueInput AND?: Prisma.BoardColumnWhereInput | Prisma.BoardColumnWhereInput[] OR?: Prisma.BoardColumnWhereInput[] NOT?: Prisma.BoardColumnWhereInput | Prisma.BoardColumnWhereInput[] + projectUuid?: Prisma.StringNullableFilter<"BoardColumn"> | string | null projectId?: Prisma.IntFilter<"BoardColumn"> | number name?: Prisma.StringFilter<"BoardColumn"> | string sortOrder?: Prisma.IntFilter<"BoardColumn"> | number @@ -281,10 +300,12 @@ export type BoardColumnWhereUniqueInput = Prisma.AtLeast<{ updatedAt?: Prisma.DateTimeFilter<"BoardColumn"> | Date | string project?: Prisma.XOR tasks?: Prisma.TaskListRelationFilter -}, "id" | "projectId_name"> +}, "id" | "uuid" | "projectId_name"> export type BoardColumnOrderByWithAggregationInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + projectUuid?: Prisma.SortOrderInput | Prisma.SortOrder projectId?: Prisma.SortOrder name?: Prisma.SortOrder sortOrder?: Prisma.SortOrder @@ -304,6 +325,8 @@ export type BoardColumnScalarWhereWithAggregatesInput = { OR?: Prisma.BoardColumnScalarWhereWithAggregatesInput[] NOT?: Prisma.BoardColumnScalarWhereWithAggregatesInput | Prisma.BoardColumnScalarWhereWithAggregatesInput[] id?: Prisma.IntWithAggregatesFilter<"BoardColumn"> | number + uuid?: Prisma.StringWithAggregatesFilter<"BoardColumn"> | string + projectUuid?: Prisma.StringNullableWithAggregatesFilter<"BoardColumn"> | string | null projectId?: Prisma.IntWithAggregatesFilter<"BoardColumn"> | number name?: Prisma.StringWithAggregatesFilter<"BoardColumn"> | string sortOrder?: Prisma.IntWithAggregatesFilter<"BoardColumn"> | number @@ -314,6 +337,8 @@ export type BoardColumnScalarWhereWithAggregatesInput = { } export type BoardColumnCreateInput = { + uuid: string + projectUuid?: string | null name: string sortOrder?: number boundStatus?: string | null @@ -326,6 +351,8 @@ export type BoardColumnCreateInput = { export type BoardColumnUncheckedCreateInput = { id?: number + uuid: string + projectUuid?: string | null projectId: number name: string sortOrder?: number @@ -337,6 +364,8 @@ export type BoardColumnUncheckedCreateInput = { } export type BoardColumnUpdateInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null name?: Prisma.StringFieldUpdateOperationsInput | string sortOrder?: Prisma.IntFieldUpdateOperationsInput | number boundStatus?: Prisma.NullableStringFieldUpdateOperationsInput | string | null @@ -349,6 +378,8 @@ export type BoardColumnUpdateInput = { export type BoardColumnUncheckedUpdateInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null projectId?: Prisma.IntFieldUpdateOperationsInput | number name?: Prisma.StringFieldUpdateOperationsInput | string sortOrder?: Prisma.IntFieldUpdateOperationsInput | number @@ -361,6 +392,8 @@ export type BoardColumnUncheckedUpdateInput = { export type BoardColumnCreateManyInput = { id?: number + uuid: string + projectUuid?: string | null projectId: number name: string sortOrder?: number @@ -371,6 +404,8 @@ export type BoardColumnCreateManyInput = { } export type BoardColumnUpdateManyMutationInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null name?: Prisma.StringFieldUpdateOperationsInput | string sortOrder?: Prisma.IntFieldUpdateOperationsInput | number boundStatus?: Prisma.NullableStringFieldUpdateOperationsInput | string | null @@ -381,6 +416,8 @@ export type BoardColumnUpdateManyMutationInput = { export type BoardColumnUncheckedUpdateManyInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null projectId?: Prisma.IntFieldUpdateOperationsInput | number name?: Prisma.StringFieldUpdateOperationsInput | string sortOrder?: Prisma.IntFieldUpdateOperationsInput | number @@ -400,12 +437,6 @@ export type BoardColumnOrderByRelationAggregateInput = { _count?: Prisma.SortOrder } -export type BoardColumnOrderByRelevanceInput = { - fields: Prisma.BoardColumnOrderByRelevanceFieldEnum | Prisma.BoardColumnOrderByRelevanceFieldEnum[] - sort: Prisma.SortOrder - search: string -} - export type BoardColumnProjectIdNameCompoundUniqueInput = { projectId: number name: string @@ -413,6 +444,8 @@ export type BoardColumnProjectIdNameCompoundUniqueInput = { export type BoardColumnCountOrderByAggregateInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + projectUuid?: Prisma.SortOrder projectId?: Prisma.SortOrder name?: Prisma.SortOrder sortOrder?: Prisma.SortOrder @@ -430,6 +463,8 @@ export type BoardColumnAvgOrderByAggregateInput = { export type BoardColumnMaxOrderByAggregateInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + projectUuid?: Prisma.SortOrder projectId?: Prisma.SortOrder name?: Prisma.SortOrder sortOrder?: Prisma.SortOrder @@ -441,6 +476,8 @@ export type BoardColumnMaxOrderByAggregateInput = { export type BoardColumnMinOrderByAggregateInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + projectUuid?: Prisma.SortOrder projectId?: Prisma.SortOrder name?: Prisma.SortOrder sortOrder?: Prisma.SortOrder @@ -518,6 +555,8 @@ export type BoardColumnUpdateOneRequiredWithoutTasksNestedInput = { } export type BoardColumnCreateWithoutProjectInput = { + uuid: string + projectUuid?: string | null name: string sortOrder?: number boundStatus?: string | null @@ -529,6 +568,8 @@ export type BoardColumnCreateWithoutProjectInput = { export type BoardColumnUncheckedCreateWithoutProjectInput = { id?: number + uuid: string + projectUuid?: string | null name: string sortOrder?: number boundStatus?: string | null @@ -569,6 +610,8 @@ export type BoardColumnScalarWhereInput = { OR?: Prisma.BoardColumnScalarWhereInput[] NOT?: Prisma.BoardColumnScalarWhereInput | Prisma.BoardColumnScalarWhereInput[] id?: Prisma.IntFilter<"BoardColumn"> | number + uuid?: Prisma.StringFilter<"BoardColumn"> | string + projectUuid?: Prisma.StringNullableFilter<"BoardColumn"> | string | null projectId?: Prisma.IntFilter<"BoardColumn"> | number name?: Prisma.StringFilter<"BoardColumn"> | string sortOrder?: Prisma.IntFilter<"BoardColumn"> | number @@ -579,6 +622,8 @@ export type BoardColumnScalarWhereInput = { } export type BoardColumnCreateWithoutTasksInput = { + uuid: string + projectUuid?: string | null name: string sortOrder?: number boundStatus?: string | null @@ -590,6 +635,8 @@ export type BoardColumnCreateWithoutTasksInput = { export type BoardColumnUncheckedCreateWithoutTasksInput = { id?: number + uuid: string + projectUuid?: string | null projectId: number name: string sortOrder?: number @@ -616,6 +663,8 @@ export type BoardColumnUpdateToOneWithWhereWithoutTasksInput = { } export type BoardColumnUpdateWithoutTasksInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null name?: Prisma.StringFieldUpdateOperationsInput | string sortOrder?: Prisma.IntFieldUpdateOperationsInput | number boundStatus?: Prisma.NullableStringFieldUpdateOperationsInput | string | null @@ -627,6 +676,8 @@ export type BoardColumnUpdateWithoutTasksInput = { export type BoardColumnUncheckedUpdateWithoutTasksInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null projectId?: Prisma.IntFieldUpdateOperationsInput | number name?: Prisma.StringFieldUpdateOperationsInput | string sortOrder?: Prisma.IntFieldUpdateOperationsInput | number @@ -638,6 +689,8 @@ export type BoardColumnUncheckedUpdateWithoutTasksInput = { export type BoardColumnCreateManyProjectInput = { id?: number + uuid: string + projectUuid?: string | null name: string sortOrder?: number boundStatus?: string | null @@ -647,6 +700,8 @@ export type BoardColumnCreateManyProjectInput = { } export type BoardColumnUpdateWithoutProjectInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null name?: Prisma.StringFieldUpdateOperationsInput | string sortOrder?: Prisma.IntFieldUpdateOperationsInput | number boundStatus?: Prisma.NullableStringFieldUpdateOperationsInput | string | null @@ -658,6 +713,8 @@ export type BoardColumnUpdateWithoutProjectInput = { export type BoardColumnUncheckedUpdateWithoutProjectInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null name?: Prisma.StringFieldUpdateOperationsInput | string sortOrder?: Prisma.IntFieldUpdateOperationsInput | number boundStatus?: Prisma.NullableStringFieldUpdateOperationsInput | string | null @@ -669,6 +726,8 @@ export type BoardColumnUncheckedUpdateWithoutProjectInput = { export type BoardColumnUncheckedUpdateManyWithoutProjectInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null name?: Prisma.StringFieldUpdateOperationsInput | string sortOrder?: Prisma.IntFieldUpdateOperationsInput | number boundStatus?: Prisma.NullableStringFieldUpdateOperationsInput | string | null @@ -710,6 +769,8 @@ export type BoardColumnCountOutputTypeCountTasksArgs = runtime.Types.Extensions.GetSelect<{ id?: boolean + uuid?: boolean + projectUuid?: boolean projectId?: boolean name?: boolean sortOrder?: boolean @@ -722,10 +783,38 @@ export type BoardColumnSelect }, ExtArgs["result"]["boardColumn"]> +export type BoardColumnSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + uuid?: boolean + projectUuid?: boolean + projectId?: boolean + name?: boolean + sortOrder?: boolean + boundStatus?: boolean + retention?: boolean + createdAt?: boolean + updatedAt?: boolean + project?: boolean | Prisma.ProjectDefaultArgs +}, ExtArgs["result"]["boardColumn"]> +export type BoardColumnSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + uuid?: boolean + projectUuid?: boolean + projectId?: boolean + name?: boolean + sortOrder?: boolean + boundStatus?: boolean + retention?: boolean + createdAt?: boolean + updatedAt?: boolean + project?: boolean | Prisma.ProjectDefaultArgs +}, ExtArgs["result"]["boardColumn"]> export type BoardColumnSelectScalar = { id?: boolean + uuid?: boolean + projectUuid?: boolean projectId?: boolean name?: boolean sortOrder?: boolean @@ -735,12 +824,18 @@ export type BoardColumnSelectScalar = { updatedAt?: boolean } -export type BoardColumnOmit = runtime.Types.Extensions.GetOmit<"id" | "projectId" | "name" | "sortOrder" | "boundStatus" | "retention" | "createdAt" | "updatedAt", ExtArgs["result"]["boardColumn"]> +export type BoardColumnOmit = runtime.Types.Extensions.GetOmit<"id" | "uuid" | "projectUuid" | "projectId" | "name" | "sortOrder" | "boundStatus" | "retention" | "createdAt" | "updatedAt", ExtArgs["result"]["boardColumn"]> export type BoardColumnInclude = { project?: boolean | Prisma.ProjectDefaultArgs tasks?: boolean | Prisma.BoardColumn$tasksArgs _count?: boolean | Prisma.BoardColumnCountOutputTypeDefaultArgs } +export type BoardColumnIncludeCreateManyAndReturn = { + project?: boolean | Prisma.ProjectDefaultArgs +} +export type BoardColumnIncludeUpdateManyAndReturn = { + project?: boolean | Prisma.ProjectDefaultArgs +} export type $BoardColumnPayload = { name: "BoardColumn" @@ -750,6 +845,8 @@ export type $BoardColumnPayload(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Create many BoardColumns and returns the data saved in the database. + * @param {BoardColumnCreateManyAndReturnArgs} args - Arguments to create many BoardColumns. + * @example + * // Create many BoardColumns + * const boardColumn = await prisma.boardColumn.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many BoardColumns and only return the `id` + * const boardColumnWithIdOnly = await prisma.boardColumn.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + /** * Delete a BoardColumn. * @param {BoardColumnDeleteArgs} args - Arguments to delete one BoardColumn. @@ -938,6 +1059,36 @@ export interface BoardColumnDelegate(args: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Update zero or more BoardColumns and returns the data updated in the database. + * @param {BoardColumnUpdateManyAndReturnArgs} args - Arguments to update many BoardColumns. + * @example + * // Update many BoardColumns + * const boardColumn = await prisma.boardColumn.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more BoardColumns and only return the `id` + * const boardColumnWithIdOnly = await prisma.boardColumn.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + /** * Create or update one BoardColumn. * @param {BoardColumnUpsertArgs} args - Arguments to update or create a BoardColumn. @@ -1129,6 +1280,8 @@ export interface Prisma__BoardColumnClient + readonly uuid: Prisma.FieldRef<"BoardColumn", 'String'> + readonly projectUuid: Prisma.FieldRef<"BoardColumn", 'String'> readonly projectId: Prisma.FieldRef<"BoardColumn", 'Int'> readonly name: Prisma.FieldRef<"BoardColumn", 'String'> readonly sortOrder: Prisma.FieldRef<"BoardColumn", 'Int'> @@ -1373,6 +1526,29 @@ export type BoardColumnCreateManyArgs = { + /** + * Select specific fields to fetch from the BoardColumn + */ + select?: Prisma.BoardColumnSelectCreateManyAndReturn | null + /** + * Omit specific fields from the BoardColumn + */ + omit?: Prisma.BoardColumnOmit | null + /** + * The data used to create many BoardColumns. + */ + data: Prisma.BoardColumnCreateManyInput | Prisma.BoardColumnCreateManyInput[] + skipDuplicates?: boolean + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.BoardColumnIncludeCreateManyAndReturn | null +} + /** * BoardColumn update */ @@ -1417,6 +1593,36 @@ export type BoardColumnUpdateManyArgs = { + /** + * Select specific fields to fetch from the BoardColumn + */ + select?: Prisma.BoardColumnSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the BoardColumn + */ + omit?: Prisma.BoardColumnOmit | null + /** + * The data used to update BoardColumns. + */ + data: Prisma.XOR + /** + * Filter which BoardColumns to update + */ + where?: Prisma.BoardColumnWhereInput + /** + * Limit how many BoardColumns to update. + */ + limit?: number + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.BoardColumnIncludeUpdateManyAndReturn | null +} + /** * BoardColumn upsert */ diff --git a/generated/prisma/models/CheckIn.ts b/generated/prisma/models/CheckIn.ts index afe0207..9dec467 100644 --- a/generated/prisma/models/CheckIn.ts +++ b/generated/prisma/models/CheckIn.ts @@ -267,7 +267,6 @@ export type CheckInOrderByWithRelationInput = { createdAt?: Prisma.SortOrder habit?: Prisma.HabitOrderByWithRelationInput user?: Prisma.UserOrderByWithRelationInput - _relevance?: Prisma.CheckInOrderByRelevanceInput } export type CheckInWhereUniqueInput = Prisma.AtLeast<{ @@ -399,12 +398,6 @@ export type CheckInOrderByRelationAggregateInput = { _count?: Prisma.SortOrder } -export type CheckInOrderByRelevanceInput = { - fields: Prisma.CheckInOrderByRelevanceFieldEnum | Prisma.CheckInOrderByRelevanceFieldEnum[] - sort: Prisma.SortOrder - search: string -} - export type CheckInHabitIdDateSeqCompoundUniqueInput = { habitId: number date: string @@ -739,7 +732,31 @@ export type CheckInSelect }, ExtArgs["result"]["checkIn"]> +export type CheckInSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + habitId?: boolean + userId?: boolean + date?: boolean + seq?: boolean + note?: boolean + source?: boolean + createdAt?: boolean + habit?: boolean | Prisma.HabitDefaultArgs + user?: boolean | Prisma.UserDefaultArgs +}, ExtArgs["result"]["checkIn"]> +export type CheckInSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + habitId?: boolean + userId?: boolean + date?: boolean + seq?: boolean + note?: boolean + source?: boolean + createdAt?: boolean + habit?: boolean | Prisma.HabitDefaultArgs + user?: boolean | Prisma.UserDefaultArgs +}, ExtArgs["result"]["checkIn"]> export type CheckInSelectScalar = { id?: boolean @@ -757,6 +774,14 @@ export type CheckInInclude user?: boolean | Prisma.UserDefaultArgs } +export type CheckInIncludeCreateManyAndReturn = { + habit?: boolean | Prisma.HabitDefaultArgs + user?: boolean | Prisma.UserDefaultArgs +} +export type CheckInIncludeUpdateManyAndReturn = { + habit?: boolean | Prisma.HabitDefaultArgs + user?: boolean | Prisma.UserDefaultArgs +} export type $CheckInPayload = { name: "CheckIn" @@ -890,6 +915,30 @@ export interface CheckInDelegate(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Create many CheckIns and returns the data saved in the database. + * @param {CheckInCreateManyAndReturnArgs} args - Arguments to create many CheckIns. + * @example + * // Create many CheckIns + * const checkIn = await prisma.checkIn.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many CheckIns and only return the `id` + * const checkInWithIdOnly = await prisma.checkIn.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + /** * Delete a CheckIn. * @param {CheckInDeleteArgs} args - Arguments to delete one CheckIn. @@ -954,6 +1003,36 @@ export interface CheckInDelegate(args: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Update zero or more CheckIns and returns the data updated in the database. + * @param {CheckInUpdateManyAndReturnArgs} args - Arguments to update many CheckIns. + * @example + * // Update many CheckIns + * const checkIn = await prisma.checkIn.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more CheckIns and only return the `id` + * const checkInWithIdOnly = await prisma.checkIn.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + /** * Create or update one CheckIn. * @param {CheckInUpsertArgs} args - Arguments to update or create a CheckIn. @@ -1389,6 +1468,29 @@ export type CheckInCreateManyArgs = { + /** + * Select specific fields to fetch from the CheckIn + */ + select?: Prisma.CheckInSelectCreateManyAndReturn | null + /** + * Omit specific fields from the CheckIn + */ + omit?: Prisma.CheckInOmit | null + /** + * The data used to create many CheckIns. + */ + data: Prisma.CheckInCreateManyInput | Prisma.CheckInCreateManyInput[] + skipDuplicates?: boolean + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckInIncludeCreateManyAndReturn | null +} + /** * CheckIn update */ @@ -1433,6 +1535,36 @@ export type CheckInUpdateManyArgs = { + /** + * Select specific fields to fetch from the CheckIn + */ + select?: Prisma.CheckInSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the CheckIn + */ + omit?: Prisma.CheckInOmit | null + /** + * The data used to update CheckIns. + */ + data: Prisma.XOR + /** + * Filter which CheckIns to update + */ + where?: Prisma.CheckInWhereInput + /** + * Limit how many CheckIns to update. + */ + limit?: number + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckInIncludeUpdateManyAndReturn | null +} + /** * CheckIn upsert */ diff --git a/generated/prisma/models/CheckList.ts b/generated/prisma/models/CheckList.ts index 551ee73..d3b4ea5 100644 --- a/generated/prisma/models/CheckList.ts +++ b/generated/prisma/models/CheckList.ts @@ -259,7 +259,6 @@ export type CheckListOrderByWithRelationInput = { updatedAt?: Prisma.SortOrder user?: Prisma.UserOrderByWithRelationInput items?: Prisma.CheckListItemOrderByRelationAggregateInput - _relevance?: Prisma.CheckListOrderByRelevanceInput } export type CheckListWhereUniqueInput = Prisma.AtLeast<{ @@ -395,12 +394,6 @@ export type CheckListOrderByRelationAggregateInput = { _count?: Prisma.SortOrder } -export type CheckListOrderByRelevanceInput = { - fields: Prisma.CheckListOrderByRelevanceFieldEnum | Prisma.CheckListOrderByRelevanceFieldEnum[] - sort: Prisma.SortOrder - search: string -} - export type CheckListCountOrderByAggregateInput = { id?: Prisma.SortOrder userId?: Prisma.SortOrder @@ -710,7 +703,29 @@ export type CheckListSelect }, ExtArgs["result"]["checkList"]> +export type CheckListSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + userId?: boolean + title?: boolean + scene?: boolean + note?: boolean + archived?: boolean + createdAt?: boolean + updatedAt?: boolean + user?: boolean | Prisma.UserDefaultArgs +}, ExtArgs["result"]["checkList"]> +export type CheckListSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + userId?: boolean + title?: boolean + scene?: boolean + note?: boolean + archived?: boolean + createdAt?: boolean + updatedAt?: boolean + user?: boolean | Prisma.UserDefaultArgs +}, ExtArgs["result"]["checkList"]> export type CheckListSelectScalar = { id?: boolean @@ -729,6 +744,12 @@ export type CheckListInclude _count?: boolean | Prisma.CheckListCountOutputTypeDefaultArgs } +export type CheckListIncludeCreateManyAndReturn = { + user?: boolean | Prisma.UserDefaultArgs +} +export type CheckListIncludeUpdateManyAndReturn = { + user?: boolean | Prisma.UserDefaultArgs +} export type $CheckListPayload = { name: "CheckList" @@ -862,6 +883,30 @@ export interface CheckListDelegate(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Create many CheckLists and returns the data saved in the database. + * @param {CheckListCreateManyAndReturnArgs} args - Arguments to create many CheckLists. + * @example + * // Create many CheckLists + * const checkList = await prisma.checkList.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many CheckLists and only return the `id` + * const checkListWithIdOnly = await prisma.checkList.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + /** * Delete a CheckList. * @param {CheckListDeleteArgs} args - Arguments to delete one CheckList. @@ -926,6 +971,36 @@ export interface CheckListDelegate(args: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Update zero or more CheckLists and returns the data updated in the database. + * @param {CheckListUpdateManyAndReturnArgs} args - Arguments to update many CheckLists. + * @example + * // Update many CheckLists + * const checkList = await prisma.checkList.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more CheckLists and only return the `id` + * const checkListWithIdOnly = await prisma.checkList.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + /** * Create or update one CheckList. * @param {CheckListUpsertArgs} args - Arguments to update or create a CheckList. @@ -1361,6 +1436,29 @@ export type CheckListCreateManyArgs = { + /** + * Select specific fields to fetch from the CheckList + */ + select?: Prisma.CheckListSelectCreateManyAndReturn | null + /** + * Omit specific fields from the CheckList + */ + omit?: Prisma.CheckListOmit | null + /** + * The data used to create many CheckLists. + */ + data: Prisma.CheckListCreateManyInput | Prisma.CheckListCreateManyInput[] + skipDuplicates?: boolean + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListIncludeCreateManyAndReturn | null +} + /** * CheckList update */ @@ -1405,6 +1503,36 @@ export type CheckListUpdateManyArgs = { + /** + * Select specific fields to fetch from the CheckList + */ + select?: Prisma.CheckListSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the CheckList + */ + omit?: Prisma.CheckListOmit | null + /** + * The data used to update CheckLists. + */ + data: Prisma.XOR + /** + * Filter which CheckLists to update + */ + where?: Prisma.CheckListWhereInput + /** + * Limit how many CheckLists to update. + */ + limit?: number + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListIncludeUpdateManyAndReturn | null +} + /** * CheckList upsert */ diff --git a/generated/prisma/models/CheckListItem.ts b/generated/prisma/models/CheckListItem.ts index df1e459..090f49f 100644 --- a/generated/prisma/models/CheckListItem.ts +++ b/generated/prisma/models/CheckListItem.ts @@ -270,7 +270,6 @@ export type CheckListItemOrderByWithRelationInput = { createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder list?: Prisma.CheckListOrderByWithRelationInput - _relevance?: Prisma.CheckListItemOrderByRelevanceInput } export type CheckListItemWhereUniqueInput = Prisma.AtLeast<{ @@ -411,12 +410,6 @@ export type CheckListItemOrderByRelationAggregateInput = { _count?: Prisma.SortOrder } -export type CheckListItemOrderByRelevanceInput = { - fields: Prisma.CheckListItemOrderByRelevanceFieldEnum | Prisma.CheckListItemOrderByRelevanceFieldEnum[] - sort: Prisma.SortOrder - search: string -} - export type CheckListItemCountOrderByAggregateInput = { id?: Prisma.SortOrder listId?: Prisma.SortOrder @@ -627,7 +620,31 @@ export type CheckListItemSelect }, ExtArgs["result"]["checkListItem"]> +export type CheckListItemSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + listId?: boolean + title?: boolean + note?: boolean + done?: boolean + doneAt?: boolean + sortOrder?: boolean + createdAt?: boolean + updatedAt?: boolean + list?: boolean | Prisma.CheckListDefaultArgs +}, ExtArgs["result"]["checkListItem"]> +export type CheckListItemSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + listId?: boolean + title?: boolean + note?: boolean + done?: boolean + doneAt?: boolean + sortOrder?: boolean + createdAt?: boolean + updatedAt?: boolean + list?: boolean | Prisma.CheckListDefaultArgs +}, ExtArgs["result"]["checkListItem"]> export type CheckListItemSelectScalar = { id?: boolean @@ -645,6 +662,12 @@ export type CheckListItemOmit = { list?: boolean | Prisma.CheckListDefaultArgs } +export type CheckListItemIncludeCreateManyAndReturn = { + list?: boolean | Prisma.CheckListDefaultArgs +} +export type CheckListItemIncludeUpdateManyAndReturn = { + list?: boolean | Prisma.CheckListDefaultArgs +} export type $CheckListItemPayload = { name: "CheckListItem" @@ -778,6 +801,30 @@ export interface CheckListItemDelegate(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Create many CheckListItems and returns the data saved in the database. + * @param {CheckListItemCreateManyAndReturnArgs} args - Arguments to create many CheckListItems. + * @example + * // Create many CheckListItems + * const checkListItem = await prisma.checkListItem.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many CheckListItems and only return the `id` + * const checkListItemWithIdOnly = await prisma.checkListItem.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + /** * Delete a CheckListItem. * @param {CheckListItemDeleteArgs} args - Arguments to delete one CheckListItem. @@ -842,6 +889,36 @@ export interface CheckListItemDelegate(args: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Update zero or more CheckListItems and returns the data updated in the database. + * @param {CheckListItemUpdateManyAndReturnArgs} args - Arguments to update many CheckListItems. + * @example + * // Update many CheckListItems + * const checkListItem = await prisma.checkListItem.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more CheckListItems and only return the `id` + * const checkListItemWithIdOnly = await prisma.checkListItem.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + /** * Create or update one CheckListItem. * @param {CheckListItemUpsertArgs} args - Arguments to update or create a CheckListItem. @@ -1277,6 +1354,29 @@ export type CheckListItemCreateManyArgs = { + /** + * Select specific fields to fetch from the CheckListItem + */ + select?: Prisma.CheckListItemSelectCreateManyAndReturn | null + /** + * Omit specific fields from the CheckListItem + */ + omit?: Prisma.CheckListItemOmit | null + /** + * The data used to create many CheckListItems. + */ + data: Prisma.CheckListItemCreateManyInput | Prisma.CheckListItemCreateManyInput[] + skipDuplicates?: boolean + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListItemIncludeCreateManyAndReturn | null +} + /** * CheckListItem update */ @@ -1321,6 +1421,36 @@ export type CheckListItemUpdateManyArgs = { + /** + * Select specific fields to fetch from the CheckListItem + */ + select?: Prisma.CheckListItemSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the CheckListItem + */ + omit?: Prisma.CheckListItemOmit | null + /** + * The data used to update CheckListItems. + */ + data: Prisma.XOR + /** + * Filter which CheckListItems to update + */ + where?: Prisma.CheckListItemWhereInput + /** + * Limit how many CheckListItems to update. + */ + limit?: number + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListItemIncludeUpdateManyAndReturn | null +} + /** * CheckListItem upsert */ diff --git a/generated/prisma/models/CheckListTemplate.ts b/generated/prisma/models/CheckListTemplate.ts index 5f9debe..ce406ee 100644 --- a/generated/prisma/models/CheckListTemplate.ts +++ b/generated/prisma/models/CheckListTemplate.ts @@ -253,7 +253,6 @@ export type CheckListTemplateOrderByWithRelationInput = { createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder user?: Prisma.UserOrderByWithRelationInput - _relevance?: Prisma.CheckListTemplateOrderByRelevanceInput } export type CheckListTemplateWhereUniqueInput = Prisma.AtLeast<{ @@ -384,12 +383,6 @@ export type CheckListTemplateOrderByRelationAggregateInput = { _count?: Prisma.SortOrder } -export type CheckListTemplateOrderByRelevanceInput = { - fields: Prisma.CheckListTemplateOrderByRelevanceFieldEnum | Prisma.CheckListTemplateOrderByRelevanceFieldEnum[] - sort: Prisma.SortOrder - search: string -} - export type CheckListTemplateCountOrderByAggregateInput = { id?: Prisma.SortOrder userId?: Prisma.SortOrder @@ -585,7 +578,29 @@ export type CheckListTemplateSelect }, ExtArgs["result"]["checkListTemplate"]> +export type CheckListTemplateSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + userId?: boolean + name?: boolean + scene?: boolean + items?: boolean + builtin?: boolean + createdAt?: boolean + updatedAt?: boolean + user?: boolean | Prisma.CheckListTemplate$userArgs +}, ExtArgs["result"]["checkListTemplate"]> +export type CheckListTemplateSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + userId?: boolean + name?: boolean + scene?: boolean + items?: boolean + builtin?: boolean + createdAt?: boolean + updatedAt?: boolean + user?: boolean | Prisma.CheckListTemplate$userArgs +}, ExtArgs["result"]["checkListTemplate"]> export type CheckListTemplateSelectScalar = { id?: boolean @@ -602,6 +617,12 @@ export type CheckListTemplateOmit = { user?: boolean | Prisma.CheckListTemplate$userArgs } +export type CheckListTemplateIncludeCreateManyAndReturn = { + user?: boolean | Prisma.CheckListTemplate$userArgs +} +export type CheckListTemplateIncludeUpdateManyAndReturn = { + user?: boolean | Prisma.CheckListTemplate$userArgs +} export type $CheckListTemplatePayload = { name: "CheckListTemplate" @@ -734,6 +755,30 @@ export interface CheckListTemplateDelegate(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Create many CheckListTemplates and returns the data saved in the database. + * @param {CheckListTemplateCreateManyAndReturnArgs} args - Arguments to create many CheckListTemplates. + * @example + * // Create many CheckListTemplates + * const checkListTemplate = await prisma.checkListTemplate.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many CheckListTemplates and only return the `id` + * const checkListTemplateWithIdOnly = await prisma.checkListTemplate.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + /** * Delete a CheckListTemplate. * @param {CheckListTemplateDeleteArgs} args - Arguments to delete one CheckListTemplate. @@ -798,6 +843,36 @@ export interface CheckListTemplateDelegate(args: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Update zero or more CheckListTemplates and returns the data updated in the database. + * @param {CheckListTemplateUpdateManyAndReturnArgs} args - Arguments to update many CheckListTemplates. + * @example + * // Update many CheckListTemplates + * const checkListTemplate = await prisma.checkListTemplate.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more CheckListTemplates and only return the `id` + * const checkListTemplateWithIdOnly = await prisma.checkListTemplate.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + /** * Create or update one CheckListTemplate. * @param {CheckListTemplateUpsertArgs} args - Arguments to update or create a CheckListTemplate. @@ -1232,6 +1307,29 @@ export type CheckListTemplateCreateManyArgs = { + /** + * Select specific fields to fetch from the CheckListTemplate + */ + select?: Prisma.CheckListTemplateSelectCreateManyAndReturn | null + /** + * Omit specific fields from the CheckListTemplate + */ + omit?: Prisma.CheckListTemplateOmit | null + /** + * The data used to create many CheckListTemplates. + */ + data: Prisma.CheckListTemplateCreateManyInput | Prisma.CheckListTemplateCreateManyInput[] + skipDuplicates?: boolean + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListTemplateIncludeCreateManyAndReturn | null +} + /** * CheckListTemplate update */ @@ -1276,6 +1374,36 @@ export type CheckListTemplateUpdateManyArgs = { + /** + * Select specific fields to fetch from the CheckListTemplate + */ + select?: Prisma.CheckListTemplateSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the CheckListTemplate + */ + omit?: Prisma.CheckListTemplateOmit | null + /** + * The data used to update CheckListTemplates. + */ + data: Prisma.XOR + /** + * Filter which CheckListTemplates to update + */ + where?: Prisma.CheckListTemplateWhereInput + /** + * Limit how many CheckListTemplates to update. + */ + limit?: number + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListTemplateIncludeUpdateManyAndReturn | null +} + /** * CheckListTemplate upsert */ diff --git a/generated/prisma/models/Econ_SowInventory.ts b/generated/prisma/models/Econ_SowInventory.ts index d1bb041..913e025 100644 --- a/generated/prisma/models/Econ_SowInventory.ts +++ b/generated/prisma/models/Econ_SowInventory.ts @@ -228,7 +228,6 @@ export type Econ_SowInventoryOrderByWithRelationInput = { inventory?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder - _relevance?: Prisma.Econ_SowInventoryOrderByRelevanceInput } export type Econ_SowInventoryWhereUniqueInput = Prisma.AtLeast<{ @@ -319,12 +318,6 @@ export type Econ_SowInventoryUncheckedUpdateManyInput = { updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } -export type Econ_SowInventoryOrderByRelevanceInput = { - fields: Prisma.Econ_SowInventoryOrderByRelevanceFieldEnum | Prisma.Econ_SowInventoryOrderByRelevanceFieldEnum[] - sort: Prisma.SortOrder - search: string -} - export type Econ_SowInventoryCountOrderByAggregateInput = { id?: Prisma.SortOrder month?: Prisma.SortOrder @@ -369,7 +362,21 @@ export type Econ_SowInventorySelect +export type Econ_SowInventorySelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + month?: boolean + inventory?: boolean + createdAt?: boolean + updatedAt?: boolean +}, ExtArgs["result"]["econ_SowInventory"]> +export type Econ_SowInventorySelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + month?: boolean + inventory?: boolean + createdAt?: boolean + updatedAt?: boolean +}, ExtArgs["result"]["econ_SowInventory"]> export type Econ_SowInventorySelectScalar = { id?: boolean @@ -507,6 +514,30 @@ export interface Econ_SowInventoryDelegate(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Create many Econ_SowInventories and returns the data saved in the database. + * @param {Econ_SowInventoryCreateManyAndReturnArgs} args - Arguments to create many Econ_SowInventories. + * @example + * // Create many Econ_SowInventories + * const econ_SowInventory = await prisma.econ_SowInventory.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many Econ_SowInventories and only return the `id` + * const econ_SowInventoryWithIdOnly = await prisma.econ_SowInventory.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + /** * Delete a Econ_SowInventory. * @param {Econ_SowInventoryDeleteArgs} args - Arguments to delete one Econ_SowInventory. @@ -571,6 +602,36 @@ export interface Econ_SowInventoryDelegate(args: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Update zero or more Econ_SowInventories and returns the data updated in the database. + * @param {Econ_SowInventoryUpdateManyAndReturnArgs} args - Arguments to update many Econ_SowInventories. + * @example + * // Update many Econ_SowInventories + * const econ_SowInventory = await prisma.econ_SowInventory.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more Econ_SowInventories and only return the `id` + * const econ_SowInventoryWithIdOnly = await prisma.econ_SowInventory.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + /** * Create or update one Econ_SowInventory. * @param {Econ_SowInventoryUpsertArgs} args - Arguments to update or create a Econ_SowInventory. @@ -977,6 +1038,25 @@ export type Econ_SowInventoryCreateManyArgs = { + /** + * Select specific fields to fetch from the Econ_SowInventory + */ + select?: Prisma.Econ_SowInventorySelectCreateManyAndReturn | null + /** + * Omit specific fields from the Econ_SowInventory + */ + omit?: Prisma.Econ_SowInventoryOmit | null + /** + * The data used to create many Econ_SowInventories. + */ + data: Prisma.Econ_SowInventoryCreateManyInput | Prisma.Econ_SowInventoryCreateManyInput[] + skipDuplicates?: boolean +} + /** * Econ_SowInventory update */ @@ -1017,6 +1097,32 @@ export type Econ_SowInventoryUpdateManyArgs = { + /** + * Select specific fields to fetch from the Econ_SowInventory + */ + select?: Prisma.Econ_SowInventorySelectUpdateManyAndReturn | null + /** + * Omit specific fields from the Econ_SowInventory + */ + omit?: Prisma.Econ_SowInventoryOmit | null + /** + * The data used to update Econ_SowInventories. + */ + data: Prisma.XOR + /** + * Filter which Econ_SowInventories to update + */ + where?: Prisma.Econ_SowInventoryWhereInput + /** + * Limit how many Econ_SowInventories to update. + */ + limit?: number +} + /** * Econ_SowInventory upsert */ diff --git a/generated/prisma/models/Habit.ts b/generated/prisma/models/Habit.ts index 22795ad..7142af3 100644 --- a/generated/prisma/models/Habit.ts +++ b/generated/prisma/models/Habit.ts @@ -303,7 +303,6 @@ export type HabitOrderByWithRelationInput = { updatedAt?: Prisma.SortOrder user?: Prisma.UserOrderByWithRelationInput records?: Prisma.CheckInOrderByRelationAggregateInput - _relevance?: Prisma.HabitOrderByRelevanceInput } export type HabitWhereUniqueInput = Prisma.AtLeast<{ @@ -479,12 +478,6 @@ export type HabitOrderByRelationAggregateInput = { _count?: Prisma.SortOrder } -export type HabitOrderByRelevanceInput = { - fields: Prisma.HabitOrderByRelevanceFieldEnum | Prisma.HabitOrderByRelevanceFieldEnum[] - sort: Prisma.SortOrder - search: string -} - export type HabitCountOrderByAggregateInput = { id?: Prisma.SortOrder userId?: Prisma.SortOrder @@ -858,7 +851,37 @@ export type HabitSelect }, ExtArgs["result"]["habit"]> +export type HabitSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + userId?: boolean + name?: boolean + period?: boolean + target?: boolean + color?: boolean + icon?: boolean + note?: boolean + archived?: boolean + sortOrder?: boolean + createdAt?: boolean + updatedAt?: boolean + user?: boolean | Prisma.UserDefaultArgs +}, ExtArgs["result"]["habit"]> +export type HabitSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + userId?: boolean + name?: boolean + period?: boolean + target?: boolean + color?: boolean + icon?: boolean + note?: boolean + archived?: boolean + sortOrder?: boolean + createdAt?: boolean + updatedAt?: boolean + user?: boolean | Prisma.UserDefaultArgs +}, ExtArgs["result"]["habit"]> export type HabitSelectScalar = { id?: boolean @@ -881,6 +904,12 @@ export type HabitInclude _count?: boolean | Prisma.HabitCountOutputTypeDefaultArgs } +export type HabitIncludeCreateManyAndReturn = { + user?: boolean | Prisma.UserDefaultArgs +} +export type HabitIncludeUpdateManyAndReturn = { + user?: boolean | Prisma.UserDefaultArgs +} export type $HabitPayload = { name: "Habit" @@ -1018,6 +1047,30 @@ export interface HabitDelegate(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Create many Habits and returns the data saved in the database. + * @param {HabitCreateManyAndReturnArgs} args - Arguments to create many Habits. + * @example + * // Create many Habits + * const habit = await prisma.habit.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many Habits and only return the `id` + * const habitWithIdOnly = await prisma.habit.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + /** * Delete a Habit. * @param {HabitDeleteArgs} args - Arguments to delete one Habit. @@ -1082,6 +1135,36 @@ export interface HabitDelegate(args: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Update zero or more Habits and returns the data updated in the database. + * @param {HabitUpdateManyAndReturnArgs} args - Arguments to update many Habits. + * @example + * // Update many Habits + * const habit = await prisma.habit.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more Habits and only return the `id` + * const habitWithIdOnly = await prisma.habit.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + /** * Create or update one Habit. * @param {HabitUpsertArgs} args - Arguments to update or create a Habit. @@ -1521,6 +1604,29 @@ export type HabitCreateManyArgs = { + /** + * Select specific fields to fetch from the Habit + */ + select?: Prisma.HabitSelectCreateManyAndReturn | null + /** + * Omit specific fields from the Habit + */ + omit?: Prisma.HabitOmit | null + /** + * The data used to create many Habits. + */ + data: Prisma.HabitCreateManyInput | Prisma.HabitCreateManyInput[] + skipDuplicates?: boolean + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.HabitIncludeCreateManyAndReturn | null +} + /** * Habit update */ @@ -1565,6 +1671,36 @@ export type HabitUpdateManyArgs = { + /** + * Select specific fields to fetch from the Habit + */ + select?: Prisma.HabitSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the Habit + */ + omit?: Prisma.HabitOmit | null + /** + * The data used to update Habits. + */ + data: Prisma.XOR + /** + * Filter which Habits to update + */ + where?: Prisma.HabitWhereInput + /** + * Limit how many Habits to update. + */ + limit?: number + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.HabitIncludeUpdateManyAndReturn | null +} + /** * Habit upsert */ diff --git a/generated/prisma/models/Indicator.ts b/generated/prisma/models/Indicator.ts index 07a1e90..55d4a94 100644 --- a/generated/prisma/models/Indicator.ts +++ b/generated/prisma/models/Indicator.ts @@ -271,7 +271,6 @@ export type IndicatorOrderByWithRelationInput = { createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder points?: Prisma.IndicatorPointOrderByRelationAggregateInput - _relevance?: Prisma.IndicatorOrderByRelevanceInput } export type IndicatorWhereUniqueInput = Prisma.AtLeast<{ @@ -417,12 +416,6 @@ export type IndicatorUncheckedUpdateManyInput = { updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } -export type IndicatorOrderByRelevanceInput = { - fields: Prisma.IndicatorOrderByRelevanceFieldEnum | Prisma.IndicatorOrderByRelevanceFieldEnum[] - sort: Prisma.SortOrder - search: string -} - export type IndicatorCountOrderByAggregateInput = { id?: Prisma.SortOrder name?: Prisma.SortOrder @@ -605,7 +598,31 @@ export type IndicatorSelect }, ExtArgs["result"]["indicator"]> +export type IndicatorSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + name?: boolean + groupName?: boolean + title?: boolean + unit?: boolean + source?: boolean + frequency?: boolean + hidden?: boolean + createdAt?: boolean + updatedAt?: boolean +}, ExtArgs["result"]["indicator"]> +export type IndicatorSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + name?: boolean + groupName?: boolean + title?: boolean + unit?: boolean + source?: boolean + frequency?: boolean + hidden?: boolean + createdAt?: boolean + updatedAt?: boolean +}, ExtArgs["result"]["indicator"]> export type IndicatorSelectScalar = { id?: boolean @@ -625,6 +642,8 @@ export type IndicatorInclude _count?: boolean | Prisma.IndicatorCountOutputTypeDefaultArgs } +export type IndicatorIncludeCreateManyAndReturn = {} +export type IndicatorIncludeUpdateManyAndReturn = {} export type $IndicatorPayload = { name: "Indicator" @@ -759,6 +778,30 @@ export interface IndicatorDelegate(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Create many Indicators and returns the data saved in the database. + * @param {IndicatorCreateManyAndReturnArgs} args - Arguments to create many Indicators. + * @example + * // Create many Indicators + * const indicator = await prisma.indicator.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many Indicators and only return the `id` + * const indicatorWithIdOnly = await prisma.indicator.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + /** * Delete a Indicator. * @param {IndicatorDeleteArgs} args - Arguments to delete one Indicator. @@ -823,6 +866,36 @@ export interface IndicatorDelegate(args: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Update zero or more Indicators and returns the data updated in the database. + * @param {IndicatorUpdateManyAndReturnArgs} args - Arguments to update many Indicators. + * @example + * // Update many Indicators + * const indicator = await prisma.indicator.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more Indicators and only return the `id` + * const indicatorWithIdOnly = await prisma.indicator.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + /** * Create or update one Indicator. * @param {IndicatorUpsertArgs} args - Arguments to update or create a Indicator. @@ -1259,6 +1332,25 @@ export type IndicatorCreateManyArgs = { + /** + * Select specific fields to fetch from the Indicator + */ + select?: Prisma.IndicatorSelectCreateManyAndReturn | null + /** + * Omit specific fields from the Indicator + */ + omit?: Prisma.IndicatorOmit | null + /** + * The data used to create many Indicators. + */ + data: Prisma.IndicatorCreateManyInput | Prisma.IndicatorCreateManyInput[] + skipDuplicates?: boolean +} + /** * Indicator update */ @@ -1303,6 +1395,32 @@ export type IndicatorUpdateManyArgs = { + /** + * Select specific fields to fetch from the Indicator + */ + select?: Prisma.IndicatorSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the Indicator + */ + omit?: Prisma.IndicatorOmit | null + /** + * The data used to update Indicators. + */ + data: Prisma.XOR + /** + * Filter which Indicators to update + */ + where?: Prisma.IndicatorWhereInput + /** + * Limit how many Indicators to update. + */ + limit?: number +} + /** * Indicator upsert */ diff --git a/generated/prisma/models/IndicatorPoint.ts b/generated/prisma/models/IndicatorPoint.ts index 45c9fda..c2eb452 100644 --- a/generated/prisma/models/IndicatorPoint.ts +++ b/generated/prisma/models/IndicatorPoint.ts @@ -243,7 +243,6 @@ export type IndicatorPointOrderByWithRelationInput = { createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder indicator?: Prisma.IndicatorOrderByWithRelationInput - _relevance?: Prisma.IndicatorPointOrderByRelevanceInput } export type IndicatorPointWhereUniqueInput = Prisma.AtLeast<{ @@ -355,12 +354,6 @@ export type IndicatorPointOrderByRelationAggregateInput = { _count?: Prisma.SortOrder } -export type IndicatorPointOrderByRelevanceInput = { - fields: Prisma.IndicatorPointOrderByRelevanceFieldEnum | Prisma.IndicatorPointOrderByRelevanceFieldEnum[] - sort: Prisma.SortOrder - search: string -} - export type IndicatorPointIndicatorIdPeriodCompoundUniqueInput = { indicatorId: number period: string @@ -551,7 +544,25 @@ export type IndicatorPointSelect }, ExtArgs["result"]["indicatorPoint"]> +export type IndicatorPointSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + indicatorId?: boolean + period?: boolean + value?: boolean + createdAt?: boolean + updatedAt?: boolean + indicator?: boolean | Prisma.IndicatorDefaultArgs +}, ExtArgs["result"]["indicatorPoint"]> +export type IndicatorPointSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + indicatorId?: boolean + period?: boolean + value?: boolean + createdAt?: boolean + updatedAt?: boolean + indicator?: boolean | Prisma.IndicatorDefaultArgs +}, ExtArgs["result"]["indicatorPoint"]> export type IndicatorPointSelectScalar = { id?: boolean @@ -566,6 +577,12 @@ export type IndicatorPointOmit = { indicator?: boolean | Prisma.IndicatorDefaultArgs } +export type IndicatorPointIncludeCreateManyAndReturn = { + indicator?: boolean | Prisma.IndicatorDefaultArgs +} +export type IndicatorPointIncludeUpdateManyAndReturn = { + indicator?: boolean | Prisma.IndicatorDefaultArgs +} export type $IndicatorPointPayload = { name: "IndicatorPoint" @@ -696,6 +713,30 @@ export interface IndicatorPointDelegate(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Create many IndicatorPoints and returns the data saved in the database. + * @param {IndicatorPointCreateManyAndReturnArgs} args - Arguments to create many IndicatorPoints. + * @example + * // Create many IndicatorPoints + * const indicatorPoint = await prisma.indicatorPoint.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many IndicatorPoints and only return the `id` + * const indicatorPointWithIdOnly = await prisma.indicatorPoint.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + /** * Delete a IndicatorPoint. * @param {IndicatorPointDeleteArgs} args - Arguments to delete one IndicatorPoint. @@ -760,6 +801,36 @@ export interface IndicatorPointDelegate(args: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Update zero or more IndicatorPoints and returns the data updated in the database. + * @param {IndicatorPointUpdateManyAndReturnArgs} args - Arguments to update many IndicatorPoints. + * @example + * // Update many IndicatorPoints + * const indicatorPoint = await prisma.indicatorPoint.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more IndicatorPoints and only return the `id` + * const indicatorPointWithIdOnly = await prisma.indicatorPoint.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + /** * Create or update one IndicatorPoint. * @param {IndicatorPointUpsertArgs} args - Arguments to update or create a IndicatorPoint. @@ -1192,6 +1263,29 @@ export type IndicatorPointCreateManyArgs = { + /** + * Select specific fields to fetch from the IndicatorPoint + */ + select?: Prisma.IndicatorPointSelectCreateManyAndReturn | null + /** + * Omit specific fields from the IndicatorPoint + */ + omit?: Prisma.IndicatorPointOmit | null + /** + * The data used to create many IndicatorPoints. + */ + data: Prisma.IndicatorPointCreateManyInput | Prisma.IndicatorPointCreateManyInput[] + skipDuplicates?: boolean + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.IndicatorPointIncludeCreateManyAndReturn | null +} + /** * IndicatorPoint update */ @@ -1236,6 +1330,36 @@ export type IndicatorPointUpdateManyArgs = { + /** + * Select specific fields to fetch from the IndicatorPoint + */ + select?: Prisma.IndicatorPointSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the IndicatorPoint + */ + omit?: Prisma.IndicatorPointOmit | null + /** + * The data used to update IndicatorPoints. + */ + data: Prisma.XOR + /** + * Filter which IndicatorPoints to update + */ + where?: Prisma.IndicatorPointWhereInput + /** + * Limit how many IndicatorPoints to update. + */ + limit?: number + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.IndicatorPointIncludeUpdateManyAndReturn | null +} + /** * IndicatorPoint upsert */ diff --git a/generated/prisma/models/MihomeAccount.ts b/generated/prisma/models/MihomeAccount.ts index e0452c3..8b9b3bf 100644 --- a/generated/prisma/models/MihomeAccount.ts +++ b/generated/prisma/models/MihomeAccount.ts @@ -233,7 +233,6 @@ export type MihomeAccountOrderByWithRelationInput = { status?: Prisma.SortOrder lastError?: Prisma.SortOrder updatedAt?: Prisma.SortOrder - _relevance?: Prisma.MihomeAccountOrderByRelevanceInput } export type MihomeAccountWhereUniqueInput = Prisma.AtLeast<{ @@ -334,12 +333,6 @@ export type MihomeAccountUncheckedUpdateManyInput = { updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } -export type MihomeAccountOrderByRelevanceInput = { - fields: Prisma.MihomeAccountOrderByRelevanceFieldEnum | Prisma.MihomeAccountOrderByRelevanceFieldEnum[] - sort: Prisma.SortOrder - search: string -} - export type MihomeAccountCountOrderByAggregateInput = { id?: Prisma.SortOrder key?: Prisma.SortOrder @@ -386,7 +379,23 @@ export type MihomeAccountSelect +export type MihomeAccountSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + key?: boolean + userId?: boolean + status?: boolean + lastError?: boolean + updatedAt?: boolean +}, ExtArgs["result"]["mihomeAccount"]> +export type MihomeAccountSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + key?: boolean + userId?: boolean + status?: boolean + lastError?: boolean + updatedAt?: boolean +}, ExtArgs["result"]["mihomeAccount"]> export type MihomeAccountSelectScalar = { id?: boolean @@ -526,6 +535,30 @@ export interface MihomeAccountDelegate(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Create many MihomeAccounts and returns the data saved in the database. + * @param {MihomeAccountCreateManyAndReturnArgs} args - Arguments to create many MihomeAccounts. + * @example + * // Create many MihomeAccounts + * const mihomeAccount = await prisma.mihomeAccount.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many MihomeAccounts and only return the `id` + * const mihomeAccountWithIdOnly = await prisma.mihomeAccount.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + /** * Delete a MihomeAccount. * @param {MihomeAccountDeleteArgs} args - Arguments to delete one MihomeAccount. @@ -590,6 +623,36 @@ export interface MihomeAccountDelegate(args: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Update zero or more MihomeAccounts and returns the data updated in the database. + * @param {MihomeAccountUpdateManyAndReturnArgs} args - Arguments to update many MihomeAccounts. + * @example + * // Update many MihomeAccounts + * const mihomeAccount = await prisma.mihomeAccount.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more MihomeAccounts and only return the `id` + * const mihomeAccountWithIdOnly = await prisma.mihomeAccount.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + /** * Create or update one MihomeAccount. * @param {MihomeAccountUpsertArgs} args - Arguments to update or create a MihomeAccount. @@ -997,6 +1060,25 @@ export type MihomeAccountCreateManyArgs = { + /** + * Select specific fields to fetch from the MihomeAccount + */ + select?: Prisma.MihomeAccountSelectCreateManyAndReturn | null + /** + * Omit specific fields from the MihomeAccount + */ + omit?: Prisma.MihomeAccountOmit | null + /** + * The data used to create many MihomeAccounts. + */ + data: Prisma.MihomeAccountCreateManyInput | Prisma.MihomeAccountCreateManyInput[] + skipDuplicates?: boolean +} + /** * MihomeAccount update */ @@ -1037,6 +1119,32 @@ export type MihomeAccountUpdateManyArgs = { + /** + * Select specific fields to fetch from the MihomeAccount + */ + select?: Prisma.MihomeAccountSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the MihomeAccount + */ + omit?: Prisma.MihomeAccountOmit | null + /** + * The data used to update MihomeAccounts. + */ + data: Prisma.XOR + /** + * Filter which MihomeAccounts to update + */ + where?: Prisma.MihomeAccountWhereInput + /** + * Limit how many MihomeAccounts to update. + */ + limit?: number +} + /** * MihomeAccount upsert */ diff --git a/generated/prisma/models/MihomeDevice.ts b/generated/prisma/models/MihomeDevice.ts index 147f96b..1bc75d8 100644 --- a/generated/prisma/models/MihomeDevice.ts +++ b/generated/prisma/models/MihomeDevice.ts @@ -366,7 +366,6 @@ export type MihomeDeviceOrderByWithRelationInput = { home?: Prisma.MihomeHomeOrderByWithRelationInput samples?: Prisma.MihomeEnvSampleOrderByRelationAggregateInput hours?: Prisma.MihomeEnvHourOrderByRelationAggregateInput - _relevance?: Prisma.MihomeDeviceOrderByRelevanceInput } export type MihomeDeviceWhereUniqueInput = Prisma.AtLeast<{ @@ -597,12 +596,6 @@ export type MihomeDeviceOrderByRelationAggregateInput = { _count?: Prisma.SortOrder } -export type MihomeDeviceOrderByRelevanceInput = { - fields: Prisma.MihomeDeviceOrderByRelevanceFieldEnum | Prisma.MihomeDeviceOrderByRelevanceFieldEnum[] - sort: Prisma.SortOrder - search: string -} - export type MihomeDeviceCountOrderByAggregateInput = { id?: Prisma.SortOrder did?: Prisma.SortOrder @@ -1201,7 +1194,47 @@ export type MihomeDeviceSelect }, ExtArgs["result"]["mihomeDevice"]> +export type MihomeDeviceSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + did?: boolean + homeId?: boolean + model?: boolean + name?: boolean + alias?: boolean + tempSiid?: boolean + tempPiid?: boolean + humSiid?: boolean + humPiid?: boolean + battSiid?: boolean + battPiid?: boolean + battery?: boolean + batteryAt?: boolean + enabled?: boolean + lastSyncAt?: boolean + createdAt?: boolean + home?: boolean | Prisma.MihomeHomeDefaultArgs +}, ExtArgs["result"]["mihomeDevice"]> +export type MihomeDeviceSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + did?: boolean + homeId?: boolean + model?: boolean + name?: boolean + alias?: boolean + tempSiid?: boolean + tempPiid?: boolean + humSiid?: boolean + humPiid?: boolean + battSiid?: boolean + battPiid?: boolean + battery?: boolean + batteryAt?: boolean + enabled?: boolean + lastSyncAt?: boolean + createdAt?: boolean + home?: boolean | Prisma.MihomeHomeDefaultArgs +}, ExtArgs["result"]["mihomeDevice"]> export type MihomeDeviceSelectScalar = { id?: boolean @@ -1230,6 +1263,12 @@ export type MihomeDeviceInclude _count?: boolean | Prisma.MihomeDeviceCountOutputTypeDefaultArgs } +export type MihomeDeviceIncludeCreateManyAndReturn = { + home?: boolean | Prisma.MihomeHomeDefaultArgs +} +export type MihomeDeviceIncludeUpdateManyAndReturn = { + home?: boolean | Prisma.MihomeHomeDefaultArgs +} export type $MihomeDevicePayload = { name: "MihomeDevice" @@ -1373,6 +1412,30 @@ export interface MihomeDeviceDelegate(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Create many MihomeDevices and returns the data saved in the database. + * @param {MihomeDeviceCreateManyAndReturnArgs} args - Arguments to create many MihomeDevices. + * @example + * // Create many MihomeDevices + * const mihomeDevice = await prisma.mihomeDevice.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many MihomeDevices and only return the `id` + * const mihomeDeviceWithIdOnly = await prisma.mihomeDevice.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + /** * Delete a MihomeDevice. * @param {MihomeDeviceDeleteArgs} args - Arguments to delete one MihomeDevice. @@ -1437,6 +1500,36 @@ export interface MihomeDeviceDelegate(args: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Update zero or more MihomeDevices and returns the data updated in the database. + * @param {MihomeDeviceUpdateManyAndReturnArgs} args - Arguments to update many MihomeDevices. + * @example + * // Update many MihomeDevices + * const mihomeDevice = await prisma.mihomeDevice.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more MihomeDevices and only return the `id` + * const mihomeDeviceWithIdOnly = await prisma.mihomeDevice.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + /** * Create or update one MihomeDevice. * @param {MihomeDeviceUpsertArgs} args - Arguments to update or create a MihomeDevice. @@ -1882,6 +1975,29 @@ export type MihomeDeviceCreateManyArgs = { + /** + * Select specific fields to fetch from the MihomeDevice + */ + select?: Prisma.MihomeDeviceSelectCreateManyAndReturn | null + /** + * Omit specific fields from the MihomeDevice + */ + omit?: Prisma.MihomeDeviceOmit | null + /** + * The data used to create many MihomeDevices. + */ + data: Prisma.MihomeDeviceCreateManyInput | Prisma.MihomeDeviceCreateManyInput[] + skipDuplicates?: boolean + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeDeviceIncludeCreateManyAndReturn | null +} + /** * MihomeDevice update */ @@ -1926,6 +2042,36 @@ export type MihomeDeviceUpdateManyArgs = { + /** + * Select specific fields to fetch from the MihomeDevice + */ + select?: Prisma.MihomeDeviceSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the MihomeDevice + */ + omit?: Prisma.MihomeDeviceOmit | null + /** + * The data used to update MihomeDevices. + */ + data: Prisma.XOR + /** + * Filter which MihomeDevices to update + */ + where?: Prisma.MihomeDeviceWhereInput + /** + * Limit how many MihomeDevices to update. + */ + limit?: number + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeDeviceIncludeUpdateManyAndReturn | null +} + /** * MihomeDevice upsert */ diff --git a/generated/prisma/models/MihomeEnvHour.ts b/generated/prisma/models/MihomeEnvHour.ts index caf5ddd..d9369ad 100644 --- a/generated/prisma/models/MihomeEnvHour.ts +++ b/generated/prisma/models/MihomeEnvHour.ts @@ -566,7 +566,27 @@ export type MihomeEnvHourSelect }, ExtArgs["result"]["mihomeEnvHour"]> +export type MihomeEnvHourSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + deviceId?: boolean + hour?: boolean + temperatureAvg?: boolean + humidityAvg?: boolean + raw?: boolean + createdAt?: boolean + device?: boolean | Prisma.MihomeDeviceDefaultArgs +}, ExtArgs["result"]["mihomeEnvHour"]> +export type MihomeEnvHourSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + deviceId?: boolean + hour?: boolean + temperatureAvg?: boolean + humidityAvg?: boolean + raw?: boolean + createdAt?: boolean + device?: boolean | Prisma.MihomeDeviceDefaultArgs +}, ExtArgs["result"]["mihomeEnvHour"]> export type MihomeEnvHourSelectScalar = { id?: boolean @@ -582,6 +602,12 @@ export type MihomeEnvHourOmit = { device?: boolean | Prisma.MihomeDeviceDefaultArgs } +export type MihomeEnvHourIncludeCreateManyAndReturn = { + device?: boolean | Prisma.MihomeDeviceDefaultArgs +} +export type MihomeEnvHourIncludeUpdateManyAndReturn = { + device?: boolean | Prisma.MihomeDeviceDefaultArgs +} export type $MihomeEnvHourPayload = { name: "MihomeEnvHour" @@ -713,6 +739,30 @@ export interface MihomeEnvHourDelegate(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Create many MihomeEnvHours and returns the data saved in the database. + * @param {MihomeEnvHourCreateManyAndReturnArgs} args - Arguments to create many MihomeEnvHours. + * @example + * // Create many MihomeEnvHours + * const mihomeEnvHour = await prisma.mihomeEnvHour.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many MihomeEnvHours and only return the `id` + * const mihomeEnvHourWithIdOnly = await prisma.mihomeEnvHour.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + /** * Delete a MihomeEnvHour. * @param {MihomeEnvHourDeleteArgs} args - Arguments to delete one MihomeEnvHour. @@ -777,6 +827,36 @@ export interface MihomeEnvHourDelegate(args: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Update zero or more MihomeEnvHours and returns the data updated in the database. + * @param {MihomeEnvHourUpdateManyAndReturnArgs} args - Arguments to update many MihomeEnvHours. + * @example + * // Update many MihomeEnvHours + * const mihomeEnvHour = await prisma.mihomeEnvHour.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more MihomeEnvHours and only return the `id` + * const mihomeEnvHourWithIdOnly = await prisma.mihomeEnvHour.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + /** * Create or update one MihomeEnvHour. * @param {MihomeEnvHourUpsertArgs} args - Arguments to update or create a MihomeEnvHour. @@ -1210,6 +1290,29 @@ export type MihomeEnvHourCreateManyArgs = { + /** + * Select specific fields to fetch from the MihomeEnvHour + */ + select?: Prisma.MihomeEnvHourSelectCreateManyAndReturn | null + /** + * Omit specific fields from the MihomeEnvHour + */ + omit?: Prisma.MihomeEnvHourOmit | null + /** + * The data used to create many MihomeEnvHours. + */ + data: Prisma.MihomeEnvHourCreateManyInput | Prisma.MihomeEnvHourCreateManyInput[] + skipDuplicates?: boolean + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeEnvHourIncludeCreateManyAndReturn | null +} + /** * MihomeEnvHour update */ @@ -1254,6 +1357,36 @@ export type MihomeEnvHourUpdateManyArgs = { + /** + * Select specific fields to fetch from the MihomeEnvHour + */ + select?: Prisma.MihomeEnvHourSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the MihomeEnvHour + */ + omit?: Prisma.MihomeEnvHourOmit | null + /** + * The data used to update MihomeEnvHours. + */ + data: Prisma.XOR + /** + * Filter which MihomeEnvHours to update + */ + where?: Prisma.MihomeEnvHourWhereInput + /** + * Limit how many MihomeEnvHours to update. + */ + limit?: number + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeEnvHourIncludeUpdateManyAndReturn | null +} + /** * MihomeEnvHour upsert */ diff --git a/generated/prisma/models/MihomeEnvSample.ts b/generated/prisma/models/MihomeEnvSample.ts index 3d6f41c..84bdbb3 100644 --- a/generated/prisma/models/MihomeEnvSample.ts +++ b/generated/prisma/models/MihomeEnvSample.ts @@ -348,7 +348,6 @@ export type MihomeEnvSampleOrderByWithRelationInput = { raw?: Prisma.SortOrderInput | Prisma.SortOrder createdAt?: Prisma.SortOrder device?: Prisma.MihomeDeviceOrderByWithRelationInput - _relevance?: Prisma.MihomeEnvSampleOrderByRelevanceInput } export type MihomeEnvSampleWhereUniqueInput = Prisma.AtLeast<{ @@ -550,12 +549,6 @@ export type MihomeEnvSampleOrderByRelationAggregateInput = { _count?: Prisma.SortOrder } -export type MihomeEnvSampleOrderByRelevanceInput = { - fields: Prisma.MihomeEnvSampleOrderByRelevanceFieldEnum | Prisma.MihomeEnvSampleOrderByRelevanceFieldEnum[] - sort: Prisma.SortOrder - search: string -} - export type MihomeEnvSampleDeviceIdDateCompoundUniqueInput = { deviceId: number date: Date | string @@ -857,7 +850,43 @@ export type MihomeEnvSampleSelect }, ExtArgs["result"]["mihomeEnvSample"]> +export type MihomeEnvSampleSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + deviceId?: boolean + date?: boolean + temperature?: boolean + humidity?: boolean + temperatureAvg?: boolean + humidityAvg?: boolean + temperatureMin?: boolean + temperatureMax?: boolean + humidityMin?: boolean + humidityMax?: boolean + origin?: boolean + sampledAt?: boolean + raw?: boolean + createdAt?: boolean + device?: boolean | Prisma.MihomeDeviceDefaultArgs +}, ExtArgs["result"]["mihomeEnvSample"]> +export type MihomeEnvSampleSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + deviceId?: boolean + date?: boolean + temperature?: boolean + humidity?: boolean + temperatureAvg?: boolean + humidityAvg?: boolean + temperatureMin?: boolean + temperatureMax?: boolean + humidityMin?: boolean + humidityMax?: boolean + origin?: boolean + sampledAt?: boolean + raw?: boolean + createdAt?: boolean + device?: boolean | Prisma.MihomeDeviceDefaultArgs +}, ExtArgs["result"]["mihomeEnvSample"]> export type MihomeEnvSampleSelectScalar = { id?: boolean @@ -881,6 +910,12 @@ export type MihomeEnvSampleOmit = { device?: boolean | Prisma.MihomeDeviceDefaultArgs } +export type MihomeEnvSampleIncludeCreateManyAndReturn = { + device?: boolean | Prisma.MihomeDeviceDefaultArgs +} +export type MihomeEnvSampleIncludeUpdateManyAndReturn = { + device?: boolean | Prisma.MihomeDeviceDefaultArgs +} export type $MihomeEnvSamplePayload = { name: "MihomeEnvSample" @@ -1020,6 +1055,30 @@ export interface MihomeEnvSampleDelegate(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Create many MihomeEnvSamples and returns the data saved in the database. + * @param {MihomeEnvSampleCreateManyAndReturnArgs} args - Arguments to create many MihomeEnvSamples. + * @example + * // Create many MihomeEnvSamples + * const mihomeEnvSample = await prisma.mihomeEnvSample.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many MihomeEnvSamples and only return the `id` + * const mihomeEnvSampleWithIdOnly = await prisma.mihomeEnvSample.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + /** * Delete a MihomeEnvSample. * @param {MihomeEnvSampleDeleteArgs} args - Arguments to delete one MihomeEnvSample. @@ -1084,6 +1143,36 @@ export interface MihomeEnvSampleDelegate(args: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Update zero or more MihomeEnvSamples and returns the data updated in the database. + * @param {MihomeEnvSampleUpdateManyAndReturnArgs} args - Arguments to update many MihomeEnvSamples. + * @example + * // Update many MihomeEnvSamples + * const mihomeEnvSample = await prisma.mihomeEnvSample.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more MihomeEnvSamples and only return the `id` + * const mihomeEnvSampleWithIdOnly = await prisma.mihomeEnvSample.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + /** * Create or update one MihomeEnvSample. * @param {MihomeEnvSampleUpsertArgs} args - Arguments to update or create a MihomeEnvSample. @@ -1525,6 +1614,29 @@ export type MihomeEnvSampleCreateManyArgs = { + /** + * Select specific fields to fetch from the MihomeEnvSample + */ + select?: Prisma.MihomeEnvSampleSelectCreateManyAndReturn | null + /** + * Omit specific fields from the MihomeEnvSample + */ + omit?: Prisma.MihomeEnvSampleOmit | null + /** + * The data used to create many MihomeEnvSamples. + */ + data: Prisma.MihomeEnvSampleCreateManyInput | Prisma.MihomeEnvSampleCreateManyInput[] + skipDuplicates?: boolean + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeEnvSampleIncludeCreateManyAndReturn | null +} + /** * MihomeEnvSample update */ @@ -1569,6 +1681,36 @@ export type MihomeEnvSampleUpdateManyArgs = { + /** + * Select specific fields to fetch from the MihomeEnvSample + */ + select?: Prisma.MihomeEnvSampleSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the MihomeEnvSample + */ + omit?: Prisma.MihomeEnvSampleOmit | null + /** + * The data used to update MihomeEnvSamples. + */ + data: Prisma.XOR + /** + * Filter which MihomeEnvSamples to update + */ + where?: Prisma.MihomeEnvSampleWhereInput + /** + * Limit how many MihomeEnvSamples to update. + */ + limit?: number + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeEnvSampleIncludeUpdateManyAndReturn | null +} + /** * MihomeEnvSample upsert */ diff --git a/generated/prisma/models/MihomeHome.ts b/generated/prisma/models/MihomeHome.ts index 86b93c0..357258f 100644 --- a/generated/prisma/models/MihomeHome.ts +++ b/generated/prisma/models/MihomeHome.ts @@ -217,7 +217,6 @@ export type MihomeHomeOrderByWithRelationInput = { name?: Prisma.SortOrder createdAt?: Prisma.SortOrder devices?: Prisma.MihomeDeviceOrderByRelationAggregateInput - _relevance?: Prisma.MihomeHomeOrderByRelevanceInput } export type MihomeHomeWhereUniqueInput = Prisma.AtLeast<{ @@ -303,12 +302,6 @@ export type MihomeHomeUncheckedUpdateManyInput = { createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } -export type MihomeHomeOrderByRelevanceInput = { - fields: Prisma.MihomeHomeOrderByRelevanceFieldEnum | Prisma.MihomeHomeOrderByRelevanceFieldEnum[] - sort: Prisma.SortOrder - search: string -} - export type MihomeHomeCountOrderByAggregateInput = { id?: Prisma.SortOrder homeId?: Prisma.SortOrder @@ -439,7 +432,19 @@ export type MihomeHomeSelect }, ExtArgs["result"]["mihomeHome"]> +export type MihomeHomeSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + homeId?: boolean + name?: boolean + createdAt?: boolean +}, ExtArgs["result"]["mihomeHome"]> +export type MihomeHomeSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + homeId?: boolean + name?: boolean + createdAt?: boolean +}, ExtArgs["result"]["mihomeHome"]> export type MihomeHomeSelectScalar = { id?: boolean @@ -453,6 +458,8 @@ export type MihomeHomeInclude _count?: boolean | Prisma.MihomeHomeCountOutputTypeDefaultArgs } +export type MihomeHomeIncludeCreateManyAndReturn = {} +export type MihomeHomeIncludeUpdateManyAndReturn = {} export type $MihomeHomePayload = { name: "MihomeHome" @@ -581,6 +588,30 @@ export interface MihomeHomeDelegate(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Create many MihomeHomes and returns the data saved in the database. + * @param {MihomeHomeCreateManyAndReturnArgs} args - Arguments to create many MihomeHomes. + * @example + * // Create many MihomeHomes + * const mihomeHome = await prisma.mihomeHome.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many MihomeHomes and only return the `id` + * const mihomeHomeWithIdOnly = await prisma.mihomeHome.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + /** * Delete a MihomeHome. * @param {MihomeHomeDeleteArgs} args - Arguments to delete one MihomeHome. @@ -645,6 +676,36 @@ export interface MihomeHomeDelegate(args: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Update zero or more MihomeHomes and returns the data updated in the database. + * @param {MihomeHomeUpdateManyAndReturnArgs} args - Arguments to update many MihomeHomes. + * @example + * // Update many MihomeHomes + * const mihomeHome = await prisma.mihomeHome.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more MihomeHomes and only return the `id` + * const mihomeHomeWithIdOnly = await prisma.mihomeHome.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + /** * Create or update one MihomeHome. * @param {MihomeHomeUpsertArgs} args - Arguments to update or create a MihomeHome. @@ -1075,6 +1136,25 @@ export type MihomeHomeCreateManyArgs = { + /** + * Select specific fields to fetch from the MihomeHome + */ + select?: Prisma.MihomeHomeSelectCreateManyAndReturn | null + /** + * Omit specific fields from the MihomeHome + */ + omit?: Prisma.MihomeHomeOmit | null + /** + * The data used to create many MihomeHomes. + */ + data: Prisma.MihomeHomeCreateManyInput | Prisma.MihomeHomeCreateManyInput[] + skipDuplicates?: boolean +} + /** * MihomeHome update */ @@ -1119,6 +1199,32 @@ export type MihomeHomeUpdateManyArgs = { + /** + * Select specific fields to fetch from the MihomeHome + */ + select?: Prisma.MihomeHomeSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the MihomeHome + */ + omit?: Prisma.MihomeHomeOmit | null + /** + * The data used to update MihomeHomes. + */ + data: Prisma.XOR + /** + * Filter which MihomeHomes to update + */ + where?: Prisma.MihomeHomeWhereInput + /** + * Limit how many MihomeHomes to update. + */ + limit?: number +} + /** * MihomeHome upsert */ diff --git a/generated/prisma/models/News.ts b/generated/prisma/models/News.ts index 371f28c..0e3e81e 100644 --- a/generated/prisma/models/News.ts +++ b/generated/prisma/models/News.ts @@ -264,7 +264,6 @@ export type NewsOrderByWithRelationInput = { publishedAt?: Prisma.SortOrder impactRank?: Prisma.SortOrder createdAt?: Prisma.SortOrder - _relevance?: Prisma.NewsOrderByRelevanceInput } export type NewsWhereUniqueInput = Prisma.AtLeast<{ @@ -396,12 +395,6 @@ export type NewsUncheckedUpdateManyInput = { createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } -export type NewsOrderByRelevanceInput = { - fields: Prisma.NewsOrderByRelevanceFieldEnum | Prisma.NewsOrderByRelevanceFieldEnum[] - sort: Prisma.SortOrder - search: string -} - export type NewsTitlePublishedAtCompoundUniqueInput = { title: string publishedAt: Date | string @@ -471,7 +464,29 @@ export type NewsSelect +export type NewsSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + title?: boolean + summary?: boolean + content?: boolean + source?: boolean + url?: boolean + publishedAt?: boolean + impactRank?: boolean + createdAt?: boolean +}, ExtArgs["result"]["news"]> +export type NewsSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + title?: boolean + summary?: boolean + content?: boolean + source?: boolean + url?: boolean + publishedAt?: boolean + impactRank?: boolean + createdAt?: boolean +}, ExtArgs["result"]["news"]> export type NewsSelectScalar = { id?: boolean @@ -617,6 +632,30 @@ export interface NewsDelegate(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Create many News and returns the data saved in the database. + * @param {NewsCreateManyAndReturnArgs} args - Arguments to create many News. + * @example + * // Create many News + * const news = await prisma.news.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many News and only return the `id` + * const newsWithIdOnly = await prisma.news.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + /** * Delete a News. * @param {NewsDeleteArgs} args - Arguments to delete one News. @@ -681,6 +720,36 @@ export interface NewsDelegate(args: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Update zero or more News and returns the data updated in the database. + * @param {NewsUpdateManyAndReturnArgs} args - Arguments to update many News. + * @example + * // Update many News + * const news = await prisma.news.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more News and only return the `id` + * const newsWithIdOnly = await prisma.news.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + /** * Create or update one News. * @param {NewsUpsertArgs} args - Arguments to update or create a News. @@ -1091,6 +1160,25 @@ export type NewsCreateManyArgs = { + /** + * Select specific fields to fetch from the News + */ + select?: Prisma.NewsSelectCreateManyAndReturn | null + /** + * Omit specific fields from the News + */ + omit?: Prisma.NewsOmit | null + /** + * The data used to create many News. + */ + data: Prisma.NewsCreateManyInput | Prisma.NewsCreateManyInput[] + skipDuplicates?: boolean +} + /** * News update */ @@ -1131,6 +1219,32 @@ export type NewsUpdateManyArgs = { + /** + * Select specific fields to fetch from the News + */ + select?: Prisma.NewsSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the News + */ + omit?: Prisma.NewsOmit | null + /** + * The data used to update News. + */ + data: Prisma.XOR + /** + * Filter which News to update + */ + where?: Prisma.NewsWhereInput + /** + * Limit how many News to update. + */ + limit?: number +} + /** * News upsert */ diff --git a/generated/prisma/models/OilPriceHistory.ts b/generated/prisma/models/OilPriceHistory.ts index 0a2c329..c3d2204 100644 --- a/generated/prisma/models/OilPriceHistory.ts +++ b/generated/prisma/models/OilPriceHistory.ts @@ -246,7 +246,6 @@ export type OilPriceHistoryOrderByWithRelationInput = { price?: Prisma.SortOrder source?: Prisma.SortOrder createdAt?: Prisma.SortOrder - _relevance?: Prisma.OilPriceHistoryOrderByRelevanceInput } export type OilPriceHistoryWhereUniqueInput = Prisma.AtLeast<{ @@ -358,12 +357,6 @@ export type OilPriceHistoryUncheckedUpdateManyInput = { createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } -export type OilPriceHistoryOrderByRelevanceInput = { - fields: Prisma.OilPriceHistoryOrderByRelevanceFieldEnum | Prisma.OilPriceHistoryOrderByRelevanceFieldEnum[] - sort: Prisma.SortOrder - search: string -} - export type OilPriceHistoryDateProvinceFuelCompoundUniqueInput = { date: Date | string province: string @@ -422,7 +415,25 @@ export type OilPriceHistorySelect +export type OilPriceHistorySelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + date?: boolean + province?: boolean + fuel?: boolean + price?: boolean + source?: boolean + createdAt?: boolean +}, ExtArgs["result"]["oilPriceHistory"]> +export type OilPriceHistorySelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + date?: boolean + province?: boolean + fuel?: boolean + price?: boolean + source?: boolean + createdAt?: boolean +}, ExtArgs["result"]["oilPriceHistory"]> export type OilPriceHistorySelectScalar = { id?: boolean @@ -564,6 +575,30 @@ export interface OilPriceHistoryDelegate(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Create many OilPriceHistories and returns the data saved in the database. + * @param {OilPriceHistoryCreateManyAndReturnArgs} args - Arguments to create many OilPriceHistories. + * @example + * // Create many OilPriceHistories + * const oilPriceHistory = await prisma.oilPriceHistory.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many OilPriceHistories and only return the `id` + * const oilPriceHistoryWithIdOnly = await prisma.oilPriceHistory.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + /** * Delete a OilPriceHistory. * @param {OilPriceHistoryDeleteArgs} args - Arguments to delete one OilPriceHistory. @@ -628,6 +663,36 @@ export interface OilPriceHistoryDelegate(args: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Update zero or more OilPriceHistories and returns the data updated in the database. + * @param {OilPriceHistoryUpdateManyAndReturnArgs} args - Arguments to update many OilPriceHistories. + * @example + * // Update many OilPriceHistories + * const oilPriceHistory = await prisma.oilPriceHistory.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more OilPriceHistories and only return the `id` + * const oilPriceHistoryWithIdOnly = await prisma.oilPriceHistory.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + /** * Create or update one OilPriceHistory. * @param {OilPriceHistoryUpsertArgs} args - Arguments to update or create a OilPriceHistory. @@ -1036,6 +1101,25 @@ export type OilPriceHistoryCreateManyArgs = { + /** + * Select specific fields to fetch from the OilPriceHistory + */ + select?: Prisma.OilPriceHistorySelectCreateManyAndReturn | null + /** + * Omit specific fields from the OilPriceHistory + */ + omit?: Prisma.OilPriceHistoryOmit | null + /** + * The data used to create many OilPriceHistories. + */ + data: Prisma.OilPriceHistoryCreateManyInput | Prisma.OilPriceHistoryCreateManyInput[] + skipDuplicates?: boolean +} + /** * OilPriceHistory update */ @@ -1076,6 +1160,32 @@ export type OilPriceHistoryUpdateManyArgs = { + /** + * Select specific fields to fetch from the OilPriceHistory + */ + select?: Prisma.OilPriceHistorySelectUpdateManyAndReturn | null + /** + * Omit specific fields from the OilPriceHistory + */ + omit?: Prisma.OilPriceHistoryOmit | null + /** + * The data used to update OilPriceHistories. + */ + data: Prisma.XOR + /** + * Filter which OilPriceHistories to update + */ + where?: Prisma.OilPriceHistoryWhereInput + /** + * Limit how many OilPriceHistories to update. + */ + limit?: number +} + /** * OilPriceHistory upsert */ diff --git a/generated/prisma/models/Project.ts b/generated/prisma/models/Project.ts index 36eb086..f8d51b2 100644 --- a/generated/prisma/models/Project.ts +++ b/generated/prisma/models/Project.ts @@ -38,6 +38,8 @@ export type ProjectSumAggregateOutputType = { export type ProjectMinAggregateOutputType = { id: number | null + uuid: string | null + code: string | null name: string | null ownerId: number | null isPersonal: boolean | null @@ -50,6 +52,8 @@ export type ProjectMinAggregateOutputType = { export type ProjectMaxAggregateOutputType = { id: number | null + uuid: string | null + code: string | null name: string | null ownerId: number | null isPersonal: boolean | null @@ -62,6 +66,8 @@ export type ProjectMaxAggregateOutputType = { export type ProjectCountAggregateOutputType = { id: number + uuid: number + code: number name: number ownerId: number isPersonal: number @@ -88,6 +94,8 @@ export type ProjectSumAggregateInputType = { export type ProjectMinAggregateInputType = { id?: true + uuid?: true + code?: true name?: true ownerId?: true isPersonal?: true @@ -100,6 +108,8 @@ export type ProjectMinAggregateInputType = { export type ProjectMaxAggregateInputType = { id?: true + uuid?: true + code?: true name?: true ownerId?: true isPersonal?: true @@ -112,6 +122,8 @@ export type ProjectMaxAggregateInputType = { export type ProjectCountAggregateInputType = { id?: true + uuid?: true + code?: true name?: true ownerId?: true isPersonal?: true @@ -213,6 +225,8 @@ export type ProjectGroupByArgs | number + uuid?: Prisma.StringFilter<"Project"> | string + code?: Prisma.StringFilter<"Project"> | string name?: Prisma.StringFilter<"Project"> | string ownerId?: Prisma.IntFilter<"Project"> | number isPersonal?: Prisma.BoolFilter<"Project"> | boolean @@ -268,6 +284,8 @@ export type ProjectWhereInput = { export type ProjectOrderByWithRelationInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + code?: Prisma.SortOrder name?: Prisma.SortOrder ownerId?: Prisma.SortOrder isPersonal?: Prisma.SortOrder @@ -282,11 +300,12 @@ export type ProjectOrderByWithRelationInput = { members?: Prisma.ProjectMemberOrderByRelationAggregateInput columns?: Prisma.BoardColumnOrderByRelationAggregateInput tasks?: Prisma.TaskOrderByRelationAggregateInput - _relevance?: Prisma.ProjectOrderByRelevanceInput } export type ProjectWhereUniqueInput = Prisma.AtLeast<{ id?: number + uuid?: string + code?: string AND?: Prisma.ProjectWhereInput | Prisma.ProjectWhereInput[] OR?: Prisma.ProjectWhereInput[] NOT?: Prisma.ProjectWhereInput | Prisma.ProjectWhereInput[] @@ -304,10 +323,12 @@ export type ProjectWhereUniqueInput = Prisma.AtLeast<{ members?: Prisma.ProjectMemberListRelationFilter columns?: Prisma.BoardColumnListRelationFilter tasks?: Prisma.TaskListRelationFilter -}, "id"> +}, "id" | "uuid" | "code"> export type ProjectOrderByWithAggregationInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + code?: Prisma.SortOrder name?: Prisma.SortOrder ownerId?: Prisma.SortOrder isPersonal?: Prisma.SortOrder @@ -330,6 +351,8 @@ export type ProjectScalarWhereWithAggregatesInput = { OR?: Prisma.ProjectScalarWhereWithAggregatesInput[] NOT?: Prisma.ProjectScalarWhereWithAggregatesInput | Prisma.ProjectScalarWhereWithAggregatesInput[] id?: Prisma.IntWithAggregatesFilter<"Project"> | number + uuid?: Prisma.StringWithAggregatesFilter<"Project"> | string + code?: Prisma.StringWithAggregatesFilter<"Project"> | string name?: Prisma.StringWithAggregatesFilter<"Project"> | string ownerId?: Prisma.IntWithAggregatesFilter<"Project"> | number isPersonal?: Prisma.BoolWithAggregatesFilter<"Project"> | boolean @@ -343,6 +366,8 @@ export type ProjectScalarWhereWithAggregatesInput = { } export type ProjectCreateInput = { + uuid: string + code: string name: string isPersonal?: boolean archived?: boolean @@ -360,6 +385,8 @@ export type ProjectCreateInput = { export type ProjectUncheckedCreateInput = { id?: number + uuid: string + code: string name: string ownerId: number isPersonal?: boolean @@ -376,6 +403,8 @@ export type ProjectUncheckedCreateInput = { } export type ProjectUpdateInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + code?: Prisma.StringFieldUpdateOperationsInput | string name?: Prisma.StringFieldUpdateOperationsInput | string isPersonal?: Prisma.BoolFieldUpdateOperationsInput | boolean archived?: Prisma.BoolFieldUpdateOperationsInput | boolean @@ -393,6 +422,8 @@ export type ProjectUpdateInput = { export type ProjectUncheckedUpdateInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + code?: Prisma.StringFieldUpdateOperationsInput | string name?: Prisma.StringFieldUpdateOperationsInput | string ownerId?: Prisma.IntFieldUpdateOperationsInput | number isPersonal?: Prisma.BoolFieldUpdateOperationsInput | boolean @@ -410,6 +441,8 @@ export type ProjectUncheckedUpdateInput = { export type ProjectCreateManyInput = { id?: number + uuid: string + code: string name: string ownerId: number isPersonal?: boolean @@ -423,6 +456,8 @@ export type ProjectCreateManyInput = { } export type ProjectUpdateManyMutationInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + code?: Prisma.StringFieldUpdateOperationsInput | string name?: Prisma.StringFieldUpdateOperationsInput | string isPersonal?: Prisma.BoolFieldUpdateOperationsInput | boolean archived?: Prisma.BoolFieldUpdateOperationsInput | boolean @@ -436,6 +471,8 @@ export type ProjectUpdateManyMutationInput = { export type ProjectUncheckedUpdateManyInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + code?: Prisma.StringFieldUpdateOperationsInput | string name?: Prisma.StringFieldUpdateOperationsInput | string ownerId?: Prisma.IntFieldUpdateOperationsInput | number isPersonal?: Prisma.BoolFieldUpdateOperationsInput | boolean @@ -458,14 +495,10 @@ export type ProjectOrderByRelationAggregateInput = { _count?: Prisma.SortOrder } -export type ProjectOrderByRelevanceInput = { - fields: Prisma.ProjectOrderByRelevanceFieldEnum | Prisma.ProjectOrderByRelevanceFieldEnum[] - sort: Prisma.SortOrder - search: string -} - export type ProjectCountOrderByAggregateInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + code?: Prisma.SortOrder name?: Prisma.SortOrder ownerId?: Prisma.SortOrder isPersonal?: Prisma.SortOrder @@ -485,6 +518,8 @@ export type ProjectAvgOrderByAggregateInput = { export type ProjectMaxOrderByAggregateInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + code?: Prisma.SortOrder name?: Prisma.SortOrder ownerId?: Prisma.SortOrder isPersonal?: Prisma.SortOrder @@ -497,6 +532,8 @@ export type ProjectMaxOrderByAggregateInput = { export type ProjectMinOrderByAggregateInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + code?: Prisma.SortOrder name?: Prisma.SortOrder ownerId?: Prisma.SortOrder isPersonal?: Prisma.SortOrder @@ -602,6 +639,8 @@ export type ProjectUpdateOneRequiredWithoutTasksNestedInput = { } export type ProjectCreateWithoutOwnerInput = { + uuid: string + code: string name: string isPersonal?: boolean archived?: boolean @@ -618,6 +657,8 @@ export type ProjectCreateWithoutOwnerInput = { export type ProjectUncheckedCreateWithoutOwnerInput = { id?: number + uuid: string + code: string name: string isPersonal?: boolean archived?: boolean @@ -663,6 +704,8 @@ export type ProjectScalarWhereInput = { OR?: Prisma.ProjectScalarWhereInput[] NOT?: Prisma.ProjectScalarWhereInput | Prisma.ProjectScalarWhereInput[] id?: Prisma.IntFilter<"Project"> | number + uuid?: Prisma.StringFilter<"Project"> | string + code?: Prisma.StringFilter<"Project"> | string name?: Prisma.StringFilter<"Project"> | string ownerId?: Prisma.IntFilter<"Project"> | number isPersonal?: Prisma.BoolFilter<"Project"> | boolean @@ -676,6 +719,8 @@ export type ProjectScalarWhereInput = { } export type ProjectCreateWithoutMembersInput = { + uuid: string + code: string name: string isPersonal?: boolean archived?: boolean @@ -692,6 +737,8 @@ export type ProjectCreateWithoutMembersInput = { export type ProjectUncheckedCreateWithoutMembersInput = { id?: number + uuid: string + code: string name: string ownerId: number isPersonal?: boolean @@ -723,6 +770,8 @@ export type ProjectUpdateToOneWithWhereWithoutMembersInput = { } export type ProjectUpdateWithoutMembersInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + code?: Prisma.StringFieldUpdateOperationsInput | string name?: Prisma.StringFieldUpdateOperationsInput | string isPersonal?: Prisma.BoolFieldUpdateOperationsInput | boolean archived?: Prisma.BoolFieldUpdateOperationsInput | boolean @@ -739,6 +788,8 @@ export type ProjectUpdateWithoutMembersInput = { export type ProjectUncheckedUpdateWithoutMembersInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + code?: Prisma.StringFieldUpdateOperationsInput | string name?: Prisma.StringFieldUpdateOperationsInput | string ownerId?: Prisma.IntFieldUpdateOperationsInput | number isPersonal?: Prisma.BoolFieldUpdateOperationsInput | boolean @@ -754,6 +805,8 @@ export type ProjectUncheckedUpdateWithoutMembersInput = { } export type ProjectCreateWithoutColumnsInput = { + uuid: string + code: string name: string isPersonal?: boolean archived?: boolean @@ -770,6 +823,8 @@ export type ProjectCreateWithoutColumnsInput = { export type ProjectUncheckedCreateWithoutColumnsInput = { id?: number + uuid: string + code: string name: string ownerId: number isPersonal?: boolean @@ -801,6 +856,8 @@ export type ProjectUpdateToOneWithWhereWithoutColumnsInput = { } export type ProjectUpdateWithoutColumnsInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + code?: Prisma.StringFieldUpdateOperationsInput | string name?: Prisma.StringFieldUpdateOperationsInput | string isPersonal?: Prisma.BoolFieldUpdateOperationsInput | boolean archived?: Prisma.BoolFieldUpdateOperationsInput | boolean @@ -817,6 +874,8 @@ export type ProjectUpdateWithoutColumnsInput = { export type ProjectUncheckedUpdateWithoutColumnsInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + code?: Prisma.StringFieldUpdateOperationsInput | string name?: Prisma.StringFieldUpdateOperationsInput | string ownerId?: Prisma.IntFieldUpdateOperationsInput | number isPersonal?: Prisma.BoolFieldUpdateOperationsInput | boolean @@ -832,6 +891,8 @@ export type ProjectUncheckedUpdateWithoutColumnsInput = { } export type ProjectCreateWithoutTasksInput = { + uuid: string + code: string name: string isPersonal?: boolean archived?: boolean @@ -848,6 +909,8 @@ export type ProjectCreateWithoutTasksInput = { export type ProjectUncheckedCreateWithoutTasksInput = { id?: number + uuid: string + code: string name: string ownerId: number isPersonal?: boolean @@ -879,6 +942,8 @@ export type ProjectUpdateToOneWithWhereWithoutTasksInput = { } export type ProjectUpdateWithoutTasksInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + code?: Prisma.StringFieldUpdateOperationsInput | string name?: Prisma.StringFieldUpdateOperationsInput | string isPersonal?: Prisma.BoolFieldUpdateOperationsInput | boolean archived?: Prisma.BoolFieldUpdateOperationsInput | boolean @@ -895,6 +960,8 @@ export type ProjectUpdateWithoutTasksInput = { export type ProjectUncheckedUpdateWithoutTasksInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + code?: Prisma.StringFieldUpdateOperationsInput | string name?: Prisma.StringFieldUpdateOperationsInput | string ownerId?: Prisma.IntFieldUpdateOperationsInput | number isPersonal?: Prisma.BoolFieldUpdateOperationsInput | boolean @@ -911,6 +978,8 @@ export type ProjectUncheckedUpdateWithoutTasksInput = { export type ProjectCreateManyOwnerInput = { id?: number + uuid: string + code: string name: string isPersonal?: boolean archived?: boolean @@ -923,6 +992,8 @@ export type ProjectCreateManyOwnerInput = { } export type ProjectUpdateWithoutOwnerInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + code?: Prisma.StringFieldUpdateOperationsInput | string name?: Prisma.StringFieldUpdateOperationsInput | string isPersonal?: Prisma.BoolFieldUpdateOperationsInput | boolean archived?: Prisma.BoolFieldUpdateOperationsInput | boolean @@ -939,6 +1010,8 @@ export type ProjectUpdateWithoutOwnerInput = { export type ProjectUncheckedUpdateWithoutOwnerInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + code?: Prisma.StringFieldUpdateOperationsInput | string name?: Prisma.StringFieldUpdateOperationsInput | string isPersonal?: Prisma.BoolFieldUpdateOperationsInput | boolean archived?: Prisma.BoolFieldUpdateOperationsInput | boolean @@ -955,6 +1028,8 @@ export type ProjectUncheckedUpdateWithoutOwnerInput = { export type ProjectUncheckedUpdateManyWithoutOwnerInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + code?: Prisma.StringFieldUpdateOperationsInput | string name?: Prisma.StringFieldUpdateOperationsInput | string isPersonal?: Prisma.BoolFieldUpdateOperationsInput | boolean archived?: Prisma.BoolFieldUpdateOperationsInput | boolean @@ -1017,6 +1092,8 @@ export type ProjectCountOutputTypeCountTasksArgs = runtime.Types.Extensions.GetSelect<{ id?: boolean + uuid?: boolean + code?: boolean name?: boolean ownerId?: boolean isPersonal?: boolean @@ -1034,10 +1111,44 @@ export type ProjectSelect }, ExtArgs["result"]["project"]> +export type ProjectSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + uuid?: boolean + code?: boolean + name?: boolean + ownerId?: boolean + isPersonal?: boolean + archived?: boolean + notes?: boolean + taskKinds?: boolean + icon?: boolean + autoArchive?: boolean + createdAt?: boolean + updatedAt?: boolean + owner?: boolean | Prisma.UserDefaultArgs +}, ExtArgs["result"]["project"]> +export type ProjectSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + uuid?: boolean + code?: boolean + name?: boolean + ownerId?: boolean + isPersonal?: boolean + archived?: boolean + notes?: boolean + taskKinds?: boolean + icon?: boolean + autoArchive?: boolean + createdAt?: boolean + updatedAt?: boolean + owner?: boolean | Prisma.UserDefaultArgs +}, ExtArgs["result"]["project"]> export type ProjectSelectScalar = { id?: boolean + uuid?: boolean + code?: boolean name?: boolean ownerId?: boolean isPersonal?: boolean @@ -1050,7 +1161,7 @@ export type ProjectSelectScalar = { updatedAt?: boolean } -export type ProjectOmit = runtime.Types.Extensions.GetOmit<"id" | "name" | "ownerId" | "isPersonal" | "archived" | "notes" | "taskKinds" | "icon" | "autoArchive" | "createdAt" | "updatedAt", ExtArgs["result"]["project"]> +export type ProjectOmit = runtime.Types.Extensions.GetOmit<"id" | "uuid" | "code" | "name" | "ownerId" | "isPersonal" | "archived" | "notes" | "taskKinds" | "icon" | "autoArchive" | "createdAt" | "updatedAt", ExtArgs["result"]["project"]> export type ProjectInclude = { owner?: boolean | Prisma.UserDefaultArgs members?: boolean | Prisma.Project$membersArgs @@ -1058,6 +1169,12 @@ export type ProjectInclude _count?: boolean | Prisma.ProjectCountOutputTypeDefaultArgs } +export type ProjectIncludeCreateManyAndReturn = { + owner?: boolean | Prisma.UserDefaultArgs +} +export type ProjectIncludeUpdateManyAndReturn = { + owner?: boolean | Prisma.UserDefaultArgs +} export type $ProjectPayload = { name: "Project" @@ -1069,6 +1186,8 @@ export type $ProjectPayload(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Create many Projects and returns the data saved in the database. + * @param {ProjectCreateManyAndReturnArgs} args - Arguments to create many Projects. + * @example + * // Create many Projects + * const project = await prisma.project.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many Projects and only return the `id` + * const projectWithIdOnly = await prisma.project.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + /** * Delete a Project. * @param {ProjectDeleteArgs} args - Arguments to delete one Project. @@ -1260,6 +1403,36 @@ export interface ProjectDelegate(args: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Update zero or more Projects and returns the data updated in the database. + * @param {ProjectUpdateManyAndReturnArgs} args - Arguments to update many Projects. + * @example + * // Update many Projects + * const project = await prisma.project.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more Projects and only return the `id` + * const projectWithIdOnly = await prisma.project.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + /** * Create or update one Project. * @param {ProjectUpsertArgs} args - Arguments to update or create a Project. @@ -1453,6 +1626,8 @@ export interface Prisma__ProjectClient + readonly uuid: Prisma.FieldRef<"Project", 'String'> + readonly code: Prisma.FieldRef<"Project", 'String'> readonly name: Prisma.FieldRef<"Project", 'String'> readonly ownerId: Prisma.FieldRef<"Project", 'Int'> readonly isPersonal: Prisma.FieldRef<"Project", 'Boolean'> @@ -1700,6 +1875,29 @@ export type ProjectCreateManyArgs = { + /** + * Select specific fields to fetch from the Project + */ + select?: Prisma.ProjectSelectCreateManyAndReturn | null + /** + * Omit specific fields from the Project + */ + omit?: Prisma.ProjectOmit | null + /** + * The data used to create many Projects. + */ + data: Prisma.ProjectCreateManyInput | Prisma.ProjectCreateManyInput[] + skipDuplicates?: boolean + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.ProjectIncludeCreateManyAndReturn | null +} + /** * Project update */ @@ -1744,6 +1942,36 @@ export type ProjectUpdateManyArgs = { + /** + * Select specific fields to fetch from the Project + */ + select?: Prisma.ProjectSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the Project + */ + omit?: Prisma.ProjectOmit | null + /** + * The data used to update Projects. + */ + data: Prisma.XOR + /** + * Filter which Projects to update + */ + where?: Prisma.ProjectWhereInput + /** + * Limit how many Projects to update. + */ + limit?: number + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.ProjectIncludeUpdateManyAndReturn | null +} + /** * Project upsert */ diff --git a/generated/prisma/models/ProjectMember.ts b/generated/prisma/models/ProjectMember.ts index 948e55b..8ec5491 100644 --- a/generated/prisma/models/ProjectMember.ts +++ b/generated/prisma/models/ProjectMember.ts @@ -40,6 +40,8 @@ export type ProjectMemberSumAggregateOutputType = { export type ProjectMemberMinAggregateOutputType = { id: number | null + uuid: string | null + projectUuid: string | null projectId: number | null userId: number | null permission: string | null @@ -48,6 +50,8 @@ export type ProjectMemberMinAggregateOutputType = { export type ProjectMemberMaxAggregateOutputType = { id: number | null + uuid: string | null + projectUuid: string | null projectId: number | null userId: number | null permission: string | null @@ -56,6 +60,8 @@ export type ProjectMemberMaxAggregateOutputType = { export type ProjectMemberCountAggregateOutputType = { id: number + uuid: number + projectUuid: number projectId: number userId: number permission: number @@ -78,6 +84,8 @@ export type ProjectMemberSumAggregateInputType = { export type ProjectMemberMinAggregateInputType = { id?: true + uuid?: true + projectUuid?: true projectId?: true userId?: true permission?: true @@ -86,6 +94,8 @@ export type ProjectMemberMinAggregateInputType = { export type ProjectMemberMaxAggregateInputType = { id?: true + uuid?: true + projectUuid?: true projectId?: true userId?: true permission?: true @@ -94,6 +104,8 @@ export type ProjectMemberMaxAggregateInputType = { export type ProjectMemberCountAggregateInputType = { id?: true + uuid?: true + projectUuid?: true projectId?: true userId?: true permission?: true @@ -189,6 +201,8 @@ export type ProjectMemberGroupByArgs | number + uuid?: Prisma.StringFilter<"ProjectMember"> | string + projectUuid?: Prisma.StringNullableFilter<"ProjectMember"> | string | null projectId?: Prisma.IntFilter<"ProjectMember"> | number userId?: Prisma.IntFilter<"ProjectMember"> | number permission?: Prisma.StringFilter<"ProjectMember"> | string @@ -230,31 +246,36 @@ export type ProjectMemberWhereInput = { export type ProjectMemberOrderByWithRelationInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + projectUuid?: Prisma.SortOrderInput | Prisma.SortOrder projectId?: Prisma.SortOrder userId?: Prisma.SortOrder permission?: Prisma.SortOrder createdAt?: Prisma.SortOrder project?: Prisma.ProjectOrderByWithRelationInput user?: Prisma.UserOrderByWithRelationInput - _relevance?: Prisma.ProjectMemberOrderByRelevanceInput } export type ProjectMemberWhereUniqueInput = Prisma.AtLeast<{ id?: number + uuid?: string projectId_userId?: Prisma.ProjectMemberProjectIdUserIdCompoundUniqueInput AND?: Prisma.ProjectMemberWhereInput | Prisma.ProjectMemberWhereInput[] OR?: Prisma.ProjectMemberWhereInput[] NOT?: Prisma.ProjectMemberWhereInput | Prisma.ProjectMemberWhereInput[] + projectUuid?: Prisma.StringNullableFilter<"ProjectMember"> | string | null projectId?: Prisma.IntFilter<"ProjectMember"> | number userId?: Prisma.IntFilter<"ProjectMember"> | number permission?: Prisma.StringFilter<"ProjectMember"> | string createdAt?: Prisma.DateTimeFilter<"ProjectMember"> | Date | string project?: Prisma.XOR user?: Prisma.XOR -}, "id" | "projectId_userId"> +}, "id" | "uuid" | "projectId_userId"> export type ProjectMemberOrderByWithAggregationInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + projectUuid?: Prisma.SortOrderInput | Prisma.SortOrder projectId?: Prisma.SortOrder userId?: Prisma.SortOrder permission?: Prisma.SortOrder @@ -271,6 +292,8 @@ export type ProjectMemberScalarWhereWithAggregatesInput = { OR?: Prisma.ProjectMemberScalarWhereWithAggregatesInput[] NOT?: Prisma.ProjectMemberScalarWhereWithAggregatesInput | Prisma.ProjectMemberScalarWhereWithAggregatesInput[] id?: Prisma.IntWithAggregatesFilter<"ProjectMember"> | number + uuid?: Prisma.StringWithAggregatesFilter<"ProjectMember"> | string + projectUuid?: Prisma.StringNullableWithAggregatesFilter<"ProjectMember"> | string | null projectId?: Prisma.IntWithAggregatesFilter<"ProjectMember"> | number userId?: Prisma.IntWithAggregatesFilter<"ProjectMember"> | number permission?: Prisma.StringWithAggregatesFilter<"ProjectMember"> | string @@ -278,6 +301,8 @@ export type ProjectMemberScalarWhereWithAggregatesInput = { } export type ProjectMemberCreateInput = { + uuid: string + projectUuid?: string | null permission?: string createdAt?: Date | string project: Prisma.ProjectCreateNestedOneWithoutMembersInput @@ -286,6 +311,8 @@ export type ProjectMemberCreateInput = { export type ProjectMemberUncheckedCreateInput = { id?: number + uuid: string + projectUuid?: string | null projectId: number userId: number permission?: string @@ -293,6 +320,8 @@ export type ProjectMemberUncheckedCreateInput = { } export type ProjectMemberUpdateInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null permission?: Prisma.StringFieldUpdateOperationsInput | string createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string project?: Prisma.ProjectUpdateOneRequiredWithoutMembersNestedInput @@ -301,6 +330,8 @@ export type ProjectMemberUpdateInput = { export type ProjectMemberUncheckedUpdateInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null projectId?: Prisma.IntFieldUpdateOperationsInput | number userId?: Prisma.IntFieldUpdateOperationsInput | number permission?: Prisma.StringFieldUpdateOperationsInput | string @@ -309,6 +340,8 @@ export type ProjectMemberUncheckedUpdateInput = { export type ProjectMemberCreateManyInput = { id?: number + uuid: string + projectUuid?: string | null projectId: number userId: number permission?: string @@ -316,12 +349,16 @@ export type ProjectMemberCreateManyInput = { } export type ProjectMemberUpdateManyMutationInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null permission?: Prisma.StringFieldUpdateOperationsInput | string createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } export type ProjectMemberUncheckedUpdateManyInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null projectId?: Prisma.IntFieldUpdateOperationsInput | number userId?: Prisma.IntFieldUpdateOperationsInput | number permission?: Prisma.StringFieldUpdateOperationsInput | string @@ -338,12 +375,6 @@ export type ProjectMemberOrderByRelationAggregateInput = { _count?: Prisma.SortOrder } -export type ProjectMemberOrderByRelevanceInput = { - fields: Prisma.ProjectMemberOrderByRelevanceFieldEnum | Prisma.ProjectMemberOrderByRelevanceFieldEnum[] - sort: Prisma.SortOrder - search: string -} - export type ProjectMemberProjectIdUserIdCompoundUniqueInput = { projectId: number userId: number @@ -351,6 +382,8 @@ export type ProjectMemberProjectIdUserIdCompoundUniqueInput = { export type ProjectMemberCountOrderByAggregateInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + projectUuid?: Prisma.SortOrder projectId?: Prisma.SortOrder userId?: Prisma.SortOrder permission?: Prisma.SortOrder @@ -365,6 +398,8 @@ export type ProjectMemberAvgOrderByAggregateInput = { export type ProjectMemberMaxOrderByAggregateInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + projectUuid?: Prisma.SortOrder projectId?: Prisma.SortOrder userId?: Prisma.SortOrder permission?: Prisma.SortOrder @@ -373,6 +408,8 @@ export type ProjectMemberMaxOrderByAggregateInput = { export type ProjectMemberMinOrderByAggregateInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + projectUuid?: Prisma.SortOrder projectId?: Prisma.SortOrder userId?: Prisma.SortOrder permission?: Prisma.SortOrder @@ -470,6 +507,8 @@ export type ProjectMemberUncheckedUpdateManyWithoutProjectNestedInput = { } export type ProjectMemberCreateWithoutUserInput = { + uuid: string + projectUuid?: string | null permission?: string createdAt?: Date | string project: Prisma.ProjectCreateNestedOneWithoutMembersInput @@ -477,6 +516,8 @@ export type ProjectMemberCreateWithoutUserInput = { export type ProjectMemberUncheckedCreateWithoutUserInput = { id?: number + uuid: string + projectUuid?: string | null projectId: number permission?: string createdAt?: Date | string @@ -513,6 +554,8 @@ export type ProjectMemberScalarWhereInput = { OR?: Prisma.ProjectMemberScalarWhereInput[] NOT?: Prisma.ProjectMemberScalarWhereInput | Prisma.ProjectMemberScalarWhereInput[] id?: Prisma.IntFilter<"ProjectMember"> | number + uuid?: Prisma.StringFilter<"ProjectMember"> | string + projectUuid?: Prisma.StringNullableFilter<"ProjectMember"> | string | null projectId?: Prisma.IntFilter<"ProjectMember"> | number userId?: Prisma.IntFilter<"ProjectMember"> | number permission?: Prisma.StringFilter<"ProjectMember"> | string @@ -520,6 +563,8 @@ export type ProjectMemberScalarWhereInput = { } export type ProjectMemberCreateWithoutProjectInput = { + uuid: string + projectUuid?: string | null permission?: string createdAt?: Date | string user: Prisma.UserCreateNestedOneWithoutProjectMembersInput @@ -527,6 +572,8 @@ export type ProjectMemberCreateWithoutProjectInput = { export type ProjectMemberUncheckedCreateWithoutProjectInput = { id?: number + uuid: string + projectUuid?: string | null userId: number permission?: string createdAt?: Date | string @@ -560,12 +607,16 @@ export type ProjectMemberUpdateManyWithWhereWithoutProjectInput = { export type ProjectMemberCreateManyUserInput = { id?: number + uuid: string + projectUuid?: string | null projectId: number permission?: string createdAt?: Date | string } export type ProjectMemberUpdateWithoutUserInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null permission?: Prisma.StringFieldUpdateOperationsInput | string createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string project?: Prisma.ProjectUpdateOneRequiredWithoutMembersNestedInput @@ -573,6 +624,8 @@ export type ProjectMemberUpdateWithoutUserInput = { export type ProjectMemberUncheckedUpdateWithoutUserInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null projectId?: Prisma.IntFieldUpdateOperationsInput | number permission?: Prisma.StringFieldUpdateOperationsInput | string createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string @@ -580,6 +633,8 @@ export type ProjectMemberUncheckedUpdateWithoutUserInput = { export type ProjectMemberUncheckedUpdateManyWithoutUserInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null projectId?: Prisma.IntFieldUpdateOperationsInput | number permission?: Prisma.StringFieldUpdateOperationsInput | string createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string @@ -587,12 +642,16 @@ export type ProjectMemberUncheckedUpdateManyWithoutUserInput = { export type ProjectMemberCreateManyProjectInput = { id?: number + uuid: string + projectUuid?: string | null userId: number permission?: string createdAt?: Date | string } export type ProjectMemberUpdateWithoutProjectInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null permission?: Prisma.StringFieldUpdateOperationsInput | string createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string user?: Prisma.UserUpdateOneRequiredWithoutProjectMembersNestedInput @@ -600,6 +659,8 @@ export type ProjectMemberUpdateWithoutProjectInput = { export type ProjectMemberUncheckedUpdateWithoutProjectInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null userId?: Prisma.IntFieldUpdateOperationsInput | number permission?: Prisma.StringFieldUpdateOperationsInput | string createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string @@ -607,6 +668,8 @@ export type ProjectMemberUncheckedUpdateWithoutProjectInput = { export type ProjectMemberUncheckedUpdateManyWithoutProjectInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null userId?: Prisma.IntFieldUpdateOperationsInput | number permission?: Prisma.StringFieldUpdateOperationsInput | string createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string @@ -616,6 +679,8 @@ export type ProjectMemberUncheckedUpdateManyWithoutProjectInput = { export type ProjectMemberSelect = runtime.Types.Extensions.GetSelect<{ id?: boolean + uuid?: boolean + projectUuid?: boolean projectId?: boolean userId?: boolean permission?: boolean @@ -624,21 +689,53 @@ export type ProjectMemberSelect }, ExtArgs["result"]["projectMember"]> +export type ProjectMemberSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + uuid?: boolean + projectUuid?: boolean + projectId?: boolean + userId?: boolean + permission?: boolean + createdAt?: boolean + project?: boolean | Prisma.ProjectDefaultArgs + user?: boolean | Prisma.UserDefaultArgs +}, ExtArgs["result"]["projectMember"]> +export type ProjectMemberSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + uuid?: boolean + projectUuid?: boolean + projectId?: boolean + userId?: boolean + permission?: boolean + createdAt?: boolean + project?: boolean | Prisma.ProjectDefaultArgs + user?: boolean | Prisma.UserDefaultArgs +}, ExtArgs["result"]["projectMember"]> export type ProjectMemberSelectScalar = { id?: boolean + uuid?: boolean + projectUuid?: boolean projectId?: boolean userId?: boolean permission?: boolean createdAt?: boolean } -export type ProjectMemberOmit = runtime.Types.Extensions.GetOmit<"id" | "projectId" | "userId" | "permission" | "createdAt", ExtArgs["result"]["projectMember"]> +export type ProjectMemberOmit = runtime.Types.Extensions.GetOmit<"id" | "uuid" | "projectUuid" | "projectId" | "userId" | "permission" | "createdAt", ExtArgs["result"]["projectMember"]> export type ProjectMemberInclude = { project?: boolean | Prisma.ProjectDefaultArgs user?: boolean | Prisma.UserDefaultArgs } +export type ProjectMemberIncludeCreateManyAndReturn = { + project?: boolean | Prisma.ProjectDefaultArgs + user?: boolean | Prisma.UserDefaultArgs +} +export type ProjectMemberIncludeUpdateManyAndReturn = { + project?: boolean | Prisma.ProjectDefaultArgs + user?: boolean | Prisma.UserDefaultArgs +} export type $ProjectMemberPayload = { name: "ProjectMember" @@ -648,6 +745,8 @@ export type $ProjectMemberPayload(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Create many ProjectMembers and returns the data saved in the database. + * @param {ProjectMemberCreateManyAndReturnArgs} args - Arguments to create many ProjectMembers. + * @example + * // Create many ProjectMembers + * const projectMember = await prisma.projectMember.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many ProjectMembers and only return the `id` + * const projectMemberWithIdOnly = await prisma.projectMember.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + /** * Delete a ProjectMember. * @param {ProjectMemberDeleteArgs} args - Arguments to delete one ProjectMember. @@ -833,6 +956,36 @@ export interface ProjectMemberDelegate(args: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Update zero or more ProjectMembers and returns the data updated in the database. + * @param {ProjectMemberUpdateManyAndReturnArgs} args - Arguments to update many ProjectMembers. + * @example + * // Update many ProjectMembers + * const projectMember = await prisma.projectMember.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more ProjectMembers and only return the `id` + * const projectMemberWithIdOnly = await prisma.projectMember.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + /** * Create or update one ProjectMember. * @param {ProjectMemberUpsertArgs} args - Arguments to update or create a ProjectMember. @@ -1024,6 +1177,8 @@ export interface Prisma__ProjectMemberClient + readonly uuid: Prisma.FieldRef<"ProjectMember", 'String'> + readonly projectUuid: Prisma.FieldRef<"ProjectMember", 'String'> readonly projectId: Prisma.FieldRef<"ProjectMember", 'Int'> readonly userId: Prisma.FieldRef<"ProjectMember", 'Int'> readonly permission: Prisma.FieldRef<"ProjectMember", 'String'> @@ -1265,6 +1420,29 @@ export type ProjectMemberCreateManyArgs = { + /** + * Select specific fields to fetch from the ProjectMember + */ + select?: Prisma.ProjectMemberSelectCreateManyAndReturn | null + /** + * Omit specific fields from the ProjectMember + */ + omit?: Prisma.ProjectMemberOmit | null + /** + * The data used to create many ProjectMembers. + */ + data: Prisma.ProjectMemberCreateManyInput | Prisma.ProjectMemberCreateManyInput[] + skipDuplicates?: boolean + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.ProjectMemberIncludeCreateManyAndReturn | null +} + /** * ProjectMember update */ @@ -1309,6 +1487,36 @@ export type ProjectMemberUpdateManyArgs = { + /** + * Select specific fields to fetch from the ProjectMember + */ + select?: Prisma.ProjectMemberSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the ProjectMember + */ + omit?: Prisma.ProjectMemberOmit | null + /** + * The data used to update ProjectMembers. + */ + data: Prisma.XOR + /** + * Filter which ProjectMembers to update + */ + where?: Prisma.ProjectMemberWhereInput + /** + * Limit how many ProjectMembers to update. + */ + limit?: number + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.ProjectMemberIncludeUpdateManyAndReturn | null +} + /** * ProjectMember upsert */ diff --git a/generated/prisma/models/ScraperCache.ts b/generated/prisma/models/ScraperCache.ts index 3affd10..6bf0eec 100644 --- a/generated/prisma/models/ScraperCache.ts +++ b/generated/prisma/models/ScraperCache.ts @@ -238,7 +238,6 @@ export type ScraperCacheOrderByWithRelationInput = { metadata?: Prisma.SortOrderInput | Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder - _relevance?: Prisma.ScraperCacheOrderByRelevanceInput } export type ScraperCacheWhereUniqueInput = Prisma.AtLeast<{ @@ -349,12 +348,6 @@ export type ScraperCacheUncheckedUpdateManyInput = { updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } -export type ScraperCacheOrderByRelevanceInput = { - fields: Prisma.ScraperCacheOrderByRelevanceFieldEnum | Prisma.ScraperCacheOrderByRelevanceFieldEnum[] - sort: Prisma.SortOrder - search: string -} - export type ScraperCacheCountOrderByAggregateInput = { id?: Prisma.SortOrder scraperName?: Prisma.SortOrder @@ -403,7 +396,25 @@ export type ScraperCacheSelect +export type ScraperCacheSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + scraperName?: boolean + lastDataHash?: boolean + lastUpdateAt?: boolean + metadata?: boolean + createdAt?: boolean + updatedAt?: boolean +}, ExtArgs["result"]["scraperCache"]> +export type ScraperCacheSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + scraperName?: boolean + lastDataHash?: boolean + lastUpdateAt?: boolean + metadata?: boolean + createdAt?: boolean + updatedAt?: boolean +}, ExtArgs["result"]["scraperCache"]> export type ScraperCacheSelectScalar = { id?: boolean @@ -545,6 +556,30 @@ export interface ScraperCacheDelegate(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Create many ScraperCaches and returns the data saved in the database. + * @param {ScraperCacheCreateManyAndReturnArgs} args - Arguments to create many ScraperCaches. + * @example + * // Create many ScraperCaches + * const scraperCache = await prisma.scraperCache.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many ScraperCaches and only return the `id` + * const scraperCacheWithIdOnly = await prisma.scraperCache.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + /** * Delete a ScraperCache. * @param {ScraperCacheDeleteArgs} args - Arguments to delete one ScraperCache. @@ -609,6 +644,36 @@ export interface ScraperCacheDelegate(args: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Update zero or more ScraperCaches and returns the data updated in the database. + * @param {ScraperCacheUpdateManyAndReturnArgs} args - Arguments to update many ScraperCaches. + * @example + * // Update many ScraperCaches + * const scraperCache = await prisma.scraperCache.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more ScraperCaches and only return the `id` + * const scraperCacheWithIdOnly = await prisma.scraperCache.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + /** * Create or update one ScraperCache. * @param {ScraperCacheUpsertArgs} args - Arguments to update or create a ScraperCache. @@ -1017,6 +1082,25 @@ export type ScraperCacheCreateManyArgs = { + /** + * Select specific fields to fetch from the ScraperCache + */ + select?: Prisma.ScraperCacheSelectCreateManyAndReturn | null + /** + * Omit specific fields from the ScraperCache + */ + omit?: Prisma.ScraperCacheOmit | null + /** + * The data used to create many ScraperCaches. + */ + data: Prisma.ScraperCacheCreateManyInput | Prisma.ScraperCacheCreateManyInput[] + skipDuplicates?: boolean +} + /** * ScraperCache update */ @@ -1057,6 +1141,32 @@ export type ScraperCacheUpdateManyArgs = { + /** + * Select specific fields to fetch from the ScraperCache + */ + select?: Prisma.ScraperCacheSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the ScraperCache + */ + omit?: Prisma.ScraperCacheOmit | null + /** + * The data used to update ScraperCaches. + */ + data: Prisma.XOR + /** + * Filter which ScraperCaches to update + */ + where?: Prisma.ScraperCacheWhereInput + /** + * Limit how many ScraperCaches to update. + */ + limit?: number +} + /** * ScraperCache upsert */ diff --git a/generated/prisma/models/ServerNode.ts b/generated/prisma/models/ServerNode.ts index 78ad387..65e59e5 100644 --- a/generated/prisma/models/ServerNode.ts +++ b/generated/prisma/models/ServerNode.ts @@ -464,7 +464,6 @@ export type ServerNodeOrderByWithRelationInput = { recordedAt?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder - _relevance?: Prisma.ServerNodeOrderByRelevanceInput } export type ServerNodeWhereUniqueInput = Prisma.AtLeast<{ @@ -755,12 +754,6 @@ export type ServerNodeUncheckedUpdateManyInput = { updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } -export type ServerNodeOrderByRelevanceInput = { - fields: Prisma.ServerNodeOrderByRelevanceFieldEnum | Prisma.ServerNodeOrderByRelevanceFieldEnum[] - sort: Prisma.SortOrder - search: string -} - export type ServerNodeCountOrderByAggregateInput = { id?: Prisma.SortOrder uuid?: Prisma.SortOrder @@ -921,7 +914,61 @@ export type ServerNodeSelect +export type ServerNodeSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + uuid?: boolean + name?: boolean + cpuName?: boolean + os?: boolean + region?: boolean + memTotal?: boolean + diskTotal?: boolean + cpuCores?: boolean + cpuUsage?: boolean + ramUsed?: boolean + swapUsed?: boolean + load1?: boolean + load5?: boolean + load15?: boolean + diskUsed?: boolean + netIn?: boolean + netOut?: boolean + uptime?: boolean + process?: boolean + connections?: boolean + status?: boolean + recordedAt?: boolean + createdAt?: boolean + updatedAt?: boolean +}, ExtArgs["result"]["serverNode"]> +export type ServerNodeSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + uuid?: boolean + name?: boolean + cpuName?: boolean + os?: boolean + region?: boolean + memTotal?: boolean + diskTotal?: boolean + cpuCores?: boolean + cpuUsage?: boolean + ramUsed?: boolean + swapUsed?: boolean + load1?: boolean + load5?: boolean + load15?: boolean + diskUsed?: boolean + netIn?: boolean + netOut?: boolean + uptime?: boolean + process?: boolean + connections?: boolean + status?: boolean + recordedAt?: boolean + createdAt?: boolean + updatedAt?: boolean +}, ExtArgs["result"]["serverNode"]> export type ServerNodeSelectScalar = { id?: boolean @@ -1099,6 +1146,30 @@ export interface ServerNodeDelegate(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Create many ServerNodes and returns the data saved in the database. + * @param {ServerNodeCreateManyAndReturnArgs} args - Arguments to create many ServerNodes. + * @example + * // Create many ServerNodes + * const serverNode = await prisma.serverNode.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many ServerNodes and only return the `id` + * const serverNodeWithIdOnly = await prisma.serverNode.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + /** * Delete a ServerNode. * @param {ServerNodeDeleteArgs} args - Arguments to delete one ServerNode. @@ -1163,6 +1234,36 @@ export interface ServerNodeDelegate(args: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Update zero or more ServerNodes and returns the data updated in the database. + * @param {ServerNodeUpdateManyAndReturnArgs} args - Arguments to update many ServerNodes. + * @example + * // Update many ServerNodes + * const serverNode = await prisma.serverNode.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more ServerNodes and only return the `id` + * const serverNodeWithIdOnly = await prisma.serverNode.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + /** * Create or update one ServerNode. * @param {ServerNodeUpsertArgs} args - Arguments to update or create a ServerNode. @@ -1589,6 +1690,25 @@ export type ServerNodeCreateManyArgs = { + /** + * Select specific fields to fetch from the ServerNode + */ + select?: Prisma.ServerNodeSelectCreateManyAndReturn | null + /** + * Omit specific fields from the ServerNode + */ + omit?: Prisma.ServerNodeOmit | null + /** + * The data used to create many ServerNodes. + */ + data: Prisma.ServerNodeCreateManyInput | Prisma.ServerNodeCreateManyInput[] + skipDuplicates?: boolean +} + /** * ServerNode update */ @@ -1629,6 +1749,32 @@ export type ServerNodeUpdateManyArgs = { + /** + * Select specific fields to fetch from the ServerNode + */ + select?: Prisma.ServerNodeSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the ServerNode + */ + omit?: Prisma.ServerNodeOmit | null + /** + * The data used to update ServerNodes. + */ + data: Prisma.XOR + /** + * Filter which ServerNodes to update + */ + where?: Prisma.ServerNodeWhereInput + /** + * Limit how many ServerNodes to update. + */ + limit?: number +} + /** * ServerNode upsert */ diff --git a/generated/prisma/models/ServerNodeHistory.ts b/generated/prisma/models/ServerNodeHistory.ts index 23cb1dc..433dd75 100644 --- a/generated/prisma/models/ServerNodeHistory.ts +++ b/generated/prisma/models/ServerNodeHistory.ts @@ -319,7 +319,6 @@ export type ServerNodeHistoryOrderByWithRelationInput = { process?: Prisma.SortOrder connections?: Prisma.SortOrder createdAt?: Prisma.SortOrder - _relevance?: Prisma.ServerNodeHistoryOrderByRelevanceInput } export type ServerNodeHistoryWhereUniqueInput = Prisma.AtLeast<{ @@ -481,12 +480,6 @@ export type ServerNodeHistoryUncheckedUpdateManyInput = { createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } -export type ServerNodeHistoryOrderByRelevanceInput = { - fields: Prisma.ServerNodeHistoryOrderByRelevanceFieldEnum | Prisma.ServerNodeHistoryOrderByRelevanceFieldEnum[] - sort: Prisma.SortOrder - search: string -} - export type ServerNodeHistoryUuidPeriodCompoundUniqueInput = { uuid: string period: Date | string @@ -578,7 +571,35 @@ export type ServerNodeHistorySelect +export type ServerNodeHistorySelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + uuid?: boolean + period?: boolean + cpu?: boolean + ram?: boolean + load?: boolean + disk?: boolean + netIn?: boolean + netOut?: boolean + process?: boolean + connections?: boolean + createdAt?: boolean +}, ExtArgs["result"]["serverNodeHistory"]> +export type ServerNodeHistorySelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + uuid?: boolean + period?: boolean + cpu?: boolean + ram?: boolean + load?: boolean + disk?: boolean + netIn?: boolean + netOut?: boolean + process?: boolean + connections?: boolean + createdAt?: boolean +}, ExtArgs["result"]["serverNodeHistory"]> export type ServerNodeHistorySelectScalar = { id?: boolean @@ -730,6 +751,30 @@ export interface ServerNodeHistoryDelegate(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Create many ServerNodeHistories and returns the data saved in the database. + * @param {ServerNodeHistoryCreateManyAndReturnArgs} args - Arguments to create many ServerNodeHistories. + * @example + * // Create many ServerNodeHistories + * const serverNodeHistory = await prisma.serverNodeHistory.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many ServerNodeHistories and only return the `id` + * const serverNodeHistoryWithIdOnly = await prisma.serverNodeHistory.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + /** * Delete a ServerNodeHistory. * @param {ServerNodeHistoryDeleteArgs} args - Arguments to delete one ServerNodeHistory. @@ -794,6 +839,36 @@ export interface ServerNodeHistoryDelegate(args: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Update zero or more ServerNodeHistories and returns the data updated in the database. + * @param {ServerNodeHistoryUpdateManyAndReturnArgs} args - Arguments to update many ServerNodeHistories. + * @example + * // Update many ServerNodeHistories + * const serverNodeHistory = await prisma.serverNodeHistory.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more ServerNodeHistories and only return the `id` + * const serverNodeHistoryWithIdOnly = await prisma.serverNodeHistory.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + /** * Create or update one ServerNodeHistory. * @param {ServerNodeHistoryUpsertArgs} args - Arguments to update or create a ServerNodeHistory. @@ -1207,6 +1282,25 @@ export type ServerNodeHistoryCreateManyArgs = { + /** + * Select specific fields to fetch from the ServerNodeHistory + */ + select?: Prisma.ServerNodeHistorySelectCreateManyAndReturn | null + /** + * Omit specific fields from the ServerNodeHistory + */ + omit?: Prisma.ServerNodeHistoryOmit | null + /** + * The data used to create many ServerNodeHistories. + */ + data: Prisma.ServerNodeHistoryCreateManyInput | Prisma.ServerNodeHistoryCreateManyInput[] + skipDuplicates?: boolean +} + /** * ServerNodeHistory update */ @@ -1247,6 +1341,32 @@ export type ServerNodeHistoryUpdateManyArgs = { + /** + * Select specific fields to fetch from the ServerNodeHistory + */ + select?: Prisma.ServerNodeHistorySelectUpdateManyAndReturn | null + /** + * Omit specific fields from the ServerNodeHistory + */ + omit?: Prisma.ServerNodeHistoryOmit | null + /** + * The data used to update ServerNodeHistories. + */ + data: Prisma.XOR + /** + * Filter which ServerNodeHistories to update + */ + where?: Prisma.ServerNodeHistoryWhereInput + /** + * Limit how many ServerNodeHistories to update. + */ + limit?: number +} + /** * ServerNodeHistory upsert */ diff --git a/generated/prisma/models/ServiceCheck.ts b/generated/prisma/models/ServiceCheck.ts index 2dcc2eb..9723311 100644 --- a/generated/prisma/models/ServiceCheck.ts +++ b/generated/prisma/models/ServiceCheck.ts @@ -264,7 +264,6 @@ export type ServiceCheckOrderByWithRelationInput = { lastCheckAt?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder - _relevance?: Prisma.ServiceCheckOrderByRelevanceInput } export type ServiceCheckWhereUniqueInput = Prisma.AtLeast<{ @@ -395,12 +394,6 @@ export type ServiceCheckUncheckedUpdateManyInput = { updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } -export type ServiceCheckOrderByRelevanceInput = { - fields: Prisma.ServiceCheckOrderByRelevanceFieldEnum | Prisma.ServiceCheckOrderByRelevanceFieldEnum[] - sort: Prisma.SortOrder - search: string -} - export type ServiceCheckCountOrderByAggregateInput = { id?: Prisma.SortOrder name?: Prisma.SortOrder @@ -461,7 +454,29 @@ export type ServiceCheckSelect +export type ServiceCheckSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + name?: boolean + url?: boolean + status?: boolean + latencyMs?: boolean + message?: boolean + lastCheckAt?: boolean + createdAt?: boolean + updatedAt?: boolean +}, ExtArgs["result"]["serviceCheck"]> +export type ServiceCheckSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + name?: boolean + url?: boolean + status?: boolean + latencyMs?: boolean + message?: boolean + lastCheckAt?: boolean + createdAt?: boolean + updatedAt?: boolean +}, ExtArgs["result"]["serviceCheck"]> export type ServiceCheckSelectScalar = { id?: boolean @@ -607,6 +622,30 @@ export interface ServiceCheckDelegate(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Create many ServiceChecks and returns the data saved in the database. + * @param {ServiceCheckCreateManyAndReturnArgs} args - Arguments to create many ServiceChecks. + * @example + * // Create many ServiceChecks + * const serviceCheck = await prisma.serviceCheck.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many ServiceChecks and only return the `id` + * const serviceCheckWithIdOnly = await prisma.serviceCheck.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + /** * Delete a ServiceCheck. * @param {ServiceCheckDeleteArgs} args - Arguments to delete one ServiceCheck. @@ -671,6 +710,36 @@ export interface ServiceCheckDelegate(args: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Update zero or more ServiceChecks and returns the data updated in the database. + * @param {ServiceCheckUpdateManyAndReturnArgs} args - Arguments to update many ServiceChecks. + * @example + * // Update many ServiceChecks + * const serviceCheck = await prisma.serviceCheck.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more ServiceChecks and only return the `id` + * const serviceCheckWithIdOnly = await prisma.serviceCheck.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + /** * Create or update one ServiceCheck. * @param {ServiceCheckUpsertArgs} args - Arguments to update or create a ServiceCheck. @@ -1081,6 +1150,25 @@ export type ServiceCheckCreateManyArgs = { + /** + * Select specific fields to fetch from the ServiceCheck + */ + select?: Prisma.ServiceCheckSelectCreateManyAndReturn | null + /** + * Omit specific fields from the ServiceCheck + */ + omit?: Prisma.ServiceCheckOmit | null + /** + * The data used to create many ServiceChecks. + */ + data: Prisma.ServiceCheckCreateManyInput | Prisma.ServiceCheckCreateManyInput[] + skipDuplicates?: boolean +} + /** * ServiceCheck update */ @@ -1121,6 +1209,32 @@ export type ServiceCheckUpdateManyArgs = { + /** + * Select specific fields to fetch from the ServiceCheck + */ + select?: Prisma.ServiceCheckSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the ServiceCheck + */ + omit?: Prisma.ServiceCheckOmit | null + /** + * The data used to update ServiceChecks. + */ + data: Prisma.XOR + /** + * Filter which ServiceChecks to update + */ + where?: Prisma.ServiceCheckWhereInput + /** + * Limit how many ServiceChecks to update. + */ + limit?: number +} + /** * ServiceCheck upsert */ diff --git a/generated/prisma/models/Strategy.ts b/generated/prisma/models/Strategy.ts index b08f5ab..36383c5 100644 --- a/generated/prisma/models/Strategy.ts +++ b/generated/prisma/models/Strategy.ts @@ -229,7 +229,6 @@ export type StrategyOrderByWithRelationInput = { data?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder - _relevance?: Prisma.StrategyOrderByRelevanceInput } export type StrategyWhereUniqueInput = Prisma.AtLeast<{ @@ -330,12 +329,6 @@ export type StrategyUncheckedUpdateManyInput = { updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } -export type StrategyOrderByRelevanceInput = { - fields: Prisma.StrategyOrderByRelevanceFieldEnum | Prisma.StrategyOrderByRelevanceFieldEnum[] - sort: Prisma.SortOrder - search: string -} - export type StrategyCountOrderByAggregateInput = { id?: Prisma.SortOrder name?: Prisma.SortOrder @@ -380,7 +373,23 @@ export type StrategySelect +export type StrategySelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + name?: boolean + description?: boolean + data?: boolean + createdAt?: boolean + updatedAt?: boolean +}, ExtArgs["result"]["strategy"]> +export type StrategySelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + name?: boolean + description?: boolean + data?: boolean + createdAt?: boolean + updatedAt?: boolean +}, ExtArgs["result"]["strategy"]> export type StrategySelectScalar = { id?: boolean @@ -520,6 +529,30 @@ export interface StrategyDelegate(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Create many Strategies and returns the data saved in the database. + * @param {StrategyCreateManyAndReturnArgs} args - Arguments to create many Strategies. + * @example + * // Create many Strategies + * const strategy = await prisma.strategy.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many Strategies and only return the `id` + * const strategyWithIdOnly = await prisma.strategy.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + /** * Delete a Strategy. * @param {StrategyDeleteArgs} args - Arguments to delete one Strategy. @@ -584,6 +617,36 @@ export interface StrategyDelegate(args: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Update zero or more Strategies and returns the data updated in the database. + * @param {StrategyUpdateManyAndReturnArgs} args - Arguments to update many Strategies. + * @example + * // Update many Strategies + * const strategy = await prisma.strategy.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more Strategies and only return the `id` + * const strategyWithIdOnly = await prisma.strategy.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + /** * Create or update one Strategy. * @param {StrategyUpsertArgs} args - Arguments to update or create a Strategy. @@ -991,6 +1054,25 @@ export type StrategyCreateManyArgs = { + /** + * Select specific fields to fetch from the Strategy + */ + select?: Prisma.StrategySelectCreateManyAndReturn | null + /** + * Omit specific fields from the Strategy + */ + omit?: Prisma.StrategyOmit | null + /** + * The data used to create many Strategies. + */ + data: Prisma.StrategyCreateManyInput | Prisma.StrategyCreateManyInput[] + skipDuplicates?: boolean +} + /** * Strategy update */ @@ -1031,6 +1113,32 @@ export type StrategyUpdateManyArgs = { + /** + * Select specific fields to fetch from the Strategy + */ + select?: Prisma.StrategySelectUpdateManyAndReturn | null + /** + * Omit specific fields from the Strategy + */ + omit?: Prisma.StrategyOmit | null + /** + * The data used to update Strategies. + */ + data: Prisma.XOR + /** + * Filter which Strategies to update + */ + where?: Prisma.StrategyWhereInput + /** + * Limit how many Strategies to update. + */ + limit?: number +} + /** * Strategy upsert */ diff --git a/generated/prisma/models/Task.ts b/generated/prisma/models/Task.ts index c36c48f..14f5126 100644 --- a/generated/prisma/models/Task.ts +++ b/generated/prisma/models/Task.ts @@ -34,6 +34,7 @@ export type TaskAvgAggregateOutputType = { assigneeId: number | null creatorId: number | null sortOrder: number | null + number: number | null } export type TaskSumAggregateOutputType = { @@ -44,10 +45,15 @@ export type TaskSumAggregateOutputType = { assigneeId: number | null creatorId: number | null sortOrder: number | null + number: number | null } export type TaskMinAggregateOutputType = { id: number | null + uuid: string | null + projectUuid: string | null + columnUuid: string | null + parentUuid: string | null projectId: number | null columnId: number | null parentId: number | null @@ -65,10 +71,15 @@ export type TaskMinAggregateOutputType = { archiveSource: string | null createdAt: Date | null updatedAt: Date | null + number: number | null } export type TaskMaxAggregateOutputType = { id: number | null + uuid: string | null + projectUuid: string | null + columnUuid: string | null + parentUuid: string | null projectId: number | null columnId: number | null parentId: number | null @@ -86,10 +97,15 @@ export type TaskMaxAggregateOutputType = { archiveSource: string | null createdAt: Date | null updatedAt: Date | null + number: number | null } export type TaskCountAggregateOutputType = { id: number + uuid: number + projectUuid: number + columnUuid: number + parentUuid: number projectId: number columnId: number parentId: number @@ -108,6 +124,7 @@ export type TaskCountAggregateOutputType = { archiveSource: number createdAt: number updatedAt: number + number: number _all: number } @@ -120,6 +137,7 @@ export type TaskAvgAggregateInputType = { assigneeId?: true creatorId?: true sortOrder?: true + number?: true } export type TaskSumAggregateInputType = { @@ -130,10 +148,15 @@ export type TaskSumAggregateInputType = { assigneeId?: true creatorId?: true sortOrder?: true + number?: true } export type TaskMinAggregateInputType = { id?: true + uuid?: true + projectUuid?: true + columnUuid?: true + parentUuid?: true projectId?: true columnId?: true parentId?: true @@ -151,10 +174,15 @@ export type TaskMinAggregateInputType = { archiveSource?: true createdAt?: true updatedAt?: true + number?: true } export type TaskMaxAggregateInputType = { id?: true + uuid?: true + projectUuid?: true + columnUuid?: true + parentUuid?: true projectId?: true columnId?: true parentId?: true @@ -172,10 +200,15 @@ export type TaskMaxAggregateInputType = { archiveSource?: true createdAt?: true updatedAt?: true + number?: true } export type TaskCountAggregateInputType = { id?: true + uuid?: true + projectUuid?: true + columnUuid?: true + parentUuid?: true projectId?: true columnId?: true parentId?: true @@ -194,6 +227,7 @@ export type TaskCountAggregateInputType = { archiveSource?: true createdAt?: true updatedAt?: true + number?: true _all?: true } @@ -285,6 +319,10 @@ export type TaskGroupByArgs | number + uuid?: Prisma.StringFilter<"Task"> | string + projectUuid?: Prisma.StringNullableFilter<"Task"> | string | null + columnUuid?: Prisma.StringNullableFilter<"Task"> | string | null + parentUuid?: Prisma.StringNullableFilter<"Task"> | string | null projectId?: Prisma.IntFilter<"Task"> | number columnId?: Prisma.IntFilter<"Task"> | number parentId?: Prisma.IntNullableFilter<"Task"> | number | null @@ -348,6 +391,7 @@ export type TaskWhereInput = { archiveSource?: Prisma.StringNullableFilter<"Task"> | string | null createdAt?: Prisma.DateTimeFilter<"Task"> | Date | string updatedAt?: Prisma.DateTimeFilter<"Task"> | Date | string + number?: Prisma.IntNullableFilter<"Task"> | number | null project?: Prisma.XOR column?: Prisma.XOR parent?: Prisma.XOR | null @@ -360,6 +404,10 @@ export type TaskWhereInput = { export type TaskOrderByWithRelationInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + projectUuid?: Prisma.SortOrderInput | Prisma.SortOrder + columnUuid?: Prisma.SortOrderInput | Prisma.SortOrder + parentUuid?: Prisma.SortOrderInput | Prisma.SortOrder projectId?: Prisma.SortOrder columnId?: Prisma.SortOrder parentId?: Prisma.SortOrderInput | Prisma.SortOrder @@ -378,6 +426,7 @@ export type TaskOrderByWithRelationInput = { archiveSource?: Prisma.SortOrderInput | Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder + number?: Prisma.SortOrderInput | Prisma.SortOrder project?: Prisma.ProjectOrderByWithRelationInput column?: Prisma.BoardColumnOrderByWithRelationInput parent?: Prisma.TaskOrderByWithRelationInput @@ -386,14 +435,18 @@ export type TaskOrderByWithRelationInput = { creator?: Prisma.UserOrderByWithRelationInput members?: Prisma.TaskMemberOrderByRelationAggregateInput tags?: Prisma.TaskTagOrderByRelationAggregateInput - _relevance?: Prisma.TaskOrderByRelevanceInput } export type TaskWhereUniqueInput = Prisma.AtLeast<{ id?: number + uuid?: string + projectId_number?: Prisma.TaskProjectIdNumberCompoundUniqueInput AND?: Prisma.TaskWhereInput | Prisma.TaskWhereInput[] OR?: Prisma.TaskWhereInput[] NOT?: Prisma.TaskWhereInput | Prisma.TaskWhereInput[] + projectUuid?: Prisma.StringNullableFilter<"Task"> | string | null + columnUuid?: Prisma.StringNullableFilter<"Task"> | string | null + parentUuid?: Prisma.StringNullableFilter<"Task"> | string | null projectId?: Prisma.IntFilter<"Task"> | number columnId?: Prisma.IntFilter<"Task"> | number parentId?: Prisma.IntNullableFilter<"Task"> | number | null @@ -412,6 +465,7 @@ export type TaskWhereUniqueInput = Prisma.AtLeast<{ archiveSource?: Prisma.StringNullableFilter<"Task"> | string | null createdAt?: Prisma.DateTimeFilter<"Task"> | Date | string updatedAt?: Prisma.DateTimeFilter<"Task"> | Date | string + number?: Prisma.IntNullableFilter<"Task"> | number | null project?: Prisma.XOR column?: Prisma.XOR parent?: Prisma.XOR | null @@ -420,10 +474,14 @@ export type TaskWhereUniqueInput = Prisma.AtLeast<{ creator?: Prisma.XOR members?: Prisma.TaskMemberListRelationFilter tags?: Prisma.TaskTagListRelationFilter -}, "id"> +}, "id" | "uuid" | "projectId_number"> export type TaskOrderByWithAggregationInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + projectUuid?: Prisma.SortOrderInput | Prisma.SortOrder + columnUuid?: Prisma.SortOrderInput | Prisma.SortOrder + parentUuid?: Prisma.SortOrderInput | Prisma.SortOrder projectId?: Prisma.SortOrder columnId?: Prisma.SortOrder parentId?: Prisma.SortOrderInput | Prisma.SortOrder @@ -442,6 +500,7 @@ export type TaskOrderByWithAggregationInput = { archiveSource?: Prisma.SortOrderInput | Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder + number?: Prisma.SortOrderInput | Prisma.SortOrder _count?: Prisma.TaskCountOrderByAggregateInput _avg?: Prisma.TaskAvgOrderByAggregateInput _max?: Prisma.TaskMaxOrderByAggregateInput @@ -454,6 +513,10 @@ export type TaskScalarWhereWithAggregatesInput = { OR?: Prisma.TaskScalarWhereWithAggregatesInput[] NOT?: Prisma.TaskScalarWhereWithAggregatesInput | Prisma.TaskScalarWhereWithAggregatesInput[] id?: Prisma.IntWithAggregatesFilter<"Task"> | number + uuid?: Prisma.StringWithAggregatesFilter<"Task"> | string + projectUuid?: Prisma.StringNullableWithAggregatesFilter<"Task"> | string | null + columnUuid?: Prisma.StringNullableWithAggregatesFilter<"Task"> | string | null + parentUuid?: Prisma.StringNullableWithAggregatesFilter<"Task"> | string | null projectId?: Prisma.IntWithAggregatesFilter<"Task"> | number columnId?: Prisma.IntWithAggregatesFilter<"Task"> | number parentId?: Prisma.IntNullableWithAggregatesFilter<"Task"> | number | null @@ -472,9 +535,14 @@ export type TaskScalarWhereWithAggregatesInput = { archiveSource?: Prisma.StringNullableWithAggregatesFilter<"Task"> | string | null createdAt?: Prisma.DateTimeWithAggregatesFilter<"Task"> | Date | string updatedAt?: Prisma.DateTimeWithAggregatesFilter<"Task"> | Date | string + number?: Prisma.IntNullableWithAggregatesFilter<"Task"> | number | null } export type TaskCreateInput = { + uuid: string + projectUuid?: string | null + columnUuid?: string | null + parentUuid?: string | null title: string description?: string kind?: string | null @@ -488,6 +556,7 @@ export type TaskCreateInput = { archiveSource?: string | null createdAt?: Date | string updatedAt?: Date | string + number?: number | null project: Prisma.ProjectCreateNestedOneWithoutTasksInput column: Prisma.BoardColumnCreateNestedOneWithoutTasksInput parent?: Prisma.TaskCreateNestedOneWithoutChildrenInput @@ -500,6 +569,10 @@ export type TaskCreateInput = { export type TaskUncheckedCreateInput = { id?: number + uuid: string + projectUuid?: string | null + columnUuid?: string | null + parentUuid?: string | null projectId: number columnId: number parentId?: number | null @@ -518,12 +591,17 @@ export type TaskUncheckedCreateInput = { archiveSource?: string | null createdAt?: Date | string updatedAt?: Date | string + number?: number | null children?: Prisma.TaskUncheckedCreateNestedManyWithoutParentInput members?: Prisma.TaskMemberUncheckedCreateNestedManyWithoutTaskInput tags?: Prisma.TaskTagUncheckedCreateNestedManyWithoutTaskInput } export type TaskUpdateInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + columnUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + parentUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null title?: Prisma.StringFieldUpdateOperationsInput | string description?: Prisma.StringFieldUpdateOperationsInput | string kind?: Prisma.NullableStringFieldUpdateOperationsInput | string | null @@ -537,6 +615,7 @@ export type TaskUpdateInput = { archiveSource?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + number?: Prisma.NullableIntFieldUpdateOperationsInput | number | null project?: Prisma.ProjectUpdateOneRequiredWithoutTasksNestedInput column?: Prisma.BoardColumnUpdateOneRequiredWithoutTasksNestedInput parent?: Prisma.TaskUpdateOneWithoutChildrenNestedInput @@ -549,6 +628,10 @@ export type TaskUpdateInput = { export type TaskUncheckedUpdateInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + columnUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + parentUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null projectId?: Prisma.IntFieldUpdateOperationsInput | number columnId?: Prisma.IntFieldUpdateOperationsInput | number parentId?: Prisma.NullableIntFieldUpdateOperationsInput | number | null @@ -567,6 +650,7 @@ export type TaskUncheckedUpdateInput = { archiveSource?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + number?: Prisma.NullableIntFieldUpdateOperationsInput | number | null children?: Prisma.TaskUncheckedUpdateManyWithoutParentNestedInput members?: Prisma.TaskMemberUncheckedUpdateManyWithoutTaskNestedInput tags?: Prisma.TaskTagUncheckedUpdateManyWithoutTaskNestedInput @@ -574,6 +658,10 @@ export type TaskUncheckedUpdateInput = { export type TaskCreateManyInput = { id?: number + uuid: string + projectUuid?: string | null + columnUuid?: string | null + parentUuid?: string | null projectId: number columnId: number parentId?: number | null @@ -592,9 +680,14 @@ export type TaskCreateManyInput = { archiveSource?: string | null createdAt?: Date | string updatedAt?: Date | string + number?: number | null } export type TaskUpdateManyMutationInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + columnUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + parentUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null title?: Prisma.StringFieldUpdateOperationsInput | string description?: Prisma.StringFieldUpdateOperationsInput | string kind?: Prisma.NullableStringFieldUpdateOperationsInput | string | null @@ -608,10 +701,15 @@ export type TaskUpdateManyMutationInput = { archiveSource?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + number?: Prisma.NullableIntFieldUpdateOperationsInput | number | null } export type TaskUncheckedUpdateManyInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + columnUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + parentUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null projectId?: Prisma.IntFieldUpdateOperationsInput | number columnId?: Prisma.IntFieldUpdateOperationsInput | number parentId?: Prisma.NullableIntFieldUpdateOperationsInput | number | null @@ -630,6 +728,7 @@ export type TaskUncheckedUpdateManyInput = { archiveSource?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + number?: Prisma.NullableIntFieldUpdateOperationsInput | number | null } export type TaskListRelationFilter = { @@ -647,14 +746,17 @@ export type TaskNullableScalarRelationFilter = { isNot?: Prisma.TaskWhereInput | null } -export type TaskOrderByRelevanceInput = { - fields: Prisma.TaskOrderByRelevanceFieldEnum | Prisma.TaskOrderByRelevanceFieldEnum[] - sort: Prisma.SortOrder - search: string +export type TaskProjectIdNumberCompoundUniqueInput = { + projectId: number + number: number } export type TaskCountOrderByAggregateInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + projectUuid?: Prisma.SortOrder + columnUuid?: Prisma.SortOrder + parentUuid?: Prisma.SortOrder projectId?: Prisma.SortOrder columnId?: Prisma.SortOrder parentId?: Prisma.SortOrder @@ -673,6 +775,7 @@ export type TaskCountOrderByAggregateInput = { archiveSource?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder + number?: Prisma.SortOrder } export type TaskAvgOrderByAggregateInput = { @@ -683,10 +786,15 @@ export type TaskAvgOrderByAggregateInput = { assigneeId?: Prisma.SortOrder creatorId?: Prisma.SortOrder sortOrder?: Prisma.SortOrder + number?: Prisma.SortOrder } export type TaskMaxOrderByAggregateInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + projectUuid?: Prisma.SortOrder + columnUuid?: Prisma.SortOrder + parentUuid?: Prisma.SortOrder projectId?: Prisma.SortOrder columnId?: Prisma.SortOrder parentId?: Prisma.SortOrder @@ -704,10 +812,15 @@ export type TaskMaxOrderByAggregateInput = { archiveSource?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder + number?: Prisma.SortOrder } export type TaskMinOrderByAggregateInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + projectUuid?: Prisma.SortOrder + columnUuid?: Prisma.SortOrder + parentUuid?: Prisma.SortOrder projectId?: Prisma.SortOrder columnId?: Prisma.SortOrder parentId?: Prisma.SortOrder @@ -725,6 +838,7 @@ export type TaskMinOrderByAggregateInput = { archiveSource?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder + number?: Prisma.SortOrder } export type TaskSumOrderByAggregateInput = { @@ -735,6 +849,7 @@ export type TaskSumOrderByAggregateInput = { assigneeId?: Prisma.SortOrder creatorId?: Prisma.SortOrder sortOrder?: Prisma.SortOrder + number?: Prisma.SortOrder } export type TaskScalarRelationFilter = { @@ -997,6 +1112,10 @@ export type TaskUpdateOneRequiredWithoutTagsNestedInput = { } export type TaskCreateWithoutAssigneeInput = { + uuid: string + projectUuid?: string | null + columnUuid?: string | null + parentUuid?: string | null title: string description?: string kind?: string | null @@ -1010,6 +1129,7 @@ export type TaskCreateWithoutAssigneeInput = { archiveSource?: string | null createdAt?: Date | string updatedAt?: Date | string + number?: number | null project: Prisma.ProjectCreateNestedOneWithoutTasksInput column: Prisma.BoardColumnCreateNestedOneWithoutTasksInput parent?: Prisma.TaskCreateNestedOneWithoutChildrenInput @@ -1021,6 +1141,10 @@ export type TaskCreateWithoutAssigneeInput = { export type TaskUncheckedCreateWithoutAssigneeInput = { id?: number + uuid: string + projectUuid?: string | null + columnUuid?: string | null + parentUuid?: string | null projectId: number columnId: number parentId?: number | null @@ -1038,6 +1162,7 @@ export type TaskUncheckedCreateWithoutAssigneeInput = { archiveSource?: string | null createdAt?: Date | string updatedAt?: Date | string + number?: number | null children?: Prisma.TaskUncheckedCreateNestedManyWithoutParentInput members?: Prisma.TaskMemberUncheckedCreateNestedManyWithoutTaskInput tags?: Prisma.TaskTagUncheckedCreateNestedManyWithoutTaskInput @@ -1054,6 +1179,10 @@ export type TaskCreateManyAssigneeInputEnvelope = { } export type TaskCreateWithoutCreatorInput = { + uuid: string + projectUuid?: string | null + columnUuid?: string | null + parentUuid?: string | null title: string description?: string kind?: string | null @@ -1067,6 +1196,7 @@ export type TaskCreateWithoutCreatorInput = { archiveSource?: string | null createdAt?: Date | string updatedAt?: Date | string + number?: number | null project: Prisma.ProjectCreateNestedOneWithoutTasksInput column: Prisma.BoardColumnCreateNestedOneWithoutTasksInput parent?: Prisma.TaskCreateNestedOneWithoutChildrenInput @@ -1078,6 +1208,10 @@ export type TaskCreateWithoutCreatorInput = { export type TaskUncheckedCreateWithoutCreatorInput = { id?: number + uuid: string + projectUuid?: string | null + columnUuid?: string | null + parentUuid?: string | null projectId: number columnId: number parentId?: number | null @@ -1095,6 +1229,7 @@ export type TaskUncheckedCreateWithoutCreatorInput = { archiveSource?: string | null createdAt?: Date | string updatedAt?: Date | string + number?: number | null children?: Prisma.TaskUncheckedCreateNestedManyWithoutParentInput members?: Prisma.TaskMemberUncheckedCreateNestedManyWithoutTaskInput tags?: Prisma.TaskTagUncheckedCreateNestedManyWithoutTaskInput @@ -1131,6 +1266,10 @@ export type TaskScalarWhereInput = { OR?: Prisma.TaskScalarWhereInput[] NOT?: Prisma.TaskScalarWhereInput | Prisma.TaskScalarWhereInput[] id?: Prisma.IntFilter<"Task"> | number + uuid?: Prisma.StringFilter<"Task"> | string + projectUuid?: Prisma.StringNullableFilter<"Task"> | string | null + columnUuid?: Prisma.StringNullableFilter<"Task"> | string | null + parentUuid?: Prisma.StringNullableFilter<"Task"> | string | null projectId?: Prisma.IntFilter<"Task"> | number columnId?: Prisma.IntFilter<"Task"> | number parentId?: Prisma.IntNullableFilter<"Task"> | number | null @@ -1149,6 +1288,7 @@ export type TaskScalarWhereInput = { archiveSource?: Prisma.StringNullableFilter<"Task"> | string | null createdAt?: Prisma.DateTimeFilter<"Task"> | Date | string updatedAt?: Prisma.DateTimeFilter<"Task"> | Date | string + number?: Prisma.IntNullableFilter<"Task"> | number | null } export type TaskUpsertWithWhereUniqueWithoutCreatorInput = { @@ -1168,6 +1308,10 @@ export type TaskUpdateManyWithWhereWithoutCreatorInput = { } export type TaskCreateWithoutProjectInput = { + uuid: string + projectUuid?: string | null + columnUuid?: string | null + parentUuid?: string | null title: string description?: string kind?: string | null @@ -1181,6 +1325,7 @@ export type TaskCreateWithoutProjectInput = { archiveSource?: string | null createdAt?: Date | string updatedAt?: Date | string + number?: number | null column: Prisma.BoardColumnCreateNestedOneWithoutTasksInput parent?: Prisma.TaskCreateNestedOneWithoutChildrenInput children?: Prisma.TaskCreateNestedManyWithoutParentInput @@ -1192,6 +1337,10 @@ export type TaskCreateWithoutProjectInput = { export type TaskUncheckedCreateWithoutProjectInput = { id?: number + uuid: string + projectUuid?: string | null + columnUuid?: string | null + parentUuid?: string | null columnId: number parentId?: number | null title: string @@ -1209,6 +1358,7 @@ export type TaskUncheckedCreateWithoutProjectInput = { archiveSource?: string | null createdAt?: Date | string updatedAt?: Date | string + number?: number | null children?: Prisma.TaskUncheckedCreateNestedManyWithoutParentInput members?: Prisma.TaskMemberUncheckedCreateNestedManyWithoutTaskInput tags?: Prisma.TaskTagUncheckedCreateNestedManyWithoutTaskInput @@ -1241,6 +1391,10 @@ export type TaskUpdateManyWithWhereWithoutProjectInput = { } export type TaskCreateWithoutColumnInput = { + uuid: string + projectUuid?: string | null + columnUuid?: string | null + parentUuid?: string | null title: string description?: string kind?: string | null @@ -1254,6 +1408,7 @@ export type TaskCreateWithoutColumnInput = { archiveSource?: string | null createdAt?: Date | string updatedAt?: Date | string + number?: number | null project: Prisma.ProjectCreateNestedOneWithoutTasksInput parent?: Prisma.TaskCreateNestedOneWithoutChildrenInput children?: Prisma.TaskCreateNestedManyWithoutParentInput @@ -1265,6 +1420,10 @@ export type TaskCreateWithoutColumnInput = { export type TaskUncheckedCreateWithoutColumnInput = { id?: number + uuid: string + projectUuid?: string | null + columnUuid?: string | null + parentUuid?: string | null projectId: number parentId?: number | null title: string @@ -1282,6 +1441,7 @@ export type TaskUncheckedCreateWithoutColumnInput = { archiveSource?: string | null createdAt?: Date | string updatedAt?: Date | string + number?: number | null children?: Prisma.TaskUncheckedCreateNestedManyWithoutParentInput members?: Prisma.TaskMemberUncheckedCreateNestedManyWithoutTaskInput tags?: Prisma.TaskTagUncheckedCreateNestedManyWithoutTaskInput @@ -1314,6 +1474,10 @@ export type TaskUpdateManyWithWhereWithoutColumnInput = { } export type TaskCreateWithoutChildrenInput = { + uuid: string + projectUuid?: string | null + columnUuid?: string | null + parentUuid?: string | null title: string description?: string kind?: string | null @@ -1327,6 +1491,7 @@ export type TaskCreateWithoutChildrenInput = { archiveSource?: string | null createdAt?: Date | string updatedAt?: Date | string + number?: number | null project: Prisma.ProjectCreateNestedOneWithoutTasksInput column: Prisma.BoardColumnCreateNestedOneWithoutTasksInput parent?: Prisma.TaskCreateNestedOneWithoutChildrenInput @@ -1338,6 +1503,10 @@ export type TaskCreateWithoutChildrenInput = { export type TaskUncheckedCreateWithoutChildrenInput = { id?: number + uuid: string + projectUuid?: string | null + columnUuid?: string | null + parentUuid?: string | null projectId: number columnId: number parentId?: number | null @@ -1356,6 +1525,7 @@ export type TaskUncheckedCreateWithoutChildrenInput = { archiveSource?: string | null createdAt?: Date | string updatedAt?: Date | string + number?: number | null members?: Prisma.TaskMemberUncheckedCreateNestedManyWithoutTaskInput tags?: Prisma.TaskTagUncheckedCreateNestedManyWithoutTaskInput } @@ -1366,6 +1536,10 @@ export type TaskCreateOrConnectWithoutChildrenInput = { } export type TaskCreateWithoutParentInput = { + uuid: string + projectUuid?: string | null + columnUuid?: string | null + parentUuid?: string | null title: string description?: string kind?: string | null @@ -1379,6 +1553,7 @@ export type TaskCreateWithoutParentInput = { archiveSource?: string | null createdAt?: Date | string updatedAt?: Date | string + number?: number | null project: Prisma.ProjectCreateNestedOneWithoutTasksInput column: Prisma.BoardColumnCreateNestedOneWithoutTasksInput children?: Prisma.TaskCreateNestedManyWithoutParentInput @@ -1390,6 +1565,10 @@ export type TaskCreateWithoutParentInput = { export type TaskUncheckedCreateWithoutParentInput = { id?: number + uuid: string + projectUuid?: string | null + columnUuid?: string | null + parentUuid?: string | null projectId: number columnId: number title: string @@ -1407,6 +1586,7 @@ export type TaskUncheckedCreateWithoutParentInput = { archiveSource?: string | null createdAt?: Date | string updatedAt?: Date | string + number?: number | null children?: Prisma.TaskUncheckedCreateNestedManyWithoutParentInput members?: Prisma.TaskMemberUncheckedCreateNestedManyWithoutTaskInput tags?: Prisma.TaskTagUncheckedCreateNestedManyWithoutTaskInput @@ -1434,6 +1614,10 @@ export type TaskUpdateToOneWithWhereWithoutChildrenInput = { } export type TaskUpdateWithoutChildrenInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + columnUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + parentUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null title?: Prisma.StringFieldUpdateOperationsInput | string description?: Prisma.StringFieldUpdateOperationsInput | string kind?: Prisma.NullableStringFieldUpdateOperationsInput | string | null @@ -1447,6 +1631,7 @@ export type TaskUpdateWithoutChildrenInput = { archiveSource?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + number?: Prisma.NullableIntFieldUpdateOperationsInput | number | null project?: Prisma.ProjectUpdateOneRequiredWithoutTasksNestedInput column?: Prisma.BoardColumnUpdateOneRequiredWithoutTasksNestedInput parent?: Prisma.TaskUpdateOneWithoutChildrenNestedInput @@ -1458,6 +1643,10 @@ export type TaskUpdateWithoutChildrenInput = { export type TaskUncheckedUpdateWithoutChildrenInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + columnUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + parentUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null projectId?: Prisma.IntFieldUpdateOperationsInput | number columnId?: Prisma.IntFieldUpdateOperationsInput | number parentId?: Prisma.NullableIntFieldUpdateOperationsInput | number | null @@ -1476,6 +1665,7 @@ export type TaskUncheckedUpdateWithoutChildrenInput = { archiveSource?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + number?: Prisma.NullableIntFieldUpdateOperationsInput | number | null members?: Prisma.TaskMemberUncheckedUpdateManyWithoutTaskNestedInput tags?: Prisma.TaskTagUncheckedUpdateManyWithoutTaskNestedInput } @@ -1497,6 +1687,10 @@ export type TaskUpdateManyWithWhereWithoutParentInput = { } export type TaskCreateWithoutMembersInput = { + uuid: string + projectUuid?: string | null + columnUuid?: string | null + parentUuid?: string | null title: string description?: string kind?: string | null @@ -1510,6 +1704,7 @@ export type TaskCreateWithoutMembersInput = { archiveSource?: string | null createdAt?: Date | string updatedAt?: Date | string + number?: number | null project: Prisma.ProjectCreateNestedOneWithoutTasksInput column: Prisma.BoardColumnCreateNestedOneWithoutTasksInput parent?: Prisma.TaskCreateNestedOneWithoutChildrenInput @@ -1521,6 +1716,10 @@ export type TaskCreateWithoutMembersInput = { export type TaskUncheckedCreateWithoutMembersInput = { id?: number + uuid: string + projectUuid?: string | null + columnUuid?: string | null + parentUuid?: string | null projectId: number columnId: number parentId?: number | null @@ -1539,6 +1738,7 @@ export type TaskUncheckedCreateWithoutMembersInput = { archiveSource?: string | null createdAt?: Date | string updatedAt?: Date | string + number?: number | null children?: Prisma.TaskUncheckedCreateNestedManyWithoutParentInput tags?: Prisma.TaskTagUncheckedCreateNestedManyWithoutTaskInput } @@ -1560,6 +1760,10 @@ export type TaskUpdateToOneWithWhereWithoutMembersInput = { } export type TaskUpdateWithoutMembersInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + columnUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + parentUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null title?: Prisma.StringFieldUpdateOperationsInput | string description?: Prisma.StringFieldUpdateOperationsInput | string kind?: Prisma.NullableStringFieldUpdateOperationsInput | string | null @@ -1573,6 +1777,7 @@ export type TaskUpdateWithoutMembersInput = { archiveSource?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + number?: Prisma.NullableIntFieldUpdateOperationsInput | number | null project?: Prisma.ProjectUpdateOneRequiredWithoutTasksNestedInput column?: Prisma.BoardColumnUpdateOneRequiredWithoutTasksNestedInput parent?: Prisma.TaskUpdateOneWithoutChildrenNestedInput @@ -1584,6 +1789,10 @@ export type TaskUpdateWithoutMembersInput = { export type TaskUncheckedUpdateWithoutMembersInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + columnUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + parentUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null projectId?: Prisma.IntFieldUpdateOperationsInput | number columnId?: Prisma.IntFieldUpdateOperationsInput | number parentId?: Prisma.NullableIntFieldUpdateOperationsInput | number | null @@ -1602,11 +1811,16 @@ export type TaskUncheckedUpdateWithoutMembersInput = { archiveSource?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + number?: Prisma.NullableIntFieldUpdateOperationsInput | number | null children?: Prisma.TaskUncheckedUpdateManyWithoutParentNestedInput tags?: Prisma.TaskTagUncheckedUpdateManyWithoutTaskNestedInput } export type TaskCreateWithoutTagsInput = { + uuid: string + projectUuid?: string | null + columnUuid?: string | null + parentUuid?: string | null title: string description?: string kind?: string | null @@ -1620,6 +1834,7 @@ export type TaskCreateWithoutTagsInput = { archiveSource?: string | null createdAt?: Date | string updatedAt?: Date | string + number?: number | null project: Prisma.ProjectCreateNestedOneWithoutTasksInput column: Prisma.BoardColumnCreateNestedOneWithoutTasksInput parent?: Prisma.TaskCreateNestedOneWithoutChildrenInput @@ -1631,6 +1846,10 @@ export type TaskCreateWithoutTagsInput = { export type TaskUncheckedCreateWithoutTagsInput = { id?: number + uuid: string + projectUuid?: string | null + columnUuid?: string | null + parentUuid?: string | null projectId: number columnId: number parentId?: number | null @@ -1649,6 +1868,7 @@ export type TaskUncheckedCreateWithoutTagsInput = { archiveSource?: string | null createdAt?: Date | string updatedAt?: Date | string + number?: number | null children?: Prisma.TaskUncheckedCreateNestedManyWithoutParentInput members?: Prisma.TaskMemberUncheckedCreateNestedManyWithoutTaskInput } @@ -1670,6 +1890,10 @@ export type TaskUpdateToOneWithWhereWithoutTagsInput = { } export type TaskUpdateWithoutTagsInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + columnUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + parentUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null title?: Prisma.StringFieldUpdateOperationsInput | string description?: Prisma.StringFieldUpdateOperationsInput | string kind?: Prisma.NullableStringFieldUpdateOperationsInput | string | null @@ -1683,6 +1907,7 @@ export type TaskUpdateWithoutTagsInput = { archiveSource?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + number?: Prisma.NullableIntFieldUpdateOperationsInput | number | null project?: Prisma.ProjectUpdateOneRequiredWithoutTasksNestedInput column?: Prisma.BoardColumnUpdateOneRequiredWithoutTasksNestedInput parent?: Prisma.TaskUpdateOneWithoutChildrenNestedInput @@ -1694,6 +1919,10 @@ export type TaskUpdateWithoutTagsInput = { export type TaskUncheckedUpdateWithoutTagsInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + columnUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + parentUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null projectId?: Prisma.IntFieldUpdateOperationsInput | number columnId?: Prisma.IntFieldUpdateOperationsInput | number parentId?: Prisma.NullableIntFieldUpdateOperationsInput | number | null @@ -1712,12 +1941,17 @@ export type TaskUncheckedUpdateWithoutTagsInput = { archiveSource?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + number?: Prisma.NullableIntFieldUpdateOperationsInput | number | null children?: Prisma.TaskUncheckedUpdateManyWithoutParentNestedInput members?: Prisma.TaskMemberUncheckedUpdateManyWithoutTaskNestedInput } export type TaskCreateManyAssigneeInput = { id?: number + uuid: string + projectUuid?: string | null + columnUuid?: string | null + parentUuid?: string | null projectId: number columnId: number parentId?: number | null @@ -1735,10 +1969,15 @@ export type TaskCreateManyAssigneeInput = { archiveSource?: string | null createdAt?: Date | string updatedAt?: Date | string + number?: number | null } export type TaskCreateManyCreatorInput = { id?: number + uuid: string + projectUuid?: string | null + columnUuid?: string | null + parentUuid?: string | null projectId: number columnId: number parentId?: number | null @@ -1756,9 +1995,14 @@ export type TaskCreateManyCreatorInput = { archiveSource?: string | null createdAt?: Date | string updatedAt?: Date | string + number?: number | null } export type TaskUpdateWithoutAssigneeInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + columnUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + parentUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null title?: Prisma.StringFieldUpdateOperationsInput | string description?: Prisma.StringFieldUpdateOperationsInput | string kind?: Prisma.NullableStringFieldUpdateOperationsInput | string | null @@ -1772,6 +2016,7 @@ export type TaskUpdateWithoutAssigneeInput = { archiveSource?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + number?: Prisma.NullableIntFieldUpdateOperationsInput | number | null project?: Prisma.ProjectUpdateOneRequiredWithoutTasksNestedInput column?: Prisma.BoardColumnUpdateOneRequiredWithoutTasksNestedInput parent?: Prisma.TaskUpdateOneWithoutChildrenNestedInput @@ -1783,6 +2028,10 @@ export type TaskUpdateWithoutAssigneeInput = { export type TaskUncheckedUpdateWithoutAssigneeInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + columnUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + parentUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null projectId?: Prisma.IntFieldUpdateOperationsInput | number columnId?: Prisma.IntFieldUpdateOperationsInput | number parentId?: Prisma.NullableIntFieldUpdateOperationsInput | number | null @@ -1800,6 +2049,7 @@ export type TaskUncheckedUpdateWithoutAssigneeInput = { archiveSource?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + number?: Prisma.NullableIntFieldUpdateOperationsInput | number | null children?: Prisma.TaskUncheckedUpdateManyWithoutParentNestedInput members?: Prisma.TaskMemberUncheckedUpdateManyWithoutTaskNestedInput tags?: Prisma.TaskTagUncheckedUpdateManyWithoutTaskNestedInput @@ -1807,6 +2057,10 @@ export type TaskUncheckedUpdateWithoutAssigneeInput = { export type TaskUncheckedUpdateManyWithoutAssigneeInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + columnUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + parentUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null projectId?: Prisma.IntFieldUpdateOperationsInput | number columnId?: Prisma.IntFieldUpdateOperationsInput | number parentId?: Prisma.NullableIntFieldUpdateOperationsInput | number | null @@ -1824,9 +2078,14 @@ export type TaskUncheckedUpdateManyWithoutAssigneeInput = { archiveSource?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + number?: Prisma.NullableIntFieldUpdateOperationsInput | number | null } export type TaskUpdateWithoutCreatorInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + columnUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + parentUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null title?: Prisma.StringFieldUpdateOperationsInput | string description?: Prisma.StringFieldUpdateOperationsInput | string kind?: Prisma.NullableStringFieldUpdateOperationsInput | string | null @@ -1840,6 +2099,7 @@ export type TaskUpdateWithoutCreatorInput = { archiveSource?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + number?: Prisma.NullableIntFieldUpdateOperationsInput | number | null project?: Prisma.ProjectUpdateOneRequiredWithoutTasksNestedInput column?: Prisma.BoardColumnUpdateOneRequiredWithoutTasksNestedInput parent?: Prisma.TaskUpdateOneWithoutChildrenNestedInput @@ -1851,6 +2111,10 @@ export type TaskUpdateWithoutCreatorInput = { export type TaskUncheckedUpdateWithoutCreatorInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + columnUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + parentUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null projectId?: Prisma.IntFieldUpdateOperationsInput | number columnId?: Prisma.IntFieldUpdateOperationsInput | number parentId?: Prisma.NullableIntFieldUpdateOperationsInput | number | null @@ -1868,6 +2132,7 @@ export type TaskUncheckedUpdateWithoutCreatorInput = { archiveSource?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + number?: Prisma.NullableIntFieldUpdateOperationsInput | number | null children?: Prisma.TaskUncheckedUpdateManyWithoutParentNestedInput members?: Prisma.TaskMemberUncheckedUpdateManyWithoutTaskNestedInput tags?: Prisma.TaskTagUncheckedUpdateManyWithoutTaskNestedInput @@ -1875,6 +2140,10 @@ export type TaskUncheckedUpdateWithoutCreatorInput = { export type TaskUncheckedUpdateManyWithoutCreatorInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + columnUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + parentUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null projectId?: Prisma.IntFieldUpdateOperationsInput | number columnId?: Prisma.IntFieldUpdateOperationsInput | number parentId?: Prisma.NullableIntFieldUpdateOperationsInput | number | null @@ -1892,10 +2161,15 @@ export type TaskUncheckedUpdateManyWithoutCreatorInput = { archiveSource?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + number?: Prisma.NullableIntFieldUpdateOperationsInput | number | null } export type TaskCreateManyProjectInput = { id?: number + uuid: string + projectUuid?: string | null + columnUuid?: string | null + parentUuid?: string | null columnId: number parentId?: number | null title: string @@ -1913,9 +2187,14 @@ export type TaskCreateManyProjectInput = { archiveSource?: string | null createdAt?: Date | string updatedAt?: Date | string + number?: number | null } export type TaskUpdateWithoutProjectInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + columnUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + parentUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null title?: Prisma.StringFieldUpdateOperationsInput | string description?: Prisma.StringFieldUpdateOperationsInput | string kind?: Prisma.NullableStringFieldUpdateOperationsInput | string | null @@ -1929,6 +2208,7 @@ export type TaskUpdateWithoutProjectInput = { archiveSource?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + number?: Prisma.NullableIntFieldUpdateOperationsInput | number | null column?: Prisma.BoardColumnUpdateOneRequiredWithoutTasksNestedInput parent?: Prisma.TaskUpdateOneWithoutChildrenNestedInput children?: Prisma.TaskUpdateManyWithoutParentNestedInput @@ -1940,6 +2220,10 @@ export type TaskUpdateWithoutProjectInput = { export type TaskUncheckedUpdateWithoutProjectInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + columnUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + parentUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null columnId?: Prisma.IntFieldUpdateOperationsInput | number parentId?: Prisma.NullableIntFieldUpdateOperationsInput | number | null title?: Prisma.StringFieldUpdateOperationsInput | string @@ -1957,6 +2241,7 @@ export type TaskUncheckedUpdateWithoutProjectInput = { archiveSource?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + number?: Prisma.NullableIntFieldUpdateOperationsInput | number | null children?: Prisma.TaskUncheckedUpdateManyWithoutParentNestedInput members?: Prisma.TaskMemberUncheckedUpdateManyWithoutTaskNestedInput tags?: Prisma.TaskTagUncheckedUpdateManyWithoutTaskNestedInput @@ -1964,6 +2249,10 @@ export type TaskUncheckedUpdateWithoutProjectInput = { export type TaskUncheckedUpdateManyWithoutProjectInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + columnUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + parentUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null columnId?: Prisma.IntFieldUpdateOperationsInput | number parentId?: Prisma.NullableIntFieldUpdateOperationsInput | number | null title?: Prisma.StringFieldUpdateOperationsInput | string @@ -1981,10 +2270,15 @@ export type TaskUncheckedUpdateManyWithoutProjectInput = { archiveSource?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + number?: Prisma.NullableIntFieldUpdateOperationsInput | number | null } export type TaskCreateManyColumnInput = { id?: number + uuid: string + projectUuid?: string | null + columnUuid?: string | null + parentUuid?: string | null projectId: number parentId?: number | null title: string @@ -2002,9 +2296,14 @@ export type TaskCreateManyColumnInput = { archiveSource?: string | null createdAt?: Date | string updatedAt?: Date | string + number?: number | null } export type TaskUpdateWithoutColumnInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + columnUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + parentUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null title?: Prisma.StringFieldUpdateOperationsInput | string description?: Prisma.StringFieldUpdateOperationsInput | string kind?: Prisma.NullableStringFieldUpdateOperationsInput | string | null @@ -2018,6 +2317,7 @@ export type TaskUpdateWithoutColumnInput = { archiveSource?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + number?: Prisma.NullableIntFieldUpdateOperationsInput | number | null project?: Prisma.ProjectUpdateOneRequiredWithoutTasksNestedInput parent?: Prisma.TaskUpdateOneWithoutChildrenNestedInput children?: Prisma.TaskUpdateManyWithoutParentNestedInput @@ -2029,6 +2329,10 @@ export type TaskUpdateWithoutColumnInput = { export type TaskUncheckedUpdateWithoutColumnInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + columnUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + parentUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null projectId?: Prisma.IntFieldUpdateOperationsInput | number parentId?: Prisma.NullableIntFieldUpdateOperationsInput | number | null title?: Prisma.StringFieldUpdateOperationsInput | string @@ -2046,6 +2350,7 @@ export type TaskUncheckedUpdateWithoutColumnInput = { archiveSource?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + number?: Prisma.NullableIntFieldUpdateOperationsInput | number | null children?: Prisma.TaskUncheckedUpdateManyWithoutParentNestedInput members?: Prisma.TaskMemberUncheckedUpdateManyWithoutTaskNestedInput tags?: Prisma.TaskTagUncheckedUpdateManyWithoutTaskNestedInput @@ -2053,6 +2358,10 @@ export type TaskUncheckedUpdateWithoutColumnInput = { export type TaskUncheckedUpdateManyWithoutColumnInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + columnUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + parentUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null projectId?: Prisma.IntFieldUpdateOperationsInput | number parentId?: Prisma.NullableIntFieldUpdateOperationsInput | number | null title?: Prisma.StringFieldUpdateOperationsInput | string @@ -2070,10 +2379,15 @@ export type TaskUncheckedUpdateManyWithoutColumnInput = { archiveSource?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + number?: Prisma.NullableIntFieldUpdateOperationsInput | number | null } export type TaskCreateManyParentInput = { id?: number + uuid: string + projectUuid?: string | null + columnUuid?: string | null + parentUuid?: string | null projectId: number columnId: number title: string @@ -2091,9 +2405,14 @@ export type TaskCreateManyParentInput = { archiveSource?: string | null createdAt?: Date | string updatedAt?: Date | string + number?: number | null } export type TaskUpdateWithoutParentInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + columnUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + parentUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null title?: Prisma.StringFieldUpdateOperationsInput | string description?: Prisma.StringFieldUpdateOperationsInput | string kind?: Prisma.NullableStringFieldUpdateOperationsInput | string | null @@ -2107,6 +2426,7 @@ export type TaskUpdateWithoutParentInput = { archiveSource?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + number?: Prisma.NullableIntFieldUpdateOperationsInput | number | null project?: Prisma.ProjectUpdateOneRequiredWithoutTasksNestedInput column?: Prisma.BoardColumnUpdateOneRequiredWithoutTasksNestedInput children?: Prisma.TaskUpdateManyWithoutParentNestedInput @@ -2118,6 +2438,10 @@ export type TaskUpdateWithoutParentInput = { export type TaskUncheckedUpdateWithoutParentInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + columnUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + parentUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null projectId?: Prisma.IntFieldUpdateOperationsInput | number columnId?: Prisma.IntFieldUpdateOperationsInput | number title?: Prisma.StringFieldUpdateOperationsInput | string @@ -2135,6 +2459,7 @@ export type TaskUncheckedUpdateWithoutParentInput = { archiveSource?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + number?: Prisma.NullableIntFieldUpdateOperationsInput | number | null children?: Prisma.TaskUncheckedUpdateManyWithoutParentNestedInput members?: Prisma.TaskMemberUncheckedUpdateManyWithoutTaskNestedInput tags?: Prisma.TaskTagUncheckedUpdateManyWithoutTaskNestedInput @@ -2142,6 +2467,10 @@ export type TaskUncheckedUpdateWithoutParentInput = { export type TaskUncheckedUpdateManyWithoutParentInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + projectUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + columnUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + parentUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null projectId?: Prisma.IntFieldUpdateOperationsInput | number columnId?: Prisma.IntFieldUpdateOperationsInput | number title?: Prisma.StringFieldUpdateOperationsInput | string @@ -2159,6 +2488,7 @@ export type TaskUncheckedUpdateManyWithoutParentInput = { archiveSource?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + number?: Prisma.NullableIntFieldUpdateOperationsInput | number | null } @@ -2212,6 +2542,10 @@ export type TaskCountOutputTypeCountTagsArgs = runtime.Types.Extensions.GetSelect<{ id?: boolean + uuid?: boolean + projectUuid?: boolean + columnUuid?: boolean + parentUuid?: boolean projectId?: boolean columnId?: boolean parentId?: boolean @@ -2230,6 +2564,7 @@ export type TaskSelect column?: boolean | Prisma.BoardColumnDefaultArgs parent?: boolean | Prisma.Task$parentArgs @@ -2241,10 +2576,12 @@ export type TaskSelect }, ExtArgs["result"]["task"]> - - -export type TaskSelectScalar = { +export type TaskSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ id?: boolean + uuid?: boolean + projectUuid?: boolean + columnUuid?: boolean + parentUuid?: boolean projectId?: boolean columnId?: boolean parentId?: boolean @@ -2263,9 +2600,74 @@ export type TaskSelectScalar = { archiveSource?: boolean createdAt?: boolean updatedAt?: boolean + number?: boolean + project?: boolean | Prisma.ProjectDefaultArgs + column?: boolean | Prisma.BoardColumnDefaultArgs + parent?: boolean | Prisma.Task$parentArgs + assignee?: boolean | Prisma.Task$assigneeArgs + creator?: boolean | Prisma.UserDefaultArgs +}, ExtArgs["result"]["task"]> + +export type TaskSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + uuid?: boolean + projectUuid?: boolean + columnUuid?: boolean + parentUuid?: boolean + projectId?: boolean + columnId?: boolean + parentId?: boolean + title?: boolean + description?: boolean + kind?: boolean + markDate?: boolean + status?: boolean + doneAt?: boolean + assigneeId?: boolean + creatorId?: boolean + extras?: boolean + sortOrder?: boolean + archived?: boolean + archivedAt?: boolean + archiveSource?: boolean + createdAt?: boolean + updatedAt?: boolean + number?: boolean + project?: boolean | Prisma.ProjectDefaultArgs + column?: boolean | Prisma.BoardColumnDefaultArgs + parent?: boolean | Prisma.Task$parentArgs + assignee?: boolean | Prisma.Task$assigneeArgs + creator?: boolean | Prisma.UserDefaultArgs +}, ExtArgs["result"]["task"]> + +export type TaskSelectScalar = { + id?: boolean + uuid?: boolean + projectUuid?: boolean + columnUuid?: boolean + parentUuid?: boolean + projectId?: boolean + columnId?: boolean + parentId?: boolean + title?: boolean + description?: boolean + kind?: boolean + markDate?: boolean + status?: boolean + doneAt?: boolean + assigneeId?: boolean + creatorId?: boolean + extras?: boolean + sortOrder?: boolean + archived?: boolean + archivedAt?: boolean + archiveSource?: boolean + createdAt?: boolean + updatedAt?: boolean + number?: boolean } -export type TaskOmit = runtime.Types.Extensions.GetOmit<"id" | "projectId" | "columnId" | "parentId" | "title" | "description" | "kind" | "markDate" | "status" | "doneAt" | "assigneeId" | "creatorId" | "extras" | "sortOrder" | "archived" | "archivedAt" | "archiveSource" | "createdAt" | "updatedAt", ExtArgs["result"]["task"]> +export type TaskOmit = runtime.Types.Extensions.GetOmit<"id" | "uuid" | "projectUuid" | "columnUuid" | "parentUuid" | "projectId" | "columnId" | "parentId" | "title" | "description" | "kind" | "markDate" | "status" | "doneAt" | "assigneeId" | "creatorId" | "extras" | "sortOrder" | "archived" | "archivedAt" | "archiveSource" | "createdAt" | "updatedAt" | "number", ExtArgs["result"]["task"]> export type TaskInclude = { project?: boolean | Prisma.ProjectDefaultArgs column?: boolean | Prisma.BoardColumnDefaultArgs @@ -2277,6 +2679,20 @@ export type TaskInclude _count?: boolean | Prisma.TaskCountOutputTypeDefaultArgs } +export type TaskIncludeCreateManyAndReturn = { + project?: boolean | Prisma.ProjectDefaultArgs + column?: boolean | Prisma.BoardColumnDefaultArgs + parent?: boolean | Prisma.Task$parentArgs + assignee?: boolean | Prisma.Task$assigneeArgs + creator?: boolean | Prisma.UserDefaultArgs +} +export type TaskIncludeUpdateManyAndReturn = { + project?: boolean | Prisma.ProjectDefaultArgs + column?: boolean | Prisma.BoardColumnDefaultArgs + parent?: boolean | Prisma.Task$parentArgs + assignee?: boolean | Prisma.Task$assigneeArgs + creator?: boolean | Prisma.UserDefaultArgs +} export type $TaskPayload = { name: "Task" @@ -2292,6 +2708,10 @@ export type $TaskPayload composites: {} } @@ -2427,6 +2848,30 @@ export interface TaskDelegate(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Create many Tasks and returns the data saved in the database. + * @param {TaskCreateManyAndReturnArgs} args - Arguments to create many Tasks. + * @example + * // Create many Tasks + * const task = await prisma.task.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many Tasks and only return the `id` + * const taskWithIdOnly = await prisma.task.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + /** * Delete a Task. * @param {TaskDeleteArgs} args - Arguments to delete one Task. @@ -2491,6 +2936,36 @@ export interface TaskDelegate(args: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Update zero or more Tasks and returns the data updated in the database. + * @param {TaskUpdateManyAndReturnArgs} args - Arguments to update many Tasks. + * @example + * // Update many Tasks + * const task = await prisma.task.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more Tasks and only return the `id` + * const taskWithIdOnly = await prisma.task.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + /** * Create or update one Task. * @param {TaskUpsertArgs} args - Arguments to update or create a Task. @@ -2688,6 +3163,10 @@ export interface Prisma__TaskClient + readonly uuid: Prisma.FieldRef<"Task", 'String'> + readonly projectUuid: Prisma.FieldRef<"Task", 'String'> + readonly columnUuid: Prisma.FieldRef<"Task", 'String'> + readonly parentUuid: Prisma.FieldRef<"Task", 'String'> readonly projectId: Prisma.FieldRef<"Task", 'Int'> readonly columnId: Prisma.FieldRef<"Task", 'Int'> readonly parentId: Prisma.FieldRef<"Task", 'Int'> @@ -2706,6 +3185,7 @@ export interface TaskFieldRefs { readonly archiveSource: Prisma.FieldRef<"Task", 'String'> readonly createdAt: Prisma.FieldRef<"Task", 'DateTime'> readonly updatedAt: Prisma.FieldRef<"Task", 'DateTime'> + readonly number: Prisma.FieldRef<"Task", 'Int'> } @@ -2943,6 +3423,29 @@ export type TaskCreateManyArgs = { + /** + * Select specific fields to fetch from the Task + */ + select?: Prisma.TaskSelectCreateManyAndReturn | null + /** + * Omit specific fields from the Task + */ + omit?: Prisma.TaskOmit | null + /** + * The data used to create many Tasks. + */ + data: Prisma.TaskCreateManyInput | Prisma.TaskCreateManyInput[] + skipDuplicates?: boolean + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.TaskIncludeCreateManyAndReturn | null +} + /** * Task update */ @@ -2987,6 +3490,36 @@ export type TaskUpdateManyArgs = { + /** + * Select specific fields to fetch from the Task + */ + select?: Prisma.TaskSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the Task + */ + omit?: Prisma.TaskOmit | null + /** + * The data used to update Tasks. + */ + data: Prisma.XOR + /** + * Filter which Tasks to update + */ + where?: Prisma.TaskWhereInput + /** + * Limit how many Tasks to update. + */ + limit?: number + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.TaskIncludeUpdateManyAndReturn | null +} + /** * Task upsert */ diff --git a/generated/prisma/models/TaskMember.ts b/generated/prisma/models/TaskMember.ts index 59cd8da..84b8566 100644 --- a/generated/prisma/models/TaskMember.ts +++ b/generated/prisma/models/TaskMember.ts @@ -40,18 +40,24 @@ export type TaskMemberSumAggregateOutputType = { export type TaskMemberMinAggregateOutputType = { id: number | null + uuid: string | null + taskUuid: string | null taskId: number | null userId: number | null } export type TaskMemberMaxAggregateOutputType = { id: number | null + uuid: string | null + taskUuid: string | null taskId: number | null userId: number | null } export type TaskMemberCountAggregateOutputType = { id: number + uuid: number + taskUuid: number taskId: number userId: number _all: number @@ -72,18 +78,24 @@ export type TaskMemberSumAggregateInputType = { export type TaskMemberMinAggregateInputType = { id?: true + uuid?: true + taskUuid?: true taskId?: true userId?: true } export type TaskMemberMaxAggregateInputType = { id?: true + uuid?: true + taskUuid?: true taskId?: true userId?: true } export type TaskMemberCountAggregateInputType = { id?: true + uuid?: true + taskUuid?: true taskId?: true userId?: true _all?: true @@ -177,6 +189,8 @@ export type TaskMemberGroupByArgs | number + uuid?: Prisma.StringFilter<"TaskMember"> | string + taskUuid?: Prisma.StringNullableFilter<"TaskMember"> | string | null taskId?: Prisma.IntFilter<"TaskMember"> | number userId?: Prisma.IntFilter<"TaskMember"> | number task?: Prisma.XOR @@ -214,6 +230,8 @@ export type TaskMemberWhereInput = { export type TaskMemberOrderByWithRelationInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + taskUuid?: Prisma.SortOrderInput | Prisma.SortOrder taskId?: Prisma.SortOrder userId?: Prisma.SortOrder task?: Prisma.TaskOrderByWithRelationInput @@ -222,18 +240,22 @@ export type TaskMemberOrderByWithRelationInput = { export type TaskMemberWhereUniqueInput = Prisma.AtLeast<{ id?: number + uuid?: string taskId_userId?: Prisma.TaskMemberTaskIdUserIdCompoundUniqueInput AND?: Prisma.TaskMemberWhereInput | Prisma.TaskMemberWhereInput[] OR?: Prisma.TaskMemberWhereInput[] NOT?: Prisma.TaskMemberWhereInput | Prisma.TaskMemberWhereInput[] + taskUuid?: Prisma.StringNullableFilter<"TaskMember"> | string | null taskId?: Prisma.IntFilter<"TaskMember"> | number userId?: Prisma.IntFilter<"TaskMember"> | number task?: Prisma.XOR user?: Prisma.XOR -}, "id" | "taskId_userId"> +}, "id" | "uuid" | "taskId_userId"> export type TaskMemberOrderByWithAggregationInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + taskUuid?: Prisma.SortOrderInput | Prisma.SortOrder taskId?: Prisma.SortOrder userId?: Prisma.SortOrder _count?: Prisma.TaskMemberCountOrderByAggregateInput @@ -248,44 +270,59 @@ export type TaskMemberScalarWhereWithAggregatesInput = { OR?: Prisma.TaskMemberScalarWhereWithAggregatesInput[] NOT?: Prisma.TaskMemberScalarWhereWithAggregatesInput | Prisma.TaskMemberScalarWhereWithAggregatesInput[] id?: Prisma.IntWithAggregatesFilter<"TaskMember"> | number + uuid?: Prisma.StringWithAggregatesFilter<"TaskMember"> | string + taskUuid?: Prisma.StringNullableWithAggregatesFilter<"TaskMember"> | string | null taskId?: Prisma.IntWithAggregatesFilter<"TaskMember"> | number userId?: Prisma.IntWithAggregatesFilter<"TaskMember"> | number } export type TaskMemberCreateInput = { + uuid: string + taskUuid?: string | null task: Prisma.TaskCreateNestedOneWithoutMembersInput user: Prisma.UserCreateNestedOneWithoutTaskMembersInput } export type TaskMemberUncheckedCreateInput = { id?: number + uuid: string + taskUuid?: string | null taskId: number userId: number } export type TaskMemberUpdateInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + taskUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null task?: Prisma.TaskUpdateOneRequiredWithoutMembersNestedInput user?: Prisma.UserUpdateOneRequiredWithoutTaskMembersNestedInput } export type TaskMemberUncheckedUpdateInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + taskUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null taskId?: Prisma.IntFieldUpdateOperationsInput | number userId?: Prisma.IntFieldUpdateOperationsInput | number } export type TaskMemberCreateManyInput = { id?: number + uuid: string + taskUuid?: string | null taskId: number userId: number } export type TaskMemberUpdateManyMutationInput = { - + uuid?: Prisma.StringFieldUpdateOperationsInput | string + taskUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null } export type TaskMemberUncheckedUpdateManyInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + taskUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null taskId?: Prisma.IntFieldUpdateOperationsInput | number userId?: Prisma.IntFieldUpdateOperationsInput | number } @@ -307,6 +344,8 @@ export type TaskMemberTaskIdUserIdCompoundUniqueInput = { export type TaskMemberCountOrderByAggregateInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + taskUuid?: Prisma.SortOrder taskId?: Prisma.SortOrder userId?: Prisma.SortOrder } @@ -319,12 +358,16 @@ export type TaskMemberAvgOrderByAggregateInput = { export type TaskMemberMaxOrderByAggregateInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + taskUuid?: Prisma.SortOrder taskId?: Prisma.SortOrder userId?: Prisma.SortOrder } export type TaskMemberMinOrderByAggregateInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + taskUuid?: Prisma.SortOrder taskId?: Prisma.SortOrder userId?: Prisma.SortOrder } @@ -420,11 +463,15 @@ export type TaskMemberUncheckedUpdateManyWithoutTaskNestedInput = { } export type TaskMemberCreateWithoutUserInput = { + uuid: string + taskUuid?: string | null task: Prisma.TaskCreateNestedOneWithoutMembersInput } export type TaskMemberUncheckedCreateWithoutUserInput = { id?: number + uuid: string + taskUuid?: string | null taskId: number } @@ -459,16 +506,22 @@ export type TaskMemberScalarWhereInput = { OR?: Prisma.TaskMemberScalarWhereInput[] NOT?: Prisma.TaskMemberScalarWhereInput | Prisma.TaskMemberScalarWhereInput[] id?: Prisma.IntFilter<"TaskMember"> | number + uuid?: Prisma.StringFilter<"TaskMember"> | string + taskUuid?: Prisma.StringNullableFilter<"TaskMember"> | string | null taskId?: Prisma.IntFilter<"TaskMember"> | number userId?: Prisma.IntFilter<"TaskMember"> | number } export type TaskMemberCreateWithoutTaskInput = { + uuid: string + taskUuid?: string | null user: Prisma.UserCreateNestedOneWithoutTaskMembersInput } export type TaskMemberUncheckedCreateWithoutTaskInput = { id?: number + uuid: string + taskUuid?: string | null userId: number } @@ -500,39 +553,55 @@ export type TaskMemberUpdateManyWithWhereWithoutTaskInput = { export type TaskMemberCreateManyUserInput = { id?: number + uuid: string + taskUuid?: string | null taskId: number } export type TaskMemberUpdateWithoutUserInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + taskUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null task?: Prisma.TaskUpdateOneRequiredWithoutMembersNestedInput } export type TaskMemberUncheckedUpdateWithoutUserInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + taskUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null taskId?: Prisma.IntFieldUpdateOperationsInput | number } export type TaskMemberUncheckedUpdateManyWithoutUserInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + taskUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null taskId?: Prisma.IntFieldUpdateOperationsInput | number } export type TaskMemberCreateManyTaskInput = { id?: number + uuid: string + taskUuid?: string | null userId: number } export type TaskMemberUpdateWithoutTaskInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + taskUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null user?: Prisma.UserUpdateOneRequiredWithoutTaskMembersNestedInput } export type TaskMemberUncheckedUpdateWithoutTaskInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + taskUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null userId?: Prisma.IntFieldUpdateOperationsInput | number } export type TaskMemberUncheckedUpdateManyWithoutTaskInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + taskUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null userId?: Prisma.IntFieldUpdateOperationsInput | number } @@ -540,25 +609,55 @@ export type TaskMemberUncheckedUpdateManyWithoutTaskInput = { export type TaskMemberSelect = runtime.Types.Extensions.GetSelect<{ id?: boolean + uuid?: boolean + taskUuid?: boolean taskId?: boolean userId?: boolean task?: boolean | Prisma.TaskDefaultArgs user?: boolean | Prisma.UserDefaultArgs }, ExtArgs["result"]["taskMember"]> +export type TaskMemberSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + uuid?: boolean + taskUuid?: boolean + taskId?: boolean + userId?: boolean + task?: boolean | Prisma.TaskDefaultArgs + user?: boolean | Prisma.UserDefaultArgs +}, ExtArgs["result"]["taskMember"]> +export type TaskMemberSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + uuid?: boolean + taskUuid?: boolean + taskId?: boolean + userId?: boolean + task?: boolean | Prisma.TaskDefaultArgs + user?: boolean | Prisma.UserDefaultArgs +}, ExtArgs["result"]["taskMember"]> export type TaskMemberSelectScalar = { id?: boolean + uuid?: boolean + taskUuid?: boolean taskId?: boolean userId?: boolean } -export type TaskMemberOmit = runtime.Types.Extensions.GetOmit<"id" | "taskId" | "userId", ExtArgs["result"]["taskMember"]> +export type TaskMemberOmit = runtime.Types.Extensions.GetOmit<"id" | "uuid" | "taskUuid" | "taskId" | "userId", ExtArgs["result"]["taskMember"]> export type TaskMemberInclude = { task?: boolean | Prisma.TaskDefaultArgs user?: boolean | Prisma.UserDefaultArgs } +export type TaskMemberIncludeCreateManyAndReturn = { + task?: boolean | Prisma.TaskDefaultArgs + user?: boolean | Prisma.UserDefaultArgs +} +export type TaskMemberIncludeUpdateManyAndReturn = { + task?: boolean | Prisma.TaskDefaultArgs + user?: boolean | Prisma.UserDefaultArgs +} export type $TaskMemberPayload = { name: "TaskMember" @@ -568,6 +667,8 @@ export type $TaskMemberPayload @@ -687,6 +788,30 @@ export interface TaskMemberDelegate(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Create many TaskMembers and returns the data saved in the database. + * @param {TaskMemberCreateManyAndReturnArgs} args - Arguments to create many TaskMembers. + * @example + * // Create many TaskMembers + * const taskMember = await prisma.taskMember.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many TaskMembers and only return the `id` + * const taskMemberWithIdOnly = await prisma.taskMember.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + /** * Delete a TaskMember. * @param {TaskMemberDeleteArgs} args - Arguments to delete one TaskMember. @@ -751,6 +876,36 @@ export interface TaskMemberDelegate(args: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Update zero or more TaskMembers and returns the data updated in the database. + * @param {TaskMemberUpdateManyAndReturnArgs} args - Arguments to update many TaskMembers. + * @example + * // Update many TaskMembers + * const taskMember = await prisma.taskMember.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more TaskMembers and only return the `id` + * const taskMemberWithIdOnly = await prisma.taskMember.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + /** * Create or update one TaskMember. * @param {TaskMemberUpsertArgs} args - Arguments to update or create a TaskMember. @@ -942,6 +1097,8 @@ export interface Prisma__TaskMemberClient + readonly uuid: Prisma.FieldRef<"TaskMember", 'String'> + readonly taskUuid: Prisma.FieldRef<"TaskMember", 'String'> readonly taskId: Prisma.FieldRef<"TaskMember", 'Int'> readonly userId: Prisma.FieldRef<"TaskMember", 'Int'> } @@ -1181,6 +1338,29 @@ export type TaskMemberCreateManyArgs = { + /** + * Select specific fields to fetch from the TaskMember + */ + select?: Prisma.TaskMemberSelectCreateManyAndReturn | null + /** + * Omit specific fields from the TaskMember + */ + omit?: Prisma.TaskMemberOmit | null + /** + * The data used to create many TaskMembers. + */ + data: Prisma.TaskMemberCreateManyInput | Prisma.TaskMemberCreateManyInput[] + skipDuplicates?: boolean + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.TaskMemberIncludeCreateManyAndReturn | null +} + /** * TaskMember update */ @@ -1225,6 +1405,36 @@ export type TaskMemberUpdateManyArgs = { + /** + * Select specific fields to fetch from the TaskMember + */ + select?: Prisma.TaskMemberSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the TaskMember + */ + omit?: Prisma.TaskMemberOmit | null + /** + * The data used to update TaskMembers. + */ + data: Prisma.XOR + /** + * Filter which TaskMembers to update + */ + where?: Prisma.TaskMemberWhereInput + /** + * Limit how many TaskMembers to update. + */ + limit?: number + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.TaskMemberIncludeUpdateManyAndReturn | null +} + /** * TaskMember upsert */ diff --git a/generated/prisma/models/TaskTag.ts b/generated/prisma/models/TaskTag.ts index 29b7d6b..30bbb35 100644 --- a/generated/prisma/models/TaskTag.ts +++ b/generated/prisma/models/TaskTag.ts @@ -38,18 +38,24 @@ export type TaskTagSumAggregateOutputType = { export type TaskTagMinAggregateOutputType = { id: number | null + uuid: string | null + taskUuid: string | null taskId: number | null name: string | null } export type TaskTagMaxAggregateOutputType = { id: number | null + uuid: string | null + taskUuid: string | null taskId: number | null name: string | null } export type TaskTagCountAggregateOutputType = { id: number + uuid: number + taskUuid: number taskId: number name: number _all: number @@ -68,18 +74,24 @@ export type TaskTagSumAggregateInputType = { export type TaskTagMinAggregateInputType = { id?: true + uuid?: true + taskUuid?: true taskId?: true name?: true } export type TaskTagMaxAggregateInputType = { id?: true + uuid?: true + taskUuid?: true taskId?: true name?: true } export type TaskTagCountAggregateInputType = { id?: true + uuid?: true + taskUuid?: true taskId?: true name?: true _all?: true @@ -173,6 +185,8 @@ export type TaskTagGroupByArgs | number + uuid?: Prisma.StringFilter<"TaskTag"> | string + taskUuid?: Prisma.StringNullableFilter<"TaskTag"> | string | null taskId?: Prisma.IntFilter<"TaskTag"> | number name?: Prisma.StringFilter<"TaskTag"> | string task?: Prisma.XOR @@ -209,24 +225,29 @@ export type TaskTagWhereInput = { export type TaskTagOrderByWithRelationInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + taskUuid?: Prisma.SortOrderInput | Prisma.SortOrder taskId?: Prisma.SortOrder name?: Prisma.SortOrder task?: Prisma.TaskOrderByWithRelationInput - _relevance?: Prisma.TaskTagOrderByRelevanceInput } export type TaskTagWhereUniqueInput = Prisma.AtLeast<{ id?: number + uuid?: string AND?: Prisma.TaskTagWhereInput | Prisma.TaskTagWhereInput[] OR?: Prisma.TaskTagWhereInput[] NOT?: Prisma.TaskTagWhereInput | Prisma.TaskTagWhereInput[] + taskUuid?: Prisma.StringNullableFilter<"TaskTag"> | string | null taskId?: Prisma.IntFilter<"TaskTag"> | number name?: Prisma.StringFilter<"TaskTag"> | string task?: Prisma.XOR -}, "id"> +}, "id" | "uuid"> export type TaskTagOrderByWithAggregationInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + taskUuid?: Prisma.SortOrderInput | Prisma.SortOrder taskId?: Prisma.SortOrder name?: Prisma.SortOrder _count?: Prisma.TaskTagCountOrderByAggregateInput @@ -241,44 +262,60 @@ export type TaskTagScalarWhereWithAggregatesInput = { OR?: Prisma.TaskTagScalarWhereWithAggregatesInput[] NOT?: Prisma.TaskTagScalarWhereWithAggregatesInput | Prisma.TaskTagScalarWhereWithAggregatesInput[] id?: Prisma.IntWithAggregatesFilter<"TaskTag"> | number + uuid?: Prisma.StringWithAggregatesFilter<"TaskTag"> | string + taskUuid?: Prisma.StringNullableWithAggregatesFilter<"TaskTag"> | string | null taskId?: Prisma.IntWithAggregatesFilter<"TaskTag"> | number name?: Prisma.StringWithAggregatesFilter<"TaskTag"> | string } export type TaskTagCreateInput = { + uuid: string + taskUuid?: string | null name: string task: Prisma.TaskCreateNestedOneWithoutTagsInput } export type TaskTagUncheckedCreateInput = { id?: number + uuid: string + taskUuid?: string | null taskId: number name: string } export type TaskTagUpdateInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + taskUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null name?: Prisma.StringFieldUpdateOperationsInput | string task?: Prisma.TaskUpdateOneRequiredWithoutTagsNestedInput } export type TaskTagUncheckedUpdateInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + taskUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null taskId?: Prisma.IntFieldUpdateOperationsInput | number name?: Prisma.StringFieldUpdateOperationsInput | string } export type TaskTagCreateManyInput = { id?: number + uuid: string + taskUuid?: string | null taskId: number name: string } export type TaskTagUpdateManyMutationInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + taskUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null name?: Prisma.StringFieldUpdateOperationsInput | string } export type TaskTagUncheckedUpdateManyInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + taskUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null taskId?: Prisma.IntFieldUpdateOperationsInput | number name?: Prisma.StringFieldUpdateOperationsInput | string } @@ -293,14 +330,10 @@ export type TaskTagOrderByRelationAggregateInput = { _count?: Prisma.SortOrder } -export type TaskTagOrderByRelevanceInput = { - fields: Prisma.TaskTagOrderByRelevanceFieldEnum | Prisma.TaskTagOrderByRelevanceFieldEnum[] - sort: Prisma.SortOrder - search: string -} - export type TaskTagCountOrderByAggregateInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + taskUuid?: Prisma.SortOrder taskId?: Prisma.SortOrder name?: Prisma.SortOrder } @@ -312,12 +345,16 @@ export type TaskTagAvgOrderByAggregateInput = { export type TaskTagMaxOrderByAggregateInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + taskUuid?: Prisma.SortOrder taskId?: Prisma.SortOrder name?: Prisma.SortOrder } export type TaskTagMinOrderByAggregateInput = { id?: Prisma.SortOrder + uuid?: Prisma.SortOrder + taskUuid?: Prisma.SortOrder taskId?: Prisma.SortOrder name?: Prisma.SortOrder } @@ -370,11 +407,15 @@ export type TaskTagUncheckedUpdateManyWithoutTaskNestedInput = { } export type TaskTagCreateWithoutTaskInput = { + uuid: string + taskUuid?: string | null name: string } export type TaskTagUncheckedCreateWithoutTaskInput = { id?: number + uuid: string + taskUuid?: string | null name: string } @@ -409,26 +450,36 @@ export type TaskTagScalarWhereInput = { OR?: Prisma.TaskTagScalarWhereInput[] NOT?: Prisma.TaskTagScalarWhereInput | Prisma.TaskTagScalarWhereInput[] id?: Prisma.IntFilter<"TaskTag"> | number + uuid?: Prisma.StringFilter<"TaskTag"> | string + taskUuid?: Prisma.StringNullableFilter<"TaskTag"> | string | null taskId?: Prisma.IntFilter<"TaskTag"> | number name?: Prisma.StringFilter<"TaskTag"> | string } export type TaskTagCreateManyTaskInput = { id?: number + uuid: string + taskUuid?: string | null name: string } export type TaskTagUpdateWithoutTaskInput = { + uuid?: Prisma.StringFieldUpdateOperationsInput | string + taskUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null name?: Prisma.StringFieldUpdateOperationsInput | string } export type TaskTagUncheckedUpdateWithoutTaskInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + taskUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null name?: Prisma.StringFieldUpdateOperationsInput | string } export type TaskTagUncheckedUpdateManyWithoutTaskInput = { id?: Prisma.IntFieldUpdateOperationsInput | number + uuid?: Prisma.StringFieldUpdateOperationsInput | string + taskUuid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null name?: Prisma.StringFieldUpdateOperationsInput | string } @@ -436,23 +487,49 @@ export type TaskTagUncheckedUpdateManyWithoutTaskInput = { export type TaskTagSelect = runtime.Types.Extensions.GetSelect<{ id?: boolean + uuid?: boolean + taskUuid?: boolean taskId?: boolean name?: boolean task?: boolean | Prisma.TaskDefaultArgs }, ExtArgs["result"]["taskTag"]> +export type TaskTagSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + uuid?: boolean + taskUuid?: boolean + taskId?: boolean + name?: boolean + task?: boolean | Prisma.TaskDefaultArgs +}, ExtArgs["result"]["taskTag"]> +export type TaskTagSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + uuid?: boolean + taskUuid?: boolean + taskId?: boolean + name?: boolean + task?: boolean | Prisma.TaskDefaultArgs +}, ExtArgs["result"]["taskTag"]> export type TaskTagSelectScalar = { id?: boolean + uuid?: boolean + taskUuid?: boolean taskId?: boolean name?: boolean } -export type TaskTagOmit = runtime.Types.Extensions.GetOmit<"id" | "taskId" | "name", ExtArgs["result"]["taskTag"]> +export type TaskTagOmit = runtime.Types.Extensions.GetOmit<"id" | "uuid" | "taskUuid" | "taskId" | "name", ExtArgs["result"]["taskTag"]> export type TaskTagInclude = { task?: boolean | Prisma.TaskDefaultArgs } +export type TaskTagIncludeCreateManyAndReturn = { + task?: boolean | Prisma.TaskDefaultArgs +} +export type TaskTagIncludeUpdateManyAndReturn = { + task?: boolean | Prisma.TaskDefaultArgs +} export type $TaskTagPayload = { name: "TaskTag" @@ -461,6 +538,8 @@ export type $TaskTagPayload @@ -580,6 +659,30 @@ export interface TaskTagDelegate(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Create many TaskTags and returns the data saved in the database. + * @param {TaskTagCreateManyAndReturnArgs} args - Arguments to create many TaskTags. + * @example + * // Create many TaskTags + * const taskTag = await prisma.taskTag.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many TaskTags and only return the `id` + * const taskTagWithIdOnly = await prisma.taskTag.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + /** * Delete a TaskTag. * @param {TaskTagDeleteArgs} args - Arguments to delete one TaskTag. @@ -644,6 +747,36 @@ export interface TaskTagDelegate(args: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Update zero or more TaskTags and returns the data updated in the database. + * @param {TaskTagUpdateManyAndReturnArgs} args - Arguments to update many TaskTags. + * @example + * // Update many TaskTags + * const taskTag = await prisma.taskTag.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more TaskTags and only return the `id` + * const taskTagWithIdOnly = await prisma.taskTag.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + /** * Create or update one TaskTag. * @param {TaskTagUpsertArgs} args - Arguments to update or create a TaskTag. @@ -834,6 +967,8 @@ export interface Prisma__TaskTagClient + readonly uuid: Prisma.FieldRef<"TaskTag", 'String'> + readonly taskUuid: Prisma.FieldRef<"TaskTag", 'String'> readonly taskId: Prisma.FieldRef<"TaskTag", 'Int'> readonly name: Prisma.FieldRef<"TaskTag", 'String'> } @@ -1073,6 +1208,29 @@ export type TaskTagCreateManyArgs = { + /** + * Select specific fields to fetch from the TaskTag + */ + select?: Prisma.TaskTagSelectCreateManyAndReturn | null + /** + * Omit specific fields from the TaskTag + */ + omit?: Prisma.TaskTagOmit | null + /** + * The data used to create many TaskTags. + */ + data: Prisma.TaskTagCreateManyInput | Prisma.TaskTagCreateManyInput[] + skipDuplicates?: boolean + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.TaskTagIncludeCreateManyAndReturn | null +} + /** * TaskTag update */ @@ -1117,6 +1275,36 @@ export type TaskTagUpdateManyArgs = { + /** + * Select specific fields to fetch from the TaskTag + */ + select?: Prisma.TaskTagSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the TaskTag + */ + omit?: Prisma.TaskTagOmit | null + /** + * The data used to update TaskTags. + */ + data: Prisma.XOR + /** + * Filter which TaskTags to update + */ + where?: Prisma.TaskTagWhereInput + /** + * Limit how many TaskTags to update. + */ + limit?: number + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.TaskTagIncludeUpdateManyAndReturn | null +} + /** * TaskTag upsert */ diff --git a/generated/prisma/models/User.ts b/generated/prisma/models/User.ts index a45fb22..b3f6961 100644 --- a/generated/prisma/models/User.ts +++ b/generated/prisma/models/User.ts @@ -251,7 +251,6 @@ export type UserOrderByWithRelationInput = { assignedTasks?: Prisma.TaskOrderByRelationAggregateInput createdTasks?: Prisma.TaskOrderByRelationAggregateInput taskMembers?: Prisma.TaskMemberOrderByRelationAggregateInput - _relevance?: Prisma.UserOrderByRelevanceInput } export type UserWhereUniqueInput = Prisma.AtLeast<{ @@ -397,12 +396,6 @@ export type UserUncheckedUpdateManyInput = { updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } -export type UserOrderByRelevanceInput = { - fields: Prisma.UserOrderByRelevanceFieldEnum | Prisma.UserOrderByRelevanceFieldEnum[] - sort: Prisma.SortOrder - search: string -} - export type UserCountOrderByAggregateInput = { id?: Prisma.SortOrder name?: Prisma.SortOrder @@ -1454,7 +1447,23 @@ export type UserSelect }, ExtArgs["result"]["user"]> +export type UserSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + name?: boolean + email?: boolean + password?: boolean + createdAt?: boolean + updatedAt?: boolean +}, ExtArgs["result"]["user"]> +export type UserSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + name?: boolean + email?: boolean + password?: boolean + createdAt?: boolean + updatedAt?: boolean +}, ExtArgs["result"]["user"]> export type UserSelectScalar = { id?: boolean @@ -1478,6 +1487,8 @@ export type UserInclude _count?: boolean | Prisma.UserCountOutputTypeDefaultArgs } +export type UserIncludeCreateManyAndReturn = {} +export type UserIncludeUpdateManyAndReturn = {} export type $UserPayload = { name: "User" @@ -1616,6 +1627,30 @@ export interface UserDelegate(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Create many Users and returns the data saved in the database. + * @param {UserCreateManyAndReturnArgs} args - Arguments to create many Users. + * @example + * // Create many Users + * const user = await prisma.user.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many Users and only return the `id` + * const userWithIdOnly = await prisma.user.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + /** * Delete a User. * @param {UserDeleteArgs} args - Arguments to delete one User. @@ -1680,6 +1715,36 @@ export interface UserDelegate(args: Prisma.SelectSubset>): Prisma.PrismaPromise + /** + * Update zero or more Users and returns the data updated in the database. + * @param {UserUpdateManyAndReturnArgs} args - Arguments to update many Users. + * @example + * // Update many Users + * const user = await prisma.user.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more Users and only return the `id` + * const userWithIdOnly = await prisma.user.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + /** * Create or update one User. * @param {UserUpsertArgs} args - Arguments to update or create a User. @@ -2120,6 +2185,25 @@ export type UserCreateManyArgs = { + /** + * Select specific fields to fetch from the User + */ + select?: Prisma.UserSelectCreateManyAndReturn | null + /** + * Omit specific fields from the User + */ + omit?: Prisma.UserOmit | null + /** + * The data used to create many Users. + */ + data: Prisma.UserCreateManyInput | Prisma.UserCreateManyInput[] + skipDuplicates?: boolean +} + /** * User update */ @@ -2164,6 +2248,32 @@ export type UserUpdateManyArgs = { + /** + * Select specific fields to fetch from the User + */ + select?: Prisma.UserSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the User + */ + omit?: Prisma.UserOmit | null + /** + * The data used to update Users. + */ + data: Prisma.XOR + /** + * Filter which Users to update + */ + where?: Prisma.UserWhereInput + /** + * Limit how many Users to update. + */ + limit?: number +} + /** * User upsert */ diff --git a/package-lock.json b/package-lock.json index 1531417..7d94b7b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,14 +1,17 @@ { "name": "iboard", - "version": "1.0.0", + "version": "0.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "iboard", - "version": "1.0.0", + "version": "0.2.0", "dependencies": { - "@prisma/adapter-mariadb": "^7.9.1", + "@journeyapps/wa-sqlite": "^2.0.7", + "@powersync/react": "^2.1.0", + "@powersync/web": "^2.5.0", + "@prisma/adapter-pg": "^7.9.1", "@prisma/client": "^7.7.0", "@zythum02/mijia-api": "^0.1.4", "antd-mobile": "^5.42.3", @@ -1187,6 +1190,11 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@journeyapps/wa-sqlite": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@journeyapps/wa-sqlite/-/wa-sqlite-2.0.8.tgz", + "integrity": "sha512-WRXEms2515S/0DFSWzmlggHu9hSJomhugDUO17rWkL6VpokV/hfjIDLs954Egx/eqrk3WADmiOMzOc7MuJbznQ==" + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -1615,64 +1623,91 @@ "node": "^22.20 || ^24.12 || >=25" } }, - "node_modules/@prisma/adapter-mariadb": { - "version": "7.9.1", - "resolved": "https://registry.npmjs.org/@prisma/adapter-mariadb/-/adapter-mariadb-7.9.1.tgz", - "integrity": "sha512-4aZUbIg2av7XFSQyM9cQeAp9YP9HiPr8H7ehe2rDo375IZXILEzQrNXZ/zLetgRQ2ojlaUl/brArFdOVS3n1xA==", + "node_modules/@powersync/common": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@powersync/common/-/common-2.4.0.tgz", + "integrity": "sha512-ngVogy+B8NQeI5l+0Es8qMxnGozUie8Q6R4+0/AHA3oBAhDG5UmeYw/LquTzZJSOPnCmvGgFSqovblV+JKzxKQ==", + "license": "Apache-2.0" + }, + "node_modules/@powersync/react": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@powersync/react/-/react-2.1.0.tgz", + "integrity": "sha512-ADIpakSLhstv0F9xrUIF+oCArFnAQPrcB9mNql6xH0Nup9EgBug38Ks+mv3yqbc33z60pBm9tuHs8uSIbkhuqg==", + "license": "Apache-2.0", + "peerDependencies": { + "@powersync/common": "^2.4.0", + "react": "*" + } + }, + "node_modules/@powersync/shared-internals": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@powersync/shared-internals/-/shared-internals-1.4.0.tgz", + "integrity": "sha512-OiqqDuW6tePW4Ed7C5IWutBKrtcqKuTMlVMQNwUZtKtqr7ZrqKlb+YP5l4niuz8mpqDYo3/HNU0dpc+3mneSBQ==", + "license": "Apache-2.0", + "peerDependencies": { + "@powersync/common": "^2.4.0" + } + }, + "node_modules/@powersync/web": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@powersync/web/-/web-2.5.0.tgz", + "integrity": "sha512-/K2ZUjIdqvtFeoLfPetPcE+uioShBWzrTrOa8hpoZ7i62S8wgj47i+VPnKTXI7WQmXuxTGGZFUFnahinf6wjPg==", "license": "Apache-2.0", "dependencies": { - "@prisma/driver-adapter-utils": "7.9.1", - "mariadb": "3.4.5" - } - }, - "node_modules/@prisma/adapter-mariadb/node_modules/@types/node": { - "version": "24.13.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", - "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", - "license": "MIT", - "dependencies": { - "undici-types": "~7.18.0" - } - }, - "node_modules/@prisma/adapter-mariadb/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "@journeyapps/wa-sqlite": "2.0.7", + "@powersync/common": "2.4.0", + "@powersync/shared-internals": "1.4.0", + "comlink": "^4.4.2", + "commander": "^12.1.0" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@prisma/adapter-mariadb/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/@prisma/adapter-mariadb/node_modules/mariadb": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/mariadb/-/mariadb-3.4.5.tgz", - "integrity": "sha512-gThTYkhIS5rRqkVr+Y0cIdzr+GRqJ9sA2Q34e0yzmyhMCwyApf3OKAC1jnF23aSlIOqJuyaUFUcj7O1qZslmmQ==", - "license": "LGPL-2.1-or-later", - "dependencies": { - "@types/geojson": "^7946.0.16", - "@types/node": "^24.0.13", - "denque": "^2.1.0", - "iconv-lite": "^0.6.3", - "lru-cache": "^10.4.3" + "bin": { + "powersync-web": "bin/powersync.cjs" }, - "engines": { - "node": ">= 14" + "peerDependencies": { + "@powersync/common": "^2.4.0", + "@powersync/shared-internals": "^1.4.0" } }, - "node_modules/@prisma/adapter-mariadb/node_modules/undici-types": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", - "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", - "license": "MIT" + "node_modules/@powersync/web/node_modules/@journeyapps/wa-sqlite": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@journeyapps/wa-sqlite/-/wa-sqlite-2.0.7.tgz", + "integrity": "sha512-mc6xUricl4QB2s8QTRGS+FofSr1cjwDtf6dPXAdMBuGWodjfEgkSJGDPWQ7zVqgc7hMfXYLT7WIfEBAxara8YA==" + }, + "node_modules/@powersync/web/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@prisma/adapter-pg": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@prisma/adapter-pg/-/adapter-pg-7.10.1.tgz", + "integrity": "sha512-EP9ruPYHjKP80WZlb5qVaEXKgZjJieBFjAxcBtQnDAHD6+16UN4keVmBh6L/RUpuDQT2FQRbvKNgq5d4Ix+IkQ==", + "license": "Apache-2.0", + "dependencies": { + "@prisma/driver-adapter-utils": "7.10.1", + "@types/pg": "^8.16.0", + "pg": "^8.16.3", + "postgres-array": "3.0.4" + } + }, + "node_modules/@prisma/adapter-pg/node_modules/@prisma/debug": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-7.10.1.tgz", + "integrity": "sha512-eFCAkGZ13D/qPg48JBlG5IWi9cSBBOC7oG3abDPcAkYioDWlIjh0YJJLK2J7qo5S+xWWD8I6egAN/8KbCaiMCA==", + "license": "Apache-2.0" + }, + "node_modules/@prisma/adapter-pg/node_modules/@prisma/driver-adapter-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@prisma/driver-adapter-utils/-/driver-adapter-utils-7.10.1.tgz", + "integrity": "sha512-DJ4c6xvVnm3s9ZUyql9nCUicADSqyvH+CjXRCM9L6m5zJxCNmebCElG6X4irICq3rosBwlX+S19Dxq/4IrZk3A==", + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "7.10.1" + } }, "node_modules/@prisma/client": { "version": "7.7.0", @@ -1747,21 +1782,6 @@ "zeptomatch": "2.1.0" } }, - "node_modules/@prisma/driver-adapter-utils": { - "version": "7.9.1", - "resolved": "https://registry.npmjs.org/@prisma/driver-adapter-utils/-/driver-adapter-utils-7.9.1.tgz", - "integrity": "sha512-vmHehG7nn/heW32DXXpp13DxxAxVVe6n250oEt3dOL2E/4bt3olktKZN0mzSuxMMronyMSkbeW2uCOn3F4g8RQ==", - "license": "Apache-2.0", - "dependencies": { - "@prisma/debug": "7.9.1" - } - }, - "node_modules/@prisma/driver-adapter-utils/node_modules/@prisma/debug": { - "version": "7.9.1", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-7.9.1.tgz", - "integrity": "sha512-/cpVZ4itxtcgB8GHBvZtcmuEjq+lWsLrRJxFMbwZrT1RIdtuKmUm7PPGo/wzfbYpBrk+9WmmBE8CHJw2rybKDQ==", - "license": "Apache-2.0" - }, "node_modules/@prisma/engines": { "version": "7.7.0", "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-7.7.0.tgz", @@ -2867,6 +2887,17 @@ "undici-types": "~8.3.0" } }, + "node_modules/@types/pg": { + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.23.1.tgz", + "integrity": "sha512-fKVHpikPdg4GKks3JuLEhvwSyvwzF23hnabPy6DD8ljVbC7+6J5dQzdv4arV6jqq57djnMgs1HKBxX4P8aBI3A==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, "node_modules/@types/react": { "version": "19.2.14", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", @@ -3193,6 +3224,20 @@ "integrity": "sha512-YOf0VSj5nUPI27doTtXF+BBnsiRq3qY7avHqfIWnppxTLGyvkLq1QV2RTxkwoZwJ60ywLfZ0raFF4J/G886i7A==", "license": "MIT" }, + "node_modules/better-sqlite3": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-13.0.3.tgz", + "integrity": "sha512-RbOBxmLBG8uvFUc15X9+9SFemKcQ0WBuISBVkpuiaUB2qblC8UWlHEjdWVoZ8AdhSwmoEgsiXKfopX0CQxaACQ==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "node-addon-api": "^8.0.0" + }, + "engines": { + "node": ">=22" + } + }, "node_modules/body-parser": { "version": "1.20.6", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.6.tgz", @@ -3575,6 +3620,12 @@ "node": ">= 0.8" } }, + "node_modules/comlink": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.2.tgz", + "integrity": "sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==", + "license": "Apache-2.0" + }, "node_modules/commander": { "version": "13.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", @@ -5362,6 +5413,17 @@ "node": ">= 0.6" } }, + "node_modules/node-addon-api": { + "version": "8.9.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.9.2.tgz", + "integrity": "sha512-VijLXbi3UACN69I0JVXJsX4tjACjNoQDgv2gTF6sx2wWEi8tkSg2eX8p5gSIFi8z2+DL3oHmY6OyKce38SDolg==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, "node_modules/node-cron": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-3.0.3.tgz", @@ -5579,6 +5641,104 @@ "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", "license": "MIT" }, + "node_modules/pg": { + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.23.1.tgz", + "integrity": "sha512-aL96AHANtWjPLDOLqnhx+ngp9+UK7ETEU8VJrDCGvsSSi/mGLcWYsS6Herg7lmaBJe4uwrfqsa7gTEFaSizDoQ==", + "license": "MIT", + "dependencies": { + "pg-connection-string": "^2.14.1", + "pg-pool": "^3.14.0", + "pg-protocol": "^1.16.1", + "pg-types": "2.2.0", + "pgpass": "1.0.5" + }, + "engines": { + "node": ">= 16.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.4.1" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.4.1.tgz", + "integrity": "sha512-6PQbsFWZcp9EmJEwy5cGQ2La+AMWpP46lgbb8X+U/XsHIUweYDNCpeuKck5RxL2MdVFi7krbbEi5nX4Zh7JhrQ==", + "license": "MIT", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.14.1.tgz", + "integrity": "sha512-qR3kGNPBLpCNtz0evbKA0Y/MRFXwSSdT+pTJvYp/bXTcReZbvX1kzF0IyTc1QnxqF7AZbOeBhNL8R5mYQZV/MA==", + "license": "MIT" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.14.0.tgz", + "integrity": "sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw==", + "license": "MIT", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.16.1.tgz", + "integrity": "sha512-p9VOFMiHB/ZbJATetbg+99PxssTVSQRnyuPSQ67mN1+1KBOjZaZ83ZQzltnxPhJwSsC3nwVjJ10DVJlerbFzLg==", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pg-types/node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "license": "MIT", + "dependencies": { + "split2": "^4.1.0" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -5619,6 +5779,45 @@ "url": "https://github.com/sponsors/porsager" } }, + "node_modules/postgres-array": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.4.tgz", + "integrity": "sha512-nAUSGfSDGOaOAEGwqsRY27GPOea7CNipJPOA7lPbdEpx5Kg3qzdP0AaWC5MlhTWV9s4hFX39nomVZ+C4tnGOJQ==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", + "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/prisma": { "version": "7.7.0", "resolved": "https://registry.npmjs.org/prisma/-/prisma-7.7.0.tgz", @@ -6470,6 +6669,15 @@ "node": ">=0.10.0" } }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -6938,6 +7146,15 @@ } } }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index b690597..f9245ac 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,10 @@ "publish": "bash scripts/wsl/build-apk.sh release" }, "dependencies": { - "@prisma/adapter-mariadb": "^7.9.1", + "@journeyapps/wa-sqlite": "^2.0.7", + "@powersync/react": "^2.1.0", + "@powersync/web": "^2.5.0", + "@prisma/adapter-pg": "^7.9.1", "@prisma/client": "^7.7.0", "@zythum02/mijia-api": "^0.1.4", "antd-mobile": "^5.42.3", diff --git a/prisma/migrations/20260409135419_init/migration.sql b/prisma/migrations/20260409135419_init/migration.sql deleted file mode 100644 index c463b12..0000000 --- a/prisma/migrations/20260409135419_init/migration.sql +++ /dev/null @@ -1,62 +0,0 @@ --- CreateTable -CREATE TABLE `User` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `name` VARCHAR(191) NOT NULL, - `email` VARCHAR(191) NOT NULL, - `password` VARCHAR(191) NOT NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - UNIQUE INDEX `User_email_key`(`email`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `Article` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `title` VARCHAR(191) NOT NULL, - `slug` VARCHAR(191) NOT NULL, - `content` VARCHAR(191) NOT NULL, - `date` VARCHAR(191) NOT NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - UNIQUE INDEX `Article_slug_key`(`slug`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `Strategy` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `name` VARCHAR(191) NOT NULL, - `description` VARCHAR(191) NOT NULL, - `data` JSON NOT NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `Indicator` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `name` VARCHAR(191) NOT NULL, - `groupName` VARCHAR(191) NOT NULL, - `data` JSON NOT NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `SowInventory` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `month` VARCHAR(191) NOT NULL, - `inventory` INTEGER NOT NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - UNIQUE INDEX `SowInventory_month_key`(`month`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; diff --git a/prisma/migrations/20260409135954_rename_sow_inventory/migration.sql b/prisma/migrations/20260409135954_rename_sow_inventory/migration.sql deleted file mode 100644 index 76bead8..0000000 --- a/prisma/migrations/20260409135954_rename_sow_inventory/migration.sql +++ /dev/null @@ -1,20 +0,0 @@ -/* - Warnings: - - - You are about to drop the `SowInventory` table. If the table is not empty, all the data it contains will be lost. - -*/ --- DropTable -DROP TABLE `SowInventory`; - --- CreateTable -CREATE TABLE `Econ_SowInventory` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `month` VARCHAR(191) NOT NULL, - `inventory` INTEGER NOT NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - UNIQUE INDEX `Econ_SowInventory_month_key`(`month`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; diff --git a/prisma/migrations/20260417122901_add_scraper_cache/migration.sql b/prisma/migrations/20260417122901_add_scraper_cache/migration.sql deleted file mode 100644 index d7210d8..0000000 --- a/prisma/migrations/20260417122901_add_scraper_cache/migration.sql +++ /dev/null @@ -1,13 +0,0 @@ --- CreateTable -CREATE TABLE `ScraperCache` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `scraperName` VARCHAR(191) NOT NULL, - `lastDataHash` VARCHAR(191) NULL, - `lastUpdateAt` DATETIME(3) NOT NULL, - `metadata` JSON NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - UNIQUE INDEX `ScraperCache_scraperName_key`(`scraperName`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; diff --git a/prisma/migrations/20260803144851_add_unique_name/migration.sql b/prisma/migrations/20260803144851_add_unique_name/migration.sql deleted file mode 100644 index 0ef93bc..0000000 --- a/prisma/migrations/20260803144851_add_unique_name/migration.sql +++ /dev/null @@ -1,5 +0,0 @@ --- Add unique constraint on Strategy.name to enable idempotent upsert in seed script -ALTER TABLE `Strategy` ADD UNIQUE INDEX `Strategy_name_key`(`name`); - --- Add unique constraint on Indicator.name to enable idempotent upsert in seed script -ALTER TABLE `Indicator` ADD UNIQUE INDEX `Indicator_name_key`(`name`); \ No newline at end of file diff --git a/prisma/migrations/20260806120000_indicator_points/migration.sql b/prisma/migrations/20260806120000_indicator_points/migration.sql deleted file mode 100644 index b0f587f..0000000 --- a/prisma/migrations/20260806120000_indicator_points/migration.sql +++ /dev/null @@ -1,24 +0,0 @@ --- 经济指标: 明细数据拆到独立表, 兼容年/季/月/日频率 --- 第一步: 建 IndicatorPoint 表 + Indicator 加元数据列 (data 列暂保留, 由迁移脚本搬运后删除) - --- CreateTable -CREATE TABLE `IndicatorPoint` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `indicatorId` INTEGER NOT NULL, - `period` VARCHAR(191) NOT NULL, - `value` DOUBLE NOT NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - UNIQUE INDEX `IndicatorPoint_indicatorId_period_key`(`indicatorId`, `period`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- AlterTable: 元数据列 (data JSON 拆出) -ALTER TABLE `Indicator` ADD COLUMN `title` VARCHAR(191) NOT NULL DEFAULT '', -ADD COLUMN `unit` VARCHAR(191) NOT NULL DEFAULT '', -ADD COLUMN `source` VARCHAR(191) NOT NULL DEFAULT '', -ADD COLUMN `frequency` VARCHAR(191) NOT NULL DEFAULT 'month'; - --- AddForeignKey -ALTER TABLE `IndicatorPoint` ADD CONSTRAINT `IndicatorPoint_indicatorId_fkey` FOREIGN KEY (`indicatorId`) REFERENCES `Indicator`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20260806121000_drop_indicator_data_json/migration.sql b/prisma/migrations/20260806121000_drop_indicator_data_json/migration.sql deleted file mode 100644 index 07c9664..0000000 --- a/prisma/migrations/20260806121000_drop_indicator_data_json/migration.sql +++ /dev/null @@ -1,3 +0,0 @@ --- 第二步: 明细数据已迁移到 IndicatorPoint, 删除 Indicator.data JSON 列 --- AlterTable -ALTER TABLE `Indicator` DROP COLUMN `data`; diff --git a/prisma/migrations/20260806123000_add_indicator_hidden/migration.sql b/prisma/migrations/20260806123000_add_indicator_hidden/migration.sql deleted file mode 100644 index f54a938..0000000 --- a/prisma/migrations/20260806123000_add_indicator_hidden/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- 指标隐藏标记: 数据与获取脚本保留, 前端展示过滤 hidden=true -ALTER TABLE `Indicator` ADD COLUMN `hidden` BOOLEAN NOT NULL DEFAULT false; diff --git a/prisma/migrations/20260806130000_news_and_alerts/migration.sql b/prisma/migrations/20260806130000_news_and_alerts/migration.sql deleted file mode 100644 index 6c9aeaa..0000000 --- a/prisma/migrations/20260806130000_news_and_alerts/migration.sql +++ /dev/null @@ -1,32 +0,0 @@ --- CreateTable -CREATE TABLE `News` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `title` VARCHAR(191) NOT NULL, - `summary` VARCHAR(191) NOT NULL DEFAULT '', - `source` VARCHAR(191) NOT NULL DEFAULT '', - `url` VARCHAR(191) NOT NULL DEFAULT '', - `publishedAt` DATETIME(3) NOT NULL, - `impactRank` INTEGER NOT NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - - UNIQUE INDEX `News_title_publishedAt_key`(`title`, `publishedAt`), - INDEX `News_publishedAt_idx`(`publishedAt`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `Alert` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `indicatorName` VARCHAR(191) NOT NULL, - `period` VARCHAR(191) NOT NULL, - `valueA` DOUBLE NOT NULL, - `valueB` DOUBLE NOT NULL, - `sourceA` VARCHAR(191) NOT NULL, - `sourceB` VARCHAR(191) NOT NULL, - `diff` DOUBLE NOT NULL, - `diffRatio` DOUBLE NOT NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - - INDEX `Alert_createdAt_idx`(`createdAt`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; diff --git a/prisma/migrations/20260806140000_monitors/migration.sql b/prisma/migrations/20260806140000_monitors/migration.sql deleted file mode 100644 index cc08bec..0000000 --- a/prisma/migrations/20260806140000_monitors/migration.sql +++ /dev/null @@ -1,68 +0,0 @@ --- 服务器监控 + 服务健康检查 --- CreateTable -CREATE TABLE `ServerNode` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `uuid` VARCHAR(191) NOT NULL, - `name` VARCHAR(191) NOT NULL, - `cpuName` VARCHAR(191) NOT NULL DEFAULT '', - `os` VARCHAR(191) NOT NULL DEFAULT '', - `region` VARCHAR(191) NOT NULL DEFAULT '', - `memTotal` BIGINT NOT NULL DEFAULT 0, - `diskTotal` BIGINT NOT NULL DEFAULT 0, - `cpuCores` INTEGER NOT NULL DEFAULT 0, - `cpuUsage` DOUBLE NOT NULL DEFAULT 0, - `ramUsed` BIGINT NOT NULL DEFAULT 0, - `swapUsed` BIGINT NOT NULL DEFAULT 0, - `load1` DOUBLE NOT NULL DEFAULT 0, - `load5` DOUBLE NOT NULL DEFAULT 0, - `load15` DOUBLE NOT NULL DEFAULT 0, - `diskUsed` BIGINT NOT NULL DEFAULT 0, - `netIn` BIGINT NOT NULL DEFAULT 0, - `netOut` BIGINT NOT NULL DEFAULT 0, - `uptime` BIGINT NOT NULL DEFAULT 0, - `process` INTEGER NOT NULL DEFAULT 0, - `connections` INTEGER NOT NULL DEFAULT 0, - `status` VARCHAR(191) NOT NULL DEFAULT 'unknown', - `recordedAt` DATETIME(3) NOT NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - UNIQUE INDEX `ServerNode_uuid_key`(`uuid`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `ServerNodeHistory` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `uuid` VARCHAR(191) NOT NULL, - `period` DATETIME(3) NOT NULL, - `cpu` DOUBLE NOT NULL DEFAULT 0, - `ram` BIGINT NOT NULL DEFAULT 0, - `load` DOUBLE NOT NULL DEFAULT 0, - `disk` BIGINT NOT NULL DEFAULT 0, - `netIn` BIGINT NOT NULL DEFAULT 0, - `netOut` BIGINT NOT NULL DEFAULT 0, - `process` INTEGER NOT NULL DEFAULT 0, - `connections` INTEGER NOT NULL DEFAULT 0, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - - UNIQUE INDEX `ServerNodeHistory_uuid_period_key`(`uuid`, `period`), - INDEX `ServerNodeHistory_uuid_period_idx`(`uuid`, `period`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `ServiceCheck` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `name` VARCHAR(191) NOT NULL, - `url` VARCHAR(191) NOT NULL, - `status` VARCHAR(191) NOT NULL DEFAULT 'unknown', - `latencyMs` INTEGER NOT NULL DEFAULT 0, - `message` VARCHAR(191) NOT NULL DEFAULT '', - `lastCheckAt` DATETIME(3) NOT NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - UNIQUE INDEX `ServiceCheck_name_key`(`name`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; diff --git a/prisma/migrations/20260806150000_add_news_content/migration.sql b/prisma/migrations/20260806150000_add_news_content/migration.sql deleted file mode 100644 index 143486d..0000000 --- a/prisma/migrations/20260806150000_add_news_content/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable (news.content 全文, 须在 news_and_alerts 建表之后执行) -ALTER TABLE `News` ADD COLUMN `content` TEXT NULL; diff --git a/prisma/migrations/20260807104432_add_oil_price_history/migration.sql b/prisma/migrations/20260807104432_add_oil_price_history/migration.sql deleted file mode 100644 index f2377cf..0000000 --- a/prisma/migrations/20260807104432_add_oil_price_history/migration.sql +++ /dev/null @@ -1,17 +0,0 @@ --- 浙江省油价历史表 --- - date: 调价日次日 (即数据实际抓取日, 便于按时间排序) --- - province + fuel: 浙江 / 92/95/0 --- - unique (date, province, fuel): 防 cron 重复入库 --- - DOUBLE 容纳 999.999 元/升 -CREATE TABLE OilPriceHistory ( - id INT NOT NULL AUTO_INCREMENT, - date DATETIME(3) NOT NULL, - province VARCHAR(191) NOT NULL, - fuel VARCHAR(8) NOT NULL, - price DOUBLE NOT NULL, - source VARCHAR(191) NOT NULL DEFAULT 'apizero', - createdAt DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - PRIMARY KEY (id), - UNIQUE INDEX OilPriceHistory_date_province_fuel_key(date, province, fuel), - INDEX OilPriceHistory_province_fuel_date_idx(province, fuel, date) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; diff --git a/prisma/migrations/20260920120000_add_mihome_env/migration.sql b/prisma/migrations/20260920120000_add_mihome_env/migration.sql deleted file mode 100644 index bb64515..0000000 --- a/prisma/migrations/20260920120000_add_mihome_env/migration.sql +++ /dev/null @@ -1,95 +0,0 @@ --- CreateTable -CREATE TABLE `MihomeAccount` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `key` VARCHAR(191) NOT NULL DEFAULT 'default', - `userId` VARCHAR(191) NOT NULL DEFAULT '', - `status` VARCHAR(191) NOT NULL DEFAULT 'unknown', - `lastError` VARCHAR(191) NOT NULL DEFAULT '', - `updatedAt` DATETIME(3) NOT NULL, - - UNIQUE INDEX `MihomeAccount_key_key`(`key`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `MihomeHome` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `homeId` VARCHAR(191) NOT NULL, - `name` VARCHAR(191) NOT NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - - UNIQUE INDEX `MihomeHome_homeId_key`(`homeId`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `MihomeDevice` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `did` VARCHAR(191) NOT NULL, - `homeId` VARCHAR(191) NOT NULL, - `model` VARCHAR(191) NOT NULL, - `name` VARCHAR(191) NOT NULL, - `alias` VARCHAR(191) NULL, - `tempSiid` INTEGER NOT NULL, - `tempPiid` INTEGER NOT NULL, - `humSiid` INTEGER NOT NULL, - `humPiid` INTEGER NOT NULL, - `battSiid` INTEGER NOT NULL, - `battPiid` INTEGER NOT NULL, - `battery` INTEGER NULL, - `batteryAt` DATETIME(3) NULL, - `enabled` BOOLEAN NOT NULL DEFAULT true, - `lastSyncAt` DATETIME(3) NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - - UNIQUE INDEX `MihomeDevice_did_key`(`did`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `MihomeEnvSample` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `deviceId` INTEGER NOT NULL, - `date` DATETIME(3) NOT NULL, - `temperature` DOUBLE NULL, - `humidity` DOUBLE NULL, - `temperatureAvg` DOUBLE NULL, - `humidityAvg` DOUBLE NULL, - `temperatureMin` DOUBLE NULL, - `temperatureMax` DOUBLE NULL, - `humidityMin` DOUBLE NULL, - `humidityMax` DOUBLE NULL, - `origin` VARCHAR(191) NOT NULL DEFAULT 'live', - `sampledAt` DATETIME(3) NULL, - `raw` JSON NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - - INDEX `MihomeEnvSample_deviceId_date_idx`(`deviceId`, `date`), - UNIQUE INDEX `MihomeEnvSample_deviceId_date_key`(`deviceId`, `date`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `MihomeEnvHour` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `deviceId` INTEGER NOT NULL, - `hour` DATETIME(3) NOT NULL, - `temperatureAvg` DOUBLE NULL, - `humidityAvg` DOUBLE NULL, - `raw` JSON NULL, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - - INDEX `MihomeEnvHour_deviceId_hour_idx`(`deviceId`, `hour`), - UNIQUE INDEX `MihomeEnvHour_deviceId_hour_key`(`deviceId`, `hour`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- AddForeignKey -ALTER TABLE `MihomeDevice` ADD CONSTRAINT `MihomeDevice_homeId_fkey` FOREIGN KEY (`homeId`) REFERENCES `MihomeHome`(`homeId`) ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `MihomeEnvSample` ADD CONSTRAINT `MihomeEnvSample_deviceId_fkey` FOREIGN KEY (`deviceId`) REFERENCES `MihomeDevice`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `MihomeEnvHour` ADD CONSTRAINT `MihomeEnvHour_deviceId_fkey` FOREIGN KEY (`deviceId`) REFERENCES `MihomeDevice`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - diff --git a/prisma/migrations/20261022120000_add_checkin_checklist/migration.sql b/prisma/migrations/20261022120000_add_checkin_checklist/migration.sql deleted file mode 100644 index ca4361e..0000000 --- a/prisma/migrations/20261022120000_add_checkin_checklist/migration.sql +++ /dev/null @@ -1,99 +0,0 @@ --- CreateTable -CREATE TABLE `Habit` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `userId` INTEGER NOT NULL, - `name` VARCHAR(191) NOT NULL, - `period` VARCHAR(191) NOT NULL DEFAULT 'day', - `target` INTEGER NOT NULL DEFAULT 1, - `color` VARCHAR(191) NOT NULL DEFAULT '#1677ff', - `icon` VARCHAR(191) NOT NULL DEFAULT '', - `note` VARCHAR(191) NOT NULL DEFAULT '', - `archived` BOOLEAN NOT NULL DEFAULT false, - `sortOrder` INTEGER NOT NULL DEFAULT 0, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - INDEX `Habit_userId_archived_sortOrder_idx`(`userId`, `archived`, `sortOrder`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `CheckIn` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `habitId` INTEGER NOT NULL, - `userId` INTEGER NOT NULL, - `date` VARCHAR(10) NOT NULL, - `seq` INTEGER NOT NULL DEFAULT 1, - `note` VARCHAR(191) NOT NULL DEFAULT '', - `source` VARCHAR(191) NOT NULL DEFAULT 'user', - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - - UNIQUE INDEX `CheckIn_habitId_date_seq_key`(`habitId`, `date`, `seq`), - INDEX `CheckIn_userId_date_idx`(`userId`, `date`), - INDEX `CheckIn_habitId_date_idx`(`habitId`, `date`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `CheckList` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `userId` INTEGER NOT NULL, - `title` VARCHAR(191) NOT NULL, - `scene` VARCHAR(191) NOT NULL DEFAULT '', - `note` VARCHAR(191) NOT NULL DEFAULT '', - `archived` BOOLEAN NOT NULL DEFAULT false, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - INDEX `CheckList_userId_archived_idx`(`userId`, `archived`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `CheckListItem` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `listId` INTEGER NOT NULL, - `title` VARCHAR(191) NOT NULL, - `note` VARCHAR(191) NOT NULL DEFAULT '', - `done` BOOLEAN NOT NULL DEFAULT false, - `doneAt` DATETIME(3) NULL, - `sortOrder` INTEGER NOT NULL DEFAULT 0, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - INDEX `CheckListItem_listId_sortOrder_idx`(`listId`, `sortOrder`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `CheckListTemplate` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `userId` INTEGER NULL, - `name` VARCHAR(191) NOT NULL, - `scene` VARCHAR(191) NOT NULL DEFAULT '', - `items` JSON NOT NULL, - `builtin` BOOLEAN NOT NULL DEFAULT false, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - INDEX `CheckListTemplate_userId_builtin_idx`(`userId`, `builtin`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- AddForeignKey -ALTER TABLE `Habit` ADD CONSTRAINT `Habit_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `CheckIn` ADD CONSTRAINT `CheckIn_habitId_fkey` FOREIGN KEY (`habitId`) REFERENCES `Habit`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `CheckIn` ADD CONSTRAINT `CheckIn_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `CheckList` ADD CONSTRAINT `CheckList_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `CheckListItem` ADD CONSTRAINT `CheckListItem_listId_fkey` FOREIGN KEY (`listId`) REFERENCES `CheckList`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `CheckListTemplate` ADD CONSTRAINT `CheckListTemplate_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20261024120000_add_task_module/migration.sql b/prisma/migrations/20261024120000_add_task_module/migration.sql deleted file mode 100644 index d114a65..0000000 --- a/prisma/migrations/20261024120000_add_task_module/migration.sql +++ /dev/null @@ -1,126 +0,0 @@ --- 任务模块 (V0.2): 项目 / 成员 / 看板列 / 任务 / 任务成员 / 标签 --- 设计口径见 docs/V0.2/任务模块/任务模块数据库设计文档.md - --- CreateTable -CREATE TABLE `Project` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `name` VARCHAR(50) NOT NULL, - `ownerId` INTEGER NOT NULL, - `isPersonal` BOOLEAN NOT NULL DEFAULT false, - `archived` BOOLEAN NOT NULL DEFAULT false, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - INDEX `Project_ownerId_idx`(`ownerId`), - INDEX `Project_archived_idx`(`archived`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `ProjectMember` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `projectId` INTEGER NOT NULL, - `userId` INTEGER NOT NULL, - `permission` VARCHAR(191) NOT NULL DEFAULT 'member', - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - - UNIQUE INDEX `ProjectMember_projectId_userId_key`(`projectId`, `userId`), - INDEX `ProjectMember_userId_idx`(`userId`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `BoardColumn` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `projectId` INTEGER NOT NULL, - `name` VARCHAR(20) NOT NULL, - `sortOrder` INTEGER NOT NULL DEFAULT 0, - `boundStatus` VARCHAR(8) NULL, - `retention` VARCHAR(8) NOT NULL DEFAULT 'forever', - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - UNIQUE INDEX `BoardColumn_projectId_name_key`(`projectId`, `name`), - INDEX `BoardColumn_projectId_sortOrder_idx`(`projectId`, `sortOrder`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `Task` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `projectId` INTEGER NOT NULL, - `columnId` INTEGER NOT NULL, - `parentId` INTEGER NULL, - `title` VARCHAR(200) NOT NULL, - `description` TEXT NOT NULL, - `status` VARCHAR(8) NOT NULL DEFAULT 'todo', - `doneAt` DATETIME(3) NULL, - `assigneeId` INTEGER NULL, - `creatorId` INTEGER NOT NULL, - `extras` JSON NOT NULL, - `sortOrder` INTEGER NOT NULL DEFAULT 0, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - INDEX `Task_projectId_columnId_idx`(`projectId`, `columnId`), - INDEX `Task_projectId_status_idx`(`projectId`, `status`), - INDEX `Task_parentId_idx`(`parentId`), - INDEX `Task_projectId_doneAt_idx`(`projectId`, `doneAt`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `TaskMember` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `taskId` INTEGER NOT NULL, - `userId` INTEGER NOT NULL, - - UNIQUE INDEX `TaskMember_taskId_userId_key`(`taskId`, `userId`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `TaskTag` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `taskId` INTEGER NOT NULL, - `name` VARCHAR(20) NOT NULL, - - INDEX `TaskTag_taskId_idx`(`taskId`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- AddForeignKey -ALTER TABLE `Project` ADD CONSTRAINT `Project_ownerId_fkey` FOREIGN KEY (`ownerId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `ProjectMember` ADD CONSTRAINT `ProjectMember_projectId_fkey` FOREIGN KEY (`projectId`) REFERENCES `Project`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `ProjectMember` ADD CONSTRAINT `ProjectMember_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `BoardColumn` ADD CONSTRAINT `BoardColumn_projectId_fkey` FOREIGN KEY (`projectId`) REFERENCES `Project`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `Task` ADD CONSTRAINT `Task_projectId_fkey` FOREIGN KEY (`projectId`) REFERENCES `Project`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `Task` ADD CONSTRAINT `Task_columnId_fkey` FOREIGN KEY (`columnId`) REFERENCES `BoardColumn`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `Task` ADD CONSTRAINT `Task_parentId_fkey` FOREIGN KEY (`parentId`) REFERENCES `Task`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `Task` ADD CONSTRAINT `Task_assigneeId_fkey` FOREIGN KEY (`assigneeId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `Task` ADD CONSTRAINT `Task_creatorId_fkey` FOREIGN KEY (`creatorId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `TaskMember` ADD CONSTRAINT `TaskMember_taskId_fkey` FOREIGN KEY (`taskId`) REFERENCES `Task`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `TaskMember` ADD CONSTRAINT `TaskMember_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `TaskTag` ADD CONSTRAINT `TaskTag_taskId_fkey` FOREIGN KEY (`taskId`) REFERENCES `Task`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20261024130000_add_project_notes/migration.sql b/prisma/migrations/20261024130000_add_project_notes/migration.sql deleted file mode 100644 index 990c210..0000000 --- a/prisma/migrations/20261024130000_add_project_notes/migration.sql +++ /dev/null @@ -1,7 +0,0 @@ --- 项目信息块 (T-PJ-13): Project 增加 notes JSON, 存 [{ title, content }] 任意多个长文本块 --- 分三步保证存量行安全: 先可空加列 -> 回填 '[]' -> 收紧为 NOT NULL -ALTER TABLE `Project` ADD COLUMN `notes` JSON NULL; - -UPDATE `Project` SET `notes` = '[]' WHERE `notes` IS NULL; - -ALTER TABLE `Project` MODIFY `notes` JSON NOT NULL; diff --git a/prisma/migrations/20261025030000_task_kind/migration.sql b/prisma/migrations/20261025030000_task_kind/migration.sql deleted file mode 100644 index 4527e01..0000000 --- a/prisma/migrations/20261025030000_task_kind/migration.sql +++ /dev/null @@ -1,3 +0,0 @@ --- 任务类型标签: 项目级自定义列表 + 任务上的类型 -ALTER TABLE `Project` ADD COLUMN `taskKinds` JSON NULL; -ALTER TABLE `Task` ADD COLUMN `kind` VARCHAR(20) NULL; diff --git a/prisma/migrations/20261025120000_task_mark_date/migration.sql b/prisma/migrations/20261025120000_task_mark_date/migration.sql deleted file mode 100644 index 2581ee0..0000000 --- a/prisma/migrations/20261025120000_task_mark_date/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- 任务时间标记: 完整日期存储, 前端展示 MM-dd -ALTER TABLE `Task` ADD COLUMN `markDate` DATETIME(3) NULL; diff --git a/prisma/migrations/20261025130000_project_icon/migration.sql b/prisma/migrations/20261025130000_project_icon/migration.sql deleted file mode 100644 index 927fb23..0000000 --- a/prisma/migrations/20261025130000_project_icon/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- 项目图标: data URL (客户端裁剪 96x96 JPEG, 约 10-20KB) -ALTER TABLE `Project` ADD COLUMN `icon` TEXT NULL; diff --git a/prisma/migrations/20261026000000_postgres_baseline/migration.sql b/prisma/migrations/20261026000000_postgres_baseline/migration.sql new file mode 100644 index 0000000..87c1af5 --- /dev/null +++ b/prisma/migrations/20261026000000_postgres_baseline/migration.sql @@ -0,0 +1,655 @@ +-- CreateSchema +CREATE SCHEMA IF NOT EXISTS "public"; + +-- CreateTable +CREATE TABLE "User" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "email" TEXT NOT NULL, + "password" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Article" ( + "id" SERIAL NOT NULL, + "title" TEXT NOT NULL, + "slug" TEXT NOT NULL, + "content" TEXT NOT NULL, + "date" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Article_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Strategy" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "description" TEXT NOT NULL, + "data" JSONB NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Strategy_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Indicator" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "groupName" TEXT NOT NULL, + "title" TEXT NOT NULL DEFAULT '', + "unit" TEXT NOT NULL DEFAULT '', + "source" TEXT NOT NULL DEFAULT '', + "frequency" TEXT NOT NULL DEFAULT 'month', + "hidden" BOOLEAN NOT NULL DEFAULT false, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Indicator_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "IndicatorPoint" ( + "id" SERIAL NOT NULL, + "indicatorId" INTEGER NOT NULL, + "period" TEXT NOT NULL, + "value" DOUBLE PRECISION NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "IndicatorPoint_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "News" ( + "id" SERIAL NOT NULL, + "title" TEXT NOT NULL, + "summary" TEXT NOT NULL DEFAULT '', + "content" TEXT, + "source" TEXT NOT NULL DEFAULT '', + "url" TEXT NOT NULL DEFAULT '', + "publishedAt" TIMESTAMP(3) NOT NULL, + "impactRank" INTEGER NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "News_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Alert" ( + "id" SERIAL NOT NULL, + "indicatorName" TEXT NOT NULL, + "period" TEXT NOT NULL, + "valueA" DOUBLE PRECISION NOT NULL, + "valueB" DOUBLE PRECISION NOT NULL, + "sourceA" TEXT NOT NULL, + "sourceB" TEXT NOT NULL, + "diff" DOUBLE PRECISION NOT NULL, + "diffRatio" DOUBLE PRECISION NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Alert_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ServerNode" ( + "id" SERIAL NOT NULL, + "uuid" TEXT NOT NULL, + "name" TEXT NOT NULL, + "cpuName" TEXT NOT NULL DEFAULT '', + "os" TEXT NOT NULL DEFAULT '', + "region" TEXT NOT NULL DEFAULT '', + "memTotal" BIGINT NOT NULL DEFAULT 0, + "diskTotal" BIGINT NOT NULL DEFAULT 0, + "cpuCores" INTEGER NOT NULL DEFAULT 0, + "cpuUsage" DOUBLE PRECISION NOT NULL DEFAULT 0, + "ramUsed" BIGINT NOT NULL DEFAULT 0, + "swapUsed" BIGINT NOT NULL DEFAULT 0, + "load1" DOUBLE PRECISION NOT NULL DEFAULT 0, + "load5" DOUBLE PRECISION NOT NULL DEFAULT 0, + "load15" DOUBLE PRECISION NOT NULL DEFAULT 0, + "diskUsed" BIGINT NOT NULL DEFAULT 0, + "netIn" BIGINT NOT NULL DEFAULT 0, + "netOut" BIGINT NOT NULL DEFAULT 0, + "uptime" BIGINT NOT NULL DEFAULT 0, + "process" INTEGER NOT NULL DEFAULT 0, + "connections" INTEGER NOT NULL DEFAULT 0, + "status" TEXT NOT NULL DEFAULT 'unknown', + "recordedAt" TIMESTAMP(3) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "ServerNode_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ServerNodeHistory" ( + "id" SERIAL NOT NULL, + "uuid" TEXT NOT NULL, + "period" TIMESTAMP(3) NOT NULL, + "cpu" DOUBLE PRECISION NOT NULL DEFAULT 0, + "ram" BIGINT NOT NULL DEFAULT 0, + "load" DOUBLE PRECISION NOT NULL DEFAULT 0, + "disk" BIGINT NOT NULL DEFAULT 0, + "netIn" BIGINT NOT NULL DEFAULT 0, + "netOut" BIGINT NOT NULL DEFAULT 0, + "process" INTEGER NOT NULL DEFAULT 0, + "connections" INTEGER NOT NULL DEFAULT 0, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "ServerNodeHistory_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ServiceCheck" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "url" TEXT NOT NULL, + "status" TEXT NOT NULL DEFAULT 'unknown', + "latencyMs" INTEGER NOT NULL DEFAULT 0, + "message" TEXT NOT NULL DEFAULT '', + "lastCheckAt" TIMESTAMP(3) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "ServiceCheck_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Econ_SowInventory" ( + "id" SERIAL NOT NULL, + "month" TEXT NOT NULL, + "inventory" INTEGER NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Econ_SowInventory_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ScraperCache" ( + "id" SERIAL NOT NULL, + "scraperName" TEXT NOT NULL, + "lastDataHash" TEXT, + "lastUpdateAt" TIMESTAMP(3) NOT NULL, + "metadata" JSONB, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "ScraperCache_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "OilPriceHistory" ( + "id" SERIAL NOT NULL, + "date" TIMESTAMP(3) NOT NULL, + "province" TEXT NOT NULL, + "fuel" TEXT NOT NULL, + "price" DOUBLE PRECISION NOT NULL, + "source" TEXT NOT NULL DEFAULT 'apizero', + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "OilPriceHistory_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "MihomeAccount" ( + "id" SERIAL NOT NULL, + "key" TEXT NOT NULL DEFAULT 'default', + "userId" TEXT NOT NULL DEFAULT '', + "status" TEXT NOT NULL DEFAULT 'unknown', + "lastError" TEXT NOT NULL DEFAULT '', + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "MihomeAccount_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "MihomeHome" ( + "id" SERIAL NOT NULL, + "homeId" TEXT NOT NULL, + "name" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "MihomeHome_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "MihomeDevice" ( + "id" SERIAL NOT NULL, + "did" TEXT NOT NULL, + "homeId" TEXT NOT NULL, + "model" TEXT NOT NULL, + "name" TEXT NOT NULL, + "alias" TEXT, + "tempSiid" INTEGER NOT NULL, + "tempPiid" INTEGER NOT NULL, + "humSiid" INTEGER NOT NULL, + "humPiid" INTEGER NOT NULL, + "battSiid" INTEGER NOT NULL, + "battPiid" INTEGER NOT NULL, + "battery" INTEGER, + "batteryAt" TIMESTAMP(3), + "enabled" BOOLEAN NOT NULL DEFAULT true, + "lastSyncAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "MihomeDevice_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "MihomeEnvSample" ( + "id" SERIAL NOT NULL, + "deviceId" INTEGER NOT NULL, + "date" TIMESTAMP(3) NOT NULL, + "temperature" DOUBLE PRECISION, + "humidity" DOUBLE PRECISION, + "temperatureAvg" DOUBLE PRECISION, + "humidityAvg" DOUBLE PRECISION, + "temperatureMin" DOUBLE PRECISION, + "temperatureMax" DOUBLE PRECISION, + "humidityMin" DOUBLE PRECISION, + "humidityMax" DOUBLE PRECISION, + "origin" TEXT NOT NULL DEFAULT 'live', + "sampledAt" TIMESTAMP(3), + "raw" JSONB, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "MihomeEnvSample_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "MihomeEnvHour" ( + "id" SERIAL NOT NULL, + "deviceId" INTEGER NOT NULL, + "hour" TIMESTAMP(3) NOT NULL, + "temperatureAvg" DOUBLE PRECISION, + "humidityAvg" DOUBLE PRECISION, + "raw" JSONB, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "MihomeEnvHour_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Habit" ( + "id" SERIAL NOT NULL, + "userId" INTEGER NOT NULL, + "name" TEXT NOT NULL, + "period" TEXT NOT NULL DEFAULT 'day', + "target" INTEGER NOT NULL DEFAULT 1, + "color" TEXT NOT NULL DEFAULT '#1677ff', + "icon" TEXT NOT NULL DEFAULT '', + "note" TEXT NOT NULL DEFAULT '', + "archived" BOOLEAN NOT NULL DEFAULT false, + "sortOrder" INTEGER NOT NULL DEFAULT 0, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Habit_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "CheckIn" ( + "id" SERIAL NOT NULL, + "habitId" INTEGER NOT NULL, + "userId" INTEGER NOT NULL, + "date" VARCHAR(10) NOT NULL, + "seq" INTEGER NOT NULL DEFAULT 1, + "note" TEXT NOT NULL DEFAULT '', + "source" TEXT NOT NULL DEFAULT 'user', + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "CheckIn_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "CheckList" ( + "id" SERIAL NOT NULL, + "userId" INTEGER NOT NULL, + "title" TEXT NOT NULL, + "scene" TEXT NOT NULL DEFAULT '', + "note" TEXT NOT NULL DEFAULT '', + "archived" BOOLEAN NOT NULL DEFAULT false, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "CheckList_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "CheckListItem" ( + "id" SERIAL NOT NULL, + "listId" INTEGER NOT NULL, + "title" TEXT NOT NULL, + "note" TEXT NOT NULL DEFAULT '', + "done" BOOLEAN NOT NULL DEFAULT false, + "doneAt" TIMESTAMP(3), + "sortOrder" INTEGER NOT NULL DEFAULT 0, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "CheckListItem_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "CheckListTemplate" ( + "id" SERIAL NOT NULL, + "userId" INTEGER, + "name" TEXT NOT NULL, + "scene" TEXT NOT NULL DEFAULT '', + "items" JSONB NOT NULL, + "builtin" BOOLEAN NOT NULL DEFAULT false, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "CheckListTemplate_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Project" ( + "id" SERIAL NOT NULL, + "uuid" VARCHAR(36) NOT NULL, + "code" VARCHAR(8) NOT NULL, + "name" VARCHAR(50) NOT NULL, + "ownerId" INTEGER NOT NULL, + "isPersonal" BOOLEAN NOT NULL DEFAULT false, + "archived" BOOLEAN NOT NULL DEFAULT false, + "notes" JSONB NOT NULL DEFAULT '[]', + "taskKinds" JSONB, + "icon" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Project_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ProjectMember" ( + "id" SERIAL NOT NULL, + "uuid" VARCHAR(36) NOT NULL, + "projectId" INTEGER NOT NULL, + "userId" INTEGER NOT NULL, + "permission" TEXT NOT NULL DEFAULT 'member', + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "ProjectMember_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "BoardColumn" ( + "id" SERIAL NOT NULL, + "uuid" VARCHAR(36) NOT NULL, + "projectId" INTEGER NOT NULL, + "name" VARCHAR(20) NOT NULL, + "sortOrder" INTEGER NOT NULL DEFAULT 0, + "boundStatus" VARCHAR(8), + "retention" VARCHAR(8) NOT NULL DEFAULT 'forever', + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "BoardColumn_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Task" ( + "id" SERIAL NOT NULL, + "uuid" VARCHAR(36) NOT NULL, + "projectId" INTEGER NOT NULL, + "columnId" INTEGER NOT NULL, + "parentId" INTEGER, + "title" VARCHAR(200) NOT NULL, + "description" TEXT NOT NULL DEFAULT '', + "kind" VARCHAR(20), + "markDate" TIMESTAMP(3), + "status" VARCHAR(8) NOT NULL DEFAULT 'todo', + "doneAt" TIMESTAMP(3), + "assigneeId" INTEGER, + "creatorId" INTEGER NOT NULL, + "extras" JSONB NOT NULL DEFAULT '[]', + "sortOrder" INTEGER NOT NULL DEFAULT 0, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "number" INTEGER, + + CONSTRAINT "Task_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "TaskMember" ( + "id" SERIAL NOT NULL, + "uuid" VARCHAR(36) NOT NULL, + "taskId" INTEGER NOT NULL, + "userId" INTEGER NOT NULL, + + CONSTRAINT "TaskMember_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "TaskTag" ( + "id" SERIAL NOT NULL, + "uuid" VARCHAR(36) NOT NULL, + "taskId" INTEGER NOT NULL, + "name" VARCHAR(20) NOT NULL, + + CONSTRAINT "TaskTag_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); + +-- CreateIndex +CREATE UNIQUE INDEX "Article_slug_key" ON "Article"("slug"); + +-- CreateIndex +CREATE UNIQUE INDEX "Indicator_name_key" ON "Indicator"("name"); + +-- CreateIndex +CREATE UNIQUE INDEX "IndicatorPoint_indicatorId_period_key" ON "IndicatorPoint"("indicatorId", "period"); + +-- CreateIndex +CREATE INDEX "News_publishedAt_idx" ON "News"("publishedAt"); + +-- CreateIndex +CREATE UNIQUE INDEX "News_title_publishedAt_key" ON "News"("title", "publishedAt"); + +-- CreateIndex +CREATE INDEX "Alert_createdAt_idx" ON "Alert"("createdAt"); + +-- CreateIndex +CREATE UNIQUE INDEX "ServerNode_uuid_key" ON "ServerNode"("uuid"); + +-- CreateIndex +CREATE INDEX "ServerNodeHistory_uuid_period_idx" ON "ServerNodeHistory"("uuid", "period"); + +-- CreateIndex +CREATE UNIQUE INDEX "ServerNodeHistory_uuid_period_key" ON "ServerNodeHistory"("uuid", "period"); + +-- CreateIndex +CREATE UNIQUE INDEX "ServiceCheck_name_key" ON "ServiceCheck"("name"); + +-- CreateIndex +CREATE UNIQUE INDEX "Econ_SowInventory_month_key" ON "Econ_SowInventory"("month"); + +-- CreateIndex +CREATE UNIQUE INDEX "ScraperCache_scraperName_key" ON "ScraperCache"("scraperName"); + +-- CreateIndex +CREATE INDEX "OilPriceHistory_province_fuel_date_idx" ON "OilPriceHistory"("province", "fuel", "date"); + +-- CreateIndex +CREATE UNIQUE INDEX "OilPriceHistory_date_province_fuel_key" ON "OilPriceHistory"("date", "province", "fuel"); + +-- CreateIndex +CREATE UNIQUE INDEX "MihomeAccount_key_key" ON "MihomeAccount"("key"); + +-- CreateIndex +CREATE UNIQUE INDEX "MihomeHome_homeId_key" ON "MihomeHome"("homeId"); + +-- CreateIndex +CREATE UNIQUE INDEX "MihomeDevice_did_key" ON "MihomeDevice"("did"); + +-- CreateIndex +CREATE INDEX "MihomeEnvSample_deviceId_date_idx" ON "MihomeEnvSample"("deviceId", "date"); + +-- CreateIndex +CREATE UNIQUE INDEX "MihomeEnvSample_deviceId_date_key" ON "MihomeEnvSample"("deviceId", "date"); + +-- CreateIndex +CREATE INDEX "MihomeEnvHour_deviceId_hour_idx" ON "MihomeEnvHour"("deviceId", "hour"); + +-- CreateIndex +CREATE UNIQUE INDEX "MihomeEnvHour_deviceId_hour_key" ON "MihomeEnvHour"("deviceId", "hour"); + +-- CreateIndex +CREATE INDEX "Habit_userId_archived_sortOrder_idx" ON "Habit"("userId", "archived", "sortOrder"); + +-- CreateIndex +CREATE INDEX "CheckIn_userId_date_idx" ON "CheckIn"("userId", "date"); + +-- CreateIndex +CREATE INDEX "CheckIn_habitId_date_idx" ON "CheckIn"("habitId", "date"); + +-- CreateIndex +CREATE UNIQUE INDEX "CheckIn_habitId_date_seq_key" ON "CheckIn"("habitId", "date", "seq"); + +-- CreateIndex +CREATE INDEX "CheckList_userId_archived_idx" ON "CheckList"("userId", "archived"); + +-- CreateIndex +CREATE INDEX "CheckListItem_listId_sortOrder_idx" ON "CheckListItem"("listId", "sortOrder"); + +-- CreateIndex +CREATE INDEX "CheckListTemplate_userId_builtin_idx" ON "CheckListTemplate"("userId", "builtin"); + +-- CreateIndex +CREATE UNIQUE INDEX "Project_uuid_key" ON "Project"("uuid"); + +-- CreateIndex +CREATE UNIQUE INDEX "Project_code_key" ON "Project"("code"); + +-- CreateIndex +CREATE INDEX "Project_ownerId_idx" ON "Project"("ownerId"); + +-- CreateIndex +CREATE INDEX "Project_archived_idx" ON "Project"("archived"); + +-- CreateIndex +CREATE UNIQUE INDEX "ProjectMember_uuid_key" ON "ProjectMember"("uuid"); + +-- CreateIndex +CREATE INDEX "ProjectMember_userId_idx" ON "ProjectMember"("userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "ProjectMember_projectId_userId_key" ON "ProjectMember"("projectId", "userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "BoardColumn_uuid_key" ON "BoardColumn"("uuid"); + +-- CreateIndex +CREATE INDEX "BoardColumn_projectId_sortOrder_idx" ON "BoardColumn"("projectId", "sortOrder"); + +-- CreateIndex +CREATE UNIQUE INDEX "BoardColumn_projectId_name_key" ON "BoardColumn"("projectId", "name"); + +-- CreateIndex +CREATE UNIQUE INDEX "Task_uuid_key" ON "Task"("uuid"); + +-- CreateIndex +CREATE INDEX "Task_projectId_columnId_idx" ON "Task"("projectId", "columnId"); + +-- CreateIndex +CREATE INDEX "Task_projectId_status_idx" ON "Task"("projectId", "status"); + +-- CreateIndex +CREATE INDEX "Task_parentId_idx" ON "Task"("parentId"); + +-- CreateIndex +CREATE INDEX "Task_projectId_doneAt_idx" ON "Task"("projectId", "doneAt"); + +-- CreateIndex +CREATE UNIQUE INDEX "Task_projectId_number_key" ON "Task"("projectId", "number"); + +-- CreateIndex +CREATE UNIQUE INDEX "TaskMember_uuid_key" ON "TaskMember"("uuid"); + +-- CreateIndex +CREATE UNIQUE INDEX "TaskMember_taskId_userId_key" ON "TaskMember"("taskId", "userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "TaskTag_uuid_key" ON "TaskTag"("uuid"); + +-- CreateIndex +CREATE INDEX "TaskTag_taskId_idx" ON "TaskTag"("taskId"); + +-- AddForeignKey +ALTER TABLE "IndicatorPoint" ADD CONSTRAINT "IndicatorPoint_indicatorId_fkey" FOREIGN KEY ("indicatorId") REFERENCES "Indicator"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "MihomeDevice" ADD CONSTRAINT "MihomeDevice_homeId_fkey" FOREIGN KEY ("homeId") REFERENCES "MihomeHome"("homeId") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "MihomeEnvSample" ADD CONSTRAINT "MihomeEnvSample_deviceId_fkey" FOREIGN KEY ("deviceId") REFERENCES "MihomeDevice"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "MihomeEnvHour" ADD CONSTRAINT "MihomeEnvHour_deviceId_fkey" FOREIGN KEY ("deviceId") REFERENCES "MihomeDevice"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Habit" ADD CONSTRAINT "Habit_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "CheckIn" ADD CONSTRAINT "CheckIn_habitId_fkey" FOREIGN KEY ("habitId") REFERENCES "Habit"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "CheckIn" ADD CONSTRAINT "CheckIn_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "CheckList" ADD CONSTRAINT "CheckList_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "CheckListItem" ADD CONSTRAINT "CheckListItem_listId_fkey" FOREIGN KEY ("listId") REFERENCES "CheckList"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "CheckListTemplate" ADD CONSTRAINT "CheckListTemplate_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Project" ADD CONSTRAINT "Project_ownerId_fkey" FOREIGN KEY ("ownerId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ProjectMember" ADD CONSTRAINT "ProjectMember_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ProjectMember" ADD CONSTRAINT "ProjectMember_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "BoardColumn" ADD CONSTRAINT "BoardColumn_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Task" ADD CONSTRAINT "Task_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Task" ADD CONSTRAINT "Task_columnId_fkey" FOREIGN KEY ("columnId") REFERENCES "BoardColumn"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Task" ADD CONSTRAINT "Task_parentId_fkey" FOREIGN KEY ("parentId") REFERENCES "Task"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Task" ADD CONSTRAINT "Task_assigneeId_fkey" FOREIGN KEY ("assigneeId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Task" ADD CONSTRAINT "Task_creatorId_fkey" FOREIGN KEY ("creatorId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "TaskMember" ADD CONSTRAINT "TaskMember_taskId_fkey" FOREIGN KEY ("taskId") REFERENCES "Task"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "TaskMember" ADD CONSTRAINT "TaskMember_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "TaskTag" ADD CONSTRAINT "TaskTag_taskId_fkey" FOREIGN KEY ("taskId") REFERENCES "Task"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20261026010000_uuid_fk_mapping/migration.sql b/prisma/migrations/20261026010000_uuid_fk_mapping/migration.sql new file mode 100644 index 0000000..21caf85 --- /dev/null +++ b/prisma/migrations/20261026010000_uuid_fk_mapping/migration.sql @@ -0,0 +1,96 @@ +-- uuid 外键镜像 (PowerSync Sequential ID Mapping, 见 docs/V0.2/离线编辑模块/0.2.1实施方案.md §3) +-- 目的: 同步流以 uuid 作为客户端主键 (离线新建行同步回填后本地 id 稳定不变), +-- 外键列同步输出 uuid 镜像 (别名回 projectId/columnId/parentId/taskId), 客户端零改动。 +-- 镜像列由触发器维护: REST/Prisma 写 int 外键 -> 触发器回填 uuid; upload 端在应用层解析 uuid -> int。 + +-- 1) 加列 (先可空) +ALTER TABLE "BoardColumn" ADD COLUMN "projectUuid" VARCHAR(36); +ALTER TABLE "Task" ADD COLUMN "projectUuid" VARCHAR(36), ADD COLUMN "columnUuid" VARCHAR(36), ADD COLUMN "parentUuid" VARCHAR(36); +ALTER TABLE "ProjectMember" ADD COLUMN "projectUuid" VARCHAR(36); +ALTER TABLE "TaskMember" ADD COLUMN "taskUuid" VARCHAR(36); +ALTER TABLE "TaskTag" ADD COLUMN "taskUuid" VARCHAR(36); + +-- 2) 存量回填 +UPDATE "BoardColumn" c SET "projectUuid" = p."uuid" FROM "Project" p WHERE c."projectId" = p."id"; +UPDATE "Task" t SET "projectUuid" = p."uuid" FROM "Project" p WHERE t."projectId" = p."id"; +UPDATE "Task" t SET "columnUuid" = c."uuid" FROM "BoardColumn" c WHERE t."columnId" = c."id"; +UPDATE "Task" t SET "parentUuid" = pt."uuid" FROM "Task" pt WHERE t."parentId" = pt."id"; +UPDATE "ProjectMember" pm SET "projectUuid" = p."uuid" FROM "Project" p WHERE pm."projectId" = p."id"; +UPDATE "TaskMember" tm SET "taskUuid" = t."uuid" FROM "Task" t WHERE tm."taskId" = t."id"; +UPDATE "TaskTag" tt SET "taskUuid" = t."uuid" FROM "Task" t WHERE tt."taskId" = t."id"; + +-- 3) 非空约束 +ALTER TABLE "BoardColumn" ALTER COLUMN "projectUuid" SET NOT NULL; +ALTER TABLE "Task" ALTER COLUMN "projectUuid" SET NOT NULL; +ALTER TABLE "Task" ALTER COLUMN "columnUuid" SET NOT NULL; +ALTER TABLE "ProjectMember" ALTER COLUMN "projectUuid" SET NOT NULL; +ALTER TABLE "TaskMember" ALTER COLUMN "taskUuid" SET NOT NULL; +ALTER TABLE "TaskTag" ALTER COLUMN "taskUuid" SET NOT NULL; + +-- 4) 外键 (级联与 int 外键一致) +ALTER TABLE "BoardColumn" ADD CONSTRAINT "BoardColumn_projectUuid_fkey" FOREIGN KEY ("projectUuid") REFERENCES "Project"("uuid") ON DELETE CASCADE ON UPDATE CASCADE; +ALTER TABLE "Task" ADD CONSTRAINT "Task_projectUuid_fkey" FOREIGN KEY ("projectUuid") REFERENCES "Project"("uuid") ON DELETE CASCADE ON UPDATE CASCADE; +ALTER TABLE "Task" ADD CONSTRAINT "Task_columnUuid_fkey" FOREIGN KEY ("columnUuid") REFERENCES "BoardColumn"("uuid") ON DELETE CASCADE ON UPDATE CASCADE; +ALTER TABLE "Task" ADD CONSTRAINT "Task_parentUuid_fkey" FOREIGN KEY ("parentUuid") REFERENCES "Task"("uuid") ON DELETE CASCADE ON UPDATE CASCADE; +ALTER TABLE "ProjectMember" ADD CONSTRAINT "ProjectMember_projectUuid_fkey" FOREIGN KEY ("projectUuid") REFERENCES "Project"("uuid") ON DELETE CASCADE ON UPDATE CASCADE; +ALTER TABLE "TaskMember" ADD CONSTRAINT "TaskMember_taskUuid_fkey" FOREIGN KEY ("taskUuid") REFERENCES "Task"("uuid") ON DELETE CASCADE ON UPDATE CASCADE; +ALTER TABLE "TaskTag" ADD CONSTRAINT "TaskTag_taskUuid_fkey" FOREIGN KEY ("taskUuid") REFERENCES "Task"("uuid") ON DELETE CASCADE ON UPDATE CASCADE; + +-- 5) 触发器: 写入时按 int 外键回填 uuid 镜像 +CREATE OR REPLACE FUNCTION "func_projectmember_uuid_map"() RETURNS TRIGGER AS $$ +BEGIN + SELECT "uuid" INTO NEW."projectUuid" FROM "Project" WHERE "id" = NEW."projectId"; + IF NOT FOUND THEN RAISE EXCEPTION 'Project % 不存在', NEW."projectId"; END IF; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; +CREATE TRIGGER "trg_projectmember_uuid_map" BEFORE INSERT OR UPDATE ON "ProjectMember" + FOR EACH ROW EXECUTE FUNCTION "func_projectmember_uuid_map"(); + +CREATE OR REPLACE FUNCTION "func_boardcolumn_uuid_map"() RETURNS TRIGGER AS $$ +BEGIN + SELECT "uuid" INTO NEW."projectUuid" FROM "Project" WHERE "id" = NEW."projectId"; + IF NOT FOUND THEN RAISE EXCEPTION 'Project % 不存在', NEW."projectId"; END IF; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; +CREATE TRIGGER "trg_boardcolumn_uuid_map" BEFORE INSERT OR UPDATE ON "BoardColumn" + FOR EACH ROW EXECUTE FUNCTION "func_boardcolumn_uuid_map"(); + +CREATE OR REPLACE FUNCTION "func_task_uuid_map"() RETURNS TRIGGER AS $$ +BEGIN + SELECT "uuid" INTO NEW."projectUuid" FROM "Project" WHERE "id" = NEW."projectId"; + IF NOT FOUND THEN RAISE EXCEPTION 'Project % 不存在', NEW."projectId"; END IF; + SELECT "uuid" INTO NEW."columnUuid" FROM "BoardColumn" WHERE "id" = NEW."columnId"; + IF NOT FOUND THEN RAISE EXCEPTION 'BoardColumn % 不存在', NEW."columnId"; END IF; + IF NEW."parentId" IS NULL THEN + NEW."parentUuid" := NULL; + ELSE + SELECT "uuid" INTO NEW."parentUuid" FROM "Task" WHERE "id" = NEW."parentId"; + IF NOT FOUND THEN RAISE EXCEPTION 'Task % 不存在', NEW."parentId"; END IF; + END IF; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; +CREATE TRIGGER "trg_task_uuid_map" BEFORE INSERT OR UPDATE ON "Task" + FOR EACH ROW EXECUTE FUNCTION "func_task_uuid_map"(); + +CREATE OR REPLACE FUNCTION "func_taskmember_uuid_map"() RETURNS TRIGGER AS $$ +BEGIN + SELECT "uuid" INTO NEW."taskUuid" FROM "Task" WHERE "id" = NEW."taskId"; + IF NOT FOUND THEN RAISE EXCEPTION 'Task % 不存在', NEW."taskId"; END IF; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; +CREATE TRIGGER "trg_taskmember_uuid_map" BEFORE INSERT OR UPDATE ON "TaskMember" + FOR EACH ROW EXECUTE FUNCTION "func_taskmember_uuid_map"(); + +CREATE OR REPLACE FUNCTION "func_tasktag_uuid_map"() RETURNS TRIGGER AS $$ +BEGIN + SELECT "uuid" INTO NEW."taskUuid" FROM "Task" WHERE "id" = NEW."taskId"; + IF NOT FOUND THEN RAISE EXCEPTION 'Task % 不存在', NEW."taskId"; END IF; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; +CREATE TRIGGER "trg_tasktag_uuid_map" BEFORE INSERT OR UPDATE ON "TaskTag" + FOR EACH ROW EXECUTE FUNCTION "func_tasktag_uuid_map"(); diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml index 592fc0b..044d57c 100644 --- a/prisma/migrations/migration_lock.toml +++ b/prisma/migrations/migration_lock.toml @@ -1,3 +1,3 @@ # Please do not edit this file manually # It should be added in your version-control system (e.g., Git) -provider = "mysql" +provider = "postgresql" diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 420f6e0..d8ef3c2 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -9,7 +9,7 @@ generator client { } datasource db { - provider = "mysql" + provider = "postgresql" } model User { @@ -388,6 +388,8 @@ model CheckListTemplate { model Project { id Int @id @default(autoincrement()) + uuid String @unique @db.VarChar(36) // 同步标识: 客户端生成 (0.2.1 离线编辑, 见 docs/V0.2/离线编辑模块) + code String @unique @db.VarChar(8) // 项目短编号: 用户自拟 2~8 位前缀, 全局唯一, 服务端分配 name String @db.VarChar(50) ownerId Int owner User @relation("ProjectOwner", fields: [ownerId], references: [id], onDelete: Cascade) @@ -409,8 +411,10 @@ model Project { } model ProjectMember { - id Int @id @default(autoincrement()) - projectId Int + id Int @id @default(autoincrement()) + uuid String @unique @db.VarChar(36) // 同步标识: 客户端生成 (0.2.1 离线编辑) + projectUuid String? @db.VarChar(36) // 外键 uuid 镜像 (触发器维护, 库级 NOT NULL) + projectId Int project Project @relation(fields: [projectId], references: [id], onDelete: Cascade) userId Int user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@ -423,6 +427,8 @@ model ProjectMember { model BoardColumn { id Int @id @default(autoincrement()) + uuid String @unique @db.VarChar(36) // 同步标识: 客户端生成 (0.2.1 离线编辑) + projectUuid String? @db.VarChar(36) // projectId 的 uuid 镜像 (触发器维护, 库级 NOT NULL; Prisma 侧可空以便触发器填充) projectId Int project Project @relation(fields: [projectId], references: [id], onDelete: Cascade) name String @db.VarChar(20) @@ -440,6 +446,10 @@ model BoardColumn { model Task { id Int @id @default(autoincrement()) + uuid String @unique @db.VarChar(36) // 同步标识: 客户端生成 (0.2.1 离线编辑) + projectUuid String? @db.VarChar(36) // 外键 uuid 镜像 (触发器维护, 库级 NOT NULL) + columnUuid String? @db.VarChar(36) + parentUuid String? @db.VarChar(36) projectId Int project Project @relation(fields: [projectId], references: [id], onDelete: Cascade) columnId Int @@ -471,6 +481,9 @@ model Task { members TaskMember[] tags TaskTag[] + number Int? // 项目内自增编号 (服务端分配, 展示为 `code-number`); 本地未定号的离线新建任务为空 + + @@unique([projectId, number]) @@index([projectId, columnId]) @@index([projectId, status]) @@index([parentId]) @@ -480,7 +493,9 @@ model Task { } model TaskMember { - id Int @id @default(autoincrement()) + id Int @id @default(autoincrement()) + uuid String @unique @db.VarChar(36) // 同步标识: 客户端生成 (0.2.1 离线编辑) + taskUuid String? @db.VarChar(36) // 外键 uuid 镜像 (触发器维护, 库级 NOT NULL) taskId Int task Task @relation(fields: [taskId], references: [id], onDelete: Cascade) userId Int @@ -490,8 +505,10 @@ model TaskMember { } model TaskTag { - id Int @id @default(autoincrement()) - taskId Int + id Int @id @default(autoincrement()) + uuid String @unique @db.VarChar(36) // 同步标识: 客户端生成 (0.2.1 离线编辑) + taskUuid String? @db.VarChar(36) // 外键 uuid 镜像 (触发器维护, 库级 NOT NULL) + taskId Int task Task @relation(fields: [taskId], references: [id], onDelete: Cascade) name String @db.VarChar(20) diff --git a/scripts/etl-mariadb-to-pg.mjs b/scripts/etl-mariadb-to-pg.mjs new file mode 100644 index 0000000..ee5f178 --- /dev/null +++ b/scripts/etl-mariadb-to-pg.mjs @@ -0,0 +1,201 @@ +// 一次性数据迁移: 现网 MariaDB 只读快照 -> 0.2.1 PostgreSQL +// 运行 (在 app 容器内, 具备 mariadb 驱动与 PG 客户端): +// SRC_DATABASE_URL=mysql://... node scripts/etl-mariadb-to-pg.mjs +// 约束: 源库仅 SELECT; 目标库须为空 (Project 计数为 0), 除非 ETL_FORCE=1 +// 迁移内容见 docs/V0.2/离线编辑模块/0.2.1实施方案.md §6: +// - 任务域 6 表回填 uuid; Project 回填短编号 code; Task 按项目内 (createdAt,id) 顺序回填 number +// - 时序大表 (ServerNodeHistory/MihomeEnv*) 仅取最近 N 条 +// - 显式 id 插入后逐表 setval 校准序列 +import 'dotenv/config' +import crypto from 'node:crypto' +import mariadb from 'mariadb' +import { PrismaPg } from '@prisma/adapter-pg' +import { PrismaClient } from '../generated/prisma/client.ts' + +// 顺序: 先父后子 +const TABLES = [ + ['User', 'user'], + ['Project', 'project'], + ['ProjectMember', 'projectMember'], + ['BoardColumn', 'boardColumn'], + ['Habit', 'habit'], + ['CheckList', 'checkList'], + ['CheckListTemplate', 'checkListTemplate'], + ['CheckListItem', 'checkListItem'], + ['CheckIn', 'checkIn'], + ['Task', 'task'], + ['TaskMember', 'taskMember'], + ['TaskTag', 'taskTag'], + ['Article', 'article'], + ['Strategy', 'strategy'], + ['Indicator', 'indicator'], + ['IndicatorPoint', 'indicatorPoint'], + ['News', 'news'], + ['Alert', 'alert'], + ['ServerNode', 'serverNode'], + ['ServerNodeHistory', 'serverNodeHistory'], + ['ServiceCheck', 'serviceCheck'], + ['Econ_SowInventory', 'econ_SowInventory'], + ['ScraperCache', 'scraperCache'], + ['OilPriceHistory', 'oilPriceHistory'], + ['MihomeAccount', 'mihomeAccount'], + ['MihomeHome', 'mihomeHome'], + ['MihomeDevice', 'mihomeDevice'], + ['MihomeEnvSample', 'mihomeEnvSample'], + ['MihomeEnvHour', 'mihomeEnvHour'], +] + +const ROW_CAP = { ServerNodeHistory: 20000, MihomeEnvSample: 20000, MihomeEnvHour: 20000 } + +const UUID_TABLES = new Set(['Project', 'ProjectMember', 'BoardColumn', 'Task', 'TaskMember', 'TaskTag']) + +function parseUrl(url) { + const u = new URL(url) + return { + host: u.hostname, + port: Number(u.port) || 3306, + user: decodeURIComponent(u.username), + password: decodeURIComponent(u.password), + database: u.pathname.replace(/^\//, ''), + } +} + +function parseJson(v) { + if (v === null || v === undefined || typeof v !== 'string') return v + try { return JSON.parse(v) } catch { return v } +} + +function toBigInt(v) { + if (v === null || v === undefined || typeof v === 'bigint') return v + return BigInt(v) +} + +// MariaDB TINYINT(1) 返回 0/1, Prisma Boolean 需要 true/false +function toBoolean(v) { + if (v === null || v === undefined) return v + return !!v +} + +function randCode(len) { + return crypto.randomBytes(len * 2).toString('hex').toUpperCase().replace(/[^A-Z0-9]/g, '').padEnd(len, 'X').slice(0, len) +} + +async function main() { + const src = process.env.SRC_DATABASE_URL + if (!src) throw new Error('SRC_DATABASE_URL 未配置') + const cfg = parseUrl(src) + + const conn = await mariadb.createConnection({ + host: cfg.host, port: cfg.port, user: cfg.user, password: cfg.password, database: cfg.database, connectTimeout: 8000, + }) + console.log('[etl] 源库已连接 (只读):', `${cfg.host}:${cfg.port}/${cfg.database}`) + + const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL }) + const prisma = new PrismaClient({ adapter }) + + const existing = await prisma.project.count() + if (existing > 0 && process.env.ETL_FORCE !== '1') { + console.log(`[etl] 目标库已有 ${existing} 个项目, 跳过 (ETL_FORCE=1 可强制)`) + await conn.end() + return + } + + // 目标 PG 列清单 (类型感知转换 + 源库多余列丢弃): 现网库可能比本分支 schema 新 + const targetColumns = new Map() + for (const [table] of TABLES) { + const cols = await prisma.$queryRawUnsafe( + `SELECT column_name, data_type FROM information_schema.columns WHERE table_schema = 'public' AND table_name = $1`, + table, + ) + targetColumns.set(table, new Map(cols.map((c) => [c.column_name, c.data_type]))) + } + + function adaptRow(table, r) { + const cols = targetColumns.get(table) + const out = {} + for (const [name, dataType] of cols) { + let v = r[name] + if (v === undefined) v = null + if (dataType === 'boolean') v = toBoolean(v) + else if (dataType === 'bigint') v = toBigInt(v) + else if (dataType === 'json' || dataType === 'jsonb') v = parseJson(v) + out[name] = v + } + return out + } + + // Project.code 回填: 优先按名称推导字母, 冲突加随机尾缀 + const projectRows = await conn.query('SELECT * FROM `Project`') + const usedCodes = new Set() + for (const p of projectRows) { + const letters = String(p.name || '').toUpperCase().replace(/[^A-Z0-9]/g, '') + let cand = '' + for (let i = 0; i < 30 && !cand; i++) { + const base = i === 0 + ? (letters.length >= 2 ? letters.slice(0, 8) : ('P' + String(p.id) + randCode(4)).slice(0, 8)) + : (letters.slice(0, 5) + randCode(3)).slice(0, 8) + if (base.length >= 2 && !usedCodes.has(base)) cand = base + } + if (!cand) cand = randCode(6) + usedCodes.add(cand) + p.code = cand + } + + // Task.number 回填: 项目内按 (createdAt, id) 顺序 1..n + const taskRows = (await conn.query('SELECT * FROM `Task`')).sort((a, b) => { + if (a.projectId !== b.projectId) return a.projectId - b.projectId + const ta = a.createdAt ? new Date(a.createdAt).getTime() : 0 + const tb = b.createdAt ? new Date(b.createdAt).getTime() : 0 + if (ta !== tb) return ta - tb + return a.id - b.id + }) + const taskNumber = new Map() + for (const r of taskRows) { + const key = String(r.projectId) + const next = (taskNumber.get(key) || 0) + 1 + taskNumber.set(key, next) + r.number = next + } + + const counts = {} + for (const [table, model] of TABLES) { + let rows + if (table === 'Project') rows = projectRows + else if (table === 'Task') rows = taskRows + else { + const cap = ROW_CAP[table] + rows = await conn.query(cap ? `SELECT * FROM \`${table}\` ORDER BY id DESC LIMIT ${cap}` : `SELECT * FROM \`${table}\``) + } + if (rows.length) { + const adapted = rows.map((r) => { + if (UUID_TABLES.has(table)) r.uuid = crypto.randomUUID() + return adaptRow(table, r) + }) + const chunk = 500 + for (let i = 0; i < adapted.length; i += chunk) { + await prisma[model].createMany({ data: adapted.slice(i, i + chunk) }) + } + } + counts[table] = rows.length + console.log(`[etl] ${table}: ${rows.length}`) + } + + // 序列校准: 显式插入 id 后必须 setval, 否则新插入主键冲突 + for (const [table] of TABLES) { + await prisma.$executeRawUnsafe( + `SELECT setval(pg_get_serial_sequence('"${table}"', 'id'), COALESCE((SELECT MAX(id) FROM "${table}"), 0) + 1, false)`, + ) + } + + await conn.end() + const summary = { + users: await prisma.user.count(), + projects: await prisma.project.count(), + tasks: await prisma.task.count(), + checkIns: await prisma.checkIn.count(), + news: await prisma.news.count(), + } + console.log('[etl] 完成:', JSON.stringify(summary)) +} + +main().catch((e) => { console.error('[etl] 失败:', e); process.exit(1) }) diff --git a/scripts/verify-powersync-client.mjs b/scripts/verify-powersync-client.mjs new file mode 100644 index 0000000..1875a4e --- /dev/null +++ b/scripts/verify-powersync-client.mjs @@ -0,0 +1,218 @@ +// 0.2.1 闭环验证脚本 (Node 客户端): 同步下行 -> 本地离线写入 -> 上行 -> 服务端编号 -> 同步回填 +// 用法: node scripts/verify-powersync-client.mjs [BASE_URL] [EMAIL] [PASSWORD] +// BASE_URL 默认 http://bh.vps.honor3.com:13001 +// 依赖 (dev-only, 不进服务端镜像; 运行前补装): npm install --no-save @powersync/node better-sqlite3 +// 流程: +// 1. REST 登录 -> /api/powersync/token +// 2. Node SDK 连接 PowerSync, 等待首次同步, 校验 ETL 数据 (项目/任务/编号) +// 3. 本地新建一条验证任务 (number 为空, 模拟离线写入) +// 4. 等待 upload 完成并同步回填 -> 本地行应获得服务端分配的 number +// 5. 清理: 本地删除该任务 (上行级联删除), 恢复数据原状 +import 'dotenv/config' +import crypto from 'node:crypto' +import os from 'node:os' +import path from 'node:path' +import fs from 'node:fs' +import { column, Schema, Table, PowerSyncDatabase, createConsoleLogger, LogLevels } from '@powersync/node' + +const BASE = (process.argv[2] || 'http://bh.vps.honor3.com:13001').replace(/\/+$/, '') +const EMAIL = process.argv[3] || 'admin@iboard.local' +const PASSWORD = process.argv[4] || 'admin123' + +const uuid = () => crypto.randomUUID() +const sleep = (ms) => new Promise((r) => setTimeout(r, ms)) + +// 与 src/lib/powersync/schema.js 同构的最小 schema (验证只用到 Project/Task/TaskTag) +const AppSchema = new Schema({ + Project: new Table({ + uuid: column.text, code: column.text, name: column.text, ownerId: column.text, + isPersonal: column.integer, archived: column.integer, notes: column.text, + taskKinds: column.text, icon: column.text, createdAt: column.text, updatedAt: column.text, + }), + Task: new Table({ + uuid: column.text, projectId: column.text, columnId: column.text, parentId: column.text, + title: column.text, description: column.text, kind: column.text, markDate: column.text, + status: column.text, doneAt: column.text, assigneeId: column.text, creatorId: column.text, + extras: column.text, sortOrder: column.integer, number: column.integer, + createdAt: column.text, updatedAt: column.text, + }), + TaskTag: new Table({ uuid: column.text, taskId: column.text, name: column.text }), + TaskMember: new Table({ uuid: column.text, taskId: column.text, userId: column.text }), + ProjectMember: new Table({ uuid: column.text, projectId: column.text, userId: column.text, permission: column.text, createdAt: column.text }), + BoardColumn: new Table({ + uuid: column.text, projectId: column.text, name: column.text, sortOrder: column.integer, + boundStatus: column.text, retention: column.text, createdAt: column.text, updatedAt: column.text, + }), + User: new Table({ name: column.text, email: column.text }), +}) + +async function api(path, { method = 'GET', token, body } = {}) { + const res = await fetch(BASE + '/api' + path, { + method, + headers: { 'Content-Type': 'application/json', ...(token ? { Authorization: 'Bearer ' + token } : {}) }, + body: body ? JSON.stringify(body) : undefined, + }) + const data = await res.json().catch(() => ({})) + if (!res.ok) throw new Error(`${path} -> ${res.status}: ${data.error || '请求失败'}`) + return data +} + +class Connector { + constructor(appToken, endpoint) { + // appToken: 应用 JWT (调业务 API 上行用); endpoint + sync JWT 由 fetchCredentials 提供 + this.appToken = appToken + this.endpoint = endpoint + } + async fetchCredentials() { + const cred = await api('/powersync/token', { method: 'POST', token: this.appToken }) + return { endpoint: cred.endpoint, token: cred.token } + } + async uploadData(database) { + const batch = await database.getCrudBatch() + if (!batch) return + const ops = [] + for (let i = 0; i < batch.crud.length; i++) { + const op = batch.crud[i] + let data = op.opData || {} + if (op.op !== 'DELETE') { + const row = await database.getOptional(`SELECT * FROM "${op.table}" WHERE id = ?`, [op.id]) + if (row) data = row + } + ops.push({ id: String(i), table: op.table, op: op.op === 'DELETE' ? 'DELETE' : 'PUT', uuid: op.id, data }) + } + const res = await fetch(BASE + '/api/powersync/upload', { + method: 'POST', + headers: { 'Content-Type': 'application/json', Authorization: 'Bearer ' + this.appToken }, + body: JSON.stringify({ ops }), + }) + const out = await res.json().catch(() => ({})) + if (!res.ok) throw new Error('upload failed: ' + JSON.stringify(out)) + const failed = (out.results || []).filter((r) => !r.ok) + if (failed.length) console.log('[verify] upload 部分失败:', JSON.stringify(failed)) + await batch.complete() + } +} + +async function main() { + console.log(`[verify] BASE = ${BASE}`) + const login = await api('/auth/login', { method: 'POST', body: { email: EMAIL, password: PASSWORD } }) + console.log('[verify] 1. 登录 OK, user:', login.user.email) + const cred = await api('/powersync/token', { method: 'POST', token: login.token }) + if (!cred.endpoint) throw new Error('POWERSYNC_URL 未配置 (服务端 /powersync/token 返回空 endpoint)') + console.log('[verify] 2. 同步凭证 OK, endpoint:', cred.endpoint) + + const dbFile = path.join(os.tmpdir(), `iboard-verify-${Date.now()}.db`) + const logger = createConsoleLogger({ minLevel: LogLevels.debug }) + const db = new PowerSyncDatabase({ + schema: AppSchema, + database: { dbFilename: dbFile, databaseWorkerLogLevel: LogLevels.debug }, + sync: { logLevel: LogLevels.debug }, + logger, + }) + db.registerListener({ + statusChanged: (s) => { + const c = s?.dataFlowStatus || {} + console.log(`[verify] sync status: connected=${s?.connected} connecting=${s?.connecting} err=${c.downloadError?.message || c.uploadError?.message || '-'}`) + }, + }) + try { + await db.connect(new Connector(login.token, cred.endpoint)) + console.log('[verify] connect() 已建立') + } catch (e) { + console.error('[verify] connect 失败:', e?.message) + throw e + } + await Promise.race([ + db.waitForFirstSync(), + sleep(45000).then(() => { throw new Error('waitForFirstSync 超时 (45s)') }), + ]).catch(async (e) => { + console.log('[verify] waitForFirstSync 未完成, 轮询内部状态...') + for (let i = 0; i < 10; i++) { + await sleep(3000) + const st = db.currentStatus + const counts = { + projects: (await db.getOptional('SELECT COUNT(*) AS n FROM Project'))?.n, + tasks: (await db.getOptional('SELECT COUNT(*) AS n FROM Task'))?.n, + } + console.log(`[verify] poll#${i}:`, JSON.stringify({ + connected: st?.connected, connecting: st?.connecting, hasSynced: st?.hasSynced, + lastSyncedAt: st?.lastSyncedAt, dl: st?.dataFlowStatus?.downloadError?.message, + ul: st?.dataFlowStatus?.uploadError?.message, ...counts, + })) + if (st?.hasSynced && counts.projects > 0) { + console.log('[verify] 轮询确认同步已完成') + return + } + } + throw e + }) + console.log('[verify] 3. 首次同步完成') + + const projects = await db.getAll('SELECT id, uuid, code, name FROM Project ORDER BY id') + console.log(`[verify] 项目 ${projects.length} 个:`, projects.map((p) => `${p.code || '?'}(${p.name})`).join(', ')) + const tasks = await db.getAll('SELECT COUNT(*) AS n FROM Task') + const numbered = await db.getAll('SELECT COUNT(*) AS n FROM Task WHERE number IS NOT NULL') + console.log(`[verify] 任务 ${tasks[0].n} 条 (已有编号 ${numbered[0].n} 条)`) + if (!projects.length || tasks[0].n === 0) throw new Error('同步数据为空, ETL 未生效?') + + // 本地新建验证任务 (模拟离线写入: number 为空, 等服务端分配) + const target = projects.find((p) => p.code) || projects[0] + const firstCol = await db.get(`SELECT id, boundStatus FROM BoardColumn WHERE projectId = ? ORDER BY sortOrder, id LIMIT 1`, [target.id]) + const marker = `离线闭环验证-${Date.now()}` + const newId = uuid() + const ts = new Date().toISOString() + await db.writeTransaction(async (tx) => { + await tx.execute( + `INSERT INTO Task (id, uuid, projectId, columnId, parentId, title, description, kind, markDate, status, doneAt, assigneeId, creatorId, extras, sortOrder, number, createdAt, updatedAt) + VALUES (?, ?, ?, ?, NULL, ?, '', NULL, NULL, ?, NULL, NULL, ?, '[]', 0, NULL, ?, ?)`, + [newId, newId, target.id, firstCol.id, marker, firstCol.boundStatus || 'todo', String(login.user.id), ts, ts], + ) + }) + console.log(`[verify] 4. 本地写入任务 "${marker}" (number 为空), 等待上行 + 服务端定号 + 同步回填...`) + + let syncedBack = null + for (let i = 0; i < 30; i++) { + await sleep(2000) + const row = await db.getOptional('SELECT number, updatedAt FROM Task WHERE id = ?', [newId]) + const localCheck = await db.getOptional(`SELECT 1 AS x FROM ps_crud LIMIT 1`) + if (!localCheck) { + // 队列已清空 (上行完成); 等待下行回填 number + if (row && row.number != null) { syncedBack = row; break } + if (i > 10 && row && row.number == null) continue + } + } + if (!syncedBack) throw new Error('超时: 未观测到服务端编号回填') + console.log(`[verify] 5. 闭环 OK! 服务端分配编号: ${target.code}-${syncedBack.number} (项目 ${target.code})`) + + // 直接从服务端核对 (REST 视角: REST 仍按 int id 寻址, 通过列表接口按 uuid 匹配) + const plist = await api('/projects', { token: login.token }) + const pj = plist.items.find((p) => p.uuid === target.uuid) + if (!pj) throw new Error('服务端确认失败: 项目列表中找不到目标项目') + const tlist = await api(`/projects/${pj.id}/tasks`, { token: login.token }) + const hit = tlist.items.find((t) => t.uuid === newId) + if (!hit || hit.number == null) throw new Error('服务端确认失败: 任务不存在或未定号') + console.log(`[verify] 6. 服务端确认: number=${hit.number}, uuid=${hit.uuid.slice(0, 13)}...`) + + // 清理验证数据 (本地删除 -> 上行删除) + await db.execute('DELETE FROM Task WHERE id = ?', [newId]) + for (let i = 0; i < 15; i++) { + await sleep(2000) + const left = await db.getOptional('SELECT 1 AS x FROM ps_crud LIMIT 1') + if (!left) break + } + const gone = await api(`/projects/${pj.id}/tasks`, { token: login.token }) + if (!gone.items.some((t) => t.uuid === newId)) console.log('[verify] 7. 验证任务已从服务端清除') + else throw new Error('验证任务删除未同步到服务端') + + db.close() + try { + fs.rmSync(dbFile, { force: true }) + fs.rmSync(dbFile + '-journal', { force: true }) + } catch { /* Windows 下可能被占用, 留在临时目录无害 */ } + console.log('[verify] 全部通过: 下行同步 / 离线写入 / 上行幂等 / 服务端编号 / 回填 / 删除同步') +} + +main().catch((e) => { + console.error('[verify] 失败:', e.message) + process.exit(1) +}) diff --git a/server/db.js b/server/db.js index fbc4299..0541846 100644 --- a/server/db.js +++ b/server/db.js @@ -1,18 +1,7 @@ -// 服务端 Prisma 单例, 使用 mariadb 适配器 +// 服务端 Prisma 单例, 使用 pg 适配器 (0.2.1: 数据库迁移到 PostgreSQL) import 'dotenv/config' -import { PrismaMariaDb } from '@prisma/adapter-mariadb' +import { PrismaPg } from '@prisma/adapter-pg' import { PrismaClient } from '../generated/prisma/client.ts' -function parseDatabaseUrl(url) { - const u = new URL(url) - return { - host: u.hostname, - port: Number(u.port) || 3306, - user: decodeURIComponent(u.username), - password: decodeURIComponent(u.password), - database: u.pathname.replace(/^\//, ''), - } -} - -const adapter = new PrismaMariaDb(parseDatabaseUrl(process.env.DATABASE_URL)) -export const prisma = new PrismaClient({ adapter }) \ No newline at end of file +const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL }) +export const prisma = new PrismaClient({ adapter }) diff --git a/server/index.js b/server/index.js index c4ff9c9..1d803de 100644 --- a/server/index.js +++ b/server/index.js @@ -16,6 +16,7 @@ import checkinRouter from './routes/checkin.js' import checklistsRouter from './routes/checklists.js' import projectsRouter, { columnRouter } from './routes/projects.js' import tasksRouter from './routes/tasks.js' +import powersyncRouter from './routes/powersync.js' const PORT = Number(process.env.PORT) || 3001 const DIST_DIR = path.join(process.cwd(), 'dist') @@ -33,6 +34,8 @@ app.use('/api/auth', authRouter) // OTA 接口是公开的 (检查/下载更新不需要登录), 必须挂载在带 authRequired 的 router 之前, // 否则 /api/ota/* 请求会先进入 dataRouter 等并被 authRequired 以 401 拦截 app.use('/api', otaRouter) +// PowerSync: token 签发 + 离线上行队列 (自带 authRequired, 同样必须挂在带 authRequired 的业务 router 之前) +app.use('/api/powersync', powersyncRouter) app.use('/api', dataRouter) app.use('/api', newsRouter) app.use('/api', alertsRouter) @@ -66,11 +69,13 @@ app.use((err, _req, res, _next) => { res.status(500).json({ error: err.message || '服务器内部错误' }) }) -// 启动定时任务: 每天凌晨 3 点拉取新闻 -import('./cron.js').catch((e) => console.error('[cron] 加载失败:', e.message)) +// 启动定时任务: 每天凌晨 3 点拉取新闻; 0.2.1 验证部署以 DISABLE_CRON=1 关闭 (避免重复外呼) +if (process.env.DISABLE_CRON !== '1') { + import('./cron.js').catch((e) => console.error('[cron] 加载失败:', e.message)) -// 米家环境监控定时调度 (独立注册, 不与 cron.js 绑定, 见 server/mihome/scheduler.js) -import('./mihome/scheduler.js').catch((e) => console.error('[cron] 米家调度注册失败:', e.message)) + // 米家环境监控定时调度 (独立注册, 不与 cron.js 绑定, 见 server/mihome/scheduler.js) + import('./mihome/scheduler.js').catch((e) => console.error('[cron] 米家调度注册失败:', e.message)) +} app.listen(PORT, () => { console.log(`[iboard-api] listening on http://127.0.0.1:${PORT}`) diff --git a/server/routes/powersync.js b/server/routes/powersync.js new file mode 100644 index 0000000..0a6b095 --- /dev/null +++ b/server/routes/powersync.js @@ -0,0 +1,386 @@ +// PowerSync 接入: 同步 token 签发 + 客户端上传队列落地 (0.2.1, 见 docs/V0.2/离线编辑模块/0.2.1实施方案.md) +// 下行由 powersync-service 经 PG 逻辑复制完成; 本文件只负责: +// 1. /token 为已登录用户签发 powersync-service 接受的 JWT (aud=powersync, 独立密钥可选) +// 2. /upload 批量落地客户端离线写操作, 按 uuid 幂等 upsert, 服务端统一分配编号 +import { Router } from 'express' +import jwt from 'jsonwebtoken' +import { prisma } from '../db.js' +import { JWT_SECRET, authRequired } from '../middleware.js' +import { genUuid, normProjectCode, allocProjectCode, withTaskNumber } from '../task-domain/identity.js' + +const router = Router() + +// ---------- 同步 token ---------- +router.post('/token', authRequired, async (req, res, next) => { + try { + const user = await prisma.user.findUnique({ + where: { id: req.user.sub }, + select: { id: true, name: true, email: true }, + }) + if (!user) return res.status(401).json({ error: '用户不存在' }) + const secret = process.env.POWERSYNC_JWT_SECRET || JWT_SECRET + const token = jwt.sign( + { sub: String(user.id), aud: 'powersync', name: user.name, email: user.email }, + secret, + { expiresIn: '12h' }, + ) + res.json({ token, endpoint: process.env.POWERSYNC_URL || '' }) + } catch (e) { next(e) } +}) + +// ---------- 上传队列 ---------- +// 契约: POST { ops: [{ id, table, op: 'PUT'|'DELETE', uuid, data }] } +// table ∈ Project | BoardColumn | ProjectMember | Task | TaskMember | TaskTag +// data 为客户端本地全量行 (列名与客户端 schema 一致); 外键列 (projectId/columnId/parentId/taskId) +// 的值即父行的本地 id = uuid, 服务端据此解析为内部自增 id +// 返回 { results: [{ id, ok, skipped?, error? }] }, 单条失败不影响同批其它 op +const TABLES = ['Project', 'BoardColumn', 'ProjectMember', 'Task', 'TaskMember', 'TaskTag'] +const TABLE_RANK = Object.fromEntries(TABLES.map((t, i) => [t, i])) + +const COLUMN_RETENTIONS = ['never', 'today', '3d', 'week', 'month', 'forever'] +const TASK_STATUSES = ['todo', 'doing', 'done'] +const AUTO_ARCHIVE_OPTIONS = ['3d', '1w', '1m', 'never'] + +function isoTime(v) { + if (!v) return null + const d = new Date(v) + return Number.isNaN(d.getTime()) ? null : d +} + +// LWW: 服务端已有行不早于客户端数据 => 跳过本次覆盖 +function isStale(existing, data) { + const t = isoTime(data?.updatedAt) + if (!t) return false + return existing.updatedAt && existing.updatedAt.getTime() >= t.getTime() +} + +function cleanExtras(v) { + if (!Array.isArray(v)) return [] + return v.slice(0, 50).map((e) => ({ + label: String(e?.label ?? '').slice(0, 40), + value: String(e?.value ?? ''), + url: e?.url ? String(e.url) : '', + })) +} + +function cleanNotes(v) { + if (!Array.isArray(v)) return [] + return v.slice(0, 50).map((n) => ({ + title: String(n?.title ?? '').slice(0, 50), + content: String(n?.content ?? '').slice(0, 20000), + })) +} + +async function applyPut(op, ctx) { + const { userId, assertMember } = ctx + const { table, uuid } = op + const d = op.data || {} + if (!uuid) throw new Error('缺少 uuid') + + if (table === 'Project') { + const existing = await prisma.project.findUnique({ where: { uuid } }) + if (existing) { + if (!(await assertMember(existing.id))) throw new Error('无项目权限') + if (isStale(existing, d)) return { skipped: true } + const data = {} + if (d.name !== undefined) { + const t = String(d.name).trim() + if (!t || t.length > 20) throw new Error('项目名称非法') + data.name = t + } + if (d.archived !== undefined) data.archived = !!d.archived + if (d.notes !== undefined) data.notes = cleanNotes(d.notes) + if (d.autoArchive !== undefined) { + data.autoArchive = AUTO_ARCHIVE_OPTIONS.includes(d.autoArchive) ? d.autoArchive : 'never' + } + if (d.taskKinds !== undefined) { + data.taskKinds = Array.isArray(d.taskKinds) ? d.taskKinds.map((k) => String(k).slice(0, 20)).filter(Boolean) : null + } + if (Object.keys(data).length) await prisma.project.update({ where: { uuid }, data }) + return {} + } + const name = String(d.name || '').trim() + if (!name || name.length > 20) throw new Error('项目名称非法') + const code = normProjectCode(d.code) || (await allocProjectCode(name)) + const row = await prisma.project.create({ + data: { uuid, code, name, ownerId: userId, isPersonal: !!d.isPersonal, archived: !!d.archived }, + }) + return { rowId: row.id, code: row.code } + } + + if (table === 'BoardColumn') { + const existing = await prisma.boardColumn.findUnique({ where: { uuid } }) + if (existing) { + if (!(await assertMember(existing.projectId))) throw new Error('无项目权限') + if (isStale(existing, d)) return { skipped: true } + const data = {} + if (d.name !== undefined) { + const t = String(d.name).trim() + if (!t || t.length > 20) throw new Error('列名非法') + data.name = t + } + if (d.sortOrder !== undefined) data.sortOrder = Number(d.sortOrder) || 0 + if (d.boundStatus !== undefined) data.boundStatus = TASK_STATUSES.includes(d.boundStatus) ? d.boundStatus : null + if (d.retention !== undefined && COLUMN_RETENTIONS.includes(d.retention)) data.retention = d.retention + if (Object.keys(data).length) await prisma.boardColumn.update({ where: { uuid }, data }) + return {} + } + const project = await prisma.project.findUnique({ where: { uuid: d.projectId } }) + if (!project || !(await assertMember(project.id))) throw new Error('项目不存在或无权限') + const name = String(d.name || '').trim() + if (!name || name.length > 20) throw new Error('列名非法') + await prisma.boardColumn.create({ + data: { + uuid, + projectId: project.id, + name, + sortOrder: Number(d.sortOrder) || 0, + boundStatus: TASK_STATUSES.includes(d.boundStatus) ? d.boundStatus : null, + retention: COLUMN_RETENTIONS.includes(d.retention) ? d.retention : 'forever', + }, + }) + return {} + } + + if (table === 'ProjectMember') { + const existing = await prisma.projectMember.findUnique({ where: { uuid } }) + if (existing) { + // 成员关系只增不改: 已存在即视为完成 (幂等) + return { skipped: true } + } + const project = await prisma.project.findUnique({ where: { uuid: d.projectId } }) + if (!project || !(await assertMember(project.id))) throw new Error('项目不存在或无权限') + const target = Number(d.userId) + if (!target) throw new Error('userId 非法') + const dup = await prisma.projectMember.findUnique({ + where: { projectId_userId: { projectId: project.id, userId: target } }, + }) + if (dup) return { skipped: true } + await prisma.projectMember.create({ + data: { uuid, projectId: project.id, userId: target, permission: d.permission === 'admin' ? 'admin' : 'member' }, + }) + return {} + } + + if (table === 'Task') { + const existing = await prisma.task.findUnique({ where: { uuid } }) + if (existing) { + if (!(await assertMember(existing.projectId))) throw new Error('无项目权限') + if (isStale(existing, d)) return { skipped: true } + const data = {} + if (d.title !== undefined) { + const t = String(d.title).trim() + if (!t || t.length > 30) throw new Error('任务标题非法') + data.title = t + } + if (d.description !== undefined) data.description = String(d.description || '') + if (d.kind !== undefined) data.kind = d.kind ? String(d.kind).trim().slice(0, 20) : null + if (d.markDate !== undefined) { + const m = isoTime(d.markDate) + if (d.markDate && !m) throw new Error('时间标记非法') + data.markDate = m + } + if (d.extras !== undefined) data.extras = cleanExtras(d.extras) + if (d.sortOrder !== undefined) data.sortOrder = Number(d.sortOrder) || 0 + if (d.assigneeId !== undefined) data.assigneeId = d.assigneeId ? Number(d.assigneeId) : null + if (d.doneAt !== undefined) data.doneAt = isoTime(d.doneAt) + // 归档状态 (T-ARC): 客户端本地归档/恢复走这里 + if (d.archived !== undefined) data.archived = !!d.archived + if (d.archivedAt !== undefined) data.archivedAt = isoTime(d.archivedAt) + if (d.archiveSource !== undefined) { + data.archiveSource = ['manual', 'auto'].includes(d.archiveSource) ? d.archiveSource : null + } + if (d.columnId !== undefined) { + const col = await prisma.boardColumn.findUnique({ where: { uuid: d.columnId } }) + if (!col || col.projectId !== existing.projectId) throw new Error('看板列不存在') + data.columnId = col.id + } + if (d.parentId !== undefined) { + if (!d.parentId) { + data.parentId = null + } else { + const parent = await prisma.task.findUnique({ where: { uuid: d.parentId } }) + if (!parent || parent.projectId !== existing.projectId) throw new Error('父任务不存在') + if (parent.parentId) throw new Error('仅支持一级子任务') + data.parentId = parent.id + } + } + if (Object.keys(data).length) await prisma.task.update({ where: { uuid }, data }) + return {} + } + // 离线新建: 服务端解析父引用并分配项目内编号 + const project = await prisma.project.findUnique({ where: { uuid: d.projectId } }) + if (!project || !(await assertMember(project.id))) throw new Error('项目不存在或无权限') + const title = String(d.title || '').trim() + if (!title || title.length > 30) throw new Error('任务标题非法') + let columnId = null + if (d.columnId) { + const col = await prisma.boardColumn.findUnique({ where: { uuid: d.columnId } }) + if (!col || col.projectId !== project.id) throw new Error('看板列不存在') + columnId = col.id + } else { + const first = await prisma.boardColumn.findFirst({ + where: { projectId: project.id }, + orderBy: { sortOrder: 'asc' }, + }) + if (!first) throw new Error('项目没有可用的看板列') + columnId = first.id + } + let parentId = null + if (d.parentId) { + const parent = await prisma.task.findUnique({ where: { uuid: d.parentId } }) + if (!parent || parent.projectId !== project.id) throw new Error('父任务不存在') + if (parent.parentId) throw new Error('仅支持一级子任务') + parentId = parent.id + } + const status = TASK_STATUSES.includes(d.status) ? d.status : 'todo' + const base = { + uuid, + projectId: project.id, + columnId, + parentId, + title, + description: String(d.description || ''), + kind: d.kind ? String(d.kind).trim().slice(0, 20) : null, + markDate: isoTime(d.markDate), + status, + assigneeId: d.assigneeId ? Number(d.assigneeId) : null, + creatorId: userId, + extras: cleanExtras(d.extras), + doneAt: status === 'done' ? (isoTime(d.doneAt) || new Date()) : null, + sortOrder: Number(d.sortOrder) || 0, + } + const { value: row } = await withTaskNumber(project.id, (number) => + prisma.task.create({ data: { ...base, number } }), + ) + return { rowId: row.id, number: row.number } + } + + if (table === 'TaskMember') { + const existing = await prisma.taskMember.findUnique({ where: { uuid } }) + if (existing) return { skipped: true } + const task = await prisma.task.findUnique({ where: { uuid: d.taskId } }) + if (!task || !(await assertMember(task.projectId))) throw new Error('任务不存在或无权限') + const uid = Number(d.userId) + if (!uid) throw new Error('userId 非法') + const dup = await prisma.taskMember.findUnique({ + where: { taskId_userId: { taskId: task.id, userId: uid } }, + }) + if (dup) return { skipped: true } + await prisma.taskMember.create({ data: { uuid, taskId: task.id, userId: uid } }) + return {} + } + + if (table === 'TaskTag') { + const existing = await prisma.taskTag.findUnique({ where: { uuid } }) + if (existing) return { skipped: true } + const task = await prisma.task.findUnique({ where: { uuid: d.taskId } }) + if (!task || !(await assertMember(task.projectId))) throw new Error('任务不存在或无权限') + const name = String(d.name || '').trim().slice(0, 20) + if (!name) throw new Error('标签名非法') + const dup = await prisma.taskTag.findFirst({ where: { taskId: task.id, name } }) + if (dup) return { skipped: true } + await prisma.taskTag.create({ data: { uuid, taskId: task.id, name } }) + return {} + } + + throw new Error('未知表: ' + table) +} + +async function applyDelete(op, ctx) { + const { assertMember } = ctx + const { table, uuid } = op + if (!uuid) throw new Error('缺少 uuid') + + if (table === 'Project') { + const row = await prisma.project.findUnique({ where: { uuid }, select: { id: true, isPersonal: true } }) + if (!row) return { skipped: true } + if (!(await assertMember(row.id))) throw new Error('无项目权限') + if (row.isPersonal) throw new Error('个人默认项目不可删除') + await prisma.project.delete({ where: { uuid } }) + return {} + } + if (table === 'BoardColumn') { + const row = await prisma.boardColumn.findUnique({ where: { uuid } }) + if (!row) return { skipped: true } + if (!(await assertMember(row.projectId))) throw new Error('无项目权限') + await prisma.boardColumn.delete({ where: { uuid } }) + return {} + } + if (table === 'ProjectMember') { + const row = await prisma.projectMember.findUnique({ where: { uuid } }) + if (!row) return { skipped: true } + if (!(await assertMember(row.projectId))) throw new Error('无项目权限') + await prisma.projectMember.delete({ where: { uuid } }) + return {} + } + if (table === 'Task') { + const row = await prisma.task.findUnique({ where: { uuid } }) + if (!row) return { skipped: true } + if (!(await assertMember(row.projectId))) throw new Error('无项目权限') + await prisma.task.delete({ where: { uuid } }) + return {} + } + if (table === 'TaskMember') { + const row = await prisma.taskMember.findUnique({ where: { uuid } }) + if (!row) return { skipped: true } + const task = await prisma.task.findUnique({ where: { id: row.taskId }, select: { projectId: true } }) + if (!task || !(await assertMember(task.projectId))) throw new Error('无项目权限') + await prisma.taskMember.delete({ where: { uuid } }) + return {} + } + if (table === 'TaskTag') { + const row = await prisma.taskTag.findUnique({ where: { uuid } }) + if (!row) return { skipped: true } + const task = await prisma.task.findUnique({ where: { id: row.taskId }, select: { projectId: true } }) + if (!task || !(await assertMember(task.projectId))) throw new Error('无项目权限') + await prisma.taskTag.delete({ where: { uuid } }) + return {} + } + throw new Error('未知表: ' + table) +} + +router.post('/upload', authRequired, async (req, res, next) => { + try { + const userId = req.user.sub + const ops = Array.isArray(req.body?.ops) ? req.body.ops : [] + if (!ops.length) return res.status(400).json({ error: 'ops 不能为空' }) + if (ops.length > 500) return res.status(400).json({ error: '单批 ops 过多 (上限 500)' }) + + const memberCache = new Map() + const assertMember = async (projectId) => { + if (!projectId) return false + if (memberCache.has(projectId)) return memberCache.get(projectId) + const ok = !!(await prisma.projectMember.findFirst({ where: { projectId, userId } })) + memberCache.set(projectId, ok) + return ok + } + const ctx = { userId, assertMember } + + // 依赖顺序: 父表先落地 (Project → BoardColumn → ProjectMember → Task → TaskMember/TaskTag); 删除反向 + const rank = (o) => TABLE_RANK[o?.table] ?? 99 + const puts = ops.filter((o) => o && o.op !== 'DELETE').sort((a, b) => rank(a) - rank(b)) + const dels = ops.filter((o) => o && o.op === 'DELETE').sort((a, b) => rank(b) - rank(a)) + + const results = [] + for (const op of puts) { + try { + const extra = await applyPut(op, ctx) + results.push({ id: op.id, ok: true, ...extra }) + } catch (e) { + results.push({ id: op.id, ok: false, error: e.message }) + } + } + for (const op of dels) { + try { + const extra = await applyDelete(op, ctx) + results.push({ id: op.id, ok: true, ...extra }) + } catch (e) { + results.push({ id: op.id, ok: false, error: e.message }) + } + } + res.json({ results }) + } catch (e) { next(e) } +}) + +export default router diff --git a/server/routes/projects.js b/server/routes/projects.js index 3aba959..1ebf194 100644 --- a/server/routes/projects.js +++ b/server/routes/projects.js @@ -3,6 +3,7 @@ import { Router } from 'express' import { prisma } from '../db.js' import { authRequired } from '../middleware.js' import { loadProjectForUser, loadColumns, loadMemberIds } from '../task-domain/access.js' +import { genUuid, withUuid, normProjectCode, allocProjectCode } from '../task-domain/identity.js' const router = Router() router.use(authRequired) @@ -21,7 +22,7 @@ const MAX_NAME = 20 /** 建 4 个默认列 */ async function createDefaultColumns(projectId) { await prisma.boardColumn.createMany({ - data: DEFAULT_COLUMNS.map((c) => ({ ...c, projectId, retention: 'forever' })), + data: withUuid(DEFAULT_COLUMNS.map((c) => ({ ...c, projectId, retention: 'forever' }))), }) } @@ -32,7 +33,14 @@ export async function ensurePersonalProject(userId) { const user = await prisma.user.findUnique({ where: { id: userId }, select: { name: true } }) const name = `${user?.name || '我'}的任务` const project = await prisma.project.create({ - data: { name, ownerId: userId, isPersonal: true, members: { create: { userId } } }, + data: { + name, + ownerId: userId, + isPersonal: true, + uuid: genUuid(), + code: await allocProjectCode(name), + members: { create: { uuid: genUuid(), userId } }, + }, }) await createDefaultColumns(project.id) return project @@ -58,6 +66,8 @@ export function normTaskKinds(v) { function projectSummary(p) { return { id: p.id, + uuid: p.uuid, + code: p.code, name: p.name, ownerId: p.ownerId, isPersonal: p.isPersonal, @@ -96,8 +106,27 @@ router.post('/', async (req, res, next) => { if (!name) return res.status(400).json({ error: '项目名称不能为空' }) if (name.length > MAX_NAME) return res.status(400).json({ error: `项目名称不能超过 ${MAX_NAME} 字` }) + // 项目短编号: 可由客户端自拟 (2~8 位字母数字, 全局唯一), 未提供时按名称自动分配 + let code + const rawCode = req.body?.code + if (rawCode !== undefined && rawCode !== null && String(rawCode).trim() !== '') { + code = normProjectCode(rawCode) + if (!code) return res.status(400).json({ error: '项目编号须为 2~8 位字母数字' }) + const dup = await prisma.project.findUnique({ where: { code } }) + if (dup) return res.status(409).json({ error: `项目编号 ${code} 已被占用` }) + } else { + code = await allocProjectCode(name) + } + const project = await prisma.project.create({ - data: { name, ownerId: userId, isPersonal: false, members: { create: { userId } } }, + data: { + name, + ownerId: userId, + isPersonal: false, + uuid: genUuid(), + code, + members: { create: { uuid: genUuid(), userId } }, + }, }) await createDefaultColumns(project.id) const full = await prisma.project.findUnique({ @@ -139,7 +168,7 @@ router.put('/:id', async (req, res, next) => { const userId = req.user.sub const project = await loadProjectForUser(req.params.id, userId) if (!project) return res.status(404).json({ error: '项目不存在或无权限' }) - const { name, archived, notes, taskKinds, icon, autoArchive } = req.body || {} + const { name, archived, notes, taskKinds, icon, autoArchive, code } = req.body || {} const data = {} if (name !== undefined) { const t = String(name).trim() @@ -147,6 +176,16 @@ router.put('/:id', async (req, res, next) => { if (t.length > MAX_NAME) return res.status(400).json({ error: `项目名称不能超过 ${MAX_NAME} 字` }) data.name = t } + // 项目短编号: 可修改 (2~8 位字母数字, 全局唯一) + if (code !== undefined) { + const c = normProjectCode(code) + if (!c) return res.status(400).json({ error: '项目编号须为 2~8 位字母数字' }) + if (c !== project.code) { + const dup = await prisma.project.findUnique({ where: { code: c } }) + if (dup) return res.status(409).json({ error: `项目编号 ${c} 已被占用` }) + data.code = c + } + } // 任务类型标签: 整体替换; 空数组回落默认 if (taskKinds !== undefined) { if (!Array.isArray(taskKinds)) return res.status(400).json({ error: '任务类型格式非法' }) @@ -215,7 +254,7 @@ router.post('/:id/members', async (req, res, next) => { }) if (exist) return res.status(409).json({ error: '该用户已是项目成员' }) - await prisma.projectMember.create({ data: { projectId: project.id, userId: target.id } }) + await prisma.projectMember.create({ data: { uuid: genUuid(), projectId: project.id, userId: target.id } }) res.json({ ok: true, member: { userId: target.id, name: target.name } }) } catch (e) { next(e) } }) diff --git a/server/routes/tasks.js b/server/routes/tasks.js index ccfa442..019b15a 100644 --- a/server/routes/tasks.js +++ b/server/routes/tasks.js @@ -9,6 +9,7 @@ import { resolveTaskWrite } from '../task-domain/resolveStatus.js' import { filterVisible } from '../task-domain/retention.js' import { copyTask } from '../task-domain/copyTask.js' import { runAutoArchiveForProject } from '../task-domain/archive.js' +import { genUuid, withUuid, withTaskNumber } from '../task-domain/identity.js' const router = Router() router.use(authRequired) @@ -184,28 +185,30 @@ router.post('/projects/:id/tasks', async (req, res, next) => { } const firstCol = columns[0] - const row = await prisma.task.create({ - data: { - projectId: project.id, - columnId: firstCol.id, - parentId: pid, - title: cleanTitle, - description: String(description || ''), - kind: kind ? String(kind).trim().slice(0, 20) : null, - markDate: mark, - status: firstCol.boundStatus || 'todo', - assigneeId: finalAssignee, - creatorId: userId, - extras: [], - members: { - create: (Array.isArray(memberIds) ? memberIds : []) - .map(Number).filter((id) => memberSet.has(id)) - .map((uid) => ({ userId: uid })), - }, - tags: { create: (Array.isArray(tags) ? tags : []).filter(Boolean).map((n) => ({ name: String(n).slice(0, 20) })) }, + const taskData = { + uuid: req.body?.uuid || genUuid(), + projectId: project.id, + columnId: firstCol.id, + parentId: pid, + title: cleanTitle, + description: String(description || ''), + kind: kind ? String(kind).trim().slice(0, 20) : null, + markDate: mark, + status: firstCol.boundStatus || 'todo', + assigneeId: finalAssignee, + creatorId: userId, + extras: [], + members: { + create: withUuid((Array.isArray(memberIds) ? memberIds : []) + .map(Number).filter((id) => memberSet.has(id)) + .map((uid) => ({ userId: uid }))), }, - include: TASK_INCLUDE, - }) + tags: { create: withUuid((Array.isArray(tags) ? tags : []).filter(Boolean).map((n) => ({ name: String(n).slice(0, 20) }))) }, + } + // 项目内自增编号 (展示 `code-number`): 服务端分配, 并发冲突时重取 max+1 重试 + const { value: row } = await withTaskNumber(project.id, (number) => + prisma.task.create({ data: { ...taskData, number }, include: TASK_INCLUDE }), + ) res.json({ item: shape(row) }) } catch (e) { next(e) } }) @@ -333,7 +336,7 @@ router.put('/tasks/:id', async (req, res, next) => { await prisma.taskMember.deleteMany({ where: { taskId: task.id } }) if (ids.length) { await prisma.taskMember.createMany({ - data: ids.map((uid) => ({ taskId: task.id, userId: uid })), + data: withUuid(ids.map((uid) => ({ taskId: task.id, userId: uid }))), }) } } @@ -341,7 +344,7 @@ router.put('/tasks/:id', async (req, res, next) => { await prisma.taskTag.deleteMany({ where: { taskId: task.id } }) const names = body.tags.map((n) => String(n).trim()).filter(Boolean).slice(0, 10) if (names.length) { - await prisma.taskTag.createMany({ data: names.map((name) => ({ taskId: task.id, name: name.slice(0, 20) })) }) + await prisma.taskTag.createMany({ data: withUuid(names.map((name) => ({ taskId: task.id, name: name.slice(0, 20) }))) }) } } diff --git a/server/task-domain/copyTask.js b/server/task-domain/copyTask.js index 1af23f5..fc8cf0b 100644 --- a/server/task-domain/copyTask.js +++ b/server/task-domain/copyTask.js @@ -1,6 +1,7 @@ // 任务模块: 跨项目拷贝 (T-CP-*) // 拷贝而非移动: 新建记录 + 深拷贝子任务, 源任务零改动. import { prisma } from '../db.js' +import { genUuid, withUuid, withTaskNumber } from './identity.js' /** * 拷贝一条任务(含子任务)到目标项目。 @@ -38,6 +39,7 @@ export async function copyTask({ source, targetProject, targetColumns, operatorI const droppedAssignee = source.assigneeId && !memberSet.has(source.assigneeId) ? source.assignee : null const baseData = (extra) => ({ + uuid: genUuid(), projectId: targetProject.id, title: source.title, description: source.description || '', @@ -50,33 +52,39 @@ export async function copyTask({ source, targetProject, targetColumns, operatorI doneAt: source.status === 'done' ? (source.doneAt || new Date()) : null, sortOrder: source.sortOrder ?? 0, tags: { - create: (source.tags || []).map((t) => ({ name: t.name })), + create: withUuid((source.tags || []).map((t) => ({ name: t.name }))), }, }) - const newTask = await prisma.task.create({ - data: { - ...baseData({ columnId: pickColumn(source.columnId) }), - members: { - create: keptMemberIds.map((uid) => ({ userId: uid })), + const { value: newTask } = await withTaskNumber(targetProject.id, (number) => + prisma.task.create({ + data: { + ...baseData({ columnId: pickColumn(source.columnId) }), + number, + members: { + create: withUuid(keptMemberIds.map((uid) => ({ userId: uid }))), + }, }, - }, - }) + }), + ) // 子任务: 同法复制, parentId 指向新父任务 for (const child of source.children || []) { const childMembers = (child.members || []) .filter((m) => memberSet.has(m.userId)) .map((m) => m.userId) - await prisma.task.create({ - data: { - ...baseData({ - columnId: pickColumn(child.columnId), - parentId: newTask.id, - }), - members: { create: childMembers.map((uid) => ({ userId: uid })) }, - }, - }) + await withTaskNumber(targetProject.id, (number) => + prisma.task.create({ + data: { + ...baseData({ + columnId: pickColumn(child.columnId), + parentId: newTask.id, + }), + number, + members: { create: withUuid(childMembers.map((uid) => ({ userId: uid }))) }, + }, + }), + ) } return { diff --git a/server/task-domain/identity.js b/server/task-domain/identity.js new file mode 100644 index 0000000..a0fdc66 --- /dev/null +++ b/server/task-domain/identity.js @@ -0,0 +1,74 @@ +// 任务域同步标识与编号 (0.2.1 离线编辑, 见 docs/V0.2/离线编辑模块/0.2.1实施方案.md) +// 约定: 任务域 6 表均带 uuid(客户端/服务端创建时生成, 上行按 uuid 幂等); +// Project.code 为用户自拟 2~8 位字母数字短编号(存储大写, 全局唯一); +// Task.number 为项目内自增编号, 服务端分配, 展示 `code-number`。 +import crypto from 'node:crypto' +import { prisma } from '../db.js' + +/** 同步标识: 服务端创建行时统一生成 uuid */ +export function genUuid() { + return crypto.randomUUID() +} + +/** 为多行数据补 uuid (createMany 前用) */ +export function withUuid(rows) { + return rows.map((r) => ({ ...r, uuid: r.uuid || genUuid() })) +} + +// 项目编号: 2~8 位字母数字, 存储统一大写 (任务展示 `编号-序号`, 不允许连字符) +const CODE_RE = /^[A-Z0-9]{2,8}$/ + +/** 归一化项目编号; 非法返回 null */ +export function normProjectCode(v) { + const s = String(v || '').trim().toUpperCase() + return CODE_RE.test(s) ? s : null +} + +function randCode(len) { + return crypto.randomBytes(len * 2).toString('hex').toUpperCase().replace(/[^A-Z0-9]/g, '').padEnd(len, 'X').slice(0, len) +} + +/** 从项目名推导候选编号: 取 ASCII 字母数字, 不足则随机补齐 */ +function suggestCode(name) { + const letters = String(name || '').toUpperCase().replace(/[^A-Z0-9]/g, '') + if (letters.length >= 2) return letters.slice(0, 8) + return (letters + randCode(8)).slice(0, 8) +} + +/** 分配一个未占用的项目编号: 优先按名称推导, 冲突则随机尾缀重试 */ +export async function allocProjectCode(name) { + const base = suggestCode(name) + for (let i = 0; i < 20; i++) { + const cand = i === 0 ? base : (base.slice(0, 5) + randCode(3)).slice(0, 8) + if (cand.length < 2 || !CODE_RE.test(cand)) continue + const dup = await prisma.project.findUnique({ where: { code: cand } }) + if (!dup) return cand + } + while (true) { + const cand = randCode(6) + const dup = await prisma.project.findUnique({ where: { code: cand } }) + if (!dup) return cand + } +} + +/** 任务项目内下一个编号 (max+1); 并发冲突由调用方捕获 P2002 重试 */ +export async function nextTaskNumber(projectId) { + const agg = await prisma.task.aggregate({ where: { projectId }, _max: { number: true } }) + return (agg._max.number ?? 0) + 1 +} + +/** Task.number 唯一冲突重试包装: fn(number) 返回 Promise; 冲突时重取编号, 最多 3 次 */ +export async function withTaskNumber(projectId, fn) { + let lastErr = null + for (let attempt = 0; attempt < 3; attempt++) { + const number = await nextTaskNumber(projectId) + try { + return { number, value: await fn(number) } + } catch (e) { + const target = Array.isArray(e?.meta?.target) ? e.meta.target.join(',') : String(e?.meta?.target || '') + lastErr = e + if (!(e?.code === 'P2002' && target.includes('number'))) throw e + } + } + throw lastErr +} diff --git a/src/App.jsx b/src/App.jsx index acf78be..068818e 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -8,6 +8,7 @@ import MePage from './pages/MePage.jsx' import CheckinPage from './pages/checkin/CheckinPage.jsx' import TaskPage from './pages/task/TaskPage.jsx' import { useAuth } from './auth/AuthContext.jsx' +import { PowerSyncProvider } from './lib/powersync/react.jsx' // 默认落地页: 打卡 (V0.2 起打卡是第一个 Tab 且为默认选中) const HOME_PATH = '/checkin' @@ -31,7 +32,8 @@ function RequireAuth({ children }) { export default function App() { return ( - + + } /> }> {/* 打卡为默认首页 */} @@ -49,6 +51,7 @@ export default function App() { } /> } /> - + + ) } \ No newline at end of file diff --git a/src/api/client.js b/src/api/client.js index f1e0a63..560ef43 100644 --- a/src/api/client.js +++ b/src/api/client.js @@ -1,13 +1,121 @@ // API 调用封装: 自动带 JWT、401 自动清 token、抛统一错误 +// 0.2.1 离线支持: +// - GET 请求成功后把响应写入本地缓存 (localStorage), 离线/网络失败时回退缓存 (界面仍有数据) +// - 写请求 (POST/PUT/DELETE) 仍要求在线 (任务模块的离线写走 PowerSync 上传队列) +// - 统一在线/离线状态订阅, 供 UI 显示离线标识 const TOKEN_KEY = 'iboard_token' const REMEMBER_KEY = 'iboard_remember' +const UID_KEY = 'iboard_uid' // API 基址: // - 默认相对路径 `/api` (web dev: Vite 代理; web prod: 同源 Express 一起托管) -// - 打包 Android 时设 VITE_API_BASE=http://bh.vps.honor3.com:3001 走外网后端 +// - 打包 Android / Windows 外壳时设 VITE_API_BASE=http://bh.vps.honor3.com:3001 走外网后端 const API_BASE = (import.meta.env.VITE_API_BASE || '').replace(/\/+$/, '') const API_PREFIX = API_BASE ? API_BASE + '/api' : '/api' +// ---------- 在线/离线状态 (网络事件 + 请求结果联动) ---------- +let offline = typeof navigator !== 'undefined' ? navigator.onLine === false : false +const offlineListeners = new Set() + +export function isOffline() { + return offline +} + +function setOffline(next) { + if (offline === next) return + offline = next + offlineListeners.forEach((cb) => { + try { cb(next) } catch { /* ignore */ } + }) +} + +if (typeof window !== 'undefined') { + window.addEventListener('online', () => setOffline(false)) + window.addEventListener('offline', () => setOffline(true)) +} + +/** 订阅在线/离线变化, 返回取消函数 */ +export function subscribeOffline(cb) { + offlineListeners.add(cb) + return () => offlineListeners.delete(cb) +} + +// ---------- GET 响应本地缓存 ---------- +// 目的: 任何界面只要成功访问过一次, 离线时都能展示上次的数据 +const CACHE_PREFIX = 'iboard_cache:' +const CACHE_TOTAL_LIMIT = 3 * 1024 * 1024 // 约 3MB (localStorage 通常 5MB) +const CACHE_ENTRY_LIMIT = 512 * 1024 // 单条上限, 超大响应不缓存 + +function cacheKey(path) { + return CACHE_PREFIX + path +} + +function readCache(path) { + try { + const raw = localStorage.getItem(cacheKey(path)) + if (!raw) return null + const parsed = JSON.parse(raw) + if (!parsed || typeof parsed !== 'object' || !('data' in parsed)) return null + return parsed + } catch { + return null + } +} + +function cacheSizeUsed() { + let total = 0 + try { + for (let i = 0; i < localStorage.length; i++) { + const k = localStorage.key(i) + if (k && k.startsWith(CACHE_PREFIX)) total += (localStorage.getItem(k) || '').length + } + } catch { /* ignore */ } + return total +} + +function evictOldest(needBytes) { + try { + const entries = [] + for (let i = 0; i < localStorage.length; i++) { + const k = localStorage.key(i) + if (!k || !k.startsWith(CACHE_PREFIX)) continue + let ts = 0 + try { ts = JSON.parse(localStorage.getItem(k) || '{}').ts || 0 } catch { /* ignore */ } + entries.push({ k, ts }) + } + entries.sort((a, b) => a.ts - b.ts) + let used = cacheSizeUsed() + for (const e of entries) { + if (used + needBytes <= CACHE_TOTAL_LIMIT) break + used -= (localStorage.getItem(e.k) || '').length + localStorage.removeItem(e.k) + } + } catch { /* ignore */ } +} + +function writeCache(path, data) { + try { + const payload = JSON.stringify({ ts: Date.now(), data }) + if (payload.length > CACHE_ENTRY_LIMIT) return // 过大不缓存 + evictOldest(payload.length) + localStorage.setItem(cacheKey(path), payload) + } catch { + // 配额满等异常: 静默失败, 不影响主流程 + } +} + +/** 清空所有 GET 缓存 (退出登录时调用) */ +export function clearApiCache() { + try { + const keys = [] + for (let i = 0; i < localStorage.length; i++) { + const k = localStorage.key(i) + if (k && k.startsWith(CACHE_PREFIX)) keys.push(k) + } + keys.forEach((k) => localStorage.removeItem(k)) + } catch { /* ignore */ } +} + export function getToken() { return localStorage.getItem(TOKEN_KEY) || '' } @@ -26,21 +134,45 @@ export function setRememberFlag(v) { else localStorage.removeItem(REMEMBER_KEY) } +// 当前用户 id (0.2.1 离线写入需要 ownerId/creatorId, 本地库无法即时从服务端获取) +export function getCurrentUserId() { + return localStorage.getItem(UID_KEY) || '' +} +export function setCurrentUserId(id) { + if (id !== null && id !== undefined && id !== '') localStorage.setItem(UID_KEY, String(id)) + else localStorage.removeItem(UID_KEY) +} + export function getApiBase() { return API_BASE } export async function api(path, { method = 'GET', body, headers = {} } = {}) { const token = getToken() - const res = await fetch(API_PREFIX + path, { - method, - headers: { - 'Content-Type': 'application/json', - ...(token ? { Authorization: 'Bearer ' + token } : {}), - ...headers, - }, - body: body ? JSON.stringify(body) : undefined, - }) + const isRead = method === 'GET' + let res + try { + res = await fetch(API_PREFIX + path, { + method, + headers: { + 'Content-Type': 'application/json', + ...(token ? { Authorization: 'Bearer ' + token } : {}), + ...headers, + }, + body: body ? JSON.stringify(body) : undefined, + }) + } catch { + // 网络层失败: 离线 / 服务不可达 + setOffline(true) + if (isRead) { + const cached = readCache(path) + if (cached) return cached.data + throw new Error('当前离线,且该界面尚无本地缓存') + } + throw new Error('当前离线,修改操作需要联网后重试') + } + + setOffline(false) if (res.status === 401) { setToken('') const data = await res.json().catch(() => ({})) @@ -49,5 +181,6 @@ export async function api(path, { method = 'GET', body, headers = {} } = {}) { } const data = await res.json().catch(() => ({})) if (!res.ok) throw new Error(data.error || '请求失败 (' + res.status + ')') + if (isRead) writeCache(path, data) return data -} \ No newline at end of file +} diff --git a/src/api/task.js b/src/api/task.js index 660bb0a..b8e44ba 100644 --- a/src/api/task.js +++ b/src/api/task.js @@ -1,44 +1,775 @@ -import { api } from './client.js' - -const q = (params) => { - const s = new URLSearchParams() - Object.entries(params || {}).forEach(([k, v]) => { - if (v !== undefined && v !== null && v !== '') s.set(k, v) - }) - const str = s.toString() - return str ? '?' + str : '' -} - -// 项目 -export const projectApi = { - list: () => api('/projects'), - detail: (id) => api(`/projects/${id}`), - create: (body) => api('/projects', { method: 'POST', body }), - update: (id, body) => api(`/projects/${id}`, { method: 'PUT', body }), - remove: (id) => api(`/projects/${id}`, { method: 'DELETE' }), - addMember: (id, body) => api(`/projects/${id}/members`, { method: 'POST', body }), - removeMember: (id, uid) => api(`/projects/${id}/members/${uid}`, { method: 'DELETE' }), -} - -// 看板列 -export const columnApi = { - list: (projectId) => api(`/projects/${projectId}/columns`), - add: (projectId, body) => api(`/projects/${projectId}/columns`, { method: 'POST', body }), - update: (id, body) => api(`/columns/${id}`, { method: 'PUT', body }), - remove: (id, moveToColumnId) => api(`/columns/${id}${q({ moveToColumnId })}`, { method: 'DELETE' }), - order: (projectId, ids) => api(`/projects/${projectId}/columns/order`, { method: 'PUT', body: { ids } }), -} - -// 任务 -export const taskApi = { - list: (projectId) => api(`/projects/${projectId}/tasks`), - create: (projectId, body) => api(`/projects/${projectId}/tasks`, { method: 'POST', body }), - detail: (id) => api(`/tasks/${id}`), - update: (id, body) => api(`/tasks/${id}`, { method: 'PUT', body }), - reorder: (projectId, ids) => api(`/projects/${projectId}/tasks/reorder`, { method: 'POST', body: { ids } }), - remove: (id) => api(`/tasks/${id}`, { method: 'DELETE' }), - copy: (id, projectId) => api(`/tasks/${id}/copy`, { method: 'POST', body: { projectId } }), - archive: (id) => api(`/tasks/${id}/archive`, { method: 'POST', body: {} }), - unarchive: (id) => api(`/tasks/${id}/unarchive`, { method: 'POST', body: {} }), - archivedList: (projectId, params) => api(`/projects/${projectId}/tasks/archived` + q(params)), -} +// 任务模块数据层 (0.2.1): 已切换为 PowerSync 本地 SQLite +// - 读: 全部来自本地库 (离线可用); 写: 本地写入 -> upload queue -> /api/powersync/upload (按 uuid 幂等) +// - 对页面保持与原 REST 版一致的调用签名与响应形状 (projectApi / columnApi / taskApi) +// - 编号: Project.code / Task.number 由服务端统一分配, 本地新建行同步前分别为空 -> 展示占位 +// 见 docs/V0.2/离线编辑模块/0.2.1实施方案.md +import { getPowersyncDb } from '../lib/powersync/db.js' +import { api, getCurrentUserId } from './client.js' +import { filterVisible } from '../pages/task/date.js' + +const db = () => getPowersyncDb() + +// crypto.randomUUID 仅在安全上下文 (https / localhost) 可用; 部署站为 http 明文, 用 getRandomValues 兜底生成 v4 +const uuid = () => { + if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') return crypto.randomUUID() + const b = crypto.getRandomValues(new Uint8Array(16)) + b[6] = (b[6] & 0x0f) | 0x40 + b[8] = (b[8] & 0x3f) | 0x80 + const h = [...b].map((x) => x.toString(16).padStart(2, '0')).join('') + return `${h.slice(0, 8)}-${h.slice(8, 12)}-${h.slice(12, 16)}-${h.slice(16, 20)}-${h.slice(20)}` +} +const now = () => new Date().toISOString() +const parseJson = (v, fallback) => { + if (v === null || v === undefined || v === '') return fallback + if (typeof v !== 'string') return v + try { return JSON.parse(v) } catch { return fallback } +} + +// 新建项目时的默认 4 列 (与服务端 DEFAULT_COLUMNS 一致) +const DEFAULT_COLUMNS = [ + { name: 'Plan', sortOrder: 0, boundStatus: 'todo' }, + { name: 'Doing', sortOrder: 1, boundStatus: 'doing' }, + { name: 'Action', sortOrder: 2, boundStatus: null }, + { name: 'Done', sortOrder: 3, boundStatus: 'done' }, +] +export const DEFAULT_TASK_KINDS = ['需求', 'Bug', 'FEATURE', '优化'] +const MAX_NAME = 20 + +function normTaskKinds(v) { + if (!Array.isArray(v)) return null + const out = [] + for (const k of v) { + const s = String(k || '').trim().slice(0, 20) + if (s && !out.includes(s)) out.push(s) + if (out.length >= 30) break + } + return out +} + +// ---------- 查询助手 ---------- + +async function getColumns(projectId) { + return db().getAll( + 'SELECT * FROM BoardColumn WHERE projectId = ? ORDER BY sortOrder, id', + [String(projectId)], + ) +} + +async function getProjectMembers(projectId) { + const rows = await db().getAll( + `SELECT pm.userId, pm.permission, u.name, u.email + FROM ProjectMember pm LEFT JOIN User u ON u.id = pm.userId + WHERE pm.projectId = ? ORDER BY pm.createdAt, pm.id`, + [String(projectId)], + ) + return rows.map((r) => ({ userId: String(r.userId), name: r.name || String(r.userId), email: r.email || '', permission: r.permission || 'member' })) +} + +function memberMapOf(members) { + return new Map(members.map((m) => [m.userId, { id: m.userId, name: m.name }])) +} + +async function shapeTasks(rows, columns) { + const columnById = new Map(columns.map((c) => [String(c.id), c])) + const projectIds = [...new Set(rows.map((r) => String(r.projectId)))] + let membersByProject = new Map() + if (projectIds.length) { + const ph = projectIds.map(() => '?').join(',') + const pmRows = await db().getAll( + `SELECT pm.projectId, pm.userId, u.name FROM ProjectMember pm LEFT JOIN User u ON u.id = pm.userId WHERE pm.projectId IN (${ph})`, + projectIds, + ) + membersByProject = new Map(projectIds.map((pid) => [pid, new Map()])) + for (const r of pmRows) { + membersByProject.get(String(r.projectId)).set(String(r.userId), { id: String(r.userId), name: r.name || String(r.userId) }) + } + } + const taskIds = rows.map((r) => String(r.id)) + const memberRows = taskIds.length + ? await db().getAll( + `SELECT tm.taskId, tm.userId, u.name FROM TaskMember tm LEFT JOIN User u ON u.id = tm.userId WHERE tm.taskId IN (${taskIds.map(() => '?').join(',')})`, + taskIds, + ) + : [] + const tagRows = taskIds.length + ? await db().getAll(`SELECT taskId, name FROM TaskTag WHERE taskId IN (${taskIds.map(() => '?').join(',')})`, taskIds) + : [] + const membersByTask = new Map() + for (const r of memberRows) { + const k = String(r.taskId) + if (!membersByTask.has(k)) membersByTask.set(k, []) + membersByTask.get(k).push({ userId: String(r.userId), name: r.name || String(r.userId) }) + } + const tagsByTask = new Map() + for (const r of tagRows) { + const k = String(r.taskId) + if (!tagsByTask.has(k)) tagsByTask.set(k, []) + tagsByTask.get(k).push(r.name) + } + + const shapeOne = (t) => { + const members = membersByTask.get(String(t.id)) || [] + const usersByProject = membersByProject.get(String(t.projectId)) || new Map() + return { + ...t, + extras: parseJson(t.extras, []), + column: columnById.get(String(t.columnId)) || null, + assignee: t.assigneeId ? (usersByProject.get(String(t.assigneeId)) || { id: String(t.assigneeId), name: String(t.assigneeId) }) : null, + members, + tags: tagsByTask.get(String(t.id)) || [], + } + } + return shapeOne +} + +function projectSummary(p, memberCount, taskCount) { + return { + id: String(p.id), + uuid: p.uuid, + code: p.code || null, + name: p.name, + ownerId: String(p.ownerId), + isPersonal: !!p.isPersonal, + archived: !!p.archived, + createdAt: p.createdAt, + updatedAt: p.updatedAt, + taskKinds: normTaskKinds(parseJson(p.taskKinds, null)) || DEFAULT_TASK_KINDS, + icon: p.icon || null, + memberCount, + taskCount, + } +} + +function assertUser() { + const uid = getCurrentUserId() + if (!uid) throw new Error('未登录') + return String(uid) +} + +// ---------- 项目 ---------- + +export const projectApi = { + // 我参与的项目 (本地库; 个人默认项目缺失且在线时回源一次让服务端补建) + list: async () => { + const uid = assertUser() + let rows = await db().getAll( + `SELECT p.* FROM Project p WHERE p.id IN (SELECT pm.projectId FROM ProjectMember pm WHERE pm.userId = ?) + ORDER BY p.archived, p.updatedAt DESC`, + [uid], + ) + if (!rows.some((r) => !!r.isPersonal && String(r.ownerId) === uid)) { + try { + await api('/projects') + await new Promise((r) => setTimeout(r, 1200)) + rows = await db().getAll( + `SELECT p.* FROM Project p WHERE p.id IN (SELECT pm.projectId FROM ProjectMember pm WHERE pm.userId = ?) + ORDER BY p.archived, p.updatedAt DESC`, + [uid], + ) + } catch { /* 离线: 无个人项目则跳过 */ } + } + const items = [] + for (const p of rows) { + const memberCount = await db().getOptional('SELECT COUNT(*) AS n FROM ProjectMember WHERE projectId = ?', [String(p.id)]) + const taskCount = await db().getOptional('SELECT COUNT(*) AS n FROM Task WHERE projectId = ?', [String(p.id)]) + items.push(projectSummary(p, memberCount?.n || 0, taskCount?.n || 0)) + } + return { items } + }, + + detail: async (id) => { + const p = await db().getOptional('SELECT * FROM Project WHERE id = ?', [String(id)]) + if (!p) throw new Error('项目不存在或无权限') + const members = await getProjectMembers(p.id) + const columns = await getColumns(p.id) + const taskCount = await db().getOptional('SELECT COUNT(*) AS n FROM Task WHERE projectId = ?', [String(p.id)]) + return { + item: { + ...projectSummary(p, members.length, taskCount?.n || 0), + members, + columns, + notes: parseJson(p.notes, []), + }, + } + }, + + create: async (body) => { + const uid = assertUser() + const name = String(body?.name || '').trim() + if (!name) throw new Error('项目名称不能为空') + if (name.length > MAX_NAME) throw new Error(`项目名称不能超过 ${MAX_NAME} 字`) + let code = null + const rawCode = body?.code + if (rawCode !== undefined && rawCode !== null && String(rawCode).trim() !== '') { + code = String(rawCode).trim().toUpperCase() + if (!/^[A-Z0-9]{2,8}$/.test(code)) throw new Error('项目编号须为 2~8 位字母数字') + const dup = await db().getOptional('SELECT id FROM Project WHERE code = ?', [code]) + if (dup) throw new Error(`项目编号 ${code} 已被占用`) + } + const id = uuid() + const ts = now() + await db().writeTransaction(async (tx) => { + await tx.execute( + 'INSERT INTO Project (id, uuid, code, name, ownerId, isPersonal, archived, notes, taskKinds, icon, createdAt, updatedAt) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', + [id, id, code, name, uid, 0, 0, '[]', null, null, ts, ts], + ) + await tx.execute( + 'INSERT INTO ProjectMember (id, uuid, projectId, userId, permission, createdAt) VALUES (?, ?, ?, ?, ?, ?)', + [uuid(), uuid(), id, uid, 'member', ts], + ) + for (const c of DEFAULT_COLUMNS) { + await tx.execute( + 'INSERT INTO BoardColumn (id, uuid, projectId, name, sortOrder, boundStatus, retention, createdAt, updatedAt) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)', + [uuid(), uuid(), id, c.name, c.sortOrder, c.boundStatus, 'forever', ts, ts], + ) + } + }) + const p = await db().get('SELECT * FROM Project WHERE id = ?', [id]) + return { item: projectSummary(p, 1, 0) } + }, + + update: async (id, body) => { + await db().getOptional('SELECT id FROM Project WHERE id = ?', [String(id)]).then((p) => { + if (!p) throw new Error('项目不存在或无权限') + }) + const data = {} + if (body?.name !== undefined) { + const t = String(body.name).trim() + if (!t) throw new Error('项目名称不能为空') + if (t.length > MAX_NAME) throw new Error(`项目名称不能超过 ${MAX_NAME} 字`) + data.name = t + } + if (body?.code !== undefined) { + const c = String(body.code || '').trim().toUpperCase() + if (!/^[A-Z0-9]{2,8}$/.test(c)) throw new Error('项目编号须为 2~8 位字母数字') + const dup = await db().getOptional('SELECT id FROM Project WHERE code = ? AND id != ?', [c, String(id)]) + if (dup) throw new Error(`项目编号 ${c} 已被占用`) + data.code = c + } + if (body?.taskKinds !== undefined) { + const kinds = normTaskKinds(body.taskKinds) + if (!kinds?.length) throw new Error('至少保留一个任务类型') + data.taskKinds = JSON.stringify(kinds) + } + if (body?.icon !== undefined) { + if (body.icon === null) data.icon = null + else { + const s = String(body.icon) + if (!s.startsWith('data:image/')) throw new Error('图标格式非法') + if (s.length > 300_000) throw new Error('图标过大') + data.icon = s + } + } + if (body?.archived !== undefined) data.archived = body.archived ? 1 : 0 + if (body?.notes !== undefined) { + if (!Array.isArray(body.notes)) throw new Error('信息块格式非法') + data.notes = JSON.stringify(body.notes.slice(0, 50).map((n) => ({ + title: String(n?.title ?? '').slice(0, 50), + content: String(n?.content ?? '').slice(0, 20000), + }))) + } + const sets = Object.keys(data).map((k) => `"${k}" = ?`) + if (sets.length) { + await db().execute( + `UPDATE Project SET ${sets.join(', ')}, updatedAt = ? WHERE id = ?`, + [...Object.values(data), now(), String(id)], + ) + } + const p = await db().get('SELECT * FROM Project WHERE id = ?', [String(id)]) + const memberCount = await db().getOptional('SELECT COUNT(*) AS n FROM ProjectMember WHERE projectId = ?', [String(p.id)]) + const taskCount = await db().getOptional('SELECT COUNT(*) AS n FROM Task WHERE projectId = ?', [String(p.id)]) + return { item: projectSummary(p, memberCount?.n || 0, taskCount?.n || 0) } + }, + + remove: async (id) => { + const p = await db().getOptional('SELECT * FROM Project WHERE id = ?', [String(id)]) + if (!p) throw new Error('项目不存在或无权限') + if (!!p.isPersonal) throw new Error('个人默认项目不可删除') + // 手动级联 (本地 SQLite 无外键级联) + await db().writeTransaction(async (tx) => { + const taskIds = (await tx.getAll('SELECT id FROM Task WHERE projectId = ?', [String(p.id)])).map((r) => String(r.id)) + if (taskIds.length) { + const ph = taskIds.map(() => '?').join(',') + await tx.execute(`DELETE FROM TaskMember WHERE taskId IN (${ph})`, taskIds) + await tx.execute(`DELETE FROM TaskTag WHERE taskId IN (${ph})`, taskIds) + } + await tx.execute('DELETE FROM Task WHERE projectId = ?', [String(p.id)]) + await tx.execute('DELETE FROM BoardColumn WHERE projectId = ?', [String(p.id)]) + await tx.execute('DELETE FROM ProjectMember WHERE projectId = ?', [String(p.id)]) + await tx.execute('DELETE FROM Project WHERE id = ?', [String(p.id)]) + }) + return { ok: true } + }, + + addMember: async (id, body) => { + const p = await db().getOptional('SELECT * FROM Project WHERE id = ?', [String(id)]) + if (!p) throw new Error('项目不存在或无权限') + if (!!p.isPersonal) throw new Error('个人默认项目不可添加成员') + let target = null + if (body?.userId) target = await db().getOptional('SELECT id, name FROM User WHERE id = ?', [String(body.userId)]) + else if (body?.email) target = await db().getOptional('SELECT id, name FROM User WHERE email = ?', [String(body.email).trim()]) + if (!target) throw new Error('用户不存在') + const dup = await db().getOptional('SELECT id FROM ProjectMember WHERE projectId = ? AND userId = ?', [String(p.id), String(target.id)]) + if (dup) throw new Error('该用户已是项目成员') + await db().execute( + 'INSERT INTO ProjectMember (id, uuid, projectId, userId, permission, createdAt) VALUES (?, ?, ?, ?, ?, ?)', + [uuid(), uuid(), String(p.id), String(target.id), 'member', now()], + ) + return { ok: true, member: { userId: String(target.id), name: target.name } } + }, + + removeMember: async (id, uid) => { + const p = await db().getOptional('SELECT * FROM Project WHERE id = ?', [String(id)]) + if (!p) throw new Error('项目不存在或无权限') + if (!!p.isPersonal) throw new Error('个人默认项目不可移除成员') + const me = getCurrentUserId() + if (String(uid) !== me && String(p.ownerId) !== me) throw new Error('只能移除自己,或由创建人移除他人') + await db().execute('DELETE FROM ProjectMember WHERE projectId = ? AND userId = ?', [String(p.id), String(uid)]) + return { ok: true } + }, +} + +// ---------- 看板列 ---------- + +export const columnApi = { + list: async (projectId) => ({ items: await getColumns(projectId) }), + + add: async (projectId, body) => { + const name = String(body?.name || '').trim() + if (!name) throw new Error('列名不能为空') + if (name.length > MAX_NAME) throw new Error(`列名不能超过 ${MAX_NAME} 字`) + const cols = await getColumns(projectId) + if (cols.length >= 10) throw new Error('最多 10 列') + if (cols.some((c) => c.name === name)) throw new Error('列名已存在') + const id = uuid() + const ts = now() + await db().execute( + 'INSERT INTO BoardColumn (id, uuid, projectId, name, sortOrder, boundStatus, retention, createdAt, updatedAt) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)', + [id, id, String(projectId), name, cols.length ? Math.max(...cols.map((c) => Number(c.sortOrder))) + 1 : 0, null, 'forever', ts, ts], + ) + return { item: await db().get('SELECT * FROM BoardColumn WHERE id = ?', [id]) } + }, + + update: async (id, body) => { + const col = await db().getOptional('SELECT * FROM BoardColumn WHERE id = ?', [String(id)]) + if (!col) throw new Error('列不存在') + const data = {} + if (body?.name !== undefined) { + const t = String(body.name).trim() + if (!t) throw new Error('列名不能为空') + if (t.length > MAX_NAME) throw new Error(`列名不能超过 ${MAX_NAME} 字`) + const dup = await db().getOptional('SELECT id FROM BoardColumn WHERE projectId = ? AND name = ? AND id != ?', [String(col.projectId), t, String(id)]) + if (dup) throw new Error('列名已存在') + data.name = t + } + if (body?.boundStatus !== undefined) { + if (body.boundStatus !== null && !['todo', 'doing', 'done'].includes(body.boundStatus)) throw new Error('绑定状态取值非法') + data.boundStatus = body.boundStatus + } + if (body?.retention !== undefined) { + if (!['never', 'today', '3d', 'week', 'month', 'forever'].includes(body.retention)) throw new Error('保留选项取值非法') + data.retention = body.retention + } + const sets = Object.keys(data).map((k) => `"${k}" = ?`) + if (sets.length) { + await db().execute(`UPDATE BoardColumn SET ${sets.join(', ')}, updatedAt = ? WHERE id = ?`, [...Object.values(data), now(), String(id)]) + } + return { item: await db().get('SELECT * FROM BoardColumn WHERE id = ?', [String(id)]) } + }, + + remove: async (id, moveToColumnId) => { + const col = await db().getOptional('SELECT * FROM BoardColumn WHERE id = ?', [String(id)]) + if (!col) throw new Error('列不存在') + const cols = await getColumns(col.projectId) + if (cols.length <= 1) throw new Error('至少保留一列') + let targetId = String(moveToColumnId || '') + if (!targetId) { + const idx = cols.findIndex((c) => String(c.id) === String(id)) + targetId = String((cols[idx + 1] || cols[idx - 1]).id) + } + const target = cols.find((c) => String(c.id) === targetId) + if (!target || String(target.id) === String(id)) throw new Error('迁移目标列非法') + await db().writeTransaction(async (tx) => { + // 迁移任务: 状态按目标列绑定重新裁决 (与服务端同口径) + if (target.boundStatus) { + await tx.execute('UPDATE Task SET columnId = ?, status = ?, updatedAt = ? WHERE columnId = ?', [targetId, target.boundStatus, now(), String(id)]) + } else { + await tx.execute('UPDATE Task SET columnId = ?, updatedAt = ? WHERE columnId = ?', [targetId, now(), String(id)]) + } + await tx.execute('DELETE FROM BoardColumn WHERE id = ?', [String(id)]) + }) + return { ok: true, toColumnId: targetId } + }, + + order: async (projectId, ids) => { + const list = Array.isArray(ids) ? ids.map(String) : [] + if (!list.length) throw new Error('ids 不能为空') + await db().writeTransaction(async (tx) => { + for (let i = 0; i < list.length; i++) { + await tx.execute('UPDATE BoardColumn SET sortOrder = ?, updatedAt = ? WHERE id = ?', [i, now(), list[i]]) + } + }) + return { items: await getColumns(projectId) } + }, +} + +// ---------- 任务 ---------- + +function assertTitle(t) { + const s = String(t || '').trim() + if (!s) throw new Error('任务标题不能为空') + if (s.length > 30) throw new Error('任务标题不能超过 30 字') + return s +} + +function parseMarkDate(v) { + if (v === null || v === undefined || v === '') return null + const d = new Date(v) + if (Number.isNaN(d.getTime())) throw new Error('时间标记格式非法') + return d.toISOString() +} + +export const taskApi = { + list: async (projectId) => { + const columns = await getColumns(projectId) + const rows = await db().getAll( + 'SELECT * FROM Task WHERE projectId = ? AND parentId IS NULL AND archived = 0 ORDER BY sortOrder, createdAt, id', + [String(projectId)], + ) + const shape = await shapeTasks(rows, columns) + const shaped = rows.map(shape) + // 子任务挂载 (与服务端 TASK_INCLUDE.children 同构) + for (const t of shaped) { + const childRows = await db().getAll( + 'SELECT * FROM Task WHERE parentId = ? ORDER BY sortOrder, id', + [String(t.id)], + ) + const childShape = await shapeTasks(childRows, columns) + t.children = childRows.map(childShape) + } + const visible = filterVisible(shaped, columns) + return { items: visible, columns, total: shaped.length } + }, + + create: async (projectId, body) => { + const uid = assertUser() + const title = assertTitle(body?.title) + const columns = await getColumns(projectId) + if (!columns.length) throw new Error('项目没有可用的看板列') + let parentId = null + if (body?.parentId) { + const parent = await db().getOptional('SELECT * FROM Task WHERE id = ?', [String(body.parentId)]) + if (!parent) throw new Error('父任务不存在') + if (String(parent.projectId) !== String(projectId)) throw new Error('子任务必须与父任务同项目') + if (parent.parentId) throw new Error('仅支持一级子任务') + parentId = String(parent.id) + } + const memberIds = await db().getAll('SELECT userId FROM ProjectMember WHERE projectId = ?', [String(projectId)]) + const memberSet = new Set(memberIds.map((r) => String(r.userId))) + let finalAssignee = null + if (body?.assigneeId === undefined) finalAssignee = memberSet.has(uid) ? uid : null + else if (body?.assigneeId !== null) { + const aid = String(body.assigneeId) + if (!memberSet.has(aid)) throw new Error('负责人必须是项目成员') + finalAssignee = aid + } + const firstCol = columns[0] + const id = uuid() + const ts = now() + await db().writeTransaction(async (tx) => { + await tx.execute( + `INSERT INTO Task (id, uuid, projectId, columnId, parentId, title, description, kind, markDate, status, doneAt, assigneeId, creatorId, extras, sortOrder, number, archived, archivedAt, archiveSource, createdAt, updatedAt) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, NULL, NULL, ?, ?)`, + [id, id, String(projectId), String(firstCol.id), parentId, title, String(body?.description || ''), + body?.kind ? String(body.kind).trim().slice(0, 20) : null, parseMarkDate(body?.markDate), + firstCol.boundStatus || 'todo', null, finalAssignee, uid, '[]', 0, null, ts, ts], + ) + for (const mid of (Array.isArray(body?.memberIds) ? body.memberIds : []).map(String).filter((x) => memberSet.has(x))) { + await tx.execute('INSERT INTO TaskMember (id, uuid, taskId, userId) VALUES (?, ?, ?, ?)', [uuid(), uuid(), id, mid]) + } + for (const name of (Array.isArray(body?.tags) ? body.tags : []).filter(Boolean).map((n) => String(n).slice(0, 20))) { + await tx.execute('INSERT INTO TaskTag (id, uuid, taskId, name) VALUES (?, ?, ?, ?)', [uuid(), uuid(), id, name]) + } + }) + const row = await db().get('SELECT * FROM Task WHERE id = ?', [id]) + const shape = await shapeTasks([row], columns) + return { item: shape(row) } + }, + + detail: async (id) => { + const row = await db().getOptional('SELECT * FROM Task WHERE id = ?', [String(id)]) + if (!row) throw new Error('任务不存在或无权限') + const columns = await getColumns(row.projectId) + const shape = await shapeTasks([row], columns) + return { item: shape(row) } + }, + + update: async (id, body) => { + const task = await db().getOptional('SELECT * FROM Task WHERE id = ?', [String(id)]) + if (!task) throw new Error('任务不存在或无权限') + const columns = await getColumns(task.projectId) + const data = {} + + if (body?.title !== undefined) data.title = assertTitle(body.title) + if (body?.description !== undefined) data.description = String(body.description) + if (body?.kind !== undefined) data.kind = body.kind ? String(body.kind).trim().slice(0, 20) : null + if (body?.markDate !== undefined) data.markDate = parseMarkDate(body.markDate) + if (body?.extras !== undefined) { + if (!Array.isArray(body.extras)) throw new Error('扩展信息格式非法') + data.extras = JSON.stringify(body.extras.map((e) => ({ + label: String(e?.label ?? '').slice(0, 40), + value: String(e?.value ?? ''), + url: e?.url ? String(e.url) : '', + }))) + } + if (body?.sortOrder !== undefined) data.sortOrder = Number(body.sortOrder) || 0 + + const memberRows = await db().getAll('SELECT userId FROM ProjectMember WHERE projectId = ?', [String(task.projectId)]) + const memberSet = new Set(memberRows.map((r) => String(r.userId))) + if (body?.assigneeId !== undefined) { + if (body.assigneeId === null || body.assigneeId === '') data.assigneeId = null + else { + const aid = String(body.assigneeId) + if (!memberSet.has(aid)) throw new Error('负责人必须是项目成员') + data.assigneeId = aid + } + } + + // 列 / 状态联动裁决 (与 server/task-domain/resolveStatus.js 同口径) + let status = task.status + let columnId = String(task.columnId) + const patch = {} + if (body?.columnId !== undefined) patch.columnId = String(body.columnId) + if (body?.status !== undefined) { + if (!['todo', 'doing', 'done'].includes(body.status)) throw new Error('任务状态取值非法') + patch.status = body.status + } + if (patch.columnId !== undefined && !columns.some((c) => String(c.id) === patch.columnId)) { + throw new Error('看板列不存在') + } + if (Object.keys(patch).length) { + status = patch.status !== undefined ? patch.status : task.status + columnId = patch.columnId !== undefined ? patch.columnId : String(task.columnId) + if (!task.parentId) { + const ordered = [...columns].sort((a, b) => (Number(a.sortOrder) - Number(b.sortOrder)) || String(a.id).localeCompare(String(b.id))) + const targetColumn = ordered.find((c) => String(c.id) === columnId) + if (patch.columnId !== undefined && targetColumn) { + if (targetColumn.boundStatus) status = targetColumn.boundStatus + } + if (patch.status !== undefined) { + if (!(targetColumn && targetColumn.boundStatus === status)) { + const hit = ordered.find((c) => c.boundStatus === status) + if (hit) columnId = String(hit.id) + } + } + } + data.status = status + data.columnId = columnId + } + if (data.status === 'done' && task.status !== 'done') data.doneAt = now() + else if (data.status !== undefined && data.status !== 'done') data.doneAt = null + + // 拖拽降为子任务 + if (body?.parentId !== undefined) { + if (body.parentId === null) { + data.parentId = null + } else { + const pid = String(body.parentId) + if (pid === String(task.id)) throw new Error('不能成为自己的子任务') + const parent = await db().getOptional('SELECT * FROM Task WHERE id = ?', [pid]) + if (!parent) throw new Error('目标任务不存在') + if (String(parent.projectId) !== String(task.projectId)) throw new Error('子任务必须与父任务同项目') + if (parent.parentId) throw new Error('仅支持一级子任务') + const childCount = await db().getOptional('SELECT COUNT(*) AS n FROM Task WHERE parentId = ?', [String(task.id)]) + if ((childCount?.n || 0) > 0) throw new Error('该任务已有子任务,不能成为子任务') + data.parentId = pid + } + } + + await db().writeTransaction(async (tx) => { + const sets = Object.keys(data).map((k) => `"${k}" = ?`) + if (sets.length) { + await tx.execute(`UPDATE Task SET ${sets.join(', ')}, updatedAt = ? WHERE id = ?`, [...Object.values(data), now(), String(task.id)]) + } + if (Array.isArray(body?.memberIds)) { + const ids = body.memberIds.map(String).filter((x) => memberSet.has(x)) + await tx.execute('DELETE FROM TaskMember WHERE taskId = ?', [String(task.id)]) + for (const mid of ids) { + await tx.execute('INSERT INTO TaskMember (id, uuid, taskId, userId) VALUES (?, ?, ?, ?)', [uuid(), uuid(), String(task.id), mid]) + } + } + if (Array.isArray(body?.tags)) { + await tx.execute('DELETE FROM TaskTag WHERE taskId = ?', [String(task.id)]) + const names = body.tags.map((n) => String(n).trim()).filter(Boolean).slice(0, 10) + for (const name of names) { + await tx.execute('INSERT INTO TaskTag (id, uuid, taskId, name) VALUES (?, ?, ?, ?)', [uuid(), uuid(), String(task.id), name.slice(0, 20)]) + } + } + }) + const row = await db().get('SELECT * FROM Task WHERE id = ?', [String(task.id)]) + const shape = await shapeTasks([row], columns) + return { item: shape(row) } + }, + + reorder: async (projectId, ids) => { + const list = Array.isArray(ids) ? ids.map(String).filter(Boolean) : [] + if (!list.length) throw new Error('ids 不能为空') + await db().writeTransaction(async (tx) => { + for (let i = 0; i < list.length; i++) { + await tx.execute('UPDATE Task SET sortOrder = ?, updatedAt = ? WHERE id = ?', [i, now(), list[i]]) + } + }) + return { ok: true } + }, + + remove: async (id) => { + const task = await db().getOptional('SELECT * FROM Task WHERE id = ?', [String(id)]) + if (!task) throw new Error('任务不存在或无权限') + const childCount = await db().getOptional('SELECT COUNT(*) AS n FROM Task WHERE parentId = ?', [String(task.id)]) + await db().writeTransaction(async (tx) => { + const ids = [String(task.id), ...((await tx.getAll('SELECT id FROM Task WHERE parentId = ?', [String(task.id)])).map((r) => String(r.id)))] + const ph = ids.map(() => '?').join(',') + await tx.execute(`DELETE FROM TaskMember WHERE taskId IN (${ph})`, ids) + await tx.execute(`DELETE FROM TaskTag WHERE taskId IN (${ph})`, ids) + await tx.execute(`DELETE FROM Task WHERE id IN (${ph})`, ids) + }) + return { ok: true, deletedSubtasks: childCount?.n || 0 } + }, + + copy: async (id, projectId) => { + const uid = assertUser() + const source = await db().getOptional('SELECT * FROM Task WHERE id = ?', [String(id)]) + if (!source) throw new Error('任务不存在或无权限') + const targetProject = await db().getOptional('SELECT * FROM Project WHERE id = ?', [String(projectId)]) + if (!targetProject) throw new Error('目标项目不存在或你不是其成员') + const targetColumns = await getColumns(targetProject.id) + if (!targetColumns.length) throw new Error('目标项目没有可用的看板列') + const sourceColumns = await getColumns(source.projectId) + const targetMemberIds = new Set((await db().getAll('SELECT userId FROM ProjectMember WHERE projectId = ?', [String(targetProject.id)])).map((r) => String(r.userId))) + + const pickColumn = (sourceColumnId) => { + const src = sourceColumns.find((c) => String(c.id) === String(sourceColumnId)) + if (src) { + const same = targetColumns.find((c) => c.name === src.name) + if (same) return String(same.id) + } + return String(targetColumns[0]?.id) + } + + const copyOne = async (tx, s, parentId) => { + const newId = uuid() + const ts = now() + await tx.execute( + `INSERT INTO Task (id, uuid, projectId, columnId, parentId, title, description, kind, markDate, status, doneAt, assigneeId, creatorId, extras, sortOrder, number, createdAt, updatedAt) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, + [newId, newId, String(targetProject.id), pickColumn(s.columnId), parentId, s.title, s.description || '', s.kind || null, + s.markDate || null, s.status, s.status === 'done' ? (s.doneAt || ts) : null, + s.assigneeId && targetMemberIds.has(String(s.assigneeId)) ? String(s.assigneeId) : null, + uid, s.extras || '[]', Number(s.sortOrder) || 0, null, ts, ts], + ) + const tagRows = await tx.getAll('SELECT name FROM TaskTag WHERE taskId = ?', [String(s.id)]) + for (const t of tagRows) { + await tx.execute('INSERT INTO TaskTag (id, uuid, taskId, name) VALUES (?, ?, ?, ?)', [uuid(), uuid(), newId, t.name]) + } + const keptMembers = (await tx.getAll('SELECT userId FROM TaskMember WHERE taskId = ?', [String(s.id)])).map((r) => String(r.userId)).filter((x) => targetMemberIds.has(x)) + for (const m of keptMembers) { + await tx.execute('INSERT INTO TaskMember (id, uuid, taskId, userId) VALUES (?, ?, ?, ?)', [uuid(), uuid(), newId, m]) + } + return newId + } + + const newId = await db().writeTransaction(async (tx) => { + const pid = await copyOne(tx, source, null) + const children = await tx.getAll('SELECT * FROM Task WHERE parentId = ?', [String(source.id)]) + for (const child of children) await copyOne(tx, child, pid) + return pid + }) + const row = await db().get('SELECT * FROM Task WHERE id = ?', [newId]) + const shape = await shapeTasks([row], targetColumns) + return { item: shape(row), dropped: { assignee: null, members: [] } } + }, + // ---------- 归档 (T-ARC, 本地实现: 写本地库 -> 上行) ---------- + + /** 手动归档: 连带全部子任务, 幂等 (T-ARC-01) */ + archive: async (id) => { + const task = await db().getOptional('SELECT * FROM Task WHERE id = ?', [String(id)]) + if (!task) throw new Error('任务不存在或无权限') + const now = now() + await db().writeTransaction(async (tx) => { + const kids = await tx.getAll('SELECT id FROM Task WHERE parentId = ?', [String(task.id)]) + const ids = [String(task.id), ...kids.map((k) => String(k.id))] + const ph = ids.map(() => '?').join(',') + await tx.execute( + `UPDATE Task SET archived = 1, archivedAt = ?, archiveSource = 'manual', updatedAt = ? WHERE id IN (${ph})`, + [now, now, ...ids], + ) + }) + return { ok: true, count: 1 } + }, + + /** 恢复归档: 回原列, 状态不变, 连带子任务 (T-ARC-03) */ + unarchive: async (id) => { + const task = await db().getOptional('SELECT * FROM Task WHERE id = ?', [String(id)]) + if (!task) throw new Error('任务不存在或无权限') + const now = now() + await db().writeTransaction(async (tx) => { + const kids = await tx.getAll('SELECT id FROM Task WHERE parentId = ?', [String(task.id)]) + const ids = [String(task.id), ...kids.map((k) => String(k.id))] + const ph = ids.map(() => '?').join(',') + await tx.execute( + `UPDATE Task SET archived = 0, archivedAt = NULL, archiveSource = NULL, updatedAt = ? WHERE id IN (${ph})`, + [now, ...ids], + ) + }) + return { ok: true, count: 1 } + }, + + /** + * 已归档查询: 关键词 / 类型 / 列 / 归档日期区间 + 游标分页 (T-ARC-04) + * 参数: { keyword, kind, columnId, from, to, limit, cursor } + * cursor 形如 "|", 按 (archivedAt desc, id desc) 取下一页 + */ + archivedList: async (projectId, params = {}) => { + const columns = await getColumns(projectId) + const p = params || {} + const limit = Math.min(100, Math.max(1, Number(p.limit) || 20)) + const where = ['projectId = ?', 'archived = 1', 'parentId IS NULL'] + const args = [String(projectId)] + if (p.keyword) { + where.push('title LIKE ?') + args.push(`%${String(p.keyword).trim()}%`) + } + if (p.kind) { + where.push('kind = ?') + args.push(String(p.kind)) + } + if (p.columnId) { + where.push('columnId = ?') + args.push(String(p.columnId)) + } + if (p.from) { + where.push('archivedAt >= ?') + args.push(String(p.from) + 'T00:00:00+08:00'.replace('+08:00', 'Z')) + } + if (p.to) { + where.push('archivedAt <= ?') + args.push(String(p.to) + 'T23:59:59.999Z') + } + if (p.cursor) { + const [ts, cid] = String(p.cursor).split('|') + where.push('(archivedAt < ? OR (archivedAt = ? AND id < ?))') + args.push(ts, ts, String(cid)) + } + const rows = await db().getAll( + `SELECT * FROM Task WHERE ${where.join(' AND ')} ORDER BY archivedAt DESC, id DESC LIMIT ${limit + 1}`, + args, + ) + const hasMore = rows.length > limit + const page = rows.slice(0, limit) + const shape = await shapeTasks(page, columns) + const items = page.map(shape) + const last = page[page.length - 1] + const nextCursor = hasMore && last ? `${last.archivedAt}|${last.id}` : null + return { items, nextCursor } + }, +} diff --git a/src/auth/AuthContext.jsx b/src/auth/AuthContext.jsx index 1aeb886..fe57e08 100644 --- a/src/auth/AuthContext.jsx +++ b/src/auth/AuthContext.jsx @@ -1,5 +1,6 @@ import { createContext, useContext, useEffect, useState } from 'react' -import { api, getToken, setToken, setRememberFlag } from '../api/client.js' +import { api, getToken, setToken, setRememberFlag, setCurrentUserId, clearApiCache } from '../api/client.js' +import { disconnectAndClearPowersync } from '../lib/powersync/db.js' const AuthContext = createContext(null) @@ -17,10 +18,14 @@ export function AuthProvider({ children }) { } try { const data = await api('/auth/me') - if (!cancelled) setUser(data.user) + if (!cancelled) { + setUser(data.user) + setCurrentUserId(data.user?.id) + } } catch { if (!cancelled) { setToken('') + setCurrentUserId('') setUser(null) } } finally { @@ -36,6 +41,7 @@ export function AuthProvider({ children }) { setToken(data.token) setRememberFlag(!!remember) setUser(data.user) + setCurrentUserId(data.user?.id) return data.user } @@ -44,6 +50,11 @@ export function AuthProvider({ children }) { setToken('') setRememberFlag(false) setUser(null) + setCurrentUserId('') + try { clearApiCache() } catch { /* ignore */ } + try { localStorage.removeItem('iboard_ps_cred') } catch { /* ignore */ } + // 断开同步并清空本地 SQLite (0.2.1 离线编辑) + try { await disconnectAndClearPowersync() } catch { /* ignore */ } } return ( diff --git a/src/components/task/TaskCard.jsx b/src/components/task/TaskCard.jsx index 889e02b..9f3a781 100644 --- a/src/components/task/TaskCard.jsx +++ b/src/components/task/TaskCard.jsx @@ -9,7 +9,7 @@ import { kindColor } from '../../pages/task/kind.js' const MAX_SUB = 3 export default function TaskCard({ - task, bindDrag, onClick, onToggleSub, onToggle, onMore, dragging = false, highlight = false, + task, codePrefix, bindDrag, onClick, onToggleSub, onToggle, onMore, dragging = false, highlight = false, }) { const children = task.children || [] const shown = children.slice(0, MAX_SUB) @@ -47,6 +47,9 @@ export default function TaskCard({
+ {codePrefix && task.number != null && ( + {codePrefix}-{task.number} + )} {task.markDate && ( {task.markDate.slice(5, 10).replace('-', '/')} )} diff --git a/src/components/task/TaskRow.jsx b/src/components/task/TaskRow.jsx index 3c342a1..9bddf99 100644 --- a/src/components/task/TaskRow.jsx +++ b/src/components/task/TaskRow.jsx @@ -10,7 +10,7 @@ const statusLabel = (s) => (s === 'done' ? '完成' : s === 'doing' ? '执行中 // 复选框 / ⋯ 是独立控件: pointerdown 不冒泡, 不发起拖动, // 避免长按行后抬手时合成的 click 落在控件上误触状态切换 export default function TaskRow({ - task, onToggle, onClick, onMore, bindDrag, bindDragHandle, dragging = false, dragOver, indent = false, children, + task, codePrefix, onToggle, onClick, onMore, bindDrag, bindDragHandle, dragging = false, dragOver, indent = false, children, }) { const done = task.status === 'done' return ( @@ -52,6 +52,9 @@ export default function TaskRow({
{task.title}
{/* 无类型/成员也保留该行, 与有标签的行等高 */}
+ {codePrefix && task.number != null && ( + {codePrefix}-{task.number} + )} {task.markDate && ( {task.markDate.slice(5, 10).replace('-', '/')} )} diff --git a/src/layouts/MobileShell.jsx b/src/layouts/MobileShell.jsx index 7e2eac6..19cc6c3 100644 --- a/src/layouts/MobileShell.jsx +++ b/src/layouts/MobileShell.jsx @@ -1,11 +1,13 @@ import { useEffect, useState } from 'react' import { Outlet, useLocation } from 'react-router-dom' import BottomNav from '../components/BottomNav.jsx' +import { isOffline, subscribeOffline } from '../api/client.js' // 移动端应用外壳 // - 顶部安全区: 用 --safe-top 撑开 (由 main.jsx 的 calibrateSafeTop 实测校准) // - 中间
: flex:1 可滚动主区 // - 底部 TabBar: antd-mobile TabBar 自带底部安全区 +// - 左上角离线标识 (0.2.1): 离线或服务不可达时显示, 请求恢复后自动隐藏 // // 注意: 这里不再用 antd-mobile 的 . // 它只是一个空 div, 高度完全依赖 env(safe-area-inset-top); 而 Android WebView @@ -22,9 +24,19 @@ export default function MobileShell() { return () => clearTimeout(t) }, [location.pathname]) + // 离线状态 (窗口左上角标识) + const [offline, setOfflineState] = useState(isOffline()) + useEffect(() => subscribeOffline(setOfflineState), []) + return (