InglêsFrancêsEspanhol

favicon do OnWorks

clirr - Online na nuvem

Execute clirr no provedor de hospedagem gratuita OnWorks no Ubuntu Online, Fedora Online, emulador online do Windows ou emulador online do MAC OS

Este é o comando clirr que pode ser executado no provedor de hospedagem gratuita OnWorks usando uma de nossas várias estações de trabalho online gratuitas, como Ubuntu Online, Fedora Online, emulador online do Windows ou emulador online do MAC OS

PROGRAMA:

NOME


clirr - Verifique a compatibilidade de origem e binária das bibliotecas Java

SINOPSE


Clirr -o Oldjar -n nova jarra [opções]

DESCRIÇÃO


Clirr é uma ferramenta que verifica as bibliotecas Java para compatibilidade de binários e fontes com os mais antigos
lançamentos. Basicamente, você fornece dois conjuntos de arquivos jar e Clirr mostra uma lista de
mudanças na API pública.

OPÇÕES


-a, --mostrar todos os escopos

mostrar aulas particulares e pacotes

-f, --arquivo de saída

nome do arquivo de saída

-i, --include-pacote

inclui apenas classes deste pacote e seus subpacotes

-n, --nova versão

arquivos jar da nova versão

-ncp, --novo-caminho de classe

Classpath de terceiros que é referenciado pela nova versão

-o, --versão antiga

arquivos jar da versão antiga

-ocp, --orig-caminho de classe

Classpath de terceiros que é referenciado pela versão antiga

-p, --show-pkg-escopo

mostrar classes de escopo do pacote

-s, --estilo [texto | xml]

estilo de saída

MENSAGENS


Quando clirr gera uma mensagem de ERROR, WARNING ou INFO sobre uma mudança nos jars sendo
em comparação, há um código de referência de mensagem associado. Este manual contém um
explicação do significado dessa mensagem que pode conter informações que não podem
ser encaixado no breve resumo da mensagem.

As mensagens são separadas em três níveis de gravidade: ERROR, WARNING e INFO.

Os erros vêm em dois sabores:

Falhas de tempo de link, em que uma exceção será lançada assim que o código for compilado
contra uma versão antiga de uma classe e a nova versão da classe são carregadas em
a mesma hierarquia do carregador de classe.

Falhas em tempo de execução, em que uma exceção é lançada quando o código é compilado contra o antigo
versão de uma classe tenta chamar um método em uma nova versão da classe, ou vice
vice-versa.

Clirr relata "erros" para casos em que é possível obter uma falha de tempo de execução. Se
uma realmente ocorre pode depender da forma como a biblioteca é chamada, ou seja, mudanças relatadas
pois um erro pode de fato funcionar quando usado, desde que os padrões de uso da biblioteca funcionem
não acionar a situação de falha.

Os avisos são emitidos para situações em que nenhum link ou exceção de tempo de execução ocorrerá, mas
onde o aplicativo pode se comportar de forma inesperada devido às alterações que ocorreram.

As mensagens informativas fornecem aos usuários informações sobre novos recursos que foram
adicionado sem quebrar a compatibilidade com versões anteriores de forma alguma.

Ao usar clirr para relatar mudanças em itens que têm escopo privado ou de pacote, estes
as mudanças são sempre relatadas como mudanças de nível INFO, nunca nível de AVISO ou ERROR. Esse
permite que os usuários do clirr gerem "relatórios de mudança" em um nível adequado para desenvolvedores
sem ter algumas dessas mudanças marcadas (irrelevantemente) como incompatibilidades binárias.

Nunca pode haver incompatibilidades binárias para mudanças em classes privadas, métodos ou
campos como esse acesso só podem ocorrer de dentro da mesma classe (ou seja, a mesma compilação
unidade).

Clirr não relata avisos de incompatibilidade binária ou ERRORs para itens com escopo de pacote
também, porque os pacotes Java se destinam a ser "unidades de lançamento", ou seja, todas as classes dentro
um pacote é compilado junto (garantindo a compatibilidade) e então lançado como uma unidade. O único
momento em que as incompatibilidades de escopo do pacote podem ser um problema é quando os usuários de um
biblioteca escrever suas próprias classes usando uma declaração de pacote pertencente a algum
biblioteca, ou quando um subconjunto de classes atualizadas (por exemplo, uma única classe) de um pacote é usado
para substituir certas classes de uma versão anterior da biblioteca. Ambos estes
situações são consideradas práticas muito ruins pela convenção de programação Java.

Nas seções a seguir, o termo "antigo" é usado para se referir a uma classe, interface, método
ou campo do conjunto de frascos que representam a versão antiga / anterior / original / de linha de base
da biblioteca que está sendo inspecionada. O termo "novo" é usado para se referir a uma classe, interface,
método ou campo do conjunto de frascos que representam a versão nova / atual / mais recente do
biblioteca sendo inspecionada.

Nas seções a seguir, o termo "tipo" é usado para se referir a algo que pode ser
uma classe ou interface.

1000 - Aumento visibilidade of classe

Gravidade: INFO

O tipo especificado existe em ambas as versões, mas seu especificador de acesso declarado tem
alterado para relaxar as restrições sobre o que outro código pode acessá-lo.

Tipos de nível superior (ou seja, aqueles que não estão aninhados em outra classe) podem ter apenas
acessibilidade "pacote" ou "pública". Os tipos aninhados podem assumir qualquer um dos quatro
valores de acessibilidade disponíveis.

Independentemente de o objeto ser de nível superior ou aninhado, uma mudança na acessibilidade
da esquerda para a direita da sequência privado-> pacote-> protegido-> público sempre
garante que todos os códigos que anteriormente poderiam acessar esse tipo ainda possam acessar esse
modelo. Portanto, essa mudança é sempre binária e compatível com o código-fonte.

Observe que a declaração "protegido" fornece acesso a ambos os códigos derivados do
digite e codifique dentro do mesmo pacote, ou seja, acessibilidade "protegida" também implica
acessibilidade do pacote.

1001 - Diminuição visibilidade of classe

Gravidade: ERROR

O tipo especificado existe em ambas as versões, mas seu especificador de acesso declarado tem
alterado para aumentar as restrições sobre quais outros códigos podem acessá-lo.

Tipos de nível superior (ou seja, aqueles que não estão aninhados em outra classe) podem ter apenas
acessibilidade "pacote" ou "pública". Os tipos aninhados podem assumir qualquer um dos quatro
valores de acessibilidade disponíveis.

Independentemente de o tipo ser de nível superior ou aninhado, uma mudança na acessibilidade
da esquerda para a direita da sequência público-> protegido-> pacote-> privado pode causar
código existente que poderia anteriormente acessar o tipo para não ser mais capaz de fazê-lo.

A seção 13.4.3 da Especificação da linguagem Java afirma explicitamente que um
IllegalAccessError deve ocorrer se um binário pré-existente tentar acessar um tipo
quando a acessibilidade do tipo foi alterada para algo que causaria um
erro em tempo de compilação. No entanto, isso não parece ser aplicado na prática, em
menos nas JVMs atuais. No entanto, isso deve ser um erro, e assim clirr relata
esta mudança como um ERRO de compatibilidade binária.

2000 - Alterado da classe para interface

Gravidade: ERROR

A classe especificada se tornou uma interface na nova versão. Esta mudança é
sempre uma incompatibilidade de código-fonte e binário, por razões óbvias.

2001 - Alterado da interface para classe

Gravidade: ERROR

A interface especificada tornou-se uma classe na nova versão. Esta mudança é
sempre uma incompatibilidade de código-fonte e binário, por razões óbvias.

3001 - Removido final mudança da classe

Gravidade: INFO

A classe especificada foi declarada final na versão antiga, mas não é mais final
na nova versão.

3002 - Adicionado final mudança para efetivamente final classe

Gravidade: INFO

A classe especificada não foi declarada final na versão anterior, mas agora está declarada
final. Normalmente, isso seria uma incompatibilidade porque derivada pré-existente
classes não seriam mais válidas quando usadas com a nova versão desta classe.
No entanto, neste caso, a versão da classe antiga não tinha construtores públicos ou protegidos,
portanto, não era possível que nenhuma classe derivada existisse, mesmo para a versão antiga do
a biblioteca. Alterar tal classe para final, portanto, não pode quebrar qualquer
código.

3003 - Adicionado final mudança para classe

Gravidade: ERROR

A classe especificada não foi declarada final na versão anterior, mas agora está declarada
final. Quaisquer classes pré-existentes que foram declaradas como subclasses desta classe
portanto, não será válido com a nova versão da biblioteca.

Um VerifyError é lançado pelo carregador de classe quando é feita uma tentativa de carregar um
subclasse de uma classe final.

Observe que uma classe Y é carregada pelo carregador de classe padrão apenas quando o primeiro
é feita uma tentativa de criar uma instância de Y ou de fazer referência direta à classe
objeto para a classe Y. Se alguma outra classe X tiver a classe Y como um membro declarado, ou como um
parâmetro para algum método, então carregar a classe X não faz com que a classe Y seja carregada.

3004 - Removido abstrato mudança da classe

Gravidade: INFO

A versão antiga desta classe foi declarada uma classe abstrata. A nova versão
não é abstrato, permitindo que os usuários criem instâncias da classe.

3005 - Adicionado abstrato mudança para classe

Gravidade: ERROR

A versão antiga desta classe não foi declarada abstrata. A nova versão é
resumo. O código pré-existente que cria instâncias desta classe não é mais
válido com a nova versão.

4000 - Adicionado interface para da conjunto of implementado interfaces de

Gravidade: INFO

A nova versão do tipo agora implementa uma interface adicional. Isso não
invalida qualquer código existente (fonte ou binário), e é um completamente
mudança compatível com versões anteriores.

Observe que esta mensagem pode ser relatada sem que nenhuma alteração ocorra no
tipo especificado; uma mudança no conjunto de interfaces suportadas por um tipo causará
esta mensagem deve ser relatada para cada descendente desse tipo.

4001 - Removido interface da da conjunto of implementado interfaces de

Gravidade: ERROR

A versão antiga deste tipo declarava que implementava uma interface que o
nova classe ou interface não. Código existente que converte explícita ou implicitamente
objetos deste tipo para a interface agora ausente não são mais válidos.

Observe que esta mensagem pode ser relatada sem que nenhuma alteração ocorra no
tipo especificado; uma mudança no conjunto de interfaces suportadas por um tipo causará
esta mensagem deve ser relatada para cada descendente desse tipo.

5000 - Adicionado classe para da conjunto of superclasses

Gravidade: INFO ou AVISO

A nova versão da classe tem uma classe em sua hierarquia de herança que a antiga
versão não, ou porque seu pai direto agora é uma classe diferente, ou
porque uma de suas classes pai mudou sua hierarquia de herança.

Se a classe especificada tiver java.lang.Throwable como ancestral, essa alteração será
relatado como um AVISO, porque essa mudança de classe pode alterar a captura de exceções
comportamento dos programas que usam essa classe.

Observe que esta mensagem pode ser relatada sem que nenhuma alteração ocorra no
classe especificada; uma mudança no conjunto de superclasses de uma classe ancestral irá
fazer com que esta mensagem seja relatada para todas as classes descendentes.

5001 - Removido classe da da conjunto of superclasses

Gravidade: ERROR

A versão antiga desta classe tem uma classe em sua hierarquia de herança que o
a nova versão não, ou porque seu pai direto agora é uma classe diferente, ou
porque uma de suas classes pai mudou sua hierarquia de herança.

O código existente que explícita ou implicitamente converte objetos deste tipo para o agora
o tipo de classe ausente não é mais válido.

Observe que esta mensagem pode ser relatada sem que nenhuma alteração ocorra no
classe especificada; uma mudança no conjunto de superclasses de uma classe ancestral irá
fazer com que esta mensagem seja relatada para todas as classes descendentes.

Observe também que se esta classe tiver Throwable em sua ancestralidade, a classe
mudança de hierarquia também pode causar mudanças no comportamento de captura de exceções de
programas que usam esta classe.

6000 - Adicionado campo

Gravidade: INFO

A nova classe possui um membro adicional estático ou de instância. Esta mudança é
totalmente compatível com versões anteriores.

6001 - Removido campo

Gravidade: ERROR

A nova classe removeu um campo presente na versão antiga. Código pré-existente
que acessa diretamente aquele campo não será mais válido.

6002 - Valor of campo não mais a em tempo de compilação constante

Gravidade: AVISO

O código compilado com a versão antiga da classe foi permitido para "embutir" o
valor deste campo porque era uma constante de tempo de compilação. Portanto, existente
o código binário continuará a usar o valor antigo deste campo, em vez do novo
valor (que não pode ser embutido).

6003 - Valor of em tempo de compilação constante tem mudado

Gravidade: AVISO

O código compilado com a versão antiga da classe foi permitido para "embutir" o
valor deste campo porque era uma constante de tempo de compilação. Portanto, existente
o código binário continuará a usar o valor antigo deste campo, em vez do novo
valor.

6004 - Campo tipo mudado

Gravidade: ERROR

O tipo associado ao estático especificado ou membro da instância do especificado
classe mudou. O código pré-existente que acessa diretamente esse campo não pode
mais ser válido e, portanto, esta é uma alteração incompatível.

6005 - Campo agora não final

Gravidade: INFO

O campo era anteriormente final e não é mais final. Isso significa que o campo
o valor agora pode ser modificado durante o tempo de vida da classe ou instância.

Se um valor em um campo poderia ser previamente "embutido" em outras classes é um
problema abordado pelas mensagens 6002 e 6003, não esta mensagem.

6006 - Campo agora final

Gravidade: ERROR

O campo não pode mais ser modificado durante o tempo de vida da classe ou instância.
O código que modificou anteriormente este campo não é mais válido.

6007 - Campo agora não estático

Gravidade: ERROR

O campo agora é uma variável de instância em vez de uma variável de classe. Código que
acessou anteriormente este campo por meio da classe em vez de uma instância da classe
não é mais válido.

6008 - Campo agora estático

Gravidade: ERROR

O campo agora é uma variável de classe em vez de uma variável de instância.

Por algum motivo (presumivelmente problemas de implementação interna), o padrão Java
declara que esta mudança não é compatível com o binário e que um
IncompatibleClassChangeError será lançado se o código for compilado com o "antigo"
versão de uma classe é usada junto com uma "nova" versão para a qual um campo agora é
estático.

Porque o código-fonte tem permissão para acessar variáveis ​​de classe por meio de instâncias desse
classe, espera-se que seja uma alteração compatível com o código-fonte. No entanto, atualmente
CLIRR relata isso como um ERROR para compatibilidade de código-fonte também.

6009 - Campo Mais Acessível

Gravidade: INFO

Na nova versão, o campo especificado está acessível a mais código do que era
anteriormente.

6010 - Campo Menos Acessível

Gravidade: ERROR

Na nova versão, o campo especificado está acessível para menos código do que era
anteriormente. Portanto, o código existente pode não ser mais válido.

6011 - Removido constante Campo

Gravidade binária: AVISO

Gravidade da fonte: ERROR

A nova classe removeu um campo presente na versão antiga. Fonte pré-existente
o código que acessa diretamente aquele campo não será mais válido.

Anteriormente, no entanto, o campo era final e inicializado com um valor constante.
Portanto, o código compilado com a versão anterior da classe terá
esta constante e continuará a funcionar, usando o valor anterior deste campo. UMA
um aviso é emitido, pois isso geralmente não é um comportamento desejável. No entanto, não é um
incompatibilidade binária.

7000 - Forma agora in Superclasse

Gravidade: INFO

A classe antiga tinha um método chamado X. A nova classe não tem mais esse método, mas um
classe pai define este método, portanto, nenhum binário ou incompatibilidade de origem tem
ocorreu.

Observe que esta mudança pode ter o efeito de forçar a nova classe a se tornar
'resumo'. Se for esse o caso, essa alteração é relatada separadamente.

7001 - Forma agora in Interface

Gravidade: INFO

A classe ou interface antiga tinha um método denominado X. A nova classe ou
interface não tem mais esse método, mas uma interface pai define isso
método, portanto, nenhuma incompatibilidade binária ou de origem ocorreu.

Observe que esta mudança pode ter o efeito de forçar a nova classe a se tornar
'resumo'. Se for esse o caso, essa alteração é relatada separadamente.

7002 - Forma Removido

Gravidade: ERROR

A classe ou interface antiga tinha um método chamado X. A nova classe ou interface não
já tem este método, e este método não está definido em nenhuma classe pai ou
interface.

Se um erro realmente ocorre no tempo de execução para esta mudança depende do uso
padrões. A classe modificada pode ser usada com o código existente, desde que
o código existente não tenta chamar o método removido. Se uma chamada para o desaparecido
método é feito, então uma exceção NoSuchMethodError é gerada quando o método
invocação ocorre.

7003 - Forma Anular Removido

Gravidade: INFO

O método especificado na classe ou interface antiga estava substituindo um herdado
definição. A nova classe ou interface não tem mais este método explicitamente
declarado nele, mas ainda herda uma definição, então não há binário
incompatibilidade. 7004 - Contagem de Argumentos de Método Alterada

Gravidade: ERROR

O método especificado teve argumentos adicionados ou removidos. Isso significa que o código que
invocado anteriormente, ele não invocará mais o mesmo método.

Se houver uma definição de método herdada com o protótipo antigo, então não há
incompatibilidade binária; código que foi compilado com a versão antiga deste
a classe agora invocará a implementação herdada. Nesta situação, clirr deve
produza uma mensagem INFO em vez de um erro. No entanto, na data atual, clirr
não verifica esta situação.

Se não houver definição de método herdado com o protótipo antigo, a mudança
é uma incompatibilidade binária.

7005 - Forma Argumento Formato mudado

Gravidade binária: INFO ou ERROR

Gravidade da fonte: ERROR

O método especificado teve o tipo de um ou mais de seus argumentos modificados.
Isso significa que o código compilado com a versão antiga da classe não será mais
invocar o mesmo método. No entanto, exatamente o mesmo código-fonte antigo, quando compilado
contra a nova versão da classe pode invocar este método se os tipos de argumento forem
compatível com atribuição.

Se houver uma definição de método herdada com o protótipo antigo, então não há
incompatibilidade binária; código que foi compilado com a versão antiga deste
a classe agora invocará a implementação herdada. Na data atual, clirr faz
não verifique esta situação.

Se não houver definição de método herdado com o protótipo antigo, a mudança
é uma incompatibilidade binária.

Se os tipos de parâmetros alterados foram todos alterados para supertipos de seus anteriores
tipos declarados ou para tipos de parâmetros primitivos se eles foram alterados para "maiores"
tipos em todos os casos, então o novo código é compatível com o código-fonte anterior
liberar mesmo se não for compatível com o binário. Observe que, nesta situação,
recompilar o código que usa a biblioteca pode mudar seu comportamento ao chamar um
método herdado para chamar um método na classe que possui um método ligeiramente diferente
protótipo. Na data atual, clirr não verifica esta situação.

7006 - Forma Devolução Formato mudado

Gravidade binária: ERROR

Gravidade da fonte: INFO ou ERROR

O método especificado teve seu tipo de retorno declarado alterado. Seja um problema
realmente ocorre em tempo de execução ao usar o código compilado com a versão antiga deste
biblioteca depende dos padrões de uso. O código antigo pode chamar outros métodos nesta classe.
No entanto, qualquer tentativa de chamar o método cujo tipo de retorno foi alterado resultará em
um NoSuchMethodError sendo lançado quando o método é invocado, porque o retorno
tipo faz parte da "assinatura do método".

A mudança é compatível com o código-fonte se e somente se o novo tipo de retorno for
atribuível ao tipo de retorno antigo. Isso significa que:

se o tipo de retorno antigo era um tipo primitivo, então o novo tipo de retorno deve ser
mais estreito do que o tipo antigo.
se o tipo de retorno antigo era uma interface, o novo tipo de retorno deve ser um
classe ou interface que implementa o antigo tipo de retorno.
se o tipo de retorno antigo era uma classe, o novo tipo de retorno deve ser uma subclasse
do tipo retornado anteriormente.

Clirr não verifica atualmente a compatibilidade do código-fonte para mudanças no método
tipos de retorno; atualmente, eles são simplesmente relatados como um ERROR.

7007 - Forma tem sido Obsoleto

Gravidade: INFO

O método especificado foi declarado como "obsoleto". Este é sempre um
alteração compatível com o binário, bem como uma alteração compatível com o código-fonte.

7008 - Forma tem sido Indeprovado

Gravidade: INFO

O método especificado foi declarado "obsoleto" na versão anterior, mas não é
mais obsoleto na versão atual. Embora um pouco incomum, isso é
permitido. Esta mudança é sempre uma mudança compatível com o binário, bem como um
mudança compatível com o código-fonte.

7009 - Forma is agora Menos Acessível

Gravidade: ERROR

As permissões de acesso associadas ao método especificado foram restritas a
permitir que menos código de usuário acesse o método.

Se essa mudança é um problema de compatibilidade do código-fonte ou não depende de
padrões de uso.

Essa mudança deve ser uma incompatibilidade binária. Observe, no entanto, que as JVMs atuais
não validar isso. O código compilado em uma versão anterior de uma classe pode
invocar com sucesso métodos para os quais eles não têm mais direitos de acesso.
No entanto, a especificação da linguagem Java afirma que isso é um erro, então
clirr relata essa mudança como uma incompatibilidade binária.

7010 - Forma is agora Mais Acessível

Gravidade: INFO

As permissões de acesso associadas ao método especificado foram liberadas para
permitir mais código de usuário para acessar o método. Este é sempre um binário e código-fonte
mudança compatível.

7011 - Forma Adicionado

Gravidade: INFO

Um método não abstrato foi adicionado à classe especificada. Este é sempre um
mudança compatível com o binário.

É também uma alteração compatível com o código-fonte.

P: se o novo método substituir um herdado, qual versão codifica
compilado com a chamada da biblioteca antiga?

7012 - Forma Adicionado para Interface

Gravidade binária: ERROR

Gravidade da fonte: ERROR

Uma declaração de método foi adicionada à interface especificada. Isso é sempre
relatado como um erro de compatibilidade binária, mas na prática a classe alterada pode
ser usado com sucesso com o código compilado contra a interface antiga, dependendo de
padrões de uso.

Código antigo que invoca métodos no código compilado contra o novo (expandido)
a interface continuará a funcionar sem problemas. E o código antigo que implementa o
versão antiga da interface também continuará a funcionar corretamente, desde que nenhuma
o código tenta invocar qualquer um dos métodos recém-adicionados nessa instância. Mas
código que (validamente) invoca um dos novos métodos na interface contra um
objeto que implementa apenas a versão antiga da interface causará um
AbstractMethodError a ser lançado no momento em que a invocação do método é tentada.

Adicionar um método a uma interface é sempre relatado como um ERROR, porque as classes
que implementam essa interface agora devem ser modificados para implementar o declarado
método.

7013 - Sumário Forma Adicionado para Aula

Gravidade binária: ERROR

Gravidade da fonte: ERROR

Uma declaração de método abstrato foi adicionada à classe especificada. Isto é
sempre relatado como um erro de compatibilidade binária, mas na prática a classe alterada
pode ser usado com sucesso com o código compilado contra a classe antiga, dependendo de
padrões de uso.

Se instâncias de objetos compilados contra a classe antiga são criadas, então seu
os métodos podem ser chamados sem problemas. Mas se o método abstrato recém-adicionado for
sempre invocado, então um AbstractMethodError é lançado no momento em que o método
a invocação é tentada.

7014 - Forma agora final

Gravidade: ERROR

O método era anteriormente não final e agora é final. Subclasses desta classe
não será mais compilado ou executado.

Quando a classe antiga continha este método era final (explicitamente ou apenas fornecendo
construtores privados), então as subclasses não podem existir. Clirr atualmente não verifica
para esta situação, então isso irá disparar um alarme falso em alguns casos esquivos.

7015 - Forma agora não final

Gravidade: INFO

O método era anteriormente final e agora não é final. Este é sempre um
mudança compatível com o binário.

8000 - Aula Adicionado

Gravidade: INFO

A nova versão da biblioteca possui uma classe que não estava presente na antiga
versão.

8001 - Aula Removido

Gravidade: ERROR

A nova versão da biblioteca não contém mais a classe especificada.

EXEMPLOS


Verifique a compatibilidade de uma biblioteca com uma versão anterior:

clirr -o foo-1.0.jar -n foo-2.0.jar

Verifique a compatibilidade com versões anteriores de uma nova biblioteca, dependendo do Apache Commons Logging:

clirr -o foo-1.0.jar -n foo-2.0.jar -ocp /usr/share/java/commons-logging.jar -ncp
/usr/share/java/commons-logging.jar

PAGINA INICIAL


http://clirr.sourceforge.net

Novembro de 2013 CLIRR(1)

Use clirr online usando serviços onworks.net


Servidores e estações de trabalho gratuitos

Baixar aplicativos Windows e Linux

Comandos Linux

Ad