From d9f857b9bf5cc8ba9e391518ec73e509425cf386 Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Wed, 15 Apr 2026 07:21:59 +0100 Subject: [PATCH 1/7] Scene Workspace --- discussion/index.ndjson | 4 +- .../AGD-0029-studio-scene-workspace.md | 295 ++++++++ ...-0030-tiled-parser-and-scene-asset-type.md | 115 +++ .../DEC-0026-studio-scene-workspace.md | 181 +++++ ...workspace-spec-and-boundary-propagation.md | 137 ++++ ...ace-shell-and-project-state-foundations.md | 126 ++++ ...ne-artifact-and-assets-handoff-contract.md | 135 ++++ ...2-scene-workspace-wave-1-tilemap-editor.md | 151 ++++ .../main/assets/.prometeu/cache.json | 654 +++++++++--------- .../main/assets/scenes/primeiro mapa.tmx | 36 + .../main/assets/scenes/primeiro tileset.tsx | 7 + .../main/assets/scenes/scene1.tiled-project | 14 + .../main/assets/scenes/scene1.tiled-session | 38 + 13 files changed, 1565 insertions(+), 328 deletions(-) create mode 100644 discussion/workflow/agendas/AGD-0029-studio-scene-workspace.md create mode 100644 discussion/workflow/agendas/AGD-0030-tiled-parser-and-scene-asset-type.md create mode 100644 discussion/workflow/decisions/DEC-0026-studio-scene-workspace.md create mode 100644 discussion/workflow/plans/PLN-0049-scene-workspace-spec-and-boundary-propagation.md create mode 100644 discussion/workflow/plans/PLN-0050-scene-workspace-shell-and-project-state-foundations.md create mode 100644 discussion/workflow/plans/PLN-0051-scene-artifact-and-assets-handoff-contract.md create mode 100644 discussion/workflow/plans/PLN-0052-scene-workspace-wave-1-tilemap-editor.md create mode 100644 test-projects/main/assets/scenes/primeiro mapa.tmx create mode 100644 test-projects/main/assets/scenes/primeiro tileset.tsx create mode 100644 test-projects/main/assets/scenes/scene1.tiled-project create mode 100644 test-projects/main/assets/scenes/scene1.tiled-session diff --git a/discussion/index.ndjson b/discussion/index.ndjson index 75e4d10a..cac0aaff 100644 --- a/discussion/index.ndjson +++ b/discussion/index.ndjson @@ -1,4 +1,6 @@ -{"type":"meta","next_id":{"DSC":27,"AGD":29,"DEC":26,"PLN":49,"LSN":40,"CLSN":1}} +{"type":"meta","next_id":{"DSC":29,"AGD":31,"DEC":27,"PLN":53,"LSN":40,"CLSN":1}} +{"type":"discussion","id":"DSC-0028","status":"open","ticket":"studio-tiled-parser-assets-scene-asset-type","title":"Tiled Parser and Scene Asset-Type Ownership in Assets Workspace","created_at":"2026-04-15","updated_at":"2026-04-15","tags":["studio","assets","scene","tiled","parser","asset-type"],"agendas":[{"id":"AGD-0030","file":"AGD-0030-tiled-parser-and-scene-asset-type.md","status":"open","created_at":"2026-04-15","updated_at":"2026-04-15"}],"decisions":[],"plans":[],"lessons":[]} +{"type":"discussion","id":"DSC-0027","status":"abandoned","ticket":"studio-scene-workspace","title":"Scene Workspace for SCENE Authoring","created_at":"2026-04-14","updated_at":"2026-04-15","tags":["studio","workspace","scene","tilemap","asset","runtime-alignment"],"agendas":[{"id":"AGD-0029","file":"AGD-0029-studio-scene-workspace.md","status":"abandoned","created_at":"2026-04-14","updated_at":"2026-04-15","_override_reason":"Explicit user request on 2026-04-15 to abandon the accepted agenda and its downstream work."}],"decisions":[{"id":"DEC-0026","file":"DEC-0026-studio-scene-workspace.md","status":"abandoned","created_at":"2026-04-14","updated_at":"2026-04-15","ref_agenda":"AGD-0029","_override_reason":"Explicit user request on 2026-04-15 to abandon the accepted decision and stop using it as normative guidance."}],"plans":[{"id":"PLN-0049","file":"PLN-0049-scene-workspace-spec-and-boundary-propagation.md","status":"abandoned","created_at":"2026-04-14","updated_at":"2026-04-15","ref_decisions":["DEC-0026"],"_override_reason":"Explicit user request on 2026-04-15 to abandon all plans derived from DEC-0026."},{"id":"PLN-0050","file":"PLN-0050-scene-workspace-shell-and-project-state-foundations.md","status":"abandoned","created_at":"2026-04-14","updated_at":"2026-04-15","ref_decisions":["DEC-0026"],"_override_reason":"Explicit user request on 2026-04-15 to abandon all plans derived from DEC-0026."},{"id":"PLN-0051","file":"PLN-0051-scene-artifact-and-assets-handoff-contract.md","status":"abandoned","created_at":"2026-04-14","updated_at":"2026-04-15","ref_decisions":["DEC-0026"],"_override_reason":"Explicit user request on 2026-04-15 to abandon all plans derived from DEC-0026."},{"id":"PLN-0052","file":"PLN-0052-scene-workspace-wave-1-tilemap-editor.md","status":"abandoned","created_at":"2026-04-14","updated_at":"2026-04-15","ref_decisions":["DEC-0026"],"_override_reason":"Explicit user request on 2026-04-15 to abandon all plans derived from DEC-0026."}],"lessons":[]} {"type":"discussion","id":"DSC-0026","status":"done","ticket":"glyph-bank-naming-alignment-with-runtime","title":"Glyph Bank Naming Alignment with Runtime DEC-0006","created_at":"2026-04-10","updated_at":"2026-04-10","tags":["packer","studio","naming","asset-contract","runtime-alignment","glyph-bank"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0040","file":"discussion/lessons/DSC-0026-glyph-bank-naming-alignment-with-runtime/LSN-0040-glyph-bank-artifact-naming-alignment.md","status":"done","created_at":"2026-04-10","updated_at":"2026-04-10"}]} {"type":"discussion","id":"DSC-0025","status":"done","ticket":"packer-pipeline-metadata-ownership","title":"Pipeline Metadata Ownership and Runtime Contract","created_at":"2026-04-09","updated_at":"2026-04-10","tags":["packer","metadata","runtime-contract","tooling","studio"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0039","file":"discussion/lessons/DSC-0025-packer-pipeline-metadata-ownership/LSN-0039-runtime-header-boundary-and-tooling-owned-pipeline-metadata.md","status":"done","created_at":"2026-04-10","updated_at":"2026-04-10"}]} {"type":"discussion","id":"DSC-0024","status":"done","ticket":"jacoco-reports-consolidation","title":"JaCoCo Reports Consolidation in Gradle","created_at":"2026-04-07","updated_at":"2026-04-07","tags":["infra","gradle","jacoco","coverage","jenkins"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0038","file":"discussion/lessons/DSC-0024-jacoco-reports-consolidation/LSN-0038-jacoco-reports-consolidation.md","status":"done","created_at":"2026-04-07","updated_at":"2026-04-07"}]} diff --git a/discussion/workflow/agendas/AGD-0029-studio-scene-workspace.md b/discussion/workflow/agendas/AGD-0029-studio-scene-workspace.md new file mode 100644 index 00000000..7f87e63e --- /dev/null +++ b/discussion/workflow/agendas/AGD-0029-studio-scene-workspace.md @@ -0,0 +1,295 @@ +--- +id: AGD-0029 +ticket: studio-scene-workspace +title: Scene Workspace for SCENE Authoring +status: abandoned +created: 2026-04-14 +resolved: 2026-04-14 +decision: DEC-0026 +tags: + - studio + - workspace + - scene + - tilemap + - asset + - runtime-alignment +--- + +## Pain + +O Studio ainda nao possui um workspace dedicado para autoria e inspecao de scenes. + +Sem esse workspace: + +- o Studio nao oferece uma experiencia autoral propria para scenes como dominio editorial; +- a equipe fica sem uma superficie visual para editar o artefato intermediario de scene que depois alimenta o asset `SCENE`; +- o Studio perde a chance de ensinar o modelo correto de scene como asset versionado, com quatro layers e contrato proprio; +- a futura expansao para camera bounds, lights, AABB e outros aspectos acaba sem composicao clara desde a primeira wave. + +## Context + +Domain owner: `studio` + +Owner documental esperado: + +- `docs/specs/studio` + +Cross-domain impact: + +- `../runtime` para o contrato canonico de `SCENE`, `SceneBank` e `SceneLayer`; +- `Assets` workspace apenas na fronteira de criacao/descoberta do asset `SCENE`. + +Rastro relevante ja existente: + +- o runtime ja convergiu para `SCENE` como payload binario versionado; +- `SceneBank` e o modelo canonico carregado no runtime possuem exatamente `4` layers; +- cada `SceneLayer` possui seu proprio `TileMap`, com dimensoes independentes; +- viewport cache, camera movement e renderer nao fazem parte do modelo canonico de authoring do scene; +- o `Assets` workspace ja define o padrao de navegador customizado, asset-first e path-aware, que deve inspirar a navegacao do `Scene Workspace` sem virar um file explorer generico. + +Escopo inicial solicitado pelo usuario: + +- novo workspace chamado `Scene Workspace`; +- navegador de scenes na lateral esquerda, similar ao `Assets` workspace; +- o `Scene Workspace` trabalha com scenes como scenes, nao como assets; +- a scene editada no workspace vira um artefato intermediario de autoria; +- o `Scene Workspace` pode criar uma scene nova e, ao fazer isso, criar tambem o asset `SCENE` correspondente; +- o `Assets` workspace pode criar um asset `SCENE`, mas nao pinta mapa nem faz configuracoes editoriais da scene; +- depois de criado, o trabalho de conteudo e configuracao da scene fica delegado ao `Scene Workspace`; +- cada scene como mapa de `4` layers; +- cada layer com largura e altura independentes, em estilo similar ao `Tiled`; +- faixa superior com abas de aspectos da ferramenta; +- primeira aba: `Tilemap`; +- aba `Tilemap` com mapa no centro; +- painel superior direito com dimensoes e detalhes do tilemap; +- painel inferior direito com aquarela/paleta de tiles para selecao e pintura; +- tileset vindo de assets, com suporte a selecionar qualquer glyph bank ou marcar glyph banks como tileset apenas no Studio; +- outras abas futuras previstas: camera boundaries, lights, AABB, etc., mas fora da primeira wave. + +## Open Questions + +- [x] O `Scene Workspace` deve abrir scenes apenas por seu catalogo proprio, ou tambem aceitar handoff contextual quando um asset `SCENE` for criado no `Assets`? +- [x] Qual identidade o navegador da esquerda deve priorizar: scene authoring artifact, path do projeto, ou algum catalogo editorial proprio do `Scene Workspace`? +- [x] O Studio deve tratar a edicao de scene como staged editing com `apply/reset`, ou como documento editavel com save integrado? +- [x] Como o Studio relaciona uma scene autoral com o asset `SCENE` correspondente: referencia por path, UUID proprio do artefato intermediario, ou binding mediado por metadata do Studio? +- [x] Como o Studio seleciona o glyph bank usado como tileset em cada layer ou scene: referencia editorial na scene ou vinculacao resolvida pelo proprio `Scene Workspace`? +- [x] O contrato do runtime ja determina metadados suficientes por layer para authoring inicial, ou o Studio precisara propor extensoes antes da implementacao do workspace? +- [x] Como representar tiles vazios, brush, fill e selecao sem colidir com a semantica canonica de tile vazio ja aceita no runtime? +- [x] A primeira wave deve permitir apenas pintura bruta por tile, ou ja precisa incluir ferramentais como marquee, bucket, eyedropper e multi-layer visibility/lock? +- [x] As abas futuras devem ser somente placeholders estruturais agora, ou a wave inicial deve expor apenas a aba `Tilemap` para nao sugerir suporte inexistente? + +## Options + +### Option A - `Scene Workspace` como workspace dedicado no shell +- **Approach:** Criar um workspace proprio de `Scene Workspace`, com navegador de scenes na esquerda, header com tabs de aspecto e composicao interna especializada por aba. +- **Pro:** Da visibilidade de primeira classe a `SCENE`, cria uma arquitetura clara para expansao futura por aspectos e preserva a fronteira entre shell e detalhe operacional do workspace. +- **Con:** Introduz mais uma entrada no shell e exige decidir como ele se relaciona com a descoberta de assets no fluxo ja existente. +- **Maintainability:** Strong, porque estabiliza ownership e composicao desde a primeira wave. + +### Option B - editor especializado dentro do `Assets` workspace +- **Approach:** Manter tanto o asset `SCENE` quanto a edicao do artefato intermediario dentro do `Assets`, usando a selecao do asset como ponto de entrada do editor. +- **Pro:** Reaproveita navegacao asset-first existente e concentra toda a historia de scene em um unico lugar. +- **Con:** Colapsa duas naturezas diferentes em uma mesma superficie: gerenciamento de asset packer-facing e authoring de scene como conteudo editorial. +- **Maintainability:** Weak, porque incentiva o `Assets` workspace a absorver ownership que nao e dele. + +### Option C - workspace autoral proprio com integracao via asset +- **Approach:** O `Scene Workspace` edita e cria a scene como dominio proprio; o `Assets` workspace apenas pode criar/mostrar o asset `SCENE` e delega a autoria da scene para o `Scene Workspace`. +- **Pro:** Separa claramente authoring editorial de scene da gestao asset-first do `Assets`, sem deixar o `Assets` absorver o editor. +- **Con:** Exige fechar um contrato de binding entre scene autoral e asset `SCENE`, alem de definir handoff entre os dois workspaces. +- **Maintainability:** Strong, porque o `Scene Workspace` permanece owner do conteudo e o `Assets` fica restrito a criacao/gestao do asset. + +## Discussion + +O ponto mais importante desta discussao nao e apenas layout. O runtime ja tem um contrato canonico claro o bastante para impor restricoes no editor: + +1. o payload final `SCENE` nao e um documento arbitrario; e um asset binario versionado com `4` layers fixos; +2. cada layer possui `TileMap` proprio e, portanto, o editor nao deve assumir um canvas unificado com dimensoes compartilhadas; +3. viewport cache, camera drift e outras preocupacoes de renderizacao nao pertencem ao modelo canonico do scene workspace; +4. o `Scene Workspace` nao deve editar o payload final do asset diretamente; ele deve editar um material intermediario proprio; +5. o tileset precisa se alinhar aos glyph banks que ja existem como assets, sem criar um segundo sistema de tiles paralelo no Studio. + +Tambem existe uma decisao estrutural de produto a ser tomada cedo: + +- se o `Scene Workspace` for somente um modo interno do `Assets`, o Studio arrisca repetir o anti-pattern de transformar um workspace asset-first em container generico de editores; +- se ele nascer como workspace proprio, a arquitetura de abas por aspecto e a expansao futura para boundaries/lights/AABB ficam mais honestas; +- como a scene autoral nao e o proprio asset, a costura correta passa por um contrato entre artefato intermediario e asset `SCENE`, nao por subordinacao de um workspace ao outro; +- o `Assets` pode oferecer criacao de asset `SCENE`, mas a autoria e manutencao do conteudo da scene devem ser delegadas ao `Scene Workspace`. + +Outro ponto aberto e a semantica do tileset: + +- permitir qualquer glyph bank maximiza flexibilidade e reaproveitamento; +- exigir uma tag editorial de "tileset" melhora discoverability e reduz selecao invalida; +- uma combinacao pode ser a melhor direcao: qualquer glyph bank tecnicamente valido, com tagging opcional no Studio para curadoria UX. + +Por fim, a primeira wave precisa resistir a overreach: + +- a aba `Tilemap` ja e um escopo suficientemente grande; +- placeholders de abas futuras so fazem sentido se a shell structure realmente precisar reservar esse contrato agora; +- caso contrario, placeholders podem comunicar suporte inexistente e gerar pressao artificial sobre uma decision ainda nao tomada. + +### Convergence pass - recommended answers for the open questions + +#### 1. Workspace proprio ou extensao do `Assets` + +Recomendacao: `Scene Workspace` deve existir como workspace shell-level proprio e nao deve ser subordinado ao `Assets`. + +Motivo: + +- o shell ja foi especificado para hospedar workspaces independentes; +- o `Assets` workspace deve continuar asset-first e didatico, nao virar um host generico de editores; +- a scene autoral tem natureza propria e vira um artefato intermediario, nao o payload final do asset. +- o `Scene Workspace` deve aceitar tanto abertura por seu proprio navegador quanto handoff contextual quando o `Assets` criar um asset `SCENE`. + +#### 2. Identidade do navegador da esquerda + +Recomendacao: a identidade primaria deve ser a scene autoral, nao o asset `SCENE`. + +Contexto de apoio: + +- path continua visivel como contexto secundario; +- o workspace pode precisar de um identificador editorial proprio para a scene intermediaria; +- o asset `SCENE` correspondente pertence ao `Assets` workspace e deve aparecer apenas como vinculacao ou estado derivado. + +Direcao adicional: + +- o navegador deve ser scene-first; +- path de projeto entra como contexto secundario; +- o asset vinculado pode aparecer como badge, status ou acao contextual, mas nao como unidade primaria de navegacao. + +#### 3. Modelo de edicao e persistencia + +Recomendacao: a primeira wave deve tratar a scene como documento/artefato autoral com save proprio, separado de qualquer fluxo de criacao ou gestao do asset no `Assets`. + +Motivo: + +- o usuario deixou explicito que o `Scene Manager` trabalha sobre um artefato intermediario proprio; +- o `Scene Workspace` e owner do conteudo da scene; +- o `Assets` pode continuar com fluxos proprios para criacao/gestao de asset, mas sem absorver a autoria da scene; +- misturar save do conteudo autoral com `apply` do asset apagaria a fronteira entre autoria e empacotamento. + +Direcao adicional: + +- o `Scene Workspace` salva o artefato intermediario; +- criar ou vincular o asset `SCENE` e um passo de integracao entre workspaces, nao a mesma operacao de salvar a scene. + +#### 4. Binding entre scene autoral e asset `SCENE` + +Recomendacao: o binding deve ser mediado por metadata do Studio, nao por inferencia de path como regra primaria. + +Motivo: + +- path pode mudar por rename ou reorganizacao de projeto; +- a scene autoral precisa de identidade mais estavel do que localizacao fisica; +- o `Assets` e o `Scene Workspace` precisam compartilhar um vinculo explicito sem colapsar um no outro. + +Direcao adicional: + +- a scene autoral deve ter um identificador proprio; +- o asset `SCENE` correspondente deve referenciar esse identificador, ou vice-versa, por um contrato editorial do Studio; +- path continua relevante como localizacao de arquivo, nao como ancora semantica principal do binding. + +#### 5. Selecao de glyph bank como tileset + +Recomendacao: a scene autoral deve poder referenciar glyph banks como tilesets em nivel editorial, e essa escolha deve ser owned pelo `Scene Workspace`. + +Motivo: + +- o runtime ja referencia `glyph_bank_id` por layer, nao um tipo separado de tileset; +- criar um subtipo obrigatorio de asset agora inventaria uma regra de produto nao exigida pelo contrato canonico; +- uma tag editorial ainda pode melhorar descoberta sem restringir um contrato que hoje e genericamente `GLYPH`. + +Direcao adicional: + +- a escolha de glyph bank por layer ou por scene deve ser resolvida no `Scene Workspace`; +- o `Assets` nao deve redefinir tileset da scene; +- tags editoriais opcionais no Studio podem melhorar filtragem e discoverability. + +#### 6. Metadados por layer + +Recomendacao: para a primeira wave, o contrato do runtime parece suficiente para authoring inicial de tilemap. + +Rastro observado no runtime: + +- `SceneLayer` ja possui `active`; +- `glyph_bank_id`; +- `tile_size`; +- `motion_factor`; +- `tilemap` com `width`, `height` e tiles. + +Conclusao: + +- isso e suficiente para uma aba `Tilemap` com visibilidade por layer, dimensoes independentes, tileset por layer e pintura; +- camera bounds, lights e AABB ficam corretamente fora dessa wave e devem motivar metadados adicionais apenas quando virarem tema de nova decision. + +#### 7. Tile vazio, brush e pintura + +Recomendacao: o Studio deve respeitar a semantica canonica de presenca explicita por tile. + +Consequencias: + +- `glyph_id = 0` deve permanecer valido; +- apagar um tile deve atuar sobre o bit/estado de presenca (`active = false`), nao sobre um glyph magico; +- brush, eyedropper e futuras ferramentas devem operar sobre `active`, `glyph_id`, `palette_id`, `flip_x` e `flip_y`. + +#### 8. Ferramentas da primeira wave + +Recomendacao: limitar a primeira wave a pintura basica, apagador, seletor de tile e controles de layer como visibilidade/foco. + +Excluir agora: + +- marquee complexo; +- bucket fill; +- multi-select estrutural; +- automacoes de brush avancadas. + +Motivo: + +- o objetivo da wave 1 e provar o fluxo canonico de scene authoring; +- ferramentas mais ricas multiplicam edge cases antes de estabilizar modelo, persistencia e UX base. + +Direcao adicional: + +- `multi-layer visibility` e `layer focus` entram na wave 1; +- `lock`, `marquee`, `bucket`, `flood fill` e automacoes avancadas ficam explicitamente fora. + +#### 9. Abas futuras agora ou depois + +Recomendacao: o workspace deve nascer com uma faixa superior de tabs, mas expor apenas a aba `Tilemap` na primeira wave. + +Motivo: + +- a estrutura de tabs faz parte da composicao arquitetural pedida; +- tabs placeholder para `Camera`, `Lights` ou `AABB` sugeririam suporte que ainda nao existe; +- reservar o componente estrutural agora facilita expansao futura sem mentir sobre cobertura funcional. + +## Resolution + +Abandoned on 2026-04-15 by explicit user request. + +The accepted direction captured here was superseded before implementation. + +Follow-up direction: + +- abandon the dedicated `Scene Workspace` approach; +- open a new discussion for a `Tiled` parser; +- manage the resulting authoring flow from `Assets` through a new asset type. + +Direcao recomendada: convergir para **Option C**, em que o `Scene Workspace` e um workspace autoral de primeira classe no shell e o `Assets` workspace permanece apenas como superficie asset-first capaz de criar ou exibir o asset `SCENE`, sem editar o conteudo da scene. + +Essa recomendacao parte de quatro principios: + +1. a scene autoral e um artefato intermediario proprio do dominio `Scene Workspace`; +2. o asset `SCENE` pode ser criado tanto pelo `Scene Workspace` quanto pelo `Assets`, mas o conteudo da scene e owner do `Scene Workspace`; +3. o `Assets` nao pinta mapa nem faz configuracoes editoriais da scene; +4. o binding entre scene autoral e asset `SCENE` deve ser explicito e estavel; +5. a primeira wave deve fechar apenas o aspecto `Tilemap`, sem fingir maturidade para camera bounds, lights ou AABB. + +Proximo passo sugerido: transformar esta agenda em uma decision que feche: + +1. `Scene Workspace` como workspace shell-level proprio e owner do artefato intermediario de scene; +2. identidade primaria do workspace pela scene autoral, nao pelo asset; +3. save proprio da scene autoral no `Scene Workspace`, separado da criacao/gestao do asset no `Assets`; +4. contrato de binding entre scene intermediaria e asset `SCENE`; +5. glyph banks como tilesets validos por contrato, com eventual curadoria editorial no Studio; +6. aba unica `Tilemap` na primeira wave, preservando a shell de tabs para expansao futura; +7. propagacao necessaria para specs do `studio`, incluindo a pequena extensao do `Assets` para criacao de scene asset e o ownership do `Scene Workspace` sobre a autoria da scene. diff --git a/discussion/workflow/agendas/AGD-0030-tiled-parser-and-scene-asset-type.md b/discussion/workflow/agendas/AGD-0030-tiled-parser-and-scene-asset-type.md new file mode 100644 index 00000000..d4532eb4 --- /dev/null +++ b/discussion/workflow/agendas/AGD-0030-tiled-parser-and-scene-asset-type.md @@ -0,0 +1,115 @@ +--- +id: AGD-0030 +ticket: studio-tiled-parser-assets-scene-asset-type +title: Tiled Parser and Scene Asset-Type Ownership in Assets Workspace +status: open +created: 2026-04-15 +resolved: +decision: +tags: + - studio + - assets + - scene + - tiled + - parser + - asset-type +--- + +## Pain + +The current abandoned direction assumed a dedicated `Scene Workspace` as the primary authoring owner for scenes. + +That no longer matches the intended product direction. + +Without a new direction: + +- the Studio has no agreed path for scene authoring; +- the `Assets` workspace still lacks a defined ownership model for scene-like content; +- there is no agreed contract for importing or interpreting `Tiled` data; +- implementation risks rebuilding a custom scene editor model that the team has already decided to discard. + +## Context + +Domain owner: `studio` + +Expected documentation owner: + +- `docs/studio/specs` + +Cross-domain impact: + +- asset typing and creation flows in the `Assets` workspace; +- Studio-side parsing/import rules for `Tiled`; +- possible downstream alignment with runtime-facing `SCENE` publication, depending on the chosen import boundary. + +User direction explicitly provided on 2026-04-15: + +- abandon `DEC-0026` and its derived plans; +- do not proceed with a dedicated `Scene Workspace`; +- instead, write a parser for `Tiled`; +- create a new asset type managed from the `Assets` workspace. + +This agenda exists to turn that direction into a disciplined technical recommendation rather than jumping directly into implementation with undefined ownership and file-contract assumptions. + +## Open Questions + +- [ ] Which `Tiled` surface is the primary input contract: TMX XML, JSON export, TSX, or a constrained subset of those? +- [ ] Is the new asset type a raw imported `Tiled` document, a normalized Studio-owned intermediate asset, or a published runtime-facing `SCENE` derivative? +- [ ] Should `Assets` own only creation/import and metadata management, or also the main editing/reimport flow for this new asset type? +- [ ] How should tileset references inside `Tiled` map onto existing glyph-bank assets and asset identity rules in Studio? +- [ ] What parts of `Tiled` are intentionally out of scope for the first wave: object layers, properties, flips, collisions, infinite maps, templates, Wang sets, animations? +- [ ] Does the parser need to preserve full round-trip fidelity with `Tiled`, or only import the supported subset into Studio-owned structures? +- [ ] What is the canonical failure model when a `Tiled` document references unsupported constructs or broken external assets? + +## Options + +### Option A - Import `Tiled` into a new Studio-owned scene asset type in `Assets` +- **Approach:** Introduce a new asset type in `Assets`; parse supported `Tiled` files into a Studio-owned asset model managed from that workspace. +- **Pro:** Aligns with the requested ownership shift, keeps authoring/import centered in `Assets`, and allows Studio to define a strict supported subset. +- **Con:** Requires defining a clean normalized asset contract and a mapping layer from `Tiled` concepts to Studio/runtime concepts. +- **Maintainability:** Strong, if the supported subset and ownership boundary are made explicit early. + +### Option B - Treat `Tiled` files as external source documents and keep Studio as a thin importer/viewer +- **Approach:** Keep `Tiled` as the primary authoring format and let Studio mostly import, validate, and publish from it. +- **Pro:** Minimizes Studio-owned scene-model invention and stays close to existing `Tiled` authoring workflows. +- **Con:** Couples Studio behavior heavily to `Tiled`'s full document model and makes partial support/error handling harder to reason about. +- **Maintainability:** Medium, because unsupported `Tiled` breadth can leak into every implementation phase. + +### Option C - Create a new Studio asset type unrelated to `Tiled` and only offer one-time conversion +- **Approach:** Use `Tiled` only as an optional bootstrap/import tool, then move fully into a separate Studio-native asset format. +- **Pro:** Gives Studio maximum control over the final asset model and future editing behavior. +- **Con:** Moves away from the user's stated direction of writing a `Tiled` parser as a central path and may reintroduce the same custom-model burden the previous direction had. +- **Maintainability:** Medium, but only if the conversion boundary is very clearly justified. + +## Discussion + +The key architectural change here is not only "use `Tiled`". + +It is also a change in ownership: + +- scene-related authoring/import should no longer justify a dedicated `Scene Workspace`; +- the `Assets` workspace becomes the management surface for the relevant asset type; +- any parser choice must therefore fit an asset-first workflow instead of a separate editor-first workflow. + +That creates several decisions that should be made deliberately: + +1. what exact `Tiled` contract Studio supports in wave 1; +2. whether Studio stores `Tiled` data directly or through a normalized asset form; +3. how glyph banks and tilesets map without creating identity ambiguity; +4. how much of `Tiled` fidelity is preserved versus normalized away; +5. whether editing is a reimport/update flow, a direct managed-asset flow, or some hybrid. + +There is already one strong constraint from the user: + +- the previous `Scene Workspace` split should be considered discarded; +- the new work should be organized around `Assets` plus a `Tiled` parser. + +That makes Option A the current best fit for convergence, but it still needs the agenda to narrow the supported `Tiled` subset and the resulting asset contract before a new decision can be written. + +## Resolution + +Recommended next step: + +- converge this agenda around a first-wave `Tiled` subset; +- define whether the new asset type is raw-imported or normalized; +- then write a replacement decision for asset ownership, parser boundary, and wave-1 scope. diff --git a/discussion/workflow/decisions/DEC-0026-studio-scene-workspace.md b/discussion/workflow/decisions/DEC-0026-studio-scene-workspace.md new file mode 100644 index 00000000..5628520d --- /dev/null +++ b/discussion/workflow/decisions/DEC-0026-studio-scene-workspace.md @@ -0,0 +1,181 @@ +--- +id: DEC-0026 +ticket: studio-scene-workspace +title: Scene Workspace Ownership and Wave-1 Tilemap Scope +status: abandoned +created: 2026-04-14 +accepted: 2026-04-14 +agenda: AGD-0029 +plans: + - PLN-0049 + - PLN-0050 + - PLN-0051 + - PLN-0052 +tags: + - studio + - workspace + - scene + - tilemap + - asset + - runtime-alignment +--- + +## Decision + +The Studio SHALL introduce a dedicated `Scene Workspace` as a first-class shell workspace for scene authoring. + +The `Scene Workspace` MUST own the authoring lifecycle of scenes as scenes, not as asset-detail forms. + +The Studio SHALL treat the edited scene as an intermediate authoring artifact owned by the `Scene Workspace`. + +The `Scene Workspace` MAY create a new scene and, as part of that flow, create the corresponding `SCENE` asset. + +The `Assets` workspace MAY also create a `SCENE` asset, but it MUST NOT paint tilemaps, edit scene content, choose scene tilesets, or own other editorial scene configuration. + +When a `SCENE` asset is created from `Assets`, authoring and subsequent editing MUST be delegated to the `Scene Workspace`. + +The first implementation wave of the `Scene Workspace` SHALL expose only the `Tilemap` aspect. + +The wave-1 `Tilemap` aspect MUST support: + +- a left scene navigator; +- a central map editing surface; +- a right-side tilemap details area with dimensions and layer-relevant detail; +- a tile palette area for tile selection and painting; +- four canonical scene layers; +- independent layer dimensions; +- scene-first navigation; +- explicit tile presence semantics aligned with the runtime model; +- basic painting, erasing, tile selection, layer visibility, and layer focus. + +The wave-1 `Scene Workspace` MUST NOT include: + +- authoring for camera boundaries; +- authoring for lights; +- authoring for AABB data; +- placeholder tabs that imply those capabilities already exist; +- advanced paint tools such as marquee, bucket fill, flood fill, or equivalent higher-order tooling. + +The `Scene Workspace` MUST use an explicit and stable binding between the intermediate scene artifact and the corresponding `SCENE` asset. + +That binding MUST NOT rely on path inference as its primary semantic anchor. + +The `Scene Workspace` MUST own editorial tileset selection for the scene. + +Any technically valid glyph bank MAY be referenced as a tileset under the scene-authoring model. + +Optional Studio-only curation such as tagging glyph banks for better discoverability MAY exist, but it MUST NOT redefine the underlying capability contract. + +## Rationale + +This decision separates two different responsibilities that would otherwise collapse into one another: + +- scene authoring as an editorial workspace concern; +- asset management as an asset-first Studio concern. + +Keeping the `Scene Workspace` independent prevents the `Assets` workspace from becoming a generic container for heavy domain editors. + +That separation also matches the user-facing intent: + +- the `Assets` workspace can create or surface a `SCENE` asset; +- the `Scene Workspace` is where the user actually authors the scene. + +Wave 1 is intentionally narrow. + +The goal is to prove the canonical scene-authoring loop around tilemaps, layers, tileset selection, and save semantics before introducing additional aspect domains such as camera, lights, or collision-adjacent editing. + +The decision also keeps the Studio aligned with the runtime model already present in `../runtime`: + +- four canonical layers; +- per-layer tilemaps with independent dimensions; +- explicit tile presence rather than magic empty glyph ids; +- no leakage of viewport-cache or transient renderer concerns into authoring ownership. + +## Technical Specification + +### 1. Workspace Topology + +- The Studio shell MUST mount `Scene Workspace` as its own workspace entry. +- The `Scene Workspace` MUST follow the same shell/workspace separation rules as other Studio workspaces. +- The `Scene Workspace` MUST own its operational detail locally rather than pushing it into shell-global surfaces. + +### 2. Scene Ownership Model + +- A scene edited in `Scene Workspace` MUST be treated as a Studio-owned intermediate authoring artifact. +- The scene authoring artifact MUST have its own stable identity. +- The scene authoring artifact MUST be the primary navigation unit inside the `Scene Workspace`. +- The related `SCENE` asset MUST appear only as linked context, status, or action, not as the primary navigation unit of the workspace. + +### 3. Relationship with `Assets` + +- `Assets` MAY create a `SCENE` asset. +- `Scene Workspace` MAY create a `SCENE` asset as part of creating a new scene. +- `Assets` MUST delegate scene-content authoring to `Scene Workspace`. +- `Assets` MUST NOT expose map painting or equivalent scene-editor interactions. +- The Studio SHOULD support contextual handoff from `Assets` to `Scene Workspace` after `SCENE` asset creation. + +### 4. Binding Contract + +- The relationship between a scene authoring artifact and a `SCENE` asset MUST be explicit. +- The primary binding anchor MUST be Studio metadata or equivalent explicit identity linkage. +- Path MAY be retained as secondary location context. +- Rename or relocation MUST NOT silently break semantic linkage solely because paths changed. + +### 5. Wave-1 UI Composition + +- The left region MUST provide a scene navigator inspired by the custom-navigation discipline used in `Assets`, but it MUST remain scene-first rather than asset-first. +- The top region of the workspace MUST provide an aspect-tab structure. +- Wave 1 MUST expose only one visible tab: `Tilemap`. +- The central region of the `Tilemap` tab MUST host the editable map canvas. +- The right-side upper region MUST show tilemap dimensions and relevant details for the active scene/layer context. +- The right-side lower region MUST show the tile palette used for picking and painting. + +### 6. Scene Model Expectations for Wave 1 + +- The workspace MUST model exactly four scene layers. +- Each layer MUST support independent dimensions. +- Each layer MUST be editable in a way compatible with the runtime-aligned canonical scene model. +- The workspace MUST NOT flatten all layers into one synthetic shared-size map contract. + +### 7. Tileset Rules + +- Tileset choice MUST be owned by `Scene Workspace`. +- The workspace MAY resolve tileset selection per scene or per layer, as long as the chosen model remains explicit and internally consistent. +- Any glyph bank that is technically valid for use as tileset data MAY be selected. +- Optional Studio editorial tagging MAY improve filtering and discoverability, but MUST remain non-normative to the base capability. +- `Assets` MUST NOT override editorial tileset selection from the scene workspace. + +### 8. Editing and Save Rules + +- The `Scene Workspace` MUST save the intermediate scene authoring artifact through its own save flow. +- Saving the scene authoring artifact MUST remain distinct from asset creation or asset-management flows. +- The workspace MUST support a normal save-oriented document/editing lifecycle for the scene artifact rather than an asset-form `apply/reset` lifecycle. + +### 9. Tooling Scope for Wave 1 + +- Wave 1 MUST support basic painting. +- Wave 1 MUST support erasing through explicit tile presence control. +- Wave 1 MUST support selecting a tile and palette for painting. +- Wave 1 MUST support layer visibility. +- Wave 1 MUST support layer focus. +- Wave 1 MUST NOT depend on bucket fill, marquee, flood fill, or equivalent advanced editing tools. + +### 10. Tile Semantics + +- Tile absence MUST be represented by explicit presence state. +- `glyph_id = 0` MUST remain a valid glyph identifier. +- Erasing a tile MUST clear presence state instead of writing a magic empty glyph value. +- Painting behavior MUST operate over explicit tile data such as active state, glyph id, palette id, and flip state. + +## Constraints + +- This decision is limited to the `Scene Workspace` and its Studio-local boundary with `Assets`. +- This decision MUST NOT be used to infer packer publication rules beyond the existence of a linked `SCENE` asset. +- This decision MUST NOT be treated as approval for camera, lighting, AABB, or other future aspect tabs. +- Any future change to the ownership boundary between `Scene Workspace` and `Assets` requires an explicit revision or replacement decision. +- Any future change to the stable binding contract between scene artifact and `SCENE` asset requires an explicit revision or follow-up decision. + +## Revision Log + +- 2026-04-14: Initial accepted decision from AGD-0029. +- 2026-04-15: Abandoned by explicit user request before implementation completion; follow-up work must proceed through a new discussion rather than this decision. diff --git a/discussion/workflow/plans/PLN-0049-scene-workspace-spec-and-boundary-propagation.md b/discussion/workflow/plans/PLN-0049-scene-workspace-spec-and-boundary-propagation.md new file mode 100644 index 00000000..a58433c3 --- /dev/null +++ b/discussion/workflow/plans/PLN-0049-scene-workspace-spec-and-boundary-propagation.md @@ -0,0 +1,137 @@ +--- +id: PLN-0049 +ticket: studio-scene-workspace +title: Propagate DEC-0026 into Scene Workspace and Assets specs +status: abandoned +created: 2026-04-14 +completed: +tags: + - studio + - specs + - scene + - workspace + - assets +--- + +## Objective + +Turn `DEC-0026` into normative Studio specifications so execution can proceed against stable written contracts for `Scene Workspace`, `Assets`, and shell integration. + +## Background + +`DEC-0026` locks the ownership boundary between `Scene Workspace` and `Assets`, the wave-1 tilemap scope, the explicit scene-to-asset binding rule, and the rule that `Assets` may create `SCENE` assets but must not author scenes. + +The repository already has shell and assets workspace specifications but does not yet have a dedicated `Scene Workspace` specification. + +## Scope + +### Included +- Add a new `Scene Workspace` specification under `docs/specs/studio`. +- Propagate the ownership boundary into `docs/specs/studio/1. Studio Shell and Workspace Layout Specification.md`. +- Propagate the `Assets` limitation and handoff rules into `docs/specs/studio/4. Assets Workspace Specification.md`. +- Record the wave-1 UI composition, save model, binding contract, and non-goals in normative English. + +### Excluded +- Java implementation. +- Serialization format design beyond what `DEC-0026` already locks. +- Packer publication rules. + +## Execution Steps + +### Step 1 - Add the Scene Workspace specification + +**What:** +Create a dedicated normative spec for `Scene Workspace`. + +**How:** +Author a new Studio spec document that captures: +- workspace purpose and authority; +- scene-first navigation; +- explicit distinction between scene artifact and linked `SCENE` asset; +- wave-1 `Tilemap` layout; +- save rules; +- tileset selection rules; +- tool-scope inclusions and exclusions; +- explicit exclusions for camera/lights/AABB and advanced paint tools. + +**File(s):** +- `docs/specs/studio/9. Scene Workspace Specification.md` or the next appropriate numbered spec file. + +### Step 2 - Propagate shell-level workspace presence + +**What:** +Update the shell spec so `Scene Workspace` is a baseline Studio workspace. + +**How:** +Amend the shell workspace set and topology language to include `Scene Workspace` as a first-class shell workspace, while keeping workspace-local detail delegated to the new workspace spec. + +**File(s):** +- `docs/specs/studio/1. Studio Shell and Workspace Layout Specification.md` + +### Step 3 - Propagate the Assets boundary + +**What:** +Update the `Assets` workspace spec so it can create a `SCENE` asset without absorbing scene-authoring responsibility. + +**How:** +Add explicit normative language that: +- `Assets` may create a `SCENE` asset; +- `Assets` must delegate subsequent scene authoring to `Scene Workspace`; +- `Assets` must not expose map-painting or scene-editor interactions; +- contextual handoff into `Scene Workspace` is supported. + +**File(s):** +- `docs/specs/studio/4. Assets Workspace Specification.md` + +### Step 4 - Align accepted project-local state implications + +**What:** +Clarify whether `Scene Workspace` introduces accepted project-local restoration categories in this wave. + +**How:** +Inspect the current `Project-Local Studio State` scope and either: +- explicitly keep scene restoration out of wave 1; or +- add only the minimum accepted shell layout/restoration state required by `DEC-0026`. + +The update must not invent persistence categories that the decision does not support. + +**File(s):** +- `docs/specs/studio/8. Project-Local Studio State Specification.md` + +## Test Requirements + +### Unit Tests + +- None required for spec-only changes. + +### Integration Tests + +- None required for spec-only changes. + +### Manual Verification + +- Confirm each `DEC-0026` normative rule appears in at least one Studio spec. +- Confirm no spec text gives `Assets` ownership over scene editing. +- Confirm the new `Scene Workspace` spec remains limited to wave-1 `Tilemap`. + +## Acceptance Criteria + +- [ ] A dedicated `Scene Workspace` specification exists in `docs/specs/studio`. +- [ ] Shell specs name `Scene Workspace` as a first-class workspace. +- [ ] `Assets` specs explicitly allow `SCENE` asset creation but forbid scene editing. +- [ ] The spec set clearly distinguishes scene artifact save from asset-management flow. +- [ ] The written specs are sufficient for implementation planning without reopening `DEC-0026`. + +## Dependencies + +- `DEC-0026-studio-scene-workspace.md` + +## Risks + +- Misplacing binding or save semantics into the wrong spec would blur workspace ownership. +- Adding too much persistence detail at the spec stage could outrun the accepted decision. +- Reusing `Assets` wording too heavily could accidentally reintroduce asset-first ownership into the scene editor. + +## Abandonment + +Abandoned on 2026-04-15 because the parent decision `DEC-0026` was explicitly abandoned by the user. diff --git a/discussion/workflow/plans/PLN-0050-scene-workspace-shell-and-project-state-foundations.md b/discussion/workflow/plans/PLN-0050-scene-workspace-shell-and-project-state-foundations.md new file mode 100644 index 00000000..ad741b83 --- /dev/null +++ b/discussion/workflow/plans/PLN-0050-scene-workspace-shell-and-project-state-foundations.md @@ -0,0 +1,126 @@ +--- +id: PLN-0050 +ticket: studio-scene-workspace +title: Build Scene Workspace shell and project-state foundations +status: abandoned +created: 2026-04-14 +completed: +tags: + - studio + - workspace + - shell + - project-state + - scene +--- + +## Objective + +Establish the shell, workspace registration, and project-state foundations required to mount `Scene Workspace` as a first-class Studio workspace. + +## Background + +`DEC-0026` requires `Scene Workspace` to exist as its own shell workspace and to own scene-authoring detail locally. The current shell and project-state code already support `Assets`, `Code Editor`, `Debug`, and `Shipper`, but no scene workspace entry exists yet. + +## Scope + +### Included +- Add a `Scene Workspace` entry to the Studio shell workspace model. +- Mount a first implementation composition root for `Scene Workspace`. +- Extend project-local layout/state only where needed for accepted shell behavior. +- Keep workspace-local operational state out of shell-global ownership. + +### Excluded +- Full tilemap editor interactions. +- Asset creation workflows. +- Scene serialization and save internals. + +## Execution Steps + +### Step 1 - Extend workspace identifiers and shell selection + +**What:** +Add `Scene Workspace` to the workspace identity model and shell-selection flow. + +**How:** +Update the workspace enum/identifier, shell selection logic, and main window wiring so the shell can mount and switch to `Scene Workspace` like other first-class workspaces. + +**File(s):** +- `prometeu-studio/src/main/java/p/studio/workspaces/WorkspaceId.java` +- `prometeu-studio/src/main/java/p/studio/window/MainView.java` +- `prometeu-studio/src/main/java/p/studio/workspaces/WorkspaceHost.java` + +### Step 2 - Add a Scene Workspace composition root + +**What:** +Create the initial workspace class and composition surface for `Scene Workspace`. + +**How:** +Introduce a new workspace package with a composition root that follows the Studio event-driven workspace framework and can initially host the wave-1 layout regions. + +**File(s):** +- `prometeu-studio/src/main/java/p/studio/workspaces/scene/SceneWorkspace.java` +- supporting classes under `prometeu-studio/src/main/java/p/studio/workspaces/scene/` + +### Step 3 - Wire workspace lifecycle and activity integration + +**What:** +Ensure the new workspace participates correctly in the shared workspace lifecycle model. + +**How:** +Use existing workspace lifecycle helpers and add any minimal shell-activity mapping needed for workspace open or scene-open events, without leaking scene-local detail into the shell. + +**File(s):** +- `prometeu-studio/src/main/java/p/studio/workspaces/StudioWorkspaceLifecycleSupport.java` +- `prometeu-studio/src/main/java/p/studio/controls/shell/StudioActivityEventMapper.java` if needed + +### Step 4 - Extend project-local shell state only as required + +**What:** +Support accepted shell/layout restoration for `Scene Workspace` if the implementation needs persisted split/divider state in wave 1. + +**How:** +Introduce the smallest project-local state additions necessary for shell restoration and workspace layout proportions. Do not persist scene-editor document state here unless a separate accepted rule exists. + +**File(s):** +- `prometeu-studio/src/main/java/p/studio/projectstate/ProjectLocalStudioState.java` +- `prometeu-studio/src/main/java/p/studio/projectstate/ProjectLocalStudioStateService.java` +- related tests under `prometeu-studio/src/test/java/p/studio/projectstate/` + +## Test Requirements + +### Unit Tests + +- Workspace id / shell restoration tests for the new workspace entry. +- Project-local state normalization tests if new layout state is added. + +### Integration Tests + +- Main-view or shell-focused tests that verify `Scene Workspace` can mount and become the active workspace. + +### Manual Verification + +- Open a project and confirm `Scene Workspace` appears as a shell workspace. +- Switch between `Assets`, `Scene Workspace`, and `Code Editor` without losing shell stability. +- Reopen the project and confirm accepted shell layout restoration still behaves safely. + +## Acceptance Criteria + +- [ ] `Scene Workspace` is a selectable shell workspace. +- [ ] The workspace mounts through the standard workspace host path. +- [ ] No scene-local editing detail is pushed into shell-global state. +- [ ] Any new project-local state is limited to accepted shell/workspace restoration concerns. + +## Dependencies + +- `DEC-0026-studio-scene-workspace.md` +- `PLN-0049-scene-workspace-spec-and-boundary-propagation.md` + +## Risks + +- Overloading shell state with scene-editor detail would violate the workspace boundary. +- Introducing restoration for unaccepted categories would outrun the decision. +- Wiring shortcuts through `MainView` without a clean package boundary would make later tilemap work harder. + +## Abandonment + +Abandoned on 2026-04-15 because the parent decision `DEC-0026` was explicitly abandoned by the user. diff --git a/discussion/workflow/plans/PLN-0051-scene-artifact-and-assets-handoff-contract.md b/discussion/workflow/plans/PLN-0051-scene-artifact-and-assets-handoff-contract.md new file mode 100644 index 00000000..f89623f5 --- /dev/null +++ b/discussion/workflow/plans/PLN-0051-scene-artifact-and-assets-handoff-contract.md @@ -0,0 +1,135 @@ +--- +id: PLN-0051 +ticket: studio-scene-workspace +title: Build scene artifact identity, save flow, and Assets handoff contract +status: abandoned +created: 2026-04-14 +completed: +tags: + - studio + - scene + - asset + - binding + - save +--- + +## Objective + +Implement the Studio-local data contract that gives scenes a stable authoring identity, supports save for the intermediate scene artifact, and allows explicit handoff between `Scene Workspace` and `Assets`. + +## Background + +`DEC-0026` requires a stable scene artifact identity, a save-oriented scene-authoring lifecycle, and an explicit binding between scene artifact and `SCENE` asset that does not rely primarily on path inference. + +## Scope + +### Included +- Define and implement the scene artifact model used by `Scene Workspace`. +- Add Studio-local binding metadata between scene artifact and `SCENE` asset. +- Implement scene save/load for the intermediate authoring artifact. +- Add `Assets` handoff behavior after `SCENE` asset creation. + +### Excluded +- Final packer publication logic. +- Advanced editing tools. +- Future aspect tabs. + +## Execution Steps + +### Step 1 - Define the scene artifact DTO and persistence boundary + +**What:** +Create a Studio-owned scene artifact model with stable identity and wave-1 tilemap data. + +**How:** +Add DTOs and persistence helpers that capture: +- scene identity; +- linked `SCENE` asset identity when present; +- four layers; +- per-layer dimensions; +- per-layer tileset reference; +- tile presence and editable tile data. + +Keep the format explicitly intermediate and Studio-owned. + +**File(s):** +- new files under `prometeu-studio/src/main/java/p/studio/workspaces/scene/model/` +- new files under `prometeu-studio/src/main/java/p/studio/workspaces/scene/persistence/` + +### Step 2 - Implement save/load for the scene artifact + +**What:** +Make `Scene Workspace` able to save and reopen the intermediate scene artifact. + +**How:** +Build a dedicated repository/service for reading and writing scene artifacts using the chosen Studio-local format and metadata contract. Ensure identity survives rename/relocation independently of path. + +**File(s):** +- new persistence/service classes under `prometeu-studio/src/main/java/p/studio/workspaces/scene/` +- tests under `prometeu-studio/src/test/java/p/studio/workspaces/scene/` + +### Step 3 - Implement explicit scene-to-asset binding + +**What:** +Introduce the explicit binding required by the decision. + +**How:** +Store a stable scene artifact id and the linked `SCENE` asset reference in Studio metadata or equivalent explicit state. Avoid primary reliance on path inference. Make the binding readable from both `Scene Workspace` and `Assets`. + +**File(s):** +- scene metadata / persistence files under `prometeu-studio/src/main/java/p/studio/workspaces/scene/` +- `prometeu-studio/src/main/java/p/studio/projectstate/` only if the accepted metadata home belongs there + +### Step 4 - Add Assets-to-Scene handoff behavior + +**What:** +Allow `Assets` to create a `SCENE` asset and then hand off authoring to `Scene Workspace`. + +**How:** +Extend the asset-creation flow with the minimal family support needed for `SCENE`, then trigger explicit open/handoff into `Scene Workspace` without embedding editor controls into `Assets`. + +**File(s):** +- `prometeu-studio/src/main/java/p/studio/workspaces/assets/wizards/AddAssetWizard.java` +- `prometeu-studio/src/main/java/p/studio/workspaces/assets/AssetWorkspace.java` +- new event/message classes under `prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/` and/or `workspaces/scene/messages/` + +## Test Requirements + +### Unit Tests + +- Scene artifact serialization/deserialization tests. +- Binding-identity stability tests across rename-like path changes. +- Asset handoff event tests. + +### Integration Tests + +- End-to-end test: create `SCENE` asset, hand off to `Scene Workspace`, save scene artifact, reopen and preserve binding. + +### Manual Verification + +- Create a scene from `Scene Workspace` and verify a linked `SCENE` asset exists. +- Create a `SCENE` asset from `Assets` and verify the UI hands off to `Scene Workspace`. +- Rename or relocate the scene artifact and verify semantic linkage still resolves. + +## Acceptance Criteria + +- [ ] The scene authoring artifact has a stable identity independent of raw path. +- [ ] `Scene Workspace` can save and reopen the intermediate scene artifact. +- [ ] The binding between scene artifact and `SCENE` asset is explicit and stable. +- [ ] `Assets` can create a `SCENE` asset and hand off authoring without embedding scene editing. + +## Dependencies + +- `DEC-0026-studio-scene-workspace.md` +- `PLN-0049-scene-workspace-spec-and-boundary-propagation.md` +- `PLN-0050-scene-workspace-shell-and-project-state-foundations.md` + +## Risks + +- Choosing the wrong metadata home could make binding brittle or leak scene ownership into the wrong layer. +- Reusing asset-oriented DTOs for scene authoring could erase the boundary that the decision just locked. +- Save/load work can sprawl if the intermediate format is not kept intentionally narrow for wave 1. + +## Abandonment + +Abandoned on 2026-04-15 because the parent decision `DEC-0026` was explicitly abandoned by the user. diff --git a/discussion/workflow/plans/PLN-0052-scene-workspace-wave-1-tilemap-editor.md b/discussion/workflow/plans/PLN-0052-scene-workspace-wave-1-tilemap-editor.md new file mode 100644 index 00000000..a0e2134d --- /dev/null +++ b/discussion/workflow/plans/PLN-0052-scene-workspace-wave-1-tilemap-editor.md @@ -0,0 +1,151 @@ +--- +id: PLN-0052 +ticket: studio-scene-workspace +title: Implement Scene Workspace wave-1 tilemap editor +status: abandoned +created: 2026-04-14 +completed: +tags: + - studio + - scene + - workspace + - tilemap + - ui +--- + +## Objective + +Implement the wave-1 `Tilemap` experience for `Scene Workspace` according to `DEC-0026`. + +## Background + +The accepted decision limits wave 1 to one visible tab, `Tilemap`, with four layers, independent layer dimensions, explicit tile presence semantics, scene-first navigation, and basic editing tools only. + +## Scope + +### Included +- Left scene navigator. +- Top tab strip with only `Tilemap` visible. +- Central tilemap editing canvas. +- Right-side tilemap details and tile palette regions. +- Four-layer editing model with visibility and focus. +- Basic painting, erasing, and tile selection. + +### Excluded +- Camera boundaries. +- Lights. +- AABB authoring. +- Placeholder tabs for unsupported aspects. +- Advanced editing tools such as bucket fill, marquee, flood fill, or lock semantics. + +## Execution Steps + +### Step 1 - Build the workspace projection model + +**What:** +Create projection/view-state types for the scene navigator, active scene, active layer, tile palette, and tilemap details. + +**How:** +Follow the event-driven workspace framework already used by other Studio workspaces. Keep projection boundaries local so navigator, details, and palette can update without whole-workspace redraw. + +**File(s):** +- new projection and message classes under `prometeu-studio/src/main/java/p/studio/workspaces/scene/` + +### Step 2 - Build the left navigator and scene selection flow + +**What:** +Render a scene-first navigator that lists authoring scenes, not assets. + +**How:** +Introduce a custom navigator control inspired by `Assets` patterns but scoped to scene identity, with linked asset context rendered only as secondary status. + +**File(s):** +- new controls under `prometeu-studio/src/main/java/p/studio/workspaces/scene/list/` +- `prometeu-studio/src/main/java/p/studio/workspaces/scene/SceneWorkspace.java` + +### Step 3 - Build the wave-1 Tilemap layout + +**What:** +Implement the single visible tab and its three-region body. + +**How:** +Compose: +- central tilemap canvas; +- right upper details panel; +- right lower tile palette; +- layer controls for visibility and focus. + +Do not expose unsupported tabs. + +**File(s):** +- `prometeu-studio/src/main/java/p/studio/workspaces/scene/SceneWorkspace.java` +- new controls under `prometeu-studio/src/main/java/p/studio/workspaces/scene/tilemap/` + +### Step 4 - Implement tile selection and painting + +**What:** +Support the basic editing interactions required by the decision. + +**How:** +Implement tile selection from the palette, paint on the active layer, erase by clearing explicit tile presence, and preserve valid `glyph_id = 0` semantics. + +**File(s):** +- tilemap interaction classes under `prometeu-studio/src/main/java/p/studio/workspaces/scene/tilemap/` +- scene model classes under `prometeu-studio/src/main/java/p/studio/workspaces/scene/model/` + +### Step 5 - Implement tileset resolution and layer detail rendering + +**What:** +Resolve glyph-bank-backed tileset data for the active scene/layer and show dimensions/details in the side panel. + +**How:** +Consume the scene-owned tileset choice, render available tiles and palette choices, and expose active layer dimensions and relevant properties without handing ownership to `Assets`. + +**File(s):** +- scene workspace service/projection classes +- tile palette and detail controls under `prometeu-studio/src/main/java/p/studio/workspaces/scene/tilemap/` + +## Test Requirements + +### Unit Tests + +- Projection-state tests for active scene, layer visibility, and focus. +- Tile painting tests that preserve explicit presence semantics. +- Palette-selection tests that keep `glyph_id = 0` valid. + +### Integration Tests + +- UI-oriented tests for scene selection, tile selection, paint, erase, and save-triggered refresh. + +### Manual Verification + +- Open `Scene Workspace`, create/open a scene, and confirm the navigator is scene-first. +- Paint and erase on different layers with independent dimensions. +- Verify layer visibility/focus changes do not corrupt scene data. +- Verify only the `Tilemap` tab is visible in wave 1. + +## Acceptance Criteria + +- [ ] `Scene Workspace` renders a scene-first navigator. +- [ ] Wave 1 exposes only the `Tilemap` tab. +- [ ] The editor supports four layers with independent dimensions. +- [ ] Painting and erasing respect explicit tile presence semantics. +- [ ] Layer visibility and focus work in the tilemap editor. +- [ ] Tile palette and details panels reflect the active scene/layer context. + +## Dependencies + +- `DEC-0026-studio-scene-workspace.md` +- `PLN-0049-scene-workspace-spec-and-boundary-propagation.md` +- `PLN-0050-scene-workspace-shell-and-project-state-foundations.md` +- `PLN-0051-scene-artifact-and-assets-handoff-contract.md` + +## Risks + +- Overbuilding the first UI pass could quietly introduce unsupported aspect tabs or tools. +- Canvas interaction code can become monolithic if projection boundaries are not enforced early. +- Tileset rendering may drift toward asset-first ownership if scene-owned selection is not kept explicit. + +## Abandonment + +Abandoned on 2026-04-15 because the parent decision `DEC-0026` was explicitly abandoned by the user. diff --git a/test-projects/main/assets/.prometeu/cache.json b/test-projects/main/assets/.prometeu/cache.json index dc467a7a..429a81d8 100644 --- a/test-projects/main/assets/.prometeu/cache.json +++ b/test-projects/main/assets/.prometeu/cache.json @@ -13,7 +13,7 @@ "diagnostics" : [ { "severity" : "ERROR", "category" : "STRUCTURAL", - "message" : "Invalid tile dimensions for confirm.png: expected 32x32 but got 16x16", + "message" : "Invalid glyph dimensions for confirm.png: expected 32x32 but got 16x16", "evidence_path" : "/Users/niltonconstantino/personal/workspace.personal/intrepid/prometeu/studio/test-projects/main/assets/ui/atlas2/confirm.png", "blocking" : true } ] @@ -24,14 +24,14 @@ "last_modified" : 1774359772403, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -42,14 +42,14 @@ "last_modified" : 1774359772405, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -60,14 +60,14 @@ "last_modified" : 1774359772406, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -78,14 +78,14 @@ "last_modified" : 1774359772408, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -96,14 +96,14 @@ "last_modified" : 1774359772409, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -114,14 +114,14 @@ "last_modified" : 1774359772411, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -132,14 +132,14 @@ "last_modified" : 1774359772412, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -150,14 +150,14 @@ "last_modified" : 1774359772413, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -168,14 +168,14 @@ "last_modified" : 1774359772415, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -186,14 +186,14 @@ "last_modified" : 1774359772416, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -204,14 +204,14 @@ "last_modified" : 1774359772417, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -222,14 +222,14 @@ "last_modified" : 1774359772418, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -240,14 +240,14 @@ "last_modified" : 1774359772420, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -258,14 +258,14 @@ "last_modified" : 1774359772421, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -276,14 +276,14 @@ "last_modified" : 1774359772423, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -294,14 +294,14 @@ "last_modified" : 1774359772424, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -312,14 +312,14 @@ "last_modified" : 1774359772425, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -330,14 +330,14 @@ "last_modified" : 1774359772426, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -348,14 +348,14 @@ "last_modified" : 1774359772428, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -366,14 +366,14 @@ "last_modified" : 1774359772429, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -384,14 +384,14 @@ "last_modified" : 1774359772430, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -402,14 +402,14 @@ "last_modified" : 1774359772431, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -420,14 +420,14 @@ "last_modified" : 1774359772432, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -438,14 +438,14 @@ "last_modified" : 1774359772433, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -456,14 +456,14 @@ "last_modified" : 1774359772435, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -474,14 +474,14 @@ "last_modified" : 1774359772436, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -492,14 +492,14 @@ "last_modified" : 1774359772437, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -510,14 +510,14 @@ "last_modified" : 1774359772438, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -528,14 +528,14 @@ "last_modified" : 1774359772439, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -546,14 +546,14 @@ "last_modified" : 1774359772441, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -564,14 +564,14 @@ "last_modified" : 1774359772442, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -582,14 +582,14 @@ "last_modified" : 1774359772443, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -600,14 +600,14 @@ "last_modified" : 1774359772444, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -618,14 +618,14 @@ "last_modified" : 1774359772445, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -636,14 +636,14 @@ "last_modified" : 1774359772448, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -654,14 +654,14 @@ "last_modified" : 1774359772449, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -672,14 +672,14 @@ "last_modified" : 1774359772450, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -690,14 +690,14 @@ "last_modified" : 1774359772452, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -708,14 +708,14 @@ "last_modified" : 1774359772453, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -726,14 +726,14 @@ "last_modified" : 1774359772454, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -744,14 +744,14 @@ "last_modified" : 1774359772455, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -762,14 +762,14 @@ "last_modified" : 1774359772456, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -780,14 +780,14 @@ "last_modified" : 1774359772458, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -798,14 +798,14 @@ "last_modified" : 1774359772459, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -816,14 +816,14 @@ "last_modified" : 1774359772460, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -834,14 +834,14 @@ "last_modified" : 1774359772461, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -852,14 +852,14 @@ "last_modified" : 1774359772463, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -870,14 +870,14 @@ "last_modified" : 1774359772464, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -888,14 +888,14 @@ "last_modified" : 1774359772465, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -906,14 +906,14 @@ "last_modified" : 1774359772467, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -924,14 +924,14 @@ "last_modified" : 1774359772468, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -942,14 +942,14 @@ "last_modified" : 1774359772470, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -960,14 +960,14 @@ "last_modified" : 1774359772474, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -978,14 +978,14 @@ "last_modified" : 1774359772476, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -996,14 +996,14 @@ "last_modified" : 1774359772478, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -1014,14 +1014,14 @@ "last_modified" : 1774359772479, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -1032,14 +1032,14 @@ "last_modified" : 1774359772481, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -1050,14 +1050,14 @@ "last_modified" : 1774359772482, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -1068,14 +1068,14 @@ "last_modified" : 1774359772483, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -1086,14 +1086,14 @@ "last_modified" : 1774359772484, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -1104,14 +1104,14 @@ "last_modified" : 1774359772485, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -1122,14 +1122,14 @@ "last_modified" : 1774359772487, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -1140,14 +1140,14 @@ "last_modified" : 1774359772488, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -1158,14 +1158,14 @@ "last_modified" : 1774359772489, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -1176,14 +1176,14 @@ "last_modified" : 1774359772491, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -1194,14 +1194,14 @@ "last_modified" : 1774359772492, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -1212,14 +1212,14 @@ "last_modified" : 1774359772493, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -1230,14 +1230,14 @@ "last_modified" : 1774359772494, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -1248,14 +1248,14 @@ "last_modified" : 1774359772495, "fingerprint" : "eeb7cc665386299403b7be1c272375d5077f3647c587f8033aa8c9275f840562", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -1266,14 +1266,14 @@ "last_modified" : 1775797786950, "fingerprint" : "0526996900bdeef23c72fe987fb45800f11895946dcd5f0f7f8390c879069a37", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674, -1736296, -13905598, -11518505, -14439577, -2467509 ], - "convertedRgb565" : [ -122, -7149, 11912, 20986, 9548, -9527 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAgIBAQEBAQEBAQEBAQEBAQEBAwMDAwMDAQEBAQEBAgICAgICAgIBAQEBAQEBAQEBAQMDAwMDAwMBAQEBAQICAgICAgICAQEBAQEBAQEBAQEBAQMDAwMDAQEBAQEBAgICAgICAgEBAQEBAQQEBAQBAQEBAQEBAQEBAQEBAQEBAgICAgIBAQEBAQEEBAQEBAQBAQEBAQEBAQEBAQEBAQEBAgECAQEBAQEBAQQEBAQEAQEBAQEBAAAAAAAAAAABAQECAQEBAQEBAQEEBAQEBAEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQUBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQUFBQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEFBQUFBQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBBQUFBQUBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBBQUFAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQYGBgYBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBBgYGBgEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEGBgYGAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQYGBgYBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQYGAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674, -1736296, -13905598, -11518505, -14439577, -2467509 ], + "convertedRgb565" : [ -122, -7149, 11912, 20986, 9548, -9527 ] } }, "diagnostics" : [ ] @@ -1314,14 +1314,14 @@ "last_modified" : 1775797786770, "fingerprint" : "aa7d241deabcebe29a6096e14eaf16fdc06cf06380c11a507620b00fc7bff094", "metadata" : { - "palette" : { - "originalArgb8888" : [ -265674 ], - "convertedRgb565" : [ -122 ] - }, "tile" : { "width" : 16, "height" : 16, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAEBAQEBAQEBAQEBAQAAAAABAQEBAQEBAQEBAQEAAAAAAQEBAQEBAAAAAAAAAAAAAAEBAQEBAQAAAAAAAAAAAAABAQEBAQEAAAAAAAAAAAAAAQEBAQEBAAAAAAAAAAAAAAEBAQEBAQAAAAAAAAABAQEBAQEBAQEAAAAAAAAAAQEBAQEBAAAAAAAAAAAAAAEBAQEBAQAAAAAAAAABAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAAAAAAAAAAEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -265674 ], + "convertedRgb565" : [ -122 ] } }, "diagnostics" : [ ] @@ -1344,14 +1344,14 @@ "last_modified" : 1775797786709, "fingerprint" : "6ca635a7906067b6a2a8460a8562718c445783e6df18b9f2c80c83c5ac569db6", "metadata" : { - "palette" : { - "originalArgb8888" : [ -130562, -14145496, -2043712, -460560, -13082456, -6252424, -10977088 ], - "convertedRgb565" : [ -2017, 10565, -6504, -34, 15125, -23345, 23576 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAwMDAwMDAgAAAAAAAAAAAAACAgIAAAAAAAAAAAAAAAIEBQUFBQUDAgAAAAAAAgICAgMDAwIAAAAAAAAAAAAAAgQFAwYGBgUDAgICAgIDAwMDBQUFAwIAAAAAAAAAAAACBAUDBgYGBgUEBAQEAwUFBQUGAwMFBAICAAAAAAAAAAIEBQMGBgYGAwUFBwcFBgYGBgMDAwMFBAQCAgAAAAAAAgQFAwYGBgMDAwQEBAMGBgYGBgMDAwMHBwQDAgAAAAACBAUDBgYGAwMDAwQEAwYGBgYGAwMDBAQEBQUDAgIAAAIEBQMGBgYDAwMDBAQDBgYGBgYDAwMDBAQDAwUGAgAAAgQFAwYGBgMDAwMEBAMGBgYGBQUFBQUEBAUFBgIAAAACBAUDBgYGAwMDAwQEAwYGBQUGAwMDAwcHAwYCAAAAAAIEBQMFBQUFBQMDBAQDBgUGBgICAgICBAQCAgAAAAAAAgQFBQYGBgYDBQMEBAMFBgICAAAAAAACAgAAAAAAAAACBAMDBgICAgIDBQcHBQYCAAAAAAAAAAAAAAAAAAAAAgIDAwMCAAAAAAIEBAMDAgAAAAAAAAAAAAAAAAAAAAICAgICAgAAAAAAAAICAgIAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ==" + }, + "palette" : { + "originalArgb8888" : [ -130562, -14145496, -2043712, -460560, -13082456, -6252424, -10977088 ], + "convertedRgb565" : [ -2017, 10565, -6504, -34, 15125, -23345, 23576 ] } }, "diagnostics" : [ { @@ -1396,14 +1396,14 @@ "last_modified" : 1775797786706, "fingerprint" : "7feab8c868bb446afd3dd7250e70504fb0ca228f463650d2dd7c525144e0b321", "metadata" : { - "palette" : { - "originalArgb8888" : [ -16777216, -2109505, -526353, -395279, -130562, -13082456, -10911807, -6318217, -6186631, -6187143, -6318215, -13148249, -13016663, -14080215 ], - "convertedRgb565" : [ 0, -8585, -2115, -66, -2017, 15125, 23544, -25426, -23345, -23377, -25425, 13044, 15125, 10533 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgMDBAEBAQEBBQUFAAUFBQUFBQUBAQAAAAAAAAAAAAECBgcHBAIICAkBBQUFBQUFBQEBAQICAQEAAAAFBQAAAQIGAwMHBgYGBgIBBQUFBQEBCgIIBgYDBAEBBQUFAAABAgYDAwIJCQsJBgIBAQEBCAgMDA0JAgcHAwMBBQUAAAECBgMDAgsLCwsLBgMDAwIGBgkCCwILAgIHAwEFBQAAAQIGAwMCCQkJCQkCBgcHBgsLCwsCCwICAwMHAwEFAAABAgYDAgkJCQkJCQICAwMCCQkJAgkGBgYHBwcDDgUAAAECBwMCCQkJCQkJAgIDAgkJCQkGBgsCAwMDAwQEAQAAAQIHAwIJCQkJCQkCAgMCCQkJBgkLAQEBAQEBAQQBAAABAgcDAgkJCQkJAgICAwILCQYJAQEFBQUFBQUFAQEAAAECBwMCCQkJCQYGAgIDAgkGCwEFBQUFBQUFBQAAAAAAAQIHAwIJCQYGCQIGBgcMBgkBBQUFBQUFBQAAAAAAAAABAgcGBgYGCQsBAQIDBAIKAQUFBQUFBQAAAAAAAAAAAQECAwIJCQkBAQAAAQEBAQEAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + }, + "palette" : { + "originalArgb8888" : [ -16777216, -2109505, -526353, -395279, -130562, -13082456, -10911807, -6318217, -6186631, -6187143, -6318215, -13148249, -13016663, -14080215 ], + "convertedRgb565" : [ 0, -8585, -2115, -66, -2017, 15125, 23544, -25426, -23345, -23377, -25425, 13044, 15125, 10533 ] } }, "diagnostics" : [ ] @@ -1414,14 +1414,14 @@ "last_modified" : 1775797786710, "fingerprint" : "c363f3ef7f32d9b249c7dc8babdb3eb5aae68c524099e5e97290202b054dda71", "metadata" : { - "palette" : { - "originalArgb8888" : [ -14671840, -11431408, -9326048, -802016, -3964416, -5086944, -789517, -810399, -1863087, -10403552, -5078447 ], - "convertedRgb565" : [ 8452, 21634, 30084, -2556, -15360, -19708, -2146, -2804, -7030, 25092, -19446 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQICAwMBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBAQBAgIDAwMCAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQUFBAQBAgIDAgICAQAAAAAAAAAAAAAAAAAAAAAAAAABBQEFBAUBAgICAgMBAAAAAAAAAAAAAAAAAAAAAAAAAAABBgEFBQUBAgECAgMBAAAAAAAAAAAAAAAAAAAAAAAAAAEGBwEFBAEBCAECAwEAAAAAAAAAAAAAAAAAAAAAAAAAAQgBBwEEAQgJAQICAQAAAAAAAAAAAAAAAAAAAAAAAAEICAEHAQQBCQYBAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAEGCQkBBQEGAQUBAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBBgYBBgEBAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQcBAQEBAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAwECAwIBAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQECAQcHBwECAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBAEBAQEBAQECAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgEJCgoBAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEJCQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEKAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQELCwoKAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + }, + "palette" : { + "originalArgb8888" : [ -14671840, -11431408, -9326048, -802016, -3964416, -5086944, -789517, -810399, -1863087, -10403552, -5078447 ], + "convertedRgb565" : [ 8452, 21634, 30084, -2556, -15360, -19708, -2146, -2804, -7030, 25092, -19446 ] } }, "diagnostics" : [ ] @@ -1432,14 +1432,14 @@ "last_modified" : 1775797786711, "fingerprint" : "e2130efbb9643b41a4fb62619f2713402f9622c7db040fe18d929609ef70b89a", "metadata" : { - "palette" : { - "originalArgb8888" : [ -14671840, -11431408, -9326048, -802016, -3964416, -5086944, -789517, -810399, -1863087, -10403552, -5078447 ], - "convertedRgb565" : [ 8452, 21634, 30084, -2556, -15360, -19708, -2146, -2804, -7030, 25092, -19446 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQECAgMDAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQQEAQICAwMDAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAEFBQQEAQICAwICAgEAAAAAAAAAAAAAAAAAAAAAAAAAAQUBBQQFAQICAgIDAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQYBBQUFAQIBAgIDAQAAAAAAAAAAAAAAAAAAAAAAAAABBgcBBQQBAQgBAgMBAAAAAAAAAAAAAAAAAAAAAAAAAAEIAQcBBAEICQECAgEAAAAAAAAAAAAAAAAAAAAAAAABCAgBBwEEAQkGAQICAQAAAAAAAAAAAAAAAAAAAAAAAAABBgkJAQUBBgEFAQIBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQYGAQYBAQEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEHAQEBAQECAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgEBBwMBAwMBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBCQoBBwEDAgEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAgEJCQoBAgIBAQIBAAAAAAAAAAAAAAAAAAAAAAAAAAECAgEBAQICAQECAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgECAQECAgEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQICAgEBAQoKAQAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQELCwoBAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQsLAQEAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + }, + "palette" : { + "originalArgb8888" : [ -14671840, -11431408, -9326048, -802016, -3964416, -5086944, -789517, -810399, -1863087, -10403552, -5078447 ], + "convertedRgb565" : [ 8452, 21634, 30084, -2556, -15360, -19708, -2146, -2804, -7030, 25092, -19446 ] } }, "diagnostics" : [ ] @@ -1450,14 +1450,14 @@ "last_modified" : 1775797786713, "fingerprint" : "9216dfc6a6226fac398e9f781550d23fbfaa65bd377cdda69187149beca114ec", "metadata" : { - "palette" : { - "originalArgb8888" : [ -14671840, -11431408, -9326048, -802016, -3964416, -5086944, -789517, -810399, -1863087, -10403552, -5078447 ], - "convertedRgb565" : [ 8452, 21634, 30084, -2556, -15360, -19708, -2146, -2804, -7030, 25092, -19446 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQECAgMDAQEAAAEBAAAAAAAAAAAAAAAAAAAAAAABBAQEAQICAwMDAgEBAwEAAAAAAAAAAAAAAAAAAAAAAAEFBQQEAQICAwICAQIDAQAAAAAAAAAAAAAAAAAAAAAAAAEBBQQFAQICAgICAwEBAAAAAAAAAAAAAAAAAAAAAAAAAQYBBQUFAQIBAgICAQAAAAAAAAAAAAAAAAAAAAAAAAABBgcBBQQFAQgBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAEIAQcBBAUBCQEBBQUBAAAAAAAAAAAAAAAAAAAAAAABCAgBBwgBBAUBAQUBAAAAAAAAAAAAAAAAAAAAAAAAAAABBgkJBgYBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQYGBgYBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQMBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEJCgEHAwECAwEBAQAAAAAAAAAAAAAAAAAAAAAAAAABAQkKAQcCAQIDAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAEKAQEBAQECAgEBAgELAQAAAAAAAAAAAAAAAAAAAAAAAQEKAQICAQEBAgIBAQoLAQAAAAAAAAAAAAAAAAAAAAAAAQEBAQECAgICAQEAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + }, + "palette" : { + "originalArgb8888" : [ -14671840, -11431408, -9326048, -802016, -3964416, -5086944, -789517, -810399, -1863087, -10403552, -5078447 ], + "convertedRgb565" : [ 8452, 21634, 30084, -2556, -15360, -19708, -2146, -2804, -7030, 25092, -19446 ] } }, "diagnostics" : [ ] @@ -1468,14 +1468,14 @@ "last_modified" : 1775797786712, "fingerprint" : "ebc4b7ca7bb1455288681c5d71424f60f658a44cb343d0c3934329cec676c867", "metadata" : { - "palette" : { - "originalArgb8888" : [ -14671840, -11431408, -9326048, -802016, -3964416, -5086944, -789517, -810399, -1863087, -10403552, -5078447 ], - "convertedRgb565" : [ 8452, 21634, 30084, -2556, -15360, -19708, -2146, -2804, -7030, 25092, -19446 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQICAwMBAQEBAwEAAAAAAAAAAAAAAAAAAAAAAAABBAQBAgIDAwMCAQMDAQAAAAAAAAAAAAAAAAAAAAAAAQUFBAQBAgIDAgICAwIBAAAAAAAAAAAAAAAAAAAAAAABBQEFBAUBAgICAgMCAQAAAAAAAAAAAAAAAAAAAAAAAAABBgEFBQUBAgECAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAEGBwEFBAUBCAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQgBBwEEBQEJAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEICAEHCQEEBQEFAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBCQkGBgEBAQUBAAAAAAAAAAAAAAAAAAAAAAAAAAABCQoBAQEGBgEBAQUBAAAAAAAAAAAAAAAAAAAAAAAAAAEKCgEHAgEBAQMBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBBwICAQIDAwEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQECAgMBAQIBAAAAAAAAAAAAAAAAAAAAAAAAAQoBAQIBAgICAgECAQEAAAAAAAAAAAAAAAAAAAAAAAABCgoBAgIBAQEBAgELAQAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQICAgIBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + }, + "palette" : { + "originalArgb8888" : [ -14671840, -11431408, -9326048, -802016, -3964416, -5086944, -789517, -810399, -1863087, -10403552, -5078447 ], + "convertedRgb565" : [ 8452, 21634, 30084, -2556, -15360, -19708, -2146, -2804, -7030, 25092, -19446 ] } }, "diagnostics" : [ ] @@ -1486,14 +1486,14 @@ "last_modified" : 1775797786718, "fingerprint" : "c363f3ef7f32d9b249c7dc8babdb3eb5aae68c524099e5e97290202b054dda71", "metadata" : { - "palette" : { - "originalArgb8888" : [ -14671840, -11431408, -9326048, -802016, -3964416, -5086944, -789517, -810399, -1863087, -10403552, -5078447 ], - "convertedRgb565" : [ 8452, 21634, 30084, -2556, -15360, -19708, -2146, -2804, -7030, 25092, -19446 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQICAwMBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBAQBAgIDAwMCAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQUFBAQBAgIDAgICAQAAAAAAAAAAAAAAAAAAAAAAAAABBQEFBAUBAgICAgMBAAAAAAAAAAAAAAAAAAAAAAAAAAABBgEFBQUBAgECAgMBAAAAAAAAAAAAAAAAAAAAAAAAAAEGBwEFBAEBCAECAwEAAAAAAAAAAAAAAAAAAAAAAAAAAQgBBwEEAQgJAQICAQAAAAAAAAAAAAAAAAAAAAAAAAEICAEHAQQBCQYBAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAEGCQkBBQEGAQUBAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBBgYBBgEBAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQcBAQEBAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAwECAwIBAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQECAQcHBwECAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBAEBAQEBAQECAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgEJCgoBAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEJCQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEKAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQELCwoKAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + }, + "palette" : { + "originalArgb8888" : [ -14671840, -11431408, -9326048, -802016, -3964416, -5086944, -789517, -810399, -1863087, -10403552, -5078447 ], + "convertedRgb565" : [ 8452, 21634, 30084, -2556, -15360, -19708, -2146, -2804, -7030, 25092, -19446 ] } }, "diagnostics" : [ ] @@ -1504,14 +1504,14 @@ "last_modified" : 1775797786717, "fingerprint" : "1ba8ce75c445396334737143e0cfa56c87a1fb64cca8ad0962192594849249eb", "metadata" : { - "palette" : { - "originalArgb8888" : [ -14671840, -11431408, -9326048, -802016, -3964416, -5086944, -789517, -810399, -1863087, -10403552 ], - "convertedRgb565" : [ 8452, 21634, 30084, -2556, -15360, -19708, -2146, -2804, -7030, 25092 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQICAwMBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBAQBAgIDAwMCAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQUFBAQBAgIDAgICAQAAAAAAAAAAAAAAAAAAAAAAAAABBQEFBAUBAgICAgMBAAAAAAAAAAAAAAAAAAAAAAAAAAABBgEFBQUBAgECAgMBAAAAAAAAAAAAAAAAAAAAAAAAAAEGBwEFBAEBCAECAwEAAAAAAAAAAAAAAAAAAAAAAAAAAQgBBwEEAQgJAQICAQAAAAAAAAAAAAAAAAAAAAAAAAEICAEHAQQBCQYBAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAEGCQkBBQEGAQUBAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBBgYBAQEBAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQcBAQEDAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAwMBAgcHAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQMDAwIBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBAIDAgEKCgECAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAQEBAQkJAQIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQECAgICAQECAQoBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQICAgEKCgEAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBCgoKAQAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + }, + "palette" : { + "originalArgb8888" : [ -14671840, -11431408, -9326048, -802016, -3964416, -5086944, -789517, -810399, -1863087, -10403552 ], + "convertedRgb565" : [ 8452, 21634, 30084, -2556, -15360, -19708, -2146, -2804, -7030, 25092 ] } }, "diagnostics" : [ ] @@ -1522,14 +1522,14 @@ "last_modified" : 1775797786714, "fingerprint" : "5e0954447699c6d5eac7550f1a10cf520efcddad0b9fbd9a716434da9d9550d4", "metadata" : { - "palette" : { - "originalArgb8888" : [ -14671840, -11431408, -9326048, -802016, -3964416, -5086944, -789517, -810399, -1863087, -10403552, -5078447 ], - "convertedRgb565" : [ 8452, 21634, 30084, -2556, -15360, -19708, -2146, -2804, -7030, 25092, -19446 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQICAwMBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEBAQBAgIDAwMCAQABAQAAAAAAAAAAAAAAAAAAAAAAAQUFBAQBAgIDAgIBAQMBAAAAAAAAAAAAAAAAAAAAAAAAAQEFBAUBAgICAgIDAwEAAAAAAAAAAAAAAAAAAAAAAAABBgEFBQUBAgECAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAEGBwEFBAUBCAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAQgBBwEEBQEJAQEFBQEAAAAAAAAAAAAAAAAAAAAAAAEICAEHCAEEBQEBBQEBAAAAAAAAAAAAAAAAAAAAAAAAAAEGCQkGBgEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBBgYGAQIDAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCQEBAQEBAQEHAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBBwcDAgEKCgEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAgIBAwMCAQkJAQEAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQIBAgMCAQEBCgEAAAAAAAAAAAAAAAAAAAAAAAABCwsKAQIBAQECAgEKAQAAAAAAAAAAAAAAAAAAAAAAAAABCwsKAQICAgIBCgoBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + }, + "palette" : { + "originalArgb8888" : [ -14671840, -11431408, -9326048, -802016, -3964416, -5086944, -789517, -810399, -1863087, -10403552, -5078447 ], + "convertedRgb565" : [ 8452, 21634, 30084, -2556, -15360, -19708, -2146, -2804, -7030, 25092, -19446 ] } }, "diagnostics" : [ ] @@ -1540,14 +1540,14 @@ "last_modified" : 1775797786716, "fingerprint" : "6104ba7f216a937994d478ed07766ec28f48ad72fdd6620508535a1f877b8ddb", "metadata" : { - "palette" : { - "originalArgb8888" : [ -14671840, -11431408, -9326048, -802016, -3964416, -5086944, -789517, -810399, -1863087, -10403552, -5078447 ], - "convertedRgb565" : [ 8452, 21634, 30084, -2556, -15360, -19708, -2146, -2804, -7030, 25092, -19446 ] - }, "tile" : { "width" : 32, "height" : 32, "paletteIndices" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQICAwMBAQEBAwEAAAAAAAAAAAAAAAAAAAAAAAABBAQBAgIDAwMCAQMDAQAAAAAAAAAAAAAAAAAAAAAAAQUFBAQBAgIDAgICAwIBAAAAAAAAAAAAAAAAAAAAAAABBQEFBAUBAgICAgMCAQAAAAAAAAAAAAAAAAAAAAAAAAABBgEFBQUBAgECAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAEGBwEFBAUBCAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQgBBwEEBQEJAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEICAEHCQEEBQEFAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGCQkGBgEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBBgYGAQIDAgEBAAAAAAAAAAAAAAAAAAAAAAAAAAEJAQEBAQEBAgIBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBBwcDAgIBAQoKAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQQBAwMDAgIBCQkBAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgECAwMCAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAABCwYBAgEBAQECAgEKAQAAAAAAAAAAAAAAAAAAAAAAAAELCgYBAgICAgEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEKCgoBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + }, + "palette" : { + "originalArgb8888" : [ -14671840, -11431408, -9326048, -802016, -3964416, -5086944, -789517, -810399, -1863087, -10403552, -5078447 ], + "convertedRgb565" : [ 8452, 21634, 30084, -2556, -15360, -19708, -2146, -2804, -7030, 25092, -19446 ] } }, "diagnostics" : [ ] @@ -1561,7 +1561,7 @@ "diagnostics" : [ { "severity" : "ERROR", "category" : "STRUCTURAL", - "message" : "Invalid tile dimensions for t1381s1.png: expected 32x32 but got 320x208", + "message" : "Invalid glyph dimensions for t1381s1.png: expected 32x32 but got 320x208", "evidence_path" : "/Users/niltonconstantino/personal/workspace.personal/intrepid/prometeu/studio/test-projects/main/assets/Zelda3/t1381s1.png", "blocking" : true } ] @@ -1575,7 +1575,7 @@ "diagnostics" : [ { "severity" : "ERROR", "category" : "STRUCTURAL", - "message" : "Invalid tile dimensions for t1489s1.png: expected 32x32 but got 288x128", + "message" : "Invalid glyph dimensions for t1489s1.png: expected 32x32 but got 288x128", "evidence_path" : "/Users/niltonconstantino/personal/workspace.personal/intrepid/prometeu/studio/test-projects/main/assets/Zelda3/t1489s1.png", "blocking" : true }, { diff --git a/test-projects/main/assets/scenes/primeiro mapa.tmx b/test-projects/main/assets/scenes/primeiro mapa.tmx new file mode 100644 index 00000000..7e9d8842 --- /dev/null +++ b/test-projects/main/assets/scenes/primeiro mapa.tmx @@ -0,0 +1,36 @@ + + + + + +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + + + + + + diff --git a/test-projects/main/assets/scenes/primeiro tileset.tsx b/test-projects/main/assets/scenes/primeiro tileset.tsx new file mode 100644 index 00000000..897df20e --- /dev/null +++ b/test-projects/main/assets/scenes/primeiro tileset.tsx @@ -0,0 +1,7 @@ + + + + + + + diff --git a/test-projects/main/assets/scenes/scene1.tiled-project b/test-projects/main/assets/scenes/scene1.tiled-project new file mode 100644 index 00000000..d0eb5920 --- /dev/null +++ b/test-projects/main/assets/scenes/scene1.tiled-project @@ -0,0 +1,14 @@ +{ + "automappingRulesFile": "", + "commands": [ + ], + "compatibilityVersion": 1100, + "extensionsPath": "extensions", + "folders": [ + "." + ], + "properties": [ + ], + "propertyTypes": [ + ] +} diff --git a/test-projects/main/assets/scenes/scene1.tiled-session b/test-projects/main/assets/scenes/scene1.tiled-session new file mode 100644 index 00000000..79d10b59 --- /dev/null +++ b/test-projects/main/assets/scenes/scene1.tiled-session @@ -0,0 +1,38 @@ +{ + "activeFile": "primeiro tileset.tsx", + "expandedProjectPaths": [ + "." + ], + "fileStates": { + "primeiro mapa.tmx": { + "scale": 2.55, + "selectedLayer": 1, + "viewCenter": { + "x": 200, + "y": 200.58823529411768 + } + }, + "primeiro tileset.tsx": { + "dynamicWrapping": true, + "scaleInDock": 1, + "scaleInEditor": 1 + } + }, + "last.imagePath": "/Users/niltonconstantino/personal/workspace.personal/intrepid/prometeu/studio/test-projects/main/assets/recovered/atlas2", + "map.height": 25, + "map.lastUsedFormat": "tmx", + "map.tileHeight": 16, + "map.tileWidth": 16, + "map.width": 25, + "openFiles": [ + "primeiro mapa.tmx", + "primeiro tileset.tsx" + ], + "project": "scene1.tiled-project", + "recentFiles": [ + "primeiro mapa.tmx", + "primeiro tileset.tsx" + ], + "tileset.lastUsedFormat": "tsx", + "tileset.type": 1 +} From 9dbc88ce35dabe2b851aa94859f30f134670c212 Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Wed, 15 Apr 2026 07:22:33 +0100 Subject: [PATCH 2/7] clean up --- .../AGD-0029-studio-scene-workspace.md | 295 ------------------ .../DEC-0026-studio-scene-workspace.md | 181 ----------- ...workspace-spec-and-boundary-propagation.md | 137 -------- ...ace-shell-and-project-state-foundations.md | 126 -------- ...ne-artifact-and-assets-handoff-contract.md | 135 -------- ...2-scene-workspace-wave-1-tilemap-editor.md | 151 --------- 6 files changed, 1025 deletions(-) delete mode 100644 discussion/workflow/agendas/AGD-0029-studio-scene-workspace.md delete mode 100644 discussion/workflow/decisions/DEC-0026-studio-scene-workspace.md delete mode 100644 discussion/workflow/plans/PLN-0049-scene-workspace-spec-and-boundary-propagation.md delete mode 100644 discussion/workflow/plans/PLN-0050-scene-workspace-shell-and-project-state-foundations.md delete mode 100644 discussion/workflow/plans/PLN-0051-scene-artifact-and-assets-handoff-contract.md delete mode 100644 discussion/workflow/plans/PLN-0052-scene-workspace-wave-1-tilemap-editor.md diff --git a/discussion/workflow/agendas/AGD-0029-studio-scene-workspace.md b/discussion/workflow/agendas/AGD-0029-studio-scene-workspace.md deleted file mode 100644 index 7f87e63e..00000000 --- a/discussion/workflow/agendas/AGD-0029-studio-scene-workspace.md +++ /dev/null @@ -1,295 +0,0 @@ ---- -id: AGD-0029 -ticket: studio-scene-workspace -title: Scene Workspace for SCENE Authoring -status: abandoned -created: 2026-04-14 -resolved: 2026-04-14 -decision: DEC-0026 -tags: - - studio - - workspace - - scene - - tilemap - - asset - - runtime-alignment ---- - -## Pain - -O Studio ainda nao possui um workspace dedicado para autoria e inspecao de scenes. - -Sem esse workspace: - -- o Studio nao oferece uma experiencia autoral propria para scenes como dominio editorial; -- a equipe fica sem uma superficie visual para editar o artefato intermediario de scene que depois alimenta o asset `SCENE`; -- o Studio perde a chance de ensinar o modelo correto de scene como asset versionado, com quatro layers e contrato proprio; -- a futura expansao para camera bounds, lights, AABB e outros aspectos acaba sem composicao clara desde a primeira wave. - -## Context - -Domain owner: `studio` - -Owner documental esperado: - -- `docs/specs/studio` - -Cross-domain impact: - -- `../runtime` para o contrato canonico de `SCENE`, `SceneBank` e `SceneLayer`; -- `Assets` workspace apenas na fronteira de criacao/descoberta do asset `SCENE`. - -Rastro relevante ja existente: - -- o runtime ja convergiu para `SCENE` como payload binario versionado; -- `SceneBank` e o modelo canonico carregado no runtime possuem exatamente `4` layers; -- cada `SceneLayer` possui seu proprio `TileMap`, com dimensoes independentes; -- viewport cache, camera movement e renderer nao fazem parte do modelo canonico de authoring do scene; -- o `Assets` workspace ja define o padrao de navegador customizado, asset-first e path-aware, que deve inspirar a navegacao do `Scene Workspace` sem virar um file explorer generico. - -Escopo inicial solicitado pelo usuario: - -- novo workspace chamado `Scene Workspace`; -- navegador de scenes na lateral esquerda, similar ao `Assets` workspace; -- o `Scene Workspace` trabalha com scenes como scenes, nao como assets; -- a scene editada no workspace vira um artefato intermediario de autoria; -- o `Scene Workspace` pode criar uma scene nova e, ao fazer isso, criar tambem o asset `SCENE` correspondente; -- o `Assets` workspace pode criar um asset `SCENE`, mas nao pinta mapa nem faz configuracoes editoriais da scene; -- depois de criado, o trabalho de conteudo e configuracao da scene fica delegado ao `Scene Workspace`; -- cada scene como mapa de `4` layers; -- cada layer com largura e altura independentes, em estilo similar ao `Tiled`; -- faixa superior com abas de aspectos da ferramenta; -- primeira aba: `Tilemap`; -- aba `Tilemap` com mapa no centro; -- painel superior direito com dimensoes e detalhes do tilemap; -- painel inferior direito com aquarela/paleta de tiles para selecao e pintura; -- tileset vindo de assets, com suporte a selecionar qualquer glyph bank ou marcar glyph banks como tileset apenas no Studio; -- outras abas futuras previstas: camera boundaries, lights, AABB, etc., mas fora da primeira wave. - -## Open Questions - -- [x] O `Scene Workspace` deve abrir scenes apenas por seu catalogo proprio, ou tambem aceitar handoff contextual quando um asset `SCENE` for criado no `Assets`? -- [x] Qual identidade o navegador da esquerda deve priorizar: scene authoring artifact, path do projeto, ou algum catalogo editorial proprio do `Scene Workspace`? -- [x] O Studio deve tratar a edicao de scene como staged editing com `apply/reset`, ou como documento editavel com save integrado? -- [x] Como o Studio relaciona uma scene autoral com o asset `SCENE` correspondente: referencia por path, UUID proprio do artefato intermediario, ou binding mediado por metadata do Studio? -- [x] Como o Studio seleciona o glyph bank usado como tileset em cada layer ou scene: referencia editorial na scene ou vinculacao resolvida pelo proprio `Scene Workspace`? -- [x] O contrato do runtime ja determina metadados suficientes por layer para authoring inicial, ou o Studio precisara propor extensoes antes da implementacao do workspace? -- [x] Como representar tiles vazios, brush, fill e selecao sem colidir com a semantica canonica de tile vazio ja aceita no runtime? -- [x] A primeira wave deve permitir apenas pintura bruta por tile, ou ja precisa incluir ferramentais como marquee, bucket, eyedropper e multi-layer visibility/lock? -- [x] As abas futuras devem ser somente placeholders estruturais agora, ou a wave inicial deve expor apenas a aba `Tilemap` para nao sugerir suporte inexistente? - -## Options - -### Option A - `Scene Workspace` como workspace dedicado no shell -- **Approach:** Criar um workspace proprio de `Scene Workspace`, com navegador de scenes na esquerda, header com tabs de aspecto e composicao interna especializada por aba. -- **Pro:** Da visibilidade de primeira classe a `SCENE`, cria uma arquitetura clara para expansao futura por aspectos e preserva a fronteira entre shell e detalhe operacional do workspace. -- **Con:** Introduz mais uma entrada no shell e exige decidir como ele se relaciona com a descoberta de assets no fluxo ja existente. -- **Maintainability:** Strong, porque estabiliza ownership e composicao desde a primeira wave. - -### Option B - editor especializado dentro do `Assets` workspace -- **Approach:** Manter tanto o asset `SCENE` quanto a edicao do artefato intermediario dentro do `Assets`, usando a selecao do asset como ponto de entrada do editor. -- **Pro:** Reaproveita navegacao asset-first existente e concentra toda a historia de scene em um unico lugar. -- **Con:** Colapsa duas naturezas diferentes em uma mesma superficie: gerenciamento de asset packer-facing e authoring de scene como conteudo editorial. -- **Maintainability:** Weak, porque incentiva o `Assets` workspace a absorver ownership que nao e dele. - -### Option C - workspace autoral proprio com integracao via asset -- **Approach:** O `Scene Workspace` edita e cria a scene como dominio proprio; o `Assets` workspace apenas pode criar/mostrar o asset `SCENE` e delega a autoria da scene para o `Scene Workspace`. -- **Pro:** Separa claramente authoring editorial de scene da gestao asset-first do `Assets`, sem deixar o `Assets` absorver o editor. -- **Con:** Exige fechar um contrato de binding entre scene autoral e asset `SCENE`, alem de definir handoff entre os dois workspaces. -- **Maintainability:** Strong, porque o `Scene Workspace` permanece owner do conteudo e o `Assets` fica restrito a criacao/gestao do asset. - -## Discussion - -O ponto mais importante desta discussao nao e apenas layout. O runtime ja tem um contrato canonico claro o bastante para impor restricoes no editor: - -1. o payload final `SCENE` nao e um documento arbitrario; e um asset binario versionado com `4` layers fixos; -2. cada layer possui `TileMap` proprio e, portanto, o editor nao deve assumir um canvas unificado com dimensoes compartilhadas; -3. viewport cache, camera drift e outras preocupacoes de renderizacao nao pertencem ao modelo canonico do scene workspace; -4. o `Scene Workspace` nao deve editar o payload final do asset diretamente; ele deve editar um material intermediario proprio; -5. o tileset precisa se alinhar aos glyph banks que ja existem como assets, sem criar um segundo sistema de tiles paralelo no Studio. - -Tambem existe uma decisao estrutural de produto a ser tomada cedo: - -- se o `Scene Workspace` for somente um modo interno do `Assets`, o Studio arrisca repetir o anti-pattern de transformar um workspace asset-first em container generico de editores; -- se ele nascer como workspace proprio, a arquitetura de abas por aspecto e a expansao futura para boundaries/lights/AABB ficam mais honestas; -- como a scene autoral nao e o proprio asset, a costura correta passa por um contrato entre artefato intermediario e asset `SCENE`, nao por subordinacao de um workspace ao outro; -- o `Assets` pode oferecer criacao de asset `SCENE`, mas a autoria e manutencao do conteudo da scene devem ser delegadas ao `Scene Workspace`. - -Outro ponto aberto e a semantica do tileset: - -- permitir qualquer glyph bank maximiza flexibilidade e reaproveitamento; -- exigir uma tag editorial de "tileset" melhora discoverability e reduz selecao invalida; -- uma combinacao pode ser a melhor direcao: qualquer glyph bank tecnicamente valido, com tagging opcional no Studio para curadoria UX. - -Por fim, a primeira wave precisa resistir a overreach: - -- a aba `Tilemap` ja e um escopo suficientemente grande; -- placeholders de abas futuras so fazem sentido se a shell structure realmente precisar reservar esse contrato agora; -- caso contrario, placeholders podem comunicar suporte inexistente e gerar pressao artificial sobre uma decision ainda nao tomada. - -### Convergence pass - recommended answers for the open questions - -#### 1. Workspace proprio ou extensao do `Assets` - -Recomendacao: `Scene Workspace` deve existir como workspace shell-level proprio e nao deve ser subordinado ao `Assets`. - -Motivo: - -- o shell ja foi especificado para hospedar workspaces independentes; -- o `Assets` workspace deve continuar asset-first e didatico, nao virar um host generico de editores; -- a scene autoral tem natureza propria e vira um artefato intermediario, nao o payload final do asset. -- o `Scene Workspace` deve aceitar tanto abertura por seu proprio navegador quanto handoff contextual quando o `Assets` criar um asset `SCENE`. - -#### 2. Identidade do navegador da esquerda - -Recomendacao: a identidade primaria deve ser a scene autoral, nao o asset `SCENE`. - -Contexto de apoio: - -- path continua visivel como contexto secundario; -- o workspace pode precisar de um identificador editorial proprio para a scene intermediaria; -- o asset `SCENE` correspondente pertence ao `Assets` workspace e deve aparecer apenas como vinculacao ou estado derivado. - -Direcao adicional: - -- o navegador deve ser scene-first; -- path de projeto entra como contexto secundario; -- o asset vinculado pode aparecer como badge, status ou acao contextual, mas nao como unidade primaria de navegacao. - -#### 3. Modelo de edicao e persistencia - -Recomendacao: a primeira wave deve tratar a scene como documento/artefato autoral com save proprio, separado de qualquer fluxo de criacao ou gestao do asset no `Assets`. - -Motivo: - -- o usuario deixou explicito que o `Scene Manager` trabalha sobre um artefato intermediario proprio; -- o `Scene Workspace` e owner do conteudo da scene; -- o `Assets` pode continuar com fluxos proprios para criacao/gestao de asset, mas sem absorver a autoria da scene; -- misturar save do conteudo autoral com `apply` do asset apagaria a fronteira entre autoria e empacotamento. - -Direcao adicional: - -- o `Scene Workspace` salva o artefato intermediario; -- criar ou vincular o asset `SCENE` e um passo de integracao entre workspaces, nao a mesma operacao de salvar a scene. - -#### 4. Binding entre scene autoral e asset `SCENE` - -Recomendacao: o binding deve ser mediado por metadata do Studio, nao por inferencia de path como regra primaria. - -Motivo: - -- path pode mudar por rename ou reorganizacao de projeto; -- a scene autoral precisa de identidade mais estavel do que localizacao fisica; -- o `Assets` e o `Scene Workspace` precisam compartilhar um vinculo explicito sem colapsar um no outro. - -Direcao adicional: - -- a scene autoral deve ter um identificador proprio; -- o asset `SCENE` correspondente deve referenciar esse identificador, ou vice-versa, por um contrato editorial do Studio; -- path continua relevante como localizacao de arquivo, nao como ancora semantica principal do binding. - -#### 5. Selecao de glyph bank como tileset - -Recomendacao: a scene autoral deve poder referenciar glyph banks como tilesets em nivel editorial, e essa escolha deve ser owned pelo `Scene Workspace`. - -Motivo: - -- o runtime ja referencia `glyph_bank_id` por layer, nao um tipo separado de tileset; -- criar um subtipo obrigatorio de asset agora inventaria uma regra de produto nao exigida pelo contrato canonico; -- uma tag editorial ainda pode melhorar descoberta sem restringir um contrato que hoje e genericamente `GLYPH`. - -Direcao adicional: - -- a escolha de glyph bank por layer ou por scene deve ser resolvida no `Scene Workspace`; -- o `Assets` nao deve redefinir tileset da scene; -- tags editoriais opcionais no Studio podem melhorar filtragem e discoverability. - -#### 6. Metadados por layer - -Recomendacao: para a primeira wave, o contrato do runtime parece suficiente para authoring inicial de tilemap. - -Rastro observado no runtime: - -- `SceneLayer` ja possui `active`; -- `glyph_bank_id`; -- `tile_size`; -- `motion_factor`; -- `tilemap` com `width`, `height` e tiles. - -Conclusao: - -- isso e suficiente para uma aba `Tilemap` com visibilidade por layer, dimensoes independentes, tileset por layer e pintura; -- camera bounds, lights e AABB ficam corretamente fora dessa wave e devem motivar metadados adicionais apenas quando virarem tema de nova decision. - -#### 7. Tile vazio, brush e pintura - -Recomendacao: o Studio deve respeitar a semantica canonica de presenca explicita por tile. - -Consequencias: - -- `glyph_id = 0` deve permanecer valido; -- apagar um tile deve atuar sobre o bit/estado de presenca (`active = false`), nao sobre um glyph magico; -- brush, eyedropper e futuras ferramentas devem operar sobre `active`, `glyph_id`, `palette_id`, `flip_x` e `flip_y`. - -#### 8. Ferramentas da primeira wave - -Recomendacao: limitar a primeira wave a pintura basica, apagador, seletor de tile e controles de layer como visibilidade/foco. - -Excluir agora: - -- marquee complexo; -- bucket fill; -- multi-select estrutural; -- automacoes de brush avancadas. - -Motivo: - -- o objetivo da wave 1 e provar o fluxo canonico de scene authoring; -- ferramentas mais ricas multiplicam edge cases antes de estabilizar modelo, persistencia e UX base. - -Direcao adicional: - -- `multi-layer visibility` e `layer focus` entram na wave 1; -- `lock`, `marquee`, `bucket`, `flood fill` e automacoes avancadas ficam explicitamente fora. - -#### 9. Abas futuras agora ou depois - -Recomendacao: o workspace deve nascer com uma faixa superior de tabs, mas expor apenas a aba `Tilemap` na primeira wave. - -Motivo: - -- a estrutura de tabs faz parte da composicao arquitetural pedida; -- tabs placeholder para `Camera`, `Lights` ou `AABB` sugeririam suporte que ainda nao existe; -- reservar o componente estrutural agora facilita expansao futura sem mentir sobre cobertura funcional. - -## Resolution - -Abandoned on 2026-04-15 by explicit user request. - -The accepted direction captured here was superseded before implementation. - -Follow-up direction: - -- abandon the dedicated `Scene Workspace` approach; -- open a new discussion for a `Tiled` parser; -- manage the resulting authoring flow from `Assets` through a new asset type. - -Direcao recomendada: convergir para **Option C**, em que o `Scene Workspace` e um workspace autoral de primeira classe no shell e o `Assets` workspace permanece apenas como superficie asset-first capaz de criar ou exibir o asset `SCENE`, sem editar o conteudo da scene. - -Essa recomendacao parte de quatro principios: - -1. a scene autoral e um artefato intermediario proprio do dominio `Scene Workspace`; -2. o asset `SCENE` pode ser criado tanto pelo `Scene Workspace` quanto pelo `Assets`, mas o conteudo da scene e owner do `Scene Workspace`; -3. o `Assets` nao pinta mapa nem faz configuracoes editoriais da scene; -4. o binding entre scene autoral e asset `SCENE` deve ser explicito e estavel; -5. a primeira wave deve fechar apenas o aspecto `Tilemap`, sem fingir maturidade para camera bounds, lights ou AABB. - -Proximo passo sugerido: transformar esta agenda em uma decision que feche: - -1. `Scene Workspace` como workspace shell-level proprio e owner do artefato intermediario de scene; -2. identidade primaria do workspace pela scene autoral, nao pelo asset; -3. save proprio da scene autoral no `Scene Workspace`, separado da criacao/gestao do asset no `Assets`; -4. contrato de binding entre scene intermediaria e asset `SCENE`; -5. glyph banks como tilesets validos por contrato, com eventual curadoria editorial no Studio; -6. aba unica `Tilemap` na primeira wave, preservando a shell de tabs para expansao futura; -7. propagacao necessaria para specs do `studio`, incluindo a pequena extensao do `Assets` para criacao de scene asset e o ownership do `Scene Workspace` sobre a autoria da scene. diff --git a/discussion/workflow/decisions/DEC-0026-studio-scene-workspace.md b/discussion/workflow/decisions/DEC-0026-studio-scene-workspace.md deleted file mode 100644 index 5628520d..00000000 --- a/discussion/workflow/decisions/DEC-0026-studio-scene-workspace.md +++ /dev/null @@ -1,181 +0,0 @@ ---- -id: DEC-0026 -ticket: studio-scene-workspace -title: Scene Workspace Ownership and Wave-1 Tilemap Scope -status: abandoned -created: 2026-04-14 -accepted: 2026-04-14 -agenda: AGD-0029 -plans: - - PLN-0049 - - PLN-0050 - - PLN-0051 - - PLN-0052 -tags: - - studio - - workspace - - scene - - tilemap - - asset - - runtime-alignment ---- - -## Decision - -The Studio SHALL introduce a dedicated `Scene Workspace` as a first-class shell workspace for scene authoring. - -The `Scene Workspace` MUST own the authoring lifecycle of scenes as scenes, not as asset-detail forms. - -The Studio SHALL treat the edited scene as an intermediate authoring artifact owned by the `Scene Workspace`. - -The `Scene Workspace` MAY create a new scene and, as part of that flow, create the corresponding `SCENE` asset. - -The `Assets` workspace MAY also create a `SCENE` asset, but it MUST NOT paint tilemaps, edit scene content, choose scene tilesets, or own other editorial scene configuration. - -When a `SCENE` asset is created from `Assets`, authoring and subsequent editing MUST be delegated to the `Scene Workspace`. - -The first implementation wave of the `Scene Workspace` SHALL expose only the `Tilemap` aspect. - -The wave-1 `Tilemap` aspect MUST support: - -- a left scene navigator; -- a central map editing surface; -- a right-side tilemap details area with dimensions and layer-relevant detail; -- a tile palette area for tile selection and painting; -- four canonical scene layers; -- independent layer dimensions; -- scene-first navigation; -- explicit tile presence semantics aligned with the runtime model; -- basic painting, erasing, tile selection, layer visibility, and layer focus. - -The wave-1 `Scene Workspace` MUST NOT include: - -- authoring for camera boundaries; -- authoring for lights; -- authoring for AABB data; -- placeholder tabs that imply those capabilities already exist; -- advanced paint tools such as marquee, bucket fill, flood fill, or equivalent higher-order tooling. - -The `Scene Workspace` MUST use an explicit and stable binding between the intermediate scene artifact and the corresponding `SCENE` asset. - -That binding MUST NOT rely on path inference as its primary semantic anchor. - -The `Scene Workspace` MUST own editorial tileset selection for the scene. - -Any technically valid glyph bank MAY be referenced as a tileset under the scene-authoring model. - -Optional Studio-only curation such as tagging glyph banks for better discoverability MAY exist, but it MUST NOT redefine the underlying capability contract. - -## Rationale - -This decision separates two different responsibilities that would otherwise collapse into one another: - -- scene authoring as an editorial workspace concern; -- asset management as an asset-first Studio concern. - -Keeping the `Scene Workspace` independent prevents the `Assets` workspace from becoming a generic container for heavy domain editors. - -That separation also matches the user-facing intent: - -- the `Assets` workspace can create or surface a `SCENE` asset; -- the `Scene Workspace` is where the user actually authors the scene. - -Wave 1 is intentionally narrow. - -The goal is to prove the canonical scene-authoring loop around tilemaps, layers, tileset selection, and save semantics before introducing additional aspect domains such as camera, lights, or collision-adjacent editing. - -The decision also keeps the Studio aligned with the runtime model already present in `../runtime`: - -- four canonical layers; -- per-layer tilemaps with independent dimensions; -- explicit tile presence rather than magic empty glyph ids; -- no leakage of viewport-cache or transient renderer concerns into authoring ownership. - -## Technical Specification - -### 1. Workspace Topology - -- The Studio shell MUST mount `Scene Workspace` as its own workspace entry. -- The `Scene Workspace` MUST follow the same shell/workspace separation rules as other Studio workspaces. -- The `Scene Workspace` MUST own its operational detail locally rather than pushing it into shell-global surfaces. - -### 2. Scene Ownership Model - -- A scene edited in `Scene Workspace` MUST be treated as a Studio-owned intermediate authoring artifact. -- The scene authoring artifact MUST have its own stable identity. -- The scene authoring artifact MUST be the primary navigation unit inside the `Scene Workspace`. -- The related `SCENE` asset MUST appear only as linked context, status, or action, not as the primary navigation unit of the workspace. - -### 3. Relationship with `Assets` - -- `Assets` MAY create a `SCENE` asset. -- `Scene Workspace` MAY create a `SCENE` asset as part of creating a new scene. -- `Assets` MUST delegate scene-content authoring to `Scene Workspace`. -- `Assets` MUST NOT expose map painting or equivalent scene-editor interactions. -- The Studio SHOULD support contextual handoff from `Assets` to `Scene Workspace` after `SCENE` asset creation. - -### 4. Binding Contract - -- The relationship between a scene authoring artifact and a `SCENE` asset MUST be explicit. -- The primary binding anchor MUST be Studio metadata or equivalent explicit identity linkage. -- Path MAY be retained as secondary location context. -- Rename or relocation MUST NOT silently break semantic linkage solely because paths changed. - -### 5. Wave-1 UI Composition - -- The left region MUST provide a scene navigator inspired by the custom-navigation discipline used in `Assets`, but it MUST remain scene-first rather than asset-first. -- The top region of the workspace MUST provide an aspect-tab structure. -- Wave 1 MUST expose only one visible tab: `Tilemap`. -- The central region of the `Tilemap` tab MUST host the editable map canvas. -- The right-side upper region MUST show tilemap dimensions and relevant details for the active scene/layer context. -- The right-side lower region MUST show the tile palette used for picking and painting. - -### 6. Scene Model Expectations for Wave 1 - -- The workspace MUST model exactly four scene layers. -- Each layer MUST support independent dimensions. -- Each layer MUST be editable in a way compatible with the runtime-aligned canonical scene model. -- The workspace MUST NOT flatten all layers into one synthetic shared-size map contract. - -### 7. Tileset Rules - -- Tileset choice MUST be owned by `Scene Workspace`. -- The workspace MAY resolve tileset selection per scene or per layer, as long as the chosen model remains explicit and internally consistent. -- Any glyph bank that is technically valid for use as tileset data MAY be selected. -- Optional Studio editorial tagging MAY improve filtering and discoverability, but MUST remain non-normative to the base capability. -- `Assets` MUST NOT override editorial tileset selection from the scene workspace. - -### 8. Editing and Save Rules - -- The `Scene Workspace` MUST save the intermediate scene authoring artifact through its own save flow. -- Saving the scene authoring artifact MUST remain distinct from asset creation or asset-management flows. -- The workspace MUST support a normal save-oriented document/editing lifecycle for the scene artifact rather than an asset-form `apply/reset` lifecycle. - -### 9. Tooling Scope for Wave 1 - -- Wave 1 MUST support basic painting. -- Wave 1 MUST support erasing through explicit tile presence control. -- Wave 1 MUST support selecting a tile and palette for painting. -- Wave 1 MUST support layer visibility. -- Wave 1 MUST support layer focus. -- Wave 1 MUST NOT depend on bucket fill, marquee, flood fill, or equivalent advanced editing tools. - -### 10. Tile Semantics - -- Tile absence MUST be represented by explicit presence state. -- `glyph_id = 0` MUST remain a valid glyph identifier. -- Erasing a tile MUST clear presence state instead of writing a magic empty glyph value. -- Painting behavior MUST operate over explicit tile data such as active state, glyph id, palette id, and flip state. - -## Constraints - -- This decision is limited to the `Scene Workspace` and its Studio-local boundary with `Assets`. -- This decision MUST NOT be used to infer packer publication rules beyond the existence of a linked `SCENE` asset. -- This decision MUST NOT be treated as approval for camera, lighting, AABB, or other future aspect tabs. -- Any future change to the ownership boundary between `Scene Workspace` and `Assets` requires an explicit revision or replacement decision. -- Any future change to the stable binding contract between scene artifact and `SCENE` asset requires an explicit revision or follow-up decision. - -## Revision Log - -- 2026-04-14: Initial accepted decision from AGD-0029. -- 2026-04-15: Abandoned by explicit user request before implementation completion; follow-up work must proceed through a new discussion rather than this decision. diff --git a/discussion/workflow/plans/PLN-0049-scene-workspace-spec-and-boundary-propagation.md b/discussion/workflow/plans/PLN-0049-scene-workspace-spec-and-boundary-propagation.md deleted file mode 100644 index a58433c3..00000000 --- a/discussion/workflow/plans/PLN-0049-scene-workspace-spec-and-boundary-propagation.md +++ /dev/null @@ -1,137 +0,0 @@ ---- -id: PLN-0049 -ticket: studio-scene-workspace -title: Propagate DEC-0026 into Scene Workspace and Assets specs -status: abandoned -created: 2026-04-14 -completed: -tags: - - studio - - specs - - scene - - workspace - - assets ---- - -## Objective - -Turn `DEC-0026` into normative Studio specifications so execution can proceed against stable written contracts for `Scene Workspace`, `Assets`, and shell integration. - -## Background - -`DEC-0026` locks the ownership boundary between `Scene Workspace` and `Assets`, the wave-1 tilemap scope, the explicit scene-to-asset binding rule, and the rule that `Assets` may create `SCENE` assets but must not author scenes. - -The repository already has shell and assets workspace specifications but does not yet have a dedicated `Scene Workspace` specification. - -## Scope - -### Included -- Add a new `Scene Workspace` specification under `docs/specs/studio`. -- Propagate the ownership boundary into `docs/specs/studio/1. Studio Shell and Workspace Layout Specification.md`. -- Propagate the `Assets` limitation and handoff rules into `docs/specs/studio/4. Assets Workspace Specification.md`. -- Record the wave-1 UI composition, save model, binding contract, and non-goals in normative English. - -### Excluded -- Java implementation. -- Serialization format design beyond what `DEC-0026` already locks. -- Packer publication rules. - -## Execution Steps - -### Step 1 - Add the Scene Workspace specification - -**What:** -Create a dedicated normative spec for `Scene Workspace`. - -**How:** -Author a new Studio spec document that captures: -- workspace purpose and authority; -- scene-first navigation; -- explicit distinction between scene artifact and linked `SCENE` asset; -- wave-1 `Tilemap` layout; -- save rules; -- tileset selection rules; -- tool-scope inclusions and exclusions; -- explicit exclusions for camera/lights/AABB and advanced paint tools. - -**File(s):** -- `docs/specs/studio/9. Scene Workspace Specification.md` or the next appropriate numbered spec file. - -### Step 2 - Propagate shell-level workspace presence - -**What:** -Update the shell spec so `Scene Workspace` is a baseline Studio workspace. - -**How:** -Amend the shell workspace set and topology language to include `Scene Workspace` as a first-class shell workspace, while keeping workspace-local detail delegated to the new workspace spec. - -**File(s):** -- `docs/specs/studio/1. Studio Shell and Workspace Layout Specification.md` - -### Step 3 - Propagate the Assets boundary - -**What:** -Update the `Assets` workspace spec so it can create a `SCENE` asset without absorbing scene-authoring responsibility. - -**How:** -Add explicit normative language that: -- `Assets` may create a `SCENE` asset; -- `Assets` must delegate subsequent scene authoring to `Scene Workspace`; -- `Assets` must not expose map-painting or scene-editor interactions; -- contextual handoff into `Scene Workspace` is supported. - -**File(s):** -- `docs/specs/studio/4. Assets Workspace Specification.md` - -### Step 4 - Align accepted project-local state implications - -**What:** -Clarify whether `Scene Workspace` introduces accepted project-local restoration categories in this wave. - -**How:** -Inspect the current `Project-Local Studio State` scope and either: -- explicitly keep scene restoration out of wave 1; or -- add only the minimum accepted shell layout/restoration state required by `DEC-0026`. - -The update must not invent persistence categories that the decision does not support. - -**File(s):** -- `docs/specs/studio/8. Project-Local Studio State Specification.md` - -## Test Requirements - -### Unit Tests - -- None required for spec-only changes. - -### Integration Tests - -- None required for spec-only changes. - -### Manual Verification - -- Confirm each `DEC-0026` normative rule appears in at least one Studio spec. -- Confirm no spec text gives `Assets` ownership over scene editing. -- Confirm the new `Scene Workspace` spec remains limited to wave-1 `Tilemap`. - -## Acceptance Criteria - -- [ ] A dedicated `Scene Workspace` specification exists in `docs/specs/studio`. -- [ ] Shell specs name `Scene Workspace` as a first-class workspace. -- [ ] `Assets` specs explicitly allow `SCENE` asset creation but forbid scene editing. -- [ ] The spec set clearly distinguishes scene artifact save from asset-management flow. -- [ ] The written specs are sufficient for implementation planning without reopening `DEC-0026`. - -## Dependencies - -- `DEC-0026-studio-scene-workspace.md` - -## Risks - -- Misplacing binding or save semantics into the wrong spec would blur workspace ownership. -- Adding too much persistence detail at the spec stage could outrun the accepted decision. -- Reusing `Assets` wording too heavily could accidentally reintroduce asset-first ownership into the scene editor. - -## Abandonment - -Abandoned on 2026-04-15 because the parent decision `DEC-0026` was explicitly abandoned by the user. diff --git a/discussion/workflow/plans/PLN-0050-scene-workspace-shell-and-project-state-foundations.md b/discussion/workflow/plans/PLN-0050-scene-workspace-shell-and-project-state-foundations.md deleted file mode 100644 index ad741b83..00000000 --- a/discussion/workflow/plans/PLN-0050-scene-workspace-shell-and-project-state-foundations.md +++ /dev/null @@ -1,126 +0,0 @@ ---- -id: PLN-0050 -ticket: studio-scene-workspace -title: Build Scene Workspace shell and project-state foundations -status: abandoned -created: 2026-04-14 -completed: -tags: - - studio - - workspace - - shell - - project-state - - scene ---- - -## Objective - -Establish the shell, workspace registration, and project-state foundations required to mount `Scene Workspace` as a first-class Studio workspace. - -## Background - -`DEC-0026` requires `Scene Workspace` to exist as its own shell workspace and to own scene-authoring detail locally. The current shell and project-state code already support `Assets`, `Code Editor`, `Debug`, and `Shipper`, but no scene workspace entry exists yet. - -## Scope - -### Included -- Add a `Scene Workspace` entry to the Studio shell workspace model. -- Mount a first implementation composition root for `Scene Workspace`. -- Extend project-local layout/state only where needed for accepted shell behavior. -- Keep workspace-local operational state out of shell-global ownership. - -### Excluded -- Full tilemap editor interactions. -- Asset creation workflows. -- Scene serialization and save internals. - -## Execution Steps - -### Step 1 - Extend workspace identifiers and shell selection - -**What:** -Add `Scene Workspace` to the workspace identity model and shell-selection flow. - -**How:** -Update the workspace enum/identifier, shell selection logic, and main window wiring so the shell can mount and switch to `Scene Workspace` like other first-class workspaces. - -**File(s):** -- `prometeu-studio/src/main/java/p/studio/workspaces/WorkspaceId.java` -- `prometeu-studio/src/main/java/p/studio/window/MainView.java` -- `prometeu-studio/src/main/java/p/studio/workspaces/WorkspaceHost.java` - -### Step 2 - Add a Scene Workspace composition root - -**What:** -Create the initial workspace class and composition surface for `Scene Workspace`. - -**How:** -Introduce a new workspace package with a composition root that follows the Studio event-driven workspace framework and can initially host the wave-1 layout regions. - -**File(s):** -- `prometeu-studio/src/main/java/p/studio/workspaces/scene/SceneWorkspace.java` -- supporting classes under `prometeu-studio/src/main/java/p/studio/workspaces/scene/` - -### Step 3 - Wire workspace lifecycle and activity integration - -**What:** -Ensure the new workspace participates correctly in the shared workspace lifecycle model. - -**How:** -Use existing workspace lifecycle helpers and add any minimal shell-activity mapping needed for workspace open or scene-open events, without leaking scene-local detail into the shell. - -**File(s):** -- `prometeu-studio/src/main/java/p/studio/workspaces/StudioWorkspaceLifecycleSupport.java` -- `prometeu-studio/src/main/java/p/studio/controls/shell/StudioActivityEventMapper.java` if needed - -### Step 4 - Extend project-local shell state only as required - -**What:** -Support accepted shell/layout restoration for `Scene Workspace` if the implementation needs persisted split/divider state in wave 1. - -**How:** -Introduce the smallest project-local state additions necessary for shell restoration and workspace layout proportions. Do not persist scene-editor document state here unless a separate accepted rule exists. - -**File(s):** -- `prometeu-studio/src/main/java/p/studio/projectstate/ProjectLocalStudioState.java` -- `prometeu-studio/src/main/java/p/studio/projectstate/ProjectLocalStudioStateService.java` -- related tests under `prometeu-studio/src/test/java/p/studio/projectstate/` - -## Test Requirements - -### Unit Tests - -- Workspace id / shell restoration tests for the new workspace entry. -- Project-local state normalization tests if new layout state is added. - -### Integration Tests - -- Main-view or shell-focused tests that verify `Scene Workspace` can mount and become the active workspace. - -### Manual Verification - -- Open a project and confirm `Scene Workspace` appears as a shell workspace. -- Switch between `Assets`, `Scene Workspace`, and `Code Editor` without losing shell stability. -- Reopen the project and confirm accepted shell layout restoration still behaves safely. - -## Acceptance Criteria - -- [ ] `Scene Workspace` is a selectable shell workspace. -- [ ] The workspace mounts through the standard workspace host path. -- [ ] No scene-local editing detail is pushed into shell-global state. -- [ ] Any new project-local state is limited to accepted shell/workspace restoration concerns. - -## Dependencies - -- `DEC-0026-studio-scene-workspace.md` -- `PLN-0049-scene-workspace-spec-and-boundary-propagation.md` - -## Risks - -- Overloading shell state with scene-editor detail would violate the workspace boundary. -- Introducing restoration for unaccepted categories would outrun the decision. -- Wiring shortcuts through `MainView` without a clean package boundary would make later tilemap work harder. - -## Abandonment - -Abandoned on 2026-04-15 because the parent decision `DEC-0026` was explicitly abandoned by the user. diff --git a/discussion/workflow/plans/PLN-0051-scene-artifact-and-assets-handoff-contract.md b/discussion/workflow/plans/PLN-0051-scene-artifact-and-assets-handoff-contract.md deleted file mode 100644 index f89623f5..00000000 --- a/discussion/workflow/plans/PLN-0051-scene-artifact-and-assets-handoff-contract.md +++ /dev/null @@ -1,135 +0,0 @@ ---- -id: PLN-0051 -ticket: studio-scene-workspace -title: Build scene artifact identity, save flow, and Assets handoff contract -status: abandoned -created: 2026-04-14 -completed: -tags: - - studio - - scene - - asset - - binding - - save ---- - -## Objective - -Implement the Studio-local data contract that gives scenes a stable authoring identity, supports save for the intermediate scene artifact, and allows explicit handoff between `Scene Workspace` and `Assets`. - -## Background - -`DEC-0026` requires a stable scene artifact identity, a save-oriented scene-authoring lifecycle, and an explicit binding between scene artifact and `SCENE` asset that does not rely primarily on path inference. - -## Scope - -### Included -- Define and implement the scene artifact model used by `Scene Workspace`. -- Add Studio-local binding metadata between scene artifact and `SCENE` asset. -- Implement scene save/load for the intermediate authoring artifact. -- Add `Assets` handoff behavior after `SCENE` asset creation. - -### Excluded -- Final packer publication logic. -- Advanced editing tools. -- Future aspect tabs. - -## Execution Steps - -### Step 1 - Define the scene artifact DTO and persistence boundary - -**What:** -Create a Studio-owned scene artifact model with stable identity and wave-1 tilemap data. - -**How:** -Add DTOs and persistence helpers that capture: -- scene identity; -- linked `SCENE` asset identity when present; -- four layers; -- per-layer dimensions; -- per-layer tileset reference; -- tile presence and editable tile data. - -Keep the format explicitly intermediate and Studio-owned. - -**File(s):** -- new files under `prometeu-studio/src/main/java/p/studio/workspaces/scene/model/` -- new files under `prometeu-studio/src/main/java/p/studio/workspaces/scene/persistence/` - -### Step 2 - Implement save/load for the scene artifact - -**What:** -Make `Scene Workspace` able to save and reopen the intermediate scene artifact. - -**How:** -Build a dedicated repository/service for reading and writing scene artifacts using the chosen Studio-local format and metadata contract. Ensure identity survives rename/relocation independently of path. - -**File(s):** -- new persistence/service classes under `prometeu-studio/src/main/java/p/studio/workspaces/scene/` -- tests under `prometeu-studio/src/test/java/p/studio/workspaces/scene/` - -### Step 3 - Implement explicit scene-to-asset binding - -**What:** -Introduce the explicit binding required by the decision. - -**How:** -Store a stable scene artifact id and the linked `SCENE` asset reference in Studio metadata or equivalent explicit state. Avoid primary reliance on path inference. Make the binding readable from both `Scene Workspace` and `Assets`. - -**File(s):** -- scene metadata / persistence files under `prometeu-studio/src/main/java/p/studio/workspaces/scene/` -- `prometeu-studio/src/main/java/p/studio/projectstate/` only if the accepted metadata home belongs there - -### Step 4 - Add Assets-to-Scene handoff behavior - -**What:** -Allow `Assets` to create a `SCENE` asset and then hand off authoring to `Scene Workspace`. - -**How:** -Extend the asset-creation flow with the minimal family support needed for `SCENE`, then trigger explicit open/handoff into `Scene Workspace` without embedding editor controls into `Assets`. - -**File(s):** -- `prometeu-studio/src/main/java/p/studio/workspaces/assets/wizards/AddAssetWizard.java` -- `prometeu-studio/src/main/java/p/studio/workspaces/assets/AssetWorkspace.java` -- new event/message classes under `prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/` and/or `workspaces/scene/messages/` - -## Test Requirements - -### Unit Tests - -- Scene artifact serialization/deserialization tests. -- Binding-identity stability tests across rename-like path changes. -- Asset handoff event tests. - -### Integration Tests - -- End-to-end test: create `SCENE` asset, hand off to `Scene Workspace`, save scene artifact, reopen and preserve binding. - -### Manual Verification - -- Create a scene from `Scene Workspace` and verify a linked `SCENE` asset exists. -- Create a `SCENE` asset from `Assets` and verify the UI hands off to `Scene Workspace`. -- Rename or relocate the scene artifact and verify semantic linkage still resolves. - -## Acceptance Criteria - -- [ ] The scene authoring artifact has a stable identity independent of raw path. -- [ ] `Scene Workspace` can save and reopen the intermediate scene artifact. -- [ ] The binding between scene artifact and `SCENE` asset is explicit and stable. -- [ ] `Assets` can create a `SCENE` asset and hand off authoring without embedding scene editing. - -## Dependencies - -- `DEC-0026-studio-scene-workspace.md` -- `PLN-0049-scene-workspace-spec-and-boundary-propagation.md` -- `PLN-0050-scene-workspace-shell-and-project-state-foundations.md` - -## Risks - -- Choosing the wrong metadata home could make binding brittle or leak scene ownership into the wrong layer. -- Reusing asset-oriented DTOs for scene authoring could erase the boundary that the decision just locked. -- Save/load work can sprawl if the intermediate format is not kept intentionally narrow for wave 1. - -## Abandonment - -Abandoned on 2026-04-15 because the parent decision `DEC-0026` was explicitly abandoned by the user. diff --git a/discussion/workflow/plans/PLN-0052-scene-workspace-wave-1-tilemap-editor.md b/discussion/workflow/plans/PLN-0052-scene-workspace-wave-1-tilemap-editor.md deleted file mode 100644 index a0e2134d..00000000 --- a/discussion/workflow/plans/PLN-0052-scene-workspace-wave-1-tilemap-editor.md +++ /dev/null @@ -1,151 +0,0 @@ ---- -id: PLN-0052 -ticket: studio-scene-workspace -title: Implement Scene Workspace wave-1 tilemap editor -status: abandoned -created: 2026-04-14 -completed: -tags: - - studio - - scene - - workspace - - tilemap - - ui ---- - -## Objective - -Implement the wave-1 `Tilemap` experience for `Scene Workspace` according to `DEC-0026`. - -## Background - -The accepted decision limits wave 1 to one visible tab, `Tilemap`, with four layers, independent layer dimensions, explicit tile presence semantics, scene-first navigation, and basic editing tools only. - -## Scope - -### Included -- Left scene navigator. -- Top tab strip with only `Tilemap` visible. -- Central tilemap editing canvas. -- Right-side tilemap details and tile palette regions. -- Four-layer editing model with visibility and focus. -- Basic painting, erasing, and tile selection. - -### Excluded -- Camera boundaries. -- Lights. -- AABB authoring. -- Placeholder tabs for unsupported aspects. -- Advanced editing tools such as bucket fill, marquee, flood fill, or lock semantics. - -## Execution Steps - -### Step 1 - Build the workspace projection model - -**What:** -Create projection/view-state types for the scene navigator, active scene, active layer, tile palette, and tilemap details. - -**How:** -Follow the event-driven workspace framework already used by other Studio workspaces. Keep projection boundaries local so navigator, details, and palette can update without whole-workspace redraw. - -**File(s):** -- new projection and message classes under `prometeu-studio/src/main/java/p/studio/workspaces/scene/` - -### Step 2 - Build the left navigator and scene selection flow - -**What:** -Render a scene-first navigator that lists authoring scenes, not assets. - -**How:** -Introduce a custom navigator control inspired by `Assets` patterns but scoped to scene identity, with linked asset context rendered only as secondary status. - -**File(s):** -- new controls under `prometeu-studio/src/main/java/p/studio/workspaces/scene/list/` -- `prometeu-studio/src/main/java/p/studio/workspaces/scene/SceneWorkspace.java` - -### Step 3 - Build the wave-1 Tilemap layout - -**What:** -Implement the single visible tab and its three-region body. - -**How:** -Compose: -- central tilemap canvas; -- right upper details panel; -- right lower tile palette; -- layer controls for visibility and focus. - -Do not expose unsupported tabs. - -**File(s):** -- `prometeu-studio/src/main/java/p/studio/workspaces/scene/SceneWorkspace.java` -- new controls under `prometeu-studio/src/main/java/p/studio/workspaces/scene/tilemap/` - -### Step 4 - Implement tile selection and painting - -**What:** -Support the basic editing interactions required by the decision. - -**How:** -Implement tile selection from the palette, paint on the active layer, erase by clearing explicit tile presence, and preserve valid `glyph_id = 0` semantics. - -**File(s):** -- tilemap interaction classes under `prometeu-studio/src/main/java/p/studio/workspaces/scene/tilemap/` -- scene model classes under `prometeu-studio/src/main/java/p/studio/workspaces/scene/model/` - -### Step 5 - Implement tileset resolution and layer detail rendering - -**What:** -Resolve glyph-bank-backed tileset data for the active scene/layer and show dimensions/details in the side panel. - -**How:** -Consume the scene-owned tileset choice, render available tiles and palette choices, and expose active layer dimensions and relevant properties without handing ownership to `Assets`. - -**File(s):** -- scene workspace service/projection classes -- tile palette and detail controls under `prometeu-studio/src/main/java/p/studio/workspaces/scene/tilemap/` - -## Test Requirements - -### Unit Tests - -- Projection-state tests for active scene, layer visibility, and focus. -- Tile painting tests that preserve explicit presence semantics. -- Palette-selection tests that keep `glyph_id = 0` valid. - -### Integration Tests - -- UI-oriented tests for scene selection, tile selection, paint, erase, and save-triggered refresh. - -### Manual Verification - -- Open `Scene Workspace`, create/open a scene, and confirm the navigator is scene-first. -- Paint and erase on different layers with independent dimensions. -- Verify layer visibility/focus changes do not corrupt scene data. -- Verify only the `Tilemap` tab is visible in wave 1. - -## Acceptance Criteria - -- [ ] `Scene Workspace` renders a scene-first navigator. -- [ ] Wave 1 exposes only the `Tilemap` tab. -- [ ] The editor supports four layers with independent dimensions. -- [ ] Painting and erasing respect explicit tile presence semantics. -- [ ] Layer visibility and focus work in the tilemap editor. -- [ ] Tile palette and details panels reflect the active scene/layer context. - -## Dependencies - -- `DEC-0026-studio-scene-workspace.md` -- `PLN-0049-scene-workspace-spec-and-boundary-propagation.md` -- `PLN-0050-scene-workspace-shell-and-project-state-foundations.md` -- `PLN-0051-scene-artifact-and-assets-handoff-contract.md` - -## Risks - -- Overbuilding the first UI pass could quietly introduce unsupported aspect tabs or tools. -- Canvas interaction code can become monolithic if projection boundaries are not enforced early. -- Tileset rendering may drift toward asset-first ownership if scene-owned selection is not kept explicit. - -## Abandonment - -Abandoned on 2026-04-15 because the parent decision `DEC-0026` was explicitly abandoned by the user. From ef582b6687f18d920deb7be4fd897d7cc9db418d Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Sat, 18 Apr 2026 16:58:54 +0100 Subject: [PATCH 3/7] Studio Alignment with Runtime FrameComposer Syscalls and Sprite Composition --- discussion/index.ndjson | 3 +- ...e-composer-syscall-and-sprite-alignment.md | 170 ++++++++++++++++++ ...tudio-composer-sprite-syscall-alignment.md | 158 ++++++++++++++++ ...N-0053-composer-spec-and-stdlib-surface.md | 136 ++++++++++++++ ...oser-compiler-and-conformance-migration.md | 122 +++++++++++++ ...oser-fixtures-examples-and-repo-cleanup.md | 120 +++++++++++++ 6 files changed, 708 insertions(+), 1 deletion(-) create mode 100644 discussion/workflow/agendas/AGD-0031-studio-frame-composer-syscall-and-sprite-alignment.md create mode 100644 discussion/workflow/decisions/DEC-0027-studio-composer-sprite-syscall-alignment.md create mode 100644 discussion/workflow/plans/PLN-0053-composer-spec-and-stdlib-surface.md create mode 100644 discussion/workflow/plans/PLN-0054-composer-compiler-and-conformance-migration.md create mode 100644 discussion/workflow/plans/PLN-0055-composer-fixtures-examples-and-repo-cleanup.md diff --git a/discussion/index.ndjson b/discussion/index.ndjson index cac0aaff..be362693 100644 --- a/discussion/index.ndjson +++ b/discussion/index.ndjson @@ -1,4 +1,5 @@ -{"type":"meta","next_id":{"DSC":29,"AGD":31,"DEC":27,"PLN":53,"LSN":40,"CLSN":1}} +{"type":"meta","next_id":{"DSC":30,"AGD":32,"DEC":28,"PLN":56,"LSN":40,"CLSN":1}} +{"type":"discussion","id":"DSC-0029","status":"open","ticket":"studio-frame-composer-syscall-and-sprite-alignment","title":"Studio Alignment with Runtime FrameComposer Syscalls and Sprite Composition","created_at":"2026-04-18","updated_at":"2026-04-18","tags":["studio","compiler","pbs","stdlib","runtime-alignment","abi","syscall","frame-composer","sprites"],"agendas":[{"id":"AGD-0031","file":"AGD-0031-studio-frame-composer-syscall-and-sprite-alignment.md","status":"in_progress","created_at":"2026-04-18","updated_at":"2026-04-18"}],"decisions":[{"id":"DEC-0027","file":"DEC-0027-studio-composer-sprite-syscall-alignment.md","status":"in_progress","created_at":"2026-04-18","updated_at":"2026-04-18","ref_agenda":"AGD-0031"}],"plans":[{"id":"PLN-0053","file":"PLN-0053-composer-spec-and-stdlib-surface.md","status":"review","created_at":"2026-04-18","updated_at":"2026-04-18","ref_decisions":["DEC-0027"]},{"id":"PLN-0054","file":"PLN-0054-composer-compiler-and-conformance-migration.md","status":"review","created_at":"2026-04-18","updated_at":"2026-04-18","ref_decisions":["DEC-0027"]},{"id":"PLN-0055","file":"PLN-0055-composer-fixtures-examples-and-repo-cleanup.md","status":"review","created_at":"2026-04-18","updated_at":"2026-04-18","ref_decisions":["DEC-0027"]}],"lessons":[]} {"type":"discussion","id":"DSC-0028","status":"open","ticket":"studio-tiled-parser-assets-scene-asset-type","title":"Tiled Parser and Scene Asset-Type Ownership in Assets Workspace","created_at":"2026-04-15","updated_at":"2026-04-15","tags":["studio","assets","scene","tiled","parser","asset-type"],"agendas":[{"id":"AGD-0030","file":"AGD-0030-tiled-parser-and-scene-asset-type.md","status":"open","created_at":"2026-04-15","updated_at":"2026-04-15"}],"decisions":[],"plans":[],"lessons":[]} {"type":"discussion","id":"DSC-0027","status":"abandoned","ticket":"studio-scene-workspace","title":"Scene Workspace for SCENE Authoring","created_at":"2026-04-14","updated_at":"2026-04-15","tags":["studio","workspace","scene","tilemap","asset","runtime-alignment"],"agendas":[{"id":"AGD-0029","file":"AGD-0029-studio-scene-workspace.md","status":"abandoned","created_at":"2026-04-14","updated_at":"2026-04-15","_override_reason":"Explicit user request on 2026-04-15 to abandon the accepted agenda and its downstream work."}],"decisions":[{"id":"DEC-0026","file":"DEC-0026-studio-scene-workspace.md","status":"abandoned","created_at":"2026-04-14","updated_at":"2026-04-15","ref_agenda":"AGD-0029","_override_reason":"Explicit user request on 2026-04-15 to abandon the accepted decision and stop using it as normative guidance."}],"plans":[{"id":"PLN-0049","file":"PLN-0049-scene-workspace-spec-and-boundary-propagation.md","status":"abandoned","created_at":"2026-04-14","updated_at":"2026-04-15","ref_decisions":["DEC-0026"],"_override_reason":"Explicit user request on 2026-04-15 to abandon all plans derived from DEC-0026."},{"id":"PLN-0050","file":"PLN-0050-scene-workspace-shell-and-project-state-foundations.md","status":"abandoned","created_at":"2026-04-14","updated_at":"2026-04-15","ref_decisions":["DEC-0026"],"_override_reason":"Explicit user request on 2026-04-15 to abandon all plans derived from DEC-0026."},{"id":"PLN-0051","file":"PLN-0051-scene-artifact-and-assets-handoff-contract.md","status":"abandoned","created_at":"2026-04-14","updated_at":"2026-04-15","ref_decisions":["DEC-0026"],"_override_reason":"Explicit user request on 2026-04-15 to abandon all plans derived from DEC-0026."},{"id":"PLN-0052","file":"PLN-0052-scene-workspace-wave-1-tilemap-editor.md","status":"abandoned","created_at":"2026-04-14","updated_at":"2026-04-15","ref_decisions":["DEC-0026"],"_override_reason":"Explicit user request on 2026-04-15 to abandon all plans derived from DEC-0026."}],"lessons":[]} {"type":"discussion","id":"DSC-0026","status":"done","ticket":"glyph-bank-naming-alignment-with-runtime","title":"Glyph Bank Naming Alignment with Runtime DEC-0006","created_at":"2026-04-10","updated_at":"2026-04-10","tags":["packer","studio","naming","asset-contract","runtime-alignment","glyph-bank"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0040","file":"discussion/lessons/DSC-0026-glyph-bank-naming-alignment-with-runtime/LSN-0040-glyph-bank-artifact-naming-alignment.md","status":"done","created_at":"2026-04-10","updated_at":"2026-04-10"}]} diff --git a/discussion/workflow/agendas/AGD-0031-studio-frame-composer-syscall-and-sprite-alignment.md b/discussion/workflow/agendas/AGD-0031-studio-frame-composer-syscall-and-sprite-alignment.md new file mode 100644 index 00000000..602761b4 --- /dev/null +++ b/discussion/workflow/agendas/AGD-0031-studio-frame-composer-syscall-and-sprite-alignment.md @@ -0,0 +1,170 @@ +--- +id: AGD-0031 +ticket: studio-frame-composer-syscall-and-sprite-alignment +title: Studio Alignment with Runtime FrameComposer Syscalls and Sprite Composition +status: in_progress +created: 2026-04-18 +resolved: 2026-04-18 +decision: DEC-0027 +tags: + - studio + - compiler + - pbs + - stdlib + - runtime-alignment + - abi + - syscall + - frame-composer + - sprites +--- + +## Pain + +The sibling runtime has already moved the public frame-orchestration ABI to `composer.*`. + +This repository still exposes the old model through `@sdk:gfx` and `Gfx.set_sprite`, which means: + +- the Studio-side compiler and stdlib still teach a legacy public contract; +- PBS examples and tests still lower sprite composition through the wrong owner; +- specs still describe a source surface that no longer matches the runtime's canonical syscall boundary; +- any new Studio work risks reinforcing a dual contract between `gfx.*` primitives and `composer.*` frame orchestration. + +The user explicitly scoped this discussion to: + +- ABI/syscall alignment with the current `../runtime`; +- `FrameComposer` convergence for sprite composition; +- Studio-side propagation across `compiler`, `pbs`, and `stdlib`; +- `@sdk:composer` for the sprite-composition path; +- removal of the legacy `Gfx.set_sprite` entrypoint; +- no scene-bank implementation work in this ticket. + +## Context + +Domain owner: `studio` + +Primary affected subdomains: + +- `compiler/pbs` +- `studio` + +Expected propagation targets if this discussion closes: + +- `docs/specs/compiler-languages/pbs` +- `docs/specs/compiler` +- PBS stdlib resources under `prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/resources/stdlib` +- compiler/frontend/backend conformance tests +- Studio-adjacent examples and fixtures that still import `@sdk:gfx` for sprite composition + +Observed current state on 2026-04-18: + +- `../runtime` lesson `DSC-0026` locks `FrameComposer` as the canonical frame owner above the render backend. +- `../runtime` lesson `DSC-0027` locks the public VM-facing syscall ABI to `composer.bind_scene`, `composer.unbind_scene`, `composer.set_camera`, and `composer.emit_sprite`, and removes the legacy public `gfx.set_sprite` path. +- `../runtime` lesson `DSC-0028` keeps immediate/debug primitives such as `gfx.draw_text` outside canonical game composition as a deferred overlay path. +- this repository still ships `@sdk:gfx` with `LowGfx.set_sprite(...)` and `Gfx.set_sprite(...)`; +- this repository does not yet expose a reserved `@sdk:composer` module; +- docs and tests still use `@sdk:gfx` as the visible source surface for sprite composition. + +This creates architectural drift: + +- runtime public ownership says `composer.*` for frame composition; +- Studio-side language and stdlib surfaces still say `gfx.*` for part of that same behavior. + +The drift is specifically about syscall and sprite-composer alignment. + +Out of scope for this agenda: + +- `composer.bind_scene`, `composer.unbind_scene`, and `composer.set_camera` rollout in Studio; +- scene-bank authoring workflows; +- scene asset import/editor design; +- scene bank build/materialization contracts beyond what is minimally needed to name ABI boundaries; +- broader scene workspace/product decisions already separated into other discussions. + +## Open Questions + +- [x] Studio should expose a new reserved module `@sdk:composer` as the canonical public source surface for sprite composition. +- [x] `@sdk:gfx` should remain limited to primitive/overlay/back-end-adjacent operations once sprite composition moves out. +- [x] PBS should export `@sdk:composer` using the same source-level shape already used by `@sdk:gfx`: low-level host owner plus public service facade. +- [x] Mutating composer operations should remain raw `int` status returns in v1 for now. +- [x] Tests, fixtures, examples, and callsites should all migrate in this wave if possible; no compatibility path should be preserved. +- [x] No temporary compatibility alias is acceptable; `Gfx.set_sprite` should be removed completely. + +## Options + +### Option A - Introduce `@sdk:composer` now for sprite emission only in this wave +- **Approach:** Add a dedicated reserved stdlib module that exposes the sprite-composition path through `composer.emit_sprite`; migrate sprite composition calls, host metadata, docs, and tests to that module; keep `@sdk:gfx` for primitives/overlay-style operations only; defer Studio-side `bind_scene`, `unbind_scene`, and `set_camera`. +- **Pro:** Matches the runtime's canonical service boundary, preserves the split between frame composition and render primitives, and avoids teaching the retired `gfx.set_sprite` contract. +- **Con:** Introduces a partial first wave of the `composer` domain, so docs must be explicit that other composer operations are intentionally deferred rather than absent by accident. +- **Maintainability:** Strong, because the public source surface mirrors the actual runtime ABI and ownership model. + +### Option B - Keep `@sdk:gfx` as the user-facing module and only retarget its internals to `composer.*` +- **Approach:** Preserve the visible `Gfx.set_sprite` API in Studio while changing lowering metadata underneath to hit `composer.emit_sprite`. +- **Pro:** Smaller immediate source churn in examples and tests. +- **Con:** Encodes the wrong owner in the public teaching surface, preserves the exact dual-contract problem the runtime discussion just removed, and makes later cleanup harder. +- **Maintainability:** Weak, because it keeps historical naming instead of canonical service ownership. + +### Option C - Add `@sdk:composer` but retain temporary `Gfx.set_sprite` compatibility in parallel +- **Approach:** Introduce the new canonical module while leaving `Gfx.set_sprite` as an alias or transitional wrapper for one or more waves. +- **Pro:** Softens migration pressure for existing examples and downstream users. +- **Con:** Creates two public ways to express the same operation, invites drift in specs/tests/docs, and conflicts with the runtime lesson that legacy public fallbacks should be removed when they preserve the wrong model. +- **Maintainability:** Medium at best in the short term, poor in the long term if the alias survives longer than intended. + +## Discussion + +The runtime side has already made two architectural facts explicit: + +1. frame orchestration belongs to `FrameComposer`, not to `Gfx`; +2. the public syscall namespace must reflect that ownership. + +That means this repository is no longer choosing between equivalent naming styles. + +It is choosing whether Studio will: + +- align its source-facing contracts with the canonical runtime boundary; or +- preserve a legacy public façade that the runtime has already declared misleading. + +The user's scope also matters. + +This ticket is not asking for scene-bank product work, and it also is not asking for Studio-side scene binding or camera rollout. +So the migration target should stay narrow: + +- syscall/domain alignment; +- `@sdk:composer` surface alignment for sprite emission; +- compiler/PBS/stdlib propagation; +- tests and examples updated to stop asserting the retired path. +- removal of the old `Gfx.set_sprite` path. + +The remaining design work is therefore smaller and more concrete: + +- define the Studio-side shape of `@sdk:composer` for sprite emission; +- propagate `composer.emit_sprite` through stdlib, specs, compiler, and tests; +- keep the deferred composer calls explicitly out of this ticket so the repository does not accidentally mix sprite convergence with unfinished scene-facing rollout. + +The agenda questions are now resolved with explicit user direction: + +1. `@sdk:composer` should follow the same editorial pattern already used by `@sdk:gfx`, meaning a low-level host owner plus a public service facade. +2. `composer.emit_sprite` should continue returning a raw `int` status in this wave. +3. Migration should be broad and immediate across tests, fixtures, and examples where feasible. +4. `Gfx.set_sprite` should be removed entirely, with no compatibility alias or dual-path surface. +5. Specs should document only what this wave actually implements, while leaving room for `bind_scene`, `unbind_scene`, and `set_camera` to be added later using the same pattern. + +## Resolution + +Recommended direction: + +- adopt Option A as the working direction for this discussion; +- open a Studio-side canonical `@sdk:composer` surface aligned to the runtime ABI for sprite emission in this wave; +- retire `Gfx.set_sprite` from normative Studio-facing contracts instead of preserving a compatibility façade; +- defer `composer.bind_scene`, `composer.unbind_scene`, and `composer.set_camera` to a later ticket; +- keep scene-bank authoring/editor work explicitly out of this ticket; +- keep `@sdk:gfx` focused on primitive and overlay-style operations. + +Recommended next step: + +- treat the sprite-only `@sdk:composer` wave as the accepted scope of this agenda; +- write a decision that locks: + - `@sdk:composer` as the canonical Studio-side sprite-composition module; + - the `LowComposer` + `Composer` shape matching the established `@sdk:gfx` pattern; + - raw `int` status returns for this wave; + - complete removal of `Gfx.set_sprite` with no compatibility path; + - broad propagation across specs, stdlib, compiler, tests, fixtures, and examples; + - deferred addition of `bind_scene`, `unbind_scene`, and `set_camera` in later work. diff --git a/discussion/workflow/decisions/DEC-0027-studio-composer-sprite-syscall-alignment.md b/discussion/workflow/decisions/DEC-0027-studio-composer-sprite-syscall-alignment.md new file mode 100644 index 00000000..fc216dac --- /dev/null +++ b/discussion/workflow/decisions/DEC-0027-studio-composer-sprite-syscall-alignment.md @@ -0,0 +1,158 @@ +--- +id: DEC-0027 +ticket: studio-frame-composer-syscall-and-sprite-alignment +title: Studio MUST Adopt `@sdk:composer` for Sprite Composition and Remove `Gfx.set_sprite` +status: in_progress +created: 2026-04-18 +accepted: 2026-04-18 +agenda: AGD-0031 +plans: + - PLN-0053 + - PLN-0054 + - PLN-0055 +tags: + - studio + - compiler + - pbs + - stdlib + - runtime-alignment + - abi + - syscall + - frame-composer + - sprites +--- + +## Context + +O `../runtime` já convergiu a ownership pública de frame orchestration para `FrameComposer` e já publicou a ABI pública correspondente no domínio `composer.*`. + +Para o recorte desta discussão, o ponto normativo relevante é simples: + +- sprite composition não pertence mais ao domínio público `gfx.*`; +- o caminho público legado `gfx.set_sprite` já não representa o owner canônico no runtime; +- o Studio ainda expõe esse caminho legado em stdlib, specs, testes, fixtures e exemplos. + +Isso cria drift entre: + +- a ABI pública real do runtime; +- o contrato que o Studio ensina e emite; +- a superfície que PBS usa como owner visível para composição de sprites. + +O usuário fechou explicitamente o escopo desta decisão: + +- entra apenas a wave de `@sdk:composer` para sprite composition; +- entra `composer.emit_sprite`; +- entra remoção total de `Gfx.set_sprite`; +- `composer.bind_scene`, `composer.unbind_scene` e `composer.set_camera` ficam para trabalho posterior; +- scene bank e concerns de authoring/editor ficam fora deste ticket. + +## Decision + +O Studio MUST adotar `@sdk:composer` como a superfície canônica de stdlib/PBS para sprite composition nesta wave. + +Mais especificamente: + +1. A operação pública de composição de sprites MUST ser exposta por `composer.emit_sprite`. +2. O módulo reservado `@sdk:composer` MUST seguir o mesmo shape editorial hoje usado por `@sdk:gfx`: + - um owner host de baixo nível `LowComposer`; + - uma façade pública `Composer`. +3. Nesta wave, o contrato de retorno de `composer.emit_sprite` MUST permanecer um `int` cru. +4. `Gfx.set_sprite` MUST ser removido integralmente da superfície normativa e executável do Studio. +5. O repositório MUST NOT manter alias, wrapper de compatibilidade, dual path, ou retargeting silencioso que preserve `Gfx.set_sprite` como API pública. +6. `@sdk:gfx` MUST permanecer restrito às operações primitivas/overlay/backend-adjacent que continuarem pertencendo a esse domínio. +7. `composer.bind_scene`, `composer.unbind_scene` e `composer.set_camera` MUST permanecer fora do escopo de implementação desta decisão e SHALL ser adicionados depois por propagação separada, usando o mesmo padrão editorial. + +## Rationale + +Esta decisão existe para eliminar um dual contract arquitetural que já deixou de ser válido no runtime. + +Manter `Gfx.set_sprite` como superfície pública teria três efeitos ruins: + +- preservaria o owner errado no contrato ensinado por PBS/stdlib; +- manteria dois modelos mentais concorrentes para a mesma operação; +- empurraria a remoção real do legado para um momento futuro mais caro e mais difícil. + +O recorte sprite-only é deliberado. + +Ele permite alinhar imediatamente a parte já necessária para o pipeline atual sem misturar: + +- rollout de scene binding; +- rollout de camera control; +- ou trabalho de scene bank/editoria de assets. + +Também ficou decidido que esta wave não tentará resolver modelagem de status com tipos editoriais novos. +O retorno cru `int` é suficiente para convergir o boundary agora, sem introduzir uma segunda mudança de API no mesmo passo. + +## Technical Specification + +### 1. Stdlib Surface + +O repositório MUST introduzir um módulo reservado `@sdk:composer`. + +Esse módulo MUST: + +- declarar `LowComposer` com metadata canônica `Host(module = "composer", name = "emit_sprite", version = 1)`; +- declarar a capability canônica correspondente; +- expor `Composer.emit_sprite(...)` como façade pública; +- usar o mesmo padrão estrutural já adotado por `@sdk:gfx`. + +O repositório MUST remover de `@sdk:gfx`: + +- a declaração host `LowGfx.set_sprite(...)`; +- a façade pública `Gfx.set_sprite(...)`; +- qualquer export relacionado à operação pública antiga. + +### 2. Compiler and PBS Propagation + +As specs e implementações de PBS/compiler MUST passar a tratar `@sdk:composer` como a superfície canônica para sprite composition. + +Isso inclui: + +- examples normativos; +- exemplos de import; +- resolução de stdlib; +- fixtures e testes que verificam host metadata; +- testes que hoje afirmam `LowGfx`/`Gfx.set_sprite`. + +O lowering MUST emitir identidade canônica de host do domínio `composer`, não do domínio `gfx`, para sprite emission nesta wave. + +### 3. Removal Rule + +`Gfx.set_sprite` MUST ser tratado como removido, não como deprecated. + +Consequências obrigatórias: + +- código de teste antigo que use `Gfx.set_sprite` MUST ser migrado; +- fixtures e sample projects SHOULD ser migrados integralmente nesta wave sempre que estiverem dentro do repositório; +- docs MUST deixar de ensinar `Gfx.set_sprite` como caminho válido; +- a implementação MUST NOT deixar fallback oculto para o caminho antigo. + +### 4. Documentation Scope + +As specs MUST documentar exatamente o que esta wave implementa: + +- `@sdk:composer` para sprite emission; +- remoção de `Gfx.set_sprite`; +- permanência de `@sdk:gfx` para primitivas/overlay relevantes. + +As specs MUST NOT fingir que scene binding ou camera control já fazem parte desta wave no Studio. + +Elas MAY mencionar que: + +- `bind_scene`, +- `unbind_scene`, +- `set_camera` + +serão adicionados depois seguindo o mesmo padrão, mas sem tratá-los como parte implementada agora. + +## Constraints + +- Esta decisão MUST ser tratada como normativa e locked até revisão explícita do usuário. +- Qualquer `plan` derivado dela MUST cobrir integralmente a criação de `@sdk:composer`, a propagação para specs/compiler/tests e a remoção total de `Gfx.set_sprite`. +- Nenhum `plan` ou `implement` pode reinterpretar esta decisão como “migrar só internamente” mantendo a API pública antiga. +- Nenhum `plan` ou `implement` pode puxar scene bank, bind/unbind de scene ou camera para dentro deste ticket por conveniência. +- Se surgir ambiguidade sobre assinatura exata de `emit_sprite`, capability metadata, ou pontos concretos de propagação, o próximo estágio MUST esclarecer isso sem reabrir a remoção total do caminho antigo. + +## Revision Log + +- 2026-04-18: Initial accepted decision from AGD-0031. diff --git a/discussion/workflow/plans/PLN-0053-composer-spec-and-stdlib-surface.md b/discussion/workflow/plans/PLN-0053-composer-spec-and-stdlib-surface.md new file mode 100644 index 00000000..59991cfa --- /dev/null +++ b/discussion/workflow/plans/PLN-0053-composer-spec-and-stdlib-surface.md @@ -0,0 +1,136 @@ +--- +id: PLN-0053 +ticket: studio-frame-composer-syscall-and-sprite-alignment +title: Composer Spec and Stdlib Surface for Sprite Emission +status: review +created: 2026-04-18 +completed: +tags: + - studio + - compiler + - pbs + - stdlib + - specs + - composer + - sprites +--- + +## Objective + +Introduce the canonical `@sdk:composer` sprite-emission surface and remove `Gfx.set_sprite` from the normative stdlib/spec contract, exactly as required by `DEC-0027`. + +## Background + +The runtime already moved public frame composition ownership to `composer.*` and removed the legacy public `gfx.set_sprite` path. This repository still teaches and packages sprite composition through `@sdk:gfx`, which creates ABI drift between runtime ownership and Studio-facing source surfaces. + +`DEC-0027` locks the following requirements for this wave: + +- `@sdk:composer` is the canonical Studio-side module for sprite composition. +- The source shape must mirror the existing `@sdk:gfx` pattern: `LowComposer` plus public `Composer`. +- `composer.emit_sprite` keeps a raw `int` return for now. +- `Gfx.set_sprite` must be removed completely. +- `bind_scene`, `unbind_scene`, and `set_camera` remain out of scope. + +## Scope + +### Included +- Add `stdlib/1/sdk/composer/main.pbs`. +- Add `stdlib/1/sdk/composer/mod.barrel`. +- Remove `set_sprite` from `stdlib/1/sdk/gfx/main.pbs`. +- Update stdlib/spec documentation to name `@sdk:composer` as the canonical sprite-composition surface. +- Document that scene/camera composer calls are deferred and not part of this wave. + +### Excluded +- Compiler implementation changes beyond what is necessary to consume the new stdlib files. +- Test fixture migration outside of spec/stdlib-focused assertions. +- Runtime changes in `../runtime`. +- Scene binding, scene unbinding, camera APIs, and scene-bank work. + +## Execution Steps + +### Step 1 - Add the reserved `@sdk:composer` module + +**What:** +Create the reserved stdlib module for sprite emission. + +**How:** +Add a new `sdk/composer` directory that follows the established reserved-module layout. Define `LowComposer.emit_sprite(...)` with canonical host metadata `Host(module = "composer", name = "emit_sprite", version = 1)` and the canonical capability metadata. Define a public `Composer.emit_sprite(...)` service method that forwards to `LowComposer`. + +**File(s):** +- `prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/resources/stdlib/1/sdk/composer/main.pbs` +- `prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/resources/stdlib/1/sdk/composer/mod.barrel` + +### Step 2 - Remove the old public sprite path from `@sdk:gfx` + +**What:** +Delete the legacy `set_sprite` public path from the GFX stdlib module. + +**How:** +Remove the `LowGfx.set_sprite(...)` host declaration, remove the `Gfx.set_sprite(...)` service method, and leave the remaining primitive/overlay-oriented GFX surface intact. + +**File(s):** +- `prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/resources/stdlib/1/sdk/gfx/main.pbs` +- `prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/resources/stdlib/1/sdk/gfx/mod.barrel` if export adjustments become necessary + +### Step 3 - Update PBS stdlib and host-binding specs + +**What:** +Rewrite the normative docs so they stop teaching sprite composition through `@sdk:gfx`. + +**How:** +Update the PBS specs that describe reserved stdlib modules, interface-module examples, host-binding examples, and logical stdlib mapping. Add `@sdk:composer` to the reserved-module inventory and update examples that currently import `Gfx` for host-backed illustration when those examples are used to explain sprite composition or SDK host ownership. Document that this wave covers only sprite emission, while scene/camera composer members are deferred. + +**File(s):** +- `docs/specs/compiler-languages/pbs/5. Manifest, Stdlib, and SDK Resolution Specification.md` +- `docs/specs/compiler-languages/pbs/6.2. Host ABI Binding and Loader Resolution Specification.md` +- `docs/specs/compiler-languages/pbs/8. Stdlib Environment Packaging and Loading Specification.md` +- `docs/specs/compiler/18. Standard Library Surface Specification.md` +- Any additional compiler/PBS spec file whose examples currently name `Gfx.set_sprite` as canonical + +### Step 4 - Align syntax/interface examples with the new owner + +**What:** +Remove spec examples that preserve the old mental model for sprite composition. + +**How:** +Review interface-module and host-declaration examples in the PBS syntax/spec set. Keep `gfx` examples where they demonstrate primitives generically, but change any sprite-composition-oriented illustration to `composer` so the docs no longer imply that `gfx` owns frame-composition policy. + +**File(s):** +- `docs/specs/compiler-languages/pbs/3. Core Syntax Specification.md` +- `docs/specs/compiler-languages/pbs/5. Manifest, Stdlib, and SDK Resolution Specification.md` +- `docs/specs/compiler-languages/pbs/6.2. Host ABI Binding and Loader Resolution Specification.md` + +## Test Requirements + +### Unit Tests + +- Add or update stdlib-loading tests so `@sdk:composer` resolves successfully. +- Add or update PBS SDK-interface tests so `LowComposer` and `Composer.emit_sprite(...)` are part of the reserved stdlib contract. + +### Integration Tests + +- Existing compiler/frontend integration tests that load the stdlib must pass with the new module present and the old sprite path removed. + +### Manual Verification + +- Inspect the generated stdlib resource tree and confirm `sdk/composer` is present and `sdk/gfx` no longer exposes `set_sprite`. +- Read the updated spec sections and confirm they document only sprite emission for this wave and explicitly defer scene/camera composer calls. + +## Acceptance Criteria + +- [ ] `@sdk:composer` exists under stdlib line `1` with `LowComposer` and `Composer`. +- [ ] `Composer.emit_sprite(...)` uses canonical host metadata for `("composer", "emit_sprite", 1)`. +- [ ] `@sdk:gfx` no longer exposes `set_sprite`. +- [ ] PBS/compiler specs name `@sdk:composer` as the canonical sprite-composition surface. +- [ ] Specs do not claim that `bind_scene`, `unbind_scene`, or `set_camera` are part of this wave. + +## Dependencies + +- Depends directly on `DEC-0027`. +- Should complete before broad compiler/test/example migration so downstream work can reference the final stdlib surface. + +## Risks + +- Spec examples may accidentally over-generalize `composer` and imply that deferred scene/camera members are already available. +- Removing `set_sprite` from `@sdk:gfx` may break more frontend tests than expected if hidden fixtures still import the old API. +- If capability metadata or parameter shape drifts from runtime expectations, later compiler/test work will encode the wrong ABI under a new module name. diff --git a/discussion/workflow/plans/PLN-0054-composer-compiler-and-conformance-migration.md b/discussion/workflow/plans/PLN-0054-composer-compiler-and-conformance-migration.md new file mode 100644 index 00000000..f8a17ad4 --- /dev/null +++ b/discussion/workflow/plans/PLN-0054-composer-compiler-and-conformance-migration.md @@ -0,0 +1,122 @@ +--- +id: PLN-0054 +ticket: studio-frame-composer-syscall-and-sprite-alignment +title: Compiler, Frontend, and Conformance Migration to `composer.emit_sprite` +status: review +created: 2026-04-18 +completed: +tags: + - studio + - compiler + - pbs + - conformance + - composer + - sprites +--- + +## Objective + +Migrate compiler/frontend/conformance behavior from the retired `Gfx.set_sprite` path to the canonical `Composer.emit_sprite` path, with no compatibility fallback. + +## Background + +Once the stdlib and spec surface move to `@sdk:composer`, the compiler and frontend test suite must stop asserting `LowGfx.set_sprite` metadata and `Gfx.set_sprite` callsites. `DEC-0027` forbids internal retargeting that preserves the old public API, so the implementation and conformance layers must change the visible source contract as well as the lowered host identity. + +## Scope + +### Included +- Update PBS frontend tests that import `@sdk:gfx` for sprite composition. +- Update SDK-interface and host-metadata assertions from `LowGfx`/`set_sprite` to `LowComposer`/`emit_sprite`. +- Update any compiler-side conformance or bytecode expectations that observe host declaration metadata for sprite emission. +- Add regression coverage that proves sprite emission lowers to the `composer` host identity and that `Gfx.set_sprite` is no longer available. + +### Excluded +- Repository sample project migration outside compiler-facing fixtures. +- Runtime behavior changes in `../runtime`. +- Scene/camera composer APIs. + +## Execution Steps + +### Step 1 - Update frontend phase tests to the new imports and calls + +**What:** +Rewrite PBS frontend phase coverage that still imports `Gfx` for sprite composition. + +**How:** +Replace sprite-oriented `import { Gfx } from @sdk:gfx;` snippets with `import { Composer } from @sdk:composer;` where the test is validating sprite composition. Rewrite callsites from `Gfx.set_sprite(...)` to `Composer.emit_sprite(...)`. Keep pure primitive tests on `@sdk:gfx` unchanged. + +**File(s):** +- `prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/services/PBSFrontendPhaseServiceTest.java` + +### Step 2 - Update SDK-interface and reserved-stdlib conformance assertions + +**What:** +Make reserved-stdlib conformance assert the new module and owner names. + +**How:** +Change assertions that currently look for `LowGfx` or `set_sprite` so they instead require `LowComposer` and `emit_sprite`. Add direct reserved-import coverage for `@sdk:composer`. + +**File(s):** +- `prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/pbs/PbsGateUSdkInterfaceConformanceTest.java` +- `prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/pbs/stdlib/InterfaceModuleLoaderTest.java` if loader coverage is needed for the new module + +### Step 3 - Update parser/semantic/linking fixtures only where the visible SDK surface changes + +**What:** +Remove stale assumptions that the sprite path belongs to `Gfx`. + +**How:** +Inspect PBS parser, semantic, linking, and diagnostics tests that rely on concrete stdlib imports or host owners. Migrate only the cases that directly encode sprite composition or reserved-SDK examples for this operation. Do not churn unrelated `gfx` primitive tests. + +**File(s):** +- `prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/pbs/linking/...` +- `prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/pbs/semantics/...` +- `prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/pbs/...` + +### Step 4 - Add conformance coverage for removal of the old API + +**What:** +Prove that the old public path is gone. + +**How:** +Add negative coverage that user code importing `@sdk:gfx` can no longer call `set_sprite`, and positive coverage that sprite emission lowers through the `composer` host identity with the expected raw `int` return shape. + +**File(s):** +- `prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/services/PBSFrontendPhaseServiceTest.java` +- `prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/pbs/PbsGateUSdkInterfaceConformanceTest.java` + +## Test Requirements + +### Unit Tests + +- PBS frontend tests must assert `LowComposer` host ownership for sprite emission. +- SDK-interface tests must assert that `@sdk:composer` resolves and exports the expected surface. +- Negative tests must confirm `Gfx.set_sprite` is no longer admitted. + +### Integration Tests + +- Compiler integration/conformance tests that inspect host declarations or emitted syscalls must pass with `composer.emit_sprite`. +- Any existing lower-to-host assertion must prove the canonical identity is `("composer", "emit_sprite", 1)`. + +### Manual Verification + +- Run focused test subsets around PBS frontend/stdlib loading and inspect failures for any remaining `LowGfx`/`set_sprite` assumptions. +- Review changed tests and confirm `@sdk:gfx` is still used only for primitive-oriented cases. + +## Acceptance Criteria + +- [ ] No compiler/frontend conformance test still asserts `LowGfx.set_sprite` or `Gfx.set_sprite`. +- [ ] Positive coverage exists for `Composer.emit_sprite(...)` lowering. +- [ ] Negative coverage exists for removal of `Gfx.set_sprite`. +- [ ] Primitive-oriented `@sdk:gfx` tests remain intact and are not accidentally migrated to `composer`. + +## Dependencies + +- Depends on `PLN-0053` establishing the canonical stdlib surface. +- Depends directly on `DEC-0027`. + +## Risks + +- Broad test churn can accidentally rewrite legitimate primitive-oriented `gfx` tests that should stay unchanged. +- If negative coverage is omitted, hidden compatibility behavior could survive behind updated positive tests. +- If host metadata assertions are updated inconsistently, compiler conformance may appear green while still teaching mixed ownership in fixtures. diff --git a/discussion/workflow/plans/PLN-0055-composer-fixtures-examples-and-repo-cleanup.md b/discussion/workflow/plans/PLN-0055-composer-fixtures-examples-and-repo-cleanup.md new file mode 100644 index 00000000..969d303f --- /dev/null +++ b/discussion/workflow/plans/PLN-0055-composer-fixtures-examples-and-repo-cleanup.md @@ -0,0 +1,120 @@ +--- +id: PLN-0055 +ticket: studio-frame-composer-syscall-and-sprite-alignment +title: Repository Fixtures, Examples, and Cleanup for Composer Sprite Migration +status: review +created: 2026-04-18 +completed: +tags: + - studio + - examples + - fixtures + - lsp + - composer + - sprites +--- + +## Objective + +Remove repository-visible usage of `Gfx.set_sprite` and migrate examples, fixtures, and supporting tests to the new `@sdk:composer` sprite path. + +## Background + +`DEC-0027` requires broad propagation across tests, fixtures, and examples, with no compatibility path. Even after stdlib/spec/compiler work lands, stale sample code or support fixtures would continue teaching the retired API and could hide incomplete migration. + +## Scope + +### Included +- Migrate repository sample projects that still call `Gfx.set_sprite`. +- Update LSP or support fixtures that rely on reserved SDK import examples where the new module is more appropriate. +- Sweep repository-owned callsites for stale references to the old sprite path. +- Add or update verification to ensure no repository-visible `Gfx.set_sprite` usage remains. + +### Excluded +- Third-party or external downstream projects outside this repository. +- Runtime test suites in `../runtime`. +- New scene/camera composer scenarios. + +## Execution Steps + +### Step 1 - Migrate sample projects to `@sdk:composer` + +**What:** +Rewrite repository examples that still use the old sprite path. + +**How:** +Update `test-projects/main` to import `Composer` from `@sdk:composer` and replace all `Gfx.set_sprite(...)` calls with `Composer.emit_sprite(...)`. Keep `Gfx` imports only for the remaining primitive calls such as `clear(...)`. Review `test-projects/fragments` and migrate only if it contains sprite-composition examples or should demonstrate the new reserved module inventory. + +**File(s):** +- `test-projects/main/src/main.pbs` +- `test-projects/fragments/src/main.pbs` + +### Step 2 - Update LSP/import fixtures where the reserved SDK inventory is exercised + +**What:** +Keep non-compiler support tests aligned with the new reserved-module set. + +**How:** +Review LSP fixtures that use `@sdk:gfx` imports as representative SDK examples. Leave primitive-oriented examples intact when they are still valid, but add or switch coverage where the test should reflect the new reserved `@sdk:composer` module being part of the environment. + +**File(s):** +- `prometeu-lsp/prometeu-lsp-v1/src/test/java/p/studio/lsp/LspServiceImplTest.java` + +### Step 3 - Run a repository sweep for stale public sprite references + +**What:** +Ensure the old API is not still visible in repository-owned artifacts. + +**How:** +Search for `Gfx.set_sprite`, `LowGfx.set_sprite`, and sprite-specific `@sdk:gfx` examples. Remove or migrate every repository-owned occurrence that is part of the normative surface, examples, fixtures, or tests. Keep pure `@sdk:gfx` primitive usage where it remains valid. + +**File(s):** +- `docs/**` +- `prometeu-compiler/**` +- `prometeu-lsp/**` +- `test-projects/**` + +### Step 4 - Add final regression verification for no-compat policy + +**What:** +Create a final gate that makes legacy leakage easy to detect. + +**How:** +Add or document a repository grep-based verification step in the execution notes or test workflow so implementation can confirm there are no remaining repository-owned `Gfx.set_sprite` references once the migration is complete. + +**File(s):** +- Verification notes in the implementation PR or relevant test documentation + +## Test Requirements + +### Unit Tests + +- Any support or fixture tests touched by the migration must continue to pass with the new imports. + +### Integration Tests + +- Repository sample projects used by compiler or integration flows must build/analyze successfully after migration. + +### Manual Verification + +- Run a repository-wide search for `Gfx.set_sprite` and verify zero remaining repository-owned hits. +- Run a repository-wide search for sprite-specific `@sdk:gfx` examples and verify they were either migrated or intentionally retained only for primitive usage. + +## Acceptance Criteria + +- [ ] Repository sample code no longer uses `Gfx.set_sprite`. +- [ ] No repository-owned fixture or example teaches the retired public sprite API. +- [ ] Any retained `@sdk:gfx` usage is primitive/overlay-oriented rather than sprite-composition-oriented. +- [ ] A repeatable verification step exists to confirm no-compat cleanup. + +## Dependencies + +- Depends on `PLN-0053` for the final stdlib surface. +- Depends on `PLN-0054` for compiler/frontend acceptance of the new imports and calls. +- Depends directly on `DEC-0027`. + +## Risks + +- Repository examples may mix primitive and sprite usage, making partial migration easy to miss. +- LSP fixtures may not strictly require composer coverage, so the cleanup can be under-scoped unless reviewed deliberately. +- Without a final sweep, legacy references can survive in docs or examples even after tests pass. From 46728a542f5cb9b88c60992a9711a0ecba62b9a6 Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Sat, 18 Apr 2026 17:01:31 +0100 Subject: [PATCH 4/7] implements PLN-0053 --- ...tdlib, and SDK Resolution Specification.md | 38 ++++++++++- ...ing and Loader Resolution Specification.md | 31 ++++++++- ...ent Packaging and Loading Specification.md | 34 +++++++++- ... Standard Library Surface Specification.md | 14 ++++ .../resources/stdlib/1/sdk/composer/main.pbs | 33 +++++++++ .../stdlib/1/sdk/composer/mod.barrel | 2 + .../main/resources/stdlib/1/sdk/gfx/main.pbs | 31 --------- .../pbs/stdlib/InterfaceModuleLoaderTest.java | 67 +++++++++++++++++++ 8 files changed, 213 insertions(+), 37 deletions(-) create mode 100644 prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/resources/stdlib/1/sdk/composer/main.pbs create mode 100644 prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/resources/stdlib/1/sdk/composer/mod.barrel diff --git a/docs/specs/compiler-languages/pbs/5. Manifest, Stdlib, and SDK Resolution Specification.md b/docs/specs/compiler-languages/pbs/5. Manifest, Stdlib, and SDK Resolution Specification.md index 21a23fcb..1d1f2a5e 100644 --- a/docs/specs/compiler-languages/pbs/5. Manifest, Stdlib, and SDK Resolution Specification.md +++ b/docs/specs/compiler-languages/pbs/5. Manifest, Stdlib, and SDK Resolution Specification.md @@ -18,7 +18,7 @@ This document defines the normative compile-time model for: This document is the authority for how the compiler discovers and loads: - ordinary project modules, -- reserved stdlib modules such as `@sdk:gfx`, +- reserved stdlib modules such as `@sdk:gfx` and `@sdk:composer`, - compile-time reserved metadata attached to those reserved modules, - interface-only service facades that wrap host surfaces for source ergonomics, - and backend-provided compile surfaces consumed by the frontend for symbolic authoring. @@ -211,6 +211,20 @@ Rules: - `Gfx` becomes visible only through `import`. - The compiler accepts that import because the selected stdlib environment exposes `@sdk:gfx`. +For sprite composition in stdlib line `1`, the canonical reserved SDK surface is: + +```pbs +import { Composer } from @sdk:composer; + +let status: int = Composer.emit_sprite(7, 0, 12, 18, 0, 2, false, false, 1); +``` + +Rules: + +- `@sdk:composer` is the canonical sprite-composition module in this wave. +- `@sdk:gfx` remains valid for primitive and overlay-oriented graphics operations. +- `Gfx.set_sprite` is not part of the active stdlib line `1` contract. + ## 6. Effective Stdlib of the Build The root project owns the effective stdlib line of the build. @@ -359,6 +373,26 @@ Rules: - It contributes compile-time symbols and metadata. - It does not produce executable bytecode by itself. +Another valid reserved stdlib interface module in stdlib line `1` is the sprite-composition surface: + +```pbs +declare host LowComposer { + [Host(module = "composer", name = "emit_sprite", version = 1)] + [Capability(name = "gfx")] + fn emit_sprite( + glyph_id: int, + palette_id: int, + x: int, + y: int, + layer: int, + bank_id: int, + flip_x: bool, + flip_y: bool, + priority: int + ) -> int; +} +``` + ## 10. Compiler Loading of the Stdlib Environment The compiler loads the stdlib environment from the stdlib line selected by the root project. @@ -433,7 +467,7 @@ Rules: - `declare host` remains reserved to SDK/toolchain-controlled modules. - Ordinary user-authored project modules do not declare canonical host bindings directly. - User code consumes SDK exports through normal imports. -- SDK-facing surfaces such as `Gfx.draw_pixel(...)` are resolved by the compiler against the selected stdlib environment. +- SDK-facing surfaces such as `Gfx.draw_pixel(...)` and `Composer.emit_sprite(...)` are resolved by the compiler against the selected stdlib environment. - Canonical host identity comes from reserved host-binding metadata such as `[Host(...)]`, not from the source spelling of the imported owner. ## 13. Project Publication and Distribution diff --git a/docs/specs/compiler-languages/pbs/6.2. Host ABI Binding and Loader Resolution Specification.md b/docs/specs/compiler-languages/pbs/6.2. Host ABI Binding and Loader Resolution Specification.md index 0a5c99e7..f23173bf 100644 --- a/docs/specs/compiler-languages/pbs/6.2. Host ABI Binding and Loader Resolution Specification.md +++ b/docs/specs/compiler-languages/pbs/6.2. Host ABI Binding and Loader Resolution Specification.md @@ -61,7 +61,7 @@ as the normative runtime-facing identity. The host-binding pipeline is: -1. User code imports SDK surfaces such as `Gfx` from `@sdk:gfx`. +1. User code imports SDK surfaces such as `Gfx` from `@sdk:gfx` and `Composer` from `@sdk:composer`. 2. The compiler resolves those surfaces against the selected stdlib line. 3. The compiler maps each host-backed SDK member to a canonical identity `(module, name, version)`. 4. The compiler emits those required canonical identities into the PBX `SYSC` table. @@ -136,6 +136,33 @@ but the PBX-facing declaration is canonical, for example: ("gfx", "draw_pixel", 1) ``` +The same rule applies to sprite composition through the composer domain. +For example, the PBS-facing declaration: + +```pbs +declare host LowComposer { + [Host(module = "composer", name = "emit_sprite", version = 1)] + [Capability(name = "gfx")] + fn emit_sprite( + glyph_id: int, + palette_id: int, + x: int, + y: int, + layer: int, + bank_id: int, + flip_x: bool, + flip_y: bool, + priority: int + ) -> int; +} +``` + +maps to the canonical runtime identity: + +```text +("composer", "emit_sprite", 1) +``` + The same rule applies to the low-level asset surface. For example, the PBS-facing declaration: @@ -396,7 +423,7 @@ Diagnostics should identify the failing canonical identity whenever available. Rules: -- the loader does not resolve source imports such as `@sdk:gfx`, +- the loader does not resolve source imports such as `@sdk:gfx` or `@sdk:composer`, - the loader only consumes canonical host-binding metadata emitted into the PBX, - `stdlib` affects the loader indirectly through what the compiler emitted, - the loader must not attempt to reconstruct SDK/module semantics from the PBX. diff --git a/docs/specs/compiler-languages/pbs/8. Stdlib Environment Packaging and Loading Specification.md b/docs/specs/compiler-languages/pbs/8. Stdlib Environment Packaging and Loading Specification.md index fa848dd4..af06c17b 100644 --- a/docs/specs/compiler-languages/pbs/8. Stdlib Environment Packaging and Loading Specification.md +++ b/docs/specs/compiler-languages/pbs/8. Stdlib Environment Packaging and Loading Specification.md @@ -56,6 +56,9 @@ prometeu-compiler/frontends/prometeu-frontend-pbs/ stdlib/ 1/ sdk/ + composer/ + main.pbs + mod.barrel gfx/ main.pbs mod.barrel @@ -75,7 +78,7 @@ Interpretation: - `stdlib/1` selects stdlib major line `1`, - `sdk` and `core` are reserved project spaces, -- `gfx`, `audio`, `math` are module paths within those reserved spaces, +- `composer`, `gfx`, `audio`, `math` are module paths within those reserved spaces, - `main.pbs` and `mod.barrel` form the interface module contents. ## 5. Logical Mapping @@ -85,6 +88,7 @@ The compiler must treat the physical layout as a logical stdlib environment. Required mapping: - `stdlib//sdk/gfx` -> `@sdk:gfx` +- `stdlib//sdk/composer` -> `@sdk:composer` - `stdlib//sdk/asset` -> `@sdk:asset` - `stdlib//sdk/audio` -> `@sdk:audio` - `stdlib//core/math` -> `@core:math` @@ -94,7 +98,7 @@ Rules: - physical storage is an implementation detail, - logical module identity is authoritative, -- callers of the resolver should work with logical addresses such as `@sdk:gfx`, not resource paths. +- callers of the resolver should work with logical addresses such as `@sdk:gfx` and `@sdk:composer`, not resource paths. ## 6. Module File Convention @@ -145,6 +149,7 @@ Responsibility: Minimum operations: - `resolve(@sdk:gfx)` +- `resolve(@sdk:composer)` - `resolve(@core:math/vector)` ### 7.3 `StdlibModuleSource` @@ -219,6 +224,26 @@ declare host LowAssets { } ``` +or: + +```pbs +declare host LowComposer { + [Host(module = "composer", name = "emit_sprite", version = 1)] + [Capability(name = "gfx")] + fn emit_sprite( + glyph_id: int, + palette_id: int, + x: int, + y: int, + layer: int, + bank_id: int, + flip_x: bool, + flip_y: bool, + priority: int + ) -> int; +} +``` + Rules: - the parser reads the attribute as part of the interface module source, @@ -226,6 +251,11 @@ Rules: - the compiler stores the extracted metadata in its interface graph, - the raw attribute surface is not treated as a runtime object, - later lowering stages may consume the extracted metadata to produce PBX host-binding declarations. +- stdlib line `1` MUST expose the sprite-composition interface module at `@sdk:composer`, +- that module MUST declare `LowComposer` and public service `Composer`, +- that module MUST use runtime module `composer` and capability `gfx`, +- that module MUST expose `emit_sprite(glyph_id: int, palette_id: int, x: int, y: int, layer: int, bank_id: int, flip_x: bool, flip_y: bool, priority: int) -> int`, +- stdlib line `1` MUST NOT expose `Gfx.set_sprite`, - stdlib line `1` MUST expose the low-level asset interface module at `@sdk:asset`, - that module MUST declare `LowAssets`, - that module MUST use runtime module `asset` and capability `asset`, diff --git a/docs/specs/compiler/18. Standard Library Surface Specification.md b/docs/specs/compiler/18. Standard Library Surface Specification.md index 677955ac..2358cd28 100644 --- a/docs/specs/compiler/18. Standard Library Surface Specification.md +++ b/docs/specs/compiler/18. Standard Library Surface Specification.md @@ -164,6 +164,20 @@ Rules: - PBS symbolic asset references (`Addressable`) are not themselves required to be stdlib-imported modules; - backend-owned frontend surface contracts MAY supply symbolic values that later lower into stdlib host-backed APIs. +### 12.1 Current line `1` sprite-composition rule + +For stdlib line `1`, sprite composition is owned by `@sdk:composer`, not by `@sdk:gfx`. + +Rules: + +- `@sdk:composer` MUST expose a low-level host owner `LowComposer`. +- `@sdk:composer` MUST expose a public service facade `Composer`. +- `Composer.emit_sprite(...)` MUST lower through canonical host identity `("composer", "emit_sprite", 1)`. +- `Composer.emit_sprite(...)` MUST return a raw `int` in this wave. +- `@sdk:gfx` MAY continue to expose primitive and overlay-oriented operations. +- `@sdk:gfx` MUST NOT expose `set_sprite`. +- `bind_scene`, `unbind_scene`, and `set_camera` are deferred and are not required members of `@sdk:composer` in this wave. + ## 13. Stdlib Contract Expectations for Builtin MVP For the current builtin MVP, stdlib should be able to expose at least: diff --git a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/resources/stdlib/1/sdk/composer/main.pbs b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/resources/stdlib/1/sdk/composer/main.pbs new file mode 100644 index 00000000..5fde843a --- /dev/null +++ b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/resources/stdlib/1/sdk/composer/main.pbs @@ -0,0 +1,33 @@ +declare host LowComposer { + [Host(module = "composer", name = "emit_sprite", version = 1)] + [Capability(name = "gfx")] + fn emit_sprite( + glyph_id: int, + palette_id: int, + x: int, + y: int, + layer: int, + bank_id: int, + flip_x: bool, + flip_y: bool, + priority: int + ) -> int; +} + +declare service Composer +{ + fn emit_sprite( + glyph_id: int, + palette_id: int, + x: int, + y: int, + layer: int, + bank_id: int, + flip_x: bool, + flip_y: bool, + priority: int + ) -> int + { + return LowComposer.emit_sprite(glyph_id, palette_id, x, y, layer, bank_id, flip_x, flip_y, priority); + } +} diff --git a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/resources/stdlib/1/sdk/composer/mod.barrel b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/resources/stdlib/1/sdk/composer/mod.barrel new file mode 100644 index 00000000..19c2fd17 --- /dev/null +++ b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/resources/stdlib/1/sdk/composer/mod.barrel @@ -0,0 +1,2 @@ +mod host LowComposer; +pub service Composer; diff --git a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/resources/stdlib/1/sdk/gfx/main.pbs b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/resources/stdlib/1/sdk/gfx/main.pbs index 8fb80fea..c13a1b30 100644 --- a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/resources/stdlib/1/sdk/gfx/main.pbs +++ b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/resources/stdlib/1/sdk/gfx/main.pbs @@ -25,21 +25,6 @@ declare host LowGfx { [Capability(name = "gfx")] fn draw_square(x: int, y: int, w: int, h: int, border_color: Color, fill_color: Color) -> void; - [Host(module = "gfx", name = "set_sprite", version = 1)] - [Capability(name = "gfx")] - fn set_sprite( - bank_id: int, - index: int, - x: int, - y: int, - tile_id: int, - palette_id: int, - active: bool, - flip_x: bool, - flip_y: bool, - priority: int - ) -> int; - [Host(module = "gfx", name = "draw_text", version = 1)] [Capability(name = "gfx")] fn draw_text(x: int, y: int, message: str, color: Color) -> void; @@ -81,22 +66,6 @@ declare service Gfx LowGfx.draw_square(x, y, w, h, border_color, fill_color); } - fn set_sprite( - bank_id: int, - index: int, - x: int, - y: int, - tile_id: int, - palette_id: int, - active: bool, - flip_x: bool, - flip_y: bool, - priority: int - ) -> int - { - return LowGfx.set_sprite(bank_id, index, x, y, tile_id, palette_id, active, flip_x, flip_y, priority); - } - fn draw_text(x: int, y: int, message: str, color: Color) -> void { LowGfx.draw_text(x, y, message, color); diff --git a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/pbs/stdlib/InterfaceModuleLoaderTest.java b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/pbs/stdlib/InterfaceModuleLoaderTest.java index 8e4afe1f..b856e477 100644 --- a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/pbs/stdlib/InterfaceModuleLoaderTest.java +++ b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/pbs/stdlib/InterfaceModuleLoaderTest.java @@ -84,4 +84,71 @@ class InterfaceModuleLoaderTest { "pub host LowAssets;", fileTable.get(module.barrelFiles().getFirst().fileId()).readUtf8().orElseThrow()); } + + @Test + void shouldLoadComposerStdlibModuleWithPublicServiceBarrel() { + final var projectTable = new ProjectTable(); + final var projectId = projectTable.register(ProjectDescriptor.builder() + .name("app") + .version("1.0.0") + .rootPath(Path.of("/tmp/app")) + .sourceRoots(ReadOnlyList.wrap(java.util.List.of(Path.of("/tmp/app/src")))) + .build()); + final var fileTable = new FileTable(1); + final var diagnostics = DiagnosticSink.empty(); + final var moduleSource = new StdlibModuleSource( + "sdk", + ReadOnlyList.wrap(java.util.List.of("composer")), + ReadOnlyList.wrap(java.util.List.of(new StdlibModuleSource.SourceFile( + "main.pbs", + """ + declare host LowComposer { + [Host(module = "composer", name = "emit_sprite", version = 1)] + [Capability(name = "gfx")] + fn emit_sprite( + glyph_id: int, + palette_id: int, + x: int, + y: int, + layer: int, + bank_id: int, + flip_x: bool, + flip_y: bool, + priority: int + ) -> int; + } + + declare service Composer { + fn emit_sprite( + glyph_id: int, + palette_id: int, + x: int, + y: int, + layer: int, + bank_id: int, + flip_x: bool, + flip_y: bool, + priority: int + ) -> int { + return LowComposer.emit_sprite(glyph_id, palette_id, x, y, layer, bank_id, flip_x, flip_y, priority); + } + } + """))), + """ + mod host LowComposer; + pub service Composer; + """); + + final var module = new InterfaceModuleLoader().load(moduleSource, projectId, fileTable, diagnostics); + + assertTrue(diagnostics.isEmpty(), diagnostics.stream().map(d -> d.getCode() + ":" + d.getMessage()).toList().toString()); + assertEquals(1, module.sourceFiles().size()); + assertEquals(1, module.barrelFiles().size()); + assertEquals( + """ + mod host LowComposer; + pub service Composer; + """.strip(), + fileTable.get(module.barrelFiles().getFirst().fileId()).readUtf8().orElseThrow().strip()); + } } From a17dfde48139b0399ee11a2fe0643346c72e3946 Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Sat, 18 Apr 2026 17:03:18 +0100 Subject: [PATCH 5/7] implements PLN-0054 --- .../PbsGateUSdkInterfaceConformanceTest.java | 8 +- .../services/PBSFrontendPhaseServiceTest.java | 76 +++++++++++++++++-- 2 files changed, 77 insertions(+), 7 deletions(-) diff --git a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/pbs/PbsGateUSdkInterfaceConformanceTest.java b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/pbs/PbsGateUSdkInterfaceConformanceTest.java index 3e29f97a..6e16aa13 100644 --- a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/pbs/PbsGateUSdkInterfaceConformanceTest.java +++ b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/pbs/PbsGateUSdkInterfaceConformanceTest.java @@ -85,13 +85,14 @@ class PbsGateUSdkInterfaceConformanceTest { tempDir.resolve("gate-u-reserved-import-positive"), """ import { Color } from @core:color; + import { Composer } from @sdk:composer; import { Gfx } from @sdk:gfx; import { Input, InputPad, InputButton } from @sdk:input; import { Assets } from @sdk:asset; import { Log } from @sdk:log; declare contract Renderer { - fn render(gfx: Gfx, color: Color, input: Input, pad: InputPad, button: InputButton, assets: Assets, log: Log) -> void; + fn render(composer: Composer, gfx: Gfx, color: Color, input: Input, pad: InputPad, button: InputButton, assets: Assets, log: Log) -> void; } """, "pub contract Renderer;", @@ -115,6 +116,11 @@ class PbsGateUSdkInterfaceConformanceTest { && h.abiModule().equals("gfx") && h.abiMethod().equals("clear") && h.abiVersion() == 1)); + assertTrue(positive.irBackend().getReservedMetadata().hostMethodBindings().stream() + .anyMatch(h -> h.ownerName().equals("LowComposer") + && h.abiModule().equals("composer") + && h.abiMethod().equals("emit_sprite") + && h.abiVersion() == 1)); assertTrue(positive.irBackend().getReservedMetadata().hostMethodBindings().stream() .anyMatch(h -> h.ownerName().equals("LowLog") && h.abiModule().equals("log") diff --git a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/services/PBSFrontendPhaseServiceTest.java b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/services/PBSFrontendPhaseServiceTest.java index ec9fa894..cac3a2ea 100644 --- a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/services/PBSFrontendPhaseServiceTest.java +++ b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/services/PBSFrontendPhaseServiceTest.java @@ -1006,8 +1006,72 @@ class PBSFrontendPhaseServiceTest { } @Test - void shouldLowerSdkGfxSetSpriteFacadeUsingBankIdContract() throws IOException { - final var projectRoot = tempDir.resolve("project-bootstrap-sdk-gfx-set-sprite"); + void shouldLowerSdkComposerEmitSpriteFacadeUsingCanonicalComposerContract() throws IOException { + final var projectRoot = tempDir.resolve("project-bootstrap-sdk-composer-emit-sprite"); + final var sourceRoot = projectRoot.resolve("src"); + final var modulePath = sourceRoot.resolve("app"); + Files.createDirectories(modulePath); + + final var sourceFile = modulePath.resolve("source.pbs"); + final var modBarrel = modulePath.resolve("mod.barrel"); + Files.writeString(sourceFile, """ + import { Composer } from @sdk:composer; + + fn render() -> int + { + return Composer.emit_sprite(7, 3, 12, 18, 0, 2, false, true, 1); + } + + [Frame] + fn frame() -> void + { + render(); + return; + } + """); + Files.writeString(modBarrel, """ + pub fn render() -> int; + pub fn frame() -> void; + """); + + final var projectTable = new ProjectTable(); + final var fileTable = new FileTable(1); + final var projectId = projectTable.register(ProjectDescriptor.builder() + .rootPath(projectRoot) + .name("app") + .version("1.0.0") + .sourceRoots(ReadOnlyList.wrap(List.of(sourceRoot))) + .build()); + + registerFile(projectId, projectRoot, sourceFile, fileTable); + registerFile(projectId, projectRoot, modBarrel, fileTable); + + final var ctx = new FrontendPhaseContext( + projectTable, + fileTable, + new BuildStack(ReadOnlyList.wrap(List.of(projectId))), + 1); + final var diagnostics = DiagnosticSink.empty(); + + final var irBackend = new PBSFrontendPhaseService().compile( + ctx, + diagnostics, + LogAggregator.empty(), + BuildingIssueSink.empty()); + + assertTrue(diagnostics.stream().noneMatch(d -> + d.getCode().equals(PbsSemanticsErrors.E_SEM_EXEC_LOWERING_UNRESOLVED_CALLEE.name()))); + assertTrue(irBackend.getExecutableFunctions().stream().anyMatch(function -> "frame".equals(function.callableName()))); + assertTrue(irBackend.getReservedMetadata().hostMethodBindings().stream() + .anyMatch(h -> h.ownerName().equals("LowComposer") + && h.sourceMethodName().equals("emit_sprite") + && h.abiModule().equals("composer") + && h.abiMethod().equals("emit_sprite"))); + } + + @Test + void shouldRejectLegacyGfxSetSpriteAfterComposerMigration() throws IOException { + final var projectRoot = tempDir.resolve("project-bootstrap-sdk-gfx-set-sprite-removed"); final var sourceRoot = projectRoot.resolve("src"); final var modulePath = sourceRoot.resolve("app"); Files.createDirectories(modulePath); @@ -1059,10 +1123,10 @@ class PBSFrontendPhaseServiceTest { LogAggregator.empty(), BuildingIssueSink.empty()); - assertTrue(diagnostics.stream().noneMatch(d -> - d.getCode().equals(PbsSemanticsErrors.E_SEM_EXEC_LOWERING_UNRESOLVED_CALLEE.name()))); - assertTrue(irBackend.getExecutableFunctions().stream().anyMatch(function -> "frame".equals(function.callableName()))); - assertTrue(irBackend.getReservedMetadata().hostMethodBindings().stream() + assertTrue(diagnostics.stream().anyMatch(d -> + d.getCode().equals(PbsSemanticsErrors.E_SEM_INVALID_MEMBER_ACCESS.name()) + || d.getCode().equals(PbsSemanticsErrors.E_SEM_EXEC_LOWERING_UNRESOLVED_CALLEE.name()))); + assertFalse(irBackend.getReservedMetadata().hostMethodBindings().stream() .anyMatch(h -> h.ownerName().equals("LowGfx") && h.sourceMethodName().equals("set_sprite"))); } From 1e99553d948add443d3762899e1bc2b874493987 Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Sat, 18 Apr 2026 17:04:35 +0100 Subject: [PATCH 6/7] implements PLN-0055 --- .../src/test/java/p/studio/lsp/LspServiceImplTest.java | 6 +++--- test-projects/main/src/main.pbs | 9 +++++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/prometeu-lsp/prometeu-lsp-v1/src/test/java/p/studio/lsp/LspServiceImplTest.java b/prometeu-lsp/prometeu-lsp-v1/src/test/java/p/studio/lsp/LspServiceImplTest.java index cefb212f..69836c6b 100644 --- a/prometeu-lsp/prometeu-lsp-v1/src/test/java/p/studio/lsp/LspServiceImplTest.java +++ b/prometeu-lsp/prometeu-lsp-v1/src/test/java/p/studio/lsp/LspServiceImplTest.java @@ -55,10 +55,10 @@ final class LspServiceImplTest { """; private static final String SDK_IMPORT_SOURCE = """ - import { Gfx } from @sdk:gfx; + import { Composer } from @sdk:composer; fn main() -> void { - Gfx.clear(); + Composer.emit_sprite(1, 0, 0, 0, 0, 0, false, false, 0); } """; @@ -180,7 +180,7 @@ final class LspServiceImplTest { final var analysis = service.analyzeDocument(new LspAnalyzeDocumentRequest(mainFile)); - assertEquals(List.of("pbs-service", "pbs-service"), semanticKeysForLexeme(analysis, SDK_IMPORT_SOURCE, "Gfx")); + assertEquals(List.of("pbs-service", "pbs-service"), semanticKeysForLexeme(analysis, SDK_IMPORT_SOURCE, "Composer")); } @Test diff --git a/test-projects/main/src/main.pbs b/test-projects/main/src/main.pbs index 17347ace..e0d71bfd 100644 --- a/test-projects/main/src/main.pbs +++ b/test-projects/main/src/main.pbs @@ -2,6 +2,7 @@ import { Color } from @core:color; import { Log } from @sdk:log; import { Input } from @sdk:input; +import { Composer } from @sdk:composer; import { Gfx } from @sdk:gfx; import { Assets } from @sdk:asset; @@ -41,9 +42,9 @@ fn frame() -> void Log.failure("commit failed"); } } else if (s == 3) { - let sprite_status : int = Gfx.set_sprite(3, 10, 150, 150, 0, 0, true, false, false, 1); + let sprite_status : int = Composer.emit_sprite(0, 0, 150, 150, 1, 3, false, false, 1); if (sprite_status != 0) { - Log.failure("set_sprite failed"); + Log.failure("emit_sprite failed"); } } else { Log.info("state: waiting"); @@ -74,8 +75,8 @@ fn frame() -> void } } - Gfx.set_sprite(0, 0, touch.x() - 16, touch.y() + 8, tile_id, 0, true, true, false, 0); - Gfx.set_sprite(0, 1, touch.x() + 16, touch.y() + 8, tile_id, 0, true, false, false, 0); + Composer.emit_sprite(tile_id, 0, touch.x() - 16, touch.y() + 8, 0, 0, true, false, 0); + Composer.emit_sprite(tile_id, 0, touch.x() + 16, touch.y() + 8, 0, 1, false, false, 0); let a : int = 10; let b : int = 15; From 908cb2b1fe2bf95124b4ab2d3b316f0a6f4d46a2 Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Sat, 18 Apr 2026 17:27:22 +0100 Subject: [PATCH 7/7] housekeep --- discussion/index.ndjson | 4 +- ...oser-must-own-public-sprite-composition.md | 70 ++++++++ ...e-composer-syscall-and-sprite-alignment.md | 170 ------------------ ...tudio-composer-sprite-syscall-alignment.md | 158 ---------------- ...N-0053-composer-spec-and-stdlib-surface.md | 136 -------------- ...oser-compiler-and-conformance-migration.md | 122 ------------- ...oser-fixtures-examples-and-repo-cleanup.md | 120 ------------- 7 files changed, 72 insertions(+), 708 deletions(-) create mode 100644 discussion/lessons/DSC-0029-studio-frame-composer-syscall-and-sprite-alignment/LSN-0041-composer-must-own-public-sprite-composition.md delete mode 100644 discussion/workflow/agendas/AGD-0031-studio-frame-composer-syscall-and-sprite-alignment.md delete mode 100644 discussion/workflow/decisions/DEC-0027-studio-composer-sprite-syscall-alignment.md delete mode 100644 discussion/workflow/plans/PLN-0053-composer-spec-and-stdlib-surface.md delete mode 100644 discussion/workflow/plans/PLN-0054-composer-compiler-and-conformance-migration.md delete mode 100644 discussion/workflow/plans/PLN-0055-composer-fixtures-examples-and-repo-cleanup.md diff --git a/discussion/index.ndjson b/discussion/index.ndjson index be362693..31c3065c 100644 --- a/discussion/index.ndjson +++ b/discussion/index.ndjson @@ -1,5 +1,5 @@ -{"type":"meta","next_id":{"DSC":30,"AGD":32,"DEC":28,"PLN":56,"LSN":40,"CLSN":1}} -{"type":"discussion","id":"DSC-0029","status":"open","ticket":"studio-frame-composer-syscall-and-sprite-alignment","title":"Studio Alignment with Runtime FrameComposer Syscalls and Sprite Composition","created_at":"2026-04-18","updated_at":"2026-04-18","tags":["studio","compiler","pbs","stdlib","runtime-alignment","abi","syscall","frame-composer","sprites"],"agendas":[{"id":"AGD-0031","file":"AGD-0031-studio-frame-composer-syscall-and-sprite-alignment.md","status":"in_progress","created_at":"2026-04-18","updated_at":"2026-04-18"}],"decisions":[{"id":"DEC-0027","file":"DEC-0027-studio-composer-sprite-syscall-alignment.md","status":"in_progress","created_at":"2026-04-18","updated_at":"2026-04-18","ref_agenda":"AGD-0031"}],"plans":[{"id":"PLN-0053","file":"PLN-0053-composer-spec-and-stdlib-surface.md","status":"review","created_at":"2026-04-18","updated_at":"2026-04-18","ref_decisions":["DEC-0027"]},{"id":"PLN-0054","file":"PLN-0054-composer-compiler-and-conformance-migration.md","status":"review","created_at":"2026-04-18","updated_at":"2026-04-18","ref_decisions":["DEC-0027"]},{"id":"PLN-0055","file":"PLN-0055-composer-fixtures-examples-and-repo-cleanup.md","status":"review","created_at":"2026-04-18","updated_at":"2026-04-18","ref_decisions":["DEC-0027"]}],"lessons":[]} +{"type":"meta","next_id":{"DSC":30,"AGD":32,"DEC":28,"PLN":56,"LSN":42,"CLSN":1}} +{"type":"discussion","id":"DSC-0029","status":"done","ticket":"studio-frame-composer-syscall-and-sprite-alignment","title":"Studio Alignment with Runtime FrameComposer Syscalls and Sprite Composition","created_at":"2026-04-18","updated_at":"2026-04-18","tags":["studio","compiler","pbs","stdlib","runtime-alignment","abi","syscall","frame-composer","sprites"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0041","file":"discussion/lessons/DSC-0029-studio-frame-composer-syscall-and-sprite-alignment/LSN-0041-composer-must-own-public-sprite-composition.md","status":"done","created_at":"2026-04-18","updated_at":"2026-04-18"}]} {"type":"discussion","id":"DSC-0028","status":"open","ticket":"studio-tiled-parser-assets-scene-asset-type","title":"Tiled Parser and Scene Asset-Type Ownership in Assets Workspace","created_at":"2026-04-15","updated_at":"2026-04-15","tags":["studio","assets","scene","tiled","parser","asset-type"],"agendas":[{"id":"AGD-0030","file":"AGD-0030-tiled-parser-and-scene-asset-type.md","status":"open","created_at":"2026-04-15","updated_at":"2026-04-15"}],"decisions":[],"plans":[],"lessons":[]} {"type":"discussion","id":"DSC-0027","status":"abandoned","ticket":"studio-scene-workspace","title":"Scene Workspace for SCENE Authoring","created_at":"2026-04-14","updated_at":"2026-04-15","tags":["studio","workspace","scene","tilemap","asset","runtime-alignment"],"agendas":[{"id":"AGD-0029","file":"AGD-0029-studio-scene-workspace.md","status":"abandoned","created_at":"2026-04-14","updated_at":"2026-04-15","_override_reason":"Explicit user request on 2026-04-15 to abandon the accepted agenda and its downstream work."}],"decisions":[{"id":"DEC-0026","file":"DEC-0026-studio-scene-workspace.md","status":"abandoned","created_at":"2026-04-14","updated_at":"2026-04-15","ref_agenda":"AGD-0029","_override_reason":"Explicit user request on 2026-04-15 to abandon the accepted decision and stop using it as normative guidance."}],"plans":[{"id":"PLN-0049","file":"PLN-0049-scene-workspace-spec-and-boundary-propagation.md","status":"abandoned","created_at":"2026-04-14","updated_at":"2026-04-15","ref_decisions":["DEC-0026"],"_override_reason":"Explicit user request on 2026-04-15 to abandon all plans derived from DEC-0026."},{"id":"PLN-0050","file":"PLN-0050-scene-workspace-shell-and-project-state-foundations.md","status":"abandoned","created_at":"2026-04-14","updated_at":"2026-04-15","ref_decisions":["DEC-0026"],"_override_reason":"Explicit user request on 2026-04-15 to abandon all plans derived from DEC-0026."},{"id":"PLN-0051","file":"PLN-0051-scene-artifact-and-assets-handoff-contract.md","status":"abandoned","created_at":"2026-04-14","updated_at":"2026-04-15","ref_decisions":["DEC-0026"],"_override_reason":"Explicit user request on 2026-04-15 to abandon all plans derived from DEC-0026."},{"id":"PLN-0052","file":"PLN-0052-scene-workspace-wave-1-tilemap-editor.md","status":"abandoned","created_at":"2026-04-14","updated_at":"2026-04-15","ref_decisions":["DEC-0026"],"_override_reason":"Explicit user request on 2026-04-15 to abandon all plans derived from DEC-0026."}],"lessons":[]} {"type":"discussion","id":"DSC-0026","status":"done","ticket":"glyph-bank-naming-alignment-with-runtime","title":"Glyph Bank Naming Alignment with Runtime DEC-0006","created_at":"2026-04-10","updated_at":"2026-04-10","tags":["packer","studio","naming","asset-contract","runtime-alignment","glyph-bank"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0040","file":"discussion/lessons/DSC-0026-glyph-bank-naming-alignment-with-runtime/LSN-0040-glyph-bank-artifact-naming-alignment.md","status":"done","created_at":"2026-04-10","updated_at":"2026-04-10"}]} diff --git a/discussion/lessons/DSC-0029-studio-frame-composer-syscall-and-sprite-alignment/LSN-0041-composer-must-own-public-sprite-composition.md b/discussion/lessons/DSC-0029-studio-frame-composer-syscall-and-sprite-alignment/LSN-0041-composer-must-own-public-sprite-composition.md new file mode 100644 index 00000000..f7dcc6a0 --- /dev/null +++ b/discussion/lessons/DSC-0029-studio-frame-composer-syscall-and-sprite-alignment/LSN-0041-composer-must-own-public-sprite-composition.md @@ -0,0 +1,70 @@ +--- +id: LSN-0041 +ticket: studio-frame-composer-syscall-and-sprite-alignment +title: Composer Must Own the Public Sprite-Composition Surface +created: 2026-04-18 +tags: [studio, compiler, pbs, stdlib, runtime-alignment, abi, syscall, frame-composer, sprites] +--- + +## Context + +The runtime had already moved canonical frame orchestration to `FrameComposer` and published the corresponding public ABI under `composer.*`, but Studio still exposed sprite composition through `@sdk:gfx` and `Gfx.set_sprite`. + +That left the repository teaching the wrong owner even though runtime dispatch, architectural lessons, and the public syscall domain had already changed. The migration closed that drift for the sprite path without pulling scene binding, camera control, or scene-bank work into the same ticket. + +## Key Decisions + +### Public Source Ownership Must Match the Runtime ABI + +**What:** +Studio now exposes sprite composition through `@sdk:composer`, with `LowComposer` as the low-level host owner and `Composer` as the public service facade. The old `Gfx.set_sprite` path was removed instead of being kept as compatibility sugar. + +**Why:** +Once runtime ownership moved to `FrameComposer`, keeping sprite submission under `gfx.*` would preserve a false mental model and create a dual contract between what the runtime actually owns and what PBS/stdlib teaches. + +**Trade-offs:** +The migration required coordinated changes across stdlib resources, specs, frontend conformance, examples, and LSP fixtures. That was more work up front, but it avoided a longer-lived compatibility layer that would have encoded the wrong architecture. + +### A Partial Domain Rollout Is Valid If the Boundary Is Explicit + +**What:** +This wave shipped only `composer.emit_sprite(...)` in Studio. `bind_scene`, `unbind_scene`, and `set_camera` were explicitly deferred. + +**Why:** +The current pipeline only needed sprite composition. Pulling scene/camera rollout into the same thread would have mixed ABI convergence with unfinished scene-work concerns and made the migration harder to execute cleanly. + +**Trade-offs:** +The docs had to state clearly that `@sdk:composer` exists now for sprite emission while other composer members remain future work. That is slightly less symmetrical in the short term, but it keeps the implemented contract honest. + +### Raw Status Returns Can Be Preserved During Ownership Migration + +**What:** +`Composer.emit_sprite(...)` kept the raw `int` status return for this wave instead of introducing a new editorial status shell. + +**Why:** +The architectural problem in this discussion was ownership and ABI drift, not status typing. Keeping the return shape stable allowed the migration to focus on the service boundary and public surface without coupling it to a second API redesign. + +**Trade-offs:** +The API remains less expressive than a nominal status shell, but the migration stayed narrow and easier to validate end to end. + +## Patterns and Algorithms + +- Treat runtime service ownership changes as public-source changes, not merely internal lowering rewrites. +- When the runtime removes a legacy public syscall path, prefer removing the matching source-level facade instead of silently retargeting it. +- Split migrations by boundary: first stdlib/spec surface, then compiler/conformance, then examples and fixture cleanup. +- Keep primitive-oriented `@sdk:gfx` coverage intact while moving only frame-composition behavior to `@sdk:composer`. +- Use a negative regression test for the removed API so compatibility leakage is caught explicitly. + +## Pitfalls + +- Retargeting `Gfx.set_sprite` internally to `composer.emit_sprite` would have looked convenient, but it would have preserved the wrong owner in the public teaching surface. +- A repository sweep that ignores examples and fixtures leaves stale guidance behind even when compiler tests are green. +- Replacing every `@sdk:gfx` example wholesale would be overcorrection; primitive and overlay operations still belong there. +- Updating docs to mention deferred composer members as if they already shipped would create a second kind of contract drift. + +## Takeaways + +- Public SDK ownership should mirror canonical runtime ownership, not historical implementation leftovers. +- Removing the old API is safer than keeping a compatibility facade that encodes the wrong subsystem boundary. +- A sprite-only `@sdk:composer` wave is acceptable when the deferred scene/camera scope is stated explicitly. +- Ownership migration and status-typing redesign do not need to happen in the same change. diff --git a/discussion/workflow/agendas/AGD-0031-studio-frame-composer-syscall-and-sprite-alignment.md b/discussion/workflow/agendas/AGD-0031-studio-frame-composer-syscall-and-sprite-alignment.md deleted file mode 100644 index 602761b4..00000000 --- a/discussion/workflow/agendas/AGD-0031-studio-frame-composer-syscall-and-sprite-alignment.md +++ /dev/null @@ -1,170 +0,0 @@ ---- -id: AGD-0031 -ticket: studio-frame-composer-syscall-and-sprite-alignment -title: Studio Alignment with Runtime FrameComposer Syscalls and Sprite Composition -status: in_progress -created: 2026-04-18 -resolved: 2026-04-18 -decision: DEC-0027 -tags: - - studio - - compiler - - pbs - - stdlib - - runtime-alignment - - abi - - syscall - - frame-composer - - sprites ---- - -## Pain - -The sibling runtime has already moved the public frame-orchestration ABI to `composer.*`. - -This repository still exposes the old model through `@sdk:gfx` and `Gfx.set_sprite`, which means: - -- the Studio-side compiler and stdlib still teach a legacy public contract; -- PBS examples and tests still lower sprite composition through the wrong owner; -- specs still describe a source surface that no longer matches the runtime's canonical syscall boundary; -- any new Studio work risks reinforcing a dual contract between `gfx.*` primitives and `composer.*` frame orchestration. - -The user explicitly scoped this discussion to: - -- ABI/syscall alignment with the current `../runtime`; -- `FrameComposer` convergence for sprite composition; -- Studio-side propagation across `compiler`, `pbs`, and `stdlib`; -- `@sdk:composer` for the sprite-composition path; -- removal of the legacy `Gfx.set_sprite` entrypoint; -- no scene-bank implementation work in this ticket. - -## Context - -Domain owner: `studio` - -Primary affected subdomains: - -- `compiler/pbs` -- `studio` - -Expected propagation targets if this discussion closes: - -- `docs/specs/compiler-languages/pbs` -- `docs/specs/compiler` -- PBS stdlib resources under `prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/resources/stdlib` -- compiler/frontend/backend conformance tests -- Studio-adjacent examples and fixtures that still import `@sdk:gfx` for sprite composition - -Observed current state on 2026-04-18: - -- `../runtime` lesson `DSC-0026` locks `FrameComposer` as the canonical frame owner above the render backend. -- `../runtime` lesson `DSC-0027` locks the public VM-facing syscall ABI to `composer.bind_scene`, `composer.unbind_scene`, `composer.set_camera`, and `composer.emit_sprite`, and removes the legacy public `gfx.set_sprite` path. -- `../runtime` lesson `DSC-0028` keeps immediate/debug primitives such as `gfx.draw_text` outside canonical game composition as a deferred overlay path. -- this repository still ships `@sdk:gfx` with `LowGfx.set_sprite(...)` and `Gfx.set_sprite(...)`; -- this repository does not yet expose a reserved `@sdk:composer` module; -- docs and tests still use `@sdk:gfx` as the visible source surface for sprite composition. - -This creates architectural drift: - -- runtime public ownership says `composer.*` for frame composition; -- Studio-side language and stdlib surfaces still say `gfx.*` for part of that same behavior. - -The drift is specifically about syscall and sprite-composer alignment. - -Out of scope for this agenda: - -- `composer.bind_scene`, `composer.unbind_scene`, and `composer.set_camera` rollout in Studio; -- scene-bank authoring workflows; -- scene asset import/editor design; -- scene bank build/materialization contracts beyond what is minimally needed to name ABI boundaries; -- broader scene workspace/product decisions already separated into other discussions. - -## Open Questions - -- [x] Studio should expose a new reserved module `@sdk:composer` as the canonical public source surface for sprite composition. -- [x] `@sdk:gfx` should remain limited to primitive/overlay/back-end-adjacent operations once sprite composition moves out. -- [x] PBS should export `@sdk:composer` using the same source-level shape already used by `@sdk:gfx`: low-level host owner plus public service facade. -- [x] Mutating composer operations should remain raw `int` status returns in v1 for now. -- [x] Tests, fixtures, examples, and callsites should all migrate in this wave if possible; no compatibility path should be preserved. -- [x] No temporary compatibility alias is acceptable; `Gfx.set_sprite` should be removed completely. - -## Options - -### Option A - Introduce `@sdk:composer` now for sprite emission only in this wave -- **Approach:** Add a dedicated reserved stdlib module that exposes the sprite-composition path through `composer.emit_sprite`; migrate sprite composition calls, host metadata, docs, and tests to that module; keep `@sdk:gfx` for primitives/overlay-style operations only; defer Studio-side `bind_scene`, `unbind_scene`, and `set_camera`. -- **Pro:** Matches the runtime's canonical service boundary, preserves the split between frame composition and render primitives, and avoids teaching the retired `gfx.set_sprite` contract. -- **Con:** Introduces a partial first wave of the `composer` domain, so docs must be explicit that other composer operations are intentionally deferred rather than absent by accident. -- **Maintainability:** Strong, because the public source surface mirrors the actual runtime ABI and ownership model. - -### Option B - Keep `@sdk:gfx` as the user-facing module and only retarget its internals to `composer.*` -- **Approach:** Preserve the visible `Gfx.set_sprite` API in Studio while changing lowering metadata underneath to hit `composer.emit_sprite`. -- **Pro:** Smaller immediate source churn in examples and tests. -- **Con:** Encodes the wrong owner in the public teaching surface, preserves the exact dual-contract problem the runtime discussion just removed, and makes later cleanup harder. -- **Maintainability:** Weak, because it keeps historical naming instead of canonical service ownership. - -### Option C - Add `@sdk:composer` but retain temporary `Gfx.set_sprite` compatibility in parallel -- **Approach:** Introduce the new canonical module while leaving `Gfx.set_sprite` as an alias or transitional wrapper for one or more waves. -- **Pro:** Softens migration pressure for existing examples and downstream users. -- **Con:** Creates two public ways to express the same operation, invites drift in specs/tests/docs, and conflicts with the runtime lesson that legacy public fallbacks should be removed when they preserve the wrong model. -- **Maintainability:** Medium at best in the short term, poor in the long term if the alias survives longer than intended. - -## Discussion - -The runtime side has already made two architectural facts explicit: - -1. frame orchestration belongs to `FrameComposer`, not to `Gfx`; -2. the public syscall namespace must reflect that ownership. - -That means this repository is no longer choosing between equivalent naming styles. - -It is choosing whether Studio will: - -- align its source-facing contracts with the canonical runtime boundary; or -- preserve a legacy public façade that the runtime has already declared misleading. - -The user's scope also matters. - -This ticket is not asking for scene-bank product work, and it also is not asking for Studio-side scene binding or camera rollout. -So the migration target should stay narrow: - -- syscall/domain alignment; -- `@sdk:composer` surface alignment for sprite emission; -- compiler/PBS/stdlib propagation; -- tests and examples updated to stop asserting the retired path. -- removal of the old `Gfx.set_sprite` path. - -The remaining design work is therefore smaller and more concrete: - -- define the Studio-side shape of `@sdk:composer` for sprite emission; -- propagate `composer.emit_sprite` through stdlib, specs, compiler, and tests; -- keep the deferred composer calls explicitly out of this ticket so the repository does not accidentally mix sprite convergence with unfinished scene-facing rollout. - -The agenda questions are now resolved with explicit user direction: - -1. `@sdk:composer` should follow the same editorial pattern already used by `@sdk:gfx`, meaning a low-level host owner plus a public service facade. -2. `composer.emit_sprite` should continue returning a raw `int` status in this wave. -3. Migration should be broad and immediate across tests, fixtures, and examples where feasible. -4. `Gfx.set_sprite` should be removed entirely, with no compatibility alias or dual-path surface. -5. Specs should document only what this wave actually implements, while leaving room for `bind_scene`, `unbind_scene`, and `set_camera` to be added later using the same pattern. - -## Resolution - -Recommended direction: - -- adopt Option A as the working direction for this discussion; -- open a Studio-side canonical `@sdk:composer` surface aligned to the runtime ABI for sprite emission in this wave; -- retire `Gfx.set_sprite` from normative Studio-facing contracts instead of preserving a compatibility façade; -- defer `composer.bind_scene`, `composer.unbind_scene`, and `composer.set_camera` to a later ticket; -- keep scene-bank authoring/editor work explicitly out of this ticket; -- keep `@sdk:gfx` focused on primitive and overlay-style operations. - -Recommended next step: - -- treat the sprite-only `@sdk:composer` wave as the accepted scope of this agenda; -- write a decision that locks: - - `@sdk:composer` as the canonical Studio-side sprite-composition module; - - the `LowComposer` + `Composer` shape matching the established `@sdk:gfx` pattern; - - raw `int` status returns for this wave; - - complete removal of `Gfx.set_sprite` with no compatibility path; - - broad propagation across specs, stdlib, compiler, tests, fixtures, and examples; - - deferred addition of `bind_scene`, `unbind_scene`, and `set_camera` in later work. diff --git a/discussion/workflow/decisions/DEC-0027-studio-composer-sprite-syscall-alignment.md b/discussion/workflow/decisions/DEC-0027-studio-composer-sprite-syscall-alignment.md deleted file mode 100644 index fc216dac..00000000 --- a/discussion/workflow/decisions/DEC-0027-studio-composer-sprite-syscall-alignment.md +++ /dev/null @@ -1,158 +0,0 @@ ---- -id: DEC-0027 -ticket: studio-frame-composer-syscall-and-sprite-alignment -title: Studio MUST Adopt `@sdk:composer` for Sprite Composition and Remove `Gfx.set_sprite` -status: in_progress -created: 2026-04-18 -accepted: 2026-04-18 -agenda: AGD-0031 -plans: - - PLN-0053 - - PLN-0054 - - PLN-0055 -tags: - - studio - - compiler - - pbs - - stdlib - - runtime-alignment - - abi - - syscall - - frame-composer - - sprites ---- - -## Context - -O `../runtime` já convergiu a ownership pública de frame orchestration para `FrameComposer` e já publicou a ABI pública correspondente no domínio `composer.*`. - -Para o recorte desta discussão, o ponto normativo relevante é simples: - -- sprite composition não pertence mais ao domínio público `gfx.*`; -- o caminho público legado `gfx.set_sprite` já não representa o owner canônico no runtime; -- o Studio ainda expõe esse caminho legado em stdlib, specs, testes, fixtures e exemplos. - -Isso cria drift entre: - -- a ABI pública real do runtime; -- o contrato que o Studio ensina e emite; -- a superfície que PBS usa como owner visível para composição de sprites. - -O usuário fechou explicitamente o escopo desta decisão: - -- entra apenas a wave de `@sdk:composer` para sprite composition; -- entra `composer.emit_sprite`; -- entra remoção total de `Gfx.set_sprite`; -- `composer.bind_scene`, `composer.unbind_scene` e `composer.set_camera` ficam para trabalho posterior; -- scene bank e concerns de authoring/editor ficam fora deste ticket. - -## Decision - -O Studio MUST adotar `@sdk:composer` como a superfície canônica de stdlib/PBS para sprite composition nesta wave. - -Mais especificamente: - -1. A operação pública de composição de sprites MUST ser exposta por `composer.emit_sprite`. -2. O módulo reservado `@sdk:composer` MUST seguir o mesmo shape editorial hoje usado por `@sdk:gfx`: - - um owner host de baixo nível `LowComposer`; - - uma façade pública `Composer`. -3. Nesta wave, o contrato de retorno de `composer.emit_sprite` MUST permanecer um `int` cru. -4. `Gfx.set_sprite` MUST ser removido integralmente da superfície normativa e executável do Studio. -5. O repositório MUST NOT manter alias, wrapper de compatibilidade, dual path, ou retargeting silencioso que preserve `Gfx.set_sprite` como API pública. -6. `@sdk:gfx` MUST permanecer restrito às operações primitivas/overlay/backend-adjacent que continuarem pertencendo a esse domínio. -7. `composer.bind_scene`, `composer.unbind_scene` e `composer.set_camera` MUST permanecer fora do escopo de implementação desta decisão e SHALL ser adicionados depois por propagação separada, usando o mesmo padrão editorial. - -## Rationale - -Esta decisão existe para eliminar um dual contract arquitetural que já deixou de ser válido no runtime. - -Manter `Gfx.set_sprite` como superfície pública teria três efeitos ruins: - -- preservaria o owner errado no contrato ensinado por PBS/stdlib; -- manteria dois modelos mentais concorrentes para a mesma operação; -- empurraria a remoção real do legado para um momento futuro mais caro e mais difícil. - -O recorte sprite-only é deliberado. - -Ele permite alinhar imediatamente a parte já necessária para o pipeline atual sem misturar: - -- rollout de scene binding; -- rollout de camera control; -- ou trabalho de scene bank/editoria de assets. - -Também ficou decidido que esta wave não tentará resolver modelagem de status com tipos editoriais novos. -O retorno cru `int` é suficiente para convergir o boundary agora, sem introduzir uma segunda mudança de API no mesmo passo. - -## Technical Specification - -### 1. Stdlib Surface - -O repositório MUST introduzir um módulo reservado `@sdk:composer`. - -Esse módulo MUST: - -- declarar `LowComposer` com metadata canônica `Host(module = "composer", name = "emit_sprite", version = 1)`; -- declarar a capability canônica correspondente; -- expor `Composer.emit_sprite(...)` como façade pública; -- usar o mesmo padrão estrutural já adotado por `@sdk:gfx`. - -O repositório MUST remover de `@sdk:gfx`: - -- a declaração host `LowGfx.set_sprite(...)`; -- a façade pública `Gfx.set_sprite(...)`; -- qualquer export relacionado à operação pública antiga. - -### 2. Compiler and PBS Propagation - -As specs e implementações de PBS/compiler MUST passar a tratar `@sdk:composer` como a superfície canônica para sprite composition. - -Isso inclui: - -- examples normativos; -- exemplos de import; -- resolução de stdlib; -- fixtures e testes que verificam host metadata; -- testes que hoje afirmam `LowGfx`/`Gfx.set_sprite`. - -O lowering MUST emitir identidade canônica de host do domínio `composer`, não do domínio `gfx`, para sprite emission nesta wave. - -### 3. Removal Rule - -`Gfx.set_sprite` MUST ser tratado como removido, não como deprecated. - -Consequências obrigatórias: - -- código de teste antigo que use `Gfx.set_sprite` MUST ser migrado; -- fixtures e sample projects SHOULD ser migrados integralmente nesta wave sempre que estiverem dentro do repositório; -- docs MUST deixar de ensinar `Gfx.set_sprite` como caminho válido; -- a implementação MUST NOT deixar fallback oculto para o caminho antigo. - -### 4. Documentation Scope - -As specs MUST documentar exatamente o que esta wave implementa: - -- `@sdk:composer` para sprite emission; -- remoção de `Gfx.set_sprite`; -- permanência de `@sdk:gfx` para primitivas/overlay relevantes. - -As specs MUST NOT fingir que scene binding ou camera control já fazem parte desta wave no Studio. - -Elas MAY mencionar que: - -- `bind_scene`, -- `unbind_scene`, -- `set_camera` - -serão adicionados depois seguindo o mesmo padrão, mas sem tratá-los como parte implementada agora. - -## Constraints - -- Esta decisão MUST ser tratada como normativa e locked até revisão explícita do usuário. -- Qualquer `plan` derivado dela MUST cobrir integralmente a criação de `@sdk:composer`, a propagação para specs/compiler/tests e a remoção total de `Gfx.set_sprite`. -- Nenhum `plan` ou `implement` pode reinterpretar esta decisão como “migrar só internamente” mantendo a API pública antiga. -- Nenhum `plan` ou `implement` pode puxar scene bank, bind/unbind de scene ou camera para dentro deste ticket por conveniência. -- Se surgir ambiguidade sobre assinatura exata de `emit_sprite`, capability metadata, ou pontos concretos de propagação, o próximo estágio MUST esclarecer isso sem reabrir a remoção total do caminho antigo. - -## Revision Log - -- 2026-04-18: Initial accepted decision from AGD-0031. diff --git a/discussion/workflow/plans/PLN-0053-composer-spec-and-stdlib-surface.md b/discussion/workflow/plans/PLN-0053-composer-spec-and-stdlib-surface.md deleted file mode 100644 index 59991cfa..00000000 --- a/discussion/workflow/plans/PLN-0053-composer-spec-and-stdlib-surface.md +++ /dev/null @@ -1,136 +0,0 @@ ---- -id: PLN-0053 -ticket: studio-frame-composer-syscall-and-sprite-alignment -title: Composer Spec and Stdlib Surface for Sprite Emission -status: review -created: 2026-04-18 -completed: -tags: - - studio - - compiler - - pbs - - stdlib - - specs - - composer - - sprites ---- - -## Objective - -Introduce the canonical `@sdk:composer` sprite-emission surface and remove `Gfx.set_sprite` from the normative stdlib/spec contract, exactly as required by `DEC-0027`. - -## Background - -The runtime already moved public frame composition ownership to `composer.*` and removed the legacy public `gfx.set_sprite` path. This repository still teaches and packages sprite composition through `@sdk:gfx`, which creates ABI drift between runtime ownership and Studio-facing source surfaces. - -`DEC-0027` locks the following requirements for this wave: - -- `@sdk:composer` is the canonical Studio-side module for sprite composition. -- The source shape must mirror the existing `@sdk:gfx` pattern: `LowComposer` plus public `Composer`. -- `composer.emit_sprite` keeps a raw `int` return for now. -- `Gfx.set_sprite` must be removed completely. -- `bind_scene`, `unbind_scene`, and `set_camera` remain out of scope. - -## Scope - -### Included -- Add `stdlib/1/sdk/composer/main.pbs`. -- Add `stdlib/1/sdk/composer/mod.barrel`. -- Remove `set_sprite` from `stdlib/1/sdk/gfx/main.pbs`. -- Update stdlib/spec documentation to name `@sdk:composer` as the canonical sprite-composition surface. -- Document that scene/camera composer calls are deferred and not part of this wave. - -### Excluded -- Compiler implementation changes beyond what is necessary to consume the new stdlib files. -- Test fixture migration outside of spec/stdlib-focused assertions. -- Runtime changes in `../runtime`. -- Scene binding, scene unbinding, camera APIs, and scene-bank work. - -## Execution Steps - -### Step 1 - Add the reserved `@sdk:composer` module - -**What:** -Create the reserved stdlib module for sprite emission. - -**How:** -Add a new `sdk/composer` directory that follows the established reserved-module layout. Define `LowComposer.emit_sprite(...)` with canonical host metadata `Host(module = "composer", name = "emit_sprite", version = 1)` and the canonical capability metadata. Define a public `Composer.emit_sprite(...)` service method that forwards to `LowComposer`. - -**File(s):** -- `prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/resources/stdlib/1/sdk/composer/main.pbs` -- `prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/resources/stdlib/1/sdk/composer/mod.barrel` - -### Step 2 - Remove the old public sprite path from `@sdk:gfx` - -**What:** -Delete the legacy `set_sprite` public path from the GFX stdlib module. - -**How:** -Remove the `LowGfx.set_sprite(...)` host declaration, remove the `Gfx.set_sprite(...)` service method, and leave the remaining primitive/overlay-oriented GFX surface intact. - -**File(s):** -- `prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/resources/stdlib/1/sdk/gfx/main.pbs` -- `prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/resources/stdlib/1/sdk/gfx/mod.barrel` if export adjustments become necessary - -### Step 3 - Update PBS stdlib and host-binding specs - -**What:** -Rewrite the normative docs so they stop teaching sprite composition through `@sdk:gfx`. - -**How:** -Update the PBS specs that describe reserved stdlib modules, interface-module examples, host-binding examples, and logical stdlib mapping. Add `@sdk:composer` to the reserved-module inventory and update examples that currently import `Gfx` for host-backed illustration when those examples are used to explain sprite composition or SDK host ownership. Document that this wave covers only sprite emission, while scene/camera composer members are deferred. - -**File(s):** -- `docs/specs/compiler-languages/pbs/5. Manifest, Stdlib, and SDK Resolution Specification.md` -- `docs/specs/compiler-languages/pbs/6.2. Host ABI Binding and Loader Resolution Specification.md` -- `docs/specs/compiler-languages/pbs/8. Stdlib Environment Packaging and Loading Specification.md` -- `docs/specs/compiler/18. Standard Library Surface Specification.md` -- Any additional compiler/PBS spec file whose examples currently name `Gfx.set_sprite` as canonical - -### Step 4 - Align syntax/interface examples with the new owner - -**What:** -Remove spec examples that preserve the old mental model for sprite composition. - -**How:** -Review interface-module and host-declaration examples in the PBS syntax/spec set. Keep `gfx` examples where they demonstrate primitives generically, but change any sprite-composition-oriented illustration to `composer` so the docs no longer imply that `gfx` owns frame-composition policy. - -**File(s):** -- `docs/specs/compiler-languages/pbs/3. Core Syntax Specification.md` -- `docs/specs/compiler-languages/pbs/5. Manifest, Stdlib, and SDK Resolution Specification.md` -- `docs/specs/compiler-languages/pbs/6.2. Host ABI Binding and Loader Resolution Specification.md` - -## Test Requirements - -### Unit Tests - -- Add or update stdlib-loading tests so `@sdk:composer` resolves successfully. -- Add or update PBS SDK-interface tests so `LowComposer` and `Composer.emit_sprite(...)` are part of the reserved stdlib contract. - -### Integration Tests - -- Existing compiler/frontend integration tests that load the stdlib must pass with the new module present and the old sprite path removed. - -### Manual Verification - -- Inspect the generated stdlib resource tree and confirm `sdk/composer` is present and `sdk/gfx` no longer exposes `set_sprite`. -- Read the updated spec sections and confirm they document only sprite emission for this wave and explicitly defer scene/camera composer calls. - -## Acceptance Criteria - -- [ ] `@sdk:composer` exists under stdlib line `1` with `LowComposer` and `Composer`. -- [ ] `Composer.emit_sprite(...)` uses canonical host metadata for `("composer", "emit_sprite", 1)`. -- [ ] `@sdk:gfx` no longer exposes `set_sprite`. -- [ ] PBS/compiler specs name `@sdk:composer` as the canonical sprite-composition surface. -- [ ] Specs do not claim that `bind_scene`, `unbind_scene`, or `set_camera` are part of this wave. - -## Dependencies - -- Depends directly on `DEC-0027`. -- Should complete before broad compiler/test/example migration so downstream work can reference the final stdlib surface. - -## Risks - -- Spec examples may accidentally over-generalize `composer` and imply that deferred scene/camera members are already available. -- Removing `set_sprite` from `@sdk:gfx` may break more frontend tests than expected if hidden fixtures still import the old API. -- If capability metadata or parameter shape drifts from runtime expectations, later compiler/test work will encode the wrong ABI under a new module name. diff --git a/discussion/workflow/plans/PLN-0054-composer-compiler-and-conformance-migration.md b/discussion/workflow/plans/PLN-0054-composer-compiler-and-conformance-migration.md deleted file mode 100644 index f8a17ad4..00000000 --- a/discussion/workflow/plans/PLN-0054-composer-compiler-and-conformance-migration.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -id: PLN-0054 -ticket: studio-frame-composer-syscall-and-sprite-alignment -title: Compiler, Frontend, and Conformance Migration to `composer.emit_sprite` -status: review -created: 2026-04-18 -completed: -tags: - - studio - - compiler - - pbs - - conformance - - composer - - sprites ---- - -## Objective - -Migrate compiler/frontend/conformance behavior from the retired `Gfx.set_sprite` path to the canonical `Composer.emit_sprite` path, with no compatibility fallback. - -## Background - -Once the stdlib and spec surface move to `@sdk:composer`, the compiler and frontend test suite must stop asserting `LowGfx.set_sprite` metadata and `Gfx.set_sprite` callsites. `DEC-0027` forbids internal retargeting that preserves the old public API, so the implementation and conformance layers must change the visible source contract as well as the lowered host identity. - -## Scope - -### Included -- Update PBS frontend tests that import `@sdk:gfx` for sprite composition. -- Update SDK-interface and host-metadata assertions from `LowGfx`/`set_sprite` to `LowComposer`/`emit_sprite`. -- Update any compiler-side conformance or bytecode expectations that observe host declaration metadata for sprite emission. -- Add regression coverage that proves sprite emission lowers to the `composer` host identity and that `Gfx.set_sprite` is no longer available. - -### Excluded -- Repository sample project migration outside compiler-facing fixtures. -- Runtime behavior changes in `../runtime`. -- Scene/camera composer APIs. - -## Execution Steps - -### Step 1 - Update frontend phase tests to the new imports and calls - -**What:** -Rewrite PBS frontend phase coverage that still imports `Gfx` for sprite composition. - -**How:** -Replace sprite-oriented `import { Gfx } from @sdk:gfx;` snippets with `import { Composer } from @sdk:composer;` where the test is validating sprite composition. Rewrite callsites from `Gfx.set_sprite(...)` to `Composer.emit_sprite(...)`. Keep pure primitive tests on `@sdk:gfx` unchanged. - -**File(s):** -- `prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/services/PBSFrontendPhaseServiceTest.java` - -### Step 2 - Update SDK-interface and reserved-stdlib conformance assertions - -**What:** -Make reserved-stdlib conformance assert the new module and owner names. - -**How:** -Change assertions that currently look for `LowGfx` or `set_sprite` so they instead require `LowComposer` and `emit_sprite`. Add direct reserved-import coverage for `@sdk:composer`. - -**File(s):** -- `prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/pbs/PbsGateUSdkInterfaceConformanceTest.java` -- `prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/pbs/stdlib/InterfaceModuleLoaderTest.java` if loader coverage is needed for the new module - -### Step 3 - Update parser/semantic/linking fixtures only where the visible SDK surface changes - -**What:** -Remove stale assumptions that the sprite path belongs to `Gfx`. - -**How:** -Inspect PBS parser, semantic, linking, and diagnostics tests that rely on concrete stdlib imports or host owners. Migrate only the cases that directly encode sprite composition or reserved-SDK examples for this operation. Do not churn unrelated `gfx` primitive tests. - -**File(s):** -- `prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/pbs/linking/...` -- `prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/pbs/semantics/...` -- `prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/pbs/...` - -### Step 4 - Add conformance coverage for removal of the old API - -**What:** -Prove that the old public path is gone. - -**How:** -Add negative coverage that user code importing `@sdk:gfx` can no longer call `set_sprite`, and positive coverage that sprite emission lowers through the `composer` host identity with the expected raw `int` return shape. - -**File(s):** -- `prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/services/PBSFrontendPhaseServiceTest.java` -- `prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/pbs/PbsGateUSdkInterfaceConformanceTest.java` - -## Test Requirements - -### Unit Tests - -- PBS frontend tests must assert `LowComposer` host ownership for sprite emission. -- SDK-interface tests must assert that `@sdk:composer` resolves and exports the expected surface. -- Negative tests must confirm `Gfx.set_sprite` is no longer admitted. - -### Integration Tests - -- Compiler integration/conformance tests that inspect host declarations or emitted syscalls must pass with `composer.emit_sprite`. -- Any existing lower-to-host assertion must prove the canonical identity is `("composer", "emit_sprite", 1)`. - -### Manual Verification - -- Run focused test subsets around PBS frontend/stdlib loading and inspect failures for any remaining `LowGfx`/`set_sprite` assumptions. -- Review changed tests and confirm `@sdk:gfx` is still used only for primitive-oriented cases. - -## Acceptance Criteria - -- [ ] No compiler/frontend conformance test still asserts `LowGfx.set_sprite` or `Gfx.set_sprite`. -- [ ] Positive coverage exists for `Composer.emit_sprite(...)` lowering. -- [ ] Negative coverage exists for removal of `Gfx.set_sprite`. -- [ ] Primitive-oriented `@sdk:gfx` tests remain intact and are not accidentally migrated to `composer`. - -## Dependencies - -- Depends on `PLN-0053` establishing the canonical stdlib surface. -- Depends directly on `DEC-0027`. - -## Risks - -- Broad test churn can accidentally rewrite legitimate primitive-oriented `gfx` tests that should stay unchanged. -- If negative coverage is omitted, hidden compatibility behavior could survive behind updated positive tests. -- If host metadata assertions are updated inconsistently, compiler conformance may appear green while still teaching mixed ownership in fixtures. diff --git a/discussion/workflow/plans/PLN-0055-composer-fixtures-examples-and-repo-cleanup.md b/discussion/workflow/plans/PLN-0055-composer-fixtures-examples-and-repo-cleanup.md deleted file mode 100644 index 969d303f..00000000 --- a/discussion/workflow/plans/PLN-0055-composer-fixtures-examples-and-repo-cleanup.md +++ /dev/null @@ -1,120 +0,0 @@ ---- -id: PLN-0055 -ticket: studio-frame-composer-syscall-and-sprite-alignment -title: Repository Fixtures, Examples, and Cleanup for Composer Sprite Migration -status: review -created: 2026-04-18 -completed: -tags: - - studio - - examples - - fixtures - - lsp - - composer - - sprites ---- - -## Objective - -Remove repository-visible usage of `Gfx.set_sprite` and migrate examples, fixtures, and supporting tests to the new `@sdk:composer` sprite path. - -## Background - -`DEC-0027` requires broad propagation across tests, fixtures, and examples, with no compatibility path. Even after stdlib/spec/compiler work lands, stale sample code or support fixtures would continue teaching the retired API and could hide incomplete migration. - -## Scope - -### Included -- Migrate repository sample projects that still call `Gfx.set_sprite`. -- Update LSP or support fixtures that rely on reserved SDK import examples where the new module is more appropriate. -- Sweep repository-owned callsites for stale references to the old sprite path. -- Add or update verification to ensure no repository-visible `Gfx.set_sprite` usage remains. - -### Excluded -- Third-party or external downstream projects outside this repository. -- Runtime test suites in `../runtime`. -- New scene/camera composer scenarios. - -## Execution Steps - -### Step 1 - Migrate sample projects to `@sdk:composer` - -**What:** -Rewrite repository examples that still use the old sprite path. - -**How:** -Update `test-projects/main` to import `Composer` from `@sdk:composer` and replace all `Gfx.set_sprite(...)` calls with `Composer.emit_sprite(...)`. Keep `Gfx` imports only for the remaining primitive calls such as `clear(...)`. Review `test-projects/fragments` and migrate only if it contains sprite-composition examples or should demonstrate the new reserved module inventory. - -**File(s):** -- `test-projects/main/src/main.pbs` -- `test-projects/fragments/src/main.pbs` - -### Step 2 - Update LSP/import fixtures where the reserved SDK inventory is exercised - -**What:** -Keep non-compiler support tests aligned with the new reserved-module set. - -**How:** -Review LSP fixtures that use `@sdk:gfx` imports as representative SDK examples. Leave primitive-oriented examples intact when they are still valid, but add or switch coverage where the test should reflect the new reserved `@sdk:composer` module being part of the environment. - -**File(s):** -- `prometeu-lsp/prometeu-lsp-v1/src/test/java/p/studio/lsp/LspServiceImplTest.java` - -### Step 3 - Run a repository sweep for stale public sprite references - -**What:** -Ensure the old API is not still visible in repository-owned artifacts. - -**How:** -Search for `Gfx.set_sprite`, `LowGfx.set_sprite`, and sprite-specific `@sdk:gfx` examples. Remove or migrate every repository-owned occurrence that is part of the normative surface, examples, fixtures, or tests. Keep pure `@sdk:gfx` primitive usage where it remains valid. - -**File(s):** -- `docs/**` -- `prometeu-compiler/**` -- `prometeu-lsp/**` -- `test-projects/**` - -### Step 4 - Add final regression verification for no-compat policy - -**What:** -Create a final gate that makes legacy leakage easy to detect. - -**How:** -Add or document a repository grep-based verification step in the execution notes or test workflow so implementation can confirm there are no remaining repository-owned `Gfx.set_sprite` references once the migration is complete. - -**File(s):** -- Verification notes in the implementation PR or relevant test documentation - -## Test Requirements - -### Unit Tests - -- Any support or fixture tests touched by the migration must continue to pass with the new imports. - -### Integration Tests - -- Repository sample projects used by compiler or integration flows must build/analyze successfully after migration. - -### Manual Verification - -- Run a repository-wide search for `Gfx.set_sprite` and verify zero remaining repository-owned hits. -- Run a repository-wide search for sprite-specific `@sdk:gfx` examples and verify they were either migrated or intentionally retained only for primitive usage. - -## Acceptance Criteria - -- [ ] Repository sample code no longer uses `Gfx.set_sprite`. -- [ ] No repository-owned fixture or example teaches the retired public sprite API. -- [ ] Any retained `@sdk:gfx` usage is primitive/overlay-oriented rather than sprite-composition-oriented. -- [ ] A repeatable verification step exists to confirm no-compat cleanup. - -## Dependencies - -- Depends on `PLN-0053` for the final stdlib surface. -- Depends on `PLN-0054` for compiler/frontend acceptance of the new imports and calls. -- Depends directly on `DEC-0027`. - -## Risks - -- Repository examples may mix primitive and sprite usage, making partial migration easy to miss. -- LSP fixtures may not strictly require composer coverage, so the cleanup can be under-scoped unless reviewed deliberately. -- Without a final sweep, legacy references can survive in docs or examples even after tests pass.