@designliquido/delegua 1.28.2 → 1.28.3
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/analisador-semantico/analisador-semantico.d.ts +1 -0
- package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
- package/analisador-semantico/analisador-semantico.js +28 -0
- package/analisador-semantico/analisador-semantico.js.map +1 -1
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.d.ts +3 -1
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.d.ts.map +1 -1
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.js +31 -0
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts +2 -0
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +38 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
- package/bin/package.json +1 -1
- package/declaracoes/importar.d.ts +4 -0
- package/declaracoes/importar.d.ts.map +1 -1
- package/declaracoes/importar.js +1 -0
- package/declaracoes/importar.js.map +1 -1
- package/interpretador/comum.d.ts.map +1 -1
- package/interpretador/comum.js +49 -41
- package/interpretador/comum.js.map +1 -1
- package/interpretador/dialetos/pitugues/interpretador-pitugues.d.ts.map +1 -1
- package/interpretador/dialetos/pitugues/interpretador-pitugues.js +20 -1
- package/interpretador/dialetos/pitugues/interpretador-pitugues.js.map +1 -1
- package/interpretador/estruturas/funcao-padrao.d.ts +2 -0
- package/interpretador/estruturas/funcao-padrao.d.ts.map +1 -1
- package/interpretador/estruturas/funcao-padrao.js +1 -1
- package/interpretador/estruturas/funcao-padrao.js.map +1 -1
- package/interpretador/interpretador-base.d.ts.map +1 -1
- package/interpretador/interpretador-base.js +2 -1
- package/interpretador/interpretador-base.js.map +1 -1
- package/interpretador/interpretador.js +1 -1
- package/interpretador/interpretador.js.map +1 -1
- package/lexador/dialetos/lexador-pitugues.d.ts.map +1 -1
- package/lexador/dialetos/lexador-pitugues.js +11 -0
- package/lexador/dialetos/lexador-pitugues.js.map +1 -1
- package/package.json +1 -1
- package/umd/delegua.js +131 -45
package/umd/delegua.js
CHANGED
|
@@ -548,7 +548,35 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
548
548
|
}
|
|
549
549
|
}
|
|
550
550
|
}
|
|
551
|
+
declararVariaveisImportadas(declaracao) {
|
|
552
|
+
if (declaracao.simboloTudo) {
|
|
553
|
+
this.gerenciadorEscopos.declarar(declaracao.simboloTudo.lexema, {
|
|
554
|
+
nome: declaracao.simboloTudo.lexema,
|
|
555
|
+
tipo: 'módulo',
|
|
556
|
+
imutavel: true,
|
|
557
|
+
valor: undefined,
|
|
558
|
+
inicializada: true,
|
|
559
|
+
usada: false,
|
|
560
|
+
hashArquivo: declaracao.simboloTudo.hashArquivo,
|
|
561
|
+
linha: declaracao.simboloTudo.linha,
|
|
562
|
+
});
|
|
563
|
+
return;
|
|
564
|
+
}
|
|
565
|
+
for (const simboloImportado of declaracao.elementosImportacao || []) {
|
|
566
|
+
this.gerenciadorEscopos.declarar(simboloImportado.lexema, {
|
|
567
|
+
nome: simboloImportado.lexema,
|
|
568
|
+
tipo: 'qualquer',
|
|
569
|
+
imutavel: true,
|
|
570
|
+
valor: undefined,
|
|
571
|
+
inicializada: true,
|
|
572
|
+
usada: false,
|
|
573
|
+
hashArquivo: simboloImportado.hashArquivo,
|
|
574
|
+
linha: simboloImportado.linha,
|
|
575
|
+
});
|
|
576
|
+
}
|
|
577
|
+
}
|
|
551
578
|
async visitarDeclaracaoImportar(declaracao) {
|
|
579
|
+
this.declararVariaveisImportadas(declaracao);
|
|
552
580
|
this.registrarFuncoesImportadasDeTestes(declaracao);
|
|
553
581
|
return Promise.resolve();
|
|
554
582
|
}
|
|
@@ -6610,6 +6638,7 @@ class AvaliadorSintaticoPitugues extends avaliador_sintatico_base_1.AvaliadorSin
|
|
|
6610
6638
|
this.blocos = 0;
|
|
6611
6639
|
this.performance = performance;
|
|
6612
6640
|
this.intuirTipoQualquerParaIdentificadores = false;
|
|
6641
|
+
this.existeImportacaoCoringa = false;
|
|
6613
6642
|
this.escopos = [];
|
|
6614
6643
|
this.pilhaDecoradores = [];
|
|
6615
6644
|
this.pilhaEscopos = new pilha_escopos_1.PilhaEscopos();
|
|
@@ -7213,7 +7242,12 @@ class AvaliadorSintaticoPitugues extends avaliador_sintatico_base_1.AvaliadorSin
|
|
|
7213
7242
|
.obterTipoVariavelPorNome(simboloIdentificador.lexema);
|
|
7214
7243
|
}
|
|
7215
7244
|
catch (erro) {
|
|
7216
|
-
|
|
7245
|
+
if (this.existeImportacaoCoringa) {
|
|
7246
|
+
tipoOperando = 'qualquer';
|
|
7247
|
+
}
|
|
7248
|
+
else {
|
|
7249
|
+
throw this.erro(simboloIdentificador, erro.message);
|
|
7250
|
+
}
|
|
7217
7251
|
}
|
|
7218
7252
|
}
|
|
7219
7253
|
return new construtos_1.Variavel(this.hashArquivo, simboloIdentificador, tipoOperando);
|
|
@@ -7841,21 +7875,52 @@ class AvaliadorSintaticoPitugues extends avaliador_sintatico_base_1.AvaliadorSin
|
|
|
7841
7875
|
else {
|
|
7842
7876
|
declaracao.simboloTudo = nomeModulo;
|
|
7843
7877
|
}
|
|
7878
|
+
await this.registrarAliasImportacao(declaracao);
|
|
7844
7879
|
return Promise.resolve(declaracao);
|
|
7845
7880
|
}
|
|
7846
7881
|
async declaracaoImportarDe() {
|
|
7847
7882
|
const nomeModulo = this.consumir(pitugues_2.default.IDENTIFICADOR, "Esperado nome do módulo após 'de'.");
|
|
7848
7883
|
const caminho = new construtos_1.Literal(nomeModulo.hashArquivo, Number(nomeModulo.linha), nomeModulo.lexema);
|
|
7849
7884
|
this.consumir(pitugues_2.default.IMPORTAR, "Esperado 'importar' após nome do módulo em declaração 'de ... importar'.");
|
|
7885
|
+
if (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.MULTIPLICACAO)) {
|
|
7886
|
+
const declaracao = new declaracoes_1.Importar(caminho);
|
|
7887
|
+
declaracao.simboloTudo = this.simboloAnterior();
|
|
7888
|
+
this.existeImportacaoCoringa = true;
|
|
7889
|
+
return Promise.resolve(declaracao);
|
|
7890
|
+
}
|
|
7850
7891
|
const elementosImportacao = [];
|
|
7892
|
+
const elementosImportacaoComo = [];
|
|
7851
7893
|
do {
|
|
7852
7894
|
const elemento = this.consumir(pitugues_2.default.IDENTIFICADOR, 'Esperado identificador de elemento a ser importado.');
|
|
7853
7895
|
elementosImportacao.push(elemento);
|
|
7896
|
+
if (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.COMO)) {
|
|
7897
|
+
const alias = this.consumir(pitugues_2.default.IDENTIFICADOR, "Esperado identificador após 'como' em importação seletiva.");
|
|
7898
|
+
elementosImportacaoComo.push({ elemento, alias });
|
|
7899
|
+
}
|
|
7854
7900
|
} while (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.VIRGULA));
|
|
7855
7901
|
const declaracao = new declaracoes_1.Importar(caminho);
|
|
7856
7902
|
declaracao.elementosImportacao = elementosImportacao;
|
|
7903
|
+
declaracao.elementosImportacaoComo = elementosImportacaoComo;
|
|
7904
|
+
await this.registrarAliasImportacao(declaracao);
|
|
7857
7905
|
return Promise.resolve(declaracao);
|
|
7858
7906
|
}
|
|
7907
|
+
async registrarAliasImportacao(declaracao) {
|
|
7908
|
+
if (declaracao.simboloTudo) {
|
|
7909
|
+
this.pilhaEscopos.definirInformacoesVariavel(declaracao.simboloTudo.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(declaracao.simboloTudo.lexema, 'qualquer'));
|
|
7910
|
+
}
|
|
7911
|
+
if (declaracao.elementosImportacao) {
|
|
7912
|
+
for (const elemento of declaracao.elementosImportacao) {
|
|
7913
|
+
this.pilhaEscopos.definirInformacoesVariavel(elemento.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(elemento.lexema, 'qualquer'));
|
|
7914
|
+
}
|
|
7915
|
+
for (const { alias } of declaracao.elementosImportacaoComo) {
|
|
7916
|
+
this.pilhaEscopos.definirInformacoesVariavel(alias.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(alias.lexema, 'qualquer'));
|
|
7917
|
+
}
|
|
7918
|
+
}
|
|
7919
|
+
else {
|
|
7920
|
+
const alias = this.avancarEDevolverAnterior();
|
|
7921
|
+
this.pilhaEscopos.definirInformacoesVariavel(alias.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(alias.lexema, 'qualquer'));
|
|
7922
|
+
}
|
|
7923
|
+
}
|
|
7859
7924
|
async declaracaoTente() {
|
|
7860
7925
|
const simboloTente = this.simboloAnterior();
|
|
7861
7926
|
this.consumir(pitugues_2.default.DOIS_PONTOS, "Esperado ':' após a declaração 'tente'.");
|
|
@@ -16657,6 +16722,7 @@ class Importar extends declaracao_1.Declaracao {
|
|
|
16657
16722
|
super(caminho.linha, caminho.hashArquivo);
|
|
16658
16723
|
this.simboloTudo = null;
|
|
16659
16724
|
this.elementosImportacao = [];
|
|
16725
|
+
this.elementosImportacaoComo = [];
|
|
16660
16726
|
this.caminho = caminho;
|
|
16661
16727
|
}
|
|
16662
16728
|
async aceitar(visitante) {
|
|
@@ -20322,67 +20388,75 @@ async function visitarExpressaoAcessoIntervaloVariavel(interpretador, expressao)
|
|
|
20322
20388
|
return resultadoFatiado;
|
|
20323
20389
|
}
|
|
20324
20390
|
function carregarBibliotecasGlobais(pilhaEscoposExecucao) {
|
|
20325
|
-
|
|
20326
|
-
|
|
20327
|
-
|
|
20328
|
-
|
|
20329
|
-
|
|
20330
|
-
|
|
20331
|
-
|
|
20332
|
-
|
|
20333
|
-
|
|
20334
|
-
|
|
20335
|
-
|
|
20336
|
-
|
|
20337
|
-
|
|
20338
|
-
|
|
20339
|
-
|
|
20340
|
-
|
|
20341
|
-
|
|
20391
|
+
// Registra a variável e, para funções padrão, guarda o nome com que foram
|
|
20392
|
+
// registradas, usado para representá-las como texto (ex.: `escreva(real)`).
|
|
20393
|
+
const definir = (nome, valor) => {
|
|
20394
|
+
if (valor instanceof funcao_padrao_1.FuncaoPadrao && !valor.nome) {
|
|
20395
|
+
valor.nome = nome;
|
|
20396
|
+
}
|
|
20397
|
+
pilhaEscoposExecucao.definirVariavel(nome, valor);
|
|
20398
|
+
};
|
|
20399
|
+
definir('aleatorio', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.aleatorio));
|
|
20400
|
+
definir('aleatório', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.aleatorio));
|
|
20401
|
+
definir('aleatorioEntre', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.aleatorioEntre));
|
|
20402
|
+
definir('aleatórioEntre', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.aleatorioEntre));
|
|
20403
|
+
definir('algum', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.algum));
|
|
20404
|
+
definir('arredondar', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.arredondar));
|
|
20405
|
+
definir('clonar', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.clonar));
|
|
20406
|
+
definir('encontrar', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrar));
|
|
20407
|
+
definir('encontrarIndice', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrarIndice));
|
|
20408
|
+
definir('encontrarÍndice', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrarIndice));
|
|
20409
|
+
definir('encontrarUltimo', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrarUltimo));
|
|
20410
|
+
definir('encontrarÚltimo', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrarUltimo));
|
|
20411
|
+
definir('encontrarUltimoIndice', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrarUltimoIndice));
|
|
20412
|
+
definir('encontrarÚltimoÍndice', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrarUltimoIndice));
|
|
20413
|
+
definir('filtrarPor', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.filtrarPor));
|
|
20414
|
+
definir('incluido', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.incluido));
|
|
20415
|
+
definir('incluído', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.incluido));
|
|
20342
20416
|
const funcaoInteiro = new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.inteiro);
|
|
20343
20417
|
funcaoInteiro.MAXIMO = 2147483647;
|
|
20344
20418
|
funcaoInteiro.MÁXIMO = 2147483647;
|
|
20345
20419
|
funcaoInteiro.MINIMO = -2147483648;
|
|
20346
20420
|
funcaoInteiro.MÍNIMO = -2147483648;
|
|
20347
|
-
|
|
20421
|
+
definir('inteiro', funcaoInteiro);
|
|
20348
20422
|
const funcaoLongo = new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.longo);
|
|
20349
20423
|
funcaoLongo.MAXIMO = globalThis.BigInt('9223372036854775807');
|
|
20350
20424
|
funcaoLongo.MÁXIMO = globalThis.BigInt('9223372036854775807');
|
|
20351
20425
|
funcaoLongo.MINIMO = globalThis.BigInt('-9223372036854775808');
|
|
20352
20426
|
funcaoLongo.MÍNIMO = globalThis.BigInt('-9223372036854775808');
|
|
20353
|
-
|
|
20354
|
-
|
|
20355
|
-
|
|
20356
|
-
|
|
20357
|
-
|
|
20358
|
-
|
|
20359
|
-
|
|
20427
|
+
definir('longo', funcaoLongo);
|
|
20428
|
+
definir('intervalo', new funcao_padrao_1.FuncaoPadrao(3, bibliotecaGlobal.intervalo));
|
|
20429
|
+
definir('mapear', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.mapear));
|
|
20430
|
+
definir('maximo', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.maximo));
|
|
20431
|
+
definir('máximo', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.maximo));
|
|
20432
|
+
definir('minimo', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.minimo));
|
|
20433
|
+
definir('mínimo', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.minimo));
|
|
20360
20434
|
const funcaoNumero = new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.numero);
|
|
20361
20435
|
funcaoNumero.MAXIMO = Number.MAX_VALUE;
|
|
20362
20436
|
funcaoNumero.MÁXIMO = Number.MAX_VALUE;
|
|
20363
20437
|
funcaoNumero.MINIMO = -Number.MAX_VALUE;
|
|
20364
20438
|
funcaoNumero.MÍNIMO = -Number.MAX_VALUE;
|
|
20365
|
-
|
|
20366
|
-
|
|
20367
|
-
|
|
20368
|
-
|
|
20369
|
-
|
|
20370
|
-
|
|
20439
|
+
definir('numero', funcaoNumero);
|
|
20440
|
+
definir('número', funcaoNumero);
|
|
20441
|
+
definir('ordenar', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.ordenar));
|
|
20442
|
+
definir('paraCada', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.paraCada));
|
|
20443
|
+
definir('primeiroEmCondicao', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.primeiroEmCondicao));
|
|
20444
|
+
definir('primeiroEmCondição', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.primeiroEmCondicao));
|
|
20371
20445
|
const funcaoReal = new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.real);
|
|
20372
20446
|
funcaoReal.MAXIMO = Number.MAX_VALUE;
|
|
20373
20447
|
funcaoReal.MÁXIMO = Number.MAX_VALUE;
|
|
20374
20448
|
funcaoReal.MINIMO = -Number.MAX_VALUE;
|
|
20375
20449
|
funcaoReal.MÍNIMO = -Number.MAX_VALUE;
|
|
20376
|
-
|
|
20377
|
-
|
|
20378
|
-
|
|
20379
|
-
|
|
20380
|
-
|
|
20381
|
-
|
|
20382
|
-
|
|
20383
|
-
|
|
20384
|
-
|
|
20385
|
-
|
|
20450
|
+
definir('real', funcaoReal);
|
|
20451
|
+
definir('reduzir', new funcao_padrao_1.FuncaoPadrao(3, bibliotecaGlobal.reduzir));
|
|
20452
|
+
definir('somar', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.somar));
|
|
20453
|
+
definir('tamanho', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.tamanho));
|
|
20454
|
+
definir('texto', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.texto));
|
|
20455
|
+
definir('todos', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.todos));
|
|
20456
|
+
definir('todosEmCondicao', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.todosEmCondicao));
|
|
20457
|
+
definir('todosEmCondição', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.todosEmCondicao));
|
|
20458
|
+
definir('tupla', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.tupla));
|
|
20459
|
+
definir('vetor', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.vetor));
|
|
20386
20460
|
}
|
|
20387
20461
|
function pontoEntradaAjuda(funcao, topico) {
|
|
20388
20462
|
if (!funcao) {
|
|
@@ -21769,7 +21843,7 @@ class FuncaoPadrao extends chamavel_1.Chamavel {
|
|
|
21769
21843
|
* @returns {string} A representação da função como texto.
|
|
21770
21844
|
*/
|
|
21771
21845
|
paraTexto() {
|
|
21772
|
-
return `<função-padrão nome=${this.simbolo?.lexema || '(função anônima)'} />`;
|
|
21846
|
+
return `<função-padrão nome=${this.nome || this.simbolo?.lexema || '(função anônima)'} />`;
|
|
21773
21847
|
}
|
|
21774
21848
|
/**
|
|
21775
21849
|
* Método utilizado pelo VSCode para representar esta função quando impressa.
|
|
@@ -24655,7 +24729,8 @@ class InterpretadorBase {
|
|
|
24655
24729
|
return this.paraTexto(objeto.valor);
|
|
24656
24730
|
if (objeto instanceof estruturas_1.ObjetoDeleguaClasse ||
|
|
24657
24731
|
objeto instanceof estruturas_1.DeleguaFuncao ||
|
|
24658
|
-
objeto instanceof estruturas_1.DescritorTipoClasse
|
|
24732
|
+
objeto instanceof estruturas_1.DescritorTipoClasse ||
|
|
24733
|
+
objeto instanceof estruturas_1.FuncaoPadrao)
|
|
24659
24734
|
return objeto.paraTexto();
|
|
24660
24735
|
if (objeto instanceof quebras_1.RetornoQuebra) {
|
|
24661
24736
|
if (typeof objeto.valor === 'boolean')
|
|
@@ -25011,7 +25086,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
25011
25086
|
if (typeof objeto.valor === 'boolean')
|
|
25012
25087
|
return objeto.valor ? 'verdadeiro' : 'falso';
|
|
25013
25088
|
}
|
|
25014
|
-
if (objeto instanceof estruturas_1.MetodoPrimitiva) {
|
|
25089
|
+
if (objeto instanceof estruturas_1.MetodoPrimitiva || objeto instanceof estruturas_1.FuncaoPadrao) {
|
|
25015
25090
|
return objeto.paraTexto();
|
|
25016
25091
|
}
|
|
25017
25092
|
if (objeto instanceof Date) {
|
|
@@ -28078,6 +28153,17 @@ class LexadorPitugues {
|
|
|
28078
28153
|
break;
|
|
28079
28154
|
case '*':
|
|
28080
28155
|
this.inicioSimbolo = this.atual;
|
|
28156
|
+
const terminaLinha = this.atual + 1 >= this.codigo[this.linha].length;
|
|
28157
|
+
if (terminaLinha) {
|
|
28158
|
+
this.atual += 1;
|
|
28159
|
+
this.adicionarSimbolo(pitugues_2.default.MULTIPLICACAO);
|
|
28160
|
+
if (!this.eUltimaLinha()) {
|
|
28161
|
+
this.linha += 1;
|
|
28162
|
+
this.atual = 0;
|
|
28163
|
+
this.analisarIndentacao();
|
|
28164
|
+
}
|
|
28165
|
+
break;
|
|
28166
|
+
}
|
|
28081
28167
|
this.avancar();
|
|
28082
28168
|
if (this.simboloAtual() === '*') {
|
|
28083
28169
|
this.avancar();
|