From e99bb58453f1e453ee2c03398824c960e84ca713 Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Wed, 15 Jul 2026 08:24:56 +0100 Subject: [PATCH] Multi Provider FE content --- discussion/index.ndjson | 4 +- ...D-0057-multi-frontend-provider-contract.md | 17 +- ...der-explicito-como-contrato-de-frontend.md | 92 ++++++++++ ...frontend-provider-and-registry-contract.md | 71 ++++++++ ...introduce-frontendprovider-registry-api.md | 69 ++++++++ ...-wrap-pbs-frontend-as-explicit-provider.md | 73 ++++++++ ...ate-common-consumers-to-provider-lookup.md | 74 ++++++++ .../main/assets/.prometeu/cache.json | 162 +++++++++--------- 8 files changed, 478 insertions(+), 84 deletions(-) create mode 100644 discussion/workflow/decisions/DEC-0040-frontendprovider-explicito-como-contrato-de-frontend.md create mode 100644 discussion/workflow/plans/PLN-0103-specify-frontend-provider-and-registry-contract.md create mode 100644 discussion/workflow/plans/PLN-0104-introduce-frontendprovider-registry-api.md create mode 100644 discussion/workflow/plans/PLN-0105-wrap-pbs-frontend-as-explicit-provider.md create mode 100644 discussion/workflow/plans/PLN-0106-migrate-common-consumers-to-provider-lookup.md diff --git a/discussion/index.ndjson b/discussion/index.ndjson index 339be458..1bd164a4 100644 --- a/discussion/index.ndjson +++ b/discussion/index.ndjson @@ -1,4 +1,4 @@ -{"type":"meta","next_id":{"DSC":66,"AGD":69,"DEC":40,"PLN":103,"LSN":55,"CLSN":1}} +{"type":"meta","next_id":{"DSC":66,"AGD":69,"DEC":41,"PLN":107,"LSN":55,"CLSN":1}} {"type":"discussion","id":"DSC-0065","status":"open","ticket":"multi-frontend-avoid-premature-abstractions","title":"Evitar abstracoes prematuras na preparacao multi-frontend","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["compiler","compiler-general","studio","frontend","architecture","multi-frontend","simplicity"],"agendas":[{"id":"AGD-0068","file":"AGD-0068-multi-frontend-avoid-premature-abstractions.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[],"plans":[],"lessons":[]} {"type":"discussion","id":"DSC-0064","status":"open","ticket":"multi-frontend-architectural-tests","title":"Testes arquiteturais para fronteiras multi-frontend","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["compiler","compiler-general","studio","frontend","architecture","tests","multi-frontend"],"agendas":[{"id":"AGD-0067","file":"AGD-0067-multi-frontend-architectural-tests.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[],"plans":[],"lessons":[]} {"type":"discussion","id":"DSC-0063","status":"open","ticket":"multi-frontend-synthetic-test-frontend","title":"Frontend sintetico de teste para provar neutralidade do pipeline","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["compiler","compiler-general","frontend","tests","backend","multi-frontend"],"agendas":[{"id":"AGD-0066","file":"AGD-0066-multi-frontend-synthetic-test-frontend.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[],"plans":[],"lessons":[]} @@ -10,7 +10,7 @@ {"type":"discussion","id":"DSC-0057","status":"open","ticket":"multi-frontend-frontend-backend-contract","title":"Estabilizar contrato entre frontend e backend comum","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["compiler","compiler-general","compiler-pbs","ir","backend","multi-frontend"],"agendas":[{"id":"AGD-0060","file":"AGD-0060-multi-frontend-frontend-backend-contract.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[],"plans":[],"lessons":[]} {"type":"discussion","id":"DSC-0056","status":"open","ticket":"multi-frontend-remove-pbs-branches","title":"Remover verificacoes explicitas de PBS do codigo comum","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["compiler","compiler-general","compiler-pbs","studio","frontend","coupling","multi-frontend"],"agendas":[{"id":"AGD-0059","file":"AGD-0059-multi-frontend-remove-pbs-branches.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[],"plans":[],"lessons":[]} {"type":"discussion","id":"DSC-0055","status":"open","ticket":"multi-frontend-compiler-vs-language-services","title":"Separar compilacao de servicos editoriais de frontend","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["compiler","compiler-general","studio","lsp","editor","frontend","multi-frontend"],"agendas":[{"id":"AGD-0058","file":"AGD-0058-multi-frontend-compiler-vs-language-services.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[],"plans":[],"lessons":[]} -{"type":"discussion","id":"DSC-0054","status":"open","ticket":"multi-frontend-provider-contract","title":"Introduzir provider completo de frontend","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["compiler","compiler-general","studio","frontend","registry","multi-frontend"],"agendas":[{"id":"AGD-0057","file":"AGD-0057-multi-frontend-provider-contract.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[],"plans":[],"lessons":[]} +{"type":"discussion","id":"DSC-0054","status":"in_progress","ticket":"multi-frontend-provider-contract","title":"Introduzir provider completo de frontend","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["compiler","compiler-general","studio","frontend","registry","multi-frontend"],"agendas":[{"id":"AGD-0057","file":"AGD-0057-multi-frontend-provider-contract.md","status":"accepted","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[{"id":"DEC-0040","file":"DEC-0040-frontendprovider-explicito-como-contrato-de-frontend.md","status":"accepted","created_at":"2026-07-15","updated_at":"2026-07-15","ref_agenda":"AGD-0057"}],"plans":[{"id":"PLN-0103","file":"PLN-0103-specify-frontend-provider-and-registry-contract.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0040"]},{"id":"PLN-0104","file":"PLN-0104-introduce-frontendprovider-registry-api.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0040"]},{"id":"PLN-0105","file":"PLN-0105-wrap-pbs-frontend-as-explicit-provider.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0040"]},{"id":"PLN-0106","file":"PLN-0106-migrate-common-consumers-to-provider-lookup.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0040"]}],"lessons":[]} {"type":"discussion","id":"DSC-0053","status":"open","ticket":"pbs-lsp-call-and-type-hierarchy","title":"PBS LSP Call and Type Hierarchy","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["studio","lsp","vscode","compiler-pbs","editor","call-hierarchy","type-hierarchy"],"agendas":[{"id":"AGD-0056","file":"AGD-0056-pbs-lsp-call-and-type-hierarchy.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[],"plans":[],"lessons":[]} {"type":"discussion","id":"DSC-0052","status":"open","ticket":"pbs-lsp-document-links","title":"PBS LSP Document Links","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["studio","lsp","vscode","compiler-pbs","editor","document-links","imports"],"agendas":[{"id":"AGD-0055","file":"AGD-0055-pbs-lsp-document-links.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[],"plans":[],"lessons":[]} {"type":"discussion","id":"DSC-0051","status":"open","ticket":"pbs-lsp-diagnostics-ux","title":"PBS LSP Diagnostics UX","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["studio","lsp","vscode","compiler-pbs","editor","diagnostics","ux"],"agendas":[{"id":"AGD-0054","file":"AGD-0054-pbs-lsp-diagnostics-ux.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[],"plans":[],"lessons":[]} diff --git a/discussion/workflow/agendas/AGD-0057-multi-frontend-provider-contract.md b/discussion/workflow/agendas/AGD-0057-multi-frontend-provider-contract.md index d193aeae..dbb0267f 100644 --- a/discussion/workflow/agendas/AGD-0057-multi-frontend-provider-contract.md +++ b/discussion/workflow/agendas/AGD-0057-multi-frontend-provider-contract.md @@ -2,7 +2,7 @@ id: AGD-0057 ticket: multi-frontend-provider-contract title: Introduzir provider completo de frontend -status: open +status: accepted created: 2026-07-15 resolved: decision: @@ -77,3 +77,18 @@ Comecar por uma auditoria de chamadas atuais ao registry e de instanciacoes dire - Responsabilidades minimas do provider. - Onde fica o composition root autorizado a registrar PBS. +## Resolucao aceita + +O contrato deve ser introduzido como `FrontendProvider`. + +Responsabilidades minimas: + +- expor a especificacao do frontend por `specification()`; +- expor o compilador ou fase de compilacao equivalente por `compiler()`; +- expor servicos editoriais por `languageService()` somente como capacidade opcional, quando necessaria para o Studio. + +O contrato nao deve incluir descoberta dinamica de plugins, reflection, classpath scanning ou carregamento externo de JARs. + +O registro inicial deve continuar explicito no composition root da aplicacao, com `prometeu-app/src/main/java/p/studio/AppContainer.java` como ponto preferencial de composicao. Codigo comum deve consumir o provider via `registry.require(languageId)` e nao deve instanciar diretamente classes PBS, incluindo `PBSFrontendPhaseService`. + +PBS permanece o unico provider inicial. Nenhum frontend real novo deve ser criado por esta frente. diff --git a/discussion/workflow/decisions/DEC-0040-frontendprovider-explicito-como-contrato-de-frontend.md b/discussion/workflow/decisions/DEC-0040-frontendprovider-explicito-como-contrato-de-frontend.md new file mode 100644 index 00000000..b9782807 --- /dev/null +++ b/discussion/workflow/decisions/DEC-0040-frontendprovider-explicito-como-contrato-de-frontend.md @@ -0,0 +1,92 @@ +--- +id: DEC-0040 +ticket: multi-frontend-provider-contract +title: FrontendProvider explicito como contrato de frontend +status: accepted +created: 2026-07-15 +ref_agenda: AGD-0057 +tags: [compiler, compiler-general, studio, frontend, registry, multi-frontend] +--- + +## Context + +This decision belongs to domain owner `compiler/general`, with impact on `studio`. + +The repository already has `FrontendRegistryService`, `FrontendSpec`, `FrontendPhaseService`, and `languageId` based selection. Those surfaces are enough to keep PBS working, but common compiler and Studio code still has places where PBS-specific classes or assumptions can leak into composition and consumption paths. + +The multi-frontend direction requires a stable provider boundary before removing PBS-specific branches from common code. The boundary must make frontend registration explicit without turning the Studio or compiler into a dynamic plugin platform. + +This decision resolves `AGD-0057`. + +## Decision + +The repository MUST introduce an explicit `FrontendProvider` contract as the common frontend registration unit. + +`FrontendProvider` MUST expose the following minimum responsibilities: + +- `specification()`: returns the frontend specification, including its stable `languageId`; +- `compiler()`: returns the compiler-facing frontend service or phase equivalent used by the build pipeline; +- `languageService()`: returns an optional editor-facing language service capability for Studio consumers. + +`languageService()` MUST be optional. A frontend that can compile but does not provide editor services MUST remain a valid provider. + +`FrontendRegistryService` MUST resolve providers by `languageId`. The common consumption shape SHOULD become `provider = registry.require(languageId)` or an equivalent explicit lookup that fails clearly for unknown languages. + +PBS MUST be registered as the only initial real provider through a `PBSFrontendProvider` or equivalent concrete provider object. This work MUST NOT introduce another real frontend. + +Provider registration MUST remain explicit in the application composition root. `prometeu-app/src/main/java/p/studio/AppContainer.java` is the preferred initial composition point for registering the PBS provider. + +Common compiler, build pipeline, and Studio code MUST NOT instantiate PBS-specific frontend services directly. In particular, common code MUST NOT directly instantiate `PBSFrontendPhaseService`; it MUST obtain the relevant service through the provider resolved from the registry. + +This decision MUST NOT introduce dynamic plugin discovery, reflection-based discovery, classpath scanning, external JAR loading, or runtime plugin installation. + +## Rationale + +An explicit provider object gives the project one stable unit for frontend identity, compilation, and optional editorial capability. It keeps `languageId` as the selection key while avoiding scattered direct knowledge of PBS in common code. + +Keeping the provider small prevents a premature plugin architecture. The immediate goal is static multi-frontend readiness inside the repository, not external extensibility. + +Making language services optional separates build correctness from Studio editor assistance. A frontend should be able to participate in compilation without being forced to implement editor features in the same wave. + +Using the application composition root for registration keeps ownership clear: composition may know that PBS exists, but shared compiler and Studio consumers should only know the provider contract. + +## Implications + +- `FrontendRegistryService` will need to evolve from spec/phase lookups into provider lookup, while preserving compatibility during migration where necessary. +- Existing PBS registration must be wrapped behind a provider object. +- Common consumers that currently request `FrontendSpec` or `FrontendPhaseService` directly may be migrated incrementally to provider lookup. +- Studio catalog code may continue listing specifications, but its source should become provider-derived rather than PBS-specific. +- Build pipeline code should obtain compiler-facing frontend behavior from the resolved provider. +- Error handling for unknown `languageId` must remain explicit and diagnostic-friendly. +- No product or runtime behavior should change for PBS as the only registered provider. + +## Propagation Targets + +- specs: + - Add or update a `compiler/general` specification for the frontend provider and registry contract. + - Reference Studio-facing optional language service capability where relevant. +- plans: + - Create an implementation plan for provider contract introduction, PBS provider registration, consumer migration, and tests. +- code: + - `prometeu-compiler/prometeu-frontend-registry/src/main/java/p/studio/compiler/FrontendRegistryService.java` + - PBS frontend module provider implementation. + - `prometeu-compiler/prometeu-build-pipeline/...` consumers that resolve frontend services. + - `prometeu-studio/src/main/java/p/studio/projects/ProjectLanguageCatalogService.java` + - `prometeu-app/src/main/java/p/studio/AppContainer.java` +- tests: + - Registry resolves a provider by `languageId`. + - PBS is registered as the only initial real provider. + - Unknown `languageId` fails with a clear error. + - Common code can obtain compiler-facing frontend behavior without directly instantiating `PBSFrontendPhaseService`. +- docs: + - Decision-derived implementation plan. + - Lessons after implementation and housekeeping, if the completed work produces reusable guidance. + +## References + +- Agenda: AGD-0057 +- Source discussion: DSC-0054 + +## Revision Log + +- 2026-07-15: Initial decision drafted from accepted `AGD-0057`. diff --git a/discussion/workflow/plans/PLN-0103-specify-frontend-provider-and-registry-contract.md b/discussion/workflow/plans/PLN-0103-specify-frontend-provider-and-registry-contract.md new file mode 100644 index 00000000..ec791081 --- /dev/null +++ b/discussion/workflow/plans/PLN-0103-specify-frontend-provider-and-registry-contract.md @@ -0,0 +1,71 @@ +--- +id: PLN-0103 +ticket: multi-frontend-provider-contract +title: Specify frontend provider and registry contract +status: open +created: 2026-07-15 +ref_decisions: [DEC-0040] +tags: [compiler, compiler-general, studio, frontend, registry, multi-frontend] +--- + +## Briefing + +DEC-0040 locks an explicit `FrontendProvider` contract as the common frontend registration unit. The first implementation step is to make that contract normative in the compiler/general specs before changing code. + +Domain owner: `compiler/general`, with impact on `studio`. + +## Objective + +Specify the frontend provider and registry contract so implementation can introduce the API without relying on implicit behavior or PBS-specific assumptions. + +## Dependencies + +- Accepted decision: `DEC-0040`. +- Existing compiler specs under `docs/specs/compiler/`. +- Existing Studio/editor references may be linked but must not become the owner of the contract. + +## Scope + +- Add or update a compiler/general spec section defining `FrontendProvider`. +- Define required provider responsibilities: + - `specification()`; + - `compiler()`; + - optional `languageService()`. +- Define `languageId` as the registry lookup key. +- Define explicit provider registration as the only supported v1 registration model. +- Define PBS as the only initial real provider. +- Define unknown-language failure behavior as explicit and diagnostic-friendly. +- Define that common code must obtain compiler-facing frontend behavior through provider lookup. + +## Non-Goals + +- Do not specify dynamic plugin discovery. +- Do not specify reflection, classpath scanning, external JAR loading, or runtime plugin installation. +- Do not introduce a second real frontend. +- Do not define the full Studio language-service API beyond optional provider capability. + +## Execution Method + +1. Inspect existing compiler/general spec organization and choose the nearest owner document for registry and frontend composition. +2. Add a `FrontendProvider` section with normative `MUST` language for required and optional responsibilities. +3. Add a registry section stating that providers are resolved by `languageId` and that unknown languages fail clearly. +4. Add a registration section stating that provider registration is explicit and composition-root-owned. +5. Add a PBS v1 section stating that PBS is the only initial real provider and no new frontend is introduced by this work. +6. Cross-reference Studio only as an optional language-service consumer, not as the owner of the provider contract. + +## Acceptance Criteria + +- A compiler/general spec defines `FrontendProvider`, registry lookup, explicit registration, and PBS-only initial provider status. +- The spec prohibits plugin discovery, reflection discovery, scanning, external JAR loading, and runtime plugin installation for this decision. +- The spec makes `languageService()` optional and does not require editor support for a compilable frontend. +- The spec is written in English. + +## Tests + +- Documentation validation through review against `DEC-0040`. +- No code tests are required in this plan. + +## Affected Artifacts + +- `docs/specs/compiler/...` +- `discussion/workflow/decisions/DEC-0040-frontendprovider-explicito-como-contrato-de-frontend.md` diff --git a/discussion/workflow/plans/PLN-0104-introduce-frontendprovider-registry-api.md b/discussion/workflow/plans/PLN-0104-introduce-frontendprovider-registry-api.md new file mode 100644 index 00000000..9f6b6265 --- /dev/null +++ b/discussion/workflow/plans/PLN-0104-introduce-frontendprovider-registry-api.md @@ -0,0 +1,69 @@ +--- +id: PLN-0104 +ticket: multi-frontend-provider-contract +title: Introduce FrontendProvider registry API +status: open +created: 2026-07-15 +ref_decisions: [DEC-0040] +tags: [compiler, compiler-general, studio, frontend, registry, multi-frontend] +--- + +## Briefing + +DEC-0040 requires common code to resolve frontend behavior through a provider. This plan introduces the API surface in the frontend registry without forcing all consumers to migrate in the same change. + +Domain owner: `compiler/general`. + +## Objective + +Introduce `FrontendProvider` and provider-based registry lookup while preserving existing PBS behavior during migration. + +## Dependencies + +- `PLN-0103` should define the normative spec first. +- Accepted decision: `DEC-0040`. +- Existing registry module: `prometeu-compiler/prometeu-frontend-registry`. + +## Scope + +- Add the `FrontendProvider` contract in the frontend registry module. +- Add an optional language-service return shape, using an existing interface if one already exists or a minimal neutral placeholder only if required. +- Add provider registration and provider lookup by `languageId`. +- Add `require(languageId)` or equivalent explicit lookup that fails clearly for unknown languages. +- Preserve compatibility methods during migration if existing consumers still call spec or phase lookup. + +## Non-Goals + +- Do not register PBS in this plan unless needed for API tests with a simple fixture. +- Do not migrate build pipeline or Studio consumers in this plan. +- Do not add plugin discovery, reflection, scanning, external JAR loading, or runtime plugin installation. +- Do not define a broad editor API. + +## Execution Method + +1. Inspect `FrontendRegistryService`, `FrontendSpec`, and `FrontendPhaseService` to confirm current method names and package ownership. +2. Add `FrontendProvider` to the registry-facing package with `specification()`, `compiler()`, and optional `languageService()`. +3. Update `FrontendRegistryService` so its primary storage is provider keyed by `languageId`. +4. Add `require(languageId)` or the nearest local naming equivalent for provider lookup. +5. Keep old spec/phase accessor methods as provider-derived compatibility wrappers if they are still used. +6. Add registry unit tests for provider registration, provider lookup, duplicate language handling if currently supported, and unknown-language errors. + +## Acceptance Criteria + +- `FrontendProvider` exists and exposes all responsibilities required by `DEC-0040`. +- `FrontendRegistryService` can resolve a provider by `languageId`. +- Unknown `languageId` lookup fails with a clear exception or diagnostic message. +- Existing callers can still compile until their migration plan runs. + +## Tests + +- Registry test: registered provider is returned by `languageId`. +- Registry test: unknown `languageId` fails clearly. +- Registry test: provider-derived spec listing remains correct if compatibility methods remain. +- Run the relevant Gradle test task for `prometeu-frontend-registry`. + +## Affected Artifacts + +- `prometeu-compiler/prometeu-frontend-registry/src/main/java/p/studio/compiler/FrontendRegistryService.java` +- New `FrontendProvider` contract in the same registry API surface. +- Registry tests under `prometeu-compiler/prometeu-frontend-registry/src/test/...` diff --git a/discussion/workflow/plans/PLN-0105-wrap-pbs-frontend-as-explicit-provider.md b/discussion/workflow/plans/PLN-0105-wrap-pbs-frontend-as-explicit-provider.md new file mode 100644 index 00000000..fbeef9ba --- /dev/null +++ b/discussion/workflow/plans/PLN-0105-wrap-pbs-frontend-as-explicit-provider.md @@ -0,0 +1,73 @@ +--- +id: PLN-0105 +ticket: multi-frontend-provider-contract +title: Wrap PBS frontend as explicit provider +status: open +created: 2026-07-15 +ref_decisions: [DEC-0040] +tags: [compiler, compiler-general, studio, frontend, registry, multi-frontend] +--- + +## Briefing + +DEC-0040 requires PBS to become the only initial real provider behind the new `FrontendProvider` contract. This plan wraps existing PBS frontend behavior without changing PBS product behavior. + +Domain owner: `compiler/general`, with implementation in `compiler/pbs` and composition impact in `prometeu-app`. + +## Objective + +Create and register an explicit PBS provider through the application composition root. + +## Dependencies + +- `PLN-0104` must introduce `FrontendProvider` and provider lookup first. +- Accepted decision: `DEC-0040`. +- Existing PBS frontend phase/service implementation. +- Application composition root in `prometeu-app`. + +## Scope + +- Add `PBSFrontendProvider` or equivalent concrete provider object. +- Make the provider return the existing PBS `FrontendSpec`. +- Make the provider return the existing PBS compiler-facing service or phase. +- Return no language service, or the existing PBS language-service adapter only if already present and compatible. +- Register PBS explicitly in `prometeu-app/src/main/java/p/studio/AppContainer.java` or the nearest current application composition point. +- Ensure PBS remains the only initial real provider. + +## Non-Goals + +- Do not create another real frontend. +- Do not change PBS parsing, semantics, lowering, or runtime output. +- Do not migrate all common consumers in this plan. +- Do not introduce dynamic provider discovery. + +## Execution Method + +1. Inspect PBS frontend module boundaries and locate the current `FrontendSpec` and `FrontendPhaseService` construction. +2. Add `PBSFrontendProvider` in the PBS frontend module or an existing integration package that can legally depend on PBS. +3. Implement `specification()` and `compiler()` by delegating to the existing PBS objects. +4. Implement `languageService()` as empty unless a current Studio-compatible PBS language service already exists. +5. Update `AppContainer` or the existing composition root to register the PBS provider explicitly with `FrontendRegistryService`. +6. Remove direct PBS registration paths that duplicate the provider registration if they become redundant. +7. Add tests proving only PBS is registered as the real provider in the default composition path. + +## Acceptance Criteria + +- PBS is represented by a concrete provider object. +- Default application composition registers PBS explicitly as a provider. +- PBS remains functional through existing compile/build flows. +- No additional real frontend is introduced. +- No dynamic discovery mechanism is added. + +## Tests + +- Provider test: `PBSFrontendProvider.specification()` returns the PBS language id. +- Provider test: `PBSFrontendProvider.compiler()` returns working compiler-facing behavior. +- Composition test: default registry contains PBS as the only real provider. +- Existing PBS compile/build tests continue to pass. + +## Affected Artifacts + +- PBS frontend module under `prometeu-compiler/frontends/prometeu-frontend-pbs/...` +- `prometeu-app/src/main/java/p/studio/AppContainer.java` +- Registry or application composition tests. diff --git a/discussion/workflow/plans/PLN-0106-migrate-common-consumers-to-provider-lookup.md b/discussion/workflow/plans/PLN-0106-migrate-common-consumers-to-provider-lookup.md new file mode 100644 index 00000000..1dd6090f --- /dev/null +++ b/discussion/workflow/plans/PLN-0106-migrate-common-consumers-to-provider-lookup.md @@ -0,0 +1,74 @@ +--- +id: PLN-0106 +ticket: multi-frontend-provider-contract +title: Migrate common consumers to provider lookup +status: open +created: 2026-07-15 +ref_decisions: [DEC-0040] +tags: [compiler, compiler-general, studio, frontend, registry, multi-frontend] +--- + +## Briefing + +DEC-0040 forbids common compiler, build pipeline, and Studio code from directly instantiating PBS-specific frontend services. After the registry API and PBS provider exist, consumers must move to provider lookup. + +Domain owner: `compiler/general`, with impact on `studio`. + +## Objective + +Migrate common consumers from direct spec/phase/PBS access to provider-based lookup by `languageId`. + +## Dependencies + +- `PLN-0104` must provide provider lookup. +- `PLN-0105` must register PBS as a provider. +- Accepted decision: `DEC-0040`. + +## Scope + +- Audit common compiler, build pipeline, Studio, and app code for direct PBS frontend service construction. +- Replace common code service lookup with provider lookup. +- Make build pipeline frontend execution obtain compiler-facing behavior from `provider.compiler()`. +- Make Studio project language catalog list specifications from providers. +- Keep PBS-specific construction inside PBS provider or composition root only. +- Add or update tests that prove common code does not directly instantiate `PBSFrontendPhaseService`. + +## Non-Goals + +- Do not remove compatibility registry APIs unless all callers have migrated and the removal is local. +- Do not introduce new frontend behavior. +- Do not change backend IR, validation boundaries, or lifecycle semantics beyond provider lookup. +- Do not implement optional Studio language services that do not already exist. + +## Execution Method + +1. Search for `PBSFrontendPhaseService`, PBS frontend constructors, `getFrontendPhaseService`, and `getFrontendSpec` usage outside PBS and composition-owned code. +2. Classify each usage as composition-owned, PBS-owned, or common consumer. +3. Update common consumers to resolve `FrontendProvider` by `languageId`. +4. Update `FrontendPhasePipelineStage` so it calls provider compiler behavior rather than direct phase lookup. +5. Update `ProjectLanguageCatalogService` so its catalog is provider-derived. +6. Keep compatibility wrappers only where they reduce migration risk and are provider-derived. +7. Add architectural tests or focused unit tests that fail if common modules instantiate `PBSFrontendPhaseService` directly. +8. Run relevant compiler, build pipeline, Studio, and app tests. + +## Acceptance Criteria + +- Common compiler/build pipeline/Studio code obtains frontend behavior through provider lookup. +- Direct `PBSFrontendPhaseService` instantiation remains only in PBS provider or approved composition code. +- `ProjectLanguageCatalogService` is provider-derived. +- Unknown `languageId` failures remain clear after consumer migration. +- PBS compile/build behavior remains unchanged. + +## Tests + +- Unit or integration test: build pipeline resolves PBS through provider and compiles an existing PBS fixture. +- Unit test: Studio language catalog lists PBS from provider specs. +- Architecture test or grep-backed test: common modules do not instantiate `PBSFrontendPhaseService`. +- Existing PBS and build pipeline tests pass. + +## Affected Artifacts + +- `prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/stages/FrontendPhasePipelineStage.java` +- `prometeu-studio/src/main/java/p/studio/projects/ProjectLanguageCatalogService.java` +- Common code currently using `FrontendRegistryService.getFrontendSpec` or `getFrontendPhaseService`. +- Tests in compiler, build pipeline, Studio, and app modules. diff --git a/test-projects/main/assets/.prometeu/cache.json b/test-projects/main/assets/.prometeu/cache.json index a120673e..6b0c9b03 100644 --- a/test-projects/main/assets/.prometeu/cache.json +++ b/test-projects/main/assets/.prometeu/cache.json @@ -14,13 +14,13 @@ "last_modified" : 1779659315450, "fingerprint" : "ac565160c0dceb321b8f6c9094f2b5e6ae398396fe32c8ead706f5cc36f465cf", "metadata" : { - "palette" : { - "rgba8888" : [ 0, 673720574, -523190018, -117903106, 945858814, -1600620290, 1484833022 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgICAgICAQAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAEDBAQEBAQCAQAAAAAAAQEBAQICAgEAAAAAAAAAAAAAAQMEAgUFBQQCAQEBAQECAgICBAQEAgEAAAAAAAAAAAABAwQCBQUFBQQDAwMDAgQEBAQFAgIEAwEBAAAAAAAAAAEDBAIFBQUFAgQEBgYEBQUFBQICAgIEAwMBAQAAAAAAAQMEAgUFBQICAgMDAwIFBQUFBQICAgIGBgMCAQAAAAABAwQCBQUFAgICAgMDAgUFBQUFAgICAwMDBAQCAQEAAAEDBAIFBQUCAgICAwMCBQUFBQUCAgICAwMCAgQFAQAAAQMEAgUFBQICAgIDAwIFBQUFBAQEBAQDAwQEBQEAAAABAwQCBQUFAgICAgMDAgUFBAQFAgICAgYGAgUBAAAAAAEDBAIEBAQEBAICAwMCBQQFBQEBAQEBAwMBAQAAAAAAAQMEBAUFBQUCBAIDAwIEBQEBAAAAAAABAQAAAAAAAAABAwICBQEBAQECBAYGBAUBAAAAAAAAAAAAAAAAAAAAAQECAgIBAAAAAAEDAwICAQAAAAAAAAAAAAAAAAAAAAEBAQEBAQAAAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + }, + "palette" : { + "rgba8888" : [ 0, 673720574, -523190018, -117903106, 945858814, -1600620290, 1484833022 ] } }, "diagnostics" : [ ] @@ -59,13 +59,13 @@ "last_modified" : 1779659315452, "fingerprint" : "6dd024eb2259efaa03908ff0c3b75eb67f9da56d365e4a35d8e619b71c7507db", "metadata" : { - "palette" : { - "rgba8888" : [ 0, 255, -540033025, -134746113, -101191169, 945858815, 1501544959, -1617463297, -1583777281, -1583908353, -1617462785, 929015807, 962701823, 690432511 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgMDBAEBAQEBAAAAAAAAAAAAAAABAQAAAAAAAAAAAAECBQYGBAIHBwgBAAAAAAAAAAEBAQICAQEAAAAAAAAAAQIFAwMGBQUFBQIBAAAAAAEBCQIHBQUDBAEBAAAAAAABAgUDAwIICAoIBQIBAQEBBwcLCwwIAgYGAwMBAAAAAAECBQMDAgoKCgoKBQMDAwIFBQgCCgIKAgIGAwEAAAAAAQIFAwMCCAgICAgCBQYGBQoKCgoCCgICAwMGAwEAAAABAgUDAggICAgICAICAwMCCAgIAggFBQUGBgYDDQAAAAECBgMCCAgICAgIAgIDAggICAgFBQoCAwMDAwQEAQAAAQIGAwIICAgICAgCAgMCCAgIBQgKAQEBAQEBAQQBAAABAgYDAggICAgIAgICAwIKCAUIAQEAAAAAAAAAAQEAAAECBgMCCAgICAUFAgIDAggFCgEAAAAAAAAAAAAAAAAAAQIGAwIICAUFCAIFBQYLBQgBAAAAAAAAAAAAAAAAAAABAgYFBQUFCAoBAQIDBAIJAQAAAAAAAAAAAAAAAAAAAQECAwIICAgBAQAAAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + }, + "palette" : { + "rgba8888" : [ 0, 255, -540033025, -134746113, -101191169, 945858815, 1501544959, -1617463297, -1583777281, -1583908353, -1617462785, 929015807, 962701823, 690432511 ] } }, "diagnostics" : [ ] @@ -76,13 +76,13 @@ "last_modified" : 1779659315453, "fingerprint" : "c8e30f40473deedb265be26967f6bf5f2ba35a2bd5d0a049dcb8843fa60d5600", "metadata" : { - "palette" : { - "rgba8888" : [ 0, 538976511, 1368527103, 1907499263, -205315841, -1014890241, -1302257409, -202116097, -207461889, -476950017, 1631658239, -1300082177 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQICAwMBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBAQBAgIDAwMCAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQUFBAQBAgIDAgICAQAAAAAAAAAAAAAAAAAAAAAAAAABBQEFBAUBAgICAgMBAAAAAAAAAAAAAAAAAAAAAAAAAAABBgEFBQUBAgECAgMBAAAAAAAAAAAAAAAAAAAAAAAAAAEGBwEFBAEBCAECAwEAAAAAAAAAAAAAAAAAAAAAAAAAAQgBBwEEAQgJAQICAQAAAAAAAAAAAAAAAAAAAAAAAAEICAEHAQQBCQYBAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAEGCQkBBQEGAQUBAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBBgYBBgEBAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQcBAQEBAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAwECAwIBAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQECAQcHBwECAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBAEBAQEBAQECAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgEJCgoBAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEJCQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEKAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQELCwoKAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + }, + "palette" : { + "rgba8888" : [ 0, 538976511, 1368527103, 1907499263, -205315841, -1014890241, -1302257409, -202116097, -207461889, -476950017, 1631658239, -1300082177 ] } }, "diagnostics" : [ ] @@ -93,13 +93,13 @@ "last_modified" : 1779659315454, "fingerprint" : "58a6a9bc02d9174fdc6bcd6f71f5fb86c47d506812e83cae5b0e23a1f951dbbf", "metadata" : { - "palette" : { - "rgba8888" : [ 0, 538976511, 1368527103, 1907499263, -205315841, -1014890241, -1302257409, -202116097, -207461889, -476950017, 1631658239, -1300082177 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQECAgMDAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQQEAQICAwMDAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAEFBQQEAQICAwICAgEAAAAAAAAAAAAAAAAAAAAAAAAAAQUBBQQFAQICAgIDAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQYBBQUFAQIBAgIDAQAAAAAAAAAAAAAAAAAAAAAAAAABBgcBBQQBAQgBAgMBAAAAAAAAAAAAAAAAAAAAAAAAAAEIAQcBBAEICQECAgEAAAAAAAAAAAAAAAAAAAAAAAABCAgBBwEEAQkGAQICAQAAAAAAAAAAAAAAAAAAAAAAAAABBgkJAQUBBgEFAQIBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQYGAQYBAQEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEHAQEBAQECAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgEBBwMBAwMBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBCQoBBwEDAgEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAgEJCQoBAgIBAQIBAAAAAAAAAAAAAAAAAAAAAAAAAAECAgEBAQICAQECAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgECAQECAgEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQICAgEBAQoKAQAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQELCwoBAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQsLAQEAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + }, + "palette" : { + "rgba8888" : [ 0, 538976511, 1368527103, 1907499263, -205315841, -1014890241, -1302257409, -202116097, -207461889, -476950017, 1631658239, -1300082177 ] } }, "diagnostics" : [ ] @@ -110,13 +110,13 @@ "last_modified" : 1779659315454, "fingerprint" : "110c4f835a40bb370c7bb7761afcd69de0d38e75798d20d50f4c203aa56f213a", "metadata" : { - "palette" : { - "rgba8888" : [ 0, 538976511, 1368527103, 1907499263, -205315841, -1014890241, -1302257409, -202116097, -207461889, -476950017, 1631658239, -1300082177 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQECAgMDAQEAAAEBAAAAAAAAAAAAAAAAAAAAAAABBAQEAQICAwMDAgEBAwEAAAAAAAAAAAAAAAAAAAAAAAEFBQQEAQICAwICAQIDAQAAAAAAAAAAAAAAAAAAAAAAAAEBBQQFAQICAgICAwEBAAAAAAAAAAAAAAAAAAAAAAAAAQYBBQUFAQIBAgICAQAAAAAAAAAAAAAAAAAAAAAAAAABBgcBBQQFAQgBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAEIAQcBBAUBCQEBBQUBAAAAAAAAAAAAAAAAAAAAAAABCAgBBwgBBAUBAQUBAAAAAAAAAAAAAAAAAAAAAAAAAAABBgkJBgYBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQYGBgYBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQMBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEJCgEHAwECAwEBAQAAAAAAAAAAAAAAAAAAAAAAAAABAQkKAQcCAQIDAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAEKAQEBAQECAgEBAgELAQAAAAAAAAAAAAAAAAAAAAAAAQEKAQICAQEBAgIBAQoLAQAAAAAAAAAAAAAAAAAAAAAAAQEBAQECAgICAQEAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + }, + "palette" : { + "rgba8888" : [ 0, 538976511, 1368527103, 1907499263, -205315841, -1014890241, -1302257409, -202116097, -207461889, -476950017, 1631658239, -1300082177 ] } }, "diagnostics" : [ ] @@ -127,13 +127,13 @@ "last_modified" : 1779659315455, "fingerprint" : "2e6fb2cfbf77f4b3c0d116b9b77a3ae228cdc5671bd18320285824faef9674d3", "metadata" : { - "palette" : { - "rgba8888" : [ 0, 538976511, 1368527103, 1907499263, -205315841, -1014890241, -1302257409, -202116097, -207461889, -476950017, 1631658239, -1300082177 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQICAwMBAQEBAwEAAAAAAAAAAAAAAAAAAAAAAAABBAQBAgIDAwMCAQMDAQAAAAAAAAAAAAAAAAAAAAAAAQUFBAQBAgIDAgICAwIBAAAAAAAAAAAAAAAAAAAAAAABBQEFBAUBAgICAgMCAQAAAAAAAAAAAAAAAAAAAAAAAAABBgEFBQUBAgECAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAEGBwEFBAUBCAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQgBBwEEBQEJAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEICAEHCQEEBQEFAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBCQkGBgEBAQUBAAAAAAAAAAAAAAAAAAAAAAAAAAABCQoBAQEGBgEBAQUBAAAAAAAAAAAAAAAAAAAAAAAAAAEKCgEHAgEBAQMBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBBwICAQIDAwEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQECAgMBAQIBAAAAAAAAAAAAAAAAAAAAAAAAAQoBAQIBAgICAgECAQEAAAAAAAAAAAAAAAAAAAAAAAABCgoBAgIBAQEBAgELAQAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQICAgIBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + }, + "palette" : { + "rgba8888" : [ 0, 538976511, 1368527103, 1907499263, -205315841, -1014890241, -1302257409, -202116097, -207461889, -476950017, 1631658239, -1300082177 ] } }, "diagnostics" : [ ] @@ -144,13 +144,13 @@ "last_modified" : 1779659315455, "fingerprint" : "c8e30f40473deedb265be26967f6bf5f2ba35a2bd5d0a049dcb8843fa60d5600", "metadata" : { - "palette" : { - "rgba8888" : [ 0, 538976511, 1368527103, 1907499263, -205315841, -1014890241, -1302257409, -202116097, -207461889, -476950017, 1631658239, -1300082177 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQICAwMBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBAQBAgIDAwMCAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQUFBAQBAgIDAgICAQAAAAAAAAAAAAAAAAAAAAAAAAABBQEFBAUBAgICAgMBAAAAAAAAAAAAAAAAAAAAAAAAAAABBgEFBQUBAgECAgMBAAAAAAAAAAAAAAAAAAAAAAAAAAEGBwEFBAEBCAECAwEAAAAAAAAAAAAAAAAAAAAAAAAAAQgBBwEEAQgJAQICAQAAAAAAAAAAAAAAAAAAAAAAAAEICAEHAQQBCQYBAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAEGCQkBBQEGAQUBAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBBgYBBgEBAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQcBAQEBAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAwECAwIBAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQECAQcHBwECAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBAEBAQEBAQECAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgEJCgoBAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEJCQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEKAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQELCwoKAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + }, + "palette" : { + "rgba8888" : [ 0, 538976511, 1368527103, 1907499263, -205315841, -1014890241, -1302257409, -202116097, -207461889, -476950017, 1631658239, -1300082177 ] } }, "diagnostics" : [ ] @@ -161,13 +161,13 @@ "last_modified" : 1779659315456, "fingerprint" : "94ac699b5e913925cf881e76ff951875147b598b1ee9870187111e7ca0b40d1d", "metadata" : { - "palette" : { - "rgba8888" : [ 0, 538976511, 1368527103, 1907499263, -205315841, -1014890241, -1302257409, -202116097, -207461889, -476950017, 1631658239 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQICAwMBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBAQBAgIDAwMCAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQUFBAQBAgIDAgICAQAAAAAAAAAAAAAAAAAAAAAAAAABBQEFBAUBAgICAgMBAAAAAAAAAAAAAAAAAAAAAAAAAAABBgEFBQUBAgECAgMBAAAAAAAAAAAAAAAAAAAAAAAAAAEGBwEFBAEBCAECAwEAAAAAAAAAAAAAAAAAAAAAAAAAAQgBBwEEAQgJAQICAQAAAAAAAAAAAAAAAAAAAAAAAAEICAEHAQQBCQYBAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAEGCQkBBQEGAQUBAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBBgYBAQEBAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQcBAQEDAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAwMBAgcHAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQMDAwIBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBAIDAgEKCgECAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAQEBAQkJAQIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQECAgICAQECAQoBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQICAgEKCgEAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBCgoKAQAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + }, + "palette" : { + "rgba8888" : [ 0, 538976511, 1368527103, 1907499263, -205315841, -1014890241, -1302257409, -202116097, -207461889, -476950017, 1631658239 ] } }, "diagnostics" : [ ] @@ -178,13 +178,13 @@ "last_modified" : 1779659315457, "fingerprint" : "fc0a623650619ca39c1ce2f9f9e1b0f6951abd194e18ea60c682fae6a769df97", "metadata" : { - "palette" : { - "rgba8888" : [ 0, 538976511, 1368527103, 1907499263, -205315841, -1014890241, -1302257409, -202116097, -207461889, -476950017, 1631658239, -1300082177 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQICAwMBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEBAQBAgIDAwMCAQABAQAAAAAAAAAAAAAAAAAAAAAAAQUFBAQBAgIDAgIBAQMBAAAAAAAAAAAAAAAAAAAAAAAAAQEFBAUBAgICAgIDAwEAAAAAAAAAAAAAAAAAAAAAAAABBgEFBQUBAgECAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAEGBwEFBAUBCAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAQgBBwEEBQEJAQEFBQEAAAAAAAAAAAAAAAAAAAAAAAEICAEHCAEEBQEBBQEBAAAAAAAAAAAAAAAAAAAAAAAAAAEGCQkGBgEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBBgYGAQIDAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCQEBAQEBAQEHAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBBwcDAgEKCgEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAgIBAwMCAQkJAQEAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQIBAgMCAQEBCgEAAAAAAAAAAAAAAAAAAAAAAAABCwsKAQIBAQECAgEKAQAAAAAAAAAAAAAAAAAAAAAAAAABCwsKAQICAgIBCgoBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + }, + "palette" : { + "rgba8888" : [ 0, 538976511, 1368527103, 1907499263, -205315841, -1014890241, -1302257409, -202116097, -207461889, -476950017, 1631658239, -1300082177 ] } }, "diagnostics" : [ ] @@ -195,13 +195,13 @@ "last_modified" : 1779659315457, "fingerprint" : "7ada8efefcd6d069b10846fefb9bd9cff1a1fa4c1565bbebfd68fc83645f0732", "metadata" : { - "palette" : { - "rgba8888" : [ 0, 538976511, 1368527103, 1907499263, -205315841, -1014890241, -1302257409, -202116097, -207461889, -476950017, 1631658239, -1300082177 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQICAwMBAQEBAwEAAAAAAAAAAAAAAAAAAAAAAAABBAQBAgIDAwMCAQMDAQAAAAAAAAAAAAAAAAAAAAAAAQUFBAQBAgIDAgICAwIBAAAAAAAAAAAAAAAAAAAAAAABBQEFBAUBAgICAgMCAQAAAAAAAAAAAAAAAAAAAAAAAAABBgEFBQUBAgECAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAEGBwEFBAUBCAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQgBBwEEBQEJAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEICAEHCQEEBQEFAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGCQkGBgEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBBgYGAQIDAgEBAAAAAAAAAAAAAAAAAAAAAAAAAAEJAQEBAQEBAgIBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBBwcDAgIBAQoKAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQQBAwMDAgIBCQkBAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgECAwMCAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAABCwYBAgEBAQECAgEKAQAAAAAAAAAAAAAAAAAAAAAAAAELCgYBAgICAgEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEKCgoBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + }, + "palette" : { + "rgba8888" : [ 0, 538976511, 1368527103, 1907499263, -205315841, -1014890241, -1302257409, -202116097, -207461889, -476950017, 1631658239, -1300082177 ] } }, "diagnostics" : [ ] @@ -250,13 +250,13 @@ "last_modified" : 1776965154257, "fingerprint" : "8771c3e294d0edbc8dd3aaa6995a6db32166ae6bfb3e063170cc79b298d17e71", "metadata" : { - "palette" : { - "rgba8888" : [ 1217939711 ] - }, "tile" : { "width" : 8, "height" : 8, "paletteIndices" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + }, + "palette" : { + "rgba8888" : [ 1217939711 ] } }, "diagnostics" : [ ] @@ -267,13 +267,13 @@ "last_modified" : 1776965154257, "fingerprint" : "5d81eef8be13043330b42b546e10beed8ba00dfaa42df67477a8778c2b9484d7", "metadata" : { - "palette" : { - "rgba8888" : [ 1217939711, 1081622783, 677921023, 676868351, 673720575, -2005909249, -1466932993, 1615868159 ] - }, "tile" : { "width" : 8, "height" : 8, "paletteIndices" : "AAAAAAAAAAAAAAAAAAEBAQABAQEBAQEBAQIDBAQEBAMCAwQFBQUFBAIDBAUFBgYHAgMEBwUFBwcAAgQEBwcHBg==" + }, + "palette" : { + "rgba8888" : [ 1217939711, 1081622783, 677921023, 676868351, 673720575, -2005909249, -1466932993, 1615868159 ] } }, "diagnostics" : [ ] @@ -284,13 +284,13 @@ "last_modified" : 1776965154258, "fingerprint" : "3250840c4fe08c134ea966ce7c8fcaccae2c2a45660d7173c5e262a2e5076548", "metadata" : { - "palette" : { - "rgba8888" : [ 1081622783, 676868351, 673720575, 1615868159, -1466932993, -2005909249 ] - }, "tile" : { "width" : 8, "height" : 8, "paletteIndices" : "AAAAAAABAgIAAAAAAQIDBAAAAAECAwQEAAECAgMDAwMCAgUEBAQEBAMFBAQFBQUFBAQEBQUEBAQEBQUFBAQFBQ==" + }, + "palette" : { + "rgba8888" : [ 1081622783, 676868351, 673720575, 1615868159, -1466932993, -2005909249 ] } }, "diagnostics" : [ ] @@ -301,13 +301,13 @@ "last_modified" : 1776965154258, "fingerprint" : "fe3ab2b7eb3b10a042de14484d53e718e6b505edb1ad19053668565bfe3a8f25", "metadata" : { - "palette" : { - "rgba8888" : [ 673720575, 676868351, 1081622783, -1466932993, 1615868159, -2005909249 ] - }, "tile" : { "width" : 8, "height" : 8, "paletteIndices" : "AAABAgICAgIDBAABAgICAgMDBAABAgICBAQEBAAAAQIDAwMDAwUAAAUFBQUDAwUEAwMDBQUDAwMFBQMDBQUFAw==" + }, + "palette" : { + "rgba8888" : [ 673720575, 676868351, 1081622783, -1466932993, 1615868159, -2005909249 ] } }, "diagnostics" : [ ] @@ -318,13 +318,13 @@ "last_modified" : 1776965154259, "fingerprint" : "7fcbf90e1e9a69d6ce3be80ea1901d66c9992f68dc72e4c636dcd2ad52fa2898", "metadata" : { - "palette" : { - "rgba8888" : [ 1217939711, 1081622783, 676868351, 673720575, 677921023, -2005909249, 1615868159, -1466932993 ] - }, "tile" : { "width" : 8, "height" : 8, "paletteIndices" : "AAAAAAAAAAABAQEAAAAAAAEBAQEBAQEAAgMDAwMCBAEDBQUFBQMCBAYHBwUFAwIEBgYFBQYDAgQHBgYGAwMEAA==" + }, + "palette" : { + "rgba8888" : [ 1217939711, 1081622783, 676868351, 673720575, 677921023, -2005909249, 1615868159, -1466932993 ] } }, "diagnostics" : [ ] @@ -335,13 +335,13 @@ "last_modified" : 1776965154259, "fingerprint" : "451fc8d646049944d5aa7c7dc254636eec0151aaff6e2051059304b9d6ebc31e", "metadata" : { - "palette" : { - "rgba8888" : [ 1217939711, 677921023, 676868351, 673720575, 1615868159, -1466932993, -2005909249 ] - }, "tile" : { "width" : 8, "height" : 8, "paletteIndices" : "AAECAwMEBQUAAAECAwUFBgAAAAIDBQYGAAAAAwMFBgYAAAMEAwUGBgADBgQDBQYGAwYFBAMFBgYDBgUEAwUGBg==" + }, + "palette" : { + "rgba8888" : [ 1217939711, 677921023, 676868351, 673720575, 1615868159, -1466932993, -2005909249 ] } }, "diagnostics" : [ ] @@ -352,13 +352,13 @@ "last_modified" : 1776965154260, "fingerprint" : "aa757df4600823ec6655235a1081061777124ccee74b31481bbe402e53635f53", "metadata" : { - "palette" : { - "rgba8888" : [ -2005909249, -1466932993, 1615868159, 673720575 ] - }, "tile" : { "width" : 8, "height" : 8, "paletteIndices" : "AAABAgIAAAAAAQEAAgIAAQEBAAAAAgIBAQEAAAECAwIBAQAAAQIDAwEBAAABAgMDAQEAAAECAwIBAQEAAgMCAQ==" + }, + "palette" : { + "rgba8888" : [ -2005909249, -1466932993, 1615868159, 673720575 ] } }, "diagnostics" : [ ] @@ -369,13 +369,13 @@ "last_modified" : 1776965154260, "fingerprint" : "38162157f5685cce25b835d3a2caee3465fd2ec3ee5db2a5089d7d5ae5ea3bb7", "metadata" : { - "palette" : { - "rgba8888" : [ -2005909249, 1615868159, -1466932993, 673720575 ] - }, "tile" : { "width" : 8, "height" : 8, "paletteIndices" : "AAAAAQECAAACAAEBAAICAAIBAQAAAAICAQMBAgAAAgIDAwECAAACAgMDAQIAAAICAQMBAgAAAgICAQMBAAICAg==" + }, + "palette" : { + "rgba8888" : [ -2005909249, 1615868159, -1466932993, 673720575 ] } }, "diagnostics" : [ ] @@ -386,13 +386,13 @@ "last_modified" : 1776965154260, "fingerprint" : "8cab5b3d553af9ed371bd19fc624763accc90e5d926d300ba31dd8d9d6bab803", "metadata" : { - "palette" : { - "rgba8888" : [ -1466932993, 1615868159, 673720575, 676868351, 677921023, 1217939711, -2005909249 ] - }, "tile" : { "width" : 8, "height" : 8, "paletteIndices" : "AAABAgIDBAUGAAACAwQFBQYGAAIDBQUFBgYAAgIFBQUGBgACAQIFBQYGAAIBBgIFBgYAAgEABgIGBgACAQAGAg==" + }, + "palette" : { + "rgba8888" : [ -1466932993, 1615868159, 673720575, 676868351, 677921023, 1217939711, -2005909249 ] } }, "diagnostics" : [ ] @@ -403,13 +403,13 @@ "last_modified" : 1776965154261, "fingerprint" : "d9ff5a6df0f65f5fcfb8f22376beeb266d429e2c6e9c82f51c12bc6ee4c3fcdc", "metadata" : { - "palette" : { - "rgba8888" : [ 673720575, 1615868159, -2005909249, -1466932993, 676868351, 677921023, 1217939711 ] - }, "tile" : { "width" : 8, "height" : 8, "paletteIndices" : "AAECAQEAAwIEAAABAQADAwQFBAABAQADBgUEBAABAAAGBgUFBAAAAQYGBgUEAAICBgYGBgAAAgIGBgYEAAEBAg==" + }, + "palette" : { + "rgba8888" : [ 673720575, 1615868159, -2005909249, -1466932993, 676868351, 677921023, 1217939711 ] } }, "diagnostics" : [ ] @@ -420,13 +420,13 @@ "last_modified" : 1776965154261, "fingerprint" : "b9ff45c77f7779a6acebcc537c2ddac0e27e91162b656a04dc4772ec5f24fc26", "metadata" : { - "palette" : { - "rgba8888" : [ -2005909249, -1466932993, 1615868159, 673720575 ] - }, "tile" : { "width" : 8, "height" : 8, "paletteIndices" : "AAEBAgIAAAEAAAICAQEAAAEAAAAAAQEAAQEBAQAAAQEDAgIBAQAAAAIDAgIBAQAAAAIDAgICAQEAAgIDAgICAg==" + }, + "palette" : { + "rgba8888" : [ -2005909249, -1466932993, 1615868159, 673720575 ] } }, "diagnostics" : [ ] @@ -437,13 +437,13 @@ "last_modified" : 1776965154261, "fingerprint" : "43f370324fedccda888d49409e2a64f182f08b4143b4bdd5bafaf498feebd21a", "metadata" : { - "palette" : { - "rgba8888" : [ -1466932993, -2005909249, 1615868159, 673720575 ] - }, "tile" : { "width" : 8, "height" : 8, "paletteIndices" : "AAEBAgIAAAEBAQAAAgIBAQEAAAEBAQEAAAABAQAAAAABAQEAAAICAwEBAAACAgMCAAACAgIDAgECAgICAwICAQ==" + }, + "palette" : { + "rgba8888" : [ -1466932993, -2005909249, 1615868159, 673720575 ] } }, "diagnostics" : [ ] @@ -454,13 +454,13 @@ "last_modified" : 1776965154262, "fingerprint" : "cb047e655f4e196f22ca0048149df5dcb959f895faeaeb94920182d4a2d16b38", "metadata" : { - "palette" : { - "rgba8888" : [ -2005909249, -1466932993, 673720575, 1615868159, 676868351, 677921023, 1217939711 ] - }, "tile" : { "width" : 8, "height" : 8, "paletteIndices" : "AAECAwMAAwIBAQIDAwICBAECAwMCBAUEAgIDAgQEBQYDAgIEBQUGBgAAAgQFBgYGAAACAgYGBgYAAwMCBAYGBg==" + }, + "palette" : { + "rgba8888" : [ -2005909249, -1466932993, 673720575, 1615868159, 676868351, 677921023, 1217939711 ] } }, "diagnostics" : [ ] @@ -471,13 +471,13 @@ "last_modified" : 1776965154262, "fingerprint" : "25eba17b67dd5159f5fb9d3edd531d54a44d1c76f997385840dac53517b98886", "metadata" : { - "palette" : { - "rgba8888" : [ 1217939711, 673720575, -2005909249, 1615868159, 676868351, 677921023 ] - }, "tile" : { "width" : 8, "height" : 8, "paletteIndices" : "AAAAAQICAwMAAAECAgICAwAAAQICAgIDAAABAgIDAQMAAAEDAQQEAQAABAQFBAUEAAAAAAAFAAUAAAAAAAAAAA==" + }, + "palette" : { + "rgba8888" : [ 1217939711, 673720575, -2005909249, 1615868159, 676868351, 677921023 ] } }, "diagnostics" : [ ] @@ -488,13 +488,13 @@ "last_modified" : 1776965154262, "fingerprint" : "32ca96c14290de8009fd2db623f55514bed2345b7d5881a80dd3fe6235012854", "metadata" : { - "palette" : { - "rgba8888" : [ 1615868159, 673720575, 676868351, -2005909249, 677921023, 1217939711 ] - }, "tile" : { "width" : 8, "height" : 8, "paletteIndices" : "AAAAAQAAAQEBAAEBAAEAAAEBAgEBAAADAQICAgEAAAMCAgQCAgEAAAQEBQQEAQADBQUFBQUCAQAFBQUFBQUCAQ==" + }, + "palette" : { + "rgba8888" : [ 1615868159, 673720575, 676868351, -2005909249, 677921023, 1217939711 ] } }, "diagnostics" : [ ] @@ -505,13 +505,13 @@ "last_modified" : 1776965154263, "fingerprint" : "7a093fe00c805bcf38d4facff14a6d4c2b8baeaa2d553fa8d3db9f2d76b32f3b", "metadata" : { - "palette" : { - "rgba8888" : [ 673720575, 1615868159, -2005909249, 676868351, 677921023, 1217939711 ] - }, "tile" : { "width" : 8, "height" : 8, "paletteIndices" : "AAABAQABAQEBAQABAAABAAIBAQAAAwAAAgEBAAMDAwABAQADAwQDAwIBAAQEBQQEAQADBQUFBQUAAwUFBQUFBQ==" + }, + "palette" : { + "rgba8888" : [ 673720575, 1615868159, -2005909249, 676868351, 677921023, 1217939711 ] } }, "diagnostics" : [ ] @@ -522,13 +522,13 @@ "last_modified" : 1776965154263, "fingerprint" : "77c5277220421226d16f58b1bcfb4eaf157fa4f6c740c5aaebefaf88fb91c22e", "metadata" : { - "palette" : { - "rgba8888" : [ 1615868159, -2005909249, 673720575, 1217939711, 676868351, 677921023 ] - }, "tile" : { "width" : 8, "height" : 8, "paletteIndices" : "AAABAQIDAwMAAQEBAQIDAwABAQEBAgMDAAIAAQECAwMCBAQCAAIDAwQFBAUEBAMDBQMFAwMDAwMDAwMDAwMDAw==" + }, + "palette" : { + "rgba8888" : [ 1615868159, -2005909249, 673720575, 1217939711, 676868351, 677921023 ] } }, "diagnostics" : [ ]