diff --git a/.github/workflows/build-and-push-modeling-commons.yml b/.github/workflows/build-and-push-modeling-commons.yml index 9368d2c0..224fd67b 100644 --- a/.github/workflows/build-and-push-modeling-commons.yml +++ b/.github/workflows/build-and-push-modeling-commons.yml @@ -22,11 +22,16 @@ on: - 'yarn.lock' - '.github/workflows/build-and-push-modeling-commons.yml' workflow_dispatch: + workflow_call: + inputs: + environment: + required: true + type: string jobs: build-and-push: runs-on: ubuntu-latest - environment: netlogo1 + environment: ${{ inputs.environment || 'modeling-commons-production' }} permissions: contents: read packages: write @@ -39,31 +44,49 @@ jobs: node-version: '24' cache: yarn + - uses: actions/cache@v4 + with: + path: .turbo + key: ${{ runner.os }}-turbo-${{ hashFiles('yarn.lock') }}-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-turbo-${{ hashFiles('yarn.lock') }}- + ${{ runner.os }}-turbo- + + - uses: actions/cache@v4 + with: + path: | + node_modules + apps/*/node_modules + packages/*/node_modules + key: node-modules-${{ runner.os }}-${{ hashFiles('yarn.lock') }} + restore-keys: | + node-modules-${{ runner.os }}- + - name: Install dependencies run: yarn run init env: - HELIO_SKIP_CHECKS: '1' - NUXT_TELEMETRY_DISABLED: '1' + HELIO_SKIP_CHECKS: ${{ vars.HELIO_SKIP_CHECKS }} + NUXT_TELEMETRY_DISABLED: ${{ vars.NUXT_TELEMETRY_DISABLED }} - name: Build backend run: yarn workspace modeling-commons-backend fastify:build env: - HELIO_HEADLESS: 1 + HELIO_HEADLESS: ${{ vars.HELIO_HEADLESS }} - name: Build frontend working-directory: apps/modeling-commons-frontend run: yarn nuxt:build env: - HELIO_HEADLESS: 1 - NUXT_TELEMETRY_DISABLED: 1 - NODE_OPTIONS: --max-old-space-size=4096 - NUXT_PUBLIC_AUTH_BASE: 'https://beta.modelingcommons.org/api/auth' - NUXT_PUBLIC_API_BASE: 'https://beta.modelingcommons.org' - NUXT_PUBLIC_APP_URL: 'https://beta.modelingcommons.org' - NUXT_STORAGE_BASE_URL: 'https://cdn.modelingcommons.org' - NUXT_PUBLIC_CDN_URL: 'https://cdn.modelingcommons.org' - NUXT_PUBLIC_NETLOGO_WEB_URL: 'https://www.netlogoweb.org' - NUXT_PUBLIC_GA_TRACKING_ID: 'G-VJ4WPV2Q5B' + HELIO_HEADLESS: ${{ vars.HELIO_HEADLESS }} + NUXT_TELEMETRY_DISABLED: ${{ vars.NUXT_TELEMETRY_DISABLED }} + NODE_OPTIONS: ${{ vars.NODE_OPTIONS }} + NUXT_PUBLIC_AUTH_BASE: ${{ vars.NUXT_PUBLIC_AUTH_BASE }} + NUXT_PUBLIC_API_BASE: ${{ vars.NUXT_PUBLIC_API_BASE }} + NUXT_PUBLIC_APP_URL: ${{ vars.NUXT_PUBLIC_APP_URL }} + NUXT_STORAGE_BASE_URL: ${{ vars.NUXT_STORAGE_BASE_URL }} + NUXT_PUBLIC_CDN_URL: ${{ vars.NUXT_PUBLIC_CDN_URL }} + NUXT_PUBLIC_NETLOGO_WEB_URL: ${{ vars.NUXT_PUBLIC_NETLOGO_WEB_URL }} + NUXT_PUBLIC_GA_TRACKING_ID: ${{ vars.NUXT_PUBLIC_GA_TRACKING_ID }} - uses: docker/setup-buildx-action@v3 @@ -89,7 +112,7 @@ jobs: push: true tags: | ${{ steps.repo_slug.outputs.result }}/modeling-commons-backend:${{ github.sha }} - ${{ steps.repo_slug.outputs.result }}/modeling-commons-backend:latest + ${{ steps.repo_slug.outputs.result }}/modeling-commons-backend:${{ vars.VARIANT_IMAGE_TAG }} cache-from: type=gha cache-to: type=gha,mode=max @@ -101,15 +124,27 @@ jobs: push: true tags: | ${{ steps.repo_slug.outputs.result }}/modeling-commons-frontend:${{ github.sha }} - ${{ steps.repo_slug.outputs.result }}/modeling-commons-frontend:latest + ${{ steps.repo_slug.outputs.result }}/modeling-commons-frontend:${{ vars.VARIANT_IMAGE_TAG }} + build-args: | + NUXT_PUBLIC_API_BASE=${{ vars.NUXT_PUBLIC_API_BASE }} + NUXT_PUBLIC_AUTH_BASE=${{ vars.NUXT_PUBLIC_AUTH_BASE }} + NUXT_PUBLIC_APP_URL=${{ vars.NUXT_PUBLIC_APP_URL }} + NUXT_STORAGE_BASE_URL=${{ vars.NUXT_STORAGE_BASE_URL }} + NUXT_PUBLIC_CDN_URL=${{ vars.NUXT_PUBLIC_CDN_URL }} + NUXT_PUBLIC_NETLOGO_WEB_URL=${{ vars.NUXT_PUBLIC_NETLOGO_WEB_URL }} + NUXT_PUBLIC_GA_TRACKING_ID=${{ vars.NUXT_PUBLIC_GA_TRACKING_ID }} cache-from: type=gha cache-to: type=gha,mode=max + restart-deployments: needs: build-and-push runs-on: self-hosted + environment: ${{ inputs.environment || 'modeling-commons-production' }} steps: - name: Restart deployments + env: + KUBE_NAMESPACE: ${{ vars.KUBE_NAMESPACE }} run: | APISERVER=https://kubernetes.default.svc TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) @@ -123,5 +158,5 @@ jobs: -H "Content-Type: application/strategic-merge-patch+json" \ -d "$PATCH" \ --cacert "$CA" \ - "$APISERVER/apis/apps/v1/namespaces/modeling-commons/deployments/$DEPLOY" - done \ No newline at end of file + "$APISERVER/apis/apps/v1/namespaces/$KUBE_NAMESPACE/deployments/$DEPLOY" + done diff --git a/.github/workflows/test-modeling-commons.yml b/.github/workflows/test-modeling-commons.yml new file mode 100644 index 00000000..5da47a3f --- /dev/null +++ b/.github/workflows/test-modeling-commons.yml @@ -0,0 +1,159 @@ +name: Test Modeling Commons + +on: + push: + branches: [main, staging/modeling-commons] + paths: + - 'apps/modeling-commons-backend/**' + - 'apps/modeling-commons-frontend/**' + - 'packages/modeling-commons-shared/**' + - 'packages/typescript-config/**' + - 'packages/tailwind-config/**' + - 'packages/nuxt-core/**' + - 'packages/vue-ui/**' + - 'packages/markdown/**' + - 'packages/eslint-config/**' + - 'packages/utils/**' + - 'packages/common-data/**' + - 'packages/template/**' + - 'packages/nuxt-content-assets/**' + - 'packages/netlogo-docs/**' + - 'packages/emails/**' + - 'yarn.lock' + - '.github/workflows/build-and-push-modeling-commons.yml' + - '.github/workflows/test-modeling-commons.yml' + workflow_dispatch: + +concurrency: + group: modeling-commons-testing + cancel-in-progress: true + +jobs: + test: + runs-on: ubuntu-latest + timeout-minutes: 15 + environment: netlogo1 + permissions: + contents: read + packages: read + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: '24' + cache: yarn + + - uses: actions/cache@v4 + with: + path: .turbo + key: ${{ runner.os }}-turbo-${{ hashFiles('yarn.lock') }}-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-turbo-${{ hashFiles('yarn.lock') }}- + ${{ runner.os }}-turbo- + + - uses: actions/cache@v4 + with: + path: | + node_modules + apps/*/node_modules + packages/*/node_modules + key: node-modules-${{ runner.os }}-${{ hashFiles('yarn.lock') }} + restore-keys: | + node-modules-${{ runner.os }}- + + - name: Install dependencies + run: yarn run init + env: + HELIO_SKIP_CHECKS: '1' + NUXT_TELEMETRY_DISABLED: '1' + + - name: Build backend + run: yarn workspace modeling-commons-backend fastify:build + env: + HELIO_HEADLESS: 1 + + - name: Run services + run: docker compose -f docker-compose.dev.yml up -d --wait + working-directory: apps/modeling-commons-backend + + - name: Seed the services + run: yarn run db:migrate:dev && yarn run db:seed + working-directory: apps/modeling-commons-backend + + - name: Run backend tests + run: yarn run test + working-directory: apps/modeling-commons-backend + + - name: Run backend server + run: node dist/src/index.ts & + timeout 30 bash -c 'until curl -sf http://localhost:3000/api/health; do sleep 1; done' + working-directory: apps/modeling-commons-backend + + - name: Get Playwright version + id: pw-version + run: echo "version=$(npx playwright --version)" >> "$GITHUB_OUTPUT" + + - uses: actions/cache@v4 + id: playwright + with: + path: ~/.cache/ms-playwright + key: playwright-${{ runner.os }}-${{ steps.pw-version.outputs.version }} + + - name: Install Playwright browser + if: steps.playwright.outputs.cache-hit != 'true' + run: yarn run e2e:install-browser + working-directory: apps/modeling-commons-frontend + + - name: Build frontend + run: yarn run nuxt:build + working-directory: apps/modeling-commons-frontend + env: + NUXT_TELEMETRY_DISABLED: '1' + + - name: Run frontend server + run: node .output/server/index.mjs & + timeout 60 bash -c 'until curl -sf http://localhost:3005/ >/dev/null; do sleep 1; done' + working-directory: apps/modeling-commons-frontend + env: + PORT: '3005' + NODE_OPTIONS: --dns-result-order=ipv4first + + # Split the suite so e2e doesn't share the runner's 2 cores with the other + # five in-process projects (plus Chromium). + # -- Omar Ibrahim, Jun 11 26 + - name: Run in-process frontend tests + run: yarn run test:in-process + working-directory: apps/modeling-commons-frontend + + # E2E runs against the already-built server (E2E_HOST), so the e2e project + # skips its per-file Nuxt build. + # -- Omar Ibrahim, Jun 11 26 + - name: Run frontend e2e tests + run: yarn run test:e2e + working-directory: apps/modeling-commons-frontend + env: + E2E_HOST: http://localhost:3005 + E2E_ARTIFACT_DIR: ${{ runner.temp }}/e2e-artifacts + MAILPIT_URL: http://localhost:8025 + + # Failure-only net: on a failed e2e run, upload the screenshot + HTML that + # dumpOnFailure captured at the point of failure. + - name: Upload e2e failure artifacts + if: failure() + uses: actions/upload-artifact@v4 + with: + name: e2e-failure-artifacts + if-no-files-found: ignore + path: ${{ runner.temp }}/e2e-artifacts + + - if: always() + run: docker compose -f docker-compose.dev.yml down -v + working-directory: apps/modeling-commons-backend + + deploy-staging: + needs: test + uses: ./.github/workflows/build-and-push-modeling-commons.yml + with: + environment: modeling-commons-staging \ No newline at end of file diff --git a/apps/modeling-commons-backend/AGENTS.md b/apps/modeling-commons-backend/AGENTS.md index d96e43fa..53fe54e6 100644 --- a/apps/modeling-commons-backend/AGENTS.md +++ b/apps/modeling-commons-backend/AGENTS.md @@ -33,6 +33,7 @@ Reference modules: `src/modules/model/` (full shape), `src/modules/event/` (read - Soft delete, don't hard delete: models/users carry `deletedAt`. Call `modelDomain.assertNotDeleted(entity)` before mutating. - **Models are written through drafts**, not directly. Flow: `POST /v1/model-drafts` → `PATCH /v1/model-drafts/:id` → multipart upload to `/v1/model-drafts/:id/files` → `POST /v1/model-drafts/:id/publish`. There is no `POST /v1/models`. Publish auto-creates `v1`; a model never has zero versions. - `POST /v1/models/:id/versions` is **multipart/form-data** (required `file` field), not JSON. +- Draft data persists as versioned JSON validated by compiled Typebox `Parse` (`model-draft/schemas/v1.ts`); its `Clean` step strips properties absent from the schema, so add any new draft field to the schema or it's silently dropped on the next read. ## Routes @@ -49,7 +50,7 @@ Reference modules: `src/modules/model/` (full shape), `src/modules/event/` (read Use path aliases, never relative `../../`: - `#src/...` - app source -- `#prisma/index` - generated Prisma client (output is `generated/prisma`, not `@prisma/client`) +- `#prisma/index` - generated Prisma client (output is `generated/prisma`, not `@prisma/client`). It's committed — after editing `schema.prisma` run `yarn db:generate` and commit the regenerated client alongside the migration. ## Client/request context @@ -72,6 +73,7 @@ Use path aliases, never relative `../../`: ## Testing - `yarn run test:unit` (vitest) · `yarn run test:e2e` (cucumber, needs `yarn run svc` running for postgres/object-storage/mailpit/netlogo-services). +- `test:unit` is fully mocked (no DB); apply pending migrations before `test:e2e` (`yarn run db:migrate:dev`) — an unapplied migration makes the generated client mismatch the DB and 500s every affected route. Diagnose e2e failures from `reports/cucumber-report.json`. - In vitest specs, import `beforeEach`/`afterEach` from `vitest`, never `node:test` — wrong import silently no-ops the hook. ## Config & limits diff --git a/apps/modeling-commons-backend/client/rest.d.ts b/apps/modeling-commons-backend/client/rest.d.ts index 6dff0889..8bdcfa16 100644 --- a/apps/modeling-commons-backend/client/rest.d.ts +++ b/apps/modeling-commons-backend/client/rest.d.ts @@ -1600,6 +1600,7 @@ export interface paths { userId?: string; taggedVersionNumber: number; fileKey: string; + kind: "model" | "additional"; filename: string; contentType: string; sizeBytes: number; @@ -1689,6 +1690,7 @@ export interface paths { userId?: string; taggedVersionNumber: number; fileKey: string; + kind: "model" | "additional"; filename: string; contentType: string; sizeBytes: number; @@ -2357,7 +2359,15 @@ export interface paths { filename: string; sizeBytes: number; mimeType: string; + kind?: "model" | "additional"; }[]; + seededFrom?: { + versionNumber: number; + primaryFileS3Key: string; + modelFileS3Keys: string[]; + additionalFileS3Keys: string[]; + previewImageS3Key?: string; + }; }; previewImageUrl: string | null; /** Format: date-time */ @@ -2555,7 +2565,15 @@ export interface paths { filename: string; sizeBytes: number; mimeType: string; + kind?: "model" | "additional"; }[]; + seededFrom?: { + versionNumber: number; + primaryFileS3Key: string; + modelFileS3Keys: string[]; + additionalFileS3Keys: string[]; + previewImageS3Key?: string; + }; }; previewImageUrl: string | null; /** Format: date-time */ @@ -2753,7 +2771,7 @@ export interface paths { }; get?: never; put?: never; - /** @description Upload a file to the draft. Multipart form with required "file" field and "role" field ("primary" | "attachment" | "preview"). */ + /** @description Upload a file to the draft. Multipart form with required "file" field and "role" field ("primary" | "model-file" | "attachment" | "preview"). A "model-file" is a version-relevant model file; an "attachment" is an additional (non-version-relevant) file. */ post: { parameters: { query?: never; @@ -2774,7 +2792,7 @@ export interface paths { "application/json": { /** Format: uuid */ id?: string; - role: "primary" | "attachment" | "preview"; + role: "primary" | "model-file" | "attachment" | "preview"; s3Key: string; filename: string; sizeBytes: number; @@ -3019,6 +3037,19 @@ export interface paths { }; requestBody?: never; responses: { + /** @description Default Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + modelId: string; + versionNumber: number; + createdNewVersion: boolean; + }; + }; + }; /** @description Default Response */ 201: { headers: { @@ -3028,6 +3059,7 @@ export interface paths { "application/json": { modelId: string; versionNumber: number; + createdNewVersion: boolean; }; }; }; diff --git a/apps/modeling-commons-backend/cucumber.mjs b/apps/modeling-commons-backend/cucumber.mjs index 2615d058..98a1ae9e 100644 --- a/apps/modeling-commons-backend/cucumber.mjs +++ b/apps/modeling-commons-backend/cucumber.mjs @@ -21,6 +21,7 @@ const baseConfig = { 'progress-bar', '@cucumber/pretty-formatter', ], + tags: 'not @pending and not @wip and not @skip', formatOptions: { snippetInterface: 'async-await' }, }; diff --git a/apps/modeling-commons-backend/docker-compose.dev.yml b/apps/modeling-commons-backend/docker-compose.dev.yml index cf8e1ccb..c869bbc7 100644 --- a/apps/modeling-commons-backend/docker-compose.dev.yml +++ b/apps/modeling-commons-backend/docker-compose.dev.yml @@ -24,43 +24,22 @@ services: volumes: - /tmp/com.netlogo.modeling-commons/postgresql:/var/lib/postgresql - seaweedfs-master: - image: chrislusf/seaweedfs:latest - command: "master -ip=seaweedfs-master -ip.bind=0.0.0.0" + seaweedfs: + image: chrislusf/seaweedfs:4.27 + command: "mini -dir=/data -s3 -s3.config=/etc/seaweedfs/s3.json -s3.defaultFileMode=0644 -ip.bind=0.0.0.0" ports: - - 9333:9333 # Master HTTP - - 19333:19333 # Master gRPC + - 9333:9333 # master + - 8080:8080 # volume + - 8888:8888 # filer + - 8333:8333 # S3 volumes: - - /tmp/com.netlogo.modeling-commons/seaweedfs/master:/data - networks: - - app_network - - seaweedfs-volume: - image: chrislusf/seaweedfs:latest - command: "volume -mserver=seaweedfs-master:9333 -ip.bind=0.0.0.0 -port=8080" - ports: - - 8080:8081 # Volume HTTP - - 18080:18080 # Volume gRPC - depends_on: - - seaweedfs-master - volumes: - - /tmp/com.netlogo.modeling-commons/seaweedfs/volume:/data - networks: - - app_network - - seaweedfs-filer: - image: chrislusf/seaweedfs:latest - command: "filer -master=seaweedfs-master:9333 -ip.bind=0.0.0.0 -s3" - ports: - - 8888:8888 # Filer HTTP - - 8333:8333 # S3 API - - 18888:18888 # Filer gRPC - depends_on: - - seaweedfs-master - - seaweedfs-volume - volumes: - - /tmp/com.netlogo.modeling-commons/seaweedfs/filer:/data + - /tmp/com.netlogo.modeling-commons/seaweedfs/data:/data - ./docker/seaweedfs/s3.json:/etc/seaweedfs/s3.json:ro + healthcheck: + test: ["CMD", "wget", "-qO-", "http://localhost:8888/"] + interval: 5s + timeout: 3s + retries: 10 networks: - app_network diff --git a/apps/modeling-commons-backend/generated/prisma/edge.js b/apps/modeling-commons-backend/generated/prisma/edge.js index 057b7de7..0c816b6b 100644 --- a/apps/modeling-commons-backend/generated/prisma/edge.js +++ b/apps/modeling-commons-backend/generated/prisma/edge.js @@ -192,6 +192,7 @@ exports.Prisma.ModelVersionScalarFieldEnum = { versionNumber: 'versionNumber', title: 'title', description: 'description', + changeSummary: 'changeSummary', previewImageFileKey: 'previewImageFileKey', netlogoFileKey: 'netlogoFileKey', netlogoVersion: 'netlogoVersion', @@ -200,13 +201,6 @@ exports.Prisma.ModelVersionScalarFieldEnum = { finalizedAt: 'finalizedAt' }; -exports.Prisma.ModelVersionFileScalarFieldEnum = { - id: 'id', - modelId: 'modelId', - versionNumber: 'versionNumber', - fileKey: 'fileKey' -}; - exports.Prisma.ModelVersionTagScalarFieldEnum = { modelId: 'modelId', versionNumber: 'versionNumber', @@ -219,6 +213,7 @@ exports.Prisma.ModelAdditionalFileScalarFieldEnum = { modelId: 'modelId', taggedVersionNumber: 'taggedVersionNumber', fileKey: 'fileKey', + kind: 'kind', createdAt: 'createdAt' }; @@ -353,6 +348,11 @@ exports.ModelInteractionKind = exports.$Enums.ModelInteractionKind = { share: 'share' }; +exports.ModelFileKind = exports.$Enums.ModelFileKind = { + model: 'model', + additional: 'additional' +}; + exports.Prisma.ModelName = { User: 'User', Account: 'Account', @@ -361,7 +361,6 @@ exports.Prisma.ModelName = { Passkey: 'Passkey', Model: 'Model', ModelVersion: 'ModelVersion', - ModelVersionFile: 'ModelVersionFile', ModelVersionTag: 'ModelVersionTag', ModelAdditionalFile: 'ModelAdditionalFile', Tag: 'Tag', @@ -380,14 +379,14 @@ const config = { "clientVersion": "7.8.0", "engineVersion": "3c6e192761c0362d496ed980de936e2f3cebcd3a", "activeProvider": "postgresql", - "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n output = \"../generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\n// Enums\n\nenum ModelVisibility {\n public\n private\n unlisted\n}\n\nenum SystemRole {\n admin\n moderator\n user\n}\n\nenum UserKind {\n student\n teacher\n researcher\n other\n}\n\nenum AuthorRole {\n owner\n contributor\n}\n\nenum PermissionLevel {\n read\n write\n admin\n}\n\nenum ModelInteractionKind {\n view\n run\n download\n share\n}\n\n// Better Auth core tables\n\nmodel User {\n id String @id @default(uuid())\n name String?\n email String? @unique\n emailVerified Boolean @default(false)\n image String?\n createdAt DateTime @default(now()) @db.Timestamptz(3)\n updatedAt DateTime @updatedAt @db.Timestamptz(3)\n\n // Extended fields\n systemRole SystemRole @default(user)\n userKind UserKind @default(other)\n isProfilePublic Boolean @default(false)\n deletedAt DateTime?\n\n // User profile fields\n bio String?\n country String?\n socialLinks Json? // e.g. [{ platform: 'twitter', url: '...' }]\n dob DateTime? @db.Date\n affiliation String?\n\n // Better Auth relations\n accounts Account[]\n sessions Session[]\n verifications Verification[]\n\n // Domain relations\n authoredModels ModelAuthor[]\n grantedPermissions ModelPermission[]\n events Event[]\n modelLikes ModelLike[]\n modelInteractions ModelInteraction[]\n modelDrafts ModelDraft[]\n\n // Better Auth Admin plugin\n role String?\n banned Boolean?\n banReason String?\n banExpires DateTime? @db.Timestamptz(3)\n\n // Application behavior\n onboardedAt DateTime? @db.Timestamptz(3)\n legacyId Int? @unique\n\n // Passkey relations\n passkeys Passkey[]\n}\n\nmodel Account {\n id String @id @default(uuid())\n userId String\n accountId String\n providerId String\n accessToken String?\n refreshToken String?\n accessTokenExpiresAt DateTime? @db.Timestamptz(3)\n refreshTokenExpiresAt DateTime? @db.Timestamptz(3)\n scope String?\n idToken String?\n password String?\n createdAt DateTime @default(now()) @db.Timestamptz(3)\n updatedAt DateTime @updatedAt @db.Timestamptz(3)\n\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@index([userId])\n}\n\nmodel Session {\n id String @id @default(uuid())\n userId String\n expiresAt DateTime\n token String @unique\n ipAddress String?\n userAgent String?\n createdAt DateTime @default(now()) @db.Timestamptz(3)\n updatedAt DateTime @updatedAt @db.Timestamptz(3)\n\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n // Better Auth Admin plugin fields\n impersonatedBy String?\n\n @@index([userId])\n}\n\nmodel Verification {\n id String @id @default(uuid())\n identifier String\n value String\n expiresAt DateTime\n createdAt DateTime? @default(now()) @db.Timestamptz(3)\n updatedAt DateTime? @updatedAt @db.Timestamptz(3)\n\n user User? @relation(fields: [userId], references: [id], onDelete: Cascade)\n userId String?\n\n @@index([userId])\n}\n\nmodel Passkey {\n id String @id @default(uuid())\n name String?\n publicKey String\n userId String\n credentialID String\n counter Int\n deviceType String\n backedUp Boolean\n transports String?\n createdAt DateTime? @default(now()) @db.Timestamptz(3)\n aaguid String?\n\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n}\n\n// Domain models\n\nmodel Model {\n id String @id @default(uuid())\n legacyId Int? @unique\n latestVersionNumber Int?\n parentModelId String?\n parentVersionNumber Int?\n visibility ModelVisibility @default(public)\n isEndorsed Boolean @default(false)\n isLibraryModel Boolean @default(false)\n viewCount Int @default(0)\n runCount Int @default(0)\n downloadCount Int @default(0)\n shareCount Int @default(0)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n deletedAt DateTime?\n\n latestVersion ModelVersion? @relation(\"LatestVersion\", fields: [id, latestVersionNumber], references: [modelId, versionNumber])\n parentModel Model? @relation(\"ModelParent\", fields: [parentModelId], references: [id])\n childModels Model[] @relation(\"ModelParent\")\n parentVersion ModelVersion? @relation(\"ParentVersion\", fields: [parentModelId, parentVersionNumber], references: [modelId, versionNumber])\n\n versions ModelVersion[] @relation(\"ModelVersions\")\n authors ModelAuthor[]\n permissions ModelPermission[]\n additionalFiles ModelAdditionalFile[]\n likes ModelLike[]\n interactions ModelInteraction[]\n drafts ModelDraft[]\n\n @@unique([id, latestVersionNumber])\n @@index([parentModelId])\n @@index([parentModelId, parentVersionNumber])\n @@index([viewCount])\n @@index([runCount])\n @@index([downloadCount])\n}\n\nmodel ModelVersion {\n modelId String\n versionNumber Int\n title String\n description String?\n previewImageFileKey String?\n netlogoFileKey String\n netlogoVersion String?\n infoTab String?\n createdAt DateTime @default(now())\n finalizedAt DateTime?\n\n model Model @relation(\"ModelVersions\", fields: [modelId], references: [id], onDelete: Cascade)\n\n // Reverse relations\n latestOfModel Model? @relation(\"LatestVersion\")\n parentOfModels Model[] @relation(\"ParentVersion\")\n\n files ModelVersionFile[]\n tags ModelVersionTag[]\n taggedAdditionalFiles ModelAdditionalFile[]\n\n @@id([modelId, versionNumber])\n @@index([modelId])\n}\n\nmodel ModelVersionFile {\n id String @id @default(uuid())\n modelId String\n versionNumber Int\n fileKey String\n\n modelVersion ModelVersion @relation(fields: [modelId, versionNumber], references: [modelId, versionNumber], onDelete: Cascade)\n\n @@index([modelId, versionNumber])\n @@index([fileKey])\n}\n\nmodel ModelVersionTag {\n modelId String\n versionNumber Int\n tagId String\n createdAt DateTime @default(now())\n\n modelVersion ModelVersion @relation(fields: [modelId, versionNumber], references: [modelId, versionNumber], onDelete: Cascade)\n tag Tag @relation(fields: [tagId], references: [id], onDelete: Cascade)\n\n @@id([modelId, versionNumber, tagId])\n @@index([tagId])\n}\n\nmodel ModelAdditionalFile {\n id String @id @default(uuid())\n modelId String\n taggedVersionNumber Int\n fileKey String\n createdAt DateTime @default(now())\n\n model Model @relation(fields: [modelId], references: [id], onDelete: Cascade)\n taggedVersion ModelVersion @relation(fields: [modelId, taggedVersionNumber], references: [modelId, versionNumber])\n\n @@index([modelId])\n @@index([modelId, taggedVersionNumber])\n}\n\nmodel Tag {\n id String @id @default(uuid())\n legacyId Int? @unique\n name String @unique\n displayName String?\n createdAt DateTime @default(now())\n\n modelVersions ModelVersionTag[]\n}\n\nmodel ModelAuthor {\n modelId String\n userId String\n role AuthorRole\n createdAt DateTime @default(now())\n\n model Model @relation(fields: [modelId], references: [id], onDelete: Cascade)\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@id([modelId, userId])\n @@index([userId])\n}\n\nmodel ModelPermission {\n id String @id @default(uuid())\n modelId String\n granteeUserId String?\n permissionLevel PermissionLevel\n createdAt DateTime @default(now())\n\n model Model @relation(fields: [modelId], references: [id], onDelete: Cascade)\n granteeUser User? @relation(fields: [granteeUserId], references: [id], onDelete: Cascade)\n\n @@unique([modelId, granteeUserId])\n @@index([modelId])\n @@index([granteeUserId])\n}\n\nmodel ModelLike {\n modelId String\n userId String\n createdAt DateTime @default(now()) @db.Timestamptz(3)\n\n model Model @relation(fields: [modelId], references: [id], onDelete: Cascade)\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@id([modelId, userId])\n @@index([userId])\n @@index([modelId, createdAt])\n}\n\nmodel ModelInteraction {\n id String @id @default(uuid())\n modelId String\n versionNumber Int?\n kind ModelInteractionKind\n userId String?\n sessionId String?\n ipHash String?\n userAgent String?\n referer String?\n geo Json?\n cookie String?\n\n createdAt DateTime @default(now()) @db.Timestamptz(3)\n\n model Model @relation(fields: [modelId], references: [id], onDelete: Cascade)\n user User? @relation(fields: [userId], references: [id], onDelete: SetNull)\n\n @@index([modelId, kind, createdAt])\n @@index([modelId, kind, userId])\n @@index([userId, createdAt])\n @@index([createdAt])\n}\n\nmodel ModelDraft {\n id String @id @default(cuid())\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n modelId String?\n model Model? @relation(fields: [modelId], references: [id], onDelete: Cascade)\n\n schemaVersion Int\n data Json\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userId])\n @@index([modelId])\n}\n\nmodel Event {\n id String @id @default(uuid())\n type String\n actorId String\n resourceType String\n resourceId String\n payload Json\n createdAt DateTime @default(now())\n processedAt DateTime?\n\n actor User @relation(fields: [actorId], references: [id])\n\n @@index([actorId])\n @@index([resourceType, resourceId])\n @@index([type])\n @@index([processedAt])\n}\n" + "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n output = \"../generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\n// Enums\n\nenum ModelVisibility {\n public\n private\n unlisted\n}\n\nenum SystemRole {\n admin\n moderator\n user\n}\n\nenum UserKind {\n student\n teacher\n researcher\n other\n}\n\nenum AuthorRole {\n owner\n contributor\n}\n\nenum PermissionLevel {\n read\n write\n admin\n}\n\nenum ModelInteractionKind {\n view\n run\n download\n share\n}\n\nenum ModelFileKind {\n model\n additional\n}\n\n// Better Auth core tables\n\nmodel User {\n id String @id @default(uuid())\n name String?\n email String? @unique\n emailVerified Boolean @default(false)\n image String?\n createdAt DateTime @default(now()) @db.Timestamptz(3)\n updatedAt DateTime @updatedAt @db.Timestamptz(3)\n\n // Extended fields\n systemRole SystemRole @default(user)\n userKind UserKind @default(other)\n isProfilePublic Boolean @default(false)\n deletedAt DateTime?\n\n // User profile fields\n bio String?\n country String?\n socialLinks Json? // e.g. [{ platform: 'twitter', url: '...' }]\n dob DateTime? @db.Date\n affiliation String?\n\n // Better Auth relations\n accounts Account[]\n sessions Session[]\n verifications Verification[]\n\n // Domain relations\n authoredModels ModelAuthor[]\n grantedPermissions ModelPermission[]\n events Event[]\n modelLikes ModelLike[]\n modelInteractions ModelInteraction[]\n modelDrafts ModelDraft[]\n\n // Better Auth Admin plugin\n role String?\n banned Boolean?\n banReason String?\n banExpires DateTime? @db.Timestamptz(3)\n\n // Application behavior\n onboardedAt DateTime? @db.Timestamptz(3)\n legacyId Int? @unique\n\n // Passkey relations\n passkeys Passkey[]\n}\n\nmodel Account {\n id String @id @default(uuid())\n userId String\n accountId String\n providerId String\n accessToken String?\n refreshToken String?\n accessTokenExpiresAt DateTime? @db.Timestamptz(3)\n refreshTokenExpiresAt DateTime? @db.Timestamptz(3)\n scope String?\n idToken String?\n password String?\n createdAt DateTime @default(now()) @db.Timestamptz(3)\n updatedAt DateTime @updatedAt @db.Timestamptz(3)\n\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@index([userId])\n}\n\nmodel Session {\n id String @id @default(uuid())\n userId String\n expiresAt DateTime\n token String @unique\n ipAddress String?\n userAgent String?\n createdAt DateTime @default(now()) @db.Timestamptz(3)\n updatedAt DateTime @updatedAt @db.Timestamptz(3)\n\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n // Better Auth Admin plugin fields\n impersonatedBy String?\n\n @@index([userId])\n}\n\nmodel Verification {\n id String @id @default(uuid())\n identifier String\n value String\n expiresAt DateTime\n createdAt DateTime? @default(now()) @db.Timestamptz(3)\n updatedAt DateTime? @updatedAt @db.Timestamptz(3)\n\n user User? @relation(fields: [userId], references: [id], onDelete: Cascade)\n userId String?\n\n @@index([userId])\n}\n\nmodel Passkey {\n id String @id @default(uuid())\n name String?\n publicKey String\n userId String\n credentialID String\n counter Int\n deviceType String\n backedUp Boolean\n transports String?\n createdAt DateTime? @default(now()) @db.Timestamptz(3)\n aaguid String?\n\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n}\n\n// Domain models\n\nmodel Model {\n id String @id @default(uuid())\n legacyId Int? @unique\n latestVersionNumber Int?\n parentModelId String?\n parentVersionNumber Int?\n visibility ModelVisibility @default(public)\n isEndorsed Boolean @default(false)\n isLibraryModel Boolean @default(false)\n viewCount Int @default(0)\n runCount Int @default(0)\n downloadCount Int @default(0)\n shareCount Int @default(0)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n deletedAt DateTime?\n\n latestVersion ModelVersion? @relation(\"LatestVersion\", fields: [id, latestVersionNumber], references: [modelId, versionNumber])\n parentModel Model? @relation(\"ModelParent\", fields: [parentModelId], references: [id])\n childModels Model[] @relation(\"ModelParent\")\n parentVersion ModelVersion? @relation(\"ParentVersion\", fields: [parentModelId, parentVersionNumber], references: [modelId, versionNumber])\n\n versions ModelVersion[] @relation(\"ModelVersions\")\n authors ModelAuthor[]\n permissions ModelPermission[]\n additionalFiles ModelAdditionalFile[]\n likes ModelLike[]\n interactions ModelInteraction[]\n drafts ModelDraft[]\n\n @@unique([id, latestVersionNumber])\n @@index([parentModelId])\n @@index([parentModelId, parentVersionNumber])\n @@index([viewCount])\n @@index([runCount])\n @@index([downloadCount])\n}\n\nmodel ModelVersion {\n modelId String\n versionNumber Int\n title String\n description String?\n changeSummary String?\n previewImageFileKey String?\n netlogoFileKey String\n netlogoVersion String?\n infoTab String?\n createdAt DateTime @default(now())\n finalizedAt DateTime?\n\n model Model @relation(\"ModelVersions\", fields: [modelId], references: [id], onDelete: Cascade)\n\n // Reverse relations\n latestOfModel Model? @relation(\"LatestVersion\")\n parentOfModels Model[] @relation(\"ParentVersion\")\n\n tags ModelVersionTag[]\n taggedAdditionalFiles ModelAdditionalFile[]\n\n @@id([modelId, versionNumber])\n @@index([modelId])\n}\n\nmodel ModelVersionTag {\n modelId String\n versionNumber Int\n tagId String\n createdAt DateTime @default(now())\n\n modelVersion ModelVersion @relation(fields: [modelId, versionNumber], references: [modelId, versionNumber], onDelete: Cascade)\n tag Tag @relation(fields: [tagId], references: [id], onDelete: Cascade)\n\n @@id([modelId, versionNumber, tagId])\n @@index([tagId])\n}\n\nmodel ModelAdditionalFile {\n id String @id @default(uuid())\n modelId String\n taggedVersionNumber Int\n fileKey String\n kind ModelFileKind @default(additional)\n createdAt DateTime @default(now())\n\n model Model @relation(fields: [modelId], references: [id], onDelete: Cascade)\n taggedVersion ModelVersion @relation(fields: [modelId, taggedVersionNumber], references: [modelId, versionNumber])\n\n @@index([modelId])\n @@index([modelId, taggedVersionNumber])\n}\n\nmodel Tag {\n id String @id @default(uuid())\n legacyId Int? @unique\n name String @unique\n displayName String?\n createdAt DateTime @default(now())\n\n modelVersions ModelVersionTag[]\n}\n\nmodel ModelAuthor {\n modelId String\n userId String\n role AuthorRole\n createdAt DateTime @default(now())\n\n model Model @relation(fields: [modelId], references: [id], onDelete: Cascade)\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@id([modelId, userId])\n @@index([userId])\n}\n\nmodel ModelPermission {\n id String @id @default(uuid())\n modelId String\n granteeUserId String?\n permissionLevel PermissionLevel\n createdAt DateTime @default(now())\n\n model Model @relation(fields: [modelId], references: [id], onDelete: Cascade)\n granteeUser User? @relation(fields: [granteeUserId], references: [id], onDelete: Cascade)\n\n @@unique([modelId, granteeUserId])\n @@index([modelId])\n @@index([granteeUserId])\n}\n\nmodel ModelLike {\n modelId String\n userId String\n createdAt DateTime @default(now()) @db.Timestamptz(3)\n\n model Model @relation(fields: [modelId], references: [id], onDelete: Cascade)\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@id([modelId, userId])\n @@index([userId])\n @@index([modelId, createdAt])\n}\n\nmodel ModelInteraction {\n id String @id @default(uuid())\n modelId String\n versionNumber Int?\n kind ModelInteractionKind\n userId String?\n sessionId String?\n ipHash String?\n userAgent String?\n referer String?\n geo Json?\n cookie String?\n\n createdAt DateTime @default(now()) @db.Timestamptz(3)\n\n model Model @relation(fields: [modelId], references: [id], onDelete: Cascade)\n user User? @relation(fields: [userId], references: [id], onDelete: SetNull)\n\n @@index([modelId, kind, createdAt])\n @@index([modelId, kind, userId])\n @@index([userId, createdAt])\n @@index([createdAt])\n}\n\nmodel ModelDraft {\n id String @id @default(cuid())\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n modelId String?\n model Model? @relation(fields: [modelId], references: [id], onDelete: Cascade)\n\n schemaVersion Int\n data Json\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userId])\n @@index([modelId])\n}\n\nmodel Event {\n id String @id @default(uuid())\n type String\n actorId String\n resourceType String\n resourceId String\n payload Json\n createdAt DateTime @default(now())\n processedAt DateTime?\n\n actor User @relation(fields: [actorId], references: [id])\n\n @@index([actorId])\n @@index([resourceType, resourceId])\n @@index([type])\n @@index([processedAt])\n}\n" } -config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"emailVerified\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"image\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"systemRole\",\"kind\":\"enum\",\"type\":\"SystemRole\"},{\"name\":\"userKind\",\"kind\":\"enum\",\"type\":\"UserKind\"},{\"name\":\"isProfilePublic\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"bio\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"country\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"socialLinks\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"dob\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"affiliation\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accounts\",\"kind\":\"object\",\"type\":\"Account\",\"relationName\":\"AccountToUser\"},{\"name\":\"sessions\",\"kind\":\"object\",\"type\":\"Session\",\"relationName\":\"SessionToUser\"},{\"name\":\"verifications\",\"kind\":\"object\",\"type\":\"Verification\",\"relationName\":\"UserToVerification\"},{\"name\":\"authoredModels\",\"kind\":\"object\",\"type\":\"ModelAuthor\",\"relationName\":\"ModelAuthorToUser\"},{\"name\":\"grantedPermissions\",\"kind\":\"object\",\"type\":\"ModelPermission\",\"relationName\":\"ModelPermissionToUser\"},{\"name\":\"events\",\"kind\":\"object\",\"type\":\"Event\",\"relationName\":\"EventToUser\"},{\"name\":\"modelLikes\",\"kind\":\"object\",\"type\":\"ModelLike\",\"relationName\":\"ModelLikeToUser\"},{\"name\":\"modelInteractions\",\"kind\":\"object\",\"type\":\"ModelInteraction\",\"relationName\":\"ModelInteractionToUser\"},{\"name\":\"modelDrafts\",\"kind\":\"object\",\"type\":\"ModelDraft\",\"relationName\":\"ModelDraftToUser\"},{\"name\":\"role\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"banned\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"banReason\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"banExpires\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"onboardedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"passkeys\",\"kind\":\"object\",\"type\":\"Passkey\",\"relationName\":\"PasskeyToUser\"}],\"dbName\":null},\"Account\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accountId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"providerId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accessToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"refreshToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accessTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"refreshTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"scope\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"idToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"AccountToUser\"}],\"dbName\":null},\"Session\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"token\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"SessionToUser\"},{\"name\":\"impersonatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"Verification\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"identifier\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"UserToVerification\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"Passkey\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"publicKey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"credentialID\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"counter\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"deviceType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"backedUp\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"transports\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"aaguid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"PasskeyToUser\"}],\"dbName\":null},\"Model\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"latestVersionNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"parentModelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"parentVersionNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"visibility\",\"kind\":\"enum\",\"type\":\"ModelVisibility\"},{\"name\":\"isEndorsed\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"isLibraryModel\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"viewCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"runCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"downloadCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"shareCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"latestVersion\",\"kind\":\"object\",\"type\":\"ModelVersion\",\"relationName\":\"LatestVersion\"},{\"name\":\"parentModel\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelParent\"},{\"name\":\"childModels\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelParent\"},{\"name\":\"parentVersion\",\"kind\":\"object\",\"type\":\"ModelVersion\",\"relationName\":\"ParentVersion\"},{\"name\":\"versions\",\"kind\":\"object\",\"type\":\"ModelVersion\",\"relationName\":\"ModelVersions\"},{\"name\":\"authors\",\"kind\":\"object\",\"type\":\"ModelAuthor\",\"relationName\":\"ModelToModelAuthor\"},{\"name\":\"permissions\",\"kind\":\"object\",\"type\":\"ModelPermission\",\"relationName\":\"ModelToModelPermission\"},{\"name\":\"additionalFiles\",\"kind\":\"object\",\"type\":\"ModelAdditionalFile\",\"relationName\":\"ModelToModelAdditionalFile\"},{\"name\":\"likes\",\"kind\":\"object\",\"type\":\"ModelLike\",\"relationName\":\"ModelToModelLike\"},{\"name\":\"interactions\",\"kind\":\"object\",\"type\":\"ModelInteraction\",\"relationName\":\"ModelToModelInteraction\"},{\"name\":\"drafts\",\"kind\":\"object\",\"type\":\"ModelDraft\",\"relationName\":\"ModelToModelDraft\"}],\"dbName\":null},\"ModelVersion\":{\"fields\":[{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"versionNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"previewImageFileKey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"netlogoFileKey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"netlogoVersion\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"infoTab\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"finalizedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"model\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelVersions\"},{\"name\":\"latestOfModel\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"LatestVersion\"},{\"name\":\"parentOfModels\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ParentVersion\"},{\"name\":\"files\",\"kind\":\"object\",\"type\":\"ModelVersionFile\",\"relationName\":\"ModelVersionToModelVersionFile\"},{\"name\":\"tags\",\"kind\":\"object\",\"type\":\"ModelVersionTag\",\"relationName\":\"ModelVersionToModelVersionTag\"},{\"name\":\"taggedAdditionalFiles\",\"kind\":\"object\",\"type\":\"ModelAdditionalFile\",\"relationName\":\"ModelAdditionalFileToModelVersion\"}],\"dbName\":null},\"ModelVersionFile\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"versionNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"fileKey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"modelVersion\",\"kind\":\"object\",\"type\":\"ModelVersion\",\"relationName\":\"ModelVersionToModelVersionFile\"}],\"dbName\":null},\"ModelVersionTag\":{\"fields\":[{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"versionNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"tagId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"modelVersion\",\"kind\":\"object\",\"type\":\"ModelVersion\",\"relationName\":\"ModelVersionToModelVersionTag\"},{\"name\":\"tag\",\"kind\":\"object\",\"type\":\"Tag\",\"relationName\":\"ModelVersionTagToTag\"}],\"dbName\":null},\"ModelAdditionalFile\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"taggedVersionNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"fileKey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"model\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelToModelAdditionalFile\"},{\"name\":\"taggedVersion\",\"kind\":\"object\",\"type\":\"ModelVersion\",\"relationName\":\"ModelAdditionalFileToModelVersion\"}],\"dbName\":null},\"Tag\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"displayName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"modelVersions\",\"kind\":\"object\",\"type\":\"ModelVersionTag\",\"relationName\":\"ModelVersionTagToTag\"}],\"dbName\":null},\"ModelAuthor\":{\"fields\":[{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"AuthorRole\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"model\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelToModelAuthor\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ModelAuthorToUser\"}],\"dbName\":null},\"ModelPermission\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"granteeUserId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"permissionLevel\",\"kind\":\"enum\",\"type\":\"PermissionLevel\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"model\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelToModelPermission\"},{\"name\":\"granteeUser\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ModelPermissionToUser\"}],\"dbName\":null},\"ModelLike\":{\"fields\":[{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"model\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelToModelLike\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ModelLikeToUser\"}],\"dbName\":null},\"ModelInteraction\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"versionNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"kind\",\"kind\":\"enum\",\"type\":\"ModelInteractionKind\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sessionId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"ipHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"referer\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"geo\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"cookie\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"model\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelToModelInteraction\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ModelInteractionToUser\"}],\"dbName\":null},\"ModelDraft\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ModelDraftToUser\"},{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"model\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelToModelDraft\"},{\"name\":\"schemaVersion\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"data\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Event\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"actorId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"resourceType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"resourceId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"payload\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"processedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"actor\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"EventToUser\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"emailVerified\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"image\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"systemRole\",\"kind\":\"enum\",\"type\":\"SystemRole\"},{\"name\":\"userKind\",\"kind\":\"enum\",\"type\":\"UserKind\"},{\"name\":\"isProfilePublic\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"bio\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"country\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"socialLinks\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"dob\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"affiliation\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accounts\",\"kind\":\"object\",\"type\":\"Account\",\"relationName\":\"AccountToUser\"},{\"name\":\"sessions\",\"kind\":\"object\",\"type\":\"Session\",\"relationName\":\"SessionToUser\"},{\"name\":\"verifications\",\"kind\":\"object\",\"type\":\"Verification\",\"relationName\":\"UserToVerification\"},{\"name\":\"authoredModels\",\"kind\":\"object\",\"type\":\"ModelAuthor\",\"relationName\":\"ModelAuthorToUser\"},{\"name\":\"grantedPermissions\",\"kind\":\"object\",\"type\":\"ModelPermission\",\"relationName\":\"ModelPermissionToUser\"},{\"name\":\"events\",\"kind\":\"object\",\"type\":\"Event\",\"relationName\":\"EventToUser\"},{\"name\":\"modelLikes\",\"kind\":\"object\",\"type\":\"ModelLike\",\"relationName\":\"ModelLikeToUser\"},{\"name\":\"modelInteractions\",\"kind\":\"object\",\"type\":\"ModelInteraction\",\"relationName\":\"ModelInteractionToUser\"},{\"name\":\"modelDrafts\",\"kind\":\"object\",\"type\":\"ModelDraft\",\"relationName\":\"ModelDraftToUser\"},{\"name\":\"role\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"banned\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"banReason\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"banExpires\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"onboardedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"passkeys\",\"kind\":\"object\",\"type\":\"Passkey\",\"relationName\":\"PasskeyToUser\"}],\"dbName\":null},\"Account\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accountId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"providerId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accessToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"refreshToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accessTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"refreshTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"scope\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"idToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"AccountToUser\"}],\"dbName\":null},\"Session\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"token\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"SessionToUser\"},{\"name\":\"impersonatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"Verification\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"identifier\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"UserToVerification\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"Passkey\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"publicKey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"credentialID\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"counter\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"deviceType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"backedUp\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"transports\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"aaguid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"PasskeyToUser\"}],\"dbName\":null},\"Model\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"latestVersionNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"parentModelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"parentVersionNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"visibility\",\"kind\":\"enum\",\"type\":\"ModelVisibility\"},{\"name\":\"isEndorsed\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"isLibraryModel\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"viewCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"runCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"downloadCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"shareCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"latestVersion\",\"kind\":\"object\",\"type\":\"ModelVersion\",\"relationName\":\"LatestVersion\"},{\"name\":\"parentModel\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelParent\"},{\"name\":\"childModels\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelParent\"},{\"name\":\"parentVersion\",\"kind\":\"object\",\"type\":\"ModelVersion\",\"relationName\":\"ParentVersion\"},{\"name\":\"versions\",\"kind\":\"object\",\"type\":\"ModelVersion\",\"relationName\":\"ModelVersions\"},{\"name\":\"authors\",\"kind\":\"object\",\"type\":\"ModelAuthor\",\"relationName\":\"ModelToModelAuthor\"},{\"name\":\"permissions\",\"kind\":\"object\",\"type\":\"ModelPermission\",\"relationName\":\"ModelToModelPermission\"},{\"name\":\"additionalFiles\",\"kind\":\"object\",\"type\":\"ModelAdditionalFile\",\"relationName\":\"ModelToModelAdditionalFile\"},{\"name\":\"likes\",\"kind\":\"object\",\"type\":\"ModelLike\",\"relationName\":\"ModelToModelLike\"},{\"name\":\"interactions\",\"kind\":\"object\",\"type\":\"ModelInteraction\",\"relationName\":\"ModelToModelInteraction\"},{\"name\":\"drafts\",\"kind\":\"object\",\"type\":\"ModelDraft\",\"relationName\":\"ModelToModelDraft\"}],\"dbName\":null},\"ModelVersion\":{\"fields\":[{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"versionNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"changeSummary\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"previewImageFileKey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"netlogoFileKey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"netlogoVersion\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"infoTab\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"finalizedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"model\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelVersions\"},{\"name\":\"latestOfModel\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"LatestVersion\"},{\"name\":\"parentOfModels\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ParentVersion\"},{\"name\":\"tags\",\"kind\":\"object\",\"type\":\"ModelVersionTag\",\"relationName\":\"ModelVersionToModelVersionTag\"},{\"name\":\"taggedAdditionalFiles\",\"kind\":\"object\",\"type\":\"ModelAdditionalFile\",\"relationName\":\"ModelAdditionalFileToModelVersion\"}],\"dbName\":null},\"ModelVersionTag\":{\"fields\":[{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"versionNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"tagId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"modelVersion\",\"kind\":\"object\",\"type\":\"ModelVersion\",\"relationName\":\"ModelVersionToModelVersionTag\"},{\"name\":\"tag\",\"kind\":\"object\",\"type\":\"Tag\",\"relationName\":\"ModelVersionTagToTag\"}],\"dbName\":null},\"ModelAdditionalFile\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"taggedVersionNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"fileKey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"kind\",\"kind\":\"enum\",\"type\":\"ModelFileKind\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"model\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelToModelAdditionalFile\"},{\"name\":\"taggedVersion\",\"kind\":\"object\",\"type\":\"ModelVersion\",\"relationName\":\"ModelAdditionalFileToModelVersion\"}],\"dbName\":null},\"Tag\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"displayName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"modelVersions\",\"kind\":\"object\",\"type\":\"ModelVersionTag\",\"relationName\":\"ModelVersionTagToTag\"}],\"dbName\":null},\"ModelAuthor\":{\"fields\":[{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"AuthorRole\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"model\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelToModelAuthor\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ModelAuthorToUser\"}],\"dbName\":null},\"ModelPermission\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"granteeUserId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"permissionLevel\",\"kind\":\"enum\",\"type\":\"PermissionLevel\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"model\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelToModelPermission\"},{\"name\":\"granteeUser\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ModelPermissionToUser\"}],\"dbName\":null},\"ModelLike\":{\"fields\":[{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"model\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelToModelLike\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ModelLikeToUser\"}],\"dbName\":null},\"ModelInteraction\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"versionNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"kind\",\"kind\":\"enum\",\"type\":\"ModelInteractionKind\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sessionId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"ipHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"referer\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"geo\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"cookie\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"model\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelToModelInteraction\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ModelInteractionToUser\"}],\"dbName\":null},\"ModelDraft\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ModelDraftToUser\"},{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"model\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelToModelDraft\"},{\"name\":\"schemaVersion\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"data\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Event\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"actorId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"resourceType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"resourceId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"payload\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"processedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"actor\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"EventToUser\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}") defineDmmfProperty(exports.Prisma, config.runtimeDataModel) config.parameterizationSchema = { - strings: JSON.parse("[\"where\",\"orderBy\",\"cursor\",\"user\",\"accounts\",\"sessions\",\"verifications\",\"model\",\"latestOfModel\",\"parentOfModels\",\"modelVersion\",\"files\",\"modelVersions\",\"_count\",\"tag\",\"tags\",\"taggedVersion\",\"taggedAdditionalFiles\",\"latestVersion\",\"parentModel\",\"childModels\",\"parentVersion\",\"versions\",\"authors\",\"granteeUser\",\"permissions\",\"additionalFiles\",\"likes\",\"interactions\",\"drafts\",\"authoredModels\",\"grantedPermissions\",\"actor\",\"events\",\"modelLikes\",\"modelInteractions\",\"modelDrafts\",\"passkeys\",\"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\",\"Account.findUnique\",\"Account.findUniqueOrThrow\",\"Account.findFirst\",\"Account.findFirstOrThrow\",\"Account.findMany\",\"Account.createOne\",\"Account.createMany\",\"Account.createManyAndReturn\",\"Account.updateOne\",\"Account.updateMany\",\"Account.updateManyAndReturn\",\"Account.upsertOne\",\"Account.deleteOne\",\"Account.deleteMany\",\"Account.groupBy\",\"Account.aggregate\",\"Session.findUnique\",\"Session.findUniqueOrThrow\",\"Session.findFirst\",\"Session.findFirstOrThrow\",\"Session.findMany\",\"Session.createOne\",\"Session.createMany\",\"Session.createManyAndReturn\",\"Session.updateOne\",\"Session.updateMany\",\"Session.updateManyAndReturn\",\"Session.upsertOne\",\"Session.deleteOne\",\"Session.deleteMany\",\"Session.groupBy\",\"Session.aggregate\",\"Verification.findUnique\",\"Verification.findUniqueOrThrow\",\"Verification.findFirst\",\"Verification.findFirstOrThrow\",\"Verification.findMany\",\"Verification.createOne\",\"Verification.createMany\",\"Verification.createManyAndReturn\",\"Verification.updateOne\",\"Verification.updateMany\",\"Verification.updateManyAndReturn\",\"Verification.upsertOne\",\"Verification.deleteOne\",\"Verification.deleteMany\",\"Verification.groupBy\",\"Verification.aggregate\",\"Passkey.findUnique\",\"Passkey.findUniqueOrThrow\",\"Passkey.findFirst\",\"Passkey.findFirstOrThrow\",\"Passkey.findMany\",\"Passkey.createOne\",\"Passkey.createMany\",\"Passkey.createManyAndReturn\",\"Passkey.updateOne\",\"Passkey.updateMany\",\"Passkey.updateManyAndReturn\",\"Passkey.upsertOne\",\"Passkey.deleteOne\",\"Passkey.deleteMany\",\"Passkey.groupBy\",\"Passkey.aggregate\",\"Model.findUnique\",\"Model.findUniqueOrThrow\",\"Model.findFirst\",\"Model.findFirstOrThrow\",\"Model.findMany\",\"Model.createOne\",\"Model.createMany\",\"Model.createManyAndReturn\",\"Model.updateOne\",\"Model.updateMany\",\"Model.updateManyAndReturn\",\"Model.upsertOne\",\"Model.deleteOne\",\"Model.deleteMany\",\"Model.groupBy\",\"Model.aggregate\",\"ModelVersion.findUnique\",\"ModelVersion.findUniqueOrThrow\",\"ModelVersion.findFirst\",\"ModelVersion.findFirstOrThrow\",\"ModelVersion.findMany\",\"ModelVersion.createOne\",\"ModelVersion.createMany\",\"ModelVersion.createManyAndReturn\",\"ModelVersion.updateOne\",\"ModelVersion.updateMany\",\"ModelVersion.updateManyAndReturn\",\"ModelVersion.upsertOne\",\"ModelVersion.deleteOne\",\"ModelVersion.deleteMany\",\"ModelVersion.groupBy\",\"ModelVersion.aggregate\",\"ModelVersionFile.findUnique\",\"ModelVersionFile.findUniqueOrThrow\",\"ModelVersionFile.findFirst\",\"ModelVersionFile.findFirstOrThrow\",\"ModelVersionFile.findMany\",\"ModelVersionFile.createOne\",\"ModelVersionFile.createMany\",\"ModelVersionFile.createManyAndReturn\",\"ModelVersionFile.updateOne\",\"ModelVersionFile.updateMany\",\"ModelVersionFile.updateManyAndReturn\",\"ModelVersionFile.upsertOne\",\"ModelVersionFile.deleteOne\",\"ModelVersionFile.deleteMany\",\"ModelVersionFile.groupBy\",\"ModelVersionFile.aggregate\",\"ModelVersionTag.findUnique\",\"ModelVersionTag.findUniqueOrThrow\",\"ModelVersionTag.findFirst\",\"ModelVersionTag.findFirstOrThrow\",\"ModelVersionTag.findMany\",\"ModelVersionTag.createOne\",\"ModelVersionTag.createMany\",\"ModelVersionTag.createManyAndReturn\",\"ModelVersionTag.updateOne\",\"ModelVersionTag.updateMany\",\"ModelVersionTag.updateManyAndReturn\",\"ModelVersionTag.upsertOne\",\"ModelVersionTag.deleteOne\",\"ModelVersionTag.deleteMany\",\"ModelVersionTag.groupBy\",\"ModelVersionTag.aggregate\",\"ModelAdditionalFile.findUnique\",\"ModelAdditionalFile.findUniqueOrThrow\",\"ModelAdditionalFile.findFirst\",\"ModelAdditionalFile.findFirstOrThrow\",\"ModelAdditionalFile.findMany\",\"ModelAdditionalFile.createOne\",\"ModelAdditionalFile.createMany\",\"ModelAdditionalFile.createManyAndReturn\",\"ModelAdditionalFile.updateOne\",\"ModelAdditionalFile.updateMany\",\"ModelAdditionalFile.updateManyAndReturn\",\"ModelAdditionalFile.upsertOne\",\"ModelAdditionalFile.deleteOne\",\"ModelAdditionalFile.deleteMany\",\"ModelAdditionalFile.groupBy\",\"ModelAdditionalFile.aggregate\",\"Tag.findUnique\",\"Tag.findUniqueOrThrow\",\"Tag.findFirst\",\"Tag.findFirstOrThrow\",\"Tag.findMany\",\"Tag.createOne\",\"Tag.createMany\",\"Tag.createManyAndReturn\",\"Tag.updateOne\",\"Tag.updateMany\",\"Tag.updateManyAndReturn\",\"Tag.upsertOne\",\"Tag.deleteOne\",\"Tag.deleteMany\",\"Tag.groupBy\",\"Tag.aggregate\",\"ModelAuthor.findUnique\",\"ModelAuthor.findUniqueOrThrow\",\"ModelAuthor.findFirst\",\"ModelAuthor.findFirstOrThrow\",\"ModelAuthor.findMany\",\"ModelAuthor.createOne\",\"ModelAuthor.createMany\",\"ModelAuthor.createManyAndReturn\",\"ModelAuthor.updateOne\",\"ModelAuthor.updateMany\",\"ModelAuthor.updateManyAndReturn\",\"ModelAuthor.upsertOne\",\"ModelAuthor.deleteOne\",\"ModelAuthor.deleteMany\",\"ModelAuthor.groupBy\",\"ModelAuthor.aggregate\",\"ModelPermission.findUnique\",\"ModelPermission.findUniqueOrThrow\",\"ModelPermission.findFirst\",\"ModelPermission.findFirstOrThrow\",\"ModelPermission.findMany\",\"ModelPermission.createOne\",\"ModelPermission.createMany\",\"ModelPermission.createManyAndReturn\",\"ModelPermission.updateOne\",\"ModelPermission.updateMany\",\"ModelPermission.updateManyAndReturn\",\"ModelPermission.upsertOne\",\"ModelPermission.deleteOne\",\"ModelPermission.deleteMany\",\"ModelPermission.groupBy\",\"ModelPermission.aggregate\",\"ModelLike.findUnique\",\"ModelLike.findUniqueOrThrow\",\"ModelLike.findFirst\",\"ModelLike.findFirstOrThrow\",\"ModelLike.findMany\",\"ModelLike.createOne\",\"ModelLike.createMany\",\"ModelLike.createManyAndReturn\",\"ModelLike.updateOne\",\"ModelLike.updateMany\",\"ModelLike.updateManyAndReturn\",\"ModelLike.upsertOne\",\"ModelLike.deleteOne\",\"ModelLike.deleteMany\",\"ModelLike.groupBy\",\"ModelLike.aggregate\",\"ModelInteraction.findUnique\",\"ModelInteraction.findUniqueOrThrow\",\"ModelInteraction.findFirst\",\"ModelInteraction.findFirstOrThrow\",\"ModelInteraction.findMany\",\"ModelInteraction.createOne\",\"ModelInteraction.createMany\",\"ModelInteraction.createManyAndReturn\",\"ModelInteraction.updateOne\",\"ModelInteraction.updateMany\",\"ModelInteraction.updateManyAndReturn\",\"ModelInteraction.upsertOne\",\"ModelInteraction.deleteOne\",\"ModelInteraction.deleteMany\",\"ModelInteraction.groupBy\",\"ModelInteraction.aggregate\",\"ModelDraft.findUnique\",\"ModelDraft.findUniqueOrThrow\",\"ModelDraft.findFirst\",\"ModelDraft.findFirstOrThrow\",\"ModelDraft.findMany\",\"ModelDraft.createOne\",\"ModelDraft.createMany\",\"ModelDraft.createManyAndReturn\",\"ModelDraft.updateOne\",\"ModelDraft.updateMany\",\"ModelDraft.updateManyAndReturn\",\"ModelDraft.upsertOne\",\"ModelDraft.deleteOne\",\"ModelDraft.deleteMany\",\"ModelDraft.groupBy\",\"ModelDraft.aggregate\",\"Event.findUnique\",\"Event.findUniqueOrThrow\",\"Event.findFirst\",\"Event.findFirstOrThrow\",\"Event.findMany\",\"Event.createOne\",\"Event.createMany\",\"Event.createManyAndReturn\",\"Event.updateOne\",\"Event.updateMany\",\"Event.updateManyAndReturn\",\"Event.upsertOne\",\"Event.deleteOne\",\"Event.deleteMany\",\"Event.groupBy\",\"Event.aggregate\",\"AND\",\"OR\",\"NOT\",\"id\",\"type\",\"actorId\",\"resourceType\",\"resourceId\",\"payload\",\"createdAt\",\"processedAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"contains\",\"startsWith\",\"endsWith\",\"userId\",\"modelId\",\"schemaVersion\",\"updatedAt\",\"versionNumber\",\"ModelInteractionKind\",\"kind\",\"sessionId\",\"ipHash\",\"userAgent\",\"referer\",\"geo\",\"cookie\",\"granteeUserId\",\"PermissionLevel\",\"permissionLevel\",\"AuthorRole\",\"role\",\"legacyId\",\"name\",\"displayName\",\"every\",\"some\",\"none\",\"taggedVersionNumber\",\"fileKey\",\"tagId\",\"title\",\"description\",\"previewImageFileKey\",\"netlogoFileKey\",\"netlogoVersion\",\"infoTab\",\"finalizedAt\",\"latestVersionNumber\",\"parentModelId\",\"parentVersionNumber\",\"ModelVisibility\",\"visibility\",\"isEndorsed\",\"isLibraryModel\",\"viewCount\",\"runCount\",\"downloadCount\",\"shareCount\",\"deletedAt\",\"publicKey\",\"credentialID\",\"counter\",\"deviceType\",\"backedUp\",\"transports\",\"aaguid\",\"identifier\",\"value\",\"expiresAt\",\"token\",\"ipAddress\",\"impersonatedBy\",\"accountId\",\"providerId\",\"accessToken\",\"refreshToken\",\"accessTokenExpiresAt\",\"refreshTokenExpiresAt\",\"scope\",\"idToken\",\"password\",\"email\",\"emailVerified\",\"image\",\"SystemRole\",\"systemRole\",\"UserKind\",\"userKind\",\"isProfilePublic\",\"bio\",\"country\",\"socialLinks\",\"dob\",\"affiliation\",\"banned\",\"banReason\",\"banExpires\",\"onboardedAt\",\"modelId_userId\",\"modelId_granteeUserId\",\"modelId_versionNumber\",\"modelId_versionNumber_tagId\",\"id_latestVersionNumber\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), - graph: "xAmhAZACIwQAAOQEACAFAADlBAAgBgAA5gQAIB4AANgEACAfAADZBAAgIQAA5wQAICIAANoEACAjAADbBAAgJAAA3AQAICUAAOgEACC-AgAA4AQAML8CAAAPABDAAgAA4AQAMMECAQAAAAHHAkAAmgQAId0CQACaBAAh6wIBAJkEACHsAgIAAAAB7QIBAJkEACGHA0AAuAQAIZ4DAQAAAAGfAyAAtwQAIaADAQCZBAAhogMAAOEEogMipAMAAOIEpAMipQMgALcEACGmAwEAmQQAIacDAQCZBAAhqAMAAMAEACCpA0AAuAQAIaoDAQCZBAAhqwMgAOMEACGsAwEAmQQAIa0DQAC4BAAhrgNAALgEACEBAAAAAQAgEQMAALkEACC-AgAA6wQAML8CAAADABDAAgAA6wQAMMECAQCXBAAhxwJAAJoEACHaAgEAlwQAId0CQACaBAAhlQMBAJcEACGWAwEAlwQAIZcDAQCZBAAhmAMBAJkEACGZA0AAuAQAIZoDQAC4BAAhmwMBAJkEACGcAwEAmQQAIZ0DAQCZBAAhCAMAAK4IACCXAwAA7AQAIJgDAADsBAAgmQMAAOwEACCaAwAA7AQAIJsDAADsBAAgnAMAAOwEACCdAwAA7AQAIBEDAAC5BAAgvgIAAOsEADC_AgAAAwAQwAIAAOsEADDBAgEAAAABxwJAAJoEACHaAgEAlwQAId0CQACaBAAhlQMBAJcEACGWAwEAlwQAIZcDAQCZBAAhmAMBAJkEACGZA0AAuAQAIZoDQAC4BAAhmwMBAJkEACGcAwEAmQQAIZ0DAQCZBAAhAwAAAAMAIAEAAAQAMAIAAAUAIA0DAAC5BAAgvgIAAOoEADC_AgAABwAQwAIAAOoEADDBAgEAlwQAIccCQACaBAAh2gIBAJcEACHdAkAAmgQAIeMCAQCZBAAhkQNAAJoEACGSAwEAlwQAIZMDAQCZBAAhlAMBAJkEACEEAwAArggAIOMCAADsBAAgkwMAAOwEACCUAwAA7AQAIA0DAAC5BAAgvgIAAOoEADC_AgAABwAQwAIAAOoEADDBAgEAAAABxwJAAJoEACHaAgEAlwQAId0CQACaBAAh4wIBAJkEACGRA0AAmgQAIZIDAQAAAAGTAwEAmQQAIZQDAQCZBAAhAwAAAAcAIAEAAAgAMAIAAAkAIAsDAADCBAAgvgIAAOkEADC_AgAACwAQwAIAAOkEADDBAgEAlwQAIccCQAC4BAAh2gIBAJkEACHdAkAAuAQAIY8DAQCXBAAhkAMBAJcEACGRA0AAmgQAIQQDAACuCAAgxwIAAOwEACDaAgAA7AQAIN0CAADsBAAgCwMAAMIEACC-AgAA6QQAML8CAAALABDAAgAA6QQAMMECAQAAAAHHAkAAuAQAIdoCAQCZBAAh3QJAALgEACGPAwEAlwQAIZADAQCXBAAhkQNAAJoEACEDAAAACwAgAQAADAAwAgAADQAgIwQAAOQEACAFAADlBAAgBgAA5gQAIB4AANgEACAfAADZBAAgIQAA5wQAICIAANoEACAjAADbBAAgJAAA3AQAICUAAOgEACC-AgAA4AQAML8CAAAPABDAAgAA4AQAMMECAQCXBAAhxwJAAJoEACHdAkAAmgQAIesCAQCZBAAh7AICAJgEACHtAgEAmQQAIYcDQAC4BAAhngMBAJkEACGfAyAAtwQAIaADAQCZBAAhogMAAOEEogMipAMAAOIEpAMipQMgALcEACGmAwEAmQQAIacDAQCZBAAhqAMAAMAEACCpA0AAuAQAIaoDAQCZBAAhqwMgAOMEACGsAwEAmQQAIa0DQAC4BAAhrgNAALgEACEBAAAADwAgCQMAALkEACAHAADBBAAgvgIAAN4EADC_AgAAEQAQwAIAAN4EADDHAkAAmgQAIdoCAQCXBAAh2wIBAJcEACHrAgAA3wTrAiICAwAArggAIAcAAK8IACAKAwAAuQQAIAcAAMEEACC-AgAA3gQAML8CAAARABDAAgAA3gQAMMcCQACaBAAh2gIBAJcEACHbAgEAlwQAIesCAADfBOsCIq8DAADdBAAgAwAAABEAIAEAABIAMAIAABMAIBMHAADBBAAgCAAAvQQAIAkAAMoEACALAADLBAAgDwAAmwQAIBEAAMwEACC-AgAAyQQAML8CAAAVABDAAgAAyQQAMMcCQACaBAAh2wIBAJcEACHeAgIAtgQAIfUCAQCXBAAh9gIBAJkEACH3AgEAmQQAIfgCAQCXBAAh-QIBAJkEACH6AgEAmQQAIfsCQAC4BAAhAQAAABUAIB0SAADWBAAgEwAAvQQAIBQAAMoEACAVAADWBAAgFgAA1wQAIBcAANgEACAZAADZBAAgGgAAzAQAIBsAANoEACAcAADbBAAgHQAA3AQAIL4CAADUBAAwvwIAABcAEMACAADUBAAwwQIBAJcEACHHAkAAmgQAId0CQACaBAAh7AICAJgEACH8AgIAmAQAIf0CAQCZBAAh_gICAJgEACGAAwAA1QSAAyKBAyAAtwQAIYIDIAC3BAAhgwMCALYEACGEAwIAtgQAIYUDAgC2BAAhhgMCALYEACGHA0AAuAQAIQEAAAAXACAQEgAAswgAIBMAAK8IACAUAACwCAAgFQAAswgAIBYAALUIACAXAACnCAAgGQAAqAgAIBoAALIIACAbAACqCAAgHAAAqwgAIB0AAKwIACDsAgAA7AQAIPwCAADsBAAg_QIAAOwEACD-AgAA7AQAIIcDAADsBAAgHhIAANYEACATAAC9BAAgFAAAygQAIBUAANYEACAWAADXBAAgFwAA2AQAIBkAANkEACAaAADMBAAgGwAA2gQAIBwAANsEACAdAADcBAAgvgIAANQEADC_AgAAFwAQwAIAANQEADDBAgEAAAABxwJAAJoEACHdAkAAmgQAIewCAgAAAAH8AgIAmAQAIf0CAQCZBAAh_gICAJgEACGAAwAA1QSAAyKBAyAAtwQAIYIDIAC3BAAhgwMCALYEACGEAwIAtgQAIYUDAgC2BAAhhgMCALYEACGHA0AAuAQAIbMDAADTBAAgAwAAABcAIAEAABkAMAIAABoAIAgKAADOBAAgvgIAANIEADC_AgAAHAAQwAIAANIEADDBAgEAlwQAIdsCAQCXBAAh3gICALYEACHzAgEAlwQAIQEKAACzCAAgCAoAAM4EACC-AgAA0gQAML8CAAAcABDAAgAA0gQAMMECAQAAAAHbAgEAlwQAId4CAgC2BAAh8wIBAJcEACEDAAAAHAAgAQAAHQAwAgAAHgAgCQoAAM4EACAOAADRBAAgvgIAANAEADC_AgAAIAAQwAIAANAEADDHAkAAmgQAIdsCAQCXBAAh3gICALYEACH0AgEAlwQAIQIKAACzCAAgDgAAtAgAIAoKAADOBAAgDgAA0QQAIL4CAADQBAAwvwIAACAAEMACAADQBAAwxwJAAJoEACHbAgEAlwQAId4CAgC2BAAh9AIBAJcEACGyAwAAzwQAIAMAAAAgACABAAAhADACAAAiACADAAAAIAAgAQAAIQAwAgAAIgAgAQAAACAAIAoHAADBBAAgEAAAzgQAIL4CAADNBAAwvwIAACYAEMACAADNBAAwwQIBAJcEACHHAkAAmgQAIdsCAQCXBAAh8gICALYEACHzAgEAlwQAIQIHAACvCAAgEAAAswgAIAoHAADBBAAgEAAAzgQAIL4CAADNBAAwvwIAACYAEMACAADNBAAwwQIBAAAAAccCQACaBAAh2wIBAJcEACHyAgIAtgQAIfMCAQCXBAAhAwAAACYAIAEAACcAMAIAACgAIAEAAAAXACABAAAAHAAgAQAAACAAIAEAAAAmACABAAAAFwAgAwAAABcAIAEAABkAMAIAABoAIAEAAAAVACALBwAArwgAIAgAAK8IACAJAACwCAAgCwAAsQgAIA8AALcFACARAACyCAAg9gIAAOwEACD3AgAA7AQAIPkCAADsBAAg-gIAAOwEACD7AgAA7AQAIBQHAADBBAAgCAAAvQQAIAkAAMoEACALAADLBAAgDwAAmwQAIBEAAMwEACC-AgAAyQQAML8CAAAVABDAAgAAyQQAMMcCQACaBAAh2wIBAJcEACHeAgIAtgQAIfUCAQCXBAAh9gIBAJkEACH3AgEAmQQAIfgCAQCXBAAh-QIBAJkEACH6AgEAmQQAIfsCQAC4BAAhsQMAAMgEACADAAAAFQAgAQAAMQAwAgAAMgAgAwAAABEAIAEAABIAMAIAABMAIAoHAADBBAAgGAAAwgQAIL4CAADGBAAwvwIAADUAEMACAADGBAAwwQIBAJcEACHHAkAAmgQAIdsCAQCXBAAh5wIBAJkEACHpAgAAxwTpAiIDBwAArwgAIBgAAK4IACDnAgAA7AQAIAsHAADBBAAgGAAAwgQAIL4CAADGBAAwvwIAADUAEMACAADGBAAwwQIBAAAAAccCQACaBAAh2wIBAJcEACHnAgEAmQQAIekCAADHBOkCIrADAADFBAAgAwAAADUAIAEAADYAMAIAADcAIAEAAAAPACADAAAAJgAgAQAAJwAwAgAAKAAgCAMAALkEACAHAADBBAAgvgIAAMQEADC_AgAAOwAQwAIAAMQEADDHAkAAmgQAIdoCAQCXBAAh2wIBAJcEACECAwAArggAIAcAAK8IACAJAwAAuQQAIAcAAMEEACC-AgAAxAQAML8CAAA7ABDAAgAAxAQAMMcCQACaBAAh2gIBAJcEACHbAgEAlwQAIa8DAADDBAAgAwAAADsAIAEAADwAMAIAAD0AIBEDAADCBAAgBwAAwQQAIL4CAAC-BAAwvwIAAD8AEMACAAC-BAAwwQIBAJcEACHHAkAAmgQAIdoCAQCZBAAh2wIBAJcEACHeAgIAmAQAIeACAAC_BOACIuECAQCZBAAh4gIBAJkEACHjAgEAmQQAIeQCAQCZBAAh5QIAAMAEACDmAgEAmQQAIQoDAACuCAAgBwAArwgAINoCAADsBAAg3gIAAOwEACDhAgAA7AQAIOICAADsBAAg4wIAAOwEACDkAgAA7AQAIOUCAADsBAAg5gIAAOwEACARAwAAwgQAIAcAAMEEACC-AgAAvgQAML8CAAA_ABDAAgAAvgQAMMECAQAAAAHHAkAAmgQAIdoCAQCZBAAh2wIBAJcEACHeAgIAmAQAIeACAAC_BOACIuECAQCZBAAh4gIBAJkEACHjAgEAmQQAIeQCAQCZBAAh5QIAAMAEACDmAgEAmQQAIQMAAAA_ACABAABAADACAABBACABAAAADwAgDAMAALkEACAHAAC9BAAgKwAAuwQAIL4CAAC8BAAwvwIAAEQAEMACAAC8BAAwwQIBAJcEACHHAkAAmgQAIdoCAQCXBAAh2wIBAJkEACHcAgIAtgQAId0CQACaBAAhAwMAAK4IACAHAACvCAAg2wIAAOwEACAMAwAAuQQAIAcAAL0EACArAAC7BAAgvgIAALwEADC_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_AgAAegAQwAIAAKsEADDBAgEA7wMAIccCQADxAwAh3QJAAPEDACHrAgEA_QMAIewCAgCEBAAh7QIBAP0DACGHA0AA8gMAIZ4DAQD9AwAhnwMgAKIEACGgAwEA_QMAIaIDAACsBKIDIqQDAACtBKQDIqUDIACiBAAhpgMBAP0DACGnAwEA_QMAIagDAACGBAAgqQNAAPIDACGqAwEA_QMAIasDIACuBAAhrAMBAP0DACGtA0AA8gMAIa4DQADyAwAhAwAAAA8AIAEAAHkAMDcAAHoAIAMAAAAPACABAABoADACAAABACABAAAABQAgAQAAAAUAIAMAAAADACABAAAEADACAAAFACADAAAAAwAgAQAABAAwAgAABQAgAwAAAAMAIAEAAAQAMAIAAAUAIA4DAACeBwAgwQIBAAAAAccCQAAAAAHaAgEAAAAB3QJAAAAAAZUDAQAAAAGWAwEAAAABlwMBAAAAAZgDAQAAAAGZA0AAAAABmgNAAAAAAZsDAQAAAAGcAwEAAAABnQMBAAAAAQErAACCAQAgDcECAQAAAAHHAkAAAAAB2gIBAAAAAd0CQAAAAAGVAwEAAAABlgMBAAAAAZcDAQAAAAGYAwEAAAABmQNAAAAAAZoDQAAAAAGbAwEAAAABnAMBAAAAAZ0DAQAAAAEBKwAAhAEAMAErAACEAQAwDgMAAJ0HACDBAgEA8AQAIccCQADxBAAh2gIBAPAEACHdAkAA8QQAIZUDAQDwBAAhlgMBAPAEACGXAwEA-wQAIZgDAQD7BAAhmQNAAPIEACGaA0AA8gQAIZsDAQD7BAAhnAMBAPsEACGdAwEA-wQAIQIAAAAFACArAACHAQAgDcECAQDwBAAhxwJAAPEEACHaAgEA8AQAId0CQADxBAAhlQMBAPAEACGWAwEA8AQAIZcDAQD7BAAhmAMBAPsEACGZA0AA8gQAIZoDQADyBAAhmwMBAPsEACGcAwEA-wQAIZ0DAQD7BAAhAgAAAAMAICsAAIkBACACAAAAAwAgKwAAiQEAIAMAAAAFACAyAACCAQAgMwAAhwEAIAEAAAAFACABAAAAAwAgCg0AAJoHACA6AACcBwAgOwAAmwcAIJcDAADsBAAgmAMAAOwEACCZAwAA7AQAIJoDAADsBAAgmwMAAOwEACCcAwAA7AQAIJ0DAADsBAAgEL4CAACqBAAwvwIAAJABABDAAgAAqgQAMMECAQDvAwAhxwJAAPEDACHaAgEA7wMAId0CQADxAwAhlQMBAO8DACGWAwEA7wMAIZcDAQD9AwAhmAMBAP0DACGZA0AA8gMAIZoDQADyAwAhmwMBAP0DACGcAwEA_QMAIZ0DAQD9AwAhAwAAAAMAIAEAAI8BADA3AACQAQAgAwAAAAMAIAEAAAQAMAIAAAUAIAEAAAAJACABAAAACQAgAwAAAAcAIAEAAAgAMAIAAAkAIAMAAAAHACABAAAIADACAAAJACADAAAABwAgAQAACAAwAgAACQAgCgMAAJkHACDBAgEAAAABxwJAAAAAAdoCAQAAAAHdAkAAAAAB4wIBAAAAAZEDQAAAAAGSAwEAAAABkwMBAAAAAZQDAQAAAAEBKwAAmAEAIAnBAgEAAAABxwJAAAAAAdoCAQAAAAHdAkAAAAAB4wIBAAAAAZEDQAAAAAGSAwEAAAABkwMBAAAAAZQDAQAAAAEBKwAAmgEAMAErAACaAQAwCgMAAJgHACDBAgEA8AQAIccCQADxBAAh2gIBAPAEACHdAkAA8QQAIeMCAQD7BAAhkQNAAPEEACGSAwEA8AQAIZMDAQD7BAAhlAMBAPsEACECAAAACQAgKwAAnQEAIAnBAgEA8AQAIccCQADxBAAh2gIBAPAEACHdAkAA8QQAIeMCAQD7BAAhkQNAAPEEACGSAwEA8AQAIZMDAQD7BAAhlAMBAPsEACECAAAABwAgKwAAnwEAIAIAAAAHACArAACfAQAgAwAAAAkAIDIAAJgBACAzAACdAQAgAQAAAAkAIAEAAAAHACAGDQAAlQcAIDoAAJcHACA7AACWBwAg4wIAAOwEACCTAwAA7AQAIJQDAADsBAAgDL4CAACpBAAwvwIAAKYBABDAAgAAqQQAMMECAQDvAwAhxwJAAPEDACHaAgEA7wMAId0CQADxAwAh4wIBAP0DACGRA0AA8QMAIZIDAQDvAwAhkwMBAP0DACGUAwEA_QMAIQMAAAAHACABAAClAQAwNwAApgEAIAMAAAAHACABAAAIADACAAAJACABAAAADQAgAQAAAA0AIAMAAAALACABAAAMADACAAANACADAAAACwAgAQAADAAwAgAADQAgAwAAAAsAIAEAAAwAMAIAAA0AIAgDAACUBwAgwQIBAAAAAccCQAAAAAHaAgEAAAAB3QJAAAAAAY8DAQAAAAGQAwEAAAABkQNAAAAAAQErAACuAQAgB8ECAQAAAAHHAkAAAAAB2gIBAAAAAd0CQAAAAAGPAwEAAAABkAMBAAAAAZEDQAAAAAEBKwAAsAEAMAErAACwAQAwAQAAAA8AIAgDAACTBwAgwQIBAPAEACHHAkAA8gQAIdoCAQD7BAAh3QJAAPIEACGPAwEA8AQAIZADAQDwBAAhkQNAAPEEACECAAAADQAgKwAAtAEAIAfBAgEA8AQAIccCQADyBAAh2gIBAPsEACHdAkAA8gQAIY8DAQDwBAAhkAMBAPAEACGRA0AA8QQAIQIAAAALACArAAC2AQAgAgAAAAsAICsAALYBACABAAAADwAgAwAAAA0AIDIAAK4BACAzAAC0AQAgAQAAAA0AIAEAAAALACAGDQAAkAcAIDoAAJIHACA7AACRBwAgxwIAAOwEACDaAgAA7AQAIN0CAADsBAAgCr4CAACoBAAwvwIAAL4BABDAAgAAqAQAMMECAQDvAwAhxwJAAPIDACHaAgEA_QMAId0CQADyAwAhjwMBAO8DACGQAwEA7wMAIZEDQADxAwAhAwAAAAsAIAEAAL0BADA3AAC-AQAgAwAAAAsAIAEAAAwAMAIAAA0AIAEAAABbACABAAAAWwAgAwAAAFkAIAEAAFoAMAIAAFsAIAMAAABZACABAABaADACAABbACADAAAAWQAgAQAAWgAwAgAAWwAgDAMAAI8HACDBAgEAAAABxwJAAAAAAdoCAQAAAAHtAgEAAAABiAMBAAAAAYkDAQAAAAGKAwIAAAABiwMBAAAAAYwDIAAAAAGNAwEAAAABjgMBAAAAAQErAADGAQAgC8ECAQAAAAHHAkAAAAAB2gIBAAAAAe0CAQAAAAGIAwEAAAABiQMBAAAAAYoDAgAAAAGLAwEAAAABjAMgAAAAAY0DAQAAAAGOAwEAAAABASsAAMgBADABKwAAyAEAMAwDAACOBwAgwQIBAPAEACHHAkAA8gQAIdoCAQDwBAAh7QIBAPsEACGIAwEA8AQAIYkDAQDwBAAhigMCAPoEACGLAwEA8AQAIYwDIACGBgAhjQMBAPsEACGOAwEA-wQAIQIAAABbACArAADLAQAgC8ECAQDwBAAhxwJAAPIEACHaAgEA8AQAIe0CAQD7BAAhiAMBAPAEACGJAwEA8AQAIYoDAgD6BAAhiwMBAPAEACGMAyAAhgYAIY0DAQD7BAAhjgMBAPsEACECAAAAWQAgKwAAzQEAIAIAAABZACArAADNAQAgAwAAAFsAIDIAAMYBACAzAADLAQAgAQAAAFsAIAEAAABZACAJDQAAiQcAIDgAAIoHACA5AACNBwAgOgAAjAcAIDsAAIsHACDHAgAA7AQAIO0CAADsBAAgjQMAAOwEACCOAwAA7AQAIA6-AgAApwQAML8CAADUAQAQwAIAAKcEADDBAgEA7wMAIccCQADyAwAh2gIBAO8DACHtAgEA_QMAIYgDAQDvAwAhiQMBAO8DACGKAwIA_gMAIYsDAQDvAwAhjAMgAKIEACGNAwEA_QMAIY4DAQD9AwAhAwAAAFkAIAEAANMBADA3AADUAQAgAwAAAFkAIAEAAFoAMAIAAFsAIAEAAAAaACABAAAAGgAgAwAAABcAIAEAABkAMAIAABoAIAMAAAAXACABAAAZADACAAAaACADAAAAFwAgAQAAGQAwAgAAGgAgGhIAAPgGACATAADqBgAgFAAA6wYAIBUAAOwGACAWAADtBgAgFwAA7gYAIBkAAO8GACAaAADwBgAgGwAA8QYAIBwAAPIGACAdAADzBgAgwQIBAAAAAccCQAAAAAHdAkAAAAAB7AICAAAAAfwCAgAAAAH9AgEAAAAB_gICAAAAAYADAAAAgAMCgQMgAAAAAYIDIAAAAAGDAwIAAAABhAMCAAAAAYUDAgAAAAGGAwIAAAABhwNAAAAAAQErAADcAQAgD8ECAQAAAAHHAkAAAAAB3QJAAAAAAewCAgAAAAH8AgIAAAAB_QIBAAAAAf4CAgAAAAGAAwAAAIADAoEDIAAAAAGCAyAAAAABgwMCAAAAAYQDAgAAAAGFAwIAAAABhgMCAAAAAYcDQAAAAAEBKwAA3gEAMAErAADeAQAwAQAAABUAIAEAAAAXACABAAAAFQAgGhIAAIgGACATAACJBgAgFAAAigYAIBUAAP4GACAWAACLBgAgFwAAjAYAIBkAAI0GACAaAACOBgAgGwAAjwYAIBwAAJAGACAdAACRBgAgwQIBAPAEACHHAkAA8QQAId0CQADxBAAh7AICAIUFACH8AgIAhQUAIf0CAQD7BAAh_gICAIUFACGAAwAAhQaAAyKBAyAAhgYAIYIDIACGBgAhgwMCAPoEACGEAwIA-gQAIYUDAgD6BAAhhgMCAPoEACGHA0AA8gQAIQIAAAAaACArAADkAQAgD8ECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACECAAAAFwAgKwAA5gEAIAIAAAAXACArAADmAQAgAQAAABUAIAEAAAAXACABAAAAFQAgAwAAABoAIDIAANwBACAzAADkAQAgAQAAABoAIAEAAAAXACAKDQAAhAcAIDgAAIUHACA5AACIBwAgOgAAhwcAIDsAAIYHACDsAgAA7AQAIPwCAADsBAAg_QIAAOwEACD-AgAA7AQAIIcDAADsBAAgEr4CAACgBAAwvwIAAPABABDAAgAAoAQAMMECAQDvAwAhxwJAAPEDACHdAkAA8QMAIewCAgCEBAAh_AICAIQEACH9AgEA_QMAIf4CAgCEBAAhgAMAAKEEgAMigQMgAKIEACGCAyAAogQAIYMDAgD-AwAhhAMCAP4DACGFAwIA_gMAIYYDAgD-AwAhhwNAAPIDACEDAAAAFwAgAQAA7wEAMDcAAPABACADAAAAFwAgAQAAGQAwAgAAGgAgAQAAADIAIAEAAAAyACADAAAAFQAgAQAAMQAwAgAAMgAgAwAAABUAIAEAADEAMAIAADIAIAMAAAAVACABAAAxADACAAAyACAQBwAAgwcAIAgAAOMGACAJAADkBgAgCwAA5QYAIA8AAOYGACARAADnBgAgxwJAAAAAAdsCAQAAAAHeAgIAAAAB9QIBAAAAAfYCAQAAAAH3AgEAAAAB-AIBAAAAAfkCAQAAAAH6AgEAAAAB-wJAAAAAAQErAAD4AQAgCscCQAAAAAHbAgEAAAAB3gICAAAAAfUCAQAAAAH2AgEAAAAB9wIBAAAAAfgCAQAAAAH5AgEAAAAB-gIBAAAAAfsCQAAAAAEBKwAA-gEAMAErAAD6AQAwEAcAANQFACAIAADVBQAgCQAA1gUAIAsAANcFACAPAADYBQAgEQAA2QUAIMcCQADxBAAh2wIBAPAEACHeAgIA-gQAIfUCAQDwBAAh9gIBAPsEACH3AgEA-wQAIfgCAQDwBAAh-QIBAPsEACH6AgEA-wQAIfsCQADyBAAhAgAAADIAICsAAP0BACAKxwJAAPEEACHbAgEA8AQAId4CAgD6BAAh9QIBAPAEACH2AgEA-wQAIfcCAQD7BAAh-AIBAPAEACH5AgEA-wQAIfoCAQD7BAAh-wJAAPIEACECAAAAFQAgKwAA_wEAIAIAAAAVACArAAD_AQAgAwAAADIAIDIAAPgBACAzAAD9AQAgAQAAADIAIAEAAAAVACAKDQAAzwUAIDgAANAFACA5AADTBQAgOgAA0gUAIDsAANEFACD2AgAA7AQAIPcCAADsBAAg-QIAAOwEACD6AgAA7AQAIPsCAADsBAAgDb4CAACfBAAwvwIAAIYCABDAAgAAnwQAMMcCQADxAwAh2wIBAO8DACHeAgIA_gMAIfUCAQDvAwAh9gIBAP0DACH3AgEA_QMAIfgCAQDvAwAh-QIBAP0DACH6AgEA_QMAIfsCQADyAwAhAwAAABUAIAEAAIUCADA3AACGAgAgAwAAABUAIAEAADEAMAIAADIAIAEAAAAeACABAAAAHgAgAwAAABwAIAEAAB0AMAIAAB4AIAMAAAAcACABAAAdADACAAAeACADAAAAHAAgAQAAHQAwAgAAHgAgBQoAAM4FACDBAgEAAAAB2wIBAAAAAd4CAgAAAAHzAgEAAAABASsAAI4CACAEwQIBAAAAAdsCAQAAAAHeAgIAAAAB8wIBAAAAAQErAACQAgAwASsAAJACADAFCgAAzQUAIMECAQDwBAAh2wIBAPAEACHeAgIA-gQAIfMCAQDwBAAhAgAAAB4AICsAAJMCACAEwQIBAPAEACHbAgEA8AQAId4CAgD6BAAh8wIBAPAEACECAAAAHAAgKwAAlQIAIAIAAAAcACArAACVAgAgAwAAAB4AIDIAAI4CACAzAACTAgAgAQAAAB4AIAEAAAAcACAFDQAAyAUAIDgAAMkFACA5AADMBQAgOgAAywUAIDsAAMoFACAHvgIAAJ4EADC_AgAAnAIAEMACAACeBAAwwQIBAO8DACHbAgEA7wMAId4CAgD-AwAh8wIBAO8DACEDAAAAHAAgAQAAmwIAMDcAAJwCACADAAAAHAAgAQAAHQAwAgAAHgAgAQAAACIAIAEAAAAiACADAAAAIAAgAQAAIQAwAgAAIgAgAwAAACAAIAEAACEAMAIAACIAIAMAAAAgACABAAAhADACAAAiACAGCgAAtQUAIA4AAMcFACDHAkAAAAAB2wIBAAAAAd4CAgAAAAH0AgEAAAABASsAAKQCACAExwJAAAAAAdsCAQAAAAHeAgIAAAAB9AIBAAAAAQErAACmAgAwASsAAKYCADAGCgAAswUAIA4AAMYFACDHAkAA8QQAIdsCAQDwBAAh3gICAPoEACH0AgEA8AQAIQIAAAAiACArAACpAgAgBMcCQADxBAAh2wIBAPAEACHeAgIA-gQAIfQCAQDwBAAhAgAAACAAICsAAKsCACACAAAAIAAgKwAAqwIAIAMAAAAiACAyAACkAgAgMwAAqQIAIAEAAAAiACABAAAAIAAgBQ0AAMEFACA4AADCBQAgOQAAxQUAIDoAAMQFACA7AADDBQAgB74CAACdBAAwvwIAALICABDAAgAAnQQAMMcCQADxAwAh2wIBAO8DACHeAgIA_gMAIfQCAQDvAwAhAwAAACAAIAEAALECADA3AACyAgAgAwAAACAAIAEAACEAMAIAACIAIAEAAAAoACABAAAAKAAgAwAAACYAIAEAACcAMAIAACgAIAMAAAAmACABAAAnADACAAAoACADAAAAJgAgAQAAJwAwAgAAKAAgBwcAAL8FACAQAADABQAgwQIBAAAAAccCQAAAAAHbAgEAAAAB8gICAAAAAfMCAQAAAAEBKwAAugIAIAXBAgEAAAABxwJAAAAAAdsCAQAAAAHyAgIAAAAB8wIBAAAAAQErAAC8AgAwASsAALwCADAHBwAAvQUAIBAAAL4FACDBAgEA8AQAIccCQADxBAAh2wIBAPAEACHyAgIA-gQAIfMCAQDwBAAhAgAAACgAICsAAL8CACAFwQIBAPAEACHHAkAA8QQAIdsCAQDwBAAh8gICAPoEACHzAgEA8AQAIQIAAAAmACArAADBAgAgAgAAACYAICsAAMECACADAAAAKAAgMgAAugIAIDMAAL8CACABAAAAKAAgAQAAACYAIAUNAAC4BQAgOAAAuQUAIDkAALwFACA6AAC7BQAgOwAAugUAIAi-AgAAnAQAML8CAADIAgAQwAIAAJwEADDBAgEA7wMAIccCQADxAwAh2wIBAO8DACHyAgIA_gMAIfMCAQDvAwAhAwAAACYAIAEAAMcCADA3AADIAgAgAwAAACYAIAEAACcAMAIAACgAIAkMAACbBAAgvgIAAJYEADC_AgAAzgIAEMACAACWBAAwwQIBAAAAAccCQACaBAAh7AICAAAAAe0CAQAAAAHuAgEAmQQAIQEAAADLAgAgAQAAAMsCACAJDAAAmwQAIL4CAACWBAAwvwIAAM4CABDAAgAAlgQAMMECAQCXBAAhxwJAAJoEACHsAgIAmAQAIe0CAQCXBAAh7gIBAJkEACEDDAAAtwUAIOwCAADsBAAg7gIAAOwEACADAAAAzgIAIAEAAM8CADACAADLAgAgAwAAAM4CACABAADPAgAwAgAAywIAIAMAAADOAgAgAQAAzwIAMAIAAMsCACAGDAAAtgUAIMECAQAAAAHHAkAAAAAB7AICAAAAAe0CAQAAAAHuAgEAAAABASsAANMCACAFwQIBAAAAAccCQAAAAAHsAgIAAAAB7QIBAAAAAe4CAQAAAAEBKwAA1QIAMAErAADVAgAwBgwAAKcFACDBAgEA8AQAIccCQADxBAAh7AICAIUFACHtAgEA8AQAIe4CAQD7BAAhAgAAAMsCACArAADYAgAgBcECAQDwBAAhxwJAAPEEACHsAgIAhQUAIe0CAQDwBAAh7gIBAPsEACECAAAAzgIAICsAANoCACACAAAAzgIAICsAANoCACADAAAAywIAIDIAANMCACAzAADYAgAgAQAAAMsCACABAAAAzgIAIAcNAACiBQAgOAAAowUAIDkAAKYFACA6AAClBQAgOwAApAUAIOwCAADsBAAg7gIAAOwEACAIvgIAAJUEADC_AgAA4QIAEMACAACVBAAwwQIBAO8DACHHAkAA8QMAIewCAgCEBAAh7QIBAO8DACHuAgEA_QMAIQMAAADOAgAgAQAA4AIAMDcAAOECACADAAAAzgIAIAEAAM8CADACAADLAgAgAQAAABMAIAEAAAATACADAAAAEQAgAQAAEgAwAgAAEwAgAwAAABEAIAEAABIAMAIAABMAIAMAAAARACABAAASADACAAATACAGAwAAoQUAIAcAAKAFACDHAkAAAAAB2gIBAAAAAdsCAQAAAAHrAgAAAOsCAgErAADpAgAgBMcCQAAAAAHaAgEAAAAB2wIBAAAAAesCAAAA6wICASsAAOsCADABKwAA6wIAMAYDAACfBQAgBwAAngUAIMcCQADxBAAh2gIBAPAEACHbAgEA8AQAIesCAACdBesCIgIAAAATACArAADuAgAgBMcCQADxBAAh2gIBAPAEACHbAgEA8AQAIesCAACdBesCIgIAAAARACArAADwAgAgAgAAABEAICsAAPACACADAAAAEwAgMgAA6QIAIDMAAO4CACABAAAAEwAgAQAAABEAIAMNAACaBQAgOgAAnAUAIDsAAJsFACAHvgIAAJEEADC_AgAA9wIAEMACAACRBAAwxwJAAPEDACHaAgEA7wMAIdsCAQDvAwAh6wIAAJIE6wIiAwAAABEAIAEAAPYCADA3AAD3AgAgAwAAABEAIAEAABIAMAIAABMAIAEAAAA3ACABAAAANwAgAwAAADUAIAEAADYAMAIAADcAIAMAAAA1ACABAAA2ADACAAA3ACADAAAANQAgAQAANgAwAgAANwAgBwcAAJgFACAYAACZBQAgwQIBAAAAAccCQAAAAAHbAgEAAAAB5wIBAAAAAekCAAAA6QICASsAAP8CACAFwQIBAAAAAccCQAAAAAHbAgEAAAAB5wIBAAAAAekCAAAA6QICASsAAIEDADABKwAAgQMAMAEAAAAPACAHBwAAlgUAIBgAAJcFACDBAgEA8AQAIccCQADxBAAh2wIBAPAEACHnAgEA-wQAIekCAACVBekCIgIAAAA3ACArAACFAwAgBcECAQDwBAAhxwJAAPEEACHbAgEA8AQAIecCAQD7BAAh6QIAAJUF6QIiAgAAADUAICsAAIcDACACAAAANQAgKwAAhwMAIAEAAAAPACADAAAANwAgMgAA_wIAIDMAAIUDACABAAAANwAgAQAAADUAIAQNAACSBQAgOgAAlAUAIDsAAJMFACDnAgAA7AQAIAi-AgAAjQQAML8CAACPAwAQwAIAAI0EADDBAgEA7wMAIccCQADxAwAh2wIBAO8DACHnAgEA_QMAIekCAACOBOkCIgMAAAA1ACABAACOAwAwNwAAjwMAIAMAAAA1ACABAAA2ADACAAA3ACABAAAAPQAgAQAAAD0AIAMAAAA7ACABAAA8ADACAAA9ACADAAAAOwAgAQAAPAAwAgAAPQAgAwAAADsAIAEAADwAMAIAAD0AIAUDAACRBQAgBwAAkAUAIMcCQAAAAAHaAgEAAAAB2wIBAAAAAQErAACXAwAgA8cCQAAAAAHaAgEAAAAB2wIBAAAAAQErAACZAwAwASsAAJkDADAFAwAAjwUAIAcAAI4FACDHAkAA8QQAIdoCAQDwBAAh2wIBAPAEACECAAAAPQAgKwAAnAMAIAPHAkAA8QQAIdoCAQDwBAAh2wIBAPAEACECAAAAOwAgKwAAngMAIAIAAAA7ACArAACeAwAgAwAAAD0AIDIAAJcDACAzAACcAwAgAQAAAD0AIAEAAAA7ACADDQAAiwUAIDoAAI0FACA7AACMBQAgBr4CAACMBAAwvwIAAKUDABDAAgAAjAQAMMcCQADxAwAh2gIBAO8DACHbAgEA7wMAIQMAAAA7ACABAACkAwAwNwAApQMAIAMAAAA7ACABAAA8ADACAAA9ACABAAAAQQAgAQAAAEEAIAMAAAA_ACABAABAADACAABBACADAAAAPwAgAQAAQAAwAgAAQQAgAwAAAD8AIAEAAEAAMAIAAEEAIA4DAACKBQAgBwAAiQUAIMECAQAAAAHHAkAAAAAB2gIBAAAAAdsCAQAAAAHeAgIAAAAB4AIAAADgAgLhAgEAAAAB4gIBAAAAAeMCAQAAAAHkAgEAAAAB5QKAAAAAAeYCAQAAAAEBKwAArQMAIAzBAgEAAAABxwJAAAAAAdoCAQAAAAHbAgEAAAAB3gICAAAAAeACAAAA4AIC4QIBAAAAAeICAQAAAAHjAgEAAAAB5AIBAAAAAeUCgAAAAAHmAgEAAAABASsAAK8DADABKwAArwMAMAEAAAAPACAOAwAAiAUAIAcAAIcFACDBAgEA8AQAIccCQADxBAAh2gIBAPsEACHbAgEA8AQAId4CAgCFBQAh4AIAAIYF4AIi4QIBAPsEACHiAgEA-wQAIeMCAQD7BAAh5AIBAPsEACHlAoAAAAAB5gIBAPsEACECAAAAQQAgKwAAswMAIAzBAgEA8AQAIccCQADxBAAh2gIBAPsEACHbAgEA8AQAId4CAgCFBQAh4AIAAIYF4AIi4QIBAPsEACHiAgEA-wQAIeMCAQD7BAAh5AIBAPsEACHlAoAAAAAB5gIBAPsEACECAAAAPwAgKwAAtQMAIAIAAAA_ACArAAC1AwAgAQAAAA8AIAMAAABBACAyAACtAwAgMwAAswMAIAEAAABBACABAAAAPwAgDQ0AAIAFACA4AACBBQAgOQAAhAUAIDoAAIMFACA7AACCBQAg2gIAAOwEACDeAgAA7AQAIOECAADsBAAg4gIAAOwEACDjAgAA7AQAIOQCAADsBAAg5QIAAOwEACDmAgAA7AQAIA--AgAAgwQAML8CAAC9AwAQwAIAAIMEADDBAgEA7wMAIccCQADxAwAh2gIBAP0DACHbAgEA7wMAId4CAgCEBAAh4AIAAIUE4AIi4QIBAP0DACHiAgEA_QMAIeMCAQD9AwAh5AIBAP0DACHlAgAAhgQAIOYCAQD9AwAhAwAAAD8AIAEAALwDADA3AAC9AwAgAwAAAD8AIAEAAEAAMAIAAEEAIAEAAABGACABAAAARgAgAwAAAEQAIAEAAEUAMAIAAEYAIAMAAABEACABAABFADACAABGACADAAAARAAgAQAARQAwAgAARgAgCQMAAP4EACAHAAD_BAAgK4AAAAABwQIBAAAAAccCQAAAAAHaAgEAAAAB2wIBAAAAAdwCAgAAAAHdAkAAAAABASsAAMUDACAHK4AAAAABwQIBAAAAAccCQAAAAAHaAgEAAAAB2wIBAAAAAdwCAgAAAAHdAkAAAAABASsAAMcDADABKwAAxwMAMAEAAAAXACAJAwAA_AQAIAcAAP0EACArgAAAAAHBAgEA8AQAIccCQADxBAAh2gIBAPAEACHbAgEA-wQAIdwCAgD6BAAh3QJAAPEEACECAAAARgAgKwAAywMAIAcrgAAAAAHBAgEA8AQAIccCQADxBAAh2gIBAPAEACHbAgEA-wQAIdwCAgD6BAAh3QJAAPEEACECAAAARAAgKwAAzQMAIAIAAABEACArAADNAwAgAQAAABcAIAMAAABGACAyAADFAwAgMwAAywMAIAEAAABGACABAAAARAAgBg0AAPUEACA4AAD2BAAgOQAA-QQAIDoAAPgEACA7AAD3BAAg2wIAAOwEACAKKwAA8AMAIL4CAAD8AwAwvwIAANUDABDAAgAA_AMAMMECAQDvAwAhxwJAAPEDACHaAgEA7wMAIdsCAQD9AwAh3AICAP4DACHdAkAA8QMAIQMAAABEACABAADUAwAwNwAA1QMAIAMAAABEACABAABFADACAABGACABAAAAVAAgAQAAAFQAIAMAAABSACABAABTADACAABUACADAAAAUgAgAQAAUwAwAgAAVAAgAwAAAFIAIAEAAFMAMAIAAFQAIAkgAAD0BAAgwQIBAAAAAcICAQAAAAHDAgEAAAABxAIBAAAAAcUCAQAAAAHGAoAAAAABxwJAAAAAAcgCQAAAAAEBKwAA3QMAIAjBAgEAAAABwgIBAAAAAcMCAQAAAAHEAgEAAAABxQIBAAAAAcYCgAAAAAHHAkAAAAAByAJAAAAAAQErAADfAwAwASsAAN8DADAJIAAA8wQAIMECAQDwBAAhwgIBAPAEACHDAgEA8AQAIcQCAQDwBAAhxQIBAPAEACHGAoAAAAABxwJAAPEEACHIAkAA8gQAIQIAAABUACArAADiAwAgCMECAQDwBAAhwgIBAPAEACHDAgEA8AQAIcQCAQDwBAAhxQIBAPAEACHGAoAAAAABxwJAAPEEACHIAkAA8gQAIQIAAABSACArAADkAwAgAgAAAFIAICsAAOQDACADAAAAVAAgMgAA3QMAIDMAAOIDACABAAAAVAAgAQAAAFIAIAQNAADtBAAgOgAA7wQAIDsAAO4EACDIAgAA7AQAIAu-AgAA7gMAML8CAADrAwAQwAIAAO4DADDBAgEA7wMAIcICAQDvAwAhwwIBAO8DACHEAgEA7wMAIcUCAQDvAwAhxgIAAPADACDHAkAA8QMAIcgCQADyAwAhAwAAAFIAIAEAAOoDADA3AADrAwAgAwAAAFIAIAEAAFMAMAIAAFQAIAu-AgAA7gMAML8CAADrAwAQwAIAAO4DADDBAgEA7wMAIcICAQDvAwAhwwIBAO8DACHEAgEA7wMAIcUCAQDvAwAhxgIAAPADACDHAkAA8QMAIcgCQADyAwAhDg0AAPcDACA6AAD7AwAgOwAA-wMAIMkCAQAAAAHKAgEAAAAEywIBAAAABMwCAQAAAAHNAgEAAAABzgIBAAAAAc8CAQAAAAHQAgEA-gMAIdcCAQAAAAHYAgEAAAAB2QIBAAAAAQ8NAAD3AwAgOgAA-QMAIDsAAPkDACDJAoAAAAABzAKAAAAAAc0CgAAAAAHOAoAAAAABzwKAAAAAAdACgAAAAAHRAgEAAAAB0gIBAAAAAdMCAQAAAAHUAoAAAAAB1QKAAAAAAdYCgAAAAAELDQAA9wMAIDoAAPgDACA7AAD4AwAgyQJAAAAAAcoCQAAAAATLAkAAAAAEzAJAAAAAAc0CQAAAAAHOAkAAAAABzwJAAAAAAdACQAD2AwAhCw0AAPQDACA6AAD1AwAgOwAA9QMAIMkCQAAAAAHKAkAAAAAFywJAAAAABcwCQAAAAAHNAkAAAAABzgJAAAAAAc8CQAAAAAHQAkAA8wMAIQsNAAD0AwAgOgAA9QMAIDsAAPUDACDJAkAAAAABygJAAAAABcsCQAAAAAXMAkAAAAABzQJAAAAAAc4CQAAAAAHPAkAAAAAB0AJAAPMDACEIyQICAAAAAcoCAgAAAAXLAgIAAAAFzAICAAAAAc0CAgAAAAHOAgIAAAABzwICAAAAAdACAgD0AwAhCMkCQAAAAAHKAkAAAAAFywJAAAAABcwCQAAAAAHNAkAAAAABzgJAAAAAAc8CQAAAAAHQAkAA9QMAIQsNAAD3AwAgOgAA-AMAIDsAAPgDACDJAkAAAAABygJAAAAABMsCQAAAAATMAkAAAAABzQJAAAAAAc4CQAAAAAHPAkAAAAAB0AJAAPYDACEIyQICAAAAAcoCAgAAAATLAgIAAAAEzAICAAAAAc0CAgAAAAHOAgIAAAABzwICAAAAAdACAgD3AwAhCMkCQAAAAAHKAkAAAAAEywJAAAAABMwCQAAAAAHNAkAAAAABzgJAAAAAAc8CQAAAAAHQAkAA-AMAIQzJAoAAAAABzAKAAAAAAc0CgAAAAAHOAoAAAAABzwKAAAAAAdACgAAAAAHRAgEAAAAB0gIBAAAAAdMCAQAAAAHUAoAAAAAB1QKAAAAAAdYCgAAAAAEODQAA9wMAIDoAAPsDACA7AAD7AwAgyQIBAAAAAcoCAQAAAATLAgEAAAAEzAIBAAAAAc0CAQAAAAHOAgEAAAABzwIBAAAAAdACAQD6AwAh1wIBAAAAAdgCAQAAAAHZAgEAAAABC8kCAQAAAAHKAgEAAAAEywIBAAAABMwCAQAAAAHNAgEAAAABzgIBAAAAAc8CAQAAAAHQAgEA-wMAIdcCAQAAAAHYAgEAAAAB2QIBAAAAAQorAADwAwAgvgIAAPwDADC_AgAA1QMAEMACAAD8AwAwwQIBAO8DACHHAkAA8QMAIdoCAQDvAwAh2wIBAP0DACHcAgIA_gMAId0CQADxAwAhDg0AAPQDACA6AACCBAAgOwAAggQAIMkCAQAAAAHKAgEAAAAFywIBAAAABcwCAQAAAAHNAgEAAAABzgIBAAAAAc8CAQAAAAHQAgEAgQQAIdcCAQAAAAHYAgEAAAAB2QIBAAAAAQ0NAAD3AwAgOAAAgAQAIDkAAPcDACA6AAD3AwAgOwAA9wMAIMkCAgAAAAHKAgIAAAAEywICAAAABMwCAgAAAAHNAgIAAAABzgICAAAAAc8CAgAAAAHQAgIA_wMAIQ0NAAD3AwAgOAAAgAQAIDkAAPcDACA6AAD3AwAgOwAA9wMAIMkCAgAAAAHKAgIAAAAEywICAAAABMwCAgAAAAHNAgIAAAABzgICAAAAAc8CAgAAAAHQAgIA_wMAIQjJAggAAAABygIIAAAABMsCCAAAAATMAggAAAABzQIIAAAAAc4CCAAAAAHPAggAAAAB0AIIAIAEACEODQAA9AMAIDoAAIIEACA7AACCBAAgyQIBAAAAAcoCAQAAAAXLAgEAAAAFzAIBAAAAAc0CAQAAAAHOAgEAAAABzwIBAAAAAdACAQCBBAAh1wIBAAAAAdgCAQAAAAHZAgEAAAABC8kCAQAAAAHKAgEAAAAFywIBAAAABcwCAQAAAAHNAgEAAAABzgIBAAAAAc8CAQAAAAHQAgEAggQAIdcCAQAAAAHYAgEAAAAB2QIBAAAAAQ--AgAAgwQAML8CAAC9AwAQwAIAAIMEADDBAgEA7wMAIccCQADxAwAh2gIBAP0DACHbAgEA7wMAId4CAgCEBAAh4AIAAIUE4AIi4QIBAP0DACHiAgEA_QMAIeMCAQD9AwAh5AIBAP0DACHlAgAAhgQAIOYCAQD9AwAhDQ0AAPQDACA4AACLBAAgOQAA9AMAIDoAAPQDACA7AAD0AwAgyQICAAAAAcoCAgAAAAXLAgIAAAAFzAICAAAAAc0CAgAAAAHOAgIAAAABzwICAAAAAdACAgCKBAAhBw0AAPcDACA6AACJBAAgOwAAiQQAIMkCAAAA4AICygIAAADgAgjLAgAAAOACCNACAACIBOACIg8NAAD0AwAgOgAAhwQAIDsAAIcEACDJAoAAAAABzAKAAAAAAc0CgAAAAAHOAoAAAAABzwKAAAAAAdACgAAAAAHRAgEAAAAB0gIBAAAAAdMCAQAAAAHUAoAAAAAB1QKAAAAAAdYCgAAAAAEMyQKAAAAAAcwCgAAAAAHNAoAAAAABzgKAAAAAAc8CgAAAAAHQAoAAAAAB0QIBAAAAAdICAQAAAAHTAgEAAAAB1AKAAAAAAdUCgAAAAAHWAoAAAAABBw0AAPcDACA6AACJBAAgOwAAiQQAIMkCAAAA4AICygIAAADgAgjLAgAAAOACCNACAACIBOACIgTJAgAAAOACAsoCAAAA4AIIywIAAADgAgjQAgAAiQTgAiINDQAA9AMAIDgAAIsEACA5AAD0AwAgOgAA9AMAIDsAAPQDACDJAgIAAAABygICAAAABcsCAgAAAAXMAgIAAAABzQICAAAAAc4CAgAAAAHPAgIAAAAB0AICAIoEACEIyQIIAAAAAcoCCAAAAAXLAggAAAAFzAIIAAAAAc0CCAAAAAHOAggAAAABzwIIAAAAAdACCACLBAAhBr4CAACMBAAwvwIAAKUDABDAAgAAjAQAMMcCQADxAwAh2gIBAO8DACHbAgEA7wMAIQi-AgAAjQQAML8CAACPAwAQwAIAAI0EADDBAgEA7wMAIccCQADxAwAh2wIBAO8DACHnAgEA_QMAIekCAACOBOkCIgcNAAD3AwAgOgAAkAQAIDsAAJAEACDJAgAAAOkCAsoCAAAA6QIIywIAAADpAgjQAgAAjwTpAiIHDQAA9wMAIDoAAJAEACA7AACQBAAgyQIAAADpAgLKAgAAAOkCCMsCAAAA6QII0AIAAI8E6QIiBMkCAAAA6QICygIAAADpAgjLAgAAAOkCCNACAACQBOkCIge-AgAAkQQAML8CAAD3AgAQwAIAAJEEADDHAkAA8QMAIdoCAQDvAwAh2wIBAO8DACHrAgAAkgTrAiIHDQAA9wMAIDoAAJQEACA7AACUBAAgyQIAAADrAgLKAgAAAOsCCMsCAAAA6wII0AIAAJME6wIiBw0AAPcDACA6AACUBAAgOwAAlAQAIMkCAAAA6wICygIAAADrAgjLAgAAAOsCCNACAACTBOsCIgTJAgAAAOsCAsoCAAAA6wIIywIAAADrAgjQAgAAlATrAiIIvgIAAJUEADC_AgAA4QIAEMACAACVBAAwwQIBAO8DACHHAkAA8QMAIewCAgCEBAAh7QIBAO8DACHuAgEA_QMAIQkMAACbBAAgvgIAAJYEADC_AgAAzgIAEMACAACWBAAwwQIBAJcEACHHAkAAmgQAIewCAgCYBAAh7QIBAJcEACHuAgEAmQQAIQvJAgEAAAABygIBAAAABMsCAQAAAATMAgEAAAABzQIBAAAAAc4CAQAAAAHPAgEAAAAB0AIBAPsDACHXAgEAAAAB2AIBAAAAAdkCAQAAAAEIyQICAAAAAcoCAgAAAAXLAgIAAAAFzAICAAAAAc0CAgAAAAHOAgIAAAABzwICAAAAAdACAgD0AwAhC8kCAQAAAAHKAgEAAAAFywIBAAAABcwCAQAAAAHNAgEAAAABzgIBAAAAAc8CAQAAAAHQAgEAggQAIdcCAQAAAAHYAgEAAAAB2QIBAAAAAQjJAkAAAAABygJAAAAABMsCQAAAAATMAkAAAAABzQJAAAAAAc4CQAAAAAHPAkAAAAAB0AJAAPgDACED7wIAACAAIPACAAAgACDxAgAAIAAgCL4CAACcBAAwvwIAAMgCABDAAgAAnAQAMMECAQDvAwAhxwJAAPEDACHbAgEA7wMAIfICAgD-AwAh8wIBAO8DACEHvgIAAJ0EADC_AgAAsgIAEMACAACdBAAwxwJAAPEDACHbAgEA7wMAId4CAgD-AwAh9AIBAO8DACEHvgIAAJ4EADC_AgAAnAIAEMACAACeBAAwwQIBAO8DACHbAgEA7wMAId4CAgD-AwAh8wIBAO8DACENvgIAAJ8EADC_AgAAhgIAEMACAACfBAAwxwJAAPEDACHbAgEA7wMAId4CAgD-AwAh9QIBAO8DACH2AgEA_QMAIfcCAQD9AwAh-AIBAO8DACH5AgEA_QMAIfoCAQD9AwAh-wJAAPIDACESvgIAAKAEADC_AgAA8AEAEMACAACgBAAwwQIBAO8DACHHAkAA8QMAId0CQADxAwAh7AICAIQEACH8AgIAhAQAIf0CAQD9AwAh_gICAIQEACGAAwAAoQSAAyKBAyAAogQAIYIDIACiBAAhgwMCAP4DACGEAwIA_gMAIYUDAgD-AwAhhgMCAP4DACGHA0AA8gMAIQcNAAD3AwAgOgAApgQAIDsAAKYEACDJAgAAAIADAsoCAAAAgAMIywIAAACAAwjQAgAApQSAAyIFDQAA9wMAIDoAAKQEACA7AACkBAAgyQIgAAAAAdACIACjBAAhBQ0AAPcDACA6AACkBAAgOwAApAQAIMkCIAAAAAHQAiAAowQAIQLJAiAAAAAB0AIgAKQEACEHDQAA9wMAIDoAAKYEACA7AACmBAAgyQIAAACAAwLKAgAAAIADCMsCAAAAgAMI0AIAAKUEgAMiBMkCAAAAgAMCygIAAACAAwjLAgAAAIADCNACAACmBIADIg6-AgAApwQAML8CAADUAQAQwAIAAKcEADDBAgEA7wMAIccCQADyAwAh2gIBAO8DACHtAgEA_QMAIYgDAQDvAwAhiQMBAO8DACGKAwIA_gMAIYsDAQDvAwAhjAMgAKIEACGNAwEA_QMAIY4DAQD9AwAhCr4CAACoBAAwvwIAAL4BABDAAgAAqAQAMMECAQDvAwAhxwJAAPIDACHaAgEA_QMAId0CQADyAwAhjwMBAO8DACGQAwEA7wMAIZEDQADxAwAhDL4CAACpBAAwvwIAAKYBABDAAgAAqQQAMMECAQDvAwAhxwJAAPEDACHaAgEA7wMAId0CQADxAwAh4wIBAP0DACGRA0AA8QMAIZIDAQDvAwAhkwMBAP0DACGUAwEA_QMAIRC-AgAAqgQAML8CAACQAQAQwAIAAKoEADDBAgEA7wMAIccCQADxAwAh2gIBAO8DACHdAkAA8QMAIZUDAQDvAwAhlgMBAO8DACGXAwEA_QMAIZgDAQD9AwAhmQNAAPIDACGaA0AA8gMAIZsDAQD9AwAhnAMBAP0DACGdAwEA_QMAIRm-AgAAqwQAML8CAAB6ABDAAgAAqwQAMMECAQDvAwAhxwJAAPEDACHdAkAA8QMAIesCAQD9AwAh7AICAIQEACHtAgEA_QMAIYcDQADyAwAhngMBAP0DACGfAyAAogQAIaADAQD9AwAhogMAAKwEogMipAMAAK0EpAMipQMgAKIEACGmAwEA_QMAIacDAQD9AwAhqAMAAIYEACCpA0AA8gMAIaoDAQD9AwAhqwMgAK4EACGsAwEA_QMAIa0DQADyAwAhrgNAAPIDACEHDQAA9wMAIDoAALQEACA7AAC0BAAgyQIAAACiAwLKAgAAAKIDCMsCAAAAogMI0AIAALMEogMiBw0AAPcDACA6AACyBAAgOwAAsgQAIMkCAAAApAMCygIAAACkAwjLAgAAAKQDCNACAACxBKQDIgUNAAD0AwAgOgAAsAQAIDsAALAEACDJAiAAAAAB0AIgAK8EACEFDQAA9AMAIDoAALAEACA7AACwBAAgyQIgAAAAAdACIACvBAAhAskCIAAAAAHQAiAAsAQAIQcNAAD3AwAgOgAAsgQAIDsAALIEACDJAgAAAKQDAsoCAAAApAMIywIAAACkAwjQAgAAsQSkAyIEyQIAAACkAwLKAgAAAKQDCMsCAAAApAMI0AIAALIEpAMiBw0AAPcDACA6AAC0BAAgOwAAtAQAIMkCAAAAogMCygIAAACiAwjLAgAAAKIDCNACAACzBKIDIgTJAgAAAKIDAsoCAAAAogMIywIAAACiAwjQAgAAtASiAyIPAwAAuQQAIL4CAAC1BAAwvwIAAFkAEMACAAC1BAAwwQIBAJcEACHHAkAAuAQAIdoCAQCXBAAh7QIBAJkEACGIAwEAlwQAIYkDAQCXBAAhigMCALYEACGLAwEAlwQAIYwDIAC3BAAhjQMBAJkEACGOAwEAmQQAIQjJAgIAAAABygICAAAABMsCAgAAAATMAgIAAAABzQICAAAAAc4CAgAAAAHPAgIAAAAB0AICAPcDACECyQIgAAAAAdACIACkBAAhCMkCQAAAAAHKAkAAAAAFywJAAAAABcwCQAAAAAHNAkAAAAABzgJAAAAAAc8CQAAAAAHQAkAA9QMAISUEAADkBAAgBQAA5QQAIAYAAOYEACAeAADYBAAgHwAA2QQAICEAAOcEACAiAADaBAAgIwAA2wQAICQAANwEACAlAADoBAAgvgIAAOAEADC_AgAADwAQwAIAAOAEADDBAgEAlwQAIccCQACaBAAh3QJAAJoEACHrAgEAmQQAIewCAgCYBAAh7QIBAJkEACGHA0AAuAQAIZ4DAQCZBAAhnwMgALcEACGgAwEAmQQAIaIDAADhBKIDIqQDAADiBKQDIqUDIAC3BAAhpgMBAJkEACGnAwEAmQQAIagDAADABAAgqQNAALgEACGqAwEAmQQAIasDIADjBAAhrAMBAJkEACGtA0AAuAQAIa4DQAC4BAAhtAMAAA8AILUDAAAPACAMIAAAuQQAIL4CAAC6BAAwvwIAAFIAEMACAAC6BAAwwQIBAJcEACHCAgEAlwQAIcMCAQCXBAAhxAIBAJcEACHFAgEAlwQAIcYCAAC7BAAgxwJAAJoEACHIAkAAuAQAIQzJAoAAAAABzAKAAAAAAc0CgAAAAAHOAoAAAAABzwKAAAAAAdACgAAAAAHRAgEAAAAB0gIBAAAAAdMCAQAAAAHUAoAAAAAB1QKAAAAAAdYCgAAAAAEMAwAAuQQAIAcAAL0EACArAAC7BAAgvgIAALwEADC_AgAARAAQwAIAALwEADDBAgEAlwQAIccCQACaBAAh2gIBAJcEACHbAgEAmQQAIdwCAgC2BAAh3QJAAJoEACEfEgAA1gQAIBMAAL0EACAUAADKBAAgFQAA1gQAIBYAANcEACAXAADYBAAgGQAA2QQAIBoAAMwEACAbAADaBAAgHAAA2wQAIB0AANwEACC-AgAA1AQAML8CAAAXABDAAgAA1AQAMMECAQCXBAAhxwJAAJoEACHdAkAAmgQAIewCAgCYBAAh_AICAJgEACH9AgEAmQQAIf4CAgCYBAAhgAMAANUEgAMigQMgALcEACGCAyAAtwQAIYMDAgC2BAAhhAMCALYEACGFAwIAtgQAIYYDAgC2BAAhhwNAALgEACG0AwAAFwAgtQMAABcAIBEDAADCBAAgBwAAwQQAIL4CAAC-BAAwvwIAAD8AEMACAAC-BAAwwQIBAJcEACHHAkAAmgQAIdoCAQCZBAAh2wIBAJcEACHeAgIAmAQAIeACAAC_BOACIuECAQCZBAAh4gIBAJkEACHjAgEAmQQAIeQCAQCZBAAh5QIAAMAEACDmAgEAmQQAIQTJAgAAAOACAsoCAAAA4AIIywIAAADgAgjQAgAAiQTgAiIMyQKAAAAAAcwCgAAAAAHNAoAAAAABzgKAAAAAAc8CgAAAAAHQAoAAAAAB0QIBAAAAAdICAQAAAAHTAgEAAAAB1AKAAAAAAdUCgAAAAAHWAoAAAAABHxIAANYEACATAAC9BAAgFAAAygQAIBUAANYEACAWAADXBAAgFwAA2AQAIBkAANkEACAaAADMBAAgGwAA2gQAIBwAANsEACAdAADcBAAgvgIAANQEADC_AgAAFwAQwAIAANQEADDBAgEAlwQAIccCQACaBAAh3QJAAJoEACHsAgIAmAQAIfwCAgCYBAAh_QIBAJkEACH-AgIAmAQAIYADAADVBIADIoEDIAC3BAAhggMgALcEACGDAwIAtgQAIYQDAgC2BAAhhQMCALYEACGGAwIAtgQAIYcDQAC4BAAhtAMAABcAILUDAAAXACAlBAAA5AQAIAUAAOUEACAGAADmBAAgHgAA2AQAIB8AANkEACAhAADnBAAgIgAA2gQAICMAANsEACAkAADcBAAgJQAA6AQAIL4CAADgBAAwvwIAAA8AEMACAADgBAAwwQIBAJcEACHHAkAAmgQAId0CQACaBAAh6wIBAJkEACHsAgIAmAQAIe0CAQCZBAAhhwNAALgEACGeAwEAmQQAIZ8DIAC3BAAhoAMBAJkEACGiAwAA4QSiAyKkAwAA4gSkAyKlAyAAtwQAIaYDAQCZBAAhpwMBAJkEACGoAwAAwAQAIKkDQAC4BAAhqgMBAJkEACGrAyAA4wQAIawDAQCZBAAhrQNAALgEACGuA0AAuAQAIbQDAAAPACC1AwAADwAgAtoCAQAAAAHbAgEAAAABCAMAALkEACAHAADBBAAgvgIAAMQEADC_AgAAOwAQwAIAAMQEADDHAkAAmgQAIdoCAQCXBAAh2wIBAJcEACEC2wIBAAAAAecCAQAAAAEKBwAAwQQAIBgAAMIEACC-AgAAxgQAML8CAAA1ABDAAgAAxgQAMMECAQCXBAAhxwJAAJoEACHbAgEAlwQAIecCAQCZBAAh6QIAAMcE6QIiBMkCAAAA6QICygIAAADpAgjLAgAAAOkCCNACAACQBOkCIgLbAgEAAAAB3gICAAAAARMHAADBBAAgCAAAvQQAIAkAAMoEACALAADLBAAgDwAAmwQAIBEAAMwEACC-AgAAyQQAML8CAAAVABDAAgAAyQQAMMcCQACaBAAh2wIBAJcEACHeAgIAtgQAIfUCAQCXBAAh9gIBAJkEACH3AgEAmQQAIfgCAQCXBAAh-QIBAJkEACH6AgEAmQQAIfsCQAC4BAAhA-8CAAAXACDwAgAAFwAg8QIAABcAIAPvAgAAHAAg8AIAABwAIPECAAAcACAD7wIAACYAIPACAAAmACDxAgAAJgAgCgcAAMEEACAQAADOBAAgvgIAAM0EADC_AgAAJgAQwAIAAM0EADDBAgEAlwQAIccCQACaBAAh2wIBAJcEACHyAgIAtgQAIfMCAQCXBAAhFQcAAMEEACAIAAC9BAAgCQAAygQAIAsAAMsEACAPAACbBAAgEQAAzAQAIL4CAADJBAAwvwIAABUAEMACAADJBAAwxwJAAJoEACHbAgEAlwQAId4CAgC2BAAh9QIBAJcEACH2AgEAmQQAIfcCAQCZBAAh-AIBAJcEACH5AgEAmQQAIfoCAQCZBAAh-wJAALgEACG0AwAAFQAgtQMAABUAIAPbAgEAAAAB3gICAAAAAfQCAQAAAAEJCgAAzgQAIA4AANEEACC-AgAA0AQAML8CAAAgABDAAgAA0AQAMMcCQACaBAAh2wIBAJcEACHeAgIAtgQAIfQCAQCXBAAhCwwAAJsEACC-AgAAlgQAML8CAADOAgAQwAIAAJYEADDBAgEAlwQAIccCQACaBAAh7AICAJgEACHtAgEAlwQAIe4CAQCZBAAhtAMAAM4CACC1AwAAzgIAIAgKAADOBAAgvgIAANIEADC_AgAAHAAQwAIAANIEADDBAgEAlwQAIdsCAQCXBAAh3gICALYEACHzAgEAlwQAIQLBAgEAAAAB_AICAAAAAR0SAADWBAAgEwAAvQQAIBQAAMoEACAVAADWBAAgFgAA1wQAIBcAANgEACAZAADZBAAgGgAAzAQAIBsAANoEACAcAADbBAAgHQAA3AQAIL4CAADUBAAwvwIAABcAEMACAADUBAAwwQIBAJcEACHHAkAAmgQAId0CQACaBAAh7AICAJgEACH8AgIAmAQAIf0CAQCZBAAh_gICAJgEACGAAwAA1QSAAyKBAyAAtwQAIYIDIAC3BAAhgwMCALYEACGEAwIAtgQAIYUDAgC2BAAhhgMCALYEACGHA0AAuAQAIQTJAgAAAIADAsoCAAAAgAMIywIAAACAAwjQAgAApgSAAyIVBwAAwQQAIAgAAL0EACAJAADKBAAgCwAAywQAIA8AAJsEACARAADMBAAgvgIAAMkEADC_AgAAFQAQwAIAAMkEADDHAkAAmgQAIdsCAQCXBAAh3gICALYEACH1AgEAlwQAIfYCAQCZBAAh9wIBAJkEACH4AgEAlwQAIfkCAQCZBAAh-gIBAJkEACH7AkAAuAQAIbQDAAAVACC1AwAAFQAgA-8CAAAVACDwAgAAFQAg8QIAABUAIAPvAgAAEQAg8AIAABEAIPECAAARACAD7wIAADUAIPACAAA1ACDxAgAANQAgA-8CAAA7ACDwAgAAOwAg8QIAADsAIAPvAgAAPwAg8AIAAD8AIPECAAA_ACAD7wIAAEQAIPACAABEACDxAgAARAAgAtoCAQAAAAHbAgEAAAABCQMAALkEACAHAADBBAAgvgIAAN4EADC_AgAAEQAQwAIAAN4EADDHAkAAmgQAIdoCAQCXBAAh2wIBAJcEACHrAgAA3wTrAiIEyQIAAADrAgLKAgAAAOsCCMsCAAAA6wII0AIAAJQE6wIiIwQAAOQEACAFAADlBAAgBgAA5gQAIB4AANgEACAfAADZBAAgIQAA5wQAICIAANoEACAjAADbBAAgJAAA3AQAICUAAOgEACC-AgAA4AQAML8CAAAPABDAAgAA4AQAMMECAQCXBAAhxwJAAJoEACHdAkAAmgQAIesCAQCZBAAh7AICAJgEACHtAgEAmQQAIYcDQAC4BAAhngMBAJkEACGfAyAAtwQAIaADAQCZBAAhogMAAOEEogMipAMAAOIEpAMipQMgALcEACGmAwEAmQQAIacDAQCZBAAhqAMAAMAEACCpA0AAuAQAIaoDAQCZBAAhqwMgAOMEACGsAwEAmQQAIa0DQAC4BAAhrgNAALgEACEEyQIAAACiAwLKAgAAAKIDCMsCAAAAogMI0AIAALQEogMiBMkCAAAApAMCygIAAACkAwjLAgAAAKQDCNACAACyBKQDIgLJAiAAAAAB0AIgALAEACED7wIAAAMAIPACAAADACDxAgAAAwAgA-8CAAAHACDwAgAABwAg8QIAAAcAIAPvAgAACwAg8AIAAAsAIPECAAALACAD7wIAAFIAIPACAABSACDxAgAAUgAgA-8CAABZACDwAgAAWQAg8QIAAFkAIAsDAADCBAAgvgIAAOkEADC_AgAACwAQwAIAAOkEADDBAgEAlwQAIccCQAC4BAAh2gIBAJkEACHdAkAAuAQAIY8DAQCXBAAhkAMBAJcEACGRA0AAmgQAIQ0DAAC5BAAgvgIAAOoEADC_AgAABwAQwAIAAOoEADDBAgEAlwQAIccCQACaBAAh2gIBAJcEACHdAkAAmgQAIeMCAQCZBAAhkQNAAJoEACGSAwEAlwQAIZMDAQCZBAAhlAMBAJkEACERAwAAuQQAIL4CAADrBAAwvwIAAAMAEMACAADrBAAwwQIBAJcEACHHAkAAmgQAIdoCAQCXBAAh3QJAAJoEACGVAwEAlwQAIZYDAQCXBAAhlwMBAJkEACGYAwEAmQQAIZkDQAC4BAAhmgNAALgEACGbAwEAmQQAIZwDAQCZBAAhnQMBAJkEACEAAAAAAbkDAQAAAAEBuQNAAAAAAQG5A0AAAAABBTIAAMAJACAzAADDCQAgtgMAAMEJACC3AwAAwgkAILwDAAABACADMgAAwAkAILYDAADBCQAgvAMAAAEAIAAAAAAABbkDAgAAAAG_AwIAAAABwAMCAAAAAcEDAgAAAAHCAwIAAAABAbkDAQAAAAEFMgAAuAkAIDMAAL4JACC2AwAAuQkAILcDAAC9CQAgvAMAAAEAIAcyAAC2CQAgMwAAuwkAILYDAAC3CQAgtwMAALoJACC6AwAAFwAguwMAABcAILwDAAAaACADMgAAuAkAILYDAAC5CQAgvAMAAAEAIAMyAAC2CQAgtgMAALcJACC8AwAAGgAgAAAAAAAFuQMCAAAAAb8DAgAAAAHAAwIAAAABwQMCAAAAAcIDAgAAAAEBuQMAAADgAgIFMgAArgkAIDMAALQJACC2AwAArwkAILcDAACzCQAgvAMAABoAIAcyAACsCQAgMwAAsQkAILYDAACtCQAgtwMAALAJACC6AwAADwAguwMAAA8AILwDAAABACADMgAArgkAILYDAACvCQAgvAMAABoAIAMyAACsCQAgtgMAAK0JACC8AwAAAQAgAAAABTIAAKQJACAzAACqCQAgtgMAAKUJACC3AwAAqQkAILwDAAAaACAFMgAAogkAIDMAAKcJACC2AwAAowkAILcDAACmCQAgvAMAAAEAIAMyAACkCQAgtgMAAKUJACC8AwAAGgAgAzIAAKIJACC2AwAAowkAILwDAAABACAAAAABuQMAAADpAgIFMgAAmgkAIDMAAKAJACC2AwAAmwkAILcDAACfCQAgvAMAABoAIAcyAACYCQAgMwAAnQkAILYDAACZCQAgtwMAAJwJACC6AwAADwAguwMAAA8AILwDAAABACADMgAAmgkAILYDAACbCQAgvAMAABoAIAMyAACYCQAgtgMAAJkJACC8AwAAAQAgAAAAAbkDAAAA6wICBTIAAJAJACAzAACWCQAgtgMAAJEJACC3AwAAlQkAILwDAAAaACAFMgAAjgkAIDMAAJMJACC2AwAAjwkAILcDAACSCQAgvAMAAAEAIAMyAACQCQAgtgMAAJEJACC8AwAAGgAgAzIAAI4JACC2AwAAjwkAILwDAAABACAAAAAAAAsyAACoBQAwMwAArQUAMLYDAACpBQAwtwMAAKoFADC4AwAAqwUAILkDAACsBQAwugMAAKwFADC7AwAArAUAMLwDAACsBQAwvQMAAK4FADC-AwAArwUAMAQKAAC1BQAgxwJAAAAAAdsCAQAAAAHeAgIAAAABAgAAACIAIDIAALQFACADAAAAIgAgMgAAtAUAIDMAALIFACABKwAAjQkAMAoKAADOBAAgDgAA0QQAIL4CAADQBAAwvwIAACAAEMACAADQBAAwxwJAAJoEACHbAgEAlwQAId4CAgC2BAAh9AIBAJcEACGyAwAAzwQAIAIAAAAiACArAACyBQAgAgAAALAFACArAACxBQAgB74CAACvBQAwvwIAALAFABDAAgAArwUAMMcCQACaBAAh2wIBAJcEACHeAgIAtgQAIfQCAQCXBAAhB74CAACvBQAwvwIAALAFABDAAgAArwUAMMcCQACaBAAh2wIBAJcEACHeAgIAtgQAIfQCAQCXBAAhA8cCQADxBAAh2wIBAPAEACHeAgIA-gQAIQQKAACzBQAgxwJAAPEEACHbAgEA8AQAId4CAgD6BAAhBTIAAIgJACAzAACLCQAgtgMAAIkJACC3AwAAigkAILwDAAAyACAECgAAtQUAIMcCQAAAAAHbAgEAAAAB3gICAAAAAQMyAACICQAgtgMAAIkJACC8AwAAMgAgBDIAAKgFADC2AwAAqQUAMLgDAACrBQAgvAMAAKwFADAAAAAAAAAFMgAAgAkAIDMAAIYJACC2AwAAgQkAILcDAACFCQAgvAMAABoAIAUyAAD-CAAgMwAAgwkAILYDAAD_CAAgtwMAAIIJACC8AwAAMgAgAzIAAIAJACC2AwAAgQkAILwDAAAaACADMgAA_ggAILYDAAD_CAAgvAMAADIAIAAAAAAABTIAAPkIACAzAAD8CAAgtgMAAPoIACC3AwAA-wgAILwDAADLAgAgAzIAAPkIACC2AwAA-ggAILwDAADLAgAgAAAAAAAFMgAA9AgAIDMAAPcIACC2AwAA9QgAILcDAAD2CAAgvAMAADIAIAMyAAD0CAAgtgMAAPUIACC8AwAAMgAgAAAAAAAFMgAA1AgAIDMAAPIIACC2AwAA1QgAILcDAADxCAAgvAMAABoAIAcyAADoBgAgMwAAgQcAILYDAADpBgAgtwMAAIAHACC6AwAAFwAguwMAABcAILwDAAAaACALMgAA-wUAMDMAAIAGADC2AwAA_AUAMLcDAAD9BQAwuAMAAP4FACC5AwAA_wUAMLoDAAD_BQAwuwMAAP8FADC8AwAA_wUAML0DAACBBgAwvgMAAIIGADALMgAA7wUAMDMAAPQFADC2AwAA8AUAMLcDAADxBQAwuAMAAPIFACC5AwAA8wUAMLoDAADzBQAwuwMAAPMFADC8AwAA8wUAML0DAAD1BQAwvgMAAPYFADALMgAA5gUAMDMAAOoFADC2AwAA5wUAMLcDAADoBQAwuAMAAOkFACC5AwAArAUAMLoDAACsBQAwuwMAAKwFADC8AwAArAUAML0DAADrBQAwvgMAAK8FADALMgAA2gUAMDMAAN8FADC2AwAA2wUAMLcDAADcBQAwuAMAAN0FACC5AwAA3gUAMLoDAADeBQAwuwMAAN4FADC8AwAA3gUAML0DAADgBQAwvgMAAOEFADAEBwAAvwUAIMECAQAAAAHHAkAAAAAB8wIBAAAAAQIAAAAoACAyAADlBQAgAwAAACgAIDIAAOUFACAzAADkBQAgASsAAPAIADAKBwAAwQQAIBAAAM4EACC-AgAAzQQAML8CAAAmABDAAgAAzQQAMMECAQAAAAHHAkAAmgQAIdsCAQCXBAAh8gICALYEACHzAgEAlwQAIQIAAAAoACArAADkBQAgAgAAAOIFACArAADjBQAgCL4CAADhBQAwvwIAAOIFABDAAgAA4QUAMMECAQCXBAAhxwJAAJoEACHbAgEAlwQAIfICAgC2BAAh8wIBAJcEACEIvgIAAOEFADC_AgAA4gUAEMACAADhBQAwwQIBAJcEACHHAkAAmgQAIdsCAQCXBAAh8gICALYEACHzAgEAlwQAIQPBAgEA8AQAIccCQADxBAAh8wIBAPAEACEEBwAAvQUAIMECAQDwBAAhxwJAAPEEACHzAgEA8AQAIQQHAAC_BQAgwQIBAAAAAccCQAAAAAHzAgEAAAABAw4AAMcFACDHAkAAAAAB9AIBAAAAAQIAAAAiACAyAADuBQAgAwAAACIAIDIAAO4FACAzAADtBQAgASsAAO8IADACAAAAIgAgKwAA7QUAIAIAAACwBQAgKwAA7AUAIALHAkAA8QQAIfQCAQDwBAAhAw4AAMYFACDHAkAA8QQAIfQCAQDwBAAhAw4AAMcFACDHAkAAAAAB9AIBAAAAAQLBAgEAAAAB8wIBAAAAAQIAAAAeACAyAAD6BQAgAwAAAB4AIDIAAPoFACAzAAD5BQAgASsAAO4IADAICgAAzgQAIL4CAADSBAAwvwIAABwAEMACAADSBAAwwQIBAAAAAdsCAQCXBAAh3gICALYEACHzAgEAlwQAIQIAAAAeACArAAD5BQAgAgAAAPcFACArAAD4BQAgB74CAAD2BQAwvwIAAPcFABDAAgAA9gUAMMECAQCXBAAh2wIBAJcEACHeAgIAtgQAIfMCAQCXBAAhB74CAAD2BQAwvwIAAPcFABDAAgAA9gUAMMECAQCXBAAh2wIBAJcEACHeAgIAtgQAIfMCAQCXBAAhAsECAQDwBAAh8wIBAPAEACECwQIBAPAEACHzAgEA8AQAIQLBAgEAAAAB8wIBAAAAARcSAAD4BgAgEwAA6gYAIBQAAOsGACAWAADtBgAgFwAA7gYAIBkAAO8GACAaAADwBgAgGwAA8QYAIBwAAPIGACAdAADzBgAgwQIBAAAAAccCQAAAAAHdAkAAAAAB7AICAAAAAfwCAgAAAAGAAwAAAIADAoEDIAAAAAGCAyAAAAABgwMCAAAAAYQDAgAAAAGFAwIAAAABhgMCAAAAAYcDQAAAAAECAAAAGgAgMgAA_wYAIAMAAAAaACAyAAD_BgAgMwAAhwYAIAErAADtCAAwHhIAANYEACATAAC9BAAgFAAAygQAIBUAANYEACAWAADXBAAgFwAA2AQAIBkAANkEACAaAADMBAAgGwAA2gQAIBwAANsEACAdAADcBAAgvgIAANQEADC_AgAAFwAQwAIAANQEADDBAgEAAAABxwJAAJoEACHdAkAAmgQAIewCAgAAAAH8AgIAmAQAIf0CAQCZBAAh_gICAJgEACGAAwAA1QSAAyKBAyAAtwQAIYIDIAC3BAAhgwMCALYEACGEAwIAtgQAIYUDAgC2BAAhhgMCALYEACGHA0AAuAQAIbMDAADTBAAgAgAAABoAICsAAIcGACACAAAAgwYAICsAAIQGACASvgIAAIIGADC_AgAAgwYAEMACAACCBgAwwQIBAJcEACHHAkAAmgQAId0CQACaBAAh7AICAJgEACH8AgIAmAQAIf0CAQCZBAAh_gICAJgEACGAAwAA1QSAAyKBAyAAtwQAIYIDIAC3BAAhgwMCALYEACGEAwIAtgQAIYUDAgC2BAAhhgMCALYEACGHA0AAuAQAIRK-AgAAggYAML8CAACDBgAQwAIAAIIGADDBAgEAlwQAIccCQACaBAAh3QJAAJoEACHsAgIAmAQAIfwCAgCYBAAh_QIBAJkEACH-AgIAmAQAIYADAADVBIADIoEDIAC3BAAhggMgALcEACGDAwIAtgQAIYQDAgC2BAAhhQMCALYEACGGAwIAtgQAIYcDQAC4BAAhDcECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACGAAwAAhQaAAyKBAyAAhgYAIYIDIACGBgAhgwMCAPoEACGEAwIA-gQAIYUDAgD6BAAhhgMCAPoEACGHA0AA8gQAIQG5AwAAAIADAgG5AyAAAAABFxIAAIgGACATAACJBgAgFAAAigYAIBYAAIsGACAXAACMBgAgGQAAjQYAIBoAAI4GACAbAACPBgAgHAAAkAYAIB0AAJEGACDBAgEA8AQAIccCQADxBAAh3QJAAPEEACHsAgIAhQUAIfwCAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEHMgAA2wgAIDMAAOsIACC2AwAA3AgAILcDAADqCAAgugMAABUAILsDAAAVACC8AwAAMgAgBzIAAN4IACAzAADoCAAgtgMAAN8IACC3AwAA5wgAILoDAAAXACC7AwAAFwAgvAMAABoAIAsyAAD0BgAwMwAA-gYAMLYDAAD1BgAwtwMAAPkGADC4AwAA9gYAILkDAAD_BQAwugMAAP8FADC7AwAA_wUAMLwDAAD_BQAwvQMAAPsGADC-AwAAggYAMAsyAADXBgAwMwAA3AYAMLYDAADYBgAwtwMAANkGADC4AwAA2gYAILkDAADbBgAwugMAANsGADC7AwAA2wYAMLwDAADbBgAwvQMAAN0GADC-AwAA3gYAMAsyAADLBgAwMwAA0AYAMLYDAADMBgAwtwMAAM0GADC4AwAAzgYAILkDAADPBgAwugMAAM8GADC7AwAAzwYAMLwDAADPBgAwvQMAANEGADC-AwAA0gYAMAsyAAC_BgAwMwAAxAYAMLYDAADABgAwtwMAAMEGADC4AwAAwgYAILkDAADDBgAwugMAAMMGADC7AwAAwwYAMLwDAADDBgAwvQMAAMUGADC-AwAAxgYAMAsyAAC2BgAwMwAAugYAMLYDAAC3BgAwtwMAALgGADC4AwAAuQYAILkDAADeBQAwugMAAN4FADC7AwAA3gUAMLwDAADeBQAwvQMAALsGADC-AwAA4QUAMAsyAACqBgAwMwAArwYAMLYDAACrBgAwtwMAAKwGADC4AwAArQYAILkDAACuBgAwugMAAK4GADC7AwAArgYAMLwDAACuBgAwvQMAALAGADC-AwAAsQYAMAsyAACeBgAwMwAAowYAMLYDAACfBgAwtwMAAKAGADC4AwAAoQYAILkDAACiBgAwugMAAKIGADC7AwAAogYAMLwDAACiBgAwvQMAAKQGADC-AwAApQYAMAsyAACSBgAwMwAAlwYAMLYDAACTBgAwtwMAAJQGADC4AwAAlQYAILkDAACWBgAwugMAAJYGADC7AwAAlgYAMLwDAACWBgAwvQMAAJgGADC-AwAAmQYAMAcDAAD-BAAgK4AAAAABwQIBAAAAAccCQAAAAAHaAgEAAAAB3AICAAAAAd0CQAAAAAECAAAARgAgMgAAnQYAIAMAAABGACAyAACdBgAgMwAAnAYAIAErAADmCAAwDAMAALkEACAHAAC9BAAgKwAAuwQAIL4CAAC8BAAwvwIAAEQAEMACAAC8BAAwwQIBAAAAAccCQACaBAAh2gIBAJcEACHbAgEAmQQAIdwCAgC2BAAh3QJAAJoEACECAAAARgAgKwAAnAYAIAIAAACaBgAgKwAAmwYAIAorAAC7BAAgvgIAAJkGADC_AgAAmgYAEMACAACZBgAwwQIBAJcEACHHAkAAmgQAIdoCAQCXBAAh2wIBAJkEACHcAgIAtgQAId0CQACaBAAhCisAALsEACC-AgAAmQYAML8CAACaBgAQwAIAAJkGADDBAgEAlwQAIccCQACaBAAh2gIBAJcEACHbAgEAmQQAIdwCAgC2BAAh3QJAAJoEACEGK4AAAAABwQIBAPAEACHHAkAA8QQAIdoCAQDwBAAh3AICAPoEACHdAkAA8QQAIQcDAAD8BAAgK4AAAAABwQIBAPAEACHHAkAA8QQAIdoCAQDwBAAh3AICAPoEACHdAkAA8QQAIQcDAAD-BAAgK4AAAAABwQIBAAAAAccCQAAAAAHaAgEAAAAB3AICAAAAAd0CQAAAAAEMAwAAigUAIMECAQAAAAHHAkAAAAAB2gIBAAAAAd4CAgAAAAHgAgAAAOACAuECAQAAAAHiAgEAAAAB4wIBAAAAAeQCAQAAAAHlAoAAAAAB5gIBAAAAAQIAAABBACAyAACpBgAgAwAAAEEAIDIAAKkGACAzAACoBgAgASsAAOUIADARAwAAwgQAIAcAAMEEACC-AgAAvgQAML8CAAA_ABDAAgAAvgQAMMECAQAAAAHHAkAAmgQAIdoCAQCZBAAh2wIBAJcEACHeAgIAmAQAIeACAAC_BOACIuECAQCZBAAh4gIBAJkEACHjAgEAmQQAIeQCAQCZBAAh5QIAAMAEACDmAgEAmQQAIQIAAABBACArAACoBgAgAgAAAKYGACArAACnBgAgD74CAAClBgAwvwIAAKYGABDAAgAApQYAMMECAQCXBAAhxwJAAJoEACHaAgEAmQQAIdsCAQCXBAAh3gICAJgEACHgAgAAvwTgAiLhAgEAmQQAIeICAQCZBAAh4wIBAJkEACHkAgEAmQQAIeUCAADABAAg5gIBAJkEACEPvgIAAKUGADC_AgAApgYAEMACAAClBgAwwQIBAJcEACHHAkAAmgQAIdoCAQCZBAAh2wIBAJcEACHeAgIAmAQAIeACAAC_BOACIuECAQCZBAAh4gIBAJkEACHjAgEAmQQAIeQCAQCZBAAh5QIAAMAEACDmAgEAmQQAIQvBAgEA8AQAIccCQADxBAAh2gIBAPsEACHeAgIAhQUAIeACAACGBeACIuECAQD7BAAh4gIBAPsEACHjAgEA-wQAIeQCAQD7BAAh5QKAAAAAAeYCAQD7BAAhDAMAAIgFACDBAgEA8AQAIccCQADxBAAh2gIBAPsEACHeAgIAhQUAIeACAACGBeACIuECAQD7BAAh4gIBAPsEACHjAgEA-wQAIeQCAQD7BAAh5QKAAAAAAeYCAQD7BAAhDAMAAIoFACDBAgEAAAABxwJAAAAAAdoCAQAAAAHeAgIAAAAB4AIAAADgAgLhAgEAAAAB4gIBAAAAAeMCAQAAAAHkAgEAAAAB5QKAAAAAAeYCAQAAAAEDAwAAkQUAIMcCQAAAAAHaAgEAAAABAgAAAD0AIDIAALUGACADAAAAPQAgMgAAtQYAIDMAALQGACABKwAA5AgAMAkDAAC5BAAgBwAAwQQAIL4CAADEBAAwvwIAADsAEMACAADEBAAwxwJAAJoEACHaAgEAlwQAIdsCAQCXBAAhrwMAAMMEACACAAAAPQAgKwAAtAYAIAIAAACyBgAgKwAAswYAIAa-AgAAsQYAML8CAACyBgAQwAIAALEGADDHAkAAmgQAIdoCAQCXBAAh2wIBAJcEACEGvgIAALEGADC_AgAAsgYAEMACAACxBgAwxwJAAJoEACHaAgEAlwQAIdsCAQCXBAAhAscCQADxBAAh2gIBAPAEACEDAwAAjwUAIMcCQADxBAAh2gIBAPAEACEDAwAAkQUAIMcCQAAAAAHaAgEAAAABBRAAAMAFACDBAgEAAAABxwJAAAAAAfICAgAAAAHzAgEAAAABAgAAACgAIDIAAL4GACADAAAAKAAgMgAAvgYAIDMAAL0GACABKwAA4wgAMAIAAAAoACArAAC9BgAgAgAAAOIFACArAAC8BgAgBMECAQDwBAAhxwJAAPEEACHyAgIA-gQAIfMCAQDwBAAhBRAAAL4FACDBAgEA8AQAIccCQADxBAAh8gICAPoEACHzAgEA8AQAIQUQAADABQAgwQIBAAAAAccCQAAAAAHyAgIAAAAB8wIBAAAAAQUYAACZBQAgwQIBAAAAAccCQAAAAAHnAgEAAAAB6QIAAADpAgICAAAANwAgMgAAygYAIAMAAAA3ACAyAADKBgAgMwAAyQYAIAErAADiCAAwCwcAAMEEACAYAADCBAAgvgIAAMYEADC_AgAANQAQwAIAAMYEADDBAgEAAAABxwJAAJoEACHbAgEAlwQAIecCAQCZBAAh6QIAAMcE6QIisAMAAMUEACACAAAANwAgKwAAyQYAIAIAAADHBgAgKwAAyAYAIAi-AgAAxgYAML8CAADHBgAQwAIAAMYGADDBAgEAlwQAIccCQACaBAAh2wIBAJcEACHnAgEAmQQAIekCAADHBOkCIgi-AgAAxgYAML8CAADHBgAQwAIAAMYGADDBAgEAlwQAIccCQACaBAAh2wIBAJcEACHnAgEAmQQAIekCAADHBOkCIgTBAgEA8AQAIccCQADxBAAh5wIBAPsEACHpAgAAlQXpAiIFGAAAlwUAIMECAQDwBAAhxwJAAPEEACHnAgEA-wQAIekCAACVBekCIgUYAACZBQAgwQIBAAAAAccCQAAAAAHnAgEAAAAB6QIAAADpAgIEAwAAoQUAIMcCQAAAAAHaAgEAAAAB6wIAAADrAgICAAAAEwAgMgAA1gYAIAMAAAATACAyAADWBgAgMwAA1QYAIAErAADhCAAwCgMAALkEACAHAADBBAAgvgIAAN4EADC_AgAAEQAQwAIAAN4EADDHAkAAmgQAIdoCAQCXBAAh2wIBAJcEACHrAgAA3wTrAiKvAwAA3QQAIAIAAAATACArAADVBgAgAgAAANMGACArAADUBgAgB74CAADSBgAwvwIAANMGABDAAgAA0gYAMMcCQACaBAAh2gIBAJcEACHbAgEAlwQAIesCAADfBOsCIge-AgAA0gYAML8CAADTBgAQwAIAANIGADDHAkAAmgQAIdoCAQCXBAAh2wIBAJcEACHrAgAA3wTrAiIDxwJAAPEEACHaAgEA8AQAIesCAACdBesCIgQDAACfBQAgxwJAAPEEACHaAgEA8AQAIesCAACdBesCIgQDAAChBQAgxwJAAAAAAdoCAQAAAAHrAgAAAOsCAg4IAADjBgAgCQAA5AYAIAsAAOUGACAPAADmBgAgEQAA5wYAIMcCQAAAAAHeAgIAAAAB9QIBAAAAAfYCAQAAAAH3AgEAAAAB-AIBAAAAAfkCAQAAAAH6AgEAAAAB-wJAAAAAAQIAAAAyACAyAADiBgAgAwAAADIAIDIAAOIGACAzAADhBgAgASsAAOAIADAUBwAAwQQAIAgAAL0EACAJAADKBAAgCwAAywQAIA8AAJsEACARAADMBAAgvgIAAMkEADC_AgAAFQAQwAIAAMkEADDHAkAAmgQAIdsCAQCXBAAh3gICALYEACH1AgEAlwQAIfYCAQCZBAAh9wIBAJkEACH4AgEAlwQAIfkCAQCZBAAh-gIBAJkEACH7AkAAuAQAIbEDAADIBAAgAgAAADIAICsAAOEGACACAAAA3wYAICsAAOAGACANvgIAAN4GADC_AgAA3wYAEMACAADeBgAwxwJAAJoEACHbAgEAlwQAId4CAgC2BAAh9QIBAJcEACH2AgEAmQQAIfcCAQCZBAAh-AIBAJcEACH5AgEAmQQAIfoCAQCZBAAh-wJAALgEACENvgIAAN4GADC_AgAA3wYAEMACAADeBgAwxwJAAJoEACHbAgEAlwQAId4CAgC2BAAh9QIBAJcEACH2AgEAmQQAIfcCAQCZBAAh-AIBAJcEACH5AgEAmQQAIfoCAQCZBAAh-wJAALgEACEJxwJAAPEEACHeAgIA-gQAIfUCAQDwBAAh9gIBAPsEACH3AgEA-wQAIfgCAQDwBAAh-QIBAPsEACH6AgEA-wQAIfsCQADyBAAhDggAANUFACAJAADWBQAgCwAA1wUAIA8AANgFACARAADZBQAgxwJAAPEEACHeAgIA-gQAIfUCAQDwBAAh9gIBAPsEACH3AgEA-wQAIfgCAQDwBAAh-QIBAPsEACH6AgEA-wQAIfsCQADyBAAhDggAAOMGACAJAADkBgAgCwAA5QYAIA8AAOYGACARAADnBgAgxwJAAAAAAd4CAgAAAAH1AgEAAAAB9gIBAAAAAfcCAQAAAAH4AgEAAAAB-QIBAAAAAfoCAQAAAAH7AkAAAAABAzIAAOgGACC2AwAA6QYAILwDAAAaACAEMgAA-wUAMLYDAAD8BQAwuAMAAP4FACC8AwAA_wUAMAQyAADvBQAwtgMAAPAFADC4AwAA8gUAILwDAADzBQAwBDIAAOYFADC2AwAA5wUAMLgDAADpBQAgvAMAAKwFADAEMgAA2gUAMLYDAADbBQAwuAMAAN0FACC8AwAA3gUAMBcTAADqBgAgFAAA6wYAIBUAAOwGACAWAADtBgAgFwAA7gYAIBkAAO8GACAaAADwBgAgGwAA8QYAIBwAAPIGACAdAADzBgAgxwJAAAAAAd0CQAAAAAHsAgIAAAAB_QIBAAAAAf4CAgAAAAGAAwAAAIADAoEDIAAAAAGCAyAAAAABgwMCAAAAAYQDAgAAAAGFAwIAAAABhgMCAAAAAYcDQAAAAAECAAAAGgAgMgAA6AYAIAMyAADeCAAgtgMAAN8IACC8AwAAGgAgBDIAAPQGADC2AwAA9QYAMLgDAAD2BgAgvAMAAP8FADADMgAA1ggAILYDAADXCAAgvAMAADIAIAQyAADXBgAwtgMAANgGADC4AwAA2gYAILwDAADbBgAwBDIAAMsGADC2AwAAzAYAMLgDAADOBgAgvAMAAM8GADAEMgAAvwYAMLYDAADABgAwuAMAAMIGACC8AwAAwwYAMAQyAAC2BgAwtgMAALcGADC4AwAAuQYAILwDAADeBQAwBDIAAKoGADC2AwAAqwYAMLgDAACtBgAgvAMAAK4GADAEMgAAngYAMLYDAACfBgAwuAMAAKEGACC8AwAAogYAMAQyAACSBgAwtgMAAJMGADC4AwAAlQYAILwDAACWBgAwGBIAAPgGACAUAADrBgAgFQAA7AYAIBYAAO0GACAXAADuBgAgGQAA7wYAIBoAAPAGACAbAADxBgAgHAAA8gYAIB0AAPMGACDBAgEAAAABxwJAAAAAAd0CQAAAAAHsAgIAAAAB_AICAAAAAf4CAgAAAAGAAwAAAIADAoEDIAAAAAGCAyAAAAABgwMCAAAAAYQDAgAAAAGFAwIAAAABhgMCAAAAAYcDQAAAAAECAAAAGgAgMgAA9wYAIAErAADdCAAwGBIAAPgGACAUAADrBgAgFQAA7AYAIBYAAO0GACAXAADuBgAgGQAA7wYAIBoAAPAGACAbAADxBgAgHAAA8gYAIB0AAPMGACDBAgEAAAABxwJAAAAAAd0CQAAAAAHsAgIAAAAB_AICAAAAAf4CAgAAAAGAAwAAAIADAoEDIAAAAAGCAyAAAAABgwMCAAAAAYQDAgAAAAGFAwIAAAABhgMCAAAAAYcDQAAAAAEDMgAA2wgAILYDAADcCAAgvAMAADIAIAMAAAAaACAyAAD3BgAgMwAA_QYAIAIAAAAaACArAAD9BgAgAgAAAIMGACArAAD8BgAgDsECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH-AgIAhQUAIYADAACFBoADIoEDIACGBgAhggMgAIYGACGDAwIA-gQAIYQDAgD6BAAhhQMCAPoEACGGAwIA-gQAIYcDQADyBAAhGBIAAIgGACAUAACKBgAgFQAA_gYAIBYAAIsGACAXAACMBgAgGQAAjQYAIBoAAI4GACAbAACPBgAgHAAAkAYAIB0AAJEGACDBAgEA8AQAIccCQADxBAAh3QJAAPEEACHsAgIAhQUAIfwCAgCFBQAh_gICAIUFACGAAwAAhQaAAyKBAyAAhgYAIYIDIACGBgAhgwMCAPoEACGEAwIA-gQAIYUDAgD6BAAhhgMCAPoEACGHA0AA8gQAIQcyAADWCAAgMwAA2QgAILYDAADXCAAgtwMAANgIACC6AwAAFQAguwMAABUAILwDAAAyACAXEgAA-AYAIBMAAOoGACAUAADrBgAgFgAA7QYAIBcAAO4GACAZAADvBgAgGgAA8AYAIBsAAPEGACAcAADyBgAgHQAA8wYAIMECAQAAAAHHAkAAAAAB3QJAAAAAAewCAgAAAAH8AgIAAAABgAMAAACAAwKBAyAAAAABggMgAAAAAYMDAgAAAAGEAwIAAAABhQMCAAAAAYYDAgAAAAGHA0AAAAABAwAAABcAIDIAAOgGACAzAACCBwAgGQAAABcAIBMAAIkGACAUAACKBgAgFQAA_gYAIBYAAIsGACAXAACMBgAgGQAAjQYAIBoAAI4GACAbAACPBgAgHAAAkAYAIB0AAJEGACArAACCBwAgxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_QIBAPsEACH-AgIAhQUAIYADAACFBoADIoEDIACGBgAhggMgAIYGACGDAwIA-gQAIYQDAgD6BAAhhQMCAPoEACGGAwIA-gQAIYcDQADyBAAhFxMAAIkGACAUAACKBgAgFQAA_gYAIBYAAIsGACAXAACMBgAgGQAAjQYAIBoAAI4GACAbAACPBgAgHAAAkAYAIB0AAJEGACDHAkAA8QQAId0CQADxBAAh7AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEDMgAA1AgAILYDAADVCAAgvAMAABoAIAAAAAAAAAAAAAAFMgAAzwgAIDMAANIIACC2AwAA0AgAILcDAADRCAAgvAMAAAEAIAMyAADPCAAgtgMAANAIACC8AwAAAQAgAAAABzIAAMoIACAzAADNCAAgtgMAAMsIACC3AwAAzAgAILoDAAAPACC7AwAADwAgvAMAAAEAIAMyAADKCAAgtgMAAMsIACC8AwAAAQAgAAAABTIAAMUIACAzAADICAAgtgMAAMYIACC3AwAAxwgAILwDAAABACADMgAAxQgAILYDAADGCAAgvAMAAAEAIAAAAAUyAADACAAgMwAAwwgAILYDAADBCAAgtwMAAMIIACC8AwAAAQAgAzIAAMAIACC2AwAAwQgAILwDAAABACAAAAAAAAG5AwAAAKIDAgG5AwAAAKQDAgG5AyAAAAABCzIAAI4IADAzAACTCAAwtgMAAI8IADC3AwAAkAgAMLgDAACRCAAguQMAAJIIADC6AwAAkggAMLsDAACSCAAwvAMAAJIIADC9AwAAlAgAML4DAACVCAAwCzIAAIIIADAzAACHCAAwtgMAAIMIADC3AwAAhAgAMLgDAACFCAAguQMAAIYIADC6AwAAhggAMLsDAACGCAAwvAMAAIYIADC9AwAAiAgAML4DAACJCAAwCzIAAPYHADAzAAD7BwAwtgMAAPcHADC3AwAA-AcAMLgDAAD5BwAguQMAAPoHADC6AwAA-gcAMLsDAAD6BwAwvAMAAPoHADC9AwAA_AcAML4DAAD9BwAwCzIAAO0HADAzAADxBwAwtgMAAO4HADC3AwAA7wcAMLgDAADwBwAguQMAAM8GADC6AwAAzwYAMLsDAADPBgAwvAMAAM8GADC9AwAA8gcAML4DAADSBgAwCzIAAOQHADAzAADoBwAwtgMAAOUHADC3AwAA5gcAMLgDAADnBwAguQMAAMMGADC6AwAAwwYAMLsDAADDBgAwvAMAAMMGADC9AwAA6QcAML4DAADGBgAwCzIAANgHADAzAADdBwAwtgMAANkHADC3AwAA2gcAMLgDAADbBwAguQMAANwHADC6AwAA3AcAMLsDAADcBwAwvAMAANwHADC9AwAA3gcAML4DAADfBwAwCzIAAM8HADAzAADTBwAwtgMAANAHADC3AwAA0QcAMLgDAADSBwAguQMAAK4GADC6AwAArgYAMLsDAACuBgAwvAMAAK4GADC9AwAA1AcAML4DAACxBgAwCzIAAMYHADAzAADKBwAwtgMAAMcHADC3AwAAyAcAMLgDAADJBwAguQMAAKIGADC6AwAAogYAMLsDAACiBgAwvAMAAKIGADC9AwAAywcAML4DAAClBgAwCzIAAL0HADAzAADBBwAwtgMAAL4HADC3AwAAvwcAMLgDAADABwAguQMAAJYGADC6AwAAlgYAMLsDAACWBgAwvAMAAJYGADC9AwAAwgcAML4DAACZBgAwCzIAALEHADAzAAC2BwAwtgMAALIHADC3AwAAswcAMLgDAAC0BwAguQMAALUHADC6AwAAtQcAMLsDAAC1BwAwvAMAALUHADC9AwAAtwcAML4DAAC4BwAwCsECAQAAAAHHAkAAAAAB7QIBAAAAAYgDAQAAAAGJAwEAAAABigMCAAAAAYsDAQAAAAGMAyAAAAABjQMBAAAAAY4DAQAAAAECAAAAWwAgMgAAvAcAIAMAAABbACAyAAC8BwAgMwAAuwcAIAErAAC_CAAwDwMAALkEACC-AgAAtQQAML8CAABZABDAAgAAtQQAMMECAQAAAAHHAkAAuAQAIdoCAQCXBAAh7QIBAJkEACGIAwEAlwQAIYkDAQCXBAAhigMCALYEACGLAwEAlwQAIYwDIAC3BAAhjQMBAJkEACGOAwEAmQQAIQIAAABbACArAAC7BwAgAgAAALkHACArAAC6BwAgDr4CAAC4BwAwvwIAALkHABDAAgAAuAcAMMECAQCXBAAhxwJAALgEACHaAgEAlwQAIe0CAQCZBAAhiAMBAJcEACGJAwEAlwQAIYoDAgC2BAAhiwMBAJcEACGMAyAAtwQAIY0DAQCZBAAhjgMBAJkEACEOvgIAALgHADC_AgAAuQcAEMACAAC4BwAwwQIBAJcEACHHAkAAuAQAIdoCAQCXBAAh7QIBAJkEACGIAwEAlwQAIYkDAQCXBAAhigMCALYEACGLAwEAlwQAIYwDIAC3BAAhjQMBAJkEACGOAwEAmQQAIQrBAgEA8AQAIccCQADyBAAh7QIBAPsEACGIAwEA8AQAIYkDAQDwBAAhigMCAPoEACGLAwEA8AQAIYwDIACGBgAhjQMBAPsEACGOAwEA-wQAIQrBAgEA8AQAIccCQADyBAAh7QIBAPsEACGIAwEA8AQAIYkDAQDwBAAhigMCAPoEACGLAwEA8AQAIYwDIACGBgAhjQMBAPsEACGOAwEA-wQAIQrBAgEAAAABxwJAAAAAAe0CAQAAAAGIAwEAAAABiQMBAAAAAYoDAgAAAAGLAwEAAAABjAMgAAAAAY0DAQAAAAGOAwEAAAABBwcAAP8EACArgAAAAAHBAgEAAAABxwJAAAAAAdsCAQAAAAHcAgIAAAAB3QJAAAAAAQIAAABGACAyAADFBwAgAwAAAEYAIDIAAMUHACAzAADEBwAgASsAAL4IADACAAAARgAgKwAAxAcAIAIAAACaBgAgKwAAwwcAIAYrgAAAAAHBAgEA8AQAIccCQADxBAAh2wIBAPsEACHcAgIA-gQAId0CQADxBAAhBwcAAP0EACArgAAAAAHBAgEA8AQAIccCQADxBAAh2wIBAPsEACHcAgIA-gQAId0CQADxBAAhBwcAAP8EACArgAAAAAHBAgEAAAABxwJAAAAAAdsCAQAAAAHcAgIAAAAB3QJAAAAAAQwHAACJBQAgwQIBAAAAAccCQAAAAAHbAgEAAAAB3gICAAAAAeACAAAA4AIC4QIBAAAAAeICAQAAAAHjAgEAAAAB5AIBAAAAAeUCgAAAAAHmAgEAAAABAgAAAEEAIDIAAM4HACADAAAAQQAgMgAAzgcAIDMAAM0HACABKwAAvQgAMAIAAABBACArAADNBwAgAgAAAKYGACArAADMBwAgC8ECAQDwBAAhxwJAAPEEACHbAgEA8AQAId4CAgCFBQAh4AIAAIYF4AIi4QIBAPsEACHiAgEA-wQAIeMCAQD7BAAh5AIBAPsEACHlAoAAAAAB5gIBAPsEACEMBwAAhwUAIMECAQDwBAAhxwJAAPEEACHbAgEA8AQAId4CAgCFBQAh4AIAAIYF4AIi4QIBAPsEACHiAgEA-wQAIeMCAQD7BAAh5AIBAPsEACHlAoAAAAAB5gIBAPsEACEMBwAAiQUAIMECAQAAAAHHAkAAAAAB2wIBAAAAAd4CAgAAAAHgAgAAAOACAuECAQAAAAHiAgEAAAAB4wIBAAAAAeQCAQAAAAHlAoAAAAAB5gIBAAAAAQMHAACQBQAgxwJAAAAAAdsCAQAAAAECAAAAPQAgMgAA1wcAIAMAAAA9ACAyAADXBwAgMwAA1gcAIAErAAC8CAAwAgAAAD0AICsAANYHACACAAAAsgYAICsAANUHACACxwJAAPEEACHbAgEA8AQAIQMHAACOBQAgxwJAAPEEACHbAgEA8AQAIQMHAACQBQAgxwJAAAAAAdsCAQAAAAEHwQIBAAAAAcICAQAAAAHEAgEAAAABxQIBAAAAAcYCgAAAAAHHAkAAAAAByAJAAAAAAQIAAABUACAyAADjBwAgAwAAAFQAIDIAAOMHACAzAADiBwAgASsAALsIADAMIAAAuQQAIL4CAAC6BAAwvwIAAFIAEMACAAC6BAAwwQIBAAAAAcICAQCXBAAhwwIBAJcEACHEAgEAlwQAIcUCAQCXBAAhxgIAALsEACDHAkAAmgQAIcgCQAC4BAAhAgAAAFQAICsAAOIHACACAAAA4AcAICsAAOEHACALvgIAAN8HADC_AgAA4AcAEMACAADfBwAwwQIBAJcEACHCAgEAlwQAIcMCAQCXBAAhxAIBAJcEACHFAgEAlwQAIcYCAAC7BAAgxwJAAJoEACHIAkAAuAQAIQu-AgAA3wcAML8CAADgBwAQwAIAAN8HADDBAgEAlwQAIcICAQCXBAAhwwIBAJcEACHEAgEAlwQAIcUCAQCXBAAhxgIAALsEACDHAkAAmgQAIcgCQAC4BAAhB8ECAQDwBAAhwgIBAPAEACHEAgEA8AQAIcUCAQDwBAAhxgKAAAAAAccCQADxBAAhyAJAAPIEACEHwQIBAPAEACHCAgEA8AQAIcQCAQDwBAAhxQIBAPAEACHGAoAAAAABxwJAAPEEACHIAkAA8gQAIQfBAgEAAAABwgIBAAAAAcQCAQAAAAHFAgEAAAABxgKAAAAAAccCQAAAAAHIAkAAAAABBQcAAJgFACDBAgEAAAABxwJAAAAAAdsCAQAAAAHpAgAAAOkCAgIAAAA3ACAyAADsBwAgAwAAADcAIDIAAOwHACAzAADrBwAgASsAALoIADACAAAANwAgKwAA6wcAIAIAAADHBgAgKwAA6gcAIATBAgEA8AQAIccCQADxBAAh2wIBAPAEACHpAgAAlQXpAiIFBwAAlgUAIMECAQDwBAAhxwJAAPEEACHbAgEA8AQAIekCAACVBekCIgUHAACYBQAgwQIBAAAAAccCQAAAAAHbAgEAAAAB6QIAAADpAgIEBwAAoAUAIMcCQAAAAAHbAgEAAAAB6wIAAADrAgICAAAAEwAgMgAA9QcAIAMAAAATACAyAAD1BwAgMwAA9AcAIAErAAC5CAAwAgAAABMAICsAAPQHACACAAAA0wYAICsAAPMHACADxwJAAPEEACHbAgEA8AQAIesCAACdBesCIgQHAACeBQAgxwJAAPEEACHbAgEA8AQAIesCAACdBesCIgQHAACgBQAgxwJAAAAAAdsCAQAAAAHrAgAAAOsCAgbBAgEAAAABxwJAAAAAAd0CQAAAAAGPAwEAAAABkAMBAAAAAZEDQAAAAAECAAAADQAgMgAAgQgAIAMAAAANACAyAACBCAAgMwAAgAgAIAErAAC4CAAwCwMAAMIEACC-AgAA6QQAML8CAAALABDAAgAA6QQAMMECAQAAAAHHAkAAuAQAIdoCAQCZBAAh3QJAALgEACGPAwEAlwQAIZADAQCXBAAhkQNAAJoEACECAAAADQAgKwAAgAgAIAIAAAD-BwAgKwAA_wcAIAq-AgAA_QcAML8CAAD-BwAQwAIAAP0HADDBAgEAlwQAIccCQAC4BAAh2gIBAJkEACHdAkAAuAQAIY8DAQCXBAAhkAMBAJcEACGRA0AAmgQAIQq-AgAA_QcAML8CAAD-BwAQwAIAAP0HADDBAgEAlwQAIccCQAC4BAAh2gIBAJkEACHdAkAAuAQAIY8DAQCXBAAhkAMBAJcEACGRA0AAmgQAIQbBAgEA8AQAIccCQADyBAAh3QJAAPIEACGPAwEA8AQAIZADAQDwBAAhkQNAAPEEACEGwQIBAPAEACHHAkAA8gQAId0CQADyBAAhjwMBAPAEACGQAwEA8AQAIZEDQADxBAAhBsECAQAAAAHHAkAAAAAB3QJAAAAAAY8DAQAAAAGQAwEAAAABkQNAAAAAAQjBAgEAAAABxwJAAAAAAd0CQAAAAAHjAgEAAAABkQNAAAAAAZIDAQAAAAGTAwEAAAABlAMBAAAAAQIAAAAJACAyAACNCAAgAwAAAAkAIDIAAI0IACAzAACMCAAgASsAALcIADANAwAAuQQAIL4CAADqBAAwvwIAAAcAEMACAADqBAAwwQIBAAAAAccCQACaBAAh2gIBAJcEACHdAkAAmgQAIeMCAQCZBAAhkQNAAJoEACGSAwEAAAABkwMBAJkEACGUAwEAmQQAIQIAAAAJACArAACMCAAgAgAAAIoIACArAACLCAAgDL4CAACJCAAwvwIAAIoIABDAAgAAiQgAMMECAQCXBAAhxwJAAJoEACHaAgEAlwQAId0CQACaBAAh4wIBAJkEACGRA0AAmgQAIZIDAQCXBAAhkwMBAJkEACGUAwEAmQQAIQy-AgAAiQgAML8CAACKCAAQwAIAAIkIADDBAgEAlwQAIccCQACaBAAh2gIBAJcEACHdAkAAmgQAIeMCAQCZBAAhkQNAAJoEACGSAwEAlwQAIZMDAQCZBAAhlAMBAJkEACEIwQIBAPAEACHHAkAA8QQAId0CQADxBAAh4wIBAPsEACGRA0AA8QQAIZIDAQDwBAAhkwMBAPsEACGUAwEA-wQAIQjBAgEA8AQAIccCQADxBAAh3QJAAPEEACHjAgEA-wQAIZEDQADxBAAhkgMBAPAEACGTAwEA-wQAIZQDAQD7BAAhCMECAQAAAAHHAkAAAAAB3QJAAAAAAeMCAQAAAAGRA0AAAAABkgMBAAAAAZMDAQAAAAGUAwEAAAABDMECAQAAAAHHAkAAAAAB3QJAAAAAAZUDAQAAAAGWAwEAAAABlwMBAAAAAZgDAQAAAAGZA0AAAAABmgNAAAAAAZsDAQAAAAGcAwEAAAABnQMBAAAAAQIAAAAFACAyAACZCAAgAwAAAAUAIDIAAJkIACAzAACYCAAgASsAALYIADARAwAAuQQAIL4CAADrBAAwvwIAAAMAEMACAADrBAAwwQIBAAAAAccCQACaBAAh2gIBAJcEACHdAkAAmgQAIZUDAQCXBAAhlgMBAJcEACGXAwEAmQQAIZgDAQCZBAAhmQNAALgEACGaA0AAuAQAIZsDAQCZBAAhnAMBAJkEACGdAwEAmQQAIQIAAAAFACArAACYCAAgAgAAAJYIACArAACXCAAgEL4CAACVCAAwvwIAAJYIABDAAgAAlQgAMMECAQCXBAAhxwJAAJoEACHaAgEAlwQAId0CQACaBAAhlQMBAJcEACGWAwEAlwQAIZcDAQCZBAAhmAMBAJkEACGZA0AAuAQAIZoDQAC4BAAhmwMBAJkEACGcAwEAmQQAIZ0DAQCZBAAhEL4CAACVCAAwvwIAAJYIABDAAgAAlQgAMMECAQCXBAAhxwJAAJoEACHaAgEAlwQAId0CQACaBAAhlQMBAJcEACGWAwEAlwQAIZcDAQCZBAAhmAMBAJkEACGZA0AAuAQAIZoDQAC4BAAhmwMBAJkEACGcAwEAmQQAIZ0DAQCZBAAhDMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIZUDAQDwBAAhlgMBAPAEACGXAwEA-wQAIZgDAQD7BAAhmQNAAPIEACGaA0AA8gQAIZsDAQD7BAAhnAMBAPsEACGdAwEA-wQAIQzBAgEA8AQAIccCQADxBAAh3QJAAPEEACGVAwEA8AQAIZYDAQDwBAAhlwMBAPsEACGYAwEA-wQAIZkDQADyBAAhmgNAAPIEACGbAwEA-wQAIZwDAQD7BAAhnQMBAPsEACEMwQIBAAAAAccCQAAAAAHdAkAAAAABlQMBAAAAAZYDAQAAAAGXAwEAAAABmAMBAAAAAZkDQAAAAAGaA0AAAAABmwMBAAAAAZwDAQAAAAGdAwEAAAABBDIAAI4IADC2AwAAjwgAMLgDAACRCAAgvAMAAJIIADAEMgAAgggAMLYDAACDCAAwuAMAAIUIACC8AwAAhggAMAQyAAD2BwAwtgMAAPcHADC4AwAA-QcAILwDAAD6BwAwBDIAAO0HADC2AwAA7gcAMLgDAADwBwAgvAMAAM8GADAEMgAA5AcAMLYDAADlBwAwuAMAAOcHACC8AwAAwwYAMAQyAADYBwAwtgMAANkHADC4AwAA2wcAILwDAADcBwAwBDIAAM8HADC2AwAA0AcAMLgDAADSBwAgvAMAAK4GADAEMgAAxgcAMLYDAADHBwAwuAMAAMkHACC8AwAAogYAMAQyAAC9BwAwtgMAAL4HADC4AwAAwAcAILwDAACWBgAwBDIAALEHADC2AwAAsgcAMLgDAAC0BwAgvAMAALUHADAAAAAAAAAAAAAAGQQAAKQIACAFAAClCAAgBgAApggAIB4AAKcIACAfAACoCAAgIQAAqQgAICIAAKoIACAjAACrCAAgJAAArAgAICUAAK0IACDrAgAA7AQAIOwCAADsBAAg7QIAAOwEACCHAwAA7AQAIJ4DAADsBAAgoAMAAOwEACCmAwAA7AQAIKcDAADsBAAgqAMAAOwEACCpAwAA7AQAIKoDAADsBAAgqwMAAOwEACCsAwAA7AQAIK0DAADsBAAgrgMAAOwEACAQEgAAswgAIBMAAK8IACAUAACwCAAgFQAAswgAIBYAALUIACAXAACnCAAgGQAAqAgAIBoAALIIACAbAACqCAAgHAAAqwgAIB0AAKwIACDsAgAA7AQAIPwCAADsBAAg_QIAAOwEACD-AgAA7AQAIIcDAADsBAAgAAAACwcAAK8IACAIAACvCAAgCQAAsAgAIAsAALEIACAPAAC3BQAgEQAAsggAIPYCAADsBAAg9wIAAOwEACD5AgAA7AQAIPoCAADsBAAg-wIAAOwEACADDAAAtwUAIOwCAADsBAAg7gIAAOwEACAADMECAQAAAAHHAkAAAAAB3QJAAAAAAZUDAQAAAAGWAwEAAAABlwMBAAAAAZgDAQAAAAGZA0AAAAABmgNAAAAAAZsDAQAAAAGcAwEAAAABnQMBAAAAAQjBAgEAAAABxwJAAAAAAd0CQAAAAAHjAgEAAAABkQNAAAAAAZIDAQAAAAGTAwEAAAABlAMBAAAAAQbBAgEAAAABxwJAAAAAAd0CQAAAAAGPAwEAAAABkAMBAAAAAZEDQAAAAAEDxwJAAAAAAdsCAQAAAAHrAgAAAOsCAgTBAgEAAAABxwJAAAAAAdsCAQAAAAHpAgAAAOkCAgfBAgEAAAABwgIBAAAAAcQCAQAAAAHFAgEAAAABxgKAAAAAAccCQAAAAAHIAkAAAAABAscCQAAAAAHbAgEAAAABC8ECAQAAAAHHAkAAAAAB2wIBAAAAAd4CAgAAAAHgAgAAAOACAuECAQAAAAHiAgEAAAAB4wIBAAAAAeQCAQAAAAHlAoAAAAAB5gIBAAAAAQYrgAAAAAHBAgEAAAABxwJAAAAAAdsCAQAAAAHcAgIAAAAB3QJAAAAAAQrBAgEAAAABxwJAAAAAAe0CAQAAAAGIAwEAAAABiQMBAAAAAYoDAgAAAAGLAwEAAAABjAMgAAAAAY0DAQAAAAGOAwEAAAABHwUAAJsIACAGAACcCAAgHgAAnQgAIB8AAJ4IACAhAACfCAAgIgAAoAgAICMAAKEIACAkAACiCAAgJQAAowgAIMECAQAAAAHHAkAAAAAB3QJAAAAAAesCAQAAAAHsAgIAAAAB7QIBAAAAAYcDQAAAAAGeAwEAAAABnwMgAAAAAaADAQAAAAGiAwAAAKIDAqQDAAAApAMCpQMgAAAAAaYDAQAAAAGnAwEAAAABqAOAAAAAAakDQAAAAAGqAwEAAAABqwMgAAAAAawDAQAAAAGtA0AAAAABrgNAAAAAAQIAAAABACAyAADACAAgAwAAAA8AIDIAAMAIACAzAADECAAgIQAAAA8AIAUAAKgHACAGAACpBwAgHgAAqgcAIB8AAKsHACAhAACsBwAgIgAArQcAICMAAK4HACAkAACvBwAgJQAAsAcAICsAAMQIACDBAgEA8AQAIccCQADxBAAh3QJAAPEEACHrAgEA-wQAIewCAgCFBQAh7QIBAPsEACGHA0AA8gQAIZ4DAQD7BAAhnwMgAIYGACGgAwEA-wQAIaIDAACkB6IDIqQDAAClB6QDIqUDIACGBgAhpgMBAPsEACGnAwEA-wQAIagDgAAAAAGpA0AA8gQAIaoDAQD7BAAhqwMgAKYHACGsAwEA-wQAIa0DQADyBAAhrgNAAPIEACEfBQAAqAcAIAYAAKkHACAeAACqBwAgHwAAqwcAICEAAKwHACAiAACtBwAgIwAArgcAICQAAK8HACAlAACwBwAgwQIBAPAEACHHAkAA8QQAId0CQADxBAAh6wIBAPsEACHsAgIAhQUAIe0CAQD7BAAhhwNAAPIEACGeAwEA-wQAIZ8DIACGBgAhoAMBAPsEACGiAwAApAeiAyKkAwAApQekAyKlAyAAhgYAIaYDAQD7BAAhpwMBAPsEACGoA4AAAAABqQNAAPIEACGqAwEA-wQAIasDIACmBwAhrAMBAPsEACGtA0AA8gQAIa4DQADyBAAhHwQAAJoIACAGAACcCAAgHgAAnQgAIB8AAJ4IACAhAACfCAAgIgAAoAgAICMAAKEIACAkAACiCAAgJQAAowgAIMECAQAAAAHHAkAAAAAB3QJAAAAAAesCAQAAAAHsAgIAAAAB7QIBAAAAAYcDQAAAAAGeAwEAAAABnwMgAAAAAaADAQAAAAGiAwAAAKIDAqQDAAAApAMCpQMgAAAAAaYDAQAAAAGnAwEAAAABqAOAAAAAAakDQAAAAAGqAwEAAAABqwMgAAAAAawDAQAAAAGtA0AAAAABrgNAAAAAAQIAAAABACAyAADFCAAgAwAAAA8AIDIAAMUIACAzAADJCAAgIQAAAA8AIAQAAKcHACAGAACpBwAgHgAAqgcAIB8AAKsHACAhAACsBwAgIgAArQcAICMAAK4HACAkAACvBwAgJQAAsAcAICsAAMkIACDBAgEA8AQAIccCQADxBAAh3QJAAPEEACHrAgEA-wQAIewCAgCFBQAh7QIBAPsEACGHA0AA8gQAIZ4DAQD7BAAhnwMgAIYGACGgAwEA-wQAIaIDAACkB6IDIqQDAAClB6QDIqUDIACGBgAhpgMBAPsEACGnAwEA-wQAIagDgAAAAAGpA0AA8gQAIaoDAQD7BAAhqwMgAKYHACGsAwEA-wQAIa0DQADyBAAhrgNAAPIEACEfBAAApwcAIAYAAKkHACAeAACqBwAgHwAAqwcAICEAAKwHACAiAACtBwAgIwAArgcAICQAAK8HACAlAACwBwAgwQIBAPAEACHHAkAA8QQAId0CQADxBAAh6wIBAPsEACHsAgIAhQUAIe0CAQD7BAAhhwNAAPIEACGeAwEA-wQAIZ8DIACGBgAhoAMBAPsEACGiAwAApAeiAyKkAwAApQekAyKlAyAAhgYAIaYDAQD7BAAhpwMBAPsEACGoA4AAAAABqQNAAPIEACGqAwEA-wQAIasDIACmBwAhrAMBAPsEACGtA0AA8gQAIa4DQADyBAAhHwQAAJoIACAFAACbCAAgHgAAnQgAIB8AAJ4IACAhAACfCAAgIgAAoAgAICMAAKEIACAkAACiCAAgJQAAowgAIMECAQAAAAHHAkAAAAAB3QJAAAAAAesCAQAAAAHsAgIAAAAB7QIBAAAAAYcDQAAAAAGeAwEAAAABnwMgAAAAAaADAQAAAAGiAwAAAKIDAqQDAAAApAMCpQMgAAAAAaYDAQAAAAGnAwEAAAABqAOAAAAAAakDQAAAAAGqAwEAAAABqwMgAAAAAawDAQAAAAGtA0AAAAABrgNAAAAAAQIAAAABACAyAADKCAAgAwAAAA8AIDIAAMoIACAzAADOCAAgIQAAAA8AIAQAAKcHACAFAACoBwAgHgAAqgcAIB8AAKsHACAhAACsBwAgIgAArQcAICMAAK4HACAkAACvBwAgJQAAsAcAICsAAM4IACDBAgEA8AQAIccCQADxBAAh3QJAAPEEACHrAgEA-wQAIewCAgCFBQAh7QIBAPsEACGHA0AA8gQAIZ4DAQD7BAAhnwMgAIYGACGgAwEA-wQAIaIDAACkB6IDIqQDAAClB6QDIqUDIACGBgAhpgMBAPsEACGnAwEA-wQAIagDgAAAAAGpA0AA8gQAIaoDAQD7BAAhqwMgAKYHACGsAwEA-wQAIa0DQADyBAAhrgNAAPIEACEfBAAApwcAIAUAAKgHACAeAACqBwAgHwAAqwcAICEAAKwHACAiAACtBwAgIwAArgcAICQAAK8HACAlAACwBwAgwQIBAPAEACHHAkAA8QQAId0CQADxBAAh6wIBAPsEACHsAgIAhQUAIe0CAQD7BAAhhwNAAPIEACGeAwEA-wQAIZ8DIACGBgAhoAMBAPsEACGiAwAApAeiAyKkAwAApQekAyKlAyAAhgYAIaYDAQD7BAAhpwMBAPsEACGoA4AAAAABqQNAAPIEACGqAwEA-wQAIasDIACmBwAhrAMBAPsEACGtA0AA8gQAIa4DQADyBAAhHwQAAJoIACAFAACbCAAgBgAAnAgAIB4AAJ0IACAfAACeCAAgIQAAnwgAICIAAKAIACAjAAChCAAgJAAAoggAIMECAQAAAAHHAkAAAAAB3QJAAAAAAesCAQAAAAHsAgIAAAAB7QIBAAAAAYcDQAAAAAGeAwEAAAABnwMgAAAAAaADAQAAAAGiAwAAAKIDAqQDAAAApAMCpQMgAAAAAaYDAQAAAAGnAwEAAAABqAOAAAAAAakDQAAAAAGqAwEAAAABqwMgAAAAAawDAQAAAAGtA0AAAAABrgNAAAAAAQIAAAABACAyAADPCAAgAwAAAA8AIDIAAM8IACAzAADTCAAgIQAAAA8AIAQAAKcHACAFAACoBwAgBgAAqQcAIB4AAKoHACAfAACrBwAgIQAArAcAICIAAK0HACAjAACuBwAgJAAArwcAICsAANMIACDBAgEA8AQAIccCQADxBAAh3QJAAPEEACHrAgEA-wQAIewCAgCFBQAh7QIBAPsEACGHA0AA8gQAIZ4DAQD7BAAhnwMgAIYGACGgAwEA-wQAIaIDAACkB6IDIqQDAAClB6QDIqUDIACGBgAhpgMBAPsEACGnAwEA-wQAIagDgAAAAAGpA0AA8gQAIaoDAQD7BAAhqwMgAKYHACGsAwEA-wQAIa0DQADyBAAhrgNAAPIEACEfBAAApwcAIAUAAKgHACAGAACpBwAgHgAAqgcAIB8AAKsHACAhAACsBwAgIgAArQcAICMAAK4HACAkAACvBwAgwQIBAPAEACHHAkAA8QQAId0CQADxBAAh6wIBAPsEACHsAgIAhQUAIe0CAQD7BAAhhwNAAPIEACGeAwEA-wQAIZ8DIACGBgAhoAMBAPsEACGiAwAApAeiAyKkAwAApQekAyKlAyAAhgYAIaYDAQD7BAAhpwMBAPsEACGoA4AAAAABqQNAAPIEACGqAwEA-wQAIasDIACmBwAhrAMBAPsEACGtA0AA8gQAIa4DQADyBAAhGRIAAPgGACATAADqBgAgFAAA6wYAIBUAAOwGACAXAADuBgAgGQAA7wYAIBoAAPAGACAbAADxBgAgHAAA8gYAIB0AAPMGACDBAgEAAAABxwJAAAAAAd0CQAAAAAHsAgIAAAAB_AICAAAAAf0CAQAAAAH-AgIAAAABgAMAAACAAwKBAyAAAAABggMgAAAAAYMDAgAAAAGEAwIAAAABhQMCAAAAAYYDAgAAAAGHA0AAAAABAgAAABoAIDIAANQIACAPBwAAgwcAIAgAAOMGACALAADlBgAgDwAA5gYAIBEAAOcGACDHAkAAAAAB2wIBAAAAAd4CAgAAAAH1AgEAAAAB9gIBAAAAAfcCAQAAAAH4AgEAAAAB-QIBAAAAAfoCAQAAAAH7AkAAAAABAgAAADIAIDIAANYIACADAAAAFQAgMgAA1ggAIDMAANoIACARAAAAFQAgBwAA1AUAIAgAANUFACALAADXBQAgDwAA2AUAIBEAANkFACArAADaCAAgxwJAAPEEACHbAgEA8AQAId4CAgD6BAAh9QIBAPAEACH2AgEA-wQAIfcCAQD7BAAh-AIBAPAEACH5AgEA-wQAIfoCAQD7BAAh-wJAAPIEACEPBwAA1AUAIAgAANUFACALAADXBQAgDwAA2AUAIBEAANkFACDHAkAA8QQAIdsCAQDwBAAh3gICAPoEACH1AgEA8AQAIfYCAQD7BAAh9wIBAPsEACH4AgEA8AQAIfkCAQD7BAAh-gIBAPsEACH7AkAA8gQAIQ8HAACDBwAgCQAA5AYAIAsAAOUGACAPAADmBgAgEQAA5wYAIMcCQAAAAAHbAgEAAAAB3gICAAAAAfUCAQAAAAH2AgEAAAAB9wIBAAAAAfgCAQAAAAH5AgEAAAAB-gIBAAAAAfsCQAAAAAECAAAAMgAgMgAA2wgAIA7BAgEAAAABxwJAAAAAAd0CQAAAAAHsAgIAAAAB_AICAAAAAf4CAgAAAAGAAwAAAIADAoEDIAAAAAGCAyAAAAABgwMCAAAAAYQDAgAAAAGFAwIAAAABhgMCAAAAAYcDQAAAAAEZEgAA-AYAIBMAAOoGACAVAADsBgAgFgAA7QYAIBcAAO4GACAZAADvBgAgGgAA8AYAIBsAAPEGACAcAADyBgAgHQAA8wYAIMECAQAAAAHHAkAAAAAB3QJAAAAAAewCAgAAAAH8AgIAAAAB_QIBAAAAAf4CAgAAAAGAAwAAAIADAoEDIAAAAAGCAyAAAAABgwMCAAAAAYQDAgAAAAGFAwIAAAABhgMCAAAAAYcDQAAAAAECAAAAGgAgMgAA3ggAIAnHAkAAAAAB3gICAAAAAfUCAQAAAAH2AgEAAAAB9wIBAAAAAfgCAQAAAAH5AgEAAAAB-gIBAAAAAfsCQAAAAAEDxwJAAAAAAdoCAQAAAAHrAgAAAOsCAgTBAgEAAAABxwJAAAAAAecCAQAAAAHpAgAAAOkCAgTBAgEAAAABxwJAAAAAAfICAgAAAAHzAgEAAAABAscCQAAAAAHaAgEAAAABC8ECAQAAAAHHAkAAAAAB2gIBAAAAAd4CAgAAAAHgAgAAAOACAuECAQAAAAHiAgEAAAAB4wIBAAAAAeQCAQAAAAHlAoAAAAAB5gIBAAAAAQYrgAAAAAHBAgEAAAABxwJAAAAAAdoCAQAAAAHcAgIAAAAB3QJAAAAAAQMAAAAXACAyAADeCAAgMwAA6QgAIBsAAAAXACASAACIBgAgEwAAiQYAIBUAAP4GACAWAACLBgAgFwAAjAYAIBkAAI0GACAaAACOBgAgGwAAjwYAIBwAAJAGACAdAACRBgAgKwAA6QgAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEZEgAAiAYAIBMAAIkGACAVAAD-BgAgFgAAiwYAIBcAAIwGACAZAACNBgAgGgAAjgYAIBsAAI8GACAcAACQBgAgHQAAkQYAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEDAAAAFQAgMgAA2wgAIDMAAOwIACARAAAAFQAgBwAA1AUAIAkAANYFACALAADXBQAgDwAA2AUAIBEAANkFACArAADsCAAgxwJAAPEEACHbAgEA8AQAId4CAgD6BAAh9QIBAPAEACH2AgEA-wQAIfcCAQD7BAAh-AIBAPAEACH5AgEA-wQAIfoCAQD7BAAh-wJAAPIEACEPBwAA1AUAIAkAANYFACALAADXBQAgDwAA2AUAIBEAANkFACDHAkAA8QQAIdsCAQDwBAAh3gICAPoEACH1AgEA8AQAIfYCAQD7BAAh9wIBAPsEACH4AgEA8AQAIfkCAQD7BAAh-gIBAPsEACH7AkAA8gQAIQ3BAgEAAAABxwJAAAAAAd0CQAAAAAHsAgIAAAAB_AICAAAAAYADAAAAgAMCgQMgAAAAAYIDIAAAAAGDAwIAAAABhAMCAAAAAYUDAgAAAAGGAwIAAAABhwNAAAAAAQLBAgEAAAAB8wIBAAAAAQLHAkAAAAAB9AIBAAAAAQPBAgEAAAABxwJAAAAAAfMCAQAAAAEDAAAAFwAgMgAA1AgAIDMAAPMIACAbAAAAFwAgEgAAiAYAIBMAAIkGACAUAACKBgAgFQAA_gYAIBcAAIwGACAZAACNBgAgGgAAjgYAIBsAAI8GACAcAACQBgAgHQAAkQYAICsAAPMIACDBAgEA8AQAIccCQADxBAAh3QJAAPEEACHsAgIAhQUAIfwCAgCFBQAh_QIBAPsEACH-AgIAhQUAIYADAACFBoADIoEDIACGBgAhggMgAIYGACGDAwIA-gQAIYQDAgD6BAAhhQMCAPoEACGGAwIA-gQAIYcDQADyBAAhGRIAAIgGACATAACJBgAgFAAAigYAIBUAAP4GACAXAACMBgAgGQAAjQYAIBoAAI4GACAbAACPBgAgHAAAkAYAIB0AAJEGACDBAgEA8AQAIccCQADxBAAh3QJAAPEEACHsAgIAhQUAIfwCAgCFBQAh_QIBAPsEACH-AgIAhQUAIYADAACFBoADIoEDIACGBgAhggMgAIYGACGDAwIA-gQAIYQDAgD6BAAhhQMCAPoEACGGAwIA-gQAIYcDQADyBAAhDwcAAIMHACAIAADjBgAgCQAA5AYAIA8AAOYGACARAADnBgAgxwJAAAAAAdsCAQAAAAHeAgIAAAAB9QIBAAAAAfYCAQAAAAH3AgEAAAAB-AIBAAAAAfkCAQAAAAH6AgEAAAAB-wJAAAAAAQIAAAAyACAyAAD0CAAgAwAAABUAIDIAAPQIACAzAAD4CAAgEQAAABUAIAcAANQFACAIAADVBQAgCQAA1gUAIA8AANgFACARAADZBQAgKwAA-AgAIMcCQADxBAAh2wIBAPAEACHeAgIA-gQAIfUCAQDwBAAh9gIBAPsEACH3AgEA-wQAIfgCAQDwBAAh-QIBAPsEACH6AgEA-wQAIfsCQADyBAAhDwcAANQFACAIAADVBQAgCQAA1gUAIA8AANgFACARAADZBQAgxwJAAPEEACHbAgEA8AQAId4CAgD6BAAh9QIBAPAEACH2AgEA-wQAIfcCAQD7BAAh-AIBAPAEACH5AgEA-wQAIfoCAQD7BAAh-wJAAPIEACEFwQIBAAAAAccCQAAAAAHsAgIAAAAB7QIBAAAAAe4CAQAAAAECAAAAywIAIDIAAPkIACADAAAAzgIAIDIAAPkIACAzAAD9CAAgBwAAAM4CACArAAD9CAAgwQIBAPAEACHHAkAA8QQAIewCAgCFBQAh7QIBAPAEACHuAgEA-wQAIQXBAgEA8AQAIccCQADxBAAh7AICAIUFACHtAgEA8AQAIe4CAQD7BAAhDwcAAIMHACAIAADjBgAgCQAA5AYAIAsAAOUGACAPAADmBgAgxwJAAAAAAdsCAQAAAAHeAgIAAAAB9QIBAAAAAfYCAQAAAAH3AgEAAAAB-AIBAAAAAfkCAQAAAAH6AgEAAAAB-wJAAAAAAQIAAAAyACAyAAD-CAAgGRIAAPgGACATAADqBgAgFAAA6wYAIBUAAOwGACAWAADtBgAgFwAA7gYAIBkAAO8GACAbAADxBgAgHAAA8gYAIB0AAPMGACDBAgEAAAABxwJAAAAAAd0CQAAAAAHsAgIAAAAB_AICAAAAAf0CAQAAAAH-AgIAAAABgAMAAACAAwKBAyAAAAABggMgAAAAAYMDAgAAAAGEAwIAAAABhQMCAAAAAYYDAgAAAAGHA0AAAAABAgAAABoAIDIAAIAJACADAAAAFQAgMgAA_ggAIDMAAIQJACARAAAAFQAgBwAA1AUAIAgAANUFACAJAADWBQAgCwAA1wUAIA8AANgFACArAACECQAgxwJAAPEEACHbAgEA8AQAId4CAgD6BAAh9QIBAPAEACH2AgEA-wQAIfcCAQD7BAAh-AIBAPAEACH5AgEA-wQAIfoCAQD7BAAh-wJAAPIEACEPBwAA1AUAIAgAANUFACAJAADWBQAgCwAA1wUAIA8AANgFACDHAkAA8QQAIdsCAQDwBAAh3gICAPoEACH1AgEA8AQAIfYCAQD7BAAh9wIBAPsEACH4AgEA8AQAIfkCAQD7BAAh-gIBAPsEACH7AkAA8gQAIQMAAAAXACAyAACACQAgMwAAhwkAIBsAAAAXACASAACIBgAgEwAAiQYAIBQAAIoGACAVAAD-BgAgFgAAiwYAIBcAAIwGACAZAACNBgAgGwAAjwYAIBwAAJAGACAdAACRBgAgKwAAhwkAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEZEgAAiAYAIBMAAIkGACAUAACKBgAgFQAA_gYAIBYAAIsGACAXAACMBgAgGQAAjQYAIBsAAI8GACAcAACQBgAgHQAAkQYAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEPBwAAgwcAIAgAAOMGACAJAADkBgAgCwAA5QYAIBEAAOcGACDHAkAAAAAB2wIBAAAAAd4CAgAAAAH1AgEAAAAB9gIBAAAAAfcCAQAAAAH4AgEAAAAB-QIBAAAAAfoCAQAAAAH7AkAAAAABAgAAADIAIDIAAIgJACADAAAAFQAgMgAAiAkAIDMAAIwJACARAAAAFQAgBwAA1AUAIAgAANUFACAJAADWBQAgCwAA1wUAIBEAANkFACArAACMCQAgxwJAAPEEACHbAgEA8AQAId4CAgD6BAAh9QIBAPAEACH2AgEA-wQAIfcCAQD7BAAh-AIBAPAEACH5AgEA-wQAIfoCAQD7BAAh-wJAAPIEACEPBwAA1AUAIAgAANUFACAJAADWBQAgCwAA1wUAIBEAANkFACDHAkAA8QQAIdsCAQDwBAAh3gICAPoEACH1AgEA8AQAIfYCAQD7BAAh9wIBAPsEACH4AgEA8AQAIfkCAQD7BAAh-gIBAPsEACH7AkAA8gQAIQPHAkAAAAAB2wIBAAAAAd4CAgAAAAEfBAAAmggAIAUAAJsIACAGAACcCAAgHwAAnggAICEAAJ8IACAiAACgCAAgIwAAoQgAICQAAKIIACAlAACjCAAgwQIBAAAAAccCQAAAAAHdAkAAAAAB6wIBAAAAAewCAgAAAAHtAgEAAAABhwNAAAAAAZ4DAQAAAAGfAyAAAAABoAMBAAAAAaIDAAAAogMCpAMAAACkAwKlAyAAAAABpgMBAAAAAacDAQAAAAGoA4AAAAABqQNAAAAAAaoDAQAAAAGrAyAAAAABrAMBAAAAAa0DQAAAAAGuA0AAAAABAgAAAAEAIDIAAI4JACAZEgAA-AYAIBMAAOoGACAUAADrBgAgFQAA7AYAIBYAAO0GACAZAADvBgAgGgAA8AYAIBsAAPEGACAcAADyBgAgHQAA8wYAIMECAQAAAAHHAkAAAAAB3QJAAAAAAewCAgAAAAH8AgIAAAAB_QIBAAAAAf4CAgAAAAGAAwAAAIADAoEDIAAAAAGCAyAAAAABgwMCAAAAAYQDAgAAAAGFAwIAAAABhgMCAAAAAYcDQAAAAAECAAAAGgAgMgAAkAkAIAMAAAAPACAyAACOCQAgMwAAlAkAICEAAAAPACAEAACnBwAgBQAAqAcAIAYAAKkHACAfAACrBwAgIQAArAcAICIAAK0HACAjAACuBwAgJAAArwcAICUAALAHACArAACUCQAgwQIBAPAEACHHAkAA8QQAId0CQADxBAAh6wIBAPsEACHsAgIAhQUAIe0CAQD7BAAhhwNAAPIEACGeAwEA-wQAIZ8DIACGBgAhoAMBAPsEACGiAwAApAeiAyKkAwAApQekAyKlAyAAhgYAIaYDAQD7BAAhpwMBAPsEACGoA4AAAAABqQNAAPIEACGqAwEA-wQAIasDIACmBwAhrAMBAPsEACGtA0AA8gQAIa4DQADyBAAhHwQAAKcHACAFAACoBwAgBgAAqQcAIB8AAKsHACAhAACsBwAgIgAArQcAICMAAK4HACAkAACvBwAgJQAAsAcAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIesCAQD7BAAh7AICAIUFACHtAgEA-wQAIYcDQADyBAAhngMBAPsEACGfAyAAhgYAIaADAQD7BAAhogMAAKQHogMipAMAAKUHpAMipQMgAIYGACGmAwEA-wQAIacDAQD7BAAhqAOAAAAAAakDQADyBAAhqgMBAPsEACGrAyAApgcAIawDAQD7BAAhrQNAAPIEACGuA0AA8gQAIQMAAAAXACAyAACQCQAgMwAAlwkAIBsAAAAXACASAACIBgAgEwAAiQYAIBQAAIoGACAVAAD-BgAgFgAAiwYAIBkAAI0GACAaAACOBgAgGwAAjwYAIBwAAJAGACAdAACRBgAgKwAAlwkAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEZEgAAiAYAIBMAAIkGACAUAACKBgAgFQAA_gYAIBYAAIsGACAZAACNBgAgGgAAjgYAIBsAAI8GACAcAACQBgAgHQAAkQYAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEfBAAAmggAIAUAAJsIACAGAACcCAAgHgAAnQgAICEAAJ8IACAiAACgCAAgIwAAoQgAICQAAKIIACAlAACjCAAgwQIBAAAAAccCQAAAAAHdAkAAAAAB6wIBAAAAAewCAgAAAAHtAgEAAAABhwNAAAAAAZ4DAQAAAAGfAyAAAAABoAMBAAAAAaIDAAAAogMCpAMAAACkAwKlAyAAAAABpgMBAAAAAacDAQAAAAGoA4AAAAABqQNAAAAAAaoDAQAAAAGrAyAAAAABrAMBAAAAAa0DQAAAAAGuA0AAAAABAgAAAAEAIDIAAJgJACAZEgAA-AYAIBMAAOoGACAUAADrBgAgFQAA7AYAIBYAAO0GACAXAADuBgAgGgAA8AYAIBsAAPEGACAcAADyBgAgHQAA8wYAIMECAQAAAAHHAkAAAAAB3QJAAAAAAewCAgAAAAH8AgIAAAAB_QIBAAAAAf4CAgAAAAGAAwAAAIADAoEDIAAAAAGCAyAAAAABgwMCAAAAAYQDAgAAAAGFAwIAAAABhgMCAAAAAYcDQAAAAAECAAAAGgAgMgAAmgkAIAMAAAAPACAyAACYCQAgMwAAngkAICEAAAAPACAEAACnBwAgBQAAqAcAIAYAAKkHACAeAACqBwAgIQAArAcAICIAAK0HACAjAACuBwAgJAAArwcAICUAALAHACArAACeCQAgwQIBAPAEACHHAkAA8QQAId0CQADxBAAh6wIBAPsEACHsAgIAhQUAIe0CAQD7BAAhhwNAAPIEACGeAwEA-wQAIZ8DIACGBgAhoAMBAPsEACGiAwAApAeiAyKkAwAApQekAyKlAyAAhgYAIaYDAQD7BAAhpwMBAPsEACGoA4AAAAABqQNAAPIEACGqAwEA-wQAIasDIACmBwAhrAMBAPsEACGtA0AA8gQAIa4DQADyBAAhHwQAAKcHACAFAACoBwAgBgAAqQcAIB4AAKoHACAhAACsBwAgIgAArQcAICMAAK4HACAkAACvBwAgJQAAsAcAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIesCAQD7BAAh7AICAIUFACHtAgEA-wQAIYcDQADyBAAhngMBAPsEACGfAyAAhgYAIaADAQD7BAAhogMAAKQHogMipAMAAKUHpAMipQMgAIYGACGmAwEA-wQAIacDAQD7BAAhqAOAAAAAAakDQADyBAAhqgMBAPsEACGrAyAApgcAIawDAQD7BAAhrQNAAPIEACGuA0AA8gQAIQMAAAAXACAyAACaCQAgMwAAoQkAIBsAAAAXACASAACIBgAgEwAAiQYAIBQAAIoGACAVAAD-BgAgFgAAiwYAIBcAAIwGACAaAACOBgAgGwAAjwYAIBwAAJAGACAdAACRBgAgKwAAoQkAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEZEgAAiAYAIBMAAIkGACAUAACKBgAgFQAA_gYAIBYAAIsGACAXAACMBgAgGgAAjgYAIBsAAI8GACAcAACQBgAgHQAAkQYAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEfBAAAmggAIAUAAJsIACAGAACcCAAgHgAAnQgAIB8AAJ4IACAhAACfCAAgIwAAoQgAICQAAKIIACAlAACjCAAgwQIBAAAAAccCQAAAAAHdAkAAAAAB6wIBAAAAAewCAgAAAAHtAgEAAAABhwNAAAAAAZ4DAQAAAAGfAyAAAAABoAMBAAAAAaIDAAAAogMCpAMAAACkAwKlAyAAAAABpgMBAAAAAacDAQAAAAGoA4AAAAABqQNAAAAAAaoDAQAAAAGrAyAAAAABrAMBAAAAAa0DQAAAAAGuA0AAAAABAgAAAAEAIDIAAKIJACAZEgAA-AYAIBMAAOoGACAUAADrBgAgFQAA7AYAIBYAAO0GACAXAADuBgAgGQAA7wYAIBoAAPAGACAcAADyBgAgHQAA8wYAIMECAQAAAAHHAkAAAAAB3QJAAAAAAewCAgAAAAH8AgIAAAAB_QIBAAAAAf4CAgAAAAGAAwAAAIADAoEDIAAAAAGCAyAAAAABgwMCAAAAAYQDAgAAAAGFAwIAAAABhgMCAAAAAYcDQAAAAAECAAAAGgAgMgAApAkAIAMAAAAPACAyAACiCQAgMwAAqAkAICEAAAAPACAEAACnBwAgBQAAqAcAIAYAAKkHACAeAACqBwAgHwAAqwcAICEAAKwHACAjAACuBwAgJAAArwcAICUAALAHACArAACoCQAgwQIBAPAEACHHAkAA8QQAId0CQADxBAAh6wIBAPsEACHsAgIAhQUAIe0CAQD7BAAhhwNAAPIEACGeAwEA-wQAIZ8DIACGBgAhoAMBAPsEACGiAwAApAeiAyKkAwAApQekAyKlAyAAhgYAIaYDAQD7BAAhpwMBAPsEACGoA4AAAAABqQNAAPIEACGqAwEA-wQAIasDIACmBwAhrAMBAPsEACGtA0AA8gQAIa4DQADyBAAhHwQAAKcHACAFAACoBwAgBgAAqQcAIB4AAKoHACAfAACrBwAgIQAArAcAICMAAK4HACAkAACvBwAgJQAAsAcAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIesCAQD7BAAh7AICAIUFACHtAgEA-wQAIYcDQADyBAAhngMBAPsEACGfAyAAhgYAIaADAQD7BAAhogMAAKQHogMipAMAAKUHpAMipQMgAIYGACGmAwEA-wQAIacDAQD7BAAhqAOAAAAAAakDQADyBAAhqgMBAPsEACGrAyAApgcAIawDAQD7BAAhrQNAAPIEACGuA0AA8gQAIQMAAAAXACAyAACkCQAgMwAAqwkAIBsAAAAXACASAACIBgAgEwAAiQYAIBQAAIoGACAVAAD-BgAgFgAAiwYAIBcAAIwGACAZAACNBgAgGgAAjgYAIBwAAJAGACAdAACRBgAgKwAAqwkAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEZEgAAiAYAIBMAAIkGACAUAACKBgAgFQAA_gYAIBYAAIsGACAXAACMBgAgGQAAjQYAIBoAAI4GACAcAACQBgAgHQAAkQYAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEfBAAAmggAIAUAAJsIACAGAACcCAAgHgAAnQgAIB8AAJ4IACAhAACfCAAgIgAAoAgAICQAAKIIACAlAACjCAAgwQIBAAAAAccCQAAAAAHdAkAAAAAB6wIBAAAAAewCAgAAAAHtAgEAAAABhwNAAAAAAZ4DAQAAAAGfAyAAAAABoAMBAAAAAaIDAAAAogMCpAMAAACkAwKlAyAAAAABpgMBAAAAAacDAQAAAAGoA4AAAAABqQNAAAAAAaoDAQAAAAGrAyAAAAABrAMBAAAAAa0DQAAAAAGuA0AAAAABAgAAAAEAIDIAAKwJACAZEgAA-AYAIBMAAOoGACAUAADrBgAgFQAA7AYAIBYAAO0GACAXAADuBgAgGQAA7wYAIBoAAPAGACAbAADxBgAgHQAA8wYAIMECAQAAAAHHAkAAAAAB3QJAAAAAAewCAgAAAAH8AgIAAAAB_QIBAAAAAf4CAgAAAAGAAwAAAIADAoEDIAAAAAGCAyAAAAABgwMCAAAAAYQDAgAAAAGFAwIAAAABhgMCAAAAAYcDQAAAAAECAAAAGgAgMgAArgkAIAMAAAAPACAyAACsCQAgMwAAsgkAICEAAAAPACAEAACnBwAgBQAAqAcAIAYAAKkHACAeAACqBwAgHwAAqwcAICEAAKwHACAiAACtBwAgJAAArwcAICUAALAHACArAACyCQAgwQIBAPAEACHHAkAA8QQAId0CQADxBAAh6wIBAPsEACHsAgIAhQUAIe0CAQD7BAAhhwNAAPIEACGeAwEA-wQAIZ8DIACGBgAhoAMBAPsEACGiAwAApAeiAyKkAwAApQekAyKlAyAAhgYAIaYDAQD7BAAhpwMBAPsEACGoA4AAAAABqQNAAPIEACGqAwEA-wQAIasDIACmBwAhrAMBAPsEACGtA0AA8gQAIa4DQADyBAAhHwQAAKcHACAFAACoBwAgBgAAqQcAIB4AAKoHACAfAACrBwAgIQAArAcAICIAAK0HACAkAACvBwAgJQAAsAcAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIesCAQD7BAAh7AICAIUFACHtAgEA-wQAIYcDQADyBAAhngMBAPsEACGfAyAAhgYAIaADAQD7BAAhogMAAKQHogMipAMAAKUHpAMipQMgAIYGACGmAwEA-wQAIacDAQD7BAAhqAOAAAAAAakDQADyBAAhqgMBAPsEACGrAyAApgcAIawDAQD7BAAhrQNAAPIEACGuA0AA8gQAIQMAAAAXACAyAACuCQAgMwAAtQkAIBsAAAAXACASAACIBgAgEwAAiQYAIBQAAIoGACAVAAD-BgAgFgAAiwYAIBcAAIwGACAZAACNBgAgGgAAjgYAIBsAAI8GACAdAACRBgAgKwAAtQkAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEZEgAAiAYAIBMAAIkGACAUAACKBgAgFQAA_gYAIBYAAIsGACAXAACMBgAgGQAAjQYAIBoAAI4GACAbAACPBgAgHQAAkQYAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEZEgAA-AYAIBMAAOoGACAUAADrBgAgFQAA7AYAIBYAAO0GACAXAADuBgAgGQAA7wYAIBoAAPAGACAbAADxBgAgHAAA8gYAIMECAQAAAAHHAkAAAAAB3QJAAAAAAewCAgAAAAH8AgIAAAAB_QIBAAAAAf4CAgAAAAGAAwAAAIADAoEDIAAAAAGCAyAAAAABgwMCAAAAAYQDAgAAAAGFAwIAAAABhgMCAAAAAYcDQAAAAAECAAAAGgAgMgAAtgkAIB8EAACaCAAgBQAAmwgAIAYAAJwIACAeAACdCAAgHwAAnggAICEAAJ8IACAiAACgCAAgIwAAoQgAICUAAKMIACDBAgEAAAABxwJAAAAAAd0CQAAAAAHrAgEAAAAB7AICAAAAAe0CAQAAAAGHA0AAAAABngMBAAAAAZ8DIAAAAAGgAwEAAAABogMAAACiAwKkAwAAAKQDAqUDIAAAAAGmAwEAAAABpwMBAAAAAagDgAAAAAGpA0AAAAABqgMBAAAAAasDIAAAAAGsAwEAAAABrQNAAAAAAa4DQAAAAAECAAAAAQAgMgAAuAkAIAMAAAAXACAyAAC2CQAgMwAAvAkAIBsAAAAXACASAACIBgAgEwAAiQYAIBQAAIoGACAVAAD-BgAgFgAAiwYAIBcAAIwGACAZAACNBgAgGgAAjgYAIBsAAI8GACAcAACQBgAgKwAAvAkAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEZEgAAiAYAIBMAAIkGACAUAACKBgAgFQAA_gYAIBYAAIsGACAXAACMBgAgGQAAjQYAIBoAAI4GACAbAACPBgAgHAAAkAYAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-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-AkB_AkGAAQJCgQECQ4MBAkSFARZFhgEgRogBAkeKARZIiwEhSYwBAkqNAQJLjgEWTJEBIk2SASZOkwEDT5QBA1CVAQNRlgEDUpcBA1OZAQNUmwEWVZwBJ1aeAQNXoAEWWKEBKFmiAQNaowEDW6QBFlynASldqAEtXqkBBF-qAQRgqwEEYawBBGKtAQRjrwEEZLEBFmWyAS5mtQEEZ7cBFmi4AS9pugEEarsBBGu8ARZsvwEwbcABNG7BARRvwgEUcMMBFHHEARRyxQEUc8cBFHTJARZ1ygE1dswBFHfOARZ4zwE2edABFHrRARR70gEWfNUBN33WAT1-1wEGf9gBBoAB2QEGgQHaAQaCAdsBBoMB3QEGhAHfARaFAeABPoYB5QEGhwHnARaIAegBP4kB7AEGigHtAQaLAe4BFowB8QFAjQHyAUaOAfMBB48B9AEHkAH1AQeRAfYBB5IB9wEHkwH5AQeUAfsBFpUB_AFHlgH-AQeXAYACFpgBgQJImQGCAgeaAYMCB5sBhAIWnAGHAkmdAYgCT54BiQIInwGKAgigAYsCCKEBjAIIogGNAgijAY8CCKQBkQIWpQGSAlCmAZQCCKcBlgIWqAGXAlGpAZgCCKoBmQIIqwGaAhasAZ0CUq0BngJYrgGfAgmvAaACCbABoQIJsQGiAgmyAaMCCbMBpQIJtAGnAha1AagCWbYBqgIJtwGsAha4Aa0CWrkBrgIJugGvAgm7AbACFrwBswJbvQG0AmG-AbUCDL8BtgIMwAG3AgzBAbgCDMIBuQIMwwG7AgzEAb0CFsUBvgJixgHAAgzHAcICFsgBwwJjyQHEAgzKAcUCDMsBxgIWzAHJAmTNAcoCas4BzAIKzwHNAgrQAdACCtEB0QIK0gHSAgrTAdQCCtQB1gIW1QHXAmvWAdkCCtcB2wIW2AHcAmzZAd0CCtoB3gIK2wHfAhbcAeICbd0B4wJz3gHkAgXfAeUCBeAB5gIF4QHnAgXiAegCBeMB6gIF5AHsAhblAe0CdOYB7wIF5wHxAhboAfICdekB8wIF6gH0AgXrAfUCFuwB-AJ27QH5AnruAfoCDu8B-wIO8AH8Ag7xAf0CDvIB_gIO8wGAAw70AYIDFvUBgwN79gGGAw73AYgDFvgBiQN8-QGLAw76AYwDDvsBjQMW_AGQA339AZEDgQH-AZIDD_8BkwMPgAKUAw-BApUDD4IClgMPgwKYAw-EApoDFoUCmwOCAYYCnQMPhwKfAxaIAqADgwGJAqEDD4oCogMPiwKjAxaMAqYDhAGNAqcDiAGOAqgDEI8CqQMQkAKqAxCRAqsDEJICrAMQkwKuAxCUArADFpUCsQOJAZYCtAMQlwK2AxaYArcDigGZArkDEJoCugMQmwK7AxacAr4DiwGdAr8DkQGeAsADEZ8CwQMRoALCAxGhAsMDEaICxAMRowLGAxGkAsgDFqUCyQOSAaYCzAMRpwLOAxaoAs8DkwGpAtEDEaoC0gMRqwLTAxasAtYDlAGtAtcDmgGuAtgDE68C2QMTsALaAxOxAtsDE7IC3AMTswLeAxO0AuADFrUC4QObAbYC4wMTtwLlAxa4AuYDnAG5AucDE7oC6AMTuwLpAxa8AuwDnQG9Au0DoQE" + strings: JSON.parse("[\"where\",\"orderBy\",\"cursor\",\"user\",\"accounts\",\"sessions\",\"verifications\",\"model\",\"latestOfModel\",\"parentOfModels\",\"modelVersion\",\"modelVersions\",\"_count\",\"tag\",\"tags\",\"taggedVersion\",\"taggedAdditionalFiles\",\"latestVersion\",\"parentModel\",\"childModels\",\"parentVersion\",\"versions\",\"authors\",\"granteeUser\",\"permissions\",\"additionalFiles\",\"likes\",\"interactions\",\"drafts\",\"authoredModels\",\"grantedPermissions\",\"actor\",\"events\",\"modelLikes\",\"modelInteractions\",\"modelDrafts\",\"passkeys\",\"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\",\"Account.findUnique\",\"Account.findUniqueOrThrow\",\"Account.findFirst\",\"Account.findFirstOrThrow\",\"Account.findMany\",\"Account.createOne\",\"Account.createMany\",\"Account.createManyAndReturn\",\"Account.updateOne\",\"Account.updateMany\",\"Account.updateManyAndReturn\",\"Account.upsertOne\",\"Account.deleteOne\",\"Account.deleteMany\",\"Account.groupBy\",\"Account.aggregate\",\"Session.findUnique\",\"Session.findUniqueOrThrow\",\"Session.findFirst\",\"Session.findFirstOrThrow\",\"Session.findMany\",\"Session.createOne\",\"Session.createMany\",\"Session.createManyAndReturn\",\"Session.updateOne\",\"Session.updateMany\",\"Session.updateManyAndReturn\",\"Session.upsertOne\",\"Session.deleteOne\",\"Session.deleteMany\",\"Session.groupBy\",\"Session.aggregate\",\"Verification.findUnique\",\"Verification.findUniqueOrThrow\",\"Verification.findFirst\",\"Verification.findFirstOrThrow\",\"Verification.findMany\",\"Verification.createOne\",\"Verification.createMany\",\"Verification.createManyAndReturn\",\"Verification.updateOne\",\"Verification.updateMany\",\"Verification.updateManyAndReturn\",\"Verification.upsertOne\",\"Verification.deleteOne\",\"Verification.deleteMany\",\"Verification.groupBy\",\"Verification.aggregate\",\"Passkey.findUnique\",\"Passkey.findUniqueOrThrow\",\"Passkey.findFirst\",\"Passkey.findFirstOrThrow\",\"Passkey.findMany\",\"Passkey.createOne\",\"Passkey.createMany\",\"Passkey.createManyAndReturn\",\"Passkey.updateOne\",\"Passkey.updateMany\",\"Passkey.updateManyAndReturn\",\"Passkey.upsertOne\",\"Passkey.deleteOne\",\"Passkey.deleteMany\",\"Passkey.groupBy\",\"Passkey.aggregate\",\"Model.findUnique\",\"Model.findUniqueOrThrow\",\"Model.findFirst\",\"Model.findFirstOrThrow\",\"Model.findMany\",\"Model.createOne\",\"Model.createMany\",\"Model.createManyAndReturn\",\"Model.updateOne\",\"Model.updateMany\",\"Model.updateManyAndReturn\",\"Model.upsertOne\",\"Model.deleteOne\",\"Model.deleteMany\",\"Model.groupBy\",\"Model.aggregate\",\"ModelVersion.findUnique\",\"ModelVersion.findUniqueOrThrow\",\"ModelVersion.findFirst\",\"ModelVersion.findFirstOrThrow\",\"ModelVersion.findMany\",\"ModelVersion.createOne\",\"ModelVersion.createMany\",\"ModelVersion.createManyAndReturn\",\"ModelVersion.updateOne\",\"ModelVersion.updateMany\",\"ModelVersion.updateManyAndReturn\",\"ModelVersion.upsertOne\",\"ModelVersion.deleteOne\",\"ModelVersion.deleteMany\",\"ModelVersion.groupBy\",\"ModelVersion.aggregate\",\"ModelVersionTag.findUnique\",\"ModelVersionTag.findUniqueOrThrow\",\"ModelVersionTag.findFirst\",\"ModelVersionTag.findFirstOrThrow\",\"ModelVersionTag.findMany\",\"ModelVersionTag.createOne\",\"ModelVersionTag.createMany\",\"ModelVersionTag.createManyAndReturn\",\"ModelVersionTag.updateOne\",\"ModelVersionTag.updateMany\",\"ModelVersionTag.updateManyAndReturn\",\"ModelVersionTag.upsertOne\",\"ModelVersionTag.deleteOne\",\"ModelVersionTag.deleteMany\",\"ModelVersionTag.groupBy\",\"ModelVersionTag.aggregate\",\"ModelAdditionalFile.findUnique\",\"ModelAdditionalFile.findUniqueOrThrow\",\"ModelAdditionalFile.findFirst\",\"ModelAdditionalFile.findFirstOrThrow\",\"ModelAdditionalFile.findMany\",\"ModelAdditionalFile.createOne\",\"ModelAdditionalFile.createMany\",\"ModelAdditionalFile.createManyAndReturn\",\"ModelAdditionalFile.updateOne\",\"ModelAdditionalFile.updateMany\",\"ModelAdditionalFile.updateManyAndReturn\",\"ModelAdditionalFile.upsertOne\",\"ModelAdditionalFile.deleteOne\",\"ModelAdditionalFile.deleteMany\",\"ModelAdditionalFile.groupBy\",\"ModelAdditionalFile.aggregate\",\"Tag.findUnique\",\"Tag.findUniqueOrThrow\",\"Tag.findFirst\",\"Tag.findFirstOrThrow\",\"Tag.findMany\",\"Tag.createOne\",\"Tag.createMany\",\"Tag.createManyAndReturn\",\"Tag.updateOne\",\"Tag.updateMany\",\"Tag.updateManyAndReturn\",\"Tag.upsertOne\",\"Tag.deleteOne\",\"Tag.deleteMany\",\"Tag.groupBy\",\"Tag.aggregate\",\"ModelAuthor.findUnique\",\"ModelAuthor.findUniqueOrThrow\",\"ModelAuthor.findFirst\",\"ModelAuthor.findFirstOrThrow\",\"ModelAuthor.findMany\",\"ModelAuthor.createOne\",\"ModelAuthor.createMany\",\"ModelAuthor.createManyAndReturn\",\"ModelAuthor.updateOne\",\"ModelAuthor.updateMany\",\"ModelAuthor.updateManyAndReturn\",\"ModelAuthor.upsertOne\",\"ModelAuthor.deleteOne\",\"ModelAuthor.deleteMany\",\"ModelAuthor.groupBy\",\"ModelAuthor.aggregate\",\"ModelPermission.findUnique\",\"ModelPermission.findUniqueOrThrow\",\"ModelPermission.findFirst\",\"ModelPermission.findFirstOrThrow\",\"ModelPermission.findMany\",\"ModelPermission.createOne\",\"ModelPermission.createMany\",\"ModelPermission.createManyAndReturn\",\"ModelPermission.updateOne\",\"ModelPermission.updateMany\",\"ModelPermission.updateManyAndReturn\",\"ModelPermission.upsertOne\",\"ModelPermission.deleteOne\",\"ModelPermission.deleteMany\",\"ModelPermission.groupBy\",\"ModelPermission.aggregate\",\"ModelLike.findUnique\",\"ModelLike.findUniqueOrThrow\",\"ModelLike.findFirst\",\"ModelLike.findFirstOrThrow\",\"ModelLike.findMany\",\"ModelLike.createOne\",\"ModelLike.createMany\",\"ModelLike.createManyAndReturn\",\"ModelLike.updateOne\",\"ModelLike.updateMany\",\"ModelLike.updateManyAndReturn\",\"ModelLike.upsertOne\",\"ModelLike.deleteOne\",\"ModelLike.deleteMany\",\"ModelLike.groupBy\",\"ModelLike.aggregate\",\"ModelInteraction.findUnique\",\"ModelInteraction.findUniqueOrThrow\",\"ModelInteraction.findFirst\",\"ModelInteraction.findFirstOrThrow\",\"ModelInteraction.findMany\",\"ModelInteraction.createOne\",\"ModelInteraction.createMany\",\"ModelInteraction.createManyAndReturn\",\"ModelInteraction.updateOne\",\"ModelInteraction.updateMany\",\"ModelInteraction.updateManyAndReturn\",\"ModelInteraction.upsertOne\",\"ModelInteraction.deleteOne\",\"ModelInteraction.deleteMany\",\"ModelInteraction.groupBy\",\"ModelInteraction.aggregate\",\"ModelDraft.findUnique\",\"ModelDraft.findUniqueOrThrow\",\"ModelDraft.findFirst\",\"ModelDraft.findFirstOrThrow\",\"ModelDraft.findMany\",\"ModelDraft.createOne\",\"ModelDraft.createMany\",\"ModelDraft.createManyAndReturn\",\"ModelDraft.updateOne\",\"ModelDraft.updateMany\",\"ModelDraft.updateManyAndReturn\",\"ModelDraft.upsertOne\",\"ModelDraft.deleteOne\",\"ModelDraft.deleteMany\",\"ModelDraft.groupBy\",\"ModelDraft.aggregate\",\"Event.findUnique\",\"Event.findUniqueOrThrow\",\"Event.findFirst\",\"Event.findFirstOrThrow\",\"Event.findMany\",\"Event.createOne\",\"Event.createMany\",\"Event.createManyAndReturn\",\"Event.updateOne\",\"Event.updateMany\",\"Event.updateManyAndReturn\",\"Event.upsertOne\",\"Event.deleteOne\",\"Event.deleteMany\",\"Event.groupBy\",\"Event.aggregate\",\"AND\",\"OR\",\"NOT\",\"id\",\"type\",\"actorId\",\"resourceType\",\"resourceId\",\"payload\",\"createdAt\",\"processedAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"contains\",\"startsWith\",\"endsWith\",\"userId\",\"modelId\",\"schemaVersion\",\"updatedAt\",\"versionNumber\",\"ModelInteractionKind\",\"kind\",\"sessionId\",\"ipHash\",\"userAgent\",\"referer\",\"geo\",\"cookie\",\"granteeUserId\",\"PermissionLevel\",\"permissionLevel\",\"AuthorRole\",\"role\",\"legacyId\",\"name\",\"displayName\",\"every\",\"some\",\"none\",\"taggedVersionNumber\",\"fileKey\",\"ModelFileKind\",\"tagId\",\"title\",\"description\",\"changeSummary\",\"previewImageFileKey\",\"netlogoFileKey\",\"netlogoVersion\",\"infoTab\",\"finalizedAt\",\"latestVersionNumber\",\"parentModelId\",\"parentVersionNumber\",\"ModelVisibility\",\"visibility\",\"isEndorsed\",\"isLibraryModel\",\"viewCount\",\"runCount\",\"downloadCount\",\"shareCount\",\"deletedAt\",\"publicKey\",\"credentialID\",\"counter\",\"deviceType\",\"backedUp\",\"transports\",\"aaguid\",\"identifier\",\"value\",\"expiresAt\",\"token\",\"ipAddress\",\"impersonatedBy\",\"accountId\",\"providerId\",\"accessToken\",\"refreshToken\",\"accessTokenExpiresAt\",\"refreshTokenExpiresAt\",\"scope\",\"idToken\",\"password\",\"email\",\"emailVerified\",\"image\",\"SystemRole\",\"systemRole\",\"UserKind\",\"userKind\",\"isProfilePublic\",\"bio\",\"country\",\"socialLinks\",\"dob\",\"affiliation\",\"banned\",\"banReason\",\"banExpires\",\"onboardedAt\",\"modelId_userId\",\"modelId_granteeUserId\",\"modelId_versionNumber\",\"modelId_versionNumber_tagId\",\"id_latestVersionNumber\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), + graph: "jwmXAYACIwQAAMoEACAFAADLBAAgBgAAzAQAIB0AAL4EACAeAAC_BAAgIAAAzQQAICEAAMAEACAiAADBBAAgIwAAwgQAICQAAM4EACCtAgAAxgQAMK4CAAAPABCvAgAAxgQAMLACAQAAAAG2AkAA_wMAIcwCQAD_AwAh2gIBAP4DACHbAgIAAAAB3AIBAP4DACH4AkAAnwQAIY8DAQAAAAGQAyAAngQAIZEDAQD-AwAhkwMAAMcEkwMilQMAAMgElQMilgMgAJ4EACGXAwEA_gMAIZgDAQD-AwAhmQMAAKcEACCaA0AAnwQAIZsDAQD-AwAhnAMgAMkEACGdAwEA_gMAIZ4DQACfBAAhnwNAAJ8EACEBAAAAAQAgEQMAAKAEACCtAgAA0QQAMK4CAAADABCvAgAA0QQAMLACAQD8AwAhtgJAAP8DACHJAgEA_AMAIcwCQAD_AwAhhgMBAPwDACGHAwEA_AMAIYgDAQD-AwAhiQMBAP4DACGKA0AAnwQAIYsDQACfBAAhjAMBAP4DACGNAwEA_gMAIY4DAQD-AwAhCAMAAIAIACCIAwAA0gQAIIkDAADSBAAgigMAANIEACCLAwAA0gQAIIwDAADSBAAgjQMAANIEACCOAwAA0gQAIBEDAACgBAAgrQIAANEEADCuAgAAAwAQrwIAANEEADCwAgEAAAABtgJAAP8DACHJAgEA_AMAIcwCQAD_AwAhhgMBAPwDACGHAwEA_AMAIYgDAQD-AwAhiQMBAP4DACGKA0AAnwQAIYsDQACfBAAhjAMBAP4DACGNAwEA_gMAIY4DAQD-AwAhAwAAAAMAIAEAAAQAMAIAAAUAIA0DAACgBAAgrQIAANAEADCuAgAABwAQrwIAANAEADCwAgEA_AMAIbYCQAD_AwAhyQIBAPwDACHMAkAA_wMAIdICAQD-AwAhggNAAP8DACGDAwEA_AMAIYQDAQD-AwAhhQMBAP4DACEEAwAAgAgAINICAADSBAAghAMAANIEACCFAwAA0gQAIA0DAACgBAAgrQIAANAEADCuAgAABwAQrwIAANAEADCwAgEAAAABtgJAAP8DACHJAgEA_AMAIcwCQAD_AwAh0gIBAP4DACGCA0AA_wMAIYMDAQAAAAGEAwEA_gMAIYUDAQD-AwAhAwAAAAcAIAEAAAgAMAIAAAkAIAsDAACpBAAgrQIAAM8EADCuAgAACwAQrwIAAM8EADCwAgEA_AMAIbYCQACfBAAhyQIBAP4DACHMAkAAnwQAIYADAQD8AwAhgQMBAPwDACGCA0AA_wMAIQQDAACACAAgtgIAANIEACDJAgAA0gQAIMwCAADSBAAgCwMAAKkEACCtAgAAzwQAMK4CAAALABCvAgAAzwQAMLACAQAAAAG2AkAAnwQAIckCAQD-AwAhzAJAAJ8EACGAAwEA_AMAIYEDAQD8AwAhggNAAP8DACEDAAAACwAgAQAADAAwAgAADQAgIwQAAMoEACAFAADLBAAgBgAAzAQAIB0AAL4EACAeAAC_BAAgIAAAzQQAICEAAMAEACAiAADBBAAgIwAAwgQAICQAAM4EACCtAgAAxgQAMK4CAAAPABCvAgAAxgQAMLACAQD8AwAhtgJAAP8DACHMAkAA_wMAIdoCAQD-AwAh2wICAP0DACHcAgEA_gMAIfgCQACfBAAhjwMBAP4DACGQAyAAngQAIZEDAQD-AwAhkwMAAMcEkwMilQMAAMgElQMilgMgAJ4EACGXAwEA_gMAIZgDAQD-AwAhmQMAAKcEACCaA0AAnwQAIZsDAQD-AwAhnAMgAMkEACGdAwEA_gMAIZ4DQACfBAAhnwNAAJ8EACEBAAAADwAgCQMAAKAEACAHAACoBAAgrQIAAMQEADCuAgAAEQAQrwIAAMQEADC2AkAA_wMAIckCAQD8AwAhygIBAPwDACHaAgAAxQTaAiICAwAAgAgAIAcAAIEIACAKAwAAoAQAIAcAAKgEACCtAgAAxAQAMK4CAAARABCvAgAAxAQAMLYCQAD_AwAhyQIBAPwDACHKAgEA_AMAIdoCAADFBNoCIqADAADDBAAgAwAAABEAIAEAABIAMAIAABMAIBMHAACoBAAgCAAApAQAIAkAALEEACAOAACABAAgEAAAsgQAIK0CAACwBAAwrgIAABUAEK8CAACwBAAwtgJAAP8DACHKAgEA_AMAIc0CAgCdBAAh5QIBAPwDACHmAgEA_gMAIecCAQD-AwAh6AIBAP4DACHpAgEA_AMAIeoCAQD-AwAh6wIBAP4DACHsAkAAnwQAIQEAAAAVACAdEQAAvAQAIBIAAKQEACATAACxBAAgFAAAvAQAIBUAAL0EACAWAAC-BAAgGAAAvwQAIBkAALIEACAaAADABAAgGwAAwQQAIBwAAMIEACCtAgAAugQAMK4CAAAXABCvAgAAugQAMLACAQD8AwAhtgJAAP8DACHMAkAA_wMAIdsCAgD9AwAh7QICAP0DACHuAgEA_gMAIe8CAgD9AwAh8QIAALsE8QIi8gIgAJ4EACHzAiAAngQAIfQCAgCdBAAh9QICAJ0EACH2AgIAnQQAIfcCAgCdBAAh-AJAAJ8EACEBAAAAFwAgEBEAAIQIACASAACBCAAgEwAAgggAIBQAAIQIACAVAACGCAAgFgAA-QcAIBgAAPoHACAZAACDCAAgGgAA_AcAIBsAAP0HACAcAAD-BwAg2wIAANIEACDtAgAA0gQAIO4CAADSBAAg7wIAANIEACD4AgAA0gQAIB4RAAC8BAAgEgAApAQAIBMAALEEACAUAAC8BAAgFQAAvQQAIBYAAL4EACAYAAC_BAAgGQAAsgQAIBoAAMAEACAbAADBBAAgHAAAwgQAIK0CAAC6BAAwrgIAABcAEK8CAAC6BAAwsAIBAAAAAbYCQAD_AwAhzAJAAP8DACHbAgIAAAAB7QICAP0DACHuAgEA_gMAIe8CAgD9AwAh8QIAALsE8QIi8gIgAJ4EACHzAiAAngQAIfQCAgCdBAAh9QICAJ0EACH2AgIAnQQAIfcCAgCdBAAh-AJAAJ8EACGkAwAAuQQAIAMAAAAXACABAAAZADACAAAaACAJCgAAtQQAIA0AALgEACCtAgAAtwQAMK4CAAAcABCvAgAAtwQAMLYCQAD_AwAhygIBAPwDACHNAgIAnQQAIeQCAQD8AwAhAgoAAIQIACANAACFCAAgCgoAALUEACANAAC4BAAgrQIAALcEADCuAgAAHAAQrwIAALcEADC2AkAA_wMAIcoCAQD8AwAhzQICAJ0EACHkAgEA_AMAIaMDAAC2BAAgAwAAABwAIAEAAB0AMAIAAB4AIAMAAAAcACABAAAdADACAAAeACABAAAAHAAgCwcAAKgEACAPAAC1BAAgrQIAALMEADCuAgAAIgAQrwIAALMEADCwAgEA_AMAIbYCQAD_AwAhygIBAPwDACHPAgAAtATkAiLhAgIAnQQAIeICAQD8AwAhAgcAAIEIACAPAACECAAgCwcAAKgEACAPAAC1BAAgrQIAALMEADCuAgAAIgAQrwIAALMEADCwAgEAAAABtgJAAP8DACHKAgEA_AMAIc8CAAC0BOQCIuECAgCdBAAh4gIBAPwDACEDAAAAIgAgAQAAIwAwAgAAJAAgAQAAABcAIAEAAAAcACABAAAAIgAgAQAAABcAIAMAAAAXACABAAAZADACAAAaACABAAAAFQAgCwcAAIEIACAIAACBCAAgCQAAgggAIA4AAJ0FACAQAACDCAAg5gIAANIEACDnAgAA0gQAIOgCAADSBAAg6gIAANIEACDrAgAA0gQAIOwCAADSBAAgFAcAAKgEACAIAACkBAAgCQAAsQQAIA4AAIAEACAQAACyBAAgrQIAALAEADCuAgAAFQAQrwIAALAEADC2AkAA_wMAIcoCAQD8AwAhzQICAJ0EACHlAgEA_AMAIeYCAQD-AwAh5wIBAP4DACHoAgEA_gMAIekCAQD8AwAh6gIBAP4DACHrAgEA_gMAIewCQACfBAAhogMAAK8EACADAAAAFQAgAQAALAAwAgAALQAgAwAAABEAIAEAABIAMAIAABMAIAoHAACoBAAgFwAAqQQAIK0CAACtBAAwrgIAADAAEK8CAACtBAAwsAIBAPwDACG2AkAA_wMAIcoCAQD8AwAh1gIBAP4DACHYAgAArgTYAiIDBwAAgQgAIBcAAIAIACDWAgAA0gQAIAsHAACoBAAgFwAAqQQAIK0CAACtBAAwrgIAADAAEK8CAACtBAAwsAIBAAAAAbYCQAD_AwAhygIBAPwDACHWAgEA_gMAIdgCAACuBNgCIqEDAACsBAAgAwAAADAAIAEAADEAMAIAADIAIAEAAAAPACADAAAAIgAgAQAAIwAwAgAAJAAgCAMAAKAEACAHAACoBAAgrQIAAKsEADCuAgAANgAQrwIAAKsEADC2AkAA_wMAIckCAQD8AwAhygIBAPwDACECAwAAgAgAIAcAAIEIACAJAwAAoAQAIAcAAKgEACCtAgAAqwQAMK4CAAA2ABCvAgAAqwQAMLYCQAD_AwAhyQIBAPwDACHKAgEA_AMAIaADAACqBAAgAwAAADYAIAEAADcAMAIAADgAIBEDAACpBAAgBwAAqAQAIK0CAAClBAAwrgIAADoAEK8CAAClBAAwsAIBAPwDACG2AkAA_wMAIckCAQD-AwAhygIBAPwDACHNAgIA_QMAIc8CAACmBM8CItACAQD-AwAh0QIBAP4DACHSAgEA_gMAIdMCAQD-AwAh1AIAAKcEACDVAgEA_gMAIQoDAACACAAgBwAAgQgAIMkCAADSBAAgzQIAANIEACDQAgAA0gQAINECAADSBAAg0gIAANIEACDTAgAA0gQAINQCAADSBAAg1QIAANIEACARAwAAqQQAIAcAAKgEACCtAgAApQQAMK4CAAA6ABCvAgAApQQAMLACAQAAAAG2AkAA_wMAIckCAQD-AwAhygIBAPwDACHNAgIA_QMAIc8CAACmBM8CItACAQD-AwAh0QIBAP4DACHSAgEA_gMAIdMCAQD-AwAh1AIAAKcEACDVAgEA_gMAIQMAAAA6ACABAAA7ADACAAA8ACABAAAADwAgDAMAAKAEACAHAACkBAAgKgAAogQAIK0CAACjBAAwrgIAAD8AEK8CAACjBAAwsAIBAPwDACG2AkAA_wMAIckCAQD8AwAhygIBAP4DACHLAgIAnQQAIcwCQAD_AwAhAwMAAIAIACAHAACBCAAgygIAANIEACAMAwAAoAQAIAcAAKQEACAqAACiBAAgrQIAAKMEADCuAgAAPwAQrwIAAKMEADCwAgEAAAABtgJAAP8DACHJAgEA_AMAIcoCAQD-AwAhywICAJ0EACHMAkAA_wMAIQMAAAA_ACABAABAADACAABBACABAAAAFwAgAQAAABcAIAEAAAAVACABAAAAEQAgAQAAADAAIAEAAAAiACABAAAANgAgAQAAADoAIAEAAAA_ACADAAAAMAAgAQAAMQAwAgAAMgAgDB8AAKAEACCtAgAAoQQAMK4CAABNABCvAgAAoQQAMLACAQD8AwAhsQIBAPwDACGyAgEA_AMAIbMCAQD8AwAhtAIBAPwDACG1AgAAogQAILYCQAD_AwAhtwJAAJ8EACECHwAAgAgAILcCAADSBAAgDB8AAKAEACCtAgAAoQQAMK4CAABNABCvAgAAoQQAMLACAQAAAAGxAgEA_AMAIbICAQD8AwAhswIBAPwDACG0AgEA_AMAIbUCAACiBAAgtgJAAP8DACG3AkAAnwQAIQMAAABNACABAABOADACAABPACADAAAANgAgAQAANwAwAgAAOAAgAwAAADoAIAEAADsAMAIAADwAIAMAAAA_ACABAABAADACAABBACAPAwAAoAQAIK0CAACcBAAwrgIAAFQAEK8CAACcBAAwsAIBAPwDACG2AkAAnwQAIckCAQD8AwAh3AIBAP4DACH5AgEA_AMAIfoCAQD8AwAh-wICAJ0EACH8AgEA_AMAIf0CIACeBAAh_gIBAP4DACH_AgEA_gMAIQUDAACACAAgtgIAANIEACDcAgAA0gQAIP4CAADSBAAg_wIAANIEACAPAwAAoAQAIK0CAACcBAAwrgIAAFQAEK8CAACcBAAwsAIBAAAAAbYCQACfBAAhyQIBAPwDACHcAgEA_gMAIfkCAQD8AwAh-gIBAPwDACH7AgIAnQQAIfwCAQD8AwAh_QIgAJ4EACH-AgEA_gMAIf8CAQD-AwAhAwAAAFQAIAEAAFUAMAIAAFYAIAEAAAADACABAAAABwAgAQAAAAsAIAEAAAARACABAAAAMAAgAQAAAE0AIAEAAAA2ACABAAAAOgAgAQAAAD8AIAEAAABUACABAAAAAQAgGQQAAPYHACAFAAD3BwAgBgAA-AcAIB0AAPkHACAeAAD6BwAgIAAA-wcAICEAAPwHACAiAAD9BwAgIwAA_gcAICQAAP8HACDaAgAA0gQAINsCAADSBAAg3AIAANIEACD4AgAA0gQAII8DAADSBAAgkQMAANIEACCXAwAA0gQAIJgDAADSBAAgmQMAANIEACCaAwAA0gQAIJsDAADSBAAgnAMAANIEACCdAwAA0gQAIJ4DAADSBAAgnwMAANIEACADAAAADwAgAQAAYwAwAgAAAQAgAwAAAA8AIAEAAGMAMAIAAAEAIAMAAAAPACABAABjADACAAABACAgBAAA7AcAIAUAAO0HACAGAADuBwAgHQAA7wcAIB4AAPAHACAgAADxBwAgIQAA8gcAICIAAPMHACAjAAD0BwAgJAAA9QcAILACAQAAAAG2AkAAAAABzAJAAAAAAdoCAQAAAAHbAgIAAAAB3AIBAAAAAfgCQAAAAAGPAwEAAAABkAMgAAAAAZEDAQAAAAGTAwAAAJMDApUDAAAAlQMClgMgAAAAAZcDAQAAAAGYAwEAAAABmQOAAAAAAZoDQAAAAAGbAwEAAAABnAMgAAAAAZ0DAQAAAAGeA0AAAAABnwNAAAAAAQEqAABnACAWsAIBAAAAAbYCQAAAAAHMAkAAAAAB2gIBAAAAAdsCAgAAAAHcAgEAAAAB-AJAAAAAAY8DAQAAAAGQAyAAAAABkQMBAAAAAZMDAAAAkwMClQMAAACVAwKWAyAAAAABlwMBAAAAAZgDAQAAAAGZA4AAAAABmgNAAAAAAZsDAQAAAAGcAyAAAAABnQMBAAAAAZ4DQAAAAAGfA0AAAAABASoAAGkAMAEqAABpADAgBAAA-QYAIAUAAPoGACAGAAD7BgAgHQAA_AYAIB4AAP0GACAgAAD-BgAgIQAA_wYAICIAAIAHACAjAACBBwAgJAAAggcAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdoCAQDhBAAh2wICAOsEACHcAgEA4QQAIfgCQADYBAAhjwMBAOEEACGQAyAA2QUAIZEDAQDhBAAhkwMAAPYGkwMilQMAAPcGlQMilgMgANkFACGXAwEA4QQAIZgDAQDhBAAhmQOAAAAAAZoDQADYBAAhmwMBAOEEACGcAyAA-AYAIZ0DAQDhBAAhngNAANgEACGfA0AA2AQAIQIAAAABACAqAABsACAWsAIBANYEACG2AkAA1wQAIcwCQADXBAAh2gIBAOEEACHbAgIA6wQAIdwCAQDhBAAh-AJAANgEACGPAwEA4QQAIZADIADZBQAhkQMBAOEEACGTAwAA9gaTAyKVAwAA9waVAyKWAyAA2QUAIZcDAQDhBAAhmAMBAOEEACGZA4AAAAABmgNAANgEACGbAwEA4QQAIZwDIAD4BgAhnQMBAOEEACGeA0AA2AQAIZ8DQADYBAAhAgAAAA8AICoAAG4AIAIAAAAPACAqAABuACADAAAAAQAgMQAAZwAgMgAAbAAgAQAAAAEAIAEAAAAPACAUDAAA8QYAIDcAAPIGACA4AAD1BgAgOQAA9AYAIDoAAPMGACDaAgAA0gQAINsCAADSBAAg3AIAANIEACD4AgAA0gQAII8DAADSBAAgkQMAANIEACCXAwAA0gQAIJgDAADSBAAgmQMAANIEACCaAwAA0gQAIJsDAADSBAAgnAMAANIEACCdAwAA0gQAIJ4DAADSBAAgnwMAANIEACAZrQIAAJIEADCuAgAAdQAQrwIAAJIEADCwAgEA1AMAIbYCQADWAwAhzAJAANYDACHaAgEA4gMAIdsCAgDpAwAh3AIBAOIDACH4AkAA1wMAIY8DAQDiAwAhkAMgAIkEACGRAwEA4gMAIZMDAACTBJMDIpUDAACUBJUDIpYDIACJBAAhlwMBAOIDACGYAwEA4gMAIZkDAADrAwAgmgNAANcDACGbAwEA4gMAIZwDIACVBAAhnQMBAOIDACGeA0AA1wMAIZ8DQADXAwAhAwAAAA8AIAEAAHQAMDYAAHUAIAMAAAAPACABAABjADACAAABACABAAAABQAgAQAAAAUAIAMAAAADACABAAAEADACAAAFACADAAAAAwAgAQAABAAwAgAABQAgAwAAAAMAIAEAAAQAMAIAAAUAIA4DAADwBgAgsAIBAAAAAbYCQAAAAAHJAgEAAAABzAJAAAAAAYYDAQAAAAGHAwEAAAABiAMBAAAAAYkDAQAAAAGKA0AAAAABiwNAAAAAAYwDAQAAAAGNAwEAAAABjgMBAAAAAQEqAAB9ACANsAIBAAAAAbYCQAAAAAHJAgEAAAABzAJAAAAAAYYDAQAAAAGHAwEAAAABiAMBAAAAAYkDAQAAAAGKA0AAAAABiwNAAAAAAYwDAQAAAAGNAwEAAAABjgMBAAAAAQEqAAB_ADABKgAAfwAwDgMAAO8GACCwAgEA1gQAIbYCQADXBAAhyQIBANYEACHMAkAA1wQAIYYDAQDWBAAhhwMBANYEACGIAwEA4QQAIYkDAQDhBAAhigNAANgEACGLA0AA2AQAIYwDAQDhBAAhjQMBAOEEACGOAwEA4QQAIQIAAAAFACAqAACCAQAgDbACAQDWBAAhtgJAANcEACHJAgEA1gQAIcwCQADXBAAhhgMBANYEACGHAwEA1gQAIYgDAQDhBAAhiQMBAOEEACGKA0AA2AQAIYsDQADYBAAhjAMBAOEEACGNAwEA4QQAIY4DAQDhBAAhAgAAAAMAICoAAIQBACACAAAAAwAgKgAAhAEAIAMAAAAFACAxAAB9ACAyAACCAQAgAQAAAAUAIAEAAAADACAKDAAA7AYAIDkAAO4GACA6AADtBgAgiAMAANIEACCJAwAA0gQAIIoDAADSBAAgiwMAANIEACCMAwAA0gQAII0DAADSBAAgjgMAANIEACAQrQIAAJEEADCuAgAAiwEAEK8CAACRBAAwsAIBANQDACG2AkAA1gMAIckCAQDUAwAhzAJAANYDACGGAwEA1AMAIYcDAQDUAwAhiAMBAOIDACGJAwEA4gMAIYoDQADXAwAhiwNAANcDACGMAwEA4gMAIY0DAQDiAwAhjgMBAOIDACEDAAAAAwAgAQAAigEAMDYAAIsBACADAAAAAwAgAQAABAAwAgAABQAgAQAAAAkAIAEAAAAJACADAAAABwAgAQAACAAwAgAACQAgAwAAAAcAIAEAAAgAMAIAAAkAIAMAAAAHACABAAAIADACAAAJACAKAwAA6wYAILACAQAAAAG2AkAAAAAByQIBAAAAAcwCQAAAAAHSAgEAAAABggNAAAAAAYMDAQAAAAGEAwEAAAABhQMBAAAAAQEqAACTAQAgCbACAQAAAAG2AkAAAAAByQIBAAAAAcwCQAAAAAHSAgEAAAABggNAAAAAAYMDAQAAAAGEAwEAAAABhQMBAAAAAQEqAACVAQAwASoAAJUBADAKAwAA6gYAILACAQDWBAAhtgJAANcEACHJAgEA1gQAIcwCQADXBAAh0gIBAOEEACGCA0AA1wQAIYMDAQDWBAAhhAMBAOEEACGFAwEA4QQAIQIAAAAJACAqAACYAQAgCbACAQDWBAAhtgJAANcEACHJAgEA1gQAIcwCQADXBAAh0gIBAOEEACGCA0AA1wQAIYMDAQDWBAAhhAMBAOEEACGFAwEA4QQAIQIAAAAHACAqAACaAQAgAgAAAAcAICoAAJoBACADAAAACQAgMQAAkwEAIDIAAJgBACABAAAACQAgAQAAAAcAIAYMAADnBgAgOQAA6QYAIDoAAOgGACDSAgAA0gQAIIQDAADSBAAghQMAANIEACAMrQIAAJAEADCuAgAAoQEAEK8CAACQBAAwsAIBANQDACG2AkAA1gMAIckCAQDUAwAhzAJAANYDACHSAgEA4gMAIYIDQADWAwAhgwMBANQDACGEAwEA4gMAIYUDAQDiAwAhAwAAAAcAIAEAAKABADA2AAChAQAgAwAAAAcAIAEAAAgAMAIAAAkAIAEAAAANACABAAAADQAgAwAAAAsAIAEAAAwAMAIAAA0AIAMAAAALACABAAAMADACAAANACADAAAACwAgAQAADAAwAgAADQAgCAMAAOYGACCwAgEAAAABtgJAAAAAAckCAQAAAAHMAkAAAAABgAMBAAAAAYEDAQAAAAGCA0AAAAABASoAAKkBACAHsAIBAAAAAbYCQAAAAAHJAgEAAAABzAJAAAAAAYADAQAAAAGBAwEAAAABggNAAAAAAQEqAACrAQAwASoAAKsBADABAAAADwAgCAMAAOUGACCwAgEA1gQAIbYCQADYBAAhyQIBAOEEACHMAkAA2AQAIYADAQDWBAAhgQMBANYEACGCA0AA1wQAIQIAAAANACAqAACvAQAgB7ACAQDWBAAhtgJAANgEACHJAgEA4QQAIcwCQADYBAAhgAMBANYEACGBAwEA1gQAIYIDQADXBAAhAgAAAAsAICoAALEBACACAAAACwAgKgAAsQEAIAEAAAAPACADAAAADQAgMQAAqQEAIDIAAK8BACABAAAADQAgAQAAAAsAIAYMAADiBgAgOQAA5AYAIDoAAOMGACC2AgAA0gQAIMkCAADSBAAgzAIAANIEACAKrQIAAI8EADCuAgAAuQEAEK8CAACPBAAwsAIBANQDACG2AkAA1wMAIckCAQDiAwAhzAJAANcDACGAAwEA1AMAIYEDAQDUAwAhggNAANYDACEDAAAACwAgAQAAuAEAMDYAALkBACADAAAACwAgAQAADAAwAgAADQAgAQAAAFYAIAEAAABWACADAAAAVAAgAQAAVQAwAgAAVgAgAwAAAFQAIAEAAFUAMAIAAFYAIAMAAABUACABAABVADACAABWACAMAwAA4QYAILACAQAAAAG2AkAAAAAByQIBAAAAAdwCAQAAAAH5AgEAAAAB-gIBAAAAAfsCAgAAAAH8AgEAAAAB_QIgAAAAAf4CAQAAAAH_AgEAAAABASoAAMEBACALsAIBAAAAAbYCQAAAAAHJAgEAAAAB3AIBAAAAAfkCAQAAAAH6AgEAAAAB-wICAAAAAfwCAQAAAAH9AiAAAAAB_gIBAAAAAf8CAQAAAAEBKgAAwwEAMAEqAADDAQAwDAMAAOAGACCwAgEA1gQAIbYCQADYBAAhyQIBANYEACHcAgEA4QQAIfkCAQDWBAAh-gIBANYEACH7AgIA4AQAIfwCAQDWBAAh_QIgANkFACH-AgEA4QQAIf8CAQDhBAAhAgAAAFYAICoAAMYBACALsAIBANYEACG2AkAA2AQAIckCAQDWBAAh3AIBAOEEACH5AgEA1gQAIfoCAQDWBAAh-wICAOAEACH8AgEA1gQAIf0CIADZBQAh_gIBAOEEACH_AgEA4QQAIQIAAABUACAqAADIAQAgAgAAAFQAICoAAMgBACADAAAAVgAgMQAAwQEAIDIAAMYBACABAAAAVgAgAQAAAFQAIAkMAADbBgAgNwAA3AYAIDgAAN8GACA5AADeBgAgOgAA3QYAILYCAADSBAAg3AIAANIEACD-AgAA0gQAIP8CAADSBAAgDq0CAACOBAAwrgIAAM8BABCvAgAAjgQAMLACAQDUAwAhtgJAANcDACHJAgEA1AMAIdwCAQDiAwAh-QIBANQDACH6AgEA1AMAIfsCAgDjAwAh_AIBANQDACH9AiAAiQQAIf4CAQDiAwAh_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_AwAh2wICAAAAAdwCAQAAAAHdAgEA_gMAIQEAAACwAgAgAQAAALACACAJCwAAgAQAIK0CAAD7AwAwrgIAALMCABCvAgAA-wMAMLACAQD8AwAhtgJAAP8DACHbAgIA_QMAIdwCAQD8AwAh3QIBAP4DACEDCwAAnQUAINsCAADSBAAg3QIAANIEACADAAAAswIAIAEAALQCADACAACwAgAgAwAAALMCACABAAC0AgAwAgAAsAIAIAMAAACzAgAgAQAAtAIAMAIAALACACAGCwAAnAUAILACAQAAAAG2AkAAAAAB2wICAAAAAdwCAQAAAAHdAgEAAAABASoAALgCACAFsAIBAAAAAbYCQAAAAAHbAgIAAAAB3AIBAAAAAd0CAQAAAAEBKgAAugIAMAEqAAC6AgAwBgsAAI0FACCwAgEA1gQAIbYCQADXBAAh2wICAOsEACHcAgEA1gQAId0CAQDhBAAhAgAAALACACAqAAC9AgAgBbACAQDWBAAhtgJAANcEACHbAgIA6wQAIdwCAQDWBAAh3QIBAOEEACECAAAAswIAICoAAL8CACACAAAAswIAICoAAL8CACADAAAAsAIAIDEAALgCACAyAAC9AgAgAQAAALACACABAAAAswIAIAcMAACIBQAgNwAAiQUAIDgAAIwFACA5AACLBQAgOgAAigUAINsCAADSBAAg3QIAANIEACAIrQIAAPoDADCuAgAAxgIAEK8CAAD6AwAwsAIBANQDACG2AkAA1gMAIdsCAgDpAwAh3AIBANQDACHdAgEA4gMAIQMAAACzAgAgAQAAxQIAMDYAAMYCACADAAAAswIAIAEAALQCADACAACwAgAgAQAAABMAIAEAAAATACADAAAAEQAgAQAAEgAwAgAAEwAgAwAAABEAIAEAABIAMAIAABMAIAMAAAARACABAAASADACAAATACAGAwAAhwUAIAcAAIYFACC2AkAAAAAByQIBAAAAAcoCAQAAAAHaAgAAANoCAgEqAADOAgAgBLYCQAAAAAHJAgEAAAABygIBAAAAAdoCAAAA2gICASoAANACADABKgAA0AIAMAYDAACFBQAgBwAAhAUAILYCQADXBAAhyQIBANYEACHKAgEA1gQAIdoCAACDBdoCIgIAAAATACAqAADTAgAgBLYCQADXBAAhyQIBANYEACHKAgEA1gQAIdoCAACDBdoCIgIAAAARACAqAADVAgAgAgAAABEAICoAANUCACADAAAAEwAgMQAAzgIAIDIAANMCACABAAAAEwAgAQAAABEAIAMMAACABQAgOQAAggUAIDoAAIEFACAHrQIAAPYDADCuAgAA3AIAEK8CAAD2AwAwtgJAANYDACHJAgEA1AMAIcoCAQDUAwAh2gIAAPcD2gIiAwAAABEAIAEAANsCADA2AADcAgAgAwAAABEAIAEAABIAMAIAABMAIAEAAAAyACABAAAAMgAgAwAAADAAIAEAADEAMAIAADIAIAMAAAAwACABAAAxADACAAAyACADAAAAMAAgAQAAMQAwAgAAMgAgBwcAAP4EACAXAAD_BAAgsAIBAAAAAbYCQAAAAAHKAgEAAAAB1gIBAAAAAdgCAAAA2AICASoAAOQCACAFsAIBAAAAAbYCQAAAAAHKAgEAAAAB1gIBAAAAAdgCAAAA2AICASoAAOYCADABKgAA5gIAMAEAAAAPACAHBwAA_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_ACABAABAADACAABBACADAAAAPwAgAQAAQAAwAgAAQQAgCQMAAOQEACAHAADlBAAgKoAAAAABsAIBAAAAAbYCQAAAAAHJAgEAAAABygIBAAAAAcsCAgAAAAHMAkAAAAABASoAAKoDACAHKoAAAAABsAIBAAAAAbYCQAAAAAHJAgEAAAABygIBAAAAAcsCAgAAAAHMAkAAAAABASoAAKwDADABKgAArAMAMAEAAAAXACAJAwAA4gQAIAcAAOMEACAqgAAAAAGwAgEA1gQAIbYCQADXBAAhyQIBANYEACHKAgEA4QQAIcsCAgDgBAAhzAJAANcEACECAAAAQQAgKgAAsAMAIAcqgAAAAAGwAgEA1gQAIbYCQADXBAAhyQIBANYEACHKAgEA4QQAIcsCAgDgBAAhzAJAANcEACECAAAAPwAgKgAAsgMAIAIAAAA_ACAqAACyAwAgAQAAABcAIAMAAABBACAxAACqAwAgMgAAsAMAIAEAAABBACABAAAAPwAgBgwAANsEACA3AADcBAAgOAAA3wQAIDkAAN4EACA6AADdBAAgygIAANIEACAKKgAA1QMAIK0CAADhAwAwrgIAALoDABCvAgAA4QMAMLACAQDUAwAhtgJAANYDACHJAgEA1AMAIcoCAQDiAwAhywICAOMDACHMAkAA1gMAIQMAAAA_ACABAAC5AwAwNgAAugMAIAMAAAA_ACABAABAADACAABBACABAAAATwAgAQAAAE8AIAMAAABNACABAABOADACAABPACADAAAATQAgAQAATgAwAgAATwAgAwAAAE0AIAEAAE4AMAIAAE8AIAkfAADaBAAgsAIBAAAAAbECAQAAAAGyAgEAAAABswIBAAAAAbQCAQAAAAG1AoAAAAABtgJAAAAAAbcCQAAAAAEBKgAAwgMAIAiwAgEAAAABsQIBAAAAAbICAQAAAAGzAgEAAAABtAIBAAAAAbUCgAAAAAG2AkAAAAABtwJAAAAAAQEqAADEAwAwASoAAMQDADAJHwAA2QQAILACAQDWBAAhsQIBANYEACGyAgEA1gQAIbMCAQDWBAAhtAIBANYEACG1AoAAAAABtgJAANcEACG3AkAA2AQAIQIAAABPACAqAADHAwAgCLACAQDWBAAhsQIBANYEACGyAgEA1gQAIbMCAQDWBAAhtAIBANYEACG1AoAAAAABtgJAANcEACG3AkAA2AQAIQIAAABNACAqAADJAwAgAgAAAE0AICoAAMkDACADAAAATwAgMQAAwgMAIDIAAMcDACABAAAATwAgAQAAAE0AIAQMAADTBAAgOQAA1QQAIDoAANQEACC3AgAA0gQAIAutAgAA0wMAMK4CAADQAwAQrwIAANMDADCwAgEA1AMAIbECAQDUAwAhsgIBANQDACGzAgEA1AMAIbQCAQDUAwAhtQIAANUDACC2AkAA1gMAIbcCQADXAwAhAwAAAE0AIAEAAM8DADA2AADQAwAgAwAAAE0AIAEAAE4AMAIAAE8AIAutAgAA0wMAMK4CAADQAwAQrwIAANMDADCwAgEA1AMAIbECAQDUAwAhsgIBANQDACGzAgEA1AMAIbQCAQDUAwAhtQIAANUDACC2AkAA1gMAIbcCQADXAwAhDgwAANwDACA5AADgAwAgOgAA4AMAILgCAQAAAAG5AgEAAAAEugIBAAAABLsCAQAAAAG8AgEAAAABvQIBAAAAAb4CAQAAAAG_AgEA3wMAIcYCAQAAAAHHAgEAAAAByAIBAAAAAQ8MAADcAwAgOQAA3gMAIDoAAN4DACC4AoAAAAABuwKAAAAAAbwCgAAAAAG9AoAAAAABvgKAAAAAAb8CgAAAAAHAAgEAAAABwQIBAAAAAcICAQAAAAHDAoAAAAABxAKAAAAAAcUCgAAAAAELDAAA3AMAIDkAAN0DACA6AADdAwAguAJAAAAAAbkCQAAAAAS6AkAAAAAEuwJAAAAAAbwCQAAAAAG9AkAAAAABvgJAAAAAAb8CQADbAwAhCwwAANkDACA5AADaAwAgOgAA2gMAILgCQAAAAAG5AkAAAAAFugJAAAAABbsCQAAAAAG8AkAAAAABvQJAAAAAAb4CQAAAAAG_AkAA2AMAIQsMAADZAwAgOQAA2gMAIDoAANoDACC4AkAAAAABuQJAAAAABboCQAAAAAW7AkAAAAABvAJAAAAAAb0CQAAAAAG-AkAAAAABvwJAANgDACEIuAICAAAAAbkCAgAAAAW6AgIAAAAFuwICAAAAAbwCAgAAAAG9AgIAAAABvgICAAAAAb8CAgDZAwAhCLgCQAAAAAG5AkAAAAAFugJAAAAABbsCQAAAAAG8AkAAAAABvQJAAAAAAb4CQAAAAAG_AkAA2gMAIQsMAADcAwAgOQAA3QMAIDoAAN0DACC4AkAAAAABuQJAAAAABLoCQAAAAAS7AkAAAAABvAJAAAAAAb0CQAAAAAG-AkAAAAABvwJAANsDACEIuAICAAAAAbkCAgAAAAS6AgIAAAAEuwICAAAAAbwCAgAAAAG9AgIAAAABvgICAAAAAb8CAgDcAwAhCLgCQAAAAAG5AkAAAAAEugJAAAAABLsCQAAAAAG8AkAAAAABvQJAAAAAAb4CQAAAAAG_AkAA3QMAIQy4AoAAAAABuwKAAAAAAbwCgAAAAAG9AoAAAAABvgKAAAAAAb8CgAAAAAHAAgEAAAABwQIBAAAAAcICAQAAAAHDAoAAAAABxAKAAAAAAcUCgAAAAAEODAAA3AMAIDkAAOADACA6AADgAwAguAIBAAAAAbkCAQAAAAS6AgEAAAAEuwIBAAAAAbwCAQAAAAG9AgEAAAABvgIBAAAAAb8CAQDfAwAhxgIBAAAAAccCAQAAAAHIAgEAAAABC7gCAQAAAAG5AgEAAAAEugIBAAAABLsCAQAAAAG8AgEAAAABvQIBAAAAAb4CAQAAAAG_AgEA4AMAIcYCAQAAAAHHAgEAAAAByAIBAAAAAQoqAADVAwAgrQIAAOEDADCuAgAAugMAEK8CAADhAwAwsAIBANQDACG2AkAA1gMAIckCAQDUAwAhygIBAOIDACHLAgIA4wMAIcwCQADWAwAhDgwAANkDACA5AADnAwAgOgAA5wMAILgCAQAAAAG5AgEAAAAFugIBAAAABbsCAQAAAAG8AgEAAAABvQIBAAAAAb4CAQAAAAG_AgEA5gMAIcYCAQAAAAHHAgEAAAAByAIBAAAAAQ0MAADcAwAgNwAA5QMAIDgAANwDACA5AADcAwAgOgAA3AMAILgCAgAAAAG5AgIAAAAEugICAAAABLsCAgAAAAG8AgIAAAABvQICAAAAAb4CAgAAAAG_AgIA5AMAIQ0MAADcAwAgNwAA5QMAIDgAANwDACA5AADcAwAgOgAA3AMAILgCAgAAAAG5AgIAAAAEugICAAAABLsCAgAAAAG8AgIAAAABvQICAAAAAb4CAgAAAAG_AgIA5AMAIQi4AggAAAABuQIIAAAABLoCCAAAAAS7AggAAAABvAIIAAAAAb0CCAAAAAG-AggAAAABvwIIAOUDACEODAAA2QMAIDkAAOcDACA6AADnAwAguAIBAAAAAbkCAQAAAAW6AgEAAAAFuwIBAAAAAbwCAQAAAAG9AgEAAAABvgIBAAAAAb8CAQDmAwAhxgIBAAAAAccCAQAAAAHIAgEAAAABC7gCAQAAAAG5AgEAAAAFugIBAAAABbsCAQAAAAG8AgEAAAABvQIBAAAAAb4CAQAAAAG_AgEA5wMAIcYCAQAAAAHHAgEAAAAByAIBAAAAAQ-tAgAA6AMAMK4CAACiAwAQrwIAAOgDADCwAgEA1AMAIbYCQADWAwAhyQIBAOIDACHKAgEA1AMAIc0CAgDpAwAhzwIAAOoDzwIi0AIBAOIDACHRAgEA4gMAIdICAQDiAwAh0wIBAOIDACHUAgAA6wMAINUCAQDiAwAhDQwAANkDACA3AADwAwAgOAAA2QMAIDkAANkDACA6AADZAwAguAICAAAAAbkCAgAAAAW6AgIAAAAFuwICAAAAAbwCAgAAAAG9AgIAAAABvgICAAAAAb8CAgDvAwAhBwwAANwDACA5AADuAwAgOgAA7gMAILgCAAAAzwICuQIAAADPAgi6AgAAAM8CCL8CAADtA88CIg8MAADZAwAgOQAA7AMAIDoAAOwDACC4AoAAAAABuwKAAAAAAbwCgAAAAAG9AoAAAAABvgKAAAAAAb8CgAAAAAHAAgEAAAABwQIBAAAAAcICAQAAAAHDAoAAAAABxAKAAAAAAcUCgAAAAAEMuAKAAAAAAbsCgAAAAAG8AoAAAAABvQKAAAAAAb4CgAAAAAG_AoAAAAABwAIBAAAAAcECAQAAAAHCAgEAAAABwwKAAAAAAcQCgAAAAAHFAoAAAAABBwwAANwDACA5AADuAwAgOgAA7gMAILgCAAAAzwICuQIAAADPAgi6AgAAAM8CCL8CAADtA88CIgS4AgAAAM8CArkCAAAAzwIIugIAAADPAgi_AgAA7gPPAiINDAAA2QMAIDcAAPADACA4AADZAwAgOQAA2QMAIDoAANkDACC4AgIAAAABuQICAAAABboCAgAAAAW7AgIAAAABvAICAAAAAb0CAgAAAAG-AgIAAAABvwICAO8DACEIuAIIAAAAAbkCCAAAAAW6AggAAAAFuwIIAAAAAbwCCAAAAAG9AggAAAABvgIIAAAAAb8CCADwAwAhBq0CAADxAwAwrgIAAIoDABCvAgAA8QMAMLYCQADWAwAhyQIBANQDACHKAgEA1AMAIQitAgAA8gMAMK4CAAD0AgAQrwIAAPIDADCwAgEA1AMAIbYCQADWAwAhygIBANQDACHWAgEA4gMAIdgCAADzA9gCIgcMAADcAwAgOQAA9QMAIDoAAPUDACC4AgAAANgCArkCAAAA2AIIugIAAADYAgi_AgAA9APYAiIHDAAA3AMAIDkAAPUDACA6AAD1AwAguAIAAADYAgK5AgAAANgCCLoCAAAA2AIIvwIAAPQD2AIiBLgCAAAA2AICuQIAAADYAgi6AgAAANgCCL8CAAD1A9gCIgetAgAA9gMAMK4CAADcAgAQrwIAAPYDADC2AkAA1gMAIckCAQDUAwAhygIBANQDACHaAgAA9wPaAiIHDAAA3AMAIDkAAPkDACA6AAD5AwAguAIAAADaAgK5AgAAANoCCLoCAAAA2gIIvwIAAPgD2gIiBwwAANwDACA5AAD5AwAgOgAA-QMAILgCAAAA2gICuQIAAADaAgi6AgAAANoCCL8CAAD4A9oCIgS4AgAAANoCArkCAAAA2gIIugIAAADaAgi_AgAA-QPaAiIIrQIAAPoDADCuAgAAxgIAEK8CAAD6AwAwsAIBANQDACG2AkAA1gMAIdsCAgDpAwAh3AIBANQDACHdAgEA4gMAIQkLAACABAAgrQIAAPsDADCuAgAAswIAEK8CAAD7AwAwsAIBAPwDACG2AkAA_wMAIdsCAgD9AwAh3AIBAPwDACHdAgEA_gMAIQu4AgEAAAABuQIBAAAABLoCAQAAAAS7AgEAAAABvAIBAAAAAb0CAQAAAAG-AgEAAAABvwIBAOADACHGAgEAAAABxwIBAAAAAcgCAQAAAAEIuAICAAAAAbkCAgAAAAW6AgIAAAAFuwICAAAAAbwCAgAAAAG9AgIAAAABvgICAAAAAb8CAgDZAwAhC7gCAQAAAAG5AgEAAAAFugIBAAAABbsCAQAAAAG8AgEAAAABvQIBAAAAAb4CAQAAAAG_AgEA5wMAIcYCAQAAAAHHAgEAAAAByAIBAAAAAQi4AkAAAAABuQJAAAAABLoCQAAAAAS7AkAAAAABvAJAAAAAAb0CQAAAAAG-AkAAAAABvwJAAN0DACED3gIAABwAIN8CAAAcACDgAgAAHAAgCa0CAACBBAAwrgIAAK0CABCvAgAAgQQAMLACAQDUAwAhtgJAANYDACHKAgEA1AMAIc8CAACCBOQCIuECAgDjAwAh4gIBANQDACEHDAAA3AMAIDkAAIQEACA6AACEBAAguAIAAADkAgK5AgAAAOQCCLoCAAAA5AIIvwIAAIME5AIiBwwAANwDACA5AACEBAAgOgAAhAQAILgCAAAA5AICuQIAAADkAgi6AgAAAOQCCL8CAACDBOQCIgS4AgAAAOQCArkCAAAA5AIIugIAAADkAgi_AgAAhATkAiIHrQIAAIUEADCuAgAAlwIAEK8CAACFBAAwtgJAANYDACHKAgEA1AMAIc0CAgDjAwAh5AIBANQDACEOrQIAAIYEADCuAgAAgQIAEK8CAACGBAAwtgJAANYDACHKAgEA1AMAIc0CAgDjAwAh5QIBANQDACHmAgEA4gMAIecCAQDiAwAh6AIBAOIDACHpAgEA1AMAIeoCAQDiAwAh6wIBAOIDACHsAkAA1wMAIRKtAgAAhwQAMK4CAADrAQAQrwIAAIcEADCwAgEA1AMAIbYCQADWAwAhzAJAANYDACHbAgIA6QMAIe0CAgDpAwAh7gIBAOIDACHvAgIA6QMAIfECAACIBPECIvICIACJBAAh8wIgAIkEACH0AgIA4wMAIfUCAgDjAwAh9gICAOMDACH3AgIA4wMAIfgCQADXAwAhBwwAANwDACA5AACNBAAgOgAAjQQAILgCAAAA8QICuQIAAADxAgi6AgAAAPECCL8CAACMBPECIgUMAADcAwAgOQAAiwQAIDoAAIsEACC4AiAAAAABvwIgAIoEACEFDAAA3AMAIDkAAIsEACA6AACLBAAguAIgAAAAAb8CIACKBAAhArgCIAAAAAG_AiAAiwQAIQcMAADcAwAgOQAAjQQAIDoAAI0EACC4AgAAAPECArkCAAAA8QIIugIAAADxAgi_AgAAjATxAiIEuAIAAADxAgK5AgAAAPECCLoCAAAA8QIIvwIAAI0E8QIiDq0CAACOBAAwrgIAAM8BABCvAgAAjgQAMLACAQDUAwAhtgJAANcDACHJAgEA1AMAIdwCAQDiAwAh-QIBANQDACH6AgEA1AMAIfsCAgDjAwAh_AIBANQDACH9AiAAiQQAIf4CAQDiAwAh_wIBAOIDACEKrQIAAI8EADCuAgAAuQEAEK8CAACPBAAwsAIBANQDACG2AkAA1wMAIckCAQDiAwAhzAJAANcDACGAAwEA1AMAIYEDAQDUAwAhggNAANYDACEMrQIAAJAEADCuAgAAoQEAEK8CAACQBAAwsAIBANQDACG2AkAA1gMAIckCAQDUAwAhzAJAANYDACHSAgEA4gMAIYIDQADWAwAhgwMBANQDACGEAwEA4gMAIYUDAQDiAwAhEK0CAACRBAAwrgIAAIsBABCvAgAAkQQAMLACAQDUAwAhtgJAANYDACHJAgEA1AMAIcwCQADWAwAhhgMBANQDACGHAwEA1AMAIYgDAQDiAwAhiQMBAOIDACGKA0AA1wMAIYsDQADXAwAhjAMBAOIDACGNAwEA4gMAIY4DAQDiAwAhGa0CAACSBAAwrgIAAHUAEK8CAACSBAAwsAIBANQDACG2AkAA1gMAIcwCQADWAwAh2gIBAOIDACHbAgIA6QMAIdwCAQDiAwAh-AJAANcDACGPAwEA4gMAIZADIACJBAAhkQMBAOIDACGTAwAAkwSTAyKVAwAAlASVAyKWAyAAiQQAIZcDAQDiAwAhmAMBAOIDACGZAwAA6wMAIJoDQADXAwAhmwMBAOIDACGcAyAAlQQAIZ0DAQDiAwAhngNAANcDACGfA0AA1wMAIQcMAADcAwAgOQAAmwQAIDoAAJsEACC4AgAAAJMDArkCAAAAkwMIugIAAACTAwi_AgAAmgSTAyIHDAAA3AMAIDkAAJkEACA6AACZBAAguAIAAACVAwK5AgAAAJUDCLoCAAAAlQMIvwIAAJgElQMiBQwAANkDACA5AACXBAAgOgAAlwQAILgCIAAAAAG_AiAAlgQAIQUMAADZAwAgOQAAlwQAIDoAAJcEACC4AiAAAAABvwIgAJYEACECuAIgAAAAAb8CIACXBAAhBwwAANwDACA5AACZBAAgOgAAmQQAILgCAAAAlQMCuQIAAACVAwi6AgAAAJUDCL8CAACYBJUDIgS4AgAAAJUDArkCAAAAlQMIugIAAACVAwi_AgAAmQSVAyIHDAAA3AMAIDkAAJsEACA6AACbBAAguAIAAACTAwK5AgAAAJMDCLoCAAAAkwMIvwIAAJoEkwMiBLgCAAAAkwMCuQIAAACTAwi6AgAAAJMDCL8CAACbBJMDIg8DAACgBAAgrQIAAJwEADCuAgAAVAAQrwIAAJwEADCwAgEA_AMAIbYCQACfBAAhyQIBAPwDACHcAgEA_gMAIfkCAQD8AwAh-gIBAPwDACH7AgIAnQQAIfwCAQD8AwAh_QIgAJ4EACH-AgEA_gMAIf8CAQD-AwAhCLgCAgAAAAG5AgIAAAAEugICAAAABLsCAgAAAAG8AgIAAAABvQICAAAAAb4CAgAAAAG_AgIA3AMAIQK4AiAAAAABvwIgAIsEACEIuAJAAAAAAbkCQAAAAAW6AkAAAAAFuwJAAAAAAbwCQAAAAAG9AkAAAAABvgJAAAAAAb8CQADaAwAhJQQAAMoEACAFAADLBAAgBgAAzAQAIB0AAL4EACAeAAC_BAAgIAAAzQQAICEAAMAEACAiAADBBAAgIwAAwgQAICQAAM4EACCtAgAAxgQAMK4CAAAPABCvAgAAxgQAMLACAQD8AwAhtgJAAP8DACHMAkAA_wMAIdoCAQD-AwAh2wICAP0DACHcAgEA_gMAIfgCQACfBAAhjwMBAP4DACGQAyAAngQAIZEDAQD-AwAhkwMAAMcEkwMilQMAAMgElQMilgMgAJ4EACGXAwEA_gMAIZgDAQD-AwAhmQMAAKcEACCaA0AAnwQAIZsDAQD-AwAhnAMgAMkEACGdAwEA_gMAIZ4DQACfBAAhnwNAAJ8EACGlAwAADwAgpgMAAA8AIAwfAACgBAAgrQIAAKEEADCuAgAATQAQrwIAAKEEADCwAgEA_AMAIbECAQD8AwAhsgIBAPwDACGzAgEA_AMAIbQCAQD8AwAhtQIAAKIEACC2AkAA_wMAIbcCQACfBAAhDLgCgAAAAAG7AoAAAAABvAKAAAAAAb0CgAAAAAG-AoAAAAABvwKAAAAAAcACAQAAAAHBAgEAAAABwgIBAAAAAcMCgAAAAAHEAoAAAAABxQKAAAAAAQwDAACgBAAgBwAApAQAICoAAKIEACCtAgAAowQAMK4CAAA_ABCvAgAAowQAMLACAQD8AwAhtgJAAP8DACHJAgEA_AMAIcoCAQD-AwAhywICAJ0EACHMAkAA_wMAIR8RAAC8BAAgEgAApAQAIBMAALEEACAUAAC8BAAgFQAAvQQAIBYAAL4EACAYAAC_BAAgGQAAsgQAIBoAAMAEACAbAADBBAAgHAAAwgQAIK0CAAC6BAAwrgIAABcAEK8CAAC6BAAwsAIBAPwDACG2AkAA_wMAIcwCQAD_AwAh2wICAP0DACHtAgIA_QMAIe4CAQD-AwAh7wICAP0DACHxAgAAuwTxAiLyAiAAngQAIfMCIACeBAAh9AICAJ0EACH1AgIAnQQAIfYCAgCdBAAh9wICAJ0EACH4AkAAnwQAIaUDAAAXACCmAwAAFwAgEQMAAKkEACAHAACoBAAgrQIAAKUEADCuAgAAOgAQrwIAAKUEADCwAgEA_AMAIbYCQAD_AwAhyQIBAP4DACHKAgEA_AMAIc0CAgD9AwAhzwIAAKYEzwIi0AIBAP4DACHRAgEA_gMAIdICAQD-AwAh0wIBAP4DACHUAgAApwQAINUCAQD-AwAhBLgCAAAAzwICuQIAAADPAgi6AgAAAM8CCL8CAADuA88CIgy4AoAAAAABuwKAAAAAAbwCgAAAAAG9AoAAAAABvgKAAAAAAb8CgAAAAAHAAgEAAAABwQIBAAAAAcICAQAAAAHDAoAAAAABxAKAAAAAAcUCgAAAAAEfEQAAvAQAIBIAAKQEACATAACxBAAgFAAAvAQAIBUAAL0EACAWAAC-BAAgGAAAvwQAIBkAALIEACAaAADABAAgGwAAwQQAIBwAAMIEACCtAgAAugQAMK4CAAAXABCvAgAAugQAMLACAQD8AwAhtgJAAP8DACHMAkAA_wMAIdsCAgD9AwAh7QICAP0DACHuAgEA_gMAIe8CAgD9AwAh8QIAALsE8QIi8gIgAJ4EACHzAiAAngQAIfQCAgCdBAAh9QICAJ0EACH2AgIAnQQAIfcCAgCdBAAh-AJAAJ8EACGlAwAAFwAgpgMAABcAICUEAADKBAAgBQAAywQAIAYAAMwEACAdAAC-BAAgHgAAvwQAICAAAM0EACAhAADABAAgIgAAwQQAICMAAMIEACAkAADOBAAgrQIAAMYEADCuAgAADwAQrwIAAMYEADCwAgEA_AMAIbYCQAD_AwAhzAJAAP8DACHaAgEA_gMAIdsCAgD9AwAh3AIBAP4DACH4AkAAnwQAIY8DAQD-AwAhkAMgAJ4EACGRAwEA_gMAIZMDAADHBJMDIpUDAADIBJUDIpYDIACeBAAhlwMBAP4DACGYAwEA_gMAIZkDAACnBAAgmgNAAJ8EACGbAwEA_gMAIZwDIADJBAAhnQMBAP4DACGeA0AAnwQAIZ8DQACfBAAhpQMAAA8AIKYDAAAPACACyQIBAAAAAcoCAQAAAAEIAwAAoAQAIAcAAKgEACCtAgAAqwQAMK4CAAA2ABCvAgAAqwQAMLYCQAD_AwAhyQIBAPwDACHKAgEA_AMAIQLKAgEAAAAB1gIBAAAAAQoHAACoBAAgFwAAqQQAIK0CAACtBAAwrgIAADAAEK8CAACtBAAwsAIBAPwDACG2AkAA_wMAIcoCAQD8AwAh1gIBAP4DACHYAgAArgTYAiIEuAIAAADYAgK5AgAAANgCCLoCAAAA2AIIvwIAAPUD2AIiAsoCAQAAAAHNAgIAAAABEwcAAKgEACAIAACkBAAgCQAAsQQAIA4AAIAEACAQAACyBAAgrQIAALAEADCuAgAAFQAQrwIAALAEADC2AkAA_wMAIcoCAQD8AwAhzQICAJ0EACHlAgEA_AMAIeYCAQD-AwAh5wIBAP4DACHoAgEA_gMAIekCAQD8AwAh6gIBAP4DACHrAgEA_gMAIewCQACfBAAhA94CAAAXACDfAgAAFwAg4AIAABcAIAPeAgAAIgAg3wIAACIAIOACAAAiACALBwAAqAQAIA8AALUEACCtAgAAswQAMK4CAAAiABCvAgAAswQAMLACAQD8AwAhtgJAAP8DACHKAgEA_AMAIc8CAAC0BOQCIuECAgCdBAAh4gIBAPwDACEEuAIAAADkAgK5AgAAAOQCCLoCAAAA5AIIvwIAAIQE5AIiFQcAAKgEACAIAACkBAAgCQAAsQQAIA4AAIAEACAQAACyBAAgrQIAALAEADCuAgAAFQAQrwIAALAEADC2AkAA_wMAIcoCAQD8AwAhzQICAJ0EACHlAgEA_AMAIeYCAQD-AwAh5wIBAP4DACHoAgEA_gMAIekCAQD8AwAh6gIBAP4DACHrAgEA_gMAIewCQACfBAAhpQMAABUAIKYDAAAVACADygIBAAAAAc0CAgAAAAHkAgEAAAABCQoAALUEACANAAC4BAAgrQIAALcEADCuAgAAHAAQrwIAALcEADC2AkAA_wMAIcoCAQD8AwAhzQICAJ0EACHkAgEA_AMAIQsLAACABAAgrQIAAPsDADCuAgAAswIAEK8CAAD7AwAwsAIBAPwDACG2AkAA_wMAIdsCAgD9AwAh3AIBAPwDACHdAgEA_gMAIaUDAACzAgAgpgMAALMCACACsAIBAAAAAe0CAgAAAAEdEQAAvAQAIBIAAKQEACATAACxBAAgFAAAvAQAIBUAAL0EACAWAAC-BAAgGAAAvwQAIBkAALIEACAaAADABAAgGwAAwQQAIBwAAMIEACCtAgAAugQAMK4CAAAXABCvAgAAugQAMLACAQD8AwAhtgJAAP8DACHMAkAA_wMAIdsCAgD9AwAh7QICAP0DACHuAgEA_gMAIe8CAgD9AwAh8QIAALsE8QIi8gIgAJ4EACHzAiAAngQAIfQCAgCdBAAh9QICAJ0EACH2AgIAnQQAIfcCAgCdBAAh-AJAAJ8EACEEuAIAAADxAgK5AgAAAPECCLoCAAAA8QIIvwIAAI0E8QIiFQcAAKgEACAIAACkBAAgCQAAsQQAIA4AAIAEACAQAACyBAAgrQIAALAEADCuAgAAFQAQrwIAALAEADC2AkAA_wMAIcoCAQD8AwAhzQICAJ0EACHlAgEA_AMAIeYCAQD-AwAh5wIBAP4DACHoAgEA_gMAIekCAQD8AwAh6gIBAP4DACHrAgEA_gMAIewCQACfBAAhpQMAABUAIKYDAAAVACAD3gIAABUAIN8CAAAVACDgAgAAFQAgA94CAAARACDfAgAAEQAg4AIAABEAIAPeAgAAMAAg3wIAADAAIOACAAAwACAD3gIAADYAIN8CAAA2ACDgAgAANgAgA94CAAA6ACDfAgAAOgAg4AIAADoAIAPeAgAAPwAg3wIAAD8AIOACAAA_ACACyQIBAAAAAcoCAQAAAAEJAwAAoAQAIAcAAKgEACCtAgAAxAQAMK4CAAARABCvAgAAxAQAMLYCQAD_AwAhyQIBAPwDACHKAgEA_AMAIdoCAADFBNoCIgS4AgAAANoCArkCAAAA2gIIugIAAADaAgi_AgAA-QPaAiIjBAAAygQAIAUAAMsEACAGAADMBAAgHQAAvgQAIB4AAL8EACAgAADNBAAgIQAAwAQAICIAAMEEACAjAADCBAAgJAAAzgQAIK0CAADGBAAwrgIAAA8AEK8CAADGBAAwsAIBAPwDACG2AkAA_wMAIcwCQAD_AwAh2gIBAP4DACHbAgIA_QMAIdwCAQD-AwAh-AJAAJ8EACGPAwEA_gMAIZADIACeBAAhkQMBAP4DACGTAwAAxwSTAyKVAwAAyASVAyKWAyAAngQAIZcDAQD-AwAhmAMBAP4DACGZAwAApwQAIJoDQACfBAAhmwMBAP4DACGcAyAAyQQAIZ0DAQD-AwAhngNAAJ8EACGfA0AAnwQAIQS4AgAAAJMDArkCAAAAkwMIugIAAACTAwi_AgAAmwSTAyIEuAIAAACVAwK5AgAAAJUDCLoCAAAAlQMIvwIAAJkElQMiArgCIAAAAAG_AiAAlwQAIQPeAgAAAwAg3wIAAAMAIOACAAADACAD3gIAAAcAIN8CAAAHACDgAgAABwAgA94CAAALACDfAgAACwAg4AIAAAsAIAPeAgAATQAg3wIAAE0AIOACAABNACAD3gIAAFQAIN8CAABUACDgAgAAVAAgCwMAAKkEACCtAgAAzwQAMK4CAAALABCvAgAAzwQAMLACAQD8AwAhtgJAAJ8EACHJAgEA_gMAIcwCQACfBAAhgAMBAPwDACGBAwEA_AMAIYIDQAD_AwAhDQMAAKAEACCtAgAA0AQAMK4CAAAHABCvAgAA0AQAMLACAQD8AwAhtgJAAP8DACHJAgEA_AMAIcwCQAD_AwAh0gIBAP4DACGCA0AA_wMAIYMDAQD8AwAhhAMBAP4DACGFAwEA_gMAIREDAACgBAAgrQIAANEEADCuAgAAAwAQrwIAANEEADCwAgEA_AMAIbYCQAD_AwAhyQIBAPwDACHMAkAA_wMAIYYDAQD8AwAhhwMBAPwDACGIAwEA_gMAIYkDAQD-AwAhigNAAJ8EACGLA0AAnwQAIYwDAQD-AwAhjQMBAP4DACGOAwEA_gMAIQAAAAABqgMBAAAAAQGqA0AAAAABAaoDQAAAAAEFMQAAiwkAIDIAAI4JACCnAwAAjAkAIKgDAACNCQAgrQMAAAEAIAMxAACLCQAgpwMAAIwJACCtAwAAAQAgAAAAAAAFqgMCAAAAAbADAgAAAAGxAwIAAAABsgMCAAAAAbMDAgAAAAEBqgMBAAAAAQUxAACDCQAgMgAAiQkAIKcDAACECQAgqAMAAIgJACCtAwAAAQAgBzEAAIEJACAyAACGCQAgpwMAAIIJACCoAwAAhQkAIKsDAAAXACCsAwAAFwAgrQMAABoAIAMxAACDCQAgpwMAAIQJACCtAwAAAQAgAzEAAIEJACCnAwAAggkAIK0DAAAaACAAAAAAAAWqAwIAAAABsAMCAAAAAbEDAgAAAAGyAwIAAAABswMCAAAAAQGqAwAAAM8CAgUxAAD5CAAgMgAA_wgAIKcDAAD6CAAgqAMAAP4IACCtAwAAGgAgBzEAAPcIACAyAAD8CAAgpwMAAPgIACCoAwAA-wgAIKsDAAAPACCsAwAADwAgrQMAAAEAIAMxAAD5CAAgpwMAAPoIACCtAwAAGgAgAzEAAPcIACCnAwAA-AgAIK0DAAABACAAAAAFMQAA7wgAIDIAAPUIACCnAwAA8AgAIKgDAAD0CAAgrQMAABoAIAUxAADtCAAgMgAA8ggAIKcDAADuCAAgqAMAAPEIACCtAwAAAQAgAzEAAO8IACCnAwAA8AgAIK0DAAAaACADMQAA7QgAIKcDAADuCAAgrQMAAAEAIAAAAAGqAwAAANgCAgUxAADlCAAgMgAA6wgAIKcDAADmCAAgqAMAAOoIACCtAwAAGgAgBzEAAOMIACAyAADoCAAgpwMAAOQIACCoAwAA5wgAIKsDAAAPACCsAwAADwAgrQMAAAEAIAMxAADlCAAgpwMAAOYIACCtAwAAGgAgAzEAAOMIACCnAwAA5AgAIK0DAAABACAAAAABqgMAAADaAgIFMQAA2wgAIDIAAOEIACCnAwAA3AgAIKgDAADgCAAgrQMAABoAIAUxAADZCAAgMgAA3ggAIKcDAADaCAAgqAMAAN0IACCtAwAAAQAgAzEAANsIACCnAwAA3AgAIK0DAAAaACADMQAA2QgAIKcDAADaCAAgrQMAAAEAIAAAAAAACzEAAI4FADAyAACTBQAwpwMAAI8FADCoAwAAkAUAMKkDAACRBQAgqgMAAJIFADCrAwAAkgUAMKwDAACSBQAwrQMAAJIFADCuAwAAlAUAMK8DAACVBQAwBAoAAJsFACC2AkAAAAABygIBAAAAAc0CAgAAAAECAAAAHgAgMQAAmgUAIAMAAAAeACAxAACaBQAgMgAAmAUAIAEqAADYCAAwCgoAALUEACANAAC4BAAgrQIAALcEADCuAgAAHAAQrwIAALcEADC2AkAA_wMAIcoCAQD8AwAhzQICAJ0EACHkAgEA_AMAIaMDAAC2BAAgAgAAAB4AICoAAJgFACACAAAAlgUAICoAAJcFACAHrQIAAJUFADCuAgAAlgUAEK8CAACVBQAwtgJAAP8DACHKAgEA_AMAIc0CAgCdBAAh5AIBAPwDACEHrQIAAJUFADCuAgAAlgUAEK8CAACVBQAwtgJAAP8DACHKAgEA_AMAIc0CAgCdBAAh5AIBAPwDACEDtgJAANcEACHKAgEA1gQAIc0CAgDgBAAhBAoAAJkFACC2AkAA1wQAIcoCAQDWBAAhzQICAOAEACEFMQAA0wgAIDIAANYIACCnAwAA1AgAIKgDAADVCAAgrQMAAC0AIAQKAACbBQAgtgJAAAAAAcoCAQAAAAHNAgIAAAABAzEAANMIACCnAwAA1AgAIK0DAAAtACAEMQAAjgUAMKcDAACPBQAwqQMAAJEFACCtAwAAkgUAMAAAAAAAAAGqAwAAAOQCAgUxAADLCAAgMgAA0QgAIKcDAADMCAAgqAMAANAIACCtAwAAGgAgBTEAAMkIACAyAADOCAAgpwMAAMoIACCoAwAAzQgAIK0DAAAtACADMQAAywgAIKcDAADMCAAgrQMAABoAIAMxAADJCAAgpwMAAMoIACCtAwAALQAgAAAAAAAFMQAAxAgAIDIAAMcIACCnAwAAxQgAIKgDAADGCAAgrQMAALACACADMQAAxAgAIKcDAADFCAAgrQMAALACACAAAAAAAAUxAAClCAAgMgAAwggAIKcDAACmCAAgqAMAAMEIACCtAwAAGgAgBzEAALoGACAyAADTBgAgpwMAALsGACCoAwAA0gYAIKsDAAAXACCsAwAAFwAgrQMAABoAIAsxAADOBQAwMgAA0wUAMKcDAADPBQAwqAMAANAFADCpAwAA0QUAIKoDAADSBQAwqwMAANIFADCsAwAA0gUAMK0DAADSBQAwrgMAANQFADCvAwAA1QUAMAsxAADFBQAwMgAAyQUAMKcDAADGBQAwqAMAAMcFADCpAwAAyAUAIKoDAACSBQAwqwMAAJIFADCsAwAAkgUAMK0DAACSBQAwrgMAAMoFADCvAwAAlQUAMAsxAAC5BQAwMgAAvgUAMKcDAAC6BQAwqAMAALsFADCpAwAAvAUAIKoDAAC9BQAwqwMAAL0FADCsAwAAvQUAMK0DAAC9BQAwrgMAAL8FADCvAwAAwAUAMAUHAACmBQAgsAIBAAAAAbYCQAAAAAHPAgAAAOQCAuICAQAAAAECAAAAJAAgMQAAxAUAIAMAAAAkACAxAADEBQAgMgAAwwUAIAEqAADACAAwCwcAAKgEACAPAAC1BAAgrQIAALMEADCuAgAAIgAQrwIAALMEADCwAgEAAAABtgJAAP8DACHKAgEA_AMAIc8CAAC0BOQCIuECAgCdBAAh4gIBAPwDACECAAAAJAAgKgAAwwUAIAIAAADBBQAgKgAAwgUAIAmtAgAAwAUAMK4CAADBBQAQrwIAAMAFADCwAgEA_AMAIbYCQAD_AwAhygIBAPwDACHPAgAAtATkAiLhAgIAnQQAIeICAQD8AwAhCa0CAADABQAwrgIAAMEFABCvAgAAwAUAMLACAQD8AwAhtgJAAP8DACHKAgEA_AMAIc8CAAC0BOQCIuECAgCdBAAh4gIBAPwDACEEsAIBANYEACG2AkAA1wQAIc8CAACjBeQCIuICAQDWBAAhBQcAAKQFACCwAgEA1gQAIbYCQADXBAAhzwIAAKMF5AIi4gIBANYEACEFBwAApgUAILACAQAAAAG2AkAAAAABzwIAAADkAgLiAgEAAAABAw0AAK4FACC2AkAAAAAB5AIBAAAAAQIAAAAeACAxAADNBQAgAwAAAB4AIDEAAM0FACAyAADMBQAgASoAAL8IADACAAAAHgAgKgAAzAUAIAIAAACWBQAgKgAAywUAIAK2AkAA1wQAIeQCAQDWBAAhAw0AAK0FACC2AkAA1wQAIeQCAQDWBAAhAw0AAK4FACC2AkAAAAAB5AIBAAAAARcRAADKBgAgEgAAvAYAIBMAAL0GACAVAAC_BgAgFgAAwAYAIBgAAMEGACAZAADCBgAgGgAAwwYAIBsAAMQGACAcAADFBgAgsAIBAAAAAbYCQAAAAAHMAkAAAAAB2wICAAAAAe0CAgAAAAHxAgAAAPECAvICIAAAAAHzAiAAAAAB9AICAAAAAfUCAgAAAAH2AgIAAAAB9wICAAAAAfgCQAAAAAECAAAAGgAgMQAA0QYAIAMAAAAaACAxAADRBgAgMgAA2gUAIAEqAAC-CAAwHhEAALwEACASAACkBAAgEwAAsQQAIBQAALwEACAVAAC9BAAgFgAAvgQAIBgAAL8EACAZAACyBAAgGgAAwAQAIBsAAMEEACAcAADCBAAgrQIAALoEADCuAgAAFwAQrwIAALoEADCwAgEAAAABtgJAAP8DACHMAkAA_wMAIdsCAgAAAAHtAgIA_QMAIe4CAQD-AwAh7wICAP0DACHxAgAAuwTxAiLyAiAAngQAIfMCIACeBAAh9AICAJ0EACH1AgIAnQQAIfYCAgCdBAAh9wICAJ0EACH4AkAAnwQAIaQDAAC5BAAgAgAAABoAICoAANoFACACAAAA1gUAICoAANcFACASrQIAANUFADCuAgAA1gUAEK8CAADVBQAwsAIBAPwDACG2AkAA_wMAIcwCQAD_AwAh2wICAP0DACHtAgIA_QMAIe4CAQD-AwAh7wICAP0DACHxAgAAuwTxAiLyAiAAngQAIfMCIACeBAAh9AICAJ0EACH1AgIAnQQAIfYCAgCdBAAh9wICAJ0EACH4AkAAnwQAIRKtAgAA1QUAMK4CAADWBQAQrwIAANUFADCwAgEA_AMAIbYCQAD_AwAhzAJAAP8DACHbAgIA_QMAIe0CAgD9AwAh7gIBAP4DACHvAgIA_QMAIfECAAC7BPECIvICIACeBAAh8wIgAJ4EACH0AgIAnQQAIfUCAgCdBAAh9gICAJ0EACH3AgIAnQQAIfgCQACfBAAhDbACAQDWBAAhtgJAANcEACHMAkAA1wQAIdsCAgDrBAAh7QICAOsEACHxAgAA2AXxAiLyAiAA2QUAIfMCIADZBQAh9AICAOAEACH1AgIA4AQAIfYCAgDgBAAh9wICAOAEACH4AkAA2AQAIQGqAwAAAPECAgGqAyAAAAABFxEAANsFACASAADcBQAgEwAA3QUAIBUAAN4FACAWAADfBQAgGAAA4AUAIBkAAOEFACAaAADiBQAgGwAA4wUAIBwAAOQFACCwAgEA1gQAIbYCQADXBAAhzAJAANcEACHbAgIA6wQAIe0CAgDrBAAh8QIAANgF8QIi8gIgANkFACHzAiAA2QUAIfQCAgDgBAAh9QICAOAEACH2AgIA4AQAIfcCAgDgBAAh-AJAANgEACEHMQAArAgAIDIAALwIACCnAwAArQgAIKgDAAC7CAAgqwMAABUAIKwDAAAVACCtAwAALQAgBzEAAK8IACAyAAC5CAAgpwMAALAIACCoAwAAuAgAIKsDAAAXACCsAwAAFwAgrQMAABoAIAsxAADGBgAwMgAAzAYAMKcDAADHBgAwqAMAAMsGADCpAwAAyAYAIKoDAADSBQAwqwMAANIFADCsAwAA0gUAMK0DAADSBQAwrgMAAM0GADCvAwAA1QUAMAsxAACqBgAwMgAArwYAMKcDAACrBgAwqAMAAKwGADCpAwAArQYAIKoDAACuBgAwqwMAAK4GADCsAwAArgYAMK0DAACuBgAwrgMAALAGADCvAwAAsQYAMAsxAACeBgAwMgAAowYAMKcDAACfBgAwqAMAAKAGADCpAwAAoQYAIKoDAACiBgAwqwMAAKIGADCsAwAAogYAMK0DAACiBgAwrgMAAKQGADCvAwAApQYAMAsxAACSBgAwMgAAlwYAMKcDAACTBgAwqAMAAJQGADCpAwAAlQYAIKoDAACWBgAwqwMAAJYGADCsAwAAlgYAMK0DAACWBgAwrgMAAJgGADCvAwAAmQYAMAsxAACJBgAwMgAAjQYAMKcDAACKBgAwqAMAAIsGADCpAwAAjAYAIKoDAAC9BQAwqwMAAL0FADCsAwAAvQUAMK0DAAC9BQAwrgMAAI4GADCvAwAAwAUAMAsxAAD9BQAwMgAAggYAMKcDAAD-BQAwqAMAAP8FADCpAwAAgAYAIKoDAACBBgAwqwMAAIEGADCsAwAAgQYAMK0DAACBBgAwrgMAAIMGADCvAwAAhAYAMAsxAADxBQAwMgAA9gUAMKcDAADyBQAwqAMAAPMFADCpAwAA9AUAIKoDAAD1BQAwqwMAAPUFADCsAwAA9QUAMK0DAAD1BQAwrgMAAPcFADCvAwAA-AUAMAsxAADlBQAwMgAA6gUAMKcDAADmBQAwqAMAAOcFADCpAwAA6AUAIKoDAADpBQAwqwMAAOkFADCsAwAA6QUAMK0DAADpBQAwrgMAAOsFADCvAwAA7AUAMAcDAADkBAAgKoAAAAABsAIBAAAAAbYCQAAAAAHJAgEAAAABywICAAAAAcwCQAAAAAECAAAAQQAgMQAA8AUAIAMAAABBACAxAADwBQAgMgAA7wUAIAEqAAC3CAAwDAMAAKAEACAHAACkBAAgKgAAogQAIK0CAACjBAAwrgIAAD8AEK8CAACjBAAwsAIBAAAAAbYCQAD_AwAhyQIBAPwDACHKAgEA_gMAIcsCAgCdBAAhzAJAAP8DACECAAAAQQAgKgAA7wUAIAIAAADtBQAgKgAA7gUAIAoqAACiBAAgrQIAAOwFADCuAgAA7QUAEK8CAADsBQAwsAIBAPwDACG2AkAA_wMAIckCAQD8AwAhygIBAP4DACHLAgIAnQQAIcwCQAD_AwAhCioAAKIEACCtAgAA7AUAMK4CAADtBQAQrwIAAOwFADCwAgEA_AMAIbYCQAD_AwAhyQIBAPwDACHKAgEA_gMAIcsCAgCdBAAhzAJAAP8DACEGKoAAAAABsAIBANYEACG2AkAA1wQAIckCAQDWBAAhywICAOAEACHMAkAA1wQAIQcDAADiBAAgKoAAAAABsAIBANYEACG2AkAA1wQAIckCAQDWBAAhywICAOAEACHMAkAA1wQAIQcDAADkBAAgKoAAAAABsAIBAAAAAbYCQAAAAAHJAgEAAAABywICAAAAAcwCQAAAAAEMAwAA8AQAILACAQAAAAG2AkAAAAAByQIBAAAAAc0CAgAAAAHPAgAAAM8CAtACAQAAAAHRAgEAAAAB0gIBAAAAAdMCAQAAAAHUAoAAAAAB1QIBAAAAAQIAAAA8ACAxAAD8BQAgAwAAADwAIDEAAPwFACAyAAD7BQAgASoAALYIADARAwAAqQQAIAcAAKgEACCtAgAApQQAMK4CAAA6ABCvAgAApQQAMLACAQAAAAG2AkAA_wMAIckCAQD-AwAhygIBAPwDACHNAgIA_QMAIc8CAACmBM8CItACAQD-AwAh0QIBAP4DACHSAgEA_gMAIdMCAQD-AwAh1AIAAKcEACDVAgEA_gMAIQIAAAA8ACAqAAD7BQAgAgAAAPkFACAqAAD6BQAgD60CAAD4BQAwrgIAAPkFABCvAgAA-AUAMLACAQD8AwAhtgJAAP8DACHJAgEA_gMAIcoCAQD8AwAhzQICAP0DACHPAgAApgTPAiLQAgEA_gMAIdECAQD-AwAh0gIBAP4DACHTAgEA_gMAIdQCAACnBAAg1QIBAP4DACEPrQIAAPgFADCuAgAA-QUAEK8CAAD4BQAwsAIBAPwDACG2AkAA_wMAIckCAQD-AwAhygIBAPwDACHNAgIA_QMAIc8CAACmBM8CItACAQD-AwAh0QIBAP4DACHSAgEA_gMAIdMCAQD-AwAh1AIAAKcEACDVAgEA_gMAIQuwAgEA1gQAIbYCQADXBAAhyQIBAOEEACHNAgIA6wQAIc8CAADsBM8CItACAQDhBAAh0QIBAOEEACHSAgEA4QQAIdMCAQDhBAAh1AKAAAAAAdUCAQDhBAAhDAMAAO4EACCwAgEA1gQAIbYCQADXBAAhyQIBAOEEACHNAgIA6wQAIc8CAADsBM8CItACAQDhBAAh0QIBAOEEACHSAgEA4QQAIdMCAQDhBAAh1AKAAAAAAdUCAQDhBAAhDAMAAPAEACCwAgEAAAABtgJAAAAAAckCAQAAAAHNAgIAAAABzwIAAADPAgLQAgEAAAAB0QIBAAAAAdICAQAAAAHTAgEAAAAB1AKAAAAAAdUCAQAAAAEDAwAA9wQAILYCQAAAAAHJAgEAAAABAgAAADgAIDEAAIgGACADAAAAOAAgMQAAiAYAIDIAAIcGACABKgAAtQgAMAkDAACgBAAgBwAAqAQAIK0CAACrBAAwrgIAADYAEK8CAACrBAAwtgJAAP8DACHJAgEA_AMAIcoCAQD8AwAhoAMAAKoEACACAAAAOAAgKgAAhwYAIAIAAACFBgAgKgAAhgYAIAatAgAAhAYAMK4CAACFBgAQrwIAAIQGADC2AkAA_wMAIckCAQD8AwAhygIBAPwDACEGrQIAAIQGADCuAgAAhQYAEK8CAACEBgAwtgJAAP8DACHJAgEA_AMAIcoCAQD8AwAhArYCQADXBAAhyQIBANYEACEDAwAA9QQAILYCQADXBAAhyQIBANYEACEDAwAA9wQAILYCQAAAAAHJAgEAAAABBg8AAKcFACCwAgEAAAABtgJAAAAAAc8CAAAA5AIC4QICAAAAAeICAQAAAAECAAAAJAAgMQAAkQYAIAMAAAAkACAxAACRBgAgMgAAkAYAIAEqAAC0CAAwAgAAACQAICoAAJAGACACAAAAwQUAICoAAI8GACAFsAIBANYEACG2AkAA1wQAIc8CAACjBeQCIuECAgDgBAAh4gIBANYEACEGDwAApQUAILACAQDWBAAhtgJAANcEACHPAgAAowXkAiLhAgIA4AQAIeICAQDWBAAhBg8AAKcFACCwAgEAAAABtgJAAAAAAc8CAAAA5AIC4QICAAAAAeICAQAAAAEFFwAA_wQAILACAQAAAAG2AkAAAAAB1gIBAAAAAdgCAAAA2AICAgAAADIAIDEAAJ0GACADAAAAMgAgMQAAnQYAIDIAAJwGACABKgAAswgAMAsHAACoBAAgFwAAqQQAIK0CAACtBAAwrgIAADAAEK8CAACtBAAwsAIBAAAAAbYCQAD_AwAhygIBAPwDACHWAgEA_gMAIdgCAACuBNgCIqEDAACsBAAgAgAAADIAICoAAJwGACACAAAAmgYAICoAAJsGACAIrQIAAJkGADCuAgAAmgYAEK8CAACZBgAwsAIBAPwDACG2AkAA_wMAIcoCAQD8AwAh1gIBAP4DACHYAgAArgTYAiIIrQIAAJkGADCuAgAAmgYAEK8CAACZBgAwsAIBAPwDACG2AkAA_wMAIcoCAQD8AwAh1gIBAP4DACHYAgAArgTYAiIEsAIBANYEACG2AkAA1wQAIdYCAQDhBAAh2AIAAPsE2AIiBRcAAP0EACCwAgEA1gQAIbYCQADXBAAh1gIBAOEEACHYAgAA-wTYAiIFFwAA_wQAILACAQAAAAG2AkAAAAAB1gIBAAAAAdgCAAAA2AICBAMAAIcFACC2AkAAAAAByQIBAAAAAdoCAAAA2gICAgAAABMAIDEAAKkGACADAAAAEwAgMQAAqQYAIDIAAKgGACABKgAAsggAMAoDAACgBAAgBwAAqAQAIK0CAADEBAAwrgIAABEAEK8CAADEBAAwtgJAAP8DACHJAgEA_AMAIcoCAQD8AwAh2gIAAMUE2gIioAMAAMMEACACAAAAEwAgKgAAqAYAIAIAAACmBgAgKgAApwYAIAetAgAApQYAMK4CAACmBgAQrwIAAKUGADC2AkAA_wMAIckCAQD8AwAhygIBAPwDACHaAgAAxQTaAiIHrQIAAKUGADCuAgAApgYAEK8CAAClBgAwtgJAAP8DACHJAgEA_AMAIcoCAQD8AwAh2gIAAMUE2gIiA7YCQADXBAAhyQIBANYEACHaAgAAgwXaAiIEAwAAhQUAILYCQADXBAAhyQIBANYEACHaAgAAgwXaAiIEAwAAhwUAILYCQAAAAAHJAgEAAAAB2gIAAADaAgIOCAAAtgYAIAkAALcGACAOAAC4BgAgEAAAuQYAILYCQAAAAAHNAgIAAAAB5QIBAAAAAeYCAQAAAAHnAgEAAAAB6AIBAAAAAekCAQAAAAHqAgEAAAAB6wIBAAAAAewCQAAAAAECAAAALQAgMQAAtQYAIAMAAAAtACAxAAC1BgAgMgAAtAYAIAEqAACxCAAwFAcAAKgEACAIAACkBAAgCQAAsQQAIA4AAIAEACAQAACyBAAgrQIAALAEADCuAgAAFQAQrwIAALAEADC2AkAA_wMAIcoCAQD8AwAhzQICAJ0EACHlAgEA_AMAIeYCAQD-AwAh5wIBAP4DACHoAgEA_gMAIekCAQD8AwAh6gIBAP4DACHrAgEA_gMAIewCQACfBAAhogMAAK8EACACAAAALQAgKgAAtAYAIAIAAACyBgAgKgAAswYAIA6tAgAAsQYAMK4CAACyBgAQrwIAALEGADC2AkAA_wMAIcoCAQD8AwAhzQICAJ0EACHlAgEA_AMAIeYCAQD-AwAh5wIBAP4DACHoAgEA_gMAIekCAQD8AwAh6gIBAP4DACHrAgEA_gMAIewCQACfBAAhDq0CAACxBgAwrgIAALIGABCvAgAAsQYAMLYCQAD_AwAhygIBAPwDACHNAgIAnQQAIeUCAQD8AwAh5gIBAP4DACHnAgEA_gMAIegCAQD-AwAh6QIBAPwDACHqAgEA_gMAIesCAQD-AwAh7AJAAJ8EACEKtgJAANcEACHNAgIA4AQAIeUCAQDWBAAh5gIBAOEEACHnAgEA4QQAIegCAQDhBAAh6QIBANYEACHqAgEA4QQAIesCAQDhBAAh7AJAANgEACEOCAAAtQUAIAkAALYFACAOAAC3BQAgEAAAuAUAILYCQADXBAAhzQICAOAEACHlAgEA1gQAIeYCAQDhBAAh5wIBAOEEACHoAgEA4QQAIekCAQDWBAAh6gIBAOEEACHrAgEA4QQAIewCQADYBAAhDggAALYGACAJAAC3BgAgDgAAuAYAIBAAALkGACC2AkAAAAABzQICAAAAAeUCAQAAAAHmAgEAAAAB5wIBAAAAAegCAQAAAAHpAgEAAAAB6gIBAAAAAesCAQAAAAHsAkAAAAABAzEAALoGACCnAwAAuwYAIK0DAAAaACAEMQAAzgUAMKcDAADPBQAwqQMAANEFACCtAwAA0gUAMAQxAADFBQAwpwMAAMYFADCpAwAAyAUAIK0DAACSBQAwBDEAALkFADCnAwAAugUAMKkDAAC8BQAgrQMAAL0FADAXEgAAvAYAIBMAAL0GACAUAAC-BgAgFQAAvwYAIBYAAMAGACAYAADBBgAgGQAAwgYAIBoAAMMGACAbAADEBgAgHAAAxQYAILYCQAAAAAHMAkAAAAAB2wICAAAAAe4CAQAAAAHvAgIAAAAB8QIAAADxAgLyAiAAAAAB8wIgAAAAAfQCAgAAAAH1AgIAAAAB9gICAAAAAfcCAgAAAAH4AkAAAAABAgAAABoAIDEAALoGACADMQAArwgAIKcDAACwCAAgrQMAABoAIAQxAADGBgAwpwMAAMcGADCpAwAAyAYAIK0DAADSBQAwAzEAAKcIACCnAwAAqAgAIK0DAAAtACAEMQAAqgYAMKcDAACrBgAwqQMAAK0GACCtAwAArgYAMAQxAACeBgAwpwMAAJ8GADCpAwAAoQYAIK0DAACiBgAwBDEAAJIGADCnAwAAkwYAMKkDAACVBgAgrQMAAJYGADAEMQAAiQYAMKcDAACKBgAwqQMAAIwGACCtAwAAvQUAMAQxAAD9BQAwpwMAAP4FADCpAwAAgAYAIK0DAACBBgAwBDEAAPEFADCnAwAA8gUAMKkDAAD0BQAgrQMAAPUFADAEMQAA5QUAMKcDAADmBQAwqQMAAOgFACCtAwAA6QUAMBgRAADKBgAgEwAAvQYAIBQAAL4GACAVAAC_BgAgFgAAwAYAIBgAAMEGACAZAADCBgAgGgAAwwYAIBsAAMQGACAcAADFBgAgsAIBAAAAAbYCQAAAAAHMAkAAAAAB2wICAAAAAe0CAgAAAAHvAgIAAAAB8QIAAADxAgLyAiAAAAAB8wIgAAAAAfQCAgAAAAH1AgIAAAAB9gICAAAAAfcCAgAAAAH4AkAAAAABAgAAABoAIDEAAMkGACABKgAArggAMBgRAADKBgAgEwAAvQYAIBQAAL4GACAVAAC_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_BwAwMgAAwwcAMKcDAADABwAwqAMAAMEHADCpAwAAwgcAIKoDAACiBgAwqwMAAKIGADCsAwAAogYAMK0DAACiBgAwrgMAAMQHADCvAwAApQYAMAsxAAC2BwAwMgAAugcAMKcDAAC3BwAwqAMAALgHADCpAwAAuQcAIKoDAACWBgAwqwMAAJYGADCsAwAAlgYAMK0DAACWBgAwrgMAALsHADCvAwAAmQYAMAsxAACqBwAwMgAArwcAMKcDAACrBwAwqAMAAKwHADCpAwAArQcAIKoDAACuBwAwqwMAAK4HADCsAwAArgcAMK0DAACuBwAwrgMAALAHADCvAwAAsQcAMAsxAAChBwAwMgAApQcAMKcDAACiBwAwqAMAAKMHADCpAwAApAcAIKoDAACBBgAwqwMAAIEGADCsAwAAgQYAMK0DAACBBgAwrgMAAKYHADCvAwAAhAYAMAsxAACYBwAwMgAAnAcAMKcDAACZBwAwqAMAAJoHADCpAwAAmwcAIKoDAAD1BQAwqwMAAPUFADCsAwAA9QUAMK0DAAD1BQAwrgMAAJ0HADCvAwAA-AUAMAsxAACPBwAwMgAAkwcAMKcDAACQBwAwqAMAAJEHADCpAwAAkgcAIKoDAADpBQAwqwMAAOkFADCsAwAA6QUAMK0DAADpBQAwrgMAAJQHADCvAwAA7AUAMAsxAACDBwAwMgAAiAcAMKcDAACEBwAwqAMAAIUHADCpAwAAhgcAIKoDAACHBwAwqwMAAIcHADCsAwAAhwcAMK0DAACHBwAwrgMAAIkHADCvAwAAigcAMAqwAgEAAAABtgJAAAAAAdwCAQAAAAH5AgEAAAAB-gIBAAAAAfsCAgAAAAH8AgEAAAAB_QIgAAAAAf4CAQAAAAH_AgEAAAABAgAAAFYAIDEAAI4HACADAAAAVgAgMQAAjgcAIDIAAI0HACABKgAAkAgAMA8DAACgBAAgrQIAAJwEADCuAgAAVAAQrwIAAJwEADCwAgEAAAABtgJAAJ8EACHJAgEA_AMAIdwCAQD-AwAh-QIBAPwDACH6AgEA_AMAIfsCAgCdBAAh_AIBAPwDACH9AiAAngQAIf4CAQD-AwAh_wIBAP4DACECAAAAVgAgKgAAjQcAIAIAAACLBwAgKgAAjAcAIA6tAgAAigcAMK4CAACLBwAQrwIAAIoHADCwAgEA_AMAIbYCQACfBAAhyQIBAPwDACHcAgEA_gMAIfkCAQD8AwAh-gIBAPwDACH7AgIAnQQAIfwCAQD8AwAh_QIgAJ4EACH-AgEA_gMAIf8CAQD-AwAhDq0CAACKBwAwrgIAAIsHABCvAgAAigcAMLACAQD8AwAhtgJAAJ8EACHJAgEA_AMAIdwCAQD-AwAh-QIBAPwDACH6AgEA_AMAIfsCAgCdBAAh_AIBAPwDACH9AiAAngQAIf4CAQD-AwAh_wIBAP4DACEKsAIBANYEACG2AkAA2AQAIdwCAQDhBAAh-QIBANYEACH6AgEA1gQAIfsCAgDgBAAh_AIBANYEACH9AiAA2QUAIf4CAQDhBAAh_wIBAOEEACEKsAIBANYEACG2AkAA2AQAIdwCAQDhBAAh-QIBANYEACH6AgEA1gQAIfsCAgDgBAAh_AIBANYEACH9AiAA2QUAIf4CAQDhBAAh_wIBAOEEACEKsAIBAAAAAbYCQAAAAAHcAgEAAAAB-QIBAAAAAfoCAQAAAAH7AgIAAAAB_AIBAAAAAf0CIAAAAAH-AgEAAAAB_wIBAAAAAQcHAADlBAAgKoAAAAABsAIBAAAAAbYCQAAAAAHKAgEAAAABywICAAAAAcwCQAAAAAECAAAAQQAgMQAAlwcAIAMAAABBACAxAACXBwAgMgAAlgcAIAEqAACPCAAwAgAAAEEAICoAAJYHACACAAAA7QUAICoAAJUHACAGKoAAAAABsAIBANYEACG2AkAA1wQAIcoCAQDhBAAhywICAOAEACHMAkAA1wQAIQcHAADjBAAgKoAAAAABsAIBANYEACG2AkAA1wQAIcoCAQDhBAAhywICAOAEACHMAkAA1wQAIQcHAADlBAAgKoAAAAABsAIBAAAAAbYCQAAAAAHKAgEAAAABywICAAAAAcwCQAAAAAEMBwAA7wQAILACAQAAAAG2AkAAAAABygIBAAAAAc0CAgAAAAHPAgAAAM8CAtACAQAAAAHRAgEAAAAB0gIBAAAAAdMCAQAAAAHUAoAAAAAB1QIBAAAAAQIAAAA8ACAxAACgBwAgAwAAADwAIDEAAKAHACAyAACfBwAgASoAAI4IADACAAAAPAAgKgAAnwcAIAIAAAD5BQAgKgAAngcAIAuwAgEA1gQAIbYCQADXBAAhygIBANYEACHNAgIA6wQAIc8CAADsBM8CItACAQDhBAAh0QIBAOEEACHSAgEA4QQAIdMCAQDhBAAh1AKAAAAAAdUCAQDhBAAhDAcAAO0EACCwAgEA1gQAIbYCQADXBAAhygIBANYEACHNAgIA6wQAIc8CAADsBM8CItACAQDhBAAh0QIBAOEEACHSAgEA4QQAIdMCAQDhBAAh1AKAAAAAAdUCAQDhBAAhDAcAAO8EACCwAgEAAAABtgJAAAAAAcoCAQAAAAHNAgIAAAABzwIAAADPAgLQAgEAAAAB0QIBAAAAAdICAQAAAAHTAgEAAAAB1AKAAAAAAdUCAQAAAAEDBwAA9gQAILYCQAAAAAHKAgEAAAABAgAAADgAIDEAAKkHACADAAAAOAAgMQAAqQcAIDIAAKgHACABKgAAjQgAMAIAAAA4ACAqAACoBwAgAgAAAIUGACAqAACnBwAgArYCQADXBAAhygIBANYEACEDBwAA9AQAILYCQADXBAAhygIBANYEACEDBwAA9gQAILYCQAAAAAHKAgEAAAABB7ACAQAAAAGxAgEAAAABswIBAAAAAbQCAQAAAAG1AoAAAAABtgJAAAAAAbcCQAAAAAECAAAATwAgMQAAtQcAIAMAAABPACAxAAC1BwAgMgAAtAcAIAEqAACMCAAwDB8AAKAEACCtAgAAoQQAMK4CAABNABCvAgAAoQQAMLACAQAAAAGxAgEA_AMAIbICAQD8AwAhswIBAPwDACG0AgEA_AMAIbUCAACiBAAgtgJAAP8DACG3AkAAnwQAIQIAAABPACAqAAC0BwAgAgAAALIHACAqAACzBwAgC60CAACxBwAwrgIAALIHABCvAgAAsQcAMLACAQD8AwAhsQIBAPwDACGyAgEA_AMAIbMCAQD8AwAhtAIBAPwDACG1AgAAogQAILYCQAD_AwAhtwJAAJ8EACELrQIAALEHADCuAgAAsgcAEK8CAACxBwAwsAIBAPwDACGxAgEA_AMAIbICAQD8AwAhswIBAPwDACG0AgEA_AMAIbUCAACiBAAgtgJAAP8DACG3AkAAnwQAIQewAgEA1gQAIbECAQDWBAAhswIBANYEACG0AgEA1gQAIbUCgAAAAAG2AkAA1wQAIbcCQADYBAAhB7ACAQDWBAAhsQIBANYEACGzAgEA1gQAIbQCAQDWBAAhtQKAAAAAAbYCQADXBAAhtwJAANgEACEHsAIBAAAAAbECAQAAAAGzAgEAAAABtAIBAAAAAbUCgAAAAAG2AkAAAAABtwJAAAAAAQUHAAD-BAAgsAIBAAAAAbYCQAAAAAHKAgEAAAAB2AIAAADYAgICAAAAMgAgMQAAvgcAIAMAAAAyACAxAAC-BwAgMgAAvQcAIAEqAACLCAAwAgAAADIAICoAAL0HACACAAAAmgYAICoAALwHACAEsAIBANYEACG2AkAA1wQAIcoCAQDWBAAh2AIAAPsE2AIiBQcAAPwEACCwAgEA1gQAIbYCQADXBAAhygIBANYEACHYAgAA-wTYAiIFBwAA_gQAILACAQAAAAG2AkAAAAABygIBAAAAAdgCAAAA2AICBAcAAIYFACC2AkAAAAABygIBAAAAAdoCAAAA2gICAgAAABMAIDEAAMcHACADAAAAEwAgMQAAxwcAIDIAAMYHACABKgAAiggAMAIAAAATACAqAADGBwAgAgAAAKYGACAqAADFBwAgA7YCQADXBAAhygIBANYEACHaAgAAgwXaAiIEBwAAhAUAILYCQADXBAAhygIBANYEACHaAgAAgwXaAiIEBwAAhgUAILYCQAAAAAHKAgEAAAAB2gIAAADaAgIGsAIBAAAAAbYCQAAAAAHMAkAAAAABgAMBAAAAAYEDAQAAAAGCA0AAAAABAgAAAA0AIDEAANMHACADAAAADQAgMQAA0wcAIDIAANIHACABKgAAiQgAMAsDAACpBAAgrQIAAM8EADCuAgAACwAQrwIAAM8EADCwAgEAAAABtgJAAJ8EACHJAgEA_gMAIcwCQACfBAAhgAMBAPwDACGBAwEA_AMAIYIDQAD_AwAhAgAAAA0AICoAANIHACACAAAA0AcAICoAANEHACAKrQIAAM8HADCuAgAA0AcAEK8CAADPBwAwsAIBAPwDACG2AkAAnwQAIckCAQD-AwAhzAJAAJ8EACGAAwEA_AMAIYEDAQD8AwAhggNAAP8DACEKrQIAAM8HADCuAgAA0AcAEK8CAADPBwAwsAIBAPwDACG2AkAAnwQAIckCAQD-AwAhzAJAAJ8EACGAAwEA_AMAIYEDAQD8AwAhggNAAP8DACEGsAIBANYEACG2AkAA2AQAIcwCQADYBAAhgAMBANYEACGBAwEA1gQAIYIDQADXBAAhBrACAQDWBAAhtgJAANgEACHMAkAA2AQAIYADAQDWBAAhgQMBANYEACGCA0AA1wQAIQawAgEAAAABtgJAAAAAAcwCQAAAAAGAAwEAAAABgQMBAAAAAYIDQAAAAAEIsAIBAAAAAbYCQAAAAAHMAkAAAAAB0gIBAAAAAYIDQAAAAAGDAwEAAAABhAMBAAAAAYUDAQAAAAECAAAACQAgMQAA3wcAIAMAAAAJACAxAADfBwAgMgAA3gcAIAEqAACICAAwDQMAAKAEACCtAgAA0AQAMK4CAAAHABCvAgAA0AQAMLACAQAAAAG2AkAA_wMAIckCAQD8AwAhzAJAAP8DACHSAgEA_gMAIYIDQAD_AwAhgwMBAAAAAYQDAQD-AwAhhQMBAP4DACECAAAACQAgKgAA3gcAIAIAAADcBwAgKgAA3QcAIAytAgAA2wcAMK4CAADcBwAQrwIAANsHADCwAgEA_AMAIbYCQAD_AwAhyQIBAPwDACHMAkAA_wMAIdICAQD-AwAhggNAAP8DACGDAwEA_AMAIYQDAQD-AwAhhQMBAP4DACEMrQIAANsHADCuAgAA3AcAEK8CAADbBwAwsAIBAPwDACG2AkAA_wMAIckCAQD8AwAhzAJAAP8DACHSAgEA_gMAIYIDQAD_AwAhgwMBAPwDACGEAwEA_gMAIYUDAQD-AwAhCLACAQDWBAAhtgJAANcEACHMAkAA1wQAIdICAQDhBAAhggNAANcEACGDAwEA1gQAIYQDAQDhBAAhhQMBAOEEACEIsAIBANYEACG2AkAA1wQAIcwCQADXBAAh0gIBAOEEACGCA0AA1wQAIYMDAQDWBAAhhAMBAOEEACGFAwEA4QQAIQiwAgEAAAABtgJAAAAAAcwCQAAAAAHSAgEAAAABggNAAAAAAYMDAQAAAAGEAwEAAAABhQMBAAAAAQywAgEAAAABtgJAAAAAAcwCQAAAAAGGAwEAAAABhwMBAAAAAYgDAQAAAAGJAwEAAAABigNAAAAAAYsDQAAAAAGMAwEAAAABjQMBAAAAAY4DAQAAAAECAAAABQAgMQAA6wcAIAMAAAAFACAxAADrBwAgMgAA6gcAIAEqAACHCAAwEQMAAKAEACCtAgAA0QQAMK4CAAADABCvAgAA0QQAMLACAQAAAAG2AkAA_wMAIckCAQD8AwAhzAJAAP8DACGGAwEA_AMAIYcDAQD8AwAhiAMBAP4DACGJAwEA_gMAIYoDQACfBAAhiwNAAJ8EACGMAwEA_gMAIY0DAQD-AwAhjgMBAP4DACECAAAABQAgKgAA6gcAIAIAAADoBwAgKgAA6QcAIBCtAgAA5wcAMK4CAADoBwAQrwIAAOcHADCwAgEA_AMAIbYCQAD_AwAhyQIBAPwDACHMAkAA_wMAIYYDAQD8AwAhhwMBAPwDACGIAwEA_gMAIYkDAQD-AwAhigNAAJ8EACGLA0AAnwQAIYwDAQD-AwAhjQMBAP4DACGOAwEA_gMAIRCtAgAA5wcAMK4CAADoBwAQrwIAAOcHADCwAgEA_AMAIbYCQAD_AwAhyQIBAPwDACHMAkAA_wMAIYYDAQD8AwAhhwMBAPwDACGIAwEA_gMAIYkDAQD-AwAhigNAAJ8EACGLA0AAnwQAIYwDAQD-AwAhjQMBAP4DACGOAwEA_gMAIQywAgEA1gQAIbYCQADXBAAhzAJAANcEACGGAwEA1gQAIYcDAQDWBAAhiAMBAOEEACGJAwEA4QQAIYoDQADYBAAhiwNAANgEACGMAwEA4QQAIY0DAQDhBAAhjgMBAOEEACEMsAIBANYEACG2AkAA1wQAIcwCQADXBAAhhgMBANYEACGHAwEA1gQAIYgDAQDhBAAhiQMBAOEEACGKA0AA2AQAIYsDQADYBAAhjAMBAOEEACGNAwEA4QQAIY4DAQDhBAAhDLACAQAAAAG2AkAAAAABzAJAAAAAAYYDAQAAAAGHAwEAAAABiAMBAAAAAYkDAQAAAAGKA0AAAAABiwNAAAAAAYwDAQAAAAGNAwEAAAABjgMBAAAAAQQxAADgBwAwpwMAAOEHADCpAwAA4wcAIK0DAADkBwAwBDEAANQHADCnAwAA1QcAMKkDAADXBwAgrQMAANgHADAEMQAAyAcAMKcDAADJBwAwqQMAAMsHACCtAwAAzAcAMAQxAAC_BwAwpwMAAMAHADCpAwAAwgcAIK0DAACiBgAwBDEAALYHADCnAwAAtwcAMKkDAAC5BwAgrQMAAJYGADAEMQAAqgcAMKcDAACrBwAwqQMAAK0HACCtAwAArgcAMAQxAAChBwAwpwMAAKIHADCpAwAApAcAIK0DAACBBgAwBDEAAJgHADCnAwAAmQcAMKkDAACbBwAgrQMAAPUFADAEMQAAjwcAMKcDAACQBwAwqQMAAJIHACCtAwAA6QUAMAQxAACDBwAwpwMAAIQHADCpAwAAhgcAIK0DAACHBwAwAAAAAAAAAAAAABkEAAD2BwAgBQAA9wcAIAYAAPgHACAdAAD5BwAgHgAA-gcAICAAAPsHACAhAAD8BwAgIgAA_QcAICMAAP4HACAkAAD_BwAg2gIAANIEACDbAgAA0gQAINwCAADSBAAg-AIAANIEACCPAwAA0gQAIJEDAADSBAAglwMAANIEACCYAwAA0gQAIJkDAADSBAAgmgMAANIEACCbAwAA0gQAIJwDAADSBAAgnQMAANIEACCeAwAA0gQAIJ8DAADSBAAgEBEAAIQIACASAACBCAAgEwAAgggAIBQAAIQIACAVAACGCAAgFgAA-QcAIBgAAPoHACAZAACDCAAgGgAA_AcAIBsAAP0HACAcAAD-BwAg2wIAANIEACDtAgAA0gQAIO4CAADSBAAg7wIAANIEACD4AgAA0gQAIAAACwcAAIEIACAIAACBCAAgCQAAgggAIA4AAJ0FACAQAACDCAAg5gIAANIEACDnAgAA0gQAIOgCAADSBAAg6gIAANIEACDrAgAA0gQAIOwCAADSBAAgAwsAAJ0FACDbAgAA0gQAIN0CAADSBAAgAAywAgEAAAABtgJAAAAAAcwCQAAAAAGGAwEAAAABhwMBAAAAAYgDAQAAAAGJAwEAAAABigNAAAAAAYsDQAAAAAGMAwEAAAABjQMBAAAAAY4DAQAAAAEIsAIBAAAAAbYCQAAAAAHMAkAAAAAB0gIBAAAAAYIDQAAAAAGDAwEAAAABhAMBAAAAAYUDAQAAAAEGsAIBAAAAAbYCQAAAAAHMAkAAAAABgAMBAAAAAYEDAQAAAAGCA0AAAAABA7YCQAAAAAHKAgEAAAAB2gIAAADaAgIEsAIBAAAAAbYCQAAAAAHKAgEAAAAB2AIAAADYAgIHsAIBAAAAAbECAQAAAAGzAgEAAAABtAIBAAAAAbUCgAAAAAG2AkAAAAABtwJAAAAAAQK2AkAAAAABygIBAAAAAQuwAgEAAAABtgJAAAAAAcoCAQAAAAHNAgIAAAABzwIAAADPAgLQAgEAAAAB0QIBAAAAAdICAQAAAAHTAgEAAAAB1AKAAAAAAdUCAQAAAAEGKoAAAAABsAIBAAAAAbYCQAAAAAHKAgEAAAABywICAAAAAcwCQAAAAAEKsAIBAAAAAbYCQAAAAAHcAgEAAAAB-QIBAAAAAfoCAQAAAAH7AgIAAAAB_AIBAAAAAf0CIAAAAAH-AgEAAAAB_wIBAAAAAR8FAADtBwAgBgAA7gcAIB0AAO8HACAeAADwBwAgIAAA8QcAICEAAPIHACAiAADzBwAgIwAA9AcAICQAAPUHACCwAgEAAAABtgJAAAAAAcwCQAAAAAHaAgEAAAAB2wICAAAAAdwCAQAAAAH4AkAAAAABjwMBAAAAAZADIAAAAAGRAwEAAAABkwMAAACTAwKVAwAAAJUDApYDIAAAAAGXAwEAAAABmAMBAAAAAZkDgAAAAAGaA0AAAAABmwMBAAAAAZwDIAAAAAGdAwEAAAABngNAAAAAAZ8DQAAAAAECAAAAAQAgMQAAkQgAIAMAAAAPACAxAACRCAAgMgAAlQgAICEAAAAPACAFAAD6BgAgBgAA-wYAIB0AAPwGACAeAAD9BgAgIAAA_gYAICEAAP8GACAiAACABwAgIwAAgQcAICQAAIIHACAqAACVCAAgsAIBANYEACG2AkAA1wQAIcwCQADXBAAh2gIBAOEEACHbAgIA6wQAIdwCAQDhBAAh-AJAANgEACGPAwEA4QQAIZADIADZBQAhkQMBAOEEACGTAwAA9gaTAyKVAwAA9waVAyKWAyAA2QUAIZcDAQDhBAAhmAMBAOEEACGZA4AAAAABmgNAANgEACGbAwEA4QQAIZwDIAD4BgAhnQMBAOEEACGeA0AA2AQAIZ8DQADYBAAhHwUAAPoGACAGAAD7BgAgHQAA_AYAIB4AAP0GACAgAAD-BgAgIQAA_wYAICIAAIAHACAjAACBBwAgJAAAggcAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdoCAQDhBAAh2wICAOsEACHcAgEA4QQAIfgCQADYBAAhjwMBAOEEACGQAyAA2QUAIZEDAQDhBAAhkwMAAPYGkwMilQMAAPcGlQMilgMgANkFACGXAwEA4QQAIZgDAQDhBAAhmQOAAAAAAZoDQADYBAAhmwMBAOEEACGcAyAA-AYAIZ0DAQDhBAAhngNAANgEACGfA0AA2AQAIR8EAADsBwAgBgAA7gcAIB0AAO8HACAeAADwBwAgIAAA8QcAICEAAPIHACAiAADzBwAgIwAA9AcAICQAAPUHACCwAgEAAAABtgJAAAAAAcwCQAAAAAHaAgEAAAAB2wICAAAAAdwCAQAAAAH4AkAAAAABjwMBAAAAAZADIAAAAAGRAwEAAAABkwMAAACTAwKVAwAAAJUDApYDIAAAAAGXAwEAAAABmAMBAAAAAZkDgAAAAAGaA0AAAAABmwMBAAAAAZwDIAAAAAGdAwEAAAABngNAAAAAAZ8DQAAAAAECAAAAAQAgMQAAlggAIAMAAAAPACAxAACWCAAgMgAAmggAICEAAAAPACAEAAD5BgAgBgAA-wYAIB0AAPwGACAeAAD9BgAgIAAA_gYAICEAAP8GACAiAACABwAgIwAAgQcAICQAAIIHACAqAACaCAAgsAIBANYEACG2AkAA1wQAIcwCQADXBAAh2gIBAOEEACHbAgIA6wQAIdwCAQDhBAAh-AJAANgEACGPAwEA4QQAIZADIADZBQAhkQMBAOEEACGTAwAA9gaTAyKVAwAA9waVAyKWAyAA2QUAIZcDAQDhBAAhmAMBAOEEACGZA4AAAAABmgNAANgEACGbAwEA4QQAIZwDIAD4BgAhnQMBAOEEACGeA0AA2AQAIZ8DQADYBAAhHwQAAPkGACAGAAD7BgAgHQAA_AYAIB4AAP0GACAgAAD-BgAgIQAA_wYAICIAAIAHACAjAACBBwAgJAAAggcAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdoCAQDhBAAh2wICAOsEACHcAgEA4QQAIfgCQADYBAAhjwMBAOEEACGQAyAA2QUAIZEDAQDhBAAhkwMAAPYGkwMilQMAAPcGlQMilgMgANkFACGXAwEA4QQAIZgDAQDhBAAhmQOAAAAAAZoDQADYBAAhmwMBAOEEACGcAyAA-AYAIZ0DAQDhBAAhngNAANgEACGfA0AA2AQAIR8EAADsBwAgBQAA7QcAIB0AAO8HACAeAADwBwAgIAAA8QcAICEAAPIHACAiAADzBwAgIwAA9AcAICQAAPUHACCwAgEAAAABtgJAAAAAAcwCQAAAAAHaAgEAAAAB2wICAAAAAdwCAQAAAAH4AkAAAAABjwMBAAAAAZADIAAAAAGRAwEAAAABkwMAAACTAwKVAwAAAJUDApYDIAAAAAGXAwEAAAABmAMBAAAAAZkDgAAAAAGaA0AAAAABmwMBAAAAAZwDIAAAAAGdAwEAAAABngNAAAAAAZ8DQAAAAAECAAAAAQAgMQAAmwgAIAMAAAAPACAxAACbCAAgMgAAnwgAICEAAAAPACAEAAD5BgAgBQAA-gYAIB0AAPwGACAeAAD9BgAgIAAA_gYAICEAAP8GACAiAACABwAgIwAAgQcAICQAAIIHACAqAACfCAAgsAIBANYEACG2AkAA1wQAIcwCQADXBAAh2gIBAOEEACHbAgIA6wQAIdwCAQDhBAAh-AJAANgEACGPAwEA4QQAIZADIADZBQAhkQMBAOEEACGTAwAA9gaTAyKVAwAA9waVAyKWAyAA2QUAIZcDAQDhBAAhmAMBAOEEACGZA4AAAAABmgNAANgEACGbAwEA4QQAIZwDIAD4BgAhnQMBAOEEACGeA0AA2AQAIZ8DQADYBAAhHwQAAPkGACAFAAD6BgAgHQAA_AYAIB4AAP0GACAgAAD-BgAgIQAA_wYAICIAAIAHACAjAACBBwAgJAAAggcAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdoCAQDhBAAh2wICAOsEACHcAgEA4QQAIfgCQADYBAAhjwMBAOEEACGQAyAA2QUAIZEDAQDhBAAhkwMAAPYGkwMilQMAAPcGlQMilgMgANkFACGXAwEA4QQAIZgDAQDhBAAhmQOAAAAAAZoDQADYBAAhmwMBAOEEACGcAyAA-AYAIZ0DAQDhBAAhngNAANgEACGfA0AA2AQAIR8EAADsBwAgBQAA7QcAIAYAAO4HACAdAADvBwAgHgAA8AcAICAAAPEHACAhAADyBwAgIgAA8wcAICMAAPQHACCwAgEAAAABtgJAAAAAAcwCQAAAAAHaAgEAAAAB2wICAAAAAdwCAQAAAAH4AkAAAAABjwMBAAAAAZADIAAAAAGRAwEAAAABkwMAAACTAwKVAwAAAJUDApYDIAAAAAGXAwEAAAABmAMBAAAAAZkDgAAAAAGaA0AAAAABmwMBAAAAAZwDIAAAAAGdAwEAAAABngNAAAAAAZ8DQAAAAAECAAAAAQAgMQAAoAgAIAMAAAAPACAxAACgCAAgMgAApAgAICEAAAAPACAEAAD5BgAgBQAA-gYAIAYAAPsGACAdAAD8BgAgHgAA_QYAICAAAP4GACAhAAD_BgAgIgAAgAcAICMAAIEHACAqAACkCAAgsAIBANYEACG2AkAA1wQAIcwCQADXBAAh2gIBAOEEACHbAgIA6wQAIdwCAQDhBAAh-AJAANgEACGPAwEA4QQAIZADIADZBQAhkQMBAOEEACGTAwAA9gaTAyKVAwAA9waVAyKWAyAA2QUAIZcDAQDhBAAhmAMBAOEEACGZA4AAAAABmgNAANgEACGbAwEA4QQAIZwDIAD4BgAhnQMBAOEEACGeA0AA2AQAIZ8DQADYBAAhHwQAAPkGACAFAAD6BgAgBgAA-wYAIB0AAPwGACAeAAD9BgAgIAAA_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-gYAIAYAAPsGACAeAAD9BgAgIAAA_gYAICEAAP8GACAiAACABwAgIwAAgQcAICQAAIIHACAqAADfCAAgsAIBANYEACG2AkAA1wQAIcwCQADXBAAh2gIBAOEEACHbAgIA6wQAIdwCAQDhBAAh-AJAANgEACGPAwEA4QQAIZADIADZBQAhkQMBAOEEACGTAwAA9gaTAyKVAwAA9waVAyKWAyAA2QUAIZcDAQDhBAAhmAMBAOEEACGZA4AAAAABmgNAANgEACGbAwEA4QQAIZwDIAD4BgAhnQMBAOEEACGeA0AA2AQAIZ8DQADYBAAhHwQAAPkGACAFAAD6BgAgBgAA-wYAIB4AAP0GACAgAAD-BgAgIQAA_wYAICIAAIAHACAjAACBBwAgJAAAggcAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdoCAQDhBAAh2wICAOsEACHcAgEA4QQAIfgCQADYBAAhjwMBAOEEACGQAyAA2QUAIZEDAQDhBAAhkwMAAPYGkwMilQMAAPcGlQMilgMgANkFACGXAwEA4QQAIZgDAQDhBAAhmQOAAAAAAZoDQADYBAAhmwMBAOEEACGcAyAA-AYAIZ0DAQDhBAAhngNAANgEACGfA0AA2AQAIQMAAAAXACAxAADbCAAgMgAA4ggAIBsAAAAXACARAADbBQAgEgAA3AUAIBMAAN0FACAUAADQBgAgFQAA3gUAIBgAAOAFACAZAADhBQAgGgAA4gUAIBsAAOMFACAcAADkBQAgKgAA4ggAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdsCAgDrBAAh7QICAOsEACHuAgEA4QQAIe8CAgDrBAAh8QIAANgF8QIi8gIgANkFACHzAiAA2QUAIfQCAgDgBAAh9QICAOAEACH2AgIA4AQAIfcCAgDgBAAh-AJAANgEACEZEQAA2wUAIBIAANwFACATAADdBQAgFAAA0AYAIBUAAN4FACAYAADgBQAgGQAA4QUAIBoAAOIFACAbAADjBQAgHAAA5AUAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdsCAgDrBAAh7QICAOsEACHuAgEA4QQAIe8CAgDrBAAh8QIAANgF8QIi8gIgANkFACHzAiAA2QUAIfQCAgDgBAAh9QICAOAEACH2AgIA4AQAIfcCAgDgBAAh-AJAANgEACEfBAAA7AcAIAUAAO0HACAGAADuBwAgHQAA7wcAICAAAPEHACAhAADyBwAgIgAA8wcAICMAAPQHACAkAAD1BwAgsAIBAAAAAbYCQAAAAAHMAkAAAAAB2gIBAAAAAdsCAgAAAAHcAgEAAAAB-AJAAAAAAY8DAQAAAAGQAyAAAAABkQMBAAAAAZMDAAAAkwMClQMAAACVAwKWAyAAAAABlwMBAAAAAZgDAQAAAAGZA4AAAAABmgNAAAAAAZsDAQAAAAGcAyAAAAABnQMBAAAAAZ4DQAAAAAGfA0AAAAABAgAAAAEAIDEAAOMIACAZEQAAygYAIBIAALwGACATAAC9BgAgFAAAvgYAIBUAAL8GACAWAADABgAgGQAAwgYAIBoAAMMGACAbAADEBgAgHAAAxQYAILACAQAAAAG2AkAAAAABzAJAAAAAAdsCAgAAAAHtAgIAAAAB7gIBAAAAAe8CAgAAAAHxAgAAAPECAvICIAAAAAHzAiAAAAAB9AICAAAAAfUCAgAAAAH2AgIAAAAB9wICAAAAAfgCQAAAAAECAAAAGgAgMQAA5QgAIAMAAAAPACAxAADjCAAgMgAA6QgAICEAAAAPACAEAAD5BgAgBQAA-gYAIAYAAPsGACAdAAD8BgAgIAAA_gYAICEAAP8GACAiAACABwAgIwAAgQcAICQAAIIHACAqAADpCAAgsAIBANYEACG2AkAA1wQAIcwCQADXBAAh2gIBAOEEACHbAgIA6wQAIdwCAQDhBAAh-AJAANgEACGPAwEA4QQAIZADIADZBQAhkQMBAOEEACGTAwAA9gaTAyKVAwAA9waVAyKWAyAA2QUAIZcDAQDhBAAhmAMBAOEEACGZA4AAAAABmgNAANgEACGbAwEA4QQAIZwDIAD4BgAhnQMBAOEEACGeA0AA2AQAIZ8DQADYBAAhHwQAAPkGACAFAAD6BgAgBgAA-wYAIB0AAPwGACAgAAD-BgAgIQAA_wYAICIAAIAHACAjAACBBwAgJAAAggcAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdoCAQDhBAAh2wICAOsEACHcAgEA4QQAIfgCQADYBAAhjwMBAOEEACGQAyAA2QUAIZEDAQDhBAAhkwMAAPYGkwMilQMAAPcGlQMilgMgANkFACGXAwEA4QQAIZgDAQDhBAAhmQOAAAAAAZoDQADYBAAhmwMBAOEEACGcAyAA-AYAIZ0DAQDhBAAhngNAANgEACGfA0AA2AQAIQMAAAAXACAxAADlCAAgMgAA7AgAIBsAAAAXACARAADbBQAgEgAA3AUAIBMAAN0FACAUAADQBgAgFQAA3gUAIBYAAN8FACAZAADhBQAgGgAA4gUAIBsAAOMFACAcAADkBQAgKgAA7AgAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdsCAgDrBAAh7QICAOsEACHuAgEA4QQAIe8CAgDrBAAh8QIAANgF8QIi8gIgANkFACHzAiAA2QUAIfQCAgDgBAAh9QICAOAEACH2AgIA4AQAIfcCAgDgBAAh-AJAANgEACEZEQAA2wUAIBIAANwFACATAADdBQAgFAAA0AYAIBUAAN4FACAWAADfBQAgGQAA4QUAIBoAAOIFACAbAADjBQAgHAAA5AUAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdsCAgDrBAAh7QICAOsEACHuAgEA4QQAIe8CAgDrBAAh8QIAANgF8QIi8gIgANkFACHzAiAA2QUAIfQCAgDgBAAh9QICAOAEACH2AgIA4AQAIfcCAgDgBAAh-AJAANgEACEfBAAA7AcAIAUAAO0HACAGAADuBwAgHQAA7wcAIB4AAPAHACAgAADxBwAgIgAA8wcAICMAAPQHACAkAAD1BwAgsAIBAAAAAbYCQAAAAAHMAkAAAAAB2gIBAAAAAdsCAgAAAAHcAgEAAAAB-AJAAAAAAY8DAQAAAAGQAyAAAAABkQMBAAAAAZMDAAAAkwMClQMAAACVAwKWAyAAAAABlwMBAAAAAZgDAQAAAAGZA4AAAAABmgNAAAAAAZsDAQAAAAGcAyAAAAABnQMBAAAAAZ4DQAAAAAGfA0AAAAABAgAAAAEAIDEAAO0IACAZEQAAygYAIBIAALwGACATAAC9BgAgFAAAvgYAIBUAAL8GACAWAADABgAgGAAAwQYAIBkAAMIGACAbAADEBgAgHAAAxQYAILACAQAAAAG2AkAAAAABzAJAAAAAAdsCAgAAAAHtAgIAAAAB7gIBAAAAAe8CAgAAAAHxAgAAAPECAvICIAAAAAHzAiAAAAAB9AICAAAAAfUCAgAAAAH2AgIAAAAB9wICAAAAAfgCQAAAAAECAAAAGgAgMQAA7wgAIAMAAAAPACAxAADtCAAgMgAA8wgAICEAAAAPACAEAAD5BgAgBQAA-gYAIAYAAPsGACAdAAD8BgAgHgAA_QYAICAAAP4GACAiAACABwAgIwAAgQcAICQAAIIHACAqAADzCAAgsAIBANYEACG2AkAA1wQAIcwCQADXBAAh2gIBAOEEACHbAgIA6wQAIdwCAQDhBAAh-AJAANgEACGPAwEA4QQAIZADIADZBQAhkQMBAOEEACGTAwAA9gaTAyKVAwAA9waVAyKWAyAA2QUAIZcDAQDhBAAhmAMBAOEEACGZA4AAAAABmgNAANgEACGbAwEA4QQAIZwDIAD4BgAhnQMBAOEEACGeA0AA2AQAIZ8DQADYBAAhHwQAAPkGACAFAAD6BgAgBgAA-wYAIB0AAPwGACAeAAD9BgAgIAAA_gYAICIAAIAHACAjAACBBwAgJAAAggcAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdoCAQDhBAAh2wICAOsEACHcAgEA4QQAIfgCQADYBAAhjwMBAOEEACGQAyAA2QUAIZEDAQDhBAAhkwMAAPYGkwMilQMAAPcGlQMilgMgANkFACGXAwEA4QQAIZgDAQDhBAAhmQOAAAAAAZoDQADYBAAhmwMBAOEEACGcAyAA-AYAIZ0DAQDhBAAhngNAANgEACGfA0AA2AQAIQMAAAAXACAxAADvCAAgMgAA9ggAIBsAAAAXACARAADbBQAgEgAA3AUAIBMAAN0FACAUAADQBgAgFQAA3gUAIBYAAN8FACAYAADgBQAgGQAA4QUAIBsAAOMFACAcAADkBQAgKgAA9ggAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdsCAgDrBAAh7QICAOsEACHuAgEA4QQAIe8CAgDrBAAh8QIAANgF8QIi8gIgANkFACHzAiAA2QUAIfQCAgDgBAAh9QICAOAEACH2AgIA4AQAIfcCAgDgBAAh-AJAANgEACEZEQAA2wUAIBIAANwFACATAADdBQAgFAAA0AYAIBUAAN4FACAWAADfBQAgGAAA4AUAIBkAAOEFACAbAADjBQAgHAAA5AUAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdsCAgDrBAAh7QICAOsEACHuAgEA4QQAIe8CAgDrBAAh8QIAANgF8QIi8gIgANkFACHzAiAA2QUAIfQCAgDgBAAh9QICAOAEACH2AgIA4AQAIfcCAgDgBAAh-AJAANgEACEfBAAA7AcAIAUAAO0HACAGAADuBwAgHQAA7wcAIB4AAPAHACAgAADxBwAgIQAA8gcAICMAAPQHACAkAAD1BwAgsAIBAAAAAbYCQAAAAAHMAkAAAAAB2gIBAAAAAdsCAgAAAAHcAgEAAAAB-AJAAAAAAY8DAQAAAAGQAyAAAAABkQMBAAAAAZMDAAAAkwMClQMAAACVAwKWAyAAAAABlwMBAAAAAZgDAQAAAAGZA4AAAAABmgNAAAAAAZsDAQAAAAGcAyAAAAABnQMBAAAAAZ4DQAAAAAGfA0AAAAABAgAAAAEAIDEAAPcIACAZEQAAygYAIBIAALwGACATAAC9BgAgFAAAvgYAIBUAAL8GACAWAADABgAgGAAAwQYAIBkAAMIGACAaAADDBgAgHAAAxQYAILACAQAAAAG2AkAAAAABzAJAAAAAAdsCAgAAAAHtAgIAAAAB7gIBAAAAAe8CAgAAAAHxAgAAAPECAvICIAAAAAHzAiAAAAAB9AICAAAAAfUCAgAAAAH2AgIAAAAB9wICAAAAAfgCQAAAAAECAAAAGgAgMQAA-QgAIAMAAAAPACAxAAD3CAAgMgAA_QgAICEAAAAPACAEAAD5BgAgBQAA-gYAIAYAAPsGACAdAAD8BgAgHgAA_QYAICAAAP4GACAhAAD_BgAgIwAAgQcAICQAAIIHACAqAAD9CAAgsAIBANYEACG2AkAA1wQAIcwCQADXBAAh2gIBAOEEACHbAgIA6wQAIdwCAQDhBAAh-AJAANgEACGPAwEA4QQAIZADIADZBQAhkQMBAOEEACGTAwAA9gaTAyKVAwAA9waVAyKWAyAA2QUAIZcDAQDhBAAhmAMBAOEEACGZA4AAAAABmgNAANgEACGbAwEA4QQAIZwDIAD4BgAhnQMBAOEEACGeA0AA2AQAIZ8DQADYBAAhHwQAAPkGACAFAAD6BgAgBgAA-wYAIB0AAPwGACAeAAD9BgAgIAAA_gYAICEAAP8GACAjAACBBwAgJAAAggcAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdoCAQDhBAAh2wICAOsEACHcAgEA4QQAIfgCQADYBAAhjwMBAOEEACGQAyAA2QUAIZEDAQDhBAAhkwMAAPYGkwMilQMAAPcGlQMilgMgANkFACGXAwEA4QQAIZgDAQDhBAAhmQOAAAAAAZoDQADYBAAhmwMBAOEEACGcAyAA-AYAIZ0DAQDhBAAhngNAANgEACGfA0AA2AQAIQMAAAAXACAxAAD5CAAgMgAAgAkAIBsAAAAXACARAADbBQAgEgAA3AUAIBMAAN0FACAUAADQBgAgFQAA3gUAIBYAAN8FACAYAADgBQAgGQAA4QUAIBoAAOIFACAcAADkBQAgKgAAgAkAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdsCAgDrBAAh7QICAOsEACHuAgEA4QQAIe8CAgDrBAAh8QIAANgF8QIi8gIgANkFACHzAiAA2QUAIfQCAgDgBAAh9QICAOAEACH2AgIA4AQAIfcCAgDgBAAh-AJAANgEACEZEQAA2wUAIBIAANwFACATAADdBQAgFAAA0AYAIBUAAN4FACAWAADfBQAgGAAA4AUAIBkAAOEFACAaAADiBQAgHAAA5AUAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdsCAgDrBAAh7QICAOsEACHuAgEA4QQAIe8CAgDrBAAh8QIAANgF8QIi8gIgANkFACHzAiAA2QUAIfQCAgDgBAAh9QICAOAEACH2AgIA4AQAIfcCAgDgBAAh-AJAANgEACEZEQAAygYAIBIAALwGACATAAC9BgAgFAAAvgYAIBUAAL8GACAWAADABgAgGAAAwQYAIBkAAMIGACAaAADDBgAgGwAAxAYAILACAQAAAAG2AkAAAAABzAJAAAAAAdsCAgAAAAHtAgIAAAAB7gIBAAAAAe8CAgAAAAHxAgAAAPECAvICIAAAAAHzAiAAAAAB9AICAAAAAfUCAgAAAAH2AgIAAAAB9wICAAAAAfgCQAAAAAECAAAAGgAgMQAAgQkAIB8EAADsBwAgBQAA7QcAIAYAAO4HACAdAADvBwAgHgAA8AcAICAAAPEHACAhAADyBwAgIgAA8wcAICQAAPUHACCwAgEAAAABtgJAAAAAAcwCQAAAAAHaAgEAAAAB2wICAAAAAdwCAQAAAAH4AkAAAAABjwMBAAAAAZADIAAAAAGRAwEAAAABkwMAAACTAwKVAwAAAJUDApYDIAAAAAGXAwEAAAABmAMBAAAAAZkDgAAAAAGaA0AAAAABmwMBAAAAAZwDIAAAAAGdAwEAAAABngNAAAAAAZ8DQAAAAAECAAAAAQAgMQAAgwkAIAMAAAAXACAxAACBCQAgMgAAhwkAIBsAAAAXACARAADbBQAgEgAA3AUAIBMAAN0FACAUAADQBgAgFQAA3gUAIBYAAN8FACAYAADgBQAgGQAA4QUAIBoAAOIFACAbAADjBQAgKgAAhwkAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdsCAgDrBAAh7QICAOsEACHuAgEA4QQAIe8CAgDrBAAh8QIAANgF8QIi8gIgANkFACHzAiAA2QUAIfQCAgDgBAAh9QICAOAEACH2AgIA4AQAIfcCAgDgBAAh-AJAANgEACEZEQAA2wUAIBIAANwFACATAADdBQAgFAAA0AYAIBUAAN4FACAWAADfBQAgGAAA4AUAIBkAAOEFACAaAADiBQAgGwAA4wUAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdsCAgDrBAAh7QICAOsEACHuAgEA4QQAIe8CAgDrBAAh8QIAANgF8QIi8gIgANkFACHzAiAA2QUAIfQCAgDgBAAh9QICAOAEACH2AgIA4AQAIfcCAgDgBAAh-AJAANgEACEDAAAADwAgMQAAgwkAIDIAAIoJACAhAAAADwAgBAAA-QYAIAUAAPoGACAGAAD7BgAgHQAA_AYAIB4AAP0GACAgAAD-BgAgIQAA_wYAICIAAIAHACAkAACCBwAgKgAAigkAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdoCAQDhBAAh2wICAOsEACHcAgEA4QQAIfgCQADYBAAhjwMBAOEEACGQAyAA2QUAIZEDAQDhBAAhkwMAAPYGkwMilQMAAPcGlQMilgMgANkFACGXAwEA4QQAIZgDAQDhBAAhmQOAAAAAAZoDQADYBAAhmwMBAOEEACGcAyAA-AYAIZ0DAQDhBAAhngNAANgEACGfA0AA2AQAIR8EAAD5BgAgBQAA-gYAIAYAAPsGACAdAAD8BgAgHgAA_QYAICAAAP4GACAhAAD_BgAgIgAAgAcAICQAAIIHACCwAgEA1gQAIbYCQADXBAAhzAJAANcEACHaAgEA4QQAIdsCAgDrBAAh3AIBAOEEACH4AkAA2AQAIY8DAQDhBAAhkAMgANkFACGRAwEA4QQAIZMDAAD2BpMDIpUDAAD3BpUDIpYDIADZBQAhlwMBAOEEACGYAwEA4QQAIZkDgAAAAAGaA0AA2AQAIZsDAQDhBAAhnAMgAPgGACGdAwEA4QQAIZ4DQADYBAAhnwNAANgEACEfBAAA7AcAIAUAAO0HACAGAADuBwAgHQAA7wcAIB4AAPAHACAhAADyBwAgIgAA8wcAICMAAPQHACAkAAD1BwAgsAIBAAAAAbYCQAAAAAHMAkAAAAAB2gIBAAAAAdsCAgAAAAHcAgEAAAAB-AJAAAAAAY8DAQAAAAGQAyAAAAABkQMBAAAAAZMDAAAAkwMClQMAAACVAwKWAyAAAAABlwMBAAAAAZgDAQAAAAGZA4AAAAABmgNAAAAAAZsDAQAAAAGcAyAAAAABnQMBAAAAAZ4DQAAAAAGfA0AAAAABAgAAAAEAIDEAAIsJACADAAAADwAgMQAAiwkAIDIAAI8JACAhAAAADwAgBAAA-QYAIAUAAPoGACAGAAD7BgAgHQAA_AYAIB4AAP0GACAhAAD_BgAgIgAAgAcAICMAAIEHACAkAACCBwAgKgAAjwkAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdoCAQDhBAAh2wICAOsEACHcAgEA4QQAIfgCQADYBAAhjwMBAOEEACGQAyAA2QUAIZEDAQDhBAAhkwMAAPYGkwMilQMAAPcGlQMilgMgANkFACGXAwEA4QQAIZgDAQDhBAAhmQOAAAAAAZoDQADYBAAhmwMBAOEEACGcAyAA-AYAIZ0DAQDhBAAhngNAANgEACGfA0AA2AQAIR8EAAD5BgAgBQAA-gYAIAYAAPsGACAdAAD8BgAgHgAA_QYAICEAAP8GACAiAACABwAgIwAAgQcAICQAAIIHACCwAgEA1gQAIbYCQADXBAAhzAJAANcEACHaAgEA4QQAIdsCAgDrBAAh3AIBAOEEACH4AkAA2AQAIY8DAQDhBAAhkAMgANkFACGRAwEA4QQAIZMDAAD2BpMDIpUDAAD3BpUDIpYDIADZBQAhlwMBAOEEACGYAwEA4QQAIZkDgAAAAAGaA0AA2AQAIZsDAQDhBAAhnAMgAPgGACGdAwEA4QQAIZ4DQADYBAAhnwNAANgEACELBAYCBQoDBg4EDAAUHRQFHkwNIFASIVEOIlIPI1MQJFcTAQMAAQEDAAEBAxABAgMAAQcABgwMABERFgcSKQYTKgYUKwcVLgcWLwUYMw0ZNQsaOQ4bPQ8cQhAGBwAGCBgGCRsGDAAMDh8IECULAgoABw0ACQILIAgMAAoBCyEAAgcABg8ABwMJJgAOJwAQKAACBwAGFzQBAgMAAQcABgIDPgEHAAYCAwABB0MGCBNEABVFABZGABhHABlIABpJABtKABxLAAEfAAEBAwABCgRYAAVZAAZaAB1bAB5cACBdACFeACJfACNgACRhAAAAAAUMABk3ABo4ABs5ABw6AB0AAAAAAAUMABk3ABo4ABs5ABw6AB0BAwABAQMAAQMMACI5ACM6ACQAAAADDAAiOQAjOgAkAQMAAQEDAAEDDAApOQAqOgArAAAAAwwAKTkAKjoAKwEDrgEBAQO0AQEDDAAwOQAxOgAyAAAAAwwAMDkAMToAMgEDAAEBAwABBQwANzcAODgAOTkAOjoAOwAAAAAABQwANzcAODgAOTkAOjoAOwMR3AEHEt0BBhTeAQcDEeQBBxLlAQYU5gEHBQwAQDcAQTgAQjkAQzoARAAAAAAABQwAQDcAQTgAQjkAQzoARAEHAAYBBwAGBQwASTcASjgASzkATDoATQAAAAAABQwASTcASjgASzkATDoATQIKAAcNAAkCCgAHDQAJBQwAUjcAUzgAVDkAVToAVgAAAAAABQwAUjcAUzgAVDkAVToAVgIHAAYPAAcCBwAGDwAHBQwAWzcAXDgAXTkAXjoAXwAAAAAABQwAWzcAXDgAXTkAXjoAXwAABQwAZDcAZTgAZjkAZzoAaAAAAAAABQwAZDcAZTgAZjkAZzoAaAIDAAEHAAYCAwABBwAGAwwAbTkAbjoAbwAAAAMMAG05AG46AG8CBwAGF-kCAQIHAAYX7wIBAwwAdDkAdToAdgAAAAMMAHQ5AHU6AHYCAwABBwAGAgMAAQcABgMMAHs5AHw6AH0AAAADDAB7OQB8OgB9AgOXAwEHAAYCA50DAQcABgUMAIIBNwCDATgAhAE5AIUBOgCGAQAAAAAABQwAggE3AIMBOACEATkAhQE6AIYBAgMAAQevAwYCAwABB7UDBgUMAIsBNwCMATgAjQE5AI4BOgCPAQAAAAAABQwAiwE3AIwBOACNATkAjgE6AI8BAR8AAQEfAAEDDACUATkAlQE6AJYBAAAAAwwAlAE5AJUBOgCWASUCASZiASdkAShlASlmAStoASxqFS1rFi5tAS9vFTBwFzNxATRyATVzFTt2GDx3Hj14Aj55Aj96AkB7AkF8AkJ-AkOAARVEgQEfRYMBAkaFARVHhgEgSIcBAkmIAQJKiQEVS4wBIUyNASVNjgEDTo8BA0-QAQNQkQEDUZIBA1KUAQNTlgEVVJcBJlWZAQNWmwEVV5wBJ1idAQNZngEDWp8BFVuiAShcowEsXaQBBF6lAQRfpgEEYKcBBGGoAQRiqgEEY6wBFWStAS1lsAEEZrIBFWezAS5otQEEabYBBGq3ARVrugEvbLsBM228ARNuvQETb74BE3C_ARNxwAETcsIBE3PEARV0xQE0dccBE3bJARV3ygE1eMsBE3nMARN6zQEVe9ABNnzRATx90gEGftMBBn_UAQaAAdUBBoEB1gEGggHYAQaDAdoBFYQB2wE9hQHgAQaGAeIBFYcB4wE-iAHnAQaJAegBBooB6QEViwHsAT-MAe0BRY0B7gEHjgHvAQePAfABB5AB8QEHkQHyAQeSAfQBB5MB9gEVlAH3AUaVAfkBB5YB-wEVlwH8AUeYAf0BB5kB_gEHmgH_ARWbAYICSJwBgwJOnQGEAgieAYUCCJ8BhgIIoAGHAgihAYgCCKIBigIIowGMAhWkAY0CT6UBjwIIpgGRAhWnAZICUKgBkwIIqQGUAgiqAZUCFasBmAJRrAGZAletAZoCC64BmwILrwGcAguwAZ0CC7EBngILsgGgAguzAaICFbQBowJYtQGlAgu2AacCFbcBqAJZuAGpAgu5AaoCC7oBqwIVuwGuAlq8Aa8CYL0BsQIJvgGyAgm_AbUCCcABtgIJwQG3AgnCAbkCCcMBuwIVxAG8AmHFAb4CCcYBwAIVxwHBAmLIAcICCckBwwIJygHEAhXLAccCY8wByAJpzQHJAgXOAcoCBc8BywIF0AHMAgXRAc0CBdIBzwIF0wHRAhXUAdICatUB1AIF1gHWAhXXAdcCa9gB2AIF2QHZAgXaAdoCFdsB3QJs3AHeAnDdAd8CDd4B4AIN3wHhAg3gAeICDeEB4wIN4gHlAg3jAecCFeQB6AJx5QHrAg3mAe0CFecB7gJy6AHwAg3pAfECDeoB8gIV6wH1AnPsAfYCd-0B9wIO7gH4Ag7vAfkCDvAB-gIO8QH7Ag7yAf0CDvMB_wIV9AGAA3j1AYIDDvYBhAMV9wGFA3n4AYYDDvkBhwMO-gGIAxX7AYsDevwBjAN-_QGNAw_-AY4DD_8BjwMPgAKQAw-BApEDD4ICkwMPgwKVAxWEApYDf4UCmQMPhgKbAxWHApwDgAGIAp4DD4kCnwMPigKgAxWLAqMDgQGMAqQDhwGNAqUDEI4CpgMQjwKnAxCQAqgDEJECqQMQkgKrAxCTAq0DFZQCrgOIAZUCsQMQlgKzAxWXArQDiQGYArYDEJkCtwMQmgK4AxWbArsDigGcArwDkAGdAr0DEp4CvgMSnwK_AxKgAsADEqECwQMSogLDAxKjAsUDFaQCxgORAaUCyAMSpgLKAxWnAssDkgGoAswDEqkCzQMSqgLOAxWrAtEDkwGsAtIDlwE" } config.compilerWasm = { getRuntime: async () => require('./query_compiler_fast_bg.js'), diff --git a/apps/modeling-commons-backend/generated/prisma/index-browser.js b/apps/modeling-commons-backend/generated/prisma/index-browser.js index 8b3e809f..336afaf2 100644 --- a/apps/modeling-commons-backend/generated/prisma/index-browser.js +++ b/apps/modeling-commons-backend/generated/prisma/index-browser.js @@ -220,6 +220,7 @@ exports.Prisma.ModelVersionScalarFieldEnum = { versionNumber: 'versionNumber', title: 'title', description: 'description', + changeSummary: 'changeSummary', previewImageFileKey: 'previewImageFileKey', netlogoFileKey: 'netlogoFileKey', netlogoVersion: 'netlogoVersion', @@ -228,13 +229,6 @@ exports.Prisma.ModelVersionScalarFieldEnum = { finalizedAt: 'finalizedAt' }; -exports.Prisma.ModelVersionFileScalarFieldEnum = { - id: 'id', - modelId: 'modelId', - versionNumber: 'versionNumber', - fileKey: 'fileKey' -}; - exports.Prisma.ModelVersionTagScalarFieldEnum = { modelId: 'modelId', versionNumber: 'versionNumber', @@ -247,6 +241,7 @@ exports.Prisma.ModelAdditionalFileScalarFieldEnum = { modelId: 'modelId', taggedVersionNumber: 'taggedVersionNumber', fileKey: 'fileKey', + kind: 'kind', createdAt: 'createdAt' }; @@ -363,6 +358,11 @@ exports.ModelVisibility = exports.$Enums.ModelVisibility = { unlisted: 'unlisted' }; +exports.ModelFileKind = exports.$Enums.ModelFileKind = { + model: 'model', + additional: 'additional' +}; + exports.AuthorRole = exports.$Enums.AuthorRole = { owner: 'owner', contributor: 'contributor' @@ -389,7 +389,6 @@ exports.Prisma.ModelName = { Passkey: 'Passkey', Model: 'Model', ModelVersion: 'ModelVersion', - ModelVersionFile: 'ModelVersionFile', ModelVersionTag: 'ModelVersionTag', ModelAdditionalFile: 'ModelAdditionalFile', Tag: 'Tag', diff --git a/apps/modeling-commons-backend/generated/prisma/index.d.ts b/apps/modeling-commons-backend/generated/prisma/index.d.ts index 487ad5c9..19fb5cd9 100644 --- a/apps/modeling-commons-backend/generated/prisma/index.d.ts +++ b/apps/modeling-commons-backend/generated/prisma/index.d.ts @@ -48,11 +48,6 @@ export type Model = $Result.DefaultSelection * */ export type ModelVersion = $Result.DefaultSelection -/** - * Model ModelVersionFile - * - */ -export type ModelVersionFile = $Result.DefaultSelection /** * Model ModelVersionTag * @@ -157,6 +152,14 @@ export const ModelInteractionKind: { export type ModelInteractionKind = (typeof ModelInteractionKind)[keyof typeof ModelInteractionKind] + +export const ModelFileKind: { + model: 'model', + additional: 'additional' +}; + +export type ModelFileKind = (typeof ModelFileKind)[keyof typeof ModelFileKind] + } export type ModelVisibility = $Enums.ModelVisibility @@ -183,6 +186,10 @@ export type ModelInteractionKind = $Enums.ModelInteractionKind export const ModelInteractionKind: typeof $Enums.ModelInteractionKind +export type ModelFileKind = $Enums.ModelFileKind + +export const ModelFileKind: typeof $Enums.ModelFileKind + /** * ## Prisma Client ʲˢ * @@ -374,16 +381,6 @@ export class PrismaClient< */ get modelVersion(): Prisma.ModelVersionDelegate; - /** - * `prisma.modelVersionFile`: Exposes CRUD operations for the **ModelVersionFile** model. - * Example usage: - * ```ts - * // Fetch zero or more ModelVersionFiles - * const modelVersionFiles = await prisma.modelVersionFile.findMany() - * ``` - */ - get modelVersionFile(): Prisma.ModelVersionFileDelegate; - /** * `prisma.modelVersionTag`: Exposes CRUD operations for the **ModelVersionTag** model. * Example usage: @@ -914,7 +911,6 @@ export namespace Prisma { Passkey: 'Passkey', Model: 'Model', ModelVersion: 'ModelVersion', - ModelVersionFile: 'ModelVersionFile', ModelVersionTag: 'ModelVersionTag', ModelAdditionalFile: 'ModelAdditionalFile', Tag: 'Tag', @@ -939,7 +935,7 @@ export namespace Prisma { omit: GlobalOmitOptions } meta: { - modelProps: "user" | "account" | "session" | "verification" | "passkey" | "model" | "modelVersion" | "modelVersionFile" | "modelVersionTag" | "modelAdditionalFile" | "tag" | "modelAuthor" | "modelPermission" | "modelLike" | "modelInteraction" | "modelDraft" | "event" + modelProps: "user" | "account" | "session" | "verification" | "passkey" | "model" | "modelVersion" | "modelVersionTag" | "modelAdditionalFile" | "tag" | "modelAuthor" | "modelPermission" | "modelLike" | "modelInteraction" | "modelDraft" | "event" txIsolationLevel: Prisma.TransactionIsolationLevel } model: { @@ -1461,80 +1457,6 @@ export namespace Prisma { } } } - ModelVersionFile: { - payload: Prisma.$ModelVersionFilePayload - fields: Prisma.ModelVersionFileFieldRefs - operations: { - findUnique: { - args: Prisma.ModelVersionFileFindUniqueArgs - result: $Utils.PayloadToResult | null - } - findUniqueOrThrow: { - args: Prisma.ModelVersionFileFindUniqueOrThrowArgs - result: $Utils.PayloadToResult - } - findFirst: { - args: Prisma.ModelVersionFileFindFirstArgs - result: $Utils.PayloadToResult | null - } - findFirstOrThrow: { - args: Prisma.ModelVersionFileFindFirstOrThrowArgs - result: $Utils.PayloadToResult - } - findMany: { - args: Prisma.ModelVersionFileFindManyArgs - result: $Utils.PayloadToResult[] - } - create: { - args: Prisma.ModelVersionFileCreateArgs - result: $Utils.PayloadToResult - } - createMany: { - args: Prisma.ModelVersionFileCreateManyArgs - result: BatchPayload - } - createManyAndReturn: { - args: Prisma.ModelVersionFileCreateManyAndReturnArgs - result: $Utils.PayloadToResult[] - } - delete: { - args: Prisma.ModelVersionFileDeleteArgs - result: $Utils.PayloadToResult - } - update: { - args: Prisma.ModelVersionFileUpdateArgs - result: $Utils.PayloadToResult - } - deleteMany: { - args: Prisma.ModelVersionFileDeleteManyArgs - result: BatchPayload - } - updateMany: { - args: Prisma.ModelVersionFileUpdateManyArgs - result: BatchPayload - } - updateManyAndReturn: { - args: Prisma.ModelVersionFileUpdateManyAndReturnArgs - result: $Utils.PayloadToResult[] - } - upsert: { - args: Prisma.ModelVersionFileUpsertArgs - result: $Utils.PayloadToResult - } - aggregate: { - args: Prisma.ModelVersionFileAggregateArgs - result: $Utils.Optional - } - groupBy: { - args: Prisma.ModelVersionFileGroupByArgs - result: $Utils.Optional[] - } - count: { - args: Prisma.ModelVersionFileCountArgs - result: $Utils.Optional | number - } - } - } ModelVersionTag: { payload: Prisma.$ModelVersionTagPayload fields: Prisma.ModelVersionTagFieldRefs @@ -2316,7 +2238,6 @@ export namespace Prisma { passkey?: PasskeyOmit model?: ModelOmit modelVersion?: ModelVersionOmit - modelVersionFile?: ModelVersionFileOmit modelVersionTag?: ModelVersionTagOmit modelAdditionalFile?: ModelAdditionalFileOmit tag?: TagOmit @@ -2613,14 +2534,12 @@ export namespace Prisma { export type ModelVersionCountOutputType = { parentOfModels: number - files: number tags: number taggedAdditionalFiles: number } export type ModelVersionCountOutputTypeSelect = { parentOfModels?: boolean | ModelVersionCountOutputTypeCountParentOfModelsArgs - files?: boolean | ModelVersionCountOutputTypeCountFilesArgs tags?: boolean | ModelVersionCountOutputTypeCountTagsArgs taggedAdditionalFiles?: boolean | ModelVersionCountOutputTypeCountTaggedAdditionalFilesArgs } @@ -2643,13 +2562,6 @@ export namespace Prisma { where?: ModelWhereInput } - /** - * ModelVersionCountOutputType without action - */ - export type ModelVersionCountOutputTypeCountFilesArgs = { - where?: ModelVersionFileWhereInput - } - /** * ModelVersionCountOutputType without action */ @@ -10418,6 +10330,7 @@ export namespace Prisma { versionNumber: number | null title: string | null description: string | null + changeSummary: string | null previewImageFileKey: string | null netlogoFileKey: string | null netlogoVersion: string | null @@ -10431,6 +10344,7 @@ export namespace Prisma { versionNumber: number | null title: string | null description: string | null + changeSummary: string | null previewImageFileKey: string | null netlogoFileKey: string | null netlogoVersion: string | null @@ -10444,6 +10358,7 @@ export namespace Prisma { versionNumber: number title: number description: number + changeSummary: number previewImageFileKey: number netlogoFileKey: number netlogoVersion: number @@ -10467,6 +10382,7 @@ export namespace Prisma { versionNumber?: true title?: true description?: true + changeSummary?: true previewImageFileKey?: true netlogoFileKey?: true netlogoVersion?: true @@ -10480,6 +10396,7 @@ export namespace Prisma { versionNumber?: true title?: true description?: true + changeSummary?: true previewImageFileKey?: true netlogoFileKey?: true netlogoVersion?: true @@ -10493,6 +10410,7 @@ export namespace Prisma { versionNumber?: true title?: true description?: true + changeSummary?: true previewImageFileKey?: true netlogoFileKey?: true netlogoVersion?: true @@ -10593,6 +10511,7 @@ export namespace Prisma { versionNumber: number title: string description: string | null + changeSummary: string | null previewImageFileKey: string | null netlogoFileKey: string netlogoVersion: string | null @@ -10625,6 +10544,7 @@ export namespace Prisma { versionNumber?: boolean title?: boolean description?: boolean + changeSummary?: boolean previewImageFileKey?: boolean netlogoFileKey?: boolean netlogoVersion?: boolean @@ -10634,7 +10554,6 @@ export namespace Prisma { model?: boolean | ModelDefaultArgs latestOfModel?: boolean | ModelVersion$latestOfModelArgs parentOfModels?: boolean | ModelVersion$parentOfModelsArgs - files?: boolean | ModelVersion$filesArgs tags?: boolean | ModelVersion$tagsArgs taggedAdditionalFiles?: boolean | ModelVersion$taggedAdditionalFilesArgs _count?: boolean | ModelVersionCountOutputTypeDefaultArgs @@ -10645,6 +10564,7 @@ export namespace Prisma { versionNumber?: boolean title?: boolean description?: boolean + changeSummary?: boolean previewImageFileKey?: boolean netlogoFileKey?: boolean netlogoVersion?: boolean @@ -10659,6 +10579,7 @@ export namespace Prisma { versionNumber?: boolean title?: boolean description?: boolean + changeSummary?: boolean previewImageFileKey?: boolean netlogoFileKey?: boolean netlogoVersion?: boolean @@ -10673,6 +10594,7 @@ export namespace Prisma { versionNumber?: boolean title?: boolean description?: boolean + changeSummary?: boolean previewImageFileKey?: boolean netlogoFileKey?: boolean netlogoVersion?: boolean @@ -10681,12 +10603,11 @@ export namespace Prisma { finalizedAt?: boolean } - export type ModelVersionOmit = $Extensions.GetOmit<"modelId" | "versionNumber" | "title" | "description" | "previewImageFileKey" | "netlogoFileKey" | "netlogoVersion" | "infoTab" | "createdAt" | "finalizedAt", ExtArgs["result"]["modelVersion"]> + export type ModelVersionOmit = $Extensions.GetOmit<"modelId" | "versionNumber" | "title" | "description" | "changeSummary" | "previewImageFileKey" | "netlogoFileKey" | "netlogoVersion" | "infoTab" | "createdAt" | "finalizedAt", ExtArgs["result"]["modelVersion"]> export type ModelVersionInclude = { model?: boolean | ModelDefaultArgs latestOfModel?: boolean | ModelVersion$latestOfModelArgs parentOfModels?: boolean | ModelVersion$parentOfModelsArgs - files?: boolean | ModelVersion$filesArgs tags?: boolean | ModelVersion$tagsArgs taggedAdditionalFiles?: boolean | ModelVersion$taggedAdditionalFilesArgs _count?: boolean | ModelVersionCountOutputTypeDefaultArgs @@ -10704,7 +10625,6 @@ export namespace Prisma { model: Prisma.$ModelPayload latestOfModel: Prisma.$ModelPayload | null parentOfModels: Prisma.$ModelPayload[] - files: Prisma.$ModelVersionFilePayload[] tags: Prisma.$ModelVersionTagPayload[] taggedAdditionalFiles: Prisma.$ModelAdditionalFilePayload[] } @@ -10713,6 +10633,7 @@ export namespace Prisma { versionNumber: number title: string description: string | null + changeSummary: string | null previewImageFileKey: string | null netlogoFileKey: string netlogoVersion: string | null @@ -11116,7 +11037,6 @@ export namespace Prisma { model = {}>(args?: Subset>): Prisma__ModelClient<$Result.GetResult, T, "findUniqueOrThrow", GlobalOmitOptions> | Null, Null, ExtArgs, GlobalOmitOptions> latestOfModel = {}>(args?: Subset>): Prisma__ModelClient<$Result.GetResult, T, "findUniqueOrThrow", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> parentOfModels = {}>(args?: Subset>): Prisma.PrismaPromise<$Result.GetResult, T, "findMany", GlobalOmitOptions> | Null> - files = {}>(args?: Subset>): Prisma.PrismaPromise<$Result.GetResult, T, "findMany", GlobalOmitOptions> | Null> tags = {}>(args?: Subset>): Prisma.PrismaPromise<$Result.GetResult, T, "findMany", GlobalOmitOptions> | Null> taggedAdditionalFiles = {}>(args?: Subset>): Prisma.PrismaPromise<$Result.GetResult, T, "findMany", GlobalOmitOptions> | Null> /** @@ -11152,6 +11072,7 @@ export namespace Prisma { readonly versionNumber: FieldRef<"ModelVersion", 'Int'> readonly title: FieldRef<"ModelVersion", 'String'> readonly description: FieldRef<"ModelVersion", 'String'> + readonly changeSummary: FieldRef<"ModelVersion", 'String'> readonly previewImageFileKey: FieldRef<"ModelVersion", 'String'> readonly netlogoFileKey: FieldRef<"ModelVersion", 'String'> readonly netlogoVersion: FieldRef<"ModelVersion", 'String'> @@ -11601,30 +11522,6 @@ export namespace Prisma { distinct?: ModelScalarFieldEnum | ModelScalarFieldEnum[] } - /** - * ModelVersion.files - */ - export type ModelVersion$filesArgs = { - /** - * Select specific fields to fetch from the ModelVersionFile - */ - select?: ModelVersionFileSelect | null - /** - * Omit specific fields from the ModelVersionFile - */ - omit?: ModelVersionFileOmit | null - /** - * Choose, which related nodes to fetch as well - */ - include?: ModelVersionFileInclude | null - where?: ModelVersionFileWhereInput - orderBy?: ModelVersionFileOrderByWithRelationInput | ModelVersionFileOrderByWithRelationInput[] - cursor?: ModelVersionFileWhereUniqueInput - take?: number - skip?: number - distinct?: ModelVersionFileScalarFieldEnum | ModelVersionFileScalarFieldEnum[] - } - /** * ModelVersion.tags */ @@ -11693,373 +11590,380 @@ export namespace Prisma { /** - * Model ModelVersionFile + * Model ModelVersionTag */ - export type AggregateModelVersionFile = { - _count: ModelVersionFileCountAggregateOutputType | null - _avg: ModelVersionFileAvgAggregateOutputType | null - _sum: ModelVersionFileSumAggregateOutputType | null - _min: ModelVersionFileMinAggregateOutputType | null - _max: ModelVersionFileMaxAggregateOutputType | null + export type AggregateModelVersionTag = { + _count: ModelVersionTagCountAggregateOutputType | null + _avg: ModelVersionTagAvgAggregateOutputType | null + _sum: ModelVersionTagSumAggregateOutputType | null + _min: ModelVersionTagMinAggregateOutputType | null + _max: ModelVersionTagMaxAggregateOutputType | null } - export type ModelVersionFileAvgAggregateOutputType = { + export type ModelVersionTagAvgAggregateOutputType = { versionNumber: number | null } - export type ModelVersionFileSumAggregateOutputType = { + export type ModelVersionTagSumAggregateOutputType = { versionNumber: number | null } - export type ModelVersionFileMinAggregateOutputType = { - id: string | null + export type ModelVersionTagMinAggregateOutputType = { modelId: string | null versionNumber: number | null - fileKey: string | null + tagId: string | null + createdAt: Date | null } - export type ModelVersionFileMaxAggregateOutputType = { - id: string | null + export type ModelVersionTagMaxAggregateOutputType = { modelId: string | null versionNumber: number | null - fileKey: string | null + tagId: string | null + createdAt: Date | null } - export type ModelVersionFileCountAggregateOutputType = { - id: number + export type ModelVersionTagCountAggregateOutputType = { modelId: number versionNumber: number - fileKey: number + tagId: number + createdAt: number _all: number } - export type ModelVersionFileAvgAggregateInputType = { + export type ModelVersionTagAvgAggregateInputType = { versionNumber?: true } - export type ModelVersionFileSumAggregateInputType = { + export type ModelVersionTagSumAggregateInputType = { versionNumber?: true } - export type ModelVersionFileMinAggregateInputType = { - id?: true + export type ModelVersionTagMinAggregateInputType = { modelId?: true versionNumber?: true - fileKey?: true + tagId?: true + createdAt?: true } - export type ModelVersionFileMaxAggregateInputType = { - id?: true + export type ModelVersionTagMaxAggregateInputType = { modelId?: true versionNumber?: true - fileKey?: true + tagId?: true + createdAt?: true } - export type ModelVersionFileCountAggregateInputType = { - id?: true + export type ModelVersionTagCountAggregateInputType = { modelId?: true versionNumber?: true - fileKey?: true + tagId?: true + createdAt?: true _all?: true } - export type ModelVersionFileAggregateArgs = { + export type ModelVersionTagAggregateArgs = { /** - * Filter which ModelVersionFile to aggregate. + * Filter which ModelVersionTag to aggregate. */ - where?: ModelVersionFileWhereInput + where?: ModelVersionTagWhereInput /** * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} * - * Determine the order of ModelVersionFiles to fetch. + * Determine the order of ModelVersionTags to fetch. */ - orderBy?: ModelVersionFileOrderByWithRelationInput | ModelVersionFileOrderByWithRelationInput[] + orderBy?: ModelVersionTagOrderByWithRelationInput | ModelVersionTagOrderByWithRelationInput[] /** * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} * * Sets the start position */ - cursor?: ModelVersionFileWhereUniqueInput + cursor?: ModelVersionTagWhereUniqueInput /** * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} * - * Take `±n` ModelVersionFiles from the position of the cursor. + * Take `±n` ModelVersionTags from the position of the cursor. */ take?: number /** * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} * - * Skip the first `n` ModelVersionFiles. + * Skip the first `n` ModelVersionTags. */ skip?: number /** * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} * - * Count returned ModelVersionFiles + * Count returned ModelVersionTags **/ - _count?: true | ModelVersionFileCountAggregateInputType + _count?: true | ModelVersionTagCountAggregateInputType /** * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} * * Select which fields to average **/ - _avg?: ModelVersionFileAvgAggregateInputType + _avg?: ModelVersionTagAvgAggregateInputType /** * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} * * Select which fields to sum **/ - _sum?: ModelVersionFileSumAggregateInputType + _sum?: ModelVersionTagSumAggregateInputType /** * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} * * Select which fields to find the minimum value **/ - _min?: ModelVersionFileMinAggregateInputType + _min?: ModelVersionTagMinAggregateInputType /** * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} * * Select which fields to find the maximum value **/ - _max?: ModelVersionFileMaxAggregateInputType + _max?: ModelVersionTagMaxAggregateInputType } - export type GetModelVersionFileAggregateType = { - [P in keyof T & keyof AggregateModelVersionFile]: P extends '_count' | 'count' + export type GetModelVersionTagAggregateType = { + [P in keyof T & keyof AggregateModelVersionTag]: P extends '_count' | 'count' ? T[P] extends true ? number - : GetScalarType - : GetScalarType + : GetScalarType + : GetScalarType } - export type ModelVersionFileGroupByArgs = { - where?: ModelVersionFileWhereInput - orderBy?: ModelVersionFileOrderByWithAggregationInput | ModelVersionFileOrderByWithAggregationInput[] - by: ModelVersionFileScalarFieldEnum[] | ModelVersionFileScalarFieldEnum - having?: ModelVersionFileScalarWhereWithAggregatesInput + export type ModelVersionTagGroupByArgs = { + where?: ModelVersionTagWhereInput + orderBy?: ModelVersionTagOrderByWithAggregationInput | ModelVersionTagOrderByWithAggregationInput[] + by: ModelVersionTagScalarFieldEnum[] | ModelVersionTagScalarFieldEnum + having?: ModelVersionTagScalarWhereWithAggregatesInput take?: number skip?: number - _count?: ModelVersionFileCountAggregateInputType | true - _avg?: ModelVersionFileAvgAggregateInputType - _sum?: ModelVersionFileSumAggregateInputType - _min?: ModelVersionFileMinAggregateInputType - _max?: ModelVersionFileMaxAggregateInputType + _count?: ModelVersionTagCountAggregateInputType | true + _avg?: ModelVersionTagAvgAggregateInputType + _sum?: ModelVersionTagSumAggregateInputType + _min?: ModelVersionTagMinAggregateInputType + _max?: ModelVersionTagMaxAggregateInputType } - export type ModelVersionFileGroupByOutputType = { - id: string + export type ModelVersionTagGroupByOutputType = { modelId: string versionNumber: number - fileKey: string - _count: ModelVersionFileCountAggregateOutputType | null - _avg: ModelVersionFileAvgAggregateOutputType | null - _sum: ModelVersionFileSumAggregateOutputType | null - _min: ModelVersionFileMinAggregateOutputType | null - _max: ModelVersionFileMaxAggregateOutputType | null + tagId: string + createdAt: Date + _count: ModelVersionTagCountAggregateOutputType | null + _avg: ModelVersionTagAvgAggregateOutputType | null + _sum: ModelVersionTagSumAggregateOutputType | null + _min: ModelVersionTagMinAggregateOutputType | null + _max: ModelVersionTagMaxAggregateOutputType | null } - type GetModelVersionFileGroupByPayload = Prisma.PrismaPromise< + type GetModelVersionTagGroupByPayload = Prisma.PrismaPromise< Array< - PickEnumerable & + PickEnumerable & { - [P in ((keyof T) & (keyof ModelVersionFileGroupByOutputType))]: P extends '_count' + [P in ((keyof T) & (keyof ModelVersionTagGroupByOutputType))]: P extends '_count' ? T[P] extends boolean ? number - : GetScalarType - : GetScalarType + : GetScalarType + : GetScalarType } > > - export type ModelVersionFileSelect = $Extensions.GetSelect<{ - id?: boolean + export type ModelVersionTagSelect = $Extensions.GetSelect<{ modelId?: boolean versionNumber?: boolean - fileKey?: boolean + tagId?: boolean + createdAt?: boolean modelVersion?: boolean | ModelVersionDefaultArgs - }, ExtArgs["result"]["modelVersionFile"]> + tag?: boolean | TagDefaultArgs + }, ExtArgs["result"]["modelVersionTag"]> - export type ModelVersionFileSelectCreateManyAndReturn = $Extensions.GetSelect<{ - id?: boolean + export type ModelVersionTagSelectCreateManyAndReturn = $Extensions.GetSelect<{ modelId?: boolean versionNumber?: boolean - fileKey?: boolean + tagId?: boolean + createdAt?: boolean modelVersion?: boolean | ModelVersionDefaultArgs - }, ExtArgs["result"]["modelVersionFile"]> + tag?: boolean | TagDefaultArgs + }, ExtArgs["result"]["modelVersionTag"]> - export type ModelVersionFileSelectUpdateManyAndReturn = $Extensions.GetSelect<{ - id?: boolean + export type ModelVersionTagSelectUpdateManyAndReturn = $Extensions.GetSelect<{ modelId?: boolean versionNumber?: boolean - fileKey?: boolean + tagId?: boolean + createdAt?: boolean modelVersion?: boolean | ModelVersionDefaultArgs - }, ExtArgs["result"]["modelVersionFile"]> + tag?: boolean | TagDefaultArgs + }, ExtArgs["result"]["modelVersionTag"]> - export type ModelVersionFileSelectScalar = { - id?: boolean + export type ModelVersionTagSelectScalar = { modelId?: boolean versionNumber?: boolean - fileKey?: boolean + tagId?: boolean + createdAt?: boolean } - export type ModelVersionFileOmit = $Extensions.GetOmit<"id" | "modelId" | "versionNumber" | "fileKey", ExtArgs["result"]["modelVersionFile"]> - export type ModelVersionFileInclude = { + export type ModelVersionTagOmit = $Extensions.GetOmit<"modelId" | "versionNumber" | "tagId" | "createdAt", ExtArgs["result"]["modelVersionTag"]> + export type ModelVersionTagInclude = { modelVersion?: boolean | ModelVersionDefaultArgs + tag?: boolean | TagDefaultArgs } - export type ModelVersionFileIncludeCreateManyAndReturn = { + export type ModelVersionTagIncludeCreateManyAndReturn = { modelVersion?: boolean | ModelVersionDefaultArgs + tag?: boolean | TagDefaultArgs } - export type ModelVersionFileIncludeUpdateManyAndReturn = { + export type ModelVersionTagIncludeUpdateManyAndReturn = { modelVersion?: boolean | ModelVersionDefaultArgs + tag?: boolean | TagDefaultArgs } - export type $ModelVersionFilePayload = { - name: "ModelVersionFile" + export type $ModelVersionTagPayload = { + name: "ModelVersionTag" objects: { modelVersion: Prisma.$ModelVersionPayload + tag: Prisma.$TagPayload } scalars: $Extensions.GetPayloadResult<{ - id: string modelId: string versionNumber: number - fileKey: string - }, ExtArgs["result"]["modelVersionFile"]> + tagId: string + createdAt: Date + }, ExtArgs["result"]["modelVersionTag"]> composites: {} } - type ModelVersionFileGetPayload = $Result.GetResult + type ModelVersionTagGetPayload = $Result.GetResult - type ModelVersionFileCountArgs = - Omit & { - select?: ModelVersionFileCountAggregateInputType | true + type ModelVersionTagCountArgs = + Omit & { + select?: ModelVersionTagCountAggregateInputType | true } - export interface ModelVersionFileDelegate { - [K: symbol]: { types: Prisma.TypeMap['model']['ModelVersionFile'], meta: { name: 'ModelVersionFile' } } + export interface ModelVersionTagDelegate { + [K: symbol]: { types: Prisma.TypeMap['model']['ModelVersionTag'], meta: { name: 'ModelVersionTag' } } /** - * Find zero or one ModelVersionFile that matches the filter. - * @param {ModelVersionFileFindUniqueArgs} args - Arguments to find a ModelVersionFile + * Find zero or one ModelVersionTag that matches the filter. + * @param {ModelVersionTagFindUniqueArgs} args - Arguments to find a ModelVersionTag * @example - * // Get one ModelVersionFile - * const modelVersionFile = await prisma.modelVersionFile.findUnique({ + * // Get one ModelVersionTag + * const modelVersionTag = await prisma.modelVersionTag.findUnique({ * where: { * // ... provide filter here * } * }) */ - findUnique(args: SelectSubset>): Prisma__ModelVersionFileClient<$Result.GetResult, T, "findUnique", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + findUnique(args: SelectSubset>): Prisma__ModelVersionTagClient<$Result.GetResult, T, "findUnique", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> /** - * Find one ModelVersionFile that matches the filter or throw an error with `error.code='P2025'` + * Find one ModelVersionTag that matches the filter or throw an error with `error.code='P2025'` * if no matches were found. - * @param {ModelVersionFileFindUniqueOrThrowArgs} args - Arguments to find a ModelVersionFile + * @param {ModelVersionTagFindUniqueOrThrowArgs} args - Arguments to find a ModelVersionTag * @example - * // Get one ModelVersionFile - * const modelVersionFile = await prisma.modelVersionFile.findUniqueOrThrow({ + * // Get one ModelVersionTag + * const modelVersionTag = await prisma.modelVersionTag.findUniqueOrThrow({ * where: { * // ... provide filter here * } * }) */ - findUniqueOrThrow(args: SelectSubset>): Prisma__ModelVersionFileClient<$Result.GetResult, T, "findUniqueOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + findUniqueOrThrow(args: SelectSubset>): Prisma__ModelVersionTagClient<$Result.GetResult, T, "findUniqueOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> /** - * Find the first ModelVersionFile that matches the filter. + * Find the first ModelVersionTag that matches the filter. * Note, that providing `undefined` is treated as the value not being there. * Read more here: https://pris.ly/d/null-undefined - * @param {ModelVersionFileFindFirstArgs} args - Arguments to find a ModelVersionFile + * @param {ModelVersionTagFindFirstArgs} args - Arguments to find a ModelVersionTag * @example - * // Get one ModelVersionFile - * const modelVersionFile = await prisma.modelVersionFile.findFirst({ + * // Get one ModelVersionTag + * const modelVersionTag = await prisma.modelVersionTag.findFirst({ * where: { * // ... provide filter here * } * }) */ - findFirst(args?: SelectSubset>): Prisma__ModelVersionFileClient<$Result.GetResult, T, "findFirst", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + findFirst(args?: SelectSubset>): Prisma__ModelVersionTagClient<$Result.GetResult, T, "findFirst", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> /** - * Find the first ModelVersionFile that matches the filter or + * Find the first ModelVersionTag that matches the filter or * throw `PrismaKnownClientError` with `P2025` code if no matches were found. * Note, that providing `undefined` is treated as the value not being there. * Read more here: https://pris.ly/d/null-undefined - * @param {ModelVersionFileFindFirstOrThrowArgs} args - Arguments to find a ModelVersionFile + * @param {ModelVersionTagFindFirstOrThrowArgs} args - Arguments to find a ModelVersionTag * @example - * // Get one ModelVersionFile - * const modelVersionFile = await prisma.modelVersionFile.findFirstOrThrow({ + * // Get one ModelVersionTag + * const modelVersionTag = await prisma.modelVersionTag.findFirstOrThrow({ * where: { * // ... provide filter here * } * }) */ - findFirstOrThrow(args?: SelectSubset>): Prisma__ModelVersionFileClient<$Result.GetResult, T, "findFirstOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + findFirstOrThrow(args?: SelectSubset>): Prisma__ModelVersionTagClient<$Result.GetResult, T, "findFirstOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> /** - * Find zero or more ModelVersionFiles that matches the filter. + * Find zero or more ModelVersionTags that matches the filter. * Note, that providing `undefined` is treated as the value not being there. * Read more here: https://pris.ly/d/null-undefined - * @param {ModelVersionFileFindManyArgs} args - Arguments to filter and select certain fields only. + * @param {ModelVersionTagFindManyArgs} args - Arguments to filter and select certain fields only. * @example - * // Get all ModelVersionFiles - * const modelVersionFiles = await prisma.modelVersionFile.findMany() + * // Get all ModelVersionTags + * const modelVersionTags = await prisma.modelVersionTag.findMany() * - * // Get first 10 ModelVersionFiles - * const modelVersionFiles = await prisma.modelVersionFile.findMany({ take: 10 }) + * // Get first 10 ModelVersionTags + * const modelVersionTags = await prisma.modelVersionTag.findMany({ take: 10 }) * - * // Only select the `id` - * const modelVersionFileWithIdOnly = await prisma.modelVersionFile.findMany({ select: { id: true } }) + * // Only select the `modelId` + * const modelVersionTagWithModelIdOnly = await prisma.modelVersionTag.findMany({ select: { modelId: true } }) * */ - findMany(args?: SelectSubset>): Prisma.PrismaPromise<$Result.GetResult, T, "findMany", GlobalOmitOptions>> + findMany(args?: SelectSubset>): Prisma.PrismaPromise<$Result.GetResult, T, "findMany", GlobalOmitOptions>> /** - * Create a ModelVersionFile. - * @param {ModelVersionFileCreateArgs} args - Arguments to create a ModelVersionFile. + * Create a ModelVersionTag. + * @param {ModelVersionTagCreateArgs} args - Arguments to create a ModelVersionTag. * @example - * // Create one ModelVersionFile - * const ModelVersionFile = await prisma.modelVersionFile.create({ + * // Create one ModelVersionTag + * const ModelVersionTag = await prisma.modelVersionTag.create({ * data: { - * // ... data to create a ModelVersionFile + * // ... data to create a ModelVersionTag * } * }) * */ - create(args: SelectSubset>): Prisma__ModelVersionFileClient<$Result.GetResult, T, "create", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + create(args: SelectSubset>): Prisma__ModelVersionTagClient<$Result.GetResult, T, "create", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> /** - * Create many ModelVersionFiles. - * @param {ModelVersionFileCreateManyArgs} args - Arguments to create many ModelVersionFiles. + * Create many ModelVersionTags. + * @param {ModelVersionTagCreateManyArgs} args - Arguments to create many ModelVersionTags. * @example - * // Create many ModelVersionFiles - * const modelVersionFile = await prisma.modelVersionFile.createMany({ + * // Create many ModelVersionTags + * const modelVersionTag = await prisma.modelVersionTag.createMany({ * data: [ * // ... provide data here * ] * }) * */ - createMany(args?: SelectSubset>): Prisma.PrismaPromise + createMany(args?: SelectSubset>): Prisma.PrismaPromise /** - * Create many ModelVersionFiles and returns the data saved in the database. - * @param {ModelVersionFileCreateManyAndReturnArgs} args - Arguments to create many ModelVersionFiles. + * Create many ModelVersionTags and returns the data saved in the database. + * @param {ModelVersionTagCreateManyAndReturnArgs} args - Arguments to create many ModelVersionTags. * @example - * // Create many ModelVersionFiles - * const modelVersionFile = await prisma.modelVersionFile.createManyAndReturn({ + * // Create many ModelVersionTags + * const modelVersionTag = await prisma.modelVersionTag.createManyAndReturn({ * data: [ * // ... provide data here * ] * }) * - * // Create many ModelVersionFiles and only return the `id` - * const modelVersionFileWithIdOnly = await prisma.modelVersionFile.createManyAndReturn({ - * select: { id: true }, + * // Create many ModelVersionTags and only return the `modelId` + * const modelVersionTagWithModelIdOnly = await prisma.modelVersionTag.createManyAndReturn({ + * select: { modelId: true }, * data: [ * // ... provide data here * ] @@ -12068,28 +11972,28 @@ export namespace Prisma { * Read more here: https://pris.ly/d/null-undefined * */ - createManyAndReturn(args?: SelectSubset>): Prisma.PrismaPromise<$Result.GetResult, T, "createManyAndReturn", GlobalOmitOptions>> + createManyAndReturn(args?: SelectSubset>): Prisma.PrismaPromise<$Result.GetResult, T, "createManyAndReturn", GlobalOmitOptions>> /** - * Delete a ModelVersionFile. - * @param {ModelVersionFileDeleteArgs} args - Arguments to delete one ModelVersionFile. + * Delete a ModelVersionTag. + * @param {ModelVersionTagDeleteArgs} args - Arguments to delete one ModelVersionTag. * @example - * // Delete one ModelVersionFile - * const ModelVersionFile = await prisma.modelVersionFile.delete({ + * // Delete one ModelVersionTag + * const ModelVersionTag = await prisma.modelVersionTag.delete({ * where: { - * // ... filter to delete one ModelVersionFile + * // ... filter to delete one ModelVersionTag * } * }) * */ - delete(args: SelectSubset>): Prisma__ModelVersionFileClient<$Result.GetResult, T, "delete", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + delete(args: SelectSubset>): Prisma__ModelVersionTagClient<$Result.GetResult, T, "delete", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> /** - * Update one ModelVersionFile. - * @param {ModelVersionFileUpdateArgs} args - Arguments to update one ModelVersionFile. + * Update one ModelVersionTag. + * @param {ModelVersionTagUpdateArgs} args - Arguments to update one ModelVersionTag. * @example - * // Update one ModelVersionFile - * const modelVersionFile = await prisma.modelVersionFile.update({ + * // Update one ModelVersionTag + * const modelVersionTag = await prisma.modelVersionTag.update({ * where: { * // ... provide filter here * }, @@ -12099,30 +12003,30 @@ export namespace Prisma { * }) * */ - update(args: SelectSubset>): Prisma__ModelVersionFileClient<$Result.GetResult, T, "update", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + update(args: SelectSubset>): Prisma__ModelVersionTagClient<$Result.GetResult, T, "update", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> /** - * Delete zero or more ModelVersionFiles. - * @param {ModelVersionFileDeleteManyArgs} args - Arguments to filter ModelVersionFiles to delete. + * Delete zero or more ModelVersionTags. + * @param {ModelVersionTagDeleteManyArgs} args - Arguments to filter ModelVersionTags to delete. * @example - * // Delete a few ModelVersionFiles - * const { count } = await prisma.modelVersionFile.deleteMany({ + * // Delete a few ModelVersionTags + * const { count } = await prisma.modelVersionTag.deleteMany({ * where: { * // ... provide filter here * } * }) * */ - deleteMany(args?: SelectSubset>): Prisma.PrismaPromise + deleteMany(args?: SelectSubset>): Prisma.PrismaPromise /** - * Update zero or more ModelVersionFiles. + * Update zero or more ModelVersionTags. * Note, that providing `undefined` is treated as the value not being there. * Read more here: https://pris.ly/d/null-undefined - * @param {ModelVersionFileUpdateManyArgs} args - Arguments to update one or more rows. + * @param {ModelVersionTagUpdateManyArgs} args - Arguments to update one or more rows. * @example - * // Update many ModelVersionFiles - * const modelVersionFile = await prisma.modelVersionFile.updateMany({ + * // Update many ModelVersionTags + * const modelVersionTag = await prisma.modelVersionTag.updateMany({ * where: { * // ... provide filter here * }, @@ -12132,14 +12036,14 @@ export namespace Prisma { * }) * */ - updateMany(args: SelectSubset>): Prisma.PrismaPromise + updateMany(args: SelectSubset>): Prisma.PrismaPromise /** - * Update zero or more ModelVersionFiles and returns the data updated in the database. - * @param {ModelVersionFileUpdateManyAndReturnArgs} args - Arguments to update many ModelVersionFiles. + * Update zero or more ModelVersionTags and returns the data updated in the database. + * @param {ModelVersionTagUpdateManyAndReturnArgs} args - Arguments to update many ModelVersionTags. * @example - * // Update many ModelVersionFiles - * const modelVersionFile = await prisma.modelVersionFile.updateManyAndReturn({ + * // Update many ModelVersionTags + * const modelVersionTag = await prisma.modelVersionTag.updateManyAndReturn({ * where: { * // ... provide filter here * }, @@ -12148,9 +12052,9 @@ export namespace Prisma { * ] * }) * - * // Update zero or more ModelVersionFiles and only return the `id` - * const modelVersionFileWithIdOnly = await prisma.modelVersionFile.updateManyAndReturn({ - * select: { id: true }, + * // Update zero or more ModelVersionTags and only return the `modelId` + * const modelVersionTagWithModelIdOnly = await prisma.modelVersionTag.updateManyAndReturn({ + * select: { modelId: true }, * where: { * // ... provide filter here * }, @@ -12162,56 +12066,56 @@ export namespace Prisma { * Read more here: https://pris.ly/d/null-undefined * */ - updateManyAndReturn(args: SelectSubset>): Prisma.PrismaPromise<$Result.GetResult, T, "updateManyAndReturn", GlobalOmitOptions>> + updateManyAndReturn(args: SelectSubset>): Prisma.PrismaPromise<$Result.GetResult, T, "updateManyAndReturn", GlobalOmitOptions>> /** - * Create or update one ModelVersionFile. - * @param {ModelVersionFileUpsertArgs} args - Arguments to update or create a ModelVersionFile. + * Create or update one ModelVersionTag. + * @param {ModelVersionTagUpsertArgs} args - Arguments to update or create a ModelVersionTag. * @example - * // Update or create a ModelVersionFile - * const modelVersionFile = await prisma.modelVersionFile.upsert({ + * // Update or create a ModelVersionTag + * const modelVersionTag = await prisma.modelVersionTag.upsert({ * create: { - * // ... data to create a ModelVersionFile + * // ... data to create a ModelVersionTag * }, * update: { * // ... in case it already exists, update * }, * where: { - * // ... the filter for the ModelVersionFile we want to update + * // ... the filter for the ModelVersionTag we want to update * } * }) */ - upsert(args: SelectSubset>): Prisma__ModelVersionFileClient<$Result.GetResult, T, "upsert", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + upsert(args: SelectSubset>): Prisma__ModelVersionTagClient<$Result.GetResult, T, "upsert", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> /** - * Count the number of ModelVersionFiles. + * Count the number of ModelVersionTags. * Note, that providing `undefined` is treated as the value not being there. * Read more here: https://pris.ly/d/null-undefined - * @param {ModelVersionFileCountArgs} args - Arguments to filter ModelVersionFiles to count. + * @param {ModelVersionTagCountArgs} args - Arguments to filter ModelVersionTags to count. * @example - * // Count the number of ModelVersionFiles - * const count = await prisma.modelVersionFile.count({ + * // Count the number of ModelVersionTags + * const count = await prisma.modelVersionTag.count({ * where: { - * // ... the filter for the ModelVersionFiles we want to count + * // ... the filter for the ModelVersionTags we want to count * } * }) **/ - count( - args?: Subset, + count( + args?: Subset, ): Prisma.PrismaPromise< T extends $Utils.Record<'select', any> ? T['select'] extends true ? number - : GetScalarType + : GetScalarType : number > /** - * Allows you to perform aggregations operations on a ModelVersionFile. + * Allows you to perform aggregations operations on a ModelVersionTag. * Note, that providing `undefined` is treated as the value not being there. * Read more here: https://pris.ly/d/null-undefined - * @param {ModelVersionFileAggregateArgs} args - Select which aggregations you would like to apply and on what fields. + * @param {ModelVersionTagAggregateArgs} args - Select which aggregations you would like to apply and on what fields. * @example * // Ordered by age ascending * // Where email contains prisma.io @@ -12231,13 +12135,13 @@ export namespace Prisma { * take: 10, * }) **/ - aggregate(args: Subset): Prisma.PrismaPromise> + aggregate(args: Subset): Prisma.PrismaPromise> /** - * Group by ModelVersionFile. + * Group by ModelVersionTag. * Note, that providing `undefined` is treated as the value not being there. * Read more here: https://pris.ly/d/null-undefined - * @param {ModelVersionFileGroupByArgs} args - Group by arguments. + * @param {ModelVersionTagGroupByArgs} args - Group by arguments. * @example * // Group by city, order by createdAt, get count * const result = await prisma.user.groupBy({ @@ -12252,1105 +12156,14 @@ export namespace Prisma { * **/ groupBy< - T extends ModelVersionFileGroupByArgs, + T extends ModelVersionTagGroupByArgs, HasSelectOrTake extends Or< Extends<'skip', Keys>, Extends<'take', Keys> >, OrderByArg extends True extends HasSelectOrTake - ? { orderBy: ModelVersionFileGroupByArgs['orderBy'] } - : { orderBy?: ModelVersionFileGroupByArgs['orderBy'] }, - OrderFields extends ExcludeUnderscoreKeys>>, - ByFields extends MaybeTupleToUnion, - ByValid extends Has, - HavingFields extends GetHavingFields, - HavingValid extends Has, - ByEmpty extends T['by'] extends never[] ? True : False, - InputErrors extends ByEmpty extends True - ? `Error: "by" must not be empty.` - : HavingValid extends False - ? { - [P in HavingFields]: P extends ByFields - ? never - : P extends string - ? `Error: Field "${P}" used in "having" needs to be provided in "by".` - : [ - Error, - 'Field ', - P, - ` in "having" needs to be provided in "by"`, - ] - }[HavingFields] - : 'take' extends Keys - ? 'orderBy' extends Keys - ? ByValid extends True - ? {} - : { - [P in OrderFields]: P extends ByFields - ? never - : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` - }[OrderFields] - : 'Error: If you provide "take", you also need to provide "orderBy"' - : 'skip' extends Keys - ? 'orderBy' extends Keys - ? ByValid extends True - ? {} - : { - [P in OrderFields]: P extends ByFields - ? never - : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` - }[OrderFields] - : 'Error: If you provide "skip", you also need to provide "orderBy"' - : ByValid extends True - ? {} - : { - [P in OrderFields]: P extends ByFields - ? never - : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` - }[OrderFields] - >(args: SubsetIntersection & InputErrors): {} extends InputErrors ? GetModelVersionFileGroupByPayload : Prisma.PrismaPromise - /** - * Fields of the ModelVersionFile model - */ - readonly fields: ModelVersionFileFieldRefs; - } - - /** - * The delegate class that acts as a "Promise-like" for ModelVersionFile. - * Why is this prefixed with `Prisma__`? - * Because we want to prevent naming conflicts as mentioned in - * https://github.com/prisma/prisma-client-js/issues/707 - */ - export interface Prisma__ModelVersionFileClient extends Prisma.PrismaPromise { - readonly [Symbol.toStringTag]: "PrismaPromise" - modelVersion = {}>(args?: Subset>): Prisma__ModelVersionClient<$Result.GetResult, T, "findUniqueOrThrow", GlobalOmitOptions> | Null, Null, ExtArgs, GlobalOmitOptions> - /** - * Attaches callbacks for the resolution and/or rejection of the Promise. - * @param onfulfilled The callback to execute when the Promise is resolved. - * @param onrejected The callback to execute when the Promise is rejected. - * @returns A Promise for the completion of which ever callback is executed. - */ - then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): $Utils.JsPromise - /** - * Attaches a callback for only the rejection of the Promise. - * @param onrejected The callback to execute when the Promise is rejected. - * @returns A Promise for the completion of the callback. - */ - catch(onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): $Utils.JsPromise - /** - * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The - * resolved value cannot be modified from the callback. - * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected). - * @returns A Promise for the completion of the callback. - */ - finally(onfinally?: (() => void) | undefined | null): $Utils.JsPromise - } - - - - - /** - * Fields of the ModelVersionFile model - */ - interface ModelVersionFileFieldRefs { - readonly id: FieldRef<"ModelVersionFile", 'String'> - readonly modelId: FieldRef<"ModelVersionFile", 'String'> - readonly versionNumber: FieldRef<"ModelVersionFile", 'Int'> - readonly fileKey: FieldRef<"ModelVersionFile", 'String'> - } - - - // Custom InputTypes - /** - * ModelVersionFile findUnique - */ - export type ModelVersionFileFindUniqueArgs = { - /** - * Select specific fields to fetch from the ModelVersionFile - */ - select?: ModelVersionFileSelect | null - /** - * Omit specific fields from the ModelVersionFile - */ - omit?: ModelVersionFileOmit | null - /** - * Choose, which related nodes to fetch as well - */ - include?: ModelVersionFileInclude | null - /** - * Filter, which ModelVersionFile to fetch. - */ - where: ModelVersionFileWhereUniqueInput - } - - /** - * ModelVersionFile findUniqueOrThrow - */ - export type ModelVersionFileFindUniqueOrThrowArgs = { - /** - * Select specific fields to fetch from the ModelVersionFile - */ - select?: ModelVersionFileSelect | null - /** - * Omit specific fields from the ModelVersionFile - */ - omit?: ModelVersionFileOmit | null - /** - * Choose, which related nodes to fetch as well - */ - include?: ModelVersionFileInclude | null - /** - * Filter, which ModelVersionFile to fetch. - */ - where: ModelVersionFileWhereUniqueInput - } - - /** - * ModelVersionFile findFirst - */ - export type ModelVersionFileFindFirstArgs = { - /** - * Select specific fields to fetch from the ModelVersionFile - */ - select?: ModelVersionFileSelect | null - /** - * Omit specific fields from the ModelVersionFile - */ - omit?: ModelVersionFileOmit | null - /** - * Choose, which related nodes to fetch as well - */ - include?: ModelVersionFileInclude | null - /** - * Filter, which ModelVersionFile to fetch. - */ - where?: ModelVersionFileWhereInput - /** - * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} - * - * Determine the order of ModelVersionFiles to fetch. - */ - orderBy?: ModelVersionFileOrderByWithRelationInput | ModelVersionFileOrderByWithRelationInput[] - /** - * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} - * - * Sets the position for searching for ModelVersionFiles. - */ - cursor?: ModelVersionFileWhereUniqueInput - /** - * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} - * - * Take `±n` ModelVersionFiles from the position of the cursor. - */ - take?: number - /** - * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} - * - * Skip the first `n` ModelVersionFiles. - */ - skip?: number - /** - * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} - * - * Filter by unique combinations of ModelVersionFiles. - */ - distinct?: ModelVersionFileScalarFieldEnum | ModelVersionFileScalarFieldEnum[] - } - - /** - * ModelVersionFile findFirstOrThrow - */ - export type ModelVersionFileFindFirstOrThrowArgs = { - /** - * Select specific fields to fetch from the ModelVersionFile - */ - select?: ModelVersionFileSelect | null - /** - * Omit specific fields from the ModelVersionFile - */ - omit?: ModelVersionFileOmit | null - /** - * Choose, which related nodes to fetch as well - */ - include?: ModelVersionFileInclude | null - /** - * Filter, which ModelVersionFile to fetch. - */ - where?: ModelVersionFileWhereInput - /** - * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} - * - * Determine the order of ModelVersionFiles to fetch. - */ - orderBy?: ModelVersionFileOrderByWithRelationInput | ModelVersionFileOrderByWithRelationInput[] - /** - * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} - * - * Sets the position for searching for ModelVersionFiles. - */ - cursor?: ModelVersionFileWhereUniqueInput - /** - * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} - * - * Take `±n` ModelVersionFiles from the position of the cursor. - */ - take?: number - /** - * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} - * - * Skip the first `n` ModelVersionFiles. - */ - skip?: number - /** - * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} - * - * Filter by unique combinations of ModelVersionFiles. - */ - distinct?: ModelVersionFileScalarFieldEnum | ModelVersionFileScalarFieldEnum[] - } - - /** - * ModelVersionFile findMany - */ - export type ModelVersionFileFindManyArgs = { - /** - * Select specific fields to fetch from the ModelVersionFile - */ - select?: ModelVersionFileSelect | null - /** - * Omit specific fields from the ModelVersionFile - */ - omit?: ModelVersionFileOmit | null - /** - * Choose, which related nodes to fetch as well - */ - include?: ModelVersionFileInclude | null - /** - * Filter, which ModelVersionFiles to fetch. - */ - where?: ModelVersionFileWhereInput - /** - * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} - * - * Determine the order of ModelVersionFiles to fetch. - */ - orderBy?: ModelVersionFileOrderByWithRelationInput | ModelVersionFileOrderByWithRelationInput[] - /** - * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} - * - * Sets the position for listing ModelVersionFiles. - */ - cursor?: ModelVersionFileWhereUniqueInput - /** - * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} - * - * Take `±n` ModelVersionFiles from the position of the cursor. - */ - take?: number - /** - * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} - * - * Skip the first `n` ModelVersionFiles. - */ - skip?: number - /** - * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} - * - * Filter by unique combinations of ModelVersionFiles. - */ - distinct?: ModelVersionFileScalarFieldEnum | ModelVersionFileScalarFieldEnum[] - } - - /** - * ModelVersionFile create - */ - export type ModelVersionFileCreateArgs = { - /** - * Select specific fields to fetch from the ModelVersionFile - */ - select?: ModelVersionFileSelect | null - /** - * Omit specific fields from the ModelVersionFile - */ - omit?: ModelVersionFileOmit | null - /** - * Choose, which related nodes to fetch as well - */ - include?: ModelVersionFileInclude | null - /** - * The data needed to create a ModelVersionFile. - */ - data: XOR - } - - /** - * ModelVersionFile createMany - */ - export type ModelVersionFileCreateManyArgs = { - /** - * The data used to create many ModelVersionFiles. - */ - data: ModelVersionFileCreateManyInput | ModelVersionFileCreateManyInput[] - skipDuplicates?: boolean - } - - /** - * ModelVersionFile createManyAndReturn - */ - export type ModelVersionFileCreateManyAndReturnArgs = { - /** - * Select specific fields to fetch from the ModelVersionFile - */ - select?: ModelVersionFileSelectCreateManyAndReturn | null - /** - * Omit specific fields from the ModelVersionFile - */ - omit?: ModelVersionFileOmit | null - /** - * The data used to create many ModelVersionFiles. - */ - data: ModelVersionFileCreateManyInput | ModelVersionFileCreateManyInput[] - skipDuplicates?: boolean - /** - * Choose, which related nodes to fetch as well - */ - include?: ModelVersionFileIncludeCreateManyAndReturn | null - } - - /** - * ModelVersionFile update - */ - export type ModelVersionFileUpdateArgs = { - /** - * Select specific fields to fetch from the ModelVersionFile - */ - select?: ModelVersionFileSelect | null - /** - * Omit specific fields from the ModelVersionFile - */ - omit?: ModelVersionFileOmit | null - /** - * Choose, which related nodes to fetch as well - */ - include?: ModelVersionFileInclude | null - /** - * The data needed to update a ModelVersionFile. - */ - data: XOR - /** - * Choose, which ModelVersionFile to update. - */ - where: ModelVersionFileWhereUniqueInput - } - - /** - * ModelVersionFile updateMany - */ - export type ModelVersionFileUpdateManyArgs = { - /** - * The data used to update ModelVersionFiles. - */ - data: XOR - /** - * Filter which ModelVersionFiles to update - */ - where?: ModelVersionFileWhereInput - /** - * Limit how many ModelVersionFiles to update. - */ - limit?: number - } - - /** - * ModelVersionFile updateManyAndReturn - */ - export type ModelVersionFileUpdateManyAndReturnArgs = { - /** - * Select specific fields to fetch from the ModelVersionFile - */ - select?: ModelVersionFileSelectUpdateManyAndReturn | null - /** - * Omit specific fields from the ModelVersionFile - */ - omit?: ModelVersionFileOmit | null - /** - * The data used to update ModelVersionFiles. - */ - data: XOR - /** - * Filter which ModelVersionFiles to update - */ - where?: ModelVersionFileWhereInput - /** - * Limit how many ModelVersionFiles to update. - */ - limit?: number - /** - * Choose, which related nodes to fetch as well - */ - include?: ModelVersionFileIncludeUpdateManyAndReturn | null - } - - /** - * ModelVersionFile upsert - */ - export type ModelVersionFileUpsertArgs = { - /** - * Select specific fields to fetch from the ModelVersionFile - */ - select?: ModelVersionFileSelect | null - /** - * Omit specific fields from the ModelVersionFile - */ - omit?: ModelVersionFileOmit | null - /** - * Choose, which related nodes to fetch as well - */ - include?: ModelVersionFileInclude | null - /** - * The filter to search for the ModelVersionFile to update in case it exists. - */ - where: ModelVersionFileWhereUniqueInput - /** - * In case the ModelVersionFile found by the `where` argument doesn't exist, create a new ModelVersionFile with this data. - */ - create: XOR - /** - * In case the ModelVersionFile was found with the provided `where` argument, update it with this data. - */ - update: XOR - } - - /** - * ModelVersionFile delete - */ - export type ModelVersionFileDeleteArgs = { - /** - * Select specific fields to fetch from the ModelVersionFile - */ - select?: ModelVersionFileSelect | null - /** - * Omit specific fields from the ModelVersionFile - */ - omit?: ModelVersionFileOmit | null - /** - * Choose, which related nodes to fetch as well - */ - include?: ModelVersionFileInclude | null - /** - * Filter which ModelVersionFile to delete. - */ - where: ModelVersionFileWhereUniqueInput - } - - /** - * ModelVersionFile deleteMany - */ - export type ModelVersionFileDeleteManyArgs = { - /** - * Filter which ModelVersionFiles to delete - */ - where?: ModelVersionFileWhereInput - /** - * Limit how many ModelVersionFiles to delete. - */ - limit?: number - } - - /** - * ModelVersionFile without action - */ - export type ModelVersionFileDefaultArgs = { - /** - * Select specific fields to fetch from the ModelVersionFile - */ - select?: ModelVersionFileSelect | null - /** - * Omit specific fields from the ModelVersionFile - */ - omit?: ModelVersionFileOmit | null - /** - * Choose, which related nodes to fetch as well - */ - include?: ModelVersionFileInclude | null - } - - - /** - * Model ModelVersionTag - */ - - export type AggregateModelVersionTag = { - _count: ModelVersionTagCountAggregateOutputType | null - _avg: ModelVersionTagAvgAggregateOutputType | null - _sum: ModelVersionTagSumAggregateOutputType | null - _min: ModelVersionTagMinAggregateOutputType | null - _max: ModelVersionTagMaxAggregateOutputType | null - } - - export type ModelVersionTagAvgAggregateOutputType = { - versionNumber: number | null - } - - export type ModelVersionTagSumAggregateOutputType = { - versionNumber: number | null - } - - export type ModelVersionTagMinAggregateOutputType = { - modelId: string | null - versionNumber: number | null - tagId: string | null - createdAt: Date | null - } - - export type ModelVersionTagMaxAggregateOutputType = { - modelId: string | null - versionNumber: number | null - tagId: string | null - createdAt: Date | null - } - - export type ModelVersionTagCountAggregateOutputType = { - modelId: number - versionNumber: number - tagId: number - createdAt: number - _all: number - } - - - export type ModelVersionTagAvgAggregateInputType = { - versionNumber?: true - } - - export type ModelVersionTagSumAggregateInputType = { - versionNumber?: true - } - - export type ModelVersionTagMinAggregateInputType = { - modelId?: true - versionNumber?: true - tagId?: true - createdAt?: true - } - - export type ModelVersionTagMaxAggregateInputType = { - modelId?: true - versionNumber?: true - tagId?: true - createdAt?: true - } - - export type ModelVersionTagCountAggregateInputType = { - modelId?: true - versionNumber?: true - tagId?: true - createdAt?: true - _all?: true - } - - export type ModelVersionTagAggregateArgs = { - /** - * Filter which ModelVersionTag to aggregate. - */ - where?: ModelVersionTagWhereInput - /** - * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} - * - * Determine the order of ModelVersionTags to fetch. - */ - orderBy?: ModelVersionTagOrderByWithRelationInput | ModelVersionTagOrderByWithRelationInput[] - /** - * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} - * - * Sets the start position - */ - cursor?: ModelVersionTagWhereUniqueInput - /** - * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} - * - * Take `±n` ModelVersionTags from the position of the cursor. - */ - take?: number - /** - * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} - * - * Skip the first `n` ModelVersionTags. - */ - skip?: number - /** - * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} - * - * Count returned ModelVersionTags - **/ - _count?: true | ModelVersionTagCountAggregateInputType - /** - * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} - * - * Select which fields to average - **/ - _avg?: ModelVersionTagAvgAggregateInputType - /** - * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} - * - * Select which fields to sum - **/ - _sum?: ModelVersionTagSumAggregateInputType - /** - * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} - * - * Select which fields to find the minimum value - **/ - _min?: ModelVersionTagMinAggregateInputType - /** - * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} - * - * Select which fields to find the maximum value - **/ - _max?: ModelVersionTagMaxAggregateInputType - } - - export type GetModelVersionTagAggregateType = { - [P in keyof T & keyof AggregateModelVersionTag]: P extends '_count' | 'count' - ? T[P] extends true - ? number - : GetScalarType - : GetScalarType - } - - - - - export type ModelVersionTagGroupByArgs = { - where?: ModelVersionTagWhereInput - orderBy?: ModelVersionTagOrderByWithAggregationInput | ModelVersionTagOrderByWithAggregationInput[] - by: ModelVersionTagScalarFieldEnum[] | ModelVersionTagScalarFieldEnum - having?: ModelVersionTagScalarWhereWithAggregatesInput - take?: number - skip?: number - _count?: ModelVersionTagCountAggregateInputType | true - _avg?: ModelVersionTagAvgAggregateInputType - _sum?: ModelVersionTagSumAggregateInputType - _min?: ModelVersionTagMinAggregateInputType - _max?: ModelVersionTagMaxAggregateInputType - } - - export type ModelVersionTagGroupByOutputType = { - modelId: string - versionNumber: number - tagId: string - createdAt: Date - _count: ModelVersionTagCountAggregateOutputType | null - _avg: ModelVersionTagAvgAggregateOutputType | null - _sum: ModelVersionTagSumAggregateOutputType | null - _min: ModelVersionTagMinAggregateOutputType | null - _max: ModelVersionTagMaxAggregateOutputType | null - } - - type GetModelVersionTagGroupByPayload = Prisma.PrismaPromise< - Array< - PickEnumerable & - { - [P in ((keyof T) & (keyof ModelVersionTagGroupByOutputType))]: P extends '_count' - ? T[P] extends boolean - ? number - : GetScalarType - : GetScalarType - } - > - > - - - export type ModelVersionTagSelect = $Extensions.GetSelect<{ - modelId?: boolean - versionNumber?: boolean - tagId?: boolean - createdAt?: boolean - modelVersion?: boolean | ModelVersionDefaultArgs - tag?: boolean | TagDefaultArgs - }, ExtArgs["result"]["modelVersionTag"]> - - export type ModelVersionTagSelectCreateManyAndReturn = $Extensions.GetSelect<{ - modelId?: boolean - versionNumber?: boolean - tagId?: boolean - createdAt?: boolean - modelVersion?: boolean | ModelVersionDefaultArgs - tag?: boolean | TagDefaultArgs - }, ExtArgs["result"]["modelVersionTag"]> - - export type ModelVersionTagSelectUpdateManyAndReturn = $Extensions.GetSelect<{ - modelId?: boolean - versionNumber?: boolean - tagId?: boolean - createdAt?: boolean - modelVersion?: boolean | ModelVersionDefaultArgs - tag?: boolean | TagDefaultArgs - }, ExtArgs["result"]["modelVersionTag"]> - - export type ModelVersionTagSelectScalar = { - modelId?: boolean - versionNumber?: boolean - tagId?: boolean - createdAt?: boolean - } - - export type ModelVersionTagOmit = $Extensions.GetOmit<"modelId" | "versionNumber" | "tagId" | "createdAt", ExtArgs["result"]["modelVersionTag"]> - export type ModelVersionTagInclude = { - modelVersion?: boolean | ModelVersionDefaultArgs - tag?: boolean | TagDefaultArgs - } - export type ModelVersionTagIncludeCreateManyAndReturn = { - modelVersion?: boolean | ModelVersionDefaultArgs - tag?: boolean | TagDefaultArgs - } - export type ModelVersionTagIncludeUpdateManyAndReturn = { - modelVersion?: boolean | ModelVersionDefaultArgs - tag?: boolean | TagDefaultArgs - } - - export type $ModelVersionTagPayload = { - name: "ModelVersionTag" - objects: { - modelVersion: Prisma.$ModelVersionPayload - tag: Prisma.$TagPayload - } - scalars: $Extensions.GetPayloadResult<{ - modelId: string - versionNumber: number - tagId: string - createdAt: Date - }, ExtArgs["result"]["modelVersionTag"]> - composites: {} - } - - type ModelVersionTagGetPayload = $Result.GetResult - - type ModelVersionTagCountArgs = - Omit & { - select?: ModelVersionTagCountAggregateInputType | true - } - - export interface ModelVersionTagDelegate { - [K: symbol]: { types: Prisma.TypeMap['model']['ModelVersionTag'], meta: { name: 'ModelVersionTag' } } - /** - * Find zero or one ModelVersionTag that matches the filter. - * @param {ModelVersionTagFindUniqueArgs} args - Arguments to find a ModelVersionTag - * @example - * // Get one ModelVersionTag - * const modelVersionTag = await prisma.modelVersionTag.findUnique({ - * where: { - * // ... provide filter here - * } - * }) - */ - findUnique(args: SelectSubset>): Prisma__ModelVersionTagClient<$Result.GetResult, T, "findUnique", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> - - /** - * Find one ModelVersionTag that matches the filter or throw an error with `error.code='P2025'` - * if no matches were found. - * @param {ModelVersionTagFindUniqueOrThrowArgs} args - Arguments to find a ModelVersionTag - * @example - * // Get one ModelVersionTag - * const modelVersionTag = await prisma.modelVersionTag.findUniqueOrThrow({ - * where: { - * // ... provide filter here - * } - * }) - */ - findUniqueOrThrow(args: SelectSubset>): Prisma__ModelVersionTagClient<$Result.GetResult, T, "findUniqueOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> - - /** - * Find the first ModelVersionTag that matches the filter. - * Note, that providing `undefined` is treated as the value not being there. - * Read more here: https://pris.ly/d/null-undefined - * @param {ModelVersionTagFindFirstArgs} args - Arguments to find a ModelVersionTag - * @example - * // Get one ModelVersionTag - * const modelVersionTag = await prisma.modelVersionTag.findFirst({ - * where: { - * // ... provide filter here - * } - * }) - */ - findFirst(args?: SelectSubset>): Prisma__ModelVersionTagClient<$Result.GetResult, T, "findFirst", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> - - /** - * Find the first ModelVersionTag that matches the filter or - * throw `PrismaKnownClientError` with `P2025` code if no matches were found. - * Note, that providing `undefined` is treated as the value not being there. - * Read more here: https://pris.ly/d/null-undefined - * @param {ModelVersionTagFindFirstOrThrowArgs} args - Arguments to find a ModelVersionTag - * @example - * // Get one ModelVersionTag - * const modelVersionTag = await prisma.modelVersionTag.findFirstOrThrow({ - * where: { - * // ... provide filter here - * } - * }) - */ - findFirstOrThrow(args?: SelectSubset>): Prisma__ModelVersionTagClient<$Result.GetResult, T, "findFirstOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> - - /** - * Find zero or more ModelVersionTags that matches the filter. - * Note, that providing `undefined` is treated as the value not being there. - * Read more here: https://pris.ly/d/null-undefined - * @param {ModelVersionTagFindManyArgs} args - Arguments to filter and select certain fields only. - * @example - * // Get all ModelVersionTags - * const modelVersionTags = await prisma.modelVersionTag.findMany() - * - * // Get first 10 ModelVersionTags - * const modelVersionTags = await prisma.modelVersionTag.findMany({ take: 10 }) - * - * // Only select the `modelId` - * const modelVersionTagWithModelIdOnly = await prisma.modelVersionTag.findMany({ select: { modelId: true } }) - * - */ - findMany(args?: SelectSubset>): Prisma.PrismaPromise<$Result.GetResult, T, "findMany", GlobalOmitOptions>> - - /** - * Create a ModelVersionTag. - * @param {ModelVersionTagCreateArgs} args - Arguments to create a ModelVersionTag. - * @example - * // Create one ModelVersionTag - * const ModelVersionTag = await prisma.modelVersionTag.create({ - * data: { - * // ... data to create a ModelVersionTag - * } - * }) - * - */ - create(args: SelectSubset>): Prisma__ModelVersionTagClient<$Result.GetResult, T, "create", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> - - /** - * Create many ModelVersionTags. - * @param {ModelVersionTagCreateManyArgs} args - Arguments to create many ModelVersionTags. - * @example - * // Create many ModelVersionTags - * const modelVersionTag = await prisma.modelVersionTag.createMany({ - * data: [ - * // ... provide data here - * ] - * }) - * - */ - createMany(args?: SelectSubset>): Prisma.PrismaPromise - - /** - * Create many ModelVersionTags and returns the data saved in the database. - * @param {ModelVersionTagCreateManyAndReturnArgs} args - Arguments to create many ModelVersionTags. - * @example - * // Create many ModelVersionTags - * const modelVersionTag = await prisma.modelVersionTag.createManyAndReturn({ - * data: [ - * // ... provide data here - * ] - * }) - * - * // Create many ModelVersionTags and only return the `modelId` - * const modelVersionTagWithModelIdOnly = await prisma.modelVersionTag.createManyAndReturn({ - * select: { modelId: 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?: SelectSubset>): Prisma.PrismaPromise<$Result.GetResult, T, "createManyAndReturn", GlobalOmitOptions>> - - /** - * Delete a ModelVersionTag. - * @param {ModelVersionTagDeleteArgs} args - Arguments to delete one ModelVersionTag. - * @example - * // Delete one ModelVersionTag - * const ModelVersionTag = await prisma.modelVersionTag.delete({ - * where: { - * // ... filter to delete one ModelVersionTag - * } - * }) - * - */ - delete(args: SelectSubset>): Prisma__ModelVersionTagClient<$Result.GetResult, T, "delete", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> - - /** - * Update one ModelVersionTag. - * @param {ModelVersionTagUpdateArgs} args - Arguments to update one ModelVersionTag. - * @example - * // Update one ModelVersionTag - * const modelVersionTag = await prisma.modelVersionTag.update({ - * where: { - * // ... provide filter here - * }, - * data: { - * // ... provide data here - * } - * }) - * - */ - update(args: SelectSubset>): Prisma__ModelVersionTagClient<$Result.GetResult, T, "update", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> - - /** - * Delete zero or more ModelVersionTags. - * @param {ModelVersionTagDeleteManyArgs} args - Arguments to filter ModelVersionTags to delete. - * @example - * // Delete a few ModelVersionTags - * const { count } = await prisma.modelVersionTag.deleteMany({ - * where: { - * // ... provide filter here - * } - * }) - * - */ - deleteMany(args?: SelectSubset>): Prisma.PrismaPromise - - /** - * Update zero or more ModelVersionTags. - * Note, that providing `undefined` is treated as the value not being there. - * Read more here: https://pris.ly/d/null-undefined - * @param {ModelVersionTagUpdateManyArgs} args - Arguments to update one or more rows. - * @example - * // Update many ModelVersionTags - * const modelVersionTag = await prisma.modelVersionTag.updateMany({ - * where: { - * // ... provide filter here - * }, - * data: { - * // ... provide data here - * } - * }) - * - */ - updateMany(args: SelectSubset>): Prisma.PrismaPromise - - /** - * Update zero or more ModelVersionTags and returns the data updated in the database. - * @param {ModelVersionTagUpdateManyAndReturnArgs} args - Arguments to update many ModelVersionTags. - * @example - * // Update many ModelVersionTags - * const modelVersionTag = await prisma.modelVersionTag.updateManyAndReturn({ - * where: { - * // ... provide filter here - * }, - * data: [ - * // ... provide data here - * ] - * }) - * - * // Update zero or more ModelVersionTags and only return the `modelId` - * const modelVersionTagWithModelIdOnly = await prisma.modelVersionTag.updateManyAndReturn({ - * select: { modelId: 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: SelectSubset>): Prisma.PrismaPromise<$Result.GetResult, T, "updateManyAndReturn", GlobalOmitOptions>> - - /** - * Create or update one ModelVersionTag. - * @param {ModelVersionTagUpsertArgs} args - Arguments to update or create a ModelVersionTag. - * @example - * // Update or create a ModelVersionTag - * const modelVersionTag = await prisma.modelVersionTag.upsert({ - * create: { - * // ... data to create a ModelVersionTag - * }, - * update: { - * // ... in case it already exists, update - * }, - * where: { - * // ... the filter for the ModelVersionTag we want to update - * } - * }) - */ - upsert(args: SelectSubset>): Prisma__ModelVersionTagClient<$Result.GetResult, T, "upsert", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> - - - /** - * Count the number of ModelVersionTags. - * Note, that providing `undefined` is treated as the value not being there. - * Read more here: https://pris.ly/d/null-undefined - * @param {ModelVersionTagCountArgs} args - Arguments to filter ModelVersionTags to count. - * @example - * // Count the number of ModelVersionTags - * const count = await prisma.modelVersionTag.count({ - * where: { - * // ... the filter for the ModelVersionTags we want to count - * } - * }) - **/ - count( - args?: Subset, - ): Prisma.PrismaPromise< - T extends $Utils.Record<'select', any> - ? T['select'] extends true - ? number - : GetScalarType - : number - > - - /** - * Allows you to perform aggregations operations on a ModelVersionTag. - * Note, that providing `undefined` is treated as the value not being there. - * Read more here: https://pris.ly/d/null-undefined - * @param {ModelVersionTagAggregateArgs} args - Select which aggregations you would like to apply and on what fields. - * @example - * // Ordered by age ascending - * // Where email contains prisma.io - * // Limited to the 10 users - * const aggregations = await prisma.user.aggregate({ - * _avg: { - * age: true, - * }, - * where: { - * email: { - * contains: "prisma.io", - * }, - * }, - * orderBy: { - * age: "asc", - * }, - * take: 10, - * }) - **/ - aggregate(args: Subset): Prisma.PrismaPromise> - - /** - * Group by ModelVersionTag. - * Note, that providing `undefined` is treated as the value not being there. - * Read more here: https://pris.ly/d/null-undefined - * @param {ModelVersionTagGroupByArgs} args - Group by arguments. - * @example - * // Group by city, order by createdAt, get count - * const result = await prisma.user.groupBy({ - * by: ['city', 'createdAt'], - * orderBy: { - * createdAt: true - * }, - * _count: { - * _all: true - * }, - * }) - * - **/ - groupBy< - T extends ModelVersionTagGroupByArgs, - HasSelectOrTake extends Or< - Extends<'skip', Keys>, - Extends<'take', Keys> - >, - OrderByArg extends True extends HasSelectOrTake - ? { orderBy: ModelVersionTagGroupByArgs['orderBy'] } - : { orderBy?: ModelVersionTagGroupByArgs['orderBy'] }, + ? { orderBy: ModelVersionTagGroupByArgs['orderBy'] } + : { orderBy?: ModelVersionTagGroupByArgs['orderBy'] }, OrderFields extends ExcludeUnderscoreKeys>>, ByFields extends MaybeTupleToUnion, ByValid extends Has, @@ -13893,6 +12706,7 @@ export namespace Prisma { modelId: string | null taggedVersionNumber: number | null fileKey: string | null + kind: $Enums.ModelFileKind | null createdAt: Date | null } @@ -13901,6 +12715,7 @@ export namespace Prisma { modelId: string | null taggedVersionNumber: number | null fileKey: string | null + kind: $Enums.ModelFileKind | null createdAt: Date | null } @@ -13909,6 +12724,7 @@ export namespace Prisma { modelId: number taggedVersionNumber: number fileKey: number + kind: number createdAt: number _all: number } @@ -13927,6 +12743,7 @@ export namespace Prisma { modelId?: true taggedVersionNumber?: true fileKey?: true + kind?: true createdAt?: true } @@ -13935,6 +12752,7 @@ export namespace Prisma { modelId?: true taggedVersionNumber?: true fileKey?: true + kind?: true createdAt?: true } @@ -13943,6 +12761,7 @@ export namespace Prisma { modelId?: true taggedVersionNumber?: true fileKey?: true + kind?: true createdAt?: true _all?: true } @@ -14038,6 +12857,7 @@ export namespace Prisma { modelId: string taggedVersionNumber: number fileKey: string + kind: $Enums.ModelFileKind createdAt: Date _count: ModelAdditionalFileCountAggregateOutputType | null _avg: ModelAdditionalFileAvgAggregateOutputType | null @@ -14065,6 +12885,7 @@ export namespace Prisma { modelId?: boolean taggedVersionNumber?: boolean fileKey?: boolean + kind?: boolean createdAt?: boolean model?: boolean | ModelDefaultArgs taggedVersion?: boolean | ModelVersionDefaultArgs @@ -14075,6 +12896,7 @@ export namespace Prisma { modelId?: boolean taggedVersionNumber?: boolean fileKey?: boolean + kind?: boolean createdAt?: boolean model?: boolean | ModelDefaultArgs taggedVersion?: boolean | ModelVersionDefaultArgs @@ -14085,6 +12907,7 @@ export namespace Prisma { modelId?: boolean taggedVersionNumber?: boolean fileKey?: boolean + kind?: boolean createdAt?: boolean model?: boolean | ModelDefaultArgs taggedVersion?: boolean | ModelVersionDefaultArgs @@ -14095,10 +12918,11 @@ export namespace Prisma { modelId?: boolean taggedVersionNumber?: boolean fileKey?: boolean + kind?: boolean createdAt?: boolean } - export type ModelAdditionalFileOmit = $Extensions.GetOmit<"id" | "modelId" | "taggedVersionNumber" | "fileKey" | "createdAt", ExtArgs["result"]["modelAdditionalFile"]> + export type ModelAdditionalFileOmit = $Extensions.GetOmit<"id" | "modelId" | "taggedVersionNumber" | "fileKey" | "kind" | "createdAt", ExtArgs["result"]["modelAdditionalFile"]> export type ModelAdditionalFileInclude = { model?: boolean | ModelDefaultArgs taggedVersion?: boolean | ModelVersionDefaultArgs @@ -14123,6 +12947,7 @@ export namespace Prisma { modelId: string taggedVersionNumber: number fileKey: string + kind: $Enums.ModelFileKind createdAt: Date }, ExtArgs["result"]["modelAdditionalFile"]> composites: {} @@ -14553,6 +13378,7 @@ export namespace Prisma { readonly modelId: FieldRef<"ModelAdditionalFile", 'String'> readonly taggedVersionNumber: FieldRef<"ModelAdditionalFile", 'Int'> readonly fileKey: FieldRef<"ModelAdditionalFile", 'String'> + readonly kind: FieldRef<"ModelAdditionalFile", 'ModelFileKind'> readonly createdAt: FieldRef<"ModelAdditionalFile", 'DateTime'> } @@ -22862,6 +21688,7 @@ export namespace Prisma { versionNumber: 'versionNumber', title: 'title', description: 'description', + changeSummary: 'changeSummary', previewImageFileKey: 'previewImageFileKey', netlogoFileKey: 'netlogoFileKey', netlogoVersion: 'netlogoVersion', @@ -22873,16 +21700,6 @@ export namespace Prisma { export type ModelVersionScalarFieldEnum = (typeof ModelVersionScalarFieldEnum)[keyof typeof ModelVersionScalarFieldEnum] - export const ModelVersionFileScalarFieldEnum: { - id: 'id', - modelId: 'modelId', - versionNumber: 'versionNumber', - fileKey: 'fileKey' - }; - - export type ModelVersionFileScalarFieldEnum = (typeof ModelVersionFileScalarFieldEnum)[keyof typeof ModelVersionFileScalarFieldEnum] - - export const ModelVersionTagScalarFieldEnum: { modelId: 'modelId', versionNumber: 'versionNumber', @@ -22898,6 +21715,7 @@ export namespace Prisma { modelId: 'modelId', taggedVersionNumber: 'taggedVersionNumber', fileKey: 'fileKey', + kind: 'kind', createdAt: 'createdAt' }; @@ -23148,6 +21966,20 @@ export namespace Prisma { + /** + * Reference to a field of type 'ModelFileKind' + */ + export type EnumModelFileKindFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'ModelFileKind'> + + + + /** + * Reference to a field of type 'ModelFileKind[]' + */ + export type ListEnumModelFileKindFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'ModelFileKind[]'> + + + /** * Reference to a field of type 'AuthorRole' */ @@ -23844,6 +22676,7 @@ export namespace Prisma { versionNumber?: IntFilter<"ModelVersion"> | number title?: StringFilter<"ModelVersion"> | string description?: StringNullableFilter<"ModelVersion"> | string | null + changeSummary?: StringNullableFilter<"ModelVersion"> | string | null previewImageFileKey?: StringNullableFilter<"ModelVersion"> | string | null netlogoFileKey?: StringFilter<"ModelVersion"> | string netlogoVersion?: StringNullableFilter<"ModelVersion"> | string | null @@ -23853,7 +22686,6 @@ export namespace Prisma { model?: XOR latestOfModel?: XOR | null parentOfModels?: ModelListRelationFilter - files?: ModelVersionFileListRelationFilter tags?: ModelVersionTagListRelationFilter taggedAdditionalFiles?: ModelAdditionalFileListRelationFilter } @@ -23863,6 +22695,7 @@ export namespace Prisma { versionNumber?: SortOrder title?: SortOrder description?: SortOrderInput | SortOrder + changeSummary?: SortOrderInput | SortOrder previewImageFileKey?: SortOrderInput | SortOrder netlogoFileKey?: SortOrder netlogoVersion?: SortOrderInput | SortOrder @@ -23872,7 +22705,6 @@ export namespace Prisma { model?: ModelOrderByWithRelationInput latestOfModel?: ModelOrderByWithRelationInput parentOfModels?: ModelOrderByRelationAggregateInput - files?: ModelVersionFileOrderByRelationAggregateInput tags?: ModelVersionTagOrderByRelationAggregateInput taggedAdditionalFiles?: ModelAdditionalFileOrderByRelationAggregateInput } @@ -23886,6 +22718,7 @@ export namespace Prisma { versionNumber?: IntFilter<"ModelVersion"> | number title?: StringFilter<"ModelVersion"> | string description?: StringNullableFilter<"ModelVersion"> | string | null + changeSummary?: StringNullableFilter<"ModelVersion"> | string | null previewImageFileKey?: StringNullableFilter<"ModelVersion"> | string | null netlogoFileKey?: StringFilter<"ModelVersion"> | string netlogoVersion?: StringNullableFilter<"ModelVersion"> | string | null @@ -23895,7 +22728,6 @@ export namespace Prisma { model?: XOR latestOfModel?: XOR | null parentOfModels?: ModelListRelationFilter - files?: ModelVersionFileListRelationFilter tags?: ModelVersionTagListRelationFilter taggedAdditionalFiles?: ModelAdditionalFileListRelationFilter }, "modelId_versionNumber"> @@ -23905,6 +22737,7 @@ export namespace Prisma { versionNumber?: SortOrder title?: SortOrder description?: SortOrderInput | SortOrder + changeSummary?: SortOrderInput | SortOrder previewImageFileKey?: SortOrderInput | SortOrder netlogoFileKey?: SortOrder netlogoVersion?: SortOrderInput | SortOrder @@ -23926,6 +22759,7 @@ export namespace Prisma { versionNumber?: IntWithAggregatesFilter<"ModelVersion"> | number title?: StringWithAggregatesFilter<"ModelVersion"> | string description?: StringNullableWithAggregatesFilter<"ModelVersion"> | string | null + changeSummary?: StringNullableWithAggregatesFilter<"ModelVersion"> | string | null previewImageFileKey?: StringNullableWithAggregatesFilter<"ModelVersion"> | string | null netlogoFileKey?: StringWithAggregatesFilter<"ModelVersion"> | string netlogoVersion?: StringNullableWithAggregatesFilter<"ModelVersion"> | string | null @@ -23934,58 +22768,6 @@ export namespace Prisma { finalizedAt?: DateTimeNullableWithAggregatesFilter<"ModelVersion"> | Date | string | null } - export type ModelVersionFileWhereInput = { - AND?: ModelVersionFileWhereInput | ModelVersionFileWhereInput[] - OR?: ModelVersionFileWhereInput[] - NOT?: ModelVersionFileWhereInput | ModelVersionFileWhereInput[] - id?: StringFilter<"ModelVersionFile"> | string - modelId?: StringFilter<"ModelVersionFile"> | string - versionNumber?: IntFilter<"ModelVersionFile"> | number - fileKey?: StringFilter<"ModelVersionFile"> | string - modelVersion?: XOR - } - - export type ModelVersionFileOrderByWithRelationInput = { - id?: SortOrder - modelId?: SortOrder - versionNumber?: SortOrder - fileKey?: SortOrder - modelVersion?: ModelVersionOrderByWithRelationInput - } - - export type ModelVersionFileWhereUniqueInput = Prisma.AtLeast<{ - id?: string - AND?: ModelVersionFileWhereInput | ModelVersionFileWhereInput[] - OR?: ModelVersionFileWhereInput[] - NOT?: ModelVersionFileWhereInput | ModelVersionFileWhereInput[] - modelId?: StringFilter<"ModelVersionFile"> | string - versionNumber?: IntFilter<"ModelVersionFile"> | number - fileKey?: StringFilter<"ModelVersionFile"> | string - modelVersion?: XOR - }, "id"> - - export type ModelVersionFileOrderByWithAggregationInput = { - id?: SortOrder - modelId?: SortOrder - versionNumber?: SortOrder - fileKey?: SortOrder - _count?: ModelVersionFileCountOrderByAggregateInput - _avg?: ModelVersionFileAvgOrderByAggregateInput - _max?: ModelVersionFileMaxOrderByAggregateInput - _min?: ModelVersionFileMinOrderByAggregateInput - _sum?: ModelVersionFileSumOrderByAggregateInput - } - - export type ModelVersionFileScalarWhereWithAggregatesInput = { - AND?: ModelVersionFileScalarWhereWithAggregatesInput | ModelVersionFileScalarWhereWithAggregatesInput[] - OR?: ModelVersionFileScalarWhereWithAggregatesInput[] - NOT?: ModelVersionFileScalarWhereWithAggregatesInput | ModelVersionFileScalarWhereWithAggregatesInput[] - id?: StringWithAggregatesFilter<"ModelVersionFile"> | string - modelId?: StringWithAggregatesFilter<"ModelVersionFile"> | string - versionNumber?: IntWithAggregatesFilter<"ModelVersionFile"> | number - fileKey?: StringWithAggregatesFilter<"ModelVersionFile"> | string - } - export type ModelVersionTagWhereInput = { AND?: ModelVersionTagWhereInput | ModelVersionTagWhereInput[] OR?: ModelVersionTagWhereInput[] @@ -24050,6 +22832,7 @@ export namespace Prisma { modelId?: StringFilter<"ModelAdditionalFile"> | string taggedVersionNumber?: IntFilter<"ModelAdditionalFile"> | number fileKey?: StringFilter<"ModelAdditionalFile"> | string + kind?: EnumModelFileKindFilter<"ModelAdditionalFile"> | $Enums.ModelFileKind createdAt?: DateTimeFilter<"ModelAdditionalFile"> | Date | string model?: XOR taggedVersion?: XOR @@ -24060,6 +22843,7 @@ export namespace Prisma { modelId?: SortOrder taggedVersionNumber?: SortOrder fileKey?: SortOrder + kind?: SortOrder createdAt?: SortOrder model?: ModelOrderByWithRelationInput taggedVersion?: ModelVersionOrderByWithRelationInput @@ -24073,6 +22857,7 @@ export namespace Prisma { modelId?: StringFilter<"ModelAdditionalFile"> | string taggedVersionNumber?: IntFilter<"ModelAdditionalFile"> | number fileKey?: StringFilter<"ModelAdditionalFile"> | string + kind?: EnumModelFileKindFilter<"ModelAdditionalFile"> | $Enums.ModelFileKind createdAt?: DateTimeFilter<"ModelAdditionalFile"> | Date | string model?: XOR taggedVersion?: XOR @@ -24083,6 +22868,7 @@ export namespace Prisma { modelId?: SortOrder taggedVersionNumber?: SortOrder fileKey?: SortOrder + kind?: SortOrder createdAt?: SortOrder _count?: ModelAdditionalFileCountOrderByAggregateInput _avg?: ModelAdditionalFileAvgOrderByAggregateInput @@ -24099,6 +22885,7 @@ export namespace Prisma { modelId?: StringWithAggregatesFilter<"ModelAdditionalFile"> | string taggedVersionNumber?: IntWithAggregatesFilter<"ModelAdditionalFile"> | number fileKey?: StringWithAggregatesFilter<"ModelAdditionalFile"> | string + kind?: EnumModelFileKindWithAggregatesFilter<"ModelAdditionalFile"> | $Enums.ModelFileKind createdAt?: DateTimeWithAggregatesFilter<"ModelAdditionalFile"> | Date | string } @@ -25287,6 +24074,7 @@ export namespace Prisma { versionNumber: number title: string description?: string | null + changeSummary?: string | null previewImageFileKey?: string | null netlogoFileKey: string netlogoVersion?: string | null @@ -25296,7 +24084,6 @@ export namespace Prisma { model: ModelCreateNestedOneWithoutVersionsInput latestOfModel?: ModelCreateNestedOneWithoutLatestVersionInput parentOfModels?: ModelCreateNestedManyWithoutParentVersionInput - files?: ModelVersionFileCreateNestedManyWithoutModelVersionInput tags?: ModelVersionTagCreateNestedManyWithoutModelVersionInput taggedAdditionalFiles?: ModelAdditionalFileCreateNestedManyWithoutTaggedVersionInput } @@ -25306,6 +24093,7 @@ export namespace Prisma { versionNumber: number title: string description?: string | null + changeSummary?: string | null previewImageFileKey?: string | null netlogoFileKey: string netlogoVersion?: string | null @@ -25314,7 +24102,6 @@ export namespace Prisma { finalizedAt?: Date | string | null latestOfModel?: ModelUncheckedCreateNestedOneWithoutLatestVersionInput parentOfModels?: ModelUncheckedCreateNestedManyWithoutParentVersionInput - files?: ModelVersionFileUncheckedCreateNestedManyWithoutModelVersionInput tags?: ModelVersionTagUncheckedCreateNestedManyWithoutModelVersionInput taggedAdditionalFiles?: ModelAdditionalFileUncheckedCreateNestedManyWithoutTaggedVersionInput } @@ -25323,6 +24110,7 @@ export namespace Prisma { versionNumber?: IntFieldUpdateOperationsInput | number title?: StringFieldUpdateOperationsInput | string description?: NullableStringFieldUpdateOperationsInput | string | null + changeSummary?: NullableStringFieldUpdateOperationsInput | string | null previewImageFileKey?: NullableStringFieldUpdateOperationsInput | string | null netlogoFileKey?: StringFieldUpdateOperationsInput | string netlogoVersion?: NullableStringFieldUpdateOperationsInput | string | null @@ -25332,7 +24120,6 @@ export namespace Prisma { model?: ModelUpdateOneRequiredWithoutVersionsNestedInput latestOfModel?: ModelUpdateOneWithoutLatestVersionNestedInput parentOfModels?: ModelUpdateManyWithoutParentVersionNestedInput - files?: ModelVersionFileUpdateManyWithoutModelVersionNestedInput tags?: ModelVersionTagUpdateManyWithoutModelVersionNestedInput taggedAdditionalFiles?: ModelAdditionalFileUpdateManyWithoutTaggedVersionNestedInput } @@ -25342,6 +24129,7 @@ export namespace Prisma { versionNumber?: IntFieldUpdateOperationsInput | number title?: StringFieldUpdateOperationsInput | string description?: NullableStringFieldUpdateOperationsInput | string | null + changeSummary?: NullableStringFieldUpdateOperationsInput | string | null previewImageFileKey?: NullableStringFieldUpdateOperationsInput | string | null netlogoFileKey?: StringFieldUpdateOperationsInput | string netlogoVersion?: NullableStringFieldUpdateOperationsInput | string | null @@ -25350,7 +24138,6 @@ export namespace Prisma { finalizedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null latestOfModel?: ModelUncheckedUpdateOneWithoutLatestVersionNestedInput parentOfModels?: ModelUncheckedUpdateManyWithoutParentVersionNestedInput - files?: ModelVersionFileUncheckedUpdateManyWithoutModelVersionNestedInput tags?: ModelVersionTagUncheckedUpdateManyWithoutModelVersionNestedInput taggedAdditionalFiles?: ModelAdditionalFileUncheckedUpdateManyWithoutTaggedVersionNestedInput } @@ -25360,6 +24147,7 @@ export namespace Prisma { versionNumber: number title: string description?: string | null + changeSummary?: string | null previewImageFileKey?: string | null netlogoFileKey: string netlogoVersion?: string | null @@ -25372,6 +24160,7 @@ export namespace Prisma { versionNumber?: IntFieldUpdateOperationsInput | number title?: StringFieldUpdateOperationsInput | string description?: NullableStringFieldUpdateOperationsInput | string | null + changeSummary?: NullableStringFieldUpdateOperationsInput | string | null previewImageFileKey?: NullableStringFieldUpdateOperationsInput | string | null netlogoFileKey?: StringFieldUpdateOperationsInput | string netlogoVersion?: NullableStringFieldUpdateOperationsInput | string | null @@ -25385,6 +24174,7 @@ export namespace Prisma { versionNumber?: IntFieldUpdateOperationsInput | number title?: StringFieldUpdateOperationsInput | string description?: NullableStringFieldUpdateOperationsInput | string | null + changeSummary?: NullableStringFieldUpdateOperationsInput | string | null previewImageFileKey?: NullableStringFieldUpdateOperationsInput | string | null netlogoFileKey?: StringFieldUpdateOperationsInput | string netlogoVersion?: NullableStringFieldUpdateOperationsInput | string | null @@ -25393,51 +24183,6 @@ export namespace Prisma { finalizedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null } - export type ModelVersionFileCreateInput = { - id?: string - fileKey: string - modelVersion: ModelVersionCreateNestedOneWithoutFilesInput - } - - export type ModelVersionFileUncheckedCreateInput = { - id?: string - modelId: string - versionNumber: number - fileKey: string - } - - export type ModelVersionFileUpdateInput = { - id?: StringFieldUpdateOperationsInput | string - fileKey?: StringFieldUpdateOperationsInput | string - modelVersion?: ModelVersionUpdateOneRequiredWithoutFilesNestedInput - } - - export type ModelVersionFileUncheckedUpdateInput = { - id?: StringFieldUpdateOperationsInput | string - modelId?: StringFieldUpdateOperationsInput | string - versionNumber?: IntFieldUpdateOperationsInput | number - fileKey?: StringFieldUpdateOperationsInput | string - } - - export type ModelVersionFileCreateManyInput = { - id?: string - modelId: string - versionNumber: number - fileKey: string - } - - export type ModelVersionFileUpdateManyMutationInput = { - id?: StringFieldUpdateOperationsInput | string - fileKey?: StringFieldUpdateOperationsInput | string - } - - export type ModelVersionFileUncheckedUpdateManyInput = { - id?: StringFieldUpdateOperationsInput | string - modelId?: StringFieldUpdateOperationsInput | string - versionNumber?: IntFieldUpdateOperationsInput | number - fileKey?: StringFieldUpdateOperationsInput | string - } - export type ModelVersionTagCreateInput = { createdAt?: Date | string modelVersion: ModelVersionCreateNestedOneWithoutTagsInput @@ -25485,6 +24230,7 @@ export namespace Prisma { export type ModelAdditionalFileCreateInput = { id?: string fileKey: string + kind?: $Enums.ModelFileKind createdAt?: Date | string model: ModelCreateNestedOneWithoutAdditionalFilesInput taggedVersion: ModelVersionCreateNestedOneWithoutTaggedAdditionalFilesInput @@ -25495,12 +24241,14 @@ export namespace Prisma { modelId: string taggedVersionNumber: number fileKey: string + kind?: $Enums.ModelFileKind createdAt?: Date | string } export type ModelAdditionalFileUpdateInput = { id?: StringFieldUpdateOperationsInput | string fileKey?: StringFieldUpdateOperationsInput | string + kind?: EnumModelFileKindFieldUpdateOperationsInput | $Enums.ModelFileKind createdAt?: DateTimeFieldUpdateOperationsInput | Date | string model?: ModelUpdateOneRequiredWithoutAdditionalFilesNestedInput taggedVersion?: ModelVersionUpdateOneRequiredWithoutTaggedAdditionalFilesNestedInput @@ -25511,6 +24259,7 @@ export namespace Prisma { modelId?: StringFieldUpdateOperationsInput | string taggedVersionNumber?: IntFieldUpdateOperationsInput | number fileKey?: StringFieldUpdateOperationsInput | string + kind?: EnumModelFileKindFieldUpdateOperationsInput | $Enums.ModelFileKind createdAt?: DateTimeFieldUpdateOperationsInput | Date | string } @@ -25519,12 +24268,14 @@ export namespace Prisma { modelId: string taggedVersionNumber: number fileKey: string + kind?: $Enums.ModelFileKind createdAt?: Date | string } export type ModelAdditionalFileUpdateManyMutationInput = { id?: StringFieldUpdateOperationsInput | string fileKey?: StringFieldUpdateOperationsInput | string + kind?: EnumModelFileKindFieldUpdateOperationsInput | $Enums.ModelFileKind createdAt?: DateTimeFieldUpdateOperationsInput | Date | string } @@ -25533,6 +24284,7 @@ export namespace Prisma { modelId?: StringFieldUpdateOperationsInput | string taggedVersionNumber?: IntFieldUpdateOperationsInput | number fileKey?: StringFieldUpdateOperationsInput | string + kind?: EnumModelFileKindFieldUpdateOperationsInput | $Enums.ModelFileKind createdAt?: DateTimeFieldUpdateOperationsInput | Date | string } @@ -26764,22 +25516,12 @@ export namespace Prisma { isNot?: ModelWhereInput } - export type ModelVersionFileListRelationFilter = { - every?: ModelVersionFileWhereInput - some?: ModelVersionFileWhereInput - none?: ModelVersionFileWhereInput - } - export type ModelVersionTagListRelationFilter = { every?: ModelVersionTagWhereInput some?: ModelVersionTagWhereInput none?: ModelVersionTagWhereInput } - export type ModelVersionFileOrderByRelationAggregateInput = { - _count?: SortOrder - } - export type ModelVersionTagOrderByRelationAggregateInput = { _count?: SortOrder } @@ -26794,6 +25536,7 @@ export namespace Prisma { versionNumber?: SortOrder title?: SortOrder description?: SortOrder + changeSummary?: SortOrder previewImageFileKey?: SortOrder netlogoFileKey?: SortOrder netlogoVersion?: SortOrder @@ -26811,6 +25554,7 @@ export namespace Prisma { versionNumber?: SortOrder title?: SortOrder description?: SortOrder + changeSummary?: SortOrder previewImageFileKey?: SortOrder netlogoFileKey?: SortOrder netlogoVersion?: SortOrder @@ -26824,6 +25568,7 @@ export namespace Prisma { versionNumber?: SortOrder title?: SortOrder description?: SortOrder + changeSummary?: SortOrder previewImageFileKey?: SortOrder netlogoFileKey?: SortOrder netlogoVersion?: SortOrder @@ -26841,35 +25586,6 @@ export namespace Prisma { isNot?: ModelVersionWhereInput } - export type ModelVersionFileCountOrderByAggregateInput = { - id?: SortOrder - modelId?: SortOrder - versionNumber?: SortOrder - fileKey?: SortOrder - } - - export type ModelVersionFileAvgOrderByAggregateInput = { - versionNumber?: SortOrder - } - - export type ModelVersionFileMaxOrderByAggregateInput = { - id?: SortOrder - modelId?: SortOrder - versionNumber?: SortOrder - fileKey?: SortOrder - } - - export type ModelVersionFileMinOrderByAggregateInput = { - id?: SortOrder - modelId?: SortOrder - versionNumber?: SortOrder - fileKey?: SortOrder - } - - export type ModelVersionFileSumOrderByAggregateInput = { - versionNumber?: SortOrder - } - export type TagScalarRelationFilter = { is?: TagWhereInput isNot?: TagWhereInput @@ -26910,11 +25626,19 @@ export namespace Prisma { versionNumber?: SortOrder } + export type EnumModelFileKindFilter<$PrismaModel = never> = { + equals?: $Enums.ModelFileKind | EnumModelFileKindFieldRefInput<$PrismaModel> + in?: $Enums.ModelFileKind[] | ListEnumModelFileKindFieldRefInput<$PrismaModel> + notIn?: $Enums.ModelFileKind[] | ListEnumModelFileKindFieldRefInput<$PrismaModel> + not?: NestedEnumModelFileKindFilter<$PrismaModel> | $Enums.ModelFileKind + } + export type ModelAdditionalFileCountOrderByAggregateInput = { id?: SortOrder modelId?: SortOrder taggedVersionNumber?: SortOrder fileKey?: SortOrder + kind?: SortOrder createdAt?: SortOrder } @@ -26927,6 +25651,7 @@ export namespace Prisma { modelId?: SortOrder taggedVersionNumber?: SortOrder fileKey?: SortOrder + kind?: SortOrder createdAt?: SortOrder } @@ -26935,6 +25660,7 @@ export namespace Prisma { modelId?: SortOrder taggedVersionNumber?: SortOrder fileKey?: SortOrder + kind?: SortOrder createdAt?: SortOrder } @@ -26942,6 +25668,16 @@ export namespace Prisma { taggedVersionNumber?: SortOrder } + export type EnumModelFileKindWithAggregatesFilter<$PrismaModel = never> = { + equals?: $Enums.ModelFileKind | EnumModelFileKindFieldRefInput<$PrismaModel> + in?: $Enums.ModelFileKind[] | ListEnumModelFileKindFieldRefInput<$PrismaModel> + notIn?: $Enums.ModelFileKind[] | ListEnumModelFileKindFieldRefInput<$PrismaModel> + not?: NestedEnumModelFileKindWithAggregatesFilter<$PrismaModel> | $Enums.ModelFileKind + _count?: NestedIntFilter<$PrismaModel> + _min?: NestedEnumModelFileKindFilter<$PrismaModel> + _max?: NestedEnumModelFileKindFilter<$PrismaModel> + } + export type TagCountOrderByAggregateInput = { id?: SortOrder legacyId?: SortOrder @@ -28203,13 +26939,6 @@ export namespace Prisma { connect?: ModelWhereUniqueInput | ModelWhereUniqueInput[] } - export type ModelVersionFileCreateNestedManyWithoutModelVersionInput = { - create?: XOR | ModelVersionFileCreateWithoutModelVersionInput[] | ModelVersionFileUncheckedCreateWithoutModelVersionInput[] - connectOrCreate?: ModelVersionFileCreateOrConnectWithoutModelVersionInput | ModelVersionFileCreateOrConnectWithoutModelVersionInput[] - createMany?: ModelVersionFileCreateManyModelVersionInputEnvelope - connect?: ModelVersionFileWhereUniqueInput | ModelVersionFileWhereUniqueInput[] - } - export type ModelVersionTagCreateNestedManyWithoutModelVersionInput = { create?: XOR | ModelVersionTagCreateWithoutModelVersionInput[] | ModelVersionTagUncheckedCreateWithoutModelVersionInput[] connectOrCreate?: ModelVersionTagCreateOrConnectWithoutModelVersionInput | ModelVersionTagCreateOrConnectWithoutModelVersionInput[] @@ -28237,13 +26966,6 @@ export namespace Prisma { connect?: ModelWhereUniqueInput | ModelWhereUniqueInput[] } - export type ModelVersionFileUncheckedCreateNestedManyWithoutModelVersionInput = { - create?: XOR | ModelVersionFileCreateWithoutModelVersionInput[] | ModelVersionFileUncheckedCreateWithoutModelVersionInput[] - connectOrCreate?: ModelVersionFileCreateOrConnectWithoutModelVersionInput | ModelVersionFileCreateOrConnectWithoutModelVersionInput[] - createMany?: ModelVersionFileCreateManyModelVersionInputEnvelope - connect?: ModelVersionFileWhereUniqueInput | ModelVersionFileWhereUniqueInput[] - } - export type ModelVersionTagUncheckedCreateNestedManyWithoutModelVersionInput = { create?: XOR | ModelVersionTagCreateWithoutModelVersionInput[] | ModelVersionTagUncheckedCreateWithoutModelVersionInput[] connectOrCreate?: ModelVersionTagCreateOrConnectWithoutModelVersionInput | ModelVersionTagCreateOrConnectWithoutModelVersionInput[] @@ -28290,20 +27012,6 @@ export namespace Prisma { deleteMany?: ModelScalarWhereInput | ModelScalarWhereInput[] } - export type ModelVersionFileUpdateManyWithoutModelVersionNestedInput = { - create?: XOR | ModelVersionFileCreateWithoutModelVersionInput[] | ModelVersionFileUncheckedCreateWithoutModelVersionInput[] - connectOrCreate?: ModelVersionFileCreateOrConnectWithoutModelVersionInput | ModelVersionFileCreateOrConnectWithoutModelVersionInput[] - upsert?: ModelVersionFileUpsertWithWhereUniqueWithoutModelVersionInput | ModelVersionFileUpsertWithWhereUniqueWithoutModelVersionInput[] - createMany?: ModelVersionFileCreateManyModelVersionInputEnvelope - set?: ModelVersionFileWhereUniqueInput | ModelVersionFileWhereUniqueInput[] - disconnect?: ModelVersionFileWhereUniqueInput | ModelVersionFileWhereUniqueInput[] - delete?: ModelVersionFileWhereUniqueInput | ModelVersionFileWhereUniqueInput[] - connect?: ModelVersionFileWhereUniqueInput | ModelVersionFileWhereUniqueInput[] - update?: ModelVersionFileUpdateWithWhereUniqueWithoutModelVersionInput | ModelVersionFileUpdateWithWhereUniqueWithoutModelVersionInput[] - updateMany?: ModelVersionFileUpdateManyWithWhereWithoutModelVersionInput | ModelVersionFileUpdateManyWithWhereWithoutModelVersionInput[] - deleteMany?: ModelVersionFileScalarWhereInput | ModelVersionFileScalarWhereInput[] - } - export type ModelVersionTagUpdateManyWithoutModelVersionNestedInput = { create?: XOR | ModelVersionTagCreateWithoutModelVersionInput[] | ModelVersionTagUncheckedCreateWithoutModelVersionInput[] connectOrCreate?: ModelVersionTagCreateOrConnectWithoutModelVersionInput | ModelVersionTagCreateOrConnectWithoutModelVersionInput[] @@ -28356,20 +27064,6 @@ export namespace Prisma { deleteMany?: ModelScalarWhereInput | ModelScalarWhereInput[] } - export type ModelVersionFileUncheckedUpdateManyWithoutModelVersionNestedInput = { - create?: XOR | ModelVersionFileCreateWithoutModelVersionInput[] | ModelVersionFileUncheckedCreateWithoutModelVersionInput[] - connectOrCreate?: ModelVersionFileCreateOrConnectWithoutModelVersionInput | ModelVersionFileCreateOrConnectWithoutModelVersionInput[] - upsert?: ModelVersionFileUpsertWithWhereUniqueWithoutModelVersionInput | ModelVersionFileUpsertWithWhereUniqueWithoutModelVersionInput[] - createMany?: ModelVersionFileCreateManyModelVersionInputEnvelope - set?: ModelVersionFileWhereUniqueInput | ModelVersionFileWhereUniqueInput[] - disconnect?: ModelVersionFileWhereUniqueInput | ModelVersionFileWhereUniqueInput[] - delete?: ModelVersionFileWhereUniqueInput | ModelVersionFileWhereUniqueInput[] - connect?: ModelVersionFileWhereUniqueInput | ModelVersionFileWhereUniqueInput[] - update?: ModelVersionFileUpdateWithWhereUniqueWithoutModelVersionInput | ModelVersionFileUpdateWithWhereUniqueWithoutModelVersionInput[] - updateMany?: ModelVersionFileUpdateManyWithWhereWithoutModelVersionInput | ModelVersionFileUpdateManyWithWhereWithoutModelVersionInput[] - deleteMany?: ModelVersionFileScalarWhereInput | ModelVersionFileScalarWhereInput[] - } - export type ModelVersionTagUncheckedUpdateManyWithoutModelVersionNestedInput = { create?: XOR | ModelVersionTagCreateWithoutModelVersionInput[] | ModelVersionTagUncheckedCreateWithoutModelVersionInput[] connectOrCreate?: ModelVersionTagCreateOrConnectWithoutModelVersionInput | ModelVersionTagCreateOrConnectWithoutModelVersionInput[] @@ -28398,20 +27092,6 @@ export namespace Prisma { deleteMany?: ModelAdditionalFileScalarWhereInput | ModelAdditionalFileScalarWhereInput[] } - export type ModelVersionCreateNestedOneWithoutFilesInput = { - create?: XOR - connectOrCreate?: ModelVersionCreateOrConnectWithoutFilesInput - connect?: ModelVersionWhereUniqueInput - } - - export type ModelVersionUpdateOneRequiredWithoutFilesNestedInput = { - create?: XOR - connectOrCreate?: ModelVersionCreateOrConnectWithoutFilesInput - upsert?: ModelVersionUpsertWithoutFilesInput - connect?: ModelVersionWhereUniqueInput - update?: XOR, ModelVersionUncheckedUpdateWithoutFilesInput> - } - export type ModelVersionCreateNestedOneWithoutTagsInput = { create?: XOR connectOrCreate?: ModelVersionCreateOrConnectWithoutTagsInput @@ -28452,6 +27132,10 @@ export namespace Prisma { connect?: ModelVersionWhereUniqueInput } + export type EnumModelFileKindFieldUpdateOperationsInput = { + set?: $Enums.ModelFileKind + } + export type ModelUpdateOneRequiredWithoutAdditionalFilesNestedInput = { create?: XOR connectOrCreate?: ModelCreateOrConnectWithoutAdditionalFilesInput @@ -28970,6 +27654,23 @@ export namespace Prisma { _max?: NestedEnumModelVisibilityFilter<$PrismaModel> } + export type NestedEnumModelFileKindFilter<$PrismaModel = never> = { + equals?: $Enums.ModelFileKind | EnumModelFileKindFieldRefInput<$PrismaModel> + in?: $Enums.ModelFileKind[] | ListEnumModelFileKindFieldRefInput<$PrismaModel> + notIn?: $Enums.ModelFileKind[] | ListEnumModelFileKindFieldRefInput<$PrismaModel> + not?: NestedEnumModelFileKindFilter<$PrismaModel> | $Enums.ModelFileKind + } + + export type NestedEnumModelFileKindWithAggregatesFilter<$PrismaModel = never> = { + equals?: $Enums.ModelFileKind | EnumModelFileKindFieldRefInput<$PrismaModel> + in?: $Enums.ModelFileKind[] | ListEnumModelFileKindFieldRefInput<$PrismaModel> + notIn?: $Enums.ModelFileKind[] | ListEnumModelFileKindFieldRefInput<$PrismaModel> + not?: NestedEnumModelFileKindWithAggregatesFilter<$PrismaModel> | $Enums.ModelFileKind + _count?: NestedIntFilter<$PrismaModel> + _min?: NestedEnumModelFileKindFilter<$PrismaModel> + _max?: NestedEnumModelFileKindFilter<$PrismaModel> + } + export type NestedEnumAuthorRoleFilter<$PrismaModel = never> = { equals?: $Enums.AuthorRole | EnumAuthorRoleFieldRefInput<$PrismaModel> in?: $Enums.AuthorRole[] | ListEnumAuthorRoleFieldRefInput<$PrismaModel> @@ -30253,6 +28954,7 @@ export namespace Prisma { versionNumber: number title: string description?: string | null + changeSummary?: string | null previewImageFileKey?: string | null netlogoFileKey: string netlogoVersion?: string | null @@ -30261,7 +28963,6 @@ export namespace Prisma { finalizedAt?: Date | string | null model: ModelCreateNestedOneWithoutVersionsInput parentOfModels?: ModelCreateNestedManyWithoutParentVersionInput - files?: ModelVersionFileCreateNestedManyWithoutModelVersionInput tags?: ModelVersionTagCreateNestedManyWithoutModelVersionInput taggedAdditionalFiles?: ModelAdditionalFileCreateNestedManyWithoutTaggedVersionInput } @@ -30271,6 +28972,7 @@ export namespace Prisma { versionNumber: number title: string description?: string | null + changeSummary?: string | null previewImageFileKey?: string | null netlogoFileKey: string netlogoVersion?: string | null @@ -30278,7 +28980,6 @@ export namespace Prisma { createdAt?: Date | string finalizedAt?: Date | string | null parentOfModels?: ModelUncheckedCreateNestedManyWithoutParentVersionInput - files?: ModelVersionFileUncheckedCreateNestedManyWithoutModelVersionInput tags?: ModelVersionTagUncheckedCreateNestedManyWithoutModelVersionInput taggedAdditionalFiles?: ModelAdditionalFileUncheckedCreateNestedManyWithoutTaggedVersionInput } @@ -30405,6 +29106,7 @@ export namespace Prisma { versionNumber: number title: string description?: string | null + changeSummary?: string | null previewImageFileKey?: string | null netlogoFileKey: string netlogoVersion?: string | null @@ -30413,7 +29115,6 @@ export namespace Prisma { finalizedAt?: Date | string | null model: ModelCreateNestedOneWithoutVersionsInput latestOfModel?: ModelCreateNestedOneWithoutLatestVersionInput - files?: ModelVersionFileCreateNestedManyWithoutModelVersionInput tags?: ModelVersionTagCreateNestedManyWithoutModelVersionInput taggedAdditionalFiles?: ModelAdditionalFileCreateNestedManyWithoutTaggedVersionInput } @@ -30423,6 +29124,7 @@ export namespace Prisma { versionNumber: number title: string description?: string | null + changeSummary?: string | null previewImageFileKey?: string | null netlogoFileKey: string netlogoVersion?: string | null @@ -30430,7 +29132,6 @@ export namespace Prisma { createdAt?: Date | string finalizedAt?: Date | string | null latestOfModel?: ModelUncheckedCreateNestedOneWithoutLatestVersionInput - files?: ModelVersionFileUncheckedCreateNestedManyWithoutModelVersionInput tags?: ModelVersionTagUncheckedCreateNestedManyWithoutModelVersionInput taggedAdditionalFiles?: ModelAdditionalFileUncheckedCreateNestedManyWithoutTaggedVersionInput } @@ -30444,6 +29145,7 @@ export namespace Prisma { versionNumber: number title: string description?: string | null + changeSummary?: string | null previewImageFileKey?: string | null netlogoFileKey: string netlogoVersion?: string | null @@ -30452,7 +29154,6 @@ export namespace Prisma { finalizedAt?: Date | string | null latestOfModel?: ModelCreateNestedOneWithoutLatestVersionInput parentOfModels?: ModelCreateNestedManyWithoutParentVersionInput - files?: ModelVersionFileCreateNestedManyWithoutModelVersionInput tags?: ModelVersionTagCreateNestedManyWithoutModelVersionInput taggedAdditionalFiles?: ModelAdditionalFileCreateNestedManyWithoutTaggedVersionInput } @@ -30461,6 +29162,7 @@ export namespace Prisma { versionNumber: number title: string description?: string | null + changeSummary?: string | null previewImageFileKey?: string | null netlogoFileKey: string netlogoVersion?: string | null @@ -30469,7 +29171,6 @@ export namespace Prisma { finalizedAt?: Date | string | null latestOfModel?: ModelUncheckedCreateNestedOneWithoutLatestVersionInput parentOfModels?: ModelUncheckedCreateNestedManyWithoutParentVersionInput - files?: ModelVersionFileUncheckedCreateNestedManyWithoutModelVersionInput tags?: ModelVersionTagUncheckedCreateNestedManyWithoutModelVersionInput taggedAdditionalFiles?: ModelAdditionalFileUncheckedCreateNestedManyWithoutTaggedVersionInput } @@ -30533,6 +29234,7 @@ export namespace Prisma { export type ModelAdditionalFileCreateWithoutModelInput = { id?: string fileKey: string + kind?: $Enums.ModelFileKind createdAt?: Date | string taggedVersion: ModelVersionCreateNestedOneWithoutTaggedAdditionalFilesInput } @@ -30541,6 +29243,7 @@ export namespace Prisma { id?: string taggedVersionNumber: number fileKey: string + kind?: $Enums.ModelFileKind createdAt?: Date | string } @@ -30655,6 +29358,7 @@ export namespace Prisma { versionNumber?: IntFieldUpdateOperationsInput | number title?: StringFieldUpdateOperationsInput | string description?: NullableStringFieldUpdateOperationsInput | string | null + changeSummary?: NullableStringFieldUpdateOperationsInput | string | null previewImageFileKey?: NullableStringFieldUpdateOperationsInput | string | null netlogoFileKey?: StringFieldUpdateOperationsInput | string netlogoVersion?: NullableStringFieldUpdateOperationsInput | string | null @@ -30663,7 +29367,6 @@ export namespace Prisma { finalizedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null model?: ModelUpdateOneRequiredWithoutVersionsNestedInput parentOfModels?: ModelUpdateManyWithoutParentVersionNestedInput - files?: ModelVersionFileUpdateManyWithoutModelVersionNestedInput tags?: ModelVersionTagUpdateManyWithoutModelVersionNestedInput taggedAdditionalFiles?: ModelAdditionalFileUpdateManyWithoutTaggedVersionNestedInput } @@ -30673,6 +29376,7 @@ export namespace Prisma { versionNumber?: IntFieldUpdateOperationsInput | number title?: StringFieldUpdateOperationsInput | string description?: NullableStringFieldUpdateOperationsInput | string | null + changeSummary?: NullableStringFieldUpdateOperationsInput | string | null previewImageFileKey?: NullableStringFieldUpdateOperationsInput | string | null netlogoFileKey?: StringFieldUpdateOperationsInput | string netlogoVersion?: NullableStringFieldUpdateOperationsInput | string | null @@ -30680,7 +29384,6 @@ export namespace Prisma { createdAt?: DateTimeFieldUpdateOperationsInput | Date | string finalizedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null parentOfModels?: ModelUncheckedUpdateManyWithoutParentVersionNestedInput - files?: ModelVersionFileUncheckedUpdateManyWithoutModelVersionNestedInput tags?: ModelVersionTagUncheckedUpdateManyWithoutModelVersionNestedInput taggedAdditionalFiles?: ModelAdditionalFileUncheckedUpdateManyWithoutTaggedVersionNestedInput } @@ -30797,6 +29500,7 @@ export namespace Prisma { versionNumber?: IntFieldUpdateOperationsInput | number title?: StringFieldUpdateOperationsInput | string description?: NullableStringFieldUpdateOperationsInput | string | null + changeSummary?: NullableStringFieldUpdateOperationsInput | string | null previewImageFileKey?: NullableStringFieldUpdateOperationsInput | string | null netlogoFileKey?: StringFieldUpdateOperationsInput | string netlogoVersion?: NullableStringFieldUpdateOperationsInput | string | null @@ -30805,7 +29509,6 @@ export namespace Prisma { finalizedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null model?: ModelUpdateOneRequiredWithoutVersionsNestedInput latestOfModel?: ModelUpdateOneWithoutLatestVersionNestedInput - files?: ModelVersionFileUpdateManyWithoutModelVersionNestedInput tags?: ModelVersionTagUpdateManyWithoutModelVersionNestedInput taggedAdditionalFiles?: ModelAdditionalFileUpdateManyWithoutTaggedVersionNestedInput } @@ -30815,6 +29518,7 @@ export namespace Prisma { versionNumber?: IntFieldUpdateOperationsInput | number title?: StringFieldUpdateOperationsInput | string description?: NullableStringFieldUpdateOperationsInput | string | null + changeSummary?: NullableStringFieldUpdateOperationsInput | string | null previewImageFileKey?: NullableStringFieldUpdateOperationsInput | string | null netlogoFileKey?: StringFieldUpdateOperationsInput | string netlogoVersion?: NullableStringFieldUpdateOperationsInput | string | null @@ -30822,7 +29526,6 @@ export namespace Prisma { createdAt?: DateTimeFieldUpdateOperationsInput | Date | string finalizedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null latestOfModel?: ModelUncheckedUpdateOneWithoutLatestVersionNestedInput - files?: ModelVersionFileUncheckedUpdateManyWithoutModelVersionNestedInput tags?: ModelVersionTagUncheckedUpdateManyWithoutModelVersionNestedInput taggedAdditionalFiles?: ModelAdditionalFileUncheckedUpdateManyWithoutTaggedVersionNestedInput } @@ -30851,6 +29554,7 @@ export namespace Prisma { versionNumber?: IntFilter<"ModelVersion"> | number title?: StringFilter<"ModelVersion"> | string description?: StringNullableFilter<"ModelVersion"> | string | null + changeSummary?: StringNullableFilter<"ModelVersion"> | string | null previewImageFileKey?: StringNullableFilter<"ModelVersion"> | string | null netlogoFileKey?: StringFilter<"ModelVersion"> | string netlogoVersion?: StringNullableFilter<"ModelVersion"> | string | null @@ -30915,6 +29619,7 @@ export namespace Prisma { modelId?: StringFilter<"ModelAdditionalFile"> | string taggedVersionNumber?: IntFilter<"ModelAdditionalFile"> | number fileKey?: StringFilter<"ModelAdditionalFile"> | string + kind?: EnumModelFileKindFilter<"ModelAdditionalFile"> | $Enums.ModelFileKind createdAt?: DateTimeFilter<"ModelAdditionalFile"> | Date | string } @@ -31131,26 +29836,6 @@ export namespace Prisma { skipDuplicates?: boolean } - export type ModelVersionFileCreateWithoutModelVersionInput = { - id?: string - fileKey: string - } - - export type ModelVersionFileUncheckedCreateWithoutModelVersionInput = { - id?: string - fileKey: string - } - - export type ModelVersionFileCreateOrConnectWithoutModelVersionInput = { - where: ModelVersionFileWhereUniqueInput - create: XOR - } - - export type ModelVersionFileCreateManyModelVersionInputEnvelope = { - data: ModelVersionFileCreateManyModelVersionInput | ModelVersionFileCreateManyModelVersionInput[] - skipDuplicates?: boolean - } - export type ModelVersionTagCreateWithoutModelVersionInput = { createdAt?: Date | string tag: TagCreateNestedOneWithoutModelVersionsInput @@ -31174,6 +29859,7 @@ export namespace Prisma { export type ModelAdditionalFileCreateWithoutTaggedVersionInput = { id?: string fileKey: string + kind?: $Enums.ModelFileKind createdAt?: Date | string model: ModelCreateNestedOneWithoutAdditionalFilesInput } @@ -31181,6 +29867,7 @@ export namespace Prisma { export type ModelAdditionalFileUncheckedCreateWithoutTaggedVersionInput = { id?: string fileKey: string + kind?: $Enums.ModelFileKind createdAt?: Date | string } @@ -31329,32 +30016,6 @@ export namespace Prisma { data: XOR } - export type ModelVersionFileUpsertWithWhereUniqueWithoutModelVersionInput = { - where: ModelVersionFileWhereUniqueInput - update: XOR - create: XOR - } - - export type ModelVersionFileUpdateWithWhereUniqueWithoutModelVersionInput = { - where: ModelVersionFileWhereUniqueInput - data: XOR - } - - export type ModelVersionFileUpdateManyWithWhereWithoutModelVersionInput = { - where: ModelVersionFileScalarWhereInput - data: XOR - } - - export type ModelVersionFileScalarWhereInput = { - AND?: ModelVersionFileScalarWhereInput | ModelVersionFileScalarWhereInput[] - OR?: ModelVersionFileScalarWhereInput[] - NOT?: ModelVersionFileScalarWhereInput | ModelVersionFileScalarWhereInput[] - id?: StringFilter<"ModelVersionFile"> | string - modelId?: StringFilter<"ModelVersionFile"> | string - versionNumber?: IntFilter<"ModelVersionFile"> | number - fileKey?: StringFilter<"ModelVersionFile"> | string - } - export type ModelVersionTagUpsertWithWhereUniqueWithoutModelVersionInput = { where: ModelVersionTagWhereUniqueInput update: XOR @@ -31397,94 +30058,11 @@ export namespace Prisma { data: XOR } - export type ModelVersionCreateWithoutFilesInput = { - versionNumber: number - title: string - description?: string | null - previewImageFileKey?: string | null - netlogoFileKey: string - netlogoVersion?: string | null - infoTab?: string | null - createdAt?: Date | string - finalizedAt?: Date | string | null - model: ModelCreateNestedOneWithoutVersionsInput - latestOfModel?: ModelCreateNestedOneWithoutLatestVersionInput - parentOfModels?: ModelCreateNestedManyWithoutParentVersionInput - tags?: ModelVersionTagCreateNestedManyWithoutModelVersionInput - taggedAdditionalFiles?: ModelAdditionalFileCreateNestedManyWithoutTaggedVersionInput - } - - export type ModelVersionUncheckedCreateWithoutFilesInput = { - modelId: string - versionNumber: number - title: string - description?: string | null - previewImageFileKey?: string | null - netlogoFileKey: string - netlogoVersion?: string | null - infoTab?: string | null - createdAt?: Date | string - finalizedAt?: Date | string | null - latestOfModel?: ModelUncheckedCreateNestedOneWithoutLatestVersionInput - parentOfModels?: ModelUncheckedCreateNestedManyWithoutParentVersionInput - tags?: ModelVersionTagUncheckedCreateNestedManyWithoutModelVersionInput - taggedAdditionalFiles?: ModelAdditionalFileUncheckedCreateNestedManyWithoutTaggedVersionInput - } - - export type ModelVersionCreateOrConnectWithoutFilesInput = { - where: ModelVersionWhereUniqueInput - create: XOR - } - - export type ModelVersionUpsertWithoutFilesInput = { - update: XOR - create: XOR - where?: ModelVersionWhereInput - } - - export type ModelVersionUpdateToOneWithWhereWithoutFilesInput = { - where?: ModelVersionWhereInput - data: XOR - } - - export type ModelVersionUpdateWithoutFilesInput = { - versionNumber?: IntFieldUpdateOperationsInput | number - title?: StringFieldUpdateOperationsInput | string - description?: NullableStringFieldUpdateOperationsInput | string | null - previewImageFileKey?: NullableStringFieldUpdateOperationsInput | string | null - netlogoFileKey?: StringFieldUpdateOperationsInput | string - netlogoVersion?: NullableStringFieldUpdateOperationsInput | string | null - infoTab?: NullableStringFieldUpdateOperationsInput | string | null - createdAt?: DateTimeFieldUpdateOperationsInput | Date | string - finalizedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null - model?: ModelUpdateOneRequiredWithoutVersionsNestedInput - latestOfModel?: ModelUpdateOneWithoutLatestVersionNestedInput - parentOfModels?: ModelUpdateManyWithoutParentVersionNestedInput - tags?: ModelVersionTagUpdateManyWithoutModelVersionNestedInput - taggedAdditionalFiles?: ModelAdditionalFileUpdateManyWithoutTaggedVersionNestedInput - } - - export type ModelVersionUncheckedUpdateWithoutFilesInput = { - modelId?: StringFieldUpdateOperationsInput | string - versionNumber?: IntFieldUpdateOperationsInput | number - title?: StringFieldUpdateOperationsInput | string - description?: NullableStringFieldUpdateOperationsInput | string | null - previewImageFileKey?: NullableStringFieldUpdateOperationsInput | string | null - netlogoFileKey?: StringFieldUpdateOperationsInput | string - netlogoVersion?: NullableStringFieldUpdateOperationsInput | string | null - infoTab?: NullableStringFieldUpdateOperationsInput | string | null - createdAt?: DateTimeFieldUpdateOperationsInput | Date | string - finalizedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null - latestOfModel?: ModelUncheckedUpdateOneWithoutLatestVersionNestedInput - parentOfModels?: ModelUncheckedUpdateManyWithoutParentVersionNestedInput - tags?: ModelVersionTagUncheckedUpdateManyWithoutModelVersionNestedInput - taggedAdditionalFiles?: ModelAdditionalFileUncheckedUpdateManyWithoutTaggedVersionNestedInput - } - export type ModelVersionCreateWithoutTagsInput = { versionNumber: number title: string description?: string | null + changeSummary?: string | null previewImageFileKey?: string | null netlogoFileKey: string netlogoVersion?: string | null @@ -31494,7 +30072,6 @@ export namespace Prisma { model: ModelCreateNestedOneWithoutVersionsInput latestOfModel?: ModelCreateNestedOneWithoutLatestVersionInput parentOfModels?: ModelCreateNestedManyWithoutParentVersionInput - files?: ModelVersionFileCreateNestedManyWithoutModelVersionInput taggedAdditionalFiles?: ModelAdditionalFileCreateNestedManyWithoutTaggedVersionInput } @@ -31503,6 +30080,7 @@ export namespace Prisma { versionNumber: number title: string description?: string | null + changeSummary?: string | null previewImageFileKey?: string | null netlogoFileKey: string netlogoVersion?: string | null @@ -31511,7 +30089,6 @@ export namespace Prisma { finalizedAt?: Date | string | null latestOfModel?: ModelUncheckedCreateNestedOneWithoutLatestVersionInput parentOfModels?: ModelUncheckedCreateNestedManyWithoutParentVersionInput - files?: ModelVersionFileUncheckedCreateNestedManyWithoutModelVersionInput taggedAdditionalFiles?: ModelAdditionalFileUncheckedCreateNestedManyWithoutTaggedVersionInput } @@ -31556,6 +30133,7 @@ export namespace Prisma { versionNumber?: IntFieldUpdateOperationsInput | number title?: StringFieldUpdateOperationsInput | string description?: NullableStringFieldUpdateOperationsInput | string | null + changeSummary?: NullableStringFieldUpdateOperationsInput | string | null previewImageFileKey?: NullableStringFieldUpdateOperationsInput | string | null netlogoFileKey?: StringFieldUpdateOperationsInput | string netlogoVersion?: NullableStringFieldUpdateOperationsInput | string | null @@ -31565,7 +30143,6 @@ export namespace Prisma { model?: ModelUpdateOneRequiredWithoutVersionsNestedInput latestOfModel?: ModelUpdateOneWithoutLatestVersionNestedInput parentOfModels?: ModelUpdateManyWithoutParentVersionNestedInput - files?: ModelVersionFileUpdateManyWithoutModelVersionNestedInput taggedAdditionalFiles?: ModelAdditionalFileUpdateManyWithoutTaggedVersionNestedInput } @@ -31574,6 +30151,7 @@ export namespace Prisma { versionNumber?: IntFieldUpdateOperationsInput | number title?: StringFieldUpdateOperationsInput | string description?: NullableStringFieldUpdateOperationsInput | string | null + changeSummary?: NullableStringFieldUpdateOperationsInput | string | null previewImageFileKey?: NullableStringFieldUpdateOperationsInput | string | null netlogoFileKey?: StringFieldUpdateOperationsInput | string netlogoVersion?: NullableStringFieldUpdateOperationsInput | string | null @@ -31582,7 +30160,6 @@ export namespace Prisma { finalizedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null latestOfModel?: ModelUncheckedUpdateOneWithoutLatestVersionNestedInput parentOfModels?: ModelUncheckedUpdateManyWithoutParentVersionNestedInput - files?: ModelVersionFileUncheckedUpdateManyWithoutModelVersionNestedInput taggedAdditionalFiles?: ModelAdditionalFileUncheckedUpdateManyWithoutTaggedVersionNestedInput } @@ -31671,6 +30248,7 @@ export namespace Prisma { versionNumber: number title: string description?: string | null + changeSummary?: string | null previewImageFileKey?: string | null netlogoFileKey: string netlogoVersion?: string | null @@ -31680,7 +30258,6 @@ export namespace Prisma { model: ModelCreateNestedOneWithoutVersionsInput latestOfModel?: ModelCreateNestedOneWithoutLatestVersionInput parentOfModels?: ModelCreateNestedManyWithoutParentVersionInput - files?: ModelVersionFileCreateNestedManyWithoutModelVersionInput tags?: ModelVersionTagCreateNestedManyWithoutModelVersionInput } @@ -31689,6 +30266,7 @@ export namespace Prisma { versionNumber: number title: string description?: string | null + changeSummary?: string | null previewImageFileKey?: string | null netlogoFileKey: string netlogoVersion?: string | null @@ -31697,7 +30275,6 @@ export namespace Prisma { finalizedAt?: Date | string | null latestOfModel?: ModelUncheckedCreateNestedOneWithoutLatestVersionInput parentOfModels?: ModelUncheckedCreateNestedManyWithoutParentVersionInput - files?: ModelVersionFileUncheckedCreateNestedManyWithoutModelVersionInput tags?: ModelVersionTagUncheckedCreateNestedManyWithoutModelVersionInput } @@ -31781,6 +30358,7 @@ export namespace Prisma { versionNumber?: IntFieldUpdateOperationsInput | number title?: StringFieldUpdateOperationsInput | string description?: NullableStringFieldUpdateOperationsInput | string | null + changeSummary?: NullableStringFieldUpdateOperationsInput | string | null previewImageFileKey?: NullableStringFieldUpdateOperationsInput | string | null netlogoFileKey?: StringFieldUpdateOperationsInput | string netlogoVersion?: NullableStringFieldUpdateOperationsInput | string | null @@ -31790,7 +30368,6 @@ export namespace Prisma { model?: ModelUpdateOneRequiredWithoutVersionsNestedInput latestOfModel?: ModelUpdateOneWithoutLatestVersionNestedInput parentOfModels?: ModelUpdateManyWithoutParentVersionNestedInput - files?: ModelVersionFileUpdateManyWithoutModelVersionNestedInput tags?: ModelVersionTagUpdateManyWithoutModelVersionNestedInput } @@ -31799,6 +30376,7 @@ export namespace Prisma { versionNumber?: IntFieldUpdateOperationsInput | number title?: StringFieldUpdateOperationsInput | string description?: NullableStringFieldUpdateOperationsInput | string | null + changeSummary?: NullableStringFieldUpdateOperationsInput | string | null previewImageFileKey?: NullableStringFieldUpdateOperationsInput | string | null netlogoFileKey?: StringFieldUpdateOperationsInput | string netlogoVersion?: NullableStringFieldUpdateOperationsInput | string | null @@ -31807,7 +30385,6 @@ export namespace Prisma { finalizedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null latestOfModel?: ModelUncheckedUpdateOneWithoutLatestVersionNestedInput parentOfModels?: ModelUncheckedUpdateManyWithoutParentVersionNestedInput - files?: ModelVersionFileUncheckedUpdateManyWithoutModelVersionNestedInput tags?: ModelVersionTagUncheckedUpdateManyWithoutModelVersionNestedInput } @@ -33747,6 +32324,7 @@ export namespace Prisma { versionNumber: number title: string description?: string | null + changeSummary?: string | null previewImageFileKey?: string | null netlogoFileKey: string netlogoVersion?: string | null @@ -33772,6 +32350,7 @@ export namespace Prisma { id?: string taggedVersionNumber: number fileKey: string + kind?: $Enums.ModelFileKind createdAt?: Date | string } @@ -33873,6 +32452,7 @@ export namespace Prisma { versionNumber?: IntFieldUpdateOperationsInput | number title?: StringFieldUpdateOperationsInput | string description?: NullableStringFieldUpdateOperationsInput | string | null + changeSummary?: NullableStringFieldUpdateOperationsInput | string | null previewImageFileKey?: NullableStringFieldUpdateOperationsInput | string | null netlogoFileKey?: StringFieldUpdateOperationsInput | string netlogoVersion?: NullableStringFieldUpdateOperationsInput | string | null @@ -33881,7 +32461,6 @@ export namespace Prisma { finalizedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null latestOfModel?: ModelUpdateOneWithoutLatestVersionNestedInput parentOfModels?: ModelUpdateManyWithoutParentVersionNestedInput - files?: ModelVersionFileUpdateManyWithoutModelVersionNestedInput tags?: ModelVersionTagUpdateManyWithoutModelVersionNestedInput taggedAdditionalFiles?: ModelAdditionalFileUpdateManyWithoutTaggedVersionNestedInput } @@ -33890,6 +32469,7 @@ export namespace Prisma { versionNumber?: IntFieldUpdateOperationsInput | number title?: StringFieldUpdateOperationsInput | string description?: NullableStringFieldUpdateOperationsInput | string | null + changeSummary?: NullableStringFieldUpdateOperationsInput | string | null previewImageFileKey?: NullableStringFieldUpdateOperationsInput | string | null netlogoFileKey?: StringFieldUpdateOperationsInput | string netlogoVersion?: NullableStringFieldUpdateOperationsInput | string | null @@ -33898,7 +32478,6 @@ export namespace Prisma { finalizedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null latestOfModel?: ModelUncheckedUpdateOneWithoutLatestVersionNestedInput parentOfModels?: ModelUncheckedUpdateManyWithoutParentVersionNestedInput - files?: ModelVersionFileUncheckedUpdateManyWithoutModelVersionNestedInput tags?: ModelVersionTagUncheckedUpdateManyWithoutModelVersionNestedInput taggedAdditionalFiles?: ModelAdditionalFileUncheckedUpdateManyWithoutTaggedVersionNestedInput } @@ -33907,6 +32486,7 @@ export namespace Prisma { versionNumber?: IntFieldUpdateOperationsInput | number title?: StringFieldUpdateOperationsInput | string description?: NullableStringFieldUpdateOperationsInput | string | null + changeSummary?: NullableStringFieldUpdateOperationsInput | string | null previewImageFileKey?: NullableStringFieldUpdateOperationsInput | string | null netlogoFileKey?: StringFieldUpdateOperationsInput | string netlogoVersion?: NullableStringFieldUpdateOperationsInput | string | null @@ -33957,6 +32537,7 @@ export namespace Prisma { export type ModelAdditionalFileUpdateWithoutModelInput = { id?: StringFieldUpdateOperationsInput | string fileKey?: StringFieldUpdateOperationsInput | string + kind?: EnumModelFileKindFieldUpdateOperationsInput | $Enums.ModelFileKind createdAt?: DateTimeFieldUpdateOperationsInput | Date | string taggedVersion?: ModelVersionUpdateOneRequiredWithoutTaggedAdditionalFilesNestedInput } @@ -33965,6 +32546,7 @@ export namespace Prisma { id?: StringFieldUpdateOperationsInput | string taggedVersionNumber?: IntFieldUpdateOperationsInput | number fileKey?: StringFieldUpdateOperationsInput | string + kind?: EnumModelFileKindFieldUpdateOperationsInput | $Enums.ModelFileKind createdAt?: DateTimeFieldUpdateOperationsInput | Date | string } @@ -33972,6 +32554,7 @@ export namespace Prisma { id?: StringFieldUpdateOperationsInput | string taggedVersionNumber?: IntFieldUpdateOperationsInput | number fileKey?: StringFieldUpdateOperationsInput | string + kind?: EnumModelFileKindFieldUpdateOperationsInput | $Enums.ModelFileKind createdAt?: DateTimeFieldUpdateOperationsInput | Date | string } @@ -34075,11 +32658,6 @@ export namespace Prisma { deletedAt?: Date | string | null } - export type ModelVersionFileCreateManyModelVersionInput = { - id?: string - fileKey: string - } - export type ModelVersionTagCreateManyModelVersionInput = { tagId: string createdAt?: Date | string @@ -34088,6 +32666,7 @@ export namespace Prisma { export type ModelAdditionalFileCreateManyTaggedVersionInput = { id?: string fileKey: string + kind?: $Enums.ModelFileKind createdAt?: Date | string } @@ -34155,21 +32734,6 @@ export namespace Prisma { deletedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null } - export type ModelVersionFileUpdateWithoutModelVersionInput = { - id?: StringFieldUpdateOperationsInput | string - fileKey?: StringFieldUpdateOperationsInput | string - } - - export type ModelVersionFileUncheckedUpdateWithoutModelVersionInput = { - id?: StringFieldUpdateOperationsInput | string - fileKey?: StringFieldUpdateOperationsInput | string - } - - export type ModelVersionFileUncheckedUpdateManyWithoutModelVersionInput = { - id?: StringFieldUpdateOperationsInput | string - fileKey?: StringFieldUpdateOperationsInput | string - } - export type ModelVersionTagUpdateWithoutModelVersionInput = { createdAt?: DateTimeFieldUpdateOperationsInput | Date | string tag?: TagUpdateOneRequiredWithoutModelVersionsNestedInput @@ -34188,6 +32752,7 @@ export namespace Prisma { export type ModelAdditionalFileUpdateWithoutTaggedVersionInput = { id?: StringFieldUpdateOperationsInput | string fileKey?: StringFieldUpdateOperationsInput | string + kind?: EnumModelFileKindFieldUpdateOperationsInput | $Enums.ModelFileKind createdAt?: DateTimeFieldUpdateOperationsInput | Date | string model?: ModelUpdateOneRequiredWithoutAdditionalFilesNestedInput } @@ -34195,12 +32760,14 @@ export namespace Prisma { export type ModelAdditionalFileUncheckedUpdateWithoutTaggedVersionInput = { id?: StringFieldUpdateOperationsInput | string fileKey?: StringFieldUpdateOperationsInput | string + kind?: EnumModelFileKindFieldUpdateOperationsInput | $Enums.ModelFileKind createdAt?: DateTimeFieldUpdateOperationsInput | Date | string } export type ModelAdditionalFileUncheckedUpdateManyWithoutTaggedVersionInput = { id?: StringFieldUpdateOperationsInput | string fileKey?: StringFieldUpdateOperationsInput | string + kind?: EnumModelFileKindFieldUpdateOperationsInput | $Enums.ModelFileKind createdAt?: DateTimeFieldUpdateOperationsInput | Date | string } diff --git a/apps/modeling-commons-backend/generated/prisma/index.js b/apps/modeling-commons-backend/generated/prisma/index.js index e48e2e53..f31a743b 100644 --- a/apps/modeling-commons-backend/generated/prisma/index.js +++ b/apps/modeling-commons-backend/generated/prisma/index.js @@ -193,6 +193,7 @@ exports.Prisma.ModelVersionScalarFieldEnum = { versionNumber: 'versionNumber', title: 'title', description: 'description', + changeSummary: 'changeSummary', previewImageFileKey: 'previewImageFileKey', netlogoFileKey: 'netlogoFileKey', netlogoVersion: 'netlogoVersion', @@ -201,13 +202,6 @@ exports.Prisma.ModelVersionScalarFieldEnum = { finalizedAt: 'finalizedAt' }; -exports.Prisma.ModelVersionFileScalarFieldEnum = { - id: 'id', - modelId: 'modelId', - versionNumber: 'versionNumber', - fileKey: 'fileKey' -}; - exports.Prisma.ModelVersionTagScalarFieldEnum = { modelId: 'modelId', versionNumber: 'versionNumber', @@ -220,6 +214,7 @@ exports.Prisma.ModelAdditionalFileScalarFieldEnum = { modelId: 'modelId', taggedVersionNumber: 'taggedVersionNumber', fileKey: 'fileKey', + kind: 'kind', createdAt: 'createdAt' }; @@ -354,6 +349,11 @@ exports.ModelInteractionKind = exports.$Enums.ModelInteractionKind = { share: 'share' }; +exports.ModelFileKind = exports.$Enums.ModelFileKind = { + model: 'model', + additional: 'additional' +}; + exports.Prisma.ModelName = { User: 'User', Account: 'Account', @@ -362,7 +362,6 @@ exports.Prisma.ModelName = { Passkey: 'Passkey', Model: 'Model', ModelVersion: 'ModelVersion', - ModelVersionFile: 'ModelVersionFile', ModelVersionTag: 'ModelVersionTag', ModelAdditionalFile: 'ModelAdditionalFile', Tag: 'Tag', @@ -381,14 +380,14 @@ const config = { "clientVersion": "7.8.0", "engineVersion": "3c6e192761c0362d496ed980de936e2f3cebcd3a", "activeProvider": "postgresql", - "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n output = \"../generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\n// Enums\n\nenum ModelVisibility {\n public\n private\n unlisted\n}\n\nenum SystemRole {\n admin\n moderator\n user\n}\n\nenum UserKind {\n student\n teacher\n researcher\n other\n}\n\nenum AuthorRole {\n owner\n contributor\n}\n\nenum PermissionLevel {\n read\n write\n admin\n}\n\nenum ModelInteractionKind {\n view\n run\n download\n share\n}\n\n// Better Auth core tables\n\nmodel User {\n id String @id @default(uuid())\n name String?\n email String? @unique\n emailVerified Boolean @default(false)\n image String?\n createdAt DateTime @default(now()) @db.Timestamptz(3)\n updatedAt DateTime @updatedAt @db.Timestamptz(3)\n\n // Extended fields\n systemRole SystemRole @default(user)\n userKind UserKind @default(other)\n isProfilePublic Boolean @default(false)\n deletedAt DateTime?\n\n // User profile fields\n bio String?\n country String?\n socialLinks Json? // e.g. [{ platform: 'twitter', url: '...' }]\n dob DateTime? @db.Date\n affiliation String?\n\n // Better Auth relations\n accounts Account[]\n sessions Session[]\n verifications Verification[]\n\n // Domain relations\n authoredModels ModelAuthor[]\n grantedPermissions ModelPermission[]\n events Event[]\n modelLikes ModelLike[]\n modelInteractions ModelInteraction[]\n modelDrafts ModelDraft[]\n\n // Better Auth Admin plugin\n role String?\n banned Boolean?\n banReason String?\n banExpires DateTime? @db.Timestamptz(3)\n\n // Application behavior\n onboardedAt DateTime? @db.Timestamptz(3)\n legacyId Int? @unique\n\n // Passkey relations\n passkeys Passkey[]\n}\n\nmodel Account {\n id String @id @default(uuid())\n userId String\n accountId String\n providerId String\n accessToken String?\n refreshToken String?\n accessTokenExpiresAt DateTime? @db.Timestamptz(3)\n refreshTokenExpiresAt DateTime? @db.Timestamptz(3)\n scope String?\n idToken String?\n password String?\n createdAt DateTime @default(now()) @db.Timestamptz(3)\n updatedAt DateTime @updatedAt @db.Timestamptz(3)\n\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@index([userId])\n}\n\nmodel Session {\n id String @id @default(uuid())\n userId String\n expiresAt DateTime\n token String @unique\n ipAddress String?\n userAgent String?\n createdAt DateTime @default(now()) @db.Timestamptz(3)\n updatedAt DateTime @updatedAt @db.Timestamptz(3)\n\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n // Better Auth Admin plugin fields\n impersonatedBy String?\n\n @@index([userId])\n}\n\nmodel Verification {\n id String @id @default(uuid())\n identifier String\n value String\n expiresAt DateTime\n createdAt DateTime? @default(now()) @db.Timestamptz(3)\n updatedAt DateTime? @updatedAt @db.Timestamptz(3)\n\n user User? @relation(fields: [userId], references: [id], onDelete: Cascade)\n userId String?\n\n @@index([userId])\n}\n\nmodel Passkey {\n id String @id @default(uuid())\n name String?\n publicKey String\n userId String\n credentialID String\n counter Int\n deviceType String\n backedUp Boolean\n transports String?\n createdAt DateTime? @default(now()) @db.Timestamptz(3)\n aaguid String?\n\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n}\n\n// Domain models\n\nmodel Model {\n id String @id @default(uuid())\n legacyId Int? @unique\n latestVersionNumber Int?\n parentModelId String?\n parentVersionNumber Int?\n visibility ModelVisibility @default(public)\n isEndorsed Boolean @default(false)\n isLibraryModel Boolean @default(false)\n viewCount Int @default(0)\n runCount Int @default(0)\n downloadCount Int @default(0)\n shareCount Int @default(0)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n deletedAt DateTime?\n\n latestVersion ModelVersion? @relation(\"LatestVersion\", fields: [id, latestVersionNumber], references: [modelId, versionNumber])\n parentModel Model? @relation(\"ModelParent\", fields: [parentModelId], references: [id])\n childModels Model[] @relation(\"ModelParent\")\n parentVersion ModelVersion? @relation(\"ParentVersion\", fields: [parentModelId, parentVersionNumber], references: [modelId, versionNumber])\n\n versions ModelVersion[] @relation(\"ModelVersions\")\n authors ModelAuthor[]\n permissions ModelPermission[]\n additionalFiles ModelAdditionalFile[]\n likes ModelLike[]\n interactions ModelInteraction[]\n drafts ModelDraft[]\n\n @@unique([id, latestVersionNumber])\n @@index([parentModelId])\n @@index([parentModelId, parentVersionNumber])\n @@index([viewCount])\n @@index([runCount])\n @@index([downloadCount])\n}\n\nmodel ModelVersion {\n modelId String\n versionNumber Int\n title String\n description String?\n previewImageFileKey String?\n netlogoFileKey String\n netlogoVersion String?\n infoTab String?\n createdAt DateTime @default(now())\n finalizedAt DateTime?\n\n model Model @relation(\"ModelVersions\", fields: [modelId], references: [id], onDelete: Cascade)\n\n // Reverse relations\n latestOfModel Model? @relation(\"LatestVersion\")\n parentOfModels Model[] @relation(\"ParentVersion\")\n\n files ModelVersionFile[]\n tags ModelVersionTag[]\n taggedAdditionalFiles ModelAdditionalFile[]\n\n @@id([modelId, versionNumber])\n @@index([modelId])\n}\n\nmodel ModelVersionFile {\n id String @id @default(uuid())\n modelId String\n versionNumber Int\n fileKey String\n\n modelVersion ModelVersion @relation(fields: [modelId, versionNumber], references: [modelId, versionNumber], onDelete: Cascade)\n\n @@index([modelId, versionNumber])\n @@index([fileKey])\n}\n\nmodel ModelVersionTag {\n modelId String\n versionNumber Int\n tagId String\n createdAt DateTime @default(now())\n\n modelVersion ModelVersion @relation(fields: [modelId, versionNumber], references: [modelId, versionNumber], onDelete: Cascade)\n tag Tag @relation(fields: [tagId], references: [id], onDelete: Cascade)\n\n @@id([modelId, versionNumber, tagId])\n @@index([tagId])\n}\n\nmodel ModelAdditionalFile {\n id String @id @default(uuid())\n modelId String\n taggedVersionNumber Int\n fileKey String\n createdAt DateTime @default(now())\n\n model Model @relation(fields: [modelId], references: [id], onDelete: Cascade)\n taggedVersion ModelVersion @relation(fields: [modelId, taggedVersionNumber], references: [modelId, versionNumber])\n\n @@index([modelId])\n @@index([modelId, taggedVersionNumber])\n}\n\nmodel Tag {\n id String @id @default(uuid())\n legacyId Int? @unique\n name String @unique\n displayName String?\n createdAt DateTime @default(now())\n\n modelVersions ModelVersionTag[]\n}\n\nmodel ModelAuthor {\n modelId String\n userId String\n role AuthorRole\n createdAt DateTime @default(now())\n\n model Model @relation(fields: [modelId], references: [id], onDelete: Cascade)\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@id([modelId, userId])\n @@index([userId])\n}\n\nmodel ModelPermission {\n id String @id @default(uuid())\n modelId String\n granteeUserId String?\n permissionLevel PermissionLevel\n createdAt DateTime @default(now())\n\n model Model @relation(fields: [modelId], references: [id], onDelete: Cascade)\n granteeUser User? @relation(fields: [granteeUserId], references: [id], onDelete: Cascade)\n\n @@unique([modelId, granteeUserId])\n @@index([modelId])\n @@index([granteeUserId])\n}\n\nmodel ModelLike {\n modelId String\n userId String\n createdAt DateTime @default(now()) @db.Timestamptz(3)\n\n model Model @relation(fields: [modelId], references: [id], onDelete: Cascade)\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@id([modelId, userId])\n @@index([userId])\n @@index([modelId, createdAt])\n}\n\nmodel ModelInteraction {\n id String @id @default(uuid())\n modelId String\n versionNumber Int?\n kind ModelInteractionKind\n userId String?\n sessionId String?\n ipHash String?\n userAgent String?\n referer String?\n geo Json?\n cookie String?\n\n createdAt DateTime @default(now()) @db.Timestamptz(3)\n\n model Model @relation(fields: [modelId], references: [id], onDelete: Cascade)\n user User? @relation(fields: [userId], references: [id], onDelete: SetNull)\n\n @@index([modelId, kind, createdAt])\n @@index([modelId, kind, userId])\n @@index([userId, createdAt])\n @@index([createdAt])\n}\n\nmodel ModelDraft {\n id String @id @default(cuid())\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n modelId String?\n model Model? @relation(fields: [modelId], references: [id], onDelete: Cascade)\n\n schemaVersion Int\n data Json\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userId])\n @@index([modelId])\n}\n\nmodel Event {\n id String @id @default(uuid())\n type String\n actorId String\n resourceType String\n resourceId String\n payload Json\n createdAt DateTime @default(now())\n processedAt DateTime?\n\n actor User @relation(fields: [actorId], references: [id])\n\n @@index([actorId])\n @@index([resourceType, resourceId])\n @@index([type])\n @@index([processedAt])\n}\n" + "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n output = \"../generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\n// Enums\n\nenum ModelVisibility {\n public\n private\n unlisted\n}\n\nenum SystemRole {\n admin\n moderator\n user\n}\n\nenum UserKind {\n student\n teacher\n researcher\n other\n}\n\nenum AuthorRole {\n owner\n contributor\n}\n\nenum PermissionLevel {\n read\n write\n admin\n}\n\nenum ModelInteractionKind {\n view\n run\n download\n share\n}\n\nenum ModelFileKind {\n model\n additional\n}\n\n// Better Auth core tables\n\nmodel User {\n id String @id @default(uuid())\n name String?\n email String? @unique\n emailVerified Boolean @default(false)\n image String?\n createdAt DateTime @default(now()) @db.Timestamptz(3)\n updatedAt DateTime @updatedAt @db.Timestamptz(3)\n\n // Extended fields\n systemRole SystemRole @default(user)\n userKind UserKind @default(other)\n isProfilePublic Boolean @default(false)\n deletedAt DateTime?\n\n // User profile fields\n bio String?\n country String?\n socialLinks Json? // e.g. [{ platform: 'twitter', url: '...' }]\n dob DateTime? @db.Date\n affiliation String?\n\n // Better Auth relations\n accounts Account[]\n sessions Session[]\n verifications Verification[]\n\n // Domain relations\n authoredModels ModelAuthor[]\n grantedPermissions ModelPermission[]\n events Event[]\n modelLikes ModelLike[]\n modelInteractions ModelInteraction[]\n modelDrafts ModelDraft[]\n\n // Better Auth Admin plugin\n role String?\n banned Boolean?\n banReason String?\n banExpires DateTime? @db.Timestamptz(3)\n\n // Application behavior\n onboardedAt DateTime? @db.Timestamptz(3)\n legacyId Int? @unique\n\n // Passkey relations\n passkeys Passkey[]\n}\n\nmodel Account {\n id String @id @default(uuid())\n userId String\n accountId String\n providerId String\n accessToken String?\n refreshToken String?\n accessTokenExpiresAt DateTime? @db.Timestamptz(3)\n refreshTokenExpiresAt DateTime? @db.Timestamptz(3)\n scope String?\n idToken String?\n password String?\n createdAt DateTime @default(now()) @db.Timestamptz(3)\n updatedAt DateTime @updatedAt @db.Timestamptz(3)\n\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@index([userId])\n}\n\nmodel Session {\n id String @id @default(uuid())\n userId String\n expiresAt DateTime\n token String @unique\n ipAddress String?\n userAgent String?\n createdAt DateTime @default(now()) @db.Timestamptz(3)\n updatedAt DateTime @updatedAt @db.Timestamptz(3)\n\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n // Better Auth Admin plugin fields\n impersonatedBy String?\n\n @@index([userId])\n}\n\nmodel Verification {\n id String @id @default(uuid())\n identifier String\n value String\n expiresAt DateTime\n createdAt DateTime? @default(now()) @db.Timestamptz(3)\n updatedAt DateTime? @updatedAt @db.Timestamptz(3)\n\n user User? @relation(fields: [userId], references: [id], onDelete: Cascade)\n userId String?\n\n @@index([userId])\n}\n\nmodel Passkey {\n id String @id @default(uuid())\n name String?\n publicKey String\n userId String\n credentialID String\n counter Int\n deviceType String\n backedUp Boolean\n transports String?\n createdAt DateTime? @default(now()) @db.Timestamptz(3)\n aaguid String?\n\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n}\n\n// Domain models\n\nmodel Model {\n id String @id @default(uuid())\n legacyId Int? @unique\n latestVersionNumber Int?\n parentModelId String?\n parentVersionNumber Int?\n visibility ModelVisibility @default(public)\n isEndorsed Boolean @default(false)\n isLibraryModel Boolean @default(false)\n viewCount Int @default(0)\n runCount Int @default(0)\n downloadCount Int @default(0)\n shareCount Int @default(0)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n deletedAt DateTime?\n\n latestVersion ModelVersion? @relation(\"LatestVersion\", fields: [id, latestVersionNumber], references: [modelId, versionNumber])\n parentModel Model? @relation(\"ModelParent\", fields: [parentModelId], references: [id])\n childModels Model[] @relation(\"ModelParent\")\n parentVersion ModelVersion? @relation(\"ParentVersion\", fields: [parentModelId, parentVersionNumber], references: [modelId, versionNumber])\n\n versions ModelVersion[] @relation(\"ModelVersions\")\n authors ModelAuthor[]\n permissions ModelPermission[]\n additionalFiles ModelAdditionalFile[]\n likes ModelLike[]\n interactions ModelInteraction[]\n drafts ModelDraft[]\n\n @@unique([id, latestVersionNumber])\n @@index([parentModelId])\n @@index([parentModelId, parentVersionNumber])\n @@index([viewCount])\n @@index([runCount])\n @@index([downloadCount])\n}\n\nmodel ModelVersion {\n modelId String\n versionNumber Int\n title String\n description String?\n changeSummary String?\n previewImageFileKey String?\n netlogoFileKey String\n netlogoVersion String?\n infoTab String?\n createdAt DateTime @default(now())\n finalizedAt DateTime?\n\n model Model @relation(\"ModelVersions\", fields: [modelId], references: [id], onDelete: Cascade)\n\n // Reverse relations\n latestOfModel Model? @relation(\"LatestVersion\")\n parentOfModels Model[] @relation(\"ParentVersion\")\n\n tags ModelVersionTag[]\n taggedAdditionalFiles ModelAdditionalFile[]\n\n @@id([modelId, versionNumber])\n @@index([modelId])\n}\n\nmodel ModelVersionTag {\n modelId String\n versionNumber Int\n tagId String\n createdAt DateTime @default(now())\n\n modelVersion ModelVersion @relation(fields: [modelId, versionNumber], references: [modelId, versionNumber], onDelete: Cascade)\n tag Tag @relation(fields: [tagId], references: [id], onDelete: Cascade)\n\n @@id([modelId, versionNumber, tagId])\n @@index([tagId])\n}\n\nmodel ModelAdditionalFile {\n id String @id @default(uuid())\n modelId String\n taggedVersionNumber Int\n fileKey String\n kind ModelFileKind @default(additional)\n createdAt DateTime @default(now())\n\n model Model @relation(fields: [modelId], references: [id], onDelete: Cascade)\n taggedVersion ModelVersion @relation(fields: [modelId, taggedVersionNumber], references: [modelId, versionNumber])\n\n @@index([modelId])\n @@index([modelId, taggedVersionNumber])\n}\n\nmodel Tag {\n id String @id @default(uuid())\n legacyId Int? @unique\n name String @unique\n displayName String?\n createdAt DateTime @default(now())\n\n modelVersions ModelVersionTag[]\n}\n\nmodel ModelAuthor {\n modelId String\n userId String\n role AuthorRole\n createdAt DateTime @default(now())\n\n model Model @relation(fields: [modelId], references: [id], onDelete: Cascade)\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@id([modelId, userId])\n @@index([userId])\n}\n\nmodel ModelPermission {\n id String @id @default(uuid())\n modelId String\n granteeUserId String?\n permissionLevel PermissionLevel\n createdAt DateTime @default(now())\n\n model Model @relation(fields: [modelId], references: [id], onDelete: Cascade)\n granteeUser User? @relation(fields: [granteeUserId], references: [id], onDelete: Cascade)\n\n @@unique([modelId, granteeUserId])\n @@index([modelId])\n @@index([granteeUserId])\n}\n\nmodel ModelLike {\n modelId String\n userId String\n createdAt DateTime @default(now()) @db.Timestamptz(3)\n\n model Model @relation(fields: [modelId], references: [id], onDelete: Cascade)\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@id([modelId, userId])\n @@index([userId])\n @@index([modelId, createdAt])\n}\n\nmodel ModelInteraction {\n id String @id @default(uuid())\n modelId String\n versionNumber Int?\n kind ModelInteractionKind\n userId String?\n sessionId String?\n ipHash String?\n userAgent String?\n referer String?\n geo Json?\n cookie String?\n\n createdAt DateTime @default(now()) @db.Timestamptz(3)\n\n model Model @relation(fields: [modelId], references: [id], onDelete: Cascade)\n user User? @relation(fields: [userId], references: [id], onDelete: SetNull)\n\n @@index([modelId, kind, createdAt])\n @@index([modelId, kind, userId])\n @@index([userId, createdAt])\n @@index([createdAt])\n}\n\nmodel ModelDraft {\n id String @id @default(cuid())\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n modelId String?\n model Model? @relation(fields: [modelId], references: [id], onDelete: Cascade)\n\n schemaVersion Int\n data Json\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userId])\n @@index([modelId])\n}\n\nmodel Event {\n id String @id @default(uuid())\n type String\n actorId String\n resourceType String\n resourceId String\n payload Json\n createdAt DateTime @default(now())\n processedAt DateTime?\n\n actor User @relation(fields: [actorId], references: [id])\n\n @@index([actorId])\n @@index([resourceType, resourceId])\n @@index([type])\n @@index([processedAt])\n}\n" } -config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"emailVerified\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"image\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"systemRole\",\"kind\":\"enum\",\"type\":\"SystemRole\"},{\"name\":\"userKind\",\"kind\":\"enum\",\"type\":\"UserKind\"},{\"name\":\"isProfilePublic\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"bio\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"country\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"socialLinks\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"dob\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"affiliation\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accounts\",\"kind\":\"object\",\"type\":\"Account\",\"relationName\":\"AccountToUser\"},{\"name\":\"sessions\",\"kind\":\"object\",\"type\":\"Session\",\"relationName\":\"SessionToUser\"},{\"name\":\"verifications\",\"kind\":\"object\",\"type\":\"Verification\",\"relationName\":\"UserToVerification\"},{\"name\":\"authoredModels\",\"kind\":\"object\",\"type\":\"ModelAuthor\",\"relationName\":\"ModelAuthorToUser\"},{\"name\":\"grantedPermissions\",\"kind\":\"object\",\"type\":\"ModelPermission\",\"relationName\":\"ModelPermissionToUser\"},{\"name\":\"events\",\"kind\":\"object\",\"type\":\"Event\",\"relationName\":\"EventToUser\"},{\"name\":\"modelLikes\",\"kind\":\"object\",\"type\":\"ModelLike\",\"relationName\":\"ModelLikeToUser\"},{\"name\":\"modelInteractions\",\"kind\":\"object\",\"type\":\"ModelInteraction\",\"relationName\":\"ModelInteractionToUser\"},{\"name\":\"modelDrafts\",\"kind\":\"object\",\"type\":\"ModelDraft\",\"relationName\":\"ModelDraftToUser\"},{\"name\":\"role\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"banned\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"banReason\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"banExpires\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"onboardedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"passkeys\",\"kind\":\"object\",\"type\":\"Passkey\",\"relationName\":\"PasskeyToUser\"}],\"dbName\":null},\"Account\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accountId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"providerId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accessToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"refreshToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accessTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"refreshTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"scope\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"idToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"AccountToUser\"}],\"dbName\":null},\"Session\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"token\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"SessionToUser\"},{\"name\":\"impersonatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"Verification\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"identifier\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"UserToVerification\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"Passkey\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"publicKey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"credentialID\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"counter\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"deviceType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"backedUp\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"transports\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"aaguid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"PasskeyToUser\"}],\"dbName\":null},\"Model\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"latestVersionNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"parentModelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"parentVersionNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"visibility\",\"kind\":\"enum\",\"type\":\"ModelVisibility\"},{\"name\":\"isEndorsed\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"isLibraryModel\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"viewCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"runCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"downloadCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"shareCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"latestVersion\",\"kind\":\"object\",\"type\":\"ModelVersion\",\"relationName\":\"LatestVersion\"},{\"name\":\"parentModel\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelParent\"},{\"name\":\"childModels\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelParent\"},{\"name\":\"parentVersion\",\"kind\":\"object\",\"type\":\"ModelVersion\",\"relationName\":\"ParentVersion\"},{\"name\":\"versions\",\"kind\":\"object\",\"type\":\"ModelVersion\",\"relationName\":\"ModelVersions\"},{\"name\":\"authors\",\"kind\":\"object\",\"type\":\"ModelAuthor\",\"relationName\":\"ModelToModelAuthor\"},{\"name\":\"permissions\",\"kind\":\"object\",\"type\":\"ModelPermission\",\"relationName\":\"ModelToModelPermission\"},{\"name\":\"additionalFiles\",\"kind\":\"object\",\"type\":\"ModelAdditionalFile\",\"relationName\":\"ModelToModelAdditionalFile\"},{\"name\":\"likes\",\"kind\":\"object\",\"type\":\"ModelLike\",\"relationName\":\"ModelToModelLike\"},{\"name\":\"interactions\",\"kind\":\"object\",\"type\":\"ModelInteraction\",\"relationName\":\"ModelToModelInteraction\"},{\"name\":\"drafts\",\"kind\":\"object\",\"type\":\"ModelDraft\",\"relationName\":\"ModelToModelDraft\"}],\"dbName\":null},\"ModelVersion\":{\"fields\":[{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"versionNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"previewImageFileKey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"netlogoFileKey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"netlogoVersion\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"infoTab\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"finalizedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"model\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelVersions\"},{\"name\":\"latestOfModel\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"LatestVersion\"},{\"name\":\"parentOfModels\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ParentVersion\"},{\"name\":\"files\",\"kind\":\"object\",\"type\":\"ModelVersionFile\",\"relationName\":\"ModelVersionToModelVersionFile\"},{\"name\":\"tags\",\"kind\":\"object\",\"type\":\"ModelVersionTag\",\"relationName\":\"ModelVersionToModelVersionTag\"},{\"name\":\"taggedAdditionalFiles\",\"kind\":\"object\",\"type\":\"ModelAdditionalFile\",\"relationName\":\"ModelAdditionalFileToModelVersion\"}],\"dbName\":null},\"ModelVersionFile\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"versionNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"fileKey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"modelVersion\",\"kind\":\"object\",\"type\":\"ModelVersion\",\"relationName\":\"ModelVersionToModelVersionFile\"}],\"dbName\":null},\"ModelVersionTag\":{\"fields\":[{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"versionNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"tagId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"modelVersion\",\"kind\":\"object\",\"type\":\"ModelVersion\",\"relationName\":\"ModelVersionToModelVersionTag\"},{\"name\":\"tag\",\"kind\":\"object\",\"type\":\"Tag\",\"relationName\":\"ModelVersionTagToTag\"}],\"dbName\":null},\"ModelAdditionalFile\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"taggedVersionNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"fileKey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"model\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelToModelAdditionalFile\"},{\"name\":\"taggedVersion\",\"kind\":\"object\",\"type\":\"ModelVersion\",\"relationName\":\"ModelAdditionalFileToModelVersion\"}],\"dbName\":null},\"Tag\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"displayName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"modelVersions\",\"kind\":\"object\",\"type\":\"ModelVersionTag\",\"relationName\":\"ModelVersionTagToTag\"}],\"dbName\":null},\"ModelAuthor\":{\"fields\":[{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"AuthorRole\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"model\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelToModelAuthor\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ModelAuthorToUser\"}],\"dbName\":null},\"ModelPermission\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"granteeUserId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"permissionLevel\",\"kind\":\"enum\",\"type\":\"PermissionLevel\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"model\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelToModelPermission\"},{\"name\":\"granteeUser\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ModelPermissionToUser\"}],\"dbName\":null},\"ModelLike\":{\"fields\":[{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"model\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelToModelLike\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ModelLikeToUser\"}],\"dbName\":null},\"ModelInteraction\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"versionNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"kind\",\"kind\":\"enum\",\"type\":\"ModelInteractionKind\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sessionId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"ipHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"referer\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"geo\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"cookie\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"model\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelToModelInteraction\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ModelInteractionToUser\"}],\"dbName\":null},\"ModelDraft\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ModelDraftToUser\"},{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"model\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelToModelDraft\"},{\"name\":\"schemaVersion\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"data\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Event\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"actorId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"resourceType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"resourceId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"payload\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"processedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"actor\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"EventToUser\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"emailVerified\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"image\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"systemRole\",\"kind\":\"enum\",\"type\":\"SystemRole\"},{\"name\":\"userKind\",\"kind\":\"enum\",\"type\":\"UserKind\"},{\"name\":\"isProfilePublic\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"bio\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"country\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"socialLinks\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"dob\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"affiliation\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accounts\",\"kind\":\"object\",\"type\":\"Account\",\"relationName\":\"AccountToUser\"},{\"name\":\"sessions\",\"kind\":\"object\",\"type\":\"Session\",\"relationName\":\"SessionToUser\"},{\"name\":\"verifications\",\"kind\":\"object\",\"type\":\"Verification\",\"relationName\":\"UserToVerification\"},{\"name\":\"authoredModels\",\"kind\":\"object\",\"type\":\"ModelAuthor\",\"relationName\":\"ModelAuthorToUser\"},{\"name\":\"grantedPermissions\",\"kind\":\"object\",\"type\":\"ModelPermission\",\"relationName\":\"ModelPermissionToUser\"},{\"name\":\"events\",\"kind\":\"object\",\"type\":\"Event\",\"relationName\":\"EventToUser\"},{\"name\":\"modelLikes\",\"kind\":\"object\",\"type\":\"ModelLike\",\"relationName\":\"ModelLikeToUser\"},{\"name\":\"modelInteractions\",\"kind\":\"object\",\"type\":\"ModelInteraction\",\"relationName\":\"ModelInteractionToUser\"},{\"name\":\"modelDrafts\",\"kind\":\"object\",\"type\":\"ModelDraft\",\"relationName\":\"ModelDraftToUser\"},{\"name\":\"role\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"banned\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"banReason\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"banExpires\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"onboardedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"passkeys\",\"kind\":\"object\",\"type\":\"Passkey\",\"relationName\":\"PasskeyToUser\"}],\"dbName\":null},\"Account\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accountId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"providerId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accessToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"refreshToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accessTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"refreshTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"scope\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"idToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"AccountToUser\"}],\"dbName\":null},\"Session\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"token\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"SessionToUser\"},{\"name\":\"impersonatedBy\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"Verification\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"identifier\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"UserToVerification\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"Passkey\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"publicKey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"credentialID\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"counter\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"deviceType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"backedUp\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"transports\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"aaguid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"PasskeyToUser\"}],\"dbName\":null},\"Model\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"latestVersionNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"parentModelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"parentVersionNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"visibility\",\"kind\":\"enum\",\"type\":\"ModelVisibility\"},{\"name\":\"isEndorsed\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"isLibraryModel\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"viewCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"runCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"downloadCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"shareCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"latestVersion\",\"kind\":\"object\",\"type\":\"ModelVersion\",\"relationName\":\"LatestVersion\"},{\"name\":\"parentModel\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelParent\"},{\"name\":\"childModels\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelParent\"},{\"name\":\"parentVersion\",\"kind\":\"object\",\"type\":\"ModelVersion\",\"relationName\":\"ParentVersion\"},{\"name\":\"versions\",\"kind\":\"object\",\"type\":\"ModelVersion\",\"relationName\":\"ModelVersions\"},{\"name\":\"authors\",\"kind\":\"object\",\"type\":\"ModelAuthor\",\"relationName\":\"ModelToModelAuthor\"},{\"name\":\"permissions\",\"kind\":\"object\",\"type\":\"ModelPermission\",\"relationName\":\"ModelToModelPermission\"},{\"name\":\"additionalFiles\",\"kind\":\"object\",\"type\":\"ModelAdditionalFile\",\"relationName\":\"ModelToModelAdditionalFile\"},{\"name\":\"likes\",\"kind\":\"object\",\"type\":\"ModelLike\",\"relationName\":\"ModelToModelLike\"},{\"name\":\"interactions\",\"kind\":\"object\",\"type\":\"ModelInteraction\",\"relationName\":\"ModelToModelInteraction\"},{\"name\":\"drafts\",\"kind\":\"object\",\"type\":\"ModelDraft\",\"relationName\":\"ModelToModelDraft\"}],\"dbName\":null},\"ModelVersion\":{\"fields\":[{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"versionNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"changeSummary\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"previewImageFileKey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"netlogoFileKey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"netlogoVersion\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"infoTab\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"finalizedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"model\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelVersions\"},{\"name\":\"latestOfModel\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"LatestVersion\"},{\"name\":\"parentOfModels\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ParentVersion\"},{\"name\":\"tags\",\"kind\":\"object\",\"type\":\"ModelVersionTag\",\"relationName\":\"ModelVersionToModelVersionTag\"},{\"name\":\"taggedAdditionalFiles\",\"kind\":\"object\",\"type\":\"ModelAdditionalFile\",\"relationName\":\"ModelAdditionalFileToModelVersion\"}],\"dbName\":null},\"ModelVersionTag\":{\"fields\":[{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"versionNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"tagId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"modelVersion\",\"kind\":\"object\",\"type\":\"ModelVersion\",\"relationName\":\"ModelVersionToModelVersionTag\"},{\"name\":\"tag\",\"kind\":\"object\",\"type\":\"Tag\",\"relationName\":\"ModelVersionTagToTag\"}],\"dbName\":null},\"ModelAdditionalFile\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"taggedVersionNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"fileKey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"kind\",\"kind\":\"enum\",\"type\":\"ModelFileKind\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"model\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelToModelAdditionalFile\"},{\"name\":\"taggedVersion\",\"kind\":\"object\",\"type\":\"ModelVersion\",\"relationName\":\"ModelAdditionalFileToModelVersion\"}],\"dbName\":null},\"Tag\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"displayName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"modelVersions\",\"kind\":\"object\",\"type\":\"ModelVersionTag\",\"relationName\":\"ModelVersionTagToTag\"}],\"dbName\":null},\"ModelAuthor\":{\"fields\":[{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"AuthorRole\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"model\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelToModelAuthor\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ModelAuthorToUser\"}],\"dbName\":null},\"ModelPermission\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"granteeUserId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"permissionLevel\",\"kind\":\"enum\",\"type\":\"PermissionLevel\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"model\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelToModelPermission\"},{\"name\":\"granteeUser\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ModelPermissionToUser\"}],\"dbName\":null},\"ModelLike\":{\"fields\":[{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"model\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelToModelLike\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ModelLikeToUser\"}],\"dbName\":null},\"ModelInteraction\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"versionNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"kind\",\"kind\":\"enum\",\"type\":\"ModelInteractionKind\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sessionId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"ipHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"referer\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"geo\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"cookie\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"model\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelToModelInteraction\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ModelInteractionToUser\"}],\"dbName\":null},\"ModelDraft\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ModelDraftToUser\"},{\"name\":\"modelId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"model\",\"kind\":\"object\",\"type\":\"Model\",\"relationName\":\"ModelToModelDraft\"},{\"name\":\"schemaVersion\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"data\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Event\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"actorId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"resourceType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"resourceId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"payload\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"processedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"actor\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"EventToUser\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}") defineDmmfProperty(exports.Prisma, config.runtimeDataModel) config.parameterizationSchema = { - strings: JSON.parse("[\"where\",\"orderBy\",\"cursor\",\"user\",\"accounts\",\"sessions\",\"verifications\",\"model\",\"latestOfModel\",\"parentOfModels\",\"modelVersion\",\"files\",\"modelVersions\",\"_count\",\"tag\",\"tags\",\"taggedVersion\",\"taggedAdditionalFiles\",\"latestVersion\",\"parentModel\",\"childModels\",\"parentVersion\",\"versions\",\"authors\",\"granteeUser\",\"permissions\",\"additionalFiles\",\"likes\",\"interactions\",\"drafts\",\"authoredModels\",\"grantedPermissions\",\"actor\",\"events\",\"modelLikes\",\"modelInteractions\",\"modelDrafts\",\"passkeys\",\"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\",\"Account.findUnique\",\"Account.findUniqueOrThrow\",\"Account.findFirst\",\"Account.findFirstOrThrow\",\"Account.findMany\",\"Account.createOne\",\"Account.createMany\",\"Account.createManyAndReturn\",\"Account.updateOne\",\"Account.updateMany\",\"Account.updateManyAndReturn\",\"Account.upsertOne\",\"Account.deleteOne\",\"Account.deleteMany\",\"Account.groupBy\",\"Account.aggregate\",\"Session.findUnique\",\"Session.findUniqueOrThrow\",\"Session.findFirst\",\"Session.findFirstOrThrow\",\"Session.findMany\",\"Session.createOne\",\"Session.createMany\",\"Session.createManyAndReturn\",\"Session.updateOne\",\"Session.updateMany\",\"Session.updateManyAndReturn\",\"Session.upsertOne\",\"Session.deleteOne\",\"Session.deleteMany\",\"Session.groupBy\",\"Session.aggregate\",\"Verification.findUnique\",\"Verification.findUniqueOrThrow\",\"Verification.findFirst\",\"Verification.findFirstOrThrow\",\"Verification.findMany\",\"Verification.createOne\",\"Verification.createMany\",\"Verification.createManyAndReturn\",\"Verification.updateOne\",\"Verification.updateMany\",\"Verification.updateManyAndReturn\",\"Verification.upsertOne\",\"Verification.deleteOne\",\"Verification.deleteMany\",\"Verification.groupBy\",\"Verification.aggregate\",\"Passkey.findUnique\",\"Passkey.findUniqueOrThrow\",\"Passkey.findFirst\",\"Passkey.findFirstOrThrow\",\"Passkey.findMany\",\"Passkey.createOne\",\"Passkey.createMany\",\"Passkey.createManyAndReturn\",\"Passkey.updateOne\",\"Passkey.updateMany\",\"Passkey.updateManyAndReturn\",\"Passkey.upsertOne\",\"Passkey.deleteOne\",\"Passkey.deleteMany\",\"Passkey.groupBy\",\"Passkey.aggregate\",\"Model.findUnique\",\"Model.findUniqueOrThrow\",\"Model.findFirst\",\"Model.findFirstOrThrow\",\"Model.findMany\",\"Model.createOne\",\"Model.createMany\",\"Model.createManyAndReturn\",\"Model.updateOne\",\"Model.updateMany\",\"Model.updateManyAndReturn\",\"Model.upsertOne\",\"Model.deleteOne\",\"Model.deleteMany\",\"Model.groupBy\",\"Model.aggregate\",\"ModelVersion.findUnique\",\"ModelVersion.findUniqueOrThrow\",\"ModelVersion.findFirst\",\"ModelVersion.findFirstOrThrow\",\"ModelVersion.findMany\",\"ModelVersion.createOne\",\"ModelVersion.createMany\",\"ModelVersion.createManyAndReturn\",\"ModelVersion.updateOne\",\"ModelVersion.updateMany\",\"ModelVersion.updateManyAndReturn\",\"ModelVersion.upsertOne\",\"ModelVersion.deleteOne\",\"ModelVersion.deleteMany\",\"ModelVersion.groupBy\",\"ModelVersion.aggregate\",\"ModelVersionFile.findUnique\",\"ModelVersionFile.findUniqueOrThrow\",\"ModelVersionFile.findFirst\",\"ModelVersionFile.findFirstOrThrow\",\"ModelVersionFile.findMany\",\"ModelVersionFile.createOne\",\"ModelVersionFile.createMany\",\"ModelVersionFile.createManyAndReturn\",\"ModelVersionFile.updateOne\",\"ModelVersionFile.updateMany\",\"ModelVersionFile.updateManyAndReturn\",\"ModelVersionFile.upsertOne\",\"ModelVersionFile.deleteOne\",\"ModelVersionFile.deleteMany\",\"ModelVersionFile.groupBy\",\"ModelVersionFile.aggregate\",\"ModelVersionTag.findUnique\",\"ModelVersionTag.findUniqueOrThrow\",\"ModelVersionTag.findFirst\",\"ModelVersionTag.findFirstOrThrow\",\"ModelVersionTag.findMany\",\"ModelVersionTag.createOne\",\"ModelVersionTag.createMany\",\"ModelVersionTag.createManyAndReturn\",\"ModelVersionTag.updateOne\",\"ModelVersionTag.updateMany\",\"ModelVersionTag.updateManyAndReturn\",\"ModelVersionTag.upsertOne\",\"ModelVersionTag.deleteOne\",\"ModelVersionTag.deleteMany\",\"ModelVersionTag.groupBy\",\"ModelVersionTag.aggregate\",\"ModelAdditionalFile.findUnique\",\"ModelAdditionalFile.findUniqueOrThrow\",\"ModelAdditionalFile.findFirst\",\"ModelAdditionalFile.findFirstOrThrow\",\"ModelAdditionalFile.findMany\",\"ModelAdditionalFile.createOne\",\"ModelAdditionalFile.createMany\",\"ModelAdditionalFile.createManyAndReturn\",\"ModelAdditionalFile.updateOne\",\"ModelAdditionalFile.updateMany\",\"ModelAdditionalFile.updateManyAndReturn\",\"ModelAdditionalFile.upsertOne\",\"ModelAdditionalFile.deleteOne\",\"ModelAdditionalFile.deleteMany\",\"ModelAdditionalFile.groupBy\",\"ModelAdditionalFile.aggregate\",\"Tag.findUnique\",\"Tag.findUniqueOrThrow\",\"Tag.findFirst\",\"Tag.findFirstOrThrow\",\"Tag.findMany\",\"Tag.createOne\",\"Tag.createMany\",\"Tag.createManyAndReturn\",\"Tag.updateOne\",\"Tag.updateMany\",\"Tag.updateManyAndReturn\",\"Tag.upsertOne\",\"Tag.deleteOne\",\"Tag.deleteMany\",\"Tag.groupBy\",\"Tag.aggregate\",\"ModelAuthor.findUnique\",\"ModelAuthor.findUniqueOrThrow\",\"ModelAuthor.findFirst\",\"ModelAuthor.findFirstOrThrow\",\"ModelAuthor.findMany\",\"ModelAuthor.createOne\",\"ModelAuthor.createMany\",\"ModelAuthor.createManyAndReturn\",\"ModelAuthor.updateOne\",\"ModelAuthor.updateMany\",\"ModelAuthor.updateManyAndReturn\",\"ModelAuthor.upsertOne\",\"ModelAuthor.deleteOne\",\"ModelAuthor.deleteMany\",\"ModelAuthor.groupBy\",\"ModelAuthor.aggregate\",\"ModelPermission.findUnique\",\"ModelPermission.findUniqueOrThrow\",\"ModelPermission.findFirst\",\"ModelPermission.findFirstOrThrow\",\"ModelPermission.findMany\",\"ModelPermission.createOne\",\"ModelPermission.createMany\",\"ModelPermission.createManyAndReturn\",\"ModelPermission.updateOne\",\"ModelPermission.updateMany\",\"ModelPermission.updateManyAndReturn\",\"ModelPermission.upsertOne\",\"ModelPermission.deleteOne\",\"ModelPermission.deleteMany\",\"ModelPermission.groupBy\",\"ModelPermission.aggregate\",\"ModelLike.findUnique\",\"ModelLike.findUniqueOrThrow\",\"ModelLike.findFirst\",\"ModelLike.findFirstOrThrow\",\"ModelLike.findMany\",\"ModelLike.createOne\",\"ModelLike.createMany\",\"ModelLike.createManyAndReturn\",\"ModelLike.updateOne\",\"ModelLike.updateMany\",\"ModelLike.updateManyAndReturn\",\"ModelLike.upsertOne\",\"ModelLike.deleteOne\",\"ModelLike.deleteMany\",\"ModelLike.groupBy\",\"ModelLike.aggregate\",\"ModelInteraction.findUnique\",\"ModelInteraction.findUniqueOrThrow\",\"ModelInteraction.findFirst\",\"ModelInteraction.findFirstOrThrow\",\"ModelInteraction.findMany\",\"ModelInteraction.createOne\",\"ModelInteraction.createMany\",\"ModelInteraction.createManyAndReturn\",\"ModelInteraction.updateOne\",\"ModelInteraction.updateMany\",\"ModelInteraction.updateManyAndReturn\",\"ModelInteraction.upsertOne\",\"ModelInteraction.deleteOne\",\"ModelInteraction.deleteMany\",\"ModelInteraction.groupBy\",\"ModelInteraction.aggregate\",\"ModelDraft.findUnique\",\"ModelDraft.findUniqueOrThrow\",\"ModelDraft.findFirst\",\"ModelDraft.findFirstOrThrow\",\"ModelDraft.findMany\",\"ModelDraft.createOne\",\"ModelDraft.createMany\",\"ModelDraft.createManyAndReturn\",\"ModelDraft.updateOne\",\"ModelDraft.updateMany\",\"ModelDraft.updateManyAndReturn\",\"ModelDraft.upsertOne\",\"ModelDraft.deleteOne\",\"ModelDraft.deleteMany\",\"ModelDraft.groupBy\",\"ModelDraft.aggregate\",\"Event.findUnique\",\"Event.findUniqueOrThrow\",\"Event.findFirst\",\"Event.findFirstOrThrow\",\"Event.findMany\",\"Event.createOne\",\"Event.createMany\",\"Event.createManyAndReturn\",\"Event.updateOne\",\"Event.updateMany\",\"Event.updateManyAndReturn\",\"Event.upsertOne\",\"Event.deleteOne\",\"Event.deleteMany\",\"Event.groupBy\",\"Event.aggregate\",\"AND\",\"OR\",\"NOT\",\"id\",\"type\",\"actorId\",\"resourceType\",\"resourceId\",\"payload\",\"createdAt\",\"processedAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"contains\",\"startsWith\",\"endsWith\",\"userId\",\"modelId\",\"schemaVersion\",\"updatedAt\",\"versionNumber\",\"ModelInteractionKind\",\"kind\",\"sessionId\",\"ipHash\",\"userAgent\",\"referer\",\"geo\",\"cookie\",\"granteeUserId\",\"PermissionLevel\",\"permissionLevel\",\"AuthorRole\",\"role\",\"legacyId\",\"name\",\"displayName\",\"every\",\"some\",\"none\",\"taggedVersionNumber\",\"fileKey\",\"tagId\",\"title\",\"description\",\"previewImageFileKey\",\"netlogoFileKey\",\"netlogoVersion\",\"infoTab\",\"finalizedAt\",\"latestVersionNumber\",\"parentModelId\",\"parentVersionNumber\",\"ModelVisibility\",\"visibility\",\"isEndorsed\",\"isLibraryModel\",\"viewCount\",\"runCount\",\"downloadCount\",\"shareCount\",\"deletedAt\",\"publicKey\",\"credentialID\",\"counter\",\"deviceType\",\"backedUp\",\"transports\",\"aaguid\",\"identifier\",\"value\",\"expiresAt\",\"token\",\"ipAddress\",\"impersonatedBy\",\"accountId\",\"providerId\",\"accessToken\",\"refreshToken\",\"accessTokenExpiresAt\",\"refreshTokenExpiresAt\",\"scope\",\"idToken\",\"password\",\"email\",\"emailVerified\",\"image\",\"SystemRole\",\"systemRole\",\"UserKind\",\"userKind\",\"isProfilePublic\",\"bio\",\"country\",\"socialLinks\",\"dob\",\"affiliation\",\"banned\",\"banReason\",\"banExpires\",\"onboardedAt\",\"modelId_userId\",\"modelId_granteeUserId\",\"modelId_versionNumber\",\"modelId_versionNumber_tagId\",\"id_latestVersionNumber\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), - graph: "xAmhAZACIwQAAOQEACAFAADlBAAgBgAA5gQAIB4AANgEACAfAADZBAAgIQAA5wQAICIAANoEACAjAADbBAAgJAAA3AQAICUAAOgEACC-AgAA4AQAML8CAAAPABDAAgAA4AQAMMECAQAAAAHHAkAAmgQAId0CQACaBAAh6wIBAJkEACHsAgIAAAAB7QIBAJkEACGHA0AAuAQAIZ4DAQAAAAGfAyAAtwQAIaADAQCZBAAhogMAAOEEogMipAMAAOIEpAMipQMgALcEACGmAwEAmQQAIacDAQCZBAAhqAMAAMAEACCpA0AAuAQAIaoDAQCZBAAhqwMgAOMEACGsAwEAmQQAIa0DQAC4BAAhrgNAALgEACEBAAAAAQAgEQMAALkEACC-AgAA6wQAML8CAAADABDAAgAA6wQAMMECAQCXBAAhxwJAAJoEACHaAgEAlwQAId0CQACaBAAhlQMBAJcEACGWAwEAlwQAIZcDAQCZBAAhmAMBAJkEACGZA0AAuAQAIZoDQAC4BAAhmwMBAJkEACGcAwEAmQQAIZ0DAQCZBAAhCAMAAK4IACCXAwAA7AQAIJgDAADsBAAgmQMAAOwEACCaAwAA7AQAIJsDAADsBAAgnAMAAOwEACCdAwAA7AQAIBEDAAC5BAAgvgIAAOsEADC_AgAAAwAQwAIAAOsEADDBAgEAAAABxwJAAJoEACHaAgEAlwQAId0CQACaBAAhlQMBAJcEACGWAwEAlwQAIZcDAQCZBAAhmAMBAJkEACGZA0AAuAQAIZoDQAC4BAAhmwMBAJkEACGcAwEAmQQAIZ0DAQCZBAAhAwAAAAMAIAEAAAQAMAIAAAUAIA0DAAC5BAAgvgIAAOoEADC_AgAABwAQwAIAAOoEADDBAgEAlwQAIccCQACaBAAh2gIBAJcEACHdAkAAmgQAIeMCAQCZBAAhkQNAAJoEACGSAwEAlwQAIZMDAQCZBAAhlAMBAJkEACEEAwAArggAIOMCAADsBAAgkwMAAOwEACCUAwAA7AQAIA0DAAC5BAAgvgIAAOoEADC_AgAABwAQwAIAAOoEADDBAgEAAAABxwJAAJoEACHaAgEAlwQAId0CQACaBAAh4wIBAJkEACGRA0AAmgQAIZIDAQAAAAGTAwEAmQQAIZQDAQCZBAAhAwAAAAcAIAEAAAgAMAIAAAkAIAsDAADCBAAgvgIAAOkEADC_AgAACwAQwAIAAOkEADDBAgEAlwQAIccCQAC4BAAh2gIBAJkEACHdAkAAuAQAIY8DAQCXBAAhkAMBAJcEACGRA0AAmgQAIQQDAACuCAAgxwIAAOwEACDaAgAA7AQAIN0CAADsBAAgCwMAAMIEACC-AgAA6QQAML8CAAALABDAAgAA6QQAMMECAQAAAAHHAkAAuAQAIdoCAQCZBAAh3QJAALgEACGPAwEAlwQAIZADAQCXBAAhkQNAAJoEACEDAAAACwAgAQAADAAwAgAADQAgIwQAAOQEACAFAADlBAAgBgAA5gQAIB4AANgEACAfAADZBAAgIQAA5wQAICIAANoEACAjAADbBAAgJAAA3AQAICUAAOgEACC-AgAA4AQAML8CAAAPABDAAgAA4AQAMMECAQCXBAAhxwJAAJoEACHdAkAAmgQAIesCAQCZBAAh7AICAJgEACHtAgEAmQQAIYcDQAC4BAAhngMBAJkEACGfAyAAtwQAIaADAQCZBAAhogMAAOEEogMipAMAAOIEpAMipQMgALcEACGmAwEAmQQAIacDAQCZBAAhqAMAAMAEACCpA0AAuAQAIaoDAQCZBAAhqwMgAOMEACGsAwEAmQQAIa0DQAC4BAAhrgNAALgEACEBAAAADwAgCQMAALkEACAHAADBBAAgvgIAAN4EADC_AgAAEQAQwAIAAN4EADDHAkAAmgQAIdoCAQCXBAAh2wIBAJcEACHrAgAA3wTrAiICAwAArggAIAcAAK8IACAKAwAAuQQAIAcAAMEEACC-AgAA3gQAML8CAAARABDAAgAA3gQAMMcCQACaBAAh2gIBAJcEACHbAgEAlwQAIesCAADfBOsCIq8DAADdBAAgAwAAABEAIAEAABIAMAIAABMAIBMHAADBBAAgCAAAvQQAIAkAAMoEACALAADLBAAgDwAAmwQAIBEAAMwEACC-AgAAyQQAML8CAAAVABDAAgAAyQQAMMcCQACaBAAh2wIBAJcEACHeAgIAtgQAIfUCAQCXBAAh9gIBAJkEACH3AgEAmQQAIfgCAQCXBAAh-QIBAJkEACH6AgEAmQQAIfsCQAC4BAAhAQAAABUAIB0SAADWBAAgEwAAvQQAIBQAAMoEACAVAADWBAAgFgAA1wQAIBcAANgEACAZAADZBAAgGgAAzAQAIBsAANoEACAcAADbBAAgHQAA3AQAIL4CAADUBAAwvwIAABcAEMACAADUBAAwwQIBAJcEACHHAkAAmgQAId0CQACaBAAh7AICAJgEACH8AgIAmAQAIf0CAQCZBAAh_gICAJgEACGAAwAA1QSAAyKBAyAAtwQAIYIDIAC3BAAhgwMCALYEACGEAwIAtgQAIYUDAgC2BAAhhgMCALYEACGHA0AAuAQAIQEAAAAXACAQEgAAswgAIBMAAK8IACAUAACwCAAgFQAAswgAIBYAALUIACAXAACnCAAgGQAAqAgAIBoAALIIACAbAACqCAAgHAAAqwgAIB0AAKwIACDsAgAA7AQAIPwCAADsBAAg_QIAAOwEACD-AgAA7AQAIIcDAADsBAAgHhIAANYEACATAAC9BAAgFAAAygQAIBUAANYEACAWAADXBAAgFwAA2AQAIBkAANkEACAaAADMBAAgGwAA2gQAIBwAANsEACAdAADcBAAgvgIAANQEADC_AgAAFwAQwAIAANQEADDBAgEAAAABxwJAAJoEACHdAkAAmgQAIewCAgAAAAH8AgIAmAQAIf0CAQCZBAAh_gICAJgEACGAAwAA1QSAAyKBAyAAtwQAIYIDIAC3BAAhgwMCALYEACGEAwIAtgQAIYUDAgC2BAAhhgMCALYEACGHA0AAuAQAIbMDAADTBAAgAwAAABcAIAEAABkAMAIAABoAIAgKAADOBAAgvgIAANIEADC_AgAAHAAQwAIAANIEADDBAgEAlwQAIdsCAQCXBAAh3gICALYEACHzAgEAlwQAIQEKAACzCAAgCAoAAM4EACC-AgAA0gQAML8CAAAcABDAAgAA0gQAMMECAQAAAAHbAgEAlwQAId4CAgC2BAAh8wIBAJcEACEDAAAAHAAgAQAAHQAwAgAAHgAgCQoAAM4EACAOAADRBAAgvgIAANAEADC_AgAAIAAQwAIAANAEADDHAkAAmgQAIdsCAQCXBAAh3gICALYEACH0AgEAlwQAIQIKAACzCAAgDgAAtAgAIAoKAADOBAAgDgAA0QQAIL4CAADQBAAwvwIAACAAEMACAADQBAAwxwJAAJoEACHbAgEAlwQAId4CAgC2BAAh9AIBAJcEACGyAwAAzwQAIAMAAAAgACABAAAhADACAAAiACADAAAAIAAgAQAAIQAwAgAAIgAgAQAAACAAIAoHAADBBAAgEAAAzgQAIL4CAADNBAAwvwIAACYAEMACAADNBAAwwQIBAJcEACHHAkAAmgQAIdsCAQCXBAAh8gICALYEACHzAgEAlwQAIQIHAACvCAAgEAAAswgAIAoHAADBBAAgEAAAzgQAIL4CAADNBAAwvwIAACYAEMACAADNBAAwwQIBAAAAAccCQACaBAAh2wIBAJcEACHyAgIAtgQAIfMCAQCXBAAhAwAAACYAIAEAACcAMAIAACgAIAEAAAAXACABAAAAHAAgAQAAACAAIAEAAAAmACABAAAAFwAgAwAAABcAIAEAABkAMAIAABoAIAEAAAAVACALBwAArwgAIAgAAK8IACAJAACwCAAgCwAAsQgAIA8AALcFACARAACyCAAg9gIAAOwEACD3AgAA7AQAIPkCAADsBAAg-gIAAOwEACD7AgAA7AQAIBQHAADBBAAgCAAAvQQAIAkAAMoEACALAADLBAAgDwAAmwQAIBEAAMwEACC-AgAAyQQAML8CAAAVABDAAgAAyQQAMMcCQACaBAAh2wIBAJcEACHeAgIAtgQAIfUCAQCXBAAh9gIBAJkEACH3AgEAmQQAIfgCAQCXBAAh-QIBAJkEACH6AgEAmQQAIfsCQAC4BAAhsQMAAMgEACADAAAAFQAgAQAAMQAwAgAAMgAgAwAAABEAIAEAABIAMAIAABMAIAoHAADBBAAgGAAAwgQAIL4CAADGBAAwvwIAADUAEMACAADGBAAwwQIBAJcEACHHAkAAmgQAIdsCAQCXBAAh5wIBAJkEACHpAgAAxwTpAiIDBwAArwgAIBgAAK4IACDnAgAA7AQAIAsHAADBBAAgGAAAwgQAIL4CAADGBAAwvwIAADUAEMACAADGBAAwwQIBAAAAAccCQACaBAAh2wIBAJcEACHnAgEAmQQAIekCAADHBOkCIrADAADFBAAgAwAAADUAIAEAADYAMAIAADcAIAEAAAAPACADAAAAJgAgAQAAJwAwAgAAKAAgCAMAALkEACAHAADBBAAgvgIAAMQEADC_AgAAOwAQwAIAAMQEADDHAkAAmgQAIdoCAQCXBAAh2wIBAJcEACECAwAArggAIAcAAK8IACAJAwAAuQQAIAcAAMEEACC-AgAAxAQAML8CAAA7ABDAAgAAxAQAMMcCQACaBAAh2gIBAJcEACHbAgEAlwQAIa8DAADDBAAgAwAAADsAIAEAADwAMAIAAD0AIBEDAADCBAAgBwAAwQQAIL4CAAC-BAAwvwIAAD8AEMACAAC-BAAwwQIBAJcEACHHAkAAmgQAIdoCAQCZBAAh2wIBAJcEACHeAgIAmAQAIeACAAC_BOACIuECAQCZBAAh4gIBAJkEACHjAgEAmQQAIeQCAQCZBAAh5QIAAMAEACDmAgEAmQQAIQoDAACuCAAgBwAArwgAINoCAADsBAAg3gIAAOwEACDhAgAA7AQAIOICAADsBAAg4wIAAOwEACDkAgAA7AQAIOUCAADsBAAg5gIAAOwEACARAwAAwgQAIAcAAMEEACC-AgAAvgQAML8CAAA_ABDAAgAAvgQAMMECAQAAAAHHAkAAmgQAIdoCAQCZBAAh2wIBAJcEACHeAgIAmAQAIeACAAC_BOACIuECAQCZBAAh4gIBAJkEACHjAgEAmQQAIeQCAQCZBAAh5QIAAMAEACDmAgEAmQQAIQMAAAA_ACABAABAADACAABBACABAAAADwAgDAMAALkEACAHAAC9BAAgKwAAuwQAIL4CAAC8BAAwvwIAAEQAEMACAAC8BAAwwQIBAJcEACHHAkAAmgQAIdoCAQCXBAAh2wIBAJkEACHcAgIAtgQAId0CQACaBAAhAwMAAK4IACAHAACvCAAg2wIAAOwEACAMAwAAuQQAIAcAAL0EACArAAC7BAAgvgIAALwEADC_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_AgAAegAQwAIAAKsEADDBAgEA7wMAIccCQADxAwAh3QJAAPEDACHrAgEA_QMAIewCAgCEBAAh7QIBAP0DACGHA0AA8gMAIZ4DAQD9AwAhnwMgAKIEACGgAwEA_QMAIaIDAACsBKIDIqQDAACtBKQDIqUDIACiBAAhpgMBAP0DACGnAwEA_QMAIagDAACGBAAgqQNAAPIDACGqAwEA_QMAIasDIACuBAAhrAMBAP0DACGtA0AA8gMAIa4DQADyAwAhAwAAAA8AIAEAAHkAMDcAAHoAIAMAAAAPACABAABoADACAAABACABAAAABQAgAQAAAAUAIAMAAAADACABAAAEADACAAAFACADAAAAAwAgAQAABAAwAgAABQAgAwAAAAMAIAEAAAQAMAIAAAUAIA4DAACeBwAgwQIBAAAAAccCQAAAAAHaAgEAAAAB3QJAAAAAAZUDAQAAAAGWAwEAAAABlwMBAAAAAZgDAQAAAAGZA0AAAAABmgNAAAAAAZsDAQAAAAGcAwEAAAABnQMBAAAAAQErAACCAQAgDcECAQAAAAHHAkAAAAAB2gIBAAAAAd0CQAAAAAGVAwEAAAABlgMBAAAAAZcDAQAAAAGYAwEAAAABmQNAAAAAAZoDQAAAAAGbAwEAAAABnAMBAAAAAZ0DAQAAAAEBKwAAhAEAMAErAACEAQAwDgMAAJ0HACDBAgEA8AQAIccCQADxBAAh2gIBAPAEACHdAkAA8QQAIZUDAQDwBAAhlgMBAPAEACGXAwEA-wQAIZgDAQD7BAAhmQNAAPIEACGaA0AA8gQAIZsDAQD7BAAhnAMBAPsEACGdAwEA-wQAIQIAAAAFACArAACHAQAgDcECAQDwBAAhxwJAAPEEACHaAgEA8AQAId0CQADxBAAhlQMBAPAEACGWAwEA8AQAIZcDAQD7BAAhmAMBAPsEACGZA0AA8gQAIZoDQADyBAAhmwMBAPsEACGcAwEA-wQAIZ0DAQD7BAAhAgAAAAMAICsAAIkBACACAAAAAwAgKwAAiQEAIAMAAAAFACAyAACCAQAgMwAAhwEAIAEAAAAFACABAAAAAwAgCg0AAJoHACA6AACcBwAgOwAAmwcAIJcDAADsBAAgmAMAAOwEACCZAwAA7AQAIJoDAADsBAAgmwMAAOwEACCcAwAA7AQAIJ0DAADsBAAgEL4CAACqBAAwvwIAAJABABDAAgAAqgQAMMECAQDvAwAhxwJAAPEDACHaAgEA7wMAId0CQADxAwAhlQMBAO8DACGWAwEA7wMAIZcDAQD9AwAhmAMBAP0DACGZA0AA8gMAIZoDQADyAwAhmwMBAP0DACGcAwEA_QMAIZ0DAQD9AwAhAwAAAAMAIAEAAI8BADA3AACQAQAgAwAAAAMAIAEAAAQAMAIAAAUAIAEAAAAJACABAAAACQAgAwAAAAcAIAEAAAgAMAIAAAkAIAMAAAAHACABAAAIADACAAAJACADAAAABwAgAQAACAAwAgAACQAgCgMAAJkHACDBAgEAAAABxwJAAAAAAdoCAQAAAAHdAkAAAAAB4wIBAAAAAZEDQAAAAAGSAwEAAAABkwMBAAAAAZQDAQAAAAEBKwAAmAEAIAnBAgEAAAABxwJAAAAAAdoCAQAAAAHdAkAAAAAB4wIBAAAAAZEDQAAAAAGSAwEAAAABkwMBAAAAAZQDAQAAAAEBKwAAmgEAMAErAACaAQAwCgMAAJgHACDBAgEA8AQAIccCQADxBAAh2gIBAPAEACHdAkAA8QQAIeMCAQD7BAAhkQNAAPEEACGSAwEA8AQAIZMDAQD7BAAhlAMBAPsEACECAAAACQAgKwAAnQEAIAnBAgEA8AQAIccCQADxBAAh2gIBAPAEACHdAkAA8QQAIeMCAQD7BAAhkQNAAPEEACGSAwEA8AQAIZMDAQD7BAAhlAMBAPsEACECAAAABwAgKwAAnwEAIAIAAAAHACArAACfAQAgAwAAAAkAIDIAAJgBACAzAACdAQAgAQAAAAkAIAEAAAAHACAGDQAAlQcAIDoAAJcHACA7AACWBwAg4wIAAOwEACCTAwAA7AQAIJQDAADsBAAgDL4CAACpBAAwvwIAAKYBABDAAgAAqQQAMMECAQDvAwAhxwJAAPEDACHaAgEA7wMAId0CQADxAwAh4wIBAP0DACGRA0AA8QMAIZIDAQDvAwAhkwMBAP0DACGUAwEA_QMAIQMAAAAHACABAAClAQAwNwAApgEAIAMAAAAHACABAAAIADACAAAJACABAAAADQAgAQAAAA0AIAMAAAALACABAAAMADACAAANACADAAAACwAgAQAADAAwAgAADQAgAwAAAAsAIAEAAAwAMAIAAA0AIAgDAACUBwAgwQIBAAAAAccCQAAAAAHaAgEAAAAB3QJAAAAAAY8DAQAAAAGQAwEAAAABkQNAAAAAAQErAACuAQAgB8ECAQAAAAHHAkAAAAAB2gIBAAAAAd0CQAAAAAGPAwEAAAABkAMBAAAAAZEDQAAAAAEBKwAAsAEAMAErAACwAQAwAQAAAA8AIAgDAACTBwAgwQIBAPAEACHHAkAA8gQAIdoCAQD7BAAh3QJAAPIEACGPAwEA8AQAIZADAQDwBAAhkQNAAPEEACECAAAADQAgKwAAtAEAIAfBAgEA8AQAIccCQADyBAAh2gIBAPsEACHdAkAA8gQAIY8DAQDwBAAhkAMBAPAEACGRA0AA8QQAIQIAAAALACArAAC2AQAgAgAAAAsAICsAALYBACABAAAADwAgAwAAAA0AIDIAAK4BACAzAAC0AQAgAQAAAA0AIAEAAAALACAGDQAAkAcAIDoAAJIHACA7AACRBwAgxwIAAOwEACDaAgAA7AQAIN0CAADsBAAgCr4CAACoBAAwvwIAAL4BABDAAgAAqAQAMMECAQDvAwAhxwJAAPIDACHaAgEA_QMAId0CQADyAwAhjwMBAO8DACGQAwEA7wMAIZEDQADxAwAhAwAAAAsAIAEAAL0BADA3AAC-AQAgAwAAAAsAIAEAAAwAMAIAAA0AIAEAAABbACABAAAAWwAgAwAAAFkAIAEAAFoAMAIAAFsAIAMAAABZACABAABaADACAABbACADAAAAWQAgAQAAWgAwAgAAWwAgDAMAAI8HACDBAgEAAAABxwJAAAAAAdoCAQAAAAHtAgEAAAABiAMBAAAAAYkDAQAAAAGKAwIAAAABiwMBAAAAAYwDIAAAAAGNAwEAAAABjgMBAAAAAQErAADGAQAgC8ECAQAAAAHHAkAAAAAB2gIBAAAAAe0CAQAAAAGIAwEAAAABiQMBAAAAAYoDAgAAAAGLAwEAAAABjAMgAAAAAY0DAQAAAAGOAwEAAAABASsAAMgBADABKwAAyAEAMAwDAACOBwAgwQIBAPAEACHHAkAA8gQAIdoCAQDwBAAh7QIBAPsEACGIAwEA8AQAIYkDAQDwBAAhigMCAPoEACGLAwEA8AQAIYwDIACGBgAhjQMBAPsEACGOAwEA-wQAIQIAAABbACArAADLAQAgC8ECAQDwBAAhxwJAAPIEACHaAgEA8AQAIe0CAQD7BAAhiAMBAPAEACGJAwEA8AQAIYoDAgD6BAAhiwMBAPAEACGMAyAAhgYAIY0DAQD7BAAhjgMBAPsEACECAAAAWQAgKwAAzQEAIAIAAABZACArAADNAQAgAwAAAFsAIDIAAMYBACAzAADLAQAgAQAAAFsAIAEAAABZACAJDQAAiQcAIDgAAIoHACA5AACNBwAgOgAAjAcAIDsAAIsHACDHAgAA7AQAIO0CAADsBAAgjQMAAOwEACCOAwAA7AQAIA6-AgAApwQAML8CAADUAQAQwAIAAKcEADDBAgEA7wMAIccCQADyAwAh2gIBAO8DACHtAgEA_QMAIYgDAQDvAwAhiQMBAO8DACGKAwIA_gMAIYsDAQDvAwAhjAMgAKIEACGNAwEA_QMAIY4DAQD9AwAhAwAAAFkAIAEAANMBADA3AADUAQAgAwAAAFkAIAEAAFoAMAIAAFsAIAEAAAAaACABAAAAGgAgAwAAABcAIAEAABkAMAIAABoAIAMAAAAXACABAAAZADACAAAaACADAAAAFwAgAQAAGQAwAgAAGgAgGhIAAPgGACATAADqBgAgFAAA6wYAIBUAAOwGACAWAADtBgAgFwAA7gYAIBkAAO8GACAaAADwBgAgGwAA8QYAIBwAAPIGACAdAADzBgAgwQIBAAAAAccCQAAAAAHdAkAAAAAB7AICAAAAAfwCAgAAAAH9AgEAAAAB_gICAAAAAYADAAAAgAMCgQMgAAAAAYIDIAAAAAGDAwIAAAABhAMCAAAAAYUDAgAAAAGGAwIAAAABhwNAAAAAAQErAADcAQAgD8ECAQAAAAHHAkAAAAAB3QJAAAAAAewCAgAAAAH8AgIAAAAB_QIBAAAAAf4CAgAAAAGAAwAAAIADAoEDIAAAAAGCAyAAAAABgwMCAAAAAYQDAgAAAAGFAwIAAAABhgMCAAAAAYcDQAAAAAEBKwAA3gEAMAErAADeAQAwAQAAABUAIAEAAAAXACABAAAAFQAgGhIAAIgGACATAACJBgAgFAAAigYAIBUAAP4GACAWAACLBgAgFwAAjAYAIBkAAI0GACAaAACOBgAgGwAAjwYAIBwAAJAGACAdAACRBgAgwQIBAPAEACHHAkAA8QQAId0CQADxBAAh7AICAIUFACH8AgIAhQUAIf0CAQD7BAAh_gICAIUFACGAAwAAhQaAAyKBAyAAhgYAIYIDIACGBgAhgwMCAPoEACGEAwIA-gQAIYUDAgD6BAAhhgMCAPoEACGHA0AA8gQAIQIAAAAaACArAADkAQAgD8ECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACECAAAAFwAgKwAA5gEAIAIAAAAXACArAADmAQAgAQAAABUAIAEAAAAXACABAAAAFQAgAwAAABoAIDIAANwBACAzAADkAQAgAQAAABoAIAEAAAAXACAKDQAAhAcAIDgAAIUHACA5AACIBwAgOgAAhwcAIDsAAIYHACDsAgAA7AQAIPwCAADsBAAg_QIAAOwEACD-AgAA7AQAIIcDAADsBAAgEr4CAACgBAAwvwIAAPABABDAAgAAoAQAMMECAQDvAwAhxwJAAPEDACHdAkAA8QMAIewCAgCEBAAh_AICAIQEACH9AgEA_QMAIf4CAgCEBAAhgAMAAKEEgAMigQMgAKIEACGCAyAAogQAIYMDAgD-AwAhhAMCAP4DACGFAwIA_gMAIYYDAgD-AwAhhwNAAPIDACEDAAAAFwAgAQAA7wEAMDcAAPABACADAAAAFwAgAQAAGQAwAgAAGgAgAQAAADIAIAEAAAAyACADAAAAFQAgAQAAMQAwAgAAMgAgAwAAABUAIAEAADEAMAIAADIAIAMAAAAVACABAAAxADACAAAyACAQBwAAgwcAIAgAAOMGACAJAADkBgAgCwAA5QYAIA8AAOYGACARAADnBgAgxwJAAAAAAdsCAQAAAAHeAgIAAAAB9QIBAAAAAfYCAQAAAAH3AgEAAAAB-AIBAAAAAfkCAQAAAAH6AgEAAAAB-wJAAAAAAQErAAD4AQAgCscCQAAAAAHbAgEAAAAB3gICAAAAAfUCAQAAAAH2AgEAAAAB9wIBAAAAAfgCAQAAAAH5AgEAAAAB-gIBAAAAAfsCQAAAAAEBKwAA-gEAMAErAAD6AQAwEAcAANQFACAIAADVBQAgCQAA1gUAIAsAANcFACAPAADYBQAgEQAA2QUAIMcCQADxBAAh2wIBAPAEACHeAgIA-gQAIfUCAQDwBAAh9gIBAPsEACH3AgEA-wQAIfgCAQDwBAAh-QIBAPsEACH6AgEA-wQAIfsCQADyBAAhAgAAADIAICsAAP0BACAKxwJAAPEEACHbAgEA8AQAId4CAgD6BAAh9QIBAPAEACH2AgEA-wQAIfcCAQD7BAAh-AIBAPAEACH5AgEA-wQAIfoCAQD7BAAh-wJAAPIEACECAAAAFQAgKwAA_wEAIAIAAAAVACArAAD_AQAgAwAAADIAIDIAAPgBACAzAAD9AQAgAQAAADIAIAEAAAAVACAKDQAAzwUAIDgAANAFACA5AADTBQAgOgAA0gUAIDsAANEFACD2AgAA7AQAIPcCAADsBAAg-QIAAOwEACD6AgAA7AQAIPsCAADsBAAgDb4CAACfBAAwvwIAAIYCABDAAgAAnwQAMMcCQADxAwAh2wIBAO8DACHeAgIA_gMAIfUCAQDvAwAh9gIBAP0DACH3AgEA_QMAIfgCAQDvAwAh-QIBAP0DACH6AgEA_QMAIfsCQADyAwAhAwAAABUAIAEAAIUCADA3AACGAgAgAwAAABUAIAEAADEAMAIAADIAIAEAAAAeACABAAAAHgAgAwAAABwAIAEAAB0AMAIAAB4AIAMAAAAcACABAAAdADACAAAeACADAAAAHAAgAQAAHQAwAgAAHgAgBQoAAM4FACDBAgEAAAAB2wIBAAAAAd4CAgAAAAHzAgEAAAABASsAAI4CACAEwQIBAAAAAdsCAQAAAAHeAgIAAAAB8wIBAAAAAQErAACQAgAwASsAAJACADAFCgAAzQUAIMECAQDwBAAh2wIBAPAEACHeAgIA-gQAIfMCAQDwBAAhAgAAAB4AICsAAJMCACAEwQIBAPAEACHbAgEA8AQAId4CAgD6BAAh8wIBAPAEACECAAAAHAAgKwAAlQIAIAIAAAAcACArAACVAgAgAwAAAB4AIDIAAI4CACAzAACTAgAgAQAAAB4AIAEAAAAcACAFDQAAyAUAIDgAAMkFACA5AADMBQAgOgAAywUAIDsAAMoFACAHvgIAAJ4EADC_AgAAnAIAEMACAACeBAAwwQIBAO8DACHbAgEA7wMAId4CAgD-AwAh8wIBAO8DACEDAAAAHAAgAQAAmwIAMDcAAJwCACADAAAAHAAgAQAAHQAwAgAAHgAgAQAAACIAIAEAAAAiACADAAAAIAAgAQAAIQAwAgAAIgAgAwAAACAAIAEAACEAMAIAACIAIAMAAAAgACABAAAhADACAAAiACAGCgAAtQUAIA4AAMcFACDHAkAAAAAB2wIBAAAAAd4CAgAAAAH0AgEAAAABASsAAKQCACAExwJAAAAAAdsCAQAAAAHeAgIAAAAB9AIBAAAAAQErAACmAgAwASsAAKYCADAGCgAAswUAIA4AAMYFACDHAkAA8QQAIdsCAQDwBAAh3gICAPoEACH0AgEA8AQAIQIAAAAiACArAACpAgAgBMcCQADxBAAh2wIBAPAEACHeAgIA-gQAIfQCAQDwBAAhAgAAACAAICsAAKsCACACAAAAIAAgKwAAqwIAIAMAAAAiACAyAACkAgAgMwAAqQIAIAEAAAAiACABAAAAIAAgBQ0AAMEFACA4AADCBQAgOQAAxQUAIDoAAMQFACA7AADDBQAgB74CAACdBAAwvwIAALICABDAAgAAnQQAMMcCQADxAwAh2wIBAO8DACHeAgIA_gMAIfQCAQDvAwAhAwAAACAAIAEAALECADA3AACyAgAgAwAAACAAIAEAACEAMAIAACIAIAEAAAAoACABAAAAKAAgAwAAACYAIAEAACcAMAIAACgAIAMAAAAmACABAAAnADACAAAoACADAAAAJgAgAQAAJwAwAgAAKAAgBwcAAL8FACAQAADABQAgwQIBAAAAAccCQAAAAAHbAgEAAAAB8gICAAAAAfMCAQAAAAEBKwAAugIAIAXBAgEAAAABxwJAAAAAAdsCAQAAAAHyAgIAAAAB8wIBAAAAAQErAAC8AgAwASsAALwCADAHBwAAvQUAIBAAAL4FACDBAgEA8AQAIccCQADxBAAh2wIBAPAEACHyAgIA-gQAIfMCAQDwBAAhAgAAACgAICsAAL8CACAFwQIBAPAEACHHAkAA8QQAIdsCAQDwBAAh8gICAPoEACHzAgEA8AQAIQIAAAAmACArAADBAgAgAgAAACYAICsAAMECACADAAAAKAAgMgAAugIAIDMAAL8CACABAAAAKAAgAQAAACYAIAUNAAC4BQAgOAAAuQUAIDkAALwFACA6AAC7BQAgOwAAugUAIAi-AgAAnAQAML8CAADIAgAQwAIAAJwEADDBAgEA7wMAIccCQADxAwAh2wIBAO8DACHyAgIA_gMAIfMCAQDvAwAhAwAAACYAIAEAAMcCADA3AADIAgAgAwAAACYAIAEAACcAMAIAACgAIAkMAACbBAAgvgIAAJYEADC_AgAAzgIAEMACAACWBAAwwQIBAAAAAccCQACaBAAh7AICAAAAAe0CAQAAAAHuAgEAmQQAIQEAAADLAgAgAQAAAMsCACAJDAAAmwQAIL4CAACWBAAwvwIAAM4CABDAAgAAlgQAMMECAQCXBAAhxwJAAJoEACHsAgIAmAQAIe0CAQCXBAAh7gIBAJkEACEDDAAAtwUAIOwCAADsBAAg7gIAAOwEACADAAAAzgIAIAEAAM8CADACAADLAgAgAwAAAM4CACABAADPAgAwAgAAywIAIAMAAADOAgAgAQAAzwIAMAIAAMsCACAGDAAAtgUAIMECAQAAAAHHAkAAAAAB7AICAAAAAe0CAQAAAAHuAgEAAAABASsAANMCACAFwQIBAAAAAccCQAAAAAHsAgIAAAAB7QIBAAAAAe4CAQAAAAEBKwAA1QIAMAErAADVAgAwBgwAAKcFACDBAgEA8AQAIccCQADxBAAh7AICAIUFACHtAgEA8AQAIe4CAQD7BAAhAgAAAMsCACArAADYAgAgBcECAQDwBAAhxwJAAPEEACHsAgIAhQUAIe0CAQDwBAAh7gIBAPsEACECAAAAzgIAICsAANoCACACAAAAzgIAICsAANoCACADAAAAywIAIDIAANMCACAzAADYAgAgAQAAAMsCACABAAAAzgIAIAcNAACiBQAgOAAAowUAIDkAAKYFACA6AAClBQAgOwAApAUAIOwCAADsBAAg7gIAAOwEACAIvgIAAJUEADC_AgAA4QIAEMACAACVBAAwwQIBAO8DACHHAkAA8QMAIewCAgCEBAAh7QIBAO8DACHuAgEA_QMAIQMAAADOAgAgAQAA4AIAMDcAAOECACADAAAAzgIAIAEAAM8CADACAADLAgAgAQAAABMAIAEAAAATACADAAAAEQAgAQAAEgAwAgAAEwAgAwAAABEAIAEAABIAMAIAABMAIAMAAAARACABAAASADACAAATACAGAwAAoQUAIAcAAKAFACDHAkAAAAAB2gIBAAAAAdsCAQAAAAHrAgAAAOsCAgErAADpAgAgBMcCQAAAAAHaAgEAAAAB2wIBAAAAAesCAAAA6wICASsAAOsCADABKwAA6wIAMAYDAACfBQAgBwAAngUAIMcCQADxBAAh2gIBAPAEACHbAgEA8AQAIesCAACdBesCIgIAAAATACArAADuAgAgBMcCQADxBAAh2gIBAPAEACHbAgEA8AQAIesCAACdBesCIgIAAAARACArAADwAgAgAgAAABEAICsAAPACACADAAAAEwAgMgAA6QIAIDMAAO4CACABAAAAEwAgAQAAABEAIAMNAACaBQAgOgAAnAUAIDsAAJsFACAHvgIAAJEEADC_AgAA9wIAEMACAACRBAAwxwJAAPEDACHaAgEA7wMAIdsCAQDvAwAh6wIAAJIE6wIiAwAAABEAIAEAAPYCADA3AAD3AgAgAwAAABEAIAEAABIAMAIAABMAIAEAAAA3ACABAAAANwAgAwAAADUAIAEAADYAMAIAADcAIAMAAAA1ACABAAA2ADACAAA3ACADAAAANQAgAQAANgAwAgAANwAgBwcAAJgFACAYAACZBQAgwQIBAAAAAccCQAAAAAHbAgEAAAAB5wIBAAAAAekCAAAA6QICASsAAP8CACAFwQIBAAAAAccCQAAAAAHbAgEAAAAB5wIBAAAAAekCAAAA6QICASsAAIEDADABKwAAgQMAMAEAAAAPACAHBwAAlgUAIBgAAJcFACDBAgEA8AQAIccCQADxBAAh2wIBAPAEACHnAgEA-wQAIekCAACVBekCIgIAAAA3ACArAACFAwAgBcECAQDwBAAhxwJAAPEEACHbAgEA8AQAIecCAQD7BAAh6QIAAJUF6QIiAgAAADUAICsAAIcDACACAAAANQAgKwAAhwMAIAEAAAAPACADAAAANwAgMgAA_wIAIDMAAIUDACABAAAANwAgAQAAADUAIAQNAACSBQAgOgAAlAUAIDsAAJMFACDnAgAA7AQAIAi-AgAAjQQAML8CAACPAwAQwAIAAI0EADDBAgEA7wMAIccCQADxAwAh2wIBAO8DACHnAgEA_QMAIekCAACOBOkCIgMAAAA1ACABAACOAwAwNwAAjwMAIAMAAAA1ACABAAA2ADACAAA3ACABAAAAPQAgAQAAAD0AIAMAAAA7ACABAAA8ADACAAA9ACADAAAAOwAgAQAAPAAwAgAAPQAgAwAAADsAIAEAADwAMAIAAD0AIAUDAACRBQAgBwAAkAUAIMcCQAAAAAHaAgEAAAAB2wIBAAAAAQErAACXAwAgA8cCQAAAAAHaAgEAAAAB2wIBAAAAAQErAACZAwAwASsAAJkDADAFAwAAjwUAIAcAAI4FACDHAkAA8QQAIdoCAQDwBAAh2wIBAPAEACECAAAAPQAgKwAAnAMAIAPHAkAA8QQAIdoCAQDwBAAh2wIBAPAEACECAAAAOwAgKwAAngMAIAIAAAA7ACArAACeAwAgAwAAAD0AIDIAAJcDACAzAACcAwAgAQAAAD0AIAEAAAA7ACADDQAAiwUAIDoAAI0FACA7AACMBQAgBr4CAACMBAAwvwIAAKUDABDAAgAAjAQAMMcCQADxAwAh2gIBAO8DACHbAgEA7wMAIQMAAAA7ACABAACkAwAwNwAApQMAIAMAAAA7ACABAAA8ADACAAA9ACABAAAAQQAgAQAAAEEAIAMAAAA_ACABAABAADACAABBACADAAAAPwAgAQAAQAAwAgAAQQAgAwAAAD8AIAEAAEAAMAIAAEEAIA4DAACKBQAgBwAAiQUAIMECAQAAAAHHAkAAAAAB2gIBAAAAAdsCAQAAAAHeAgIAAAAB4AIAAADgAgLhAgEAAAAB4gIBAAAAAeMCAQAAAAHkAgEAAAAB5QKAAAAAAeYCAQAAAAEBKwAArQMAIAzBAgEAAAABxwJAAAAAAdoCAQAAAAHbAgEAAAAB3gICAAAAAeACAAAA4AIC4QIBAAAAAeICAQAAAAHjAgEAAAAB5AIBAAAAAeUCgAAAAAHmAgEAAAABASsAAK8DADABKwAArwMAMAEAAAAPACAOAwAAiAUAIAcAAIcFACDBAgEA8AQAIccCQADxBAAh2gIBAPsEACHbAgEA8AQAId4CAgCFBQAh4AIAAIYF4AIi4QIBAPsEACHiAgEA-wQAIeMCAQD7BAAh5AIBAPsEACHlAoAAAAAB5gIBAPsEACECAAAAQQAgKwAAswMAIAzBAgEA8AQAIccCQADxBAAh2gIBAPsEACHbAgEA8AQAId4CAgCFBQAh4AIAAIYF4AIi4QIBAPsEACHiAgEA-wQAIeMCAQD7BAAh5AIBAPsEACHlAoAAAAAB5gIBAPsEACECAAAAPwAgKwAAtQMAIAIAAAA_ACArAAC1AwAgAQAAAA8AIAMAAABBACAyAACtAwAgMwAAswMAIAEAAABBACABAAAAPwAgDQ0AAIAFACA4AACBBQAgOQAAhAUAIDoAAIMFACA7AACCBQAg2gIAAOwEACDeAgAA7AQAIOECAADsBAAg4gIAAOwEACDjAgAA7AQAIOQCAADsBAAg5QIAAOwEACDmAgAA7AQAIA--AgAAgwQAML8CAAC9AwAQwAIAAIMEADDBAgEA7wMAIccCQADxAwAh2gIBAP0DACHbAgEA7wMAId4CAgCEBAAh4AIAAIUE4AIi4QIBAP0DACHiAgEA_QMAIeMCAQD9AwAh5AIBAP0DACHlAgAAhgQAIOYCAQD9AwAhAwAAAD8AIAEAALwDADA3AAC9AwAgAwAAAD8AIAEAAEAAMAIAAEEAIAEAAABGACABAAAARgAgAwAAAEQAIAEAAEUAMAIAAEYAIAMAAABEACABAABFADACAABGACADAAAARAAgAQAARQAwAgAARgAgCQMAAP4EACAHAAD_BAAgK4AAAAABwQIBAAAAAccCQAAAAAHaAgEAAAAB2wIBAAAAAdwCAgAAAAHdAkAAAAABASsAAMUDACAHK4AAAAABwQIBAAAAAccCQAAAAAHaAgEAAAAB2wIBAAAAAdwCAgAAAAHdAkAAAAABASsAAMcDADABKwAAxwMAMAEAAAAXACAJAwAA_AQAIAcAAP0EACArgAAAAAHBAgEA8AQAIccCQADxBAAh2gIBAPAEACHbAgEA-wQAIdwCAgD6BAAh3QJAAPEEACECAAAARgAgKwAAywMAIAcrgAAAAAHBAgEA8AQAIccCQADxBAAh2gIBAPAEACHbAgEA-wQAIdwCAgD6BAAh3QJAAPEEACECAAAARAAgKwAAzQMAIAIAAABEACArAADNAwAgAQAAABcAIAMAAABGACAyAADFAwAgMwAAywMAIAEAAABGACABAAAARAAgBg0AAPUEACA4AAD2BAAgOQAA-QQAIDoAAPgEACA7AAD3BAAg2wIAAOwEACAKKwAA8AMAIL4CAAD8AwAwvwIAANUDABDAAgAA_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_AgAA1QMAEMACAAD8AwAwwQIBAO8DACHHAkAA8QMAIdoCAQDvAwAh2wIBAP0DACHcAgIA_gMAId0CQADxAwAhDg0AAPQDACA6AACCBAAgOwAAggQAIMkCAQAAAAHKAgEAAAAFywIBAAAABcwCAQAAAAHNAgEAAAABzgIBAAAAAc8CAQAAAAHQAgEAgQQAIdcCAQAAAAHYAgEAAAAB2QIBAAAAAQ0NAAD3AwAgOAAAgAQAIDkAAPcDACA6AAD3AwAgOwAA9wMAIMkCAgAAAAHKAgIAAAAEywICAAAABMwCAgAAAAHNAgIAAAABzgICAAAAAc8CAgAAAAHQAgIA_wMAIQ0NAAD3AwAgOAAAgAQAIDkAAPcDACA6AAD3AwAgOwAA9wMAIMkCAgAAAAHKAgIAAAAEywICAAAABMwCAgAAAAHNAgIAAAABzgICAAAAAc8CAgAAAAHQAgIA_wMAIQjJAggAAAABygIIAAAABMsCCAAAAATMAggAAAABzQIIAAAAAc4CCAAAAAHPAggAAAAB0AIIAIAEACEODQAA9AMAIDoAAIIEACA7AACCBAAgyQIBAAAAAcoCAQAAAAXLAgEAAAAFzAIBAAAAAc0CAQAAAAHOAgEAAAABzwIBAAAAAdACAQCBBAAh1wIBAAAAAdgCAQAAAAHZAgEAAAABC8kCAQAAAAHKAgEAAAAFywIBAAAABcwCAQAAAAHNAgEAAAABzgIBAAAAAc8CAQAAAAHQAgEAggQAIdcCAQAAAAHYAgEAAAAB2QIBAAAAAQ--AgAAgwQAML8CAAC9AwAQwAIAAIMEADDBAgEA7wMAIccCQADxAwAh2gIBAP0DACHbAgEA7wMAId4CAgCEBAAh4AIAAIUE4AIi4QIBAP0DACHiAgEA_QMAIeMCAQD9AwAh5AIBAP0DACHlAgAAhgQAIOYCAQD9AwAhDQ0AAPQDACA4AACLBAAgOQAA9AMAIDoAAPQDACA7AAD0AwAgyQICAAAAAcoCAgAAAAXLAgIAAAAFzAICAAAAAc0CAgAAAAHOAgIAAAABzwICAAAAAdACAgCKBAAhBw0AAPcDACA6AACJBAAgOwAAiQQAIMkCAAAA4AICygIAAADgAgjLAgAAAOACCNACAACIBOACIg8NAAD0AwAgOgAAhwQAIDsAAIcEACDJAoAAAAABzAKAAAAAAc0CgAAAAAHOAoAAAAABzwKAAAAAAdACgAAAAAHRAgEAAAAB0gIBAAAAAdMCAQAAAAHUAoAAAAAB1QKAAAAAAdYCgAAAAAEMyQKAAAAAAcwCgAAAAAHNAoAAAAABzgKAAAAAAc8CgAAAAAHQAoAAAAAB0QIBAAAAAdICAQAAAAHTAgEAAAAB1AKAAAAAAdUCgAAAAAHWAoAAAAABBw0AAPcDACA6AACJBAAgOwAAiQQAIMkCAAAA4AICygIAAADgAgjLAgAAAOACCNACAACIBOACIgTJAgAAAOACAsoCAAAA4AIIywIAAADgAgjQAgAAiQTgAiINDQAA9AMAIDgAAIsEACA5AAD0AwAgOgAA9AMAIDsAAPQDACDJAgIAAAABygICAAAABcsCAgAAAAXMAgIAAAABzQICAAAAAc4CAgAAAAHPAgIAAAAB0AICAIoEACEIyQIIAAAAAcoCCAAAAAXLAggAAAAFzAIIAAAAAc0CCAAAAAHOAggAAAABzwIIAAAAAdACCACLBAAhBr4CAACMBAAwvwIAAKUDABDAAgAAjAQAMMcCQADxAwAh2gIBAO8DACHbAgEA7wMAIQi-AgAAjQQAML8CAACPAwAQwAIAAI0EADDBAgEA7wMAIccCQADxAwAh2wIBAO8DACHnAgEA_QMAIekCAACOBOkCIgcNAAD3AwAgOgAAkAQAIDsAAJAEACDJAgAAAOkCAsoCAAAA6QIIywIAAADpAgjQAgAAjwTpAiIHDQAA9wMAIDoAAJAEACA7AACQBAAgyQIAAADpAgLKAgAAAOkCCMsCAAAA6QII0AIAAI8E6QIiBMkCAAAA6QICygIAAADpAgjLAgAAAOkCCNACAACQBOkCIge-AgAAkQQAML8CAAD3AgAQwAIAAJEEADDHAkAA8QMAIdoCAQDvAwAh2wIBAO8DACHrAgAAkgTrAiIHDQAA9wMAIDoAAJQEACA7AACUBAAgyQIAAADrAgLKAgAAAOsCCMsCAAAA6wII0AIAAJME6wIiBw0AAPcDACA6AACUBAAgOwAAlAQAIMkCAAAA6wICygIAAADrAgjLAgAAAOsCCNACAACTBOsCIgTJAgAAAOsCAsoCAAAA6wIIywIAAADrAgjQAgAAlATrAiIIvgIAAJUEADC_AgAA4QIAEMACAACVBAAwwQIBAO8DACHHAkAA8QMAIewCAgCEBAAh7QIBAO8DACHuAgEA_QMAIQkMAACbBAAgvgIAAJYEADC_AgAAzgIAEMACAACWBAAwwQIBAJcEACHHAkAAmgQAIewCAgCYBAAh7QIBAJcEACHuAgEAmQQAIQvJAgEAAAABygIBAAAABMsCAQAAAATMAgEAAAABzQIBAAAAAc4CAQAAAAHPAgEAAAAB0AIBAPsDACHXAgEAAAAB2AIBAAAAAdkCAQAAAAEIyQICAAAAAcoCAgAAAAXLAgIAAAAFzAICAAAAAc0CAgAAAAHOAgIAAAABzwICAAAAAdACAgD0AwAhC8kCAQAAAAHKAgEAAAAFywIBAAAABcwCAQAAAAHNAgEAAAABzgIBAAAAAc8CAQAAAAHQAgEAggQAIdcCAQAAAAHYAgEAAAAB2QIBAAAAAQjJAkAAAAABygJAAAAABMsCQAAAAATMAkAAAAABzQJAAAAAAc4CQAAAAAHPAkAAAAAB0AJAAPgDACED7wIAACAAIPACAAAgACDxAgAAIAAgCL4CAACcBAAwvwIAAMgCABDAAgAAnAQAMMECAQDvAwAhxwJAAPEDACHbAgEA7wMAIfICAgD-AwAh8wIBAO8DACEHvgIAAJ0EADC_AgAAsgIAEMACAACdBAAwxwJAAPEDACHbAgEA7wMAId4CAgD-AwAh9AIBAO8DACEHvgIAAJ4EADC_AgAAnAIAEMACAACeBAAwwQIBAO8DACHbAgEA7wMAId4CAgD-AwAh8wIBAO8DACENvgIAAJ8EADC_AgAAhgIAEMACAACfBAAwxwJAAPEDACHbAgEA7wMAId4CAgD-AwAh9QIBAO8DACH2AgEA_QMAIfcCAQD9AwAh-AIBAO8DACH5AgEA_QMAIfoCAQD9AwAh-wJAAPIDACESvgIAAKAEADC_AgAA8AEAEMACAACgBAAwwQIBAO8DACHHAkAA8QMAId0CQADxAwAh7AICAIQEACH8AgIAhAQAIf0CAQD9AwAh_gICAIQEACGAAwAAoQSAAyKBAyAAogQAIYIDIACiBAAhgwMCAP4DACGEAwIA_gMAIYUDAgD-AwAhhgMCAP4DACGHA0AA8gMAIQcNAAD3AwAgOgAApgQAIDsAAKYEACDJAgAAAIADAsoCAAAAgAMIywIAAACAAwjQAgAApQSAAyIFDQAA9wMAIDoAAKQEACA7AACkBAAgyQIgAAAAAdACIACjBAAhBQ0AAPcDACA6AACkBAAgOwAApAQAIMkCIAAAAAHQAiAAowQAIQLJAiAAAAAB0AIgAKQEACEHDQAA9wMAIDoAAKYEACA7AACmBAAgyQIAAACAAwLKAgAAAIADCMsCAAAAgAMI0AIAAKUEgAMiBMkCAAAAgAMCygIAAACAAwjLAgAAAIADCNACAACmBIADIg6-AgAApwQAML8CAADUAQAQwAIAAKcEADDBAgEA7wMAIccCQADyAwAh2gIBAO8DACHtAgEA_QMAIYgDAQDvAwAhiQMBAO8DACGKAwIA_gMAIYsDAQDvAwAhjAMgAKIEACGNAwEA_QMAIY4DAQD9AwAhCr4CAACoBAAwvwIAAL4BABDAAgAAqAQAMMECAQDvAwAhxwJAAPIDACHaAgEA_QMAId0CQADyAwAhjwMBAO8DACGQAwEA7wMAIZEDQADxAwAhDL4CAACpBAAwvwIAAKYBABDAAgAAqQQAMMECAQDvAwAhxwJAAPEDACHaAgEA7wMAId0CQADxAwAh4wIBAP0DACGRA0AA8QMAIZIDAQDvAwAhkwMBAP0DACGUAwEA_QMAIRC-AgAAqgQAML8CAACQAQAQwAIAAKoEADDBAgEA7wMAIccCQADxAwAh2gIBAO8DACHdAkAA8QMAIZUDAQDvAwAhlgMBAO8DACGXAwEA_QMAIZgDAQD9AwAhmQNAAPIDACGaA0AA8gMAIZsDAQD9AwAhnAMBAP0DACGdAwEA_QMAIRm-AgAAqwQAML8CAAB6ABDAAgAAqwQAMMECAQDvAwAhxwJAAPEDACHdAkAA8QMAIesCAQD9AwAh7AICAIQEACHtAgEA_QMAIYcDQADyAwAhngMBAP0DACGfAyAAogQAIaADAQD9AwAhogMAAKwEogMipAMAAK0EpAMipQMgAKIEACGmAwEA_QMAIacDAQD9AwAhqAMAAIYEACCpA0AA8gMAIaoDAQD9AwAhqwMgAK4EACGsAwEA_QMAIa0DQADyAwAhrgNAAPIDACEHDQAA9wMAIDoAALQEACA7AAC0BAAgyQIAAACiAwLKAgAAAKIDCMsCAAAAogMI0AIAALMEogMiBw0AAPcDACA6AACyBAAgOwAAsgQAIMkCAAAApAMCygIAAACkAwjLAgAAAKQDCNACAACxBKQDIgUNAAD0AwAgOgAAsAQAIDsAALAEACDJAiAAAAAB0AIgAK8EACEFDQAA9AMAIDoAALAEACA7AACwBAAgyQIgAAAAAdACIACvBAAhAskCIAAAAAHQAiAAsAQAIQcNAAD3AwAgOgAAsgQAIDsAALIEACDJAgAAAKQDAsoCAAAApAMIywIAAACkAwjQAgAAsQSkAyIEyQIAAACkAwLKAgAAAKQDCMsCAAAApAMI0AIAALIEpAMiBw0AAPcDACA6AAC0BAAgOwAAtAQAIMkCAAAAogMCygIAAACiAwjLAgAAAKIDCNACAACzBKIDIgTJAgAAAKIDAsoCAAAAogMIywIAAACiAwjQAgAAtASiAyIPAwAAuQQAIL4CAAC1BAAwvwIAAFkAEMACAAC1BAAwwQIBAJcEACHHAkAAuAQAIdoCAQCXBAAh7QIBAJkEACGIAwEAlwQAIYkDAQCXBAAhigMCALYEACGLAwEAlwQAIYwDIAC3BAAhjQMBAJkEACGOAwEAmQQAIQjJAgIAAAABygICAAAABMsCAgAAAATMAgIAAAABzQICAAAAAc4CAgAAAAHPAgIAAAAB0AICAPcDACECyQIgAAAAAdACIACkBAAhCMkCQAAAAAHKAkAAAAAFywJAAAAABcwCQAAAAAHNAkAAAAABzgJAAAAAAc8CQAAAAAHQAkAA9QMAISUEAADkBAAgBQAA5QQAIAYAAOYEACAeAADYBAAgHwAA2QQAICEAAOcEACAiAADaBAAgIwAA2wQAICQAANwEACAlAADoBAAgvgIAAOAEADC_AgAADwAQwAIAAOAEADDBAgEAlwQAIccCQACaBAAh3QJAAJoEACHrAgEAmQQAIewCAgCYBAAh7QIBAJkEACGHA0AAuAQAIZ4DAQCZBAAhnwMgALcEACGgAwEAmQQAIaIDAADhBKIDIqQDAADiBKQDIqUDIAC3BAAhpgMBAJkEACGnAwEAmQQAIagDAADABAAgqQNAALgEACGqAwEAmQQAIasDIADjBAAhrAMBAJkEACGtA0AAuAQAIa4DQAC4BAAhtAMAAA8AILUDAAAPACAMIAAAuQQAIL4CAAC6BAAwvwIAAFIAEMACAAC6BAAwwQIBAJcEACHCAgEAlwQAIcMCAQCXBAAhxAIBAJcEACHFAgEAlwQAIcYCAAC7BAAgxwJAAJoEACHIAkAAuAQAIQzJAoAAAAABzAKAAAAAAc0CgAAAAAHOAoAAAAABzwKAAAAAAdACgAAAAAHRAgEAAAAB0gIBAAAAAdMCAQAAAAHUAoAAAAAB1QKAAAAAAdYCgAAAAAEMAwAAuQQAIAcAAL0EACArAAC7BAAgvgIAALwEADC_AgAARAAQwAIAALwEADDBAgEAlwQAIccCQACaBAAh2gIBAJcEACHbAgEAmQQAIdwCAgC2BAAh3QJAAJoEACEfEgAA1gQAIBMAAL0EACAUAADKBAAgFQAA1gQAIBYAANcEACAXAADYBAAgGQAA2QQAIBoAAMwEACAbAADaBAAgHAAA2wQAIB0AANwEACC-AgAA1AQAML8CAAAXABDAAgAA1AQAMMECAQCXBAAhxwJAAJoEACHdAkAAmgQAIewCAgCYBAAh_AICAJgEACH9AgEAmQQAIf4CAgCYBAAhgAMAANUEgAMigQMgALcEACGCAyAAtwQAIYMDAgC2BAAhhAMCALYEACGFAwIAtgQAIYYDAgC2BAAhhwNAALgEACG0AwAAFwAgtQMAABcAIBEDAADCBAAgBwAAwQQAIL4CAAC-BAAwvwIAAD8AEMACAAC-BAAwwQIBAJcEACHHAkAAmgQAIdoCAQCZBAAh2wIBAJcEACHeAgIAmAQAIeACAAC_BOACIuECAQCZBAAh4gIBAJkEACHjAgEAmQQAIeQCAQCZBAAh5QIAAMAEACDmAgEAmQQAIQTJAgAAAOACAsoCAAAA4AIIywIAAADgAgjQAgAAiQTgAiIMyQKAAAAAAcwCgAAAAAHNAoAAAAABzgKAAAAAAc8CgAAAAAHQAoAAAAAB0QIBAAAAAdICAQAAAAHTAgEAAAAB1AKAAAAAAdUCgAAAAAHWAoAAAAABHxIAANYEACATAAC9BAAgFAAAygQAIBUAANYEACAWAADXBAAgFwAA2AQAIBkAANkEACAaAADMBAAgGwAA2gQAIBwAANsEACAdAADcBAAgvgIAANQEADC_AgAAFwAQwAIAANQEADDBAgEAlwQAIccCQACaBAAh3QJAAJoEACHsAgIAmAQAIfwCAgCYBAAh_QIBAJkEACH-AgIAmAQAIYADAADVBIADIoEDIAC3BAAhggMgALcEACGDAwIAtgQAIYQDAgC2BAAhhQMCALYEACGGAwIAtgQAIYcDQAC4BAAhtAMAABcAILUDAAAXACAlBAAA5AQAIAUAAOUEACAGAADmBAAgHgAA2AQAIB8AANkEACAhAADnBAAgIgAA2gQAICMAANsEACAkAADcBAAgJQAA6AQAIL4CAADgBAAwvwIAAA8AEMACAADgBAAwwQIBAJcEACHHAkAAmgQAId0CQACaBAAh6wIBAJkEACHsAgIAmAQAIe0CAQCZBAAhhwNAALgEACGeAwEAmQQAIZ8DIAC3BAAhoAMBAJkEACGiAwAA4QSiAyKkAwAA4gSkAyKlAyAAtwQAIaYDAQCZBAAhpwMBAJkEACGoAwAAwAQAIKkDQAC4BAAhqgMBAJkEACGrAyAA4wQAIawDAQCZBAAhrQNAALgEACGuA0AAuAQAIbQDAAAPACC1AwAADwAgAtoCAQAAAAHbAgEAAAABCAMAALkEACAHAADBBAAgvgIAAMQEADC_AgAAOwAQwAIAAMQEADDHAkAAmgQAIdoCAQCXBAAh2wIBAJcEACEC2wIBAAAAAecCAQAAAAEKBwAAwQQAIBgAAMIEACC-AgAAxgQAML8CAAA1ABDAAgAAxgQAMMECAQCXBAAhxwJAAJoEACHbAgEAlwQAIecCAQCZBAAh6QIAAMcE6QIiBMkCAAAA6QICygIAAADpAgjLAgAAAOkCCNACAACQBOkCIgLbAgEAAAAB3gICAAAAARMHAADBBAAgCAAAvQQAIAkAAMoEACALAADLBAAgDwAAmwQAIBEAAMwEACC-AgAAyQQAML8CAAAVABDAAgAAyQQAMMcCQACaBAAh2wIBAJcEACHeAgIAtgQAIfUCAQCXBAAh9gIBAJkEACH3AgEAmQQAIfgCAQCXBAAh-QIBAJkEACH6AgEAmQQAIfsCQAC4BAAhA-8CAAAXACDwAgAAFwAg8QIAABcAIAPvAgAAHAAg8AIAABwAIPECAAAcACAD7wIAACYAIPACAAAmACDxAgAAJgAgCgcAAMEEACAQAADOBAAgvgIAAM0EADC_AgAAJgAQwAIAAM0EADDBAgEAlwQAIccCQACaBAAh2wIBAJcEACHyAgIAtgQAIfMCAQCXBAAhFQcAAMEEACAIAAC9BAAgCQAAygQAIAsAAMsEACAPAACbBAAgEQAAzAQAIL4CAADJBAAwvwIAABUAEMACAADJBAAwxwJAAJoEACHbAgEAlwQAId4CAgC2BAAh9QIBAJcEACH2AgEAmQQAIfcCAQCZBAAh-AIBAJcEACH5AgEAmQQAIfoCAQCZBAAh-wJAALgEACG0AwAAFQAgtQMAABUAIAPbAgEAAAAB3gICAAAAAfQCAQAAAAEJCgAAzgQAIA4AANEEACC-AgAA0AQAML8CAAAgABDAAgAA0AQAMMcCQACaBAAh2wIBAJcEACHeAgIAtgQAIfQCAQCXBAAhCwwAAJsEACC-AgAAlgQAML8CAADOAgAQwAIAAJYEADDBAgEAlwQAIccCQACaBAAh7AICAJgEACHtAgEAlwQAIe4CAQCZBAAhtAMAAM4CACC1AwAAzgIAIAgKAADOBAAgvgIAANIEADC_AgAAHAAQwAIAANIEADDBAgEAlwQAIdsCAQCXBAAh3gICALYEACHzAgEAlwQAIQLBAgEAAAAB_AICAAAAAR0SAADWBAAgEwAAvQQAIBQAAMoEACAVAADWBAAgFgAA1wQAIBcAANgEACAZAADZBAAgGgAAzAQAIBsAANoEACAcAADbBAAgHQAA3AQAIL4CAADUBAAwvwIAABcAEMACAADUBAAwwQIBAJcEACHHAkAAmgQAId0CQACaBAAh7AICAJgEACH8AgIAmAQAIf0CAQCZBAAh_gICAJgEACGAAwAA1QSAAyKBAyAAtwQAIYIDIAC3BAAhgwMCALYEACGEAwIAtgQAIYUDAgC2BAAhhgMCALYEACGHA0AAuAQAIQTJAgAAAIADAsoCAAAAgAMIywIAAACAAwjQAgAApgSAAyIVBwAAwQQAIAgAAL0EACAJAADKBAAgCwAAywQAIA8AAJsEACARAADMBAAgvgIAAMkEADC_AgAAFQAQwAIAAMkEADDHAkAAmgQAIdsCAQCXBAAh3gICALYEACH1AgEAlwQAIfYCAQCZBAAh9wIBAJkEACH4AgEAlwQAIfkCAQCZBAAh-gIBAJkEACH7AkAAuAQAIbQDAAAVACC1AwAAFQAgA-8CAAAVACDwAgAAFQAg8QIAABUAIAPvAgAAEQAg8AIAABEAIPECAAARACAD7wIAADUAIPACAAA1ACDxAgAANQAgA-8CAAA7ACDwAgAAOwAg8QIAADsAIAPvAgAAPwAg8AIAAD8AIPECAAA_ACAD7wIAAEQAIPACAABEACDxAgAARAAgAtoCAQAAAAHbAgEAAAABCQMAALkEACAHAADBBAAgvgIAAN4EADC_AgAAEQAQwAIAAN4EADDHAkAAmgQAIdoCAQCXBAAh2wIBAJcEACHrAgAA3wTrAiIEyQIAAADrAgLKAgAAAOsCCMsCAAAA6wII0AIAAJQE6wIiIwQAAOQEACAFAADlBAAgBgAA5gQAIB4AANgEACAfAADZBAAgIQAA5wQAICIAANoEACAjAADbBAAgJAAA3AQAICUAAOgEACC-AgAA4AQAML8CAAAPABDAAgAA4AQAMMECAQCXBAAhxwJAAJoEACHdAkAAmgQAIesCAQCZBAAh7AICAJgEACHtAgEAmQQAIYcDQAC4BAAhngMBAJkEACGfAyAAtwQAIaADAQCZBAAhogMAAOEEogMipAMAAOIEpAMipQMgALcEACGmAwEAmQQAIacDAQCZBAAhqAMAAMAEACCpA0AAuAQAIaoDAQCZBAAhqwMgAOMEACGsAwEAmQQAIa0DQAC4BAAhrgNAALgEACEEyQIAAACiAwLKAgAAAKIDCMsCAAAAogMI0AIAALQEogMiBMkCAAAApAMCygIAAACkAwjLAgAAAKQDCNACAACyBKQDIgLJAiAAAAAB0AIgALAEACED7wIAAAMAIPACAAADACDxAgAAAwAgA-8CAAAHACDwAgAABwAg8QIAAAcAIAPvAgAACwAg8AIAAAsAIPECAAALACAD7wIAAFIAIPACAABSACDxAgAAUgAgA-8CAABZACDwAgAAWQAg8QIAAFkAIAsDAADCBAAgvgIAAOkEADC_AgAACwAQwAIAAOkEADDBAgEAlwQAIccCQAC4BAAh2gIBAJkEACHdAkAAuAQAIY8DAQCXBAAhkAMBAJcEACGRA0AAmgQAIQ0DAAC5BAAgvgIAAOoEADC_AgAABwAQwAIAAOoEADDBAgEAlwQAIccCQACaBAAh2gIBAJcEACHdAkAAmgQAIeMCAQCZBAAhkQNAAJoEACGSAwEAlwQAIZMDAQCZBAAhlAMBAJkEACERAwAAuQQAIL4CAADrBAAwvwIAAAMAEMACAADrBAAwwQIBAJcEACHHAkAAmgQAIdoCAQCXBAAh3QJAAJoEACGVAwEAlwQAIZYDAQCXBAAhlwMBAJkEACGYAwEAmQQAIZkDQAC4BAAhmgNAALgEACGbAwEAmQQAIZwDAQCZBAAhnQMBAJkEACEAAAAAAbkDAQAAAAEBuQNAAAAAAQG5A0AAAAABBTIAAMAJACAzAADDCQAgtgMAAMEJACC3AwAAwgkAILwDAAABACADMgAAwAkAILYDAADBCQAgvAMAAAEAIAAAAAAABbkDAgAAAAG_AwIAAAABwAMCAAAAAcEDAgAAAAHCAwIAAAABAbkDAQAAAAEFMgAAuAkAIDMAAL4JACC2AwAAuQkAILcDAAC9CQAgvAMAAAEAIAcyAAC2CQAgMwAAuwkAILYDAAC3CQAgtwMAALoJACC6AwAAFwAguwMAABcAILwDAAAaACADMgAAuAkAILYDAAC5CQAgvAMAAAEAIAMyAAC2CQAgtgMAALcJACC8AwAAGgAgAAAAAAAFuQMCAAAAAb8DAgAAAAHAAwIAAAABwQMCAAAAAcIDAgAAAAEBuQMAAADgAgIFMgAArgkAIDMAALQJACC2AwAArwkAILcDAACzCQAgvAMAABoAIAcyAACsCQAgMwAAsQkAILYDAACtCQAgtwMAALAJACC6AwAADwAguwMAAA8AILwDAAABACADMgAArgkAILYDAACvCQAgvAMAABoAIAMyAACsCQAgtgMAAK0JACC8AwAAAQAgAAAABTIAAKQJACAzAACqCQAgtgMAAKUJACC3AwAAqQkAILwDAAAaACAFMgAAogkAIDMAAKcJACC2AwAAowkAILcDAACmCQAgvAMAAAEAIAMyAACkCQAgtgMAAKUJACC8AwAAGgAgAzIAAKIJACC2AwAAowkAILwDAAABACAAAAABuQMAAADpAgIFMgAAmgkAIDMAAKAJACC2AwAAmwkAILcDAACfCQAgvAMAABoAIAcyAACYCQAgMwAAnQkAILYDAACZCQAgtwMAAJwJACC6AwAADwAguwMAAA8AILwDAAABACADMgAAmgkAILYDAACbCQAgvAMAABoAIAMyAACYCQAgtgMAAJkJACC8AwAAAQAgAAAAAbkDAAAA6wICBTIAAJAJACAzAACWCQAgtgMAAJEJACC3AwAAlQkAILwDAAAaACAFMgAAjgkAIDMAAJMJACC2AwAAjwkAILcDAACSCQAgvAMAAAEAIAMyAACQCQAgtgMAAJEJACC8AwAAGgAgAzIAAI4JACC2AwAAjwkAILwDAAABACAAAAAAAAsyAACoBQAwMwAArQUAMLYDAACpBQAwtwMAAKoFADC4AwAAqwUAILkDAACsBQAwugMAAKwFADC7AwAArAUAMLwDAACsBQAwvQMAAK4FADC-AwAArwUAMAQKAAC1BQAgxwJAAAAAAdsCAQAAAAHeAgIAAAABAgAAACIAIDIAALQFACADAAAAIgAgMgAAtAUAIDMAALIFACABKwAAjQkAMAoKAADOBAAgDgAA0QQAIL4CAADQBAAwvwIAACAAEMACAADQBAAwxwJAAJoEACHbAgEAlwQAId4CAgC2BAAh9AIBAJcEACGyAwAAzwQAIAIAAAAiACArAACyBQAgAgAAALAFACArAACxBQAgB74CAACvBQAwvwIAALAFABDAAgAArwUAMMcCQACaBAAh2wIBAJcEACHeAgIAtgQAIfQCAQCXBAAhB74CAACvBQAwvwIAALAFABDAAgAArwUAMMcCQACaBAAh2wIBAJcEACHeAgIAtgQAIfQCAQCXBAAhA8cCQADxBAAh2wIBAPAEACHeAgIA-gQAIQQKAACzBQAgxwJAAPEEACHbAgEA8AQAId4CAgD6BAAhBTIAAIgJACAzAACLCQAgtgMAAIkJACC3AwAAigkAILwDAAAyACAECgAAtQUAIMcCQAAAAAHbAgEAAAAB3gICAAAAAQMyAACICQAgtgMAAIkJACC8AwAAMgAgBDIAAKgFADC2AwAAqQUAMLgDAACrBQAgvAMAAKwFADAAAAAAAAAFMgAAgAkAIDMAAIYJACC2AwAAgQkAILcDAACFCQAgvAMAABoAIAUyAAD-CAAgMwAAgwkAILYDAAD_CAAgtwMAAIIJACC8AwAAMgAgAzIAAIAJACC2AwAAgQkAILwDAAAaACADMgAA_ggAILYDAAD_CAAgvAMAADIAIAAAAAAABTIAAPkIACAzAAD8CAAgtgMAAPoIACC3AwAA-wgAILwDAADLAgAgAzIAAPkIACC2AwAA-ggAILwDAADLAgAgAAAAAAAFMgAA9AgAIDMAAPcIACC2AwAA9QgAILcDAAD2CAAgvAMAADIAIAMyAAD0CAAgtgMAAPUIACC8AwAAMgAgAAAAAAAFMgAA1AgAIDMAAPIIACC2AwAA1QgAILcDAADxCAAgvAMAABoAIAcyAADoBgAgMwAAgQcAILYDAADpBgAgtwMAAIAHACC6AwAAFwAguwMAABcAILwDAAAaACALMgAA-wUAMDMAAIAGADC2AwAA_AUAMLcDAAD9BQAwuAMAAP4FACC5AwAA_wUAMLoDAAD_BQAwuwMAAP8FADC8AwAA_wUAML0DAACBBgAwvgMAAIIGADALMgAA7wUAMDMAAPQFADC2AwAA8AUAMLcDAADxBQAwuAMAAPIFACC5AwAA8wUAMLoDAADzBQAwuwMAAPMFADC8AwAA8wUAML0DAAD1BQAwvgMAAPYFADALMgAA5gUAMDMAAOoFADC2AwAA5wUAMLcDAADoBQAwuAMAAOkFACC5AwAArAUAMLoDAACsBQAwuwMAAKwFADC8AwAArAUAML0DAADrBQAwvgMAAK8FADALMgAA2gUAMDMAAN8FADC2AwAA2wUAMLcDAADcBQAwuAMAAN0FACC5AwAA3gUAMLoDAADeBQAwuwMAAN4FADC8AwAA3gUAML0DAADgBQAwvgMAAOEFADAEBwAAvwUAIMECAQAAAAHHAkAAAAAB8wIBAAAAAQIAAAAoACAyAADlBQAgAwAAACgAIDIAAOUFACAzAADkBQAgASsAAPAIADAKBwAAwQQAIBAAAM4EACC-AgAAzQQAML8CAAAmABDAAgAAzQQAMMECAQAAAAHHAkAAmgQAIdsCAQCXBAAh8gICALYEACHzAgEAlwQAIQIAAAAoACArAADkBQAgAgAAAOIFACArAADjBQAgCL4CAADhBQAwvwIAAOIFABDAAgAA4QUAMMECAQCXBAAhxwJAAJoEACHbAgEAlwQAIfICAgC2BAAh8wIBAJcEACEIvgIAAOEFADC_AgAA4gUAEMACAADhBQAwwQIBAJcEACHHAkAAmgQAIdsCAQCXBAAh8gICALYEACHzAgEAlwQAIQPBAgEA8AQAIccCQADxBAAh8wIBAPAEACEEBwAAvQUAIMECAQDwBAAhxwJAAPEEACHzAgEA8AQAIQQHAAC_BQAgwQIBAAAAAccCQAAAAAHzAgEAAAABAw4AAMcFACDHAkAAAAAB9AIBAAAAAQIAAAAiACAyAADuBQAgAwAAACIAIDIAAO4FACAzAADtBQAgASsAAO8IADACAAAAIgAgKwAA7QUAIAIAAACwBQAgKwAA7AUAIALHAkAA8QQAIfQCAQDwBAAhAw4AAMYFACDHAkAA8QQAIfQCAQDwBAAhAw4AAMcFACDHAkAAAAAB9AIBAAAAAQLBAgEAAAAB8wIBAAAAAQIAAAAeACAyAAD6BQAgAwAAAB4AIDIAAPoFACAzAAD5BQAgASsAAO4IADAICgAAzgQAIL4CAADSBAAwvwIAABwAEMACAADSBAAwwQIBAAAAAdsCAQCXBAAh3gICALYEACHzAgEAlwQAIQIAAAAeACArAAD5BQAgAgAAAPcFACArAAD4BQAgB74CAAD2BQAwvwIAAPcFABDAAgAA9gUAMMECAQCXBAAh2wIBAJcEACHeAgIAtgQAIfMCAQCXBAAhB74CAAD2BQAwvwIAAPcFABDAAgAA9gUAMMECAQCXBAAh2wIBAJcEACHeAgIAtgQAIfMCAQCXBAAhAsECAQDwBAAh8wIBAPAEACECwQIBAPAEACHzAgEA8AQAIQLBAgEAAAAB8wIBAAAAARcSAAD4BgAgEwAA6gYAIBQAAOsGACAWAADtBgAgFwAA7gYAIBkAAO8GACAaAADwBgAgGwAA8QYAIBwAAPIGACAdAADzBgAgwQIBAAAAAccCQAAAAAHdAkAAAAAB7AICAAAAAfwCAgAAAAGAAwAAAIADAoEDIAAAAAGCAyAAAAABgwMCAAAAAYQDAgAAAAGFAwIAAAABhgMCAAAAAYcDQAAAAAECAAAAGgAgMgAA_wYAIAMAAAAaACAyAAD_BgAgMwAAhwYAIAErAADtCAAwHhIAANYEACATAAC9BAAgFAAAygQAIBUAANYEACAWAADXBAAgFwAA2AQAIBkAANkEACAaAADMBAAgGwAA2gQAIBwAANsEACAdAADcBAAgvgIAANQEADC_AgAAFwAQwAIAANQEADDBAgEAAAABxwJAAJoEACHdAkAAmgQAIewCAgAAAAH8AgIAmAQAIf0CAQCZBAAh_gICAJgEACGAAwAA1QSAAyKBAyAAtwQAIYIDIAC3BAAhgwMCALYEACGEAwIAtgQAIYUDAgC2BAAhhgMCALYEACGHA0AAuAQAIbMDAADTBAAgAgAAABoAICsAAIcGACACAAAAgwYAICsAAIQGACASvgIAAIIGADC_AgAAgwYAEMACAACCBgAwwQIBAJcEACHHAkAAmgQAId0CQACaBAAh7AICAJgEACH8AgIAmAQAIf0CAQCZBAAh_gICAJgEACGAAwAA1QSAAyKBAyAAtwQAIYIDIAC3BAAhgwMCALYEACGEAwIAtgQAIYUDAgC2BAAhhgMCALYEACGHA0AAuAQAIRK-AgAAggYAML8CAACDBgAQwAIAAIIGADDBAgEAlwQAIccCQACaBAAh3QJAAJoEACHsAgIAmAQAIfwCAgCYBAAh_QIBAJkEACH-AgIAmAQAIYADAADVBIADIoEDIAC3BAAhggMgALcEACGDAwIAtgQAIYQDAgC2BAAhhQMCALYEACGGAwIAtgQAIYcDQAC4BAAhDcECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACGAAwAAhQaAAyKBAyAAhgYAIYIDIACGBgAhgwMCAPoEACGEAwIA-gQAIYUDAgD6BAAhhgMCAPoEACGHA0AA8gQAIQG5AwAAAIADAgG5AyAAAAABFxIAAIgGACATAACJBgAgFAAAigYAIBYAAIsGACAXAACMBgAgGQAAjQYAIBoAAI4GACAbAACPBgAgHAAAkAYAIB0AAJEGACDBAgEA8AQAIccCQADxBAAh3QJAAPEEACHsAgIAhQUAIfwCAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEHMgAA2wgAIDMAAOsIACC2AwAA3AgAILcDAADqCAAgugMAABUAILsDAAAVACC8AwAAMgAgBzIAAN4IACAzAADoCAAgtgMAAN8IACC3AwAA5wgAILoDAAAXACC7AwAAFwAgvAMAABoAIAsyAAD0BgAwMwAA-gYAMLYDAAD1BgAwtwMAAPkGADC4AwAA9gYAILkDAAD_BQAwugMAAP8FADC7AwAA_wUAMLwDAAD_BQAwvQMAAPsGADC-AwAAggYAMAsyAADXBgAwMwAA3AYAMLYDAADYBgAwtwMAANkGADC4AwAA2gYAILkDAADbBgAwugMAANsGADC7AwAA2wYAMLwDAADbBgAwvQMAAN0GADC-AwAA3gYAMAsyAADLBgAwMwAA0AYAMLYDAADMBgAwtwMAAM0GADC4AwAAzgYAILkDAADPBgAwugMAAM8GADC7AwAAzwYAMLwDAADPBgAwvQMAANEGADC-AwAA0gYAMAsyAAC_BgAwMwAAxAYAMLYDAADABgAwtwMAAMEGADC4AwAAwgYAILkDAADDBgAwugMAAMMGADC7AwAAwwYAMLwDAADDBgAwvQMAAMUGADC-AwAAxgYAMAsyAAC2BgAwMwAAugYAMLYDAAC3BgAwtwMAALgGADC4AwAAuQYAILkDAADeBQAwugMAAN4FADC7AwAA3gUAMLwDAADeBQAwvQMAALsGADC-AwAA4QUAMAsyAACqBgAwMwAArwYAMLYDAACrBgAwtwMAAKwGADC4AwAArQYAILkDAACuBgAwugMAAK4GADC7AwAArgYAMLwDAACuBgAwvQMAALAGADC-AwAAsQYAMAsyAACeBgAwMwAAowYAMLYDAACfBgAwtwMAAKAGADC4AwAAoQYAILkDAACiBgAwugMAAKIGADC7AwAAogYAMLwDAACiBgAwvQMAAKQGADC-AwAApQYAMAsyAACSBgAwMwAAlwYAMLYDAACTBgAwtwMAAJQGADC4AwAAlQYAILkDAACWBgAwugMAAJYGADC7AwAAlgYAMLwDAACWBgAwvQMAAJgGADC-AwAAmQYAMAcDAAD-BAAgK4AAAAABwQIBAAAAAccCQAAAAAHaAgEAAAAB3AICAAAAAd0CQAAAAAECAAAARgAgMgAAnQYAIAMAAABGACAyAACdBgAgMwAAnAYAIAErAADmCAAwDAMAALkEACAHAAC9BAAgKwAAuwQAIL4CAAC8BAAwvwIAAEQAEMACAAC8BAAwwQIBAAAAAccCQACaBAAh2gIBAJcEACHbAgEAmQQAIdwCAgC2BAAh3QJAAJoEACECAAAARgAgKwAAnAYAIAIAAACaBgAgKwAAmwYAIAorAAC7BAAgvgIAAJkGADC_AgAAmgYAEMACAACZBgAwwQIBAJcEACHHAkAAmgQAIdoCAQCXBAAh2wIBAJkEACHcAgIAtgQAId0CQACaBAAhCisAALsEACC-AgAAmQYAML8CAACaBgAQwAIAAJkGADDBAgEAlwQAIccCQACaBAAh2gIBAJcEACHbAgEAmQQAIdwCAgC2BAAh3QJAAJoEACEGK4AAAAABwQIBAPAEACHHAkAA8QQAIdoCAQDwBAAh3AICAPoEACHdAkAA8QQAIQcDAAD8BAAgK4AAAAABwQIBAPAEACHHAkAA8QQAIdoCAQDwBAAh3AICAPoEACHdAkAA8QQAIQcDAAD-BAAgK4AAAAABwQIBAAAAAccCQAAAAAHaAgEAAAAB3AICAAAAAd0CQAAAAAEMAwAAigUAIMECAQAAAAHHAkAAAAAB2gIBAAAAAd4CAgAAAAHgAgAAAOACAuECAQAAAAHiAgEAAAAB4wIBAAAAAeQCAQAAAAHlAoAAAAAB5gIBAAAAAQIAAABBACAyAACpBgAgAwAAAEEAIDIAAKkGACAzAACoBgAgASsAAOUIADARAwAAwgQAIAcAAMEEACC-AgAAvgQAML8CAAA_ABDAAgAAvgQAMMECAQAAAAHHAkAAmgQAIdoCAQCZBAAh2wIBAJcEACHeAgIAmAQAIeACAAC_BOACIuECAQCZBAAh4gIBAJkEACHjAgEAmQQAIeQCAQCZBAAh5QIAAMAEACDmAgEAmQQAIQIAAABBACArAACoBgAgAgAAAKYGACArAACnBgAgD74CAAClBgAwvwIAAKYGABDAAgAApQYAMMECAQCXBAAhxwJAAJoEACHaAgEAmQQAIdsCAQCXBAAh3gICAJgEACHgAgAAvwTgAiLhAgEAmQQAIeICAQCZBAAh4wIBAJkEACHkAgEAmQQAIeUCAADABAAg5gIBAJkEACEPvgIAAKUGADC_AgAApgYAEMACAAClBgAwwQIBAJcEACHHAkAAmgQAIdoCAQCZBAAh2wIBAJcEACHeAgIAmAQAIeACAAC_BOACIuECAQCZBAAh4gIBAJkEACHjAgEAmQQAIeQCAQCZBAAh5QIAAMAEACDmAgEAmQQAIQvBAgEA8AQAIccCQADxBAAh2gIBAPsEACHeAgIAhQUAIeACAACGBeACIuECAQD7BAAh4gIBAPsEACHjAgEA-wQAIeQCAQD7BAAh5QKAAAAAAeYCAQD7BAAhDAMAAIgFACDBAgEA8AQAIccCQADxBAAh2gIBAPsEACHeAgIAhQUAIeACAACGBeACIuECAQD7BAAh4gIBAPsEACHjAgEA-wQAIeQCAQD7BAAh5QKAAAAAAeYCAQD7BAAhDAMAAIoFACDBAgEAAAABxwJAAAAAAdoCAQAAAAHeAgIAAAAB4AIAAADgAgLhAgEAAAAB4gIBAAAAAeMCAQAAAAHkAgEAAAAB5QKAAAAAAeYCAQAAAAEDAwAAkQUAIMcCQAAAAAHaAgEAAAABAgAAAD0AIDIAALUGACADAAAAPQAgMgAAtQYAIDMAALQGACABKwAA5AgAMAkDAAC5BAAgBwAAwQQAIL4CAADEBAAwvwIAADsAEMACAADEBAAwxwJAAJoEACHaAgEAlwQAIdsCAQCXBAAhrwMAAMMEACACAAAAPQAgKwAAtAYAIAIAAACyBgAgKwAAswYAIAa-AgAAsQYAML8CAACyBgAQwAIAALEGADDHAkAAmgQAIdoCAQCXBAAh2wIBAJcEACEGvgIAALEGADC_AgAAsgYAEMACAACxBgAwxwJAAJoEACHaAgEAlwQAIdsCAQCXBAAhAscCQADxBAAh2gIBAPAEACEDAwAAjwUAIMcCQADxBAAh2gIBAPAEACEDAwAAkQUAIMcCQAAAAAHaAgEAAAABBRAAAMAFACDBAgEAAAABxwJAAAAAAfICAgAAAAHzAgEAAAABAgAAACgAIDIAAL4GACADAAAAKAAgMgAAvgYAIDMAAL0GACABKwAA4wgAMAIAAAAoACArAAC9BgAgAgAAAOIFACArAAC8BgAgBMECAQDwBAAhxwJAAPEEACHyAgIA-gQAIfMCAQDwBAAhBRAAAL4FACDBAgEA8AQAIccCQADxBAAh8gICAPoEACHzAgEA8AQAIQUQAADABQAgwQIBAAAAAccCQAAAAAHyAgIAAAAB8wIBAAAAAQUYAACZBQAgwQIBAAAAAccCQAAAAAHnAgEAAAAB6QIAAADpAgICAAAANwAgMgAAygYAIAMAAAA3ACAyAADKBgAgMwAAyQYAIAErAADiCAAwCwcAAMEEACAYAADCBAAgvgIAAMYEADC_AgAANQAQwAIAAMYEADDBAgEAAAABxwJAAJoEACHbAgEAlwQAIecCAQCZBAAh6QIAAMcE6QIisAMAAMUEACACAAAANwAgKwAAyQYAIAIAAADHBgAgKwAAyAYAIAi-AgAAxgYAML8CAADHBgAQwAIAAMYGADDBAgEAlwQAIccCQACaBAAh2wIBAJcEACHnAgEAmQQAIekCAADHBOkCIgi-AgAAxgYAML8CAADHBgAQwAIAAMYGADDBAgEAlwQAIccCQACaBAAh2wIBAJcEACHnAgEAmQQAIekCAADHBOkCIgTBAgEA8AQAIccCQADxBAAh5wIBAPsEACHpAgAAlQXpAiIFGAAAlwUAIMECAQDwBAAhxwJAAPEEACHnAgEA-wQAIekCAACVBekCIgUYAACZBQAgwQIBAAAAAccCQAAAAAHnAgEAAAAB6QIAAADpAgIEAwAAoQUAIMcCQAAAAAHaAgEAAAAB6wIAAADrAgICAAAAEwAgMgAA1gYAIAMAAAATACAyAADWBgAgMwAA1QYAIAErAADhCAAwCgMAALkEACAHAADBBAAgvgIAAN4EADC_AgAAEQAQwAIAAN4EADDHAkAAmgQAIdoCAQCXBAAh2wIBAJcEACHrAgAA3wTrAiKvAwAA3QQAIAIAAAATACArAADVBgAgAgAAANMGACArAADUBgAgB74CAADSBgAwvwIAANMGABDAAgAA0gYAMMcCQACaBAAh2gIBAJcEACHbAgEAlwQAIesCAADfBOsCIge-AgAA0gYAML8CAADTBgAQwAIAANIGADDHAkAAmgQAIdoCAQCXBAAh2wIBAJcEACHrAgAA3wTrAiIDxwJAAPEEACHaAgEA8AQAIesCAACdBesCIgQDAACfBQAgxwJAAPEEACHaAgEA8AQAIesCAACdBesCIgQDAAChBQAgxwJAAAAAAdoCAQAAAAHrAgAAAOsCAg4IAADjBgAgCQAA5AYAIAsAAOUGACAPAADmBgAgEQAA5wYAIMcCQAAAAAHeAgIAAAAB9QIBAAAAAfYCAQAAAAH3AgEAAAAB-AIBAAAAAfkCAQAAAAH6AgEAAAAB-wJAAAAAAQIAAAAyACAyAADiBgAgAwAAADIAIDIAAOIGACAzAADhBgAgASsAAOAIADAUBwAAwQQAIAgAAL0EACAJAADKBAAgCwAAywQAIA8AAJsEACARAADMBAAgvgIAAMkEADC_AgAAFQAQwAIAAMkEADDHAkAAmgQAIdsCAQCXBAAh3gICALYEACH1AgEAlwQAIfYCAQCZBAAh9wIBAJkEACH4AgEAlwQAIfkCAQCZBAAh-gIBAJkEACH7AkAAuAQAIbEDAADIBAAgAgAAADIAICsAAOEGACACAAAA3wYAICsAAOAGACANvgIAAN4GADC_AgAA3wYAEMACAADeBgAwxwJAAJoEACHbAgEAlwQAId4CAgC2BAAh9QIBAJcEACH2AgEAmQQAIfcCAQCZBAAh-AIBAJcEACH5AgEAmQQAIfoCAQCZBAAh-wJAALgEACENvgIAAN4GADC_AgAA3wYAEMACAADeBgAwxwJAAJoEACHbAgEAlwQAId4CAgC2BAAh9QIBAJcEACH2AgEAmQQAIfcCAQCZBAAh-AIBAJcEACH5AgEAmQQAIfoCAQCZBAAh-wJAALgEACEJxwJAAPEEACHeAgIA-gQAIfUCAQDwBAAh9gIBAPsEACH3AgEA-wQAIfgCAQDwBAAh-QIBAPsEACH6AgEA-wQAIfsCQADyBAAhDggAANUFACAJAADWBQAgCwAA1wUAIA8AANgFACARAADZBQAgxwJAAPEEACHeAgIA-gQAIfUCAQDwBAAh9gIBAPsEACH3AgEA-wQAIfgCAQDwBAAh-QIBAPsEACH6AgEA-wQAIfsCQADyBAAhDggAAOMGACAJAADkBgAgCwAA5QYAIA8AAOYGACARAADnBgAgxwJAAAAAAd4CAgAAAAH1AgEAAAAB9gIBAAAAAfcCAQAAAAH4AgEAAAAB-QIBAAAAAfoCAQAAAAH7AkAAAAABAzIAAOgGACC2AwAA6QYAILwDAAAaACAEMgAA-wUAMLYDAAD8BQAwuAMAAP4FACC8AwAA_wUAMAQyAADvBQAwtgMAAPAFADC4AwAA8gUAILwDAADzBQAwBDIAAOYFADC2AwAA5wUAMLgDAADpBQAgvAMAAKwFADAEMgAA2gUAMLYDAADbBQAwuAMAAN0FACC8AwAA3gUAMBcTAADqBgAgFAAA6wYAIBUAAOwGACAWAADtBgAgFwAA7gYAIBkAAO8GACAaAADwBgAgGwAA8QYAIBwAAPIGACAdAADzBgAgxwJAAAAAAd0CQAAAAAHsAgIAAAAB_QIBAAAAAf4CAgAAAAGAAwAAAIADAoEDIAAAAAGCAyAAAAABgwMCAAAAAYQDAgAAAAGFAwIAAAABhgMCAAAAAYcDQAAAAAECAAAAGgAgMgAA6AYAIAMyAADeCAAgtgMAAN8IACC8AwAAGgAgBDIAAPQGADC2AwAA9QYAMLgDAAD2BgAgvAMAAP8FADADMgAA1ggAILYDAADXCAAgvAMAADIAIAQyAADXBgAwtgMAANgGADC4AwAA2gYAILwDAADbBgAwBDIAAMsGADC2AwAAzAYAMLgDAADOBgAgvAMAAM8GADAEMgAAvwYAMLYDAADABgAwuAMAAMIGACC8AwAAwwYAMAQyAAC2BgAwtgMAALcGADC4AwAAuQYAILwDAADeBQAwBDIAAKoGADC2AwAAqwYAMLgDAACtBgAgvAMAAK4GADAEMgAAngYAMLYDAACfBgAwuAMAAKEGACC8AwAAogYAMAQyAACSBgAwtgMAAJMGADC4AwAAlQYAILwDAACWBgAwGBIAAPgGACAUAADrBgAgFQAA7AYAIBYAAO0GACAXAADuBgAgGQAA7wYAIBoAAPAGACAbAADxBgAgHAAA8gYAIB0AAPMGACDBAgEAAAABxwJAAAAAAd0CQAAAAAHsAgIAAAAB_AICAAAAAf4CAgAAAAGAAwAAAIADAoEDIAAAAAGCAyAAAAABgwMCAAAAAYQDAgAAAAGFAwIAAAABhgMCAAAAAYcDQAAAAAECAAAAGgAgMgAA9wYAIAErAADdCAAwGBIAAPgGACAUAADrBgAgFQAA7AYAIBYAAO0GACAXAADuBgAgGQAA7wYAIBoAAPAGACAbAADxBgAgHAAA8gYAIB0AAPMGACDBAgEAAAABxwJAAAAAAd0CQAAAAAHsAgIAAAAB_AICAAAAAf4CAgAAAAGAAwAAAIADAoEDIAAAAAGCAyAAAAABgwMCAAAAAYQDAgAAAAGFAwIAAAABhgMCAAAAAYcDQAAAAAEDMgAA2wgAILYDAADcCAAgvAMAADIAIAMAAAAaACAyAAD3BgAgMwAA_QYAIAIAAAAaACArAAD9BgAgAgAAAIMGACArAAD8BgAgDsECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH-AgIAhQUAIYADAACFBoADIoEDIACGBgAhggMgAIYGACGDAwIA-gQAIYQDAgD6BAAhhQMCAPoEACGGAwIA-gQAIYcDQADyBAAhGBIAAIgGACAUAACKBgAgFQAA_gYAIBYAAIsGACAXAACMBgAgGQAAjQYAIBoAAI4GACAbAACPBgAgHAAAkAYAIB0AAJEGACDBAgEA8AQAIccCQADxBAAh3QJAAPEEACHsAgIAhQUAIfwCAgCFBQAh_gICAIUFACGAAwAAhQaAAyKBAyAAhgYAIYIDIACGBgAhgwMCAPoEACGEAwIA-gQAIYUDAgD6BAAhhgMCAPoEACGHA0AA8gQAIQcyAADWCAAgMwAA2QgAILYDAADXCAAgtwMAANgIACC6AwAAFQAguwMAABUAILwDAAAyACAXEgAA-AYAIBMAAOoGACAUAADrBgAgFgAA7QYAIBcAAO4GACAZAADvBgAgGgAA8AYAIBsAAPEGACAcAADyBgAgHQAA8wYAIMECAQAAAAHHAkAAAAAB3QJAAAAAAewCAgAAAAH8AgIAAAABgAMAAACAAwKBAyAAAAABggMgAAAAAYMDAgAAAAGEAwIAAAABhQMCAAAAAYYDAgAAAAGHA0AAAAABAwAAABcAIDIAAOgGACAzAACCBwAgGQAAABcAIBMAAIkGACAUAACKBgAgFQAA_gYAIBYAAIsGACAXAACMBgAgGQAAjQYAIBoAAI4GACAbAACPBgAgHAAAkAYAIB0AAJEGACArAACCBwAgxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_QIBAPsEACH-AgIAhQUAIYADAACFBoADIoEDIACGBgAhggMgAIYGACGDAwIA-gQAIYQDAgD6BAAhhQMCAPoEACGGAwIA-gQAIYcDQADyBAAhFxMAAIkGACAUAACKBgAgFQAA_gYAIBYAAIsGACAXAACMBgAgGQAAjQYAIBoAAI4GACAbAACPBgAgHAAAkAYAIB0AAJEGACDHAkAA8QQAId0CQADxBAAh7AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEDMgAA1AgAILYDAADVCAAgvAMAABoAIAAAAAAAAAAAAAAFMgAAzwgAIDMAANIIACC2AwAA0AgAILcDAADRCAAgvAMAAAEAIAMyAADPCAAgtgMAANAIACC8AwAAAQAgAAAABzIAAMoIACAzAADNCAAgtgMAAMsIACC3AwAAzAgAILoDAAAPACC7AwAADwAgvAMAAAEAIAMyAADKCAAgtgMAAMsIACC8AwAAAQAgAAAABTIAAMUIACAzAADICAAgtgMAAMYIACC3AwAAxwgAILwDAAABACADMgAAxQgAILYDAADGCAAgvAMAAAEAIAAAAAUyAADACAAgMwAAwwgAILYDAADBCAAgtwMAAMIIACC8AwAAAQAgAzIAAMAIACC2AwAAwQgAILwDAAABACAAAAAAAAG5AwAAAKIDAgG5AwAAAKQDAgG5AyAAAAABCzIAAI4IADAzAACTCAAwtgMAAI8IADC3AwAAkAgAMLgDAACRCAAguQMAAJIIADC6AwAAkggAMLsDAACSCAAwvAMAAJIIADC9AwAAlAgAML4DAACVCAAwCzIAAIIIADAzAACHCAAwtgMAAIMIADC3AwAAhAgAMLgDAACFCAAguQMAAIYIADC6AwAAhggAMLsDAACGCAAwvAMAAIYIADC9AwAAiAgAML4DAACJCAAwCzIAAPYHADAzAAD7BwAwtgMAAPcHADC3AwAA-AcAMLgDAAD5BwAguQMAAPoHADC6AwAA-gcAMLsDAAD6BwAwvAMAAPoHADC9AwAA_AcAML4DAAD9BwAwCzIAAO0HADAzAADxBwAwtgMAAO4HADC3AwAA7wcAMLgDAADwBwAguQMAAM8GADC6AwAAzwYAMLsDAADPBgAwvAMAAM8GADC9AwAA8gcAML4DAADSBgAwCzIAAOQHADAzAADoBwAwtgMAAOUHADC3AwAA5gcAMLgDAADnBwAguQMAAMMGADC6AwAAwwYAMLsDAADDBgAwvAMAAMMGADC9AwAA6QcAML4DAADGBgAwCzIAANgHADAzAADdBwAwtgMAANkHADC3AwAA2gcAMLgDAADbBwAguQMAANwHADC6AwAA3AcAMLsDAADcBwAwvAMAANwHADC9AwAA3gcAML4DAADfBwAwCzIAAM8HADAzAADTBwAwtgMAANAHADC3AwAA0QcAMLgDAADSBwAguQMAAK4GADC6AwAArgYAMLsDAACuBgAwvAMAAK4GADC9AwAA1AcAML4DAACxBgAwCzIAAMYHADAzAADKBwAwtgMAAMcHADC3AwAAyAcAMLgDAADJBwAguQMAAKIGADC6AwAAogYAMLsDAACiBgAwvAMAAKIGADC9AwAAywcAML4DAAClBgAwCzIAAL0HADAzAADBBwAwtgMAAL4HADC3AwAAvwcAMLgDAADABwAguQMAAJYGADC6AwAAlgYAMLsDAACWBgAwvAMAAJYGADC9AwAAwgcAML4DAACZBgAwCzIAALEHADAzAAC2BwAwtgMAALIHADC3AwAAswcAMLgDAAC0BwAguQMAALUHADC6AwAAtQcAMLsDAAC1BwAwvAMAALUHADC9AwAAtwcAML4DAAC4BwAwCsECAQAAAAHHAkAAAAAB7QIBAAAAAYgDAQAAAAGJAwEAAAABigMCAAAAAYsDAQAAAAGMAyAAAAABjQMBAAAAAY4DAQAAAAECAAAAWwAgMgAAvAcAIAMAAABbACAyAAC8BwAgMwAAuwcAIAErAAC_CAAwDwMAALkEACC-AgAAtQQAML8CAABZABDAAgAAtQQAMMECAQAAAAHHAkAAuAQAIdoCAQCXBAAh7QIBAJkEACGIAwEAlwQAIYkDAQCXBAAhigMCALYEACGLAwEAlwQAIYwDIAC3BAAhjQMBAJkEACGOAwEAmQQAIQIAAABbACArAAC7BwAgAgAAALkHACArAAC6BwAgDr4CAAC4BwAwvwIAALkHABDAAgAAuAcAMMECAQCXBAAhxwJAALgEACHaAgEAlwQAIe0CAQCZBAAhiAMBAJcEACGJAwEAlwQAIYoDAgC2BAAhiwMBAJcEACGMAyAAtwQAIY0DAQCZBAAhjgMBAJkEACEOvgIAALgHADC_AgAAuQcAEMACAAC4BwAwwQIBAJcEACHHAkAAuAQAIdoCAQCXBAAh7QIBAJkEACGIAwEAlwQAIYkDAQCXBAAhigMCALYEACGLAwEAlwQAIYwDIAC3BAAhjQMBAJkEACGOAwEAmQQAIQrBAgEA8AQAIccCQADyBAAh7QIBAPsEACGIAwEA8AQAIYkDAQDwBAAhigMCAPoEACGLAwEA8AQAIYwDIACGBgAhjQMBAPsEACGOAwEA-wQAIQrBAgEA8AQAIccCQADyBAAh7QIBAPsEACGIAwEA8AQAIYkDAQDwBAAhigMCAPoEACGLAwEA8AQAIYwDIACGBgAhjQMBAPsEACGOAwEA-wQAIQrBAgEAAAABxwJAAAAAAe0CAQAAAAGIAwEAAAABiQMBAAAAAYoDAgAAAAGLAwEAAAABjAMgAAAAAY0DAQAAAAGOAwEAAAABBwcAAP8EACArgAAAAAHBAgEAAAABxwJAAAAAAdsCAQAAAAHcAgIAAAAB3QJAAAAAAQIAAABGACAyAADFBwAgAwAAAEYAIDIAAMUHACAzAADEBwAgASsAAL4IADACAAAARgAgKwAAxAcAIAIAAACaBgAgKwAAwwcAIAYrgAAAAAHBAgEA8AQAIccCQADxBAAh2wIBAPsEACHcAgIA-gQAId0CQADxBAAhBwcAAP0EACArgAAAAAHBAgEA8AQAIccCQADxBAAh2wIBAPsEACHcAgIA-gQAId0CQADxBAAhBwcAAP8EACArgAAAAAHBAgEAAAABxwJAAAAAAdsCAQAAAAHcAgIAAAAB3QJAAAAAAQwHAACJBQAgwQIBAAAAAccCQAAAAAHbAgEAAAAB3gICAAAAAeACAAAA4AIC4QIBAAAAAeICAQAAAAHjAgEAAAAB5AIBAAAAAeUCgAAAAAHmAgEAAAABAgAAAEEAIDIAAM4HACADAAAAQQAgMgAAzgcAIDMAAM0HACABKwAAvQgAMAIAAABBACArAADNBwAgAgAAAKYGACArAADMBwAgC8ECAQDwBAAhxwJAAPEEACHbAgEA8AQAId4CAgCFBQAh4AIAAIYF4AIi4QIBAPsEACHiAgEA-wQAIeMCAQD7BAAh5AIBAPsEACHlAoAAAAAB5gIBAPsEACEMBwAAhwUAIMECAQDwBAAhxwJAAPEEACHbAgEA8AQAId4CAgCFBQAh4AIAAIYF4AIi4QIBAPsEACHiAgEA-wQAIeMCAQD7BAAh5AIBAPsEACHlAoAAAAAB5gIBAPsEACEMBwAAiQUAIMECAQAAAAHHAkAAAAAB2wIBAAAAAd4CAgAAAAHgAgAAAOACAuECAQAAAAHiAgEAAAAB4wIBAAAAAeQCAQAAAAHlAoAAAAAB5gIBAAAAAQMHAACQBQAgxwJAAAAAAdsCAQAAAAECAAAAPQAgMgAA1wcAIAMAAAA9ACAyAADXBwAgMwAA1gcAIAErAAC8CAAwAgAAAD0AICsAANYHACACAAAAsgYAICsAANUHACACxwJAAPEEACHbAgEA8AQAIQMHAACOBQAgxwJAAPEEACHbAgEA8AQAIQMHAACQBQAgxwJAAAAAAdsCAQAAAAEHwQIBAAAAAcICAQAAAAHEAgEAAAABxQIBAAAAAcYCgAAAAAHHAkAAAAAByAJAAAAAAQIAAABUACAyAADjBwAgAwAAAFQAIDIAAOMHACAzAADiBwAgASsAALsIADAMIAAAuQQAIL4CAAC6BAAwvwIAAFIAEMACAAC6BAAwwQIBAAAAAcICAQCXBAAhwwIBAJcEACHEAgEAlwQAIcUCAQCXBAAhxgIAALsEACDHAkAAmgQAIcgCQAC4BAAhAgAAAFQAICsAAOIHACACAAAA4AcAICsAAOEHACALvgIAAN8HADC_AgAA4AcAEMACAADfBwAwwQIBAJcEACHCAgEAlwQAIcMCAQCXBAAhxAIBAJcEACHFAgEAlwQAIcYCAAC7BAAgxwJAAJoEACHIAkAAuAQAIQu-AgAA3wcAML8CAADgBwAQwAIAAN8HADDBAgEAlwQAIcICAQCXBAAhwwIBAJcEACHEAgEAlwQAIcUCAQCXBAAhxgIAALsEACDHAkAAmgQAIcgCQAC4BAAhB8ECAQDwBAAhwgIBAPAEACHEAgEA8AQAIcUCAQDwBAAhxgKAAAAAAccCQADxBAAhyAJAAPIEACEHwQIBAPAEACHCAgEA8AQAIcQCAQDwBAAhxQIBAPAEACHGAoAAAAABxwJAAPEEACHIAkAA8gQAIQfBAgEAAAABwgIBAAAAAcQCAQAAAAHFAgEAAAABxgKAAAAAAccCQAAAAAHIAkAAAAABBQcAAJgFACDBAgEAAAABxwJAAAAAAdsCAQAAAAHpAgAAAOkCAgIAAAA3ACAyAADsBwAgAwAAADcAIDIAAOwHACAzAADrBwAgASsAALoIADACAAAANwAgKwAA6wcAIAIAAADHBgAgKwAA6gcAIATBAgEA8AQAIccCQADxBAAh2wIBAPAEACHpAgAAlQXpAiIFBwAAlgUAIMECAQDwBAAhxwJAAPEEACHbAgEA8AQAIekCAACVBekCIgUHAACYBQAgwQIBAAAAAccCQAAAAAHbAgEAAAAB6QIAAADpAgIEBwAAoAUAIMcCQAAAAAHbAgEAAAAB6wIAAADrAgICAAAAEwAgMgAA9QcAIAMAAAATACAyAAD1BwAgMwAA9AcAIAErAAC5CAAwAgAAABMAICsAAPQHACACAAAA0wYAICsAAPMHACADxwJAAPEEACHbAgEA8AQAIesCAACdBesCIgQHAACeBQAgxwJAAPEEACHbAgEA8AQAIesCAACdBesCIgQHAACgBQAgxwJAAAAAAdsCAQAAAAHrAgAAAOsCAgbBAgEAAAABxwJAAAAAAd0CQAAAAAGPAwEAAAABkAMBAAAAAZEDQAAAAAECAAAADQAgMgAAgQgAIAMAAAANACAyAACBCAAgMwAAgAgAIAErAAC4CAAwCwMAAMIEACC-AgAA6QQAML8CAAALABDAAgAA6QQAMMECAQAAAAHHAkAAuAQAIdoCAQCZBAAh3QJAALgEACGPAwEAlwQAIZADAQCXBAAhkQNAAJoEACECAAAADQAgKwAAgAgAIAIAAAD-BwAgKwAA_wcAIAq-AgAA_QcAML8CAAD-BwAQwAIAAP0HADDBAgEAlwQAIccCQAC4BAAh2gIBAJkEACHdAkAAuAQAIY8DAQCXBAAhkAMBAJcEACGRA0AAmgQAIQq-AgAA_QcAML8CAAD-BwAQwAIAAP0HADDBAgEAlwQAIccCQAC4BAAh2gIBAJkEACHdAkAAuAQAIY8DAQCXBAAhkAMBAJcEACGRA0AAmgQAIQbBAgEA8AQAIccCQADyBAAh3QJAAPIEACGPAwEA8AQAIZADAQDwBAAhkQNAAPEEACEGwQIBAPAEACHHAkAA8gQAId0CQADyBAAhjwMBAPAEACGQAwEA8AQAIZEDQADxBAAhBsECAQAAAAHHAkAAAAAB3QJAAAAAAY8DAQAAAAGQAwEAAAABkQNAAAAAAQjBAgEAAAABxwJAAAAAAd0CQAAAAAHjAgEAAAABkQNAAAAAAZIDAQAAAAGTAwEAAAABlAMBAAAAAQIAAAAJACAyAACNCAAgAwAAAAkAIDIAAI0IACAzAACMCAAgASsAALcIADANAwAAuQQAIL4CAADqBAAwvwIAAAcAEMACAADqBAAwwQIBAAAAAccCQACaBAAh2gIBAJcEACHdAkAAmgQAIeMCAQCZBAAhkQNAAJoEACGSAwEAAAABkwMBAJkEACGUAwEAmQQAIQIAAAAJACArAACMCAAgAgAAAIoIACArAACLCAAgDL4CAACJCAAwvwIAAIoIABDAAgAAiQgAMMECAQCXBAAhxwJAAJoEACHaAgEAlwQAId0CQACaBAAh4wIBAJkEACGRA0AAmgQAIZIDAQCXBAAhkwMBAJkEACGUAwEAmQQAIQy-AgAAiQgAML8CAACKCAAQwAIAAIkIADDBAgEAlwQAIccCQACaBAAh2gIBAJcEACHdAkAAmgQAIeMCAQCZBAAhkQNAAJoEACGSAwEAlwQAIZMDAQCZBAAhlAMBAJkEACEIwQIBAPAEACHHAkAA8QQAId0CQADxBAAh4wIBAPsEACGRA0AA8QQAIZIDAQDwBAAhkwMBAPsEACGUAwEA-wQAIQjBAgEA8AQAIccCQADxBAAh3QJAAPEEACHjAgEA-wQAIZEDQADxBAAhkgMBAPAEACGTAwEA-wQAIZQDAQD7BAAhCMECAQAAAAHHAkAAAAAB3QJAAAAAAeMCAQAAAAGRA0AAAAABkgMBAAAAAZMDAQAAAAGUAwEAAAABDMECAQAAAAHHAkAAAAAB3QJAAAAAAZUDAQAAAAGWAwEAAAABlwMBAAAAAZgDAQAAAAGZA0AAAAABmgNAAAAAAZsDAQAAAAGcAwEAAAABnQMBAAAAAQIAAAAFACAyAACZCAAgAwAAAAUAIDIAAJkIACAzAACYCAAgASsAALYIADARAwAAuQQAIL4CAADrBAAwvwIAAAMAEMACAADrBAAwwQIBAAAAAccCQACaBAAh2gIBAJcEACHdAkAAmgQAIZUDAQCXBAAhlgMBAJcEACGXAwEAmQQAIZgDAQCZBAAhmQNAALgEACGaA0AAuAQAIZsDAQCZBAAhnAMBAJkEACGdAwEAmQQAIQIAAAAFACArAACYCAAgAgAAAJYIACArAACXCAAgEL4CAACVCAAwvwIAAJYIABDAAgAAlQgAMMECAQCXBAAhxwJAAJoEACHaAgEAlwQAId0CQACaBAAhlQMBAJcEACGWAwEAlwQAIZcDAQCZBAAhmAMBAJkEACGZA0AAuAQAIZoDQAC4BAAhmwMBAJkEACGcAwEAmQQAIZ0DAQCZBAAhEL4CAACVCAAwvwIAAJYIABDAAgAAlQgAMMECAQCXBAAhxwJAAJoEACHaAgEAlwQAId0CQACaBAAhlQMBAJcEACGWAwEAlwQAIZcDAQCZBAAhmAMBAJkEACGZA0AAuAQAIZoDQAC4BAAhmwMBAJkEACGcAwEAmQQAIZ0DAQCZBAAhDMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIZUDAQDwBAAhlgMBAPAEACGXAwEA-wQAIZgDAQD7BAAhmQNAAPIEACGaA0AA8gQAIZsDAQD7BAAhnAMBAPsEACGdAwEA-wQAIQzBAgEA8AQAIccCQADxBAAh3QJAAPEEACGVAwEA8AQAIZYDAQDwBAAhlwMBAPsEACGYAwEA-wQAIZkDQADyBAAhmgNAAPIEACGbAwEA-wQAIZwDAQD7BAAhnQMBAPsEACEMwQIBAAAAAccCQAAAAAHdAkAAAAABlQMBAAAAAZYDAQAAAAGXAwEAAAABmAMBAAAAAZkDQAAAAAGaA0AAAAABmwMBAAAAAZwDAQAAAAGdAwEAAAABBDIAAI4IADC2AwAAjwgAMLgDAACRCAAgvAMAAJIIADAEMgAAgggAMLYDAACDCAAwuAMAAIUIACC8AwAAhggAMAQyAAD2BwAwtgMAAPcHADC4AwAA-QcAILwDAAD6BwAwBDIAAO0HADC2AwAA7gcAMLgDAADwBwAgvAMAAM8GADAEMgAA5AcAMLYDAADlBwAwuAMAAOcHACC8AwAAwwYAMAQyAADYBwAwtgMAANkHADC4AwAA2wcAILwDAADcBwAwBDIAAM8HADC2AwAA0AcAMLgDAADSBwAgvAMAAK4GADAEMgAAxgcAMLYDAADHBwAwuAMAAMkHACC8AwAAogYAMAQyAAC9BwAwtgMAAL4HADC4AwAAwAcAILwDAACWBgAwBDIAALEHADC2AwAAsgcAMLgDAAC0BwAgvAMAALUHADAAAAAAAAAAAAAAGQQAAKQIACAFAAClCAAgBgAApggAIB4AAKcIACAfAACoCAAgIQAAqQgAICIAAKoIACAjAACrCAAgJAAArAgAICUAAK0IACDrAgAA7AQAIOwCAADsBAAg7QIAAOwEACCHAwAA7AQAIJ4DAADsBAAgoAMAAOwEACCmAwAA7AQAIKcDAADsBAAgqAMAAOwEACCpAwAA7AQAIKoDAADsBAAgqwMAAOwEACCsAwAA7AQAIK0DAADsBAAgrgMAAOwEACAQEgAAswgAIBMAAK8IACAUAACwCAAgFQAAswgAIBYAALUIACAXAACnCAAgGQAAqAgAIBoAALIIACAbAACqCAAgHAAAqwgAIB0AAKwIACDsAgAA7AQAIPwCAADsBAAg_QIAAOwEACD-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_AICAAAAAf0CAQAAAAH-AgIAAAABgAMAAACAAwKBAyAAAAABggMgAAAAAYMDAgAAAAGEAwIAAAABhQMCAAAAAYYDAgAAAAGHA0AAAAABAgAAABoAIDIAANQIACAPBwAAgwcAIAgAAOMGACALAADlBgAgDwAA5gYAIBEAAOcGACDHAkAAAAAB2wIBAAAAAd4CAgAAAAH1AgEAAAAB9gIBAAAAAfcCAQAAAAH4AgEAAAAB-QIBAAAAAfoCAQAAAAH7AkAAAAABAgAAADIAIDIAANYIACADAAAAFQAgMgAA1ggAIDMAANoIACARAAAAFQAgBwAA1AUAIAgAANUFACALAADXBQAgDwAA2AUAIBEAANkFACArAADaCAAgxwJAAPEEACHbAgEA8AQAId4CAgD6BAAh9QIBAPAEACH2AgEA-wQAIfcCAQD7BAAh-AIBAPAEACH5AgEA-wQAIfoCAQD7BAAh-wJAAPIEACEPBwAA1AUAIAgAANUFACALAADXBQAgDwAA2AUAIBEAANkFACDHAkAA8QQAIdsCAQDwBAAh3gICAPoEACH1AgEA8AQAIfYCAQD7BAAh9wIBAPsEACH4AgEA8AQAIfkCAQD7BAAh-gIBAPsEACH7AkAA8gQAIQ8HAACDBwAgCQAA5AYAIAsAAOUGACAPAADmBgAgEQAA5wYAIMcCQAAAAAHbAgEAAAAB3gICAAAAAfUCAQAAAAH2AgEAAAAB9wIBAAAAAfgCAQAAAAH5AgEAAAAB-gIBAAAAAfsCQAAAAAECAAAAMgAgMgAA2wgAIA7BAgEAAAABxwJAAAAAAd0CQAAAAAHsAgIAAAAB_AICAAAAAf4CAgAAAAGAAwAAAIADAoEDIAAAAAGCAyAAAAABgwMCAAAAAYQDAgAAAAGFAwIAAAABhgMCAAAAAYcDQAAAAAEZEgAA-AYAIBMAAOoGACAVAADsBgAgFgAA7QYAIBcAAO4GACAZAADvBgAgGgAA8AYAIBsAAPEGACAcAADyBgAgHQAA8wYAIMECAQAAAAHHAkAAAAAB3QJAAAAAAewCAgAAAAH8AgIAAAAB_QIBAAAAAf4CAgAAAAGAAwAAAIADAoEDIAAAAAGCAyAAAAABgwMCAAAAAYQDAgAAAAGFAwIAAAABhgMCAAAAAYcDQAAAAAECAAAAGgAgMgAA3ggAIAnHAkAAAAAB3gICAAAAAfUCAQAAAAH2AgEAAAAB9wIBAAAAAfgCAQAAAAH5AgEAAAAB-gIBAAAAAfsCQAAAAAEDxwJAAAAAAdoCAQAAAAHrAgAAAOsCAgTBAgEAAAABxwJAAAAAAecCAQAAAAHpAgAAAOkCAgTBAgEAAAABxwJAAAAAAfICAgAAAAHzAgEAAAABAscCQAAAAAHaAgEAAAABC8ECAQAAAAHHAkAAAAAB2gIBAAAAAd4CAgAAAAHgAgAAAOACAuECAQAAAAHiAgEAAAAB4wIBAAAAAeQCAQAAAAHlAoAAAAAB5gIBAAAAAQYrgAAAAAHBAgEAAAABxwJAAAAAAdoCAQAAAAHcAgIAAAAB3QJAAAAAAQMAAAAXACAyAADeCAAgMwAA6QgAIBsAAAAXACASAACIBgAgEwAAiQYAIBUAAP4GACAWAACLBgAgFwAAjAYAIBkAAI0GACAaAACOBgAgGwAAjwYAIBwAAJAGACAdAACRBgAgKwAA6QgAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEZEgAAiAYAIBMAAIkGACAVAAD-BgAgFgAAiwYAIBcAAIwGACAZAACNBgAgGgAAjgYAIBsAAI8GACAcAACQBgAgHQAAkQYAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEDAAAAFQAgMgAA2wgAIDMAAOwIACARAAAAFQAgBwAA1AUAIAkAANYFACALAADXBQAgDwAA2AUAIBEAANkFACArAADsCAAgxwJAAPEEACHbAgEA8AQAId4CAgD6BAAh9QIBAPAEACH2AgEA-wQAIfcCAQD7BAAh-AIBAPAEACH5AgEA-wQAIfoCAQD7BAAh-wJAAPIEACEPBwAA1AUAIAkAANYFACALAADXBQAgDwAA2AUAIBEAANkFACDHAkAA8QQAIdsCAQDwBAAh3gICAPoEACH1AgEA8AQAIfYCAQD7BAAh9wIBAPsEACH4AgEA8AQAIfkCAQD7BAAh-gIBAPsEACH7AkAA8gQAIQ3BAgEAAAABxwJAAAAAAd0CQAAAAAHsAgIAAAAB_AICAAAAAYADAAAAgAMCgQMgAAAAAYIDIAAAAAGDAwIAAAABhAMCAAAAAYUDAgAAAAGGAwIAAAABhwNAAAAAAQLBAgEAAAAB8wIBAAAAAQLHAkAAAAAB9AIBAAAAAQPBAgEAAAABxwJAAAAAAfMCAQAAAAEDAAAAFwAgMgAA1AgAIDMAAPMIACAbAAAAFwAgEgAAiAYAIBMAAIkGACAUAACKBgAgFQAA_gYAIBcAAIwGACAZAACNBgAgGgAAjgYAIBsAAI8GACAcAACQBgAgHQAAkQYAICsAAPMIACDBAgEA8AQAIccCQADxBAAh3QJAAPEEACHsAgIAhQUAIfwCAgCFBQAh_QIBAPsEACH-AgIAhQUAIYADAACFBoADIoEDIACGBgAhggMgAIYGACGDAwIA-gQAIYQDAgD6BAAhhQMCAPoEACGGAwIA-gQAIYcDQADyBAAhGRIAAIgGACATAACJBgAgFAAAigYAIBUAAP4GACAXAACMBgAgGQAAjQYAIBoAAI4GACAbAACPBgAgHAAAkAYAIB0AAJEGACDBAgEA8AQAIccCQADxBAAh3QJAAPEEACHsAgIAhQUAIfwCAgCFBQAh_QIBAPsEACH-AgIAhQUAIYADAACFBoADIoEDIACGBgAhggMgAIYGACGDAwIA-gQAIYQDAgD6BAAhhQMCAPoEACGGAwIA-gQAIYcDQADyBAAhDwcAAIMHACAIAADjBgAgCQAA5AYAIA8AAOYGACARAADnBgAgxwJAAAAAAdsCAQAAAAHeAgIAAAAB9QIBAAAAAfYCAQAAAAH3AgEAAAAB-AIBAAAAAfkCAQAAAAH6AgEAAAAB-wJAAAAAAQIAAAAyACAyAAD0CAAgAwAAABUAIDIAAPQIACAzAAD4CAAgEQAAABUAIAcAANQFACAIAADVBQAgCQAA1gUAIA8AANgFACARAADZBQAgKwAA-AgAIMcCQADxBAAh2wIBAPAEACHeAgIA-gQAIfUCAQDwBAAh9gIBAPsEACH3AgEA-wQAIfgCAQDwBAAh-QIBAPsEACH6AgEA-wQAIfsCQADyBAAhDwcAANQFACAIAADVBQAgCQAA1gUAIA8AANgFACARAADZBQAgxwJAAPEEACHbAgEA8AQAId4CAgD6BAAh9QIBAPAEACH2AgEA-wQAIfcCAQD7BAAh-AIBAPAEACH5AgEA-wQAIfoCAQD7BAAh-wJAAPIEACEFwQIBAAAAAccCQAAAAAHsAgIAAAAB7QIBAAAAAe4CAQAAAAECAAAAywIAIDIAAPkIACADAAAAzgIAIDIAAPkIACAzAAD9CAAgBwAAAM4CACArAAD9CAAgwQIBAPAEACHHAkAA8QQAIewCAgCFBQAh7QIBAPAEACHuAgEA-wQAIQXBAgEA8AQAIccCQADxBAAh7AICAIUFACHtAgEA8AQAIe4CAQD7BAAhDwcAAIMHACAIAADjBgAgCQAA5AYAIAsAAOUGACAPAADmBgAgxwJAAAAAAdsCAQAAAAHeAgIAAAAB9QIBAAAAAfYCAQAAAAH3AgEAAAAB-AIBAAAAAfkCAQAAAAH6AgEAAAAB-wJAAAAAAQIAAAAyACAyAAD-CAAgGRIAAPgGACATAADqBgAgFAAA6wYAIBUAAOwGACAWAADtBgAgFwAA7gYAIBkAAO8GACAbAADxBgAgHAAA8gYAIB0AAPMGACDBAgEAAAABxwJAAAAAAd0CQAAAAAHsAgIAAAAB_AICAAAAAf0CAQAAAAH-AgIAAAABgAMAAACAAwKBAyAAAAABggMgAAAAAYMDAgAAAAGEAwIAAAABhQMCAAAAAYYDAgAAAAGHA0AAAAABAgAAABoAIDIAAIAJACADAAAAFQAgMgAA_ggAIDMAAIQJACARAAAAFQAgBwAA1AUAIAgAANUFACAJAADWBQAgCwAA1wUAIA8AANgFACArAACECQAgxwJAAPEEACHbAgEA8AQAId4CAgD6BAAh9QIBAPAEACH2AgEA-wQAIfcCAQD7BAAh-AIBAPAEACH5AgEA-wQAIfoCAQD7BAAh-wJAAPIEACEPBwAA1AUAIAgAANUFACAJAADWBQAgCwAA1wUAIA8AANgFACDHAkAA8QQAIdsCAQDwBAAh3gICAPoEACH1AgEA8AQAIfYCAQD7BAAh9wIBAPsEACH4AgEA8AQAIfkCAQD7BAAh-gIBAPsEACH7AkAA8gQAIQMAAAAXACAyAACACQAgMwAAhwkAIBsAAAAXACASAACIBgAgEwAAiQYAIBQAAIoGACAVAAD-BgAgFgAAiwYAIBcAAIwGACAZAACNBgAgGwAAjwYAIBwAAJAGACAdAACRBgAgKwAAhwkAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEZEgAAiAYAIBMAAIkGACAUAACKBgAgFQAA_gYAIBYAAIsGACAXAACMBgAgGQAAjQYAIBsAAI8GACAcAACQBgAgHQAAkQYAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEPBwAAgwcAIAgAAOMGACAJAADkBgAgCwAA5QYAIBEAAOcGACDHAkAAAAAB2wIBAAAAAd4CAgAAAAH1AgEAAAAB9gIBAAAAAfcCAQAAAAH4AgEAAAAB-QIBAAAAAfoCAQAAAAH7AkAAAAABAgAAADIAIDIAAIgJACADAAAAFQAgMgAAiAkAIDMAAIwJACARAAAAFQAgBwAA1AUAIAgAANUFACAJAADWBQAgCwAA1wUAIBEAANkFACArAACMCQAgxwJAAPEEACHbAgEA8AQAId4CAgD6BAAh9QIBAPAEACH2AgEA-wQAIfcCAQD7BAAh-AIBAPAEACH5AgEA-wQAIfoCAQD7BAAh-wJAAPIEACEPBwAA1AUAIAgAANUFACAJAADWBQAgCwAA1wUAIBEAANkFACDHAkAA8QQAIdsCAQDwBAAh3gICAPoEACH1AgEA8AQAIfYCAQD7BAAh9wIBAPsEACH4AgEA8AQAIfkCAQD7BAAh-gIBAPsEACH7AkAA8gQAIQPHAkAAAAAB2wIBAAAAAd4CAgAAAAEfBAAAmggAIAUAAJsIACAGAACcCAAgHwAAnggAICEAAJ8IACAiAACgCAAgIwAAoQgAICQAAKIIACAlAACjCAAgwQIBAAAAAccCQAAAAAHdAkAAAAAB6wIBAAAAAewCAgAAAAHtAgEAAAABhwNAAAAAAZ4DAQAAAAGfAyAAAAABoAMBAAAAAaIDAAAAogMCpAMAAACkAwKlAyAAAAABpgMBAAAAAacDAQAAAAGoA4AAAAABqQNAAAAAAaoDAQAAAAGrAyAAAAABrAMBAAAAAa0DQAAAAAGuA0AAAAABAgAAAAEAIDIAAI4JACAZEgAA-AYAIBMAAOoGACAUAADrBgAgFQAA7AYAIBYAAO0GACAZAADvBgAgGgAA8AYAIBsAAPEGACAcAADyBgAgHQAA8wYAIMECAQAAAAHHAkAAAAAB3QJAAAAAAewCAgAAAAH8AgIAAAAB_QIBAAAAAf4CAgAAAAGAAwAAAIADAoEDIAAAAAGCAyAAAAABgwMCAAAAAYQDAgAAAAGFAwIAAAABhgMCAAAAAYcDQAAAAAECAAAAGgAgMgAAkAkAIAMAAAAPACAyAACOCQAgMwAAlAkAICEAAAAPACAEAACnBwAgBQAAqAcAIAYAAKkHACAfAACrBwAgIQAArAcAICIAAK0HACAjAACuBwAgJAAArwcAICUAALAHACArAACUCQAgwQIBAPAEACHHAkAA8QQAId0CQADxBAAh6wIBAPsEACHsAgIAhQUAIe0CAQD7BAAhhwNAAPIEACGeAwEA-wQAIZ8DIACGBgAhoAMBAPsEACGiAwAApAeiAyKkAwAApQekAyKlAyAAhgYAIaYDAQD7BAAhpwMBAPsEACGoA4AAAAABqQNAAPIEACGqAwEA-wQAIasDIACmBwAhrAMBAPsEACGtA0AA8gQAIa4DQADyBAAhHwQAAKcHACAFAACoBwAgBgAAqQcAIB8AAKsHACAhAACsBwAgIgAArQcAICMAAK4HACAkAACvBwAgJQAAsAcAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIesCAQD7BAAh7AICAIUFACHtAgEA-wQAIYcDQADyBAAhngMBAPsEACGfAyAAhgYAIaADAQD7BAAhogMAAKQHogMipAMAAKUHpAMipQMgAIYGACGmAwEA-wQAIacDAQD7BAAhqAOAAAAAAakDQADyBAAhqgMBAPsEACGrAyAApgcAIawDAQD7BAAhrQNAAPIEACGuA0AA8gQAIQMAAAAXACAyAACQCQAgMwAAlwkAIBsAAAAXACASAACIBgAgEwAAiQYAIBQAAIoGACAVAAD-BgAgFgAAiwYAIBkAAI0GACAaAACOBgAgGwAAjwYAIBwAAJAGACAdAACRBgAgKwAAlwkAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEZEgAAiAYAIBMAAIkGACAUAACKBgAgFQAA_gYAIBYAAIsGACAZAACNBgAgGgAAjgYAIBsAAI8GACAcAACQBgAgHQAAkQYAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEfBAAAmggAIAUAAJsIACAGAACcCAAgHgAAnQgAICEAAJ8IACAiAACgCAAgIwAAoQgAICQAAKIIACAlAACjCAAgwQIBAAAAAccCQAAAAAHdAkAAAAAB6wIBAAAAAewCAgAAAAHtAgEAAAABhwNAAAAAAZ4DAQAAAAGfAyAAAAABoAMBAAAAAaIDAAAAogMCpAMAAACkAwKlAyAAAAABpgMBAAAAAacDAQAAAAGoA4AAAAABqQNAAAAAAaoDAQAAAAGrAyAAAAABrAMBAAAAAa0DQAAAAAGuA0AAAAABAgAAAAEAIDIAAJgJACAZEgAA-AYAIBMAAOoGACAUAADrBgAgFQAA7AYAIBYAAO0GACAXAADuBgAgGgAA8AYAIBsAAPEGACAcAADyBgAgHQAA8wYAIMECAQAAAAHHAkAAAAAB3QJAAAAAAewCAgAAAAH8AgIAAAAB_QIBAAAAAf4CAgAAAAGAAwAAAIADAoEDIAAAAAGCAyAAAAABgwMCAAAAAYQDAgAAAAGFAwIAAAABhgMCAAAAAYcDQAAAAAECAAAAGgAgMgAAmgkAIAMAAAAPACAyAACYCQAgMwAAngkAICEAAAAPACAEAACnBwAgBQAAqAcAIAYAAKkHACAeAACqBwAgIQAArAcAICIAAK0HACAjAACuBwAgJAAArwcAICUAALAHACArAACeCQAgwQIBAPAEACHHAkAA8QQAId0CQADxBAAh6wIBAPsEACHsAgIAhQUAIe0CAQD7BAAhhwNAAPIEACGeAwEA-wQAIZ8DIACGBgAhoAMBAPsEACGiAwAApAeiAyKkAwAApQekAyKlAyAAhgYAIaYDAQD7BAAhpwMBAPsEACGoA4AAAAABqQNAAPIEACGqAwEA-wQAIasDIACmBwAhrAMBAPsEACGtA0AA8gQAIa4DQADyBAAhHwQAAKcHACAFAACoBwAgBgAAqQcAIB4AAKoHACAhAACsBwAgIgAArQcAICMAAK4HACAkAACvBwAgJQAAsAcAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIesCAQD7BAAh7AICAIUFACHtAgEA-wQAIYcDQADyBAAhngMBAPsEACGfAyAAhgYAIaADAQD7BAAhogMAAKQHogMipAMAAKUHpAMipQMgAIYGACGmAwEA-wQAIacDAQD7BAAhqAOAAAAAAakDQADyBAAhqgMBAPsEACGrAyAApgcAIawDAQD7BAAhrQNAAPIEACGuA0AA8gQAIQMAAAAXACAyAACaCQAgMwAAoQkAIBsAAAAXACASAACIBgAgEwAAiQYAIBQAAIoGACAVAAD-BgAgFgAAiwYAIBcAAIwGACAaAACOBgAgGwAAjwYAIBwAAJAGACAdAACRBgAgKwAAoQkAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEZEgAAiAYAIBMAAIkGACAUAACKBgAgFQAA_gYAIBYAAIsGACAXAACMBgAgGgAAjgYAIBsAAI8GACAcAACQBgAgHQAAkQYAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEfBAAAmggAIAUAAJsIACAGAACcCAAgHgAAnQgAIB8AAJ4IACAhAACfCAAgIwAAoQgAICQAAKIIACAlAACjCAAgwQIBAAAAAccCQAAAAAHdAkAAAAAB6wIBAAAAAewCAgAAAAHtAgEAAAABhwNAAAAAAZ4DAQAAAAGfAyAAAAABoAMBAAAAAaIDAAAAogMCpAMAAACkAwKlAyAAAAABpgMBAAAAAacDAQAAAAGoA4AAAAABqQNAAAAAAaoDAQAAAAGrAyAAAAABrAMBAAAAAa0DQAAAAAGuA0AAAAABAgAAAAEAIDIAAKIJACAZEgAA-AYAIBMAAOoGACAUAADrBgAgFQAA7AYAIBYAAO0GACAXAADuBgAgGQAA7wYAIBoAAPAGACAcAADyBgAgHQAA8wYAIMECAQAAAAHHAkAAAAAB3QJAAAAAAewCAgAAAAH8AgIAAAAB_QIBAAAAAf4CAgAAAAGAAwAAAIADAoEDIAAAAAGCAyAAAAABgwMCAAAAAYQDAgAAAAGFAwIAAAABhgMCAAAAAYcDQAAAAAECAAAAGgAgMgAApAkAIAMAAAAPACAyAACiCQAgMwAAqAkAICEAAAAPACAEAACnBwAgBQAAqAcAIAYAAKkHACAeAACqBwAgHwAAqwcAICEAAKwHACAjAACuBwAgJAAArwcAICUAALAHACArAACoCQAgwQIBAPAEACHHAkAA8QQAId0CQADxBAAh6wIBAPsEACHsAgIAhQUAIe0CAQD7BAAhhwNAAPIEACGeAwEA-wQAIZ8DIACGBgAhoAMBAPsEACGiAwAApAeiAyKkAwAApQekAyKlAyAAhgYAIaYDAQD7BAAhpwMBAPsEACGoA4AAAAABqQNAAPIEACGqAwEA-wQAIasDIACmBwAhrAMBAPsEACGtA0AA8gQAIa4DQADyBAAhHwQAAKcHACAFAACoBwAgBgAAqQcAIB4AAKoHACAfAACrBwAgIQAArAcAICMAAK4HACAkAACvBwAgJQAAsAcAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIesCAQD7BAAh7AICAIUFACHtAgEA-wQAIYcDQADyBAAhngMBAPsEACGfAyAAhgYAIaADAQD7BAAhogMAAKQHogMipAMAAKUHpAMipQMgAIYGACGmAwEA-wQAIacDAQD7BAAhqAOAAAAAAakDQADyBAAhqgMBAPsEACGrAyAApgcAIawDAQD7BAAhrQNAAPIEACGuA0AA8gQAIQMAAAAXACAyAACkCQAgMwAAqwkAIBsAAAAXACASAACIBgAgEwAAiQYAIBQAAIoGACAVAAD-BgAgFgAAiwYAIBcAAIwGACAZAACNBgAgGgAAjgYAIBwAAJAGACAdAACRBgAgKwAAqwkAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEZEgAAiAYAIBMAAIkGACAUAACKBgAgFQAA_gYAIBYAAIsGACAXAACMBgAgGQAAjQYAIBoAAI4GACAcAACQBgAgHQAAkQYAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEfBAAAmggAIAUAAJsIACAGAACcCAAgHgAAnQgAIB8AAJ4IACAhAACfCAAgIgAAoAgAICQAAKIIACAlAACjCAAgwQIBAAAAAccCQAAAAAHdAkAAAAAB6wIBAAAAAewCAgAAAAHtAgEAAAABhwNAAAAAAZ4DAQAAAAGfAyAAAAABoAMBAAAAAaIDAAAAogMCpAMAAACkAwKlAyAAAAABpgMBAAAAAacDAQAAAAGoA4AAAAABqQNAAAAAAaoDAQAAAAGrAyAAAAABrAMBAAAAAa0DQAAAAAGuA0AAAAABAgAAAAEAIDIAAKwJACAZEgAA-AYAIBMAAOoGACAUAADrBgAgFQAA7AYAIBYAAO0GACAXAADuBgAgGQAA7wYAIBoAAPAGACAbAADxBgAgHQAA8wYAIMECAQAAAAHHAkAAAAAB3QJAAAAAAewCAgAAAAH8AgIAAAAB_QIBAAAAAf4CAgAAAAGAAwAAAIADAoEDIAAAAAGCAyAAAAABgwMCAAAAAYQDAgAAAAGFAwIAAAABhgMCAAAAAYcDQAAAAAECAAAAGgAgMgAArgkAIAMAAAAPACAyAACsCQAgMwAAsgkAICEAAAAPACAEAACnBwAgBQAAqAcAIAYAAKkHACAeAACqBwAgHwAAqwcAICEAAKwHACAiAACtBwAgJAAArwcAICUAALAHACArAACyCQAgwQIBAPAEACHHAkAA8QQAId0CQADxBAAh6wIBAPsEACHsAgIAhQUAIe0CAQD7BAAhhwNAAPIEACGeAwEA-wQAIZ8DIACGBgAhoAMBAPsEACGiAwAApAeiAyKkAwAApQekAyKlAyAAhgYAIaYDAQD7BAAhpwMBAPsEACGoA4AAAAABqQNAAPIEACGqAwEA-wQAIasDIACmBwAhrAMBAPsEACGtA0AA8gQAIa4DQADyBAAhHwQAAKcHACAFAACoBwAgBgAAqQcAIB4AAKoHACAfAACrBwAgIQAArAcAICIAAK0HACAkAACvBwAgJQAAsAcAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIesCAQD7BAAh7AICAIUFACHtAgEA-wQAIYcDQADyBAAhngMBAPsEACGfAyAAhgYAIaADAQD7BAAhogMAAKQHogMipAMAAKUHpAMipQMgAIYGACGmAwEA-wQAIacDAQD7BAAhqAOAAAAAAakDQADyBAAhqgMBAPsEACGrAyAApgcAIawDAQD7BAAhrQNAAPIEACGuA0AA8gQAIQMAAAAXACAyAACuCQAgMwAAtQkAIBsAAAAXACASAACIBgAgEwAAiQYAIBQAAIoGACAVAAD-BgAgFgAAiwYAIBcAAIwGACAZAACNBgAgGgAAjgYAIBsAAI8GACAdAACRBgAgKwAAtQkAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEZEgAAiAYAIBMAAIkGACAUAACKBgAgFQAA_gYAIBYAAIsGACAXAACMBgAgGQAAjQYAIBoAAI4GACAbAACPBgAgHQAAkQYAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEZEgAA-AYAIBMAAOoGACAUAADrBgAgFQAA7AYAIBYAAO0GACAXAADuBgAgGQAA7wYAIBoAAPAGACAbAADxBgAgHAAA8gYAIMECAQAAAAHHAkAAAAAB3QJAAAAAAewCAgAAAAH8AgIAAAAB_QIBAAAAAf4CAgAAAAGAAwAAAIADAoEDIAAAAAGCAyAAAAABgwMCAAAAAYQDAgAAAAGFAwIAAAABhgMCAAAAAYcDQAAAAAECAAAAGgAgMgAAtgkAIB8EAACaCAAgBQAAmwgAIAYAAJwIACAeAACdCAAgHwAAnggAICEAAJ8IACAiAACgCAAgIwAAoQgAICUAAKMIACDBAgEAAAABxwJAAAAAAd0CQAAAAAHrAgEAAAAB7AICAAAAAe0CAQAAAAGHA0AAAAABngMBAAAAAZ8DIAAAAAGgAwEAAAABogMAAACiAwKkAwAAAKQDAqUDIAAAAAGmAwEAAAABpwMBAAAAAagDgAAAAAGpA0AAAAABqgMBAAAAAasDIAAAAAGsAwEAAAABrQNAAAAAAa4DQAAAAAECAAAAAQAgMgAAuAkAIAMAAAAXACAyAAC2CQAgMwAAvAkAIBsAAAAXACASAACIBgAgEwAAiQYAIBQAAIoGACAVAAD-BgAgFgAAiwYAIBcAAIwGACAZAACNBgAgGgAAjgYAIBsAAI8GACAcAACQBgAgKwAAvAkAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-wQAIf4CAgCFBQAhgAMAAIUGgAMigQMgAIYGACGCAyAAhgYAIYMDAgD6BAAhhAMCAPoEACGFAwIA-gQAIYYDAgD6BAAhhwNAAPIEACEZEgAAiAYAIBMAAIkGACAUAACKBgAgFQAA_gYAIBYAAIsGACAXAACMBgAgGQAAjQYAIBoAAI4GACAbAACPBgAgHAAAkAYAIMECAQDwBAAhxwJAAPEEACHdAkAA8QQAIewCAgCFBQAh_AICAIUFACH9AgEA-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-AkB_AkGAAQJCgQECQ4MBAkSFARZFhgEgRogBAkeKARZIiwEhSYwBAkqNAQJLjgEWTJEBIk2SASZOkwEDT5QBA1CVAQNRlgEDUpcBA1OZAQNUmwEWVZwBJ1aeAQNXoAEWWKEBKFmiAQNaowEDW6QBFlynASldqAEtXqkBBF-qAQRgqwEEYawBBGKtAQRjrwEEZLEBFmWyAS5mtQEEZ7cBFmi4AS9pugEEarsBBGu8ARZsvwEwbcABNG7BARRvwgEUcMMBFHHEARRyxQEUc8cBFHTJARZ1ygE1dswBFHfOARZ4zwE2edABFHrRARR70gEWfNUBN33WAT1-1wEGf9gBBoAB2QEGgQHaAQaCAdsBBoMB3QEGhAHfARaFAeABPoYB5QEGhwHnARaIAegBP4kB7AEGigHtAQaLAe4BFowB8QFAjQHyAUaOAfMBB48B9AEHkAH1AQeRAfYBB5IB9wEHkwH5AQeUAfsBFpUB_AFHlgH-AQeXAYACFpgBgQJImQGCAgeaAYMCB5sBhAIWnAGHAkmdAYgCT54BiQIInwGKAgigAYsCCKEBjAIIogGNAgijAY8CCKQBkQIWpQGSAlCmAZQCCKcBlgIWqAGXAlGpAZgCCKoBmQIIqwGaAhasAZ0CUq0BngJYrgGfAgmvAaACCbABoQIJsQGiAgmyAaMCCbMBpQIJtAGnAha1AagCWbYBqgIJtwGsAha4Aa0CWrkBrgIJugGvAgm7AbACFrwBswJbvQG0AmG-AbUCDL8BtgIMwAG3AgzBAbgCDMIBuQIMwwG7AgzEAb0CFsUBvgJixgHAAgzHAcICFsgBwwJjyQHEAgzKAcUCDMsBxgIWzAHJAmTNAcoCas4BzAIKzwHNAgrQAdACCtEB0QIK0gHSAgrTAdQCCtQB1gIW1QHXAmvWAdkCCtcB2wIW2AHcAmzZAd0CCtoB3gIK2wHfAhbcAeICbd0B4wJz3gHkAgXfAeUCBeAB5gIF4QHnAgXiAegCBeMB6gIF5AHsAhblAe0CdOYB7wIF5wHxAhboAfICdekB8wIF6gH0AgXrAfUCFuwB-AJ27QH5AnruAfoCDu8B-wIO8AH8Ag7xAf0CDvIB_gIO8wGAAw70AYIDFvUBgwN79gGGAw73AYgDFvgBiQN8-QGLAw76AYwDDvsBjQMW_AGQA339AZEDgQH-AZIDD_8BkwMPgAKUAw-BApUDD4IClgMPgwKYAw-EApoDFoUCmwOCAYYCnQMPhwKfAxaIAqADgwGJAqEDD4oCogMPiwKjAxaMAqYDhAGNAqcDiAGOAqgDEI8CqQMQkAKqAxCRAqsDEJICrAMQkwKuAxCUArADFpUCsQOJAZYCtAMQlwK2AxaYArcDigGZArkDEJoCugMQmwK7AxacAr4DiwGdAr8DkQGeAsADEZ8CwQMRoALCAxGhAsMDEaICxAMRowLGAxGkAsgDFqUCyQOSAaYCzAMRpwLOAxaoAs8DkwGpAtEDEaoC0gMRqwLTAxasAtYDlAGtAtcDmgGuAtgDE68C2QMTsALaAxOxAtsDE7IC3AMTswLeAxO0AuADFrUC4QObAbYC4wMTtwLlAxa4AuYDnAG5AucDE7oC6AMTuwLpAxa8AuwDnQG9Au0DoQE" + strings: JSON.parse("[\"where\",\"orderBy\",\"cursor\",\"user\",\"accounts\",\"sessions\",\"verifications\",\"model\",\"latestOfModel\",\"parentOfModels\",\"modelVersion\",\"modelVersions\",\"_count\",\"tag\",\"tags\",\"taggedVersion\",\"taggedAdditionalFiles\",\"latestVersion\",\"parentModel\",\"childModels\",\"parentVersion\",\"versions\",\"authors\",\"granteeUser\",\"permissions\",\"additionalFiles\",\"likes\",\"interactions\",\"drafts\",\"authoredModels\",\"grantedPermissions\",\"actor\",\"events\",\"modelLikes\",\"modelInteractions\",\"modelDrafts\",\"passkeys\",\"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\",\"Account.findUnique\",\"Account.findUniqueOrThrow\",\"Account.findFirst\",\"Account.findFirstOrThrow\",\"Account.findMany\",\"Account.createOne\",\"Account.createMany\",\"Account.createManyAndReturn\",\"Account.updateOne\",\"Account.updateMany\",\"Account.updateManyAndReturn\",\"Account.upsertOne\",\"Account.deleteOne\",\"Account.deleteMany\",\"Account.groupBy\",\"Account.aggregate\",\"Session.findUnique\",\"Session.findUniqueOrThrow\",\"Session.findFirst\",\"Session.findFirstOrThrow\",\"Session.findMany\",\"Session.createOne\",\"Session.createMany\",\"Session.createManyAndReturn\",\"Session.updateOne\",\"Session.updateMany\",\"Session.updateManyAndReturn\",\"Session.upsertOne\",\"Session.deleteOne\",\"Session.deleteMany\",\"Session.groupBy\",\"Session.aggregate\",\"Verification.findUnique\",\"Verification.findUniqueOrThrow\",\"Verification.findFirst\",\"Verification.findFirstOrThrow\",\"Verification.findMany\",\"Verification.createOne\",\"Verification.createMany\",\"Verification.createManyAndReturn\",\"Verification.updateOne\",\"Verification.updateMany\",\"Verification.updateManyAndReturn\",\"Verification.upsertOne\",\"Verification.deleteOne\",\"Verification.deleteMany\",\"Verification.groupBy\",\"Verification.aggregate\",\"Passkey.findUnique\",\"Passkey.findUniqueOrThrow\",\"Passkey.findFirst\",\"Passkey.findFirstOrThrow\",\"Passkey.findMany\",\"Passkey.createOne\",\"Passkey.createMany\",\"Passkey.createManyAndReturn\",\"Passkey.updateOne\",\"Passkey.updateMany\",\"Passkey.updateManyAndReturn\",\"Passkey.upsertOne\",\"Passkey.deleteOne\",\"Passkey.deleteMany\",\"Passkey.groupBy\",\"Passkey.aggregate\",\"Model.findUnique\",\"Model.findUniqueOrThrow\",\"Model.findFirst\",\"Model.findFirstOrThrow\",\"Model.findMany\",\"Model.createOne\",\"Model.createMany\",\"Model.createManyAndReturn\",\"Model.updateOne\",\"Model.updateMany\",\"Model.updateManyAndReturn\",\"Model.upsertOne\",\"Model.deleteOne\",\"Model.deleteMany\",\"Model.groupBy\",\"Model.aggregate\",\"ModelVersion.findUnique\",\"ModelVersion.findUniqueOrThrow\",\"ModelVersion.findFirst\",\"ModelVersion.findFirstOrThrow\",\"ModelVersion.findMany\",\"ModelVersion.createOne\",\"ModelVersion.createMany\",\"ModelVersion.createManyAndReturn\",\"ModelVersion.updateOne\",\"ModelVersion.updateMany\",\"ModelVersion.updateManyAndReturn\",\"ModelVersion.upsertOne\",\"ModelVersion.deleteOne\",\"ModelVersion.deleteMany\",\"ModelVersion.groupBy\",\"ModelVersion.aggregate\",\"ModelVersionTag.findUnique\",\"ModelVersionTag.findUniqueOrThrow\",\"ModelVersionTag.findFirst\",\"ModelVersionTag.findFirstOrThrow\",\"ModelVersionTag.findMany\",\"ModelVersionTag.createOne\",\"ModelVersionTag.createMany\",\"ModelVersionTag.createManyAndReturn\",\"ModelVersionTag.updateOne\",\"ModelVersionTag.updateMany\",\"ModelVersionTag.updateManyAndReturn\",\"ModelVersionTag.upsertOne\",\"ModelVersionTag.deleteOne\",\"ModelVersionTag.deleteMany\",\"ModelVersionTag.groupBy\",\"ModelVersionTag.aggregate\",\"ModelAdditionalFile.findUnique\",\"ModelAdditionalFile.findUniqueOrThrow\",\"ModelAdditionalFile.findFirst\",\"ModelAdditionalFile.findFirstOrThrow\",\"ModelAdditionalFile.findMany\",\"ModelAdditionalFile.createOne\",\"ModelAdditionalFile.createMany\",\"ModelAdditionalFile.createManyAndReturn\",\"ModelAdditionalFile.updateOne\",\"ModelAdditionalFile.updateMany\",\"ModelAdditionalFile.updateManyAndReturn\",\"ModelAdditionalFile.upsertOne\",\"ModelAdditionalFile.deleteOne\",\"ModelAdditionalFile.deleteMany\",\"ModelAdditionalFile.groupBy\",\"ModelAdditionalFile.aggregate\",\"Tag.findUnique\",\"Tag.findUniqueOrThrow\",\"Tag.findFirst\",\"Tag.findFirstOrThrow\",\"Tag.findMany\",\"Tag.createOne\",\"Tag.createMany\",\"Tag.createManyAndReturn\",\"Tag.updateOne\",\"Tag.updateMany\",\"Tag.updateManyAndReturn\",\"Tag.upsertOne\",\"Tag.deleteOne\",\"Tag.deleteMany\",\"Tag.groupBy\",\"Tag.aggregate\",\"ModelAuthor.findUnique\",\"ModelAuthor.findUniqueOrThrow\",\"ModelAuthor.findFirst\",\"ModelAuthor.findFirstOrThrow\",\"ModelAuthor.findMany\",\"ModelAuthor.createOne\",\"ModelAuthor.createMany\",\"ModelAuthor.createManyAndReturn\",\"ModelAuthor.updateOne\",\"ModelAuthor.updateMany\",\"ModelAuthor.updateManyAndReturn\",\"ModelAuthor.upsertOne\",\"ModelAuthor.deleteOne\",\"ModelAuthor.deleteMany\",\"ModelAuthor.groupBy\",\"ModelAuthor.aggregate\",\"ModelPermission.findUnique\",\"ModelPermission.findUniqueOrThrow\",\"ModelPermission.findFirst\",\"ModelPermission.findFirstOrThrow\",\"ModelPermission.findMany\",\"ModelPermission.createOne\",\"ModelPermission.createMany\",\"ModelPermission.createManyAndReturn\",\"ModelPermission.updateOne\",\"ModelPermission.updateMany\",\"ModelPermission.updateManyAndReturn\",\"ModelPermission.upsertOne\",\"ModelPermission.deleteOne\",\"ModelPermission.deleteMany\",\"ModelPermission.groupBy\",\"ModelPermission.aggregate\",\"ModelLike.findUnique\",\"ModelLike.findUniqueOrThrow\",\"ModelLike.findFirst\",\"ModelLike.findFirstOrThrow\",\"ModelLike.findMany\",\"ModelLike.createOne\",\"ModelLike.createMany\",\"ModelLike.createManyAndReturn\",\"ModelLike.updateOne\",\"ModelLike.updateMany\",\"ModelLike.updateManyAndReturn\",\"ModelLike.upsertOne\",\"ModelLike.deleteOne\",\"ModelLike.deleteMany\",\"ModelLike.groupBy\",\"ModelLike.aggregate\",\"ModelInteraction.findUnique\",\"ModelInteraction.findUniqueOrThrow\",\"ModelInteraction.findFirst\",\"ModelInteraction.findFirstOrThrow\",\"ModelInteraction.findMany\",\"ModelInteraction.createOne\",\"ModelInteraction.createMany\",\"ModelInteraction.createManyAndReturn\",\"ModelInteraction.updateOne\",\"ModelInteraction.updateMany\",\"ModelInteraction.updateManyAndReturn\",\"ModelInteraction.upsertOne\",\"ModelInteraction.deleteOne\",\"ModelInteraction.deleteMany\",\"ModelInteraction.groupBy\",\"ModelInteraction.aggregate\",\"ModelDraft.findUnique\",\"ModelDraft.findUniqueOrThrow\",\"ModelDraft.findFirst\",\"ModelDraft.findFirstOrThrow\",\"ModelDraft.findMany\",\"ModelDraft.createOne\",\"ModelDraft.createMany\",\"ModelDraft.createManyAndReturn\",\"ModelDraft.updateOne\",\"ModelDraft.updateMany\",\"ModelDraft.updateManyAndReturn\",\"ModelDraft.upsertOne\",\"ModelDraft.deleteOne\",\"ModelDraft.deleteMany\",\"ModelDraft.groupBy\",\"ModelDraft.aggregate\",\"Event.findUnique\",\"Event.findUniqueOrThrow\",\"Event.findFirst\",\"Event.findFirstOrThrow\",\"Event.findMany\",\"Event.createOne\",\"Event.createMany\",\"Event.createManyAndReturn\",\"Event.updateOne\",\"Event.updateMany\",\"Event.updateManyAndReturn\",\"Event.upsertOne\",\"Event.deleteOne\",\"Event.deleteMany\",\"Event.groupBy\",\"Event.aggregate\",\"AND\",\"OR\",\"NOT\",\"id\",\"type\",\"actorId\",\"resourceType\",\"resourceId\",\"payload\",\"createdAt\",\"processedAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"contains\",\"startsWith\",\"endsWith\",\"userId\",\"modelId\",\"schemaVersion\",\"updatedAt\",\"versionNumber\",\"ModelInteractionKind\",\"kind\",\"sessionId\",\"ipHash\",\"userAgent\",\"referer\",\"geo\",\"cookie\",\"granteeUserId\",\"PermissionLevel\",\"permissionLevel\",\"AuthorRole\",\"role\",\"legacyId\",\"name\",\"displayName\",\"every\",\"some\",\"none\",\"taggedVersionNumber\",\"fileKey\",\"ModelFileKind\",\"tagId\",\"title\",\"description\",\"changeSummary\",\"previewImageFileKey\",\"netlogoFileKey\",\"netlogoVersion\",\"infoTab\",\"finalizedAt\",\"latestVersionNumber\",\"parentModelId\",\"parentVersionNumber\",\"ModelVisibility\",\"visibility\",\"isEndorsed\",\"isLibraryModel\",\"viewCount\",\"runCount\",\"downloadCount\",\"shareCount\",\"deletedAt\",\"publicKey\",\"credentialID\",\"counter\",\"deviceType\",\"backedUp\",\"transports\",\"aaguid\",\"identifier\",\"value\",\"expiresAt\",\"token\",\"ipAddress\",\"impersonatedBy\",\"accountId\",\"providerId\",\"accessToken\",\"refreshToken\",\"accessTokenExpiresAt\",\"refreshTokenExpiresAt\",\"scope\",\"idToken\",\"password\",\"email\",\"emailVerified\",\"image\",\"SystemRole\",\"systemRole\",\"UserKind\",\"userKind\",\"isProfilePublic\",\"bio\",\"country\",\"socialLinks\",\"dob\",\"affiliation\",\"banned\",\"banReason\",\"banExpires\",\"onboardedAt\",\"modelId_userId\",\"modelId_granteeUserId\",\"modelId_versionNumber\",\"modelId_versionNumber_tagId\",\"id_latestVersionNumber\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), + graph: "jwmXAYACIwQAAMoEACAFAADLBAAgBgAAzAQAIB0AAL4EACAeAAC_BAAgIAAAzQQAICEAAMAEACAiAADBBAAgIwAAwgQAICQAAM4EACCtAgAAxgQAMK4CAAAPABCvAgAAxgQAMLACAQAAAAG2AkAA_wMAIcwCQAD_AwAh2gIBAP4DACHbAgIAAAAB3AIBAP4DACH4AkAAnwQAIY8DAQAAAAGQAyAAngQAIZEDAQD-AwAhkwMAAMcEkwMilQMAAMgElQMilgMgAJ4EACGXAwEA_gMAIZgDAQD-AwAhmQMAAKcEACCaA0AAnwQAIZsDAQD-AwAhnAMgAMkEACGdAwEA_gMAIZ4DQACfBAAhnwNAAJ8EACEBAAAAAQAgEQMAAKAEACCtAgAA0QQAMK4CAAADABCvAgAA0QQAMLACAQD8AwAhtgJAAP8DACHJAgEA_AMAIcwCQAD_AwAhhgMBAPwDACGHAwEA_AMAIYgDAQD-AwAhiQMBAP4DACGKA0AAnwQAIYsDQACfBAAhjAMBAP4DACGNAwEA_gMAIY4DAQD-AwAhCAMAAIAIACCIAwAA0gQAIIkDAADSBAAgigMAANIEACCLAwAA0gQAIIwDAADSBAAgjQMAANIEACCOAwAA0gQAIBEDAACgBAAgrQIAANEEADCuAgAAAwAQrwIAANEEADCwAgEAAAABtgJAAP8DACHJAgEA_AMAIcwCQAD_AwAhhgMBAPwDACGHAwEA_AMAIYgDAQD-AwAhiQMBAP4DACGKA0AAnwQAIYsDQACfBAAhjAMBAP4DACGNAwEA_gMAIY4DAQD-AwAhAwAAAAMAIAEAAAQAMAIAAAUAIA0DAACgBAAgrQIAANAEADCuAgAABwAQrwIAANAEADCwAgEA_AMAIbYCQAD_AwAhyQIBAPwDACHMAkAA_wMAIdICAQD-AwAhggNAAP8DACGDAwEA_AMAIYQDAQD-AwAhhQMBAP4DACEEAwAAgAgAINICAADSBAAghAMAANIEACCFAwAA0gQAIA0DAACgBAAgrQIAANAEADCuAgAABwAQrwIAANAEADCwAgEAAAABtgJAAP8DACHJAgEA_AMAIcwCQAD_AwAh0gIBAP4DACGCA0AA_wMAIYMDAQAAAAGEAwEA_gMAIYUDAQD-AwAhAwAAAAcAIAEAAAgAMAIAAAkAIAsDAACpBAAgrQIAAM8EADCuAgAACwAQrwIAAM8EADCwAgEA_AMAIbYCQACfBAAhyQIBAP4DACHMAkAAnwQAIYADAQD8AwAhgQMBAPwDACGCA0AA_wMAIQQDAACACAAgtgIAANIEACDJAgAA0gQAIMwCAADSBAAgCwMAAKkEACCtAgAAzwQAMK4CAAALABCvAgAAzwQAMLACAQAAAAG2AkAAnwQAIckCAQD-AwAhzAJAAJ8EACGAAwEA_AMAIYEDAQD8AwAhggNAAP8DACEDAAAACwAgAQAADAAwAgAADQAgIwQAAMoEACAFAADLBAAgBgAAzAQAIB0AAL4EACAeAAC_BAAgIAAAzQQAICEAAMAEACAiAADBBAAgIwAAwgQAICQAAM4EACCtAgAAxgQAMK4CAAAPABCvAgAAxgQAMLACAQD8AwAhtgJAAP8DACHMAkAA_wMAIdoCAQD-AwAh2wICAP0DACHcAgEA_gMAIfgCQACfBAAhjwMBAP4DACGQAyAAngQAIZEDAQD-AwAhkwMAAMcEkwMilQMAAMgElQMilgMgAJ4EACGXAwEA_gMAIZgDAQD-AwAhmQMAAKcEACCaA0AAnwQAIZsDAQD-AwAhnAMgAMkEACGdAwEA_gMAIZ4DQACfBAAhnwNAAJ8EACEBAAAADwAgCQMAAKAEACAHAACoBAAgrQIAAMQEADCuAgAAEQAQrwIAAMQEADC2AkAA_wMAIckCAQD8AwAhygIBAPwDACHaAgAAxQTaAiICAwAAgAgAIAcAAIEIACAKAwAAoAQAIAcAAKgEACCtAgAAxAQAMK4CAAARABCvAgAAxAQAMLYCQAD_AwAhyQIBAPwDACHKAgEA_AMAIdoCAADFBNoCIqADAADDBAAgAwAAABEAIAEAABIAMAIAABMAIBMHAACoBAAgCAAApAQAIAkAALEEACAOAACABAAgEAAAsgQAIK0CAACwBAAwrgIAABUAEK8CAACwBAAwtgJAAP8DACHKAgEA_AMAIc0CAgCdBAAh5QIBAPwDACHmAgEA_gMAIecCAQD-AwAh6AIBAP4DACHpAgEA_AMAIeoCAQD-AwAh6wIBAP4DACHsAkAAnwQAIQEAAAAVACAdEQAAvAQAIBIAAKQEACATAACxBAAgFAAAvAQAIBUAAL0EACAWAAC-BAAgGAAAvwQAIBkAALIEACAaAADABAAgGwAAwQQAIBwAAMIEACCtAgAAugQAMK4CAAAXABCvAgAAugQAMLACAQD8AwAhtgJAAP8DACHMAkAA_wMAIdsCAgD9AwAh7QICAP0DACHuAgEA_gMAIe8CAgD9AwAh8QIAALsE8QIi8gIgAJ4EACHzAiAAngQAIfQCAgCdBAAh9QICAJ0EACH2AgIAnQQAIfcCAgCdBAAh-AJAAJ8EACEBAAAAFwAgEBEAAIQIACASAACBCAAgEwAAgggAIBQAAIQIACAVAACGCAAgFgAA-QcAIBgAAPoHACAZAACDCAAgGgAA_AcAIBsAAP0HACAcAAD-BwAg2wIAANIEACDtAgAA0gQAIO4CAADSBAAg7wIAANIEACD4AgAA0gQAIB4RAAC8BAAgEgAApAQAIBMAALEEACAUAAC8BAAgFQAAvQQAIBYAAL4EACAYAAC_BAAgGQAAsgQAIBoAAMAEACAbAADBBAAgHAAAwgQAIK0CAAC6BAAwrgIAABcAEK8CAAC6BAAwsAIBAAAAAbYCQAD_AwAhzAJAAP8DACHbAgIAAAAB7QICAP0DACHuAgEA_gMAIe8CAgD9AwAh8QIAALsE8QIi8gIgAJ4EACHzAiAAngQAIfQCAgCdBAAh9QICAJ0EACH2AgIAnQQAIfcCAgCdBAAh-AJAAJ8EACGkAwAAuQQAIAMAAAAXACABAAAZADACAAAaACAJCgAAtQQAIA0AALgEACCtAgAAtwQAMK4CAAAcABCvAgAAtwQAMLYCQAD_AwAhygIBAPwDACHNAgIAnQQAIeQCAQD8AwAhAgoAAIQIACANAACFCAAgCgoAALUEACANAAC4BAAgrQIAALcEADCuAgAAHAAQrwIAALcEADC2AkAA_wMAIcoCAQD8AwAhzQICAJ0EACHkAgEA_AMAIaMDAAC2BAAgAwAAABwAIAEAAB0AMAIAAB4AIAMAAAAcACABAAAdADACAAAeACABAAAAHAAgCwcAAKgEACAPAAC1BAAgrQIAALMEADCuAgAAIgAQrwIAALMEADCwAgEA_AMAIbYCQAD_AwAhygIBAPwDACHPAgAAtATkAiLhAgIAnQQAIeICAQD8AwAhAgcAAIEIACAPAACECAAgCwcAAKgEACAPAAC1BAAgrQIAALMEADCuAgAAIgAQrwIAALMEADCwAgEAAAABtgJAAP8DACHKAgEA_AMAIc8CAAC0BOQCIuECAgCdBAAh4gIBAPwDACEDAAAAIgAgAQAAIwAwAgAAJAAgAQAAABcAIAEAAAAcACABAAAAIgAgAQAAABcAIAMAAAAXACABAAAZADACAAAaACABAAAAFQAgCwcAAIEIACAIAACBCAAgCQAAgggAIA4AAJ0FACAQAACDCAAg5gIAANIEACDnAgAA0gQAIOgCAADSBAAg6gIAANIEACDrAgAA0gQAIOwCAADSBAAgFAcAAKgEACAIAACkBAAgCQAAsQQAIA4AAIAEACAQAACyBAAgrQIAALAEADCuAgAAFQAQrwIAALAEADC2AkAA_wMAIcoCAQD8AwAhzQICAJ0EACHlAgEA_AMAIeYCAQD-AwAh5wIBAP4DACHoAgEA_gMAIekCAQD8AwAh6gIBAP4DACHrAgEA_gMAIewCQACfBAAhogMAAK8EACADAAAAFQAgAQAALAAwAgAALQAgAwAAABEAIAEAABIAMAIAABMAIAoHAACoBAAgFwAAqQQAIK0CAACtBAAwrgIAADAAEK8CAACtBAAwsAIBAPwDACG2AkAA_wMAIcoCAQD8AwAh1gIBAP4DACHYAgAArgTYAiIDBwAAgQgAIBcAAIAIACDWAgAA0gQAIAsHAACoBAAgFwAAqQQAIK0CAACtBAAwrgIAADAAEK8CAACtBAAwsAIBAAAAAbYCQAD_AwAhygIBAPwDACHWAgEA_gMAIdgCAACuBNgCIqEDAACsBAAgAwAAADAAIAEAADEAMAIAADIAIAEAAAAPACADAAAAIgAgAQAAIwAwAgAAJAAgCAMAAKAEACAHAACoBAAgrQIAAKsEADCuAgAANgAQrwIAAKsEADC2AkAA_wMAIckCAQD8AwAhygIBAPwDACECAwAAgAgAIAcAAIEIACAJAwAAoAQAIAcAAKgEACCtAgAAqwQAMK4CAAA2ABCvAgAAqwQAMLYCQAD_AwAhyQIBAPwDACHKAgEA_AMAIaADAACqBAAgAwAAADYAIAEAADcAMAIAADgAIBEDAACpBAAgBwAAqAQAIK0CAAClBAAwrgIAADoAEK8CAAClBAAwsAIBAPwDACG2AkAA_wMAIckCAQD-AwAhygIBAPwDACHNAgIA_QMAIc8CAACmBM8CItACAQD-AwAh0QIBAP4DACHSAgEA_gMAIdMCAQD-AwAh1AIAAKcEACDVAgEA_gMAIQoDAACACAAgBwAAgQgAIMkCAADSBAAgzQIAANIEACDQAgAA0gQAINECAADSBAAg0gIAANIEACDTAgAA0gQAINQCAADSBAAg1QIAANIEACARAwAAqQQAIAcAAKgEACCtAgAApQQAMK4CAAA6ABCvAgAApQQAMLACAQAAAAG2AkAA_wMAIckCAQD-AwAhygIBAPwDACHNAgIA_QMAIc8CAACmBM8CItACAQD-AwAh0QIBAP4DACHSAgEA_gMAIdMCAQD-AwAh1AIAAKcEACDVAgEA_gMAIQMAAAA6ACABAAA7ADACAAA8ACABAAAADwAgDAMAAKAEACAHAACkBAAgKgAAogQAIK0CAACjBAAwrgIAAD8AEK8CAACjBAAwsAIBAPwDACG2AkAA_wMAIckCAQD8AwAhygIBAP4DACHLAgIAnQQAIcwCQAD_AwAhAwMAAIAIACAHAACBCAAgygIAANIEACAMAwAAoAQAIAcAAKQEACAqAACiBAAgrQIAAKMEADCuAgAAPwAQrwIAAKMEADCwAgEAAAABtgJAAP8DACHJAgEA_AMAIcoCAQD-AwAhywICAJ0EACHMAkAA_wMAIQMAAAA_ACABAABAADACAABBACABAAAAFwAgAQAAABcAIAEAAAAVACABAAAAEQAgAQAAADAAIAEAAAAiACABAAAANgAgAQAAADoAIAEAAAA_ACADAAAAMAAgAQAAMQAwAgAAMgAgDB8AAKAEACCtAgAAoQQAMK4CAABNABCvAgAAoQQAMLACAQD8AwAhsQIBAPwDACGyAgEA_AMAIbMCAQD8AwAhtAIBAPwDACG1AgAAogQAILYCQAD_AwAhtwJAAJ8EACECHwAAgAgAILcCAADSBAAgDB8AAKAEACCtAgAAoQQAMK4CAABNABCvAgAAoQQAMLACAQAAAAGxAgEA_AMAIbICAQD8AwAhswIBAPwDACG0AgEA_AMAIbUCAACiBAAgtgJAAP8DACG3AkAAnwQAIQMAAABNACABAABOADACAABPACADAAAANgAgAQAANwAwAgAAOAAgAwAAADoAIAEAADsAMAIAADwAIAMAAAA_ACABAABAADACAABBACAPAwAAoAQAIK0CAACcBAAwrgIAAFQAEK8CAACcBAAwsAIBAPwDACG2AkAAnwQAIckCAQD8AwAh3AIBAP4DACH5AgEA_AMAIfoCAQD8AwAh-wICAJ0EACH8AgEA_AMAIf0CIACeBAAh_gIBAP4DACH_AgEA_gMAIQUDAACACAAgtgIAANIEACDcAgAA0gQAIP4CAADSBAAg_wIAANIEACAPAwAAoAQAIK0CAACcBAAwrgIAAFQAEK8CAACcBAAwsAIBAAAAAbYCQACfBAAhyQIBAPwDACHcAgEA_gMAIfkCAQD8AwAh-gIBAPwDACH7AgIAnQQAIfwCAQD8AwAh_QIgAJ4EACH-AgEA_gMAIf8CAQD-AwAhAwAAAFQAIAEAAFUAMAIAAFYAIAEAAAADACABAAAABwAgAQAAAAsAIAEAAAARACABAAAAMAAgAQAAAE0AIAEAAAA2ACABAAAAOgAgAQAAAD8AIAEAAABUACABAAAAAQAgGQQAAPYHACAFAAD3BwAgBgAA-AcAIB0AAPkHACAeAAD6BwAgIAAA-wcAICEAAPwHACAiAAD9BwAgIwAA_gcAICQAAP8HACDaAgAA0gQAINsCAADSBAAg3AIAANIEACD4AgAA0gQAII8DAADSBAAgkQMAANIEACCXAwAA0gQAIJgDAADSBAAgmQMAANIEACCaAwAA0gQAIJsDAADSBAAgnAMAANIEACCdAwAA0gQAIJ4DAADSBAAgnwMAANIEACADAAAADwAgAQAAYwAwAgAAAQAgAwAAAA8AIAEAAGMAMAIAAAEAIAMAAAAPACABAABjADACAAABACAgBAAA7AcAIAUAAO0HACAGAADuBwAgHQAA7wcAIB4AAPAHACAgAADxBwAgIQAA8gcAICIAAPMHACAjAAD0BwAgJAAA9QcAILACAQAAAAG2AkAAAAABzAJAAAAAAdoCAQAAAAHbAgIAAAAB3AIBAAAAAfgCQAAAAAGPAwEAAAABkAMgAAAAAZEDAQAAAAGTAwAAAJMDApUDAAAAlQMClgMgAAAAAZcDAQAAAAGYAwEAAAABmQOAAAAAAZoDQAAAAAGbAwEAAAABnAMgAAAAAZ0DAQAAAAGeA0AAAAABnwNAAAAAAQEqAABnACAWsAIBAAAAAbYCQAAAAAHMAkAAAAAB2gIBAAAAAdsCAgAAAAHcAgEAAAAB-AJAAAAAAY8DAQAAAAGQAyAAAAABkQMBAAAAAZMDAAAAkwMClQMAAACVAwKWAyAAAAABlwMBAAAAAZgDAQAAAAGZA4AAAAABmgNAAAAAAZsDAQAAAAGcAyAAAAABnQMBAAAAAZ4DQAAAAAGfA0AAAAABASoAAGkAMAEqAABpADAgBAAA-QYAIAUAAPoGACAGAAD7BgAgHQAA_AYAIB4AAP0GACAgAAD-BgAgIQAA_wYAICIAAIAHACAjAACBBwAgJAAAggcAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdoCAQDhBAAh2wICAOsEACHcAgEA4QQAIfgCQADYBAAhjwMBAOEEACGQAyAA2QUAIZEDAQDhBAAhkwMAAPYGkwMilQMAAPcGlQMilgMgANkFACGXAwEA4QQAIZgDAQDhBAAhmQOAAAAAAZoDQADYBAAhmwMBAOEEACGcAyAA-AYAIZ0DAQDhBAAhngNAANgEACGfA0AA2AQAIQIAAAABACAqAABsACAWsAIBANYEACG2AkAA1wQAIcwCQADXBAAh2gIBAOEEACHbAgIA6wQAIdwCAQDhBAAh-AJAANgEACGPAwEA4QQAIZADIADZBQAhkQMBAOEEACGTAwAA9gaTAyKVAwAA9waVAyKWAyAA2QUAIZcDAQDhBAAhmAMBAOEEACGZA4AAAAABmgNAANgEACGbAwEA4QQAIZwDIAD4BgAhnQMBAOEEACGeA0AA2AQAIZ8DQADYBAAhAgAAAA8AICoAAG4AIAIAAAAPACAqAABuACADAAAAAQAgMQAAZwAgMgAAbAAgAQAAAAEAIAEAAAAPACAUDAAA8QYAIDcAAPIGACA4AAD1BgAgOQAA9AYAIDoAAPMGACDaAgAA0gQAINsCAADSBAAg3AIAANIEACD4AgAA0gQAII8DAADSBAAgkQMAANIEACCXAwAA0gQAIJgDAADSBAAgmQMAANIEACCaAwAA0gQAIJsDAADSBAAgnAMAANIEACCdAwAA0gQAIJ4DAADSBAAgnwMAANIEACAZrQIAAJIEADCuAgAAdQAQrwIAAJIEADCwAgEA1AMAIbYCQADWAwAhzAJAANYDACHaAgEA4gMAIdsCAgDpAwAh3AIBAOIDACH4AkAA1wMAIY8DAQDiAwAhkAMgAIkEACGRAwEA4gMAIZMDAACTBJMDIpUDAACUBJUDIpYDIACJBAAhlwMBAOIDACGYAwEA4gMAIZkDAADrAwAgmgNAANcDACGbAwEA4gMAIZwDIACVBAAhnQMBAOIDACGeA0AA1wMAIZ8DQADXAwAhAwAAAA8AIAEAAHQAMDYAAHUAIAMAAAAPACABAABjADACAAABACABAAAABQAgAQAAAAUAIAMAAAADACABAAAEADACAAAFACADAAAAAwAgAQAABAAwAgAABQAgAwAAAAMAIAEAAAQAMAIAAAUAIA4DAADwBgAgsAIBAAAAAbYCQAAAAAHJAgEAAAABzAJAAAAAAYYDAQAAAAGHAwEAAAABiAMBAAAAAYkDAQAAAAGKA0AAAAABiwNAAAAAAYwDAQAAAAGNAwEAAAABjgMBAAAAAQEqAAB9ACANsAIBAAAAAbYCQAAAAAHJAgEAAAABzAJAAAAAAYYDAQAAAAGHAwEAAAABiAMBAAAAAYkDAQAAAAGKA0AAAAABiwNAAAAAAYwDAQAAAAGNAwEAAAABjgMBAAAAAQEqAAB_ADABKgAAfwAwDgMAAO8GACCwAgEA1gQAIbYCQADXBAAhyQIBANYEACHMAkAA1wQAIYYDAQDWBAAhhwMBANYEACGIAwEA4QQAIYkDAQDhBAAhigNAANgEACGLA0AA2AQAIYwDAQDhBAAhjQMBAOEEACGOAwEA4QQAIQIAAAAFACAqAACCAQAgDbACAQDWBAAhtgJAANcEACHJAgEA1gQAIcwCQADXBAAhhgMBANYEACGHAwEA1gQAIYgDAQDhBAAhiQMBAOEEACGKA0AA2AQAIYsDQADYBAAhjAMBAOEEACGNAwEA4QQAIY4DAQDhBAAhAgAAAAMAICoAAIQBACACAAAAAwAgKgAAhAEAIAMAAAAFACAxAAB9ACAyAACCAQAgAQAAAAUAIAEAAAADACAKDAAA7AYAIDkAAO4GACA6AADtBgAgiAMAANIEACCJAwAA0gQAIIoDAADSBAAgiwMAANIEACCMAwAA0gQAII0DAADSBAAgjgMAANIEACAQrQIAAJEEADCuAgAAiwEAEK8CAACRBAAwsAIBANQDACG2AkAA1gMAIckCAQDUAwAhzAJAANYDACGGAwEA1AMAIYcDAQDUAwAhiAMBAOIDACGJAwEA4gMAIYoDQADXAwAhiwNAANcDACGMAwEA4gMAIY0DAQDiAwAhjgMBAOIDACEDAAAAAwAgAQAAigEAMDYAAIsBACADAAAAAwAgAQAABAAwAgAABQAgAQAAAAkAIAEAAAAJACADAAAABwAgAQAACAAwAgAACQAgAwAAAAcAIAEAAAgAMAIAAAkAIAMAAAAHACABAAAIADACAAAJACAKAwAA6wYAILACAQAAAAG2AkAAAAAByQIBAAAAAcwCQAAAAAHSAgEAAAABggNAAAAAAYMDAQAAAAGEAwEAAAABhQMBAAAAAQEqAACTAQAgCbACAQAAAAG2AkAAAAAByQIBAAAAAcwCQAAAAAHSAgEAAAABggNAAAAAAYMDAQAAAAGEAwEAAAABhQMBAAAAAQEqAACVAQAwASoAAJUBADAKAwAA6gYAILACAQDWBAAhtgJAANcEACHJAgEA1gQAIcwCQADXBAAh0gIBAOEEACGCA0AA1wQAIYMDAQDWBAAhhAMBAOEEACGFAwEA4QQAIQIAAAAJACAqAACYAQAgCbACAQDWBAAhtgJAANcEACHJAgEA1gQAIcwCQADXBAAh0gIBAOEEACGCA0AA1wQAIYMDAQDWBAAhhAMBAOEEACGFAwEA4QQAIQIAAAAHACAqAACaAQAgAgAAAAcAICoAAJoBACADAAAACQAgMQAAkwEAIDIAAJgBACABAAAACQAgAQAAAAcAIAYMAADnBgAgOQAA6QYAIDoAAOgGACDSAgAA0gQAIIQDAADSBAAghQMAANIEACAMrQIAAJAEADCuAgAAoQEAEK8CAACQBAAwsAIBANQDACG2AkAA1gMAIckCAQDUAwAhzAJAANYDACHSAgEA4gMAIYIDQADWAwAhgwMBANQDACGEAwEA4gMAIYUDAQDiAwAhAwAAAAcAIAEAAKABADA2AAChAQAgAwAAAAcAIAEAAAgAMAIAAAkAIAEAAAANACABAAAADQAgAwAAAAsAIAEAAAwAMAIAAA0AIAMAAAALACABAAAMADACAAANACADAAAACwAgAQAADAAwAgAADQAgCAMAAOYGACCwAgEAAAABtgJAAAAAAckCAQAAAAHMAkAAAAABgAMBAAAAAYEDAQAAAAGCA0AAAAABASoAAKkBACAHsAIBAAAAAbYCQAAAAAHJAgEAAAABzAJAAAAAAYADAQAAAAGBAwEAAAABggNAAAAAAQEqAACrAQAwASoAAKsBADABAAAADwAgCAMAAOUGACCwAgEA1gQAIbYCQADYBAAhyQIBAOEEACHMAkAA2AQAIYADAQDWBAAhgQMBANYEACGCA0AA1wQAIQIAAAANACAqAACvAQAgB7ACAQDWBAAhtgJAANgEACHJAgEA4QQAIcwCQADYBAAhgAMBANYEACGBAwEA1gQAIYIDQADXBAAhAgAAAAsAICoAALEBACACAAAACwAgKgAAsQEAIAEAAAAPACADAAAADQAgMQAAqQEAIDIAAK8BACABAAAADQAgAQAAAAsAIAYMAADiBgAgOQAA5AYAIDoAAOMGACC2AgAA0gQAIMkCAADSBAAgzAIAANIEACAKrQIAAI8EADCuAgAAuQEAEK8CAACPBAAwsAIBANQDACG2AkAA1wMAIckCAQDiAwAhzAJAANcDACGAAwEA1AMAIYEDAQDUAwAhggNAANYDACEDAAAACwAgAQAAuAEAMDYAALkBACADAAAACwAgAQAADAAwAgAADQAgAQAAAFYAIAEAAABWACADAAAAVAAgAQAAVQAwAgAAVgAgAwAAAFQAIAEAAFUAMAIAAFYAIAMAAABUACABAABVADACAABWACAMAwAA4QYAILACAQAAAAG2AkAAAAAByQIBAAAAAdwCAQAAAAH5AgEAAAAB-gIBAAAAAfsCAgAAAAH8AgEAAAAB_QIgAAAAAf4CAQAAAAH_AgEAAAABASoAAMEBACALsAIBAAAAAbYCQAAAAAHJAgEAAAAB3AIBAAAAAfkCAQAAAAH6AgEAAAAB-wICAAAAAfwCAQAAAAH9AiAAAAAB_gIBAAAAAf8CAQAAAAEBKgAAwwEAMAEqAADDAQAwDAMAAOAGACCwAgEA1gQAIbYCQADYBAAhyQIBANYEACHcAgEA4QQAIfkCAQDWBAAh-gIBANYEACH7AgIA4AQAIfwCAQDWBAAh_QIgANkFACH-AgEA4QQAIf8CAQDhBAAhAgAAAFYAICoAAMYBACALsAIBANYEACG2AkAA2AQAIckCAQDWBAAh3AIBAOEEACH5AgEA1gQAIfoCAQDWBAAh-wICAOAEACH8AgEA1gQAIf0CIADZBQAh_gIBAOEEACH_AgEA4QQAIQIAAABUACAqAADIAQAgAgAAAFQAICoAAMgBACADAAAAVgAgMQAAwQEAIDIAAMYBACABAAAAVgAgAQAAAFQAIAkMAADbBgAgNwAA3AYAIDgAAN8GACA5AADeBgAgOgAA3QYAILYCAADSBAAg3AIAANIEACD-AgAA0gQAIP8CAADSBAAgDq0CAACOBAAwrgIAAM8BABCvAgAAjgQAMLACAQDUAwAhtgJAANcDACHJAgEA1AMAIdwCAQDiAwAh-QIBANQDACH6AgEA1AMAIfsCAgDjAwAh_AIBANQDACH9AiAAiQQAIf4CAQDiAwAh_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_AwAh2wICAAAAAdwCAQAAAAHdAgEA_gMAIQEAAACwAgAgAQAAALACACAJCwAAgAQAIK0CAAD7AwAwrgIAALMCABCvAgAA-wMAMLACAQD8AwAhtgJAAP8DACHbAgIA_QMAIdwCAQD8AwAh3QIBAP4DACEDCwAAnQUAINsCAADSBAAg3QIAANIEACADAAAAswIAIAEAALQCADACAACwAgAgAwAAALMCACABAAC0AgAwAgAAsAIAIAMAAACzAgAgAQAAtAIAMAIAALACACAGCwAAnAUAILACAQAAAAG2AkAAAAAB2wICAAAAAdwCAQAAAAHdAgEAAAABASoAALgCACAFsAIBAAAAAbYCQAAAAAHbAgIAAAAB3AIBAAAAAd0CAQAAAAEBKgAAugIAMAEqAAC6AgAwBgsAAI0FACCwAgEA1gQAIbYCQADXBAAh2wICAOsEACHcAgEA1gQAId0CAQDhBAAhAgAAALACACAqAAC9AgAgBbACAQDWBAAhtgJAANcEACHbAgIA6wQAIdwCAQDWBAAh3QIBAOEEACECAAAAswIAICoAAL8CACACAAAAswIAICoAAL8CACADAAAAsAIAIDEAALgCACAyAAC9AgAgAQAAALACACABAAAAswIAIAcMAACIBQAgNwAAiQUAIDgAAIwFACA5AACLBQAgOgAAigUAINsCAADSBAAg3QIAANIEACAIrQIAAPoDADCuAgAAxgIAEK8CAAD6AwAwsAIBANQDACG2AkAA1gMAIdsCAgDpAwAh3AIBANQDACHdAgEA4gMAIQMAAACzAgAgAQAAxQIAMDYAAMYCACADAAAAswIAIAEAALQCADACAACwAgAgAQAAABMAIAEAAAATACADAAAAEQAgAQAAEgAwAgAAEwAgAwAAABEAIAEAABIAMAIAABMAIAMAAAARACABAAASADACAAATACAGAwAAhwUAIAcAAIYFACC2AkAAAAAByQIBAAAAAcoCAQAAAAHaAgAAANoCAgEqAADOAgAgBLYCQAAAAAHJAgEAAAABygIBAAAAAdoCAAAA2gICASoAANACADABKgAA0AIAMAYDAACFBQAgBwAAhAUAILYCQADXBAAhyQIBANYEACHKAgEA1gQAIdoCAACDBdoCIgIAAAATACAqAADTAgAgBLYCQADXBAAhyQIBANYEACHKAgEA1gQAIdoCAACDBdoCIgIAAAARACAqAADVAgAgAgAAABEAICoAANUCACADAAAAEwAgMQAAzgIAIDIAANMCACABAAAAEwAgAQAAABEAIAMMAACABQAgOQAAggUAIDoAAIEFACAHrQIAAPYDADCuAgAA3AIAEK8CAAD2AwAwtgJAANYDACHJAgEA1AMAIcoCAQDUAwAh2gIAAPcD2gIiAwAAABEAIAEAANsCADA2AADcAgAgAwAAABEAIAEAABIAMAIAABMAIAEAAAAyACABAAAAMgAgAwAAADAAIAEAADEAMAIAADIAIAMAAAAwACABAAAxADACAAAyACADAAAAMAAgAQAAMQAwAgAAMgAgBwcAAP4EACAXAAD_BAAgsAIBAAAAAbYCQAAAAAHKAgEAAAAB1gIBAAAAAdgCAAAA2AICASoAAOQCACAFsAIBAAAAAbYCQAAAAAHKAgEAAAAB1gIBAAAAAdgCAAAA2AICASoAAOYCADABKgAA5gIAMAEAAAAPACAHBwAA_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_ACABAABAADACAABBACADAAAAPwAgAQAAQAAwAgAAQQAgCQMAAOQEACAHAADlBAAgKoAAAAABsAIBAAAAAbYCQAAAAAHJAgEAAAABygIBAAAAAcsCAgAAAAHMAkAAAAABASoAAKoDACAHKoAAAAABsAIBAAAAAbYCQAAAAAHJAgEAAAABygIBAAAAAcsCAgAAAAHMAkAAAAABASoAAKwDADABKgAArAMAMAEAAAAXACAJAwAA4gQAIAcAAOMEACAqgAAAAAGwAgEA1gQAIbYCQADXBAAhyQIBANYEACHKAgEA4QQAIcsCAgDgBAAhzAJAANcEACECAAAAQQAgKgAAsAMAIAcqgAAAAAGwAgEA1gQAIbYCQADXBAAhyQIBANYEACHKAgEA4QQAIcsCAgDgBAAhzAJAANcEACECAAAAPwAgKgAAsgMAIAIAAAA_ACAqAACyAwAgAQAAABcAIAMAAABBACAxAACqAwAgMgAAsAMAIAEAAABBACABAAAAPwAgBgwAANsEACA3AADcBAAgOAAA3wQAIDkAAN4EACA6AADdBAAgygIAANIEACAKKgAA1QMAIK0CAADhAwAwrgIAALoDABCvAgAA4QMAMLACAQDUAwAhtgJAANYDACHJAgEA1AMAIcoCAQDiAwAhywICAOMDACHMAkAA1gMAIQMAAAA_ACABAAC5AwAwNgAAugMAIAMAAAA_ACABAABAADACAABBACABAAAATwAgAQAAAE8AIAMAAABNACABAABOADACAABPACADAAAATQAgAQAATgAwAgAATwAgAwAAAE0AIAEAAE4AMAIAAE8AIAkfAADaBAAgsAIBAAAAAbECAQAAAAGyAgEAAAABswIBAAAAAbQCAQAAAAG1AoAAAAABtgJAAAAAAbcCQAAAAAEBKgAAwgMAIAiwAgEAAAABsQIBAAAAAbICAQAAAAGzAgEAAAABtAIBAAAAAbUCgAAAAAG2AkAAAAABtwJAAAAAAQEqAADEAwAwASoAAMQDADAJHwAA2QQAILACAQDWBAAhsQIBANYEACGyAgEA1gQAIbMCAQDWBAAhtAIBANYEACG1AoAAAAABtgJAANcEACG3AkAA2AQAIQIAAABPACAqAADHAwAgCLACAQDWBAAhsQIBANYEACGyAgEA1gQAIbMCAQDWBAAhtAIBANYEACG1AoAAAAABtgJAANcEACG3AkAA2AQAIQIAAABNACAqAADJAwAgAgAAAE0AICoAAMkDACADAAAATwAgMQAAwgMAIDIAAMcDACABAAAATwAgAQAAAE0AIAQMAADTBAAgOQAA1QQAIDoAANQEACC3AgAA0gQAIAutAgAA0wMAMK4CAADQAwAQrwIAANMDADCwAgEA1AMAIbECAQDUAwAhsgIBANQDACGzAgEA1AMAIbQCAQDUAwAhtQIAANUDACC2AkAA1gMAIbcCQADXAwAhAwAAAE0AIAEAAM8DADA2AADQAwAgAwAAAE0AIAEAAE4AMAIAAE8AIAutAgAA0wMAMK4CAADQAwAQrwIAANMDADCwAgEA1AMAIbECAQDUAwAhsgIBANQDACGzAgEA1AMAIbQCAQDUAwAhtQIAANUDACC2AkAA1gMAIbcCQADXAwAhDgwAANwDACA5AADgAwAgOgAA4AMAILgCAQAAAAG5AgEAAAAEugIBAAAABLsCAQAAAAG8AgEAAAABvQIBAAAAAb4CAQAAAAG_AgEA3wMAIcYCAQAAAAHHAgEAAAAByAIBAAAAAQ8MAADcAwAgOQAA3gMAIDoAAN4DACC4AoAAAAABuwKAAAAAAbwCgAAAAAG9AoAAAAABvgKAAAAAAb8CgAAAAAHAAgEAAAABwQIBAAAAAcICAQAAAAHDAoAAAAABxAKAAAAAAcUCgAAAAAELDAAA3AMAIDkAAN0DACA6AADdAwAguAJAAAAAAbkCQAAAAAS6AkAAAAAEuwJAAAAAAbwCQAAAAAG9AkAAAAABvgJAAAAAAb8CQADbAwAhCwwAANkDACA5AADaAwAgOgAA2gMAILgCQAAAAAG5AkAAAAAFugJAAAAABbsCQAAAAAG8AkAAAAABvQJAAAAAAb4CQAAAAAG_AkAA2AMAIQsMAADZAwAgOQAA2gMAIDoAANoDACC4AkAAAAABuQJAAAAABboCQAAAAAW7AkAAAAABvAJAAAAAAb0CQAAAAAG-AkAAAAABvwJAANgDACEIuAICAAAAAbkCAgAAAAW6AgIAAAAFuwICAAAAAbwCAgAAAAG9AgIAAAABvgICAAAAAb8CAgDZAwAhCLgCQAAAAAG5AkAAAAAFugJAAAAABbsCQAAAAAG8AkAAAAABvQJAAAAAAb4CQAAAAAG_AkAA2gMAIQsMAADcAwAgOQAA3QMAIDoAAN0DACC4AkAAAAABuQJAAAAABLoCQAAAAAS7AkAAAAABvAJAAAAAAb0CQAAAAAG-AkAAAAABvwJAANsDACEIuAICAAAAAbkCAgAAAAS6AgIAAAAEuwICAAAAAbwCAgAAAAG9AgIAAAABvgICAAAAAb8CAgDcAwAhCLgCQAAAAAG5AkAAAAAEugJAAAAABLsCQAAAAAG8AkAAAAABvQJAAAAAAb4CQAAAAAG_AkAA3QMAIQy4AoAAAAABuwKAAAAAAbwCgAAAAAG9AoAAAAABvgKAAAAAAb8CgAAAAAHAAgEAAAABwQIBAAAAAcICAQAAAAHDAoAAAAABxAKAAAAAAcUCgAAAAAEODAAA3AMAIDkAAOADACA6AADgAwAguAIBAAAAAbkCAQAAAAS6AgEAAAAEuwIBAAAAAbwCAQAAAAG9AgEAAAABvgIBAAAAAb8CAQDfAwAhxgIBAAAAAccCAQAAAAHIAgEAAAABC7gCAQAAAAG5AgEAAAAEugIBAAAABLsCAQAAAAG8AgEAAAABvQIBAAAAAb4CAQAAAAG_AgEA4AMAIcYCAQAAAAHHAgEAAAAByAIBAAAAAQoqAADVAwAgrQIAAOEDADCuAgAAugMAEK8CAADhAwAwsAIBANQDACG2AkAA1gMAIckCAQDUAwAhygIBAOIDACHLAgIA4wMAIcwCQADWAwAhDgwAANkDACA5AADnAwAgOgAA5wMAILgCAQAAAAG5AgEAAAAFugIBAAAABbsCAQAAAAG8AgEAAAABvQIBAAAAAb4CAQAAAAG_AgEA5gMAIcYCAQAAAAHHAgEAAAAByAIBAAAAAQ0MAADcAwAgNwAA5QMAIDgAANwDACA5AADcAwAgOgAA3AMAILgCAgAAAAG5AgIAAAAEugICAAAABLsCAgAAAAG8AgIAAAABvQICAAAAAb4CAgAAAAG_AgIA5AMAIQ0MAADcAwAgNwAA5QMAIDgAANwDACA5AADcAwAgOgAA3AMAILgCAgAAAAG5AgIAAAAEugICAAAABLsCAgAAAAG8AgIAAAABvQICAAAAAb4CAgAAAAG_AgIA5AMAIQi4AggAAAABuQIIAAAABLoCCAAAAAS7AggAAAABvAIIAAAAAb0CCAAAAAG-AggAAAABvwIIAOUDACEODAAA2QMAIDkAAOcDACA6AADnAwAguAIBAAAAAbkCAQAAAAW6AgEAAAAFuwIBAAAAAbwCAQAAAAG9AgEAAAABvgIBAAAAAb8CAQDmAwAhxgIBAAAAAccCAQAAAAHIAgEAAAABC7gCAQAAAAG5AgEAAAAFugIBAAAABbsCAQAAAAG8AgEAAAABvQIBAAAAAb4CAQAAAAG_AgEA5wMAIcYCAQAAAAHHAgEAAAAByAIBAAAAAQ-tAgAA6AMAMK4CAACiAwAQrwIAAOgDADCwAgEA1AMAIbYCQADWAwAhyQIBAOIDACHKAgEA1AMAIc0CAgDpAwAhzwIAAOoDzwIi0AIBAOIDACHRAgEA4gMAIdICAQDiAwAh0wIBAOIDACHUAgAA6wMAINUCAQDiAwAhDQwAANkDACA3AADwAwAgOAAA2QMAIDkAANkDACA6AADZAwAguAICAAAAAbkCAgAAAAW6AgIAAAAFuwICAAAAAbwCAgAAAAG9AgIAAAABvgICAAAAAb8CAgDvAwAhBwwAANwDACA5AADuAwAgOgAA7gMAILgCAAAAzwICuQIAAADPAgi6AgAAAM8CCL8CAADtA88CIg8MAADZAwAgOQAA7AMAIDoAAOwDACC4AoAAAAABuwKAAAAAAbwCgAAAAAG9AoAAAAABvgKAAAAAAb8CgAAAAAHAAgEAAAABwQIBAAAAAcICAQAAAAHDAoAAAAABxAKAAAAAAcUCgAAAAAEMuAKAAAAAAbsCgAAAAAG8AoAAAAABvQKAAAAAAb4CgAAAAAG_AoAAAAABwAIBAAAAAcECAQAAAAHCAgEAAAABwwKAAAAAAcQCgAAAAAHFAoAAAAABBwwAANwDACA5AADuAwAgOgAA7gMAILgCAAAAzwICuQIAAADPAgi6AgAAAM8CCL8CAADtA88CIgS4AgAAAM8CArkCAAAAzwIIugIAAADPAgi_AgAA7gPPAiINDAAA2QMAIDcAAPADACA4AADZAwAgOQAA2QMAIDoAANkDACC4AgIAAAABuQICAAAABboCAgAAAAW7AgIAAAABvAICAAAAAb0CAgAAAAG-AgIAAAABvwICAO8DACEIuAIIAAAAAbkCCAAAAAW6AggAAAAFuwIIAAAAAbwCCAAAAAG9AggAAAABvgIIAAAAAb8CCADwAwAhBq0CAADxAwAwrgIAAIoDABCvAgAA8QMAMLYCQADWAwAhyQIBANQDACHKAgEA1AMAIQitAgAA8gMAMK4CAAD0AgAQrwIAAPIDADCwAgEA1AMAIbYCQADWAwAhygIBANQDACHWAgEA4gMAIdgCAADzA9gCIgcMAADcAwAgOQAA9QMAIDoAAPUDACC4AgAAANgCArkCAAAA2AIIugIAAADYAgi_AgAA9APYAiIHDAAA3AMAIDkAAPUDACA6AAD1AwAguAIAAADYAgK5AgAAANgCCLoCAAAA2AIIvwIAAPQD2AIiBLgCAAAA2AICuQIAAADYAgi6AgAAANgCCL8CAAD1A9gCIgetAgAA9gMAMK4CAADcAgAQrwIAAPYDADC2AkAA1gMAIckCAQDUAwAhygIBANQDACHaAgAA9wPaAiIHDAAA3AMAIDkAAPkDACA6AAD5AwAguAIAAADaAgK5AgAAANoCCLoCAAAA2gIIvwIAAPgD2gIiBwwAANwDACA5AAD5AwAgOgAA-QMAILgCAAAA2gICuQIAAADaAgi6AgAAANoCCL8CAAD4A9oCIgS4AgAAANoCArkCAAAA2gIIugIAAADaAgi_AgAA-QPaAiIIrQIAAPoDADCuAgAAxgIAEK8CAAD6AwAwsAIBANQDACG2AkAA1gMAIdsCAgDpAwAh3AIBANQDACHdAgEA4gMAIQkLAACABAAgrQIAAPsDADCuAgAAswIAEK8CAAD7AwAwsAIBAPwDACG2AkAA_wMAIdsCAgD9AwAh3AIBAPwDACHdAgEA_gMAIQu4AgEAAAABuQIBAAAABLoCAQAAAAS7AgEAAAABvAIBAAAAAb0CAQAAAAG-AgEAAAABvwIBAOADACHGAgEAAAABxwIBAAAAAcgCAQAAAAEIuAICAAAAAbkCAgAAAAW6AgIAAAAFuwICAAAAAbwCAgAAAAG9AgIAAAABvgICAAAAAb8CAgDZAwAhC7gCAQAAAAG5AgEAAAAFugIBAAAABbsCAQAAAAG8AgEAAAABvQIBAAAAAb4CAQAAAAG_AgEA5wMAIcYCAQAAAAHHAgEAAAAByAIBAAAAAQi4AkAAAAABuQJAAAAABLoCQAAAAAS7AkAAAAABvAJAAAAAAb0CQAAAAAG-AkAAAAABvwJAAN0DACED3gIAABwAIN8CAAAcACDgAgAAHAAgCa0CAACBBAAwrgIAAK0CABCvAgAAgQQAMLACAQDUAwAhtgJAANYDACHKAgEA1AMAIc8CAACCBOQCIuECAgDjAwAh4gIBANQDACEHDAAA3AMAIDkAAIQEACA6AACEBAAguAIAAADkAgK5AgAAAOQCCLoCAAAA5AIIvwIAAIME5AIiBwwAANwDACA5AACEBAAgOgAAhAQAILgCAAAA5AICuQIAAADkAgi6AgAAAOQCCL8CAACDBOQCIgS4AgAAAOQCArkCAAAA5AIIugIAAADkAgi_AgAAhATkAiIHrQIAAIUEADCuAgAAlwIAEK8CAACFBAAwtgJAANYDACHKAgEA1AMAIc0CAgDjAwAh5AIBANQDACEOrQIAAIYEADCuAgAAgQIAEK8CAACGBAAwtgJAANYDACHKAgEA1AMAIc0CAgDjAwAh5QIBANQDACHmAgEA4gMAIecCAQDiAwAh6AIBAOIDACHpAgEA1AMAIeoCAQDiAwAh6wIBAOIDACHsAkAA1wMAIRKtAgAAhwQAMK4CAADrAQAQrwIAAIcEADCwAgEA1AMAIbYCQADWAwAhzAJAANYDACHbAgIA6QMAIe0CAgDpAwAh7gIBAOIDACHvAgIA6QMAIfECAACIBPECIvICIACJBAAh8wIgAIkEACH0AgIA4wMAIfUCAgDjAwAh9gICAOMDACH3AgIA4wMAIfgCQADXAwAhBwwAANwDACA5AACNBAAgOgAAjQQAILgCAAAA8QICuQIAAADxAgi6AgAAAPECCL8CAACMBPECIgUMAADcAwAgOQAAiwQAIDoAAIsEACC4AiAAAAABvwIgAIoEACEFDAAA3AMAIDkAAIsEACA6AACLBAAguAIgAAAAAb8CIACKBAAhArgCIAAAAAG_AiAAiwQAIQcMAADcAwAgOQAAjQQAIDoAAI0EACC4AgAAAPECArkCAAAA8QIIugIAAADxAgi_AgAAjATxAiIEuAIAAADxAgK5AgAAAPECCLoCAAAA8QIIvwIAAI0E8QIiDq0CAACOBAAwrgIAAM8BABCvAgAAjgQAMLACAQDUAwAhtgJAANcDACHJAgEA1AMAIdwCAQDiAwAh-QIBANQDACH6AgEA1AMAIfsCAgDjAwAh_AIBANQDACH9AiAAiQQAIf4CAQDiAwAh_wIBAOIDACEKrQIAAI8EADCuAgAAuQEAEK8CAACPBAAwsAIBANQDACG2AkAA1wMAIckCAQDiAwAhzAJAANcDACGAAwEA1AMAIYEDAQDUAwAhggNAANYDACEMrQIAAJAEADCuAgAAoQEAEK8CAACQBAAwsAIBANQDACG2AkAA1gMAIckCAQDUAwAhzAJAANYDACHSAgEA4gMAIYIDQADWAwAhgwMBANQDACGEAwEA4gMAIYUDAQDiAwAhEK0CAACRBAAwrgIAAIsBABCvAgAAkQQAMLACAQDUAwAhtgJAANYDACHJAgEA1AMAIcwCQADWAwAhhgMBANQDACGHAwEA1AMAIYgDAQDiAwAhiQMBAOIDACGKA0AA1wMAIYsDQADXAwAhjAMBAOIDACGNAwEA4gMAIY4DAQDiAwAhGa0CAACSBAAwrgIAAHUAEK8CAACSBAAwsAIBANQDACG2AkAA1gMAIcwCQADWAwAh2gIBAOIDACHbAgIA6QMAIdwCAQDiAwAh-AJAANcDACGPAwEA4gMAIZADIACJBAAhkQMBAOIDACGTAwAAkwSTAyKVAwAAlASVAyKWAyAAiQQAIZcDAQDiAwAhmAMBAOIDACGZAwAA6wMAIJoDQADXAwAhmwMBAOIDACGcAyAAlQQAIZ0DAQDiAwAhngNAANcDACGfA0AA1wMAIQcMAADcAwAgOQAAmwQAIDoAAJsEACC4AgAAAJMDArkCAAAAkwMIugIAAACTAwi_AgAAmgSTAyIHDAAA3AMAIDkAAJkEACA6AACZBAAguAIAAACVAwK5AgAAAJUDCLoCAAAAlQMIvwIAAJgElQMiBQwAANkDACA5AACXBAAgOgAAlwQAILgCIAAAAAG_AiAAlgQAIQUMAADZAwAgOQAAlwQAIDoAAJcEACC4AiAAAAABvwIgAJYEACECuAIgAAAAAb8CIACXBAAhBwwAANwDACA5AACZBAAgOgAAmQQAILgCAAAAlQMCuQIAAACVAwi6AgAAAJUDCL8CAACYBJUDIgS4AgAAAJUDArkCAAAAlQMIugIAAACVAwi_AgAAmQSVAyIHDAAA3AMAIDkAAJsEACA6AACbBAAguAIAAACTAwK5AgAAAJMDCLoCAAAAkwMIvwIAAJoEkwMiBLgCAAAAkwMCuQIAAACTAwi6AgAAAJMDCL8CAACbBJMDIg8DAACgBAAgrQIAAJwEADCuAgAAVAAQrwIAAJwEADCwAgEA_AMAIbYCQACfBAAhyQIBAPwDACHcAgEA_gMAIfkCAQD8AwAh-gIBAPwDACH7AgIAnQQAIfwCAQD8AwAh_QIgAJ4EACH-AgEA_gMAIf8CAQD-AwAhCLgCAgAAAAG5AgIAAAAEugICAAAABLsCAgAAAAG8AgIAAAABvQICAAAAAb4CAgAAAAG_AgIA3AMAIQK4AiAAAAABvwIgAIsEACEIuAJAAAAAAbkCQAAAAAW6AkAAAAAFuwJAAAAAAbwCQAAAAAG9AkAAAAABvgJAAAAAAb8CQADaAwAhJQQAAMoEACAFAADLBAAgBgAAzAQAIB0AAL4EACAeAAC_BAAgIAAAzQQAICEAAMAEACAiAADBBAAgIwAAwgQAICQAAM4EACCtAgAAxgQAMK4CAAAPABCvAgAAxgQAMLACAQD8AwAhtgJAAP8DACHMAkAA_wMAIdoCAQD-AwAh2wICAP0DACHcAgEA_gMAIfgCQACfBAAhjwMBAP4DACGQAyAAngQAIZEDAQD-AwAhkwMAAMcEkwMilQMAAMgElQMilgMgAJ4EACGXAwEA_gMAIZgDAQD-AwAhmQMAAKcEACCaA0AAnwQAIZsDAQD-AwAhnAMgAMkEACGdAwEA_gMAIZ4DQACfBAAhnwNAAJ8EACGlAwAADwAgpgMAAA8AIAwfAACgBAAgrQIAAKEEADCuAgAATQAQrwIAAKEEADCwAgEA_AMAIbECAQD8AwAhsgIBAPwDACGzAgEA_AMAIbQCAQD8AwAhtQIAAKIEACC2AkAA_wMAIbcCQACfBAAhDLgCgAAAAAG7AoAAAAABvAKAAAAAAb0CgAAAAAG-AoAAAAABvwKAAAAAAcACAQAAAAHBAgEAAAABwgIBAAAAAcMCgAAAAAHEAoAAAAABxQKAAAAAAQwDAACgBAAgBwAApAQAICoAAKIEACCtAgAAowQAMK4CAAA_ABCvAgAAowQAMLACAQD8AwAhtgJAAP8DACHJAgEA_AMAIcoCAQD-AwAhywICAJ0EACHMAkAA_wMAIR8RAAC8BAAgEgAApAQAIBMAALEEACAUAAC8BAAgFQAAvQQAIBYAAL4EACAYAAC_BAAgGQAAsgQAIBoAAMAEACAbAADBBAAgHAAAwgQAIK0CAAC6BAAwrgIAABcAEK8CAAC6BAAwsAIBAPwDACG2AkAA_wMAIcwCQAD_AwAh2wICAP0DACHtAgIA_QMAIe4CAQD-AwAh7wICAP0DACHxAgAAuwTxAiLyAiAAngQAIfMCIACeBAAh9AICAJ0EACH1AgIAnQQAIfYCAgCdBAAh9wICAJ0EACH4AkAAnwQAIaUDAAAXACCmAwAAFwAgEQMAAKkEACAHAACoBAAgrQIAAKUEADCuAgAAOgAQrwIAAKUEADCwAgEA_AMAIbYCQAD_AwAhyQIBAP4DACHKAgEA_AMAIc0CAgD9AwAhzwIAAKYEzwIi0AIBAP4DACHRAgEA_gMAIdICAQD-AwAh0wIBAP4DACHUAgAApwQAINUCAQD-AwAhBLgCAAAAzwICuQIAAADPAgi6AgAAAM8CCL8CAADuA88CIgy4AoAAAAABuwKAAAAAAbwCgAAAAAG9AoAAAAABvgKAAAAAAb8CgAAAAAHAAgEAAAABwQIBAAAAAcICAQAAAAHDAoAAAAABxAKAAAAAAcUCgAAAAAEfEQAAvAQAIBIAAKQEACATAACxBAAgFAAAvAQAIBUAAL0EACAWAAC-BAAgGAAAvwQAIBkAALIEACAaAADABAAgGwAAwQQAIBwAAMIEACCtAgAAugQAMK4CAAAXABCvAgAAugQAMLACAQD8AwAhtgJAAP8DACHMAkAA_wMAIdsCAgD9AwAh7QICAP0DACHuAgEA_gMAIe8CAgD9AwAh8QIAALsE8QIi8gIgAJ4EACHzAiAAngQAIfQCAgCdBAAh9QICAJ0EACH2AgIAnQQAIfcCAgCdBAAh-AJAAJ8EACGlAwAAFwAgpgMAABcAICUEAADKBAAgBQAAywQAIAYAAMwEACAdAAC-BAAgHgAAvwQAICAAAM0EACAhAADABAAgIgAAwQQAICMAAMIEACAkAADOBAAgrQIAAMYEADCuAgAADwAQrwIAAMYEADCwAgEA_AMAIbYCQAD_AwAhzAJAAP8DACHaAgEA_gMAIdsCAgD9AwAh3AIBAP4DACH4AkAAnwQAIY8DAQD-AwAhkAMgAJ4EACGRAwEA_gMAIZMDAADHBJMDIpUDAADIBJUDIpYDIACeBAAhlwMBAP4DACGYAwEA_gMAIZkDAACnBAAgmgNAAJ8EACGbAwEA_gMAIZwDIADJBAAhnQMBAP4DACGeA0AAnwQAIZ8DQACfBAAhpQMAAA8AIKYDAAAPACACyQIBAAAAAcoCAQAAAAEIAwAAoAQAIAcAAKgEACCtAgAAqwQAMK4CAAA2ABCvAgAAqwQAMLYCQAD_AwAhyQIBAPwDACHKAgEA_AMAIQLKAgEAAAAB1gIBAAAAAQoHAACoBAAgFwAAqQQAIK0CAACtBAAwrgIAADAAEK8CAACtBAAwsAIBAPwDACG2AkAA_wMAIcoCAQD8AwAh1gIBAP4DACHYAgAArgTYAiIEuAIAAADYAgK5AgAAANgCCLoCAAAA2AIIvwIAAPUD2AIiAsoCAQAAAAHNAgIAAAABEwcAAKgEACAIAACkBAAgCQAAsQQAIA4AAIAEACAQAACyBAAgrQIAALAEADCuAgAAFQAQrwIAALAEADC2AkAA_wMAIcoCAQD8AwAhzQICAJ0EACHlAgEA_AMAIeYCAQD-AwAh5wIBAP4DACHoAgEA_gMAIekCAQD8AwAh6gIBAP4DACHrAgEA_gMAIewCQACfBAAhA94CAAAXACDfAgAAFwAg4AIAABcAIAPeAgAAIgAg3wIAACIAIOACAAAiACALBwAAqAQAIA8AALUEACCtAgAAswQAMK4CAAAiABCvAgAAswQAMLACAQD8AwAhtgJAAP8DACHKAgEA_AMAIc8CAAC0BOQCIuECAgCdBAAh4gIBAPwDACEEuAIAAADkAgK5AgAAAOQCCLoCAAAA5AIIvwIAAIQE5AIiFQcAAKgEACAIAACkBAAgCQAAsQQAIA4AAIAEACAQAACyBAAgrQIAALAEADCuAgAAFQAQrwIAALAEADC2AkAA_wMAIcoCAQD8AwAhzQICAJ0EACHlAgEA_AMAIeYCAQD-AwAh5wIBAP4DACHoAgEA_gMAIekCAQD8AwAh6gIBAP4DACHrAgEA_gMAIewCQACfBAAhpQMAABUAIKYDAAAVACADygIBAAAAAc0CAgAAAAHkAgEAAAABCQoAALUEACANAAC4BAAgrQIAALcEADCuAgAAHAAQrwIAALcEADC2AkAA_wMAIcoCAQD8AwAhzQICAJ0EACHkAgEA_AMAIQsLAACABAAgrQIAAPsDADCuAgAAswIAEK8CAAD7AwAwsAIBAPwDACG2AkAA_wMAIdsCAgD9AwAh3AIBAPwDACHdAgEA_gMAIaUDAACzAgAgpgMAALMCACACsAIBAAAAAe0CAgAAAAEdEQAAvAQAIBIAAKQEACATAACxBAAgFAAAvAQAIBUAAL0EACAWAAC-BAAgGAAAvwQAIBkAALIEACAaAADABAAgGwAAwQQAIBwAAMIEACCtAgAAugQAMK4CAAAXABCvAgAAugQAMLACAQD8AwAhtgJAAP8DACHMAkAA_wMAIdsCAgD9AwAh7QICAP0DACHuAgEA_gMAIe8CAgD9AwAh8QIAALsE8QIi8gIgAJ4EACHzAiAAngQAIfQCAgCdBAAh9QICAJ0EACH2AgIAnQQAIfcCAgCdBAAh-AJAAJ8EACEEuAIAAADxAgK5AgAAAPECCLoCAAAA8QIIvwIAAI0E8QIiFQcAAKgEACAIAACkBAAgCQAAsQQAIA4AAIAEACAQAACyBAAgrQIAALAEADCuAgAAFQAQrwIAALAEADC2AkAA_wMAIcoCAQD8AwAhzQICAJ0EACHlAgEA_AMAIeYCAQD-AwAh5wIBAP4DACHoAgEA_gMAIekCAQD8AwAh6gIBAP4DACHrAgEA_gMAIewCQACfBAAhpQMAABUAIKYDAAAVACAD3gIAABUAIN8CAAAVACDgAgAAFQAgA94CAAARACDfAgAAEQAg4AIAABEAIAPeAgAAMAAg3wIAADAAIOACAAAwACAD3gIAADYAIN8CAAA2ACDgAgAANgAgA94CAAA6ACDfAgAAOgAg4AIAADoAIAPeAgAAPwAg3wIAAD8AIOACAAA_ACACyQIBAAAAAcoCAQAAAAEJAwAAoAQAIAcAAKgEACCtAgAAxAQAMK4CAAARABCvAgAAxAQAMLYCQAD_AwAhyQIBAPwDACHKAgEA_AMAIdoCAADFBNoCIgS4AgAAANoCArkCAAAA2gIIugIAAADaAgi_AgAA-QPaAiIjBAAAygQAIAUAAMsEACAGAADMBAAgHQAAvgQAIB4AAL8EACAgAADNBAAgIQAAwAQAICIAAMEEACAjAADCBAAgJAAAzgQAIK0CAADGBAAwrgIAAA8AEK8CAADGBAAwsAIBAPwDACG2AkAA_wMAIcwCQAD_AwAh2gIBAP4DACHbAgIA_QMAIdwCAQD-AwAh-AJAAJ8EACGPAwEA_gMAIZADIACeBAAhkQMBAP4DACGTAwAAxwSTAyKVAwAAyASVAyKWAyAAngQAIZcDAQD-AwAhmAMBAP4DACGZAwAApwQAIJoDQACfBAAhmwMBAP4DACGcAyAAyQQAIZ0DAQD-AwAhngNAAJ8EACGfA0AAnwQAIQS4AgAAAJMDArkCAAAAkwMIugIAAACTAwi_AgAAmwSTAyIEuAIAAACVAwK5AgAAAJUDCLoCAAAAlQMIvwIAAJkElQMiArgCIAAAAAG_AiAAlwQAIQPeAgAAAwAg3wIAAAMAIOACAAADACAD3gIAAAcAIN8CAAAHACDgAgAABwAgA94CAAALACDfAgAACwAg4AIAAAsAIAPeAgAATQAg3wIAAE0AIOACAABNACAD3gIAAFQAIN8CAABUACDgAgAAVAAgCwMAAKkEACCtAgAAzwQAMK4CAAALABCvAgAAzwQAMLACAQD8AwAhtgJAAJ8EACHJAgEA_gMAIcwCQACfBAAhgAMBAPwDACGBAwEA_AMAIYIDQAD_AwAhDQMAAKAEACCtAgAA0AQAMK4CAAAHABCvAgAA0AQAMLACAQD8AwAhtgJAAP8DACHJAgEA_AMAIcwCQAD_AwAh0gIBAP4DACGCA0AA_wMAIYMDAQD8AwAhhAMBAP4DACGFAwEA_gMAIREDAACgBAAgrQIAANEEADCuAgAAAwAQrwIAANEEADCwAgEA_AMAIbYCQAD_AwAhyQIBAPwDACHMAkAA_wMAIYYDAQD8AwAhhwMBAPwDACGIAwEA_gMAIYkDAQD-AwAhigNAAJ8EACGLA0AAnwQAIYwDAQD-AwAhjQMBAP4DACGOAwEA_gMAIQAAAAABqgMBAAAAAQGqA0AAAAABAaoDQAAAAAEFMQAAiwkAIDIAAI4JACCnAwAAjAkAIKgDAACNCQAgrQMAAAEAIAMxAACLCQAgpwMAAIwJACCtAwAAAQAgAAAAAAAFqgMCAAAAAbADAgAAAAGxAwIAAAABsgMCAAAAAbMDAgAAAAEBqgMBAAAAAQUxAACDCQAgMgAAiQkAIKcDAACECQAgqAMAAIgJACCtAwAAAQAgBzEAAIEJACAyAACGCQAgpwMAAIIJACCoAwAAhQkAIKsDAAAXACCsAwAAFwAgrQMAABoAIAMxAACDCQAgpwMAAIQJACCtAwAAAQAgAzEAAIEJACCnAwAAggkAIK0DAAAaACAAAAAAAAWqAwIAAAABsAMCAAAAAbEDAgAAAAGyAwIAAAABswMCAAAAAQGqAwAAAM8CAgUxAAD5CAAgMgAA_wgAIKcDAAD6CAAgqAMAAP4IACCtAwAAGgAgBzEAAPcIACAyAAD8CAAgpwMAAPgIACCoAwAA-wgAIKsDAAAPACCsAwAADwAgrQMAAAEAIAMxAAD5CAAgpwMAAPoIACCtAwAAGgAgAzEAAPcIACCnAwAA-AgAIK0DAAABACAAAAAFMQAA7wgAIDIAAPUIACCnAwAA8AgAIKgDAAD0CAAgrQMAABoAIAUxAADtCAAgMgAA8ggAIKcDAADuCAAgqAMAAPEIACCtAwAAAQAgAzEAAO8IACCnAwAA8AgAIK0DAAAaACADMQAA7QgAIKcDAADuCAAgrQMAAAEAIAAAAAGqAwAAANgCAgUxAADlCAAgMgAA6wgAIKcDAADmCAAgqAMAAOoIACCtAwAAGgAgBzEAAOMIACAyAADoCAAgpwMAAOQIACCoAwAA5wgAIKsDAAAPACCsAwAADwAgrQMAAAEAIAMxAADlCAAgpwMAAOYIACCtAwAAGgAgAzEAAOMIACCnAwAA5AgAIK0DAAABACAAAAABqgMAAADaAgIFMQAA2wgAIDIAAOEIACCnAwAA3AgAIKgDAADgCAAgrQMAABoAIAUxAADZCAAgMgAA3ggAIKcDAADaCAAgqAMAAN0IACCtAwAAAQAgAzEAANsIACCnAwAA3AgAIK0DAAAaACADMQAA2QgAIKcDAADaCAAgrQMAAAEAIAAAAAAACzEAAI4FADAyAACTBQAwpwMAAI8FADCoAwAAkAUAMKkDAACRBQAgqgMAAJIFADCrAwAAkgUAMKwDAACSBQAwrQMAAJIFADCuAwAAlAUAMK8DAACVBQAwBAoAAJsFACC2AkAAAAABygIBAAAAAc0CAgAAAAECAAAAHgAgMQAAmgUAIAMAAAAeACAxAACaBQAgMgAAmAUAIAEqAADYCAAwCgoAALUEACANAAC4BAAgrQIAALcEADCuAgAAHAAQrwIAALcEADC2AkAA_wMAIcoCAQD8AwAhzQICAJ0EACHkAgEA_AMAIaMDAAC2BAAgAgAAAB4AICoAAJgFACACAAAAlgUAICoAAJcFACAHrQIAAJUFADCuAgAAlgUAEK8CAACVBQAwtgJAAP8DACHKAgEA_AMAIc0CAgCdBAAh5AIBAPwDACEHrQIAAJUFADCuAgAAlgUAEK8CAACVBQAwtgJAAP8DACHKAgEA_AMAIc0CAgCdBAAh5AIBAPwDACEDtgJAANcEACHKAgEA1gQAIc0CAgDgBAAhBAoAAJkFACC2AkAA1wQAIcoCAQDWBAAhzQICAOAEACEFMQAA0wgAIDIAANYIACCnAwAA1AgAIKgDAADVCAAgrQMAAC0AIAQKAACbBQAgtgJAAAAAAcoCAQAAAAHNAgIAAAABAzEAANMIACCnAwAA1AgAIK0DAAAtACAEMQAAjgUAMKcDAACPBQAwqQMAAJEFACCtAwAAkgUAMAAAAAAAAAGqAwAAAOQCAgUxAADLCAAgMgAA0QgAIKcDAADMCAAgqAMAANAIACCtAwAAGgAgBTEAAMkIACAyAADOCAAgpwMAAMoIACCoAwAAzQgAIK0DAAAtACADMQAAywgAIKcDAADMCAAgrQMAABoAIAMxAADJCAAgpwMAAMoIACCtAwAALQAgAAAAAAAFMQAAxAgAIDIAAMcIACCnAwAAxQgAIKgDAADGCAAgrQMAALACACADMQAAxAgAIKcDAADFCAAgrQMAALACACAAAAAAAAUxAAClCAAgMgAAwggAIKcDAACmCAAgqAMAAMEIACCtAwAAGgAgBzEAALoGACAyAADTBgAgpwMAALsGACCoAwAA0gYAIKsDAAAXACCsAwAAFwAgrQMAABoAIAsxAADOBQAwMgAA0wUAMKcDAADPBQAwqAMAANAFADCpAwAA0QUAIKoDAADSBQAwqwMAANIFADCsAwAA0gUAMK0DAADSBQAwrgMAANQFADCvAwAA1QUAMAsxAADFBQAwMgAAyQUAMKcDAADGBQAwqAMAAMcFADCpAwAAyAUAIKoDAACSBQAwqwMAAJIFADCsAwAAkgUAMK0DAACSBQAwrgMAAMoFADCvAwAAlQUAMAsxAAC5BQAwMgAAvgUAMKcDAAC6BQAwqAMAALsFADCpAwAAvAUAIKoDAAC9BQAwqwMAAL0FADCsAwAAvQUAMK0DAAC9BQAwrgMAAL8FADCvAwAAwAUAMAUHAACmBQAgsAIBAAAAAbYCQAAAAAHPAgAAAOQCAuICAQAAAAECAAAAJAAgMQAAxAUAIAMAAAAkACAxAADEBQAgMgAAwwUAIAEqAADACAAwCwcAAKgEACAPAAC1BAAgrQIAALMEADCuAgAAIgAQrwIAALMEADCwAgEAAAABtgJAAP8DACHKAgEA_AMAIc8CAAC0BOQCIuECAgCdBAAh4gIBAPwDACECAAAAJAAgKgAAwwUAIAIAAADBBQAgKgAAwgUAIAmtAgAAwAUAMK4CAADBBQAQrwIAAMAFADCwAgEA_AMAIbYCQAD_AwAhygIBAPwDACHPAgAAtATkAiLhAgIAnQQAIeICAQD8AwAhCa0CAADABQAwrgIAAMEFABCvAgAAwAUAMLACAQD8AwAhtgJAAP8DACHKAgEA_AMAIc8CAAC0BOQCIuECAgCdBAAh4gIBAPwDACEEsAIBANYEACG2AkAA1wQAIc8CAACjBeQCIuICAQDWBAAhBQcAAKQFACCwAgEA1gQAIbYCQADXBAAhzwIAAKMF5AIi4gIBANYEACEFBwAApgUAILACAQAAAAG2AkAAAAABzwIAAADkAgLiAgEAAAABAw0AAK4FACC2AkAAAAAB5AIBAAAAAQIAAAAeACAxAADNBQAgAwAAAB4AIDEAAM0FACAyAADMBQAgASoAAL8IADACAAAAHgAgKgAAzAUAIAIAAACWBQAgKgAAywUAIAK2AkAA1wQAIeQCAQDWBAAhAw0AAK0FACC2AkAA1wQAIeQCAQDWBAAhAw0AAK4FACC2AkAAAAAB5AIBAAAAARcRAADKBgAgEgAAvAYAIBMAAL0GACAVAAC_BgAgFgAAwAYAIBgAAMEGACAZAADCBgAgGgAAwwYAIBsAAMQGACAcAADFBgAgsAIBAAAAAbYCQAAAAAHMAkAAAAAB2wICAAAAAe0CAgAAAAHxAgAAAPECAvICIAAAAAHzAiAAAAAB9AICAAAAAfUCAgAAAAH2AgIAAAAB9wICAAAAAfgCQAAAAAECAAAAGgAgMQAA0QYAIAMAAAAaACAxAADRBgAgMgAA2gUAIAEqAAC-CAAwHhEAALwEACASAACkBAAgEwAAsQQAIBQAALwEACAVAAC9BAAgFgAAvgQAIBgAAL8EACAZAACyBAAgGgAAwAQAIBsAAMEEACAcAADCBAAgrQIAALoEADCuAgAAFwAQrwIAALoEADCwAgEAAAABtgJAAP8DACHMAkAA_wMAIdsCAgAAAAHtAgIA_QMAIe4CAQD-AwAh7wICAP0DACHxAgAAuwTxAiLyAiAAngQAIfMCIACeBAAh9AICAJ0EACH1AgIAnQQAIfYCAgCdBAAh9wICAJ0EACH4AkAAnwQAIaQDAAC5BAAgAgAAABoAICoAANoFACACAAAA1gUAICoAANcFACASrQIAANUFADCuAgAA1gUAEK8CAADVBQAwsAIBAPwDACG2AkAA_wMAIcwCQAD_AwAh2wICAP0DACHtAgIA_QMAIe4CAQD-AwAh7wICAP0DACHxAgAAuwTxAiLyAiAAngQAIfMCIACeBAAh9AICAJ0EACH1AgIAnQQAIfYCAgCdBAAh9wICAJ0EACH4AkAAnwQAIRKtAgAA1QUAMK4CAADWBQAQrwIAANUFADCwAgEA_AMAIbYCQAD_AwAhzAJAAP8DACHbAgIA_QMAIe0CAgD9AwAh7gIBAP4DACHvAgIA_QMAIfECAAC7BPECIvICIACeBAAh8wIgAJ4EACH0AgIAnQQAIfUCAgCdBAAh9gICAJ0EACH3AgIAnQQAIfgCQACfBAAhDbACAQDWBAAhtgJAANcEACHMAkAA1wQAIdsCAgDrBAAh7QICAOsEACHxAgAA2AXxAiLyAiAA2QUAIfMCIADZBQAh9AICAOAEACH1AgIA4AQAIfYCAgDgBAAh9wICAOAEACH4AkAA2AQAIQGqAwAAAPECAgGqAyAAAAABFxEAANsFACASAADcBQAgEwAA3QUAIBUAAN4FACAWAADfBQAgGAAA4AUAIBkAAOEFACAaAADiBQAgGwAA4wUAIBwAAOQFACCwAgEA1gQAIbYCQADXBAAhzAJAANcEACHbAgIA6wQAIe0CAgDrBAAh8QIAANgF8QIi8gIgANkFACHzAiAA2QUAIfQCAgDgBAAh9QICAOAEACH2AgIA4AQAIfcCAgDgBAAh-AJAANgEACEHMQAArAgAIDIAALwIACCnAwAArQgAIKgDAAC7CAAgqwMAABUAIKwDAAAVACCtAwAALQAgBzEAAK8IACAyAAC5CAAgpwMAALAIACCoAwAAuAgAIKsDAAAXACCsAwAAFwAgrQMAABoAIAsxAADGBgAwMgAAzAYAMKcDAADHBgAwqAMAAMsGADCpAwAAyAYAIKoDAADSBQAwqwMAANIFADCsAwAA0gUAMK0DAADSBQAwrgMAAM0GADCvAwAA1QUAMAsxAACqBgAwMgAArwYAMKcDAACrBgAwqAMAAKwGADCpAwAArQYAIKoDAACuBgAwqwMAAK4GADCsAwAArgYAMK0DAACuBgAwrgMAALAGADCvAwAAsQYAMAsxAACeBgAwMgAAowYAMKcDAACfBgAwqAMAAKAGADCpAwAAoQYAIKoDAACiBgAwqwMAAKIGADCsAwAAogYAMK0DAACiBgAwrgMAAKQGADCvAwAApQYAMAsxAACSBgAwMgAAlwYAMKcDAACTBgAwqAMAAJQGADCpAwAAlQYAIKoDAACWBgAwqwMAAJYGADCsAwAAlgYAMK0DAACWBgAwrgMAAJgGADCvAwAAmQYAMAsxAACJBgAwMgAAjQYAMKcDAACKBgAwqAMAAIsGADCpAwAAjAYAIKoDAAC9BQAwqwMAAL0FADCsAwAAvQUAMK0DAAC9BQAwrgMAAI4GADCvAwAAwAUAMAsxAAD9BQAwMgAAggYAMKcDAAD-BQAwqAMAAP8FADCpAwAAgAYAIKoDAACBBgAwqwMAAIEGADCsAwAAgQYAMK0DAACBBgAwrgMAAIMGADCvAwAAhAYAMAsxAADxBQAwMgAA9gUAMKcDAADyBQAwqAMAAPMFADCpAwAA9AUAIKoDAAD1BQAwqwMAAPUFADCsAwAA9QUAMK0DAAD1BQAwrgMAAPcFADCvAwAA-AUAMAsxAADlBQAwMgAA6gUAMKcDAADmBQAwqAMAAOcFADCpAwAA6AUAIKoDAADpBQAwqwMAAOkFADCsAwAA6QUAMK0DAADpBQAwrgMAAOsFADCvAwAA7AUAMAcDAADkBAAgKoAAAAABsAIBAAAAAbYCQAAAAAHJAgEAAAABywICAAAAAcwCQAAAAAECAAAAQQAgMQAA8AUAIAMAAABBACAxAADwBQAgMgAA7wUAIAEqAAC3CAAwDAMAAKAEACAHAACkBAAgKgAAogQAIK0CAACjBAAwrgIAAD8AEK8CAACjBAAwsAIBAAAAAbYCQAD_AwAhyQIBAPwDACHKAgEA_gMAIcsCAgCdBAAhzAJAAP8DACECAAAAQQAgKgAA7wUAIAIAAADtBQAgKgAA7gUAIAoqAACiBAAgrQIAAOwFADCuAgAA7QUAEK8CAADsBQAwsAIBAPwDACG2AkAA_wMAIckCAQD8AwAhygIBAP4DACHLAgIAnQQAIcwCQAD_AwAhCioAAKIEACCtAgAA7AUAMK4CAADtBQAQrwIAAOwFADCwAgEA_AMAIbYCQAD_AwAhyQIBAPwDACHKAgEA_gMAIcsCAgCdBAAhzAJAAP8DACEGKoAAAAABsAIBANYEACG2AkAA1wQAIckCAQDWBAAhywICAOAEACHMAkAA1wQAIQcDAADiBAAgKoAAAAABsAIBANYEACG2AkAA1wQAIckCAQDWBAAhywICAOAEACHMAkAA1wQAIQcDAADkBAAgKoAAAAABsAIBAAAAAbYCQAAAAAHJAgEAAAABywICAAAAAcwCQAAAAAEMAwAA8AQAILACAQAAAAG2AkAAAAAByQIBAAAAAc0CAgAAAAHPAgAAAM8CAtACAQAAAAHRAgEAAAAB0gIBAAAAAdMCAQAAAAHUAoAAAAAB1QIBAAAAAQIAAAA8ACAxAAD8BQAgAwAAADwAIDEAAPwFACAyAAD7BQAgASoAALYIADARAwAAqQQAIAcAAKgEACCtAgAApQQAMK4CAAA6ABCvAgAApQQAMLACAQAAAAG2AkAA_wMAIckCAQD-AwAhygIBAPwDACHNAgIA_QMAIc8CAACmBM8CItACAQD-AwAh0QIBAP4DACHSAgEA_gMAIdMCAQD-AwAh1AIAAKcEACDVAgEA_gMAIQIAAAA8ACAqAAD7BQAgAgAAAPkFACAqAAD6BQAgD60CAAD4BQAwrgIAAPkFABCvAgAA-AUAMLACAQD8AwAhtgJAAP8DACHJAgEA_gMAIcoCAQD8AwAhzQICAP0DACHPAgAApgTPAiLQAgEA_gMAIdECAQD-AwAh0gIBAP4DACHTAgEA_gMAIdQCAACnBAAg1QIBAP4DACEPrQIAAPgFADCuAgAA-QUAEK8CAAD4BQAwsAIBAPwDACG2AkAA_wMAIckCAQD-AwAhygIBAPwDACHNAgIA_QMAIc8CAACmBM8CItACAQD-AwAh0QIBAP4DACHSAgEA_gMAIdMCAQD-AwAh1AIAAKcEACDVAgEA_gMAIQuwAgEA1gQAIbYCQADXBAAhyQIBAOEEACHNAgIA6wQAIc8CAADsBM8CItACAQDhBAAh0QIBAOEEACHSAgEA4QQAIdMCAQDhBAAh1AKAAAAAAdUCAQDhBAAhDAMAAO4EACCwAgEA1gQAIbYCQADXBAAhyQIBAOEEACHNAgIA6wQAIc8CAADsBM8CItACAQDhBAAh0QIBAOEEACHSAgEA4QQAIdMCAQDhBAAh1AKAAAAAAdUCAQDhBAAhDAMAAPAEACCwAgEAAAABtgJAAAAAAckCAQAAAAHNAgIAAAABzwIAAADPAgLQAgEAAAAB0QIBAAAAAdICAQAAAAHTAgEAAAAB1AKAAAAAAdUCAQAAAAEDAwAA9wQAILYCQAAAAAHJAgEAAAABAgAAADgAIDEAAIgGACADAAAAOAAgMQAAiAYAIDIAAIcGACABKgAAtQgAMAkDAACgBAAgBwAAqAQAIK0CAACrBAAwrgIAADYAEK8CAACrBAAwtgJAAP8DACHJAgEA_AMAIcoCAQD8AwAhoAMAAKoEACACAAAAOAAgKgAAhwYAIAIAAACFBgAgKgAAhgYAIAatAgAAhAYAMK4CAACFBgAQrwIAAIQGADC2AkAA_wMAIckCAQD8AwAhygIBAPwDACEGrQIAAIQGADCuAgAAhQYAEK8CAACEBgAwtgJAAP8DACHJAgEA_AMAIcoCAQD8AwAhArYCQADXBAAhyQIBANYEACEDAwAA9QQAILYCQADXBAAhyQIBANYEACEDAwAA9wQAILYCQAAAAAHJAgEAAAABBg8AAKcFACCwAgEAAAABtgJAAAAAAc8CAAAA5AIC4QICAAAAAeICAQAAAAECAAAAJAAgMQAAkQYAIAMAAAAkACAxAACRBgAgMgAAkAYAIAEqAAC0CAAwAgAAACQAICoAAJAGACACAAAAwQUAICoAAI8GACAFsAIBANYEACG2AkAA1wQAIc8CAACjBeQCIuECAgDgBAAh4gIBANYEACEGDwAApQUAILACAQDWBAAhtgJAANcEACHPAgAAowXkAiLhAgIA4AQAIeICAQDWBAAhBg8AAKcFACCwAgEAAAABtgJAAAAAAc8CAAAA5AIC4QICAAAAAeICAQAAAAEFFwAA_wQAILACAQAAAAG2AkAAAAAB1gIBAAAAAdgCAAAA2AICAgAAADIAIDEAAJ0GACADAAAAMgAgMQAAnQYAIDIAAJwGACABKgAAswgAMAsHAACoBAAgFwAAqQQAIK0CAACtBAAwrgIAADAAEK8CAACtBAAwsAIBAAAAAbYCQAD_AwAhygIBAPwDACHWAgEA_gMAIdgCAACuBNgCIqEDAACsBAAgAgAAADIAICoAAJwGACACAAAAmgYAICoAAJsGACAIrQIAAJkGADCuAgAAmgYAEK8CAACZBgAwsAIBAPwDACG2AkAA_wMAIcoCAQD8AwAh1gIBAP4DACHYAgAArgTYAiIIrQIAAJkGADCuAgAAmgYAEK8CAACZBgAwsAIBAPwDACG2AkAA_wMAIcoCAQD8AwAh1gIBAP4DACHYAgAArgTYAiIEsAIBANYEACG2AkAA1wQAIdYCAQDhBAAh2AIAAPsE2AIiBRcAAP0EACCwAgEA1gQAIbYCQADXBAAh1gIBAOEEACHYAgAA-wTYAiIFFwAA_wQAILACAQAAAAG2AkAAAAAB1gIBAAAAAdgCAAAA2AICBAMAAIcFACC2AkAAAAAByQIBAAAAAdoCAAAA2gICAgAAABMAIDEAAKkGACADAAAAEwAgMQAAqQYAIDIAAKgGACABKgAAsggAMAoDAACgBAAgBwAAqAQAIK0CAADEBAAwrgIAABEAEK8CAADEBAAwtgJAAP8DACHJAgEA_AMAIcoCAQD8AwAh2gIAAMUE2gIioAMAAMMEACACAAAAEwAgKgAAqAYAIAIAAACmBgAgKgAApwYAIAetAgAApQYAMK4CAACmBgAQrwIAAKUGADC2AkAA_wMAIckCAQD8AwAhygIBAPwDACHaAgAAxQTaAiIHrQIAAKUGADCuAgAApgYAEK8CAAClBgAwtgJAAP8DACHJAgEA_AMAIcoCAQD8AwAh2gIAAMUE2gIiA7YCQADXBAAhyQIBANYEACHaAgAAgwXaAiIEAwAAhQUAILYCQADXBAAhyQIBANYEACHaAgAAgwXaAiIEAwAAhwUAILYCQAAAAAHJAgEAAAAB2gIAAADaAgIOCAAAtgYAIAkAALcGACAOAAC4BgAgEAAAuQYAILYCQAAAAAHNAgIAAAAB5QIBAAAAAeYCAQAAAAHnAgEAAAAB6AIBAAAAAekCAQAAAAHqAgEAAAAB6wIBAAAAAewCQAAAAAECAAAALQAgMQAAtQYAIAMAAAAtACAxAAC1BgAgMgAAtAYAIAEqAACxCAAwFAcAAKgEACAIAACkBAAgCQAAsQQAIA4AAIAEACAQAACyBAAgrQIAALAEADCuAgAAFQAQrwIAALAEADC2AkAA_wMAIcoCAQD8AwAhzQICAJ0EACHlAgEA_AMAIeYCAQD-AwAh5wIBAP4DACHoAgEA_gMAIekCAQD8AwAh6gIBAP4DACHrAgEA_gMAIewCQACfBAAhogMAAK8EACACAAAALQAgKgAAtAYAIAIAAACyBgAgKgAAswYAIA6tAgAAsQYAMK4CAACyBgAQrwIAALEGADC2AkAA_wMAIcoCAQD8AwAhzQICAJ0EACHlAgEA_AMAIeYCAQD-AwAh5wIBAP4DACHoAgEA_gMAIekCAQD8AwAh6gIBAP4DACHrAgEA_gMAIewCQACfBAAhDq0CAACxBgAwrgIAALIGABCvAgAAsQYAMLYCQAD_AwAhygIBAPwDACHNAgIAnQQAIeUCAQD8AwAh5gIBAP4DACHnAgEA_gMAIegCAQD-AwAh6QIBAPwDACHqAgEA_gMAIesCAQD-AwAh7AJAAJ8EACEKtgJAANcEACHNAgIA4AQAIeUCAQDWBAAh5gIBAOEEACHnAgEA4QQAIegCAQDhBAAh6QIBANYEACHqAgEA4QQAIesCAQDhBAAh7AJAANgEACEOCAAAtQUAIAkAALYFACAOAAC3BQAgEAAAuAUAILYCQADXBAAhzQICAOAEACHlAgEA1gQAIeYCAQDhBAAh5wIBAOEEACHoAgEA4QQAIekCAQDWBAAh6gIBAOEEACHrAgEA4QQAIewCQADYBAAhDggAALYGACAJAAC3BgAgDgAAuAYAIBAAALkGACC2AkAAAAABzQICAAAAAeUCAQAAAAHmAgEAAAAB5wIBAAAAAegCAQAAAAHpAgEAAAAB6gIBAAAAAesCAQAAAAHsAkAAAAABAzEAALoGACCnAwAAuwYAIK0DAAAaACAEMQAAzgUAMKcDAADPBQAwqQMAANEFACCtAwAA0gUAMAQxAADFBQAwpwMAAMYFADCpAwAAyAUAIK0DAACSBQAwBDEAALkFADCnAwAAugUAMKkDAAC8BQAgrQMAAL0FADAXEgAAvAYAIBMAAL0GACAUAAC-BgAgFQAAvwYAIBYAAMAGACAYAADBBgAgGQAAwgYAIBoAAMMGACAbAADEBgAgHAAAxQYAILYCQAAAAAHMAkAAAAAB2wICAAAAAe4CAQAAAAHvAgIAAAAB8QIAAADxAgLyAiAAAAAB8wIgAAAAAfQCAgAAAAH1AgIAAAAB9gICAAAAAfcCAgAAAAH4AkAAAAABAgAAABoAIDEAALoGACADMQAArwgAIKcDAACwCAAgrQMAABoAIAQxAADGBgAwpwMAAMcGADCpAwAAyAYAIK0DAADSBQAwAzEAAKcIACCnAwAAqAgAIK0DAAAtACAEMQAAqgYAMKcDAACrBgAwqQMAAK0GACCtAwAArgYAMAQxAACeBgAwpwMAAJ8GADCpAwAAoQYAIK0DAACiBgAwBDEAAJIGADCnAwAAkwYAMKkDAACVBgAgrQMAAJYGADAEMQAAiQYAMKcDAACKBgAwqQMAAIwGACCtAwAAvQUAMAQxAAD9BQAwpwMAAP4FADCpAwAAgAYAIK0DAACBBgAwBDEAAPEFADCnAwAA8gUAMKkDAAD0BQAgrQMAAPUFADAEMQAA5QUAMKcDAADmBQAwqQMAAOgFACCtAwAA6QUAMBgRAADKBgAgEwAAvQYAIBQAAL4GACAVAAC_BgAgFgAAwAYAIBgAAMEGACAZAADCBgAgGgAAwwYAIBsAAMQGACAcAADFBgAgsAIBAAAAAbYCQAAAAAHMAkAAAAAB2wICAAAAAe0CAgAAAAHvAgIAAAAB8QIAAADxAgLyAiAAAAAB8wIgAAAAAfQCAgAAAAH1AgIAAAAB9gICAAAAAfcCAgAAAAH4AkAAAAABAgAAABoAIDEAAMkGACABKgAArggAMBgRAADKBgAgEwAAvQYAIBQAAL4GACAVAAC_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_BwAwMgAAwwcAMKcDAADABwAwqAMAAMEHADCpAwAAwgcAIKoDAACiBgAwqwMAAKIGADCsAwAAogYAMK0DAACiBgAwrgMAAMQHADCvAwAApQYAMAsxAAC2BwAwMgAAugcAMKcDAAC3BwAwqAMAALgHADCpAwAAuQcAIKoDAACWBgAwqwMAAJYGADCsAwAAlgYAMK0DAACWBgAwrgMAALsHADCvAwAAmQYAMAsxAACqBwAwMgAArwcAMKcDAACrBwAwqAMAAKwHADCpAwAArQcAIKoDAACuBwAwqwMAAK4HADCsAwAArgcAMK0DAACuBwAwrgMAALAHADCvAwAAsQcAMAsxAAChBwAwMgAApQcAMKcDAACiBwAwqAMAAKMHADCpAwAApAcAIKoDAACBBgAwqwMAAIEGADCsAwAAgQYAMK0DAACBBgAwrgMAAKYHADCvAwAAhAYAMAsxAACYBwAwMgAAnAcAMKcDAACZBwAwqAMAAJoHADCpAwAAmwcAIKoDAAD1BQAwqwMAAPUFADCsAwAA9QUAMK0DAAD1BQAwrgMAAJ0HADCvAwAA-AUAMAsxAACPBwAwMgAAkwcAMKcDAACQBwAwqAMAAJEHADCpAwAAkgcAIKoDAADpBQAwqwMAAOkFADCsAwAA6QUAMK0DAADpBQAwrgMAAJQHADCvAwAA7AUAMAsxAACDBwAwMgAAiAcAMKcDAACEBwAwqAMAAIUHADCpAwAAhgcAIKoDAACHBwAwqwMAAIcHADCsAwAAhwcAMK0DAACHBwAwrgMAAIkHADCvAwAAigcAMAqwAgEAAAABtgJAAAAAAdwCAQAAAAH5AgEAAAAB-gIBAAAAAfsCAgAAAAH8AgEAAAAB_QIgAAAAAf4CAQAAAAH_AgEAAAABAgAAAFYAIDEAAI4HACADAAAAVgAgMQAAjgcAIDIAAI0HACABKgAAkAgAMA8DAACgBAAgrQIAAJwEADCuAgAAVAAQrwIAAJwEADCwAgEAAAABtgJAAJ8EACHJAgEA_AMAIdwCAQD-AwAh-QIBAPwDACH6AgEA_AMAIfsCAgCdBAAh_AIBAPwDACH9AiAAngQAIf4CAQD-AwAh_wIBAP4DACECAAAAVgAgKgAAjQcAIAIAAACLBwAgKgAAjAcAIA6tAgAAigcAMK4CAACLBwAQrwIAAIoHADCwAgEA_AMAIbYCQACfBAAhyQIBAPwDACHcAgEA_gMAIfkCAQD8AwAh-gIBAPwDACH7AgIAnQQAIfwCAQD8AwAh_QIgAJ4EACH-AgEA_gMAIf8CAQD-AwAhDq0CAACKBwAwrgIAAIsHABCvAgAAigcAMLACAQD8AwAhtgJAAJ8EACHJAgEA_AMAIdwCAQD-AwAh-QIBAPwDACH6AgEA_AMAIfsCAgCdBAAh_AIBAPwDACH9AiAAngQAIf4CAQD-AwAh_wIBAP4DACEKsAIBANYEACG2AkAA2AQAIdwCAQDhBAAh-QIBANYEACH6AgEA1gQAIfsCAgDgBAAh_AIBANYEACH9AiAA2QUAIf4CAQDhBAAh_wIBAOEEACEKsAIBANYEACG2AkAA2AQAIdwCAQDhBAAh-QIBANYEACH6AgEA1gQAIfsCAgDgBAAh_AIBANYEACH9AiAA2QUAIf4CAQDhBAAh_wIBAOEEACEKsAIBAAAAAbYCQAAAAAHcAgEAAAAB-QIBAAAAAfoCAQAAAAH7AgIAAAAB_AIBAAAAAf0CIAAAAAH-AgEAAAAB_wIBAAAAAQcHAADlBAAgKoAAAAABsAIBAAAAAbYCQAAAAAHKAgEAAAABywICAAAAAcwCQAAAAAECAAAAQQAgMQAAlwcAIAMAAABBACAxAACXBwAgMgAAlgcAIAEqAACPCAAwAgAAAEEAICoAAJYHACACAAAA7QUAICoAAJUHACAGKoAAAAABsAIBANYEACG2AkAA1wQAIcoCAQDhBAAhywICAOAEACHMAkAA1wQAIQcHAADjBAAgKoAAAAABsAIBANYEACG2AkAA1wQAIcoCAQDhBAAhywICAOAEACHMAkAA1wQAIQcHAADlBAAgKoAAAAABsAIBAAAAAbYCQAAAAAHKAgEAAAABywICAAAAAcwCQAAAAAEMBwAA7wQAILACAQAAAAG2AkAAAAABygIBAAAAAc0CAgAAAAHPAgAAAM8CAtACAQAAAAHRAgEAAAAB0gIBAAAAAdMCAQAAAAHUAoAAAAAB1QIBAAAAAQIAAAA8ACAxAACgBwAgAwAAADwAIDEAAKAHACAyAACfBwAgASoAAI4IADACAAAAPAAgKgAAnwcAIAIAAAD5BQAgKgAAngcAIAuwAgEA1gQAIbYCQADXBAAhygIBANYEACHNAgIA6wQAIc8CAADsBM8CItACAQDhBAAh0QIBAOEEACHSAgEA4QQAIdMCAQDhBAAh1AKAAAAAAdUCAQDhBAAhDAcAAO0EACCwAgEA1gQAIbYCQADXBAAhygIBANYEACHNAgIA6wQAIc8CAADsBM8CItACAQDhBAAh0QIBAOEEACHSAgEA4QQAIdMCAQDhBAAh1AKAAAAAAdUCAQDhBAAhDAcAAO8EACCwAgEAAAABtgJAAAAAAcoCAQAAAAHNAgIAAAABzwIAAADPAgLQAgEAAAAB0QIBAAAAAdICAQAAAAHTAgEAAAAB1AKAAAAAAdUCAQAAAAEDBwAA9gQAILYCQAAAAAHKAgEAAAABAgAAADgAIDEAAKkHACADAAAAOAAgMQAAqQcAIDIAAKgHACABKgAAjQgAMAIAAAA4ACAqAACoBwAgAgAAAIUGACAqAACnBwAgArYCQADXBAAhygIBANYEACEDBwAA9AQAILYCQADXBAAhygIBANYEACEDBwAA9gQAILYCQAAAAAHKAgEAAAABB7ACAQAAAAGxAgEAAAABswIBAAAAAbQCAQAAAAG1AoAAAAABtgJAAAAAAbcCQAAAAAECAAAATwAgMQAAtQcAIAMAAABPACAxAAC1BwAgMgAAtAcAIAEqAACMCAAwDB8AAKAEACCtAgAAoQQAMK4CAABNABCvAgAAoQQAMLACAQAAAAGxAgEA_AMAIbICAQD8AwAhswIBAPwDACG0AgEA_AMAIbUCAACiBAAgtgJAAP8DACG3AkAAnwQAIQIAAABPACAqAAC0BwAgAgAAALIHACAqAACzBwAgC60CAACxBwAwrgIAALIHABCvAgAAsQcAMLACAQD8AwAhsQIBAPwDACGyAgEA_AMAIbMCAQD8AwAhtAIBAPwDACG1AgAAogQAILYCQAD_AwAhtwJAAJ8EACELrQIAALEHADCuAgAAsgcAEK8CAACxBwAwsAIBAPwDACGxAgEA_AMAIbICAQD8AwAhswIBAPwDACG0AgEA_AMAIbUCAACiBAAgtgJAAP8DACG3AkAAnwQAIQewAgEA1gQAIbECAQDWBAAhswIBANYEACG0AgEA1gQAIbUCgAAAAAG2AkAA1wQAIbcCQADYBAAhB7ACAQDWBAAhsQIBANYEACGzAgEA1gQAIbQCAQDWBAAhtQKAAAAAAbYCQADXBAAhtwJAANgEACEHsAIBAAAAAbECAQAAAAGzAgEAAAABtAIBAAAAAbUCgAAAAAG2AkAAAAABtwJAAAAAAQUHAAD-BAAgsAIBAAAAAbYCQAAAAAHKAgEAAAAB2AIAAADYAgICAAAAMgAgMQAAvgcAIAMAAAAyACAxAAC-BwAgMgAAvQcAIAEqAACLCAAwAgAAADIAICoAAL0HACACAAAAmgYAICoAALwHACAEsAIBANYEACG2AkAA1wQAIcoCAQDWBAAh2AIAAPsE2AIiBQcAAPwEACCwAgEA1gQAIbYCQADXBAAhygIBANYEACHYAgAA-wTYAiIFBwAA_gQAILACAQAAAAG2AkAAAAABygIBAAAAAdgCAAAA2AICBAcAAIYFACC2AkAAAAABygIBAAAAAdoCAAAA2gICAgAAABMAIDEAAMcHACADAAAAEwAgMQAAxwcAIDIAAMYHACABKgAAiggAMAIAAAATACAqAADGBwAgAgAAAKYGACAqAADFBwAgA7YCQADXBAAhygIBANYEACHaAgAAgwXaAiIEBwAAhAUAILYCQADXBAAhygIBANYEACHaAgAAgwXaAiIEBwAAhgUAILYCQAAAAAHKAgEAAAAB2gIAAADaAgIGsAIBAAAAAbYCQAAAAAHMAkAAAAABgAMBAAAAAYEDAQAAAAGCA0AAAAABAgAAAA0AIDEAANMHACADAAAADQAgMQAA0wcAIDIAANIHACABKgAAiQgAMAsDAACpBAAgrQIAAM8EADCuAgAACwAQrwIAAM8EADCwAgEAAAABtgJAAJ8EACHJAgEA_gMAIcwCQACfBAAhgAMBAPwDACGBAwEA_AMAIYIDQAD_AwAhAgAAAA0AICoAANIHACACAAAA0AcAICoAANEHACAKrQIAAM8HADCuAgAA0AcAEK8CAADPBwAwsAIBAPwDACG2AkAAnwQAIckCAQD-AwAhzAJAAJ8EACGAAwEA_AMAIYEDAQD8AwAhggNAAP8DACEKrQIAAM8HADCuAgAA0AcAEK8CAADPBwAwsAIBAPwDACG2AkAAnwQAIckCAQD-AwAhzAJAAJ8EACGAAwEA_AMAIYEDAQD8AwAhggNAAP8DACEGsAIBANYEACG2AkAA2AQAIcwCQADYBAAhgAMBANYEACGBAwEA1gQAIYIDQADXBAAhBrACAQDWBAAhtgJAANgEACHMAkAA2AQAIYADAQDWBAAhgQMBANYEACGCA0AA1wQAIQawAgEAAAABtgJAAAAAAcwCQAAAAAGAAwEAAAABgQMBAAAAAYIDQAAAAAEIsAIBAAAAAbYCQAAAAAHMAkAAAAAB0gIBAAAAAYIDQAAAAAGDAwEAAAABhAMBAAAAAYUDAQAAAAECAAAACQAgMQAA3wcAIAMAAAAJACAxAADfBwAgMgAA3gcAIAEqAACICAAwDQMAAKAEACCtAgAA0AQAMK4CAAAHABCvAgAA0AQAMLACAQAAAAG2AkAA_wMAIckCAQD8AwAhzAJAAP8DACHSAgEA_gMAIYIDQAD_AwAhgwMBAAAAAYQDAQD-AwAhhQMBAP4DACECAAAACQAgKgAA3gcAIAIAAADcBwAgKgAA3QcAIAytAgAA2wcAMK4CAADcBwAQrwIAANsHADCwAgEA_AMAIbYCQAD_AwAhyQIBAPwDACHMAkAA_wMAIdICAQD-AwAhggNAAP8DACGDAwEA_AMAIYQDAQD-AwAhhQMBAP4DACEMrQIAANsHADCuAgAA3AcAEK8CAADbBwAwsAIBAPwDACG2AkAA_wMAIckCAQD8AwAhzAJAAP8DACHSAgEA_gMAIYIDQAD_AwAhgwMBAPwDACGEAwEA_gMAIYUDAQD-AwAhCLACAQDWBAAhtgJAANcEACHMAkAA1wQAIdICAQDhBAAhggNAANcEACGDAwEA1gQAIYQDAQDhBAAhhQMBAOEEACEIsAIBANYEACG2AkAA1wQAIcwCQADXBAAh0gIBAOEEACGCA0AA1wQAIYMDAQDWBAAhhAMBAOEEACGFAwEA4QQAIQiwAgEAAAABtgJAAAAAAcwCQAAAAAHSAgEAAAABggNAAAAAAYMDAQAAAAGEAwEAAAABhQMBAAAAAQywAgEAAAABtgJAAAAAAcwCQAAAAAGGAwEAAAABhwMBAAAAAYgDAQAAAAGJAwEAAAABigNAAAAAAYsDQAAAAAGMAwEAAAABjQMBAAAAAY4DAQAAAAECAAAABQAgMQAA6wcAIAMAAAAFACAxAADrBwAgMgAA6gcAIAEqAACHCAAwEQMAAKAEACCtAgAA0QQAMK4CAAADABCvAgAA0QQAMLACAQAAAAG2AkAA_wMAIckCAQD8AwAhzAJAAP8DACGGAwEA_AMAIYcDAQD8AwAhiAMBAP4DACGJAwEA_gMAIYoDQACfBAAhiwNAAJ8EACGMAwEA_gMAIY0DAQD-AwAhjgMBAP4DACECAAAABQAgKgAA6gcAIAIAAADoBwAgKgAA6QcAIBCtAgAA5wcAMK4CAADoBwAQrwIAAOcHADCwAgEA_AMAIbYCQAD_AwAhyQIBAPwDACHMAkAA_wMAIYYDAQD8AwAhhwMBAPwDACGIAwEA_gMAIYkDAQD-AwAhigNAAJ8EACGLA0AAnwQAIYwDAQD-AwAhjQMBAP4DACGOAwEA_gMAIRCtAgAA5wcAMK4CAADoBwAQrwIAAOcHADCwAgEA_AMAIbYCQAD_AwAhyQIBAPwDACHMAkAA_wMAIYYDAQD8AwAhhwMBAPwDACGIAwEA_gMAIYkDAQD-AwAhigNAAJ8EACGLA0AAnwQAIYwDAQD-AwAhjQMBAP4DACGOAwEA_gMAIQywAgEA1gQAIbYCQADXBAAhzAJAANcEACGGAwEA1gQAIYcDAQDWBAAhiAMBAOEEACGJAwEA4QQAIYoDQADYBAAhiwNAANgEACGMAwEA4QQAIY0DAQDhBAAhjgMBAOEEACEMsAIBANYEACG2AkAA1wQAIcwCQADXBAAhhgMBANYEACGHAwEA1gQAIYgDAQDhBAAhiQMBAOEEACGKA0AA2AQAIYsDQADYBAAhjAMBAOEEACGNAwEA4QQAIY4DAQDhBAAhDLACAQAAAAG2AkAAAAABzAJAAAAAAYYDAQAAAAGHAwEAAAABiAMBAAAAAYkDAQAAAAGKA0AAAAABiwNAAAAAAYwDAQAAAAGNAwEAAAABjgMBAAAAAQQxAADgBwAwpwMAAOEHADCpAwAA4wcAIK0DAADkBwAwBDEAANQHADCnAwAA1QcAMKkDAADXBwAgrQMAANgHADAEMQAAyAcAMKcDAADJBwAwqQMAAMsHACCtAwAAzAcAMAQxAAC_BwAwpwMAAMAHADCpAwAAwgcAIK0DAACiBgAwBDEAALYHADCnAwAAtwcAMKkDAAC5BwAgrQMAAJYGADAEMQAAqgcAMKcDAACrBwAwqQMAAK0HACCtAwAArgcAMAQxAAChBwAwpwMAAKIHADCpAwAApAcAIK0DAACBBgAwBDEAAJgHADCnAwAAmQcAMKkDAACbBwAgrQMAAPUFADAEMQAAjwcAMKcDAACQBwAwqQMAAJIHACCtAwAA6QUAMAQxAACDBwAwpwMAAIQHADCpAwAAhgcAIK0DAACHBwAwAAAAAAAAAAAAABkEAAD2BwAgBQAA9wcAIAYAAPgHACAdAAD5BwAgHgAA-gcAICAAAPsHACAhAAD8BwAgIgAA_QcAICMAAP4HACAkAAD_BwAg2gIAANIEACDbAgAA0gQAINwCAADSBAAg-AIAANIEACCPAwAA0gQAIJEDAADSBAAglwMAANIEACCYAwAA0gQAIJkDAADSBAAgmgMAANIEACCbAwAA0gQAIJwDAADSBAAgnQMAANIEACCeAwAA0gQAIJ8DAADSBAAgEBEAAIQIACASAACBCAAgEwAAgggAIBQAAIQIACAVAACGCAAgFgAA-QcAIBgAAPoHACAZAACDCAAgGgAA_AcAIBsAAP0HACAcAAD-BwAg2wIAANIEACDtAgAA0gQAIO4CAADSBAAg7wIAANIEACD4AgAA0gQAIAAACwcAAIEIACAIAACBCAAgCQAAgggAIA4AAJ0FACAQAACDCAAg5gIAANIEACDnAgAA0gQAIOgCAADSBAAg6gIAANIEACDrAgAA0gQAIOwCAADSBAAgAwsAAJ0FACDbAgAA0gQAIN0CAADSBAAgAAywAgEAAAABtgJAAAAAAcwCQAAAAAGGAwEAAAABhwMBAAAAAYgDAQAAAAGJAwEAAAABigNAAAAAAYsDQAAAAAGMAwEAAAABjQMBAAAAAY4DAQAAAAEIsAIBAAAAAbYCQAAAAAHMAkAAAAAB0gIBAAAAAYIDQAAAAAGDAwEAAAABhAMBAAAAAYUDAQAAAAEGsAIBAAAAAbYCQAAAAAHMAkAAAAABgAMBAAAAAYEDAQAAAAGCA0AAAAABA7YCQAAAAAHKAgEAAAAB2gIAAADaAgIEsAIBAAAAAbYCQAAAAAHKAgEAAAAB2AIAAADYAgIHsAIBAAAAAbECAQAAAAGzAgEAAAABtAIBAAAAAbUCgAAAAAG2AkAAAAABtwJAAAAAAQK2AkAAAAABygIBAAAAAQuwAgEAAAABtgJAAAAAAcoCAQAAAAHNAgIAAAABzwIAAADPAgLQAgEAAAAB0QIBAAAAAdICAQAAAAHTAgEAAAAB1AKAAAAAAdUCAQAAAAEGKoAAAAABsAIBAAAAAbYCQAAAAAHKAgEAAAABywICAAAAAcwCQAAAAAEKsAIBAAAAAbYCQAAAAAHcAgEAAAAB-QIBAAAAAfoCAQAAAAH7AgIAAAAB_AIBAAAAAf0CIAAAAAH-AgEAAAAB_wIBAAAAAR8FAADtBwAgBgAA7gcAIB0AAO8HACAeAADwBwAgIAAA8QcAICEAAPIHACAiAADzBwAgIwAA9AcAICQAAPUHACCwAgEAAAABtgJAAAAAAcwCQAAAAAHaAgEAAAAB2wICAAAAAdwCAQAAAAH4AkAAAAABjwMBAAAAAZADIAAAAAGRAwEAAAABkwMAAACTAwKVAwAAAJUDApYDIAAAAAGXAwEAAAABmAMBAAAAAZkDgAAAAAGaA0AAAAABmwMBAAAAAZwDIAAAAAGdAwEAAAABngNAAAAAAZ8DQAAAAAECAAAAAQAgMQAAkQgAIAMAAAAPACAxAACRCAAgMgAAlQgAICEAAAAPACAFAAD6BgAgBgAA-wYAIB0AAPwGACAeAAD9BgAgIAAA_gYAICEAAP8GACAiAACABwAgIwAAgQcAICQAAIIHACAqAACVCAAgsAIBANYEACG2AkAA1wQAIcwCQADXBAAh2gIBAOEEACHbAgIA6wQAIdwCAQDhBAAh-AJAANgEACGPAwEA4QQAIZADIADZBQAhkQMBAOEEACGTAwAA9gaTAyKVAwAA9waVAyKWAyAA2QUAIZcDAQDhBAAhmAMBAOEEACGZA4AAAAABmgNAANgEACGbAwEA4QQAIZwDIAD4BgAhnQMBAOEEACGeA0AA2AQAIZ8DQADYBAAhHwUAAPoGACAGAAD7BgAgHQAA_AYAIB4AAP0GACAgAAD-BgAgIQAA_wYAICIAAIAHACAjAACBBwAgJAAAggcAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdoCAQDhBAAh2wICAOsEACHcAgEA4QQAIfgCQADYBAAhjwMBAOEEACGQAyAA2QUAIZEDAQDhBAAhkwMAAPYGkwMilQMAAPcGlQMilgMgANkFACGXAwEA4QQAIZgDAQDhBAAhmQOAAAAAAZoDQADYBAAhmwMBAOEEACGcAyAA-AYAIZ0DAQDhBAAhngNAANgEACGfA0AA2AQAIR8EAADsBwAgBgAA7gcAIB0AAO8HACAeAADwBwAgIAAA8QcAICEAAPIHACAiAADzBwAgIwAA9AcAICQAAPUHACCwAgEAAAABtgJAAAAAAcwCQAAAAAHaAgEAAAAB2wICAAAAAdwCAQAAAAH4AkAAAAABjwMBAAAAAZADIAAAAAGRAwEAAAABkwMAAACTAwKVAwAAAJUDApYDIAAAAAGXAwEAAAABmAMBAAAAAZkDgAAAAAGaA0AAAAABmwMBAAAAAZwDIAAAAAGdAwEAAAABngNAAAAAAZ8DQAAAAAECAAAAAQAgMQAAlggAIAMAAAAPACAxAACWCAAgMgAAmggAICEAAAAPACAEAAD5BgAgBgAA-wYAIB0AAPwGACAeAAD9BgAgIAAA_gYAICEAAP8GACAiAACABwAgIwAAgQcAICQAAIIHACAqAACaCAAgsAIBANYEACG2AkAA1wQAIcwCQADXBAAh2gIBAOEEACHbAgIA6wQAIdwCAQDhBAAh-AJAANgEACGPAwEA4QQAIZADIADZBQAhkQMBAOEEACGTAwAA9gaTAyKVAwAA9waVAyKWAyAA2QUAIZcDAQDhBAAhmAMBAOEEACGZA4AAAAABmgNAANgEACGbAwEA4QQAIZwDIAD4BgAhnQMBAOEEACGeA0AA2AQAIZ8DQADYBAAhHwQAAPkGACAGAAD7BgAgHQAA_AYAIB4AAP0GACAgAAD-BgAgIQAA_wYAICIAAIAHACAjAACBBwAgJAAAggcAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdoCAQDhBAAh2wICAOsEACHcAgEA4QQAIfgCQADYBAAhjwMBAOEEACGQAyAA2QUAIZEDAQDhBAAhkwMAAPYGkwMilQMAAPcGlQMilgMgANkFACGXAwEA4QQAIZgDAQDhBAAhmQOAAAAAAZoDQADYBAAhmwMBAOEEACGcAyAA-AYAIZ0DAQDhBAAhngNAANgEACGfA0AA2AQAIR8EAADsBwAgBQAA7QcAIB0AAO8HACAeAADwBwAgIAAA8QcAICEAAPIHACAiAADzBwAgIwAA9AcAICQAAPUHACCwAgEAAAABtgJAAAAAAcwCQAAAAAHaAgEAAAAB2wICAAAAAdwCAQAAAAH4AkAAAAABjwMBAAAAAZADIAAAAAGRAwEAAAABkwMAAACTAwKVAwAAAJUDApYDIAAAAAGXAwEAAAABmAMBAAAAAZkDgAAAAAGaA0AAAAABmwMBAAAAAZwDIAAAAAGdAwEAAAABngNAAAAAAZ8DQAAAAAECAAAAAQAgMQAAmwgAIAMAAAAPACAxAACbCAAgMgAAnwgAICEAAAAPACAEAAD5BgAgBQAA-gYAIB0AAPwGACAeAAD9BgAgIAAA_gYAICEAAP8GACAiAACABwAgIwAAgQcAICQAAIIHACAqAACfCAAgsAIBANYEACG2AkAA1wQAIcwCQADXBAAh2gIBAOEEACHbAgIA6wQAIdwCAQDhBAAh-AJAANgEACGPAwEA4QQAIZADIADZBQAhkQMBAOEEACGTAwAA9gaTAyKVAwAA9waVAyKWAyAA2QUAIZcDAQDhBAAhmAMBAOEEACGZA4AAAAABmgNAANgEACGbAwEA4QQAIZwDIAD4BgAhnQMBAOEEACGeA0AA2AQAIZ8DQADYBAAhHwQAAPkGACAFAAD6BgAgHQAA_AYAIB4AAP0GACAgAAD-BgAgIQAA_wYAICIAAIAHACAjAACBBwAgJAAAggcAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdoCAQDhBAAh2wICAOsEACHcAgEA4QQAIfgCQADYBAAhjwMBAOEEACGQAyAA2QUAIZEDAQDhBAAhkwMAAPYGkwMilQMAAPcGlQMilgMgANkFACGXAwEA4QQAIZgDAQDhBAAhmQOAAAAAAZoDQADYBAAhmwMBAOEEACGcAyAA-AYAIZ0DAQDhBAAhngNAANgEACGfA0AA2AQAIR8EAADsBwAgBQAA7QcAIAYAAO4HACAdAADvBwAgHgAA8AcAICAAAPEHACAhAADyBwAgIgAA8wcAICMAAPQHACCwAgEAAAABtgJAAAAAAcwCQAAAAAHaAgEAAAAB2wICAAAAAdwCAQAAAAH4AkAAAAABjwMBAAAAAZADIAAAAAGRAwEAAAABkwMAAACTAwKVAwAAAJUDApYDIAAAAAGXAwEAAAABmAMBAAAAAZkDgAAAAAGaA0AAAAABmwMBAAAAAZwDIAAAAAGdAwEAAAABngNAAAAAAZ8DQAAAAAECAAAAAQAgMQAAoAgAIAMAAAAPACAxAACgCAAgMgAApAgAICEAAAAPACAEAAD5BgAgBQAA-gYAIAYAAPsGACAdAAD8BgAgHgAA_QYAICAAAP4GACAhAAD_BgAgIgAAgAcAICMAAIEHACAqAACkCAAgsAIBANYEACG2AkAA1wQAIcwCQADXBAAh2gIBAOEEACHbAgIA6wQAIdwCAQDhBAAh-AJAANgEACGPAwEA4QQAIZADIADZBQAhkQMBAOEEACGTAwAA9gaTAyKVAwAA9waVAyKWAyAA2QUAIZcDAQDhBAAhmAMBAOEEACGZA4AAAAABmgNAANgEACGbAwEA4QQAIZwDIAD4BgAhnQMBAOEEACGeA0AA2AQAIZ8DQADYBAAhHwQAAPkGACAFAAD6BgAgBgAA-wYAIB0AAPwGACAeAAD9BgAgIAAA_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-gYAIAYAAPsGACAeAAD9BgAgIAAA_gYAICEAAP8GACAiAACABwAgIwAAgQcAICQAAIIHACAqAADfCAAgsAIBANYEACG2AkAA1wQAIcwCQADXBAAh2gIBAOEEACHbAgIA6wQAIdwCAQDhBAAh-AJAANgEACGPAwEA4QQAIZADIADZBQAhkQMBAOEEACGTAwAA9gaTAyKVAwAA9waVAyKWAyAA2QUAIZcDAQDhBAAhmAMBAOEEACGZA4AAAAABmgNAANgEACGbAwEA4QQAIZwDIAD4BgAhnQMBAOEEACGeA0AA2AQAIZ8DQADYBAAhHwQAAPkGACAFAAD6BgAgBgAA-wYAIB4AAP0GACAgAAD-BgAgIQAA_wYAICIAAIAHACAjAACBBwAgJAAAggcAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdoCAQDhBAAh2wICAOsEACHcAgEA4QQAIfgCQADYBAAhjwMBAOEEACGQAyAA2QUAIZEDAQDhBAAhkwMAAPYGkwMilQMAAPcGlQMilgMgANkFACGXAwEA4QQAIZgDAQDhBAAhmQOAAAAAAZoDQADYBAAhmwMBAOEEACGcAyAA-AYAIZ0DAQDhBAAhngNAANgEACGfA0AA2AQAIQMAAAAXACAxAADbCAAgMgAA4ggAIBsAAAAXACARAADbBQAgEgAA3AUAIBMAAN0FACAUAADQBgAgFQAA3gUAIBgAAOAFACAZAADhBQAgGgAA4gUAIBsAAOMFACAcAADkBQAgKgAA4ggAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdsCAgDrBAAh7QICAOsEACHuAgEA4QQAIe8CAgDrBAAh8QIAANgF8QIi8gIgANkFACHzAiAA2QUAIfQCAgDgBAAh9QICAOAEACH2AgIA4AQAIfcCAgDgBAAh-AJAANgEACEZEQAA2wUAIBIAANwFACATAADdBQAgFAAA0AYAIBUAAN4FACAYAADgBQAgGQAA4QUAIBoAAOIFACAbAADjBQAgHAAA5AUAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdsCAgDrBAAh7QICAOsEACHuAgEA4QQAIe8CAgDrBAAh8QIAANgF8QIi8gIgANkFACHzAiAA2QUAIfQCAgDgBAAh9QICAOAEACH2AgIA4AQAIfcCAgDgBAAh-AJAANgEACEfBAAA7AcAIAUAAO0HACAGAADuBwAgHQAA7wcAICAAAPEHACAhAADyBwAgIgAA8wcAICMAAPQHACAkAAD1BwAgsAIBAAAAAbYCQAAAAAHMAkAAAAAB2gIBAAAAAdsCAgAAAAHcAgEAAAAB-AJAAAAAAY8DAQAAAAGQAyAAAAABkQMBAAAAAZMDAAAAkwMClQMAAACVAwKWAyAAAAABlwMBAAAAAZgDAQAAAAGZA4AAAAABmgNAAAAAAZsDAQAAAAGcAyAAAAABnQMBAAAAAZ4DQAAAAAGfA0AAAAABAgAAAAEAIDEAAOMIACAZEQAAygYAIBIAALwGACATAAC9BgAgFAAAvgYAIBUAAL8GACAWAADABgAgGQAAwgYAIBoAAMMGACAbAADEBgAgHAAAxQYAILACAQAAAAG2AkAAAAABzAJAAAAAAdsCAgAAAAHtAgIAAAAB7gIBAAAAAe8CAgAAAAHxAgAAAPECAvICIAAAAAHzAiAAAAAB9AICAAAAAfUCAgAAAAH2AgIAAAAB9wICAAAAAfgCQAAAAAECAAAAGgAgMQAA5QgAIAMAAAAPACAxAADjCAAgMgAA6QgAICEAAAAPACAEAAD5BgAgBQAA-gYAIAYAAPsGACAdAAD8BgAgIAAA_gYAICEAAP8GACAiAACABwAgIwAAgQcAICQAAIIHACAqAADpCAAgsAIBANYEACG2AkAA1wQAIcwCQADXBAAh2gIBAOEEACHbAgIA6wQAIdwCAQDhBAAh-AJAANgEACGPAwEA4QQAIZADIADZBQAhkQMBAOEEACGTAwAA9gaTAyKVAwAA9waVAyKWAyAA2QUAIZcDAQDhBAAhmAMBAOEEACGZA4AAAAABmgNAANgEACGbAwEA4QQAIZwDIAD4BgAhnQMBAOEEACGeA0AA2AQAIZ8DQADYBAAhHwQAAPkGACAFAAD6BgAgBgAA-wYAIB0AAPwGACAgAAD-BgAgIQAA_wYAICIAAIAHACAjAACBBwAgJAAAggcAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdoCAQDhBAAh2wICAOsEACHcAgEA4QQAIfgCQADYBAAhjwMBAOEEACGQAyAA2QUAIZEDAQDhBAAhkwMAAPYGkwMilQMAAPcGlQMilgMgANkFACGXAwEA4QQAIZgDAQDhBAAhmQOAAAAAAZoDQADYBAAhmwMBAOEEACGcAyAA-AYAIZ0DAQDhBAAhngNAANgEACGfA0AA2AQAIQMAAAAXACAxAADlCAAgMgAA7AgAIBsAAAAXACARAADbBQAgEgAA3AUAIBMAAN0FACAUAADQBgAgFQAA3gUAIBYAAN8FACAZAADhBQAgGgAA4gUAIBsAAOMFACAcAADkBQAgKgAA7AgAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdsCAgDrBAAh7QICAOsEACHuAgEA4QQAIe8CAgDrBAAh8QIAANgF8QIi8gIgANkFACHzAiAA2QUAIfQCAgDgBAAh9QICAOAEACH2AgIA4AQAIfcCAgDgBAAh-AJAANgEACEZEQAA2wUAIBIAANwFACATAADdBQAgFAAA0AYAIBUAAN4FACAWAADfBQAgGQAA4QUAIBoAAOIFACAbAADjBQAgHAAA5AUAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdsCAgDrBAAh7QICAOsEACHuAgEA4QQAIe8CAgDrBAAh8QIAANgF8QIi8gIgANkFACHzAiAA2QUAIfQCAgDgBAAh9QICAOAEACH2AgIA4AQAIfcCAgDgBAAh-AJAANgEACEfBAAA7AcAIAUAAO0HACAGAADuBwAgHQAA7wcAIB4AAPAHACAgAADxBwAgIgAA8wcAICMAAPQHACAkAAD1BwAgsAIBAAAAAbYCQAAAAAHMAkAAAAAB2gIBAAAAAdsCAgAAAAHcAgEAAAAB-AJAAAAAAY8DAQAAAAGQAyAAAAABkQMBAAAAAZMDAAAAkwMClQMAAACVAwKWAyAAAAABlwMBAAAAAZgDAQAAAAGZA4AAAAABmgNAAAAAAZsDAQAAAAGcAyAAAAABnQMBAAAAAZ4DQAAAAAGfA0AAAAABAgAAAAEAIDEAAO0IACAZEQAAygYAIBIAALwGACATAAC9BgAgFAAAvgYAIBUAAL8GACAWAADABgAgGAAAwQYAIBkAAMIGACAbAADEBgAgHAAAxQYAILACAQAAAAG2AkAAAAABzAJAAAAAAdsCAgAAAAHtAgIAAAAB7gIBAAAAAe8CAgAAAAHxAgAAAPECAvICIAAAAAHzAiAAAAAB9AICAAAAAfUCAgAAAAH2AgIAAAAB9wICAAAAAfgCQAAAAAECAAAAGgAgMQAA7wgAIAMAAAAPACAxAADtCAAgMgAA8wgAICEAAAAPACAEAAD5BgAgBQAA-gYAIAYAAPsGACAdAAD8BgAgHgAA_QYAICAAAP4GACAiAACABwAgIwAAgQcAICQAAIIHACAqAADzCAAgsAIBANYEACG2AkAA1wQAIcwCQADXBAAh2gIBAOEEACHbAgIA6wQAIdwCAQDhBAAh-AJAANgEACGPAwEA4QQAIZADIADZBQAhkQMBAOEEACGTAwAA9gaTAyKVAwAA9waVAyKWAyAA2QUAIZcDAQDhBAAhmAMBAOEEACGZA4AAAAABmgNAANgEACGbAwEA4QQAIZwDIAD4BgAhnQMBAOEEACGeA0AA2AQAIZ8DQADYBAAhHwQAAPkGACAFAAD6BgAgBgAA-wYAIB0AAPwGACAeAAD9BgAgIAAA_gYAICIAAIAHACAjAACBBwAgJAAAggcAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdoCAQDhBAAh2wICAOsEACHcAgEA4QQAIfgCQADYBAAhjwMBAOEEACGQAyAA2QUAIZEDAQDhBAAhkwMAAPYGkwMilQMAAPcGlQMilgMgANkFACGXAwEA4QQAIZgDAQDhBAAhmQOAAAAAAZoDQADYBAAhmwMBAOEEACGcAyAA-AYAIZ0DAQDhBAAhngNAANgEACGfA0AA2AQAIQMAAAAXACAxAADvCAAgMgAA9ggAIBsAAAAXACARAADbBQAgEgAA3AUAIBMAAN0FACAUAADQBgAgFQAA3gUAIBYAAN8FACAYAADgBQAgGQAA4QUAIBsAAOMFACAcAADkBQAgKgAA9ggAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdsCAgDrBAAh7QICAOsEACHuAgEA4QQAIe8CAgDrBAAh8QIAANgF8QIi8gIgANkFACHzAiAA2QUAIfQCAgDgBAAh9QICAOAEACH2AgIA4AQAIfcCAgDgBAAh-AJAANgEACEZEQAA2wUAIBIAANwFACATAADdBQAgFAAA0AYAIBUAAN4FACAWAADfBQAgGAAA4AUAIBkAAOEFACAbAADjBQAgHAAA5AUAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdsCAgDrBAAh7QICAOsEACHuAgEA4QQAIe8CAgDrBAAh8QIAANgF8QIi8gIgANkFACHzAiAA2QUAIfQCAgDgBAAh9QICAOAEACH2AgIA4AQAIfcCAgDgBAAh-AJAANgEACEfBAAA7AcAIAUAAO0HACAGAADuBwAgHQAA7wcAIB4AAPAHACAgAADxBwAgIQAA8gcAICMAAPQHACAkAAD1BwAgsAIBAAAAAbYCQAAAAAHMAkAAAAAB2gIBAAAAAdsCAgAAAAHcAgEAAAAB-AJAAAAAAY8DAQAAAAGQAyAAAAABkQMBAAAAAZMDAAAAkwMClQMAAACVAwKWAyAAAAABlwMBAAAAAZgDAQAAAAGZA4AAAAABmgNAAAAAAZsDAQAAAAGcAyAAAAABnQMBAAAAAZ4DQAAAAAGfA0AAAAABAgAAAAEAIDEAAPcIACAZEQAAygYAIBIAALwGACATAAC9BgAgFAAAvgYAIBUAAL8GACAWAADABgAgGAAAwQYAIBkAAMIGACAaAADDBgAgHAAAxQYAILACAQAAAAG2AkAAAAABzAJAAAAAAdsCAgAAAAHtAgIAAAAB7gIBAAAAAe8CAgAAAAHxAgAAAPECAvICIAAAAAHzAiAAAAAB9AICAAAAAfUCAgAAAAH2AgIAAAAB9wICAAAAAfgCQAAAAAECAAAAGgAgMQAA-QgAIAMAAAAPACAxAAD3CAAgMgAA_QgAICEAAAAPACAEAAD5BgAgBQAA-gYAIAYAAPsGACAdAAD8BgAgHgAA_QYAICAAAP4GACAhAAD_BgAgIwAAgQcAICQAAIIHACAqAAD9CAAgsAIBANYEACG2AkAA1wQAIcwCQADXBAAh2gIBAOEEACHbAgIA6wQAIdwCAQDhBAAh-AJAANgEACGPAwEA4QQAIZADIADZBQAhkQMBAOEEACGTAwAA9gaTAyKVAwAA9waVAyKWAyAA2QUAIZcDAQDhBAAhmAMBAOEEACGZA4AAAAABmgNAANgEACGbAwEA4QQAIZwDIAD4BgAhnQMBAOEEACGeA0AA2AQAIZ8DQADYBAAhHwQAAPkGACAFAAD6BgAgBgAA-wYAIB0AAPwGACAeAAD9BgAgIAAA_gYAICEAAP8GACAjAACBBwAgJAAAggcAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdoCAQDhBAAh2wICAOsEACHcAgEA4QQAIfgCQADYBAAhjwMBAOEEACGQAyAA2QUAIZEDAQDhBAAhkwMAAPYGkwMilQMAAPcGlQMilgMgANkFACGXAwEA4QQAIZgDAQDhBAAhmQOAAAAAAZoDQADYBAAhmwMBAOEEACGcAyAA-AYAIZ0DAQDhBAAhngNAANgEACGfA0AA2AQAIQMAAAAXACAxAAD5CAAgMgAAgAkAIBsAAAAXACARAADbBQAgEgAA3AUAIBMAAN0FACAUAADQBgAgFQAA3gUAIBYAAN8FACAYAADgBQAgGQAA4QUAIBoAAOIFACAcAADkBQAgKgAAgAkAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdsCAgDrBAAh7QICAOsEACHuAgEA4QQAIe8CAgDrBAAh8QIAANgF8QIi8gIgANkFACHzAiAA2QUAIfQCAgDgBAAh9QICAOAEACH2AgIA4AQAIfcCAgDgBAAh-AJAANgEACEZEQAA2wUAIBIAANwFACATAADdBQAgFAAA0AYAIBUAAN4FACAWAADfBQAgGAAA4AUAIBkAAOEFACAaAADiBQAgHAAA5AUAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdsCAgDrBAAh7QICAOsEACHuAgEA4QQAIe8CAgDrBAAh8QIAANgF8QIi8gIgANkFACHzAiAA2QUAIfQCAgDgBAAh9QICAOAEACH2AgIA4AQAIfcCAgDgBAAh-AJAANgEACEZEQAAygYAIBIAALwGACATAAC9BgAgFAAAvgYAIBUAAL8GACAWAADABgAgGAAAwQYAIBkAAMIGACAaAADDBgAgGwAAxAYAILACAQAAAAG2AkAAAAABzAJAAAAAAdsCAgAAAAHtAgIAAAAB7gIBAAAAAe8CAgAAAAHxAgAAAPECAvICIAAAAAHzAiAAAAAB9AICAAAAAfUCAgAAAAH2AgIAAAAB9wICAAAAAfgCQAAAAAECAAAAGgAgMQAAgQkAIB8EAADsBwAgBQAA7QcAIAYAAO4HACAdAADvBwAgHgAA8AcAICAAAPEHACAhAADyBwAgIgAA8wcAICQAAPUHACCwAgEAAAABtgJAAAAAAcwCQAAAAAHaAgEAAAAB2wICAAAAAdwCAQAAAAH4AkAAAAABjwMBAAAAAZADIAAAAAGRAwEAAAABkwMAAACTAwKVAwAAAJUDApYDIAAAAAGXAwEAAAABmAMBAAAAAZkDgAAAAAGaA0AAAAABmwMBAAAAAZwDIAAAAAGdAwEAAAABngNAAAAAAZ8DQAAAAAECAAAAAQAgMQAAgwkAIAMAAAAXACAxAACBCQAgMgAAhwkAIBsAAAAXACARAADbBQAgEgAA3AUAIBMAAN0FACAUAADQBgAgFQAA3gUAIBYAAN8FACAYAADgBQAgGQAA4QUAIBoAAOIFACAbAADjBQAgKgAAhwkAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdsCAgDrBAAh7QICAOsEACHuAgEA4QQAIe8CAgDrBAAh8QIAANgF8QIi8gIgANkFACHzAiAA2QUAIfQCAgDgBAAh9QICAOAEACH2AgIA4AQAIfcCAgDgBAAh-AJAANgEACEZEQAA2wUAIBIAANwFACATAADdBQAgFAAA0AYAIBUAAN4FACAWAADfBQAgGAAA4AUAIBkAAOEFACAaAADiBQAgGwAA4wUAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdsCAgDrBAAh7QICAOsEACHuAgEA4QQAIe8CAgDrBAAh8QIAANgF8QIi8gIgANkFACHzAiAA2QUAIfQCAgDgBAAh9QICAOAEACH2AgIA4AQAIfcCAgDgBAAh-AJAANgEACEDAAAADwAgMQAAgwkAIDIAAIoJACAhAAAADwAgBAAA-QYAIAUAAPoGACAGAAD7BgAgHQAA_AYAIB4AAP0GACAgAAD-BgAgIQAA_wYAICIAAIAHACAkAACCBwAgKgAAigkAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdoCAQDhBAAh2wICAOsEACHcAgEA4QQAIfgCQADYBAAhjwMBAOEEACGQAyAA2QUAIZEDAQDhBAAhkwMAAPYGkwMilQMAAPcGlQMilgMgANkFACGXAwEA4QQAIZgDAQDhBAAhmQOAAAAAAZoDQADYBAAhmwMBAOEEACGcAyAA-AYAIZ0DAQDhBAAhngNAANgEACGfA0AA2AQAIR8EAAD5BgAgBQAA-gYAIAYAAPsGACAdAAD8BgAgHgAA_QYAICAAAP4GACAhAAD_BgAgIgAAgAcAICQAAIIHACCwAgEA1gQAIbYCQADXBAAhzAJAANcEACHaAgEA4QQAIdsCAgDrBAAh3AIBAOEEACH4AkAA2AQAIY8DAQDhBAAhkAMgANkFACGRAwEA4QQAIZMDAAD2BpMDIpUDAAD3BpUDIpYDIADZBQAhlwMBAOEEACGYAwEA4QQAIZkDgAAAAAGaA0AA2AQAIZsDAQDhBAAhnAMgAPgGACGdAwEA4QQAIZ4DQADYBAAhnwNAANgEACEfBAAA7AcAIAUAAO0HACAGAADuBwAgHQAA7wcAIB4AAPAHACAhAADyBwAgIgAA8wcAICMAAPQHACAkAAD1BwAgsAIBAAAAAbYCQAAAAAHMAkAAAAAB2gIBAAAAAdsCAgAAAAHcAgEAAAAB-AJAAAAAAY8DAQAAAAGQAyAAAAABkQMBAAAAAZMDAAAAkwMClQMAAACVAwKWAyAAAAABlwMBAAAAAZgDAQAAAAGZA4AAAAABmgNAAAAAAZsDAQAAAAGcAyAAAAABnQMBAAAAAZ4DQAAAAAGfA0AAAAABAgAAAAEAIDEAAIsJACADAAAADwAgMQAAiwkAIDIAAI8JACAhAAAADwAgBAAA-QYAIAUAAPoGACAGAAD7BgAgHQAA_AYAIB4AAP0GACAhAAD_BgAgIgAAgAcAICMAAIEHACAkAACCBwAgKgAAjwkAILACAQDWBAAhtgJAANcEACHMAkAA1wQAIdoCAQDhBAAh2wICAOsEACHcAgEA4QQAIfgCQADYBAAhjwMBAOEEACGQAyAA2QUAIZEDAQDhBAAhkwMAAPYGkwMilQMAAPcGlQMilgMgANkFACGXAwEA4QQAIZgDAQDhBAAhmQOAAAAAAZoDQADYBAAhmwMBAOEEACGcAyAA-AYAIZ0DAQDhBAAhngNAANgEACGfA0AA2AQAIR8EAAD5BgAgBQAA-gYAIAYAAPsGACAdAAD8BgAgHgAA_QYAICEAAP8GACAiAACABwAgIwAAgQcAICQAAIIHACCwAgEA1gQAIbYCQADXBAAhzAJAANcEACHaAgEA4QQAIdsCAgDrBAAh3AIBAOEEACH4AkAA2AQAIY8DAQDhBAAhkAMgANkFACGRAwEA4QQAIZMDAAD2BpMDIpUDAAD3BpUDIpYDIADZBQAhlwMBAOEEACGYAwEA4QQAIZkDgAAAAAGaA0AA2AQAIZsDAQDhBAAhnAMgAPgGACGdAwEA4QQAIZ4DQADYBAAhnwNAANgEACELBAYCBQoDBg4EDAAUHRQFHkwNIFASIVEOIlIPI1MQJFcTAQMAAQEDAAEBAxABAgMAAQcABgwMABERFgcSKQYTKgYUKwcVLgcWLwUYMw0ZNQsaOQ4bPQ8cQhAGBwAGCBgGCRsGDAAMDh8IECULAgoABw0ACQILIAgMAAoBCyEAAgcABg8ABwMJJgAOJwAQKAACBwAGFzQBAgMAAQcABgIDPgEHAAYCAwABB0MGCBNEABVFABZGABhHABlIABpJABtKABxLAAEfAAEBAwABCgRYAAVZAAZaAB1bAB5cACBdACFeACJfACNgACRhAAAAAAUMABk3ABo4ABs5ABw6AB0AAAAAAAUMABk3ABo4ABs5ABw6AB0BAwABAQMAAQMMACI5ACM6ACQAAAADDAAiOQAjOgAkAQMAAQEDAAEDDAApOQAqOgArAAAAAwwAKTkAKjoAKwEDrgEBAQO0AQEDDAAwOQAxOgAyAAAAAwwAMDkAMToAMgEDAAEBAwABBQwANzcAODgAOTkAOjoAOwAAAAAABQwANzcAODgAOTkAOjoAOwMR3AEHEt0BBhTeAQcDEeQBBxLlAQYU5gEHBQwAQDcAQTgAQjkAQzoARAAAAAAABQwAQDcAQTgAQjkAQzoARAEHAAYBBwAGBQwASTcASjgASzkATDoATQAAAAAABQwASTcASjgASzkATDoATQIKAAcNAAkCCgAHDQAJBQwAUjcAUzgAVDkAVToAVgAAAAAABQwAUjcAUzgAVDkAVToAVgIHAAYPAAcCBwAGDwAHBQwAWzcAXDgAXTkAXjoAXwAAAAAABQwAWzcAXDgAXTkAXjoAXwAABQwAZDcAZTgAZjkAZzoAaAAAAAAABQwAZDcAZTgAZjkAZzoAaAIDAAEHAAYCAwABBwAGAwwAbTkAbjoAbwAAAAMMAG05AG46AG8CBwAGF-kCAQIHAAYX7wIBAwwAdDkAdToAdgAAAAMMAHQ5AHU6AHYCAwABBwAGAgMAAQcABgMMAHs5AHw6AH0AAAADDAB7OQB8OgB9AgOXAwEHAAYCA50DAQcABgUMAIIBNwCDATgAhAE5AIUBOgCGAQAAAAAABQwAggE3AIMBOACEATkAhQE6AIYBAgMAAQevAwYCAwABB7UDBgUMAIsBNwCMATgAjQE5AI4BOgCPAQAAAAAABQwAiwE3AIwBOACNATkAjgE6AI8BAR8AAQEfAAEDDACUATkAlQE6AJYBAAAAAwwAlAE5AJUBOgCWASUCASZiASdkAShlASlmAStoASxqFS1rFi5tAS9vFTBwFzNxATRyATVzFTt2GDx3Hj14Aj55Aj96AkB7AkF8AkJ-AkOAARVEgQEfRYMBAkaFARVHhgEgSIcBAkmIAQJKiQEVS4wBIUyNASVNjgEDTo8BA0-QAQNQkQEDUZIBA1KUAQNTlgEVVJcBJlWZAQNWmwEVV5wBJ1idAQNZngEDWp8BFVuiAShcowEsXaQBBF6lAQRfpgEEYKcBBGGoAQRiqgEEY6wBFWStAS1lsAEEZrIBFWezAS5otQEEabYBBGq3ARVrugEvbLsBM228ARNuvQETb74BE3C_ARNxwAETcsIBE3PEARV0xQE0dccBE3bJARV3ygE1eMsBE3nMARN6zQEVe9ABNnzRATx90gEGftMBBn_UAQaAAdUBBoEB1gEGggHYAQaDAdoBFYQB2wE9hQHgAQaGAeIBFYcB4wE-iAHnAQaJAegBBooB6QEViwHsAT-MAe0BRY0B7gEHjgHvAQePAfABB5AB8QEHkQHyAQeSAfQBB5MB9gEVlAH3AUaVAfkBB5YB-wEVlwH8AUeYAf0BB5kB_gEHmgH_ARWbAYICSJwBgwJOnQGEAgieAYUCCJ8BhgIIoAGHAgihAYgCCKIBigIIowGMAhWkAY0CT6UBjwIIpgGRAhWnAZICUKgBkwIIqQGUAgiqAZUCFasBmAJRrAGZAletAZoCC64BmwILrwGcAguwAZ0CC7EBngILsgGgAguzAaICFbQBowJYtQGlAgu2AacCFbcBqAJZuAGpAgu5AaoCC7oBqwIVuwGuAlq8Aa8CYL0BsQIJvgGyAgm_AbUCCcABtgIJwQG3AgnCAbkCCcMBuwIVxAG8AmHFAb4CCcYBwAIVxwHBAmLIAcICCckBwwIJygHEAhXLAccCY8wByAJpzQHJAgXOAcoCBc8BywIF0AHMAgXRAc0CBdIBzwIF0wHRAhXUAdICatUB1AIF1gHWAhXXAdcCa9gB2AIF2QHZAgXaAdoCFdsB3QJs3AHeAnDdAd8CDd4B4AIN3wHhAg3gAeICDeEB4wIN4gHlAg3jAecCFeQB6AJx5QHrAg3mAe0CFecB7gJy6AHwAg3pAfECDeoB8gIV6wH1AnPsAfYCd-0B9wIO7gH4Ag7vAfkCDvAB-gIO8QH7Ag7yAf0CDvMB_wIV9AGAA3j1AYIDDvYBhAMV9wGFA3n4AYYDDvkBhwMO-gGIAxX7AYsDevwBjAN-_QGNAw_-AY4DD_8BjwMPgAKQAw-BApEDD4ICkwMPgwKVAxWEApYDf4UCmQMPhgKbAxWHApwDgAGIAp4DD4kCnwMPigKgAxWLAqMDgQGMAqQDhwGNAqUDEI4CpgMQjwKnAxCQAqgDEJECqQMQkgKrAxCTAq0DFZQCrgOIAZUCsQMQlgKzAxWXArQDiQGYArYDEJkCtwMQmgK4AxWbArsDigGcArwDkAGdAr0DEp4CvgMSnwK_AxKgAsADEqECwQMSogLDAxKjAsUDFaQCxgORAaUCyAMSpgLKAxWnAssDkgGoAswDEqkCzQMSqgLOAxWrAtEDkwGsAtIDlwE" } config.compilerWasm = { getRuntime: async () => require('./query_compiler_fast_bg.js'), diff --git a/apps/modeling-commons-backend/generated/prisma/package.json b/apps/modeling-commons-backend/generated/prisma/package.json index 20f4e41e..10a469b5 100644 --- a/apps/modeling-commons-backend/generated/prisma/package.json +++ b/apps/modeling-commons-backend/generated/prisma/package.json @@ -1,5 +1,5 @@ { - "name": "prisma-client-4dd242ce4ad453f13c2697b79e36d5f60e70552ff70717db5a99ab83cd3483ae", + "name": "prisma-client-fcaac490b84f33f683f0601ea8fa99fcb04047fea616e2c73bc77a003e98770f", "main": "index.js", "types": "index.d.ts", "browser": "default.js", diff --git a/apps/modeling-commons-backend/generated/prisma/schema.prisma b/apps/modeling-commons-backend/generated/prisma/schema.prisma index 9591b12d..492dcbd1 100644 --- a/apps/modeling-commons-backend/generated/prisma/schema.prisma +++ b/apps/modeling-commons-backend/generated/prisma/schema.prisma @@ -46,6 +46,11 @@ enum ModelInteractionKind { share } +enum ModelFileKind { + model + additional +} + // Better Auth core tables model User { @@ -210,6 +215,7 @@ model ModelVersion { versionNumber Int title String description String? + changeSummary String? previewImageFileKey String? netlogoFileKey String netlogoVersion String? @@ -223,7 +229,6 @@ model ModelVersion { latestOfModel Model? @relation("LatestVersion") parentOfModels Model[] @relation("ParentVersion") - files ModelVersionFile[] tags ModelVersionTag[] taggedAdditionalFiles ModelAdditionalFile[] @@ -231,18 +236,6 @@ model ModelVersion { @@index([modelId]) } -model ModelVersionFile { - id String @id @default(uuid()) - modelId String - versionNumber Int - fileKey String - - modelVersion ModelVersion @relation(fields: [modelId, versionNumber], references: [modelId, versionNumber], onDelete: Cascade) - - @@index([modelId, versionNumber]) - @@index([fileKey]) -} - model ModelVersionTag { modelId String versionNumber Int @@ -257,11 +250,12 @@ model ModelVersionTag { } model ModelAdditionalFile { - id String @id @default(uuid()) + id String @id @default(uuid()) modelId String taggedVersionNumber Int fileKey String - createdAt DateTime @default(now()) + kind ModelFileKind @default(additional) + createdAt DateTime @default(now()) model Model @relation(fields: [modelId], references: [id], onDelete: Cascade) taggedVersion ModelVersion @relation(fields: [modelId, taggedVersionNumber], references: [modelId, versionNumber]) diff --git a/apps/modeling-commons-backend/prisma/archive-auto-convert.ts b/apps/modeling-commons-backend/prisma/archive-auto-convert.ts new file mode 100644 index 00000000..f3e9a919 --- /dev/null +++ b/apps/modeling-commons-backend/prisma/archive-auto-convert.ts @@ -0,0 +1,232 @@ +import 'dotenv/config'; + +import path from 'node:path'; +import fs from 'fs/promises'; + +import { parseNlogo, parseNlogox } from './netlogo-utils.ts'; +import { mkdir, writeFile } from 'node:fs/promises'; +import { Dirent } from 'node:fs'; + +const seedFilesPath = path.join(import.meta.dirname, 'archive-output', 'files'); +const outputPath = path.join(import.meta.dirname, 'archive-converted'); + +// upload each file in seedFilesPath to the S3 bucket, key relative to seedFilesPath +const report = { + files: { converted: 0, skipped: 0, failed: 0 }, + versions: {} as Record, + errors: [] as { + file: string; + netlogoVersion?: string | null; + error: string; + stackTrace?: string; + }[], +}; + +const MAX_FILES = parseInt(process.env['MAX_FILES'] || '1000000', 10); +const OFFSET_INDEX = parseInt(process.env['OFFSET_INDEX'] || '0', 10); +const BATCH_SIZE = parseInt(process.env['BATCH_SIZE'] || '1', 10); + +async function $fetch(...args: Parameters): Promise { + const maxRetries = 5; + let attempt = 0; + let delay = 1000; + + while (attempt < maxRetries) { + try { + const response = await fetch(...args); + if (response.status === 503) { + throw new Error(`Service unavailable (503)`); + } + return response; + } catch (error) { + attempt++; + if (attempt >= maxRetries) { + throw new Error( + `Failed after ${maxRetries} attempts: ${error instanceof Error ? error.message : String(error)}`, + ); + } + console.warn( + `Attempt ${attempt} failed: ${error instanceof Error ? error.message : String(error)}. Retrying in ${delay}ms...`, + ); + await new Promise((resolve) => setTimeout(resolve, delay)); + delay *= 2; + } + } + throw new Error('Unexpected error in $fetch'); +} + +async function convertModel(file: Dirent) { + if (file.isFile()) { + const filePath = path.join(file.parentPath, file.name); + + const extName = path.extname(file.name).toLowerCase(); + if (['.nlogo', '.nlogo3d', '.nlogox', '.nlogox3d'].includes(extName)) { + const fileContent = await fs.readFile(filePath); + const { netlogoVersion = 'unknown' } = ['.nlogo', '.nlogo3d'].includes(extName) + ? parseNlogo(fileContent.toString()) + : parseNlogox(fileContent.toString()); + + console.info(`Processing file: ${file.name} (NetLogo version: ${netlogoVersion})`); + + try { + const formData = new FormData(); + formData.append('model', new Blob([fileContent]), file.name); + + const response = await $fetch('https://convert.netlogo.org/convert', { + method: 'POST', + body: formData, + // retry with exponential backoff on 503 or network errors, up to 5 attempts + }); + + if (!response.ok) { + const errorText = + (await response.text()) ?? + (await response + .json() + .then((json) => JSON.stringify(json)) + .catch(() => null)) ?? + 'No error details'; + handleStatus( + 'failed', + filePath, + netlogoVersion, + new Error(`Conversion failed with status ${response.status}: ${errorText}`), + { + statusCode: response.status, + responseText: errorText, + responseHeaders: Object.fromEntries(response.headers.entries()), + }, + ); + return; + } else { + const convertedContent = await readResponseStream(response); + const convertedFilename = file.name.replace(/\.nlogo(3d)?$/, '.nlogox$1'); + const relKey = path.relative( + seedFilesPath, + path.join(file.parentPath, convertedFilename), + ); + await writeLocalFile(relKey, convertedContent); + } + } catch (error) { + handleStatus( + 'failed', + filePath, + netlogoVersion, + error instanceof Error ? error : new Error(String(error)), + ); + return; + } + + handleStatus('converted', filePath, netlogoVersion); + } else { + handleStatus('skipped', filePath, 'N/A'); + return; + } + } +} + +async function convertModels() { + const allEntries = await fs.readdir(seedFilesPath, { withFileTypes: true, recursive: true }); + + const convertibleExts = ['.nlogo', '.nlogo3d', '.nlogox', '.nlogox3d']; + const files = allEntries.filter( + (f) => f.isFile() && convertibleExts.includes(path.extname(f.name).toLowerCase()), + ); + + const skippedCount = allEntries.length - files.length; + console.log( + `Found ${allEntries.length} entries, ${files.length} convertible, ${skippedCount} skipped. Starting conversion...`, + ); + report.files.skipped += skippedCount; + + function cursor() { + let lastProcessedIndex = OFFSET_INDEX - 1; + return function getNext() { + lastProcessedIndex++; + if (lastProcessedIndex >= files.length || lastProcessedIndex >= OFFSET_INDEX + MAX_FILES) { + return null; + } + return files[lastProcessedIndex]; + }; + } + + const getNext = cursor(); + + function processOne(file: Dirent | null, slot: number): Promise { + if (file === null) return Promise.resolve(); + if (!file) return Promise.resolve(); + + return convertModel(file) + .then(() => writeLocalFile(`report.json`, Buffer.from(JSON.stringify(report, null, 2)))) + .then(() => processOne(getNext(), slot)) + .catch((error) => { + console.error(`Error processing file ${file.name}:`, error); + return processOne(getNext(), slot); + }); + } + + const slots = Array.from({ length: BATCH_SIZE }, (_, i) => processOne(getNext(), i)); + await Promise.all(slots); +} + +function handleStatus( + status: 'converted' | 'skipped' | 'failed', + filePath: string, + netlogoVersion?: string | null, + error?: Error, + metadata?: Record, +): void { + if (status === 'failed' && error) { + report.errors.push({ + file: filePath, + netlogoVersion, + error: error instanceof Error ? error.message : String(error), + stackTrace: error instanceof Error ? error.stack : undefined, + ...metadata, + }); + } + report.files[status]++; + + const versionKey = netlogoVersion || 'unknown'; + report.versions[versionKey] ??= { converted: 0, skipped: 0, failed: 0 }; + report.versions[versionKey][status]++; +} + +async function writeGitIgnore() { + const gitIgnore = ` + * + !.gitignore + `; + await mkdir(outputPath, { recursive: true }); + await writeFile(path.join(outputPath, '.gitignore'), gitIgnore); +} + +async function writeLocalFile(relKey: string, contents: Buffer) { + const full = path.join(outputPath, relKey); + await mkdir(path.dirname(full), { recursive: true }); + await writeFile(full, contents); +} + +async function readResponseStream(response: Response): Promise { + const reader = response.body?.getReader(); + if (!reader) throw new Error('No response body'); + + const chunks: Uint8Array[] = []; + let done = false; + + while (!done) { + const { value, done: doneReading } = await reader.read(); + if (value) chunks.push(value); + done = doneReading; + } + + return Buffer.concat(chunks); +} + +async function runHeadless() {} + +writeGitIgnore() + .then(() => convertModels()) + .then(() => writeLocalFile('report.json', Buffer.from(JSON.stringify(report, null, 2)))) + .then(() => console.log('Conversion complete. Report written to archive-converted/report.json')) + .catch((error) => console.error('Error during conversion:', error)); diff --git a/apps/modeling-commons-backend/prisma/archive.ts b/apps/modeling-commons-backend/prisma/archive.ts index 9097aebf..e742bf31 100644 --- a/apps/modeling-commons-backend/prisma/archive.ts +++ b/apps/modeling-commons-backend/prisma/archive.ts @@ -160,7 +160,6 @@ async function wipeTarget() { TRUNCATE TABLE "ModelVersionTag", "ModelAdditionalFile", - "ModelVersionFile", "ModelVersion", "ModelAuthor", "ModelPermission", diff --git a/apps/modeling-commons-backend/prisma/migrations/20260622000000_model_file_kind_drop_version_file/migration.sql b/apps/modeling-commons-backend/prisma/migrations/20260622000000_model_file_kind_drop_version_file/migration.sql new file mode 100644 index 00000000..b00501d8 --- /dev/null +++ b/apps/modeling-commons-backend/prisma/migrations/20260622000000_model_file_kind_drop_version_file/migration.sql @@ -0,0 +1,11 @@ +-- CreateEnum +CREATE TYPE "ModelFileKind" AS ENUM ('model', 'additional'); + +-- DropForeignKey +ALTER TABLE "ModelVersionFile" DROP CONSTRAINT "ModelVersionFile_modelId_versionNumber_fkey"; + +-- DropTable +DROP TABLE "ModelVersionFile"; + +-- AlterTable +ALTER TABLE "ModelAdditionalFile" ADD COLUMN "kind" "ModelFileKind" NOT NULL DEFAULT 'additional'; diff --git a/apps/modeling-commons-backend/prisma/migrations/20260626165503_change_summary/migration.sql b/apps/modeling-commons-backend/prisma/migrations/20260626165503_change_summary/migration.sql new file mode 100644 index 00000000..9590c634 --- /dev/null +++ b/apps/modeling-commons-backend/prisma/migrations/20260626165503_change_summary/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "ModelVersion" ADD COLUMN "changeSummary" TEXT; diff --git a/apps/modeling-commons-backend/prisma/netlogo-utils.ts b/apps/modeling-commons-backend/prisma/netlogo-utils.ts new file mode 100644 index 00000000..e228c1b8 --- /dev/null +++ b/apps/modeling-commons-backend/prisma/netlogo-utils.ts @@ -0,0 +1,43 @@ +function parseNlogo(contents: string): { + netlogoVersion: string | null; + infoTab: string | null; +} { + const SEP = '@#$#@#$#@'; + const parts = contents.split(SEP); + if (parts.length < 5) return { netlogoVersion: null, infoTab: null }; + const infoTab = parts[2]?.trim() || null; + const versionRaw = parts[4]?.trim() || null; + const netlogoVersion = versionRaw && versionRaw.length < 100 ? versionRaw : null; + return { netlogoVersion, infoTab }; +} + +function parseNlogox(contents: string): { + netlogoVersion: string | null; + infoTab: string | null; +} { + try { + const parser = new DOMParser(); + const doc = parser.parseFromString(contents, 'application/xml'); + const modelEl = doc.querySelector('model'); + if (!modelEl) return { netlogoVersion: null, infoTab: null }; + const versionRaw = modelEl.getAttribute('version') ?? null; + const netlogoVersion = versionRaw + ? versionRaw.trim().replace(/^NetLogo\s*(3D)?\s*/i, '') + : null; + const infoTabEl = doc.querySelector('info'); + const infoTab = infoTabEl ? infoTabEl.textContent?.trim() || null : null; + return { netlogoVersion, infoTab }; + } catch { + return { netlogoVersion: null, infoTab: null }; + } +} + +function getNlogoFileExtension(contents: string): string { + if (contents.includes('@#$#@#$#@')) return 'nlogo'; + if (contents.includes(' { - const counter: Record = {}; - - return (prefix: string, from: number = 0) => { - if (!counter[prefix]) { - counter[prefix] = from; - } - if (prefix.length != 8) { - throw new Error(`Prefix must be 8 characters long: ${prefix}`); - } - const id = `${prefix}-0000-4000-a000-${counter[prefix].toString().padStart(12, '0')}`; - counter[prefix]++; - return id; - }; -})(); - -const ids = { - // Users - alice: '10000000-0000-4000-a000-000000000001', - bob: '10000000-0000-4000-a000-000000000002', - carol: '10000000-0000-4000-a000-000000000003', - dave: '10000000-0000-4000-a000-000000000004', - admin: '10000000-0000-4000-a000-000000000099', - - // Models - wolfSheep: '20000000-0000-4000-a000-000000000001', - fireSpread: '20000000-0000-4000-a000-000000000002', - antForaging: '20000000-0000-4000-a000-000000000003', - virusNetwork: '20000000-0000-4000-a000-000000000004', - wolfSheepFork: '20000000-0000-4000-a000-000000000005', - trafficBasic: '20000000-0000-4000-a000-000000000006', - traffic2Lanes: '20000000-0000-4000-a000-000000000007', - - // Tags - tagEcology: '50000000-0000-4000-a000-000000000001', - tagPredatorPrey: '50000000-0000-4000-a000-000000000002', - tagFire: '50000000-0000-4000-a000-000000000003', - tagEmergence: '50000000-0000-4000-a000-000000000004', - tagBiology: '50000000-0000-4000-a000-000000000005', - tagNetwork: '50000000-0000-4000-a000-000000000006', - tagEpidemiology: '50000000-0000-4000-a000-000000000007', - tagSwarmIntelligence: '50000000-0000-4000-a000-000000000008', - - // Permissions - permBobReadWolfSheep: '60000000-0000-4000-a000-000000000001', - permCarolWriteFireSpread: '60000000-0000-4000-a000-000000000002', - permPublicReadAntForaging: '60000000-0000-4000-a000-000000000003', - - // Events - event1: '70000000-0000-4000-a000-000000000001', - event2: '70000000-0000-4000-a000-000000000002', - event3: '70000000-0000-4000-a000-000000000003', - event4: '70000000-0000-4000-a000-000000000004', - event5: '70000000-0000-4000-a000-000000000005', - - // Accounts (Better Auth credential accounts) - accountAlice: '80000000-0000-4000-a000-000000000001', - accountBob: '80000000-0000-4000-a000-000000000002', - accountCarol: '80000000-0000-4000-a000-000000000003', - accountDave: '80000000-0000-4000-a000-000000000004', - accountAdmin: '80000000-0000-4000-a000-000000000099', - - // Sessions - sessionAlice: '90000000-0000-4000-a000-000000000001', - sessionBob: '90000000-0000-4000-a000-000000000002', - - // Additional files - additionalFile1: 'a0000000-0000-4000-a000-000000000001', - additionalFile2: 'a0000000-0000-4000-a000-000000000002', - - // Model version files - mvFile1: 'b0000000-0000-4000-a000-000000000001', - mvFile2: 'b0000000-0000-4000-a000-000000000002', -} as const; - -// Helpers - -function fakeNlogox(title: string): Buffer { - // Minimal placeholder representing an nlogox XML file - return Buffer.from( - `\n${title}`, - 'utf-8', - ); -} - -function fakeCsv(): Buffer { - return Buffer.from('tick,wolves,sheep\n0,50,100\n1,48,105\n2,45,112\n', 'utf-8'); -} - -function fakeReadme(): Buffer { - return Buffer.from('# Wolf Sheep Predation\n\nA classic predator-prey model.', 'utf-8'); -} - -function readInfoTab(xmlString: string): string | undefined { - return ` - # Info Tab Content - This is a placeholder for the info tab content extracted from the nlogox file. - In a real implementation, you would parse the XML and extract the relevant section. - `; -} - -function readNlogox( - filename: string, - previewImgName: string, -): { - key: string; - filename: string; - blob: Buffer; - contentType: string; - previewImage: { - key: string; - filename: string; - blob: Buffer; - contentType: string; - }; - sizeBytes: bigint; - infoTab: string | undefined; -} { - const filepath = path.join(seedFilesPath, filename); - const stats = fs.statSync(filepath); - const content = fs.readFileSync(filepath, 'utf-8'); - const infoTab = readInfoTab(content); - - const previewImagePath = path.join(seedFilesPath, previewImgName); - const imageBlob = fs.readFileSync(previewImagePath); - const previewImageExt = path.extname(previewImgName).toLowerCase(); - const mimes: Record = { - '.png': 'image/png', - '.jpg': 'image/jpeg', - '.jpeg': 'image/jpeg', - '.gif': 'image/gif', - '.bmp': 'image/bmp', - '.webp': 'image/webp', - }; - const previewImageContentType = mimes[previewImageExt] || 'application/octet-stream'; - - return { - key: 'uploads/models/' + filename, - filename, - blob: Buffer.from(content, 'utf-8'), - contentType: 'application/xml', - previewImage: { - key: `files/public/preview-images/seed/${previewImgName}`, - filename: previewImgName, - blob: imageBlob, - contentType: previewImageContentType, - }, - sizeBytes: BigInt(stats.size), - infoTab, - }; -} - -// Seed -async function main() { - console.log('Seeding database...'); - - // 1. Users - const users = [ - { - id: ids.alice, - name: 'Alice Bob', - email: 'alice@example.com', - emailVerified: true, - systemRole: 'user' as const, - userKind: 'researcher' as const, - isProfilePublic: true, - }, - { - id: ids.bob, - name: 'Bob Rand', - email: 'bob@example.com', - emailVerified: true, - systemRole: 'user' as const, - userKind: 'teacher' as const, - isProfilePublic: true, - }, - { - id: ids.carol, - name: 'Carol Tisue', - email: 'carol@example.com', - emailVerified: true, - systemRole: 'moderator' as const, - userKind: 'researcher' as const, - isProfilePublic: false, - }, - { - id: ids.dave, - name: 'Dave Student', - email: 'dave@example.com', - emailVerified: false, - systemRole: 'user' as const, - userKind: 'student' as const, - isProfilePublic: false, - }, - { - id: ids.admin, - name: 'Admin', - email: 'admin@example.com', - emailVerified: true, - systemRole: 'admin' as const, - userKind: 'other' as const, - isProfilePublic: false, - }, - ]; - - for (const u of users) { - await prisma.user.upsert({ - where: { id: u.id }, - update: {}, - create: u, - }); - } - console.log(` ✓ ${users.length} users`); - - // 2. Accounts (Better Auth credential type) - const accounts = [ - { id: ids.accountAlice, userId: ids.alice, accountId: ids.alice, providerId: ids.alice }, - { id: ids.accountBob, userId: ids.bob, accountId: ids.bob, providerId: ids.bob }, - { id: ids.accountCarol, userId: ids.carol, accountId: ids.carol, providerId: ids.carol }, - { id: ids.accountDave, userId: ids.dave, accountId: ids.dave, providerId: ids.dave }, - { id: ids.accountAdmin, userId: ids.admin, accountId: ids.admin, providerId: ids.admin }, - ]; - - for (const a of accounts) { - await prisma.account.upsert({ - where: { id: a.id }, - update: {}, - create: a, - }); - } - console.log(` ✓ ${accounts.length} accounts`); - - // 3. Sessions (active dev sessions for Alice & Bob) - const thirtyDaysFromNow = new Date(Date.now() + 30 * 24 * 60 * 60 * 1000); - const sessions = [ - { - id: ids.sessionAlice, - userId: ids.alice, - token: 'dev-session-token-alice-000001', - expiresAt: thirtyDaysFromNow, - ipAddress: '127.0.0.1', - userAgent: 'Mozilla/5.0 (seed)', - }, - { - id: ids.sessionBob, - userId: ids.bob, - token: 'dev-session-token-bob-000002', - expiresAt: thirtyDaysFromNow, - ipAddress: '127.0.0.1', - userAgent: 'Mozilla/5.0 (seed)', - }, - ]; - - for (const s of sessions) { - await prisma.session.upsert({ - where: { id: s.id }, - update: {}, - create: s, - }); - } - console.log(` ✓ ${sessions.length} sessions`); - - // 4. Tags - const tags = [ - { id: ids.tagEcology, name: 'ecology' }, - { id: ids.tagPredatorPrey, name: 'predator-prey' }, - { id: ids.tagFire, name: 'fire' }, - { id: ids.tagEmergence, name: 'emergence' }, - { id: ids.tagBiology, name: 'biology' }, - { id: ids.tagNetwork, name: 'network' }, - { id: ids.tagEpidemiology, name: 'epidemiology' }, - { id: ids.tagSwarmIntelligence, name: 'swarm-intelligence' }, - ]; - - for (const t of tags) { - await prisma.tag.upsert({ - where: { id: t.id }, - update: {}, - create: t, - }); - } - console.log(` ✓ ${tags.length} tags`); - - // 5. Files (nlogox files + supplementary) - const keys = { - virusNetworkNlogox: 'uploads/models/virus-network.nlogox', - wolfSheepReadme: 'uploads/models/wolf-sheep-readme.md', - wolfSheepData: 'uploads/models/wolf-sheep-data.csv', - fireSpreadCsv: 'uploads/models/fire-spread-data.csv', - }; - const seedNlogoxFiles = { - wolfSheepNlogox1: readNlogox('wolf-sheep-predation.nlogox', 'wolf-sheep-preview.png'), - wolfSheepNlogox2: readNlogox('wolf-sheep-predation-v2.nlogox', 'wolf-sheep-preview.png'), - wolfSheepNlogoxFork: readNlogox('wolf-sheep-predation-fork.nlogox', 'wolf-sheep-preview.png'), - trafficGridNlogox: readNlogox('traffic-grid.nlogox', 'traffic-grid-preview.png'), - trafficBasicNlogox: readNlogox('traffic-basic.nlogox', 'traffic-grid-preview.png'), - traffic2LanesNlogox: readNlogox('traffic-2-lanes.nlogox', 'traffic-2-lanes-preview.png'), - fire: readNlogox('fire.nlogox', 'fire-preview.png'), - ants: readNlogox('ants.nlogox', 'ants-preview.png'), - }; - - const files = [ - ...Object.values(seedNlogoxFiles).map((f) => ({ - key: f.key, - filename: `${f.filename}`, - contentType: f.contentType, - sizeBytes: f.sizeBytes, - blob: f.blob, - })), - { - key: keys.virusNetworkNlogox, - filename: 'virus-network.nlogox', - contentType: 'application/xml', - sizeBytes: BigInt(390) as bigint, - blob: fakeNlogox('Virus on a Network'), - }, - { - key: keys.wolfSheepReadme, - filename: 'README.md', - contentType: 'text/markdown', - sizeBytes: BigInt(58) as bigint, - blob: fakeReadme(), - }, - { - key: keys.wolfSheepData, - filename: 'initial-data.csv', - contentType: 'text/csv', - sizeBytes: BigInt(52) as bigint, - blob: fakeCsv(), - }, - { - key: keys.fireSpreadCsv, - filename: 'burn-results.csv', - contentType: 'text/csv', - sizeBytes: BigInt(52) as bigint, - blob: fakeCsv(), - }, - ]; - - for (const f of files) { - await storage.send( - new PutObjectCommand({ - Bucket: bucket.Name, - Key: f.key, - Body: f.blob, - ContentType: f.contentType, - Metadata: { - filename: f.filename, - createdAt: new Date().toISOString(), - }, - }), - ); - } - console.log(` ✓ ${files.length} files`); - - const previewImages = Array.from( - new Map( - Object.values(seedNlogoxFiles).map((f) => [f.previewImage.key, f.previewImage]), - ).values(), - ); - for (const img of previewImages) { - await storage.send( - new PutObjectCommand({ - Bucket: bucket.Name, - Key: img.key, - Body: img.blob, - ContentType: img.contentType, - ACL: 'public-read', - Metadata: { - filename: img.filename, - createdAt: new Date().toISOString(), - }, - }), - ); - } - console.log(` ✓ ${previewImages.length} preview images`); - - // 6. Models (without latestVersionId — set after versions exist) - const models = [ - { id: ids.wolfSheep, visibility: 'public' as const, isEndorsed: true }, - { id: ids.fireSpread, visibility: 'public' as const, isEndorsed: true }, - { id: ids.antForaging, visibility: 'public' as const, isEndorsed: false }, - { id: ids.virusNetwork, visibility: 'private' as const, isEndorsed: false }, - { - id: ids.wolfSheepFork, - visibility: 'unlisted' as const, - isEndorsed: false, - parentModelId: ids.wolfSheep, - }, - { id: ids.trafficBasic, visibility: 'public' as const, isEndorsed: false }, - { - id: ids.traffic2Lanes, - visibility: 'public' as const, - isEndorsed: false, - parentModelId: ids.trafficBasic, - }, - ]; - - for (const m of models) { - await prisma.model.upsert({ - where: { id: m.id }, - update: {}, - create: m, - }); - } - console.log(` ✓ ${models.length} models`); - - // 7. Model versions - const now = new Date(); - const oneWeekAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000); - - const versions = [ - { - modelId: ids.wolfSheep, - versionNumber: 1, - title: 'Wolf Sheep Predation', - description: - 'A classic predator-prey model exploring population dynamics between wolves, sheep, and grass.', - netlogoFileKey: seedNlogoxFiles.wolfSheepNlogox1.key, - netlogoVersion: '7.0.0', - infoTab: seedNlogoxFiles.wolfSheepNlogox1.infoTab, - createdAt: oneWeekAgo, - finalizedAt: now, - previewImageFileKey: seedNlogoxFiles.wolfSheepNlogox1.previewImage.key, - }, - { - modelId: ids.wolfSheep, - versionNumber: 2, - title: 'Wolf Sheep Predation', - description: 'Updated with energy-based movement and grass regrowth mechanics.', - netlogoFileKey: seedNlogoxFiles.wolfSheepNlogox2.key, - netlogoVersion: '7.0.3', - infoTab: seedNlogoxFiles.wolfSheepNlogox2.infoTab, - previewImageFileKey: seedNlogoxFiles.wolfSheepNlogox2.previewImage.key, - }, - { - modelId: ids.wolfSheepFork, - versionNumber: 1, - title: 'Wolf Sheep - Seasonal Variant', - description: 'A fork of Wolf Sheep Predation that adds seasonal grass growth patterns.', - netlogoFileKey: seedNlogoxFiles.wolfSheepNlogoxFork.key, - netlogoVersion: '7.0.0', - infoTab: seedNlogoxFiles.wolfSheepNlogoxFork.infoTab, - previewImageFileKey: seedNlogoxFiles.wolfSheepNlogoxFork.previewImage.key, - }, - { - modelId: ids.trafficBasic, - versionNumber: 1, - title: 'Traffic Basic', - description: 'A simple traffic flow model demonstrating basic congestion dynamics.', - netlogoFileKey: seedNlogoxFiles.trafficBasicNlogox.key, - netlogoVersion: '6.4.0', - infoTab: seedNlogoxFiles.trafficBasicNlogox.infoTab, - previewImageFileKey: seedNlogoxFiles.trafficBasicNlogox.previewImage.key, - }, - { - modelId: ids.trafficBasic, - versionNumber: 2, - title: 'Traffic Grid', - description: - 'An extension of the basic traffic model that simulates a grid of intersections and traffic lights.', - netlogoFileKey: seedNlogoxFiles.trafficGridNlogox.key, - netlogoVersion: '7.0.0', - infoTab: seedNlogoxFiles.trafficGridNlogox.infoTab, - previewImageFileKey: seedNlogoxFiles.trafficGridNlogox.previewImage.key, - }, - { - modelId: ids.traffic2Lanes, - versionNumber: 1, - title: 'Traffic – 2 Lanes', - description: - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros. Lorem ipsum dolor sit amet, consect etur adipiscing elit. Suspendisse varius enim in eros.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros. Suspendisse vauspendisse va.', - - netlogoFileKey: seedNlogoxFiles.traffic2LanesNlogox.key, - netlogoVersion: '7.0.0', - infoTab: seedNlogoxFiles.traffic2LanesNlogox.infoTab, - previewImageFileKey: seedNlogoxFiles.traffic2LanesNlogox.previewImage.key, - }, - { - modelId: ids.fireSpread, - versionNumber: 1, - title: 'Fire', - description: - "This project simulates the spread of a fire through a forest. It shows that the fire's chance of reaching the right edge of the forest depends critically on the density of trees. This is an example of a common feature of complex systems, the presence of a non-linear threshold or critical parameter.", - netlogoFileKey: seedNlogoxFiles.fire.key, - netlogoVersion: '6.4.0', - infoTab: '## WHAT IS IT?\n\nThis model simulates fire spreading through a forest.', - previewImageFileKey: seedNlogoxFiles.fire.previewImage.key, - }, - { - modelId: ids.antForaging, - versionNumber: 1, - title: 'Ants', - description: - 'In this project, a colony of ants forages for food. Though each ant follows a set of simple rules, the colony as a whole acts in a sophisticated way.', - netlogoFileKey: seedNlogoxFiles.ants.key, - netlogoVersion: '6.3.0', - infoTab: '## WHAT IS IT?\n\nThis model demonstrates emergent path-finding behavior.', - }, - { - modelId: ids.virusNetwork, - versionNumber: 1, - title: 'Virus on a Network', - description: - 'Explores how a virus spreads through a network topology and the impact of vaccination strategies.', - netlogoFileKey: keys.virusNetworkNlogox, - netlogoVersion: '6.4.0', - infoTab: - '## WHAT IS IT?\n\nThis model shows virus spread dynamics on various network topologies.', - }, - ]; - - for (const v of versions) { - await prisma.modelVersion.upsert({ - where: { modelId_versionNumber: { modelId: v.modelId, versionNumber: v.versionNumber } }, - update: {}, - create: v, - }); - } - console.log(` ✓ ${versions.length} model versions`); - - // 8. Set latest version pointers - const modelUpdates = [ - { id: ids.wolfSheep, data: { latestVersionNumber: 2 } }, - { id: ids.fireSpread, data: { latestVersionNumber: 1 } }, - { id: ids.antForaging, data: { latestVersionNumber: 1 } }, - { id: ids.virusNetwork, data: { latestVersionNumber: 1 } }, - { - id: ids.wolfSheepFork, - data: { latestVersionNumber: 1, parentVersionNumber: 2 }, - }, - { id: ids.trafficBasic, data: { latestVersionNumber: 2 } }, - { id: ids.traffic2Lanes, data: { latestVersionNumber: 1, parentVersionNumber: 2 } }, - ]; - - for (const m of modelUpdates) { - await prisma.model.update({ where: { id: m.id }, data: m.data }); - } - console.log(' ✓ latest version pointers set'); - - // 9. Model version files (supplementary files attached to versions) - const mvFiles = [ - { id: ids.mvFile1, modelId: ids.wolfSheep, versionNumber: 1, fileKey: keys.wolfSheepData }, - { id: ids.mvFile2, modelId: ids.wolfSheep, versionNumber: 2, fileKey: keys.wolfSheepData }, - ]; - - for (const mvf of mvFiles) { - await prisma.modelVersionFile.upsert({ - where: { id: mvf.id }, - update: {}, - create: mvf, - }); - } - console.log(` ✓ ${mvFiles.length} model version files`); - - // 10. Model version tags - const spreadTags = (modelId: string, versionNumber: number, tagIds: string[]) => - tagIds.map((tagId) => ({ modelId, versionNumber, tagId })); - - const versionTags = [ - spreadTags(ids.wolfSheep, 1, [ids.tagEcology, ids.tagPredatorPrey, ids.tagBiology]), - spreadTags(ids.wolfSheep, 2, [ - ids.tagEcology, - ids.tagPredatorPrey, - ids.tagBiology, - ids.tagEmergence, - ]), - spreadTags(ids.fireSpread, 1, [ids.tagFire, ids.tagEmergence]), - spreadTags(ids.antForaging, 1, [ids.tagBiology, ids.tagSwarmIntelligence, ids.tagEmergence]), - spreadTags(ids.virusNetwork, 1, [ids.tagNetwork, ids.tagEpidemiology, ids.tagBiology]), - spreadTags(ids.wolfSheepFork, 1, [ids.tagEcology, ids.tagPredatorPrey]), - spreadTags(ids.trafficBasic, 1, [ids.tagEmergence]), - spreadTags(ids.trafficBasic, 2, [ids.tagEmergence]), - spreadTags(ids.traffic2Lanes, 1, [ids.tagEmergence]), - ].flat(); - - for (const vt of versionTags) { - await prisma.modelVersionTag.upsert({ - where: { - modelId_versionNumber_tagId: { - modelId: vt.modelId, - versionNumber: vt.versionNumber, - tagId: vt.tagId, - }, - }, - update: {}, - create: vt, - }); - } - console.log(` ✓ ${versionTags.length} version tags`); - - // 11. Model additional files (model-level, version-tagged) - const additionalFiles = [ - { - id: ids.additionalFile1, - modelId: ids.wolfSheep, - taggedVersionNumber: 1, - fileKey: keys.wolfSheepReadme, - }, - { - id: ids.additionalFile2, - modelId: ids.fireSpread, - taggedVersionNumber: 1, - fileKey: keys.fireSpreadCsv, - }, - ]; - - for (const af of additionalFiles) { - await prisma.modelAdditionalFile.upsert({ - where: { id: af.id }, - update: {}, - create: af, - }); - } - console.log(` ✓ ${additionalFiles.length} additional files`); - - // 12. Model authors - const authors = [ - { modelId: ids.wolfSheep, userId: ids.alice, role: 'owner' as const }, - { modelId: ids.wolfSheep, userId: ids.bob, role: 'contributor' as const }, - { modelId: ids.fireSpread, userId: ids.bob, role: 'owner' as const }, - { modelId: ids.fireSpread, userId: ids.carol, role: 'contributor' as const }, - { modelId: ids.antForaging, userId: ids.carol, role: 'owner' as const }, - { modelId: ids.virusNetwork, userId: ids.alice, role: 'owner' as const }, - { modelId: ids.virusNetwork, userId: ids.carol, role: 'contributor' as const }, - { modelId: ids.wolfSheepFork, userId: ids.dave, role: 'owner' as const }, - { modelId: ids.trafficBasic, userId: ids.alice, role: 'owner' as const }, - { modelId: ids.trafficBasic, userId: ids.bob, role: 'contributor' as const }, - { modelId: ids.traffic2Lanes, userId: ids.bob, role: 'owner' as const }, - ]; - - for (const a of authors) { - await prisma.modelAuthor.upsert({ - where: { modelId_userId: { modelId: a.modelId, userId: a.userId } }, - update: {}, - create: a, - }); - } - console.log(` ✓ ${authors.length} model authors`); - - // 13. Model permissions - const permissions = [ - { - id: ids.permBobReadWolfSheep, - modelId: ids.wolfSheep, - granteeUserId: ids.bob, - permissionLevel: 'read' as const, - }, - { - id: ids.permCarolWriteFireSpread, - modelId: ids.fireSpread, - granteeUserId: ids.carol, - permissionLevel: 'write' as const, - }, - { - id: ids.permPublicReadAntForaging, - modelId: ids.antForaging, - granteeUserId: null, - permissionLevel: 'read' as const, - }, - { - id: getNonRandomUUID('60000000', 100), - modelId: ids.trafficBasic, - granteeUserId: null, - permissionLevel: 'read' as const, - }, - { - id: getNonRandomUUID('60000000', 100), - modelId: ids.traffic2Lanes, - granteeUserId: null, - permissionLevel: 'read' as const, - }, - ]; - - for (const p of permissions) { - await prisma.modelPermission.upsert({ - where: { id: p.id }, - update: {}, - create: p, - }); - } - console.log(` ✓ ${permissions.length} model permissions`); - - // 14. Events (domain event log) - const events = [ - { - id: ids.event1, - type: 'model.created', - actorId: ids.alice, - resourceType: 'model', - resourceId: ids.wolfSheep, - payload: { title: 'Wolf Sheep Predation', visibility: 'public' }, - }, - { - id: ids.event2, - type: 'model_version.created', - actorId: ids.alice, - resourceType: 'model_version', - resourceId: `${ids.wolfSheep}:1`, - payload: { modelId: ids.wolfSheep, versionNumber: 1 }, - }, - { - id: ids.event3, - type: 'model_version.created', - actorId: ids.alice, - resourceType: 'model_version', - resourceId: `${ids.wolfSheep}:2`, - payload: { modelId: ids.wolfSheep, versionNumber: 2 }, - processedAt: new Date(), - }, - { - id: ids.event4, - type: 'model.created', - actorId: ids.bob, - resourceType: 'model', - resourceId: ids.fireSpread, - payload: { title: 'Fire Spread', visibility: 'public' }, - processedAt: new Date(), - }, - { - id: ids.event5, - type: 'model.forked', - actorId: ids.dave, - resourceType: 'model', - resourceId: ids.wolfSheepFork, - payload: { parentModelId: ids.wolfSheep, parentVersionNumber: 2 }, - }, - ]; - - for (const e of events) { - await prisma.event.upsert({ - where: { id: e.id }, - update: {}, - create: e, - }); - } - console.log(` ✓ ${events.length} events`); - - console.log('\nSeed completed successfully.'); -} - -main() - .then(async () => { - await prisma.$disconnect(); - }) - .catch(async (e) => { - console.error(e); - await prisma.$disconnect(); - process.exit(1); - }); +// Entry point referenced by `prisma db seed` (see package.json). +// The seed is manifest-driven; see prisma/seed/ for the data and loaders. +import './seed/index.js'; \ No newline at end of file diff --git a/apps/modeling-commons-backend/prisma/seed/assets.ts b/apps/modeling-commons-backend/prisma/seed/assets.ts new file mode 100644 index 00000000..1a84392d --- /dev/null +++ b/apps/modeling-commons-backend/prisma/seed/assets.ts @@ -0,0 +1,194 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { PutObjectCommand } from '@aws-sdk/client-s3'; +import { s3, bucket } from './providers.js'; + +const seedFilesPath = path.join(import.meta.dirname, '..', 'seed-files'); + +const MIME_BY_EXT: Record = { + '.png': 'image/png', + '.jpg': 'image/jpeg', + '.jpeg': 'image/jpeg', + '.gif': 'image/gif', + '.bmp': 'image/bmp', + '.webp': 'image/webp', + '.nlogox': 'application/xml', + '.nlogo': 'text/plain', + '.csv': 'text/csv', + '.md': 'text/markdown', + '.txt': 'text/plain', +}; + +const PUBLIC_PREFIX = 'files/public'; + +function mimeFor(filename: string): string { + return MIME_BY_EXT[path.extname(filename).toLowerCase()] ?? 'application/octet-stream'; +} + +/** Pull the human-readable Info tab out of an nlogox file, if present. */ +function extractInfoTab(xml: string): string | undefined { + const match = xml.match(/\s*\s*<\/info>/); + return match?.[1]?.trim() || undefined; +} + +export interface NlogoxAsset { + /** S3 key for the (private) model file. */ + key: string; + filename: string; + blob: Buffer; + contentType: string; + sizeBytes: bigint; + infoTab: string | undefined; + preview?: PreviewAsset; +} + +export interface PreviewAsset { + /** Public S3 key for the preview image. */ + key: string; + filename: string; + blob: Buffer; + contentType: string; +} + +function loadPreview(previewFilename: string): PreviewAsset { + const blob = fs.readFileSync(path.join(seedFilesPath, previewFilename)); + return { + key: `${PUBLIC_PREFIX}/preview-images/seed/${previewFilename}`, + filename: previewFilename, + blob, + contentType: mimeFor(previewFilename), + }; +} + +/** Load a real `.nlogox` file shipped in `seed-files/`, with its Info tab + optional preview. */ +export function loadNlogox(filename: string, previewFilename?: string): NlogoxAsset { + const filepath = path.join(seedFilesPath, filename); + const content = fs.readFileSync(filepath, 'utf-8'); + return { + key: `uploads/models/${filename}`, + filename, + blob: Buffer.from(content, 'utf-8'), + contentType: 'application/xml', + sizeBytes: BigInt(fs.statSync(filepath).size), + infoTab: extractInfoTab(content), + preview: previewFilename ? loadPreview(previewFilename) : undefined, + }; +} + +/** + * Synthesize a placeholder `.nlogox` for a library model we don't ship a real + * file for. Cards still render (title, description, preview); the file just + * won't open in the NetLogo viewer. + */ +export function fakeNlogox(slug: string, title: string, previewFilename?: string): NlogoxAsset { + const xml = ` + + + +`; + const filename = `${slug}.nlogox`; + const blob = Buffer.from(xml, 'utf-8'); + return { + key: `uploads/models/${filename}`, + filename, + blob, + contentType: 'application/xml', + sizeBytes: BigInt(blob.byteLength), + infoTab: extractInfoTab(xml), + preview: previewFilename ? loadPreview(previewFilename) : undefined, + }; +} + +export interface SupplementaryAsset { + key: string; + filename: string; + blob: Buffer; + contentType: string; + sizeBytes: bigint; +} + +export function textAsset( + filename: string, + content: string, + keyPrefix = 'uploads/models', +): SupplementaryAsset { + const blob = Buffer.from(content, 'utf-8'); + return { + key: `${keyPrefix.replace(/\/+$/, '')}/${filename}`, + filename, + blob, + contentType: mimeFor(filename), + sizeBytes: BigInt(blob.byteLength), + }; +} + +/** + * Uploads to object storage, de-duplicated by key. Public assets (preview + * images) live under `files/public/` and are uploaded with a public-read ACL + * so `fileService.getUrl` serves them directly. + */ +export class AssetUploader { + private uploaded = new Set(); + + async put(opts: { + key: string; + body: Buffer; + contentType: string; + filename: string; + public?: boolean; + }): Promise { + if (this.uploaded.has(opts.key)) return; + await s3.send( + new PutObjectCommand({ + Bucket: bucket, + Key: opts.key, + Body: opts.body, + ContentType: opts.contentType, + ...(opts.public ? { ACL: 'public-read' } : {}), + Metadata: { filename: opts.filename, createdAt: new Date().toISOString() }, + }), + ); + this.uploaded.add(opts.key); + } + + async putNlogox(asset: NlogoxAsset): Promise { + await this.put({ + key: asset.key, + body: asset.blob, + contentType: asset.contentType, + filename: asset.filename, + }); + if (asset.preview) { + await this.put({ + key: asset.preview.key, + body: asset.preview.blob, + contentType: asset.preview.contentType, + filename: asset.preview.filename, + public: true, + }); + } + } + + async putSupplementary(asset: SupplementaryAsset): Promise { + await this.put({ + key: asset.key, + body: asset.blob, + contentType: asset.contentType, + filename: asset.filename, + }); + } + + get count(): number { + return this.uploaded.size; + } +} diff --git a/apps/modeling-commons-backend/prisma/seed/builders.ts b/apps/modeling-commons-backend/prisma/seed/builders.ts deleted file mode 100644 index 634f70bf..00000000 --- a/apps/modeling-commons-backend/prisma/seed/builders.ts +++ /dev/null @@ -1,345 +0,0 @@ -import { PutObjectCommand } from '@aws-sdk/client-s3'; -import { prisma, s3, bucket } from './providers.js'; -import { id } from './id.js'; -import type { NlogoxFile } from './files.js'; - -export class UserBuilder { - id = id('user0000'); - name = 'Unnamed User'; - email = `${this.id}@example.com`; - emailVerified = true; - systemRole: 'user' | 'moderator' | 'admin' = 'user'; - userKind: 'researcher' | 'teacher' | 'student' | 'other' = 'researcher'; - isProfilePublic = false; - - async upsert() { - await prisma.user.upsert({ - where: { id: this.id }, - update: {}, - create: { - id: this.id, - name: this.name, - email: this.email, - emailVerified: this.emailVerified, - systemRole: this.systemRole, - userKind: this.userKind, - isProfilePublic: this.isProfilePublic, - }, - }); - - // Auto-create credential account - await prisma.account.upsert({ - where: { id: id('account0') }, - update: {}, - create: { - id: id('account0'), - userId: this.id, - accountId: this.id, - providerId: this.id, - }, - }); - - return this; - } -} - -export class SessionBuilder { - id = id('session0'); - user!: UserBuilder; - token = `dev-session-token-${this.id}`; - expiresAt = new Date(Date.now() + 30 * 24 * 60 * 60 * 1000); - ipAddress = '127.0.0.1'; - userAgent = 'Mozilla/5.0 (seed)'; - - async upsert() { - await prisma.session.upsert({ - where: { id: this.id }, - update: {}, - create: { - id: this.id, - userId: this.user.id, - token: this.token, - expiresAt: this.expiresAt, - ipAddress: this.ipAddress, - userAgent: this.userAgent, - }, - }); - return this; - } -} - -export class TagBuilder { - id = id('tag00000'); - name: string; - - constructor(name: string) { - this.name = name; - } - - async upsert() { - await prisma.tag.upsert({ - where: { id: this.id }, - update: {}, - create: { id: this.id, name: this.name }, - }); - return this; - } -} - -export class FileUploader { - key: string; - body: Buffer; - contentType: string; - filename: string; - - constructor(key: string, body: Buffer, contentType: string, filename: string) { - this.key = key; - this.body = body; - this.contentType = contentType; - this.filename = filename; - } - - async upload() { - await s3.send( - new PutObjectCommand({ - Bucket: bucket, - Key: this.key, - Body: this.body, - ContentType: this.contentType, - Metadata: { - filename: this.filename, - createdAt: new Date().toISOString(), - }, - }), - ); - return this; - } - - /** Upload all nlogox files from a record of NlogoxFile values. */ - static async uploadNlogoxFiles(files: Record) { - for (const f of Object.values(files)) { - await new FileUploader(f.key, f.blob, f.contentType, f.filename).upload(); - } - } -} - -export class ModelVersionBuilder { - versionNumber!: number; - title = ''; - description = ''; - netlogoFileKey = ''; - netlogoVersion = '7.0.0'; - infoTab?: string; - createdAt?: Date; - finalizedAt?: Date; - previewImage?: Buffer; - tags: TagBuilder[] = []; - supplementaryFileKeys: string[] = []; - - // Set by ModelBuilder when adding the version - _modelId!: string; - - async upsert() { - const data: Record = { - modelId: this._modelId, - versionNumber: this.versionNumber, - title: this.title, - description: this.description, - netlogoFileKey: this.netlogoFileKey, - netlogoVersion: this.netlogoVersion, - infoTab: this.infoTab, - }; - if (this.createdAt) data.createdAt = this.createdAt; - if (this.finalizedAt) data.finalizedAt = this.finalizedAt; - if (this.previewImage) data.previewImage = this.previewImage; - - await prisma.modelVersion.upsert({ - where: { - modelId_versionNumber: { - modelId: this._modelId, - versionNumber: this.versionNumber, - }, - }, - update: {}, - // @ts-expect-error -- Shared vs. Non-Shared Buffer - create: data, - }); - - // Tags - for (const tag of this.tags) { - await prisma.modelVersionTag.upsert({ - where: { - modelId_versionNumber_tagId: { - modelId: this._modelId, - versionNumber: this.versionNumber, - tagId: tag.id, - }, - }, - update: {}, - create: { - modelId: this._modelId, - versionNumber: this.versionNumber, - tagId: tag.id, - }, - }); - } - - // Supplementary files - for (const fileKey of this.supplementaryFileKeys) { - await prisma.modelVersionFile.upsert({ - where: { id: id('mvfile000') }, - update: {}, - create: { - id: id('mvfile000'), - modelId: this._modelId, - versionNumber: this.versionNumber, - fileKey, - }, - }); - } - - return this; - } - - /** Convenience: populate from a NlogoxFile */ - fromNlogox(nlogox: NlogoxFile) { - this.netlogoFileKey = nlogox.key; - this.infoTab = nlogox.infoTab; - this.previewImage = nlogox.previewImage.blob; - return this; - } -} - -export class ModelBuilder { - id = id('model000'); - visibility: 'public' | 'private' | 'unlisted' = 'public'; - isEndorsed = false; - - parent?: ModelBuilder; - parentVersionNumber?: number; - latestVersionNumber = 1; - - private _versions: ModelVersionBuilder[] = []; - private _authors: { user: UserBuilder; role: 'owner' | 'contributor' }[] = []; - private _permissions: { granteeUserId: string | null; permissionLevel: 'read' | 'write' }[] = []; - private _additionalFiles: { taggedVersionNumber: number; fileKey: string }[] = []; - - addVersion(v: ModelVersionBuilder) { - v._modelId = this.id; - this._versions.push(v); - this.latestVersionNumber = Math.max(this.latestVersionNumber, v.versionNumber); - return this; - } - - addAuthor(user: UserBuilder, role: 'owner' | 'contributor' = 'contributor') { - this._authors.push({ user, role }); - return this; - } - - addPermission(granteeUserId: string | null, level: 'read' | 'write' = 'read') { - this._permissions.push({ granteeUserId, permissionLevel: level }); - return this; - } - - addAdditionalFile(taggedVersionNumber: number, fileKey: string) { - this._additionalFiles.push({ taggedVersionNumber, fileKey }); - return this; - } - - async upsert() { - // Model record - await prisma.model.upsert({ - where: { id: this.id }, - update: {}, - create: { - id: this.id, - visibility: this.visibility, - isEndorsed: this.isEndorsed, - ...(this.parent && { parentModelId: this.parent.id }), - }, - }); - - // Versions - for (const v of this._versions) { - await v.upsert(); - } - - // Set latest version pointer + parent version - await prisma.model.update({ - where: { id: this.id }, - data: { - latestVersionNumber: this.latestVersionNumber, - ...(this.parentVersionNumber != null && { - parentVersionNumber: this.parentVersionNumber, - }), - }, - }); - - // Authors - for (const a of this._authors) { - await prisma.modelAuthor.upsert({ - where: { modelId_userId: { modelId: this.id, userId: a.user.id } }, - update: {}, - create: { modelId: this.id, userId: a.user.id, role: a.role }, - }); - } - - // Permissions - for (const p of this._permissions) { - const permId = id('perm0000'); - await prisma.modelPermission.upsert({ - where: { id: permId }, - update: {}, - create: { - id: permId, - modelId: this.id, - granteeUserId: p.granteeUserId, - permissionLevel: p.permissionLevel, - }, - }); - } - - // Additional files - for (const af of this._additionalFiles) { - await prisma.modelAdditionalFile.upsert({ - where: { id: id('addfile00') }, - update: {}, - create: { - id: id('addfile00'), - modelId: this.id, - taggedVersionNumber: af.taggedVersionNumber, - fileKey: af.fileKey, - }, - }); - } - - return this; - } -} - -export class EventBuilder { - id = id('event000'); - type = ''; - actor!: UserBuilder; - resourceType = ''; - resourceId = ''; - payload: Record = {}; - processedAt?: Date; - - async upsert() { - await prisma.event.upsert({ - where: { id: this.id }, - update: {}, - create: { - id: this.id, - type: this.type, - actorId: this.actor.id, - resourceType: this.resourceType, - resourceId: this.resourceId, - payload: this.payload, - ...(this.processedAt && { processedAt: this.processedAt }), - }, - }); - return this; - } -} diff --git a/apps/modeling-commons-backend/prisma/seed/files.ts b/apps/modeling-commons-backend/prisma/seed/files.ts deleted file mode 100644 index b2d50779..00000000 --- a/apps/modeling-commons-backend/prisma/seed/files.ts +++ /dev/null @@ -1,68 +0,0 @@ -import fs from 'node:fs'; -import path from 'node:path'; - -const seedFilesPath = path.join(import.meta.dirname, 'seed-files'); - -const MIME_BY_EXT: Record = { - '.png': 'image/png', - '.jpg': 'image/jpeg', - '.jpeg': 'image/jpeg', - '.gif': 'image/gif', - '.bmp': 'image/bmp', - '.webp': 'image/webp', -}; - -function readInfoTab(_xmlContent: string): string { - return ` - # Info Tab Content - This is a placeholder for the info tab content extracted from the nlogox file. - In a real implementation, you would parse the XML and extract the relevant section. - `; -} - -export interface NlogoxFile { - key: string; - filename: string; - blob: Buffer; - contentType: 'application/xml'; - sizeBytes: bigint; - infoTab: string; - previewImage: { blob: Buffer; contentType: string }; -} - -export function readNlogox(filename: string, previewImg: string): NlogoxFile { - const filepath = path.join(seedFilesPath, filename); - const stats = fs.statSync(filepath); - const content = fs.readFileSync(filepath, 'utf-8'); - - const previewPath = path.join(seedFilesPath, previewImg); - const ext = path.extname(previewImg).toLowerCase(); - - return { - key: `uploads/models/${filename}`, - filename, - blob: Buffer.from(content, 'utf-8'), - contentType: 'application/xml', - sizeBytes: BigInt(stats.size), - infoTab: readInfoTab(content), - previewImage: { - blob: fs.readFileSync(previewPath), - contentType: MIME_BY_EXT[ext] || 'application/octet-stream', - }, - }; -} - -export function fakeNlogox(title: string): Buffer { - return Buffer.from( - `\n${title}`, - 'utf-8', - ); -} - -export function fakeCsv(): Buffer { - return Buffer.from('tick,wolves,sheep\n0,50,100\n1,48,105\n2,45,112\n', 'utf-8'); -} - -export function fakeReadme(): Buffer { - return Buffer.from('# Wolf Sheep Predation\n\nA classic predator-prey model.', 'utf-8'); -} diff --git a/apps/modeling-commons-backend/prisma/seed/id.ts b/apps/modeling-commons-backend/prisma/seed/id.ts index cf964256..2e3cf609 100644 --- a/apps/modeling-commons-backend/prisma/seed/id.ts +++ b/apps/modeling-commons-backend/prisma/seed/id.ts @@ -1,16 +1,45 @@ -const counters: Record = {}; +import { createHash } from 'node:crypto'; + +const SEED_NAMESPACE = 'modeling-commons:seed'; /** - * Deterministic UUID-shaped string, auto-incrementing per prefix. - * Prefix is padded/truncated to 8 chars. + * Deterministic, UUID-shaped id derived from a stable natural key. + * + * The same parts always produce the same id, so every record can be upserted + * by id and the whole seed is idempotent across runs - no fragile call-order + * counters. Output is a valid v5-style UUID (version + variant bits set). * - * id('user') => 'user0000-0000-4000-a000-000000000000' - * id('user') => 'user0000-0000-4000-a000-000000000001' + * seedId('user', 'alice') => 'a1b2...' + * seedId('model', 'wolf-sheep') => 'c3d4...' + */ +export function seedId(...parts: Array): string { + const name = `${SEED_NAMESPACE}:${parts.join(':')}`; + const bytes = createHash('sha1').update(name).digest().subarray(0, 16); + + bytes[6] = (bytes[6]! & 0x0f) | 0x50; // version 5 + bytes[8] = (bytes[8]! & 0x3f) | 0x80; // RFC 4122 variant + + const hex = Buffer.from(bytes).toString('hex'); + return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`; +} + +/** + * Tiny deterministic PRNG (mulberry32) seeded from a string. Used to scatter + * timestamps / pick pools when generating engagement data so the seed produces + * the same realistic-looking spread on every run. */ -export function id(prefix: string): string { - const padded = prefix.slice(0, 8).padEnd(8, '0'); - counters[padded] ??= 0; - const suffix = counters[padded].toString().padStart(12, '0'); - counters[padded]++; - return `${padded}-0000-4000-a000-${suffix}`; +export function seededRandom(seed: string): () => number { + let h = 1779033703 ^ seed.length; + for (let i = 0; i < seed.length; i++) { + h = Math.imul(h ^ seed.charCodeAt(i), 3432918353); + h = (h << 13) | (h >>> 19); + } + let a = h >>> 0; + return () => { + a |= 0; + a = (a + 0x6d2b79f5) | 0; + let t = Math.imul(a ^ (a >>> 15), 1 | a); + t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t; + return ((t ^ (t >>> 14)) >>> 0) / 4294967296; + }; } diff --git a/apps/modeling-commons-backend/prisma/seed/index.ts b/apps/modeling-commons-backend/prisma/seed/index.ts index 81af1f91..27434c41 100644 --- a/apps/modeling-commons-backend/prisma/seed/index.ts +++ b/apps/modeling-commons-backend/prisma/seed/index.ts @@ -1,329 +1,38 @@ import { prisma } from './providers.js'; +import { AssetUploader } from './assets.js'; +import { USERS, TAGS, MODELS, DRAFTS } from './manifest/index.js'; import { - UserBuilder, - SessionBuilder, - TagBuilder, - FileUploader, - ModelBuilder, - ModelVersionBuilder, - EventBuilder, -} from './builders.js'; -import { readNlogox, fakeNlogox, fakeCsv, fakeReadme } from './files.js'; + loadUsers, + loadTags, + loadModels, + loadEngagement, + loadDrafts, + type IdMap, +} from './loaders.js'; async function main() { - console.log('Seeding database...'); + console.log('Seeding database from manifest...'); + const uploader = new AssetUploader(); - const alice = new UserBuilder(); - alice.name = 'Alice Bob'; - alice.email = 'alice@example.com'; - alice.userKind = 'researcher'; - alice.isProfilePublic = true; - await alice.upsert(); + const users = await loadUsers(USERS); + console.log(` ✓ ${users.size} users (+ credential accounts, dev sessions)`); - const bob = new UserBuilder(); - bob.name = 'Bob Rand'; - bob.email = 'bob@example.com'; - bob.userKind = 'teacher'; - bob.isProfilePublic = true; - await bob.upsert(); + const tags = await loadTags(TAGS); + console.log(` ✓ ${tags.size} tags`); - const carol = new UserBuilder(); - carol.name = 'Carol Tisue'; - carol.email = 'carol@example.com'; - carol.systemRole = 'moderator'; - carol.userKind = 'researcher'; - await carol.upsert(); + const models = await loadModels(MODELS, users, tags, uploader); + console.log(` ✓ ${models.length} models with versions, authors, permissions, files`); + console.log(` ✓ ${uploader.count} objects uploaded to storage`); - const dave = new UserBuilder(); - dave.name = 'Dave Student'; - dave.email = 'dave@example.com'; - dave.emailVerified = false; - dave.userKind = 'student'; - await dave.upsert(); - - const admin = new UserBuilder(); - admin.name = 'Admin'; - admin.email = 'admin@example.com'; - admin.systemRole = 'admin'; - admin.userKind = 'other'; - await admin.upsert(); - - console.log(' ✓ 5 users + accounts'); - - const sessionAlice = new SessionBuilder(); - sessionAlice.user = alice; - sessionAlice.token = 'dev-session-token-alice-000001'; - await sessionAlice.upsert(); - - const sessionBob = new SessionBuilder(); - sessionBob.user = bob; - sessionBob.token = 'dev-session-token-bob-000002'; - await sessionBob.upsert(); - - console.log(' ✓ 2 sessions'); - - const ecology = new TagBuilder('ecology'); - const predatorPrey = new TagBuilder('predator-prey'); - const fire = new TagBuilder('fire'); - const emergence = new TagBuilder('emergence'); - const biology = new TagBuilder('biology'); - const network = new TagBuilder('network'); - const epidemiology = new TagBuilder('epidemiology'); - const swarmIntelligence = new TagBuilder('swarm-intelligence'); - - await Promise.all( - [ecology, predatorPrey, fire, emergence, biology, network, epidemiology, swarmIntelligence].map( - (t) => t.upsert(), - ), + const engagement = await loadEngagement(models, users); + console.log( + ` ✓ ${engagement.likes} likes, ${engagement.interactions} interactions, ${engagement.events} audit events`, ); - console.log(' ✓ 8 tags'); - - const nlogoxFiles = { - wolfSheepV1: readNlogox('wolf-sheep-predation.nlogox', 'wolf-sheep-preview.png'), - wolfSheepV2: readNlogox('wolf-sheep-predation-v2.nlogox', 'wolf-sheep-preview.png'), - wolfSheepFork: readNlogox('wolf-sheep-predation-fork.nlogox', 'wolf-sheep-preview.png'), - trafficGrid: readNlogox('traffic-grid.nlogox', 'traffic-grid-preview.png'), - trafficBasic: readNlogox('traffic-basic.nlogox', 'traffic-grid-preview.png'), - traffic2Lanes: readNlogox('traffic-2-lanes.nlogox', 'traffic-2-lanes-preview.png'), - fire: readNlogox('fire.nlogox', 'fire-preview.png'), - ants: readNlogox('ants.nlogox', 'ants-preview.png'), - }; - - const extraKeys = { - virusNetwork: 'uploads/models/virus-network.nlogox', - wolfSheepReadme: 'uploads/models/wolf-sheep-readme.md', - wolfSheepData: 'uploads/models/wolf-sheep-data.csv', - fireSpreadCsv: 'uploads/models/fire-spread-data.csv', - }; - - await FileUploader.uploadNlogoxFiles(nlogoxFiles); - await new FileUploader( - extraKeys.virusNetwork, - fakeNlogox('Virus on a Network'), - 'application/xml', - 'virus-network.nlogox', - ).upload(); - await new FileUploader( - extraKeys.wolfSheepReadme, - fakeReadme(), - 'text/markdown', - 'README.md', - ).upload(); - await new FileUploader( - extraKeys.wolfSheepData, - fakeCsv(), - 'text/csv', - 'initial-data.csv', - ).upload(); - await new FileUploader( - extraKeys.fireSpreadCsv, - fakeCsv(), - 'text/csv', - 'burn-results.csv', - ).upload(); - console.log(' ✓ files uploaded'); - - const now = new Date(); - const oneWeekAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000); - - // Wolf Sheep Predation - const wolfSheepV1 = new ModelVersionBuilder(); - wolfSheepV1.versionNumber = 1; - wolfSheepV1.title = 'Wolf Sheep Predation'; - wolfSheepV1.description = - 'A classic predator-prey model exploring population dynamics between wolves, sheep, and grass.'; - wolfSheepV1.fromNlogox(nlogoxFiles.wolfSheepV1); - wolfSheepV1.netlogoVersion = '7.0.0'; - wolfSheepV1.createdAt = oneWeekAgo; - wolfSheepV1.finalizedAt = now; - wolfSheepV1.tags = [ecology, predatorPrey, biology]; - wolfSheepV1.supplementaryFileKeys = [extraKeys.wolfSheepData]; - - const wolfSheepV2 = new ModelVersionBuilder(); - wolfSheepV2.versionNumber = 2; - wolfSheepV2.title = 'Wolf Sheep Predation'; - wolfSheepV2.description = 'Updated with energy-based movement and grass regrowth mechanics.'; - wolfSheepV2.fromNlogox(nlogoxFiles.wolfSheepV2); - wolfSheepV2.netlogoVersion = '7.0.3'; - wolfSheepV2.tags = [ecology, predatorPrey, biology, emergence]; - wolfSheepV2.supplementaryFileKeys = [extraKeys.wolfSheepData]; - - const wolfSheep = new ModelBuilder(); - wolfSheep.isEndorsed = true; - wolfSheep.addVersion(wolfSheepV1); - wolfSheep.addVersion(wolfSheepV2); - wolfSheep.addAuthor(alice, 'owner'); - wolfSheep.addAuthor(bob, 'contributor'); - wolfSheep.addPermission(bob.id, 'read'); - wolfSheep.addAdditionalFile(1, extraKeys.wolfSheepReadme); - await wolfSheep.upsert(); - - // Fire Spread - const fireV1 = new ModelVersionBuilder(); - fireV1.versionNumber = 1; - fireV1.title = 'Fire'; - fireV1.description = - "This project simulates the spread of a fire through a forest. It shows that the fire's chance of reaching the right edge of the forest depends critically on the density of trees. This is an example of a common feature of complex systems, the presence of a non-linear threshold or critical parameter."; - fireV1.fromNlogox(nlogoxFiles.fire); - fireV1.netlogoVersion = '6.4.0'; - fireV1.infoTab = '## WHAT IS IT?\n\nThis model simulates fire spreading through a forest.'; - fireV1.tags = [fire, emergence]; - - const fireSpread = new ModelBuilder(); - fireSpread.isEndorsed = true; - fireSpread.addVersion(fireV1); - fireSpread.addAuthor(bob, 'owner'); - fireSpread.addAuthor(carol, 'contributor'); - fireSpread.addPermission(carol.id, 'write'); - fireSpread.addAdditionalFile(1, extraKeys.fireSpreadCsv); - await fireSpread.upsert(); - - // Ant Foraging - const antsV1 = new ModelVersionBuilder(); - antsV1.versionNumber = 1; - antsV1.title = 'Ants'; - antsV1.description = - 'In this project, a colony of ants forages for food. Though each ant follows a set of simple rules, the colony as a whole acts in a sophisticated way.'; - antsV1.fromNlogox(nlogoxFiles.ants); - antsV1.netlogoVersion = '6.3.0'; - antsV1.infoTab = '## WHAT IS IT?\n\nThis model demonstrates emergent path-finding behavior.'; - antsV1.tags = [biology, swarmIntelligence, emergence]; - - const antForaging = new ModelBuilder(); - antForaging.addVersion(antsV1); - antForaging.addAuthor(carol, 'owner'); - antForaging.addPermission(null, 'read'); - await antForaging.upsert(); - - // Virus on a Network - const virusV1 = new ModelVersionBuilder(); - virusV1.versionNumber = 1; - virusV1.title = 'Virus on a Network'; - virusV1.description = - 'Explores how a virus spreads through a network topology and the impact of vaccination strategies.'; - virusV1.netlogoFileKey = extraKeys.virusNetwork; - virusV1.netlogoVersion = '6.4.0'; - virusV1.infoTab = - '## WHAT IS IT?\n\nThis model shows virus spread dynamics on various network topologies.'; - virusV1.tags = [network, epidemiology, biology]; - - const virusNetwork = new ModelBuilder(); - virusNetwork.visibility = 'private'; - virusNetwork.addVersion(virusV1); - virusNetwork.addAuthor(alice, 'owner'); - virusNetwork.addAuthor(carol, 'contributor'); - await virusNetwork.upsert(); - - // Wolf Sheep Fork - const wolfSheepForkV1 = new ModelVersionBuilder(); - wolfSheepForkV1.versionNumber = 1; - wolfSheepForkV1.title = 'Wolf Sheep - Seasonal Variant'; - wolfSheepForkV1.description = - 'A fork of Wolf Sheep Predation that adds seasonal grass growth patterns.'; - wolfSheepForkV1.fromNlogox(nlogoxFiles.wolfSheepFork); - wolfSheepForkV1.netlogoVersion = '7.0.0'; - wolfSheepForkV1.tags = [ecology, predatorPrey]; - - const wolfSheepFork = new ModelBuilder(); - wolfSheepFork.visibility = 'unlisted'; - wolfSheepFork.parent = wolfSheep; - wolfSheepFork.parentVersionNumber = 2; - wolfSheepFork.addVersion(wolfSheepForkV1); - wolfSheepFork.addAuthor(dave, 'owner'); - await wolfSheepFork.upsert(); - - // Traffic Basic - const trafficBasicV1 = new ModelVersionBuilder(); - trafficBasicV1.versionNumber = 1; - trafficBasicV1.title = 'Traffic Basic'; - trafficBasicV1.description = - 'A simple traffic flow model demonstrating basic congestion dynamics.'; - trafficBasicV1.fromNlogox(nlogoxFiles.trafficBasic); - trafficBasicV1.netlogoVersion = '6.4.0'; - trafficBasicV1.tags = [emergence]; - - const trafficBasicV2 = new ModelVersionBuilder(); - trafficBasicV2.versionNumber = 2; - trafficBasicV2.title = 'Traffic Grid'; - trafficBasicV2.description = - 'An extension of the basic traffic model that simulates a grid of intersections and traffic lights.'; - trafficBasicV2.fromNlogox(nlogoxFiles.trafficGrid); - trafficBasicV2.netlogoVersion = '7.0.0'; - trafficBasicV2.tags = [emergence]; - - const trafficBasic = new ModelBuilder(); - trafficBasic.addVersion(trafficBasicV1); - trafficBasic.addVersion(trafficBasicV2); - trafficBasic.addAuthor(alice, 'owner'); - trafficBasic.addAuthor(bob, 'contributor'); - trafficBasic.addPermission(null, 'read'); - await trafficBasic.upsert(); - - // Traffic 2 Lanes - const traffic2LanesV1 = new ModelVersionBuilder(); - traffic2LanesV1.versionNumber = 1; - traffic2LanesV1.title = 'Traffic – 2 Lanes'; - traffic2LanesV1.description = - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros. Lorem ipsum dolor sit amet, consect etur adipiscing elit. Suspendisse varius enim in eros.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros. Suspendisse vauspendisse va.'; - traffic2LanesV1.fromNlogox(nlogoxFiles.traffic2Lanes); - traffic2LanesV1.netlogoVersion = '7.0.0'; - traffic2LanesV1.tags = [emergence]; - - const traffic2Lanes = new ModelBuilder(); - traffic2Lanes.parent = trafficBasic; - traffic2Lanes.parentVersionNumber = 2; - traffic2Lanes.addVersion(traffic2LanesV1); - traffic2Lanes.addAuthor(bob, 'owner'); - traffic2Lanes.addPermission(null, 'read'); - await traffic2Lanes.upsert(); - - console.log(' ✓ 7 models with versions, tags, authors, permissions'); - - // ── Events ────────────────────────────────────────────────────────────── - - const e1 = new EventBuilder(); - e1.type = 'model.created'; - e1.actor = alice; - e1.resourceType = 'model'; - e1.resourceId = wolfSheep.id; - e1.payload = { title: 'Wolf Sheep Predation', visibility: 'public' }; - await e1.upsert(); - - const e2 = new EventBuilder(); - e2.type = 'model_version.created'; - e2.actor = alice; - e2.resourceType = 'model_version'; - e2.resourceId = `${wolfSheep.id}:1`; - e2.payload = { modelId: wolfSheep.id, versionNumber: 1 }; - await e2.upsert(); - - const e3 = new EventBuilder(); - e3.type = 'model_version.created'; - e3.actor = alice; - e3.resourceType = 'model_version'; - e3.resourceId = `${wolfSheep.id}:2`; - e3.payload = { modelId: wolfSheep.id, versionNumber: 2 }; - e3.processedAt = now; - await e3.upsert(); - - const e4 = new EventBuilder(); - e4.type = 'model.created'; - e4.actor = bob; - e4.resourceType = 'model'; - e4.resourceId = fireSpread.id; - e4.payload = { title: 'Fire Spread', visibility: 'public' }; - e4.processedAt = now; - await e4.upsert(); - const e5 = new EventBuilder(); - e5.type = 'model.forked'; - e5.actor = dave; - e5.resourceType = 'model'; - e5.resourceId = wolfSheepFork.id; - e5.payload = { parentModelId: wolfSheep.id, parentVersionNumber: 2 }; - await e5.upsert(); + const modelIds: IdMap = new Map(models.map((m) => [m.key, m.id])); + const draftCount = await loadDrafts(DRAFTS, users, modelIds, uploader); + console.log(` ✓ ${draftCount} model drafts`); - console.log(' ✓ 5 events'); console.log('\nSeed completed successfully.'); } @@ -333,4 +42,4 @@ main() console.error(e); await prisma.$disconnect(); process.exit(1); - }); + }); \ No newline at end of file diff --git a/apps/modeling-commons-backend/prisma/seed/loaders.ts b/apps/modeling-commons-backend/prisma/seed/loaders.ts new file mode 100644 index 00000000..d8995936 --- /dev/null +++ b/apps/modeling-commons-backend/prisma/seed/loaders.ts @@ -0,0 +1,486 @@ +import { createHash } from 'node:crypto'; +import { prisma } from './providers.js'; +import { seedId, seededRandom } from './id.js'; +import { AssetUploader, loadNlogox, fakeNlogox, textAsset, type NlogoxAsset } from './assets.js'; +import { + isRealFile, + type DraftSeed, + type ModelFileSeed, + type ModelSeed, + type TagSeed, + type UserSeed, + type VersionSeed, +} from './manifest/index.js'; + +const DAY = 86_400_000; +const NOW = Date.now(); +const daysAgo = (n: number) => new Date(NOW - n * DAY); + +export type IdMap = Map; + +const GEO_POOL = [ + { country: 'US', region: 'IL', city: 'Chicago' }, + { country: 'GB', region: 'ENG', city: 'London' }, + { country: 'JP', region: '13', city: 'Tokyo' }, + { country: 'IN', region: 'KA', city: 'Bangalore' }, + { country: 'DE', region: 'BE', city: 'Berlin' }, + { country: 'BR', region: 'SP', city: 'São Paulo' }, + { country: 'NG', region: 'LA', city: 'Lagos' }, + { country: 'AU', region: 'NSW', city: 'Sydney' }, +]; + +const UA_POOL = [ + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 Safari/605.1.15', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/124.0 Safari/537.36', + 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 Chrome/123.0 Safari/537.36', + 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_4 like Mac OS X) AppleWebKit/605.1.15 Mobile Safari/604.1', +]; + +const REFERER_POOL = ['https://www.google.com/', 'https://modelingcommons.org/browse', null, null]; + +function mustGet(map: IdMap, key: string, kind: string): string { + const id = map.get(key); + if (!id) throw new Error(`Seed manifest references unknown ${kind}: "${key}"`); + return id; +} + +const pick = (rng: () => number, pool: readonly T[]): T => + pool[Math.floor(rng() * pool.length)]!; + +// ── Users ─────────────────────────────────────────────────────────────────── + +export async function loadUsers(users: UserSeed[]): Promise { + const map: IdMap = new Map(); + + for (const u of users) { + const id = seedId('user', u.key); + map.set(u.key, id); + const createdAt = daysAgo(u.createdDaysAgo ?? 365); + const systemRole = u.systemRole ?? 'user'; + + // Reconcile mutable profile fields on every run so manifest edits propagate + // to an already-seeded database; createdAt is fixed on first insert only. + const profile = { + legacyId: u.legacyId ?? null, + name: u.name, + email: u.email, + emailVerified: u.emailVerified ?? true, + systemRole, + role: systemRole === 'user' ? null : systemRole, + userKind: u.userKind ?? 'researcher', + isProfilePublic: u.isProfilePublic ?? false, + bio: u.bio ?? null, + country: u.country ?? null, + affiliation: u.affiliation ?? null, + socialLinks: (u.socialLinks ?? undefined) as never, + dob: u.dob ? new Date(u.dob) : null, + onboardedAt: (u.onboarded ?? true) ? createdAt : null, + }; + + await prisma.user.upsert({ + where: { id }, + update: profile, + create: { id, createdAt, ...profile }, + }); + + const accountId = seedId('account', u.key); + await prisma.account.upsert({ + where: { id: accountId }, + update: {}, + create: { id: accountId, userId: id, accountId: id, providerId: 'credential' }, + }); + + if (u.devSession) { + const sessionId = seedId('session', u.key); + await prisma.session.upsert({ + where: { id: sessionId }, + update: {}, + create: { + id: sessionId, + userId: id, + token: `dev-session-${u.key}`, + expiresAt: new Date(NOW + 30 * DAY), + ipAddress: '127.0.0.1', + userAgent: 'Mozilla/5.0 (seed)', + }, + }); + } + } + + return map; +} + +export async function loadTags(tags: TagSeed[]): Promise { + const map: IdMap = new Map(); + + for (const t of tags) { + const id = seedId('tag', t.name); + map.set(t.name, id); + await prisma.tag.upsert({ + where: { name: t.name }, + update: { displayName: t.displayName }, + create: { id, name: t.name, displayName: t.displayName, legacyId: t.legacyId ?? null }, + }); + } + + return map; +} + +export interface LoadedModel { + key: string; + id: string; + latestVersionNumber: number; + createdAt: Date; + deletedAt: Date | null; + owner: string; + popularity: ModelSeed['popularity']; + isFork: boolean; + parentModelId?: string; + parentVersionNumber?: number; + versionTitles: string[]; + visibility: NonNullable; +} + +function resolveAsset(model: ModelSeed, version: VersionSeed, versionNumber: number): NlogoxAsset { + const file: ModelFileSeed = version.file; + if (isRealFile(file)) return loadNlogox(file.file, file.preview); + return fakeNlogox(`${model.key}-v${versionNumber}`, version.title, file.preview); +} + +function ownerKey(model: ModelSeed): string { + return (model.authors.find((a) => a.role === 'owner') ?? model.authors[0]!).user; +} + +export async function loadModels( + models: ModelSeed[], + users: IdMap, + tags: IdMap, + uploader: AssetUploader, +): Promise { + const modelIds: IdMap = new Map(models.map((m) => [m.key, seedId('model', m.key)])); + const loaded: LoadedModel[] = []; + + for (const m of models) { + const id = modelIds.get(m.key)!; + const createdAt = daysAgo(m.createdDaysAgo ?? 365); + const deletedAt = m.deleted ? daysAgo(Math.max((m.createdDaysAgo ?? 365) - 1, 0)) : null; + const parentModelId = m.parent ? mustGet(modelIds, m.parent, 'parent model') : null; + const parentVersionNumber = m.parent ? (m.parentVersionNumber ?? 1) : null; + + await prisma.model.upsert({ + where: { id }, + update: {}, + create: { + id, + legacyId: m.legacyId ?? null, + visibility: m.visibility ?? 'public', + isEndorsed: m.isEndorsed ?? false, + isLibraryModel: m.isLibraryModel ?? false, + parentModelId, + parentVersionNumber, + viewCount: m.popularity?.views ?? 0, + runCount: m.popularity?.runs ?? 0, + downloadCount: m.popularity?.downloads ?? 0, + shareCount: m.popularity?.shares ?? 0, + createdAt, + deletedAt, + }, + }); + + let versionNumber = 0; + for (const v of m.versions) { + versionNumber += 1; + const asset = resolveAsset(m, v, versionNumber); + await uploader.putNlogox(asset); + + const versionCreatedAt = daysAgo(v.createdDaysAgo ?? m.createdDaysAgo ?? 365); + + await prisma.modelVersion.upsert({ + where: { modelId_versionNumber: { modelId: id, versionNumber } }, + update: {}, + create: { + modelId: id, + versionNumber, + title: v.title, + description: v.description ?? null, + netlogoFileKey: asset.key, + previewImageFileKey: asset.preview?.key ?? null, + netlogoVersion: v.netlogoVersion ?? null, + infoTab: v.infoTab ?? asset.infoTab ?? null, + createdAt: versionCreatedAt, + finalizedAt: versionCreatedAt, + }, + }); + + for (const tagName of v.tags ?? []) { + const tagId = mustGet(tags, tagName, 'tag'); + await prisma.modelVersionTag.upsert({ + where: { modelId_versionNumber_tagId: { modelId: id, versionNumber, tagId } }, + update: {}, + create: { modelId: id, versionNumber, tagId }, + }); + } + + for (const sf of v.supplementaryFiles ?? []) { + const fileAsset = textAsset(sf.filename, sf.content, `uploads/models/${m.key}`); + await uploader.putSupplementary(fileAsset); + const fileId = seedId('mvfile', m.key, versionNumber, sf.filename); + await prisma.modelAdditionalFile.upsert({ + where: { id: fileId }, + update: {}, + create: { + id: fileId, + modelId: id, + taggedVersionNumber: versionNumber, + fileKey: fileAsset.key, + kind: 'model', + }, + }); + } + } + + await prisma.model.update({ where: { id }, data: { latestVersionNumber: versionNumber } }); + + for (const af of m.additionalFiles ?? []) { + const fileAsset = textAsset(af.filename, af.content, `uploads/models/${m.key}/additional`); + await uploader.putSupplementary(fileAsset); + const fileId = seedId('addfile', m.key, af.filename); + await prisma.modelAdditionalFile.upsert({ + where: { id: fileId }, + update: {}, + create: { + id: fileId, + modelId: id, + taggedVersionNumber: af.taggedVersionNumber, + fileKey: fileAsset.key, + }, + }); + } + + for (const a of m.authors) { + const userId = mustGet(users, a.user, 'author'); + await prisma.modelAuthor.upsert({ + where: { modelId_userId: { modelId: id, userId } }, + update: {}, + create: { modelId: id, userId, role: a.role ?? 'contributor' }, + }); + } + + for (const p of m.permissions ?? []) { + const granteeUserId = p.grantee ? mustGet(users, p.grantee, 'permission grantee') : null; + const permissionLevel = p.level ?? 'read'; + // The (modelId, granteeUserId) unique can't be expressed in Prisma's + // compound-unique `where` when granteeUserId is null, so reconcile by hand + // - idempotent regardless of the existing row's id. + const existing = await prisma.modelPermission.findFirst({ + where: { modelId: id, granteeUserId }, + select: { id: true }, + }); + if (existing) { + await prisma.modelPermission.update({ + where: { id: existing.id }, + data: { permissionLevel }, + }); + } else { + await prisma.modelPermission.create({ + data: { id: seedId('perm', m.key, p.grantee ?? 'public'), modelId: id, granteeUserId, permissionLevel }, + }); + } + } + + loaded.push({ + key: m.key, + id, + latestVersionNumber: versionNumber, + createdAt, + deletedAt, + owner: ownerKey(m), + popularity: m.popularity, + isFork: Boolean(m.parent), + parentModelId: parentModelId ?? undefined, + parentVersionNumber: parentVersionNumber ?? undefined, + versionTitles: m.versions.map((v) => v.title), + visibility: m.visibility ?? 'public', + }); + } + + return loaded; +} + +export async function loadEngagement( + models: LoadedModel[], + users: IdMap, +): Promise<{ likes: number; interactions: number; events: number }> { + const userIds = [...users.values()]; + + const likeRows: Array<{ modelId: string; userId: string; createdAt: Date }> = []; + const interactionRows: Array> = []; + + for (const m of models) { + if (!m.popularity) continue; + const spanMs = Math.max(NOW - m.createdAt.getTime(), DAY); + + const likeRng = seededRandom(`likes:${m.key}`); + for (const userKey of m.popularity.likedBy ?? []) { + likeRows.push({ + modelId: m.id, + userId: mustGet(users, userKey, 'like author'), + createdAt: new Date(m.createdAt.getTime() + Math.floor(likeRng() * spanMs)), + }); + } + + const rng = seededRandom(`interactions:${m.key}`); + const kinds = [ + ['view', m.popularity.views], + ['run', m.popularity.runs], + ['download', m.popularity.downloads], + ['share', m.popularity.shares], + ] as const; + + for (const [kind, count] of kinds) { + for (let i = 0; i < count; i++) { + const attributed = rng() < 0.35 && userIds.length > 0; + const userId = attributed ? pick(rng, userIds) : null; + interactionRows.push({ + id: seedId('interaction', m.key, kind, i), + modelId: m.id, + versionNumber: m.latestVersionNumber, + kind, + userId, + sessionId: null, + ipHash: userId + ? null + : createHash('sha256').update(`${m.key}:${kind}:${i}`).digest('hex').slice(0, 32), + userAgent: pick(rng, UA_POOL), + referer: pick(rng, REFERER_POOL), + geo: pick(rng, GEO_POOL), + createdAt: new Date(m.createdAt.getTime() + Math.floor(rng() * spanMs)), + }); + } + } + } + + if (likeRows.length) { + await prisma.modelLike.createMany({ data: likeRows, skipDuplicates: true }); + } + + for (let i = 0; i < interactionRows.length; i += 1000) { + const chunk = interactionRows.slice(i, i + 1000); + await prisma.modelInteraction.createMany({ data: chunk as never, skipDuplicates: true }); + } + + const events = buildEvents(models, users); + if (events.length) { + await prisma.event.createMany({ data: events as never, skipDuplicates: true }); + } + + return { likes: likeRows.length, interactions: interactionRows.length, events: events.length }; +} + +function buildEvents(models: LoadedModel[], users: IdMap) { + const events: Array> = []; + + for (const m of models) { + const actorId = mustGet(users, m.owner, 'event actor'); + + events.push({ + id: seedId('event', 'model.created', m.id), + type: 'model.created', + actorId, + resourceType: 'model', + resourceId: m.id, + payload: { title: m.versionTitles[0] ?? m.key, visibility: m.visibility }, + createdAt: m.createdAt, + processedAt: m.createdAt, + }); + + if (m.isFork && m.parentModelId) { + events.push({ + id: seedId('event', 'model.forked', m.id), + type: 'model.forked', + actorId, + resourceType: 'model', + resourceId: m.id, + payload: { parentModelId: m.parentModelId, parentVersionNumber: m.parentVersionNumber }, + createdAt: m.createdAt, + processedAt: m.createdAt, + }); + } + + for (let n = 1; n <= m.latestVersionNumber; n++) { + events.push({ + id: seedId('event', 'model_version.created', m.id, n), + type: 'model_version.created', + actorId, + resourceType: 'model_version', + resourceId: `${m.id}:${n}`, + payload: { modelId: m.id, versionNumber: n }, + createdAt: m.createdAt, + processedAt: m.createdAt, + }); + } + + if (m.deletedAt) { + events.push({ + id: seedId('event', 'model.deleted', m.id), + type: 'model.deleted', + actorId, + resourceType: 'model', + resourceId: m.id, + payload: { title: m.versionTitles[0] ?? m.key }, + createdAt: m.deletedAt, + }); + } + } + + return events; +} + +export async function loadDrafts( + drafts: DraftSeed[], + users: IdMap, + modelIds: IdMap, + uploader: AssetUploader, +): Promise { + for (const d of drafts) { + const userId = mustGet(users, d.user, 'draft user'); + const modelId = d.basedOnModel ? mustGet(modelIds, d.basedOnModel, 'draft model') : null; + const createdAt = daysAgo(d.createdDaysAgo ?? 7); + + const data: Record = {}; + if (d.title) data['title'] = d.title; + if (d.description) data['description'] = d.description; + if (d.visibility) data['visibility'] = d.visibility; + if (d.tags) data['tags'] = d.tags; + + if (d.primaryFile) { + const asset = isRealFile(d.primaryFile) + ? loadNlogox(d.primaryFile.file, d.primaryFile.preview) + : fakeNlogox(`draft-${d.key}`, d.title ?? 'Untitled Draft', d.primaryFile.preview); + await uploader.putNlogox(asset); + data['primaryFile'] = { + s3Key: asset.key, + filename: asset.filename, + sizeBytes: Number(asset.sizeBytes), + mimeType: asset.contentType, + }; + if (asset.preview) { + data['previewImage'] = { + s3Key: asset.preview.key, + filename: asset.preview.filename, + sizeBytes: asset.preview.blob.byteLength, + mimeType: asset.preview.contentType, + }; + } + } + + const id = seedId('draft', d.key); + await prisma.modelDraft.upsert({ + where: { id }, + update: {}, + create: { id, userId, modelId, schemaVersion: 1, data: data as never, createdAt }, + }); + } + + return drafts.length; +} diff --git a/apps/modeling-commons-backend/prisma/seed/manifest/drafts.ts b/apps/modeling-commons-backend/prisma/seed/manifest/drafts.ts new file mode 100644 index 00000000..96664a2e --- /dev/null +++ b/apps/modeling-commons-backend/prisma/seed/manifest/drafts.ts @@ -0,0 +1,45 @@ +import type { DraftSeed } from './types.js'; + +export const DRAFTS: DraftSeed[] = [ + { + key: 'priya-slime', + user: 'priya', + title: 'Slime Mold Aggregation', + description: + 'Draft model of Dictyostelium aggregation via cAMP signaling. Still tuning the chemotaxis parameters.', + visibility: 'public', + tags: ['biology', 'swarm-intelligence', 'emergence'], + primaryFile: { placeholder: true }, + createdDaysAgo: 8, + }, + { + key: 'diego-roundabout', + user: 'diego', + title: 'Roundabout Flow', + description: 'A draft exploring whether roundabouts beat signalized intersections at low volume.', + visibility: 'public', + tags: ['traffic', 'urban'], + primaryFile: { file: 'traffic-grid.nlogox', preview: 'traffic-grid-preview.png' }, + createdDaysAgo: 5, + }, + { + key: 'chen-markets', + user: 'chen', + title: 'Minority Game', + visibility: 'private', + tags: ['economics', 'game-theory'], + createdDaysAgo: 3, + }, + { + // A draft that revises an already-published model (a pending new version). + key: 'amara-virus-net-v2', + user: 'amara', + basedOnModel: 'virus-network', + title: 'Virus on a Network', + description: 'Adding weighted edges and a quarantine policy toggle for version 2.', + visibility: 'public', + tags: ['network', 'epidemiology'], + primaryFile: { placeholder: true }, + createdDaysAgo: 2, + }, +]; diff --git a/apps/modeling-commons-backend/prisma/seed/manifest/index.ts b/apps/modeling-commons-backend/prisma/seed/manifest/index.ts new file mode 100644 index 00000000..c6bbed09 --- /dev/null +++ b/apps/modeling-commons-backend/prisma/seed/manifest/index.ts @@ -0,0 +1,5 @@ +export * from './types.js'; +export { USERS } from './users.js'; +export { TAGS } from './tags.js'; +export { MODELS } from './models.js'; +export { DRAFTS } from './drafts.js'; diff --git a/apps/modeling-commons-backend/prisma/seed/manifest/models.ts b/apps/modeling-commons-backend/prisma/seed/manifest/models.ts new file mode 100644 index 00000000..9fdc1894 --- /dev/null +++ b/apps/modeling-commons-backend/prisma/seed/manifest/models.ts @@ -0,0 +1,558 @@ +import type { ModelSeed } from './types.js'; + +const CSV = (header: string, rows: string) => `${header}\n${rows}`; + +export const MODELS: ModelSeed[] = [ + { + key: 'wolf-sheep', + legacyId: 1001, + isEndorsed: true, + isLibraryModel: true, + createdDaysAgo: 700, + authors: [ + { user: 'uri', role: 'owner' }, + { user: 'seth', role: 'contributor' }, + ], + permissions: [{ grantee: 'maria', level: 'write' }], + versions: [ + { + title: 'Wolf Sheep Predation', + description: + 'A classic predator–prey model exploring the population dynamics between wolves, sheep, and the grass they graze on.', + netlogoVersion: '7.0.0', + tags: ['ecology', 'predator-prey', 'biology'], + file: { file: 'wolf-sheep-predation.nlogox', preview: 'wolf-sheep-preview.png' }, + createdDaysAgo: 700, + supplementaryFiles: [ + { + filename: 'initial-populations.csv', + content: CSV('tick,wolves,sheep', '0,50,100\n1,48,105\n2,45,112'), + }, + ], + }, + { + title: 'Wolf Sheep Predation', + description: + 'Updated with energy-based movement and grass regrowth mechanics for more realistic equilibria.', + netlogoVersion: '7.0.3', + tags: ['ecology', 'predator-prey', 'biology', 'emergence'], + file: { file: 'wolf-sheep-predation-v2.nlogox', preview: 'wolf-sheep-preview.png' }, + createdDaysAgo: 210, + }, + ], + additionalFiles: [ + { + taggedVersionNumber: 1, + filename: 'README.md', + content: '# Wolf Sheep Predation\n\nA classic predator-prey model.', + }, + ], + popularity: { + views: 612, + runs: 248, + downloads: 96, + shares: 34, + likedBy: ['maria', 'kenji', 'priya', 'diego', 'amara', 'liam', 'chen'], + }, + }, + { + key: 'wolf-sheep-seasonal', + parent: 'wolf-sheep', + parentVersionNumber: 2, + createdDaysAgo: 120, + authors: [{ user: 'maria', role: 'owner' }], + versions: [ + { + title: 'Wolf Sheep – Seasonal Variant', + description: + 'A fork of Wolf Sheep Predation that adds seasonal grass-growth patterns, producing boom-and-bust cycles.', + netlogoVersion: '7.0.0', + tags: ['ecology', 'predator-prey', 'climate'], + file: { file: 'wolf-sheep-predation-fork.nlogox', preview: 'wolf-sheep-preview.png' }, + }, + ], + popularity: { views: 143, runs: 61, downloads: 18, shares: 5, likedBy: ['uri', 'kenji'] }, + }, + { + key: 'wolf-sheep-grass', + parent: 'wolf-sheep', + parentVersionNumber: 2, + createdDaysAgo: 60, + authors: [{ user: 'kenji', role: 'owner' }], + versions: [ + { + title: 'Wolf Sheep – Classroom Edition', + description: + 'A simplified fork used in a high-school biology class to introduce carrying capacity.', + netlogoVersion: '7.0.3', + tags: ['ecology', 'predator-prey', 'education', 'beginner'], + file: { placeholder: true, preview: 'wolf-sheep-preview.png' }, + }, + ], + popularity: { views: 87, runs: 40, downloads: 12, shares: 2, likedBy: ['maria'] }, + }, + + { + key: 'fire', + legacyId: 1002, + isEndorsed: true, + isLibraryModel: true, + createdDaysAgo: 680, + authors: [{ user: 'seth', role: 'owner' }], + permissions: [{ grantee: 'uri', level: 'admin' }], + versions: [ + { + title: 'Fire', + description: + "Simulates the spread of fire through a forest. The fire's chance of reaching the far edge depends critically on tree density — a classic example of a non-linear phase transition.", + netlogoVersion: '6.4.0', + tags: ['fire', 'emergence', 'physics'], + file: { file: 'fire.nlogox', preview: 'fire-preview.png' }, + }, + ], + additionalFiles: [ + { + taggedVersionNumber: 1, + filename: 'burn-results.csv', + content: CSV('density,burned_pct', '50,18\n59,52\n65,86\n75,98'), + }, + ], + popularity: { + views: 504, + runs: 301, + downloads: 74, + shares: 21, + likedBy: ['uri', 'kenji', 'diego', 'fatima', 'maria'], + }, + }, + { + key: 'fire-big', + parent: 'fire', + parentVersionNumber: 1, + createdDaysAgo: 45, + authors: [{ user: 'kenji', role: 'owner' }], + versions: [ + { + title: 'Fire – Large Forests', + description: + 'A fork that scales the world up and adds wind direction to study fire-front behavior at larger scales.', + netlogoVersion: '7.0.0', + tags: ['fire', 'emergence', 'climate'], + file: { placeholder: true, preview: 'fire-preview.png' }, + }, + ], + popularity: { views: 66, runs: 33, downloads: 9, shares: 1, likedBy: ['seth'] }, + }, + + { + key: 'ants', + legacyId: 1003, + isEndorsed: true, + isLibraryModel: true, + createdDaysAgo: 660, + authors: [{ user: 'uri', role: 'owner' }], + versions: [ + { + title: 'Ants', + description: + 'A colony of ants forages for food. Each ant follows simple pheromone rules, yet the colony as a whole finds the shortest paths to food — emergent optimization.', + netlogoVersion: '6.3.0', + tags: ['biology', 'swarm-intelligence', 'emergence'], + file: { file: 'ants.nlogox', preview: 'ants-preview.png' }, + }, + ], + popularity: { + views: 458, + runs: 192, + downloads: 63, + shares: 19, + likedBy: ['priya', 'kenji', 'maria', 'diego'], + }, + }, + + { + key: 'traffic-basic', + legacyId: 1004, + isLibraryModel: true, + createdDaysAgo: 520, + authors: [{ user: 'uri', role: 'owner' }], + versions: [ + { + title: 'Traffic Basic', + description: + 'A single lane of cars on a circular road. A single slow-down can cascade into a phantom traffic jam that travels backward through the line of cars.', + netlogoVersion: '6.4.0', + tags: ['traffic', 'emergence', 'beginner'], + file: { file: 'traffic-basic.nlogox', preview: 'traffic-basic-preview.png' }, + }, + ], + popularity: { + views: 388, + runs: 156, + downloads: 41, + shares: 12, + likedBy: ['diego', 'liam', 'kenji'], + }, + }, + { + key: 'traffic-grid', + legacyId: 1005, + isLibraryModel: true, + createdDaysAgo: 360, + authors: [{ user: 'uri', role: 'owner' }], + versions: [ + { + title: 'Traffic Grid', + description: + 'Cars move through a grid of intersections governed by traffic lights. Tune light timing to minimize average wait time across the city.', + netlogoVersion: '7.0.0', + tags: ['traffic', 'urban', 'emergence'], + file: { file: 'traffic-grid.nlogox', preview: 'traffic-grid-preview.png' }, + }, + ], + popularity: { views: 271, runs: 118, downloads: 35, shares: 9, likedBy: ['diego', 'liam'] }, + }, + { + key: 'traffic-2-lanes', + parent: 'traffic-basic', + parentVersionNumber: 1, + createdDaysAgo: 150, + authors: [{ user: 'diego', role: 'owner' }], + permissions: [{ grantee: null, level: 'read' }], + versions: [ + { + title: 'Traffic – 2 Lanes', + description: + 'Extends Traffic Basic to two lanes with lane-changing, exploring how merging behavior affects throughput.', + netlogoVersion: '7.0.0', + tags: ['traffic', 'urban', 'emergence'], + file: { file: 'traffic-2-lanes.nlogox', preview: 'traffic-2-lanes-preview.png' }, + }, + ], + popularity: { views: 132, runs: 58, downloads: 14, shares: 3, likedBy: ['liam'] }, + }, + + { + key: 'virus-network', + legacyId: 1006, + isLibraryModel: true, + createdDaysAgo: 300, + authors: [ + { user: 'amara', role: 'owner' }, + { user: 'uri', role: 'contributor' }, + ], + versions: [ + { + title: 'Virus on a Network', + description: + 'Models how a virus spreads through a network of connected nodes, and how vaccination and recovery rates change the outcome.', + netlogoVersion: '6.4.0', + tags: ['network', 'epidemiology', 'biology'], + file: { placeholder: true }, + }, + ], + popularity: { + views: 297, + runs: 134, + downloads: 48, + shares: 16, + likedBy: ['amara', 'maria', 'liam', 'fatima'], + }, + }, + { + key: 'virus', + isLibraryModel: true, + createdDaysAgo: 280, + authors: [{ user: 'amara', role: 'owner' }], + versions: [ + { + title: 'Virus', + description: + 'A well-mixed population model of infection, recovery, and immunity — the spatial counterpart to Virus on a Network.', + netlogoVersion: '6.4.0', + tags: ['epidemiology', 'biology'], + file: { placeholder: true }, + }, + ], + popularity: { views: 188, runs: 79, downloads: 22, shares: 6, likedBy: ['fatima', 'maria'] }, + }, + { + key: 'rumor-mill', + createdDaysAgo: 90, + authors: [{ user: 'fatima', role: 'owner' }], + versions: [ + { + title: 'Rumor Mill', + description: + 'How does a rumor propagate through a social network? Compare broadcast, word-of-mouth, and influencer-seeded spreading.', + netlogoVersion: '7.0.0', + tags: ['network', 'social-science'], + file: { placeholder: true }, + }, + ], + popularity: { views: 74, runs: 28, downloads: 7, shares: 4, likedBy: ['liam'] }, + }, + + { + key: 'flocking', + isEndorsed: true, + isLibraryModel: true, + createdDaysAgo: 640, + authors: [{ user: 'uri', role: 'owner' }], + versions: [ + { + title: 'Flocking', + description: + 'Birds follow three simple rules — alignment, separation, and cohesion — and coherent flocks emerge with no leader.', + netlogoVersion: '6.4.0', + tags: ['biology', 'swarm-intelligence', 'emergence'], + file: { placeholder: true, preview: 'ants-preview.png' }, + }, + ], + popularity: { + views: 421, + runs: 173, + downloads: 57, + shares: 18, + likedBy: ['priya', 'maria', 'kenji', 'diego'], + }, + }, + { + key: 'termites', + isLibraryModel: true, + createdDaysAgo: 250, + authors: [{ user: 'priya', role: 'owner' }], + versions: [ + { + title: 'Termites', + description: + 'Termites pile up wood chips into a single mound by following purely local rules — stigmergy in action.', + netlogoVersion: '6.3.0', + tags: ['biology', 'swarm-intelligence', 'emergence'], + file: { placeholder: true, preview: 'ants-preview.png' }, + }, + ], + popularity: { views: 165, runs: 72, downloads: 19, shares: 5, likedBy: ['priya', 'uri'] }, + }, + + // ── Cellular automata & math ────────────────────────────────────────────── + { + key: 'game-of-life', + isEndorsed: true, + isLibraryModel: true, + createdDaysAgo: 600, + authors: [{ user: 'seth', role: 'owner' }], + versions: [ + { + title: 'Life', + description: + "Conway's Game of Life — the canonical cellular automaton. Gliders, blinkers, and still lifes from two simple birth/death rules.", + netlogoVersion: '6.4.0', + tags: ['cellular-automata', 'mathematics', 'emergence'], + file: { placeholder: true }, + }, + ], + popularity: { + views: 356, + runs: 201, + downloads: 44, + shares: 13, + likedBy: ['maria', 'chen', 'kenji'], + }, + }, + { + key: 'diffusion', + isLibraryModel: true, + createdDaysAgo: 470, + authors: [{ user: 'seth', role: 'owner' }], + versions: [ + { + title: 'Diffusion Graphics', + description: + 'Watch a substance diffuse across a grid, illustrating how local averaging produces smooth global gradients.', + netlogoVersion: '6.4.0', + tags: ['physics', 'chemistry', 'mathematics'], + file: { placeholder: true }, + }, + ], + popularity: { views: 122, runs: 54, downloads: 11, shares: 2, likedBy: ['maria'] }, + }, + + { + key: 'segregation', + isEndorsed: true, + isLibraryModel: true, + createdDaysAgo: 580, + authors: [{ user: 'uri', role: 'owner' }], + versions: [ + { + title: 'Segregation', + description: + "Schelling's model of segregation: even a mild preference to live near similar neighbors tips a mixed neighborhood into stark segregation.", + netlogoVersion: '6.4.0', + tags: ['social-science', 'segregation', 'emergence'], + file: { placeholder: true, preview: 'traffic-grid-preview.png' }, + }, + ], + popularity: { + views: 398, + runs: 142, + downloads: 61, + shares: 22, + likedBy: ['liam', 'chen', 'maria', 'fatima'], + }, + }, + { + key: 'wealth-distribution', + createdDaysAgo: 110, + authors: [{ user: 'chen', role: 'owner' }], + permissions: [{ grantee: 'liam', level: 'read' }], + versions: [ + { + title: 'Wealth Distribution', + description: + 'Agents harvest and trade on a grain landscape. Starting from equality, a skewed wealth distribution emerges and persists.', + netlogoVersion: '7.0.0', + tags: ['economics', 'social-science', 'emergence'], + file: { placeholder: true }, + }, + ], + popularity: { views: 96, runs: 38, downloads: 13, shares: 4, likedBy: ['chen', 'liam'] }, + }, + { + key: 'el-farol', + isLibraryModel: true, + createdDaysAgo: 230, + authors: [{ user: 'chen', role: 'owner' }], + versions: [ + { + title: 'El Farol', + description: + 'A bounded-rationality classic: bar-goers use competing strategies to predict the crowd, and attendance hovers around capacity.', + netlogoVersion: '6.4.0', + tags: ['economics', 'game-theory', 'complexity'], + file: { placeholder: true }, + }, + ], + popularity: { views: 141, runs: 49, downloads: 16, shares: 5, likedBy: ['chen'] }, + }, + { + key: 'pd-n-person', + isLibraryModel: true, + createdDaysAgo: 320, + authors: [{ user: 'liam', role: 'owner' }], + versions: [ + { + title: 'PD N-Person Iterated', + description: + 'An N-person iterated Prisoner’s Dilemma. Watch cooperation rise and fall as strategies meet repeatedly.', + netlogoVersion: '6.4.0', + tags: ['game-theory', 'social-science', 'evolution'], + file: { placeholder: true }, + }, + ], + popularity: { views: 177, runs: 83, downloads: 24, shares: 8, likedBy: ['liam', 'chen'] }, + }, + { + key: 'heroes-cowards', + createdDaysAgo: 70, + authors: [{ user: 'liam', role: 'owner' }], + versions: [ + { + title: 'Heroes and Cowards', + description: + 'Every agent secretly picks a friend and an enemy, then either hides behind their friend (coward) or steps between friend and enemy (hero). Two rules, wildly different patterns.', + netlogoVersion: '7.0.0', + tags: ['social-science', 'emergence', 'beginner'], + file: { placeholder: true }, + }, + ], + popularity: { views: 109, runs: 62, downloads: 10, shares: 6, likedBy: ['kenji', 'diego'] }, + }, + + { + key: 'ising', + isLibraryModel: true, + createdDaysAgo: 200, + authors: [{ user: 'maria', role: 'owner' }], + versions: [ + { + title: 'Ising', + description: + 'The Ising model of ferromagnetism. Sweep the temperature through the critical point and watch spontaneous magnetization appear.', + netlogoVersion: '6.4.0', + tags: ['physics', 'emergence', 'complexity'], + file: { placeholder: true }, + }, + ], + popularity: { views: 134, runs: 71, downloads: 17, shares: 3, likedBy: ['maria', 'seth'] }, + }, + { + key: 'daisyworld', + isLibraryModel: true, + createdDaysAgo: 260, + authors: [{ user: 'maria', role: 'owner' }], + versions: [ + { + title: 'Daisyworld', + description: + 'Black and white daisies regulate the temperature of an imaginary planet, a vivid illustration of the Gaia hypothesis.', + netlogoVersion: '6.4.0', + tags: ['climate', 'ecology', 'biology'], + file: { placeholder: true }, + }, + ], + popularity: { views: 158, runs: 64, downloads: 20, shares: 7, likedBy: ['maria', 'kenji'] }, + }, + + { + key: 'forest-succession', + visibility: 'private', + createdDaysAgo: 25, + authors: [{ user: 'maria', role: 'owner' }], + permissions: [{ grantee: 'uri', level: 'read' }], + versions: [ + { + title: 'Forest Succession (WIP)', + description: + 'Unpublished work in progress: modeling how a forest recovers after disturbance through species succession.', + netlogoVersion: '7.0.0', + tags: ['ecology', 'evolution'], + file: { placeholder: true }, + }, + ], + popularity: { views: 12, runs: 3, downloads: 0, shares: 0, likedBy: [] }, + }, + { + key: 'sophie-sandbox', + visibility: 'unlisted', + createdDaysAgo: 40, + authors: [{ user: 'sophie', role: 'owner' }], + versions: [ + { + title: 'Diffusion Experiments', + description: + 'Unlisted scratchpad for course assignments — shareable by link but hidden from search.', + netlogoVersion: '7.0.0', + tags: ['physics', 'education'], + file: { placeholder: true }, + }, + ], + popularity: { views: 31, runs: 9, downloads: 2, shares: 1, likedBy: [] }, + }, + { + key: 'noah-deleted', + deleted: true, + createdDaysAgo: 20, + authors: [{ user: 'noah', role: 'owner' }], + versions: [ + { + title: 'Untitled Test Model', + description: 'A test model the author later deleted.', + netlogoVersion: '7.0.0', + tags: ['beginner'], + file: { placeholder: true }, + }, + ], + }, +]; diff --git a/apps/modeling-commons-backend/prisma/seed/manifest/tags.ts b/apps/modeling-commons-backend/prisma/seed/manifest/tags.ts new file mode 100644 index 00000000..73452a0c --- /dev/null +++ b/apps/modeling-commons-backend/prisma/seed/manifest/tags.ts @@ -0,0 +1,28 @@ +import type { TagSeed } from './types.js'; + +export const TAGS: TagSeed[] = [ + { name: 'ecology', displayName: 'Ecology', legacyId: 101 }, + { name: 'predator-prey', displayName: 'Predator–Prey', legacyId: 102 }, + { name: 'biology', displayName: 'Biology', legacyId: 103 }, + { name: 'emergence', displayName: 'Emergence', legacyId: 104 }, + { name: 'fire', displayName: 'Fire', legacyId: 105 }, + { name: 'physics', displayName: 'Physics' }, + { name: 'chemistry', displayName: 'Chemistry' }, + { name: 'network', displayName: 'Networks' }, + { name: 'epidemiology', displayName: 'Epidemiology' }, + { name: 'swarm-intelligence', displayName: 'Swarm Intelligence' }, + { name: 'social-science', displayName: 'Social Science' }, + { name: 'economics', displayName: 'Economics' }, + { name: 'game-theory', displayName: 'Game Theory' }, + { name: 'traffic', displayName: 'Traffic' }, + { name: 'urban', displayName: 'Urban Dynamics' }, + { name: 'cellular-automata', displayName: 'Cellular Automata' }, + { name: 'mathematics', displayName: 'Mathematics' }, + { name: 'climate', displayName: 'Climate' }, + { name: 'evolution', displayName: 'Evolution' }, + { name: 'segregation', displayName: 'Segregation' }, + { name: 'education', displayName: 'Education' }, + { name: 'beginner', displayName: 'Beginner Friendly' }, + { name: 'complexity', displayName: 'Complexity' }, + { name: 'agent-based', displayName: 'Agent-Based' }, +]; diff --git a/apps/modeling-commons-backend/prisma/seed/manifest/types.ts b/apps/modeling-commons-backend/prisma/seed/manifest/types.ts new file mode 100644 index 00000000..6e8e279d --- /dev/null +++ b/apps/modeling-commons-backend/prisma/seed/manifest/types.ts @@ -0,0 +1,126 @@ +export type SystemRoleLit = 'admin' | 'moderator' | 'user'; +export type UserKindLit = 'student' | 'teacher' | 'researcher' | 'other'; +export type VisibilityLit = 'public' | 'private' | 'unlisted'; +export type AuthorRoleLit = 'owner' | 'contributor'; +export type PermissionLevelLit = 'read' | 'write' | 'admin'; + +export interface SocialLinkSeed { + rawValue: string; + type: 'twitter' | 'linkedin' | 'github' | 'facebook' | 'instagram' | 'website' | 'other'; +} + +export interface UserSeed { + /** Stable slug used to derive the user id and cross-reference from models. */ + key: string; + legacyId?: number; + name: string; + email: string; + emailVerified?: boolean; + systemRole?: SystemRoleLit; + userKind?: UserKindLit; + isProfilePublic?: boolean; + bio?: string; + country?: string; + affiliation?: string; + socialLinks?: SocialLinkSeed[]; + dob?: string; + onboarded?: boolean; + createdDaysAgo?: number; + /** Mint a stable dev session token (`dev-session-`) for local sign-in. */ + devSession?: boolean; +} + +export interface TagSeed { + name: string; + displayName: string; + legacyId?: number; +} + +/** A model file backed by a real `.nlogox` shipped in `seed-files/`. */ +export interface RealFileSeed { + file: string; + preview?: string; +} + +/** A synthesized placeholder model file (no real `.nlogox` shipped). */ +export interface PlaceholderFileSeed { + placeholder: true; + preview?: string; +} + +export type ModelFileSeed = RealFileSeed | PlaceholderFileSeed; + +export function isRealFile(f: ModelFileSeed): f is RealFileSeed { + return 'file' in f; +} + +export interface TextFileSeed { + filename: string; + content: string; +} + +export interface VersionSeed { + title: string; + description?: string; + netlogoVersion?: string; + infoTab?: string; + tags?: string[]; + file: ModelFileSeed; + supplementaryFiles?: TextFileSeed[]; + createdDaysAgo?: number; +} + +export interface ModelAuthorSeed { + user: string; + role?: AuthorRoleLit; +} + +export interface ModelPermissionSeed { + /** `null` grants the permission to everyone (anonymous). */ + grantee: string | null; + level?: PermissionLevelLit; +} + +export interface PopularitySeed { + views: number; + runs: number; + downloads: number; + shares: number; + likedBy?: string[]; +} + +export interface AdditionalFileSeed { + taggedVersionNumber: number; + filename: string; + content: string; +} + +export interface ModelSeed { + key: string; + legacyId?: number; + visibility?: VisibilityLit; + isEndorsed?: boolean; + isLibraryModel?: boolean; + parent?: string; + parentVersionNumber?: number; + deleted?: boolean; + createdDaysAgo?: number; + authors: ModelAuthorSeed[]; + permissions?: ModelPermissionSeed[]; + versions: VersionSeed[]; + additionalFiles?: AdditionalFileSeed[]; + popularity?: PopularitySeed; +} + +export interface DraftSeed { + key: string; + user: string; + /** Existing model this draft revises (a new version), if any. */ + basedOnModel?: string; + title?: string; + description?: string; + visibility?: VisibilityLit; + tags?: string[]; + primaryFile?: ModelFileSeed; + createdDaysAgo?: number; +} diff --git a/apps/modeling-commons-backend/prisma/seed/manifest/users.ts b/apps/modeling-commons-backend/prisma/seed/manifest/users.ts new file mode 100644 index 00000000..609d2ca4 --- /dev/null +++ b/apps/modeling-commons-backend/prisma/seed/manifest/users.ts @@ -0,0 +1,178 @@ +import type { UserSeed } from './types.js'; + +export const USERS: UserSeed[] = [ + { + key: 'uri', + legacyId: 1, + name: 'Uri Wilensky', + email: 'uri@example.com', + userKind: 'researcher', + isProfilePublic: true, + affiliation: + 'Center for Connected Learning and Computer-Based Modeling, Northwestern University', + country: 'US', + bio: 'Creator of NetLogo. Researching agent-based modeling and complexity in education for two decades.', + socialLinks: [ + { rawValue: 'https://ccl.northwestern.edu', type: 'website' }, + { rawValue: 'uri_wilensky', type: 'twitter' }, + ], + createdDaysAgo: 900, + devSession: true, + }, + { + key: 'seth', + legacyId: 2, + name: 'Seth Tisue', + email: 'seth@example.com', + userKind: 'researcher', + isProfilePublic: true, + affiliation: 'NetLogo Team, Northwestern University', + country: 'US', + bio: 'Maintainer and engineer on the NetLogo platform. Scala and functional programming enthusiast.', + socialLinks: [{ rawValue: 'SethTisue', type: 'github' }], + createdDaysAgo: 820, + devSession: true, + }, + { + key: 'maria', + name: 'Maria Hernández', + email: 'maria@example.com', + userKind: 'researcher', + isProfilePublic: true, + affiliation: 'Santa Fe Institute', + country: 'ES', + bio: 'Complexity scientist studying emergence in ecological and social systems.', + socialLinks: [ + { rawValue: 'maria-hernandez', type: 'linkedin' }, + { rawValue: 'mh_complexity', type: 'twitter' }, + ], + dob: '1985-04-12', + createdDaysAgo: 540, + }, + { + key: 'kenji', + name: 'Kenji Watanabe', + email: 'kenji@example.com', + userKind: 'teacher', + isProfilePublic: true, + affiliation: 'Tokyo Metropolitan High School', + country: 'JP', + bio: 'High-school physics teacher using NetLogo to teach emergence and systems thinking.', + createdDaysAgo: 410, + }, + { + key: 'amara', + name: 'Amara Okafor', + email: 'amara@example.com', + userKind: 'researcher', + isProfilePublic: true, + affiliation: 'University of Lagos, Department of Epidemiology', + country: 'NG', + bio: 'Epidemiologist modeling disease spread on contact networks.', + socialLinks: [{ rawValue: 'amaraokafor', type: 'github' }], + createdDaysAgo: 360, + }, + { + key: 'liam', + name: 'Liam O’Connor', + email: 'liam@example.com', + userKind: 'teacher', + isProfilePublic: true, + affiliation: 'Trinity College Dublin', + country: 'IE', + bio: 'Lecturer in computational social science.', + createdDaysAgo: 300, + }, + { + key: 'priya', + name: 'Priya Nair', + email: 'priya@example.com', + userKind: 'researcher', + isProfilePublic: true, + affiliation: 'Indian Institute of Science, Bangalore', + country: 'IN', + bio: 'Studying swarm intelligence and collective animal behavior.', + socialLinks: [{ rawValue: 'priya_nair', type: 'twitter' }], + createdDaysAgo: 280, + }, + { + key: 'diego', + name: 'Diego Fernández', + email: 'diego@example.com', + userKind: 'student', + isProfilePublic: true, + affiliation: 'Universidad de Buenos Aires', + country: 'AR', + bio: 'Grad student exploring traffic and urban dynamics models.', + createdDaysAgo: 200, + }, + { + key: 'sophie', + name: 'Sophie Laurent', + email: 'sophie@example.com', + userKind: 'student', + isProfilePublic: false, + affiliation: 'Sorbonne Université', + country: 'FR', + createdDaysAgo: 150, + }, + { + key: 'noah', + name: 'Noah Schmidt', + email: 'noah@example.com', + userKind: 'student', + isProfilePublic: false, + country: 'DE', + onboarded: false, + emailVerified: false, + createdDaysAgo: 30, + }, + { + key: 'fatima', + name: 'Fatima Al-Sayed', + email: 'fatima@example.com', + userKind: 'teacher', + isProfilePublic: true, + affiliation: 'American University of Beirut', + country: 'LB', + bio: 'Teaching introductory modeling to undergraduates.', + createdDaysAgo: 120, + }, + { + key: 'chen', + name: 'Chen Wei', + email: 'chen@example.com', + userKind: 'researcher', + isProfilePublic: true, + affiliation: 'Tsinghua University', + country: 'CN', + bio: 'Economist interested in agent-based models of markets and wealth distribution.', + createdDaysAgo: 95, + }, + { + key: 'mod-grace', + legacyId: 47, + name: 'Grace Mwangi', + email: 'grace@example.com', + systemRole: 'moderator', + userKind: 'other', + isProfilePublic: true, + affiliation: 'Modeling Commons', + country: 'KE', + bio: 'Community moderator keeping the commons tidy.', + createdDaysAgo: 600, + devSession: true, + }, + { + key: 'admin', + legacyId: 99, + name: 'Site Admin', + email: 'admin@example.com', + systemRole: 'admin', + userKind: 'other', + isProfilePublic: false, + affiliation: 'Modeling Commons', + createdDaysAgo: 1000, + devSession: true, + }, +]; diff --git a/apps/modeling-commons-backend/prisma/seed/providers.ts b/apps/modeling-commons-backend/prisma/seed/providers.ts index bc948537..9fedb3b2 100644 --- a/apps/modeling-commons-backend/prisma/seed/providers.ts +++ b/apps/modeling-commons-backend/prisma/seed/providers.ts @@ -1,7 +1,7 @@ import 'dotenv/config'; import { S3Client } from '@aws-sdk/client-s3'; import { PrismaPg } from '@prisma/adapter-pg'; -import { PrismaClient } from '../generated/prisma/client.js'; +import { PrismaClient } from '../../generated/prisma/client.js'; const adapter = new PrismaPg({ connectionString: process.env['DATABASE_URL']! }); export const prisma = new PrismaClient({ adapter }); diff --git a/apps/modeling-commons-backend/reports/cucumber-report.json b/apps/modeling-commons-backend/reports/cucumber-report.json index d16b3a3b..5259b6f8 100644 --- a/apps/modeling-commons-backend/reports/cucumber-report.json +++ b/apps/modeling-commons-backend/reports/cucumber-report.json @@ -1,33 +1,33 @@ [ { - "description": " As a client\n I want to verify the API is running\n So that I can confirm the service is available", + "description": " As a user\n I want to sign up and sign in\n So that I can access protected resources", "elements": [ { "description": "", - "id": "health-check;health-endpoint-reports-the-service-is-up", + "id": "authentication;sign-up-with-valid-credentials", "keyword": "Scenario", "line": 6, - "name": "Health endpoint reports the service is up", + "name": "Sign up with valid credentials", "steps": [ { "keyword": "Before", "hidden": true, "result": { "status": "passed", - "duration": 153971499 + "duration": 137601583 } }, { "arguments": [], "keyword": "When ", "line": 7, - "name": "I send a GET request to \"/api/health\"", + "name": "I sign up with name \"Alice\" email \"alice@test.local\" and password \"StrongPass1!\"", "match": { - "location": "tests/api/health.steps.ts:4" + "location": "tests/api/auth.steps.ts:20" }, "result": { "status": "passed", - "duration": 139452167 + "duration": 220061332 } }, { @@ -40,20 +40,236 @@ }, "result": { "status": "passed", - "duration": 85915 + "duration": 93959 } }, { "arguments": [], "keyword": "And ", "line": 9, - "name": "the response body property \"status\" should equal \"ok\"", + "name": "the response body should have property \"user\"", "match": { - "location": "tests/shared/common.steps.ts:25" + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 68375 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 177208 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "authentication;sign-up-with-weak-password", + "keyword": "Scenario", + "line": 11, + "name": "Sign up with weak password", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 87409583 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 12, + "name": "I sign up with name \"Weak\" email \"weak@test.local\" and password \"short\"", + "match": { + "location": "tests/api/auth.steps.ts:20" + }, + "result": { + "status": "passed", + "duration": 2893708 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 13, + "name": "the signup should be rejected", + "match": { + "location": "tests/api/auth.steps.ts:52" }, + "result": { + "status": "passed", + "duration": 37083 + } + }, + { + "keyword": "After", + "hidden": true, "result": { "status": "passed", "duration": 58416 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "authentication;sign-in-with-valid-credentials", + "keyword": "Scenario", + "line": 15, + "name": "Sign in with valid credentials", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 76190707 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 16, + "name": "a verified user with email \"bob@test.local\" and password \"StrongPass1!\"", + "match": { + "location": "tests/api/auth.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 84222125 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 17, + "name": "I sign in with email \"bob@test.local\" and password \"StrongPass1!\"", + "match": { + "location": "tests/api/auth.steps.ts:32" + }, + "result": { + "status": "passed", + "duration": 79377624 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 18, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 49499 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 19, + "name": "the response should include a session cookie", + "match": { + "location": "tests/api/auth.steps.ts:44" + }, + "result": { + "status": "passed", + "duration": 29959 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 57166 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "authentication;sign-in-with-wrong-password", + "keyword": "Scenario", + "line": 21, + "name": "Sign in with wrong password", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 77335084 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 22, + "name": "a verified user with email \"carol@test.local\" and password \"StrongPass1!\"", + "match": { + "location": "tests/api/auth.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 73220583 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 23, + "name": "I sign in with email \"carol@test.local\" and password \"WrongPass1!\"", + "match": { + "location": "tests/api/auth.steps.ts:32" + }, + "result": { + "status": "passed", + "duration": 69264749 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 24, + "name": "the signin should be rejected", + "match": { + "location": "tests/api/auth.steps.ts:60" + }, + "result": { + "status": "passed", + "duration": 77042 } }, { @@ -61,7 +277,7 @@ "hidden": true, "result": { "status": "passed", - "duration": 170417 + "duration": 65291 }, "embeddings": [ { @@ -75,11 +291,13893 @@ "type": "scenario" } ], - "id": "health-check", + "id": "authentication", "line": 1, "keyword": "Feature", - "name": "Health Check", + "name": "Authentication", "tags": [], - "uri": "tests/api/health.feature" + "uri": "tests/api/auth.feature" + }, + { + "description": " As an admin\n I want to view system events\n So that I can audit activity on the platform", + "elements": [ + { + "description": "", + "id": "admin-events;admin-can-list-events", + "keyword": "Scenario", + "line": 6, + "name": "Admin can list events", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 85461709 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 7, + "name": "an authenticated admin user \"admin\"", + "match": { + "location": "tests/api/event.steps.ts:10" + }, + "result": { + "status": "passed", + "duration": 150294957 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 8, + "name": "a public model \"Audited Model\" created by \"admin\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 98064499 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 9, + "name": "\"admin\" lists admin events", + "match": { + "location": "tests/api/event.steps.ts:21" + }, + "result": { + "status": "passed", + "duration": 15297875 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 10, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 45625 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 11, + "name": "the response body should have property \"data\" as an array", + "match": { + "location": "tests/shared/common.steps.ts:41" + }, + "result": { + "status": "passed", + "duration": 45000 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 49332 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "admin-events;admin-can-filter-events-by-type", + "keyword": "Scenario", + "line": 13, + "name": "Admin can filter events by type", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 89229291 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 14, + "name": "an authenticated admin user \"admin\"", + "match": { + "location": "tests/api/event.steps.ts:10" + }, + "result": { + "status": "passed", + "duration": 149489290 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 15, + "name": "a public model \"Event Filter Model\" created by \"admin\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 49216332 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 16, + "name": "\"admin\" lists admin events with type \"model.created\"", + "match": { + "location": "tests/api/event.steps.ts:33" + }, + "result": { + "status": "passed", + "duration": 5351124 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 17, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 44709 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 18, + "name": "the response body should have property \"data\" as an array", + "match": { + "location": "tests/shared/common.steps.ts:41" + }, + "result": { + "status": "passed", + "duration": 26875 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 74000 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "admin-events;regular-user-cannot-access-admin-events", + "keyword": "Scenario", + "line": 20, + "name": "Regular user cannot access admin events", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 85353541 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 21, + "name": "an authenticated user \"regular\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 146840791 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 22, + "name": "\"regular\" lists admin events", + "match": { + "location": "tests/api/event.steps.ts:21" + }, + "result": { + "status": "passed", + "duration": 3070582 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 23, + "name": "the response status should be 403", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 23583 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 39667 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "admin-events;unauthenticated-user-cannot-access-admin-events", + "keyword": "Scenario", + "line": 25, + "name": "Unauthenticated user cannot access admin events", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 88994124 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 26, + "name": "I send a GET request to \"/api/v1/admin/events\"", + "match": { + "location": "tests/api/health.steps.ts:4" + }, + "result": { + "status": "passed", + "duration": 915916 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 27, + "name": "the response status should be 401", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 22583 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 40958 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "admin-events;admin-can-filter-events-by-resourcetype", + "keyword": "Scenario", + "line": 29, + "name": "Admin can filter events by resourceType", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 84590832 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 30, + "name": "an authenticated admin user \"admin\"", + "match": { + "location": "tests/api/event.steps.ts:10" + }, + "result": { + "status": "passed", + "duration": 146319083 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 31, + "name": "a public model \"Resource Filter Model\" created by \"admin\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 46811083 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 32, + "name": "\"admin\" lists admin events with resourceType \"model\"", + "match": { + "location": "tests/api/event.steps.ts:45" + }, + "result": { + "status": "passed", + "duration": 4405500 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 33, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 27417 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 34, + "name": "the response body should have property \"data\" as an array", + "match": { + "location": "tests/shared/common.steps.ts:41" + }, + "result": { + "status": "passed", + "duration": 19624 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 61791 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + } + ], + "id": "admin-events", + "line": 1, + "keyword": "Feature", + "name": "Admin Events", + "tags": [], + "uri": "tests/api/event.feature" + }, + { + "description": " As an authenticated user\n I want to upload avatar images\n So that my profile is personalised", + "elements": [ + { + "description": "", + "id": "file-uploads;uploading-an-avatar-requires-authentication", + "keyword": "Scenario", + "line": 6, + "name": "Uploading an avatar requires authentication", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 80938958 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 7, + "name": "an anonymous viewer uploads a PNG avatar", + "match": { + "location": "tests/api/file.steps.ts:54" + }, + "result": { + "status": "passed", + "duration": 999624 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 8, + "name": "the response status should be 401", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 32374 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 49082 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "file-uploads;authenticated-user-uploads-a-png-avatar", + "keyword": "Scenario", + "line": 10, + "name": "Authenticated user uploads a PNG avatar", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 78952291 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 11, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 155624124 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 12, + "name": "I upload a PNG avatar", + "match": { + "location": "tests/api/file.steps.ts:64" + }, + "result": { + "status": "passed", + "duration": 9075541 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 13, + "name": "the response status should be 201", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 48457 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 14, + "name": "the response body should have property \"url\"", + "match": { + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 48333 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 60334 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "file-uploads;upload-rejects-a-disallowed-mime-type", + "keyword": "Scenario", + "line": 16, + "name": "Upload rejects a disallowed mime type", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 87558958 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 17, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 160146874 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 18, + "name": "I upload an avatar with mime \"application/pdf\"", + "match": { + "location": "tests/api/file.steps.ts:75" + }, + "result": { + "status": "passed", + "duration": 3894415 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 19, + "name": "the response status should be 400", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 36875 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 45291 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + } + ], + "id": "file-uploads", + "line": 1, + "keyword": "Feature", + "name": "File Uploads", + "tags": [], + "uri": "tests/api/file.feature" + }, + { + "description": " As a client\n I want to verify the API is running\n So that I can confirm the service is available", + "elements": [ + { + "description": "", + "id": "health-check;health-endpoint-reports-the-service-is-up", + "keyword": "Scenario", + "line": 6, + "name": "Health endpoint reports the service is up", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 87844749 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 7, + "name": "I send a GET request to \"/api/health\"", + "match": { + "location": "tests/api/health.steps.ts:4" + }, + "result": { + "status": "passed", + "duration": 756208 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 8, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 24792 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 9, + "name": "the response body property \"status\" should equal \"ok\"", + "match": { + "location": "tests/shared/common.steps.ts:25" + }, + "result": { + "status": "passed", + "duration": 41917 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 30209 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + } + ], + "id": "health-check", + "line": 1, + "keyword": "Feature", + "name": "Health Check", + "tags": [], + "uri": "tests/api/health.feature" + }, + { + "description": " As a model author\n I want to attach supplementary files to my model\n So that users can download datasets or assets alongside the model", + "elements": [ + { + "description": "", + "id": "model-additional-files;listing-additional-files-for-a-model-is-publicly-accessible-on-a-public-model", + "keyword": "Scenario", + "line": 6, + "name": "Listing additional files for a model is publicly accessible on a public model", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 78232500 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 7, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 153326000 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 8, + "name": "a public model \"Open Data\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 45982666 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 9, + "name": "I list additional files for \"Open Data\"", + "match": { + "location": "tests/api/model-additional-file.steps.ts:50" + }, + "result": { + "status": "passed", + "duration": 8531582 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 10, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 37624 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 11, + "name": "the response body should be an array", + "match": { + "location": "tests/shared/common.steps.ts:33" + }, + "result": { + "status": "passed", + "duration": 34999 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 34832 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-additional-files;uploading-an-additional-file-requires-authentication", + "keyword": "Scenario", + "line": 13, + "name": "Uploading an additional file requires authentication", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 85843042 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 14, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 146120208 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 15, + "name": "a public model \"Locked Down\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 47150625 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 16, + "name": "an anonymous viewer uploads an additional file to \"Locked Down\"", + "match": { + "location": "tests/api/model-additional-file.steps.ts:89" + }, + "result": { + "status": "passed", + "duration": 730999 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 17, + "name": "the response status should be 401", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 17374 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 30374 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-additional-files;a-non-author-cannot-upload-additional-files", + "keyword": "Scenario", + "line": 19, + "name": "A non-author cannot upload additional files", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 88664291 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 20, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 146895375 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 21, + "name": "a public model \"Owned\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 45542166 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 22, + "name": "an authenticated user \"stranger\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 136207374 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 23, + "name": "\"stranger\" uploads an additional file to \"Owned\"", + "match": { + "location": "tests/api/model-additional-file.steps.ts:97" + }, + "result": { + "status": "passed", + "duration": 7782250 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 24, + "name": "the response status should be 403", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 37250 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 38083 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-additional-files;owner-uploads-an-additional-file", + "keyword": "Scenario", + "line": 26, + "name": "Owner uploads an additional file", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 92466083 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 27, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 146559333 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 28, + "name": "a public model \"With Attachments\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 47202417 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 29, + "name": "\"owner\" uploads an additional file to \"With Attachments\"", + "match": { + "location": "tests/api/model-additional-file.steps.ts:97" + }, + "result": { + "status": "passed", + "duration": 21000458 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 30, + "name": "the response status should be 201", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 45665 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 31, + "name": "the response body should have property \"id\"", + "match": { + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 35167 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 32, + "name": "the response body should have property \"fileKey\"", + "match": { + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 26249 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 33, + "name": "the response body should have property \"downloadUrl\"", + "match": { + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 13208 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 37540 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-additional-files;uploaded-file-appears-in-the-listing", + "keyword": "Scenario", + "line": 35, + "name": "Uploaded file appears in the listing", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 78449208 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 36, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 145148833 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 37, + "name": "a public model \"Listed\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 47123499 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 38, + "name": "\"owner\" has uploaded an additional file to \"Listed\"", + "match": { + "location": "tests/api/model-additional-file.steps.ts:106" + }, + "result": { + "status": "passed", + "duration": 17949249 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 39, + "name": "I list additional files for \"Listed\"", + "match": { + "location": "tests/api/model-additional-file.steps.ts:50" + }, + "result": { + "status": "passed", + "duration": 6825208 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 40, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 35792 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 41, + "name": "the response body should be an array", + "match": { + "location": "tests/shared/common.steps.ts:33" + }, + "result": { + "status": "passed", + "duration": 17334 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 42, + "name": "the response body should have length 1", + "match": { + "location": "tests/api/file.steps.ts:89" + }, + "result": { + "status": "passed", + "duration": 73999 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 37999 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-additional-files;filter-listing-by-tagged-version-number", + "keyword": "Scenario", + "line": 44, + "name": "Filter listing by tagged version number", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 93294999 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 45, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 160452750 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 46, + "name": "a public model \"Versioned\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 54167374 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 47, + "name": "\"owner\" has uploaded an additional file to \"Versioned\"", + "match": { + "location": "tests/api/model-additional-file.steps.ts:106" + }, + "result": { + "status": "passed", + "duration": 17551417 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 48, + "name": "I list additional files for \"Versioned\" tagged at version 1", + "match": { + "location": "tests/api/model-additional-file.steps.ts:63" + }, + "result": { + "status": "passed", + "duration": 7069499 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 49, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 30666 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 50, + "name": "the response body should be an array", + "match": { + "location": "tests/shared/common.steps.ts:33" + }, + "result": { + "status": "passed", + "duration": 21665 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 35375 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-additional-files;cannot-access-additional-files-on-a-private-model-owned-by-someone-else", + "keyword": "Scenario", + "line": 52, + "name": "Cannot access additional files on a private model owned by someone else", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 84619875 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 53, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 148103542 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 54, + "name": "a private model \"Secret Data\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:145" + }, + "result": { + "status": "passed", + "duration": 59826791 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 55, + "name": "an authenticated user \"stranger\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 135433917 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 56, + "name": "\"stranger\" lists additional files for \"Secret Data\"", + "match": { + "location": "tests/api/model-additional-file.steps.ts:76" + }, + "result": { + "status": "passed", + "duration": 6485541 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 57, + "name": "the response status should be 403", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 41583 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 32707 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-additional-files;owner-can-delete-an-additional-file", + "keyword": "Scenario", + "line": 60, + "name": "Owner can delete an additional file", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 87598791 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 61, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 143538416 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 62, + "name": "a public model \"Removable\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 50977333 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 63, + "name": "\"owner\" has uploaded an additional file \"att-1\" to \"Removable\"", + "match": { + "location": "tests/api/model-additional-file.steps.ts:123" + }, + "result": { + "status": "passed", + "duration": 16545125 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 64, + "name": "\"owner\" deletes additional file \"att-1\" from \"Removable\"", + "match": { + "location": "tests/api/model-additional-file.steps.ts:142" + }, + "result": { + "status": "passed", + "duration": 8608957 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 65, + "name": "the response status should be 204", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 31332 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 42209 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [ + { + "name": "@smoke", + "line": 59 + } + ], + "type": "scenario" + }, + { + "description": "", + "id": "model-additional-files;anonymous-viewer-cannot-delete-an-additional-file", + "keyword": "Scenario", + "line": 67, + "name": "Anonymous viewer cannot delete an additional file", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 83301875 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 68, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 141854583 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 69, + "name": "a public model \"Public Attachments\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 45696667 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 70, + "name": "\"owner\" has uploaded an additional file \"att-anon\" to \"Public Attachments\"", + "match": { + "location": "tests/api/model-additional-file.steps.ts:123" + }, + "result": { + "status": "passed", + "duration": 16377583 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 71, + "name": "an anonymous viewer deletes additional file \"att-anon\" from \"Public Attachments\"", + "match": { + "location": "tests/api/model-additional-file.steps.ts:161" + }, + "result": { + "status": "passed", + "duration": 747957 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 72, + "name": "the response status should be 401", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 46457 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 52208 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-additional-files;non-author-cannot-delete-an-additional-file", + "keyword": "Scenario", + "line": 74, + "name": "Non-author cannot delete an additional file", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 81479166 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 75, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 143300583 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 76, + "name": "a public model \"Guarded Attachments\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 62421750 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 77, + "name": "\"owner\" has uploaded an additional file \"att-guarded\" to \"Guarded Attachments\"", + "match": { + "location": "tests/api/model-additional-file.steps.ts:123" + }, + "result": { + "status": "passed", + "duration": 18203249 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 78, + "name": "an authenticated user \"stranger\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 137122374 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 79, + "name": "\"stranger\" deletes additional file \"att-guarded\" from \"Guarded Attachments\"", + "match": { + "location": "tests/api/model-additional-file.steps.ts:142" + }, + "result": { + "status": "passed", + "duration": 5411541 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 80, + "name": "the response status should be 403", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 31458 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 35667 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + } + ], + "id": "model-additional-files", + "line": 1, + "keyword": "Feature", + "name": "Model Additional Files", + "tags": [], + "uri": "tests/api/model-additional-file.feature" + }, + { + "description": " As a model owner\n I want to manage contributors and ownership\n So that I can collaborate on models with other users", + "elements": [ + { + "description": "", + "id": "model-authors;list-authors-of-a-model", + "keyword": "Scenario", + "line": 6, + "name": "List authors of a model", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 81477292 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 7, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 140118458 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 8, + "name": "a public model \"Authored Model\" created by the current user", + "match": { + "location": "tests/api/model.steps.ts:118" + }, + "result": { + "status": "passed", + "duration": 45349834 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 9, + "name": "I list authors of the model \"Authored Model\"", + "match": { + "location": "tests/api/model-author.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 6524667 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 10, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 42082 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 11, + "name": "the response body should be an array", + "match": { + "location": "tests/shared/common.steps.ts:33" + }, + "result": { + "status": "passed", + "duration": 37624 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 48625 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-authors;add-a-contributor-to-a-model", + "keyword": "Scenario", + "line": 13, + "name": "Add a contributor to a model", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 81249374 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 14, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 140663083 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 15, + "name": "a public model \"Collab Model\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 44834665 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 16, + "name": "an authenticated user \"contributor\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 135069332 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 17, + "name": "\"owner\" adds \"contributor\" as a contributor to \"Collab Model\"", + "match": { + "location": "tests/api/model-author.steps.ts:26" + }, + "result": { + "status": "passed", + "duration": 11410332 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 18, + "name": "the response status should be 201", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 43458 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 38250 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-authors;contributor-appears-in-the-author-list", + "keyword": "Scenario", + "line": 20, + "name": "Contributor appears in the author list", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 77964874 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 21, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 156896541 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 22, + "name": "a public model \"Team Model\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 46781250 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 23, + "name": "an authenticated user \"contributor\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 143925291 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 24, + "name": "\"owner\" has added \"contributor\" as a contributor to \"Team Model\"", + "match": { + "location": "tests/api/model-author.steps.ts:46" + }, + "result": { + "status": "passed", + "duration": 18427332 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 25, + "name": "I list authors of the model \"Team Model\"", + "match": { + "location": "tests/api/model-author.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 5054791 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 26, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 28833 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 40667 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-authors;remove-a-contributor-from-a-model", + "keyword": "Scenario", + "line": 28, + "name": "Remove a contributor from a model", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 86795874 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 29, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 146464082 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 30, + "name": "a public model \"Shrinking Team\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 44596375 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 31, + "name": "an authenticated user \"contributor\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 153864708 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 32, + "name": "\"owner\" has added \"contributor\" as a contributor to \"Shrinking Team\"", + "match": { + "location": "tests/api/model-author.steps.ts:46" + }, + "result": { + "status": "passed", + "duration": 10099666 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 33, + "name": "\"owner\" removes \"contributor\" from \"Shrinking Team\"", + "match": { + "location": "tests/api/model-author.steps.ts:69" + }, + "result": { + "status": "passed", + "duration": 7016666 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 34, + "name": "the response status should be 204", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 28500 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 37667 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-authors;cannot-remove-the-owner", + "keyword": "Scenario", + "line": 36, + "name": "Cannot remove the owner", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 83875458 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 37, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 146736625 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 38, + "name": "a public model \"Owner Model\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 51434208 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 39, + "name": "\"owner\" removes \"owner\" from \"Owner Model\"", + "match": { + "location": "tests/api/model-author.steps.ts:69" + }, + "result": { + "status": "passed", + "duration": 6263708 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 40, + "name": "the response status should be 403", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 50499 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 48374 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-authors;transfer-ownership-to-a-contributor", + "keyword": "Scenario", + "line": 42, + "name": "Transfer ownership to a contributor", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 121928916 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 43, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 162036667 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 44, + "name": "a public model \"Transfer Model\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 50682082 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 45, + "name": "an authenticated user \"new-owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 143955957 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 46, + "name": "\"owner\" has added \"new-owner\" as a contributor to \"Transfer Model\"", + "match": { + "location": "tests/api/model-author.steps.ts:46" + }, + "result": { + "status": "passed", + "duration": 17102082 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 47, + "name": "\"owner\" transfers ownership of \"Transfer Model\" to \"new-owner\"", + "match": { + "location": "tests/api/model-author.steps.ts:83" + }, + "result": { + "status": "passed", + "duration": 7843166 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 48, + "name": "the response status should be 204", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 37624 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 46583 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-authors;cannot-transfer-ownership-to-a-non-author", + "keyword": "Scenario", + "line": 50, + "name": "Cannot transfer ownership to a non-author", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 88732084 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 51, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 148174291 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 52, + "name": "a public model \"No Transfer\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 46561583 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 53, + "name": "an authenticated user \"outsider\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 149232374 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 54, + "name": "\"owner\" transfers ownership of \"No Transfer\" to \"outsider\"", + "match": { + "location": "tests/api/model-author.steps.ts:83" + }, + "result": { + "status": "passed", + "duration": 8645083 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 55, + "name": "the response status should be 404", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 28833 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 29708 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-authors;non-owner-cannot-add-contributors", + "keyword": "Scenario", + "line": 57, + "name": "Non-owner cannot add contributors", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 85961290 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 58, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 153918792 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 59, + "name": "a public model \"Restricted Model\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 49165167 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 60, + "name": "an authenticated user \"contributor\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 143511749 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 61, + "name": "\"owner\" has added \"contributor\" as a contributor to \"Restricted Model\"", + "match": { + "location": "tests/api/model-author.steps.ts:46" + }, + "result": { + "status": "passed", + "duration": 11453333 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 62, + "name": "an authenticated user \"intruder\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 150704250 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 63, + "name": "\"contributor\" adds \"intruder\" as a contributor to \"Restricted Model\"", + "match": { + "location": "tests/api/model-author.steps.ts:26" + }, + "result": { + "status": "passed", + "duration": 5555666 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 64, + "name": "the response status should be 403", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 30082 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 30208 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-authors;list-models-by-user", + "keyword": "Scenario", + "line": 66, + "name": "List models by user", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 86429667 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 67, + "name": "an authenticated user \"author\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 146000625 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 68, + "name": "a public model \"Author's Model\" created by \"author\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 50917541 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 69, + "name": "I list models by user \"author\"", + "match": { + "location": "tests/api/model-author.steps.ts:98" + }, + "result": { + "status": "passed", + "duration": 2727249 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 70, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 31833 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 71, + "name": "the response body should have property \"data\" as an array", + "match": { + "location": "tests/shared/common.steps.ts:41" + }, + "result": { + "status": "passed", + "duration": 35167 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 72, + "name": "the response body property \"data\" should have length 1", + "match": { + "location": "tests/shared/common.steps.ts:49" + }, + "result": { + "status": "passed", + "duration": 27583 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 38624 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-authors;cannot-add-the-same-contributor-twice", + "keyword": "Scenario", + "line": 74, + "name": "Cannot add the same contributor twice", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 84521082 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 75, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 159950417 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 76, + "name": "a public model \"Dup Model\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 47957582 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 77, + "name": "an authenticated user \"contributor\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 138129874 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 78, + "name": "\"owner\" has added \"contributor\" as a contributor to \"Dup Model\"", + "match": { + "location": "tests/api/model-author.steps.ts:46" + }, + "result": { + "status": "passed", + "duration": 15507874 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 79, + "name": "\"owner\" adds \"contributor\" as a contributor to \"Dup Model\"", + "match": { + "location": "tests/api/model-author.steps.ts:26" + }, + "result": { + "status": "passed", + "duration": 5226875 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 80, + "name": "the response status should be 409", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 45374 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 54665 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + } + ], + "id": "model-authors", + "line": 1, + "keyword": "Feature", + "name": "Model Authors", + "tags": [], + "uri": "tests/api/model-author.feature" + }, + { + "description": " As an authenticated user\n I want to create and edit model drafts\n So that I can prepare a model before publishing", + "elements": [ + { + "description": "", + "id": "model-drafts;create-an-empty-draft", + "keyword": "Scenario", + "line": 6, + "name": "Create an empty draft", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 90759625 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 7, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 144242207 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 8, + "name": "I create an empty draft", + "match": { + "location": "tests/api/model-draft.steps.ts:50" + }, + "result": { + "status": "passed", + "duration": 6075209 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 9, + "name": "the response status should be 201", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 32666 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 10, + "name": "the response body should have property \"id\"", + "match": { + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 32957 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 30749 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-drafts;drafts-require-authentication", + "keyword": "Scenario", + "line": 12, + "name": "Drafts require authentication", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 84972667 + } + }, + { + "arguments": [ + { + "content": "{}", + "line": 14 + } + ], + "keyword": "When ", + "line": 13, + "name": "I send a POST request to \"/api/v1/model-drafts\" with JSON body:", + "match": { + "location": "tests/api/model.steps.ts:91" + }, + "result": { + "status": "passed", + "duration": 1060084 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 17, + "name": "the response status should be 401", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 24250 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 25625 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-drafts;patch-a-draft-with-metadata", + "keyword": "Scenario", + "line": 19, + "name": "Patch a draft with metadata", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 82738707 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 20, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 147188124 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 21, + "name": "an empty draft", + "match": { + "location": "tests/api/model-draft.steps.ts:65" + }, + "result": { + "status": "passed", + "duration": 6319292 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 22, + "name": "I patch the draft with title \"My Draft\" and visibility \"private\"", + "match": { + "location": "tests/api/model-draft.steps.ts:106" + }, + "result": { + "status": "passed", + "duration": 3911833 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 23, + "name": "the response status should be 204", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 29792 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 40500 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-drafts;read-back-a-draft-after-patching-it", + "keyword": "Scenario", + "line": 25, + "name": "Read back a draft after patching it", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 82415541 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 26, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 141904375 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 27, + "name": "an empty draft", + "match": { + "location": "tests/api/model-draft.steps.ts:65" + }, + "result": { + "status": "passed", + "duration": 5777624 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 28, + "name": "I patch the draft with title \"Readable Draft\" and visibility \"public\"", + "match": { + "location": "tests/api/model-draft.steps.ts:106" + }, + "result": { + "status": "passed", + "duration": 3702083 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 29, + "name": "I get the draft", + "match": { + "location": "tests/api/model-draft.steps.ts:120" + }, + "result": { + "status": "passed", + "duration": 7987208 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 30, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 46000 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 31, + "name": "the response body property \"id\" should not be empty", + "match": { + "location": "tests/api/model-draft.steps.ts:186" + }, + "result": { + "status": "passed", + "duration": 42957 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 32, + "name": "the draft response should have data title equal to \"Readable Draft\"", + "match": { + "location": "tests/api/model-draft.steps.ts:194" + }, + "result": { + "status": "passed", + "duration": 28084 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 52541 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-drafts;list-drafts-for-the-current-user", + "keyword": "Scenario", + "line": 34, + "name": "List drafts for the current user", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 79643959 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 35, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 153285041 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 36, + "name": "an empty draft", + "match": { + "location": "tests/api/model-draft.steps.ts:65" + }, + "result": { + "status": "passed", + "duration": 8366915 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 37, + "name": "I list my drafts", + "match": { + "location": "tests/api/model-draft.steps.ts:130" + }, + "result": { + "status": "passed", + "duration": 10732332 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 38, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 52458 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 39, + "name": "the response body should have property \"data\" as an array", + "match": { + "location": "tests/shared/common.steps.ts:41" + }, + "result": { + "status": "passed", + "duration": 50417 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 40, + "name": "the response body property \"data\" should have length 1", + "match": { + "location": "tests/shared/common.steps.ts:49" + }, + "result": { + "status": "passed", + "duration": 45958 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 55958 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-drafts;another-user-cannot-read-my-draft", + "keyword": "Scenario", + "line": 42, + "name": "Another user cannot read my draft", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 87016583 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 43, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 148479166 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 44, + "name": "\"owner\" creates an empty draft", + "match": { + "location": "tests/api/model-draft.steps.ts:72" + }, + "result": { + "status": "passed", + "duration": 5580207 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 45, + "name": "an authenticated user \"stranger\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 136302584 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 46, + "name": "\"stranger\" gets the draft owned by \"owner\"", + "match": { + "location": "tests/api/model-draft.steps.ts:139" + }, + "result": { + "status": "passed", + "duration": 4664208 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 47, + "name": "the response status should be 403", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 35250 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 48457 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-drafts;abandon-a-draft", + "keyword": "Scenario", + "line": 49, + "name": "Abandon a draft", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 95606875 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 50, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 145478832 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 51, + "name": "an empty draft", + "match": { + "location": "tests/api/model-draft.steps.ts:65" + }, + "result": { + "status": "passed", + "duration": 6241833 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 52, + "name": "I abandon the draft", + "match": { + "location": "tests/api/model-draft.steps.ts:152" + }, + "result": { + "status": "passed", + "duration": 6638958 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 53, + "name": "the response status should be 204", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 41916 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 38500 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-drafts;cannot-publish-a-draft-without-a-primary-file", + "keyword": "Scenario", + "line": 55, + "name": "Cannot publish a draft without a primary file", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 79576333 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 56, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 146110041 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 57, + "name": "an empty draft", + "match": { + "location": "tests/api/model-draft.steps.ts:65" + }, + "result": { + "status": "passed", + "duration": 5417584 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 58, + "name": "I patch the draft with title \"No File Draft\" and visibility \"public\"", + "match": { + "location": "tests/api/model-draft.steps.ts:106" + }, + "result": { + "status": "passed", + "duration": 4216749 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 59, + "name": "I publish the draft", + "match": { + "location": "tests/api/model-draft.steps.ts:176" + }, + "result": { + "status": "passed", + "duration": 3011082 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 60, + "name": "the response status should be 409", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 22875 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 22582 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-drafts;publishing-a-complete-draft-creates-a-model", + "keyword": "Scenario", + "line": 62, + "name": "Publishing a complete draft creates a model", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 79254750 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 63, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 141130500 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 64, + "name": "an empty draft", + "match": { + "location": "tests/api/model-draft.steps.ts:65" + }, + "result": { + "status": "passed", + "duration": 5369334 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 65, + "name": "I patch the draft with title \"Complete Draft\" and visibility \"public\"", + "match": { + "location": "tests/api/model-draft.steps.ts:106" + }, + "result": { + "status": "passed", + "duration": 3734249 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 66, + "name": "I upload a primary file to the draft", + "match": { + "location": "tests/api/model-draft.steps.ts:162" + }, + "result": { + "status": "passed", + "duration": 8659583 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 67, + "name": "I publish the draft", + "match": { + "location": "tests/api/model-draft.steps.ts:176" + }, + "result": { + "status": "passed", + "duration": 29024625 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 68, + "name": "the response status should be 201", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 32459 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 69, + "name": "the response body should have property \"modelId\"", + "match": { + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 61208 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 70, + "name": "the response body should have property \"versionNumber\"", + "match": { + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 11082 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 31166 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-drafts;publishing-a-draft-seeded-from-an-existing-model-creates-a-new-version", + "keyword": "Scenario", + "line": 73, + "name": "Publishing a draft seeded from an existing model creates a new version", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 81220207 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 74, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 143441624 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 75, + "name": "a public model \"Editable Model\" created by the current user", + "match": { + "location": "tests/api/model.steps.ts:118" + }, + "result": { + "status": "passed", + "duration": 44500417 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 76, + "name": "a draft seeded from the model \"Editable Model\"", + "match": { + "location": "tests/api/model-draft.steps.ts:86" + }, + "result": { + "status": "passed", + "duration": 19796124 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 77, + "name": "I patch the draft with title \"Editable Model v2\" and visibility \"public\"", + "match": { + "location": "tests/api/model-draft.steps.ts:106" + }, + "result": { + "status": "passed", + "duration": 5681000 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 78, + "name": "I publish the draft", + "match": { + "location": "tests/api/model-draft.steps.ts:176" + }, + "result": { + "status": "passed", + "duration": 23510792 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 79, + "name": "the response status should be 201", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 45500 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 80, + "name": "the response body should have property \"modelId\"", + "match": { + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 34374 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 81, + "name": "the response body property \"versionNumber\" should equal \"2\"", + "match": { + "location": "tests/shared/common.steps.ts:25" + }, + "result": { + "status": "passed", + "duration": 57457 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 32875 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [ + { + "name": "@smoke", + "line": 72 + } + ], + "type": "scenario" + }, + { + "description": "", + "id": "model-drafts;a-user-cannot-start-a-draft-targeting-another-user's-model", + "keyword": "Scenario", + "line": 87, + "name": "A user cannot start a draft targeting another user's model", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 83218415 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 88, + "name": "an authenticated user \"victim\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 143224082 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 89, + "name": "a public model \"Victim Model\" created by \"victim\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 44000832 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 90, + "name": "an authenticated user \"attacker\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 139015417 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 91, + "name": "\"attacker\" creates a draft targeting the model \"Victim Model\"", + "match": { + "location": "tests/api/model-draft.steps.ts:202" + }, + "result": { + "status": "passed", + "duration": 6689666 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 92, + "name": "the response status should not be 201", + "match": { + "location": "tests/api/security.steps.ts:61" + }, + "result": { + "status": "passed", + "duration": 77042 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 93, + "name": "the response status should not be 200", + "match": { + "location": "tests/api/security.steps.ts:61" + }, + "result": { + "status": "passed", + "duration": 8958 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 30208 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [ + { + "name": "@security", + "line": 86 + } + ], + "type": "scenario" + } + ], + "id": "model-drafts", + "line": 1, + "keyword": "Feature", + "name": "Model Drafts", + "tags": [], + "uri": "tests/api/model-draft.feature" + }, + { + "description": " As the system\n I want to record views, runs, downloads, and shares of a model\n So that we can show engagement metrics", + "elements": [ + { + "description": "", + "id": "model-interactions;anonymous-user-records-a-view", + "keyword": "Scenario", + "line": 6, + "name": "Anonymous user records a view", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 81088250 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 7, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 141399207 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 8, + "name": "a public model \"Viewable\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 42590457 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 9, + "name": "an anonymous viewer records a \"view\" interaction on \"Viewable\"", + "match": { + "location": "tests/api/model-interaction.steps.ts:45" + }, + "result": { + "status": "passed", + "duration": 10378708 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 10, + "name": "the response status should be 204", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 33541 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 37209 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-interactions;recording-a-run-increments-the-run-count", + "keyword": "Scenario", + "line": 12, + "name": "Recording a run increments the run count", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 80894958 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 13, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 150891042 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 14, + "name": "a public model \"Runnable\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 71292041 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 15, + "name": "an authenticated user \"viewer\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 142376749 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 16, + "name": "\"viewer\" records a \"run\" interaction on \"Runnable\"", + "match": { + "location": "tests/api/model-interaction.steps.ts:58" + }, + "result": { + "status": "passed", + "duration": 14136291 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 17, + "name": "the response status should be 204", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 44458 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 18, + "name": "\"viewer\" gets the interactions summary for \"Runnable\"", + "match": { + "location": "tests/api/model-interaction.steps.ts:76" + }, + "result": { + "status": "passed", + "duration": 13528833 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 19, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 37583 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 20, + "name": "the interactions summary \"runs\" should be 1", + "match": { + "location": "tests/api/model-interaction.steps.ts:89" + }, + "result": { + "status": "passed", + "duration": 43917 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 39333 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-interactions;recording-a-download-increments-the-download-count", + "keyword": "Scenario", + "line": 22, + "name": "Recording a download increments the download count", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 87679749 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 23, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 143419541 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 24, + "name": "a public model \"Downloadable\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 43280499 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 25, + "name": "an authenticated user \"viewer\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 154113790 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 26, + "name": "\"viewer\" records a \"download\" interaction on \"Downloadable\"", + "match": { + "location": "tests/api/model-interaction.steps.ts:58" + }, + "result": { + "status": "passed", + "duration": 19634000 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 27, + "name": "\"viewer\" gets the interactions summary for \"Downloadable\"", + "match": { + "location": "tests/api/model-interaction.steps.ts:76" + }, + "result": { + "status": "passed", + "duration": 9771999 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 28, + "name": "the interactions summary \"downloads\" should be 1", + "match": { + "location": "tests/api/model-interaction.steps.ts:89" + }, + "result": { + "status": "passed", + "duration": 48584 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 40333 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-interactions;interactions-summary-returns-the-full-shape", + "keyword": "Scenario", + "line": 30, + "name": "Interactions summary returns the full shape", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 82578875 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 31, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 142967625 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 32, + "name": "a public model \"Stats Model\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 51325333 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 33, + "name": "\"owner\" gets the interactions summary for \"Stats Model\"", + "match": { + "location": "tests/api/model-interaction.steps.ts:76" + }, + "result": { + "status": "passed", + "duration": 7825584 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 34, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 30249 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 35, + "name": "the response body should have property \"likes\"", + "match": { + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 59875 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 36, + "name": "the response body should have property \"views\"", + "match": { + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 9667 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 37, + "name": "the response body should have property \"runs\"", + "match": { + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 8374 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 38, + "name": "the response body should have property \"downloads\"", + "match": { + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 8166 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 39, + "name": "the response body should have property \"shares\"", + "match": { + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 7499 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 40, + "name": "the response body should have property \"likedByMe\"", + "match": { + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 7375 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 34750 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-interactions;cannot-record-an-interaction-on-a-private-model-owned-by-someone-else", + "keyword": "Scenario", + "line": 42, + "name": "Cannot record an interaction on a private model owned by someone else", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 75513042 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 43, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 159573207 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 44, + "name": "a private model \"Closed\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:145" + }, + "result": { + "status": "passed", + "duration": 49579832 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 45, + "name": "an authenticated user \"outsider\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 147769041 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 46, + "name": "\"outsider\" records a \"view\" interaction on \"Closed\"", + "match": { + "location": "tests/api/model-interaction.steps.ts:58" + }, + "result": { + "status": "passed", + "duration": 8727582 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 47, + "name": "the response status should be 403", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 39167 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 51666 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-interactions;view-dedupe-is-counted-once-within-the-window", + "keyword": "Scenario", + "line": 49, + "name": "View dedupe is counted once within the window", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 85778207 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 50, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 147994042 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 51, + "name": "a public model \"Deduped\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 44917249 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 52, + "name": "an authenticated user \"viewer\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 137950791 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 53, + "name": "\"viewer\" records a \"view\" interaction on \"Deduped\"", + "match": { + "location": "tests/api/model-interaction.steps.ts:58" + }, + "result": { + "status": "passed", + "duration": 17469832 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 54, + "name": "\"viewer\" records a \"view\" interaction on \"Deduped\"", + "match": { + "location": "tests/api/model-interaction.steps.ts:58" + }, + "result": { + "status": "passed", + "duration": 5946166 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 55, + "name": "\"viewer\" gets the interactions summary for \"Deduped\"", + "match": { + "location": "tests/api/model-interaction.steps.ts:76" + }, + "result": { + "status": "passed", + "duration": 5323458 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 56, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 27708 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 57, + "name": "the interactions summary \"views\" should be 1", + "match": { + "location": "tests/api/model-interaction.steps.ts:89" + }, + "result": { + "status": "passed", + "duration": 43832 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 38500 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-interactions;model-card-stats-reflect-recorded-interactions", + "keyword": "Scenario", + "line": 59, + "name": "Model card stats reflect recorded interactions", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 128586041 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 60, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 152126250 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 61, + "name": "a public model \"Counted\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 41472250 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 62, + "name": "an authenticated user \"viewer\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 152364584 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 63, + "name": "\"viewer\" records a \"run\" interaction on \"Counted\"", + "match": { + "location": "tests/api/model-interaction.steps.ts:58" + }, + "result": { + "status": "passed", + "duration": 20454624 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 64, + "name": "\"viewer\" records a \"download\" interaction on \"Counted\"", + "match": { + "location": "tests/api/model-interaction.steps.ts:58" + }, + "result": { + "status": "passed", + "duration": 6887999 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 65, + "name": "\"owner\" gets the card for model \"Counted\"", + "match": { + "location": "tests/api/model-interaction.steps.ts:97" + }, + "result": { + "status": "passed", + "duration": 30655458 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 66, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 39333 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 67, + "name": "the response body path \"stats.runs\" should be 1", + "match": { + "location": "tests/shared/common.steps.ts:81" + }, + "result": { + "status": "passed", + "duration": 69000 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 68, + "name": "the response body path \"stats.downloads\" should be 1", + "match": { + "location": "tests/shared/common.steps.ts:81" + }, + "result": { + "status": "passed", + "duration": 17583 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 39667 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + } + ], + "id": "model-interactions", + "line": 1, + "keyword": "Feature", + "name": "Model Interactions", + "tags": [], + "uri": "tests/api/model-interaction.feature" + }, + { + "description": " As a user\n I want to like models\n So that I can keep track of the models I find useful", + "elements": [ + { + "description": "", + "id": "model-likes;anonymous-viewer-sees-zero-likes", + "keyword": "Scenario", + "line": 6, + "name": "Anonymous viewer sees zero likes", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 89234292 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 7, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 148851167 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 8, + "name": "a public model \"Likeable\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 51433042 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 9, + "name": "I get the like summary for \"Likeable\"", + "match": { + "location": "tests/api/model-like.steps.ts:73" + }, + "result": { + "status": "passed", + "duration": 24970124 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 10, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 38749 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 11, + "name": "the like summary count should be 0", + "match": { + "location": "tests/api/model-like.steps.ts:99" + }, + "result": { + "status": "passed", + "duration": 36541 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 12, + "name": "the response body should have property \"likedByMe\" equal to false", + "match": { + "location": "tests/shared/common.steps.ts:73" + }, + "result": { + "status": "passed", + "duration": 24249 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 43334 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-likes;an-authenticated-user-likes-a-model", + "keyword": "Scenario", + "line": 14, + "name": "An authenticated user likes a model", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 91604999 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 15, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 156803125 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 16, + "name": "a public model \"Liked Model\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 46956624 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 17, + "name": "an authenticated user \"fan\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 136561416 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 18, + "name": "\"fan\" likes \"Liked Model\"", + "match": { + "location": "tests/api/model-like.steps.ts:28" + }, + "result": { + "status": "passed", + "duration": 11829208 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 19, + "name": "the response status should be 204", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 42292 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 37916 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-likes;liking-a-model-is-reflected-in-the-summary", + "keyword": "Scenario", + "line": 21, + "name": "Liking a model is reflected in the summary", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 75039000 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 22, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 142118875 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 23, + "name": "a public model \"Famous Model\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 45254415 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 24, + "name": "an authenticated user \"fan\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 136217375 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 25, + "name": "\"fan\" has liked \"Famous Model\"", + "match": { + "location": "tests/api/model-like.steps.ts:61" + }, + "result": { + "status": "passed", + "duration": 14432082 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 26, + "name": "\"fan\" gets the like summary for \"Famous Model\"", + "match": { + "location": "tests/api/model-like.steps.ts:86" + }, + "result": { + "status": "passed", + "duration": 4801708 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 27, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 40374 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 28, + "name": "the like summary count should be 1", + "match": { + "location": "tests/api/model-like.steps.ts:99" + }, + "result": { + "status": "passed", + "duration": 25625 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 29, + "name": "the response body should have property \"likedByMe\" equal to true", + "match": { + "location": "tests/shared/common.steps.ts:65" + }, + "result": { + "status": "passed", + "duration": 68999 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 34041 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-likes;liking-the-same-model-twice-does-not-double-count", + "keyword": "Scenario", + "line": 31, + "name": "Liking the same model twice does not double-count", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 86629750 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 32, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 138856458 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 33, + "name": "a public model \"Idempotent\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 42666583 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 34, + "name": "an authenticated user \"fan\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 135951041 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 35, + "name": "\"fan\" has liked \"Idempotent\"", + "match": { + "location": "tests/api/model-like.steps.ts:61" + }, + "result": { + "status": "passed", + "duration": 13966958 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 36, + "name": "\"fan\" likes \"Idempotent\"", + "match": { + "location": "tests/api/model-like.steps.ts:28" + }, + "result": { + "status": "passed", + "duration": 5281041 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 37, + "name": "the response status should be 204", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 29041 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 38, + "name": "\"fan\" gets the like summary for \"Idempotent\"", + "match": { + "location": "tests/api/model-like.steps.ts:86" + }, + "result": { + "status": "passed", + "duration": 3888792 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 39, + "name": "the like summary count should be 1", + "match": { + "location": "tests/api/model-like.steps.ts:99" + }, + "result": { + "status": "passed", + "duration": 29582 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 32209 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-likes;unliking-a-model-removes-the-like", + "keyword": "Scenario", + "line": 41, + "name": "Unliking a model removes the like", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 90303041 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 42, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 141477208 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 43, + "name": "a public model \"Unlikeable\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 41117417 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 44, + "name": "an authenticated user \"fan\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 137605625 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 45, + "name": "\"fan\" has liked \"Unlikeable\"", + "match": { + "location": "tests/api/model-like.steps.ts:61" + }, + "result": { + "status": "passed", + "duration": 14238666 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 46, + "name": "\"fan\" unlikes \"Unlikeable\"", + "match": { + "location": "tests/api/model-like.steps.ts:48" + }, + "result": { + "status": "passed", + "duration": 7725040 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 47, + "name": "the response status should be 204", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 41917 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 48, + "name": "\"fan\" gets the like summary for \"Unlikeable\"", + "match": { + "location": "tests/api/model-like.steps.ts:86" + }, + "result": { + "status": "passed", + "duration": 3198124 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 49, + "name": "the like summary count should be 0", + "match": { + "location": "tests/api/model-like.steps.ts:99" + }, + "result": { + "status": "passed", + "duration": 21749 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 50, + "name": "the response body should have property \"likedByMe\" equal to false", + "match": { + "location": "tests/shared/common.steps.ts:73" + }, + "result": { + "status": "passed", + "duration": 45084 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 32041 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-likes;liking-requires-authentication", + "keyword": "Scenario", + "line": 52, + "name": "Liking requires authentication", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 79919042 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 53, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 143302083 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 54, + "name": "a public model \"Auth Required\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 43319292 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 55, + "name": "an anonymous viewer likes \"Auth Required\"", + "match": { + "location": "tests/api/model-like.steps.ts:37" + }, + "result": { + "status": "passed", + "duration": 883582 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 56, + "name": "the response status should be 401", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 18166 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 35332 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-likes;cannot-like-a-private-model-owned-by-someone-else", + "keyword": "Scenario", + "line": 58, + "name": "Cannot like a private model owned by someone else", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 107707708 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 59, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 144042333 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 60, + "name": "a private model \"Secret\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:145" + }, + "result": { + "status": "passed", + "duration": 42106708 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 61, + "name": "an authenticated user \"stranger\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 133720042 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 62, + "name": "\"stranger\" likes \"Secret\"", + "match": { + "location": "tests/api/model-like.steps.ts:28" + }, + "result": { + "status": "passed", + "duration": 6815416 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 63, + "name": "the response status should be 403", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 26792 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 38042 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + } + ], + "id": "model-likes", + "line": 1, + "keyword": "Feature", + "name": "Model Likes", + "tags": [], + "uri": "tests/api/model-like.feature" + }, + { + "description": " As a model owner\n I want to manage access permissions\n So that I can control who can read, write, or administer my models", + "elements": [ + { + "description": "", + "id": "model-permissions;grant-read-permission-to-another-user", + "keyword": "Scenario", + "line": 6, + "name": "Grant read permission to another user", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 82726042 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 7, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 142778708 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 8, + "name": "a private model \"Shared Model\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:145" + }, + "result": { + "status": "passed", + "duration": 40903708 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 9, + "name": "an authenticated user \"reader\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 139538416 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 10, + "name": "\"owner\" grants \"read\" permission on \"Shared Model\" to \"reader\"", + "match": { + "location": "tests/api/model-permission.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 16785125 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 11, + "name": "the response status should be 201", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 35249 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 40958 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-permissions;user-with-read-permission-can-access-a-private-model", + "keyword": "Scenario", + "line": 13, + "name": "User with read permission can access a private model", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 82370750 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 14, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 156799250 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 15, + "name": "a private model \"Readable Model\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:145" + }, + "result": { + "status": "passed", + "duration": 47354374 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 16, + "name": "an authenticated user \"reader\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 150569207 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 17, + "name": "\"owner\" has granted \"read\" permission on \"Readable Model\" to \"reader\"", + "match": { + "location": "tests/api/model-permission.steps.ts:35" + }, + "result": { + "status": "passed", + "duration": 10268166 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 18, + "name": "\"reader\" gets the model \"Readable Model\"", + "match": { + "location": "tests/api/model.steps.ts:185" + }, + "result": { + "status": "passed", + "duration": 11246917 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 19, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 33583 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 36207 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-permissions;user-with-write-permission-can-update-a-model", + "keyword": "Scenario", + "line": 21, + "name": "User with write permission can update a model", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 84927250 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 22, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 158855917 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 23, + "name": "a public model \"Writable Model\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 50089875 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 24, + "name": "an authenticated user \"writer\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 137078084 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 25, + "name": "\"owner\" has granted \"write\" permission on \"Writable Model\" to \"writer\"", + "match": { + "location": "tests/api/model-permission.steps.ts:35" + }, + "result": { + "status": "passed", + "duration": 13744666 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 26, + "name": "\"writer\" updates the model \"Writable Model\" with visibility \"private\"", + "match": { + "location": "tests/api/model-permission.steps.ts:108" + }, + "result": { + "status": "passed", + "duration": 7622500 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 27, + "name": "the response status should be 204", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 40834 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 51000 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-permissions;user-with-read-permission-cannot-update-a-model", + "keyword": "Scenario", + "line": 29, + "name": "User with read permission cannot update a model", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 83716416 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 30, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 158331833 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 31, + "name": "a public model \"Read Only Model\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 48792874 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 32, + "name": "an authenticated user \"reader\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 140559375 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 33, + "name": "\"owner\" has granted \"read\" permission on \"Read Only Model\" to \"reader\"", + "match": { + "location": "tests/api/model-permission.steps.ts:35" + }, + "result": { + "status": "passed", + "duration": 12701541 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 34, + "name": "\"reader\" updates the model \"Read Only Model\" with visibility \"private\"", + "match": { + "location": "tests/api/model-permission.steps.ts:108" + }, + "result": { + "status": "passed", + "duration": 5304000 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 35, + "name": "the response status should be 403", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 25750 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 31374 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-permissions;list-permissions-on-a-model", + "keyword": "Scenario", + "line": 37, + "name": "List permissions on a model", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 82599707 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 38, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 145147375 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 39, + "name": "a private model \"Listed Model\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:145" + }, + "result": { + "status": "passed", + "duration": 40183874 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 40, + "name": "an authenticated user \"collaborator\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 134261499 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 41, + "name": "\"owner\" has granted \"write\" permission on \"Listed Model\" to \"collaborator\"", + "match": { + "location": "tests/api/model-permission.steps.ts:35" + }, + "result": { + "status": "passed", + "duration": 14596750 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 42, + "name": "\"owner\" lists permissions on \"Listed Model\"", + "match": { + "location": "tests/api/model-permission.steps.ts:61" + }, + "result": { + "status": "passed", + "duration": 5244750 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 43, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 27792 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 44, + "name": "the response body should be an array", + "match": { + "location": "tests/shared/common.steps.ts:33" + }, + "result": { + "status": "passed", + "duration": 43709 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 37541 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-permissions;revoke-permission", + "keyword": "Scenario", + "line": 46, + "name": "Revoke permission", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 81906083 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 47, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 152983166 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 48, + "name": "a private model \"Revoke Model\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:145" + }, + "result": { + "status": "passed", + "duration": 51006083 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 49, + "name": "an authenticated user \"former\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 155647666 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 50, + "name": "\"owner\" has granted \"read\" permission on \"Revoke Model\" to \"former\"", + "match": { + "location": "tests/api/model-permission.steps.ts:35" + }, + "result": { + "status": "passed", + "duration": 16172749 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 51, + "name": "\"owner\" revokes permission on \"Revoke Model\" from \"former\"", + "match": { + "location": "tests/api/model-permission.steps.ts:75" + }, + "result": { + "status": "passed", + "duration": 7270416 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 52, + "name": "the response status should be 204", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 32374 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 38082 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-permissions;revoked-user-can-no-longer-access-a-private-model", + "keyword": "Scenario", + "line": 54, + "name": "Revoked user can no longer access a private model", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 84724958 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 55, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 147582500 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 56, + "name": "a private model \"Locked Out Model\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:145" + }, + "result": { + "status": "passed", + "duration": 40940166 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 57, + "name": "an authenticated user \"former\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 141163000 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 58, + "name": "\"owner\" has granted \"read\" permission on \"Locked Out Model\" to \"former\"", + "match": { + "location": "tests/api/model-permission.steps.ts:35" + }, + "result": { + "status": "passed", + "duration": 16001499 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 59, + "name": "\"owner\" has revoked permission on \"Locked Out Model\" from \"former\"", + "match": { + "location": "tests/api/model-permission.steps.ts:90" + }, + "result": { + "status": "passed", + "duration": 6542709 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 60, + "name": "\"former\" gets the model \"Locked Out Model\"", + "match": { + "location": "tests/api/model.steps.ts:185" + }, + "result": { + "status": "passed", + "duration": 3120292 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 61, + "name": "the response status should be 403", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 40791 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 33542 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-permissions;non-admin-cannot-grant-permissions", + "keyword": "Scenario", + "line": 63, + "name": "Non-admin cannot grant permissions", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 79528125 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 64, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 144646250 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 65, + "name": "a public model \"Locked Model\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 40823374 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 66, + "name": "an authenticated user \"intruder\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 137892416 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 67, + "name": "\"intruder\" grants \"write\" permission on \"Locked Model\" to \"intruder\"", + "match": { + "location": "tests/api/model-permission.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 10059499 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 68, + "name": "the response status should be 403", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 38915 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 35625 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-permissions;cannot-grant-duplicate-permission", + "keyword": "Scenario", + "line": 70, + "name": "Cannot grant duplicate permission", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 83945125 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 71, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 145184832 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 72, + "name": "a private model \"Dup Perm Model\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:145" + }, + "result": { + "status": "passed", + "duration": 41263167 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 73, + "name": "an authenticated user \"grantee\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 136259165 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 74, + "name": "\"owner\" has granted \"read\" permission on \"Dup Perm Model\" to \"grantee\"", + "match": { + "location": "tests/api/model-permission.steps.ts:35" + }, + "result": { + "status": "passed", + "duration": 16621083 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 75, + "name": "\"owner\" grants \"read\" permission on \"Dup Perm Model\" to \"grantee\"", + "match": { + "location": "tests/api/model-permission.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 5489499 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 76, + "name": "the response status should be 409", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 27208 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 44999 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-permissions;grant-admin-permission-allows-managing-permissions", + "keyword": "Scenario", + "line": 78, + "name": "Grant admin permission allows managing permissions", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 81537291 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 79, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 145796500 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 80, + "name": "a private model \"Delegated Model\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:145" + }, + "result": { + "status": "passed", + "duration": 42739375 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 81, + "name": "an authenticated user \"delegate\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 136843333 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 82, + "name": "\"owner\" has granted \"admin\" permission on \"Delegated Model\" to \"delegate\"", + "match": { + "location": "tests/api/model-permission.steps.ts:35" + }, + "result": { + "status": "passed", + "duration": 16483958 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 83, + "name": "an authenticated user \"third\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 152773958 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 84, + "name": "\"delegate\" grants \"read\" permission on \"Delegated Model\" to \"third\"", + "match": { + "location": "tests/api/model-permission.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 10119249 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 85, + "name": "the response status should be 201", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 39625 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 38874 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + } + ], + "id": "model-permissions", + "line": 1, + "keyword": "Feature", + "name": "Model Permissions", + "tags": [], + "uri": "tests/api/model-permission.feature" + }, + { + "description": " As a model author\n I want to tag model versions\n So that models are discoverable by topic", + "elements": [ + { + "description": "", + "id": "model-version-tags;add-a-tag-to-a-model's-current-version", + "keyword": "Scenario", + "line": 6, + "name": "Add a tag to a model's current version", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 82629791 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 7, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 143878499 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 8, + "name": "a public model \"Tagged Model\" created by the current user", + "match": { + "location": "tests/api/model.steps.ts:118" + }, + "result": { + "status": "passed", + "duration": 48228957 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 9, + "name": "a version \"v1\" for \"Tagged Model\" with title \"Initial\"", + "match": { + "location": "tests/api/model-version.steps.ts:48" + }, + "result": { + "status": "passed", + "duration": 16341917 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 10, + "name": "I add tag \"ecology\" to model \"Tagged Model\"", + "match": { + "location": "tests/api/model-version-tag.steps.ts:18" + }, + "result": { + "status": "passed", + "duration": 19118957 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 11, + "name": "the response status should be 201", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 47790 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 12, + "name": "the response body should have property \"tagId\"", + "match": { + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 37541 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 13, + "name": "the response body property \"tagName\" should equal \"ecology\"", + "match": { + "location": "tests/shared/common.steps.ts:25" + }, + "result": { + "status": "passed", + "duration": 26999 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 37749 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-version-tags;add-multiple-tags-to-a-model", + "keyword": "Scenario", + "line": 15, + "name": "Add multiple tags to a model", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 77666582 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 16, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 145867207 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 17, + "name": "a public model \"Multi Tag Model\" created by the current user", + "match": { + "location": "tests/api/model.steps.ts:118" + }, + "result": { + "status": "passed", + "duration": 42351749 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 18, + "name": "a version \"v1\" for \"Multi Tag Model\" with title \"Initial\"", + "match": { + "location": "tests/api/model-version.steps.ts:48" + }, + "result": { + "status": "passed", + "duration": 15576582 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 19, + "name": "I add tag \"simulation\" to model \"Multi Tag Model\"", + "match": { + "location": "tests/api/model-version-tag.steps.ts:18" + }, + "result": { + "status": "passed", + "duration": 11163375 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 20, + "name": "the response status should be 201", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 29957 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 21, + "name": "I add tag \"netlogo\" to model \"Multi Tag Model\"", + "match": { + "location": "tests/api/model-version-tag.steps.ts:18" + }, + "result": { + "status": "passed", + "duration": 8037291 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 22, + "name": "the response status should be 201", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 47417 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 48374 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-version-tags;cannot-add-the-same-tag-twice", + "keyword": "Scenario", + "line": 24, + "name": "Cannot add the same tag twice", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 73804292 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 25, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 141975042 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 26, + "name": "a public model \"Dup Tag Model\" created by the current user", + "match": { + "location": "tests/api/model.steps.ts:118" + }, + "result": { + "status": "passed", + "duration": 50037292 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 27, + "name": "a version \"v1\" for \"Dup Tag Model\" with title \"Initial\"", + "match": { + "location": "tests/api/model-version.steps.ts:48" + }, + "result": { + "status": "passed", + "duration": 17339082 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 28, + "name": "tag \"duplicate\" has been added to model \"Dup Tag Model\"", + "match": { + "location": "tests/api/model-version-tag.steps.ts:36" + }, + "result": { + "status": "passed", + "duration": 10661917 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 29, + "name": "I add tag \"duplicate\" to model \"Dup Tag Model\"", + "match": { + "location": "tests/api/model-version-tag.steps.ts:18" + }, + "result": { + "status": "passed", + "duration": 5298041 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 30, + "name": "the response status should be 409", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 31375 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 49125 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-version-tags;remove-a-tag-from-a-model", + "keyword": "Scenario", + "line": 32, + "name": "Remove a tag from a model", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 72372791 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 33, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 143746875 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 34, + "name": "a public model \"Untagged Model\" created by the current user", + "match": { + "location": "tests/api/model.steps.ts:118" + }, + "result": { + "status": "passed", + "duration": 41462625 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 35, + "name": "a version \"v1\" for \"Untagged Model\" with title \"Initial\"", + "match": { + "location": "tests/api/model-version.steps.ts:48" + }, + "result": { + "status": "passed", + "duration": 15738166 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 36, + "name": "tag \"removable\" has been added to model \"Untagged Model\"", + "match": { + "location": "tests/api/model-version-tag.steps.ts:36" + }, + "result": { + "status": "passed", + "duration": 12284999 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 37, + "name": "I remove tag \"removable\" from model \"Untagged Model\"", + "match": { + "location": "tests/api/model-version-tag.steps.ts:55" + }, + "result": { + "status": "passed", + "duration": 7472916 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 38, + "name": "the response status should be 204", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 36917 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 46834 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-version-tags;list-tags-for-a-specific-version", + "keyword": "Scenario", + "line": 40, + "name": "List tags for a specific version", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 72806500 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 41, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 145973707 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 42, + "name": "a public model \"Version Tags\" created by the current user", + "match": { + "location": "tests/api/model.steps.ts:118" + }, + "result": { + "status": "passed", + "duration": 42041916 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 43, + "name": "a version \"v1\" for \"Version Tags\" with title \"First\"", + "match": { + "location": "tests/api/model-version.steps.ts:48" + }, + "result": { + "status": "passed", + "duration": 17198832 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 44, + "name": "tag \"biology\" has been added to model \"Version Tags\"", + "match": { + "location": "tests/api/model-version-tag.steps.ts:36" + }, + "result": { + "status": "passed", + "duration": 10739540 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 45, + "name": "I list tags for version 1 of model \"Version Tags\"", + "match": { + "location": "tests/api/model-version-tag.steps.ts:69" + }, + "result": { + "status": "passed", + "duration": 4772583 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 46, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 36625 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 47, + "name": "the response body should be an array", + "match": { + "location": "tests/shared/common.steps.ts:33" + }, + "result": { + "status": "passed", + "duration": 24708 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 51791 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-version-tags;tagging-requires-write-permission", + "keyword": "Scenario", + "line": 49, + "name": "Tagging requires write permission", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 72505957 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 50, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 140835541 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 51, + "name": "a private model \"Protected Model\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:145" + }, + "result": { + "status": "passed", + "duration": 38536665 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 52, + "name": "a version \"v1\" for \"Protected Model\" with title \"Secret\"", + "match": { + "location": "tests/api/model-version.steps.ts:48" + }, + "result": { + "status": "passed", + "duration": 15863249 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 53, + "name": "an authenticated user \"stranger\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 139580416 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 54, + "name": "\"stranger\" adds tag \"hacked\" to model \"Protected Model\"", + "match": { + "location": "tests/api/model-version-tag.steps.ts:82" + }, + "result": { + "status": "passed", + "duration": 6454458 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 55, + "name": "the response status should be 403", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 31166 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 40750 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-version-tags;adding-a-tag-creates-the-tag-if-it-does-not-exist", + "keyword": "Scenario", + "line": 57, + "name": "Adding a tag creates the tag if it does not exist", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 82352958 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 58, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 144001625 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 59, + "name": "a public model \"New Tag Model\" created by the current user", + "match": { + "location": "tests/api/model.steps.ts:118" + }, + "result": { + "status": "passed", + "duration": 57736625 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 60, + "name": "a version \"v1\" for \"New Tag Model\" with title \"Initial\"", + "match": { + "location": "tests/api/model-version.steps.ts:48" + }, + "result": { + "status": "passed", + "duration": 14638249 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 61, + "name": "I add tag \"brand-new-tag\" to model \"New Tag Model\"", + "match": { + "location": "tests/api/model-version-tag.steps.ts:18" + }, + "result": { + "status": "passed", + "duration": 10336791 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 62, + "name": "the response status should be 201", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 36666 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 63, + "name": "I send a GET request to \"/api/v1/tags?q=brand-new\"", + "match": { + "location": "tests/api/health.steps.ts:4" + }, + "result": { + "status": "passed", + "duration": 4534665 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 64, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 25749 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 40249 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + } + ], + "id": "model-version-tags", + "line": 1, + "keyword": "Feature", + "name": "Model Version Tags", + "tags": [], + "uri": "tests/api/model-version-tag.feature" + }, + { + "description": " As a model author\n I want to manage model versions\n So that I can track changes to my models over time", + "elements": [ + { + "description": "", + "id": "model-versions;create-a-version-for-a-model", + "keyword": "Scenario", + "line": 6, + "name": "Create a version for a model", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 79295458 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 7, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 154138666 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 8, + "name": "a public model \"My Model\" created by the current user", + "match": { + "location": "tests/api/model.steps.ts:118" + }, + "result": { + "status": "passed", + "duration": 47326708 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 9, + "name": "I create a version for \"My Model\" with title \"Initial Version\"", + "match": { + "location": "tests/api/model-version.steps.ts:68" + }, + "result": { + "status": "passed", + "duration": 16670540 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 10, + "name": "the response status should be 201", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 49958 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 11, + "name": "the response body should have property \"versionNumber\"", + "match": { + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 74791 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 42124 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-versions;list-versions-of-a-model-after-creating-an-additional-version", + "keyword": "Scenario", + "line": 21, + "name": "List versions of a model after creating an additional version", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 73974791 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 22, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 146266458 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 23, + "name": "a public model \"Versioned Model\" created by the current user", + "match": { + "location": "tests/api/model.steps.ts:118" + }, + "result": { + "status": "passed", + "duration": 42417916 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 24, + "name": "a version \"v2\" for \"Versioned Model\" with title \"Release 2\"", + "match": { + "location": "tests/api/model-version.steps.ts:48" + }, + "result": { + "status": "passed", + "duration": 15534332 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 25, + "name": "I list versions of the model \"Versioned Model\"", + "match": { + "location": "tests/api/model-version.steps.ts:98" + }, + "result": { + "status": "passed", + "duration": 9189667 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 26, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 35124 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 27, + "name": "the response body should have property \"data\" as an array", + "match": { + "location": "tests/shared/common.steps.ts:41" + }, + "result": { + "status": "passed", + "duration": 42874 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 28, + "name": "the response body property \"data\" should have length 2", + "match": { + "location": "tests/shared/common.steps.ts:49" + }, + "result": { + "status": "passed", + "duration": 27958 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 30000 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-versions;get-a-specific-version-by-number", + "keyword": "Scenario", + "line": 40, + "name": "Get a specific version by number", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 75649624 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 41, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 140500791 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 42, + "name": "a public model \"Specific Model\" created by the current user", + "match": { + "location": "tests/api/model.steps.ts:118" + }, + "result": { + "status": "passed", + "duration": 40751458 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 43, + "name": "a version \"v2\" for \"Specific Model\" with title \"The Version\"", + "match": { + "location": "tests/api/model-version.steps.ts:48" + }, + "result": { + "status": "passed", + "duration": 14947959 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 44, + "name": "I get version 2 of the model \"Specific Model\"", + "match": { + "location": "tests/api/model-version.steps.ts:108" + }, + "result": { + "status": "passed", + "duration": 8688500 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 45, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 46292 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 46, + "name": "the response body property \"title\" should equal \"The Version\"", + "match": { + "location": "tests/shared/common.steps.ts:25" + }, + "result": { + "status": "passed", + "duration": 41042 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 36667 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-versions;update-the-current-version-title", + "keyword": "Scenario", + "line": 48, + "name": "Update the current version title", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 76374874 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 49, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 141505582 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 50, + "name": "a public model \"Editable Model\" created by the current user", + "match": { + "location": "tests/api/model.steps.ts:118" + }, + "result": { + "status": "passed", + "duration": 42494584 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 51, + "name": "a version \"v1\" for \"Editable Model\" with title \"Old Title\"", + "match": { + "location": "tests/api/model-version.steps.ts:48" + }, + "result": { + "status": "passed", + "duration": 13658166 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 52, + "name": "I update the current version of \"Editable Model\" with title \"New Title\"", + "match": { + "location": "tests/api/model-version.steps.ts:121" + }, + "result": { + "status": "passed", + "duration": 9547207 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 53, + "name": "the response status should be 204", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 34166 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 45083 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-versions;update-the-current-version-description", + "keyword": "Scenario", + "line": 55, + "name": "Update the current version description", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 89853416 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 56, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 158567541 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 57, + "name": "a public model \"Described Model\" created by the current user", + "match": { + "location": "tests/api/model.steps.ts:118" + }, + "result": { + "status": "passed", + "duration": 48859457 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 58, + "name": "a version \"v1\" for \"Described Model\" with title \"Some Title\"", + "match": { + "location": "tests/api/model-version.steps.ts:48" + }, + "result": { + "status": "passed", + "duration": 14415750 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 59, + "name": "I update the current version of \"Described Model\" with description \"A detailed description\"", + "match": { + "location": "tests/api/model-version.steps.ts:135" + }, + "result": { + "status": "passed", + "duration": 7158167 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 60, + "name": "the response status should be 204", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 29500 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 43042 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-versions;creating-a-version-requires-write-permission", + "keyword": "Scenario", + "line": 62, + "name": "Creating a version requires write permission", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 78445333 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 63, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 146469417 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 64, + "name": "a private model \"Locked Model\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:145" + }, + "result": { + "status": "passed", + "duration": 43200375 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 65, + "name": "an authenticated user \"stranger\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 136447541 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 66, + "name": "\"stranger\" creates a version for \"Locked Model\" with title \"Nope\"", + "match": { + "location": "tests/api/model-version.steps.ts:83" + }, + "result": { + "status": "passed", + "duration": 5121125 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 67, + "name": "the response status should be 403", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 50458 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 50415 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-versions;listing-versions-requires-read-access", + "keyword": "Scenario", + "line": 69, + "name": "Listing versions requires read access", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 69427541 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 70, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 143669167 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 71, + "name": "a private model \"Private Model\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:145" + }, + "result": { + "status": "passed", + "duration": 40538333 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 72, + "name": "an authenticated user \"stranger\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 134459667 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 73, + "name": "\"stranger\" lists versions of the model \"Private Model\"", + "match": { + "location": "tests/api/model-version.steps.ts:149" + }, + "result": { + "status": "passed", + "duration": 9189166 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 74, + "name": "the response status should be 403", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 38415 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 50917 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-versions;updating-a-version-requires-write-access", + "keyword": "Scenario", + "line": 76, + "name": "Updating a version requires write access", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 98361290 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 77, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 147338625 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 78, + "name": "a public model \"Guarded Model\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 43615207 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 79, + "name": "a version \"v1\" for \"Guarded Model\" with title \"Original\"", + "match": { + "location": "tests/api/model-version.steps.ts:48" + }, + "result": { + "status": "passed", + "duration": 15554541 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 80, + "name": "an authenticated user \"stranger\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 138096292 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 81, + "name": "\"stranger\" updates the current version of \"Guarded Model\" with title \"Hacked\"", + "match": { + "location": "tests/api/model-version.steps.ts:162" + }, + "result": { + "status": "passed", + "duration": 5144917 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 82, + "name": "the response status should be 403", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 28125 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 28624 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-versions;a-freshly-published-model-lists-its-initial-version", + "keyword": "Scenario", + "line": 84, + "name": "A freshly-published model lists its initial version", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 88595750 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 85, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 148864042 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 86, + "name": "a public model \"Initial Model\" created by the current user", + "match": { + "location": "tests/api/model.steps.ts:118" + }, + "result": { + "status": "passed", + "duration": 53047374 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 87, + "name": "I list versions of the model \"Initial Model\"", + "match": { + "location": "tests/api/model-version.steps.ts:98" + }, + "result": { + "status": "passed", + "duration": 5727457 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 88, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 29957 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 89, + "name": "the response body should have property \"data\" as an array", + "match": { + "location": "tests/shared/common.steps.ts:41" + }, + "result": { + "status": "passed", + "duration": 31375 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 90, + "name": "the response body property \"data\" should have length 1", + "match": { + "location": "tests/shared/common.steps.ts:49" + }, + "result": { + "status": "passed", + "duration": 20791 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 32208 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + } + ], + "id": "model-versions", + "line": 1, + "keyword": "Feature", + "name": "Model Versions", + "tags": [], + "uri": "tests/api/model-version.feature" + }, + { + "description": " As a user\n I want to manage models\n So that I can create, view, update, and delete models", + "elements": [ + { + "description": "", + "id": "model-management;create-a-model", + "keyword": "Scenario", + "line": 6, + "name": "Create a model", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 82599166 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 7, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 143414415 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 8, + "name": "I create a model with title \"Wolf Sheep Predation\"", + "match": { + "location": "tests/api/model.steps.ts:107" + }, + "result": { + "status": "passed", + "duration": 46546374 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 9, + "name": "the response status should be 201", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 37165 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 10, + "name": "the response body should have property \"id\"", + "match": { + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 77666 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 39667 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-management;create-a-model-requires-authentication", + "keyword": "Scenario", + "line": 12, + "name": "Create a model requires authentication", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 87883999 + } + }, + { + "arguments": [ + { + "content": "{}", + "line": 14 + } + ], + "keyword": "When ", + "line": 13, + "name": "I send a POST request to \"/api/v1/model-drafts\" with JSON body:", + "match": { + "location": "tests/api/model.steps.ts:91" + }, + "result": { + "status": "passed", + "duration": 863165 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 17, + "name": "the response status should be 401", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 22042 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 23084 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-management;get-a-public-model", + "keyword": "Scenario", + "line": 19, + "name": "Get a public model", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 84840542 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 20, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 164540124 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 21, + "name": "a public model \"Ants\" created by the current user", + "match": { + "location": "tests/api/model.steps.ts:118" + }, + "result": { + "status": "passed", + "duration": 71695457 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 22, + "name": "I get the model \"Ants\"", + "match": { + "location": "tests/api/model.steps.ts:175" + }, + "result": { + "status": "passed", + "duration": 8447458 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 23, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 41457 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 24, + "name": "the response body should have property \"id\"", + "match": { + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 27917 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 38334 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-management;list-public-models", + "keyword": "Scenario", + "line": 26, + "name": "List public models", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 74713041 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 27, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 147329125 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 28, + "name": "a public model \"Model A\" created by the current user", + "match": { + "location": "tests/api/model.steps.ts:118" + }, + "result": { + "status": "passed", + "duration": 71176041 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 29, + "name": "a public model \"Model B\" created by the current user", + "match": { + "location": "tests/api/model.steps.ts:118" + }, + "result": { + "status": "passed", + "duration": 47260249 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 30, + "name": "I send a GET request to \"/api/v1/models\"", + "match": { + "location": "tests/api/health.steps.ts:4" + }, + "result": { + "status": "passed", + "duration": 9362166 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 31, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 39790 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 32, + "name": "the response body should have property \"data\" as an array", + "match": { + "location": "tests/shared/common.steps.ts:41" + }, + "result": { + "status": "passed", + "duration": 24917 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 24916 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-management;update-a-model's-visibility", + "keyword": "Scenario", + "line": 34, + "name": "Update a model's visibility", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 74310459 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 35, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 141833208 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 36, + "name": "a public model \"My Model\" created by the current user", + "match": { + "location": "tests/api/model.steps.ts:118" + }, + "result": { + "status": "passed", + "duration": 44525624 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 37, + "name": "I update the model \"My Model\" with visibility \"private\"", + "match": { + "location": "tests/api/model.steps.ts:198" + }, + "result": { + "status": "passed", + "duration": 7488915 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 38, + "name": "the response status should be 204", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 29999 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 37625 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-management;delete-a-model", + "keyword": "Scenario", + "line": 40, + "name": "Delete a model", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 77999500 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 41, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 167859250 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 42, + "name": "a public model \"To Delete\" created by the current user", + "match": { + "location": "tests/api/model.steps.ts:118" + }, + "result": { + "status": "passed", + "duration": 118330708 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 43, + "name": "I delete the model \"To Delete\"", + "match": { + "location": "tests/api/model.steps.ts:212" + }, + "result": { + "status": "passed", + "duration": 29019958 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 44, + "name": "the response status should be 204", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 39625 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 44541 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-management;cannot-access-a-private-model-without-permission", + "keyword": "Scenario", + "line": 46, + "name": "Cannot access a private model without permission", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 355949083 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 47, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 217289583 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 48, + "name": "a private model \"Secret Model\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:145" + }, + "result": { + "status": "passed", + "duration": 129122708 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 49, + "name": "an authenticated user \"stranger\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 192365958 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 50, + "name": "\"stranger\" gets the model \"Secret Model\"", + "match": { + "location": "tests/api/model.steps.ts:185" + }, + "result": { + "status": "passed", + "duration": 33899459 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 51, + "name": "the response status should be 403", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 89249 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 120582 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-management;search-models-by-keyword", + "keyword": "Scenario", + "line": 53, + "name": "Search models by keyword", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 314908457 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 54, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 199878750 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 55, + "name": "a public model \"Climate Change Sim\" created by the current user", + "match": { + "location": "tests/api/model.steps.ts:118" + }, + "result": { + "status": "passed", + "duration": 132083958 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 56, + "name": "I send a GET request to \"/api/v1/models?keyword=Climate\"", + "match": { + "location": "tests/api/health.steps.ts:4" + }, + "result": { + "status": "passed", + "duration": 17765458 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 57, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 35625 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 58, + "name": "the response body should have property \"data\" as an array", + "match": { + "location": "tests/shared/common.steps.ts:41" + }, + "result": { + "status": "passed", + "duration": 41499 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 41208 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-management;create-a-forked-model", + "keyword": "Scenario", + "line": 60, + "name": "Create a forked model", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 312042790 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 61, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 193766874 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 62, + "name": "a public model \"Original\" created by the current user", + "match": { + "location": "tests/api/model.steps.ts:118" + }, + "result": { + "status": "passed", + "duration": 78847458 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 63, + "name": "I fork the model \"Original\" with title \"My Fork\"", + "match": { + "location": "tests/api/model.steps.ts:259" + }, + "result": { + "status": "passed", + "duration": 41937750 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 64, + "name": "the response status should be 201", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 36250 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 65, + "name": "the response body should have property \"id\"", + "match": { + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 62500 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 39624 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-management;unlisted-models-do-not-appear-in-search-results", + "keyword": "Scenario", + "line": 67, + "name": "Unlisted models do not appear in search results", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 74470083 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 68, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 145600124 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 69, + "name": "an unlisted model \"Hidden Gem\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:154" + }, + "result": { + "status": "passed", + "duration": 45366917 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 70, + "name": "\"owner\" sends a GET request to \"/api/v1/models\"", + "match": { + "location": "tests/api/model.steps.ts:163" + }, + "result": { + "status": "passed", + "duration": 3998541 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 71, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 30207 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 72, + "name": "the response body property \"data\" should have length 0", + "match": { + "location": "tests/shared/common.steps.ts:49" + }, + "result": { + "status": "passed", + "duration": 61082 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 46041 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-management;private-models-do-not-appear-in-search-for-non-owners", + "keyword": "Scenario", + "line": 74, + "name": "Private models do not appear in search for non-owners", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 80738333 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 75, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 144280833 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 76, + "name": "a private model \"Secret Stuff\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:145" + }, + "result": { + "status": "passed", + "duration": 40932917 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 77, + "name": "an authenticated user \"stranger\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 137140000 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 78, + "name": "\"stranger\" sends a GET request to \"/api/v1/models\"", + "match": { + "location": "tests/api/model.steps.ts:163" + }, + "result": { + "status": "passed", + "duration": 6118124 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 79, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 32333 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 80, + "name": "the response body property \"data\" should have length 0", + "match": { + "location": "tests/shared/common.steps.ts:49" + }, + "result": { + "status": "passed", + "duration": 21958 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 40207 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-management;private-models-appear-in-search-for-the-owner-when-publiconly=false", + "keyword": "Scenario", + "line": 82, + "name": "Private models appear in search for the owner when publicOnly=false", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 82541541 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 83, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 142345708 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 84, + "name": "a private model \"My Secret\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:145" + }, + "result": { + "status": "passed", + "duration": 44098457 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 85, + "name": "\"owner\" sends a GET request to \"/api/v1/models?publicOnly=false\"", + "match": { + "location": "tests/api/model.steps.ts:163" + }, + "result": { + "status": "passed", + "duration": 8038166 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 86, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 38250 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 87, + "name": "the response body property \"data\" should have length 1", + "match": { + "location": "tests/shared/common.steps.ts:49" + }, + "result": { + "status": "passed", + "duration": 31749 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 35250 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-management;permissions-action-map-for-anonymous-viewer-on-public-model", + "keyword": "Scenario", + "line": 89, + "name": "Permissions action map for anonymous viewer on public model", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 82350583 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 90, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 136443040 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 91, + "name": "a public model \"Open Model\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 41081500 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 92, + "name": "an anonymous viewer gets permissions for model \"Open Model\"", + "match": { + "location": "tests/api/model.steps.ts:235" + }, + "result": { + "status": "passed", + "duration": 1523416 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 93, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 28458 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 94, + "name": "the response permissions action \"canView\" should be true", + "match": { + "location": "tests/api/model.steps.ts:246" + }, + "result": { + "status": "passed", + "duration": 40957 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 95, + "name": "the response permissions action \"canFork\" should be false", + "match": { + "location": "tests/api/model.steps.ts:246" + }, + "result": { + "status": "passed", + "duration": 11167 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 96, + "name": "the response permissions action \"canEdit\" should be false", + "match": { + "location": "tests/api/model.steps.ts:246" + }, + "result": { + "status": "passed", + "duration": 9708 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 97, + "name": "the response permissions action \"canDelete\" should be false", + "match": { + "location": "tests/api/model.steps.ts:246" + }, + "result": { + "status": "passed", + "duration": 9333 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 34874 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-management;permissions-action-map-for-the-owner", + "keyword": "Scenario", + "line": 99, + "name": "Permissions action map for the owner", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 80352041 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 100, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 143981332 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 101, + "name": "a public model \"Owned Model\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 44783125 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 102, + "name": "\"owner\" gets permissions for model \"Owned Model\"", + "match": { + "location": "tests/api/model.steps.ts:222" + }, + "result": { + "status": "passed", + "duration": 5219375 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 103, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 40333 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 104, + "name": "the response permissions action \"canView\" should be true", + "match": { + "location": "tests/api/model.steps.ts:246" + }, + "result": { + "status": "passed", + "duration": 26375 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 105, + "name": "the response permissions action \"canEdit\" should be true", + "match": { + "location": "tests/api/model.steps.ts:246" + }, + "result": { + "status": "passed", + "duration": 13749 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 106, + "name": "the response permissions action \"canManageAuthors\" should be true", + "match": { + "location": "tests/api/model.steps.ts:246" + }, + "result": { + "status": "passed", + "duration": 10583 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 107, + "name": "the response permissions action \"canDelete\" should be true", + "match": { + "location": "tests/api/model.steps.ts:246" + }, + "result": { + "status": "passed", + "duration": 11500 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 37874 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-management;permissions-action-map-for-a-non-author-authenticated-viewer-on-public-model", + "keyword": "Scenario", + "line": 109, + "name": "Permissions action map for a non-author authenticated viewer on public model", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 75909290 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 110, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 153993290 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 111, + "name": "a public model \"Visible Model\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 45164041 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 112, + "name": "an authenticated user \"stranger\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 139957083 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 113, + "name": "\"stranger\" gets permissions for model \"Visible Model\"", + "match": { + "location": "tests/api/model.steps.ts:222" + }, + "result": { + "status": "passed", + "duration": 7234292 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 114, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 34999 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 115, + "name": "the response permissions action \"canView\" should be true", + "match": { + "location": "tests/api/model.steps.ts:246" + }, + "result": { + "status": "passed", + "duration": 26458 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 116, + "name": "the response permissions action \"canFork\" should be true", + "match": { + "location": "tests/api/model.steps.ts:246" + }, + "result": { + "status": "passed", + "duration": 16833 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 117, + "name": "the response permissions action \"canComment\" should be true", + "match": { + "location": "tests/api/model.steps.ts:246" + }, + "result": { + "status": "passed", + "duration": 10791 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 118, + "name": "the response permissions action \"canLike\" should be true", + "match": { + "location": "tests/api/model.steps.ts:246" + }, + "result": { + "status": "passed", + "duration": 9207 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 119, + "name": "the response permissions action \"canEdit\" should be false", + "match": { + "location": "tests/api/model.steps.ts:246" + }, + "result": { + "status": "passed", + "duration": 8874 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 120, + "name": "the response permissions action \"canDelete\" should be false", + "match": { + "location": "tests/api/model.steps.ts:246" + }, + "result": { + "status": "passed", + "duration": 8750 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 40999 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-management;resolving-an-unknown-legacy-model-id-returns-404", + "keyword": "Scenario", + "line": 123, + "name": "Resolving an unknown legacy model id returns 404", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 82721375 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 124, + "name": "I send a GET request to \"/api/v1/legacy/models/999999/resolve\"", + "match": { + "location": "tests/api/health.steps.ts:4" + }, + "result": { + "status": "passed", + "duration": 3805999 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 125, + "name": "the response status should be 404", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 26250 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 30334 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [ + { + "name": "@smoke", + "line": 122 + } + ], + "type": "scenario" + }, + { + "description": "", + "id": "model-management;resolving-a-legacy-id-with-an-invalid-value-is-rejected", + "keyword": "Scenario", + "line": 127, + "name": "Resolving a legacy id with an invalid value is rejected", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 72716999 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 128, + "name": "I send a GET request to \"/api/v1/legacy/models/0/resolve\"", + "match": { + "location": "tests/api/health.steps.ts:4" + }, + "result": { + "status": "passed", + "duration": 650125 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 129, + "name": "the response status should be 400", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 20125 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 26792 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-management;random-public-model-returns-id-and-title-when-public-models-exist", + "keyword": "Scenario", + "line": 131, + "name": "Random public model returns id and title when public models exist", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 121948208 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 132, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 152850416 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 133, + "name": "a public model \"Random Candidate\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 45206209 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 134, + "name": "I send a GET request to \"/api/v1/models/random\"", + "match": { + "location": "tests/api/health.steps.ts:4" + }, + "result": { + "status": "passed", + "duration": 4641499 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 135, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 29416 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 136, + "name": "the response body should have property \"id\"", + "match": { + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 36458 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 137, + "name": "the response body should have property \"title\"", + "match": { + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 12417 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 38458 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-management;search-by-authorid-returns-only-models-authored-by-that-user", + "keyword": "Scenario", + "line": 139, + "name": "Search by authorId returns only models authored by that user", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 93694457 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 140, + "name": "an authenticated user \"alice\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 149499457 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 141, + "name": "a public model \"Alice One\" created by \"alice\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 42969458 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 142, + "name": "a public model \"Alice Two\" created by \"alice\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 32543000 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 143, + "name": "an authenticated user \"bob\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 152172875 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 144, + "name": "a public model \"Bob One\" created by \"bob\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 42905582 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 145, + "name": "\"alice\" searches models filtered by author \"alice\"", + "match": { + "location": "tests/api/model.steps.ts:274" + }, + "result": { + "status": "passed", + "duration": 6086250 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 146, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 31541 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 147, + "name": "the response body property \"data\" should have length 2", + "match": { + "location": "tests/shared/common.steps.ts:49" + }, + "result": { + "status": "passed", + "duration": 41624 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 46916 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-management;search-by-keyword-matches-version-title", + "keyword": "Scenario", + "line": 149, + "name": "Search by keyword matches version title", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 81245833 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 150, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 155856416 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 151, + "name": "a public model \"Distinct Keyword Marker\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 52055749 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 152, + "name": "a public model \"Other Model\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 34904040 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 153, + "name": "\"owner\" sends a GET request to \"/api/v1/models?keyword=Distinct\"", + "match": { + "location": "tests/api/model.steps.ts:163" + }, + "result": { + "status": "passed", + "duration": 5042084 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 154, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 29040 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 155, + "name": "the response body property \"data\" should have length 1", + "match": { + "location": "tests/shared/common.steps.ts:49" + }, + "result": { + "status": "passed", + "duration": 25000 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 38458 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-management;search-supports-sortby=recent-with-order=asc", + "keyword": "Scenario", + "line": 157, + "name": "Search supports sortBy=recent with order=asc", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 77343250 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 158, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 144049833 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 159, + "name": "a public model \"First\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 40415000 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 160, + "name": "a public model \"Second\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 32066750 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 161, + "name": "\"owner\" sends a GET request to \"/api/v1/models?sortBy=recent&order=asc\"", + "match": { + "location": "tests/api/model.steps.ts:163" + }, + "result": { + "status": "passed", + "duration": 4733583 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 162, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 26499 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 163, + "name": "the response body should have property \"data\" as an array", + "match": { + "location": "tests/shared/common.steps.ts:41" + }, + "result": { + "status": "passed", + "duration": 73083 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 32458 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-management;search-by-future-fromdate-returns-no-models", + "keyword": "Scenario", + "line": 165, + "name": "Search by future fromDate returns no models", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 75212333 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 166, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 139793417 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 167, + "name": "a public model \"Past Model\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 40475665 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 168, + "name": "\"owner\" sends a GET request to \"/api/v1/models?fromDate=2999-01-01\"", + "match": { + "location": "tests/api/model.steps.ts:163" + }, + "result": { + "status": "passed", + "duration": 5634083 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 169, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 33540 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 170, + "name": "the response body property \"data\" should have length 0", + "match": { + "location": "tests/shared/common.steps.ts:49" + }, + "result": { + "status": "passed", + "duration": 22082 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 32500 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-management;search-sortby=views-orders-models-by-view-count-descending", + "keyword": "Scenario", + "line": 172, + "name": "Search sortBy=views orders models by view count descending", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 84950334 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 173, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 159475417 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 174, + "name": "a public model \"Most Viewed\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 53645415 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 175, + "name": "a public model \"Mid Viewed\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 33052959 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 176, + "name": "a public model \"Least Viewed\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 37267625 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 177, + "name": "an authenticated user \"viewer1\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 160025083 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 178, + "name": "an authenticated user \"viewer2\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 134975374 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 179, + "name": "an authenticated user \"viewer3\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 134947458 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 180, + "name": "\"viewer1\" records a \"view\" interaction on \"Most Viewed\"", + "match": { + "location": "tests/api/model-interaction.steps.ts:58" + }, + "result": { + "status": "passed", + "duration": 16291125 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 181, + "name": "\"viewer2\" records a \"view\" interaction on \"Most Viewed\"", + "match": { + "location": "tests/api/model-interaction.steps.ts:58" + }, + "result": { + "status": "passed", + "duration": 8589291 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 182, + "name": "\"viewer3\" records a \"view\" interaction on \"Most Viewed\"", + "match": { + "location": "tests/api/model-interaction.steps.ts:58" + }, + "result": { + "status": "passed", + "duration": 4918166 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 183, + "name": "\"viewer1\" records a \"view\" interaction on \"Mid Viewed\"", + "match": { + "location": "tests/api/model-interaction.steps.ts:58" + }, + "result": { + "status": "passed", + "duration": 5723540 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 184, + "name": "\"viewer2\" records a \"view\" interaction on \"Mid Viewed\"", + "match": { + "location": "tests/api/model-interaction.steps.ts:58" + }, + "result": { + "status": "passed", + "duration": 4999334 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 185, + "name": "\"viewer1\" records a \"view\" interaction on \"Least Viewed\"", + "match": { + "location": "tests/api/model-interaction.steps.ts:58" + }, + "result": { + "status": "passed", + "duration": 6058417 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 186, + "name": "\"owner\" sends a GET request to \"/api/v1/models?sortBy=views&order=desc\"", + "match": { + "location": "tests/api/model.steps.ts:163" + }, + "result": { + "status": "passed", + "duration": 4311166 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 187, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 23791 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 188, + "name": "the known models \"Most Viewed\", \"Mid Viewed\", \"Least Viewed\" appear in that relative order in the search results", + "match": { + "location": "tests/api/model.steps.ts:287" + }, + "result": { + "status": "passed", + "duration": 89416 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 28959 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "model-management;search-sortby=runs-orders-models-by-run-count-descending", + "keyword": "Scenario", + "line": 190, + "name": "Search sortBy=runs orders models by run count descending", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 77747666 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 191, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 144614249 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 192, + "name": "a public model \"High Runs\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 40022709 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 193, + "name": "a public model \"Low Runs\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 29937040 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 194, + "name": "an authenticated user \"runner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 138462665 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 195, + "name": "\"runner\" records a \"run\" interaction on \"High Runs\"", + "match": { + "location": "tests/api/model-interaction.steps.ts:58" + }, + "result": { + "status": "passed", + "duration": 12145082 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 196, + "name": "\"runner\" records a \"run\" interaction on \"High Runs\"", + "match": { + "location": "tests/api/model-interaction.steps.ts:58" + }, + "result": { + "status": "passed", + "duration": 6646542 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 197, + "name": "\"runner\" records a \"run\" interaction on \"Low Runs\"", + "match": { + "location": "tests/api/model-interaction.steps.ts:58" + }, + "result": { + "status": "passed", + "duration": 4395041 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 198, + "name": "\"owner\" sends a GET request to \"/api/v1/models?sortBy=runs&order=desc\"", + "match": { + "location": "tests/api/model.steps.ts:163" + }, + "result": { + "status": "passed", + "duration": 3063957 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 199, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 22499 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 200, + "name": "the known models \"High Runs\", \"Low Runs\" appear in that relative order in the search results", + "match": { + "location": "tests/api/model.steps.ts:309" + }, + "result": { + "status": "passed", + "duration": 140333 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 38875 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + } + ], + "id": "model-management", + "line": 1, + "keyword": "Feature", + "name": "Model Management", + "tags": [], + "uri": "tests/api/model.feature" + }, + { + "description": " As a user composing a model\n I want to look up available NetLogo runtime versions\n So that I can pin a model to a specific runtime", + "elements": [ + { + "description": "", + "id": "netlogo-versions;anonymous-access-returns-an-array", + "keyword": "Scenario", + "line": 6, + "name": "Anonymous access returns an array", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 87331042 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 7, + "name": "I send a GET request to \"/api/v1/netlogo-versions\"", + "match": { + "location": "tests/api/health.steps.ts:4" + }, + "result": { + "status": "passed", + "duration": 3036584 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 8, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 55249 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 9, + "name": "the response body should be an array", + "match": { + "location": "tests/shared/common.steps.ts:33" + }, + "result": { + "status": "passed", + "duration": 29000 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 47040 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "netlogo-versions;filtering-by-prefix-returns-an-array", + "keyword": "Scenario", + "line": 11, + "name": "Filtering by prefix returns an array", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 78847541 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 12, + "name": "I send a GET request to \"/api/v1/netlogo-versions?prefix=6\"", + "match": { + "location": "tests/api/health.steps.ts:4" + }, + "result": { + "status": "passed", + "duration": 2387458 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 13, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 30416 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 14, + "name": "the response body should be an array", + "match": { + "location": "tests/shared/common.steps.ts:33" + }, + "result": { + "status": "passed", + "duration": 10957 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 28333 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "netlogo-versions;empty-prefix-is-accepted", + "keyword": "Scenario", + "line": 16, + "name": "Empty prefix is accepted", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 79133792 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 17, + "name": "I send a GET request to \"/api/v1/netlogo-versions?prefix=\"", + "match": { + "location": "tests/api/health.steps.ts:4" + }, + "result": { + "status": "passed", + "duration": 1957541 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 18, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 24165 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 19, + "name": "the response body should be an array", + "match": { + "location": "tests/shared/common.steps.ts:33" + }, + "result": { + "status": "passed", + "duration": 12542 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 24582 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "netlogo-versions;excessively-long-prefix-is-rejected", + "keyword": "Scenario", + "line": 21, + "name": "Excessively long prefix is rejected", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 72569624 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 22, + "name": "I send a GET request to \"/api/v1/netlogo-versions?prefix=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"", + "match": { + "location": "tests/api/health.steps.ts:4" + }, + "result": { + "status": "passed", + "duration": 979166 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 23, + "name": "the response status should be 400", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 21083 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 24958 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + } + ], + "id": "netlogo-versions", + "line": 1, + "keyword": "Feature", + "name": "NetLogo Versions", + "tags": [], + "uri": "tests/api/netlogo-versions.feature" + }, + { + "description": " These scenarios pin down audited vulnerabilities so reverts of the fix\n are caught by CI. Scenarios tagged @security-todo capture present-day\n (still-insecure) behaviour and must be tightened when the fix lands.", + "elements": [ + { + "description": "", + "id": "security-regressions;the-unauthenticated-/v1/dev/fill-in-route-is-gone", + "keyword": "Scenario", + "line": 9, + "name": "The unauthenticated /v1/dev/fill-in route is gone", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 76049792 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 10, + "name": "an anonymous viewer sends a GET request to \"/api/v1/dev/fill-in\"", + "match": { + "location": "tests/api/security.steps.ts:42" + }, + "result": { + "status": "passed", + "duration": 691333 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 11, + "name": "the response status should be 404", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 21957 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 12, + "name": "an anonymous viewer sends a POST request to \"/api/v1/dev/fill-in\"", + "match": { + "location": "tests/api/security.steps.ts:49" + }, + "result": { + "status": "passed", + "duration": 293541 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 13, + "name": "the response status should be 404", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 10749 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 25125 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [ + { + "name": "@security", + "line": 8 + } + ], + "type": "scenario" + }, + { + "description": "", + "id": "security-regressions;a-regular-user-cannot-self-elevate-systemrole-via-patch-/v1/users/:id", + "keyword": "Scenario", + "line": 21, + "name": "A regular user cannot self-elevate systemRole via PATCH /v1/users/:id", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 74076958 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 22, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 170514209 + } + }, + { + "arguments": [ + { + "content": "{\"systemRole\": \"admin\"}", + "line": 24 + } + ], + "keyword": "When ", + "line": 23, + "name": "the current user PATCHes their own profile with JSON body:", + "match": { + "location": "tests/api/security.steps.ts:72" + }, + "result": { + "status": "passed", + "duration": 4494540 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 27, + "name": "the response status should be 403", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 39041 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 28, + "name": "the current user fetches their own profile", + "match": { + "location": "tests/api/security.steps.ts:85" + }, + "result": { + "status": "passed", + "duration": 9347874 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 29, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 34541 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 30, + "name": "the response body property \"systemRole\" should equal \"user\"", + "match": { + "location": "tests/shared/common.steps.ts:25" + }, + "result": { + "status": "passed", + "duration": 43750 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 49374 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [ + { + "name": "@security", + "line": 20 + } + ], + "type": "scenario" + }, + { + "description": "", + "id": "security-regressions;soft-deleting-a-user-invalidates-their-existing-session-cookie", + "keyword": "Scenario", + "line": 35, + "name": "Soft-deleting a user invalidates their existing session cookie", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 78781583 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 36, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 156969541 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 37, + "name": "I delete the current user's account", + "match": { + "location": "tests/api/user.steps.ts:46" + }, + "result": { + "status": "passed", + "duration": 11711582 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 38, + "name": "the response status should be 204", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 60375 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 39, + "name": "the current user fetches \"/api/v1/users/whoami\" with their old cookie", + "match": { + "location": "tests/api/security.steps.ts:94" + }, + "result": { + "status": "passed", + "duration": 1939707 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 40, + "name": "the response status should be 401", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 15790 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 33084 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [ + { + "name": "@security", + "line": 34 + } + ], + "type": "scenario" + }, + { + "description": "", + "id": "security-regressions;swagger-docs-are-reachable-without-auth-in-non-production", + "keyword": "Scenario", + "line": 46, + "name": "Swagger docs are reachable without auth in non-production", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 139504000 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 49, + "name": "an anonymous viewer sends a GET request to \"/api-docs/auth/openapi.json\"", + "match": { + "location": "tests/api/security.steps.ts:42" + }, + "result": { + "status": "passed", + "duration": 3589374 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 50, + "name": "the response status should not be 401", + "match": { + "location": "tests/api/security.steps.ts:61" + }, + "result": { + "status": "passed", + "duration": 57749 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 25999 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [ + { + "name": "@security", + "line": 45 + }, + { + "name": "@security-todo", + "line": 45 + } + ], + "type": "scenario" + }, + { + "description": "", + "id": "security-regressions;avatar-upload-rejects-mime-spoofing-(svg-body-sent-as-image/png)", + "keyword": "Scenario", + "line": 55, + "name": "Avatar upload rejects MIME spoofing (svg body sent as image/png)", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 96918791 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 56, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 160529167 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 57, + "name": "I upload an avatar declared \"image/png\" with an SVG payload", + "match": { + "location": "tests/api/security.steps.ts:106" + }, + "result": { + "status": "passed", + "duration": 3417083 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 58, + "name": "the response status should be 400", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 26458 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 44666 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [ + { + "name": "@security", + "line": 54 + } + ], + "type": "scenario" + }, + { + "description": "", + "id": "security-regressions;additional-file-upload-still-accepts-script-like-mime-types", + "keyword": "Scenario Outline", + "line": 73, + "name": "Additional-file upload still accepts script-like MIME types", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 91774457 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 66, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 161869209 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 67, + "name": "a public model \"Attach Sim\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 52807458 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 68, + "name": "\"owner\" uploads an additional file declared \"text/html\" with body \"\" to \"Attach Sim\"", + "match": { + "location": "tests/api/security.steps.ts:128" + }, + "result": { + "status": "passed", + "duration": 17200624 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 69, + "name": "the response status should be 201", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 37458 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 37582 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [ + { + "name": "@security", + "line": 63 + }, + { + "name": "@security-todo", + "line": 63 + } + ], + "type": "scenario" + }, + { + "description": "", + "id": "security-regressions;additional-file-upload-still-accepts-script-like-mime-types", + "keyword": "Scenario Outline", + "line": 74, + "name": "Additional-file upload still accepts script-like MIME types", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 81642542 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 66, + "name": "an authenticated user \"owner\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 162861958 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 67, + "name": "a public model \"Attach Sim\" created by \"owner\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 49122250 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 68, + "name": "\"owner\" uploads an additional file declared \"application/javascript\" with body \"alert(1);\" to \"Attach Sim\"", + "match": { + "location": "tests/api/security.steps.ts:128" + }, + "result": { + "status": "passed", + "duration": 16197166 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 69, + "name": "the response status should be 201", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 34625 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 32459 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [ + { + "name": "@security", + "line": 63 + }, + { + "name": "@security-todo", + "line": 63 + } + ], + "type": "scenario" + }, + { + "description": "", + "id": "security-regressions;deleting-an-additional-file-from-a-different-model-returns-404", + "keyword": "Scenario", + "line": 80, + "name": "Deleting an additional file from a different model returns 404", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 81358166 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 81, + "name": "an authenticated user \"alice\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 148305874 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 82, + "name": "a public model \"Model A\" created by \"alice\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 46275459 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 83, + "name": "\"alice\" has uploaded an additional file \"fileA\" to \"Model A\"", + "match": { + "location": "tests/api/model-additional-file.steps.ts:123" + }, + "result": { + "status": "passed", + "duration": 16949667 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 84, + "name": "an authenticated user \"bob\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 136748999 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 85, + "name": "a public model \"Model B\" created by \"bob\"", + "match": { + "location": "tests/api/model.steps.ts:127" + }, + "result": { + "status": "passed", + "duration": 35510416 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 86, + "name": "\"bob\" deletes additional file \"fileA\" using the modelId of \"Model B\"", + "match": { + "location": "tests/api/security.steps.ts:154" + }, + "result": { + "status": "passed", + "duration": 4997624 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 87, + "name": "the response status should be 404", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 25374 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 33707 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [ + { + "name": "@security", + "line": 79 + } + ], + "type": "scenario" + } + ], + "id": "security-regressions", + "line": 1, + "keyword": "Feature", + "name": "Security Regressions", + "tags": [], + "uri": "tests/api/security.feature" + }, + { + "description": " As a user\n I want to browse and search tags\n So that I can discover models by topic", + "elements": [ + { + "description": "", + "id": "tag-management;list-tags-returns-paginated-results", + "keyword": "Scenario", + "line": 6, + "name": "List tags returns paginated results", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 83093874 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 7, + "name": "a tag \"ecology\" exists", + "match": { + "location": "tests/api/tag.steps.ts:4" + }, + "result": { + "status": "passed", + "duration": 2840209 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 8, + "name": "I send a GET request to \"/api/v1/tags\"", + "match": { + "location": "tests/api/health.steps.ts:4" + }, + "result": { + "status": "passed", + "duration": 2372957 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 9, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 37041 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 10, + "name": "the response body should have property \"data\" as an array", + "match": { + "location": "tests/shared/common.steps.ts:41" + }, + "result": { + "status": "passed", + "duration": 46458 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 30250 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "tag-management;search-tags-by-prefix", + "keyword": "Scenario", + "line": 12, + "name": "Search tags by prefix", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 70032749 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 13, + "name": "a tag \"biology\" exists", + "match": { + "location": "tests/api/tag.steps.ts:4" + }, + "result": { + "status": "passed", + "duration": 2311582 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 14, + "name": "a tag \"biochemistry\" exists", + "match": { + "location": "tests/api/tag.steps.ts:4" + }, + "result": { + "status": "passed", + "duration": 637624 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 15, + "name": "I send a GET request to \"/api/v1/tags?q=bio\"", + "match": { + "location": "tests/api/health.steps.ts:4" + }, + "result": { + "status": "passed", + "duration": 1431457 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 16, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 18833 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 17, + "name": "the response body should have property \"data\" as an array", + "match": { + "location": "tests/shared/common.steps.ts:41" + }, + "result": { + "status": "passed", + "duration": 22334 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 90540 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "tag-management;get-a-tag-by-name", + "keyword": "Scenario", + "line": 19, + "name": "Get a tag by name", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 70990416 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 20, + "name": "a tag \"physics\" exists", + "match": { + "location": "tests/api/tag.steps.ts:4" + }, + "result": { + "status": "passed", + "duration": 2322707 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 21, + "name": "I get the tag \"physics\"", + "match": { + "location": "tests/api/tag.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 1986625 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 22, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 42708 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 23, + "name": "the response body property \"name\" should equal \"physics\"", + "match": { + "location": "tests/shared/common.steps.ts:25" + }, + "result": { + "status": "passed", + "duration": 372250 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 110000 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "tag-management;get-a-non-existent-tag-returns-404", + "keyword": "Scenario", + "line": 25, + "name": "Get a non-existent tag returns 404", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 78375875 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 26, + "name": "I send a GET request to \"/api/v1/tags/nonexistent-tag-xyz\"", + "match": { + "location": "tests/api/health.steps.ts:4" + }, + "result": { + "status": "passed", + "duration": 2371040 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 27, + "name": "the response status should be 404", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 27709 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 27208 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "tag-management;list-popular-tags-returns-a-paginated-payload", + "keyword": "Scenario", + "line": 30, + "name": "List popular tags returns a paginated payload", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 68993666 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 31, + "name": "I send a GET request to \"/api/v1/tags/popular\"", + "match": { + "location": "tests/api/health.steps.ts:4" + }, + "result": { + "status": "passed", + "duration": 5077792 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 32, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 38416 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 33, + "name": "the response body should have property \"data\" as an array", + "match": { + "location": "tests/shared/common.steps.ts:41" + }, + "result": { + "status": "passed", + "duration": 55916 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 34, + "name": "the response body should have property \"count\"", + "match": { + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 82374 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 51582 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [ + { + "name": "@smoke", + "line": 29 + } + ], + "type": "scenario" + } + ], + "id": "tag-management", + "line": 1, + "keyword": "Feature", + "name": "Tag Management", + "tags": [], + "uri": "tests/api/tag.feature" + }, + { + "description": " As a user\n I want to manage user profiles\n So that I can view and update user information", + "elements": [ + { + "description": "", + "id": "user-management;list-users-returns-paginated-results", + "keyword": "Scenario", + "line": 6, + "name": "List users returns paginated results", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 75046167 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 7, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 149951375 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 8, + "name": "I send a GET request to \"/api/v1/users\"", + "match": { + "location": "tests/api/health.steps.ts:4" + }, + "result": { + "status": "passed", + "duration": 5183707 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 9, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 32666 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 10, + "name": "the response body should have property \"data\" as an array", + "match": { + "location": "tests/shared/common.steps.ts:41" + }, + "result": { + "status": "passed", + "duration": 22958 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 11, + "name": "the response body should have property \"count\"", + "match": { + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 12708 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 32375 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "user-management;get-user-by-id", + "keyword": "Scenario", + "line": 13, + "name": "Get user by ID", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 74257999 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 14, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 156522124 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 15, + "name": "I get the current user's profile", + "match": { + "location": "tests/api/user.steps.ts:24" + }, + "result": { + "status": "passed", + "duration": 3862583 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 16, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 40208 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 17, + "name": "the response body should have property \"id\"", + "match": { + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 30167 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 18, + "name": "the response body should have property \"emailVerified\"", + "match": { + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 14042 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 58375 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "user-management;update-own-profile", + "keyword": "Scenario", + "line": 20, + "name": "Update own profile", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 80265916 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 21, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 150882582 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 22, + "name": "I update the current user with userKind \"student\"", + "match": { + "location": "tests/api/user.steps.ts:33" + }, + "result": { + "status": "passed", + "duration": 7963499 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 23, + "name": "the response status should be 204", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 42959 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 28624 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "user-management;update-profile-requires-authentication", + "keyword": "Scenario", + "line": 25, + "name": "Update profile requires authentication", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 75583707 + } + }, + { + "arguments": [ + { + "rows": [ + { + "cells": [ + "userKind", + "student" + ] + } + ] + } + ], + "keyword": "When ", + "line": 26, + "name": "I send a PATCH request to \"/api/v1/users/00000000-0000-0000-0000-000000000000\" with body:", + "match": { + "location": "tests/api/user.steps.ts:55" + }, + "result": { + "status": "passed", + "duration": 744750 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 28, + "name": "the response status should be 401", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 16166 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 18875 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "user-management;delete-own-account", + "keyword": "Scenario", + "line": 30, + "name": "Delete own account", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 83854499 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 31, + "name": "an authenticated user", + "match": { + "location": "tests/api/user.steps.ts:11" + }, + "result": { + "status": "passed", + "duration": 154414916 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 32, + "name": "I delete the current user's account", + "match": { + "location": "tests/api/user.steps.ts:46" + }, + "result": { + "status": "passed", + "duration": 9861749 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 33, + "name": "the response status should be 204", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 46167 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 38458 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "user-management;cannot-update-another-user's-profile", + "keyword": "Scenario", + "line": 35, + "name": "Cannot update another user's profile", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 123416708 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 36, + "name": "an authenticated user \"alice\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 154727875 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 37, + "name": "an authenticated user \"bob\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 147634125 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 38, + "name": "\"alice\" updates \"bob\" with userKind \"teacher\"", + "match": { + "location": "tests/api/user.steps.ts:74" + }, + "result": { + "status": "passed", + "duration": 5484875 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 39, + "name": "the response status should be 403", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 32291 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 38957 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "user-management;private-profile-returns-only-public-fields-to-other-users", + "keyword": "Scenario", + "line": 41, + "name": "Private profile returns only public fields to other users", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 110618792 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 42, + "name": "an authenticated user \"alice\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 147246708 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 43, + "name": "\"alice\" sets their profile to private", + "match": { + "location": "tests/api/user.steps.ts:89" + }, + "result": { + "status": "passed", + "duration": 8367416 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 44, + "name": "an authenticated user \"bob\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 142146625 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 45, + "name": "\"bob\" gets the profile of \"alice\"", + "match": { + "location": "tests/api/user.steps.ts:115" + }, + "result": { + "status": "passed", + "duration": 7714875 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 46, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 35334 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 47, + "name": "the response body should have property \"name\"", + "match": { + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 37167 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 48, + "name": "the response body should have property \"isProfilePublic\" equal to false", + "match": { + "location": "tests/shared/common.steps.ts:73" + }, + "result": { + "status": "passed", + "duration": 21042 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 49, + "name": "the response body should have property \"image\"", + "match": { + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 10041 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 50, + "name": "the response body should not have property \"email\"", + "match": { + "location": "tests/shared/common.steps.ts:57" + }, + "result": { + "status": "passed", + "duration": 18541 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 51, + "name": "the response body should not have property \"systemRole\"", + "match": { + "location": "tests/shared/common.steps.ts:57" + }, + "result": { + "status": "passed", + "duration": 8583 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 52, + "name": "the response body should not have property \"userKind\"", + "match": { + "location": "tests/shared/common.steps.ts:57" + }, + "result": { + "status": "passed", + "duration": 8040 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 39917 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "user-management;private-profile-returns-full-fields-to-the-owner", + "keyword": "Scenario", + "line": 54, + "name": "Private profile returns full fields to the owner", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 97545749 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 55, + "name": "an authenticated user \"alice\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 151804583 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 56, + "name": "\"alice\" sets their profile to private", + "match": { + "location": "tests/api/user.steps.ts:89" + }, + "result": { + "status": "passed", + "duration": 12036875 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 57, + "name": "I get the current user's profile", + "match": { + "location": "tests/api/user.steps.ts:24" + }, + "result": { + "status": "passed", + "duration": 3724334 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 58, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 25916 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 59, + "name": "the response body should have property \"emailVerified\"", + "match": { + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 24208 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 60, + "name": "the response body should have property \"isProfilePublic\" equal to false", + "match": { + "location": "tests/shared/common.steps.ts:73" + }, + "result": { + "status": "passed", + "duration": 12999 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 37750 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + }, + { + "description": "", + "id": "user-management;public-profile-returns-full-fields-to-other-users", + "keyword": "Scenario", + "line": 62, + "name": "Public profile returns full fields to other users", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 94420749 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 63, + "name": "an authenticated user \"alice\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 159459083 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 64, + "name": "\"alice\" sets their profile to public", + "match": { + "location": "tests/api/user.steps.ts:102" + }, + "result": { + "status": "passed", + "duration": 11530083 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 65, + "name": "an authenticated user \"bob\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 171745458 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 66, + "name": "\"bob\" gets the profile of \"alice\"", + "match": { + "location": "tests/api/user.steps.ts:115" + }, + "result": { + "status": "passed", + "duration": 5636375 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 67, + "name": "the response status should be 200", + "match": { + "location": "tests/shared/common.steps.ts:13" + }, + "result": { + "status": "passed", + "duration": 50917 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 68, + "name": "the response body should have property \"emailVerified\"", + "match": { + "location": "tests/shared/common.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 37167 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 69, + "name": "the response body should have property \"isProfilePublic\" equal to true", + "match": { + "location": "tests/shared/common.steps.ts:65" + }, + "result": { + "status": "passed", + "duration": 73166 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 38042 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + } + ], + "id": "user-management", + "line": 1, + "keyword": "Feature", + "name": "User Management", + "tags": [], + "uri": "tests/api/user.feature" + }, + { + "description": " As an operator\n I want background workers to pick up audit events\n So that side-effects fire off the events table asynchronously", + "elements": [ + { + "description": "", + "id": "background-workers;event-processor-marks-an-unprocessed-event-as-processed", + "keyword": "Scenario", + "line": 6, + "name": "Event processor marks an unprocessed event as processed", + "steps": [ + { + "keyword": "Before", + "hidden": true, + "result": { + "status": "passed", + "duration": 90885916 + } + }, + { + "arguments": [], + "keyword": "Given ", + "line": 7, + "name": "an authenticated user \"actor\"", + "match": { + "location": "tests/api/user.steps.ts:17" + }, + "result": { + "status": "passed", + "duration": 186264916 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 8, + "name": "an unprocessed event of type \"test.event\" exists for \"actor\"", + "match": { + "location": "tests/api/workers.steps.ts:23" + }, + "result": { + "status": "passed", + "duration": 3057082 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 9, + "name": "the event processor queue is triggered", + "match": { + "location": "tests/api/workers.steps.ts:41" + }, + "result": { + "status": "passed", + "duration": 32558208 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 10, + "name": "the event should be marked processed within 10 seconds", + "match": { + "location": "tests/api/workers.steps.ts:51" + }, + "result": { + "status": "passed", + "duration": 768986291 + } + }, + { + "keyword": "After", + "hidden": true, + "result": { + "status": "passed", + "duration": 219000 + }, + "embeddings": [ + { + "data": "U3RhdHVzOiBQQVNTRUQuIER1cmF0aW9uOjBz", + "mime_type": "text/plain" + } + ] + } + ], + "tags": [], + "type": "scenario" + } + ], + "id": "background-workers", + "line": 1, + "keyword": "Feature", + "name": "Background workers", + "tags": [], + "uri": "tests/api/workers.feature" } ] \ No newline at end of file diff --git a/apps/modeling-commons-backend/reports/index.html b/apps/modeling-commons-backend/reports/index.html index dfee003f..c0a3920a 100644 --- a/apps/modeling-commons-backend/reports/index.html +++ b/apps/modeling-commons-backend/reports/index.html @@ -46,7 +46,7 @@
diff --git a/apps/modeling-commons-frontend/app/components/model/card/ModelCard.vue b/apps/modeling-commons-frontend/app/components/model/card/ModelCard.vue index 0964e827..14cdfe9e 100644 --- a/apps/modeling-commons-frontend/app/components/model/card/ModelCard.vue +++ b/apps/modeling-commons-frontend/app/components/model/card/ModelCard.vue @@ -50,11 +50,12 @@ const imageSrc = computed(() => const badges = computed(() => { const result: BadgeProps[] = []; if (props.card.model.isEndorsed) { - result.push({ icon: "i-lucide-award", label: "Featured" }); + result.push({ icon: "i-lucide-award", label: "Featured", variant: "outline" }); } if (props.card.model.parentModelId) { - result.push({ icon: "i-lucide-git-branch", label: "Derived" }); + result.push({ icon: "i-lucide-git-branch", label: "Derived", variant: "outline" }); } + if (props.card.model.visibility === "public") return result; result.push({ icon: getVisibilityIcon(props.card.model.visibility), variant: "solid", diff --git a/apps/modeling-commons-frontend/app/components/model/card/ModelCardPreviewImage.vue b/apps/modeling-commons-frontend/app/components/model/card/ModelCardPreviewImage.vue index 93325fe0..02ce0884 100644 --- a/apps/modeling-commons-frontend/app/components/model/card/ModelCardPreviewImage.vue +++ b/apps/modeling-commons-frontend/app/components/model/card/ModelCardPreviewImage.vue @@ -15,7 +15,7 @@ diff --git a/apps/modeling-commons-frontend/app/components/model/detail/ModelFamilyTab.vue b/apps/modeling-commons-frontend/app/components/model/detail/ModelFamilyTab.vue index 7c2429c5..652c3814 100644 --- a/apps/modeling-commons-frontend/app/components/model/detail/ModelFamilyTab.vue +++ b/apps/modeling-commons-frontend/app/components/model/detail/ModelFamilyTab.vue @@ -1,5 +1,5 @@ diff --git a/apps/modeling-commons-frontend/app/pages/index.vue b/apps/modeling-commons-frontend/app/pages/index.vue index 2de87030..c8572440 100644 --- a/apps/modeling-commons-frontend/app/pages/index.vue +++ b/apps/modeling-commons-frontend/app/pages/index.vue @@ -4,12 +4,12 @@ class="flex flex-col lg:flex-row gap-10 px-10 py-10 bg-linear-to-t from-white via-coral-lighter/10 to-royal-blue/15" >
- The Modeling Commons -
+ The Modeling Commons +
Discover, share, and learn about complex systems together
-
+
- Powered by + Powered by NetLogo
@@ -103,7 +103,7 @@ variant="ghost" trailing-icon="i-lucide-arrow-right" > - View all + View all
diff --git a/apps/modeling-commons-frontend/app/pages/models/[id]/embed.vue b/apps/modeling-commons-frontend/app/pages/models/[id]/embed.vue index 56266e72..df657f45 100644 --- a/apps/modeling-commons-frontend/app/pages/models/[id]/embed.vue +++ b/apps/modeling-commons-frontend/app/pages/models/[id]/embed.vue @@ -36,6 +36,7 @@ :model-url="downloadUrl ?? ''" :preview-image-url="previewImageUrl" :model-title="title" + show-play-button="persistent" @run="handleRun" /> @@ -63,9 +64,7 @@ const { data: card, error, status, refresh } = useModelCard(modelId); const isAccessDenied = computed(() => { if (!error.value) return false; - const e = error.value as { status?: number; response?: { status?: number } }; - const status = e?.status ?? e?.response?.status; - return status === 401 || status === 403 || status === 404; + return isAccessDeniedError(error.value) || getErrorStatus(error.value) === 404; }); const title = computed(() => card.value?.latestVersion?.title ?? "NetLogo Model"); diff --git a/apps/modeling-commons-frontend/app/pages/models/[id]/index.vue b/apps/modeling-commons-frontend/app/pages/models/[id]/index.vue index 8513eda5..5c988db9 100644 --- a/apps/modeling-commons-frontend/app/pages/models/[id]/index.vue +++ b/apps/modeling-commons-frontend/app/pages/models/[id]/index.vue @@ -3,12 +3,7 @@
- +