public class ObjectUtils extends Object
Operations on Object
.
This class tries to handle null
input gracefully.
An exception will generally not be thrown for a null
input.
Each method documents its behavior in more detail.
#ThreadSafe#
Modifier and Type | Class and Description |
---|---|
static class |
ObjectUtils.Null
Class used as a null placeholder where
null
has another meaning. |
Modifier and Type | Field and Description |
---|---|
static ObjectUtils.Null |
NULL
Singleton used as a
null placeholder where
null has another meaning. |
Constructor and Description |
---|
ObjectUtils()
ObjectUtils instances should NOT be constructed in
standard programming. |
Modifier and Type | Method and Description |
---|---|
static boolean |
allNotNull(Object... values)
Checks if all values in the array are not
nulls . |
static boolean |
allNull(Object... values)
Checks if all values in the given array are
null . |
static boolean |
anyNotNull(Object... values)
Checks if any value in the given array is not
null . |
static boolean |
anyNull(Object... values)
Checks if any value in the given array is
null . |
static <T> T |
clone(T obj)
Clone an object.
|
static <T> T |
cloneIfPossible(T obj)
Clone an object if possible.
|
static <T extends Comparable<? super T>> |
compare(T c1,
T c2)
Null safe comparison of Comparables.
|
static <T extends Comparable<? super T>> |
compare(T c1,
T c2,
boolean nullGreater)
Null safe comparison of Comparables.
|
static byte |
CONST_BYTE(int v)
This method returns the provided value unchanged.
|
static short |
CONST_SHORT(int v)
This method returns the provided value unchanged.
|
static boolean |
CONST(boolean v)
This method returns the provided value unchanged.
|
static byte |
CONST(byte v)
This method returns the provided value unchanged.
|
static char |
CONST(char v)
This method returns the provided value unchanged.
|
static double |
CONST(double v)
This method returns the provided value unchanged.
|
static float |
CONST(float v)
This method returns the provided value unchanged.
|
static int |
CONST(int v)
This method returns the provided value unchanged.
|
static long |
CONST(long v)
This method returns the provided value unchanged.
|
static short |
CONST(short v)
This method returns the provided value unchanged.
|
static <T> T |
CONST(T v)
This method returns the provided value unchanged.
|
static <T> T |
defaultIfNull(T object,
T defaultValue)
Returns a default value if the object passed is
null . |
static boolean |
equals(Object object1,
Object object2)
Deprecated.
this method has been replaced by
java.util.Objects.equals(Object, Object) in Java 7 and will
be removed from future releases. |
static <T> T |
firstNonNull(T... values)
Returns the first value in the array which is not
null . |
static <T> T |
getFirstNonNull(Supplier<T>... suppliers)
Executes the given suppliers in order and returns the first return
value where a value other than
null is returned. |
static <T> T |
getIfNull(T object,
Supplier<T> defaultSupplier)
Returns the given
object is it is non-null, otherwise returns the Supplier's Supplier.get()
value. |
static int |
hashCode(Object obj)
Deprecated.
this method has been replaced by
java.util.Objects.hashCode(Object) in Java 7 and will be
removed in future releases |
static int |
hashCodeMulti(Object... objects)
Deprecated.
this method has been replaced by
java.util.Objects.hash(Object...) in Java 7 and will be
removed in future releases. |
static void |
identityToString(Appendable appendable,
Object object)
Appends the toString that would be produced by
Object
if a class did not override toString itself. |
static String |
identityToString(Object object)
Gets the toString that would be produced by
Object
if a class did not override toString itself. |
static void |
identityToString(StrBuilder builder,
Object object)
Deprecated.
as of 3.6, because StrBuilder was moved to commons-text,
use one of the other
identityToString methods instead |
static void |
identityToString(StringBuffer buffer,
Object object)
Appends the toString that would be produced by
Object
if a class did not override toString itself. |
static void |
identityToString(StringBuilder builder,
Object object)
Appends the toString that would be produced by
Object
if a class did not override toString itself. |
static boolean |
isEmpty(Object object)
Checks if an Object is empty or null.
|
static boolean |
isNotEmpty(Object object)
Checks if an Object is not empty and not null.
|
static <T extends Comparable<? super T>> |
max(T... values)
Null safe comparison of Comparables.
|
static <T> T |
median(Comparator<T> comparator,
T... items)
Find the "best guess" middle value among comparables.
|
static <T extends Comparable<? super T>> |
median(T... items)
Find the "best guess" middle value among comparables.
|
static <T extends Comparable<? super T>> |
min(T... values)
Null safe comparison of Comparables.
|
static <T> T |
mode(T... items)
Find the most frequently occurring item.
|
static boolean |
notEqual(Object object1,
Object object2)
Compares two objects for inequality, where either one or both
objects may be
null . |
static String |
toString(Object obj)
Deprecated.
this method has been replaced by
java.util.Objects.toString(Object) in Java 7 and will be
removed in future releases. Note however that said method will return "null" for null references, while this
method returns an empty String. To preserve behavior use java.util.Objects.toString(myObject, "") |
static String |
toString(Object obj,
String nullStr)
Deprecated.
this method has been replaced by
java.util.Objects.toString(Object, String) in Java 7 and
will be removed in future releases. |
static String |
toString(Object obj,
Supplier<String> supplier)
Gets the
toString of an Object returning
a specified text if null input. |
public static final ObjectUtils.Null NULL
Singleton used as a null
placeholder where
null
has another meaning.
For example, in a HashMap
the
HashMap.get(java.lang.Object)
method returns
null
if the Map
contains null
or if there
is no matching key. The Null
placeholder can be used to
distinguish between these two cases.
Another example is Hashtable
, where null
cannot be stored.
This instance is Serializable.
public ObjectUtils()
ObjectUtils
instances should NOT be constructed in
standard programming. Instead, the static methods on the class should
be used, such as ObjectUtils.defaultIfNull("a","b");
.
This constructor is public to permit tools that require a JavaBean instance to operate.
public static boolean allNull(Object... values)
null
.
If all the values are null
or the array is null
or empty, then true
is returned, otherwise false
is returned.
ObjectUtils.allNull(*) = false ObjectUtils.allNull(*, null) = false ObjectUtils.allNull(null, *) = false ObjectUtils.allNull(null, null, *, *) = false ObjectUtils.allNull(null) = true ObjectUtils.allNull(null, null) = true
values
- the values to test, may be null
or emptytrue
if all values in the array are null
s,
false
if there is at least one non-null value in the array.public static boolean allNotNull(Object... values)
nulls
.
If any value is null
or the array is null
then
false
is returned. If all elements in array are not
null
or the array is empty (contains no elements) true
is returned.
ObjectUtils.allNotNull(*) = true ObjectUtils.allNotNull(*, *) = true ObjectUtils.allNotNull(null) = false ObjectUtils.allNotNull(null, null) = false ObjectUtils.allNotNull(null, *) = false ObjectUtils.allNotNull(*, null) = false ObjectUtils.allNotNull(*, *, null, *) = false
values
- the values to test, may be null
or emptyfalse
if there is at least one null
value in the array or the array is null
,
true
if all values in the array are not null
s or array contains no elements.public static boolean anyNull(Object... values)
null
.
If any of the values are null
or the array is null
,
then true
is returned, otherwise false
is returned.
ObjectUtils.anyNull(*) = false ObjectUtils.anyNull(*, *) = false ObjectUtils.anyNull(null) = true ObjectUtils.anyNull(null, null) = true ObjectUtils.anyNull(null, *) = true ObjectUtils.anyNull(*, null) = true ObjectUtils.anyNull(*, *, null, *) = true
values
- the values to test, may be null
or emptytrue
if there is at least one null
value in the array,
false
if all the values are non-null.
If the array is null
or empty, true
is also returned.public static boolean anyNotNull(Object... values)
null
.
If all the values are null
or the array is null
or empty then false
is returned. Otherwise true
is returned.
ObjectUtils.anyNotNull(*) = true ObjectUtils.anyNotNull(*, null) = true ObjectUtils.anyNotNull(null, *) = true ObjectUtils.anyNotNull(null, null, *, *) = true ObjectUtils.anyNotNull(null) = false ObjectUtils.anyNotNull(null, null) = false
values
- the values to test, may be null
or emptytrue
if there is at least one non-null value in the array,
false
if all values in the array are null
s.
If the array is null
or empty false
is also returned.public static <T> T clone(T obj)
Clone an object.
T
- the type of the objectobj
- the object to clone, null returns nullCloneable
otherwise null
CloneFailedException
- if the object is cloneable and the clone operation failspublic static <T> T cloneIfPossible(T obj)
Clone an object if possible.
This method is similar to clone(Object)
, but will return the provided
instance as the return value instead of null
if the instance
is not cloneable. This is more convenient if the caller uses different
implementations (e.g. of a service) and some of the implementations do not allow concurrent
processing or have state. In such cases the implementation can simply provide a proper
clone implementation and the caller's code does not have to change.
T
- the type of the objectobj
- the object to clone, null returns nullCloneable
otherwise the object itselfCloneFailedException
- if the object is cloneable and the clone operation failspublic static <T extends Comparable<? super T>> int compare(T c1, T c2)
Null safe comparison of Comparables.
null
is assumed to be less than a non-null
value.
T
- type of the values processed by this methodc1
- the first comparable, may be nullc2
- the second comparable, may be nullpublic static <T extends Comparable<? super T>> int compare(T c1, T c2, boolean nullGreater)
Null safe comparison of Comparables.
T
- type of the values processed by this methodc1
- the first comparable, may be nullc2
- the second comparable, may be nullnullGreater
- if true null
is considered greater
than a non-null
value or if false null
is
considered less than a Non-null
valueComparator.compare(Object, Object)
public static boolean CONST(boolean v)
public final static boolean MAGIC_FLAG = ObjectUtils.CONST(true);This way any jars that refer to this field do not have to recompile themselves if the field's value changes at some future date.
v
- the boolean value to returnpublic static byte CONST(byte v)
public final static byte MAGIC_BYTE = ObjectUtils.CONST((byte) 127);This way any jars that refer to this field do not have to recompile themselves if the field's value changes at some future date.
v
- the byte value to returnpublic static char CONST(char v)
public final static char MAGIC_CHAR = ObjectUtils.CONST('a');This way any jars that refer to this field do not have to recompile themselves if the field's value changes at some future date.
v
- the char value to returnpublic static double CONST(double v)
public final static double MAGIC_DOUBLE = ObjectUtils.CONST(1.0);This way any jars that refer to this field do not have to recompile themselves if the field's value changes at some future date.
v
- the double value to returnpublic static float CONST(float v)
public final static float MAGIC_FLOAT = ObjectUtils.CONST(1.0f);This way any jars that refer to this field do not have to recompile themselves if the field's value changes at some future date.
v
- the float value to returnpublic static int CONST(int v)
public final static int MAGIC_INT = ObjectUtils.CONST(123);This way any jars that refer to this field do not have to recompile themselves if the field's value changes at some future date.
v
- the int value to returnpublic static long CONST(long v)
public final static long MAGIC_LONG = ObjectUtils.CONST(123L);This way any jars that refer to this field do not have to recompile themselves if the field's value changes at some future date.
v
- the long value to returnpublic static short CONST(short v)
public final static short MAGIC_SHORT = ObjectUtils.CONST((short) 123);This way any jars that refer to this field do not have to recompile themselves if the field's value changes at some future date.
v
- the short value to returnpublic static <T> T CONST(T v)
public final static String MAGIC_STRING = ObjectUtils.CONST("abc");This way any jars that refer to this field do not have to recompile themselves if the field's value changes at some future date.
T
- the Object typev
- the genericized Object value to return (typically a String).public static byte CONST_BYTE(int v)
public final static byte MAGIC_BYTE = ObjectUtils.CONST_BYTE(127);This way any jars that refer to this field do not have to recompile themselves if the field's value changes at some future date.
v
- the byte literal (as an int) value to returnIllegalArgumentException
- if the value passed to v
is larger than a byte, that is, smaller than -128 or
larger than 127.public static short CONST_SHORT(int v)
public final static short MAGIC_SHORT = ObjectUtils.CONST_SHORT(127);This way any jars that refer to this field do not have to recompile themselves if the field's value changes at some future date.
v
- the short literal (as an int) value to returnIllegalArgumentException
- if the value passed to v
is larger than a short, that is, smaller than -32768 or
larger than 32767.public static <T> T defaultIfNull(T object, T defaultValue)
Returns a default value if the object passed is null
.
ObjectUtils.defaultIfNull(null, null) = null ObjectUtils.defaultIfNull(null, "") = "" ObjectUtils.defaultIfNull(null, "zz") = "zz" ObjectUtils.defaultIfNull("abc", *) = "abc" ObjectUtils.defaultIfNull(Boolean.TRUE, *) = Boolean.TRUE
T
- the type of the objectobject
- the Object
to test, may be null
defaultValue
- the default value to return, may be null
object
if it is not null
, defaultValue otherwise
TODO Rename to getIfNull in 4.0@Deprecated public static boolean equals(Object object1, Object object2)
java.util.Objects.equals(Object, Object)
in Java 7 and will
be removed from future releases.Compares two objects for equality, where either one or both
objects may be null
.
ObjectUtils.equals(null, null) = true ObjectUtils.equals(null, "") = false ObjectUtils.equals("", null) = false ObjectUtils.equals("", "") = true ObjectUtils.equals(Boolean.TRUE, null) = false ObjectUtils.equals(Boolean.TRUE, "true") = false ObjectUtils.equals(Boolean.TRUE, Boolean.TRUE) = true ObjectUtils.equals(Boolean.TRUE, Boolean.FALSE) = false
object1
- the first object, may be null
object2
- the second object, may be null
true
if the values of both objects are the same@SafeVarargs public static <T> T firstNonNull(T... values)
Returns the first value in the array which is not null
.
If all the values are null
or the array is null
or empty then null
is returned.
ObjectUtils.firstNonNull(null, null) = null ObjectUtils.firstNonNull(null, "") = "" ObjectUtils.firstNonNull(null, null, "") = "" ObjectUtils.firstNonNull(null, "zz") = "zz" ObjectUtils.firstNonNull("abc", *) = "abc" ObjectUtils.firstNonNull(null, "xyz", *) = "xyz" ObjectUtils.firstNonNull(Boolean.TRUE, *) = Boolean.TRUE ObjectUtils.firstNonNull() = null
T
- the component type of the arrayvalues
- the values to test, may be null
or emptyvalues
which is not null
,
or null
if there are no non-null values@SafeVarargs public static <T> T getFirstNonNull(Supplier<T>... suppliers)
Executes the given suppliers in order and returns the first return
value where a value other than null
is returned.
Once a non-null
value is obtained, all following suppliers are
not executed anymore.
If all the return values are null
or no suppliers are provided
then null
is returned.
ObjectUtils.firstNonNullLazy(null, () -> null) = null ObjectUtils.firstNonNullLazy(() -> null, () -> "") = "" ObjectUtils.firstNonNullLazy(() -> "", () -> throw new IllegalStateException()) = "" ObjectUtils.firstNonNullLazy(() -> null, () -> "zz) = "zz" ObjectUtils.firstNonNullLazy() = null
T
- the type of the return valuessuppliers
- the suppliers returning the values to test.
null
values are ignored.
Suppliers may return null
or a value of type @{code T}suppliers
which is not null
,
or null
if there are no non-null valuespublic static <T> T getIfNull(T object, Supplier<T> defaultSupplier)
Returns the given object
is it is non-null, otherwise returns the Supplier's Supplier.get()
value.
The caller responsible for thread-safety and exception handling of default value supplier.
ObjectUtils.getIfNull(null, () -> null) = null ObjectUtils.getIfNull(null, null) = null ObjectUtils.getIfNull(null, () -> "") = "" ObjectUtils.getIfNull(null, () -> "zz") = "zz" ObjectUtils.getIfNull("abc", *) = "abc" ObjectUtils.getIfNull(Boolean.TRUE, *) = Boolean.TRUE
T
- the type of the objectobject
- the Object
to test, may be null
defaultSupplier
- the default value to return, may be null
object
if it is not null
, defaultValueSupplier.get()
otherwise@Deprecated public static int hashCode(Object obj)
java.util.Objects.hashCode(Object)
in Java 7 and will be
removed in future releasesGets the hash code of an object returning zero when the
object is null
.
ObjectUtils.hashCode(null) = 0 ObjectUtils.hashCode(obj) = obj.hashCode()
obj
- the object to obtain the hash code of, may be null
@Deprecated public static int hashCodeMulti(Object... objects)
java.util.Objects.hash(Object...)
in Java 7 and will be
removed in future releases.Gets the hash code for multiple objects.
This allows a hash code to be rapidly calculated for a number of objects.
The hash code for a single object is the not same as hashCode(Object)
.
The hash code for multiple objects is the same as that calculated by an
ArrayList
containing the specified objects.
ObjectUtils.hashCodeMulti() = 1 ObjectUtils.hashCodeMulti((Object[]) null) = 1 ObjectUtils.hashCodeMulti(a) = 31 + a.hashCode() ObjectUtils.hashCodeMulti(a,b) = (31 + a.hashCode()) * 31 + b.hashCode() ObjectUtils.hashCodeMulti(a,b,c) = ((31 + a.hashCode()) * 31 + b.hashCode()) * 31 + c.hashCode()
objects
- the objects to obtain the hash code of, may be null
public static void identityToString(Appendable appendable, Object object) throws IOException
Appends the toString that would be produced by Object
if a class did not override toString itself. null
will throw a NullPointerException for either of the two parameters.
ObjectUtils.identityToString(appendable, "") = appendable.append("java.lang.String@1e23" ObjectUtils.identityToString(appendable, Boolean.TRUE) = appendable.append("java.lang.Boolean@7fa" ObjectUtils.identityToString(appendable, Boolean.TRUE) = appendable.append("java.lang.Boolean@7fa")
appendable
- the appendable to append toobject
- the object to create a toString forIOException
- if an I/O error occurspublic static String identityToString(Object object)
Gets the toString that would be produced by Object
if a class did not override toString itself. null
will return null
.
ObjectUtils.identityToString(null) = null ObjectUtils.identityToString("") = "java.lang.String@1e23" ObjectUtils.identityToString(Boolean.TRUE) = "java.lang.Boolean@7fa"
object
- the object to create a toString for, may be
null
null
if
null
passed in@Deprecated public static void identityToString(StrBuilder builder, Object object)
identityToString
methods insteadAppends the toString that would be produced by Object
if a class did not override toString itself. null
will throw a NullPointerException for either of the two parameters.
ObjectUtils.identityToString(builder, "") = builder.append("java.lang.String@1e23" ObjectUtils.identityToString(builder, Boolean.TRUE) = builder.append("java.lang.Boolean@7fa" ObjectUtils.identityToString(builder, Boolean.TRUE) = builder.append("java.lang.Boolean@7fa")
builder
- the builder to append toobject
- the object to create a toString forpublic static void identityToString(StringBuffer buffer, Object object)
Appends the toString that would be produced by Object
if a class did not override toString itself. null
will throw a NullPointerException for either of the two parameters.
ObjectUtils.identityToString(buf, "") = buf.append("java.lang.String@1e23" ObjectUtils.identityToString(buf, Boolean.TRUE) = buf.append("java.lang.Boolean@7fa" ObjectUtils.identityToString(buf, Boolean.TRUE) = buf.append("java.lang.Boolean@7fa")
buffer
- the buffer to append toobject
- the object to create a toString forpublic static void identityToString(StringBuilder builder, Object object)
Appends the toString that would be produced by Object
if a class did not override toString itself. null
will throw a NullPointerException for either of the two parameters.
ObjectUtils.identityToString(builder, "") = builder.append("java.lang.String@1e23" ObjectUtils.identityToString(builder, Boolean.TRUE) = builder.append("java.lang.Boolean@7fa" ObjectUtils.identityToString(builder, Boolean.TRUE) = builder.append("java.lang.Boolean@7fa")
builder
- the builder to append toobject
- the object to create a toString forpublic static boolean isEmpty(Object object)
Checks if an Object is empty or null.
The following types are supported:CharSequence
: Considered empty if its length is zero.Array
: Considered empty if its length is zero.Collection
: Considered empty if it has zero elements.Map
: Considered empty if it has zero key-value mappings.ObjectUtils.isEmpty(null) = true ObjectUtils.isEmpty("") = true ObjectUtils.isEmpty("ab") = false ObjectUtils.isEmpty(new int[]{}) = true ObjectUtils.isEmpty(new int[]{1,2,3}) = false ObjectUtils.isEmpty(1234) = false
object
- the Object
to test, may be null
true
if the object has a supported type and is empty or null,
false
otherwisepublic static boolean isNotEmpty(Object object)
Checks if an Object is not empty and not null.
The following types are supported:CharSequence
: Considered empty if its length is zero.Array
: Considered empty if its length is zero.Collection
: Considered empty if it has zero elements.Map
: Considered empty if it has zero key-value mappings.ObjectUtils.isNotEmpty(null) = false ObjectUtils.isNotEmpty("") = false ObjectUtils.isNotEmpty("ab") = true ObjectUtils.isNotEmpty(new int[]{}) = false ObjectUtils.isNotEmpty(new int[]{1,2,3}) = true ObjectUtils.isNotEmpty(1234) = true
object
- the Object
to test, may be null
true
if the object has an unsupported type or is not empty
and not null, false
otherwise@SafeVarargs public static <T extends Comparable<? super T>> T max(T... values)
Null safe comparison of Comparables.
T
- type of the values processed by this methodvalues
- the set of comparable values, may be null@SafeVarargs public static <T> T median(Comparator<T> comparator, T... items)
T
- type of values processed by this methodcomparator
- to use for comparisonsitems
- to compareNullPointerException
- if items or comparator is null
IllegalArgumentException
- if items is empty or contains null
values@SafeVarargs public static <T extends Comparable<? super T>> T median(T... items)
T
- type of values processed by this methoditems
- to compareNullPointerException
- if items is null
IllegalArgumentException
- if items is empty or contains null
values@SafeVarargs public static <T extends Comparable<? super T>> T min(T... values)
Null safe comparison of Comparables.
T
- type of the values processed by this methodvalues
- the set of comparable values, may be null@SafeVarargs public static <T> T mode(T... items)
T
- type of values processed by this methoditems
- to checknull
if non-unique or no items suppliedpublic static boolean notEqual(Object object1, Object object2)
Compares two objects for inequality, where either one or both
objects may be null
.
ObjectUtils.notEqual(null, null) = false ObjectUtils.notEqual(null, "") = true ObjectUtils.notEqual("", null) = true ObjectUtils.notEqual("", "") = false ObjectUtils.notEqual(Boolean.TRUE, null) = true ObjectUtils.notEqual(Boolean.TRUE, "true") = true ObjectUtils.notEqual(Boolean.TRUE, Boolean.TRUE) = false ObjectUtils.notEqual(Boolean.TRUE, Boolean.FALSE) = true
object1
- the first object, may be null
object2
- the second object, may be null
false
if the values of both objects are the same@Deprecated public static String toString(Object obj)
java.util.Objects.toString(Object)
in Java 7 and will be
removed in future releases. Note however that said method will return "null" for null references, while this
method returns an empty String. To preserve behavior use java.util.Objects.toString(myObject, "")
Gets the toString
of an Object
returning
an empty string ("") if null
input.
ObjectUtils.toString(null) = "" ObjectUtils.toString("") = "" ObjectUtils.toString("bat") = "bat" ObjectUtils.toString(Boolean.TRUE) = "true"
obj
- the Object to toString
, may be null""
if null
inputStringUtils.defaultString(String)
,
String.valueOf(Object)
@Deprecated public static String toString(Object obj, String nullStr)
java.util.Objects.toString(Object, String)
in Java 7 and
will be removed in future releases.Gets the toString
of an Object
returning
a specified text if null
input.
ObjectUtils.toString(null, null) = null ObjectUtils.toString(null, "null") = "null" ObjectUtils.toString("", "null") = "" ObjectUtils.toString("bat", "null") = "bat" ObjectUtils.toString(Boolean.TRUE, "null") = "true"
obj
- the Object to toString
, may be nullnullStr
- the String to return if null
input, may be nullnullStr
if null
inputStringUtils.defaultString(String,String)
,
String.valueOf(Object)
public static String toString(Object obj, Supplier<String> supplier)
Gets the toString
of an Object
returning
a specified text if null
input.
ObjectUtils.toString(obj, () -> expensive())
ObjectUtils.toString(null, () -> expensive()) = result of expensive() ObjectUtils.toString(null, () -> expensive()) = result of expensive() ObjectUtils.toString("", () -> expensive()) = "" ObjectUtils.toString("bat", () -> expensive()) = "bat" ObjectUtils.toString(Boolean.TRUE, () -> expensive()) = "true"
obj
- the Object to toString
, may be nullsupplier
- the Supplier of String used on null
input, may be nullnullStr
if null
inputCopyright © 2001–2020 The Apache Software Foundation. All rights reserved.