diff --git a/README.md b/README.md index a4721776..0ef875c8 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ Full guide: [docs/getting-started.md](docs/getting-started.md). ## Providers at a glance - 🟒 **Google Cloud - stable(ish).** 20 service handlers, 45+ importers, full create / update / destroy. -- 🟑 **AWS - in progress.** +- 🟑 **AWS - in progress.** 17 service handlers + 20 extractors; staged rollout via feature flags β€” see [`packages/core/src/deploy/providers/aws/README.md`](packages/core/src/deploy/providers/aws/README.md) for the per-category state. - 🟑 **Azure - in progress.** - βšͺ **IBM Cloud - planned.** - βšͺ **Kubernetes - planned.** diff --git a/docs/README.md b/docs/README.md index afcbe613..bb96a512 100644 --- a/docs/README.md +++ b/docs/README.md @@ -19,6 +19,7 @@ flowchart LR Arch -.-> A4[database] Arch -.-> A5[desktop] Arch -.-> A6[ai-assistant] + Arch -.-> A7[connections-to-cloud] Ref -.-> Rf1[blocks] Ref -.-> Rf2[extending-providers] @@ -56,14 +57,15 @@ You want to run ICE for a team (self-hosted). You want to read the code, fix bugs, or add features. The canonical contributor doc is [`../CONTRIBUTING.md`](../CONTRIBUTING.md) β€” pages below complement it. -| Page | What it covers | -| ------------------------------------------------------------------- | ------------------------------------------------- | -| [Testing](testing.md) | Unit Β· integration Β· E2E Β· GCP scenario dashboard | -| [Architecture β†’ core engine](architecture/core-engine.md) | Graph, schemas, plan/apply, scheduler, importers | -| [Architecture β†’ frontend](architecture/frontend.md) | React, Redux slices, SVG canvas, feature folders | -| [Architecture β†’ services](architecture/services.md) | The six backend services composed by the gateway | -| [Reference β†’ blocks](reference/blocks.md) | Concept palette + per-provider variants | -| [Reference β†’ extending providers](reference/extending-providers.md) | How to add a new cloud provider | +| Page | What it covers | +| --------------------------------------------------------------------------- | ----------------------------------------------------------- | +| [Testing](testing.md) | Unit Β· integration Β· E2E Β· GCP scenario dashboard | +| [Architecture β†’ core engine](architecture/core-engine.md) | Graph, schemas, plan/apply, scheduler, importers | +| [Architecture β†’ frontend](architecture/frontend.md) | React, Redux slices, SVG canvas, feature folders | +| [Architecture β†’ services](architecture/services.md) | The six backend services composed by the gateway | +| [Architecture β†’ connections to cloud](architecture/connections-to-cloud.md) | How a canvas edge becomes env vars, IAM, and network policy | +| [Reference β†’ blocks](reference/blocks.md) | Concept palette + per-provider variants | +| [Reference β†’ extending providers](reference/extending-providers.md) | How to add a new cloud provider | ## How these docs are maintained diff --git a/docs/deploying-to-aws.md b/docs/deploying-to-aws.md index 545214ae..a1f6b2aa 100644 --- a/docs/deploying-to-aws.md +++ b/docs/deploying-to-aws.md @@ -25,18 +25,35 @@ Same flow as [deploying-to-gcp.md](deploying-to-gcp.md) - drag blocks, connect t ## What works today -The block categories listed in the provider matrix (`docs/provider-status.md` - to be added) are the source of truth. As of this release, the AWS handler set covers compute, storage, basic networking, and managed databases. Anything outside that set will either no-op or surface an "unsupported on AWS" error in the plan modal. +17 service handlers + 20 extractors live in [`packages/core/src/deploy/providers/aws/`](../packages/core/src/deploy/providers/aws/). The categories exposed to the palette / plan modal are gated by feature flags β€” see the **Rollout state** table in [`providers/aws/README.md`](../packages/core/src/deploy/providers/aws/README.md) for the per-category truth source. Today: Storage (S3), Messaging (SQS, SNS, EventBridge), Cache (ElastiCache), Monitoring (CloudWatch Logs), Security (Secrets Manager), Source, and Config are on. Compute (ECS), Frontend, Scheduler, Network, Database (RDS / DynamoDB / DocDB), AI, and Analytics are gated until their concrete unblockers ship. + +For the source-of-truth provider matrix across all clouds, see [provider-status.md](provider-status.md). + +## AWS-specific quirks + +The deployer handles several AWS-specific gotchas silently. The full list lives in [`providers/aws/README.md`](../packages/core/src/deploy/providers/aws/README.md); highlights: + +- **S3 bucket names** get a `-{accountId}` suffix because S3 names are globally unique. +- **CloudFront ACM certs** are pinned to `us-east-1` regardless of deploy region. +- **ECS auto-provisions** a default cluster + task execution role on first deploy. Subnets and security groups are still operator-supplied today; canvas VPC blocks for AWS are deferred. +- **RDS / DocDB / Redshift** refuse to ship without a `master_user_password` β€” wire a `Security.Secret` or set the property explicitly. +- **RDS provisioning** takes 5–10 minutes; the handler polls `DescribeDBInstances` and reports progress via `ctx.on_step`. +- **Lambda auto-build** clones a connected `Source.Repository`, runs `npm install`, zips, and uploads to `ice-bootstrap-{accountId}-{region}` β€” needs local `git` / `npm` / `zip` on the deploy host. AWS CodeBuild integration is deferred. +- **SQS / SNS FIFO** queues + topics get the required `.fifo` suffix automatically. ## Known gaps vs. GCP -- No live cost estimate parity for several AWS-specific services. -- The importer (`Import β†’ From AWS`) is not implemented yet. -- Some block types render on the canvas but have no AWS handler - they'll show a yellow "no provider for AWS" pip during plan. +- No importer (`Import β†’ From AWS`) β€” manual canvas only. +- VPC-aware canvas blocks for ECS subnets/security groups not yet wired. +- Update paths for CloudFront / Cognito / DocDB / Redshift are create-only. +- Tests use mocked AWS SDKs only β€” no LocalStack integration tests yet. +- Cost estimate parity is sparser than GCP. -If you hit a gap that matters to you, please file a feature request - AWS parity is high-priority on the [ROADMAP](../ROADMAP.md) and contributions are welcome (see [contributing.md](contributing.md)). +If you hit a gap that matters to you, please file a feature request β€” AWS parity is high-priority on the [ROADMAP](../ROADMAP.md) and contributions are welcome (see [contributing.md](contributing.md)). ## See also -- [deploying-to-gcp.md](deploying-to-gcp.md) - the canonical end-to-end tutorial. -- [architecture.md](architecture.md) - how plan / apply work. -- [`packages/providers/aws/src/handlers/`](../packages/providers/aws/src/handlers/) - per-service handler source. +- [deploying-to-gcp.md](deploying-to-gcp.md) β€” the canonical end-to-end tutorial. +- [architecture/README.md](architecture/README.md) β€” how plan / apply work. +- [`providers/aws/README.md`](../packages/core/src/deploy/providers/aws/README.md) β€” operator notes covering every AWS quirk and the rollout-state table. +- [`packages/core/src/deploy/providers/aws/handlers/`](../packages/core/src/deploy/providers/aws/handlers/) β€” per-service handler source. diff --git a/docs/provider-status.md b/docs/provider-status.md index ba5a8abc..b78ea411 100644 --- a/docs/provider-status.md +++ b/docs/provider-status.md @@ -12,23 +12,25 @@ Where each provider sits today. The source of truth is `PROVIDER_READINESS` in ` ## Current matrix (v0.1) -| Provider | Status | What works | -| ----------------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **GCP** | stable | 20+ handlers: Cloud Run (services + jobs), Cloud Functions, GKE, Cloud SQL, Firestore, Memorystore Redis, Cloud Storage, Pub/Sub, Cloud Scheduler, Vertex AI, Discovery Engine, BigQuery, Secret Manager, Identity Platform, API Gateway, Load Balancer, Domain Mapping, Cloud Logging. Full importer via Cloud Asset Inventory. | -| **AWS** | experimental | EC2 instance, S3 bucket, Lambda function. Importer not implemented. No auto-enable for required services. Most other resource categories surface as "unsupported on AWS" in the plan modal. | -| **Azure** | experimental | Virtual Machine, Storage Account, Web App. Importer not implemented. Most other resource categories surface as "unsupported on Azure". | -| **Kubernetes** | design-only | 13 blocks render on canvas. Deployer is not wired. | -| **Alibaba Cloud** | design-only | Blocks render. Deployer is the next item after AWS/Azure parity. | -| **Oracle Cloud** | design-only | Block stubs. No deployer. | -| **DigitalOcean** | design-only | Block stubs. No deployer. | +| Provider | Status | What works | +| ----------------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **GCP** | stable | 20+ handlers: Cloud Run (services + jobs), Cloud Functions, GKE, Cloud SQL, Firestore, Memorystore Redis, Cloud Storage, Pub/Sub, Cloud Scheduler, Vertex AI, Discovery Engine, BigQuery, Secret Manager, Identity Platform, API Gateway, Load Balancer, Domain Mapping, Cloud Logging. Full importer via Cloud Asset Inventory. | +| **AWS** | experimental | 17 handlers + 20 extractors: S3 (account-id suffix), Lambda (auto-build from `Source.Repository`), ECS (auto-cluster + task role), RDS (provisioning poll), DynamoDB, ElastiCache, DocDB, CloudFront (us-east-1 ACM cert), API Gateway, ELBv2, SQS/SNS (FIFO suffix), EventBridge, Cognito, OpenSearch, Bedrock, SageMaker, Redshift, CloudWatch Logs, Secrets Manager. Staged rollout via feature flags β€” Storage / Messaging / Cache / Monitoring / Security / Source / Config categories are on; Compute / Frontend / Scheduler / Network / Database / AI / Analytics are gated until concrete unblockers ship (VPC blocks for ECS, ACM cert validation flow, update paths). See [`packages/core/src/deploy/providers/aws/README.md`](../packages/core/src/deploy/providers/aws/README.md) for the per-category state. Importer not implemented. | +| **Azure** | experimental | Virtual Machine, Storage Account, Web App. Importer not implemented. Most other resource categories surface as "unsupported on Azure". | +| **Kubernetes** | design-only | 13 blocks render on canvas. Deployer is not wired. | +| **Alibaba Cloud** | design-only | Blocks render. Deployer is the next item after AWS/Azure parity. | +| **Oracle Cloud** | design-only | Block stubs. No deployer. | +| **DigitalOcean** | design-only | Block stubs. No deployer. | ## What "experimental" looks like in practice -For an AWS deploy of a canvas that uses Static Site + Custom Domain: +For an AWS deploy of a canvas: -- The plan modal will show creates for `aws.s3.bucket` and `aws.lambda.function` if those blocks are present. -- Anything outside the supported set (e.g., `aws.rds.instance`, `aws.cloudfront.distribution`, networking constructs) will surface in the plan as **unsupported** rather than create. -- Apply runs only against the supported types. Partial-success result with an explicit "this block has no AWS handler yet" log line. +- Blocks in the enabled categories (Storage / Messaging / Cache / Monitoring / Security / Source / Config) plan and apply normally β€” S3, SQS, SNS, ElastiCache, Secrets Manager, CloudWatch Logs. +- Blocks in gated categories are hidden from the palette when the project's provider is AWS (Compute, Frontend, Scheduler, Network, Database, AI, Analytics). Their handlers exist but aren't exposed yet β€” flip a category in `PROVIDER_FLAGS.aws.categories` once its unblocker lands. +- RDS / DocDB / Redshift refuse to create without a `master_user_password`. Wire a `Security.Secret` or set the property explicitly. +- CloudFront / Cognito / DocDB / Redshift are create-only today β€” no update path. +- Lambda auto-build needs local `git` / `npm` / `zip` on the deploy host. This is the same loop you'd hit on Azure for anything past VM / Storage / Web App. diff --git a/package.json b/package.json index 812f8c14..108edbb7 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ice", "license": "Apache-2.0", - "version": "0.1.769", + "version": "0.1.776", "description": "ICE - Integrated Cloud Environment (Web + Backend)", "private": true, "type": "module", diff --git a/packages/blocks/src/__tests__/requirements.test.ts b/packages/blocks/src/__tests__/requirements.test.ts index 05f56483..af967c79 100644 --- a/packages/blocks/src/__tests__/requirements.test.ts +++ b/packages/blocks/src/__tests__/requirements.test.ts @@ -43,7 +43,7 @@ * 'unmet' generic; throws β†’ 'unmet' with error */ -import { describe, expect, it, vi } from 'vitest'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { BUILT_IN_REQUIREMENTS, dnsARecordRequirement, diff --git a/packages/constants/src/index.ts b/packages/constants/src/index.ts index d62905f0..879e7cf0 100644 --- a/packages/constants/src/index.ts +++ b/packages/constants/src/index.ts @@ -154,3 +154,5 @@ export { ICE_TYPE_TO_CATEGORY_ID, getCategoryForIceType, } from './categories'; + +export { type IntegrationStatus, INTEGRATION_STATUSES } from './integrations'; diff --git a/packages/core/src/deploy/passes/deploy-expansion.ts b/packages/core/src/deploy/passes/deploy-expansion.ts index 2bd75ad6..005956f3 100644 --- a/packages/core/src/deploy/passes/deploy-expansion.ts +++ b/packages/core/src/deploy/passes/deploy-expansion.ts @@ -138,7 +138,7 @@ export function expand_deployable_per_entry(args: ExpandDeployableArgs): ExpandD const resourceName = sanitize_name(rawName); if (!resourceName || seen.has(resourceName)) continue; seen.add(resourceName); - if (graph.has_node(resourceName)) continue; + if (graph.get_node_by_name(resourceName)) continue; const perEntryLabels: Record = { ...baseLabels }; if (expansion.tagPerEntry) { diff --git a/packages/core/tsconfig.tsbuildinfo b/packages/core/tsconfig.tsbuildinfo index 60d96d68..94926521 100644 --- a/packages/core/tsconfig.tsbuildinfo +++ b/packages/core/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","./src/types/graph.ts","./src/types/providers.ts","./src/types/deployment.ts","./src/types/errors.ts","./src/types/result.ts","./src/types/index.ts","./src/schema/schema-provider.ts","./src/schema/resource-validator-types.ts","./src/schema/validation/error-conversion.ts","./src/schema/validation/constraints.ts","./src/schema/validation/type-checker.ts","./src/schema/validation/property-validator.ts","./src/schema/resource-validator.ts","./src/schema/type-mapper.ts","./src/schema/embedded/events.ts","./src/schema/embedded/sqlite-types.ts","./src/schema/embedded/converters.ts","./src/schema/embedded/graph-queries.ts","./src/schemas/db/index.ts","./src/schema/embedded/initialization.ts","./src/schema/embedded/queries.ts","./src/schema/embedded-schema-provider.ts","./src/schema/unified-type-resolver.ts","./src/schema/customization/base-db.ts","./src/schema/customization/paths.ts","./src/schema/customization/example-files.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/parse/line-counter.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/errors.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/doc/applyreviver.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/log.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/nodes/tojs.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/nodes/scalar.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/stringify/stringify.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/nodes/collection.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/nodes/yamlseq.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/schema/types.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/schema/common/map.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/schema/common/seq.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/schema/common/string.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/stringify/foldflowlines.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/stringify/stringifynumber.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/stringify/stringifystring.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/util.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/nodes/yamlmap.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/nodes/identity.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/schema/schema.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/doc/createnode.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/nodes/addpairtojsmap.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/nodes/pair.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/schema/tags.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/options.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/nodes/node.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/parse/cst-scalar.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/parse/cst-stringify.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/parse/cst-visit.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/parse/cst.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/nodes/alias.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/doc/document.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/doc/directives.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/compose/composer.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/parse/lexer.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/parse/parser.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/public-api.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/visit.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/index.d.ts","./src/schema/customization/file-validators.ts","./src/schema/customization/scanner.ts","./src/schema/customization-loader.ts","./src/schema/index.ts","./src/state/state-store.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/compatibility/index.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/globals.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/web-globals/events.d.ts","../../node_modules/.pnpm/buffer@5.7.1/node_modules/buffer/index.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/header.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/readable.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/file.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/fetch.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/formdata.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/connector.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/client.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/errors.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/dispatcher.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-origin.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool-stats.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/handlers.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/balanced-pool.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-client.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-pool.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-errors.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-handler.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/api.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/interceptors.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/util.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cookies.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/patch.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/websocket.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/eventsource.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/filereader.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/content-type.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cache.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/index.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/web-globals/navigator.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/web-globals/storage.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/assert.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/assert/strict.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/async_hooks.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/buffer.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/child_process.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/cluster.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/console.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/constants.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/crypto.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/dgram.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/dns.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/dns/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/domain.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/events.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/fs.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/fs/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/http.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/http2.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/https.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/inspector.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/inspector.generated.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/module.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/net.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/os.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/path.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/perf_hooks.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/process.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/punycode.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/querystring.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/readline.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/readline/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/repl.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/sea.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/sqlite.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/stream.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/stream/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/stream/consumers.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/stream/web.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/string_decoder.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/test.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/timers.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/timers/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/tls.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/trace_events.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/tty.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/url.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/util.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/v8.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/vm.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/wasi.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/worker_threads.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/zlib.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/index.d.ts","../../node_modules/.pnpm/@types+better-sqlite3@7.6.13/node_modules/@types/better-sqlite3/index.d.ts","./src/state/sqlite/types.ts","./src/state/sqlite/resources.ts","./src/state/sqlite/deployments.ts","./src/state/sqlite/lifecycle.ts","./src/state/sqlite/locks.ts","./src/state/sqlite/snapshots.ts","./src/state/sqlite-state-store.ts","./src/state/index.ts","./src/graph/parser/tokens.ts","./src/graph/parser/ast/types/base.ts","./src/graph/parser/ast/types/expressions.ts","./src/graph/parser/ast/types/blocks.ts","./src/graph/parser/ast/types/statements.ts","./src/graph/parser/ast/types.ts","./src/graph/parser/ast/helpers.ts","./src/graph/parser/ast.ts","./src/graph/parser/lexer-state.ts","./src/graph/parser/lexer-scanners.ts","./src/graph/parser/lexer-heredoc.ts","./src/graph/parser/lexer.ts","./src/graph/parser/parser-state.ts","./src/graph/parser/parser-literals.ts","./src/graph/parser/parser-primary.ts","./src/graph/parser/parser-binary-exprs.ts","./src/graph/parser/parser-block-body.ts","./src/graph/parser/parser-statements.ts","./src/graph/parser/parser.ts","../../node_modules/.pnpm/@types+js-yaml@4.0.9/node_modules/@types/js-yaml/index.d.ts","../../node_modules/.pnpm/@types+js-yaml@4.0.9/node_modules/@types/js-yaml/index.d.mts","./src/graph/parser/format-parser.ts","./src/graph/parser/index.ts","./src/graph/mutable-graph/types.ts","./src/graph/mutable-graph/edges.ts","../constants/src/providers.ts","../constants/src/ice-types.ts","../constants/src/categories.ts","../constants/src/feature-flags.ts","../constants/src/ai.ts","../constants/src/derived.ts","../constants/src/grid.ts","../constants/src/connections.ts","../constants/src/node-traits.ts","../constants/src/templates.ts","../constants/src/index.ts","./src/graph/classifier/category-classifier.ts","./src/graph/mutable-graph/nodes.ts","./src/graph/mutable-graph/stats-serialize.ts","./src/graph/mutable-graph/traversal.ts","./src/graph/mutable-graph.ts","./src/graph/validator/base-validator.ts","./src/graph/validator/validators/schema.ts","./src/graph/validator/validators/security.ts","./src/graph/algorithms/topo-cycle.ts","./src/graph/algorithms/paths.ts","./src/graph/algorithms/components.ts","./src/graph/algorithms/analysis.ts","./src/graph/algorithms.ts","./src/graph/validator/validators/structure.ts","./src/graph/validator/validators.ts","./src/graph/validator/index.ts","./src/graph/classifier/index.ts","./src/graph/inference/relationship-inferrer.ts","./src/graph/inference/index.ts","./src/graph/index.ts","./src/providers/provider-registry.ts","./src/providers/index.ts","./src/importers/terraform/types.ts","./src/importers/terraform/type-mapper.ts","./src/importers/terraform/sensitive.ts","./src/importers/terraform/resource-conversion.ts","./src/importers/terraform/graph-conversion.ts","./src/importers/terraform/state-importer.ts","./src/importers/terraform/index.ts","./src/importers/pulumi/types.ts","./src/importers/pulumi/type-mapper/parse.ts","./src/importers/pulumi/type-mapper/data.ts","./src/importers/pulumi/type-mapper/mapping.ts","./src/importers/pulumi/type-mapper.ts","./src/importers/pulumi/parsing.ts","./src/importers/pulumi/resource-conversion.ts","./src/importers/pulumi/graph-conversion.ts","./src/importers/pulumi/state-importer.ts","./src/importers/pulumi/index.ts","./src/importers/gcp/types.ts","./src/importers/gcp/relationships.ts","./src/importers/gcp/services/base-service.ts","./src/importers/gcp/services/compute.ts","./src/importers/gcp/services/storage.ts","./src/errors/import-errors/types.ts","./src/errors/import-errors/gcp.ts","./src/errors/import-errors/aws.ts","./src/errors/import-errors/azure.ts","./src/errors/import-errors.ts","./src/resources/high-level-resources/types.ts","./src/resources/high-level-resources/categories/compute.ts","./src/resources/high-level-resources/categories/database.ts","./src/resources/high-level-resources/categories/messaging.ts","./src/resources/high-level-resources/categories/monitoring.ts","./src/resources/high-level-resources/categories/networking.ts","./src/resources/high-level-resources/categories/security.ts","./src/resources/high-level-resources/categories/storage.ts","./src/resources/high-level-resources/helpers.ts","./src/resources/high-level-resources.ts","./src/importers/gcp/services/asset-inventory.ts","./src/importers/gcp/services/index.ts","./src/importers/gcp/type-mapper.ts","./src/importers/gcp/gcp-importer.ts","./src/importers/gcp/index.ts","./src/importers/aws/arn-helpers.ts","./src/importers/aws/sdk-init.ts","./src/importers/aws/types.ts","./src/importers/aws/discovery.ts","./src/importers/aws/graph-conversion.ts","./src/importers/aws/type-mapper.ts","./src/importers/aws/aws-importer.ts","./src/importers/aws/index.ts","./src/importers/azure/type-mapper.ts","./src/importers/azure/types.ts","./src/importers/azure/azure-importer.ts","./src/importers/azure/index.ts","./src/importers/index.ts","./src/plan/diff.ts","./src/plan/plan-engine.ts","./src/plan/index.ts","./src/apply/types.ts","./src/providers/mock-provider.ts","./src/apply/apply-engine.ts","./src/apply/index.ts","./src/diff/types.ts","./src/diff/diff.ts","./src/diff/index.ts","./src/deploy/providers/gcp/messages.ts","./src/deploy/messages.ts","./src/deploy/types.ts","./src/deploy/scheduler/types.ts","./src/deploy/scheduler/dag.ts","./src/deploy/scheduler/predicates.ts","./src/deploy/scheduler/dispatch.ts","./src/deploy/scheduler/progress-wrapper.ts","./src/deploy/scheduler.ts","./src/deploy/deploy-engine.ts","./src/deploy/providers/gcp/types.ts","./src/deploy/providers/gcp/handlers/api-gateway.ts","./src/deploy/providers/gcp/handlers/backend-bucket.ts","./src/deploy/providers/gcp/handlers/bigquery.ts","./src/deploy/providers/gcp/handlers/cloud-armor.ts","./src/deploy/providers/gcp/handlers/cloud-functions.ts","./src/deploy/providers/gcp/handlers/cloud-build-helper.ts","./src/deploy/providers/gcp/handlers/cloud-run/image-resolver.ts","./src/deploy/providers/gcp/handlers/cloud-run/result-helpers.ts","./src/deploy/providers/gcp/handlers/cloud-run/utils.ts","./src/deploy/providers/gcp/handlers/cloud-run/create-job.ts","./src/deploy/providers/gcp/handlers/cloud-run/iam.ts","./src/deploy/providers/gcp/handlers/cloud-run/create-service.ts","./src/deploy/providers/gcp/handlers/cloud-run.ts","./src/deploy/providers/gcp/handlers/cloud-scheduler.ts","./src/deploy/providers/gcp/handlers/cloud-sql.ts","./src/deploy/providers/gcp/handlers/cloud-storage/bucket-creator.ts","./src/deploy/providers/gcp/handlers/cloud-storage/bucket-updater.ts","./src/deploy/providers/gcp/handlers/cloud-storage/bucket-utils.ts","./src/deploy/providers/gcp/handlers/cloud-storage/public-access-granter.ts","./src/deploy/providers/gcp/handlers/cloud-storage/placeholder-uploader.ts","./src/deploy/providers/gcp/handlers/cloud-storage/result-helpers.ts","./src/deploy/providers/gcp/handlers/cloud-storage.ts","./src/deploy/providers/gcp/handlers/dataflow.ts","./src/deploy/providers/gcp/handlers/discovery-engine.ts","./src/deploy/providers/gcp/handlers/domain-mapping.ts","./src/deploy/providers/gcp/handlers/firebase-hosting/dns-extractor.ts","./src/deploy/providers/gcp/handlers/firebase-hosting/rest-client.ts","./src/deploy/providers/gcp/handlers/firebase-hosting/domain-registrar.ts","./src/deploy/providers/gcp/handlers/firebase-hosting/tar-parser.ts","./src/deploy/providers/gcp/handlers/firebase-hosting/github-downloader.ts","./src/deploy/providers/gcp/handlers/firebase-hosting/result-helpers.ts","./src/deploy/providers/gcp/handlers/firebase-hosting/site-provisioner.ts","./src/deploy/providers/gcp/handlers/firebase-hosting/site-utils.ts","./src/deploy/providers/gcp/handlers/firebase-hosting/version-publisher.ts","./src/deploy/providers/gcp/handlers/firebase-hosting.ts","./src/deploy/providers/gcp/handlers/firestore.ts","./src/deploy/providers/gcp/handlers/gke.ts","./src/deploy/providers/gcp/handlers/identity-platform.ts","./src/deploy/providers/gcp/handlers/load-balancer/result-helpers.ts","./src/deploy/providers/gcp/handlers/load-balancer/compute-ops.ts","./src/deploy/providers/gcp/handlers/load-balancer/backend-creator.ts","./src/deploy/providers/gcp/handlers/load-balancer/cert-fetcher.ts","./src/deploy/providers/gcp/handlers/load-balancer/url-builder.ts","./src/deploy/providers/gcp/handlers/load-balancer/lb-builder.ts","./src/deploy/providers/gcp/handlers/load-balancer.ts","./src/deploy/providers/gcp/handlers/logging.ts","./src/deploy/providers/gcp/handlers/managed-ssl-certificate.ts","./src/deploy/providers/gcp/handlers/memorystore.ts","./src/deploy/providers/gcp/handlers/pubsub.ts","./src/deploy/providers/gcp/handlers/secret-manager.ts","./src/deploy/providers/gcp/handlers/subnet.ts","./src/deploy/providers/gcp/handlers/vpc.ts","./src/deploy/providers/gcp/handlers/vertex-ai.ts","./src/deploy/providers/gcp/sdk-loader.ts","./src/deploy/providers/gcp/gcp-deployer.ts","./src/deploy/providers/gcp/auth.ts","./src/deploy/providers/gcp/index.ts","./src/deploy/providers/aws-deployer.ts","./src/deploy/providers/azure-deployer.ts","./src/deploy/providers/index.ts","./src/deploy/edge-classifier.ts","./src/deploy/extractors/ancillary.ts","./src/deploy/utils/name-utils.ts","./src/deploy/extractors/compute.ts","./src/deploy/extractors/database.ts","./src/deploy/extractors/network.ts","./src/deploy/extractors/dispatch.ts","./src/deploy/passes/pass-1-4-repo-wiring.ts","./src/deploy/passes/pass-1-45-domain-propagation.ts","./src/deploy/passes/pass-1-5-endpoint-wiring.ts","./src/deploy/type-maps.ts","./src/deploy/utils/stable-name.ts","./src/deploy/card-translator.ts","./src/deploy/state-bridge.ts","./src/deploy/state-store-adapter.ts","./src/deploy/environment-config.ts","./src/deploy/index.ts","./src/compute/types.ts","./src/compute/propagation-rules.ts","./src/compute/compute-derived.ts","./src/compute/index.ts","./src/export/terraform/case-utils.ts","./src/export/terraform/types.ts","./src/export/terraform/hcl-formatter.ts","./src/export/terraform/type-mapping.ts","./src/export/terraform/value-transform.ts","./src/export/terraform/converter.ts","./src/export/terraform-exporter.ts","./src/export/pulumi/case-utils.ts","./src/export/pulumi/type-mapping.ts","./src/export/pulumi/types.ts","./src/export/pulumi/typescript-formatter.ts","./src/export/pulumi/value-transform.ts","./src/export/pulumi/yaml-formatter.ts","./src/export/pulumi/converter.ts","./src/export/pulumi-exporter.ts","./src/export/index.ts","./src/errors/index.ts","./src/resources/cloud-providers.ts","./src/resources/blueprint-factory.ts","./src/resources/cloud-blocks-types.ts","./src/resources/cloud-blocks-data/backend.ts","./src/resources/cloud-blocks-data/compute.ts","./src/resources/cloud-blocks-data/data.ts","./src/resources/cloud-blocks-data/frontend.ts","./src/resources/cloud-blocks-data/messaging.ts","./src/resources/cloud-blocks-data/networking.ts","./src/resources/cloud-blocks-data/observability.ts","./src/resources/cloud-blocks-data/security.ts","./src/resources/cloud-blocks-data/storage.ts","./src/resources/cloud-blocks-data.ts","./src/resources/cloud-blocks.ts","./src/validation/classifiers.ts","./src/validation/types.ts","./src/validation/architecture-rules.ts","./src/validation/connection-rules.ts","./src/validation/schema-bridge.ts","./src/validation/deploy-rules.ts","./src/validation/property-rules.ts","./src/validation/structure-rules.ts","./src/validation/canvas-validator.ts","./src/validation/template-validator.ts","./src/validation/index.ts","./src/index.ts","./src/__tests__/card-translator.test.d.ts","./src/__tests__/core.test.d.ts","./src/__tests__/pulumi-importer.test.d.ts","./src/__tests__/terraform-importer.test.d.ts","./src/cli/index.ts","./src/cli/messages.ts","./src/cli/bin/ice.ts","./src/cli/commands/apply.ts","./src/cli/commands/config.ts","./src/cli/commands/deploy.ts","./src/cli/commands/destroy.ts","./src/cli/commands/diff.ts","./src/cli/commands/graph.ts","./src/cli/commands/import.ts","./src/cli/commands/plan.ts","./src/cli/commands/providers.ts","./src/cli/commands/schema.ts","./src/cli/commands/state.ts","./src/cli/utils/config.ts","./src/cli/utils/index.ts","./src/cli/utils/output.ts","./src/graph/algorithms/__tests__/fixtures.ts","./src/graph/mutable-graph/index.ts","./src/resources/scale-presets-types.ts","./src/resources/scale-presets-data/compute.ts","./src/resources/scale-presets-data/database.ts","./src/resources/scale-presets-data/messaging.ts","./src/resources/scale-presets-data/monitoring.ts","./src/resources/scale-presets-data/networking.ts","./src/resources/scale-presets-data/security.ts","./src/resources/scale-presets-data/storage.ts","./src/resources/scale-presets-data.ts","./src/resources/scale-presets.ts","./src/resources/index.ts","./src/schemas/index.ts","./src/schemas/db/graph-queries.ts","./src/schemas/db/schema-merger.ts","./src/schemas/db/sqlite-registry.ts","./src/schemas/embedded/schema-registry.ts"],"fileIdsList":[[135,184,201,202,234],[135,184,201,202,263],[135,184,201,202],[135,181,182,184,201,202],[135,183,184,201,202],[184,201,202],[135,184,189,201,202,219],[135,184,185,190,195,201,202,204,216,227],[135,184,185,186,195,201,202,204],[130,131,132,135,184,201,202],[135,184,187,201,202,228],[135,184,188,189,196,201,202,205],[135,184,189,201,202,216,224],[135,184,190,192,195,201,202,204],[135,183,184,191,201,202],[135,184,192,193,201,202],[135,184,194,195,201,202],[135,183,184,195,201,202],[135,184,195,196,197,201,202,216,227],[135,184,195,196,197,201,202,211,216,219],[135,177,184,192,195,198,201,202,204,216,227],[135,184,195,196,198,199,201,202,204,216,224,227],[135,184,198,200,201,202,216,224,227],[133,134,135,136,137,138,139,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233],[135,184,195,201,202],[135,184,201,202,203,227],[135,184,192,195,201,202,204,216],[135,184,201,202,205],[135,184,201,202,206],[135,183,184,201,202,207],[135,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233],[135,184,201,202,209],[135,184,201,202,210],[135,184,195,201,202,211,212],[135,184,201,202,211,213,228,230],[135,184,196,201,202],[135,184,195,201,202,216,217,219],[135,184,201,202,218,219],[135,184,201,202,216,217],[135,184,201,202,219],[135,184,201,202,220],[135,181,184,201,202,216,221,227],[135,184,195,201,202,222,223],[135,184,201,202,222,223],[135,184,189,201,202,204,216,224],[135,184,201,202,225],[135,184,201,202,204,226],[135,184,198,201,202,210,227],[135,184,189,201,202,228],[135,184,201,202,216,229],[135,184,201,202,203,230],[135,184,201,202,231],[135,177,184,201,202],[135,177,184,195,197,201,202,207,216,219,227,229,230,232],[135,184,201,202,216,233],[135,149,153,184,201,202,227],[135,149,184,201,202,216,227],[135,144,184,201,202],[135,146,149,184,201,202,224,227],[135,184,201,202,204,224],[135,144,184,201,202,234],[135,146,149,184,201,202,204,227],[135,141,142,145,148,184,195,201,202,216,227],[135,149,156,184,201,202],[135,141,147,184,201,202],[135,149,170,171,184,201,202],[135,145,149,184,201,202,219,227,234],[135,170,184,201,202,234],[135,143,144,184,201,202,234],[135,149,184,201,202],[135,143,144,145,146,147,148,149,150,151,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,184,201,202],[135,149,164,184,201,202],[135,149,156,157,184,201,202],[135,147,149,157,158,184,201,202],[135,148,184,201,202],[135,141,144,149,184,201,202],[135,149,153,157,158,184,201,202],[135,153,184,201,202],[135,147,149,152,184,201,202,227],[135,141,146,149,156,184,201,202],[135,184,201,202,216],[135,144,149,170,184,201,202,232,234],[85,108,109,113,115,116,135,184,201,202],[93,103,109,115,135,184,201,202],[115,135,184,201,202],[85,89,92,101,102,103,106,108,109,114,116,135,184,201,202],[84,135,184,201,202],[84,85,89,92,93,101,102,103,106,107,108,109,113,114,115,117,118,119,120,121,122,123,135,184,201,202],[88,101,106,135,184,201,202],[88,89,90,92,101,109,113,115,135,184,201,202],[102,103,109,135,184,201,202],[89,92,101,106,109,114,115,135,184,201,202],[88,89,90,92,101,102,108,113,114,115,135,184,201,202],[88,90,102,103,104,105,109,113,135,184,201,202],[88,109,113,135,184,201,202],[109,115,135,184,201,202],[88,89,90,91,100,103,106,109,113,135,184,201,202],[88,89,90,91,103,104,106,109,113,135,184,201,202],[84,86,87,89,93,103,106,107,109,116,135,184,201,202],[85,89,109,113,135,184,201,202],[113,135,184,201,202],[110,111,112,135,184,201,202],[86,108,109,115,117,135,184,201,202],[93,135,184,201,202],[93,102,106,108,135,184,201,202],[93,108,135,184,201,202],[89,90,92,101,103,104,108,109,135,184,201,202],[88,92,93,100,101,103,135,184,201,202],[88,89,90,93,100,101,103,106,135,184,201,202],[108,114,115,135,184,201,202],[89,135,184,201,202],[89,90,135,184,201,202],[87,88,90,94,95,96,97,98,99,101,104,106,135,184,201,202],[135,184,201,202,270],[135,184,201,202,269,271],[135,184,201,202,269,270,271,272,273,274,275,276,277,278],[58,59,60,135,184,201,202,284,358,360,361],[135,184,201,202,360,362],[58,59,60,135,184,201,202],[135,184,201,202,455,456],[135,184,201,202,455,456,457],[135,184,201,202,279,455],[58,135,184,201,202,284,438,440,444,445,446,447,448,449],[58,135,184,201,202,364,365,368,369,375],[58,135,184,201,202],[135,184,201,202,440],[135,184,201,202,439,441,442,443],[135,184,189,201,202],[135,184,201,202,368,369,375,376,431,433,437,450,451,452,453],[135,184,201,202,367],[135,184,201,202,284,450],[135,184,201,202,284,440,450],[135,184,201,202,369],[135,184,201,202,368,431],[135,184,201,202,367,368,369,377,378,379,380,381,382,390,391,392,399,400,401,402,412,413,414,415,422,423,424,425,426,427,428,429,430,431],[135,184,201,202,367,369,377],[135,184,201,202,367,377],[135,184,201,202,367,377,384,385,386,387,388,389],[135,184,201,202,367,369,377,384,385,386],[135,184,201,202,367,369,377,384,385,386,388],[135,184,201,202,377],[135,184,201,202,367,377,383],[135,184,201,202,367,377,393,394,395,396,397,398],[135,184,201,202,377,395,396],[135,184,201,202,369,377],[135,184,201,202,377,403,404,405,407,408,409,410,411],[135,184,201,202,377,403,404],[135,184,201,202,233,377,406],[135,184,201,202,377,404],[135,184,189,201,202,233,377,404,406],[135,184,201,202,377,416,417,418,419,420,421],[135,184,201,202,377,416,417],[135,184,201,202,377,416],[135,184,201,202,367,377,416],[135,184,201,202,377,416,417,418,420],[135,184,201,202,377,432,433],[135,184,201,202,368,377],[135,184,201,202,434,435,436],[135,184,201,202,369,370,371,372,373,374],[58,135,184,201,202,364,370],[135,184,201,202,364,369,370,372],[135,184,201,202,370],[135,184,201,202,364,369],[58,135,184,201,202,364,369],[58,135,184,201,202,369],[58,135,184,201,202,242,451],[135,184,201,202,450],[135,184,189,201,202,440],[58,135,184,201,202,364],[135,184,201,202,364,365],[135,184,201,202,324,325,326,327],[135,184,201,202,324],[135,184,201,202,328],[135,184,201,202,465,473],[79,135,184,201,202,284,468,472],[58,64,79,135,184,201,202,284,466,467,468,469,470,471],[135,184,201,202,466],[135,184,201,202,466,467,468],[135,184,201,202,466,468],[135,184,201,202,468],[79,135,184,201,202,284,460,464],[58,64,79,135,184,201,202,284,459,460,461,462,463],[135,184,201,202,460],[135,184,201,202,288,289,290,291],[135,184,201,202,284],[58,135,184,201,202,284,288,290],[58,135,184,201,202,284],[135,184,201,202,279],[135,184,201,202,280],[135,184,201,202,266,284,292,295,296,298],[135,184,201,202,297],[58,135,184,201,202,267,268,281,282,283],[58,135,184,201,202,267],[135,184,201,202,267,268,281,282,283],[58,135,184,201,202,267,268,280],[58,135,184,201,202,267,268],[135,184,201,202,249,250],[135,184,201,202,244,249],[135,184,201,202,245,246,247,248],[135,184,201,202,244],[135,184,201,202,245,246],[135,184,201,202,245],[135,184,201,202,245,246,247],[135,184,201,202,244,251,264],[135,184,201,202,244,251,255,262,265],[135,184,201,202,252,253],[135,184,201,202,244,252],[135,184,201,202,244,255],[135,184,201,202,244,252,253,254],[135,184,201,202,251,256,257,258],[135,184,201,202,251,256,257,259],[135,184,201,202,244,251,256],[135,184,201,202,244,251,256,257,259],[135,184,201,202,244,262],[135,184,201,202,244,251,256,257,260,261],[135,184,201,202,285,294],[64,135,184,201,202,285,286,287,293],[64,135,184,201,202,284,285],[135,184,201,202,284,285],[135,184,201,202,284,285,292],[135,184,201,202,284,328,345,346,347,348,349],[135,184,201,202,344,345,346],[58,135,184,201,202,284,346],[135,184,201,202,346,349,350],[58,135,184,201,202,284,328,352,353],[135,184,201,202,352,353,354],[58,135,184,201,202,284,319,320,340,341],[135,184,201,202,319,320,340,341,342],[135,184,201,202,319],[135,184,196,201,202,319,321,328,338],[135,184,201,202,319,321],[135,184,201,202,321,322,323,339],[135,184,201,202,338],[135,184,201,202,308,318,343,351,355],[58,135,184,201,202,284,309,317],[135,184,201,202,309,313,317],[135,184,201,202,309,313],[135,184,201,202,309,313,314,317],[135,184,196,197,201,202,284,309,313,314,315,316],[135,184,201,202,310,312],[135,184,201,202,310,311],[135,184,201,202,309],[58,135,184,201,202,284,302,307],[135,184,201,202,302,303,307],[135,184,201,202,302,303,304,307],[135,184,201,202,302],[135,184,196,197,201,202,284,302,304,305,306],[63,128,135,184,201,202,243,299,301,338,356,359,361,363,366,454,458,474,475,476,477,489,500],[60,135,184,201,202],[135,184,201,202,357,358],[58,59,60,135,184,201,202,284,292,357],[135,184,201,202,300],[58,59,135,184,201,202],[59,61,62,135,184,201,202],[135,184,201,202,478,479,480,481,482,483,484,485,486,487],[135,184,201,202,478],[135,184,201,202,478,488],[135,184,201,202,329,337],[135,184,201,202,329],[135,184,201,202,279,329,330,331,332,333,334,335,336],[135,184,201,202,338,476,477,489,534],[135,184,201,202,525,526,527,528,529,530,531,532],[135,184,201,202,525],[135,184,201,202,525,533],[81,82,83,125,126,135,184,196,201,202,206],[135,184,196,201,202,206],[82,135,184,196,201,202,206],[124,135,184,196,201,202],[61,62,64,72,73,75,77,78,135,184,201,202],[64,73,135,184,201,202],[64,135,184,201,202],[61,62,64,73,74,135,184,201,202],[73,76,135,184,196,201,202,206],[64,70,71,79,80,127,135,184,201,202],[61,62,64,65,66,69,135,184,201,202],[61,62,135,184,201,202],[64,79,135,184,201,202],[64,65,135,184,201,202],[61,65,135,184,201,202],[64,65,67,68,135,184,201,202],[65,135,184,201,202],[129,135,184,201,202,242],[58,60,61,62,129,135,184,201,202,236,237,238,239,240,241],[60,61,62,129,135,184,201,202,236,237],[61,62,135,184,201,202,235,236],[58,59,60,61,62,129,135,184,201,202,235,236],[61,62,129,135,184,201,202,236,237],[129,135,184,201,202,235],[58,59,60,61,62,135,184,201,202],[61,135,184,201,202],[135,184,201,202,490,491],[135,184,201,202,491,492,493,495,496,497],[135,184,201,202,279,490,491,494],[135,184,201,202,491,492,493,494,495,496,497,498,499],[135,184,201,202,338,491,494],[135,184,201,202,279,338],[135,184,201,202,490,491,494]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},"9f422a1bcf9b6de329433e9846e2de072714d0feb659261d0915ed89b7227871","9f06cca3f1b2c3d560cdbec5c0a3bfafdf58dc2439d7065ddc5f23af72fdaa73","8c467364768b887a7c3f3af90e02fcd1cf443ce162bb498082bfbcc99beb2a88","905a105127753c3ce4f2d19d866c0d5565758691579204519bb9b8fd838b790b","62d8d9c7b326f1d1392cf56c82d9c6b042039875caa7b503b0a0b41d0c3123c8","44a47ae3fa050377c57d37fb051a6c6cbc08405bd0efda40861653de399a0818","7170f18d5cdfb2d301f0470233e281da189a3b0a8d9ea4358edcb21b4c9a5728","cbbede9be700512a66d94e48c4ef981a6d1a1678698ee36f7dbbb4ac747aeaf3","a92c3adb47ae83dffb2b67e18f045efb376efd1547941de56366340c06d61077",{"version":"341494baae56b3810de282a6932c5c4edf0b44adf7aa00e1ced71a9258141315","signature":"ab2d635fd6cb30d208dd01ab057ba91c81e078dd4fb01ce79e4169b60a6d6761"},{"version":"c1e5340e6e2c73765454ef0056093661c0b4159518797e442c58d9e0dfbbe8cc","signature":"947b0453e11a8fb6575ab0c7c166a61d19d8546d31e6ed6565a2ba55e085f1e4"},{"version":"92b52627eb99e20e437d33fc58808896145bc40ae551a991844e7658395bdfce","signature":"b2c1c4a982d64dd886dfb0d772686167cfdd72ff347a30a75fb56d8cef849a7e"},{"version":"21b14a29d87dcddf64f59d7865144dadf7c455696b7c509d973d46d73af2eedf","signature":"e33fb6b6e85741ed9bbf83e63879bdb34ee79ffd1d95ea9dc861fd8bee66a53d"},"0685b918bf7e38ff946e8feb260e193f48626b7eed70669f1a4c5ecd0b3cd444",{"version":"33943d74593fcd8670b682fbda86001d2e728b13fceb5d22961074f186619743","signature":"834876ece7209108b986f9f57f225417fd56417cf55ca666926d81f9fef4bfeb"},"36cfb8ac02cece02f64db23c7ba4fb95ec2b56fa8d753250aff3f2b1663a9e34","64d61d96ca6dffcff65d3021718e83ed23bb14517aeb1f02e7c3ad993eb0a0bc",{"version":"8ebea2af5e5b387063de6535a5ecb197f32b1ae6614df257432c087725161c6f","signature":"83d8e36ad823821f3fc082e5aeea46f12c244ee8ea33e1a1f61f82e2e8064c70"},"c0bd5e212ce61814fcdc9240b90868b1108c37f21da55d21cabddd3e180f195e",{"version":"326a61d40b8bdb5b3c35f83e3cb0a78af05cfcd4539f9098c9fe46e32b5c6326","signature":"67105c74bb0297ad663631d8101c17dbf285b791afec84c8973108ba4ba9d08d"},{"version":"044f2620626e0bd1ce6161513ccc00cc107e502eb2d540c543ea7dcc54f18cba","signature":"8e469f181402c362402728d2de01851b8bd0238171f0ea7e47a4231ba3d5b929"},{"version":"bdaaa669518e13907293d935c2fe379936525a1226cbfe7b5ed1b407bac5234a","signature":"4dfe6c9340b968a06e5e2fa776af25efc07392f36b2203c80ce3047838de5e55"},"f6cd6b7cda0141a3f0d629aff6c529e3f55245d1c198c450737d7cea81b56d1a",{"version":"b5981034fd2b7724d3b4f4acdba358dc34ddaa3ad509ef9399c630c86cb9ccc1","signature":"b2c71fe0b04a86a556bf7473146f25f5c67906656a53d267942d9df20e39b1b0"},"0cc85eed70c33b0d113321a7fe2a8493c530cdec9babef148241f7203f35cc4b","c442972d48882efb43e3e64e1b30a68effd736227742a3ff936162d0ef320a4c",{"version":"3dfcd0a3bfa70b53135db3cf2e4ddcb7eccc3e4418ce833ae24eecd06928328f","impliedFormat":1},{"version":"bea7cae6a8b2d41fd1a9d70475b54d741dd7ca2103904934858108eec0336a69","impliedFormat":1},{"version":"bc41a8e33caf4d193b0c49ec70d1e8db5ce3312eafe5447c6c1d5a2084fece12","impliedFormat":1},{"version":"7c33f11a56ba4e79efc4ddae85f8a4a888e216d2bf66c863f344d403437ffc74","impliedFormat":1},{"version":"cbef1abd1f8987dee5c9ed8c768a880fbfbff7f7053e063403090f48335c8e4e","impliedFormat":1},{"version":"9249603c91a859973e8f481b67f50d8d0b3fa43e37878f9dfc4c70313ad63065","impliedFormat":1},{"version":"0132f67b7f128d4a47324f48d0918ec73cf4220a5e9ea8bd92b115397911254f","impliedFormat":1},{"version":"06b37153d512000a91cad6fcbae75ca795ecec00469effaa8916101a00d5b9e2","impliedFormat":1},{"version":"8a641e3402f2988bf993007bd814faba348b813fc4058fce5b06de3e81ed511a","impliedFormat":1},{"version":"281744305ba2dcb2d80e2021fae211b1b07e5d85cfc8e36f4520325fcf698dbb","impliedFormat":1},{"version":"e1b042779d17b69719d34f31822ddba8aa6f5eb15f221b02105785f4447e7f5b","impliedFormat":1},{"version":"6858337936b90bd31f1674c43bedda2edbab2a488d04adc02512aef47c792fd0","impliedFormat":1},{"version":"15cb3deecc635efb26133990f521f7f1cc95665d5db8d87e5056beaea564b0ce","impliedFormat":1},{"version":"e27605c8932e75b14e742558a4c3101d9f4fdd32e7e9a056b2ca83f37f973945","impliedFormat":1},{"version":"f0443725119ecde74b0d75c82555b1f95ee1c3cd371558e5528a83d1de8109de","impliedFormat":1},{"version":"7794810c4b3f03d2faa81189504b953a73eb80e5662a90e9030ea9a9a359a66f","impliedFormat":1},{"version":"b074516a691a30279f0fe6dff33cd76359c1daacf4ae024659e44a68756de602","impliedFormat":1},{"version":"57cbeb55ec95326d068a2ce33403e1b795f2113487f07c1f53b1eaf9c21ff2ce","impliedFormat":1},{"version":"a00362ee43d422bcd8239110b8b5da39f1122651a1809be83a518b1298fa6af8","impliedFormat":1},{"version":"a820499a28a5fcdbf4baec05cc069362041d735520ab5a94c38cc44db7df614c","impliedFormat":1},{"version":"33a6d7b07c85ac0cef9a021b78b52e2d901d2ebfd5458db68f229ca482c1910c","impliedFormat":1},{"version":"8f648847b52020c1c0cdfcc40d7bcab72ea470201a631004fde4d85ccbc0c4c7","impliedFormat":1},{"version":"7821d3b702e0c672329c4d036c7037ecf2e5e758eceb5e740dde1355606dc9f2","impliedFormat":1},{"version":"213e4f26ee5853e8ba314ecad3a73cd06ab244a0809749bb777cbc1619aa07d8","impliedFormat":1},{"version":"1720be851bdb7cdbff68061522a71d9ddaa69db1fe90c6819a26953da05942f2","impliedFormat":1},{"version":"961fa18e1658f3f8e38c23e1a9bc3f4d7be75b056a94700291d5f82f57524ff0","impliedFormat":1},{"version":"079c02dc397960da2786db71d7c9e716475377bcedd81dede034f8a9f94c71b8","impliedFormat":1},{"version":"a7595cbb1b354b54dff14a6bb87d471e6d53b63de101a1b4d9d82d3d3f6eddec","impliedFormat":1},{"version":"1f49a85a97e01a26245fd74232b3b301ebe408fb4e969e72e537aa6ffbd3fe14","impliedFormat":1},{"version":"9c38563e4eabfffa597c4d6b9aa16e11e7f9a636f0dd80dd0a8bce1f6f0b2108","impliedFormat":1},{"version":"a971cba9f67e1c87014a2a544c24bc58bad1983970dfa66051b42ae441da1f46","impliedFormat":1},{"version":"df9b266bceb94167c2e8ae25db37d31a28de02ae89ff58e8174708afdec26738","impliedFormat":1},{"version":"9e5b8137b7ee679d31b35221503282561e764116d8b007c5419b6f9d60765683","impliedFormat":1},{"version":"3e7ae921a43416e155d7bbe5b4229b7686cfa6a20af0a3ae5a79dfe127355c21","impliedFormat":1},{"version":"c7200ae85e414d5ed1d3c9507ae38c097050161f57eb1a70bef021d796af87a7","impliedFormat":1},{"version":"4edb4ff36b17b2cf19014b2c901a6bdcdd0d8f732bcf3a11aa6fd0a111198e27","impliedFormat":1},{"version":"810f0d14ce416a343dcdd0d3074c38c094505e664c90636b113d048471c292e2","impliedFormat":1},{"version":"9c37dc73c97cd17686edc94cc534486509e479a1b8809ef783067b7dde5c6713","impliedFormat":1},{"version":"5fe2ef29b33889d3279d5bc92f8e554ffd32145a02f48d272d30fc1eea8b4c89","impliedFormat":1},{"version":"e39090ffe9c45c59082c3746e2aa2546dc53e3c5eeb4ad83f8210be7e2e58022","impliedFormat":1},{"version":"9f85a1810d42f75e1abb4fc94be585aae1fdac8ae752c76b912d95aef61bf5de","impliedFormat":1},"db9e4672c7c667a0deabd6276b696e5994d3730e5586b5b87267aa63d9f72328","6ba80b835f61ba3a1e68f225ae88fa6e3f7c5f65ca051bc1756b7c899d3e9274",{"version":"4631550a659e584f008891ce1c715ce29d0cbc3dd1ffbfc76ad2b50eff702948","signature":"4803a49ca4544b6c06e8eb5122dfe1295d4d7ce24235d94447e98e106a544eb8"},"ab0970f1b7769b6a37dd837ce570dfeb1124740a38f15c9294b246eb1bc780c4","116f359450e3ce8b94d3a4e321826d56d77ac599b68f9c07b4a4d34b2e8bf3ed",{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"58647d85d0f722a1ce9de50955df60a7489f0593bf1a7015521efe901c06d770","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"83e63d6ccf8ec004a3bb6d58b9bb0104f60e002754b1e968024b320730cc5311","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"f27524f4bef4b6519c604bdb23bf4465bddcccbf3f003abb901acbd0d7404d99","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"6b039f55681caaf111d5eb84d292b9bee9e0131d0db1ad0871eef0964f533c73","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c8d3e5a18ba35629954e48c4cc8f11dc88224650067a172685c736b27a34a4dc","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2b55d426ff2b9087485e52ac4bc7cfafe1dc420fc76dad926cd46526567c501a","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"358765d5ea8afd285d4fd1532e78b88273f18cb3f87403a9b16fef61ac9fdcfe","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1},{"version":"c2a6a737189ced24ffe0634e9239b087e4c26378d0490f95141b9b9b042b746c","impliedFormat":1},"8ab9053eb153fdd8636f6b3f30208e0aaaefd7c23cd7c87be7ef913d36aaebe8",{"version":"57430b85fd84c95c5b5f867dfbdbdffbd11ef2e48965eb9ecc7f4fb9d78be325","signature":"7c60bb975faf3ad663c0b4ab1298189ee713f70d4de298b502817adf62a67517"},{"version":"08eb64a1afdeda9c7cd87114906037388d7af9d91bce27c293f55dee9ce5a8c2","signature":"6bb70c5f64455d1d657eb76662db351fa197bfc11c235958446a11378a89c7ac"},{"version":"b5076e65f873347e41f18a2d239083a544c080b880fd62de907bd064465e1290","signature":"06db8bf73dea3c7b4c102afa6ba55cd10f8cfb8aca19469022805681fa3afcb7"},{"version":"b9e4ff74d366947b2c7ff9158b5c878480c1523bffa20590914fa53c29144e07","signature":"67496dd15a6c42aaa6e98045b490e812607cb9b4dad4af89113f515e8989e498"},{"version":"63a9ab201a2da78d4d5c505c1c4c9fe380fffc7368f9d22fe7084b4e491977c4","signature":"e6f76af0104c5beefa263406ed7c77eaf1c123a44f7a2a62bbd34007994576ea"},{"version":"903dd73508a4b3ae23daa597ca913eac9f75e3621539691b0a216047278e9efa","signature":"8718c886b68cbebfd7ac12d44c89b15ec9681be511891ddb001d55bfca624276"},"52741694e94b7b6b04c12285da7e10103e66b57126303a593a257fb5e086a491","b28b6136a5678e5b01ed6019b0b9ef8b22446f7d291f081bcddc71051d2a6492","583610054995599f0ed590a55b9f81466909e2087ee04b6c2461d6e0c8b08b43","c8449a6bc016461d1269ba1cd5aaeadd845e458bde39966f1fb434e5e99204ce","7ea0e0cdd8e14703d723a50b6c0d07f620d825f0e148d6c9aa97af9950fcb44c",{"version":"2fd75662e4cd0cd568d6c0857e7a71648addda2a1c6d01918fae951dce5b519a","signature":"e56947ee9058324ec4665de7a5f2b44ed600d5f5fe4d106f386d3945b027ceae"},{"version":"a2ef968f2f25e45f7a634cba822bc2e7542678615fe0161826a8b2e82e071acb","signature":"1acc6cb36e8b47e5f297e7ce89899d4835db527a4515a88d6042ced47f57f2ff"},"88b62f5279f98c2c529bc562a99dcd1c1cf96c5f3698b04936ec7cd95722ddda","59b46ed04998fc50de4f3a8896fa90c08e79530e15da952bf1aade4498f63694",{"version":"c4d2a21697551d6e34d05cc2d20920bf142723d8f9f9ff4396b1b7d700e0795e","signature":"4cd3f1326b1d3a6aa7db37fb49f3f5566c913892c1d54b0eab6f5baebad2306d"},{"version":"98a3ed3fac7a473fa6fc4beca3de620139d52f9863497e943f053c124eae15a8","signature":"7cab4ac133c4384d9b8d4c26588c7d5dd9594c591ca3300516126040b4b471af"},{"version":"cafaee243ca4ca03a097af441baadf576180f1f6b0c0a71bd2cf27c92dc3c635","signature":"e44ef384844a9237cb611c304e38fe450057a78b9e9f1db7d32a3fe43d2483e0"},{"version":"d5132708f5591db907f3adda24e0a67970e99d588082cf0cc673359c4140c1d4","signature":"bbea260b8919541bdd34a14fb37f75fdf0427c00efefb7a13928a496c364ecda"},{"version":"5ac4bd7d11ce705620a56ed6903e3f0c2a432f616bfbd96d408d5e77d40773a5","signature":"d01861d83685fdb61efec1716ee8a0ccdcc2039bf06c77aedb987137e7067d63"},{"version":"54ae1f916462a6ec28561bf5c31fa31411c2b95421419952f82fb29efe33714e","signature":"b0fad4fb4276d6336977cf6295d9814985b54414ca2db3b7b1f0fd2dc7c07809"},{"version":"5a226d5a51ad9fabfe0849f5d5c81b9460ccdd9184796f1467cb992bbc5ce012","signature":"ae268be2009c9160f3244cf781cc8034b3081af0602be6edf179b32fac12365d"},{"version":"5ddfa20a02c6207915c3c9d2fbdb57c70f549307638c4608a63c4049c591dc6a","signature":"9170d6b6b7a0309985aeb8c8846d79e09ee882a2e0041a5434147250dfc86a95"},{"version":"c35b355506a0ec45a8488207a4df84cde8d696832d6157f61b6f851863ee1b66","signature":"d219f4462715c121f6b506cc73d3789c7eee328b8de5d088eedd13b85f193945"},{"version":"edb83dc67f334db478790a845e10b191ab51d035160a88e5fd3876664dec1612","signature":"45536df8f9b56837c4428a1ace080a9d6260a759adefc109dc57f2d191424adb"},{"version":"df984b0bafb5e53912367951ffc923a81ca6e15e6164b634055880e4344cac36","signature":"d413599f34315fc0052ffb60f7d5a5a86515ed75d8001e02353f9d18b30a0185"},{"version":"7a1dd1e9c8bf5e23129495b10718b280340c7500570e0cfe5cffcdee51e13e48","impliedFormat":1},{"version":"95bf7c19205d7a4c92f1699dae58e217bb18f324276dfe06b1c2e312c7c75cf2","impliedFormat":99},"b045297393a1167259e546c9c8f790f11d1bb9e56faee2a96ebf9dce560f198d","9ca31fd2cb6a4a2a79f0b9655deaec5de960871406084ddc7834e5f0caf6825d",{"version":"25fdd9095e3c88304fcacabc177f915c88f911ec76eec1bef97b0a5296b69b42","signature":"7885c4a77845f3c02af5bf64fbbb966a235b1bab58a4b7051466e669b1afa1bd"},{"version":"1b6a4d8614e087ac52dbff37fc366bdb9d9f6ded3aed6b9fc6a42c9a07c7df6e","signature":"8430e87be2507482dbc7a2775ead52d4a0b5d4a2ed7284ab0ff382b071235019"},"76cc26cd0f1fc54af550f8841264bfffae32d47ceb78f0234554492a2009fa6f","649415d05765a968aad9b1906b023aa680e332b6fe32bf31d4e96ae972797107","3803a665d8434387ab3b02307f2724bf49e2c74295f930e7fe4ba58bca51a078","e3d7de3e7b0a4b6582a09e0c6969a6835d42a3ea17f5a84e2674a4e2f0c16ec6","e6f912a58bbeba4d07663b3655e1ef880f01e7a194a86e351d4a9b96785b9dc4","b93c566bb2c61594e867c53306a6d56b086e7658013d2b9d233e89fab5acbb35","7a0aed8f3aa05ec618437c5c7fbbfd2295321316c197a171bc12de0fbb2bb922","791e111b25123db45cda32073ba13222b5a34a947b0156eda9e77187f2ef91ca","fb0547afd53f48e07ad555fd6efd0de07fecf26615cc93a4607c0220211bb114","7be4ecdc1589196748775376a609a917fd731034f8a1fafa7b5ebc9cf5e5bd53","f193b7ad47541d1cc44860467c828bfaa512e74bf09a2aa9aff70630a342187d","542267bec9796016127a97865a0f97ea180cb8fc3f89606fb8c9cc4253126acf",{"version":"28b5fc5754f4ebdf042cb5b27931e63b4ed8f5b64df7bf3be4b77d974640396c","signature":"7c6160b4798f9cc9075b64037e98364a917dc9cc11f9d71dc3a0ee7a3e50dbd7"},{"version":"89e0e9ac65c95aea0a539bd60ace8484b3a5c3cc4d897a68812217af830fc23d","signature":"47a7d3040054f86178e882756b4a6e34e9fdbda5b1e5af7ef50358554682972a"},{"version":"0988e2afa78428c0d1cd50268b54dbcf421f80c992d8a1a6055f4133730ec6a9","signature":"7c0d21fdea98689cfd57713319cea5ef1f813da8d049da78d18b79d73a497b41"},"f2905ff1575a84c410192ec46aa3f4996765c1e849ba421a259e05c7b2fc340d","aa34083e206a5f93e16d7c8ad6974bf445da6be4b5a7722d2ee98789faf7f8ae",{"version":"ffe50ea4d20591a5940538606dd44f33a5dc343b6cc9d043377bb2c5f72dca13","signature":"bdc6ba6cab4542255d2d3b21b833e5e45c06e196d6b2a3d49cfa96d12dac1bd7"},{"version":"38e01627ea43a1196ab44549409015e5c6f5b301fd332346a2e0fe38fddc6472","signature":"6268a941b5c0267c61b0cb7f96e92f066dd1638f4d41e5d9abea3e231fc792fe"},{"version":"c3de1901e84728e2075eb45ca5df0d75ecd0e35e919e826fa8339404ed5536fb","signature":"6f320f36f6d50aec6be01b18d1ec48e38d3a7174b06fce10997b1b2a0f235f4e"},{"version":"676403375489df3da1edc59ed83d950fb937530b99d1691e495e7e84920510c1","signature":"ca6ce7e58281373583bca8d6cc023bdf0a8ba359cf296d609de47e71fde6e320"},{"version":"8f8327bf5762a69f257f2eb84e3cf865c83a5a9c134adf38be12ce69bae4eb7b","signature":"7415a7b2551686254e6b640a4d2a6f4aab230278ee58f1bbafe5133e213e37d9"},{"version":"11833b3c60fc9ab463a626d92764f42597c64fc93119ebadbbf9790756db7d5a","signature":"20ec3c98684038c4796de72b760f0a68661c63123d465b1adf16533b3673c53a"},{"version":"126096fa7c786d9d03b90f9e81f2145a2237e4781504957d3aa2ee4382f5b39f","signature":"26cee9b0c548ad70d8d932f5ddd2b0ce204fd28c1aef982fdbc6d7bb1809d59b"},{"version":"1d095cf9256ec12ecd33cf34815253020c89230be4212f1fbbd9b5dc345bf2a0","signature":"e3de7da540596ce534a034433b32dce5c02af8d023732740e2fa4f6e2e619dbb"},{"version":"ec7fc48032dd77a91fba9a4b98a4ab79135026a5364eef928ca03ce4c6936c7a","signature":"55e91c7b01b9d92a7b7aa156248da424d3b29c51c08af0e6ec38f838a390b21e"},"d2b46d9c36e9927cc6b59679dbc45a92ed19909fcc25412772af6bf7cdcc5a4b","1500929393a66eac684b644318dec8d947f7cece77bceac84395a96cd0e819db","cc998ddaa317600c0c56e53e6e76cfd3b3e23a0783fbf371f294201fd3b15e39","0fa7d91ac72697950720581ea9265cc0d7aaf5e559ae21bee6cb6ec3f7e4f3c4",{"version":"6aa749045a7e565ab60023cd6cdaa21f9f0c0eb724ab4cc82f8b567182679813","signature":"ca6e2be2bf081bee0b55e45a962e50c00d903fefc99541d739c94dd86b227bc5"},"42661bdd3babb7325e5c1050855251dc1ebdf4b14e69ef732bb948cd3fadb831","d202cab2cfd4555a3f2cc559ed805fe0e9d8890dd79e34646d142c0c24b95141","ea2f9f2010acbf2c1e02e79513fcbc6715fc69483b0b270e26b7b16592790111","36d25724c00295ceadde4a1f69ea32c94d749823dd5ede6258b928ed699f1768","2efef5f483459d0177a69b02baef9b931fd045a852f27a4f295f6ed958eb57f2",{"version":"222ab086b785ed8c221acbd2922699f3411227a510d23788e52c303515b01d28","signature":"b59b72c114201092b61fed2907b5dc42d37bcac75973c262951f1e01cb25f874"},{"version":"09b127a60bb3bd8625f2e0910af7c7e86afacc05fcdfe7ea0d9f73c381d7c8aa","signature":"a29eab85a5b1a5738b7f341ee0f456d1ffa8cc26435c4bc2c64d77b122b15d63"},{"version":"fd0cecf30f9f963f1b0148733981087da93014fb0f69a9e065dab17fe67643ae","signature":"1aaf6618f7c27caf2c3dd31fc36c796e303f6ef1b622b56cb10bfa20c822c3aa"},"d9bac95e5cc44d0ea516e83cddda764f54dc5dd698cee1c64356ec968ebf57c0","2ec1e34570bc9b528ed078112f31576dc9ba1c973dc83a8c61c80b7bc425d4bf","b4ca0b2ae78101bdc252134c8519eacb2ceb931c9c38176706ac467b4eff7f55",{"version":"b6c3f5b183e5428d20d6f6e3290a1e8efdbdc5cd8ec31184bb3a018b17c3d7cc","signature":"5fcf9e828ac552d696a32e26473a290daef7c00f9ea05be7c36352a608697fea"},"37cb6bb48aba80a010297eb815aecc07c0ea334509944c66305018a8fdaa2c65","be7b800e572c75d9eb786fa7448c9e108dab1cece51f55f73b4144e91b8906e4",{"version":"0cb6b0a4e69bd922c9fae22e5d4cdb24b148ec0d29766c200738fdf5255a40d1","signature":"599472c91b08a43eecf44833d2f30542ef7cc0190304fdf30fa08c117d9f0485"},{"version":"c34561f348d2cad7395bc203ab64e2edac6184a5f0184ecf19e22a71724e4fb9","signature":"fbd95f4ab3310727d436da50c3f2b64ae3470f2b294bce456fcc148d7430c824"},{"version":"9bb87d1dcfb06b265c96c8bff31a95d7003128fdd24750dc6ffc7ba2e4cd357f","signature":"9ec476ad6bc79eb7a6375fd42c4bc5faa5425b426ee8a86937be48dee3e27bfc"},{"version":"00a6ccbc8dcd86c5d895ad39c2dbf030f2b6064c421bb49a021fae08f266e16a","signature":"5776a3e071566fa68f73435b549754651fab2d49bd71c80b0ea452dca486b714"},"5971247075b05ed88679485c1d056aec4cae062eb6951b995788c69a654a1c3c","f731d9570dc4e6c8a828c6b9f0228877820afaac8d2fdc00f4e8aff8d85c0311","dbcfc7d4a685b33c38be3dc2611615e692604bfdea5625f14d9f1156ad6722cb",{"version":"83a184bbff2dd763f8e8051aed20b7b620d55778918945b23ef7241e6792abf7","signature":"48bef5344818d7d8dcb158a49946d2664095548c37b152fb97c7ac668a503d38"},{"version":"fb73e07df3a40fbb9daf4ec269ac01946ce2a35cae550dc79e34d7ea8bdcecee","signature":"faf843aea697f27e092176bbf6438eb243ee7cd11a011d9d005c183241876ca3"},{"version":"be6fe6c54c0b3a07b8667b02fc6981b5b40758ede42caccb7fa81646ba567d24","signature":"ea87087d1587a331bf5ae10dfd2f63ae21e100729c440fe1189cf88feef2f0c1"},"031f18d0b2394a9704c2f96564fd098bc5d9b8770a0467623cccb2d74f9f6d6a","670b9a2aafef1ec78813620c5a738bb1df2235a8c2def1702b8d58332b52c177","6e07a05d78279eb87db944470d6b16bf3c5ffc8a43b7a17bbaa9d80d34c638f1","9c2eb90da480fa93d78e04cc441c282a07a2c7428bdade5cd35ee20de7cd888a","3d3f74d81aa3ee49f3218c9f7ad9a9202891581cdc4cf3dde9b92ddde4e781d2",{"version":"59bb9e89ce15a2a439b49d7e5df1ea4b895a4e76ce5345ddad27009201b49bf2","signature":"c46bc77315a2daa9b8bcc0117e8147b451dfa80da246369f08fb7186a5cbb76d"},{"version":"cf82c32e17442b87ef98f23f362da8331407d685d2d06fe7bb8175929d2d3630","signature":"2c83e2fa108d1d5e11a693c28caa50d4a293edb24ae607f87defa2a011ba7442"},{"version":"c60b24102572f64fb0023f5413404293c35c73b9734bd71da9d571b08111a81a","signature":"d9cf10849c8e1624968b7beeb5f75cb01a7b7bfe405d0e75e3431af25fd33f0c"},{"version":"f479af6869f5f6e70b8d8e19f59995c6ae59e23bb56670c96ce30485ac98a1d9","signature":"bc81a0924865a868f2d11e12a57e65d20a6aad3a73ad8e6a1c35906d10066fd1"},{"version":"f0bc31f07565c26ec58b2d3a26453b9019a83109cdb2254601b3e1cdd6fedd43","signature":"f26c8b5746c2dee46f6cd17ce0407dd7f159a50f1befcd618c6ebe386bf34d79"},{"version":"dd94387420ae72f77718a1eb8373de4687dcd6267f92411de88bdd3da5de2312","signature":"a0e087445957635c1d27d8a5ecff4ae69d8fd73591274a089247ed7b91ef6dc7"},{"version":"8ad01483f5e8e75c72b19af06b5e5bbcc38196ed07fb80bd0814b375b8050a89","signature":"21293659eb0d65ca036e443148fc73ace88d23cc6d127e49435a390cf1316bb4"},{"version":"7f95716c1c1e73c9c27e91618a727846a86b6f69b8b9f16f84faf5f2a7fe7580","signature":"7fcc5afe35870b940eb2726194cc00982394465c8a97e1a5db0db2a1e7471ae4"},{"version":"d210261df74e82cd056844822c6476575df905acc745dde0cfd45f6c1e7b6a68","signature":"37220c85a3643bcd1d8bc6b9a44360f3f44eaae4c4de1f94127a924d6e607e85"},"888bfa1a4a963276e39edc9446d69506170aa1cf8b078ef22748719ca199a5a8","3c0a996c5eccc7c17f68c1ebb45c299ca6d7dbb9daf58c8fff3392409c31a9ea","ea2635643910097eba211a15f93faffd343817feb00af8efefd97c81b48e2fed","ca06a25e3a9bf82bfdb6f9f61d6d67f6c90960b6e20df43abea3c9eab515bbea",{"version":"d1b1da0800ae66d723c43f2a07965d216addd736382b674a363d086b755f5efb","signature":"9c373407c210455669d88b33f3bf94b336ffb691fc6607108862e70658651cf9"},{"version":"0d597693230d3eca85524fa33430fe1aed403b459510b0abe00a4ead3aeb4025","signature":"5d3e1b2670a80156617b4c594cafe80fc93a3f7708fee1e475d989452d56682c"},"5d2667f3261713c3ed1dc5fdf5532bd49fdd74f399fb7e5d21901e29c7f6f1dd","d050988d2be49157325e97f3319532684b8ede2b83b87abcd8832b651b29b471","5a8fd21287dc8e39f13cbcb1ec3908f0f36428b4d575c02ef76c709d4cd07e3b",{"version":"4e02c2619e7a81dfd2b13b89917c7320d5ebd87d46f79ea113d088a0f122f7f8","signature":"29297d3a3e420486de11968f2494503916e5d8304c39a0b226304185bb89d458"},{"version":"9f2de64058d15197c6e93170f8a8e2a10a3ae0f181d17c4b3a482bd3500d077c","signature":"0f2d80b8746a1e3f204cef9c4e81e05c134ec87dff84d280d9129de72f9230c4"},"ef8865f11a87d159281b1bfb08427a05413fb012a60e624d33589ba16957c607",{"version":"5dcc475ba4e86db8610afe2ebce0f05da3d98be85ff9a0fd5e4bee1e293caaf2","signature":"d894eb4268a5c576018cc943e548de2766f9c5a11ad33a85b31034b54166fa88"},"f3afd6cb637b62f3184da2fed4948253e7476e9d6ec8e590359056d1ddf23b77","3f80582eca2101e3627134b99632333a665bc2837d1c4f7d07d0b3bdaba0aa0f","001dec038b0f816e352d106eb1d2b436d74462a9ae0f09487a533d08ebfa56b2","e645dc71a241c5fb97402bb0bafd2be8031abbdc9ea0726b44bf79f104022a61","4dd4f634c626a6f4365a71159448fe3ff154636f3413ef5a876ac0ac40fd751a",{"version":"6b2078cf551ddb6ba3c5a47a50b78f3c3202d4bfffc06f2d63c46b1275969a40","signature":"25dccc73ac651b6f427a5c1262d92c297fb782009301992f7e763baaac86e819"},"ba881b8d5b6e3df354cc26faf2ebe93d6c3c1dde02534542c716970ae9862549","181dab8c3c89994ffd0f00c80a4af48d62aa9fa40c07316e8c3cd1825a62eccf",{"version":"6d6336b1b4df7f1f65d3f84c9c020c205865ae237e19633d1fafd6aadad9a067","signature":"20ede35731e003188ab444e1f665ef57b98d0a6dc61db3e84a1d9e2cf26e7512"},"c12c64d0d3ac1be4fa925ba87f3de675601fb413ae25cc50396b192a9e176425","5402794b0084c917353387d102cfcc303842e39852c263451c1a77863cf28a9e",{"version":"287d0baf43e643c7c740b9e8770f9300b2bbf98b8a518e76e8e217ec8aaead64","signature":"7e3603ab3f7b687d414cb7c5016c472082e460903ad41a56e5ba7cfbb81c6773"},"91298e6a51bb1962d39eceb6371aada140acfa24417011da38a2c50d2f0da168","4bde15551a94df07a4010f995704efb12ffdc4bd752851a7f95f591092bab4f3",{"version":"9dfe82c07da9a54e56a248ba387ce383fc6a7743af92b17fed1527b0d5b6ebbd","signature":"4a5c1a1db7153a792163ba2bd6e5484fefaa945ba56cc3dcc58010eff0a87098"},"290d8f4ffa2ed9c837bf5d1ff05c7637ff021d486fcae6d898aaf2df69dda769","231b7e837fc604212aa02a5b148f585ad0b2ba995032e37eea7dddbb3a46088b","4115ce5ac014390c8cff8d3c51b52fa13f6294fb13d1803d6c40fe6cfdd6901c","b2419ec464344d9a111778d1d616889685934ba3d0915801a156f20295da39ef",{"version":"c2d0ba4e3ef6f4510841f61190862a4376c6515a4af1e44290d94e876f699251","signature":"90fc47f6d4b843c81fd8d118234714eb1597aab3d99d84b1595375110297a73a"},{"version":"632532295af106d8dd11653a780e944492849c55bc026c0425fe067c30e44bc7","signature":"6a10a7c2151ff433671419e5bbc7cee8778e7c39e052aa83319000f99b067038"},"d9a8dd605a9db2828cb9c2117053bd44bb318092e4bc8ac12297ecae52e48408",{"version":"a40659fe11d83da3b659ad4287b7c1b141378fce8962e95592cf4ee53258f190","signature":"7e91cb45efffef5a1d31678cbb168b19cb1c81f667ea8b9bb166666219ab3513"},"0e23ec9cf75425a296be7ee9bb1f85e499078bc492dae72e2fdc5d5fca98fb7d",{"version":"4bdf7deeb5d15eda7a4a4246622cc7321e2d4d605c3dcd9a516625815e772e22","signature":"06938748621829a3224cc5fdcdca288d592a30c3aacf358e78e66b2a31ce6604"},{"version":"6bf062bf83fe661c697b7122c883b56f982b85438ade4e43731c2efa36a48032","signature":"242e9604f52edbcea895391d4b757c9d7a1fa29155df4a7446dd768b68544ee7"},"fdc556b6075fae393c48cc18dc34519af2d448664447be8b7ca2126b02affb19","4678397e8b0ed1445aa088771c9d8572e7bf45cffc52c14b039f86b66fc20252","fe49dc0bf1a296cb927061f74f7fc6d74d2e418b9362c4640881b4e42a503031","d301b86d1d7050c88fcb6ca92ff9b138cfb0a0ca8a04b3a1b61ebfd911cb1a6f","fae2bc89da0a93f9a0266d21ac2c33bf03f2674c5ed33ff980e887f397c8e06d","02d6d2563d3b1928e87f184b0c8cf3bb35398e2c3aa7b6a29ffc24ddf282b6c5","43cb773c20a53ad1001df0133aeaf26b52855445031c295b9a37154ae35343af",{"version":"0e481a28d565f1a503dbada5d810dde3113157cf6563016b213cffec90a79993","signature":"d27fedc14d727bd41658ca484be1ce21bcc9c7e0b3d818408cd532046859a025"},"10719c6dd6b07a17cb9be468bafce43a61e5afaeaa4f571c5b49866ac337a8b6","fe0a9db55849377425bef5a6f180779d0c7370cd9f4a41b520880c5ee1cb11fb",{"version":"c5c99d680e713636b83e2e037b5a292adf0b2dcac011b1b188552e5907f6d7a5","signature":"ec1f1f01352c73a0937c2a40170380abef423c4dcf2992fb99bb56b49aaa51da"},"0e606c69a1200fccb0e927c090393936f2ac1c11920b0e55753f0c4fc45fb778",{"version":"6b4c5c71b0aa3cac94c8b3b819f68a30d0248709e6bce38465bd8bfd7d7cf395","signature":"2e2e5eb0404c9ee51c4b0775b29c77d9690f2ec4d00f458cb35e222109052154"},{"version":"5f314bd27e54d77f98289eb1e174636987e346c78b9631a2a1bc14f5d8595725","signature":"73e0e3e35999739e628b0637799eb941aa871bd8de076709ede1386329f82592"},"fa1124d16b3dff467594eb52257875ba98e68e40f39e10dba0611c7cf8d657f1","4f6ab5fa695e1f3d02881def8d878313b2f103220b91e48db7ac3bc21239313b",{"version":"0b2d2659a5ea7be13b0b7fe40f2c4019e3be87c4dd921a8025ee382320a7b63e","signature":"fc51366f2f95439652c372af69f0537191ad05536c1f0388e61245e24775aab2"},{"version":"f354dde829d0ca02f714015e8ab8535b7e57d46d492c3e4e3e6aa2b3bc47eedd","signature":"a2da1d64ab723db4bac2a6ed71775670f4c364fa5e036439df7f5a4bf374ad77"},"9c24c78a38da64fd818c7488f69b9d3e3290ecca8d2d2e01389fffd60fbdcb11","508d52244a0011a2812d56877281530ea463ba6cdcaaabacee8d11116796be74","b47ee19e60f569336d7b5fb2933e702b83d57ed60a253edd66cb1227432a5004","9fcd9e148321b51599f5e159452bac3942fe8e5152e379d40eca23209c0a0fda","ee485f14ae7dfc8c0f38490472d1f546e61c030fe440c0ad68d0adc75b09e4db","62f0646b465914396e6910bc62de871a623d2277db1da460209380168be11788","d6ea9568e4855c97e8126e299a4df99ab0cc53ae477b032a27045172e54d41a5","39c340dec9bcc6bcc6f291a47dc6bbb6d298a114ad9f32b9829733b3e0830e38","c1c5a4d1a72757a92a31329e8f86753bb5ff0c4d0196b8466e168a171e5f4fda","3d7bdaf3ed469369002a47e51fc3c03af0ca6e657da5297480e20e4ecd6b5ece","cf0a557968c3c332ded37b6a899c82d605412fdff51756d1bf99c9251006ecde","f1f4867152604ba908a356c724970b6fa7c372d2f5f47ea04d37af4c043646b1",{"version":"2e25a1451ed168766182a729e70cf978f6666827bd7fbebdfb0a12600be3557b","signature":"4116303bda6b7fb8dd7eb94b2d884fa91762aeaf7dff24b2bc82e342f81dabaf"},"97b1f9f98dad479221ad2169fa7f94c6c4b049ed3b5bb2f88c9e2296973efb2a",{"version":"d6852d894450cf567f3aa71d0052f1de7ec00992f4d00159b0d9130f9ac156ab","signature":"c39f1006549fa2eeebd16334d4ca45452f3fe05b1f65805a6ab86b8fb5d2a213"},"928b3deb2de8a4e91cd4473631de7d098f7cefba8279b527db2fbe9b440919be","91ff3d9748b6abfd395824f0fee820c5638871b86e6400c21d0c1dbe162b836f",{"version":"1ee5b9e592624caba1ba0fcf518851c824f448376408819372bf950dce560322","signature":"ff64928bceba2e97d18a6c29086528499590c38dec23c15caed2983e7273e40a"},"225d85ad926f680f65b70a76869691ca99e633e3e4240810eaaa62dc45b5e092","1d217f400428c50966aa0342db49abc2e57c37143be7fb243e4d610d7680b717","02cd73f7d88b1a50873ac66115bec20abe49433c35f0cad5dd09fe6f2f5940f8","04134f50f9c61432f199b9419775578a04691eb5dcff09492e5af4f409793ce1",{"version":"29136ee2c5932f09c7eaee1608d3ef92f1535d6fbfd8857e5b5cdbf91a85bf6c","signature":"9338b9ad199b99a6b1ff47561b315794975f37cf174b3454120c8934b8c68536"},{"version":"1711236bdd3baa5e1bba2640cec90d8ce98eb9ef752b1cf24ab70209aed78b4c","signature":"828257350b90679519f8c12223e5c62c29c8775b8edd79b36aaddb99833a978a"},{"version":"106cad458688e9688f525b07808597fafbf7e2dbf27986a1bb7fa04772893965","signature":"b8c5eabe0b7190c57143d036e77ee4dac8592e9b95eda33484bd5ad593e73d0a"},"38888437f31ec5e2d39aef9c46f5092d5722bf43f472436ad1b1af08d0ffdc57",{"version":"284363ad97f3206b55bdd30c19b6727051203e030bd3d4008374d135f789b11a","signature":"d496c700803b0710f191cd5cbc375ecdce16a2615eb942382a03c297df106d92"},{"version":"87f0e1655eed475c75e8f8565b2c111b222eff3a0be57122e5dd7f54349cd26d","signature":"7ee119bf4559fcd74ef7cc140632f2c2abc905c8c8611a6c62f3a492dc91751f"},"90d293744f66eb2cd999f5a414d75c0f6eb572505814c1186f29563a03554550","516a0644a6400b8ad2699d64219cd623ac085cd72a6256caa17f6ebe0da01c7a","5da3a91b2b5294885b3dec780c177bfde9132af5980be86b54a3e7734e3c26af","91ca499e3074bf63918558870f50849bf4a60be52d5a07c5f7b4e1c81361ece6","230dae55a40402304706222bddb8008c7c7fca4843d7c2131c361621058a1303","f97aa7fd4854ae4781f63fd5d481f76cb728a8501f254748b195054547cffce6",{"version":"4808bce828d7d7195dc01061460b99aea69a268113007177eb07d09fbcb9f285","signature":"750f5e683a1b3bee494789e81dd0d74e3875c22501c739f8e08f89fe87f22d8c"},"7dfece00e91dedb5e6f262fe95608e17d93b0e3bcc88d3221de3bdf82c22a4a9","184e1728672781b439d0053f03e41aa2474569efa05bb2429e4ae000a9aed934","b6b55f2ed87d0e7a97b6a552c4becfd465f99598fe6e0a531b36beb2b98c4258","bbb46b0fbcdc576355c8044c59fc6041147db11505e5c4335bf3e97a5289efb5","a3d89d72d4526e41ccb86f770a5f55edf937a5f667b0befde576c1d4bdb0c9b2","0acb24ffe93a828277250a003cc910df744832316ebf80fdbd63c1b0fd13c940","7c1ebde823b390f4e738aa1384e6106f0246ce1d73b1d6d20d4e9c67623c26d0",{"version":"18e839a0576d60b32ba7865379783c9cc434bde58eaeb267aa5be1f6f1472529","signature":"e2545e88eba753162c37e135587174b1d856a6dcb6650a0e33019fea00061bc3"},"fc6bab518cd4dfd7b5b6a6d7df396ec46feddf36e51a0a05690395c3b9112a08",{"version":"7688603daec9c69e7b8fa4961bc345e5117d52d5afbce98564db5cd0bdb0db00","signature":"337d47027050863e14974d13d062f1f85a9b2869a84bb91bbe24df61ec852a93"},"56fd389ea239c6259f7ee1eaa9f82f0441c6566da29d670f5ec9df6b10b55d6e",{"version":"07a319b96bf1cd3f096c1e38dbf2f19c288341da0157c8ac3c2703abea63f334","signature":"a498c70749dbae8c2a9223452458dfa1494149b00eeeecbdc583fed68ceacc6a"},"2a2584577164a5f7520b29f83472b5125fde512794ff5ec5b2226eed0f098f6a",{"version":"1003909761e6fe401bbdc60c164dc9d4298f3130477606826ce3836667285cd9","signature":"83ec3f1be98f3acd093e99b1f25dde3c87bf2481504fda5f8b4a405b2d4c293e"},{"version":"d1c1c415fce0b467e37ba6b2c3c073dabc102add2d1ed3f062d471d9c6229b6c","signature":"69984b8b25cd8e7c40c21ffcd0f1e2212c2a59435f16ce886888fb5becef1b8a"},{"version":"bb89661a4eb77298a7369fb43414990eb6041032f9138e9f75798832d1bc4441","signature":"631d753965b13ce63248e76c8aa412b3449f32d228aa71ee2bb68b8cf7524346"},{"version":"f683193a216b17a9b0eea20665b78bc3a621987eb5d43174f45e455e8cf17ecf","signature":"79964a91a8dcd9a4ee5f0927ebf6c6d382e7c9019ca779190ece7b4f31ccbcac"},{"version":"2afac6b4b51cb2507ffa9100790292d6a939a389bb9ae311d0d5f9a80178ddee","signature":"6960507077823e96a18707a970623a4951f084125f15ed95fd39cda1c156fe18"},"3a157c2fd4e7f29b2adc842bbadf3bb9e1fb1b20ad5ca55fdc365ef130f77d48","040fd3a93bc770d200ecfbd83cab66b22e0c104fdaed29daea5f1ecc05f8dc74",{"version":"ba7eaef53d48056e1114a79518e5acc019db48011d708c03f47d57264be6d88f","signature":"f4209dba9f0d4739fde6fb305d4ec52da611e8221dbcb2603a569e61749f4b7e"},"fb59f620807e4d1dbc5cc95639262f89395c1d20fcab03efc323a221b07bca43","922d4ab256e7db3a63b52e0e4a8f2c7019491b58b0961f297c5b613a2783d970","85b6daaabfe2c275b7013d13df14031bbaf623357e3746bed9ca1afaab46bedf",{"version":"2ccb0e02fb165ef588673868e5e1b78d7f2b8f22cd463c8e015f9c9fcb8f3eb6","signature":"1114551db4fdd61cd6e610b04417ac73214ca1d86b5276ff01d5d213afae6028"},"f594f5af79c5a5c75dd9e04e39314d6a193b2a18369d57195ae3675ea25925e2","df75106fc1f7d530d3f7a276d62f1b22a634169bda121da7b0cff548493c1074","1cad8db035a510050fb929577f148153ef41f0fd2773df0149cbec01556c7050","43b3564d0973387eb4877c5e3a996883331e8c73a2a675aa4a708afcb4f12521","7ef1eabb4e5ec071c4aca406d80abf528ea9a15b968dbc3e275d8453c1924003","ee5d9091cc397c259f406c229cecbb893af5548944ec9b7c3dbf0daa9cced037","cdaa28c764ef022a285afecf6a4b1dc9287843dd2b45c703056e880467257cb6","57a452c40651b548c85a342f28241ee37a84e1967630ed318e515ee21d4c8ee5",{"version":"e0611572c6aa5500e703c4332eecb1235d618fc91315bd39d4ccedbe3a6fe710","signature":"88b9d1c95c5d24fe2226279e049758e255c38217bd1745c987396450664efffd"},{"version":"be4f9c6ac98f48266c88db65806e5dc4084170a229c6205159a53f0507c4c666","signature":"4f36e85c778a18388a2a0be741e41dfe694eaf53648a8187764a206d97646e33"},"bb299294f09f4dd9932c8ad94bb16d7d062353d172f72e0a99d7226f3ec5b659","83962d24b7752d8aa205f38ab58ba7fd4464017403e4eb8d2481234248a626d5","260da6fd223535a3d498a1af94f4249a3e67d28e56d7648dcc72e069911cc2c8","d1f0095428cf1de664d9594850b63567b7ca7325fedac6dfd425130041b420a2",{"version":"6c430c13fabc220d5e2053a81d1c993ba4341c9f461d98270b1ff503c8c48030","signature":"74e96d4aad53e97b1d97d79db9740de79b45fe9cd213fc15732e40e3ec0baefb"},{"version":"0740a1887c4e1c1c71fff7925a3feef85a6ab4d5b2ee4c24fb84357583da3402","signature":"096c2ea95aafd65206cb6bc34c9c7bff10e426532f7729fe2ec06284139c2935"},"a8124c363cdc2f4bbd08a4283e216b1d1fd358ddbdc658afd6fa510ed16740dd",{"version":"1c6cecc8cf9d39e2501347175b1be54b8dca76fed82b87f9fa0b8b7268cb5b61","signature":"a8a7731305eace3c153d32be9f06fbe63be69ae1cf8d3fc12beccdbf4dd3fa19"},{"version":"cdc15c17185913bb5b56f5f240728e7096ca133d78464876e98b6d38185c6d19","signature":"aad2dc88c90a3bd1cfee27769a3ddf1f5d1f11c22d24c21c571cd599393f27a9"},"58fc9b0a79e29fa867e347981ecbef6ef52ffacfc848be358cdc41a5d9e133c8","b3bb55f630f4d3113bd13408c49d2d7a2ea1ddf96061cb5952d0bf778d491eba","f10912d31d9010c44d3aa471b34e77be99329c64f69675b00104a21e4cc50470",{"version":"20e5482e50895255d12953211f19710988ab278b9f342db385f7985d34ec02bf","signature":"009b3d3467bee336fc5333ef326adaa0032f835085ab5d35a14a20004f2fda89"},{"version":"329cba5a5932d066b56c840e4409e8390f8853314aaf85f585626b77abbd49bf","signature":"e847e443a0d4a2648051133817a02200e0b9c4b2f616a992c7ca8325a7c71d24"},"75304d5f2ccf463507df23f4b8066e7e758225a1a36d6ebe83c1b714da6c2ac5","049398af73a373ead19379fd1da4809d18bf6cf7123e44116c1491ad58d5acf0","9d8c851e30a432fadf9709f5b7802b9346d7c4aa3db0f25907669f98178bdd6e","4eaf53474be1f3e9182de786375b87893f47081e491b45321cac3a8427250f5c","79804619db6df7144de589d927d3c861d5e037ee91c9d55590ac14f927e371ac","5f6104030d0571c22ccb732c1ff1ee3f9ce38d54d0157fb895fd99d62222103c","5a64c9b17d19f3d6f73be414c83c4b4a37bb1898fc8552e2d63f71f2f6904724","a17ffb4463a3144d95960125ae3ea541a055bfa1494a908dc8688a21a0a58216","9428fa53b4d4910ec04a42be6e8bc915242800381bf5782013965ae8b4f6e3ae",{"version":"dc9928627dc636458117a0f2888131ab222a160ed58d4942ebdba75d32beb69b","signature":"65bfecd2818ad03a178a366da92866f11bf28543c976ea5ece19a4da94325cc6"},{"version":"632cf9f97223c29fa65cf7eb81ba15d2d21a851dff8f5e0921b7e428a837af84","signature":"e528dae475f84ca4b0d288ed1214728e7cbcf7fbe575122b3b4ced8b74112d30"},{"version":"5e789cac338582e7c1522ce9fde6b2c4cfd626989fb5dedbdcbd1fdb7028e82d","signature":"d6fbdee4c4eff4dc60ad18d1fec3e807560151d406fc4d51c0932702f4d541d6"},{"version":"1ccf807c1e706cf662a2475227e453da3a57cd9f6c21aaa843d3358d619e78f4","signature":"a593cbb274f58781d5afa2b8940172320f01892dfb252a5298282006c89e7005"},"dad7f9496da68b21150b690b1bf00dcb5ddc05f575f082b9f79a0316e3cf0923",{"version":"356173560bdd68ce8d6f93eb359829b4b93fdc9799369052964544c0c0551303","signature":"c2c6accf3268c2f12ff2c819692b9cbe8d023558fc09f3016e7e561c3af52312"},"0ef5075c8c118e4b9f6d6e61164849a3da33cfa8a6d709b9e76b9e187cc502d7","30b18dfd86c195a4e504a9c7cab74e253cc9a81e5150a1e078a60116f8413a7b","eb572a47bd52202d9046b74cd08e11b817a09d7da9d411221c209605b53d50bf","507d41570c8cad3489d272cba504fd33baa7d60903086b2b1ea6a44a32cab870",{"version":"4f4dad224f28ae73a636eaca502d71b374a4095d5a3f540f66cb56a688e067f1","signature":"e205ad943a1d6322748964c1c5afe5fd8eed5e33b98cf4bf9d484122517d695f"},"4139b027a8724e900dc887009ac6df809cc5f6a5fa5f58d2d684a6f6d96ff245",{"version":"09e6acd94660ad0acf93ee0cce96ba7c540b67bd65ab5b043decb5ad9976c00d","signature":"a2b219ecd7ae1c03346f58fef9fed021265ee17449f7d5b9b3d8695bd91c859a"},"f90eaf7c39bcd43cca5e307991878da4c86947ade4c9c999534c75647e9356cf","5b9a0c2f29da015a2b552e9890b67dd33cbe9fd15c69384b8eb2e65b0be19320","01101a850ef55e575e5c27672a5788b954101ab3ee2009dc5d94820fd9aeda1d","6c26420749d17833efe84a50d61db06fbd4082e497e65ae2e4b82f2d23476279","d6c4e7806d89a5b3fe00eb53b08ae06a8d26226bc9cfbec2758d4db28462d0c4","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",{"version":"3bb648f566e49849b20bbef6a3b737a875ef4e774b33f94f53dfdbd9deac403f","signature":"9cb406fc96d00b47efe8bd92ee5171ea22892e0769380d587c8c446876049113"},{"version":"3d8e5168a19d52d77dc69b6785a069ed2f14000e24eb275dd5846fd31e473801","signature":"5d9e716981b9e4f0db938d47c0a36a42d15e58d16f6277c765c045defc98afa2"},"eb76714199edf4f96ba125503ae4114b4d557a55ad0fc85ec5bc30f09310bbaf","ac9ad025410d9d9a641205333a48c94a3de3caae3f5c3c4d155cf70b520556bc","e51177d723e64eb327102e10399d61ed9e89bddcf69260ac0600ca0a39b3f33b","b1bd895022be16cfda91bd37db27aab863df16082d760afe55ec3d912f1743b6","4143a3ab0eafd782c745bb4ce3b5ca2be6ca96cba8d23dc69755dcc348e319c7","6efb415baab05a5830113c471acf3c82cae9b9560036644f937cb34924921dcb","de5e7d2f6e5328b18b5dc3a39f3ca67df73577cee8b5ca8af48759f1264dca01","f24c8d553c4178e3bca9e6988140a5b98064a1f8820b53adc58803b6317c84c7",{"version":"043dc788a719c8ead6f63a3f38809be150dfab433068fd674cbe491c7b0af2fd","signature":"07ee64be21ebb6bb21d5c8d5c16c2bb936f3875b3b9e9f6efe55a3d4ed0b103a"},{"version":"99af15d20e90e9b50cdcfca19a43ae519039ba1c747da2e3f1eb0dff85345180","signature":"877ee28045b8616a94a107e666fadae50a0851d47aff15341802e1aa1826bcb5"},"6845f2b449f15f71067b9c3bbffdeb58439226b7e1dea3ac10c2b101a913d0c9","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"],"root":[[58,83],[125,129],[236,262],[265,268],[280,540]],"options":{"allowSyntheticDefaultImports":true,"alwaysStrict":true,"composite":true,"declaration":true,"declarationMap":true,"esModuleInterop":true,"exactOptionalPropertyTypes":false,"module":99,"noFallthroughCasesInSwitch":true,"noImplicitAny":true,"noImplicitReturns":true,"noImplicitThis":true,"noUncheckedIndexedAccess":true,"noUnusedLocals":false,"noUnusedParameters":false,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictBindCallApply":true,"strictFunctionTypes":true,"strictNullChecks":true,"strictPropertyInitialization":true,"target":9,"tsBuildInfoFile":"./tsconfig.tsbuildinfo","useDefineForClassFields":true,"verbatimModuleSyntax":true},"referencedMap":[[235,1],[264,2],[263,3],[181,4],[182,4],[183,5],[135,6],[184,7],[185,8],[186,9],[130,3],[133,10],[131,3],[132,3],[187,11],[188,12],[189,13],[190,14],[191,15],[192,16],[193,16],[194,17],[195,18],[196,19],[197,20],[136,3],[134,3],[198,21],[199,22],[200,23],[234,24],[201,25],[202,3],[203,26],[204,27],[205,28],[206,29],[207,30],[208,31],[209,32],[210,33],[211,34],[212,34],[213,35],[214,3],[215,36],[216,37],[218,38],[217,39],[219,40],[220,41],[221,42],[222,43],[223,44],[224,45],[225,46],[226,47],[227,48],[228,49],[229,50],[230,51],[231,52],[137,3],[138,3],[139,3],[178,53],[179,3],[180,3],[232,54],[233,55],[140,3],[56,3],[57,3],[11,3],[10,3],[2,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[19,3],[3,3],[20,3],[21,3],[4,3],[22,3],[26,3],[23,3],[24,3],[25,3],[27,3],[28,3],[29,3],[5,3],[30,3],[31,3],[32,3],[33,3],[6,3],[37,3],[34,3],[35,3],[36,3],[38,3],[7,3],[39,3],[44,3],[45,3],[40,3],[41,3],[42,3],[43,3],[8,3],[49,3],[46,3],[47,3],[48,3],[50,3],[9,3],[51,3],[52,3],[53,3],[55,3],[54,3],[1,3],[156,56],[166,57],[155,56],[176,58],[147,59],[146,60],[175,1],[169,61],[174,62],[149,63],[163,64],[148,65],[172,66],[144,67],[143,1],[173,68],[145,69],[150,70],[151,3],[154,70],[141,3],[177,71],[167,72],[158,73],[159,74],[161,75],[157,76],[160,77],[170,1],[152,78],[153,79],[162,80],[142,81],[165,72],[164,70],[168,3],[171,82],[117,83],[86,3],[104,84],[116,85],[115,86],[85,87],[124,88],[87,3],[105,89],[114,90],[91,91],[102,92],[109,93],[106,94],[89,95],[88,96],[101,97],[92,98],[108,99],[110,100],[111,101],[112,101],[113,102],[118,3],[84,3],[119,101],[120,103],[94,104],[95,104],[96,104],[103,105],[107,106],[93,107],[121,108],[122,109],[97,3],[90,110],[98,111],[99,112],[100,113],[123,92],[273,3],[271,114],[276,3],[274,114],[272,115],[275,3],[270,3],[279,116],[277,3],[269,3],[278,3],[502,3],[503,3],[504,3],[505,3],[362,117],[363,118],[360,119],[508,3],[509,3],[510,3],[511,3],[512,3],[513,3],[514,3],[515,3],[516,3],[517,3],[518,3],[519,3],[506,3],[507,3],[520,3],[521,3],[522,3],[457,120],[458,121],[456,122],[455,3],[450,123],[376,124],[438,125],[453,3],[439,3],[441,126],[442,126],[444,127],[443,128],[454,129],[368,130],[445,131],[446,131],[447,132],[435,133],[436,133],[433,134],[432,135],[378,136],[379,136],[380,136],[381,136],[383,137],[382,136],[390,138],[387,139],[389,140],[388,141],[384,142],[385,133],[386,141],[391,136],[392,136],[399,143],[393,141],[394,141],[395,3],[397,144],[396,141],[398,133],[400,145],[401,136],[402,145],[412,146],[403,3],[405,147],[407,148],[404,141],[408,133],[409,149],[410,3],[406,3],[411,150],[413,145],[414,136],[415,145],[422,151],[418,152],[419,153],[417,154],[421,155],[416,133],[420,3],[423,136],[424,136],[425,136],[426,136],[427,136],[428,136],[430,136],[429,136],[434,156],[367,3],[431,157],[377,133],[437,158],[375,159],[371,160],[373,161],[372,162],[374,163],[370,164],[451,165],[452,166],[448,167],[369,3],[440,3],[449,168],[365,169],[366,170],[364,3],[328,171],[326,172],[327,172],[325,172],[324,3],[475,173],[474,174],[473,175],[466,3],[472,176],[467,177],[468,3],[469,178],[470,179],[471,180],[465,181],[459,3],[464,182],[461,183],[462,3],[460,3],[463,3],[292,184],[523,185],[291,186],[290,187],[289,187],[288,187],[280,188],[296,189],[299,190],[298,191],[297,125],[284,192],[268,193],[524,194],[281,195],[282,193],[283,196],[267,125],[251,197],[250,198],[249,199],[245,200],[247,201],[246,202],[248,203],[265,204],[266,205],[254,206],[253,207],[252,208],[255,209],[259,210],[260,211],[257,212],[258,213],[256,214],[261,211],[262,215],[244,3],[285,187],[295,216],[294,217],[286,218],[287,219],[293,220],[344,3],[350,221],[347,222],[348,223],[351,224],[345,3],[349,3],[346,3],[354,225],[355,226],[352,3],[353,3],[342,227],[343,228],[320,229],[339,230],[321,229],[322,231],[340,232],[323,231],[341,233],[319,3],[356,234],[316,235],[318,236],[314,237],[315,238],[317,239],[313,240],[311,3],[312,241],[310,242],[309,3],[306,243],[308,244],[305,245],[304,246],[307,247],[303,3],[302,3],[501,248],[357,249],[359,250],[358,251],[301,252],[361,253],[300,254],[477,233],[488,255],[479,256],[480,256],[481,256],[482,256],[483,256],[484,256],[485,256],[486,256],[487,256],[478,3],[489,257],[476,188],[338,258],[330,259],[331,259],[332,259],[333,259],[334,259],[335,259],[336,259],[337,260],[329,188],[535,261],[533,262],[526,263],[527,263],[528,263],[529,263],[530,263],[531,263],[532,263],[525,3],[534,264],[127,265],[81,266],[83,267],[125,268],[82,3],[126,266],[79,269],[74,270],[72,271],[75,272],[77,273],[78,272],[73,271],[128,274],[65,271],[70,275],[64,276],[71,271],[80,277],[67,278],[66,279],[69,280],[68,281],[537,3],[76,3],[538,3],[539,3],[540,3],[536,3],[243,282],[242,283],[238,284],[239,285],[240,284],[237,286],[241,287],[236,288],[129,289],[60,253],[61,3],[58,3],[63,289],[59,125],[62,290],[492,291],[498,292],[490,188],[493,291],[495,293],[500,294],[496,295],[494,296],[497,291],[499,297],[491,3]],"affectedFilesPendingEmit":[[362,51],[363,51],[360,51],[508,51],[509,51],[510,51],[511,51],[512,51],[513,51],[514,51],[515,51],[516,51],[517,51],[518,51],[519,51],[506,51],[507,51],[520,51],[521,51],[522,51],[457,51],[458,51],[456,51],[455,51],[450,51],[376,51],[438,51],[453,51],[439,51],[441,51],[442,51],[444,51],[443,51],[454,51],[368,51],[445,51],[446,51],[447,51],[435,51],[436,51],[433,51],[432,51],[378,51],[379,51],[380,51],[381,51],[383,51],[382,51],[390,51],[387,51],[389,51],[388,51],[384,51],[385,51],[386,51],[391,51],[392,51],[399,51],[393,51],[394,51],[395,51],[397,51],[396,51],[398,51],[400,51],[401,51],[402,51],[412,51],[403,51],[405,51],[407,51],[404,51],[408,51],[409,51],[410,51],[406,51],[411,51],[413,51],[414,51],[415,51],[422,51],[418,51],[419,51],[417,51],[421,51],[416,51],[420,51],[423,51],[424,51],[425,51],[426,51],[427,51],[428,51],[430,51],[429,51],[434,51],[367,51],[431,51],[377,51],[437,51],[375,51],[371,51],[373,51],[372,51],[374,51],[370,51],[451,51],[452,51],[448,51],[369,51],[440,51],[449,51],[365,51],[366,51],[364,51],[328,51],[326,51],[327,51],[325,51],[324,51],[475,51],[474,51],[473,51],[466,51],[472,51],[467,51],[468,51],[469,51],[470,51],[471,51],[465,51],[459,51],[464,51],[461,51],[462,51],[460,51],[463,51],[292,51],[523,51],[291,51],[290,51],[289,51],[288,51],[280,51],[296,51],[299,51],[298,51],[297,51],[284,51],[268,51],[524,51],[281,51],[282,51],[283,51],[267,51],[251,51],[250,51],[249,51],[245,51],[247,51],[246,51],[248,51],[265,51],[266,51],[254,51],[253,51],[252,51],[255,51],[259,51],[260,51],[257,51],[258,51],[256,51],[261,51],[262,51],[244,51],[285,51],[295,51],[294,51],[286,51],[287,51],[293,51],[344,51],[350,51],[347,51],[348,51],[351,51],[345,51],[349,51],[346,51],[354,51],[355,51],[352,51],[353,51],[342,51],[343,51],[320,51],[339,51],[321,51],[322,51],[340,51],[323,51],[341,51],[319,51],[356,51],[316,51],[318,51],[314,51],[315,51],[317,51],[313,51],[311,51],[312,51],[310,51],[309,51],[306,51],[308,51],[305,51],[304,51],[307,51],[303,51],[302,51],[501,51],[357,51],[359,51],[358,51],[301,51],[361,51],[300,51],[477,51],[488,51],[479,51],[480,51],[481,51],[482,51],[483,51],[484,51],[485,51],[486,51],[487,51],[478,51],[489,51],[476,51],[338,51],[330,51],[331,51],[332,51],[333,51],[334,51],[335,51],[336,51],[337,51],[329,51],[535,51],[533,51],[526,51],[527,51],[528,51],[529,51],[530,51],[531,51],[532,51],[525,51],[534,51],[127,51],[81,51],[83,51],[125,51],[82,51],[126,51],[79,51],[74,51],[72,51],[75,51],[77,51],[78,51],[73,51],[128,51],[65,51],[70,51],[64,51],[71,51],[80,51],[67,51],[66,51],[69,51],[68,51],[537,51],[76,51],[538,51],[539,51],[540,51],[536,51],[243,51],[242,51],[238,51],[239,51],[240,51],[237,51],[241,51],[236,51],[129,51],[60,51],[61,51],[58,51],[63,51],[59,51],[62,51],[492,51],[498,51],[490,51],[493,51],[495,51],[500,51],[496,51],[494,51],[497,51],[499,51],[491,51]],"emitSignatures":[58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,125,126,127,128,129,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,265,266,267,268,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540],"version":"5.9.3"} \ No newline at end of file +{"fileNames":["../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","./src/types/graph.ts","./src/types/providers.ts","./src/types/deployment.ts","./src/types/errors.ts","./src/types/result.ts","./src/types/index.ts","./src/schema/schema-provider.ts","./src/schema/resource-validator-types.ts","./src/schema/validation/error-conversion.ts","./src/schema/validation/constraints.ts","./src/schema/validation/type-checker.ts","./src/schema/validation/property-validator.ts","./src/schema/resource-validator.ts","./src/schema/type-mapper.ts","./src/schema/embedded/events.ts","./src/schema/embedded/sqlite-types.ts","./src/schema/embedded/converters.ts","./src/schema/embedded/graph-queries.ts","./src/schemas/db/index.ts","./src/schema/embedded/initialization.ts","./src/schema/embedded/queries.ts","./src/schema/embedded-schema-provider.ts","./src/schema/unified-type-resolver.ts","./src/schema/customization/base-db.ts","./src/schema/customization/paths.ts","./src/schema/customization/example-files.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/parse/line-counter.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/errors.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/doc/applyreviver.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/log.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/nodes/tojs.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/nodes/scalar.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/stringify/stringify.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/nodes/collection.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/nodes/yamlseq.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/schema/types.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/schema/common/map.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/schema/common/seq.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/schema/common/string.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/stringify/foldflowlines.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/stringify/stringifynumber.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/stringify/stringifystring.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/util.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/nodes/yamlmap.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/nodes/identity.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/schema/schema.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/doc/createnode.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/nodes/addpairtojsmap.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/nodes/pair.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/schema/tags.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/options.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/nodes/node.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/parse/cst-scalar.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/parse/cst-stringify.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/parse/cst-visit.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/parse/cst.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/nodes/alias.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/doc/document.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/doc/directives.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/compose/composer.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/parse/lexer.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/parse/parser.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/public-api.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/visit.d.ts","../../node_modules/.pnpm/yaml@2.8.3/node_modules/yaml/dist/index.d.ts","./src/schema/customization/file-validators.ts","./src/schema/customization/scanner.ts","./src/schema/customization-loader.ts","./src/schema/index.ts","./src/state/state-store.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/compatibility/index.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/globals.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/web-globals/events.d.ts","../../node_modules/.pnpm/buffer@5.7.1/node_modules/buffer/index.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/header.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/readable.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/file.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/fetch.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/formdata.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/connector.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/client.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/errors.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/dispatcher.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-origin.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool-stats.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/handlers.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/balanced-pool.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-client.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-pool.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-errors.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-handler.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/api.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/interceptors.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/util.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cookies.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/patch.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/websocket.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/eventsource.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/filereader.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/content-type.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cache.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/index.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/web-globals/navigator.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/web-globals/storage.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/assert.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/assert/strict.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/async_hooks.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/buffer.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/child_process.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/cluster.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/console.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/constants.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/crypto.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/dgram.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/dns.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/dns/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/domain.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/events.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/fs.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/fs/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/http.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/http2.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/https.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/inspector.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/inspector.generated.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/module.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/net.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/os.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/path.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/perf_hooks.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/process.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/punycode.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/querystring.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/readline.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/readline/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/repl.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/sea.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/sqlite.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/stream.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/stream/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/stream/consumers.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/stream/web.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/string_decoder.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/test.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/timers.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/timers/promises.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/tls.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/trace_events.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/tty.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/url.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/util.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/v8.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/vm.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/wasi.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/worker_threads.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/zlib.d.ts","../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/index.d.ts","../../node_modules/.pnpm/@types+better-sqlite3@7.6.13/node_modules/@types/better-sqlite3/index.d.ts","./src/state/sqlite/types.ts","./src/state/sqlite/resources.ts","./src/state/sqlite/deployments.ts","./src/state/sqlite/lifecycle.ts","./src/state/sqlite/locks.ts","./src/state/sqlite/snapshots.ts","./src/state/sqlite-state-store.ts","./src/state/index.ts","./src/graph/parser/tokens.ts","./src/graph/parser/ast/types/base.ts","./src/graph/parser/ast/types/expressions.ts","./src/graph/parser/ast/types/blocks.ts","./src/graph/parser/ast/types/statements.ts","./src/graph/parser/ast/types.ts","./src/graph/parser/ast/helpers.ts","./src/graph/parser/ast.ts","./src/graph/parser/lexer-state.ts","./src/graph/parser/lexer-scanners.ts","./src/graph/parser/lexer-heredoc.ts","./src/graph/parser/lexer.ts","./src/graph/parser/parser-state.ts","./src/graph/parser/parser-literals.ts","./src/graph/parser/parser-primary.ts","./src/graph/parser/parser-binary-exprs.ts","./src/graph/parser/parser-block-body.ts","./src/graph/parser/parser-statements.ts","./src/graph/parser/parser.ts","../../node_modules/.pnpm/@types+js-yaml@4.0.9/node_modules/@types/js-yaml/index.d.ts","../../node_modules/.pnpm/@types+js-yaml@4.0.9/node_modules/@types/js-yaml/index.d.mts","./src/graph/parser/format-parser.ts","./src/graph/parser/index.ts","./src/graph/mutable-graph/types.ts","./src/graph/mutable-graph/edges.ts","../constants/src/providers.ts","../constants/src/ice-types.ts","../constants/src/categories.ts","../constants/src/feature-flags.ts","../constants/src/ai.ts","../constants/src/derived.ts","../constants/src/grid.ts","../constants/src/connections.ts","../constants/src/node-traits.ts","../constants/src/block-classifiers.ts","../constants/src/templates.ts","../constants/src/integrations.ts","../constants/src/index.ts","./src/graph/classifier/category-classifier.ts","./src/graph/mutable-graph/nodes.ts","./src/graph/mutable-graph/stats-serialize.ts","./src/graph/mutable-graph/traversal.ts","./src/graph/mutable-graph.ts","./src/graph/validator/base-validator.ts","./src/graph/validator/validators/schema.ts","./src/graph/validator/validators/security.ts","./src/graph/algorithms/topo-cycle.ts","./src/graph/algorithms/paths.ts","./src/graph/algorithms/components.ts","./src/graph/algorithms/analysis.ts","./src/graph/algorithms.ts","./src/graph/validator/validators/structure.ts","./src/graph/validator/validators.ts","./src/graph/validator/index.ts","./src/graph/classifier/index.ts","./src/graph/inference/relationship-inferrer.ts","./src/graph/inference/index.ts","./src/graph/index.ts","./src/providers/provider-registry.ts","./src/providers/index.ts","./src/importers/terraform/types.ts","./src/importers/terraform/type-mapper.ts","./src/importers/terraform/sensitive.ts","./src/importers/terraform/resource-conversion.ts","./src/importers/terraform/graph-conversion.ts","./src/importers/terraform/state-importer.ts","./src/importers/terraform/index.ts","./src/importers/pulumi/types.ts","./src/importers/pulumi/type-mapper/parse.ts","./src/importers/pulumi/type-mapper/data.ts","./src/importers/pulumi/type-mapper/mapping.ts","./src/importers/pulumi/type-mapper.ts","./src/importers/pulumi/parsing.ts","./src/importers/pulumi/resource-conversion.ts","./src/importers/pulumi/graph-conversion.ts","./src/importers/pulumi/state-importer.ts","./src/importers/pulumi/index.ts","./src/importers/gcp/types.ts","./src/importers/gcp/relationships.ts","./src/importers/gcp/services/base-service.ts","./src/importers/gcp/services/compute.ts","./src/importers/gcp/services/storage.ts","./src/errors/import-errors/types.ts","./src/errors/import-errors/gcp.ts","./src/errors/import-errors/aws.ts","./src/errors/import-errors/azure.ts","./src/errors/import-errors.ts","./src/resources/high-level-resources/types.ts","./src/resources/high-level-resources/categories/compute.ts","./src/resources/high-level-resources/categories/database.ts","./src/resources/high-level-resources/categories/messaging.ts","./src/resources/high-level-resources/categories/monitoring.ts","./src/resources/high-level-resources/categories/networking.ts","./src/resources/high-level-resources/categories/security.ts","./src/resources/high-level-resources/categories/storage.ts","./src/resources/high-level-resources/helpers.ts","./src/resources/high-level-resources.ts","./src/importers/gcp/services/asset-inventory.ts","./src/importers/gcp/services/index.ts","./src/importers/gcp/type-mapper.ts","./src/importers/gcp/gcp-importer.ts","./src/importers/gcp/index.ts","./src/importers/aws/arn-helpers.ts","./src/importers/aws/sdk-init.ts","./src/importers/aws/types.ts","./src/importers/aws/discovery.ts","./src/importers/aws/graph-conversion.ts","./src/importers/aws/type-mapper.ts","./src/importers/aws/aws-importer.ts","./src/importers/aws/index.ts","./src/importers/azure/type-mapper.ts","./src/importers/azure/types.ts","./src/importers/azure/azure-importer.ts","./src/importers/azure/index.ts","./src/importers/index.ts","./src/plan/diff.ts","./src/plan/plan-engine.ts","./src/plan/index.ts","./src/apply/types.ts","./src/providers/mock-provider.ts","./src/apply/apply-engine.ts","./src/apply/index.ts","./src/diff/types.ts","./src/diff/diff.ts","./src/diff/index.ts","./src/deploy/providers/gcp/messages.ts","./src/deploy/messages.ts","./src/deploy/types.ts","./src/deploy/scheduler/types.ts","./src/deploy/scheduler/dag.ts","./src/deploy/scheduler/predicates.ts","./src/deploy/scheduler/dispatch.ts","./src/deploy/scheduler/progress-wrapper.ts","./src/deploy/scheduler.ts","./src/deploy/deploy-engine.ts","./src/deploy/providers/gcp/types.ts","./src/deploy/providers/gcp/handlers/api-gateway.ts","./src/deploy/providers/gcp/handlers/backend-bucket.ts","./src/deploy/providers/gcp/handlers/bigquery.ts","./src/deploy/providers/gcp/handlers/cloud-armor.ts","./src/deploy/providers/gcp/handlers/cloud-functions.ts","./src/deploy/providers/gcp/handlers/cloud-build-helper.ts","./src/deploy/providers/gcp/handlers/cloud-run/image-resolver.ts","./src/deploy/providers/gcp/handlers/cloud-run/result-helpers.ts","./src/deploy/providers/gcp/handlers/cloud-run/utils.ts","./src/deploy/providers/gcp/handlers/cloud-run/create-job.ts","./src/deploy/providers/gcp/handlers/cloud-run/iam.ts","./src/deploy/providers/gcp/handlers/cloud-run/create-service.ts","./src/deploy/providers/gcp/handlers/cloud-run.ts","./src/deploy/providers/gcp/handlers/cloud-scheduler.ts","./src/deploy/providers/gcp/handlers/cloud-sql.ts","./src/deploy/providers/gcp/handlers/cloud-storage/bucket-creator.ts","./src/deploy/providers/gcp/handlers/cloud-storage/bucket-updater.ts","./src/deploy/providers/gcp/handlers/cloud-storage/bucket-utils.ts","./src/deploy/providers/gcp/handlers/cloud-storage/public-access-granter.ts","./src/deploy/providers/gcp/handlers/cloud-storage/placeholder-uploader.ts","./src/deploy/providers/gcp/handlers/cloud-storage/result-helpers.ts","./src/deploy/providers/gcp/handlers/cloud-storage.ts","./src/deploy/providers/gcp/handlers/dataflow.ts","./src/deploy/providers/gcp/handlers/discovery-engine.ts","./src/deploy/providers/gcp/handlers/domain-mapping.ts","./src/deploy/providers/gcp/handlers/firebase-hosting/dns-extractor.ts","./src/deploy/providers/gcp/handlers/firebase-hosting/rest-client.ts","./src/deploy/providers/gcp/handlers/firebase-hosting/domain-registrar.ts","./src/deploy/providers/gcp/handlers/firebase-hosting/tar-parser.ts","./src/deploy/providers/gcp/handlers/firebase-hosting/github-downloader.ts","./src/deploy/providers/gcp/handlers/firebase-hosting/result-helpers.ts","./src/deploy/providers/gcp/handlers/firebase-hosting/site-provisioner.ts","./src/deploy/providers/gcp/handlers/firebase-hosting/site-utils.ts","./src/deploy/providers/gcp/handlers/firebase-hosting/version-publisher.ts","./src/deploy/providers/gcp/handlers/firebase-hosting.ts","./src/deploy/providers/gcp/handlers/firestore.ts","./src/deploy/providers/gcp/handlers/gke.ts","./src/deploy/providers/gcp/handlers/identity-platform.ts","./src/deploy/providers/gcp/handlers/load-balancer/result-helpers.ts","./src/deploy/providers/gcp/handlers/load-balancer/compute-ops.ts","./src/deploy/providers/gcp/handlers/load-balancer/backend-creator.ts","./src/deploy/providers/gcp/handlers/load-balancer/cert-fetcher.ts","./src/deploy/providers/gcp/handlers/load-balancer/url-builder.ts","./src/deploy/providers/gcp/handlers/load-balancer/lb-builder.ts","./src/deploy/providers/gcp/handlers/load-balancer.ts","./src/deploy/providers/gcp/handlers/logging.ts","./src/deploy/providers/gcp/handlers/managed-ssl-certificate.ts","./src/deploy/providers/gcp/handlers/memorystore.ts","./src/deploy/providers/gcp/handlers/pubsub.ts","./src/deploy/providers/gcp/handlers/secret-manager.ts","./src/deploy/providers/gcp/handlers/subnet.ts","./src/deploy/providers/gcp/handlers/vpc.ts","./src/deploy/providers/gcp/handlers/vertex-ai.ts","./src/deploy/providers/gcp/sdk-loader.ts","./src/deploy/providers/gcp/gcp-deployer.ts","./src/deploy/providers/gcp/auth.ts","./src/deploy/providers/gcp/index.ts","./src/deploy/providers/aws/sdk-loader.ts","./src/deploy/providers/aws/account.ts","./src/deploy/providers/aws/handlers/_result.ts","./src/deploy/providers/aws/types.ts","./src/deploy/providers/aws/handlers/api-gateway.ts","./src/deploy/providers/aws/handlers/bedrock.ts","./src/deploy/providers/aws/handlers/cloudfront.ts","./src/deploy/providers/aws/handlers/cloudwatch-logs.ts","./src/deploy/providers/aws/handlers/cognito.ts","./src/deploy/providers/aws/handlers/docdb.ts","./src/deploy/providers/aws/handlers/dynamodb.ts","./src/deploy/providers/aws/handlers/ec2.ts","./src/deploy/providers/aws/iam-roles.ts","./src/deploy/providers/aws/handlers/ecs.ts","./src/deploy/providers/aws/handlers/elasticache.ts","./src/deploy/providers/aws/handlers/elbv2.ts","./src/deploy/providers/aws/handlers/events-rule.ts","./src/deploy/providers/aws/handlers/lambda-builder.ts","./src/deploy/providers/aws/handlers/lambda.ts","./src/deploy/providers/aws/handlers/opensearch.ts","./src/deploy/providers/aws/handlers/rds.ts","./src/deploy/providers/aws/handlers/redshift.ts","./src/deploy/providers/aws/handlers/s3.ts","./src/deploy/providers/aws/handlers/sagemaker.ts","./src/deploy/providers/aws/handlers/secrets-manager.ts","./src/deploy/providers/aws/handlers/sns.ts","./src/deploy/providers/aws/handlers/sqs.ts","./src/deploy/providers/aws/aws-deployer.ts","./src/deploy/providers/aws/index.ts","./src/deploy/providers/aws-deployer.ts","./src/deploy/providers/azure-deployer.ts","./src/deploy/providers/index.ts","./src/deploy/block-deploy-classifiers.ts","./src/deploy/edge-classifier.ts","./src/deploy/extractors/ancillary.ts","./src/deploy/extractors/aws/ai.ts","./src/deploy/extractors/aws/ancillary.ts","./src/deploy/utils/name-utils.ts","./src/deploy/extractors/compute.ts","./src/deploy/extractors/aws/compute.ts","./src/deploy/extractors/aws/database.ts","./src/deploy/extractors/aws/network.ts","./src/deploy/extractors/database.ts","./src/deploy/extractors/network.ts","./src/deploy/extractors/dispatch.ts","./src/deploy/internal-ingress-overrides.ts","./src/deploy/passes/deploy-expansion.ts","./src/deploy/passes/pass-1-4-repo-wiring.ts","./src/deploy/passes/pass-1-45-domain-propagation.ts","./src/deploy/passes/pass-1-46-socket-port-targeting.ts","./src/deploy/self-serving-resources.ts","./src/deploy/passes/pass-1-5-endpoint-wiring.ts","./src/deploy/type-maps.ts","./src/deploy/utils/stable-name.ts","./src/deploy/card-translator.ts","./src/deploy/state-bridge.ts","./src/deploy/state-store-adapter.ts","./src/deploy/environment-config.ts","./src/deploy/index.ts","./src/compute/types.ts","./src/compute/propagation-rules.ts","./src/compute/compute-derived.ts","./src/compute/index.ts","./src/export/terraform/case-utils.ts","./src/export/terraform/types.ts","./src/export/terraform/hcl-formatter.ts","./src/export/terraform/type-mapping.ts","./src/export/terraform/value-transform.ts","./src/export/terraform/converter.ts","./src/export/terraform-exporter.ts","./src/export/pulumi/case-utils.ts","./src/export/pulumi/type-mapping.ts","./src/export/pulumi/types.ts","./src/export/pulumi/typescript-formatter.ts","./src/export/pulumi/value-transform.ts","./src/export/pulumi/yaml-formatter.ts","./src/export/pulumi/converter.ts","./src/export/pulumi-exporter.ts","./src/export/index.ts","./src/errors/index.ts","./src/resources/cloud-providers.ts","./src/resources/blueprint-factory.ts","./src/resources/cloud-blocks-types.ts","./src/resources/cloud-blocks-data/backend.ts","./src/resources/cloud-blocks-data/compute.ts","./src/resources/cloud-blocks-data/data.ts","./src/resources/cloud-blocks-data/frontend.ts","./src/resources/cloud-blocks-data/messaging.ts","./src/resources/cloud-blocks-data/networking.ts","./src/resources/cloud-blocks-data/observability.ts","./src/resources/cloud-blocks-data/security.ts","./src/resources/cloud-blocks-data/storage.ts","./src/resources/cloud-blocks-data.ts","./src/resources/cloud-blocks.ts","./src/validation/classifiers.ts","./src/validation/types.ts","./src/validation/architecture-rules.ts","./src/validation/connection-rules.ts","./src/validation/schema-bridge.ts","./src/validation/deploy-rules.ts","./src/validation/property-rules.ts","./src/validation/structure-rules.ts","./src/validation/canvas-validator.ts","./src/validation/template-validator.ts","./src/validation/index.ts","./src/index.ts","./src/__tests__/card-translator.test.d.ts","./src/__tests__/core.test.d.ts","./src/__tests__/pulumi-importer.test.d.ts","./src/__tests__/terraform-importer.test.d.ts","./src/cli/index.ts","./src/cli/messages.ts","./src/cli/bin/ice.ts","./src/cli/commands/apply.ts","./src/cli/commands/config.ts","./src/cli/commands/deploy.ts","./src/cli/commands/destroy.ts","./src/cli/commands/diff.ts","./src/cli/commands/graph.ts","./src/cli/commands/import.ts","./src/cli/commands/plan.ts","./src/cli/commands/providers.ts","./src/cli/commands/schema.ts","./src/cli/commands/state.ts","./src/cli/utils/config.ts","./src/cli/utils/index.ts","./src/cli/utils/output.ts","../../node_modules/.pnpm/@vitest+pretty-format@4.1.0/node_modules/@vitest/pretty-format/dist/index.d.ts","../../node_modules/.pnpm/@vitest+utils@4.1.0/node_modules/@vitest/utils/dist/display.d.ts","../../node_modules/.pnpm/@vitest+utils@4.1.0/node_modules/@vitest/utils/dist/types.d.ts","../../node_modules/.pnpm/@vitest+utils@4.1.0/node_modules/@vitest/utils/dist/helpers.d.ts","../../node_modules/.pnpm/@vitest+utils@4.1.0/node_modules/@vitest/utils/dist/timers.d.ts","../../node_modules/.pnpm/@vitest+utils@4.1.0/node_modules/@vitest/utils/dist/index.d.ts","../../node_modules/.pnpm/@vitest+utils@4.1.0/node_modules/@vitest/utils/dist/types.d-bcelap-c.d.ts","../../node_modules/.pnpm/@vitest+utils@4.1.0/node_modules/@vitest/utils/dist/diff.d.ts","../../node_modules/.pnpm/@vitest+runner@4.1.0/node_modules/@vitest/runner/dist/tasks.d-d2gkpdwq.d.ts","../../node_modules/.pnpm/@vitest+runner@4.1.0/node_modules/@vitest/runner/dist/index.d.ts","../../node_modules/.pnpm/vitest@4.1.0_@opentelemetry+api@1.9.0_@types+node@25.5.0_jsdom@29.1.1_vite@8.0.1_@types_e7fcc74193e0e73f2abf87bac0e3d214/node_modules/vitest/dist/chunks/traces.d.402v_yfi.d.ts","../../node_modules/.pnpm/vite@8.0.1_@types+node@25.5.0_esbuild@0.27.4_jiti@2.6.1_tsx@4.21.0_yaml@2.8.3/node_modules/vite/types/hmrpayload.d.ts","../../node_modules/.pnpm/vite@8.0.1_@types+node@25.5.0_esbuild@0.27.4_jiti@2.6.1_tsx@4.21.0_yaml@2.8.3/node_modules/vite/dist/node/chunks/modulerunnertransport.d.ts","../../node_modules/.pnpm/vite@8.0.1_@types+node@25.5.0_esbuild@0.27.4_jiti@2.6.1_tsx@4.21.0_yaml@2.8.3/node_modules/vite/types/customevent.d.ts","../../node_modules/.pnpm/vite@8.0.1_@types+node@25.5.0_esbuild@0.27.4_jiti@2.6.1_tsx@4.21.0_yaml@2.8.3/node_modules/vite/types/hot.d.ts","../../node_modules/.pnpm/vite@8.0.1_@types+node@25.5.0_esbuild@0.27.4_jiti@2.6.1_tsx@4.21.0_yaml@2.8.3/node_modules/vite/dist/node/module-runner.d.ts","../../node_modules/.pnpm/@vitest+snapshot@4.1.0/node_modules/@vitest/snapshot/dist/environment.d-dojxxzv9.d.ts","../../node_modules/.pnpm/@vitest+snapshot@4.1.0/node_modules/@vitest/snapshot/dist/rawsnapshot.d-u2kjuxdr.d.ts","../../node_modules/.pnpm/@vitest+snapshot@4.1.0/node_modules/@vitest/snapshot/dist/index.d.ts","../../node_modules/.pnpm/vitest@4.1.0_@opentelemetry+api@1.9.0_@types+node@25.5.0_jsdom@29.1.1_vite@8.0.1_@types_e7fcc74193e0e73f2abf87bac0e3d214/node_modules/vitest/dist/chunks/config.d.ejlve3es.d.ts","../../node_modules/.pnpm/vitest@4.1.0_@opentelemetry+api@1.9.0_@types+node@25.5.0_jsdom@29.1.1_vite@8.0.1_@types_e7fcc74193e0e73f2abf87bac0e3d214/node_modules/vitest/dist/chunks/environment.d.crsxczp1.d.ts","../../node_modules/.pnpm/vitest@4.1.0_@opentelemetry+api@1.9.0_@types+node@25.5.0_jsdom@29.1.1_vite@8.0.1_@types_e7fcc74193e0e73f2abf87bac0e3d214/node_modules/vitest/dist/chunks/rpc.d.bfmwpdph.d.ts","../../node_modules/.pnpm/vitest@4.1.0_@opentelemetry+api@1.9.0_@types+node@25.5.0_jsdom@29.1.1_vite@8.0.1_@types_e7fcc74193e0e73f2abf87bac0e3d214/node_modules/vitest/dist/chunks/worker.d.b84svry0.d.ts","../../node_modules/.pnpm/vitest@4.1.0_@opentelemetry+api@1.9.0_@types+node@25.5.0_jsdom@29.1.1_vite@8.0.1_@types_e7fcc74193e0e73f2abf87bac0e3d214/node_modules/vitest/dist/chunks/browser.d.x3sxoocv.d.ts","../../node_modules/.pnpm/@vitest+spy@4.1.0/node_modules/@vitest/spy/dist/index.d.ts","../../node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.d.ts","../../node_modules/.pnpm/@standard-schema+spec@1.1.0/node_modules/@standard-schema/spec/dist/index.d.ts","../../node_modules/.pnpm/@types+deep-eql@4.0.2/node_modules/@types/deep-eql/index.d.ts","../../node_modules/.pnpm/assertion-error@2.0.1/node_modules/assertion-error/index.d.ts","../../node_modules/.pnpm/@types+chai@5.2.3/node_modules/@types/chai/index.d.ts","../../node_modules/.pnpm/@vitest+expect@4.1.0/node_modules/@vitest/expect/dist/index.d.ts","../../node_modules/.pnpm/@vitest+runner@4.1.0/node_modules/@vitest/runner/dist/utils.d.ts","../../node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.d.ts","../../node_modules/.pnpm/vitest@4.1.0_@opentelemetry+api@1.9.0_@types+node@25.5.0_jsdom@29.1.1_vite@8.0.1_@types_e7fcc74193e0e73f2abf87bac0e3d214/node_modules/vitest/dist/chunks/benchmark.d.daahlpsq.d.ts","../../node_modules/.pnpm/vitest@4.1.0_@opentelemetry+api@1.9.0_@types+node@25.5.0_jsdom@29.1.1_vite@8.0.1_@types_e7fcc74193e0e73f2abf87bac0e3d214/node_modules/vitest/dist/chunks/global.d.x-ilcfae.d.ts","../../node_modules/.pnpm/@vitest+mocker@4.1.0_vite@8.0.1_@types+node@25.5.0_esbuild@0.27.4_jiti@2.6.1_tsx@4.21.0_yaml@2.8.3_/node_modules/@vitest/mocker/dist/types.d-bji5eawu.d.ts","../../node_modules/.pnpm/@vitest+mocker@4.1.0_vite@8.0.1_@types+node@25.5.0_esbuild@0.27.4_jiti@2.6.1_tsx@4.21.0_yaml@2.8.3_/node_modules/@vitest/mocker/dist/index.d-b41z0auw.d.ts","../../node_modules/.pnpm/@vitest+mocker@4.1.0_vite@8.0.1_@types+node@25.5.0_esbuild@0.27.4_jiti@2.6.1_tsx@4.21.0_yaml@2.8.3_/node_modules/@vitest/mocker/dist/index.d.ts","../../node_modules/.pnpm/vitest@4.1.0_@opentelemetry+api@1.9.0_@types+node@25.5.0_jsdom@29.1.1_vite@8.0.1_@types_e7fcc74193e0e73f2abf87bac0e3d214/node_modules/vitest/dist/chunks/suite.d.udjtyagw.d.ts","../../node_modules/.pnpm/vitest@4.1.0_@opentelemetry+api@1.9.0_@types+node@25.5.0_jsdom@29.1.1_vite@8.0.1_@types_e7fcc74193e0e73f2abf87bac0e3d214/node_modules/vitest/dist/chunks/evaluatedmodules.d.bxj5omdx.d.ts","../../node_modules/.pnpm/vitest@4.1.0_@opentelemetry+api@1.9.0_@types+node@25.5.0_jsdom@29.1.1_vite@8.0.1_@types_e7fcc74193e0e73f2abf87bac0e3d214/node_modules/vitest/dist/runners.d.ts","../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.d.ts","../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.d.ts","../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.d.ts","../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.d.ts","../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.d.ts","../../node_modules/.pnpm/vitest@4.1.0_@opentelemetry+api@1.9.0_@types+node@25.5.0_jsdom@29.1.1_vite@8.0.1_@types_e7fcc74193e0e73f2abf87bac0e3d214/node_modules/vitest/dist/index.d.ts","./src/deploy/providers/__tests__/_aws-test-harness.ts","./src/graph/algorithms/__tests__/fixtures.ts","./src/graph/mutable-graph/index.ts","./src/resources/scale-presets-types.ts","./src/resources/scale-presets-data/compute.ts","./src/resources/scale-presets-data/database.ts","./src/resources/scale-presets-data/messaging.ts","./src/resources/scale-presets-data/monitoring.ts","./src/resources/scale-presets-data/networking.ts","./src/resources/scale-presets-data/security.ts","./src/resources/scale-presets-data/storage.ts","./src/resources/scale-presets-data.ts","./src/resources/scale-presets.ts","./src/resources/index.ts","./src/schemas/index.ts","./src/schemas/db/graph-queries.ts","./src/schemas/db/schema-merger.ts","./src/schemas/db/sqlite-registry.ts","./src/schemas/embedded/schema-registry.ts"],"fileIdsList":[[135,184,201,202],[135,184,201,202,234],[135,184,201,202,591,592],[135,184,201,202,263],[135,181,182,184,201,202],[135,183,184,201,202],[184,201,202],[135,184,189,201,202,219],[135,184,185,190,195,201,202,204,216,227],[135,184,185,186,195,201,202,204],[130,131,132,135,184,201,202],[135,184,187,201,202,228],[135,184,188,189,196,201,202,205],[135,184,189,201,202,216,224],[135,184,190,192,195,201,202,204],[135,183,184,191,201,202],[135,184,192,193,201,202],[135,184,194,195,201,202],[135,183,184,195,201,202],[135,184,195,196,197,201,202,216,227],[135,184,195,196,197,201,202,211,216,219],[135,177,184,192,195,198,201,202,204,216,227],[135,184,195,196,198,199,201,202,204,216,224,227],[135,184,198,200,201,202,216,224,227],[133,134,135,136,137,138,139,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233],[135,184,195,201,202],[135,184,201,202,203,227],[135,184,192,195,201,202,204,216],[135,184,201,202,205],[135,184,201,202,206],[135,183,184,201,202,207],[135,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233],[135,184,201,202,209],[135,184,201,202,210],[135,184,195,201,202,211,212],[135,184,201,202,211,213,228,230],[135,184,196,201,202],[135,184,195,201,202,216,217,219],[135,184,201,202,218,219],[135,184,201,202,216,217],[135,184,201,202,219],[135,184,201,202,220],[135,181,184,201,202,216,221,227],[135,184,195,201,202,222,223],[135,184,201,202,222,223],[135,184,189,201,202,204,216,224],[135,184,201,202,225],[135,184,201,202,204,226],[135,184,198,201,202,210,227],[135,184,189,201,202,228],[135,184,201,202,216,229],[135,184,201,202,203,230],[135,184,201,202,231],[135,177,184,201,202],[135,177,184,195,197,201,202,207,216,219,227,229,230,232],[135,184,201,202,216,233],[135,184,201,202,565,571,573,588,589,590,593,598],[135,184,201,202,599],[135,184,201,202,599,600],[135,184,201,202,569,571,572],[135,184,201,202,569,571],[135,184,201,202,569],[135,184,201,202,564,569,580,581],[135,184,201,202,564,580],[135,184,201,202,564,570],[135,184,201,202,564],[135,184,201,202,566],[135,184,201,202,564,565,566,567,568],[135,184,201,202,605,606],[135,184,201,202,605,606,607,608],[135,184,201,202,605,607],[135,184,201,202,605],[135,149,153,184,201,202,227],[135,149,184,201,202,216,227],[135,144,184,201,202],[135,146,149,184,201,202,224,227],[135,184,201,202,204,224],[135,144,184,201,202,234],[135,146,149,184,201,202,204,227],[135,141,142,145,148,184,195,201,202,216,227],[135,149,156,184,201,202],[135,141,147,184,201,202],[135,149,170,171,184,201,202],[135,145,149,184,201,202,219,227,234],[135,170,184,201,202,234],[135,143,144,184,201,202,234],[135,149,184,201,202],[135,143,144,145,146,147,148,149,150,151,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,184,201,202],[135,149,164,184,201,202],[135,149,156,157,184,201,202],[135,147,149,157,158,184,201,202],[135,148,184,201,202],[135,141,144,149,184,201,202],[135,149,153,157,158,184,201,202],[135,153,184,201,202],[135,147,149,152,184,201,202,227],[135,141,146,149,156,184,201,202],[135,184,201,202,216],[135,144,149,170,184,201,202,232,234],[135,184,201,202,575],[135,184,201,202,575,576,577,578],[135,184,201,202,577],[135,184,201,202,573,595,596,598],[135,184,201,202,573,574,586,598],[135,184,201,202,564,571,573,582,598],[135,184,201,202,579],[135,184,201,202,564,573,582,585,594,597,598],[135,184,201,202,573,574,579,582,598],[135,184,201,202,573,595,596,597,598],[135,184,201,202,573,579,583,584,585,598],[135,184,201,202,564,569,571,573,574,579,582,583,584,585,586,587,588,594,595,596,597,598,601,602,603,604,609],[135,184,201,202,564,571,573,574,582,583,595,596,597,598,602],[85,108,109,113,115,116,135,184,201,202],[93,103,109,115,135,184,201,202],[115,135,184,201,202],[85,89,92,101,102,103,106,108,109,114,116,135,184,201,202],[84,135,184,201,202],[84,85,89,92,93,101,102,103,106,107,108,109,113,114,115,117,118,119,120,121,122,123,135,184,201,202],[88,101,106,135,184,201,202],[88,89,90,92,101,109,113,115,135,184,201,202],[102,103,109,135,184,201,202],[89,92,101,106,109,114,115,135,184,201,202],[88,89,90,92,101,102,108,113,114,115,135,184,201,202],[88,90,102,103,104,105,109,113,135,184,201,202],[88,109,113,135,184,201,202],[109,115,135,184,201,202],[88,89,90,91,100,103,106,109,113,135,184,201,202],[88,89,90,91,103,104,106,109,113,135,184,201,202],[84,86,87,89,93,103,106,107,109,116,135,184,201,202],[85,89,109,113,135,184,201,202],[113,135,184,201,202],[110,111,112,135,184,201,202],[86,108,109,115,117,135,184,201,202],[93,135,184,201,202],[93,102,106,108,135,184,201,202],[93,108,135,184,201,202],[89,90,92,101,103,104,108,109,135,184,201,202],[88,92,93,100,101,103,135,184,201,202],[88,89,90,93,100,101,103,106,135,184,201,202],[108,114,115,135,184,201,202],[89,135,184,201,202],[89,90,135,184,201,202],[87,88,90,94,95,96,97,98,99,101,104,106,135,184,201,202],[135,184,201,202,270],[135,184,201,202,269,271],[135,184,201,202,269,270,271,272,273,274,275,276,277,278,279,280],[58,59,60,135,184,201,202,286,360,362,363],[135,184,201,202,362,364],[58,59,60,135,184,201,202],[135,184,201,202,496,497],[135,184,201,202,496,497,498],[135,184,201,202,281,496],[58,135,184,201,202,281,286,340,470,474,481,482,483,484,485,486,488,489,490],[58,135,184,201,202,366,367,370,371,377],[58,135,184,201,202,281,469],[135,184,201,202,475],[135,184,201,202,474],[135,184,201,202,281],[135,184,201,202,471,472,473,475,476,477,478,479,480],[135,184,189,201,202,281],[135,184,201,202,370,371,377,378,433,435,468,491,492,493,494],[135,184,201,202,369],[135,184,201,202,286,340,474,491],[135,184,201,202,286,491],[135,184,201,202,286,469,491],[135,184,201,202,281,286,470,474,487,491],[135,184,201,202,610],[135,184,201,202,465],[135,184,201,202,437],[135,184,201,202,371,437,438,440,441,442,443,444,445,446,447,448,450,451,452,453,455,456,457,458,459,460,461,462,463],[135,184,201,202,371],[135,184,201,202,437,439,440],[135,184,201,202,371,437,440],[135,184,201,202,437,439,440,449],[135,184,185,196,201,202,205,206,437,440],[135,184,201,202,371,437,440,454],[135,184,201,202,437,438,440,449,464],[135,184,201,202,371,438],[135,184,201,202,370,433],[135,184,201,202,369,370,371,379,380,381,382,383,384,392,393,394,401,402,403,404,414,415,416,417,424,425,426,427,428,429,430,431,432,433],[135,184,201,202,369,371,379],[135,184,201,202,369,379],[135,184,201,202,369,379,386,387,388,389,390,391],[135,184,201,202,369,371,379,386,387,388],[135,184,201,202,369,371,379,386,387,388,390],[135,184,201,202,379],[135,184,201,202,369,379,385],[135,184,201,202,369,379,395,396,397,398,399,400],[135,184,201,202,379,397,398],[135,184,201,202,371,379],[135,184,201,202,379,405,406,407,409,410,411,412,413],[135,184,201,202,379,405,406],[135,184,201,202,233,379,408],[135,184,201,202,379,406],[135,184,189,201,202,233,379,406,408],[135,184,201,202,379,418,419,420,421,422,423],[135,184,201,202,379,418,419],[135,184,201,202,379,418],[135,184,201,202,369,379,418],[135,184,201,202,379,418,419,420,422],[135,184,201,202,379,434,435],[135,184,201,202,370,379],[135,184,201,202,436,466,467],[135,184,201,202,371,372,373,374,375,376],[58,135,184,201,202,366,372],[135,184,201,202,366,371,372,374],[135,184,201,202,372],[135,184,201,202,366,371],[58,135,184,201,202,366,371],[58,135,184,201,202,371],[58,135,184,201,202,242,492],[135,184,201,202,491],[135,184,189,201,202,474],[58,135,184,201,202,366],[135,184,201,202,366,367],[135,184,201,202,326,327,328,329],[135,184,201,202,326],[135,184,201,202,330],[135,184,201,202,506,514],[79,135,184,201,202,286,509,513],[58,64,79,135,184,201,202,286,507,508,509,510,511,512],[135,184,201,202,507],[135,184,201,202,507,508,509],[135,184,201,202,507,509],[135,184,201,202,509],[79,135,184,201,202,286,501,505],[58,64,79,135,184,201,202,286,500,501,502,503,504],[135,184,201,202,501],[135,184,201,202,290,291,292,293],[135,184,201,202,286],[58,135,184,201,202,286,290,292],[58,135,184,201,202,286],[135,184,201,202,282],[135,184,201,202,266,286,294,297,298,300],[135,184,201,202,299],[58,135,184,201,202],[58,135,184,201,202,267,268,283,284,285],[58,135,184,201,202,267],[135,184,201,202,267,268,283,284,285],[58,135,184,201,202,267,268,282],[58,135,184,201,202,267,268],[135,184,201,202,249,250],[135,184,201,202,244,249],[135,184,201,202,245,246,247,248],[135,184,201,202,244],[135,184,201,202,245,246],[135,184,201,202,245],[135,184,201,202,245,246,247],[135,184,201,202,244,251,264],[135,184,201,202,244,251,255,262,265],[135,184,201,202,252,253],[135,184,201,202,244,252],[135,184,201,202,244,255],[135,184,201,202,244,252,253,254],[135,184,201,202,251,256,257,258],[135,184,201,202,251,256,257,259],[135,184,201,202,244,251,256],[135,184,201,202,244,251,256,257,259],[135,184,201,202,244,262],[135,184,201,202,244,251,256,257,260,261],[135,184,201,202,287,296],[64,135,184,201,202,287,288,289,295],[64,135,184,201,202,286,287],[135,184,201,202,286,287],[135,184,201,202,286,287,294],[135,184,201,202,286,330,347,348,349,350,351],[135,184,201,202,346,347,348],[58,135,184,201,202,286,348],[135,184,201,202,348,351,352],[58,135,184,201,202,286,330,354,355],[135,184,201,202,354,355,356],[58,135,184,201,202,286,321,322,342,343],[135,184,201,202,321,322,342,343,344],[135,184,201,202,321],[135,184,196,201,202,321,323,330,340],[135,184,201,202,321,323],[135,184,201,202,323,324,325,341],[135,184,201,202,340],[135,184,201,202,310,320,345,353,357],[58,135,184,201,202,286,311,319],[135,184,201,202,311,315,319],[135,184,201,202,311,315],[135,184,201,202,311,315,316,319],[135,184,196,197,201,202,286,311,315,316,317,318],[135,184,201,202,312,314],[135,184,201,202,312,313],[135,184,201,202,311],[58,135,184,201,202,286,304,309],[135,184,201,202,304,305,309],[135,184,201,202,304,305,306,309],[135,184,201,202,304],[135,184,196,197,201,202,286,304,306,307,308],[63,128,135,184,201,202,243,301,303,340,358,361,363,365,368,495,499,515,516,517,518,530,541],[60,135,184,201,202],[135,184,201,202,359,360],[58,59,60,135,184,201,202,286,294,359],[135,184,201,202,302],[58,59,135,184,201,202],[59,61,62,135,184,201,202],[135,184,201,202,519,520,521,522,523,524,525,526,527,528],[135,184,201,202,519],[135,184,201,202,519,529],[135,184,201,202,331,339],[135,184,201,202,331],[135,184,201,202,281,331,332,333,334,335,336,337,338],[135,184,201,202,340,517,518,530,623],[135,184,201,202,614,615,616,617,618,619,620,621],[135,184,201,202,614],[135,184,201,202,614,622],[81,82,83,125,126,135,184,196,201,202,206],[135,184,196,201,202,206],[82,135,184,196,201,202,206],[124,135,184,196,201,202],[61,62,64,72,73,75,77,78,135,184,201,202],[64,73,135,184,201,202],[64,135,184,201,202],[61,62,64,73,74,135,184,201,202],[73,76,135,184,196,201,202,206],[64,70,71,79,80,127,135,184,201,202],[61,62,64,65,66,69,135,184,201,202],[61,62,135,184,201,202],[64,79,135,184,201,202],[64,65,135,184,201,202],[61,65,135,184,201,202],[64,65,67,68,135,184,201,202],[65,135,184,201,202],[129,135,184,201,202,242],[58,60,61,62,129,135,184,201,202,236,237,238,239,240,241],[60,61,62,129,135,184,201,202,236,237],[61,62,135,184,201,202,235,236],[58,59,60,61,62,129,135,184,201,202,235,236],[61,62,129,135,184,201,202,236,237],[129,135,184,201,202,235],[58,59,60,61,62,135,184,201,202],[61,135,184,201,202],[135,184,201,202,531,532],[135,184,201,202,532,533,534,536,537,538],[135,184,201,202,281,531,532,535],[135,184,201,202,532,533,534,535,536,537,538,539,540],[135,184,201,202,340,532,535],[135,184,201,202,281,340],[135,184,201,202,531,532,535]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},"9f422a1bcf9b6de329433e9846e2de072714d0feb659261d0915ed89b7227871","9f06cca3f1b2c3d560cdbec5c0a3bfafdf58dc2439d7065ddc5f23af72fdaa73","8c467364768b887a7c3f3af90e02fcd1cf443ce162bb498082bfbcc99beb2a88","905a105127753c3ce4f2d19d866c0d5565758691579204519bb9b8fd838b790b","62d8d9c7b326f1d1392cf56c82d9c6b042039875caa7b503b0a0b41d0c3123c8","44a47ae3fa050377c57d37fb051a6c6cbc08405bd0efda40861653de399a0818","7170f18d5cdfb2d301f0470233e281da189a3b0a8d9ea4358edcb21b4c9a5728","cbbede9be700512a66d94e48c4ef981a6d1a1678698ee36f7dbbb4ac747aeaf3","a92c3adb47ae83dffb2b67e18f045efb376efd1547941de56366340c06d61077","341494baae56b3810de282a6932c5c4edf0b44adf7aa00e1ced71a9258141315","c1e5340e6e2c73765454ef0056093661c0b4159518797e442c58d9e0dfbbe8cc","92b52627eb99e20e437d33fc58808896145bc40ae551a991844e7658395bdfce","21b14a29d87dcddf64f59d7865144dadf7c455696b7c509d973d46d73af2eedf","0685b918bf7e38ff946e8feb260e193f48626b7eed70669f1a4c5ecd0b3cd444","33943d74593fcd8670b682fbda86001d2e728b13fceb5d22961074f186619743","36cfb8ac02cece02f64db23c7ba4fb95ec2b56fa8d753250aff3f2b1663a9e34","64d61d96ca6dffcff65d3021718e83ed23bb14517aeb1f02e7c3ad993eb0a0bc","8ebea2af5e5b387063de6535a5ecb197f32b1ae6614df257432c087725161c6f","c0bd5e212ce61814fcdc9240b90868b1108c37f21da55d21cabddd3e180f195e","326a61d40b8bdb5b3c35f83e3cb0a78af05cfcd4539f9098c9fe46e32b5c6326","044f2620626e0bd1ce6161513ccc00cc107e502eb2d540c543ea7dcc54f18cba","bdaaa669518e13907293d935c2fe379936525a1226cbfe7b5ed1b407bac5234a","f6cd6b7cda0141a3f0d629aff6c529e3f55245d1c198c450737d7cea81b56d1a","b5981034fd2b7724d3b4f4acdba358dc34ddaa3ad509ef9399c630c86cb9ccc1","0cc85eed70c33b0d113321a7fe2a8493c530cdec9babef148241f7203f35cc4b","c442972d48882efb43e3e64e1b30a68effd736227742a3ff936162d0ef320a4c",{"version":"3dfcd0a3bfa70b53135db3cf2e4ddcb7eccc3e4418ce833ae24eecd06928328f","impliedFormat":1},{"version":"bea7cae6a8b2d41fd1a9d70475b54d741dd7ca2103904934858108eec0336a69","impliedFormat":1},{"version":"bc41a8e33caf4d193b0c49ec70d1e8db5ce3312eafe5447c6c1d5a2084fece12","impliedFormat":1},{"version":"7c33f11a56ba4e79efc4ddae85f8a4a888e216d2bf66c863f344d403437ffc74","impliedFormat":1},{"version":"cbef1abd1f8987dee5c9ed8c768a880fbfbff7f7053e063403090f48335c8e4e","impliedFormat":1},{"version":"9249603c91a859973e8f481b67f50d8d0b3fa43e37878f9dfc4c70313ad63065","impliedFormat":1},{"version":"0132f67b7f128d4a47324f48d0918ec73cf4220a5e9ea8bd92b115397911254f","impliedFormat":1},{"version":"06b37153d512000a91cad6fcbae75ca795ecec00469effaa8916101a00d5b9e2","impliedFormat":1},{"version":"8a641e3402f2988bf993007bd814faba348b813fc4058fce5b06de3e81ed511a","impliedFormat":1},{"version":"281744305ba2dcb2d80e2021fae211b1b07e5d85cfc8e36f4520325fcf698dbb","impliedFormat":1},{"version":"e1b042779d17b69719d34f31822ddba8aa6f5eb15f221b02105785f4447e7f5b","impliedFormat":1},{"version":"6858337936b90bd31f1674c43bedda2edbab2a488d04adc02512aef47c792fd0","impliedFormat":1},{"version":"15cb3deecc635efb26133990f521f7f1cc95665d5db8d87e5056beaea564b0ce","impliedFormat":1},{"version":"e27605c8932e75b14e742558a4c3101d9f4fdd32e7e9a056b2ca83f37f973945","impliedFormat":1},{"version":"f0443725119ecde74b0d75c82555b1f95ee1c3cd371558e5528a83d1de8109de","impliedFormat":1},{"version":"7794810c4b3f03d2faa81189504b953a73eb80e5662a90e9030ea9a9a359a66f","impliedFormat":1},{"version":"b074516a691a30279f0fe6dff33cd76359c1daacf4ae024659e44a68756de602","impliedFormat":1},{"version":"57cbeb55ec95326d068a2ce33403e1b795f2113487f07c1f53b1eaf9c21ff2ce","impliedFormat":1},{"version":"a00362ee43d422bcd8239110b8b5da39f1122651a1809be83a518b1298fa6af8","impliedFormat":1},{"version":"a820499a28a5fcdbf4baec05cc069362041d735520ab5a94c38cc44db7df614c","impliedFormat":1},{"version":"33a6d7b07c85ac0cef9a021b78b52e2d901d2ebfd5458db68f229ca482c1910c","impliedFormat":1},{"version":"8f648847b52020c1c0cdfcc40d7bcab72ea470201a631004fde4d85ccbc0c4c7","impliedFormat":1},{"version":"7821d3b702e0c672329c4d036c7037ecf2e5e758eceb5e740dde1355606dc9f2","impliedFormat":1},{"version":"213e4f26ee5853e8ba314ecad3a73cd06ab244a0809749bb777cbc1619aa07d8","impliedFormat":1},{"version":"1720be851bdb7cdbff68061522a71d9ddaa69db1fe90c6819a26953da05942f2","impliedFormat":1},{"version":"961fa18e1658f3f8e38c23e1a9bc3f4d7be75b056a94700291d5f82f57524ff0","impliedFormat":1},{"version":"079c02dc397960da2786db71d7c9e716475377bcedd81dede034f8a9f94c71b8","impliedFormat":1},{"version":"a7595cbb1b354b54dff14a6bb87d471e6d53b63de101a1b4d9d82d3d3f6eddec","impliedFormat":1},{"version":"1f49a85a97e01a26245fd74232b3b301ebe408fb4e969e72e537aa6ffbd3fe14","impliedFormat":1},{"version":"9c38563e4eabfffa597c4d6b9aa16e11e7f9a636f0dd80dd0a8bce1f6f0b2108","impliedFormat":1},{"version":"a971cba9f67e1c87014a2a544c24bc58bad1983970dfa66051b42ae441da1f46","impliedFormat":1},{"version":"df9b266bceb94167c2e8ae25db37d31a28de02ae89ff58e8174708afdec26738","impliedFormat":1},{"version":"9e5b8137b7ee679d31b35221503282561e764116d8b007c5419b6f9d60765683","impliedFormat":1},{"version":"3e7ae921a43416e155d7bbe5b4229b7686cfa6a20af0a3ae5a79dfe127355c21","impliedFormat":1},{"version":"c7200ae85e414d5ed1d3c9507ae38c097050161f57eb1a70bef021d796af87a7","impliedFormat":1},{"version":"4edb4ff36b17b2cf19014b2c901a6bdcdd0d8f732bcf3a11aa6fd0a111198e27","impliedFormat":1},{"version":"810f0d14ce416a343dcdd0d3074c38c094505e664c90636b113d048471c292e2","impliedFormat":1},{"version":"9c37dc73c97cd17686edc94cc534486509e479a1b8809ef783067b7dde5c6713","impliedFormat":1},{"version":"5fe2ef29b33889d3279d5bc92f8e554ffd32145a02f48d272d30fc1eea8b4c89","impliedFormat":1},{"version":"e39090ffe9c45c59082c3746e2aa2546dc53e3c5eeb4ad83f8210be7e2e58022","impliedFormat":1},{"version":"9f85a1810d42f75e1abb4fc94be585aae1fdac8ae752c76b912d95aef61bf5de","impliedFormat":1},"db9e4672c7c667a0deabd6276b696e5994d3730e5586b5b87267aa63d9f72328","6ba80b835f61ba3a1e68f225ae88fa6e3f7c5f65ca051bc1756b7c899d3e9274","4631550a659e584f008891ce1c715ce29d0cbc3dd1ffbfc76ad2b50eff702948","ab0970f1b7769b6a37dd837ce570dfeb1124740a38f15c9294b246eb1bc780c4","116f359450e3ce8b94d3a4e321826d56d77ac599b68f9c07b4a4d34b2e8bf3ed",{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"58647d85d0f722a1ce9de50955df60a7489f0593bf1a7015521efe901c06d770","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"83e63d6ccf8ec004a3bb6d58b9bb0104f60e002754b1e968024b320730cc5311","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"f27524f4bef4b6519c604bdb23bf4465bddcccbf3f003abb901acbd0d7404d99","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"6b039f55681caaf111d5eb84d292b9bee9e0131d0db1ad0871eef0964f533c73","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c8d3e5a18ba35629954e48c4cc8f11dc88224650067a172685c736b27a34a4dc","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2b55d426ff2b9087485e52ac4bc7cfafe1dc420fc76dad926cd46526567c501a","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"358765d5ea8afd285d4fd1532e78b88273f18cb3f87403a9b16fef61ac9fdcfe","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1},{"version":"c2a6a737189ced24ffe0634e9239b087e4c26378d0490f95141b9b9b042b746c","impliedFormat":1},"8ab9053eb153fdd8636f6b3f30208e0aaaefd7c23cd7c87be7ef913d36aaebe8","57430b85fd84c95c5b5f867dfbdbdffbd11ef2e48965eb9ecc7f4fb9d78be325","08eb64a1afdeda9c7cd87114906037388d7af9d91bce27c293f55dee9ce5a8c2","b5076e65f873347e41f18a2d239083a544c080b880fd62de907bd064465e1290","b9e4ff74d366947b2c7ff9158b5c878480c1523bffa20590914fa53c29144e07","63a9ab201a2da78d4d5c505c1c4c9fe380fffc7368f9d22fe7084b4e491977c4","903dd73508a4b3ae23daa597ca913eac9f75e3621539691b0a216047278e9efa","52741694e94b7b6b04c12285da7e10103e66b57126303a593a257fb5e086a491","b28b6136a5678e5b01ed6019b0b9ef8b22446f7d291f081bcddc71051d2a6492","583610054995599f0ed590a55b9f81466909e2087ee04b6c2461d6e0c8b08b43","c8449a6bc016461d1269ba1cd5aaeadd845e458bde39966f1fb434e5e99204ce","7ea0e0cdd8e14703d723a50b6c0d07f620d825f0e148d6c9aa97af9950fcb44c","2fd75662e4cd0cd568d6c0857e7a71648addda2a1c6d01918fae951dce5b519a","a2ef968f2f25e45f7a634cba822bc2e7542678615fe0161826a8b2e82e071acb","88b62f5279f98c2c529bc562a99dcd1c1cf96c5f3698b04936ec7cd95722ddda","59b46ed04998fc50de4f3a8896fa90c08e79530e15da952bf1aade4498f63694","c4d2a21697551d6e34d05cc2d20920bf142723d8f9f9ff4396b1b7d700e0795e","98a3ed3fac7a473fa6fc4beca3de620139d52f9863497e943f053c124eae15a8","cafaee243ca4ca03a097af441baadf576180f1f6b0c0a71bd2cf27c92dc3c635","d5132708f5591db907f3adda24e0a67970e99d588082cf0cc673359c4140c1d4","5ac4bd7d11ce705620a56ed6903e3f0c2a432f616bfbd96d408d5e77d40773a5","54ae1f916462a6ec28561bf5c31fa31411c2b95421419952f82fb29efe33714e","5a226d5a51ad9fabfe0849f5d5c81b9460ccdd9184796f1467cb992bbc5ce012","5ddfa20a02c6207915c3c9d2fbdb57c70f549307638c4608a63c4049c591dc6a","c35b355506a0ec45a8488207a4df84cde8d696832d6157f61b6f851863ee1b66","edb83dc67f334db478790a845e10b191ab51d035160a88e5fd3876664dec1612","df984b0bafb5e53912367951ffc923a81ca6e15e6164b634055880e4344cac36",{"version":"7a1dd1e9c8bf5e23129495b10718b280340c7500570e0cfe5cffcdee51e13e48","impliedFormat":1},{"version":"95bf7c19205d7a4c92f1699dae58e217bb18f324276dfe06b1c2e312c7c75cf2","impliedFormat":99},"b045297393a1167259e546c9c8f790f11d1bb9e56faee2a96ebf9dce560f198d","9ca31fd2cb6a4a2a79f0b9655deaec5de960871406084ddc7834e5f0caf6825d","25fdd9095e3c88304fcacabc177f915c88f911ec76eec1bef97b0a5296b69b42","1b6a4d8614e087ac52dbff37fc366bdb9d9f6ded3aed6b9fc6a42c9a07c7df6e","76cc26cd0f1fc54af550f8841264bfffae32d47ceb78f0234554492a2009fa6f","649415d05765a968aad9b1906b023aa680e332b6fe32bf31d4e96ae972797107","3803a665d8434387ab3b02307f2724bf49e2c74295f930e7fe4ba58bca51a078","cc395f85c2a42db8cbc0e1749695af300abad568b8ff801b4ff1929071c2ffcd","e6f912a58bbeba4d07663b3655e1ef880f01e7a194a86e351d4a9b96785b9dc4","b93c566bb2c61594e867c53306a6d56b086e7658013d2b9d233e89fab5acbb35","7a0aed8f3aa05ec618437c5c7fbbfd2295321316c197a171bc12de0fbb2bb922","791e111b25123db45cda32073ba13222b5a34a947b0156eda9e77187f2ef91ca","fb0547afd53f48e07ad555fd6efd0de07fecf26615cc93a4607c0220211bb114","998feccbffe65bfb424ba1acc11357db6e7fd611eb99ebd237d860eda1e97138","7be4ecdc1589196748775376a609a917fd731034f8a1fafa7b5ebc9cf5e5bd53","62bbb0c5c7b0e2a53d11f4cadb782609af4e12e79170fd58163110088393b05a","0ca8883957ce65b76ec86ef9d3aac955dc3c4c46530cb729b88a6d2d737af186","542267bec9796016127a97865a0f97ea180cb8fc3f89606fb8c9cc4253126acf","28b5fc5754f4ebdf042cb5b27931e63b4ed8f5b64df7bf3be4b77d974640396c","89e0e9ac65c95aea0a539bd60ace8484b3a5c3cc4d897a68812217af830fc23d","0988e2afa78428c0d1cd50268b54dbcf421f80c992d8a1a6055f4133730ec6a9","f2905ff1575a84c410192ec46aa3f4996765c1e849ba421a259e05c7b2fc340d","aa34083e206a5f93e16d7c8ad6974bf445da6be4b5a7722d2ee98789faf7f8ae","ffe50ea4d20591a5940538606dd44f33a5dc343b6cc9d043377bb2c5f72dca13","38e01627ea43a1196ab44549409015e5c6f5b301fd332346a2e0fe38fddc6472","c3de1901e84728e2075eb45ca5df0d75ecd0e35e919e826fa8339404ed5536fb","676403375489df3da1edc59ed83d950fb937530b99d1691e495e7e84920510c1","8f8327bf5762a69f257f2eb84e3cf865c83a5a9c134adf38be12ce69bae4eb7b","11833b3c60fc9ab463a626d92764f42597c64fc93119ebadbbf9790756db7d5a","126096fa7c786d9d03b90f9e81f2145a2237e4781504957d3aa2ee4382f5b39f","1d095cf9256ec12ecd33cf34815253020c89230be4212f1fbbd9b5dc345bf2a0","ec7fc48032dd77a91fba9a4b98a4ab79135026a5364eef928ca03ce4c6936c7a","d2b46d9c36e9927cc6b59679dbc45a92ed19909fcc25412772af6bf7cdcc5a4b","1500929393a66eac684b644318dec8d947f7cece77bceac84395a96cd0e819db","cc998ddaa317600c0c56e53e6e76cfd3b3e23a0783fbf371f294201fd3b15e39","0fa7d91ac72697950720581ea9265cc0d7aaf5e559ae21bee6cb6ec3f7e4f3c4","6aa749045a7e565ab60023cd6cdaa21f9f0c0eb724ab4cc82f8b567182679813","42661bdd3babb7325e5c1050855251dc1ebdf4b14e69ef732bb948cd3fadb831","d202cab2cfd4555a3f2cc559ed805fe0e9d8890dd79e34646d142c0c24b95141","ea2f9f2010acbf2c1e02e79513fcbc6715fc69483b0b270e26b7b16592790111","36d25724c00295ceadde4a1f69ea32c94d749823dd5ede6258b928ed699f1768","2efef5f483459d0177a69b02baef9b931fd045a852f27a4f295f6ed958eb57f2","222ab086b785ed8c221acbd2922699f3411227a510d23788e52c303515b01d28","09b127a60bb3bd8625f2e0910af7c7e86afacc05fcdfe7ea0d9f73c381d7c8aa","fd0cecf30f9f963f1b0148733981087da93014fb0f69a9e065dab17fe67643ae","d9bac95e5cc44d0ea516e83cddda764f54dc5dd698cee1c64356ec968ebf57c0","2ec1e34570bc9b528ed078112f31576dc9ba1c973dc83a8c61c80b7bc425d4bf","b4ca0b2ae78101bdc252134c8519eacb2ceb931c9c38176706ac467b4eff7f55","b6c3f5b183e5428d20d6f6e3290a1e8efdbdc5cd8ec31184bb3a018b17c3d7cc","37cb6bb48aba80a010297eb815aecc07c0ea334509944c66305018a8fdaa2c65","be7b800e572c75d9eb786fa7448c9e108dab1cece51f55f73b4144e91b8906e4","0cb6b0a4e69bd922c9fae22e5d4cdb24b148ec0d29766c200738fdf5255a40d1","c34561f348d2cad7395bc203ab64e2edac6184a5f0184ecf19e22a71724e4fb9","9bb87d1dcfb06b265c96c8bff31a95d7003128fdd24750dc6ffc7ba2e4cd357f","00a6ccbc8dcd86c5d895ad39c2dbf030f2b6064c421bb49a021fae08f266e16a","5971247075b05ed88679485c1d056aec4cae062eb6951b995788c69a654a1c3c","f731d9570dc4e6c8a828c6b9f0228877820afaac8d2fdc00f4e8aff8d85c0311","dbcfc7d4a685b33c38be3dc2611615e692604bfdea5625f14d9f1156ad6722cb","83a184bbff2dd763f8e8051aed20b7b620d55778918945b23ef7241e6792abf7","fb73e07df3a40fbb9daf4ec269ac01946ce2a35cae550dc79e34d7ea8bdcecee","be6fe6c54c0b3a07b8667b02fc6981b5b40758ede42caccb7fa81646ba567d24","031f18d0b2394a9704c2f96564fd098bc5d9b8770a0467623cccb2d74f9f6d6a","670b9a2aafef1ec78813620c5a738bb1df2235a8c2def1702b8d58332b52c177","6e07a05d78279eb87db944470d6b16bf3c5ffc8a43b7a17bbaa9d80d34c638f1","9c2eb90da480fa93d78e04cc441c282a07a2c7428bdade5cd35ee20de7cd888a","3d3f74d81aa3ee49f3218c9f7ad9a9202891581cdc4cf3dde9b92ddde4e781d2","e9dea9b7f3586beb174d10099b644685798d15fb3d6dd5e57e7c4f2bb5068188","0d9237c67866eadb203d211bd7eaa1b3aba550a0c8a6bc1260d344c2c4a4ae7a","c60b24102572f64fb0023f5413404293c35c73b9734bd71da9d571b08111a81a","f479af6869f5f6e70b8d8e19f59995c6ae59e23bb56670c96ce30485ac98a1d9","f0bc31f07565c26ec58b2d3a26453b9019a83109cdb2254601b3e1cdd6fedd43","dd94387420ae72f77718a1eb8373de4687dcd6267f92411de88bdd3da5de2312","c66384b76689bf7ab5bb36915013d4836b7eff025a220b807bcdc106b1d4adf5","7f95716c1c1e73c9c27e91618a727846a86b6f69b8b9f16f84faf5f2a7fe7580","c24cb3c039b97ba6f6ae397234350e7f6f52e4088bc6d6b03de6d08907d5e3eb","01384cb437c106f902313bf25b0e8e65ac7b9ce0811bee3bfe7dfd073cd9b383","3c0a996c5eccc7c17f68c1ebb45c299ca6d7dbb9daf58c8fff3392409c31a9ea","ea2635643910097eba211a15f93faffd343817feb00af8efefd97c81b48e2fed","ca06a25e3a9bf82bfdb6f9f61d6d67f6c90960b6e20df43abea3c9eab515bbea","d1b1da0800ae66d723c43f2a07965d216addd736382b674a363d086b755f5efb","0d597693230d3eca85524fa33430fe1aed403b459510b0abe00a4ead3aeb4025","5d2667f3261713c3ed1dc5fdf5532bd49fdd74f399fb7e5d21901e29c7f6f1dd","d050988d2be49157325e97f3319532684b8ede2b83b87abcd8832b651b29b471","5a8fd21287dc8e39f13cbcb1ec3908f0f36428b4d575c02ef76c709d4cd07e3b","4e02c2619e7a81dfd2b13b89917c7320d5ebd87d46f79ea113d088a0f122f7f8","9f2de64058d15197c6e93170f8a8e2a10a3ae0f181d17c4b3a482bd3500d077c","ef8865f11a87d159281b1bfb08427a05413fb012a60e624d33589ba16957c607","5dcc475ba4e86db8610afe2ebce0f05da3d98be85ff9a0fd5e4bee1e293caaf2","f3afd6cb637b62f3184da2fed4948253e7476e9d6ec8e590359056d1ddf23b77","3f80582eca2101e3627134b99632333a665bc2837d1c4f7d07d0b3bdaba0aa0f","001dec038b0f816e352d106eb1d2b436d74462a9ae0f09487a533d08ebfa56b2","e645dc71a241c5fb97402bb0bafd2be8031abbdc9ea0726b44bf79f104022a61","4dd4f634c626a6f4365a71159448fe3ff154636f3413ef5a876ac0ac40fd751a","6b2078cf551ddb6ba3c5a47a50b78f3c3202d4bfffc06f2d63c46b1275969a40","ba881b8d5b6e3df354cc26faf2ebe93d6c3c1dde02534542c716970ae9862549","181dab8c3c89994ffd0f00c80a4af48d62aa9fa40c07316e8c3cd1825a62eccf","6d6336b1b4df7f1f65d3f84c9c020c205865ae237e19633d1fafd6aadad9a067","c12c64d0d3ac1be4fa925ba87f3de675601fb413ae25cc50396b192a9e176425","5402794b0084c917353387d102cfcc303842e39852c263451c1a77863cf28a9e","287d0baf43e643c7c740b9e8770f9300b2bbf98b8a518e76e8e217ec8aaead64","91298e6a51bb1962d39eceb6371aada140acfa24417011da38a2c50d2f0da168","4bde15551a94df07a4010f995704efb12ffdc4bd752851a7f95f591092bab4f3","9dfe82c07da9a54e56a248ba387ce383fc6a7743af92b17fed1527b0d5b6ebbd","290d8f4ffa2ed9c837bf5d1ff05c7637ff021d486fcae6d898aaf2df69dda769","231b7e837fc604212aa02a5b148f585ad0b2ba995032e37eea7dddbb3a46088b","4115ce5ac014390c8cff8d3c51b52fa13f6294fb13d1803d6c40fe6cfdd6901c","b2419ec464344d9a111778d1d616889685934ba3d0915801a156f20295da39ef","c2d0ba4e3ef6f4510841f61190862a4376c6515a4af1e44290d94e876f699251","632532295af106d8dd11653a780e944492849c55bc026c0425fe067c30e44bc7","d9a8dd605a9db2828cb9c2117053bd44bb318092e4bc8ac12297ecae52e48408","a40659fe11d83da3b659ad4287b7c1b141378fce8962e95592cf4ee53258f190","0e23ec9cf75425a296be7ee9bb1f85e499078bc492dae72e2fdc5d5fca98fb7d","4bdf7deeb5d15eda7a4a4246622cc7321e2d4d605c3dcd9a516625815e772e22","6bf062bf83fe661c697b7122c883b56f982b85438ade4e43731c2efa36a48032","fdc556b6075fae393c48cc18dc34519af2d448664447be8b7ca2126b02affb19","4678397e8b0ed1445aa088771c9d8572e7bf45cffc52c14b039f86b66fc20252","fe49dc0bf1a296cb927061f74f7fc6d74d2e418b9362c4640881b4e42a503031","d301b86d1d7050c88fcb6ca92ff9b138cfb0a0ca8a04b3a1b61ebfd911cb1a6f","fae2bc89da0a93f9a0266d21ac2c33bf03f2674c5ed33ff980e887f397c8e06d","02d6d2563d3b1928e87f184b0c8cf3bb35398e2c3aa7b6a29ffc24ddf282b6c5","43cb773c20a53ad1001df0133aeaf26b52855445031c295b9a37154ae35343af","0e481a28d565f1a503dbada5d810dde3113157cf6563016b213cffec90a79993","10719c6dd6b07a17cb9be468bafce43a61e5afaeaa4f571c5b49866ac337a8b6","fe0a9db55849377425bef5a6f180779d0c7370cd9f4a41b520880c5ee1cb11fb","c5c99d680e713636b83e2e037b5a292adf0b2dcac011b1b188552e5907f6d7a5","0e606c69a1200fccb0e927c090393936f2ac1c11920b0e55753f0c4fc45fb778","6b4c5c71b0aa3cac94c8b3b819f68a30d0248709e6bce38465bd8bfd7d7cf395","5f314bd27e54d77f98289eb1e174636987e346c78b9631a2a1bc14f5d8595725","fa1124d16b3dff467594eb52257875ba98e68e40f39e10dba0611c7cf8d657f1","4f6ab5fa695e1f3d02881def8d878313b2f103220b91e48db7ac3bc21239313b","0b2d2659a5ea7be13b0b7fe40f2c4019e3be87c4dd921a8025ee382320a7b63e","f354dde829d0ca02f714015e8ab8535b7e57d46d492c3e4e3e6aa2b3bc47eedd","9c24c78a38da64fd818c7488f69b9d3e3290ecca8d2d2e01389fffd60fbdcb11","508d52244a0011a2812d56877281530ea463ba6cdcaaabacee8d11116796be74","b47ee19e60f569336d7b5fb2933e702b83d57ed60a253edd66cb1227432a5004","9fcd9e148321b51599f5e159452bac3942fe8e5152e379d40eca23209c0a0fda","ee485f14ae7dfc8c0f38490472d1f546e61c030fe440c0ad68d0adc75b09e4db","62f0646b465914396e6910bc62de871a623d2277db1da460209380168be11788","d6ea9568e4855c97e8126e299a4df99ab0cc53ae477b032a27045172e54d41a5","39c340dec9bcc6bcc6f291a47dc6bbb6d298a114ad9f32b9829733b3e0830e38","c1c5a4d1a72757a92a31329e8f86753bb5ff0c4d0196b8466e168a171e5f4fda","3d7bdaf3ed469369002a47e51fc3c03af0ca6e657da5297480e20e4ecd6b5ece","cf0a557968c3c332ded37b6a899c82d605412fdff51756d1bf99c9251006ecde","f1f4867152604ba908a356c724970b6fa7c372d2f5f47ea04d37af4c043646b1","2e25a1451ed168766182a729e70cf978f6666827bd7fbebdfb0a12600be3557b","97b1f9f98dad479221ad2169fa7f94c6c4b049ed3b5bb2f88c9e2296973efb2a","d6852d894450cf567f3aa71d0052f1de7ec00992f4d00159b0d9130f9ac156ab","928b3deb2de8a4e91cd4473631de7d098f7cefba8279b527db2fbe9b440919be","91ff3d9748b6abfd395824f0fee820c5638871b86e6400c21d0c1dbe162b836f","1ee5b9e592624caba1ba0fcf518851c824f448376408819372bf950dce560322","225d85ad926f680f65b70a76869691ca99e633e3e4240810eaaa62dc45b5e092","1d217f400428c50966aa0342db49abc2e57c37143be7fb243e4d610d7680b717","02cd73f7d88b1a50873ac66115bec20abe49433c35f0cad5dd09fe6f2f5940f8","04134f50f9c61432f199b9419775578a04691eb5dcff09492e5af4f409793ce1","29136ee2c5932f09c7eaee1608d3ef92f1535d6fbfd8857e5b5cdbf91a85bf6c","1711236bdd3baa5e1bba2640cec90d8ce98eb9ef752b1cf24ab70209aed78b4c","106cad458688e9688f525b07808597fafbf7e2dbf27986a1bb7fa04772893965","38888437f31ec5e2d39aef9c46f5092d5722bf43f472436ad1b1af08d0ffdc57","284363ad97f3206b55bdd30c19b6727051203e030bd3d4008374d135f789b11a","87f0e1655eed475c75e8f8565b2c111b222eff3a0be57122e5dd7f54349cd26d","90d293744f66eb2cd999f5a414d75c0f6eb572505814c1186f29563a03554550","516a0644a6400b8ad2699d64219cd623ac085cd72a6256caa17f6ebe0da01c7a","5da3a91b2b5294885b3dec780c177bfde9132af5980be86b54a3e7734e3c26af","91ca499e3074bf63918558870f50849bf4a60be52d5a07c5f7b4e1c81361ece6",{"version":"2a078a3d4ff94609475f554e331ea7979b9f340f73ae327a0e28609aa455a671","signature":"12342600947933152b059cb567e68f067df23df03834804a6f8b2e0163db451f"},"f97aa7fd4854ae4781f63fd5d481f76cb728a8501f254748b195054547cffce6","4808bce828d7d7195dc01061460b99aea69a268113007177eb07d09fbcb9f285","7dfece00e91dedb5e6f262fe95608e17d93b0e3bcc88d3221de3bdf82c22a4a9","184e1728672781b439d0053f03e41aa2474569efa05bb2429e4ae000a9aed934","b6b55f2ed87d0e7a97b6a552c4becfd465f99598fe6e0a531b36beb2b98c4258","bbb46b0fbcdc576355c8044c59fc6041147db11505e5c4335bf3e97a5289efb5","a3d89d72d4526e41ccb86f770a5f55edf937a5f667b0befde576c1d4bdb0c9b2",{"version":"8cd5c8f46fc7915ce58a13621837e4101fbe9fc948ce01549b36f4852b70cf58","signature":"106b3f8678b78fce3a921b4b10b77490f25b8f54faad30c4696136697741d759"},{"version":"d73abe26d86d76b9291215d6e55011c8fb57b931ddddc807033fbbfc96529d0e","signature":"a1d6316feb75f247c21e648ab2ed07ef58c54a6fb2071823fca13e8a344a1ebc"},{"version":"2b096428749378118129ebc7a85424f79dc2b8bc958968dc024a65049e313009","signature":"196783e4317f27aa9a8fbaf75d12fd0a68557ed455301114d24e820aa081b064"},{"version":"33eb7d195211e397eda255795af34acfb955079c69faa09bff2703e253e7fb42","signature":"45bef13917c6670ebb0d0a0925ee7c155c549e22db117bd4b98f0dc1411c089e"},{"version":"a991ed0662c2fdf75cbcc03dde481fe711e94f05c20b08dfa460abd7ae375041","signature":"6cf6827828a5f7925d59312ee0fdbbe7b610dc07ff45d4614c6e1aefd3b21eb9"},{"version":"527ddf406dc12fb329bfe5ee50afeb4143094f1f67cbccddc5c6b236e2842205","signature":"39538c0611f7e5171b0f1f05f63f52f204bd20350a450b2a403282bcd891be22"},{"version":"e560c6f84daef82b9b6ff6f0b60221a49b26dd6904132848a55322a6e297a79f","signature":"4937e3a48705847042e97d5e2a35fc1d311b9f969eeebb138ec7dc5e7161986a"},{"version":"64fd9d10ab6441c5ab6d6e66aeb7b60aa8fa99e81e5f2499046dcbc979dd5a91","signature":"333265ebe414dc5827b0cac654bbc9a17a33a6daefac366df1aeb3308205fa36"},{"version":"e0e1d0d69bb366ffdee63473cc9f813dca0a5aaa66f4c13bfa73f92d7e78aa98","signature":"6f184ea8e4fbbdae888aa665da17e449e9b316b4addbee12b13fea75ca5935d7"},{"version":"11235f5d63ebe09a849f09bec0504b247057c26fb72a96939d0b84a3cda9b7e6","signature":"1777c629dc50335faf229a42a6b979b057cf9bcc1a15bf031b8839ca50930560"},{"version":"e1d2be54ff56dd0cbc96b9b43b04579944cdd2547f193e9ff55fe2e5fb8ca620","signature":"a5e8701ea9836bc26137ffd002658c9ea77074e5c9f68c26a6816200033c2472"},{"version":"042ffd4c05b68e236f5226eb57f587c39ed8dfce8fd108365fbadfdf07f89879","signature":"060722df62d4aae0f273cefb7357538dd42ced41abbc0617e4809202d1294090"},{"version":"e9ceaeffbab576dd1c624f75214e896c5d2b8905fe08c605af2bb1512462253e","signature":"ceec29d2b665eda0b8a2c09f3e8561b52a31f89e337be12d68a2dbcf44e7d63f"},{"version":"1d83022a1a09d133f30366342ca157834027c022d22825d192b05dc3ba72205d","signature":"ffb3057a72b3671dae0bf6fb216ac26727ecdb7d96ca6c8a8c204b61daaa174d"},{"version":"5ec565237f90f6ffdd87af68f25f3ca86e8674ae1b9aaa117362ab5ccd181b4c","signature":"e43c20b05f1a036867b1350190fdd0e1aa353a7d283af17109340ae323c6b1e4"},{"version":"9865c353f1dbb31026fb9c2a974926188b6a04cac529bd5ba115de094c8b8069","signature":"01ab14c2f02d1f2c37daf40ff3d276687dd5b8168b148cd41001977831de8ef4"},{"version":"72c7cbbd490ab5f383e635eecda98a62844cccf630348e1b720cce61f2d1d102","signature":"17f63890415e853bf59bdc3a148f0db5681e41c62661b7e0d2fb02474f3aa7a5"},{"version":"3cf1e8ef6a548f5a99da18b1a42d2748f34312f649060f81abb8ccee97f43bc1","signature":"4de980b028050932f168d5a5249e1b30bebf820dae4bb86312b1979ef4e86092"},{"version":"d087812fbad5bfcfb8475d947924b1f5329c04caca8f69890eb9263af7590c6d","signature":"7b339f209feae139c4efa581b90dedbd1a04d9cbcb385b7a0435ee10f7b6c609"},{"version":"c57294050388bcb6b61beb23ae6fe202e60efe8eefc32910bcabd8f579134146","signature":"f69b245b4ae7fc7b73308440f9f4f0f5c22e827ae21e0ec7d959e35b0c6a000f"},{"version":"15b8f0d1fbe927d19bc38a678308022fdfaf39d5bcea3c555cbecd1b2c0c7f47","signature":"a0f157f6ec209e1baafb123233f40a4eb18dd702766a0f4792e6ab44c409a1bf"},{"version":"4eb5784ab2b376ea97fdfc4c25cb16a4c7cf61c8d9e962a63661a3aa75ab396d","signature":"0909d57619ed061f78838866b346b08315f14af7a370c2f76bac160274f49882"},{"version":"59138c34c47d26972210b261a0c875a72ffa626ea037e22ec6520bdaa1be7477","signature":"f27ea12fb23392518764e75a358f799bfe90407bbff1449854634cab3dcde2c1"},{"version":"917b63fda998cfb36511cc218d33f5dab5ab7d45b9560b09d42b8e9f791f3c1e","signature":"bbb5c6397a256407b2e3238ca5b4f340b61da8df317b132464b0aca216834b96"},{"version":"cd82ca985cd336a0b3fb7f11c7638c10115ef8d075c284ba5396270ec9db5aca","signature":"ff0dd6ae109e2ed64128cde417e91dd1e44b3b9a5b1021bbf555a86e8bd7fe0e"},{"version":"5834a7e9d1e23542abc0e5c3635051cff315f98f5178f1518b5aab65ba65d602","signature":"c88096f6a70b828ed96808c40830feb934d77901d5dbd6b777d4e04bd0af03cc"},{"version":"c35e5a75228d0fbee3f2d1d59bd8b74c62bc8752c54d3018b6b475b24967e380","signature":"87b7066a0a2463cd0fec6a6609f558e5c84bcc7842a1f464a86eb3e67afcd763"},{"version":"b27acac9d5dfac6e1e1e8afbbb453ea1fde5c073ab4cd5f9c2e9785e9d192fa9","signature":"64e7a53d631709d0a5fc4d4d065a512de8371f86ad20c822c11e8c4fc88828aa"},{"version":"a713743e21042a5d96c0d9b42e265f7686fe478aff836b7fedaed5908540c7a1","signature":"8f16a1e5b9c89392599d6faede167d0d4abb25515e1e56b79fad2e57a8e03fa8"},{"version":"c86c0661f5ec2d684ae73aea3d94c6abdd1edef9cc2ca9e3c656e5fa3f5713e4","signature":"0a1900a2d38369652c46d9dfed9167f8f6b06136338886a985d12389d4a69c94"},"7c1ebde823b390f4e738aa1384e6106f0246ce1d73b1d6d20d4e9c67623c26d0","18e839a0576d60b32ba7865379783c9cc434bde58eaeb267aa5be1f6f1472529",{"version":"9bdabd0c7274d9cd8009a717087ec17431228901cd1b475955cf053adf837813","signature":"d56a9c1ad9bfaa5b9aded4ebeed606295470271fcb9a137d7205f69bb62d1241"},"b0a66b71460581bda148485bd214bdcaaf706776cc8969601eb9e9ae73107833",{"version":"988fad22b03f068fa42ba0f21ca11a30b144c5b6dc7fe378dd0d5993cb0ea021","signature":"337d47027050863e14974d13d062f1f85a9b2869a84bb91bbe24df61ec852a93"},{"version":"9f463411f685d3f2cc13ff4395ee2ef9b222f62048f74ee699c528cf4551a02c","signature":"77902db1e0ea5d4209241c6f0bd67e74d3f3665a0a009eb797deff03b678f655"},{"version":"8de4e575e3639288d0d181da4f8d304d99683bb382dc5c2e1e643b33210f94c0","signature":"a4e69719bab3096f0d889cb7702273aeb1663ec1bcb660828a36e75e8bf709b1"},"56fd389ea239c6259f7ee1eaa9f82f0441c6566da29d670f5ec9df6b10b55d6e",{"version":"4726730040de266dee3f85ff088f7e86c81d34f8e89a3658ec668d2451cd8b20","signature":"1ab2b8fa37eae578b30743deb1fe446bef44135e76a66eb438d772d7ee309ad9"},{"version":"a470d4f6c0fd45144ec0e97c0e9299fa8595cf88d599901ce49ef86fc2105c1f","signature":"79b4b71c08d175da7cb27e11ea1bcadd758cddf20b2ffe0e75cfbeedd89584b5"},{"version":"3dc7bca9a9ce7368cce1cfb457f560219e5e8503f5eeb84915c4d7278be08f6a","signature":"70552cd64daeb1bc28e5570f5f93139fbe4f61be463fac96009373eac9446730"},"d302144628e8e8bb096aa3668b545511f46f0c3b787b5de6fa887892a702387b","2a2584577164a5f7520b29f83472b5125fde512794ff5ec5b2226eed0f098f6a","a17c3792bfb09725c7024bd1e5cf1e7496136d42a3ef83deb3697ff92edb7af6","673ea4e20151fbfa745feaf284c1c85545fafaed03911015c6a7791160acc1e9",{"version":"889fbbf9ea80ded4dc038d353dba84a398434c58c22fb1fe2bbf4de3ed181e38","signature":"322916fa199c1182ea2faca1b6d488cb6ec497f7c48491623c440815c1033e97"},"c201951b6841ed5d1303eed429a901c9a0e3eb14cc8e5948bb0e56d12efb615b","bb89661a4eb77298a7369fb43414990eb6041032f9138e9f75798832d1bc4441","660bc470b457b104a4d9d80159b1d348d6026025f42f7690a4c184d2b66ae623","2732c099efc3745e4ba388f0d56b3d3767fb0c7d43aeefe1b2613f09b90c7f31",{"version":"a4a4f6a3a827bd8674d5b4230d6ee7ebabda6d637e76dd6667b524e61df71300","signature":"3d3e8d8e570c2d70ad678766c40a35c535b5fa76cf7bc73c6333c54823b0b752"},"0eb9fd5052728a548116c94d7954723095c9a292edf83f9d9d1ea45963d0f8e8","54b7abaab7423e9c952f1aea2eaab68266c85565f21c656c9de31d80a38a7282","040fd3a93bc770d200ecfbd83cab66b22e0c104fdaed29daea5f1ecc05f8dc74","19d8af7bc1beb5fcb22aae8b44fe31dd7af39500f54fe5f212721ba8d6a297d1","fb59f620807e4d1dbc5cc95639262f89395c1d20fcab03efc323a221b07bca43","922d4ab256e7db3a63b52e0e4a8f2c7019491b58b0961f297c5b613a2783d970","85b6daaabfe2c275b7013d13df14031bbaf623357e3746bed9ca1afaab46bedf","2ccb0e02fb165ef588673868e5e1b78d7f2b8f22cd463c8e015f9c9fcb8f3eb6","f594f5af79c5a5c75dd9e04e39314d6a193b2a18369d57195ae3675ea25925e2","8b76ee888686669a7bb8b6c5ebeb72e5a7bc0e7263152ff5daa0c486d34d870d","1cad8db035a510050fb929577f148153ef41f0fd2773df0149cbec01556c7050","43b3564d0973387eb4877c5e3a996883331e8c73a2a675aa4a708afcb4f12521","7ef1eabb4e5ec071c4aca406d80abf528ea9a15b968dbc3e275d8453c1924003","ee5d9091cc397c259f406c229cecbb893af5548944ec9b7c3dbf0daa9cced037","cdaa28c764ef022a285afecf6a4b1dc9287843dd2b45c703056e880467257cb6","57a452c40651b548c85a342f28241ee37a84e1967630ed318e515ee21d4c8ee5","e0611572c6aa5500e703c4332eecb1235d618fc91315bd39d4ccedbe3a6fe710","be4f9c6ac98f48266c88db65806e5dc4084170a229c6205159a53f0507c4c666","bb299294f09f4dd9932c8ad94bb16d7d062353d172f72e0a99d7226f3ec5b659","83962d24b7752d8aa205f38ab58ba7fd4464017403e4eb8d2481234248a626d5","260da6fd223535a3d498a1af94f4249a3e67d28e56d7648dcc72e069911cc2c8","d1f0095428cf1de664d9594850b63567b7ca7325fedac6dfd425130041b420a2","6c430c13fabc220d5e2053a81d1c993ba4341c9f461d98270b1ff503c8c48030","0740a1887c4e1c1c71fff7925a3feef85a6ab4d5b2ee4c24fb84357583da3402","a8124c363cdc2f4bbd08a4283e216b1d1fd358ddbdc658afd6fa510ed16740dd","1c6cecc8cf9d39e2501347175b1be54b8dca76fed82b87f9fa0b8b7268cb5b61","cdc15c17185913bb5b56f5f240728e7096ca133d78464876e98b6d38185c6d19","58fc9b0a79e29fa867e347981ecbef6ef52ffacfc848be358cdc41a5d9e133c8","b3bb55f630f4d3113bd13408c49d2d7a2ea1ddf96061cb5952d0bf778d491eba","f10912d31d9010c44d3aa471b34e77be99329c64f69675b00104a21e4cc50470","20e5482e50895255d12953211f19710988ab278b9f342db385f7985d34ec02bf",{"version":"d4bc691857a8aa60b09cebdfda30afb2eb8ab13d7fa8c29bcd93082803223eff","signature":"e847e443a0d4a2648051133817a02200e0b9c4b2f616a992c7ca8325a7c71d24"},"75304d5f2ccf463507df23f4b8066e7e758225a1a36d6ebe83c1b714da6c2ac5","049398af73a373ead19379fd1da4809d18bf6cf7123e44116c1491ad58d5acf0","9d8c851e30a432fadf9709f5b7802b9346d7c4aa3db0f25907669f98178bdd6e","4eaf53474be1f3e9182de786375b87893f47081e491b45321cac3a8427250f5c","79804619db6df7144de589d927d3c861d5e037ee91c9d55590ac14f927e371ac","5f6104030d0571c22ccb732c1ff1ee3f9ce38d54d0157fb895fd99d62222103c","5a64c9b17d19f3d6f73be414c83c4b4a37bb1898fc8552e2d63f71f2f6904724","a17ffb4463a3144d95960125ae3ea541a055bfa1494a908dc8688a21a0a58216","9428fa53b4d4910ec04a42be6e8bc915242800381bf5782013965ae8b4f6e3ae","dc9928627dc636458117a0f2888131ab222a160ed58d4942ebdba75d32beb69b","632cf9f97223c29fa65cf7eb81ba15d2d21a851dff8f5e0921b7e428a837af84","5e789cac338582e7c1522ce9fde6b2c4cfd626989fb5dedbdcbd1fdb7028e82d","1ccf807c1e706cf662a2475227e453da3a57cd9f6c21aaa843d3358d619e78f4","dad7f9496da68b21150b690b1bf00dcb5ddc05f575f082b9f79a0316e3cf0923","356173560bdd68ce8d6f93eb359829b4b93fdc9799369052964544c0c0551303","0ef5075c8c118e4b9f6d6e61164849a3da33cfa8a6d709b9e76b9e187cc502d7","30b18dfd86c195a4e504a9c7cab74e253cc9a81e5150a1e078a60116f8413a7b","eb572a47bd52202d9046b74cd08e11b817a09d7da9d411221c209605b53d50bf","507d41570c8cad3489d272cba504fd33baa7d60903086b2b1ea6a44a32cab870","4f4dad224f28ae73a636eaca502d71b374a4095d5a3f540f66cb56a688e067f1","4139b027a8724e900dc887009ac6df809cc5f6a5fa5f58d2d684a6f6d96ff245","09e6acd94660ad0acf93ee0cce96ba7c540b67bd65ab5b043decb5ad9976c00d","f90eaf7c39bcd43cca5e307991878da4c86947ade4c9c999534c75647e9356cf","5b9a0c2f29da015a2b552e9890b67dd33cbe9fd15c69384b8eb2e65b0be19320","01101a850ef55e575e5c27672a5788b954101ab3ee2009dc5d94820fd9aeda1d","6c26420749d17833efe84a50d61db06fbd4082e497e65ae2e4b82f2d23476279","d6c4e7806d89a5b3fe00eb53b08ae06a8d26226bc9cfbec2758d4db28462d0c4","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",{"version":"cadeb2c96f1c964d7e49c0f17d6805e1b4dee62f0862c49bb178dae6ab277e8e","impliedFormat":99},{"version":"0528f6d21f7a02d4092895090d2dd86104bd5a3e79eced96d5a1a7dd90943d17","impliedFormat":99},{"version":"b5ce343886d23392be9c8280e9f24a87f1d7d3667f6672c2fe4aa61fa4ece7d4","impliedFormat":99},{"version":"eb64a68249f1ee45e496a23cd0be8fe8c84aecb4c038b86d4abcc765c5ba115e","impliedFormat":99},{"version":"b0857bb28fd5236ace84280f79a25093f919fd0eff13e47cc26ea03de60a7294","impliedFormat":99},{"version":"5e43e0824f10cd8c48e7a8c5c673638488925a12c31f0f9e0957965c290eb14c","impliedFormat":99},{"version":"ef13c73d6157a32933c612d476c1524dd674cf5b9a88571d7d6a0d147544d529","impliedFormat":99},{"version":"3b0a56d056d81a011e484b9c05d5e430711aaecd561a788bad1d0498aad782c7","impliedFormat":99},{"version":"3354286ef917d22c72e0c830324062f950134d8882e9ea57ad6ade3d8ad943cf","impliedFormat":99},{"version":"3dedc468e9b0ed804c0226482e344bd769417f834988af838d814504af81cba6","impliedFormat":99},{"version":"ac3d263474022e9a14c43f588f485d549641d839b159ecc971978b90f34bdf6b","impliedFormat":99},{"version":"3b89216a7e38a454985ad17bb2ff85792837dc812f2a89fa5f60ad0a2e216fa7","impliedFormat":99},{"version":"10073cdcf56982064c5337787cc59b79586131e1b28c106ede5bff362f912b70","impliedFormat":99},{"version":"82179358c2d9d7347f1602dc9300039a2250e483137b38ebf31d4d2e5519c181","impliedFormat":99},{"version":"4e003c868b0d8f8ad200b96cbc653e18e513fa23e1c19c4fe3cc25d4394efc47","impliedFormat":99},{"version":"091546ac9077cddcd7b9479cc2e0c677238bf13e39eab4b13e75046c3328df93","impliedFormat":99},{"version":"42a12f2faa483c9b48195ed794d22698162274e755f6e07219c2351c4f08d732","impliedFormat":99},{"version":"727858fb893b87791876dee5e3cd4c187a721d2de516fd19d3d00dc6e8a894b3","impliedFormat":99},{"version":"5bfaa2ee33e63a1b17b08dbefd7a3c42d1e0f914e52aca5bef679b420bd7a07c","impliedFormat":99},{"version":"7d5c6cc5d537c47c7723a1fe76411b99373eb55c487045dfd076c1956e87389a","impliedFormat":99},{"version":"bcbd3becd08b4515225880abea0dbfbbf0d1181ce3af8f18f72f61edbe4febfb","impliedFormat":99},{"version":"a86701e56b10a6d1ef9b2ecaeedbab94ed7b957a646cd71fd09d02b323c6d3d7","impliedFormat":99},{"version":"b3f0791a73b6521da68107c5ba1bfed4bc21ff7099b892700fd65670e88ef6ee","impliedFormat":99},{"version":"d0411dddbef50f9ad568ee9d24b108153bcb8f0db1094de6dfbadf02feb3aa70","impliedFormat":99},{"version":"25249ca5fe64ca60d7bfb7fbbf0cb084324853b03a265dbbbc45fb4949de7567","impliedFormat":99},{"version":"06db2f8ba1d1dfacf04529cb731081ab23f133f29c7608ebdfbcab356996827c","impliedFormat":99},{"version":"bdd14f07b4eca0b4b5203b85b8dbc4d084c749fa590bee5ea613e1641dcd3b29","impliedFormat":99},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d","impliedFormat":99},{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true,"impliedFormat":99},{"version":"31d5fb0aeb0368909fbe8cd9b893c16350aa94d48a2f909fdd393982ceb4814d","affectsGlobalScope":true,"impliedFormat":99},{"version":"90fe5875e2c7519711442683a9489416819c6cec8d395e48ff568e94254533e7","impliedFormat":99},{"version":"69bf2422313487956e4dacf049f30cb91b34968912058d244cb19e4baa24da97","impliedFormat":99},{"version":"6987dfb4b0c4e02112cc4e548e7a77b3d9ddfeffa8c8a2db13ceac361a4567d9","impliedFormat":99},{"version":"72a863bc6c0fc7a6263d8e07279167d86467a3869b5f002b1df6eaf5000ccc7b","impliedFormat":99},{"version":"5e2ba3d18d78aebbde1f34bde356e41e9c76eeaeaeee56a37036596a9eff4211","impliedFormat":99},{"version":"8280ae8ccc0493b32d1742d585357ab9f0a508ea050af25a5a20d64010d0a5cf","impliedFormat":99},{"version":"7adfd9f9056ecd4ae6c65fde2a98654960c662714c73f048478959d04c09e144","impliedFormat":99},{"version":"32b35cf0dc3a1b1a7118b61c34ce2ad1a29695851679f9ec34e0776f2ece2a69","impliedFormat":99},{"version":"b413fbc6658fe2774f8bf9a15cf4c53e586fc38a2d5256b3b9647da242c14389","impliedFormat":99},{"version":"42f0f7e74d73ae5873ed666373e09a367d62232ca378677094d0dc06020d6e00","impliedFormat":99},{"version":"c30a41267fc04c6518b17e55dcb2b810f267af4314b0b6d7df1c33a76ce1b330","impliedFormat":1},{"version":"72422d0bac4076912385d0c10911b82e4694fc106e2d70added091f88f0824ba","impliedFormat":1},{"version":"da251b82c25bee1d93f9fd80c5a61d945da4f708ca21285541d7aff83ecb8200","impliedFormat":1},{"version":"64db14db2bf37ac089766fdb3c7e1160fabc10e9929bc2deeede7237e4419fc8","impliedFormat":1},{"version":"98b94085c9f78eba36d3d2314affe973e8994f99864b8708122750788825c771","impliedFormat":1},{"version":"ebb9b9fa684d70aef64614a59b7582f46f4982139b8b632b911ef98e10c4d117","impliedFormat":99},{"version":"2c34caeb0e7809e93a2baa06872c49707b1c96e229e1061c6b9ee364607f563f","signature":"b39a7180afe792f0975be5e4841a05ccf9365eca0b213207c44829c618b565be"},"3bb648f566e49849b20bbef6a3b737a875ef4e774b33f94f53dfdbd9deac403f","3d8e5168a19d52d77dc69b6785a069ed2f14000e24eb275dd5846fd31e473801","eb76714199edf4f96ba125503ae4114b4d557a55ad0fc85ec5bc30f09310bbaf","ac9ad025410d9d9a641205333a48c94a3de3caae3f5c3c4d155cf70b520556bc","e51177d723e64eb327102e10399d61ed9e89bddcf69260ac0600ca0a39b3f33b","b1bd895022be16cfda91bd37db27aab863df16082d760afe55ec3d912f1743b6","4143a3ab0eafd782c745bb4ce3b5ca2be6ca96cba8d23dc69755dcc348e319c7","6efb415baab05a5830113c471acf3c82cae9b9560036644f937cb34924921dcb","de5e7d2f6e5328b18b5dc3a39f3ca67df73577cee8b5ca8af48759f1264dca01","f24c8d553c4178e3bca9e6988140a5b98064a1f8820b53adc58803b6317c84c7","043dc788a719c8ead6f63a3f38809be150dfab433068fd674cbe491c7b0af2fd","99af15d20e90e9b50cdcfca19a43ae519039ba1c747da2e3f1eb0dff85345180","af62c3ac94d0a249d8c26a6a285b86557617dfb08f8f665cd58505232f74f78c","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"],"root":[[58,83],[125,129],[236,262],[265,268],[282,563],[611,629]],"options":{"allowSyntheticDefaultImports":true,"alwaysStrict":true,"composite":true,"declaration":true,"declarationMap":true,"esModuleInterop":true,"exactOptionalPropertyTypes":false,"module":99,"noFallthroughCasesInSwitch":true,"noImplicitAny":true,"noImplicitReturns":true,"noImplicitThis":true,"noUncheckedIndexedAccess":true,"noUnusedLocals":false,"noUnusedParameters":false,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictBindCallApply":true,"strictFunctionTypes":true,"strictNullChecks":true,"strictPropertyInitialization":true,"target":9,"tsBuildInfoFile":"./tsconfig.tsbuildinfo","useDefineForClassFields":true,"verbatimModuleSyntax":true},"referencedMap":[[590,1],[235,2],[593,3],[591,1],[264,4],[263,1],[181,5],[182,5],[183,6],[135,7],[184,8],[185,9],[186,10],[130,1],[133,11],[131,1],[132,1],[187,12],[188,13],[189,14],[190,15],[191,16],[192,17],[193,17],[194,18],[195,19],[196,20],[197,21],[136,1],[134,1],[198,22],[199,23],[200,24],[234,25],[201,26],[202,1],[203,27],[204,28],[205,29],[206,30],[207,31],[208,32],[209,33],[210,34],[211,35],[212,35],[213,36],[214,1],[215,37],[216,38],[218,39],[217,40],[219,41],[220,42],[221,43],[222,44],[223,45],[224,46],[225,47],[226,48],[227,49],[228,50],[229,51],[230,52],[231,53],[137,1],[138,1],[139,1],[178,54],[179,1],[180,1],[232,55],[233,56],[594,57],[600,58],[601,59],[599,1],[564,1],[573,60],[572,61],[595,60],[580,62],[582,63],[581,64],[588,1],[571,65],[565,66],[567,67],[569,68],[568,1],[570,66],[566,1],[592,1],[140,1],[607,69],[609,70],[608,71],[606,72],[605,1],[596,1],[589,1],[56,1],[57,1],[11,1],[10,1],[2,1],[12,1],[13,1],[14,1],[15,1],[16,1],[17,1],[18,1],[19,1],[3,1],[20,1],[21,1],[4,1],[22,1],[26,1],[23,1],[24,1],[25,1],[27,1],[28,1],[29,1],[5,1],[30,1],[31,1],[32,1],[33,1],[6,1],[37,1],[34,1],[35,1],[36,1],[38,1],[7,1],[39,1],[44,1],[45,1],[40,1],[41,1],[42,1],[43,1],[8,1],[49,1],[46,1],[47,1],[48,1],[50,1],[9,1],[51,1],[52,1],[53,1],[55,1],[54,1],[1,1],[156,73],[166,74],[155,73],[176,75],[147,76],[146,77],[175,2],[169,78],[174,79],[149,80],[163,81],[148,82],[172,83],[144,84],[143,2],[173,85],[145,86],[150,87],[151,1],[154,87],[141,1],[177,88],[167,89],[158,90],[159,91],[161,92],[157,93],[160,94],[170,2],[152,95],[153,96],[162,97],[142,98],[165,89],[164,87],[168,1],[171,99],[576,100],[579,101],[577,100],[575,1],[578,102],[597,103],[587,104],[583,105],[584,62],[603,106],[598,107],[585,108],[602,109],[574,1],[586,110],[610,111],[604,112],[117,113],[86,1],[104,114],[116,115],[115,116],[85,117],[124,118],[87,1],[105,119],[114,120],[91,121],[102,122],[109,123],[106,124],[89,125],[88,126],[101,127],[92,128],[108,129],[110,130],[111,131],[112,131],[113,132],[118,1],[84,1],[119,131],[120,133],[94,134],[95,134],[96,134],[103,135],[107,136],[93,137],[121,138],[122,139],[97,1],[90,140],[98,141],[99,142],[100,143],[123,122],[273,1],[278,1],[271,144],[276,1],[274,144],[272,145],[275,1],[270,1],[281,146],[280,1],[277,1],[269,1],[279,1],[543,1],[544,1],[545,1],[546,1],[364,147],[365,148],[362,149],[549,1],[550,1],[551,1],[552,1],[553,1],[554,1],[555,1],[556,1],[557,1],[558,1],[559,1],[560,1],[547,1],[548,1],[561,1],[562,1],[563,1],[498,150],[499,151],[497,152],[496,1],[469,1],[491,153],[378,154],[470,155],[494,1],[471,1],[472,1],[473,1],[476,156],[477,157],[478,158],[475,157],[479,157],[481,159],[480,160],[495,161],[482,1],[370,162],[483,163],[484,164],[485,165],[486,164],[488,166],[611,167],[466,168],[438,169],[464,170],[439,171],[441,172],[442,172],[443,172],[444,172],[445,172],[446,172],[447,172],[448,173],[450,174],[451,172],[452,172],[453,172],[454,175],[455,176],[456,172],[457,172],[458,172],[459,173],[460,172],[461,172],[462,172],[463,172],[449,169],[465,177],[437,1],[440,178],[467,171],[435,179],[434,180],[380,181],[381,181],[382,181],[383,181],[385,182],[384,181],[392,183],[389,184],[391,185],[390,186],[386,187],[387,171],[388,186],[393,181],[394,181],[401,188],[395,186],[396,186],[397,1],[399,189],[398,186],[400,171],[402,190],[403,181],[404,190],[414,191],[405,1],[407,192],[409,193],[406,186],[410,171],[411,194],[412,1],[408,1],[413,195],[415,190],[416,181],[417,190],[424,196],[420,197],[421,198],[419,199],[423,200],[418,171],[422,1],[425,181],[426,181],[427,181],[428,181],[429,181],[430,181],[432,181],[431,181],[436,201],[369,1],[433,202],[379,171],[468,203],[377,204],[373,205],[375,206],[374,207],[376,208],[372,209],[487,1],[492,210],[493,211],[489,212],[371,1],[474,1],[490,213],[367,214],[368,215],[366,1],[330,216],[328,217],[329,217],[327,217],[326,1],[516,218],[515,219],[514,220],[507,1],[513,221],[508,222],[509,1],[510,223],[511,224],[512,225],[506,226],[500,1],[505,227],[502,228],[503,1],[501,1],[504,1],[294,229],[612,230],[293,231],[292,232],[291,232],[290,232],[282,158],[298,233],[301,234],[300,235],[299,236],[286,237],[268,238],[613,239],[283,240],[284,238],[285,241],[267,236],[251,242],[250,243],[249,244],[245,245],[247,246],[246,247],[248,248],[265,249],[266,250],[254,251],[253,252],[252,253],[255,254],[259,255],[260,256],[257,257],[258,258],[256,259],[261,256],[262,260],[244,1],[287,232],[297,261],[296,262],[288,263],[289,264],[295,265],[346,1],[352,266],[349,267],[350,268],[353,269],[347,1],[351,1],[348,1],[356,270],[357,271],[354,1],[355,1],[344,272],[345,273],[322,274],[341,275],[323,274],[324,276],[342,277],[325,276],[343,278],[321,1],[358,279],[318,280],[320,281],[316,282],[317,283],[319,284],[315,285],[313,1],[314,286],[312,287],[311,1],[308,288],[310,289],[307,290],[306,291],[309,292],[305,1],[304,1],[542,293],[359,294],[361,295],[360,296],[303,297],[363,298],[302,299],[518,278],[529,300],[520,301],[521,301],[522,301],[523,301],[524,301],[525,301],[526,301],[527,301],[528,301],[519,1],[530,302],[517,158],[340,303],[332,304],[333,304],[334,304],[335,304],[336,304],[337,304],[338,304],[339,305],[331,158],[624,306],[622,307],[615,308],[616,308],[617,308],[618,308],[619,308],[620,308],[621,308],[614,1],[623,309],[127,310],[81,311],[83,312],[125,313],[82,1],[126,311],[79,314],[74,315],[72,316],[75,317],[77,318],[78,317],[73,316],[128,319],[65,316],[70,320],[64,321],[71,316],[80,322],[67,323],[66,324],[69,325],[68,326],[626,1],[76,1],[627,1],[628,1],[629,1],[625,1],[243,327],[242,328],[238,329],[239,330],[240,329],[237,331],[241,332],[236,333],[129,334],[60,298],[61,1],[58,1],[63,334],[59,236],[62,335],[533,336],[539,337],[531,158],[534,336],[536,338],[541,339],[537,340],[535,341],[538,336],[540,342],[532,1]],"affectedFilesPendingEmit":[[364,51],[365,51],[362,51],[549,51],[550,51],[551,51],[552,51],[553,51],[554,51],[555,51],[556,51],[557,51],[558,51],[559,51],[560,51],[547,51],[548,51],[561,51],[562,51],[563,51],[498,51],[499,51],[497,51],[496,51],[469,51],[491,51],[378,51],[470,51],[494,51],[471,51],[472,51],[473,51],[476,51],[477,51],[478,51],[475,51],[479,51],[481,51],[480,51],[495,51],[482,51],[370,51],[483,51],[484,51],[485,51],[486,51],[488,51],[611,51],[466,51],[438,51],[464,51],[439,51],[441,51],[442,51],[443,51],[444,51],[445,51],[446,51],[447,51],[448,51],[450,51],[451,51],[452,51],[453,51],[454,51],[455,51],[456,51],[457,51],[458,51],[459,51],[460,51],[461,51],[462,51],[463,51],[449,51],[465,51],[437,51],[440,51],[467,51],[435,51],[434,51],[380,51],[381,51],[382,51],[383,51],[385,51],[384,51],[392,51],[389,51],[391,51],[390,51],[386,51],[387,51],[388,51],[393,51],[394,51],[401,51],[395,51],[396,51],[397,51],[399,51],[398,51],[400,51],[402,51],[403,51],[404,51],[414,51],[405,51],[407,51],[409,51],[406,51],[410,51],[411,51],[412,51],[408,51],[413,51],[415,51],[416,51],[417,51],[424,51],[420,51],[421,51],[419,51],[423,51],[418,51],[422,51],[425,51],[426,51],[427,51],[428,51],[429,51],[430,51],[432,51],[431,51],[436,51],[369,51],[433,51],[379,51],[468,51],[377,51],[373,51],[375,51],[374,51],[376,51],[372,51],[487,51],[492,51],[493,51],[489,51],[371,51],[474,51],[490,51],[367,51],[368,51],[366,51],[330,51],[328,51],[329,51],[327,51],[326,51],[516,51],[515,51],[514,51],[507,51],[513,51],[508,51],[509,51],[510,51],[511,51],[512,51],[506,51],[500,51],[505,51],[502,51],[503,51],[501,51],[504,51],[294,51],[612,51],[293,51],[292,51],[291,51],[290,51],[282,51],[298,51],[301,51],[300,51],[299,51],[286,51],[268,51],[613,51],[283,51],[284,51],[285,51],[267,51],[251,51],[250,51],[249,51],[245,51],[247,51],[246,51],[248,51],[265,51],[266,51],[254,51],[253,51],[252,51],[255,51],[259,51],[260,51],[257,51],[258,51],[256,51],[261,51],[262,51],[244,51],[287,51],[297,51],[296,51],[288,51],[289,51],[295,51],[346,51],[352,51],[349,51],[350,51],[353,51],[347,51],[351,51],[348,51],[356,51],[357,51],[354,51],[355,51],[344,51],[345,51],[322,51],[341,51],[323,51],[324,51],[342,51],[325,51],[343,51],[321,51],[358,51],[318,51],[320,51],[316,51],[317,51],[319,51],[315,51],[313,51],[314,51],[312,51],[311,51],[308,51],[310,51],[307,51],[306,51],[309,51],[305,51],[304,51],[542,51],[359,51],[361,51],[360,51],[303,51],[363,51],[302,51],[518,51],[529,51],[520,51],[521,51],[522,51],[523,51],[524,51],[525,51],[526,51],[527,51],[528,51],[519,51],[530,51],[517,51],[340,51],[332,51],[333,51],[334,51],[335,51],[336,51],[337,51],[338,51],[339,51],[331,51],[624,51],[622,51],[615,51],[616,51],[617,51],[618,51],[619,51],[620,51],[621,51],[614,51],[623,51],[127,51],[81,51],[83,51],[125,51],[82,51],[126,51],[79,51],[74,51],[72,51],[75,51],[77,51],[78,51],[73,51],[128,51],[65,51],[70,51],[64,51],[71,51],[80,51],[67,51],[66,51],[69,51],[68,51],[626,51],[76,51],[627,51],[628,51],[629,51],[625,51],[243,51],[242,51],[238,51],[239,51],[240,51],[237,51],[241,51],[236,51],[129,51],[60,51],[61,51],[58,51],[63,51],[59,51],[62,51],[533,51],[539,51],[531,51],[534,51],[536,51],[541,51],[537,51],[535,51],[538,51],[540,51],[532,51]],"emitSignatures":[58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,125,126,127,128,129,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,265,266,267,268,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629],"version":"5.9.3"} \ No newline at end of file diff --git a/packages/templates/src/__tests__/validate.test.ts b/packages/templates/src/__tests__/validate.test.ts index e9fca65e..c5a63771 100644 --- a/packages/templates/src/__tests__/validate.test.ts +++ b/packages/templates/src/__tests__/validate.test.ts @@ -161,7 +161,7 @@ describe('validate.ts β€” clean run (no templates)', () => { it('logs success and does not call process.exit when no issues are found', async () => { h.templates = []; // empty registry await loadValidate(); - const allLogs = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const allLogs = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(allLogs).toMatch(/Validated 0 templates/); expect(allLogs).toMatch(/All templates pass validation/); expect(exitSpy).not.toHaveBeenCalled(); @@ -173,7 +173,7 @@ describe('validate.ts β€” checkCore', () => { h.templates = [makeTemplate()]; h.coreIssues = [{ severity: 'error', code: 'DANGLING_EDGE_SOURCE', message: 'bad edge' }]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).toMatch(/Core:DANGLING_EDGE_SOURCE/); expect(exitSpy).toHaveBeenCalledWith(1); }); @@ -190,7 +190,7 @@ describe('validate.ts β€” checkCore', () => { h.blueprints.set('Compute.OK', { iceType: 'Compute.OK', providers: ['gcp'] }); await loadValidate(); // Warning bucket should contain the line; errors should not. - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).toMatch(/⚠.*warning/); expect(out).toMatch(/Core:MISSING_ICE_TYPE/); // No error path β†’ no process.exit. @@ -240,7 +240,7 @@ describe('validate.ts β€” checkBlueprints (R1)', () => { }), ]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).toMatch(/R1:blueprint/); expect(out).toMatch(/Compute.Phantom/); expect(exitSpy).toHaveBeenCalledWith(1); @@ -254,7 +254,7 @@ describe('validate.ts β€” checkBlueprints (R1)', () => { }), ]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).not.toMatch(/R1:blueprint/); }); }); @@ -279,7 +279,7 @@ describe('validate.ts β€” checkBounds (R2)', () => { }), ]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).toMatch(/R2:bounds/); expect(exitSpy).toHaveBeenCalledWith(1); }); @@ -301,7 +301,7 @@ describe('validate.ts β€” checkBounds (R2)', () => { }), ]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).not.toMatch(/R2:bounds/); }); @@ -322,7 +322,7 @@ describe('validate.ts β€” checkBounds (R2)', () => { }), ]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).not.toMatch(/R2:bounds/); }); @@ -356,7 +356,7 @@ describe('validate.ts β€” checkUngrouped (R3)', () => { }), ]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).toMatch(/R3:ungrouped/); }); @@ -380,7 +380,7 @@ describe('validate.ts β€” checkUngrouped (R3)', () => { }), ]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).not.toMatch(/R3:ungrouped/); }); @@ -401,14 +401,14 @@ describe('validate.ts β€” checkVpcSubnet (R5)', () => { it('skips quickstart templates (early return)', async () => { h.templates = [makeTemplate({ category: 'quick-start' })]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).not.toMatch(/R5:/); }); it('errors when a non-quickstart template has no groups', async () => { h.templates = [makeTemplate({ category: 'full-stack', groups: undefined })]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).toMatch(/R5:vpc/); expect(out).toMatch(/must have VPC with Subnets/); expect(exitSpy).toHaveBeenCalledWith(1); @@ -431,7 +431,7 @@ describe('validate.ts β€” checkVpcSubnet (R5)', () => { }), ]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).toMatch(/No VPC group found/); expect(exitSpy).toHaveBeenCalledWith(1); }); @@ -465,7 +465,7 @@ describe('validate.ts β€” checkVpcSubnet (R5)', () => { }), ]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).toMatch(/R5:vpc-empty/); expect(exitSpy).toHaveBeenCalledWith(1); }); @@ -488,7 +488,7 @@ describe('validate.ts β€” checkVpcSubnet (R5)', () => { }), ]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).toMatch(/R5:subnet/); expect(exitSpy).toHaveBeenCalledWith(1); }); @@ -521,7 +521,7 @@ describe('validate.ts β€” checkVpcSubnet (R5)', () => { }), ]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).toMatch(/Subnet "Subnet" missing parentGroupIndex/); expect(exitSpy).toHaveBeenCalledWith(1); }); @@ -562,7 +562,7 @@ describe('validate.ts β€” checkVpcSubnet (R5)', () => { }), ]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).toMatch(/parentGroupIndex points to non-VPC/); expect(exitSpy).toHaveBeenCalledWith(1); }); @@ -595,7 +595,7 @@ describe('validate.ts β€” checkVpcSubnet (R5)', () => { }), ]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).toMatch(/non-VPC|R5:parent/); expect(exitSpy).toHaveBeenCalledWith(1); }); @@ -628,7 +628,7 @@ describe('validate.ts β€” checkVpcSubnet (R5)', () => { }), ]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).not.toMatch(/R5:/); }); }); @@ -650,7 +650,7 @@ describe('validate.ts β€” checkProperties (R6)', () => { }), ]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).toMatch(/R6:prop/); expect(out).toMatch(/missing required property "storage"/); expect(exitSpy).toHaveBeenCalledWith(1); @@ -665,7 +665,7 @@ describe('validate.ts β€” checkProperties (R6)', () => { }), ]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).not.toMatch(/R6:prop/); }); @@ -680,7 +680,7 @@ describe('validate.ts β€” checkProperties (R6)', () => { }), ]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).not.toMatch(/R6:prop/); }); @@ -700,7 +700,7 @@ describe('validate.ts β€” checkProperties (R6)', () => { }), ]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).not.toMatch(/R6:prop/); }); }); @@ -724,7 +724,7 @@ describe('validate.ts β€” checkColors (R7)', () => { }), ]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).toMatch(/R7:color/); }); @@ -748,7 +748,7 @@ describe('validate.ts β€” checkColors (R7)', () => { }), ]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).not.toMatch(/R7:color/); }); @@ -770,7 +770,7 @@ describe('validate.ts β€” checkColors (R7)', () => { }), ]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).not.toMatch(/R7:color/); }); @@ -787,7 +787,7 @@ describe('validate.ts β€” checkMetadata (R10)', () => { delete (t as any).description; h.templates = [t]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).toMatch(/R10:meta/); expect(out).toMatch(/Missing required metadata field "description"/); expect(exitSpy).toHaveBeenCalledWith(1); @@ -796,7 +796,7 @@ describe('validate.ts β€” checkMetadata (R10)', () => { it('errors when a required array field is empty', async () => { h.templates = [makeTemplate({ tags: [] })]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).toMatch(/R10:meta/); expect(out).toMatch(/Missing required metadata field "tags"/); }); @@ -804,7 +804,7 @@ describe('validate.ts β€” checkMetadata (R10)', () => { it('warns when optional difficulty is missing', async () => { h.templates = [makeTemplate({ difficulty: undefined })]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).toMatch(/Missing optional metadata field "difficulty"/); expect(exitSpy).not.toHaveBeenCalled(); }); @@ -812,21 +812,21 @@ describe('validate.ts β€” checkMetadata (R10)', () => { it('warns when optional trust is missing', async () => { h.templates = [makeTemplate({ trust: undefined })]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).toMatch(/Missing optional metadata field "trust"/); }); it('warns when optional author is missing', async () => { h.templates = [makeTemplate({ author: undefined })]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).toMatch(/Missing optional metadata field "author"/); }); it('passes when all metadata fields are present', async () => { h.templates = [makeTemplate()]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).not.toMatch(/R10:meta/); }); }); @@ -836,7 +836,7 @@ describe('validate.ts β€” checkExpansion', () => { h.expandResult = { nodes: [], edges: [] }; h.templates = [makeTemplate()]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).toMatch(/Expansion for provider .* produced zero nodes/); expect(exitSpy).toHaveBeenCalledWith(1); }); @@ -845,7 +845,7 @@ describe('validate.ts β€” checkExpansion', () => { h.expandThrows = new Error('boom'); h.templates = [makeTemplate()]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).toMatch(/Expansion failed for provider .*: Error: boom/); expect(exitSpy).toHaveBeenCalledWith(1); }); @@ -866,7 +866,7 @@ describe('validate.ts β€” checkExpansion', () => { }; h.templates = [makeTemplate()]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).toMatch(/unsupported on provider .*: Bad/); }); @@ -886,7 +886,7 @@ describe('validate.ts β€” checkExpansion', () => { }; h.templates = [makeTemplate()]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).toMatch(/Compute\.Foo/); }); @@ -937,7 +937,7 @@ describe('validate.ts β€” script-level reporting', () => { it('prints the warnings section when only warnings are present', async () => { h.templates = [makeTemplate({ trust: undefined })]; // R10 trust warn await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).toMatch(/⚠.*1 warning/); expect(exitSpy).not.toHaveBeenCalled(); }); @@ -951,7 +951,7 @@ describe('validate.ts β€” script-level reporting', () => { }), ]; await loadValidate(); - const out = logSpy.mock.calls.map((c) => c[0]).join('\n'); + const out = logSpy.mock.calls.map((c: unknown[]) => c[0]).join('\n'); expect(out).toMatch(/warning/); expect(out).toMatch(/error/); expect(exitSpy).toHaveBeenCalledWith(1); diff --git a/packages/ui/src/config/blocks/__tests__/blueprints.test.ts b/packages/ui/src/config/blocks/__tests__/blueprints.test.ts index f9c11fbc..230551fb 100644 --- a/packages/ui/src/config/blocks/__tests__/blueprints.test.ts +++ b/packages/ui/src/config/blocks/__tests__/blueprints.test.ts @@ -25,7 +25,7 @@ import { kubernetesRabbitmqBlueprint } from '../kubernetes/messaging/rabbitmq'; import { kubernetesGatewayBlueprint } from '../kubernetes/networking/gateway'; import { kubernetesLogsBlueprint } from '../kubernetes/observability/logs'; import { kubernetesStorageBlueprint } from '../kubernetes/storage/storage'; -import type { BlockBlueprint } from '../../types'; +import type { BlockBlueprint } from '../types'; const allBlueprints: Array<[string, BlockBlueprint]> = [ ['env-config', envConfigBlueprint], diff --git a/packages/ui/src/features/canvas/components/context/__tests__/canvas-context-menu.test.tsx b/packages/ui/src/features/canvas/components/context/__tests__/canvas-context-menu.test.tsx index 6967314d..9c0ea7e1 100644 --- a/packages/ui/src/features/canvas/components/context/__tests__/canvas-context-menu.test.tsx +++ b/packages/ui/src/features/canvas/components/context/__tests__/canvas-context-menu.test.tsx @@ -20,7 +20,7 @@ const mocks = vi.hoisted(() => ({ canvasPosition: { x: 50, y: 60 }, }, showProperties: false, - edgeStyle: 'bezier' as const, + edgeStyle: 'bezier' as 'bezier' | 'rectangular', canvasLocked: false, }, selection: { selectedNodes: [] as string[] }, @@ -38,7 +38,9 @@ const mocks = vi.hoisted(() => ({ NodeMenu: vi.fn(() => null), EdgeMenu: vi.fn(() => null), // axios mock - axiosPost: vi.fn(() => Promise.resolve({ data: { provider: null } })), + axiosPost: vi.fn( + (..._args: unknown[]) => Promise.resolve({ data: { provider: null } }) as Promise<{ data: { provider?: unknown } }>, + ), // Action creators expandBlueprintToCard: vi.fn((p: unknown) => ({ type: 'cards/expandBlueprintToCard', payload: p })), importToActiveCard: vi.fn((p: unknown) => ({ type: 'cards/importToActiveCard', payload: p })), @@ -178,7 +180,7 @@ function* walk(node: unknown): Generator { } if (!isEl(node)) return; yield node; - if (KNOWN_MOCKS.includes(node.type as ReturnType)) { + if ((KNOWN_MOCKS as unknown[]).includes(node.type)) { yield* walk(node.props.children); return; } diff --git a/packages/ui/src/features/canvas/components/context/__tests__/canvas-menu.test.tsx b/packages/ui/src/features/canvas/components/context/__tests__/canvas-menu.test.tsx index 908abcfd..52677ed3 100644 --- a/packages/ui/src/features/canvas/components/context/__tests__/canvas-menu.test.tsx +++ b/packages/ui/src/features/canvas/components/context/__tests__/canvas-menu.test.tsx @@ -115,7 +115,13 @@ function findFirst(tree: unknown, pred: (el: ElLike) => boolean): ElLike | undef } const findItemByLabel = (tree: unknown, label: string): ElLike | undefined => - findFirst(tree, (el) => el.type === 'button' && (el.props.children as unknown[])?.[0]?.props?.children === label); + findFirst( + tree, + (el) => + el.type === 'button' && + ((el.props.children as unknown[])?.[0] as { props?: { children?: unknown } } | undefined)?.props?.children === + label, + ); // Helper: find a SubMenu / CategorySubMenu / MenuItem (FC) by its label prop const findFCByLabel = (tree: unknown, label: string): ElLike | undefined => diff --git a/packages/ui/src/features/canvas/components/nodes/compact-node/__tests__/block-summary-card.test.tsx b/packages/ui/src/features/canvas/components/nodes/compact-node/__tests__/block-summary-card.test.tsx index 832d1cb7..1c405e83 100644 --- a/packages/ui/src/features/canvas/components/nodes/compact-node/__tests__/block-summary-card.test.tsx +++ b/packages/ui/src/features/canvas/components/nodes/compact-node/__tests__/block-summary-card.test.tsx @@ -36,7 +36,7 @@ vi.mock('../../_shared/provider-pill', () => ({ ProviderPill: mocks.ProviderPill vi.mock('../../_shared/cost-label', () => ({ CostLabel: mocks.CostLabel })); import { BlockSummaryCard, BLOCK_SUMMARY_H, BLOCK_SUMMARY_W } from '../block-summary-card'; -import type { CanvasNode } from '../../svg-canvas'; +import type { CanvasNode } from '../../../svg-canvas'; const MockNodeHeader = mocks.NodeHeader; const MockProviderPill = mocks.ProviderPill; diff --git a/packages/ui/src/features/canvas/components/nodes/compact-node/__tests__/compact-lod3.test.tsx b/packages/ui/src/features/canvas/components/nodes/compact-node/__tests__/compact-lod3.test.tsx index e0224562..453c9c6b 100644 --- a/packages/ui/src/features/canvas/components/nodes/compact-node/__tests__/compact-lod3.test.tsx +++ b/packages/ui/src/features/canvas/components/nodes/compact-node/__tests__/compact-lod3.test.tsx @@ -782,7 +782,7 @@ describe('CompactLod3 β€” unfolded composition', () => { expect(() => (pr.props as { onClick: (e: React.MouseEvent) => void }).onClick({ stopPropagation: () => {}, - } as React.MouseEvent), + } as unknown as React.MouseEvent), ).not.toThrow(); }); diff --git a/packages/ui/src/features/canvas/components/nodes/compact-node/__tests__/index.test.tsx b/packages/ui/src/features/canvas/components/nodes/compact-node/__tests__/index.test.tsx index 9da4a7a0..b9b05458 100644 --- a/packages/ui/src/features/canvas/components/nodes/compact-node/__tests__/index.test.tsx +++ b/packages/ui/src/features/canvas/components/nodes/compact-node/__tests__/index.test.tsx @@ -442,7 +442,7 @@ describe('SvgCompactNode β€” callbacks', () => { const tree = renderSCN({ node, onToggleFold: fold }); const onToggleFold = (tree.props as { onToggleFold: (e: React.MouseEvent) => void }).onToggleFold; const stops: string[] = []; - onToggleFold({ stopPropagation: () => stops.push('s') } as React.MouseEvent); + onToggleFold({ stopPropagation: () => stops.push('s') } as unknown as React.MouseEvent); expect(stops).toEqual(['s']); expect(fold).toHaveBeenCalledWith('foo'); }); @@ -450,7 +450,7 @@ describe('SvgCompactNode β€” callbacks', () => { it('handleFold no-op when onToggleFold undefined', () => { const tree = renderSCN({}); const onToggleFold = (tree.props as { onToggleFold: (e: React.MouseEvent) => void }).onToggleFold; - expect(() => onToggleFold({ stopPropagation: () => {} } as React.MouseEvent)).not.toThrow(); + expect(() => onToggleFold({ stopPropagation: () => {} } as unknown as React.MouseEvent)).not.toThrow(); }); it('onMouseEnter sets hover + calls onNodeHover(id)', () => { diff --git a/packages/ui/src/features/canvas/components/nodes/compact-node/__tests__/metadata-lines.test.tsx b/packages/ui/src/features/canvas/components/nodes/compact-node/__tests__/metadata-lines.test.tsx index 54b7ed59..fb45be31 100644 --- a/packages/ui/src/features/canvas/components/nodes/compact-node/__tests__/metadata-lines.test.tsx +++ b/packages/ui/src/features/canvas/components/nodes/compact-node/__tests__/metadata-lines.test.tsx @@ -290,7 +290,7 @@ describe('MetadataLines β€” repo line (selected + isSourceRepo)', () => { const stops: string[] = []; (span.props as { onClick: (e: React.MouseEvent) => void }).onClick({ stopPropagation: () => stops.push('s'), - } as React.MouseEvent); + } as unknown as React.MouseEvent); expect(stops).toEqual(['s']); expect(mocks.state.setRepoSelectorOpen).toHaveBeenCalledWith(true); }); @@ -310,7 +310,7 @@ describe('MetadataLines β€” repo line (selected + isSourceRepo)', () => { const stops: string[] = []; (pencil.props as { onClick: (e: React.MouseEvent) => void }).onClick({ stopPropagation: () => stops.push('s'), - } as React.MouseEvent); + } as unknown as React.MouseEvent); expect(stops).toEqual(['s']); expect(mocks.state.setRepoSelectorOpen).toHaveBeenCalledWith(true); }); @@ -329,7 +329,7 @@ describe('MetadataLines β€” repo line (selected + isSourceRepo)', () => { )[0]; (span.props as { onClick: (e: React.MouseEvent) => void }).onClick({ stopPropagation: () => {}, - } as React.MouseEvent); + } as unknown as React.MouseEvent); expect(mocks.state.setRepoSelectorOpen).toHaveBeenCalledWith(false); }); }); @@ -380,7 +380,7 @@ describe('MetadataLines β€” Link repo prompt', () => { const stops: string[] = []; (promptSpan.props as { onClick: (e: React.MouseEvent) => void }).onClick({ stopPropagation: () => stops.push('s'), - } as React.MouseEvent); + } as unknown as React.MouseEvent); expect(stops).toEqual(['s']); expect(mocks.state.setRepoSelectorOpen).toHaveBeenCalledWith(true); }); @@ -449,10 +449,10 @@ describe('MetadataLines β€” RepoSelector dropdown', () => { const stops: string[] = []; (containerDiv.props as { onClick: (e: React.MouseEvent) => void }).onClick({ stopPropagation: () => stops.push('c'), - } as React.MouseEvent); + } as unknown as React.MouseEvent); (containerDiv.props as { onMouseDown: (e: React.MouseEvent) => void }).onMouseDown({ stopPropagation: () => stops.push('m'), - } as React.MouseEvent); + } as unknown as React.MouseEvent); expect(stops).toEqual(['c', 'm']); }); }); diff --git a/packages/ui/src/features/canvas/components/nodes/compact-node/__tests__/pipeline-row.test.tsx b/packages/ui/src/features/canvas/components/nodes/compact-node/__tests__/pipeline-row.test.tsx index ad2fd204..6b562630 100644 --- a/packages/ui/src/features/canvas/components/nodes/compact-node/__tests__/pipeline-row.test.tsx +++ b/packages/ui/src/features/canvas/components/nodes/compact-node/__tests__/pipeline-row.test.tsx @@ -233,7 +233,7 @@ describe('PipelineRow β€” interactions', () => { const tree = renderPR({ status: 'success' }); const stops: string[] = []; const onMouseDown = (tree.props as { onMouseDown: (e: React.MouseEvent) => void }).onMouseDown; - onMouseDown({ stopPropagation: () => stops.push('s') } as React.MouseEvent); + onMouseDown({ stopPropagation: () => stops.push('s') } as unknown as React.MouseEvent); expect(stops).toEqual(['s']); }); }); diff --git a/packages/ui/src/features/canvas/components/nodes/compact-node/__tests__/scaling-row.test.tsx b/packages/ui/src/features/canvas/components/nodes/compact-node/__tests__/scaling-row.test.tsx index 6f9baf69..e55f63c0 100644 --- a/packages/ui/src/features/canvas/components/nodes/compact-node/__tests__/scaling-row.test.tsx +++ b/packages/ui/src/features/canvas/components/nodes/compact-node/__tests__/scaling-row.test.tsx @@ -136,7 +136,7 @@ describe('ScalingRow β€” min stepper', () => { const minMinus = buttons[0]; (minMinus.props as { onClick: (e: React.MouseEvent) => void }).onClick({ stopPropagation: () => {}, - } as React.MouseEvent); + } as unknown as React.MouseEvent); expect(fn).toHaveBeenCalledWith('node-1', { minInstances: 0 }); }); @@ -146,7 +146,7 @@ describe('ScalingRow β€” min stepper', () => { const buttons = findByType(tree, MockStepperButton).filter((b) => (b.props as { label: string }).label === 'βˆ’'); (buttons[0].props as { onClick: (e: React.MouseEvent) => void }).onClick({ stopPropagation: () => {}, - } as React.MouseEvent); + } as unknown as React.MouseEvent); expect(fn).toHaveBeenCalledWith('node-1', { minInstances: 4 }); }); @@ -156,7 +156,7 @@ describe('ScalingRow β€” min stepper', () => { const buttons = findByType(tree, MockStepperButton).filter((b) => (b.props as { label: string }).label === 'βˆ’'); (buttons[0].props as { onClick: (e: React.MouseEvent) => void }).onClick({ stopPropagation: () => {}, - } as React.MouseEvent); + } as unknown as React.MouseEvent); expect(fn).toHaveBeenCalledWith('node-1', { minInstances: 0 }); }); @@ -166,7 +166,7 @@ describe('ScalingRow β€” min stepper', () => { const buttons = findByType(tree, MockStepperButton).filter((b) => (b.props as { label: string }).label === '+'); (buttons[0].props as { onClick: (e: React.MouseEvent) => void }).onClick({ stopPropagation: () => {}, - } as React.MouseEvent); + } as unknown as React.MouseEvent); expect(fn).toHaveBeenCalledWith('node-1', { minInstances: 5 }); }); @@ -176,7 +176,7 @@ describe('ScalingRow β€” min stepper', () => { const buttons = findByType(tree, MockStepperButton).filter((b) => (b.props as { label: string }).label === '+'); (buttons[0].props as { onClick: (e: React.MouseEvent) => void }).onClick({ stopPropagation: () => {}, - } as React.MouseEvent); + } as unknown as React.MouseEvent); expect(fn).toHaveBeenCalledWith('node-1', { minInstances: 51 }); }); @@ -186,7 +186,7 @@ describe('ScalingRow β€” min stepper', () => { const buttons = findByType(tree, MockStepperButton).filter((b) => (b.props as { label: string }).label === '+'); (buttons[0].props as { onClick: (e: React.MouseEvent) => void }).onClick({ stopPropagation: () => {}, - } as React.MouseEvent); + } as unknown as React.MouseEvent); expect(fn).toHaveBeenCalledWith('node-1', { minInstances: 2 }); }); @@ -204,7 +204,7 @@ describe('ScalingRow β€” max stepper', () => { // Second minus is the max decrement. (buttons[1].props as { onClick: (e: React.MouseEvent) => void }).onClick({ stopPropagation: () => {}, - } as React.MouseEvent); + } as unknown as React.MouseEvent); expect(fn).toHaveBeenCalledWith('node-1', { maxInstances: 3 }); }); @@ -214,7 +214,7 @@ describe('ScalingRow β€” max stepper', () => { const buttons = findByType(tree, MockStepperButton).filter((b) => (b.props as { label: string }).label === 'βˆ’'); (buttons[1].props as { onClick: (e: React.MouseEvent) => void }).onClick({ stopPropagation: () => {}, - } as React.MouseEvent); + } as unknown as React.MouseEvent); expect(fn).toHaveBeenCalledWith('node-1', { maxInstances: 4 }); }); @@ -224,7 +224,7 @@ describe('ScalingRow β€” max stepper', () => { const buttons = findByType(tree, MockStepperButton).filter((b) => (b.props as { label: string }).label === 'βˆ’'); (buttons[1].props as { onClick: (e: React.MouseEvent) => void }).onClick({ stopPropagation: () => {}, - } as React.MouseEvent); + } as unknown as React.MouseEvent); expect(fn).toHaveBeenCalledWith('node-1', { maxInstances: 2 }); }); @@ -234,7 +234,7 @@ describe('ScalingRow β€” max stepper', () => { const buttons = findByType(tree, MockStepperButton).filter((b) => (b.props as { label: string }).label === 'βˆ’'); (buttons[1].props as { onClick: (e: React.MouseEvent) => void }).onClick({ stopPropagation: () => {}, - } as React.MouseEvent); + } as unknown as React.MouseEvent); expect(fn).toHaveBeenCalledWith('node-1', { maxInstances: 2 }); }); @@ -244,7 +244,7 @@ describe('ScalingRow β€” max stepper', () => { const buttons = findByType(tree, MockStepperButton).filter((b) => (b.props as { label: string }).label === '+'); (buttons[1].props as { onClick: (e: React.MouseEvent) => void }).onClick({ stopPropagation: () => {}, - } as React.MouseEvent); + } as unknown as React.MouseEvent); expect(fn).toHaveBeenCalledWith('node-1', { maxInstances: 8 }); }); @@ -254,7 +254,7 @@ describe('ScalingRow β€” max stepper', () => { const buttons = findByType(tree, MockStepperButton).filter((b) => (b.props as { label: string }).label === '+'); (buttons[1].props as { onClick: (e: React.MouseEvent) => void }).onClick({ stopPropagation: () => {}, - } as React.MouseEvent); + } as unknown as React.MouseEvent); expect(fn).toHaveBeenCalledWith('node-1', { maxInstances: 4 }); }); @@ -272,7 +272,7 @@ describe('ScalingRow β€” onUpdateData undefined', () => { expect(() => (b.props as { onClick: (e: React.MouseEvent) => void }).onClick({ stopPropagation: () => {}, - } as React.MouseEvent), + } as unknown as React.MouseEvent), ).not.toThrow(); } }); @@ -284,7 +284,7 @@ describe('ScalingRow β€” onUpdateData undefined', () => { const stops: string[] = []; (b.props as { onClick: (e: React.MouseEvent) => void }).onClick({ stopPropagation: () => stops.push('s'), - } as React.MouseEvent); + } as unknown as React.MouseEvent); expect(stops).toEqual(['s']); } }); diff --git a/packages/ui/src/features/canvas/components/nodes/custom-domain/__tests__/index.test.tsx b/packages/ui/src/features/canvas/components/nodes/custom-domain/__tests__/index.test.tsx index 796fcf2c..b21b65e4 100644 --- a/packages/ui/src/features/canvas/components/nodes/custom-domain/__tests__/index.test.tsx +++ b/packages/ui/src/features/canvas/components/nodes/custom-domain/__tests__/index.test.tsx @@ -240,10 +240,10 @@ describe('SvgCustomDomainNode β€” root domain input', () => { const stops: string[] = []; (input.props as { onMouseDown: (e: React.MouseEvent) => void }).onMouseDown({ stopPropagation: () => stops.push('m'), - } as React.MouseEvent); + } as unknown as React.MouseEvent); (input.props as { onClick: (e: React.MouseEvent) => void }).onClick({ stopPropagation: () => stops.push('c'), - } as React.MouseEvent); + } as unknown as React.MouseEvent); expect(stops).toEqual(['m', 'c']); }); @@ -399,7 +399,7 @@ describe('SvgCustomDomainNode β€” route rows', () => { const stops: string[] = []; (sub.props as { onMouseDown: (e: React.MouseEvent) => void }).onMouseDown({ stopPropagation: () => stops.push('m'), - } as React.MouseEvent); + } as unknown as React.MouseEvent); expect(stops).toEqual(['m']); }); @@ -414,7 +414,7 @@ describe('SvgCustomDomainNode β€” route rows', () => { const stops: string[] = []; (sub.props as { onClick: (e: React.MouseEvent) => void }).onClick({ stopPropagation: () => stops.push('c'), - } as React.MouseEvent); + } as unknown as React.MouseEvent); expect(stops).toEqual(['c']); }); }); @@ -462,7 +462,7 @@ describe('SvgCustomDomainNode β€” delete row button', () => { }); const stops: string[] = []; const onClick = (findDeleteBtns(tree)[0].props as { onClick: (e: React.MouseEvent) => void }).onClick; - onClick({ stopPropagation: () => stops.push('s') } as React.MouseEvent); + onClick({ stopPropagation: () => stops.push('s') } as unknown as React.MouseEvent); expect(stops).toEqual(['s']); expect(onUpdateData).toHaveBeenCalledWith('cd-1', { routes: [{ id: 'r2', subdomain: 'api' }], @@ -482,7 +482,7 @@ describe('SvgCustomDomainNode β€” delete row button', () => { }); const stops: string[] = []; const md = (findDeleteBtns(tree)[0].props as { onMouseDown: (e: React.MouseEvent) => void }).onMouseDown; - md({ stopPropagation: () => stops.push('m') } as React.MouseEvent); + md({ stopPropagation: () => stops.push('m') } as unknown as React.MouseEvent); expect(stops).toEqual(['m']); }); }); @@ -506,7 +506,7 @@ describe('SvgCustomDomainNode β€” add route button', () => { }); const stops: string[] = []; const onClick = (findAddBtn(tree)!.props as { onClick: (e: React.MouseEvent) => void }).onClick; - onClick({ stopPropagation: () => stops.push('s') } as React.MouseEvent); + onClick({ stopPropagation: () => stops.push('s') } as unknown as React.MouseEvent); expect(stops).toEqual(['s']); expect(onUpdateData).toHaveBeenCalledTimes(1); const call = onUpdateData.mock.calls[0][1] as { routes: Array<{ id: string; subdomain: string }> }; @@ -520,7 +520,7 @@ describe('SvgCustomDomainNode β€” add route button', () => { const onUpdateData = vi.fn(); const tree = renderCD({ node: makeNode({ data: {} }), onUpdateData }); const onClick = (findAddBtn(tree)!.props as { onClick: (e: React.MouseEvent) => void }).onClick; - onClick({ stopPropagation: () => {} } as React.MouseEvent); + onClick({ stopPropagation: () => {} } as unknown as React.MouseEvent); const call = onUpdateData.mock.calls[0][1] as { routes: Array<{ id: string }> }; expect(call.routes).toHaveLength(1); }); @@ -529,7 +529,7 @@ describe('SvgCustomDomainNode β€” add route button', () => { const tree = renderCD(); const stops: string[] = []; const md = (findAddBtn(tree)!.props as { onMouseDown: (e: React.MouseEvent) => void }).onMouseDown; - md({ stopPropagation: () => stops.push('m') } as React.MouseEvent); + md({ stopPropagation: () => stops.push('m') } as unknown as React.MouseEvent); expect(stops).toEqual(['m']); }); }); diff --git a/packages/ui/src/features/canvas/components/nodes/group-node/__tests__/index.test.tsx b/packages/ui/src/features/canvas/components/nodes/group-node/__tests__/index.test.tsx index a9537c1e..8c7e2c86 100644 --- a/packages/ui/src/features/canvas/components/nodes/group-node/__tests__/index.test.tsx +++ b/packages/ui/src/features/canvas/components/nodes/group-node/__tests__/index.test.tsx @@ -58,7 +58,7 @@ import type { CanvasNode } from '../../../svg-canvas'; const makeNode = (overrides: Partial = {}): CanvasNode => ({ id: 'g-1', - type: 'group', + type: 'container', x: 100, y: 200, width: 400, @@ -204,7 +204,7 @@ describe('SvgGroupNode β€” displayLabel truncation with isBlock fallback', () => lod: 3, isBlock: true, node: { - ...({} as Parameters[0]['node']), + ...({} as CanvasNode), id: 'b', type: 'block', x: 0, @@ -214,7 +214,7 @@ describe('SvgGroupNode β€” displayLabel truncation with isBlock fallback', () => label: '', data: {}, parentId: undefined, - } as Parameters[0]['node'], + } as CanvasNode, }); expect((tree.props as { displayLabel: string }).displayLabel).toBe('Block'); }); @@ -355,7 +355,7 @@ describe('SvgGroupNode β€” block dispatch (LOD3 + isBlock)', () => { }); const stops: string[] = []; const handler = (tree.props as { onToggleFold: (e: React.MouseEvent) => void }).onToggleFold; - handler({ stopPropagation: () => stops.push('s') } as React.MouseEvent); + handler({ stopPropagation: () => stops.push('s') } as unknown as React.MouseEvent); expect(stops).toEqual(['s']); expect(fold).toHaveBeenCalledWith('b-7'); }); @@ -363,7 +363,7 @@ describe('SvgGroupNode β€” block dispatch (LOD3 + isBlock)', () => { it('block onToggleFold no-op when onToggleFold prop undefined', () => { const tree = renderGN({ lod: 3, isBlock: true }); const handler = (tree.props as { onToggleFold: (e: React.MouseEvent) => void }).onToggleFold; - expect(() => handler({ stopPropagation: () => {} } as React.MouseEvent)).not.toThrow(); + expect(() => handler({ stopPropagation: () => {} } as unknown as React.MouseEvent)).not.toThrow(); }); }); @@ -443,7 +443,7 @@ describe('SvgGroupNode β€” group dispatch (LOD3, no isBlock)', () => { const stops: string[] = []; (tree.props as { onToggleFold: (e: React.MouseEvent) => void }).onToggleFold({ stopPropagation: () => stops.push('s'), - } as React.MouseEvent); + } as unknown as React.MouseEvent); expect(stops).toEqual(['s']); expect(fold).toHaveBeenCalled(); }); diff --git a/packages/ui/src/features/canvas/components/nodes/log-node/__tests__/copy-button.test.tsx b/packages/ui/src/features/canvas/components/nodes/log-node/__tests__/copy-button.test.tsx index f8078c64..68309a71 100644 --- a/packages/ui/src/features/canvas/components/nodes/log-node/__tests__/copy-button.test.tsx +++ b/packages/ui/src/features/canvas/components/nodes/log-node/__tests__/copy-button.test.tsx @@ -32,7 +32,7 @@ describe('CopyButton', () => { it('forwards onClick prop', () => { const click = vi.fn(); const tree = renderCB(click); - (tree.props as { onClick: (e: React.MouseEvent) => void }).onClick({} as React.MouseEvent); + (tree.props as { onClick: (e: React.MouseEvent) => void }).onClick({} as unknown as React.MouseEvent); expect(click).toHaveBeenCalledTimes(1); }); @@ -41,7 +41,7 @@ describe('CopyButton', () => { const stops: string[] = []; (tree.props as { onMouseDown: (e: React.MouseEvent) => void }).onMouseDown({ stopPropagation: () => stops.push('s'), - } as React.MouseEvent); + } as unknown as React.MouseEvent); expect(stops).toEqual(['s']); }); diff --git a/packages/ui/src/features/canvas/components/nodes/log-node/__tests__/index.test.tsx b/packages/ui/src/features/canvas/components/nodes/log-node/__tests__/index.test.tsx index 36536b5a..45863c17 100644 --- a/packages/ui/src/features/canvas/components/nodes/log-node/__tests__/index.test.tsx +++ b/packages/ui/src/features/canvas/components/nodes/log-node/__tests__/index.test.tsx @@ -409,7 +409,7 @@ describe('SvgLogNode β€” fold/copy/wheel handlers', () => { const stops: string[] = []; (header.props as { onToggleFold: (e: React.MouseEvent) => void }).onToggleFold({ stopPropagation: () => stops.push('s'), - } as React.MouseEvent); + } as unknown as React.MouseEvent); expect(stops).toEqual(['s']); expect(fold).toHaveBeenCalledWith('log-7'); // Folded slot 1 toggled. @@ -422,7 +422,7 @@ describe('SvgLogNode β€” fold/copy/wheel handlers', () => { expect(() => (header.props as { onToggleFold: (e: React.MouseEvent) => void }).onToggleFold({ stopPropagation: () => {}, - } as React.MouseEvent), + } as unknown as React.MouseEvent), ).not.toThrow(); }); @@ -454,7 +454,7 @@ describe('SvgLogNode β€” fold/copy/wheel handlers', () => { const header = findByType(tree, MockLogHeader)[0]; (header.props as { onCopyAll: (e: React.MouseEvent) => void }).onCopyAll({ stopPropagation: () => {}, - } as React.MouseEvent); + } as unknown as React.MouseEvent); expect(writes).toHaveLength(1); expect(writes[0]).toBe('12:34:56 [INFO] hello\n12:34:57 [ERROR] bye'); } finally { @@ -475,7 +475,7 @@ describe('SvgLogNode β€” fold/copy/wheel handlers', () => { expect(() => (header.props as { onCopyAll: (e: React.MouseEvent) => void }).onCopyAll({ stopPropagation: () => {}, - } as React.MouseEvent), + } as unknown as React.MouseEvent), ).not.toThrow(); } finally { Object.defineProperty(globalThis, 'navigator', { value: original, configurable: true, writable: true }); @@ -511,7 +511,7 @@ describe('SvgLogNode β€” fold/copy/wheel handlers', () => { ).onCopyLine; onCopyLine({ id: 'l1', timestamp: '12:34:56', level: 'info', message: 'hi' }, { stopPropagation: () => {}, - } as React.MouseEvent); + } as unknown as React.MouseEvent); expect(writes).toEqual(['12:34:56 [INFO] hi']); // Slot 4 is copiedLine. expect(mocks.state.stateSetters[4]).toHaveBeenCalledWith('l1'); diff --git a/packages/ui/src/features/canvas/components/nodes/log-node/__tests__/log-entry-row.test.tsx b/packages/ui/src/features/canvas/components/nodes/log-node/__tests__/log-entry-row.test.tsx index b967c5aa..adfd0ede 100644 --- a/packages/ui/src/features/canvas/components/nodes/log-node/__tests__/log-entry-row.test.tsx +++ b/packages/ui/src/features/canvas/components/nodes/log-node/__tests__/log-entry-row.test.tsx @@ -145,7 +145,7 @@ describe('LogEntryRow', () => { const click = vi.fn(); const log = mkLog(); const tree = renderRow({ log, onClick: click }); - const event = {} as React.MouseEvent; + const event = {} as unknown as React.MouseEvent; (tree.props as { onClick: (e: React.MouseEvent) => void }).onClick(event); expect(click).toHaveBeenCalledWith(log, event); }); diff --git a/packages/ui/src/features/canvas/components/nodes/region-label/__tests__/index.test.tsx b/packages/ui/src/features/canvas/components/nodes/region-label/__tests__/index.test.tsx index 4e472b30..a62f297d 100644 --- a/packages/ui/src/features/canvas/components/nodes/region-label/__tests__/index.test.tsx +++ b/packages/ui/src/features/canvas/components/nodes/region-label/__tests__/index.test.tsx @@ -52,7 +52,7 @@ const renderRegion = (node: CanvasNode): React.ReactElement => { const makeNode = (overrides: Partial = {}): CanvasNode => ({ id: 'rl-1', - type: 'region', + type: 'container', x: 50, y: 100, width: 500, diff --git a/packages/ui/src/features/canvas/components/nodes/reroute-node/index.tsx b/packages/ui/src/features/canvas/components/nodes/reroute-node/index.tsx index 340e2ee2..a548305b 100644 --- a/packages/ui/src/features/canvas/components/nodes/reroute-node/index.tsx +++ b/packages/ui/src/features/canvas/components/nodes/reroute-node/index.tsx @@ -23,7 +23,7 @@ import { ConnectionDragGlow } from '../_shared/connection-drag-glow'; import { TypedSockets } from '../_shared/typed-sockets'; import type { CanvasConnection } from '../../types'; import type { SvgCompactNodeProps } from '../compact-node/types'; -import type { SocketDef } from '@ice/types'; +import type { PortDef } from '@ice/types'; interface RerouteNodeProps extends SvgCompactNodeProps { /** All edges on the active card β€” used to derive the passthrough color. */ @@ -43,24 +43,22 @@ export const SvgRerouteNode: React.FC = memo( const category = findPassthroughCategory(node.id, allConnections) ?? 'traffic'; const color = CATEGORY_COLORS[category]; - const sockets: SocketDef[] = [ + const sockets: PortDef[] = [ { id: 'in', side: 'left', - category, + role: 'any', direction: 'in', label: 'Input', shape: 'circle', - multi: true, }, { id: 'out', side: 'right', - category, + role: 'any', direction: 'out', label: 'Output', shape: 'circle', - multi: true, }, ]; diff --git a/packages/ui/src/features/canvas/hooks/__tests__/use-canvas-validation.test.tsx b/packages/ui/src/features/canvas/hooks/__tests__/use-canvas-validation.test.tsx index 1c917f81..6bac5251 100644 --- a/packages/ui/src/features/canvas/hooks/__tests__/use-canvas-validation.test.tsx +++ b/packages/ui/src/features/canvas/hooks/__tests__/use-canvas-validation.test.tsx @@ -162,7 +162,7 @@ describe('useCanvasValidation β€” active card', () => { mount(); vi.advanceTimersByTime(500); expect(mocks.validateCanvas).toHaveBeenCalled(); - const [validatableNodes, validatableEdges, opts] = mocks.validateCanvas.mock.calls[0]; + const [validatableNodes, validatableEdges, opts] = mocks.validateCanvas.mock.calls[0] as unknown[]; expect(validatableNodes).toEqual([{ id: 'n1', type: 'block', data: { iceType: 'Compute' }, parentId: undefined }]); expect(validatableEdges).toEqual([{ id: 'e1', source: 'n1', target: 'n2', data: { relationship: 'connects_to' } }]); expect(opts).toMatchObject({ mode: 'design' }); @@ -175,7 +175,7 @@ describe('useCanvasValidation β€” active card', () => { mount(); vi.advanceTimersByTime(500); expect(mocks.validateCanvas).toHaveBeenCalled(); - const [, , opts] = mocks.validateCanvas.mock.calls[0]; + const [, , opts] = mocks.validateCanvas.mock.calls[0] as unknown[]; expect(opts).toMatchObject({ provider: 'gcp' }); }); }); diff --git a/packages/ui/src/features/canvas/hooks/__tests__/use-computing-flows.test.tsx b/packages/ui/src/features/canvas/hooks/__tests__/use-computing-flows.test.tsx index aaae261f..73510a84 100644 --- a/packages/ui/src/features/canvas/hooks/__tests__/use-computing-flows.test.tsx +++ b/packages/ui/src/features/canvas/hooks/__tests__/use-computing-flows.test.tsx @@ -20,8 +20,22 @@ const mocks = vi.hoisted(() => ({ state: {} as Record, dispatch: vi.fn(), selectActiveCard: vi.fn(() => null as unknown), - computeDerived: vi.fn(() => ({ nodePatches: [], edgePatches: [], edgeDeletions: [] })), - diffPatches: vi.fn(() => ({ nodePatches: [], edgePatches: [], edgeDeletions: [] })), + computeDerived: vi.fn( + (..._args: unknown[]) => + ({ nodePatches: [], edgePatches: [], edgeDeletions: [] }) as { + nodePatches: Array<{ nodeId: string; data: Record }>; + edgePatches: Array<{ edgeId: string; data: Record }>; + edgeDeletions: Array<{ edgeId: string }>; + }, + ), + diffPatches: vi.fn( + (..._args: unknown[]) => + ({ nodePatches: [], edgePatches: [], edgeDeletions: [] }) as { + nodePatches: Array<{ nodeId: string; data: Record }>; + edgePatches: Array<{ edgeId: string; data: Record }>; + edgeDeletions: Array<{ edgeId: string }>; + }, + ), updateCardNodeData: vi.fn((p: unknown) => ({ type: 'cards/updateCardNodeData', payload: p })), updateCardEdgeData: vi.fn((p: unknown) => ({ type: 'cards/updateCardEdgeData', payload: p })), deleteCardEdge: vi.fn((p: unknown) => ({ type: 'cards/deleteCardEdge', payload: p })), diff --git a/packages/ui/src/features/canvas/hooks/interactions/__tests__/use-mouse-handlers.test.ts b/packages/ui/src/features/canvas/hooks/interactions/__tests__/use-mouse-handlers.test.ts index d21a397e..a1765dd3 100644 --- a/packages/ui/src/features/canvas/hooks/interactions/__tests__/use-mouse-handlers.test.ts +++ b/packages/ui/src/features/canvas/hooks/interactions/__tests__/use-mouse-handlers.test.ts @@ -185,8 +185,6 @@ const setupHandlers = (opts: SetupOpts = {}) => { onDragOverGroup: pick('onDragOverGroup', onDragOverGroup), onDragEnd: pick('onDragEnd', onDragEnd), gridSize: opts.gridSize ?? 0, // default 0 = no snapping for clean assertions - minZoom: opts.minZoom ?? 0.1, - maxZoom: opts.maxZoom ?? 2, }); return { diff --git a/packages/ui/src/features/cost/hooks/__tests__/use-cost-calculation.test.tsx b/packages/ui/src/features/cost/hooks/__tests__/use-cost-calculation.test.tsx index e1b5ef0d..77650ee2 100644 --- a/packages/ui/src/features/cost/hooks/__tests__/use-cost-calculation.test.tsx +++ b/packages/ui/src/features/cost/hooks/__tests__/use-cost-calculation.test.tsx @@ -16,7 +16,7 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; const mocks = vi.hoisted(() => ({ // react-redux - selectorImpl: vi.fn(() => null as unknown), + selectorImpl: vi.fn((..._args: unknown[]) => null as unknown), // useState slot β€” resourceMap state resourceMapRef: { current: null as Map | null }, setResourceMapSpy: vi.fn(), diff --git a/packages/ui/src/features/deploy/components/__tests__/deploy-diagnosis.test.tsx b/packages/ui/src/features/deploy/components/__tests__/deploy-diagnosis.test.tsx index 479ba518..820b815d 100644 --- a/packages/ui/src/features/deploy/components/__tests__/deploy-diagnosis.test.tsx +++ b/packages/ui/src/features/deploy/components/__tests__/deploy-diagnosis.test.tsx @@ -14,7 +14,11 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; const mocks = vi.hoisted(() => ({ state: { deploy: { - diagnosis: { status: 'idle' as 'idle' | 'loading' | 'error' | 'loaded', result: null, error: null }, + diagnosis: { + status: 'idle' as 'idle' | 'loading' | 'error' | 'loaded', + result: null as null | { diagnosis: string; suggestedFixes: string[] }, + error: null as null | string, + }, provider: 'gcp', region: 'us-central1', }, @@ -151,7 +155,7 @@ function collectText(tree: unknown): string { return s; } -const flush = () => new Promise((resolve) => setImmediate(resolve)); +const flush = () => new Promise((resolve) => setTimeout(resolve, 0)); const render = (props: { error: string; diff --git a/packages/ui/src/features/deploy/components/__tests__/deploy-panel.test.tsx b/packages/ui/src/features/deploy/components/__tests__/deploy-panel.test.tsx index fa77159f..92368bf3 100644 --- a/packages/ui/src/features/deploy/components/__tests__/deploy-panel.test.tsx +++ b/packages/ui/src/features/deploy/components/__tests__/deploy-panel.test.tsx @@ -50,22 +50,22 @@ const mocks = vi.hoisted(() => ({ appendLog: vi.fn((p: unknown) => ({ type: 'deploy/appendLog', payload: p })), analyzePreDeploy: vi.fn(() => ({ warnings: [], hasCritical: false })), // Sub-component markers. - ApiErrorBanner: vi.fn(() => null), - DeployControls: vi.fn(() => null), - DeployDiagnosis: vi.fn(() => null), - DeployInFlightPanel: vi.fn(() => null), - DestroyConfirmModal: vi.fn(() => null), - PlanPreview: vi.fn(() => null), - PreDeployWarnings: vi.fn(() => null), - RequirementsSection: vi.fn(() => null), - ResultsSummary: vi.fn(() => null), - AuthBanner: vi.fn(() => null), - ConfigSection: vi.fn(() => null), - DeployedResourcesList: vi.fn(() => null), - DnsRecordsSection: vi.fn(() => null), - LogPanel: vi.fn(() => null), - StatusBadge: vi.fn(() => null), - PanelHeader: vi.fn(() => null), + ApiErrorBanner: vi.fn((..._args: unknown[]) => null), + DeployControls: vi.fn((..._args: unknown[]) => null), + DeployDiagnosis: vi.fn((..._args: unknown[]) => null), + DeployInFlightPanel: vi.fn((..._args: unknown[]) => null), + DestroyConfirmModal: vi.fn((..._args: unknown[]) => null), + PlanPreview: vi.fn((..._args: unknown[]) => null), + PreDeployWarnings: vi.fn((..._args: unknown[]) => null), + RequirementsSection: vi.fn((..._args: unknown[]) => null), + ResultsSummary: vi.fn((..._args: unknown[]) => null), + AuthBanner: vi.fn((..._args: unknown[]) => null), + ConfigSection: vi.fn((..._args: unknown[]) => null), + DeployedResourcesList: vi.fn((..._args: unknown[]) => null), + DnsRecordsSection: vi.fn((..._args: unknown[]) => null), + LogPanel: vi.fn((..._args: unknown[]) => null), + StatusBadge: vi.fn((..._args: unknown[]) => null), + PanelHeader: vi.fn((..._args: unknown[]) => null), // Hook returns. useDeployActions: vi.fn(() => ({ fetchRequirements: vi.fn(), diff --git a/packages/ui/src/features/deploy/components/__tests__/requirements-section.test.tsx b/packages/ui/src/features/deploy/components/__tests__/requirements-section.test.tsx index 359f46a6..5e99efd7 100644 --- a/packages/ui/src/features/deploy/components/__tests__/requirements-section.test.tsx +++ b/packages/ui/src/features/deploy/components/__tests__/requirements-section.test.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { describe, it, expect, vi, beforeEach } from 'vitest'; const mocks = vi.hoisted(() => ({ - DnsRecordCard: vi.fn(() => null), + DnsRecordCard: vi.fn((..._args: unknown[]) => null), })); vi.mock('../dns-record-card', () => ({ DnsRecordCard: mocks.DnsRecordCard })); diff --git a/packages/ui/src/features/deploy/components/__tests__/results-summary.test.tsx b/packages/ui/src/features/deploy/components/__tests__/results-summary.test.tsx index dd967830..08bdabaf 100644 --- a/packages/ui/src/features/deploy/components/__tests__/results-summary.test.tsx +++ b/packages/ui/src/features/deploy/components/__tests__/results-summary.test.tsx @@ -584,7 +584,7 @@ describe('ResultsSummary β€” URL click handlers', () => { })[0]; expect(valueSpan).toBeDefined(); const onClick = (valueSpan.props as { onClick: (e: React.MouseEvent) => void }).onClick; - onClick({ shiftKey: false } as React.MouseEvent); + onClick({ shiftKey: false } as unknown as React.MouseEvent); expect(mocks.openExternalUrl).toHaveBeenCalledWith('https://foo.example'); expect(mocks.writeText).not.toHaveBeenCalled(); }); @@ -598,7 +598,7 @@ describe('ResultsSummary β€” URL click handlers', () => { return typeof title === 'string' && title.startsWith('Click to open Β· Shift+click to copy: '); })[0]; const onClick = (valueSpan.props as { onClick: (e: React.MouseEvent) => void }).onClick; - onClick({ shiftKey: true } as React.MouseEvent); + onClick({ shiftKey: true } as unknown as React.MouseEvent); expect(mocks.writeText).toHaveBeenCalledWith('https://foo.example'); expect(mocks.openExternalUrl).not.toHaveBeenCalled(); }); @@ -613,7 +613,7 @@ describe('ResultsSummary β€” URL click handlers', () => { })[0]; expect(valueSpan).toBeDefined(); const onClick = (valueSpan.props as { onClick: (e: React.MouseEvent) => void }).onClick; - onClick({ shiftKey: false } as React.MouseEvent); + onClick({ shiftKey: false } as unknown as React.MouseEvent); expect(mocks.writeText).toHaveBeenCalledWith('gs://my-bucket'); expect(mocks.openExternalUrl).not.toHaveBeenCalled(); }); @@ -739,13 +739,13 @@ describe('ResultsSummary β€” default_url row', () => { mocks.openExternalUrl.mockClear(); mocks.writeText.mockClear(); - onClick({ shiftKey: false } as React.MouseEvent); + onClick({ shiftKey: false } as unknown as React.MouseEvent); expect(mocks.openExternalUrl).toHaveBeenCalledWith('https://default.example'); expect(mocks.writeText).not.toHaveBeenCalled(); mocks.openExternalUrl.mockClear(); mocks.writeText.mockClear(); - onClick({ shiftKey: true } as React.MouseEvent); + onClick({ shiftKey: true } as unknown as React.MouseEvent); expect(mocks.writeText).toHaveBeenCalledWith('https://default.example'); expect(mocks.openExternalUrl).not.toHaveBeenCalled(); }); diff --git a/packages/ui/src/features/palette/components/__tests__/folder-row.test.tsx b/packages/ui/src/features/palette/components/__tests__/folder-row.test.tsx index c75271d4..ef4f9094 100644 --- a/packages/ui/src/features/palette/components/__tests__/folder-row.test.tsx +++ b/packages/ui/src/features/palette/components/__tests__/folder-row.test.tsx @@ -219,7 +219,7 @@ describe('FolderRow β€” header click + context menu', () => { const onContextMenu = vi.fn(); const tree = render({ onContextMenu }); const header = getHeaderRow(tree); - const ev = {} as React.MouseEvent; + const ev = {} as unknown as React.MouseEvent; (header.props.onContextMenu as (e: React.MouseEvent) => void)(ev); expect(onContextMenu).toHaveBeenCalledWith(ev, 'folder', 'f-root'); }); diff --git a/packages/ui/src/features/palette/components/__tests__/project-tree-branches.test.tsx b/packages/ui/src/features/palette/components/__tests__/project-tree-branches.test.tsx index c5f7111d..65b04a5a 100644 --- a/packages/ui/src/features/palette/components/__tests__/project-tree-branches.test.tsx +++ b/packages/ui/src/features/palette/components/__tests__/project-tree-branches.test.tsx @@ -452,7 +452,7 @@ describe('ProjectTree β€” tree container drag/drop wiring', () => { el.props.className.includes('flex-1 overflow-y-auto overflow-x-hidden'), ); const event = {}; - (container!.props.onDragOver as (e: unknown, parent: unknown) => void)(event); + (container!.props.onDragOver as (e: unknown, parent: unknown) => void)(event, null); expect(mocks.useTreeDragRet.handleDragOver).toHaveBeenCalledWith(event, null); }); @@ -476,7 +476,7 @@ describe('ProjectTree β€” tree container drag/drop wiring', () => { el.props.className.includes('flex-1 overflow-y-auto overflow-x-hidden'), ); const event = {}; - (container!.props.onDrop as (e: unknown, parent: unknown) => void)(event); + (container!.props.onDrop as (e: unknown, parent: unknown) => void)(event, null); expect(mocks.useTreeDragRet.handleDrop).toHaveBeenCalledWith(event, null); }); }); diff --git a/packages/ui/src/features/templates/components/__tests__/template-picker.test.tsx b/packages/ui/src/features/templates/components/__tests__/template-picker.test.tsx index d954899c..45936260 100644 --- a/packages/ui/src/features/templates/components/__tests__/template-picker.test.tsx +++ b/packages/ui/src/features/templates/components/__tests__/template-picker.test.tsx @@ -51,7 +51,7 @@ const mocks = vi.hoisted(() => { state: { ui: { splitView: { activePaneId: 'pane-1' } } }, dispatch: vi.fn(), searchSpy: vi.fn(), - expandSpy: vi.fn(() => ({ nodes: [{ id: 'n1' }], edges: [] })), + expandSpy: vi.fn((..._args: unknown[]) => ({ nodes: [{ id: 'n1' }], edges: [] })), createCardSpy: vi.fn((arg: unknown) => ({ type: 'cards/create', payload: arg })), importToActiveCardSpy: vi.fn((arg: unknown) => ({ type: 'cards/import', payload: arg })), openTabInPaneSpy: vi.fn((arg: unknown) => ({ type: 'ui/openTab', payload: arg })), diff --git a/packages/ui/src/features/wizard/hooks/__tests__/use-wizard-state.test.ts b/packages/ui/src/features/wizard/hooks/__tests__/use-wizard-state.test.ts index 27ba7b46..4e4fb8af 100644 --- a/packages/ui/src/features/wizard/hooks/__tests__/use-wizard-state.test.ts +++ b/packages/ui/src/features/wizard/hooks/__tests__/use-wizard-state.test.ts @@ -233,7 +233,9 @@ describe('useWizardState β€” step 2 setters', () => { it('applyEnvironmentPresets enables matching presets and disables others', () => { const out = useWizardState(); - out.applyEnvironmentPresets([{ type: 'production', region: 'eu-west1', securityLevel: 'strict' }]); + out.applyEnvironmentPresets([ + { type: 'production', name: 'production', region: 'eu-west1', securityLevel: 'strict' }, + ]); const next = driveReducer({ step: 2, projectName: '', diff --git a/packages/ui/src/shared/api/__tests__/axios-instance.test.ts b/packages/ui/src/shared/api/__tests__/axios-instance.test.ts index 1c286487..4e9e50f6 100644 --- a/packages/ui/src/shared/api/__tests__/axios-instance.test.ts +++ b/packages/ui/src/shared/api/__tests__/axios-instance.test.ts @@ -53,7 +53,7 @@ const mockInstance = { }, }; -const createSpy = vi.fn(() => mockInstance); +const createSpy = vi.fn((..._args: unknown[]) => mockInstance); vi.mock('axios', () => ({ default: { create: (...a: unknown[]) => createSpy(...(a as [])) }, diff --git a/packages/ui/src/shared/components/__tests__/inline-table-view.test.tsx b/packages/ui/src/shared/components/__tests__/inline-table-view.test.tsx index 5e9d96d6..9fadd3ac 100644 --- a/packages/ui/src/shared/components/__tests__/inline-table-view.test.tsx +++ b/packages/ui/src/shared/components/__tests__/inline-table-view.test.tsx @@ -32,12 +32,12 @@ const mocks = vi.hoisted(() => ({ navigate: vi.fn(), pathname: '/projects/p1/canvas/table', // Sub-components β€” markers. - Toolbar: vi.fn(() => null), - ColumnHeader: vi.fn(() => null), - TableBody: vi.fn(() => null), - TableFooter: vi.fn(() => null), + Toolbar: vi.fn((..._args: unknown[]) => null), + ColumnHeader: vi.fn((..._args: unknown[]) => null), + TableBody: vi.fn((..._args: unknown[]) => null), + TableFooter: vi.fn((..._args: unknown[]) => null), // useTableRows mock. - useTableRows: vi.fn(() => ({ + useTableRows: vi.fn((..._args: unknown[]) => ({ rows: [{ node: { id: 'n1' }, label: 'A' }], sorted: [{ node: { id: 'n1' }, label: 'A' }], grouped: [], @@ -134,7 +134,7 @@ function* walk(node: unknown): Generator { } if (!isEl(node)) return; yield node; - if (KNOWN_MOCKS.includes(node.type as ReturnType)) { + if ((KNOWN_MOCKS as unknown[]).includes(node.type)) { yield* walk(node.props.children); return; } @@ -354,7 +354,7 @@ describe('InlineTableView β€” TableBody wiring', () => { onSelectRow: (id: string, e: React.MouseEvent) => void; } ).onSelectRow; - onSelect('n1', { metaKey: false, ctrlKey: false } as React.MouseEvent); + onSelect('n1', { metaKey: false, ctrlKey: false } as unknown as React.MouseEvent); expect(mocks.setSelectedNodes).toHaveBeenCalledWith(['n1']); // showProperties=false so toggleProperties is dispatched. expect(mocks.toggleProperties).toHaveBeenCalled(); @@ -369,7 +369,7 @@ describe('InlineTableView β€” TableBody wiring', () => { onSelectRow: (id: string, e: React.MouseEvent) => void; } ).onSelectRow; - onSelect('n1', { metaKey: true } as React.MouseEvent); + onSelect('n1', { metaKey: true } as unknown as React.MouseEvent); expect(mocks.setSelectedNodes).toHaveBeenCalledWith(['n1']); }); @@ -382,7 +382,7 @@ describe('InlineTableView β€” TableBody wiring', () => { onSelectRow: (id: string, e: React.MouseEvent) => void; } ).onSelectRow; - onSelect('n1', { ctrlKey: true } as React.MouseEvent); + onSelect('n1', { ctrlKey: true } as unknown as React.MouseEvent); expect(mocks.setSelectedNodes).toHaveBeenCalledWith(['n2']); }); @@ -392,7 +392,7 @@ describe('InlineTableView β€” TableBody wiring', () => { const body = findFirst(tree, (el) => el.type === mocks.TableBody)!; (body.props as { onSelectRow: (id: string, e: React.MouseEvent) => void }).onSelectRow('n1', { metaKey: false, - } as React.MouseEvent); + } as unknown as React.MouseEvent); expect(mocks.toggleProperties).not.toHaveBeenCalled(); }); diff --git a/packages/ui/src/store/__tests__/index.test.ts b/packages/ui/src/store/__tests__/index.test.ts index e7f644d1..2d230a54 100644 --- a/packages/ui/src/store/__tests__/index.test.ts +++ b/packages/ui/src/store/__tests__/index.test.ts @@ -388,7 +388,7 @@ describe('store β€” defensive branches in card persistence', () => { } expect(mocks.graphSave).toHaveBeenCalledTimes(1); // Resolve the first to clean up - resolveFirst?.(); + (resolveFirst as (() => void) | null)?.(); for (let i = 0; i < 5; i++) { await Promise.resolve(); } diff --git a/packages/web/src/pages/__tests__/invite-accept.test.tsx b/packages/web/src/pages/__tests__/invite-accept.test.tsx index 3a3976e0..7c6d47f3 100644 --- a/packages/web/src/pages/__tests__/invite-accept.test.tsx +++ b/packages/web/src/pages/__tests__/invite-accept.test.tsx @@ -27,7 +27,7 @@ const mocks = vi.hoisted(() => { }, token: 'tk-1' as string | undefined, navigate: vi.fn(), - isAuthenticated: vi.fn(() => true), + isAuthenticated: vi.fn((..._args: unknown[]) => true), axiosPost: vi.fn(), }; }); diff --git a/state/archive/.gitkeep b/state/archive/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/state/archive/learnings-2026-Q2.md b/state/archive/learnings-2026-Q2.md deleted file mode 100644 index b6082320..00000000 --- a/state/archive/learnings-2026-Q2.md +++ /dev/null @@ -1,1654 +0,0 @@ -# Learnings - -Append-only. Each entry has a kebab-case `##` anchor, a `_Discovered_` line, and one paragraph. - -**Rules** - -- New learnings: append. Never edit past entries. -- The one allowed edit to a past entry is appending a `_Promoted to: /docs/_` line once the learning has stabilized β€” cited 3+ times, or generalizes beyond one unit β€” and has been written up in `/docs`. -- To supersede or contradict a past learning, append a new entry that references the old anchor. - ---- - -## read-state-first - -_Discovered: 2026-04-27 by orchestrator in unit setup_ - -Every agent reads `.claude/state/decisions.md` and `.claude/state/learnings.md` before acting on a brief. Without this, agents redo investigations the rest of the workflow has already settled, miss explicit decisions about how to approach a class of problem, and rediscover the same gotchas the critic flagged last week. Reading state is the cheapest step in the loop and the highest-leverage; skip it and the rest of the loop wastes effort. - -## destroy-needs-terminal-state - -_Discovered: 2026-04-27 by orchestrator in deploy-panel destroy fix_ - -The destroy onConfirm handler used to dispatch `appendLog(...)` then `resetDeploy()` in the same tick. `resetDeploy` wipes `state.logs` and sets status to `'idle'`, so a fast destroy looked silently inert β€” "Destroy button does nothing" was a real perception bug, not a wiring issue. Fix: introduced a dedicated `destroyed` `DeployStatus` and a `destroySuccess` reducer that flips to that state and pushes a final summary log line. The UI's existing Clear button (which calls `resetDeploy`) lets the user dismiss the log when ready. Generalizes: any terminal-state action that clears its own log produces an indistinguishable-from-failure UX; always land on a non-idle status long enough for the human to see what happened. - -## one-status-source-deploy-status - -_Discovered: 2026-04-27 by orchestrator in compact-node status unification_ - -The compact-node status pill used to read `(data.deploy_status as string) || (data.status as string) || ''`. That double-source was the reason "blocks still showed Active after destroy": `clearCardDeployOverlay` correctly wipes `deploy_status`, but `data.status` was seeded `'active'` by templates, blueprints, the WAF block defaults, group/node creation in svg-canvas and cards-slice, and the drift checker β€” none of those reflect actual deploy state. Fix: drop the legacy fallback in `compact-node/index.tsx` so `deploy_status` is the only source, and stop seeding `status: 'active'` at every node-creation site (templates/expand-template, blocks/expand-blueprint, blocks/{aws,azure,gcp}/security/waf, svg-canvas drop handlers, cards-slice group creation). Leaves any existing card data carrying stale `data.status: 'active'` ignored at render time β€” no migration needed because the field is no longer read by the canvas. Generalizes: when two parallel state fields exist for the same UX concept, the fallback turns one of them into the de-facto source no matter how careful the writer side is. Pick one and delete the others. - -## svg-canvas-isLogNode-precedes-renderer-map - -_Discovered: 2026-04-27 by implementer in LT-1-consolidate-icetypes_ - -`svg-canvas.tsx`'s dispatcher loop has two parallel routing layers for the same iceType: an early `isLogNode` short-circuit (line ~2715) that hands off to `SvgLogNode` directly, AND a per-iceType `CONCEPT_NODE_RENDERERS` map (line ~135) consulted later in the `isBlock`/resource-fallback branches. The short-circuit always wins. So when LT-1 added `Monitoring.Log` to `isLogNode`, the existing `'Monitoring.Log': SvgObservabilityNode` entry in the map was instantly dead code β€” never reached at runtime, but visually misleading to any future reader who would assume the map drives the render. Fix: when widening the `isLogNode` check, also remove the dead map entry (and its now-unused import) so there's one source of truth for the iceTypeβ†’component mapping. Generalizes: any iceType that's special-cased in an early branch of a dispatcher should NOT also live in the catch-all map for the same dispatcher β€” it's an invitation to subtle behavior splits later. - -The iceType set that _counts as_ a log node is also duplicated across at least three sites: `packages/blocks/src/expand-blueprint.ts:173` (the helper that hardcodes the canvas-emit list of "log-shaped" iceTypes), `packages/ui/src/features/canvas/components/svg-canvas.tsx:2634-2637` (the `isLogNode` dispatcher short-circuit), and `packages/core/src/importers/gcp/type-mapper.ts:87` (the importer's `Monitoring.LogGroup` mismatch). Adding a new log-shaped iceType requires touching all three. LT-5 should export a single shared `LOG_ICE_TYPES` set from `@ice/constants` and have all three sites consume it β€” same medicine as `one-status-source-deploy-status`: pick one source of truth and delete the parallels. - -## data-version-bump-migrates-not-wipes - -_Discovered: 2026-04-27 by critic in LT-1-consolidate-icetypes review_ - -The cards-slice load path treats a version bump as cause to wipe `localStorage` and start fresh, then runs `migrateCardNodes` only on already-current-version payloads. Result: a v5 β†’ v6 bump deletes the user's canvas instead of migrating the iceTypes the bump was added to migrate. The migrator function exists but is unreachable on the transition it was written for. Same shape recurs anywhere a versioned-payload loader has both "version mismatch β†’ reset" and "migrate fields" branches but routes the bumped version through reset. Additionally: any reducer that accepts a payload of nodes/edges from outside the slice (`importToActiveCard`, `addToActiveCard`, `addNodeToCard`) is its own load path and must run the same migration pipeline β€” version-keyed localStorage is only one ingestion route; backend-saved canvases, AI tool-use writes, and clipboard imports all bypass it. Generalizes: when bumping a persisted-data version, write the migration as a pure function over the payload and call it from every ingestion site, not just from the localStorage loader. - -## deploy-service-package-name-is-service-deploy - -_Discovered: 2026-04-27 by implementer in LT-2-filter-resolver_ - -The deploy service's `package.json` name is `@ice/service-deploy`, NOT `@ice/deploy` β€” every other "service" package in `services/*` follows the `@ice/service-` convention (`@ice/service-credentials`, etc.) but briefs and human shorthand sometimes call it `@ice/deploy`. Running `pnpm --filter @ice/deploy typecheck` silently no-ops (filter matches zero packages, exit 0) instead of erroring, so a wrong filter LOOKS green. Always verify the filter target exists by reading `services//package.json` before trusting a typecheck pass. Generalizes: any pnpm `--filter` against a non-existent name is a silent success; `pnpm -r typecheck` from the repo root is a safer fallback when the package name is uncertain. - -## google-cloud-logging-getentries-not-entries-list - -_Discovered: 2026-04-27 by implementer in LT-3-log-stream-service_ - -The brief talked about `entries.list({...})` and `tailLogEntries({...})` per the Cloud Logging REST API names, but the `@google-cloud/logging` Node SDK's surface is `Logging.getEntries(opts)` (returns `Promise<[Entry[], ...]>`) and `Logging.tailEntries(opts)` (returns a Duplex). Each `Entry` carries envelope fields under `entry.metadata` (`timestamp`, `insertId`, `severity`, `resource`) and the payload under `entry.data` (string for textPayload, object for jsonPayload β€” `JSON.stringify` it). `tailEntries`'s `data` event delivers a `TailEntriesResponse` with an `entries: Entry[]` array, not a single Entry. Don't try to map the REST shape onto the SDK shape one-to-one β€” read the SDK's `.d.ts` first. Also: the IAM probe in tests inflates the `getEntries` call counter by one, which means a test asserting "call N is the second poll" is off by one if it doesn't account for the probe. Make the probe an explicit early branch in test mocks (`if (call === 1) return [[]]`). - -## google-cloud-logging-loaded-via-load-sdk-from-core - -_Discovered: 2026-04-27 by implementer in LT-3-log-stream-service_ - -`@google-cloud/logging` is declared in `packages/core/package.json` and loaded at runtime via the dynamic-import wrapper `load_sdk(module_name)` in `packages/core/src/deploy/providers/gcp/sdk-loader.ts`. The deploy service does NOT have it as a direct dependency β€” `services/deploy/node_modules/@google-cloud/` contains nothing. Trying to `import { Logging } from '@google-cloud/logging'` from the deploy service would fail at TypeScript resolution. The right path: re-export `load_sdk` from `packages/core/src/deploy/index.ts` (so `import('@ice/core')` exposes it), then `(await core.load_sdk('@google-cloud/logging')).Logging` to construct the client. Generalizes: any GCP SDK referenced from a service outside `packages/core` should go through `load_sdk`, not a direct import β€” keeps the SDK lazy (so missing optional deps don't break startup) and avoids each service repeating the dependency declaration. - -## auth-derived-orgid-must-not-trust-body - -_Discovered: 2026-04-27 by implementer in LT-4-routes-and-socket_ - -The LT-3 `subscribe()` signature takes `organisationId` as a required field on `SubscribeArgs`, which is fine for the service but a footgun for any HTTP route in front of it: if the route just spreads `req.body` into the call, a client can spoof `organisationId: 'evil'` in the JSON body and route the credential lookup (`providerService.getDecryptedCredentials(organisationId, 'gcp')`) to a different tenant's GCP project. The mitigation is mechanical but non-obvious: in the route, build the args object explicitly with `{ ...validatedBody, organisationId: req.organisationId }` AFTER body validation, so the auth-derived value always wins regardless of what the body carried. I added a dedicated test (case #5 in `services/deploy/src/routes/__tests__/logs.test.ts`) that POSTs `{ ...validBody, organisationId: 'evil' }` and asserts the mock receives `'org-real'`. Generalizes: any service-layer function whose argument record happens to mix client-controlled fields and auth-derived fields needs an explicit assembly step at the route boundary β€” never trust `...req.body` to compose the args object directly. - -## supertest-not-in-monorepo-use-fetch-against-app-listen - -_Discovered: 2026-04-27 by implementer in LT-4-routes-and-socket_ - -The deploy service has zero supertest in its package.json (and so does `@ice/shared`); the only existing route test pattern in the repo is service-level direct function calls (`services/canvas/src/__tests__/org-isolation.int.test.ts` explicitly says "to avoid external dependencies like supertest"). For HTTP-level tests of an Express router, the working pattern is: `express()` + `app.use('/path', router)` + `app.listen(0, '127.0.0.1', ...)` (port 0 = ephemeral), capture `server.address().port`, then `fetch(\`http://127.0.0.1:${port}\`)` from the test. Node 22's built-in `fetch` plus `http.Server` is enough β€” no extra deps. Cleanup goes in `afterEach` via `server.close(...)`. Generalizes: don't add supertest when fetch + a real listen does the same job in 5 fewer lines and one fewer dependency. - -## frontend-cannot-import-from-services - -_Discovered: 2026-04-27 by implementer in LT-5-frontend-wiring_ - -The frontend (packages/ui) cannot import types from services/ β€” the workspace topology has no path from `@ice/ui` to `@ice/service-deploy`, and even adding one would couple the renderer to a server-only package. For shared API contracts (request/response shapes, socket payloads), there are exactly three viable homes: (a) inline-mirror in the slice that consumes them (cheap, accept the drift risk), (b) lift to `packages/types/src/.ts` and import from both sides (canonical for cross-package types), or (c) keep two parallel definitions with a runtime decode/validate at the boundary. For LT-5 I chose (a) because the LogEntry/SourceResolution shapes only have one frontend consumer (logs-slice) and the drift would surface immediately as a runtime failure in the hook β€” a malformed entry from the socket would fail the `typeof entry.insertId !== 'string'` defense in `appendEntry` and quietly drop. If a third consumer appears (LT-6 properties panel? a backend-to-backend log pipe?), promote to `packages/types/src/logs.ts` and delete the mirror. Generalizes: when a service-only type needs to cross into the renderer, the choice between (a) and (b) is purely about how many consumers exist now β€” one consumer is mirror, two+ is promote. - -## socket-room-and-http-lifecycle-are-two-cleanups - -_Discovered: 2026-04-27 by implementer in LT-5-frontend-wiring_ - -The Log Terminal subscription has TWO independent server-side resources that must be released on unmount: the Socket.IO room membership (released by `socket.emit('unsubscribe:logs', terminalNodeId)`) AND the polling/tail loop opened by the HTTP `/subscribe` call (released by HTTP `/unsubscribe { subscriptionId }`). Skipping either leaks: skipping the room emit leaves the client receiving events for a torn-down stream (memory leak in handler closures); skipping the HTTP unsubscribe leaks a 60s polling loop hammering Cloud Logging quota. The cleanup order in the hook is: stop listeners β†’ leave room β†’ POST unsubscribe β†’ dispatch teardown. There's also a third edge case: the user unmounts WHILE the initial `/subscribe` POST is still in flight. The naive `cancelled` flag isn't enough β€” the request still completes and creates a server-side stream that never gets closed. Fix: in the cancelled branch of the await, fire a best-effort `unsubscribe(result.subscriptionId)` to release the just-opened stream we never used. Generalizes: any hook that spans HTTP-init + socket-room needs cleanup symmetry on BOTH paths AND a path for "init returned after we already cancelled". - -## properties-panel-section-nodeId-vs-selectedNode-prop-shape - -_Discovered: 2026-04-27 by implementer in LT-6-properties-section_ - -The properties-panel.tsx per-iceType branches (`Config.Environment`, `Network.PrivateNetwork`, `Network.CustomDomain`, etc.) thread `selectedNode={...}` plus an `updateNodeField(field, value)` callback into the inline panel components, leaning on the closure's `selectedNodeId`. `MonitoringLogSection` instead takes a single `nodeId: string` prop and re-resolves both the cards slice (via `selectActiveCard`) and the logs slice (via `selectLogStream(state, nodeId)`) through Redux, dispatching `updateCardNodeData({ nodeId, data })` directly. The reason: it's the first per-iceType section that reads from a slice OTHER than `cards`, so funneling everything through `updateNodeField` (which targets the panel's selected nodeId) would couple the section to selection state instead of the explicit prop. The relevant action is `updateCardNodeData` at `packages/ui/src/store/slices/cards-slice.ts:583`, signature `({ nodeId: string; data: Record })` β€” it shallow-merges `data` into the existing `node.data`, which is exactly what we want. Generalizes: when adding a per-iceType section that reads outside the cards slice, prefer the `nodeId` prop shape; sections that only mutate `cards` can keep the `selectedNode + updateNodeField` shape. - -## ux-log-terminal-live-indicator-decoupled-from-status - -_Discovered: 2026-04-27 by ux-tester in LT-9-ux-test_ - -The `LogHeader` in `packages/ui/src/features/canvas/components/nodes/log-node/log-header.tsx` renders a green pulsing dot + "LIVE" badge whose `LiveIndicator` only reads the local `isAutoScroll` state β€” never the `status` from `useLogStream`. So pre-deploy (status `pre-deploy`, placeholder row reading "Deploy this environment to start streaming logs.") the on-canvas header still says "LIVE", and so does the header during `connecting` / `error` / `permission-denied`. The two parts of the same block disagree: header says we're streaming, body says we aren't. The `MonitoringLogSection` properties pill is correct ("Pre-deploy" / "Connecting" / "Error" pills with the right tones), but the canvas-side header is misleading. Fix: pass `status` from `useLogStream` into `LogHeader` and let `LiveIndicator` map it to LIVE / CONNECTING / PAUSED / ERROR, the same way the properties pill does. Generalizes: when a single block has two surfaces showing the same conceptual state (canvas header, properties pill), they must read from the same source β€” otherwise one of them lies. - -## ux-log-stream-cardhash-misses-data-changes - -_Discovered: 2026-04-27 by ux-tester in LT-9-ux-test_ - -The store-level persistence subscriber in `packages/ui/src/store/index.ts:80-87` computes a `cardHash(card)` over `id, n.length, e.length, n[0].id, n[n.length-1].id, n[n.length-1].position.x` and skips the localStorage write when the hash is unchanged. A `streamingMode` (or any `node.data.*`) flip via `updateCardNodeData` doesn't change any of those, so it never persists to localStorage β€” Redux holds the new value (and the radio reflects it on re-select), but a page reload restores the old value. The same shape would hit any future per-node setting that lives entirely in `node.data`: source override, retention overrides, AI tool-use writes that only touch `data`. Fix options: (a) include a stable hash of `node.data` in `cardHash`, (b) drop the hash skip and rely on the 2s debounce, (c) explicit "writes that need persistence" tag on actions. Generalizes: a content-hash skip that excludes a mutation surface is a silent data-loss path β€” the bug is invisible until the user reloads. - -## ux-log-stream-unsubscribe-missing-projectid - -_Discovered: 2026-04-27 by ux-tester in LT-9-ux-test_ - -The frontend's `api.logs.unsubscribe(subscriptionId)` (in `packages/ui/src/shared/api/http-api-adapter.ts:482`) POSTs `{ subscriptionId }` to `/api/canvas/logs/unsubscribe`. The route is `requireProjectAccess('viewer')`-guarded (`services/deploy/src/routes/logs.ts:110`), and the middleware in `packages/shared/src/auth/middleware.ts:85-100` requires `projectId` (or a resolvable `cardId`) in body / params / query β€” neither is present. Result: every unsubscribe call returns 400 ("projectId is required"), and the server-side polling/tail loop is never released. Visible in the browser console on every block deselect / mode toggle / unmount. Direct contradiction of the LT-5 `socket-room-and-http-lifecycle-are-two-cleanups` learning: the cleanup symmetry only works if both legs ACTUALLY succeed at the route. Fix: include `projectId` (or `cardId`) on the unsubscribe payload, both client-side and in the route's validation schema. Generalizes: when a route guard demands a tenant identifier, every client of that route β€” including teardown / cleanup paths β€” needs to carry it. Cleanup endpoints are still authenticated endpoints. - -## ux-log-terminal-canvas-affordances-on-hover - -_Discovered: 2026-04-27 by ux-tester in LT-9-ux-test_ - -The on-canvas Log block renders a Fold button (always visible) and a Copy button (visible on hover) inside its header. The `feedback_no_canvas_inputs` rule says canvas blocks are read-only displays with editing in the properties panel; these two buttons are arguably chrome (they manipulate local view state, not node data) but they are interactive affordances on the canvas that show on hover, which the rule's "no input affordances appear" wording can be read to forbid. Recommend codifying the rule with a "view chrome OK / data inputs not OK" carve-out, since the alternative β€” moving Fold and Copy-all into the properties panel β€” would feel awkward (Fold is a per-block view-state toggle that's most discoverable on the block itself). Generalizes: rules about "no inputs on the canvas" probably want a finer split between data inputs and view chrome before they cover the next ICE block class. - -## ux-log-resumed-event-overrides-pre-deploy - -_Discovered: 2026-04-27 by ux-tester in LT-9-ux-reverify_ - -The V4 fix (do not show "Live" pre-deploy) is intact for the `appendEntry` reducer β€” it correctly only promotes `connecting β†’ streaming` on first real entry. But the `logs:resumed` socket-event handler in `useLogStream` calls `dispatch(setStatus({ status: 'streaming' }))` unconditionally, and the `setStatus` reducer in `logs-slice.ts:128-132` doesn't check `slot.source?.state` before assigning. So when the backend's tail-reconnect retry fires (which it does even when the SDK isn't loaded β€” `loggingClient.tailEntries` throws null-deref β†’ catch emits recoverable `logs:error` β†’ `scheduleTailReconnect` retries β†’ emits `logs:resumed`), the slot status is force-flipped to `'streaming'` and both the canvas badge and the properties pill show "Live"/"LIVE" even though `source.state === 'pre-deploy'` and `entries.length === 0`. The slot from a real reproduction reads `{ status: 'streaming', source: { state: 'pre-deploy', ... }, entries: [], lastError: "Cannot read properties of null (reading 'tailEntries')" }` β€” perfect contradiction inside one slot. Fix: either (a) gate `setStatus`/`onResumed` on the same "only promote from connecting" check that `appendEntry` uses, or (b) gate `logs:resumed` server-side so it only emits after a successful entry (tighter contract: "resumed" should mean "we got entries flowing again", not "we managed to retry the failed call"). The promotion path must require evidence of a live stream β€” a retried failure isn't evidence. Generalizes: any "promote to terminal-success" reducer must check the same precondition the original promotion did, otherwise side-channel events become a back door around the gate. - -## ux-log-stream-subscribe-thrash-on-mount - -_Discovered: 2026-04-27 by ux-tester in LT-9-ux-reverify_ - -While re-verifying V1 (unsubscribe 204 fix), the network panel showed the App Logs block firing roughly 12 subscribeβ†’unsubscribe pairs within the 2-second observation window after a single user click (still ramping after the click). All POSTs are well-formed and return correct codes β€” the V1 fix is intact β€” but the volume is excessive: the `useEffect` in `use-log-stream.ts:84-206` re-runs on every change to `[cardId, environmentId, terminalNodeId, mode, sourceNodeIdOverride, dispatch]`, and one of those (almost certainly `sourceNodeIdOverride` derived from a non-memoized `node.data` read) is producing a fresh reference on every render of `SvgLogNode`. Each re-run cancels the in-flight subscribe via `cancelled = true` and the cleanup-time `unsubscribe(result.subscriptionId, cardId)` best-effort fire. Server quota and Cloud Logging billing are hit harder than necessary, and the canvas log header flickers status during the churn. The V1 cleanup-symmetry fix masks the cost (every torn-down subscription is properly closed), but doesn't solve the underlying re-run thrash. Fix: either (a) read `streamingMode` and `sourceNodeIdOverride` via memoized selectors that return primitive values, or (b) split the effect's deps into a stable id-tuple plus a separately-tracked options object that's compared by value. Generalizes: a useEffect with object-shape deps in a hot canvas-render path will silently DDoS its own backend; effect deps should be primitives or stable references, never values lifted out of a Redux node-data blob without memoization. - -## use-selector-primitive-projection-vs-derived - -_Discovered: 2026-04-27 by implementer in LT-9-bugfix-2_ - -When a hook's `useEffect` dep is "derived from a Redux blob" (e.g. `node.data.streamingMode`), do the projection INSIDE `useSelector`, not OUTSIDE it. With one selector that returns the parent `node` object and a downstream `const mode = node?.data?.streamingMode`, every cards-slice publish forces the consumer component to re-render (Object.is on the parent fails) β€” and during init, transient hydration cycles can briefly hand back a non-primitive shape that DOES change deps. Doing `const mode = useSelector(s => ((s.cards.cards.find(...)?.nodes.find(...)?.data?.streamingMode) ?? 'polling'))` gives `useSelector` the chance to short-circuit re-renders when the projected primitive is unchanged, and guarantees the effect's deps array sees Object.is-stable values. Co-located: if you accept "any non-string" via type assertion (`as string | undefined`), a runtime `typeof value === 'string'` guard inside the selector closes the gap between the type system's optimism and Redux state's lived behavior during init. Generalizes: useSelector projects; component code consumes the projection. Pulling derivation OUT of useSelector is a silent re-render multiplier in any hot path. - -## debounced-persist-creates-stale-backend-reads - -_Discovered: 2026-04-27 by implementer in LT-bugfix-stale-edges_ - -The canvas's localStorage/backend persistence subscriber in `packages/ui/src/store/index.ts` debounces saves by 2000 ms. When a backend route resolves anything off the persisted card row (e.g. `prisma.canvasCard.findUnique({ select: { nodes, edges } })` in `log-stream.service.ts:resolveSource`), it sees the canvas state _as of two ticks ago_ β€” not what the user just did. So a fast "draw edge β†’ click block" sequence reads pre-edge data and the source resolver returns `none` even though the canvas clearly shows the connection. Fix shape: the frontend has the truth (Redux); pass it explicitly in the request body (e.g. `candidateSources`) and have the backend prefer the client-supplied view, with the Prisma read kept ONLY as a fallback for older clients. Generalizes: any backend route that joins on a row written by a debounced client-side persist subscriber is a correctness footgun in the "user did X, immediately did Y" path. Either lift the relevant inputs into the request body (client-side resolution + server-side validation), or flush the persist before the route fires. Don't assume the DB row reflects the live UI β€” the debounce window is by design longer than the user's reaction time. Co-located: when adding the alternate-input path, keep the Prisma fallback so older clients keep working AND so a corrupted-frontend-state scenario can recover by re-deriving from server state. - -## one-shot-resolution-needs-state-trigger - -_Discovered: 2026-04-27 by implementer in LT-bugfix-postdeploy-resubscribe_ - -A subscription that resolves its source ONCE at subscribe time and never re-resolves is fine ONLY if every condition the resolver checks is also captured in the effect's deps β€” otherwise a state transition that flips the resolution outcome (here: `pre-deploy` β†’ `resolved`) leaves the UI stuck on the original outcome forever. In `useLogStream`, the original `candidateFingerprint` projected `>` per inbound source β€” enough for "edge added/removed" and "iceType changed", but NOT for "user clicked Deploy β†’ `deploy.service.ts:1880` writes `data.deploy_status = 'active'` to the source node β†’ backend's `resolveSource` would now return `{ state: 'resolved' }` instead of `{ state: 'pre-deploy' }`". The deps ignored the `deploy_status` mutation, so the effect didn't re-run, no re-subscribe happened, and the canvas placeholder kept saying "Deploy this environment to start streaming logs." even hours after a successful deploy. Fix: extend the projection to `>>`. The `` segment is empty (`'a>X>'`) when the field is absent and `'a>X>active'` after deploy completes, so the dep value always changes on the transition that matters and the effect re-subscribes naturally β€” no new socket events, no new endpoints, just a fresh `/subscribe` that the backend can re-resolve against the now-existing `deployedResourceMapping` row. Generalizes: any "subscribe-once + resolve-once" hook where the resolution depends on Redux state must include EVERY field the resolver inspects in its deps fingerprint. The set of fields you have to include is exactly the set the backend resolver reads β€” keep them in lock-step or add a comment explaining why one is intentionally omitted. - -## ux-real-deploy-needs-clean-gcp-precondition - -_Discovered: 2026-04-27 by ux-tester in LT-10-real-deploy-blocked_ - -Before kicking off any "real cloud" UX run, list every relevant resource in the target project (`gcloud run services list`, `gcloud sql instances list`, `gcloud redis instances list`, `gcloud storage buckets list`) and verify the canvas is in `idle` deploy state. On the LT-10 attempt, the project `lc-ice` already had: 1 Cloud SQL instance (`ice-full-sta-prod-databasein-5cbe63ad`, RUNNABLE), 6 Redis instances (5 READY from earlier runs + 1 actively CREATING β€” `ice-full-sta-prod-instance-8534b75b`), and the canvas hot-loaded a "Deploying… 23%" badge on the matching Redis cell. That meant a previous session had walked away mid-deploy without destroying. Pushing a fresh Deploy on top of that state would (a) double the leak, (b) make Phase 3's "transition timing from deploy completion to first entry" measurement meaningless because there's no clean "deploy started" moment, and (c) cost real money β€” Cloud SQL alone runs ~$50/mo per instance, Redis ~$40/mo per Standard instance, and 5 Redis + 1 SQL means the project is already burning ~$250/mo of leak. Generalizes: a real-deploy UX run needs a `gcloud`-based pre-flight that fails fast if the project isn't clean, AND the orchestrator's brief should call out "if the project has live resources, stop and clean before retrying" so the agent doesn't try to push through. The cleanup itself isn't a UX-tester responsibility β€” it's the orchestrator's job to either run the destroy themselves or hand the agent an explicitly clean project. - -## ux-deploy-already-exists-vs-adopt-inconsistent - -_Discovered: 2026-04-27 by ux-tester in LT-10-deploy-attempt-2_ - -Two consecutive Deploy clicks against the same partially-deployed `lc-ice` project produced different behaviors for the same set of pre-existing resources. Run #1 (1168.3s): Cloud SQL and Storage bucket were ADOPTED gracefully ("already exists from a prior deploy β€” adopting and converging public access"), with Cloud SQL taking 615s to converge and the bucket 1.6s. Run #2 (65.3s): the same Cloud SQL instance, Redis, API Gateway, security policy, and globalForwardingRule all hard-FAILED with "already exists" messages β€” only the Storage bucket continued to adopt. From the deploy panel UX, the user can't tell which path the engine will take: in run #1 they see a single block deploy taking minutes (good signal β€” work happening), in run #2 they see seven blocks turn red in seconds with terse "already exists" errors (bad signal β€” sounds catastrophic when it's actually idempotency-guard rejection of resources that _should_ be adoptable). The remediation CTA "Clean up orphaned ICE resources" appears regardless, which is correct β€” but the panel should distinguish "adoptable but rejected this run" from "genuinely broken" so the user knows the difference. Generalizes: when an engine has both an "adopt-existing" and "fail-on-existing" code path for the same resource type, the UI must call out which path was taken β€” silence reads as "the engine is broken" when it's really "the engine chose strict mode this time". - -## ux-deploy-progress-pill-resets-per-resource - -_Discovered: 2026-04-27 by ux-tester in LT-10-deploy-attempt-2_ - -The bottom-of-canvas status pill ("Deploying X%") and the canvas-overlay node-level pill ("Deploying… X%") share the same X% number, but X is per-resource progress, not overall deploy progress. At t+90s the API Server build was at 59% and the pill said "Deploying 59%"; at t+210s the deploy moved to the logging sink resource and the pill reset to "Deploying 0%"; at t+390s it moved to the network resource and was again "Deploying 0%". An observer reading the pill gets the impression that progress went 59% β†’ 0% β†’ 0% β€” looks like the deploy stalled or restarted, when really 6+ resources had been completed and the engine had moved to the next one. The deploy panel header keeps an honest "Deploying" tone-of-voice but doesn't surface "step 7 of 13" or "β‰ˆ45% overall". Generalizes: a single percentage that resets on every step transition is worse than no percentage at all; either show "step N/M" alongside, or weight the percentage by total work, or drop it entirely on the canvas pill and keep it only inside the deploy panel where the column of resource rows gives context. - -## ux-pre-deploy-orchestrator-claim-vs-gcloud-truth - -_Discovered: 2026-04-27 by ux-tester in LT-10-deploy-attempt-3_ - -The orchestrator handed me a brief stating "GCP project `lc-ice` was nuked clean β€” VPC quota 1/5 (only `default` network), no Cloud SQL, no Redis, no LB infra, no API Gateway, no buckets, no secrets" and asked me to drive a fresh Deploy. The pre-flight `gcloud` check (per the `ux-real-deploy-needs-clean-gcp-precondition` learning) found the exact opposite: 2 VPCs (default + `ice-full-sta-prod-network-8eb3fce4`), 1 Cloud SQL (RUNNABLE, created 22:08:20Z β€” within the last 25 min), 1 Redis (READY, 22:17:54Z), 1 storage bucket (22:21:49Z), 1 secret, a security policy, a backend service, and a global forwarding rule β€” all labeled `ice-card-id=cmoh24gso000b7oay4cwn584j` matching the prior `full-stack-web-app-moh24gsl` project. The canvas itself was already showing "Deploying 5%" on the bottom status pill before I touched anything, with a "1 error" badge from a prior failure. The orchestrator's mental model and the actual cloud state had diverged β€” likely because a destroy was started but never fully completed, or because what looked like a clean run from inside the IDE didn't translate to a clean GCP project. Lesson: even when the orchestrator says the precondition is met, the ux-tester's pre-flight is non-negotiable; trust `gcloud` over the prose. Not surfaced as a planner/implementer issue, just a multi-agent state-handoff caveat β€” the ux-tester is the only agent that touches real cloud, so it's the only agent that can verify the precondition. Generalizes: any agent acting on a "the world is in state X" assertion from another agent must independently verify X if the cost of being wrong is real-world side-effects (money spent, leaked resources, double-deploys onto an already-mid-deploy canvas). - -## scheduler-ready-list-must-reserve-per-handler-cap - -_Discovered: 2026-04-28 by implementer in pdl-1_ - -The first cut of `ParallelChangeScheduler.collect_ready` only reserved against the global `pool_size` (`if (this.in_flight.size + ready.length >= this.pool_size) break;`) and called `can_take_slot` per-node, where `can_take_slot` checked the per-handler cap by reading `this.handler_in_flight` β€” which doesn't get incremented until `dispatch` runs LATER, after `collect_ready` has already returned a list. With three `gcp.sql.databaseInstance` siblings and `gcp.sql. = 1`, the first iteration of `collect_ready` saw `handler_in_flight.gcp.sql. === 0` for ALL three, returned them all, and then `dispatch` fired all three concurrently β€” completely ignoring the cap. The test caught it: the SQL siblings finished in 32ms instead of 90ms (3 Γ— 30ms serial). Fix: track BOTH `pool_reserved` and `handler_reserved` as local Maps inside `collect_ready` itself, combining them with the in-flight counters when checking caps. Generalizes: any "two-phase scheduling" loop (collect-then-dispatch) where the dispatch phase mutates the bookkeeping the collect phase reads MUST do its own within-phase reservations, otherwise siblings can collude past whatever cap the collect phase was supposed to enforce. The bug looks identical to "the cap doesn't work" but the actual cause is "the cap was never visible to the collector because the dispatcher hadn't published yet." - -## scheduler-resource-name-vs-graph-node-id-vs-canvas-node-id - -_Discovered: 2026-04-28 by implementer in pdl-1_ - -Three different identifiers travel through the deploy stack and they are NOT interchangeable: (1) **canvas node id** β€” the user-facing block id from `cards-slice.nodes[i].id` (e.g. `cmoh24gso000b7oay4cwn584j`); (2) **graph node id** β€” built by `MutableGraph.add_node` as `${type}:${name}` (e.g. `gcp.sql.databaseInstance:ice-foo-prod-instance-abc123`); (3) **resource name** β€” the sanitized, hash-suffixed cloud-resource name (e.g. `ice-foo-prod-instance-abc123`). The brief's hand-off contract said "`change.id` traces to `deployables.node_id`" but the actual chain is: `change.id == graph_node_id`, NOT canvas node id. The mapping `graph_node_id β†’ canvas_node_id` lives in `card-translator.ts`'s `deployables[]` array (one entry per deployable, with `node_id` = canvas id and `resource_name` = graph node's `.name`). Inside the engine + scheduler we emit `node_id = change.id = graph_node_id` because that's what's available at that layer; pdl-4 (service layer) is responsible for translating to canvas node id via `deployables`. I marked this in the scheduler.ts comment block and in the `NodeStatusEvent.node_id` JSDoc to keep the contract clear. Generalizes: when three identifiers exist for the "same thing," each layer's events carry the most-stable id available at that layer; the boundary translates. Don't pretend the layers share an id space β€” they don't. - -## cloud-build-helper-substep-shares-outer-index - -_Discovered: 2026-04-28 by implementer in pdl-3_ - -The `on_step` contract is "1-based, monotonic, never exceeds total" β€” a UI consumer reading `index/total` needs both invariants or the progress bar lurches. When a slow handler (cloud-run) delegates a multi-minute sub-operation (cloud-build), the naive "let the helper emit its own indices" approach blows the contract: the outer `total=4` schedule produces `[1/4, 2/4, 3/4, 4/4, 5/4]` once the helper's "Cloud Build queued" / "Cloud Build running" events stream through. The fix in pdl-3 is to keep ALL build-helper sub-states at the SAME outer index (the one the caller reserved for "Building from source"), so the consumer sees the label refresh in place rather than the bar advancing. The signature for the helper's optional callback is `reportStep(index, label)` even though the index is functionally always 1 from the helper's view β€” the caller binds a closure that maps the helper's index to its own outer index. The cloud-run wiring looks like `(_inner, label) => reportStep(2, label)`. Generalizes: any nested-handler call where the inner work is one logical step from the outer perspective should pin its sub-states to the outer index, not advance past it. Document the pinning at the outer call site and at the inner helper, since the contract surfaces in both. - -Test detail: the cloud-build-helper sleeps `BUILD_POLL_INTERVAL_MS = 10_000` between status polls, which makes vi's `useFakeTimers({ shouldAdvanceTime: true, advanceTimeDelta: 20 })` mode burn 500 real ticks per simulated 10s sleep. Switch to plain `vi.useFakeTimers()` and drive time forward explicitly with `await vi.advanceTimersByTimeAsync(15_000)` in a loop after kicking off the call without await. Fast: 12 tests in 180ms instead of 42s. - -## socket-service-module-scoped-io-needs-vi-resetmodules-per-test - -_Discovered: 2026-04-28 by implementer in pdl-2_ - -`packages/shared/src/socket/service.ts` keeps the Socket.IO server in a module-scoped `let _io` that `setupSocketService` writes once. That makes the module _stateful across tests in the same file_: a test that sets up the server leaks `_io` into the next test, which means the "no `setupSocketService` call β†’ `_io === null` guard fires" assertion can pass for the wrong reason (or fail when the previous test's spy on `console.warn` is still active). Fix in the new `socket-deploy-events.test.ts`: each `it` calls `vi.resetModules()` then `await import('../socket/service.js')` to get a pristine module, and `vi.restoreAllMocks()` runs in `afterEach`. The existing `socket-logs.test.ts` only has one `it` so it never tripped this; with five-plus emitter tests in one file, the inter-test isolation matters. Generalizes: any module that owns mutable singleton state (a server handle, a connection pool, a registry) needs `vi.resetModules()` between tests in the same file β€” `beforeEach` resets aren't enough because the module-scoped binding is captured at first import time, not at the export call. The smoking-gun symptom is "test A passes alone, test B passes alone, both pass when run in either order, but the third test added later flakes" β€” i.e. order-coupled state leakage. - -## seq-allocation-must-be-shared-between-wire-and-log - -_Discovered: 2026-04-28 by implementer in pdl-4_ - -The pdl-2 wire contract requires every `DeployEvent` to carry a monotonic `seq: number` so reconnecting clients can dedupe replayed log rows against live emits. The natural-looking implementation β€” `recordDeployEvent` allocates seq for the persistent log, the wire emit also gets one β€” produces a DRIFT between the two: the same logical event ends up with seq=N on the wire and seq=N+1 in the DB row, so a reconnecting client that resumes from the DB tape and continues live will see "duplicate" events that aren't actually duplicates. Fix in pdl-4: split `recordDeployEvent` into a separate `nextDeploySeq(cardId)` allocator + `recordDeployEvent(cardId, seq, type, payload)` consumer; the wire emit calls `nextDeploySeq` first, sets it on `event.seq`, fires the wire helper, THEN passes the same seq to `recordDeployEvent`. For events emitted OUTSIDE an active deploy (the requirement-poller, the build-phase pipeline log), `nextDeploySeq` returns null and we fall back to `Date.now()` as the seq β€” those events are rare, idempotent, and the dedup-on-reconnect contract isn't load-bearing for them (they're point-in-time updates, not a replayable tape). Generalizes: any "live emit + persistent log" pair where consumers reconcile across both sides must share the sequence number from a single allocator. Two separate counters look like they work in development (the tape and the live stream both grow monotonically) and silently double-emit events the moment a client reconnects mid-deploy. - -## graph-id-vs-canvas-id-translation-is-service-layer-job - -_Discovered: 2026-04-28 by implementer in pdl-4_ - -The scheduler's `NodeStatusEvent.node_id` field carries `${type}:${name}` (the engine-internal graph node id from `MutableGraph.add_node`), NOT the canvas node id, despite what the original JSDoc on `packages/core/src/deploy/types.ts:104` claimed ("Canvas node id (stable, sourced from change.id which traces to deployables.node_id)"). The actual data flow: `change.id == graph_node_id`, traced back through `desired_node.id` in `diff.ts:71` to `create_node_id(\`${input.type}:${input.name}\`)`in`mutable-graph.ts:97`. The wire contract (pdl-2's `DeployNodeStatusEvent.node_id`) requires the CANVAS id because that's what the frontend keys its `nodesById`map on. Translation has to happen exactly once, at the service layer, against a`graphIdToCanvasId` map built ONCE per deploy (`Map<\`${resource_type}:${resource_name}\`, canvas_node_id>`) from `translation.deployables[]`. On a missing translation, DROP the wire emit + warn β€” the alternative ("emit with sentinel id") would silently miscorrelate a status row to the wrong canvas block, which is worse than a missing row. The destroy/rollback paths intentionally don't have the map (they walk historical deployments, not the current canvas-translator output) so they emit log lines instead of per-resource node_status. Updated the JSDoc on types.ts:104 in pdl-4 β€” "Graph node id (`${type}:${name}`); the service layer translates to canvas node id before emitting on the wire". Generalizes: when three identifier spaces (canvas, graph, resource_name) flow through a layered system, every wire-contract field that holds an id has ONE definition of which space's id it carries. The service layer is the right place to do the translation because that's where both the engine output (graph ids) and the user-facing input (canvas ids) are simultaneously visible β€” pushing the translation up into the engine is wrong (the engine doesn't know about canvas ids), pushing it down into the frontend is wrong (the frontend doesn't have the deployables[] mapping). - -## stale-core-dist-blocks-cross-package-type-imports - -_Discovered: 2026-04-28 by implementer in pdl-4_ - -`packages/core/package.json` has `"types": "./dist/index.d.ts"` in its `exports` map, and `moduleResolution: bundler` (the resolution mode used by service-deploy and other workspace packages) prefers the `types` field over `default`. So when the source has been edited but the dist hasn't been rebuilt β€” exactly the situation pdl-1 left things in for `NodeStatusEvent` / `NodeProgressEvent` β€” `import type { NodeStatusEvent } from '@ice/core'` fails with TS2305 "no exported member" even though the source clearly exports it. Two ways out: (a) rebuild `pnpm --filter @ice/core build` (BUT the core typecheck has 29 pre-existing TS2834 errors that block the build), (b) inline the type locally in the consuming package as a structural mirror of the upstream interface, with a comment explaining the situation and the cleanup path. Pdl-4 chose (b) β€” `interface SchedulerNodeStatusEvent` lives in `services/deploy/src/services/deploy.service.ts` and is documented as a sync requirement against `packages/core/src/deploy/types.ts`. Generalizes: when a workspace package's `types` field points at a stale dist, NEW types added to source are invisible to consumers regardless of how the source-side exports are structured. The "right" fix is rebuilding the dist; the pragmatic fix is a documented local mirror. Don't waste cycles trying export tricks (`@ice/core/deploy/types`, etc.) β€” those subpaths aren't in the exports map either, and adding them touches a contract bigger than the immediate need. - -## point-types-at-source-not-dist-in-workspace-packages - -_Discovered: 2026-04-28 by orchestrator in pdl-4 critic-fix pass β€” supersedes `stale-core-dist-blocks-cross-package-type-imports`_ - -The cleaner fix to the issue described in `stale-core-dist-blocks-cross-package-type-imports` is repointing `@ice/core`'s `types` field at `./src/index.ts` (matching every other workspace package β€” `@ice/blocks`, `@ice/db`, `@ice/templates`, `@ice/shared`, `@ice/types`, `@ice/ui`, all six services). `@ice/core` was the only outlier pointing `types` at dist, which is the asymmetry the local mirror was working around. Consumers use `moduleResolution: bundler`, which doesn't enforce node16's TS2834 file-extension rule, so the 29 pre-existing core-typecheck errors don't propagate to consumers β€” the dist-vs-source choice on `types` was load-bearing only because of a one-package inconsistency, not because of a real build constraint. After the repoint: drop the local mirror in `services/deploy/src/services/deploy.service.ts`, switch to `import type { NodeStatusEvent, NodeProgressEvent } from '@ice/core'`, all four workspace typechecks remain green. Generalizes: when a TS workspace package needs to expose a type to peers, point `types` at source (`./src/index.ts`) β€” the dist-d.ts pattern only makes sense for published packages outside the monorepo. A local mirror that drifts is strictly worse than a one-line package.json fix that brings the package in line with its peers. - -## requirement-verified-needs-full-tenancy-key-on-the-wire - -_Discovered: 2026-04-28 by critic in pdl-4 review_ - -The `BlockRequirementStatus` table is uniquely keyed on `(card_id, node_id, environment, requirement_id)` β€” four fields. The pdl-2 contract for `DeployRequirementVerifiedEvent` initially carried only `card_id` + `requirement` (a footgun introduced because the pdl-2 brief froze the wire shape without tracing through the existing `use-deploy-subscription.ts:132` consumer that reads `event.node_id`, `event.environment`, `event.details.managed_status`, `event.details.domain_statuses`). After pdl-4, a frontend reducer would have NO way to disambiguate "the cert flipped" between two custom-domain blocks on the same canvas, or one block across two environments β€” it would over-apply the status to every match. Critic blocker B1 caught this; the fix widened the contract to require `node_id` + `environment` and surface an optional `details` blob. Generalizes: when freezing a wire contract for a row whose database identity is composite, every key field must be on the wire β€” even if the immediate use case is "just card-level, the frontend can look it up". Consumer-side lookup pushes the disambiguation to a place where the consumer doesn't have the data anymore. The contract-freeze step in pdl-2-style work should explicitly trace each consumer's read pattern before locking the shape. - -## seq-schemes-on-shared-channel-need-jsdoc-discrimination - -_Discovered: 2026-04-28 by critic in pdl-4 review_ - -The pdl-4 wire layer carries TWO incompatible `seq` schemes on the single `deploy:event` socket channel: deploy-tape events use small monotonic ints (1, 2, 3, ...) allocated by `nextDeploySeq(cardId)`; requirement-poller events use `Date.now()` (~1.7e12) because they fire post-deploy with no active deploy snapshot. A frontend reducer that sorts the unified stream by `seq` would scatter requirement events to the end and break monotonicity assumptions. The fix isn't to unify the schemes (the requirement events have no deploy to seq against) β€” it's to make the discrimination explicit on the contract: `DeployRequirementVerifiedEvent.seq` JSDoc now spells out the different scheme and tells consumers to "route by `event.type` first, then sort within each scheme". Generalizes: when a single channel carries multiple event types with different sequencing semantics, the contract must expose the discrimination at the type level β€” buried code comments aren't enough, because the next person writing a reducer will sort first and discover the issue at runtime. JSDoc on the offending field is the cheapest contract surface. - -## frontend-channel-flip-needs-eager-init-callsite-sweep - -_Discovered: 2026-04-28 by implementer in pdl-7_ - -When migrating the frontend from a legacy socket channel to a new one, the literal channel-name flip in the API adapter (`s.on('deploy:progress', ...)` β†’ `s.on(DEPLOY_EVENT_CHANNEL, ...)`) is the smallest part of the work. The adapter's PUBLIC method name (`onDeployProgress`) leaks into every call site, including the eager-init loop in `useDeploySubscription` that runs ONCE at hook mount with a no-op callback purely to prime the socket.io handshake. Missing that callsite leaves the eager-init still calling `onDeployProgress` post-rename, which compiles fine because TypeScript is happy with `api.onDeployProgress` returning `undefined` (optional method on the interface) β€” and silently breaks the handshake-warming behaviour on first deploy. Fix: rename the API method (`onDeployEvent`), update the interface in `api-adapter.ts`, then grep for every callsite β€” there were three in pdl-7 (eager-init, live listener, deploy-panel `requirement_verified` watcher) and missing any one would have been a real regression. Also: keep the unsubscribe room emit (`subscribeDeployProgress`) named the same β€” that's the room-join, not the event listener, and the room name is still `deploy:` per the unchanged decisions entry. Generalizes: a "channel rename" is really a triple-rename: the constant, the listener method, AND every callsite. The first two are typecheck-enforced; the third is grep-enforced. - -## test-the-channel-name-constant-not-the-string - -_Discovered: 2026-04-28 by implementer in pdl-7_ - -The pdl-7 channel-flip test asserts `expect(channel).toBe(DEPLOY_EVENT_CHANNEL)` β€” importing the same constant from `@ice/types` that the http-api-adapter does. Writing `expect(channel).toBe('deploy:event')` would compile and pass today, but a future rename of the constant to `'deploy:event:v2'` would silently green-light a state where backend and frontend disagree (backend on the new constant, test still asserting the old literal) β€” exactly the failure mode the constant exists to prevent. The test itself becomes the third typo surface (along with the constant definition and the listener registration); a literal in the test re-introduces the typo gap. Generalizes: when a constant exists to give two sides of an interface a single source of truth, the test for that interface must import the constant too. Otherwise the test is the place the next typo will hide. - -## complete-event-without-results-needs-post-complete-fetch - -_Discovered: 2026-04-28 by critic in pdl-7 review_ - -The pdl-2 wire contract dropped `results: ` from `DeployCompleteEvent` β€” only `outcome` + `totals` remain (per the decisions entry, "the full DeployResult lives on the canvasDeployment row"). Pdl-7 honored the contract on both the slice (the new `applyDeployCompleteEvent` reducer doesn't touch `state.results`) and the wire mirror in `applyNodeStatusEvent` (which writes minimal entries with `name`/`type`/`action`/`success`/`error`/`duration_ms`/`source_node_id` only β€” no `outputs`/`provider_id`/`api_enable_url` because the wire `node_status` event doesn't carry them). The gap: the legacy hook had a `complete` branch that called `dispatch(deploySuccess({ ..., results: event.results.resources }))` to REPLACE `state.results` with the authoritative version on completion; pdl-7 removed it (the new `complete` event has no `results` to pass). Async deploy path (the production default β€” `deploy.apply` returns `async: true` and the panel's `if (result.async) return;` path skips the slice update) ends with `state.results` populated by the wire mirror only. The deploy-panel summary's DNS records section reads `r.outputs.custom_domain_dns_records` β€” undefined in the mirror β€” so a user who just deployed a Custom Domain block sees the deploy as successful but the DNS records they need to copy-paste to their DNS provider are missing until they reload the page (which fires the `getDeployments` hydrate effect from card-mount). Same gap for any output-derived UI: Cloud Run service URL, custom domain pill, api_enable_url CTAs on permission errors. Fix: in the `useDeploySubscription` Phase 3 listener's `complete` handler, add a `dispatch(hydrateDeployFromHistory({...}))` call (or equivalent re-fetch of the latest `getDeployments` row) so `state.results` gets the full per-resource data right after the wire `complete` event lands. Generalizes: when freezing a wire contract that drops a field which a downstream UI consumed unchanged, you must also add the explicit re-fetch path that compensates β€” otherwise the field's loss propagates as a silent UX regression even though the typecheck passes. - -## deploy-overlay-mapping-must-match-status-colors-keyset - -_Discovered: 2026-04-28 by critic in pdl-7 review_ - -The frontend's `mapWireStatusToOverlay` (used to translate the wire's `DeployNodeStatus` to the canvas overlay string written to `node.data.deploy_status`) has six output strings: `'queued' | 'deploying' | 'active' | 'error' | 'skipped'`. The canvas's `compact-node/index.tsx` reads this status and looks it up in `STATUS_COLORS` (in `canvas-constants.ts`) β€” which has only `active | running | healthy | deployed | pending | warning | creating | updating | deploying | planning | drifted | error | failed | deleting | destroying | stopped | inactive | idle`. Neither `'queued'` nor `'skipped'` are keys β€” both fall back to `STATUS_COLORS.active` (green). Result: a queued node shows up with green coloring before its applying transition (visually says "live" when it's just-scheduled), and skipped nodes after a partial-fail rollback also show green. Worse: the deploy-service's parallel mapping `mapStatusToOverlay` collapses `queued | applying β†’ 'deploying'`, so the SAME node from the snapshot path is blue (correct), and from the live wire path is green (wrong) β€” they only agree on succeeded/failed/skipped. Fix two halves: (a) add `'queued': '#f59e0b'` (orange/pending) and `'skipped': '#94a3b8'` (slate/grey) keys to `STATUS_COLORS`, and (b) align the two mapping functions so the snapshot path and the wire path produce the same overlay string for the same wire status. Generalizes: every value a frontend overlay-string mapping produces must exist as a key in the consumer's status-table, AND every parallel mapping (server-side snapshot + client-side wire mirror) must produce identical strings for identical wire inputs β€” the consumer can't tell which path the data came from, so a divergence means the same node renders inconsistently across reloads. - -## complete-event-must-thread-error-message - -_Discovered: 2026-04-28 by critic in pdl-7 review_ - -`DeployCompleteEvent` carries `outcome: 'success' | 'partial' | 'failure' | 'cancelled'` and `totals` but NO error message. The slice's `applyDeployCompleteEvent` maps `outcome β†’ status` (partial/failure β†’ 'error', cancelled β†’ 'cancelled') but doesn't set `state.error` because there's nothing on the wire to set it from. The deploy-panel's `` reads `deploy.error` β€” when the slice flipped to 'error' via `applyDeployCompleteEvent` but the legacy `deployError` reducer never fired, `state.error` is still null. Result: the user sees the red status badge "Deploy errors" but the banner content is empty. Same problem as the missing results above: dropping a field from a wire contract while downstream UI still reads it is a silent UX regression. Two fixes possible: (a) widen the wire contract (`DeployCompleteEvent.error?: string` or rich diagnostics blob), (b) trigger the same post-complete `hydrateDeployFromHistory` re-fetch that the missing-results gap needs β€” the DB row carries `error: string`. Either works; (b) requires the fetch already proposed for the missing-results gap, so it's strictly less new code. Generalizes: when a wire contract carries an outcome discriminator without the human-readable diagnostic that goes with it, the consumer that displays the diagnostic loses information unless it re-fetches from a richer source. The contract author must either include the diagnostic on the wire OR explicitly delegate the re-fetch. - -## react-memo-on-rollup-component-instead-of-shallowequal-on-selector - -_Discovered: 2026-04-28 by implementer in pdl-5_ - -The brief warned against introducing a new `useSelector(s => s.deploy.nodesById)` without `shallowEqual` because the wire-event path produces a new `nodesById` reference per reducer write (10+ events/sec during a deploy). The deploy panel already had a load-bearing `useSelector(s => s.deploy)` selecting the whole slice β€” every event makes a new `state.deploy` reference, so the panel was already re-rendering on every event regardless of what we did. Adding a separate `useSelector` for `nodesById` with `shallowEqual` would have cost an extra subscription without changing the parent's re-render frequency. The cheaper fix: keep prop-drilling `nodesById` from the existing whole-slice selector into a new `React.memo`-wrapped child component (`DeployInFlightPanel`), and run `useMemo([nodesById])` for the rollup INSIDE the child. The memo invalidates only when `nodesById`'s reference actually changes (i.e., when `applyNodeStatusEvent` / `applyNodeProgressEvent` mutates the map β€” NOT when `appendLog` / `hydrateDeployFromHistory` / etc. fire), so the rollup is cheap. For the canvas banner and status-bar, both are independent components with their own subscription, so they DO use `shallowEqual` on a per-component `useSelector(s => s.deploy.nodesById)`. Generalizes: a `useSelector` returning a non-primitive blob is acceptable WHEN downstream consumers are wrapped in `React.memo` and accept the blob as a prop β€” the memo gates work on the actual reference change, not the parent's re-render. The `shallowEqual` route adds a per-render subscription cost; the `React.memo` route reuses the existing parent subscription. Pick by which side of the tree owns the blob. - -## destroy-status-also-emits-node-events - -_Discovered: 2026-04-28 by implementer in pdl-5_ - -The legacy deploy panel's progress UI was gated `deploy.status === 'deploying'` only, NOT `'destroying'` β€” meaning the destroy path went through the panel with no live progress display, just the log scroll. Per the pdl-1 decisions entry, destroy/teardown emits the SAME `node_status` events as deploy (action='delete' instead of 'create'); the wire shape is the same and the scheduler is shared. The fix in pdl-5 was just widening the gate: `(deploy.status === 'deploying' || deploy.status === 'destroying')`. The existing behavior was "destroy looks broken because no progress UI" β€” easy to mistake for "destroy isn't running" especially with the legacy bouncing-bar bug masking the absence. With the per-node list, destroy now shows each resource's tear-down status with the same affordance set (queued β†’ applying β†’ succeeded/failed), and the rollup gives the user a "X of N destroyed" anchor. Generalizes: when a panel renders status for a long-running operation, audit every `status === 'X'` gate against every status that the same backend emits events for. Anywhere the gate name doesn't match the backend's emit set, the UI silently goes dark for that mode. - -## ux-row-labels-need-action-aware-substitution - -_Discovered: 2026-04-28 by critic in pdl-5 review (finding #1)_ - -Once `destroy-status-also-emits-node-events` was honored and the destroy path renders a per-node row, a second gap surfaced: `node.status` carries the lifecycle phase but NOT the action being performed. The same wire shape (`status: 'applying' | 'succeeded' | …`) covers create AND delete. A destroy-applying row showed the "DEPLOY" badge; a destroy-succeeded row showed "LIVE" β€” the latter is a direct contradiction (a destroyed resource is **gone**, not "live"). Fix: thread `node.action` into the badge label override at the row, swapping `applying β†’ DESTROY` and `succeeded β†’ GONE` when `action === 'delete'`, while keeping the colors intact (the canvas badge palette stays coherent across both surfaces). Same medicine as `one-status-source-deploy-status` and `deploy-overlay-mapping-must-match-status-colors-keyset`: when one label set has to span two operations, the consumer needs to see which operation produced the event, not just the lifecycle phase. Generalizes: any per-row UI rendering events from a multi-action backend (create / update / delete on the same wire) must compose its label from `(action, status)`, not status alone β€” the action is the disambiguator the user is reading the row for in the first place. - -## ux-canvas-blocks-default-no-provider-on-drag-drop - -_Discovered: 2026-04-28 by ux-tester in pdl-smoke-test_ - -Newly-dropped blocks from the palette have no `provider` field on `node.data`. The deploy panel filters `providerNodes = resourceNodes.filter(n => n.data?.provider === deploy.provider)` and counts the missing-provider nodes as "skipped β€” non-GCP" even when the project's deploy.provider is GCP. End-state: a user drops Static Site + Storage + Custom Domain with the cloud provider toolbar set to GCP (via the top-of-screen `Google Cloud` button), and the deploy panel still says "0 deployable resources (GCP) (3 skipped β€” non-GCP)". The block name even pre-fills with provider strings ("AWS Static Site", "AWS S3") β€” clearly cosmetic, but it lies about the routing. This contradicts user expectation: if the deploy panel is set to GCP, dropping a generic block should adopt GCP unless the user explicitly overrides. Fix options: (a) when the cards-slice's drop handler creates a node, default `n.data.provider` to the active deploy provider (cleanest β€” single source of truth), (b) when the deploy panel's `providerNodes` filter runs, treat absent provider as "matches active provider" (hides the bug, doesn't fix the data), (c) surface the per-node provider as a dropdown in the properties panel so users can change it (workaround, not a fix). Generalizes: any per-node setting whose absence routes the node to "skipped" must either be defaulted at creation time OR rendered as a "needs config" warning in the panel β€” silent skipping looks identical to "the deploy is broken". - -## ux-static-site-needs-source-repo-blocking-requirement - -_Discovered: 2026-04-28 by ux-tester in pdl-smoke-test_ - -The Static Site (Compute.StaticSite, GCP firebase.hosting) block has a hard pre-deploy requirement: a GitHub repository must be attached. The deploy panel surfaces this as a yellow "Attach a source repository" requirement card with a `blocking` pill, blocking the Deploy button. There is no way to deploy a Static Site without a repo β€” the block is fundamentally a "build-and-deploy from repo" block, not "create empty hosting". For smoke-tests that just want "minimum viable canvas with parallel deploy proof", Static Site is therefore a bad pick β€” Storage.Bucket Γ— N is a much better choice (no source-repo dep, deploys in 2-3s each, runs through the parallel pool). Generalizes: when picking a "minimal canvas" for end-to-end smoke testing the deploy engine itself, prefer block types whose handlers don't fan out into requirements (cert issuance, repo attach, DNS verification, etc.) β€” those add mockable / unmockable side dependencies that aren't the deploy-engine work being tested. Also: the deploy panel keeps stale requirement cards around when the underlying block is deleted (had to click Reset to clear the "Attach a source repository" warning after deleting the StaticSite). Requirement reactivity is per-card and lazy. - -## ux-destroy-action-bypasses-node-status-wire - -_Discovered: 2026-04-28 by ux-tester in pdl-smoke-test (regression)_ - -Per the `destroy-status-also-emits-node-events` learning, destroy is supposed to emit the SAME `node_status` events as deploy (with `action: 'delete'`). The smoke test confirmed via gcloud that 3 storage buckets DID get destroyed cloud-side (POST `/api/canvas/deploy/destroy` returned 200, follow-up `gcloud storage buckets list` returned 0). But the deploy-panel's per-node list never showed any DESTROY/GONE rows: `state.deploy.nodesById` cleared to count=0 immediately on destroy click and stayed empty until completion; `state.deploy.status` flipped to `'destroying'` for at most one tick (0.0s log entry "Deploy completed in 0.0s"), then back to `'success'`. The `ux-row-labels-need-action-aware-substitution` fix (action-aware DESTROY/GONE labels) cannot be visually confirmed because the wire events for destroy are not landing in `nodesById` β€” either the destroy path doesn't go through the parallel scheduler at all, or it does but the service layer's `mapStatusToOverlay`/translation isn't wiring `action: 'delete'` events through `applyNodeStatusEvent`. The canvas-side badge on each block still showed green "LIVE" after destroy completed (also stale), which would mislead a user into thinking the resources still exist. This is a correctness regression on the pdl-5 + pdl-7 contract. Fix path: trace the destroy code path in `services/deploy/src/services/deploy.service.ts` β€” does `destroyResources` run through the same scheduler-based `applyChange` loop as `apply`? If yes, are the `on_node_status` callbacks wired? If no, the destroy path needs the same per-node event emit treatment as the apply path (otherwise the parallel-scheduler architecture only covers half the lifecycle). Generalizes: when a wire-contract claim is made about parity between two operations ("destroy emits the same events as deploy"), the smoke test must drive both ends and confirm; passing the create-side test alone is necessary but not sufficient. The smoke test should also poll `nodesById` over time during destroy, not just eyeball the final state, because a fast destroy will clear the map before the screenshot lands. - -## destroy-needs-startDeploySnapshot-for-contiguous-seqs - -_Discovered: 2026-04-28 by implementer in pdl-10_ - -The `nextDeploySeq(cardId)` allocator only returns a real seq if there's an active `DeployProgressSnapshot` for the card (it reads `snapshot.deploymentId` to key its per-deployment counter). The destroy paths (`destroyDeployment`, `destroyAllForCard`) historically NEVER called `startDeploySnapshot` because their only wire emits were `emitLog` log lines + a final `complete` event β€” both of which are tolerable as `Date.now()` fallback seqs (rare, idempotent, point-in-time updates per the `seq-allocation-must-be-shared-between-wire-and-log` learning). The moment pdl-10 added per-resource `node_status` emits (queued β†’ applying β†’ succeeded/failed) with action='delete', the destroy narrative became multi-step and replayable, and the `Date.now()` fallback breaks the dedup-on-reconnect contract β€” a tab reconnecting mid-destroy would replay the persistent log and see seqs like `[1761710400000, 1761710400015, 1761710400023]` (Date.now() ms) drift against the live wire allocator that fired alongside. Fix: call `startDeploySnapshot(cardId, destroyRecord.id)` immediately after the destroyRecord is created, and `finishDeploySnapshot(cardId, ...)` before every return path (success, partial, engine-throw). Only then does `nextDeploySeq` know about the destroy and hand out contiguous integer seqs. Bonus: the snapshot also gives reconnecting tabs a memory of the per-node states for the 60s grace window, matching the apply-path UX. Generalizes: anywhere you start emitting `node_status` events for an operation, you also need to open a snapshot for that operation β€” the snapshot is the seq-counter's source of truth and the late-joiner's hydration source. The two surfaces are coupled even if your code path doesn't use the snapshot's `nodeStatuses` for anything else (e.g. the destroy-all path doesn't read its snapshot anywhere, but still needs to open one). - -## seq-counter-resets-per-deployment-but-slice-dedup-is-cross-deployment - -_Discovered: 2026-04-28 by critic in pdl-10 review (BLOCKER)_ - -The wire `seq` counter is keyed by `deploymentId` (`deploy-event-log.ts:nextSeqByDeployment`), so a fresh deploy / destroy / rollback resets the counter to 1. But the frontend slice's `applyNodeStatusEvent` reducer (`packages/ui/src/store/slices/deploy-slice.ts:486`) keys its dedup-by-seq guard on `node_id`, NOT on `(node_id, deploymentId)`: `if (existing && existing.last_seq >= e.seq) return;`. After a successful deploy, `nodesById['canvas-id-A'].last_seq === 9` (or whatever the last apply emit's seq was). When the user clicks Destroy, `nextDeploySeq` allocates `1, 2, 3` for the new destroy operation against the same canvas node id β€” and the reducer's guard sees `9 >= 1` and silently DROPS every destroy event. The destroy emits run end-to-end on the backend, the wire fires, the snapshot updates, but `nodesById` never sees the new states. This is the same shape as `ux-destroy-action-bypasses-node-status-wire` but moved one layer up: pdl-10 closes the backend-emit gap and exposes a frontend-reducer gap underneath. The fix lives in pdl-7's slice β€” either reset the per-node `last_seq` on a new operation (add a `clearForNewOperation` action that fires on destroy/rollback start), or key the dedup by `(deploymentId, node_id)` so different ops have independent dedup state, or stamp every `DeployNodeStatusEvent` with a `deployment_id` field and reset `last_seq` when it changes. Generalizes: any "monotonic seq for dedup" guard whose state outlives the operation that produced the seq is exactly one operation-restart away from a silent-drop bug β€” the seq's semantic scope and the dedup state's semantic scope must agree, otherwise the second operation never moves the consumer state. Pdl-7 + pdl-10 jointly own this; the fix needs to land before pdl-10 ships or destroy events stay invisible to the panel even with all backend work done. - -## destroyAllForCard-snapshot-leaks-on-engine-throw - -_Discovered: 2026-04-28 by critic in pdl-10 review (BLOCKER)_ - -`destroyAllForCard` opens a snapshot at line 1512 (`startDeploySnapshot(cardId, destroyRecord.id)`) but only calls `finishDeploySnapshot` on the success-path return (line 1699). The function's structure is `try { ...startSnapshot... try { ...finishSnapshot...; return; } finally { releaseTempDir; } } finally { releaseLock; }` β€” there is no top-level `catch` that closes the snapshot if `deployer.initialize`, `deployer.cleanup`, the `prisma.canvasDeployment.update`, or the `emitDeployEvent(complete)` throws. The next destroy click sees a stale snapshot pointing at a terminal `destroyRecord.id`, and `nextDeploySeq` keeps incrementing against a destroyed counter. Compare `destroyDeployment` (line 1808-2049) which does have the proper `try/catch/finally` with `finishDeploySnapshot(cardId, 'failed')` in the catch branch (line 2046). Generalizes: any function that opens a stateful resource (snapshot, lock, temp dir, DB row in 'running' state) needs a try/catch/finally that closes it on EVERY exit path, not just the happy-path return. The `try { ... } finally { releaseLock(); }` pattern only covers the lock; the snapshot is a separate resource with its own lifecycle and needs its own try/catch β€” or the whole body needs to be wrapped so a single catch closes both. The apply-path (line 632 β†’ 1266 β†’ 1322) is the right shape; `destroyAllForCard` is missing it. - -## deploy-service-tests-must-import-vitest-explicitly - -_Discovered: 2026-04-29 by implementer in rf-deploy-1_ - -The repo-root `vitest.config.ts` sets `globals: true`, but `services/deploy/tsconfig.json` does NOT include `@types/vitest` (or `"types": ["vitest/globals"]`) β€” so a fresh test file under `services/deploy/src/**/*.test.ts` that uses bare `describe / it / expect` will run fine under vitest (because the runtime exposes the globals) yet fail `pnpm --filter @ice/service-deploy typecheck` with `TS2304: Cannot find name 'expect'` and `TS2582: Cannot find name 'it'`. The convention the existing test files use is `import { describe, it, expect, vi, beforeEach } from 'vitest'` at the top of every test file β€” see `services/deploy/src/__tests__/deploy-event-translation.test.ts:22`. Generalizes: when adding a new test file in any package whose tsconfig doesn't pick up vitest's ambient types, mirror the existing test files' explicit imports rather than relying on `globals: true` β€” the runtime works either way, but the typecheck pass is the gate that catches drift. (Easy to miss when running `vitest run` alone returns green β€” always pair the test run with the package typecheck on a brand-new file.) - -## pre-commit-hook-auto-bumps-package-json-version - -_Discovered: 2026-04-29 by orchestrator in rf-deploy-1_ - -A pre-commit hook bumps the root `package.json` `version` field on every commit (e.g. 0.1.74 β†’ 0.1.75 during rf-deploy-1) and stages the change into the commit. Implementers cannot opt out without `--no-verify` (which is banned by project conventions). Practical consequences: commits will always include `package.json` even when the brief lists only N source files; never assume a commit is exactly the set of files you `git add`ed. Don't try to revert the version bump after the fact β€” it's intentional. Generalizes: when reading commit diffs, separate the load-bearing change (the source files) from the always-present version-bump artifact; when scripting commit verification, always allow a one-line `package.json` delta in addition to the listed files. - -## deploy-service-package-has-no-test-script-use-vitest-directly - -_Discovered: 2026-04-29 by implementer in rf-deploy-1_ - -`pnpm --filter @ice/service-deploy test` is a silent no-op β€” the package has no `test` script (only `typecheck`). Don't be fooled by an exit-0 with empty output. The right way to run the deploy-service tests is `pnpm exec vitest run services/deploy/src` from the repo root, or `pnpm test:unit` (which scopes to the root vitest config and includes everything). Coverage is `pnpm test:coverage -- services/deploy/src/` and that does work because `test:coverage` is a root-level script. Future implementer briefs touching `services/deploy/` should specify the vitest command directly rather than the `pnpm --filter test` pattern that works for `@ice/core`/`@ice/ui`/`@ice/shared`. - -## vi-spyon-accumulates-across-it-blocks-without-explicit-reset - -_Discovered: 2026-04-29 by implementer in rf-deploy-3_ - -A `beforeEach(() => { warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {}); })` is NOT enough on its own β€” re-calling `vi.spyOn` on the same target inside `beforeEach` returns the SAME spy and its `mock.calls` array carries over from the previous `it`. So a test that asserts `expect(warnSpy).toHaveBeenCalledTimes(1)` will see `2` (or `3` after the next sibling) and fail with `expected to be called 1 times, but got 2 times`. Two fixes work: (a) prepend `vi.restoreAllMocks()` inside `beforeEach` BEFORE the re-spy, or (b) call `warnSpy.mockClear()` at the top of each `it`. Restore is the cleaner pattern because it also tears down the mock between describe blocks. The tests in `services/deploy/src/utils/__tests__/find-source-node-id.test.ts` use the restore pattern. Generalizes: any spy on a shared global (console.\*, Date.now, fetch, process.env getters) needs an explicit per-test reset β€” `beforeEach` re-spying alone preserves the same Mock instance whose call counter carries over, because vitest treats successive spies on the same target as a no-op rather than a fresh wrap. - -## core-const-lifetime-varies-per-callsite-when-extracting-deployer-factory - -_Discovered: 2026-04-29 by implementer in rf-deploy-5_ - -When extracting `createDeployer(provider)` to dedupe the `if aws / else if azure / else GCP` blocks that follow `const core = await getCoreEngine()` in `services/deploy/src/services/deploy.service.ts`, do NOT blindly delete the preceding `getCoreEngine()` line at every callsite. Three of the four callsites (`destroyAllForCard`, `destroyDeployment`, drift-check) use `core` only to destructure the deployers, so the line is dead after replacement. But the apply path's `const core` (line 491 pre-rf5) also feeds `translate_card_to_graph`/`deploy_graph` which are referenced ~250 lines later, and the rollback path's `core` also feeds `MutableGraph` (line 1974) and `deploy_graph` (line 2037). Sweep-deleting `const core = await getCoreEngine()` after every switch replacement breaks those two with `core is not defined`. Verify by `grep -n "core\." deploy.service.ts | head -50` BEFORE deleting any `getCoreEngine()` call β€” if there are sibling references to `core.X` or destructures naming things other than the three deployer constructors, keep the binding (and just trim the deployer names from the destructure). Generalizes: when collapsing duplicated code that was destructuring different fields off a shared const, audit per-callsite whether other fields of that const are still used in the surrounding scope before deleting the const itself. - -## vi-fn-default-type-rejects-typed-callback-parameter - -_Discovered: 2026-04-29 by implementer in rf-deploy-6_ - -`const log = vi.fn();` typed by `ReturnType` widens to `Mock`, which is NOT assignable to a specific callback signature like `(msg: string) => void`. Vitest's runtime path is happy β€” the mock is callable β€” but `pnpm --filter @ice/service-deploy typecheck` (running `tsc --noEmit`) flags every callsite that passes the bare mock to the SUT with TS2345 "provides no match for the signature". The default `vi.fn()` overloads don't auto-infer from the consumer's parameter type either. Two fixes work and both are local to the test file: (a) cast the var with an intersection β€” `let log: ((msg: string) => void) & ReturnType; log = vi.fn() as any;` β€” or the cleaner (b) `let log: ((msg: string) => void) & ReturnType; log = vi.fn() as ((msg: string) => void) & ReturnType;`. The intersection preserves both the function callability and the `.mock.calls` / `toHaveBeenCalledWith` shape. Generalizes: any unit test that passes a `vi.fn()` mock to a SUT parameter with a NON-`any` callback type needs an explicit signature on the mock β€” either via the `vi.fn()` generics or via an intersection type on the local var. The `deployer-factory.test.ts` pattern doesn't show this gotcha because its mocks are constructor stubs that get registered via `vi.mock(...)` and never passed as args to typed parameters. - -## vi-mock-factory-hoist-blocks-top-level-class-references - -_Discovered: 2026-04-29 by implementer in rf-deploy-8_ - -When a `vi.mock('...', () => ({ ... }))` factory needs to expose a class so the SUT's `instanceof Foo` checks survive the mock (e.g. `instanceof DeployLockError` in `deploy-lock-wrapper.ts`), the class **must be declared INSIDE the factory closure**, not at the test file's top level. Vitest hoists every `vi.mock(...)` call above all imports and other top-level statements (not just `import` lines β€” `class`, `let`, and `const` too), so a top-level `class MockDeployLockError extends Error {}` followed by `vi.mock('./deploy-locks.js', () => ({ DeployLockError: MockDeployLockError }))` blows up at module load with `ReferenceError: Cannot access 'MockDeployLockError' before initialization`. The reported stack frame points at the SUT's `import` line, which is misleading β€” the real cause is the factory running before the class binding initializes. Fix: move the class body inside the factory and re-export it through the mocked module β€” `vi.mock('./deploy-locks.js', () => { class MockDeployLockError extends Error { … } return { DeployLockError: MockDeployLockError, … }; })`. In the test body grab a reference via `const MockDeployLockError = (deployLocks as any).DeployLockError` after the SUT import. Generalizes: any time a `vi.mock` factory needs to reference a value defined at the top level, that value is out of scope when the factory runs. Keep factories self-contained β€” declare classes / helper builders / fixtures inline and surface them back to the test through the mocked module's exports. - -## emit-log-gate-must-mirror-original-truthiness-not-count - -_Discovered: 2026-04-29 by implementer in rf-deploy-10_ - -When extracting an inline emitLog that was inside `if (lastDeploy?.results)` β€” and the count it logs comes from a pre-filter projection (here `prevResources.filter(r => r.success).length` BEFORE the `&& res.resource_id` filter that gates `add_node`) β€” the natural-looking refactor `if (foundCount > 0) emitLog(...)` is NOT behavior-equivalent. Two divergence cases: (a) `results` truthy with zero successful resources β†’ original logs "Found 0 existing resource(s)…", refactor stays silent; (b) `results` has 5 successes but only 3 with `resource_id` β†’ original logs 5, refactor (counting added nodes) would log 3. The fix is to return TWO signals from the helper β€” a `hasResults` boolean (mirrors the original gate) AND a `foundCount` that mirrors the original count projection (success-only, pre-resource_id) β€” and let the caller pair them: `if (hasResults) emitLog(\`Found \${foundCount} ...\`)`. Generalizes: when extracting a logging callsite, the return shape of the helper has to expose both the gate predicate and the message inputs as their original projections; collapsing them into a single "did anything happen" count loses two distinct shades of behavior. Cite this when reviewing any "extract baseline / counter" refactor where the count and the gate were sibling expressions in the same `if`. - -## inline-catches-can-have-inconsistent-error-message-derivations - -_Discovered: 2026-04-29 by implementer in rf-deploy-13_ - -The two destroy loops in `deploy.service.ts` had inline `catch (err: any)` blocks that derived the error message text DIFFERENTLY across uses inside the same catch body. `destroyDeployment`'s catch did `error: err.message` (bare) for the `deleteResults.push` AND for the `emitLog` line, but `err.message || String(err)` for the `emitDestroyNodeStatus.error.message` field β€” three uses, two normalization strategies, in three lines of code. When you extract a per-item helper that surfaces a single normalized `error: string` (`attemptDestroy` returning `{ success: false, error: msg }` where `msg = err?.message || String(err)`), the callsite consumes the SAME string for all three downstream uses β€” which silently UPGRADES the deleteResults push and the log line from "bare message, may be undefined" to "always a string". For Error throws (the realistic 99.9% case) this is invisible β€” `.message` is non-empty so the `|| String(err)` fallback never fires. For non-Error throws (a thrown string, a thrown plain object, a thrown number) the deleteResults entry's `error` field changes from `undefined` to the stringified value and the log line changes from `'Failed to delete X: undefined'` to `'Failed to delete X: [object Object]'`. Generalizes: when an inline catch has multiple uses of `err.message` with inconsistent fallbacks, hoisting the message derivation into a helper picks one normalization for all uses β€” which is strictly more uniform but is technically a behavior change on the edge cases. Note it explicitly in the report (or the commit message) so the critic can verify the change is acceptable; don't pretend the helper is byte-for-byte identical when the inline code wasn't internally consistent in the first place. - -## reexport-audit-distinguish-namespace-imports-from-named-imports - -_Discovered: 2026-04-29 by implementer in rf-deploy-17_ - -When auditing whether an orchestrator-style barrel can drop a re-export, a literal grep for `import { X } from ''` undercounts the consumers β€” `import * as foo from ''` followed by `foo.X` somewhere downstream is also a real consumer of the re-export. In rf-deploy-17 the picture looked like "no external consumers" for `getNodeDeploymentOverlay` and `checkDrift` until I checked `routes/canvas-deploy.ts`, which does `import * as deployService from '../services/deploy.service'` at the top and then dispatches `deployService.checkDrift(...)` / `deployService.getNodeDeploymentOverlay(...)` from the route handlers. Those two re-exports are load-bearing precisely because the route file uses the namespace pattern, not because anyone imports the names directly. The other six re-exports (`mapStatusToOverlay`, `computeCompleteTotals`, `deriveCompleteOutcome`, `enableGcpApi`, `emitDeployEvent`, `emitLog`, `emitDestroyNodeStatus`) had ZERO callers under either pattern outside internal tests that already bound to the canonical homes β€” those went. Generalizes: the re-export audit must run two greps per symbol β€” `import { X }` AND `.X` where `` is whatever variable name the upstream `import * as` uses. Skipping the second grep gives false-DROP verdicts for any re-export consumed via a namespace import, which is the dominant pattern in Express route files (`import * as deployService` then `router.post(..., (req) => deployService.X(...))`). Also: tests that bind to the canonical home via `await import('../utils/.js')` aren't real consumers of the re-export β€” they exercise the new module directly per the rf-deploy-2 / rf-deploy-15 / rf-deploy-16 pattern, so they don't count toward "keep the re-export". The re-export only stays for callers that genuinely route through the orchestrator path. - -## tree-walker-for-react-fc-tests-must-flatten-nested-children-arrays - -_Discovered: 2026-04-29 by implementer in rf-props-6_ - -When writing component tests in a node-only vitest environment (no jsdom in this monorepo), the natural strategy is invoking the `React.FC` directly to inspect its returned element tree, then walking that tree to find ``/`