@thibezer/ui-components-kit 2.12.4 → 2.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +668 -639
- package/dist/camadas.cjs +106 -106
- package/dist/camadas.js +1341 -1023
- package/dist/canvas.cjs +31 -31
- package/dist/canvas.js +1946 -1806
- package/dist/components/ui-camadas/camadas-arraste-controles.d.ts +2 -1
- package/dist/components/ui-camadas/camadas-atualizacao-incremental.d.ts +24 -0
- package/dist/components/ui-camadas/camadas-colecao.d.ts +3 -1
- package/dist/components/ui-camadas/camadas-drag-drop.d.ts +10 -0
- package/dist/components/ui-camadas/camadas-eventos-arvore.d.ts +5 -0
- package/dist/components/ui-camadas/camadas-eventos-camadas.d.ts +2 -0
- package/dist/components/ui-camadas/camadas-linha-feicao.d.ts +29 -0
- package/dist/components/ui-camadas/camadas-render.d.ts +8 -1
- package/dist/components/ui-camadas/camadas-renomear.d.ts +2 -1
- package/dist/components/ui-camadas/camadas-sincronizacao-dom.d.ts +5 -0
- package/dist/components/ui-camadas/tipos.d.ts +37 -0
- package/dist/components/ui-camadas/ui-camadas.d.ts +11 -2
- package/dist/components/ui-canvas-cad/ui-canvas-cad.d.ts +13 -0
- package/dist/custom-elements.json +16951 -16143
- package/dist/gerencigeo-canvas/motor/motor-formas.d.ts +10 -0
- package/dist/gerencigeo-canvas/qualidade.d.ts +52 -0
- package/dist/gerencigeo-canvas/renderers/canvas_formas_leaflet.d.ts +11 -0
- package/dist/gerencigeo-canvas/renderers/renderizador_formas.d.ts +3 -0
- package/dist/gerencigeo-canvas/renderers/tile_renderer.d.ts +1 -1
- package/dist/gerencigeo-canvas/types.d.ts +2 -0
- package/dist/motor-By2te6PZ.js +1400 -0
- package/dist/motor-CkMxd378.cjs +1 -0
- package/dist/motor.cjs +1 -1
- package/dist/motor.js +1 -1
- package/dist/tipos-elementos.d.ts +1 -0
- package/dist/tipos-vue.d.ts +1 -0
- package/package.json +1 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { CamadasHostCompleto } from './camadas-host';
|
|
2
2
|
/** Cancela o gesto do `host`, soltando os ouvintes de `window` e devolvendo `user-select` ao `body`. */
|
|
3
3
|
export declare function cancelarArrasteControles(host: CamadasHostCompleto): void;
|
|
4
|
-
|
|
4
|
+
/** Liga o arraste sobre os controles dentro de `raiz` (padrão: o painel todo; na atualização incremental, só as linhas novas). */
|
|
5
|
+
export declare function conectarArrasteControles(host: CamadasHostCompleto, shadow: ShadowRoot, raiz?: ParentNode): void;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { CamadaItem, DecisaoAtualizacao, EntradaDecisaoIncremental, FeicaoItem, MudancaFeicoes } from './tipos';
|
|
2
|
+
/** O que a atualização incremental lê do painel. */
|
|
3
|
+
export interface HostIncremental {
|
|
4
|
+
camadas: CamadaItem[];
|
|
5
|
+
feicoes: FeicaoItem[];
|
|
6
|
+
selectedFeatureIds: Set<string>;
|
|
7
|
+
expandedFeatureLimits: ReadonlyMap<string, number>;
|
|
8
|
+
editingLayerId: string | null;
|
|
9
|
+
editingFeatureId: string | null;
|
|
10
|
+
activeSettingsLayerId: string | null;
|
|
11
|
+
searchQuery: string;
|
|
12
|
+
}
|
|
13
|
+
/** Liga os eventos dos elementos novos dentro de `raiz` (só deles: nunca religa linhas existentes). */
|
|
14
|
+
export type LigarElementos = (raiz: ParentNode) => void;
|
|
15
|
+
/**
|
|
16
|
+
* Decide se a mutação pode ser aplicada só nas linhas afetadas. Função pura: qualquer dúvida sobre o que o
|
|
17
|
+
* render completo produziria (busca, edição inline, drawer, camada fora da árvore, ids repetidos) vira fallback.
|
|
18
|
+
*/
|
|
19
|
+
export declare function decidirAtualizacao(entrada: EntradaDecisaoIncremental): DecisaoAtualizacao;
|
|
20
|
+
/**
|
|
21
|
+
* Aplica a mudança de feições só nas linhas afetadas. Devolve `false` quando não pôde garantir o mesmo
|
|
22
|
+
* resultado do render completo (o chamador então redesenha o painel inteiro, o que também corrige o DOM).
|
|
23
|
+
*/
|
|
24
|
+
export declare function tentarAtualizacaoIncremental(host: HostIncremental, shadow: ShadowRoot, mudanca: MudancaFeicoes, ligar: LigarElementos): boolean;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CamadaItem, FeicaoItem } from './tipos';
|
|
1
|
+
import { CamadaItem, FeicaoItem, MudancaFeicoes } from './tipos';
|
|
2
2
|
import { LembrancaCamadas } from './camadas-lembranca';
|
|
3
3
|
/** Estado e ações do painel que as coleções usam. */
|
|
4
4
|
export interface HostColecao {
|
|
@@ -15,6 +15,8 @@ export interface HostColecao {
|
|
|
15
15
|
getAttribute(nome: string): string | null;
|
|
16
16
|
salvarLembrancaEstado(): void;
|
|
17
17
|
solicitarRenderizacao(): void;
|
|
18
|
+
/** Mutação de feição: atualiza só as linhas afetadas quando possível (ver `UICamadas`). */
|
|
19
|
+
solicitarAtualizacaoFeicoes(mudanca: MudancaFeicoes): void;
|
|
18
20
|
}
|
|
19
21
|
/** Transforma a árvore (`children`) em lista plana, herdando `parentId` do pai quando não informado. */
|
|
20
22
|
export declare function achatarCamadas(camadas: CamadaItem[], parentId?: string | null, visitados?: Set<string>): CamadaItem[];
|
|
@@ -15,6 +15,11 @@ export declare class CamadasDragDropManager {
|
|
|
15
15
|
private shadow;
|
|
16
16
|
/** Cancela um arraste por toque em andamento (remove os ouvintes de `window`). */
|
|
17
17
|
private cancelarToque;
|
|
18
|
+
/**
|
|
19
|
+
* Arraste HTML5 em andamento. Fica no gerenciador (e não numa closure de `bindDragAndDrop`) para que linhas
|
|
20
|
+
* ligadas depois, na atualização incremental, enxerguem o arraste iniciado numa linha mais antiga.
|
|
21
|
+
*/
|
|
22
|
+
private arraste;
|
|
18
23
|
constructor(host: UICamadasHost, shadow: ShadowRoot);
|
|
19
24
|
bindAll(): void;
|
|
20
25
|
/** Solta o que ficou em `window` (arraste por toque interrompido pela desconexão do componente). */
|
|
@@ -27,7 +32,12 @@ export declare class CamadasDragDropManager {
|
|
|
27
32
|
/** Camada travada (ou sob grupo travado) não recebe nem perde feições pelo arraste. */
|
|
28
33
|
private trocaEntreCamadasTravada;
|
|
29
34
|
private arrasteBloqueado;
|
|
35
|
+
/** Render completo: zera o arraste e liga camadas e feições do painel todo. */
|
|
30
36
|
bindDragAndDrop(): void;
|
|
37
|
+
/** Atualização incremental: liga renomear e arraste só nas linhas de feição novas dentro de `raiz`. */
|
|
38
|
+
bindLinhasFeicao(raiz: ParentNode): void;
|
|
39
|
+
private vincularArrasteCamadas;
|
|
40
|
+
private vincularArrasteFeicoes;
|
|
31
41
|
/**
|
|
32
42
|
* Suporte a arraste por toque e ponteiro no handle (.ui-col-drag) para tablets e mobile.
|
|
33
43
|
* Os ouvintes de `window` existem só durante o gesto e são soltos em `destruir()`.
|
|
@@ -1,2 +1,7 @@
|
|
|
1
1
|
import { CamadasHostCompleto } from './camadas-host';
|
|
2
|
+
/**
|
|
3
|
+
* Liga os eventos das linhas de feição que estão dentro de `raiz` (a árvore toda, no render completo; só as
|
|
4
|
+
* linhas novas, na atualização incremental, para nunca duplicar listeners em linhas existentes).
|
|
5
|
+
*/
|
|
6
|
+
export declare function conectarEventosFeicoes(host: CamadasHostCompleto, raiz: ParentNode): void;
|
|
2
7
|
export declare function conectarEventosArvore(host: CamadasHostCompleto, shadow: ShadowRoot): void;
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { CamadasHostCompleto } from './camadas-host';
|
|
2
2
|
export declare function conectarEventosCamadas(host: CamadasHostCompleto, shadow: ShadowRoot): void;
|
|
3
|
+
/** Botão "Mostrar mais" do aviso de truncamento (paginação incremental das feições de uma camada). */
|
|
4
|
+
export declare function conectarMostrarMais(host: CamadasHostCompleto, raiz: ParentNode): void;
|
|
3
5
|
/** Mantém o ícone do botão "expandir/recolher todas" coerente com o estado individual das camadas */
|
|
4
6
|
export declare function atualizarIconeExpansaoGlobal(host: CamadasHostCompleto, shadow: ShadowRoot): void;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { CamadaItem, FeicaoItem } from './tipos';
|
|
2
|
+
import { EstadoHerdadoCamada } from './camadas-hierarquia';
|
|
3
|
+
/** O que a linha de uma feição herda da camada onde ela está. */
|
|
4
|
+
export interface ContextoLinhaFeicao {
|
|
5
|
+
/** `id` da camada, já escapado para atributo HTML. */
|
|
6
|
+
camadaIdSeguro: string;
|
|
7
|
+
/** Cor da camada, sanitizada (fallback da cor da feição). */
|
|
8
|
+
corCamada: string;
|
|
9
|
+
/** Profundidade da camada na hierarquia (a feição fica um nível abaixo). */
|
|
10
|
+
profundidade: number;
|
|
11
|
+
/** Camada oculta ou sob grupo oculto: a linha fica esmaecida. */
|
|
12
|
+
esmaecida: boolean;
|
|
13
|
+
/** Camada travada ou sob grupo travado: o cadeado da feição não pode ser alterado. */
|
|
14
|
+
travadaPelaCamada: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare function criarContextoLinhaFeicao(camada: CamadaItem, profundidade: number, heranca: EstadoHerdadoCamada | undefined): ContextoLinhaFeicao;
|
|
17
|
+
/** Título do chip de contagem: total do ramo e, num grupo, quanto é da própria camada. */
|
|
18
|
+
export declare function tituloContagem(totalRamo: number, proprias: number, subcamadas: number): string;
|
|
19
|
+
/** Chip com o total de feições do ramo; vazio num grupo sem feições. */
|
|
20
|
+
export declare function renderizarChipContagem(totalRamo: number, proprias: number, subcamadas: number, ehGrupo: boolean): string;
|
|
21
|
+
/** Textos do aviso "Exibindo X de Y", compartilhados pelo HTML e pela atualização no lugar. */
|
|
22
|
+
export declare function textosAvisoTruncamento(exibidas: number, total: number): {
|
|
23
|
+
resumo: string;
|
|
24
|
+
botao: string;
|
|
25
|
+
};
|
|
26
|
+
export declare function renderizarAvisoTruncamento(camadaIdSeguro: string, exibidas: number, total: number): string;
|
|
27
|
+
export declare function renderizarLinhaVazia(ehGrupo: boolean): string;
|
|
28
|
+
export declare function mesmaLinhaFeicao(a: FeicaoItem, b: FeicaoItem): boolean;
|
|
29
|
+
export declare function renderizarLinhaFeicao(feat: FeicaoItem, ctx: ContextoLinhaFeicao, selecionada: boolean, editando: boolean): string;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { MapaBaseItem } from './tipos';
|
|
1
|
+
import { MapaBaseItem, MudancaFeicoes } from './tipos';
|
|
2
2
|
import { CamadasHostCompleto } from './camadas-host';
|
|
3
3
|
import { CamadasDragDropManager } from './camadas-drag-drop';
|
|
4
4
|
/** O que a renderização lê do componente (além do contrato de eventos). */
|
|
@@ -12,4 +12,11 @@ export interface HostRenderizavel extends CamadasHostCompleto {
|
|
|
12
12
|
readonly mostrarRodape: boolean;
|
|
13
13
|
getAttribute(nome: string): string | null;
|
|
14
14
|
}
|
|
15
|
+
/** Troca uma <img> de miniatura que não carregou pelo mesmo placeholder usado por "Sem Mapa". */
|
|
16
|
+
export declare function substituirMiniaturaQuebrada(img: HTMLImageElement): void;
|
|
15
17
|
export declare function renderizarPainel(host: HostRenderizavel, shadow: ShadowRoot, corpo: HTMLElement, dragDrop: CamadasDragDropManager): void;
|
|
18
|
+
/**
|
|
19
|
+
* Tenta atualizar só as linhas de feição afetadas pela `mudanca`, sem tocar no resto do painel (foco, scroll e
|
|
20
|
+
* listeners das linhas existentes ficam como estão). Devolve `false` quando o chamador deve redesenhar tudo.
|
|
21
|
+
*/
|
|
22
|
+
export declare function renderizarFeicoesIncremental(host: HostRenderizavel, shadow: ShadowRoot, dragDrop: CamadasDragDropManager, mudanca: MudancaFeicoes): boolean;
|
|
@@ -9,4 +9,5 @@ export interface HostRenomear {
|
|
|
9
9
|
dispararEvento(nome: string, detalhe: unknown): void;
|
|
10
10
|
salvarLembrancaEstado?(): void;
|
|
11
11
|
}
|
|
12
|
-
|
|
12
|
+
/** Liga o duplo clique de renomear nos nomes dentro de `raiz` (padrão: o painel todo). */
|
|
13
|
+
export declare function vincularRenomearInline(host: HostRenomear, shadow: ShadowRoot, raiz?: ParentNode): void;
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { CamadasHostCompleto } from './camadas-host';
|
|
2
|
+
import { FeicaoItem } from './tipos';
|
|
2
3
|
export declare function sincronizarCamadaAtivaDOM(host: CamadasHostCompleto, shadow: ShadowRoot): void;
|
|
3
4
|
export declare function sincronizarSelecaoDOM(host: CamadasHostCompleto, shadow: ShadowRoot): void;
|
|
5
|
+
/** Estado do círculo de seleção de uma camada: tudo selecionado, parte, ou nada (camada sem feições). */
|
|
6
|
+
export declare function aplicarEstadoTarget(circle: Element | null, feats: readonly FeicaoItem[], selecionadas: ReadonlySet<string>): void;
|
|
7
|
+
/** Contador, rótulo e modo (resumo × ações em massa) do rodapé, conforme a seleção atual. */
|
|
8
|
+
export declare function sincronizarRodapeDOM(host: Pick<CamadasHostCompleto, 'camadas' | 'feicoes' | 'selectedFeatureIds'>, shadow: ShadowRoot): void;
|
|
4
9
|
/**
|
|
5
10
|
* Reflete no DOM o estado herdado dos grupos (sem redesenhar a árvore): esmaece o que está sob um
|
|
6
11
|
* grupo oculto e trava os cadeados das feições cuja camada, ou um grupo acima dela, está travada.
|
|
@@ -117,6 +117,43 @@ export interface DetalheEventoMoverFeicao {
|
|
|
117
117
|
camadaDestinoId: string;
|
|
118
118
|
feicao: FeicaoItem;
|
|
119
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* O que uma mutação de feição (`adicionarFeicao`, `atualizarFeicao`, `removerFeicao`, `definirFeicoes`) alterou.
|
|
122
|
+
* Permite ao painel atualizar só as linhas afetadas em vez de redesenhar a árvore inteira.
|
|
123
|
+
*/
|
|
124
|
+
export interface MudancaFeicoes {
|
|
125
|
+
/** Camadas cujas feições mudaram (`''` = feição sem camada), ou `'todas'` (troca da lista inteira). */
|
|
126
|
+
camadas: ReadonlySet<string> | 'todas';
|
|
127
|
+
/** Ids de feições cuja linha precisa ser refeita (as demais linhas da camada continuam como estão). */
|
|
128
|
+
idsAlterados: ReadonlySet<string>;
|
|
129
|
+
/** A seleção mudou nesta mutação (o rodapé precisa ser atualizado mesmo sem seleção restante). */
|
|
130
|
+
selecaoAfetada: boolean;
|
|
131
|
+
}
|
|
132
|
+
/** Por que o painel desistiu da atualização incremental e redesenhou tudo. */
|
|
133
|
+
export type MotivoRenderCompleto = 'arvore-nao-renderizada' | 'busca-ativa' | 'edicao-inline' | 'camada-orfa' | 'camada-fora-do-dom' | 'drawer-aberto' | 'ids-duplicados';
|
|
134
|
+
/** Situação de uma camada afetada por uma mutação de feição. */
|
|
135
|
+
export interface SituacaoCamadaAfetada {
|
|
136
|
+
/** A camada existe em `host.camadas`. */
|
|
137
|
+
existeNoModelo: boolean;
|
|
138
|
+
/** O grupo da camada está desenhado na árvore. */
|
|
139
|
+
renderizadaNoDom: boolean;
|
|
140
|
+
/** O drawer de configurações dessa camada está aberto (ele mostra a contagem de feições). */
|
|
141
|
+
drawerAberto: boolean;
|
|
142
|
+
}
|
|
143
|
+
export interface EntradaDecisaoIncremental {
|
|
144
|
+
arvoreRenderizada: boolean;
|
|
145
|
+
buscaAtiva: boolean;
|
|
146
|
+
editandoCamada: boolean;
|
|
147
|
+
editandoFeicao: boolean;
|
|
148
|
+
idsDuplicados: boolean;
|
|
149
|
+
camadasAfetadas: readonly SituacaoCamadaAfetada[];
|
|
150
|
+
}
|
|
151
|
+
export type DecisaoAtualizacao = {
|
|
152
|
+
incremental: true;
|
|
153
|
+
} | {
|
|
154
|
+
incremental: false;
|
|
155
|
+
motivo: MotivoRenderCompleto;
|
|
156
|
+
};
|
|
120
157
|
export interface DetalheEventoAcaoMassa {
|
|
121
158
|
feicoesIds: string[];
|
|
122
159
|
feicoes: FeicaoItem[];
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SafeHTMLElement } from '../../core/ssr-safe';
|
|
2
|
-
import { CamadaItem, FeicaoItem, MapaBaseItem, AbaPainelCamadas } from './tipos';
|
|
2
|
+
import { CamadaItem, FeicaoItem, MapaBaseItem, AbaPainelCamadas, MudancaFeicoes } from './tipos';
|
|
3
3
|
import { CamadasHostCompleto } from './camadas-host';
|
|
4
4
|
import { LembrancaCamadas } from './camadas-lembranca';
|
|
5
5
|
export declare class UICamadas extends SafeHTMLElement implements CamadasHostCompleto {
|
|
@@ -12,6 +12,8 @@ export declare class UICamadas extends SafeHTMLElement implements CamadasHostCom
|
|
|
12
12
|
private conectado;
|
|
13
13
|
private profundidadeLote;
|
|
14
14
|
private renderPendente;
|
|
15
|
+
/** Mudança de feições à espera do `render()` (consumida nele): permite atualizar só as linhas afetadas. */
|
|
16
|
+
private mudancaFeicoes;
|
|
15
17
|
/** Painéis conectados sem `id` nem `storage-key`: dividem a mesma chave de persistência. */
|
|
16
18
|
private static instanciasChavePadrao;
|
|
17
19
|
/** @internal */
|
|
@@ -111,9 +113,16 @@ export declare class UICamadas extends SafeHTMLElement implements CamadasHostCom
|
|
|
111
113
|
alternarColapso(emitirEvento?: boolean): void;
|
|
112
114
|
private definirColapso;
|
|
113
115
|
solicitarRenderizacao(): void;
|
|
116
|
+
/**
|
|
117
|
+
* Caminho das mutações de feição: o DOM fica atualizado na volta da chamada, mas só as linhas afetadas são
|
|
118
|
+
* refeitas quando possível. Em `emLote` vale o adiamento de sempre (uma renderização completa no fim).
|
|
119
|
+
* Qualquer caso que o caminho incremental não garanta (busca, edição inline, drawer, camada fora da árvore…)
|
|
120
|
+
* cai no render completo.
|
|
121
|
+
*/
|
|
122
|
+
solicitarAtualizacaoFeicoes(mudanca: MudancaFeicoes): void;
|
|
114
123
|
/**
|
|
115
124
|
* Agrupa várias mutações (`adicionarFeicao` em laço, por exemplo) em uma só renderização, ao fim de `fn`.
|
|
116
|
-
*
|
|
125
|
+
* Mesmo com a atualização incremental, é a forma ideal para cargas grandes: o DOM é refeito uma só vez.
|
|
117
126
|
*/
|
|
118
127
|
emLote(fn: () => void): void;
|
|
119
128
|
dispararEvento(nome: string, detalhe: unknown): void;
|
|
@@ -4,6 +4,7 @@ import { GerenciGeoMapaController } from '../../gerencigeo-canvas/mapa_controlle
|
|
|
4
4
|
import { CanvasLayerManager } from '../../gerencigeo-canvas/layer_manager';
|
|
5
5
|
import { ModoPopups } from '../../gerencigeo-canvas/popup_gate';
|
|
6
6
|
import { ModoRenderizador } from '../../gerencigeo-canvas/renderers/feicoes_despachante';
|
|
7
|
+
import { NivelQualidade, PerfilQualidade } from '../../gerencigeo-canvas/qualidade';
|
|
7
8
|
import { EstatisticasFeicoes } from '../../gerencigeo-canvas/renderers/renderizador_feicoes_tipos';
|
|
8
9
|
import { UsuarioRemoto } from '../../gerencigeo-canvas/feature_cursores';
|
|
9
10
|
import { EventoMapaCad, LatLngEvento, OpcoesLinhaPadrao } from './tipos';
|
|
@@ -97,6 +98,18 @@ export declare class UICanvasCAD extends SafeHTMLElement {
|
|
|
97
98
|
*/
|
|
98
99
|
get renderizador(): ModoRenderizador;
|
|
99
100
|
set renderizador(val: ModoRenderizador);
|
|
101
|
+
/**
|
|
102
|
+
* Perfil de desempenho do canvas (atributo `qualidade`): `alta` (padrão, comportamento de sempre), `media` ou `baixa`.
|
|
103
|
+
* `media` e `baixa` trocam fidelidade visual por velocidade: renderizador `canvas` (se `renderizador` não foi dado),
|
|
104
|
+
* marcas e simplificação mais agressivas, zoom em passos maiores; `baixa` ainda usa dpr 1, linhas sem tracejado e
|
|
105
|
+
* sem animação de zoom nem inércia. Valor inválido usa `alta`. Ao mudar, o mapa é ajustado e as camadas de feições
|
|
106
|
+
* são recriadas; a API, os eventos e os dados não mudam.
|
|
107
|
+
*/
|
|
108
|
+
get qualidade(): NivelQualidade;
|
|
109
|
+
set qualidade(val: NivelQualidade);
|
|
110
|
+
/** Perfil completo vigente (valores numéricos do nível em `qualidade`). */
|
|
111
|
+
get perfilQualidade(): PerfilQualidade;
|
|
112
|
+
private aplicarQualidadeAoMapa;
|
|
100
113
|
/**
|
|
101
114
|
* Contadores do desenho de uma camada de feições (`total`, `materializadas`, `desenhadas`, `marcasLOD`, `clusters`,
|
|
102
115
|
* `canvases`, `renderizador`...), para diagnóstico e benchmark. `null` se a camada não está desenhada.
|