Struct snarkvm_circuit_types_field::Field
source · [−]pub struct Field<E: Environment> { /* private fields */ }
Trait Implementations
sourceimpl<E: Environment> Add<&Field<E>> for &Field<E>
impl<E: Environment> Add<&Field<E>> for &Field<E>
sourceimpl<E: Environment> Add<&Field<E>> for Field<E>
impl<E: Environment> Add<&Field<E>> for Field<E>
sourceimpl<E: Environment> Add<Field<E>> for &Field<E>
impl<E: Environment> Add<Field<E>> for &Field<E>
sourceimpl<E: Environment> Add<Field<E>> for Field<E>
impl<E: Environment> Add<Field<E>> for Field<E>
sourceimpl<E: Environment> AddAssign<&Field<E>> for Field<E>
impl<E: Environment> AddAssign<&Field<E>> for Field<E>
sourcefn add_assign(&mut self, other: &Field<E>)
fn add_assign(&mut self, other: &Field<E>)
Performs the +=
operation. Read more
sourceimpl<E: Environment> AddAssign<Field<E>> for Field<E>
impl<E: Environment> AddAssign<Field<E>> for Field<E>
sourcefn add_assign(&mut self, other: Field<E>)
fn add_assign(&mut self, other: Field<E>)
Performs the +=
operation. Read more
sourceimpl<E: Environment> Compare<Field<E>> for Field<E>
impl<E: Environment> Compare<Field<E>> for Field<E>
sourcefn is_less_than(&self, other: &Self) -> Self::Output
fn is_less_than(&self, other: &Self) -> Self::Output
Returns true
if self
is less than other
.
sourcefn is_greater_than(&self, other: &Self) -> Self::Output
fn is_greater_than(&self, other: &Self) -> Self::Output
Returns true
if self
is greater than other
.
sourcefn is_less_than_or_equal(&self, other: &Self) -> Self::Output
fn is_less_than_or_equal(&self, other: &Self) -> Self::Output
Returns true
if self
is less than or equal to other
.
sourcefn is_greater_than_or_equal(&self, other: &Self) -> Self::Output
fn is_greater_than_or_equal(&self, other: &Self) -> Self::Output
Returns true
if self
is greater than or equal to other
.
type Output = Boolean<E>
sourceimpl<E: Environment> Debug for Field<E>
impl<E: Environment> Debug for Field<E>
sourceimpl<E: Environment> Display for Field<E>
impl<E: Environment> Display for Field<E>
sourceimpl<E: Environment> Div<&Field<E>> for &Field<E>
impl<E: Environment> Div<&Field<E>> for &Field<E>
sourceimpl<E: Environment> Div<&Field<E>> for Field<E>
impl<E: Environment> Div<&Field<E>> for Field<E>
sourceimpl<E: Environment> Div<Field<E>> for &Field<E>
impl<E: Environment> Div<Field<E>> for &Field<E>
sourceimpl<E: Environment> Div<Field<E>> for Field<E>
impl<E: Environment> Div<Field<E>> for Field<E>
sourceimpl<E: Environment> DivAssign<&Field<E>> for Field<E>
impl<E: Environment> DivAssign<&Field<E>> for Field<E>
sourcefn div_assign(&mut self, other: &Self)
fn div_assign(&mut self, other: &Self)
Performs the /=
operation. Read more
sourceimpl<E: Environment> DivAssign<Field<E>> for Field<E>
impl<E: Environment> DivAssign<Field<E>> for Field<E>
sourcefn div_assign(&mut self, other: Self)
fn div_assign(&mut self, other: Self)
Performs the /=
operation. Read more
sourceimpl<E: Environment> Double for Field<E>
impl<E: Environment> Double for Field<E>
sourceimpl<E: Environment> Eject for Field<E>
impl<E: Environment> Eject for Field<E>
sourcefn eject_mode(&self) -> Mode
fn eject_mode(&self) -> Mode
Ejects the mode of the field circuit.
sourcefn eject_value(&self) -> Self::Primitive
fn eject_value(&self) -> Self::Primitive
Ejects the field circuit as a console field.
type Primitive = Field<<E as Environment>::Network>
sourcefn eject(&self) -> (Mode, Self::Primitive)
fn eject(&self) -> (Mode, Self::Primitive)
Ejects the mode and primitive value of the circuit type. Read more
sourcefn is_constant(&self) -> bool
fn is_constant(&self) -> bool
Returns true
if the circuit is a constant. Read more
sourcefn is_private(&self) -> bool
fn is_private(&self) -> bool
Returns true
if the circuit is a private. Read more
sourceimpl<E: Environment> Equal<Field<E>> for Field<E>
impl<E: Environment> Equal<Field<E>> for Field<E>
sourcefn is_equal(&self, other: &Self) -> Self::Output
fn is_equal(&self, other: &Self) -> Self::Output
Returns true
if self
and other
are equal.
This method costs 3 constraints.
sourcefn is_not_equal(&self, other: &Self) -> Self::Output
fn is_not_equal(&self, other: &Self) -> Self::Output
Returns true
if self
and other
are not equal.
This method constructs a boolean that indicates if
self
and other
are not equal to each other.
This method costs 3 constraints.
type Output = Boolean<E>
sourceimpl<E: Environment> From<&Field<E>> for LinearCombination<E::BaseField>
impl<E: Environment> From<&Field<E>> for LinearCombination<E::BaseField>
sourceimpl<E: Environment> From<&LinearCombination<<E as Environment>::BaseField>> for Field<E>
impl<E: Environment> From<&LinearCombination<<E as Environment>::BaseField>> for Field<E>
sourcefn from(linear_combination: &LinearCombination<E::BaseField>) -> Self
fn from(linear_combination: &LinearCombination<E::BaseField>) -> Self
Converts to this type from the input type.
sourceimpl<E: Environment> From<Field<E>> for LinearCombination<E::BaseField>
impl<E: Environment> From<Field<E>> for LinearCombination<E::BaseField>
sourceimpl<E: Environment> From<LinearCombination<<E as Environment>::BaseField>> for Field<E>
impl<E: Environment> From<LinearCombination<<E as Environment>::BaseField>> for Field<E>
sourcefn from(linear_combination: LinearCombination<E::BaseField>) -> Self
fn from(linear_combination: LinearCombination<E::BaseField>) -> Self
Converts to this type from the input type.
sourceimpl<E: Environment> FromBits for Field<E>
impl<E: Environment> FromBits for Field<E>
sourcefn from_bits_le(bits_le: &[Self::Boolean]) -> Self
fn from_bits_le(bits_le: &[Self::Boolean]) -> Self
Initializes a new base field element from a list of little-endian bits.
- If
bits_le
is longer thanE::BaseField::size_in_bits()
, the excess bits are enforced to be0
s. - If
bits_le
is shorter thanE::BaseField::size_in_bits()
, it is padded with0
s up to base field size.
sourcefn from_bits_be(bits_be: &[Self::Boolean]) -> Self
fn from_bits_be(bits_be: &[Self::Boolean]) -> Self
Initializes a new base field element from a list of big-endian bits without leading zeros.
type Boolean = Boolean<E>
sourceimpl<E: Environment> FromBoolean for Field<E>
impl<E: Environment> FromBoolean for Field<E>
sourcefn from_boolean(boolean: &Self::Boolean) -> Self
fn from_boolean(boolean: &Self::Boolean) -> Self
Initializes a base field from a boolean.
type Boolean = Boolean<E>
sourceimpl<E: Environment> FromStr for Field<E>
impl<E: Environment> FromStr for Field<E>
sourceimpl<E: Environment> Inject for Field<E>
impl<E: Environment> Inject for Field<E>
sourceimpl<E: Environment> Inv for &Field<E>
impl<E: Environment> Inv for &Field<E>
sourceimpl<E: Environment> Inv for Field<E>
impl<E: Environment> Inv for Field<E>
sourceimpl<E: Environment> Inverse for Field<E>
impl<E: Environment> Inverse for Field<E>
sourceimpl<E: Environment> Metrics<dyn Double<Output = Field<E>> + 'static> for Field<E>
impl<E: Environment> Metrics<dyn Double<Output = Field<E>> + 'static> for Field<E>
sourceimpl<E: Environment> Metrics<dyn FromBoolean<Boolean = Boolean<E>> + 'static> for Field<E>
impl<E: Environment> Metrics<dyn FromBoolean<Boolean = Boolean<E>> + 'static> for Field<E>
sourceimpl<E: Environment> Metrics<dyn Pow<Field<E>, Output = Field<E>> + 'static> for Field<E>
impl<E: Environment> Metrics<dyn Pow<Field<E>, Output = Field<E>> + 'static> for Field<E>
type Case = (CircuitType<Field<E>>, CircuitType<Field<E>>)
sourceimpl<E: Environment> Metrics<dyn Square<Output = Field<E>> + 'static> for Field<E>
impl<E: Environment> Metrics<dyn Square<Output = Field<E>> + 'static> for Field<E>
sourceimpl<E: Environment> Metrics<dyn SquareRoot<Output = Field<E>> + 'static> for Field<E>
impl<E: Environment> Metrics<dyn SquareRoot<Output = Field<E>> + 'static> for Field<E>
sourceimpl<E: Environment> Metrics<dyn Ternary<Output = Field<E>, Boolean = Boolean<E>> + 'static> for Field<E>
impl<E: Environment> Metrics<dyn Ternary<Output = Field<E>, Boolean = Boolean<E>> + 'static> for Field<E>
sourceimpl<E: Environment> Metrics<dyn ToLowerBits<Boolean = Boolean<E>> + 'static> for Field<E>
impl<E: Environment> Metrics<dyn ToLowerBits<Boolean = Boolean<E>> + 'static> for Field<E>
sourceimpl<E: Environment> Metrics<dyn ToUpperBits<Boolean = Boolean<E>> + 'static> for Field<E>
impl<E: Environment> Metrics<dyn ToUpperBits<Boolean = Boolean<E>> + 'static> for Field<E>
sourceimpl<E: Environment> Mul<&Field<E>> for &Field<E>
impl<E: Environment> Mul<&Field<E>> for &Field<E>
sourceimpl<E: Environment> Mul<&Field<E>> for Field<E>
impl<E: Environment> Mul<&Field<E>> for Field<E>
sourceimpl<E: Environment> Mul<Field<E>> for &Field<E>
impl<E: Environment> Mul<Field<E>> for &Field<E>
sourceimpl<E: Environment> Mul<Field<E>> for Field<E>
impl<E: Environment> Mul<Field<E>> for Field<E>
sourceimpl<E: Environment> MulAssign<&Field<E>> for Field<E>
impl<E: Environment> MulAssign<&Field<E>> for Field<E>
sourcefn mul_assign(&mut self, other: &Field<E>)
fn mul_assign(&mut self, other: &Field<E>)
Performs the *=
operation. Read more
sourceimpl<E: Environment> MulAssign<Field<E>> for Field<E>
impl<E: Environment> MulAssign<Field<E>> for Field<E>
sourcefn mul_assign(&mut self, other: Field<E>)
fn mul_assign(&mut self, other: Field<E>)
Performs the *=
operation. Read more
sourceimpl<E: Environment> Neg for &Field<E>
impl<E: Environment> Neg for &Field<E>
sourceimpl<E: Environment> Neg for Field<E>
impl<E: Environment> Neg for Field<E>
sourceimpl<E: Environment> One for Field<E>
impl<E: Environment> One for Field<E>
sourceimpl<E: Environment> OutputMode<dyn Add<Field<E>, Output = Field<E>> + 'static> for Field<E>
impl<E: Environment> OutputMode<dyn Add<Field<E>, Output = Field<E>> + 'static> for Field<E>
type Case = (CircuitType<Field<E>>, CircuitType<Field<E>>)
sourcefn output_mode(case: &Self::Case) -> Mode
fn output_mode(case: &Self::Case) -> Mode
Returns the mode of the output.
sourceimpl<E: Environment> OutputMode<dyn Div<Field<E>, Output = Field<E>> + 'static> for Field<E>
impl<E: Environment> OutputMode<dyn Div<Field<E>, Output = Field<E>> + 'static> for Field<E>
type Case = (CircuitType<Field<E>>, CircuitType<Field<E>>)
sourcefn output_mode(case: &Self::Case) -> Mode
fn output_mode(case: &Self::Case) -> Mode
Returns the mode of the output.
sourceimpl<E: Environment> OutputMode<dyn Double<Output = Field<E>> + 'static> for Field<E>
impl<E: Environment> OutputMode<dyn Double<Output = Field<E>> + 'static> for Field<E>
sourceimpl<E: Environment> OutputMode<dyn Equal<Field<E>, Output = Boolean<E>> + 'static> for Field<E>
impl<E: Environment> OutputMode<dyn Equal<Field<E>, Output = Boolean<E>> + 'static> for Field<E>
sourceimpl<E: Environment> OutputMode<dyn FromBits<Boolean = Boolean<E>> + 'static> for Field<E>
impl<E: Environment> OutputMode<dyn FromBits<Boolean = Boolean<E>> + 'static> for Field<E>
sourceimpl<E: Environment> OutputMode<dyn FromBoolean<Boolean = Boolean<E>> + 'static> for Field<E>
impl<E: Environment> OutputMode<dyn FromBoolean<Boolean = Boolean<E>> + 'static> for Field<E>
sourceimpl<E: Environment> OutputMode<dyn Inverse<Output = Field<E>> + 'static> for Field<E>
impl<E: Environment> OutputMode<dyn Inverse<Output = Field<E>> + 'static> for Field<E>
sourceimpl<E: Environment> OutputMode<dyn Mul<Field<E>, Output = Field<E>> + 'static> for Field<E>
impl<E: Environment> OutputMode<dyn Mul<Field<E>, Output = Field<E>> + 'static> for Field<E>
type Case = (CircuitType<Field<E>>, CircuitType<Field<E>>)
sourcefn output_mode(case: &Self::Case) -> Mode
fn output_mode(case: &Self::Case) -> Mode
Returns the mode of the output.
sourceimpl<E: Environment> OutputMode<dyn Neg<Output = Field<E>> + 'static> for Field<E>
impl<E: Environment> OutputMode<dyn Neg<Output = Field<E>> + 'static> for Field<E>
sourceimpl<E: Environment> OutputMode<dyn One<Boolean = Boolean<E>> + 'static> for Field<E>
impl<E: Environment> OutputMode<dyn One<Boolean = Boolean<E>> + 'static> for Field<E>
sourceimpl<E: Environment> OutputMode<dyn Pow<Field<E>, Output = Field<E>> + 'static> for Field<E>
impl<E: Environment> OutputMode<dyn Pow<Field<E>, Output = Field<E>> + 'static> for Field<E>
type Case = (CircuitType<Field<E>>, CircuitType<Field<E>>)
sourcefn output_mode(case: &Self::Case) -> Mode
fn output_mode(case: &Self::Case) -> Mode
Returns the mode of the output.
sourceimpl<E: Environment> OutputMode<dyn Square<Output = Field<E>> + 'static> for Field<E>
impl<E: Environment> OutputMode<dyn Square<Output = Field<E>> + 'static> for Field<E>
sourceimpl<E: Environment> OutputMode<dyn SquareRoot<Output = Field<E>> + 'static> for Field<E>
impl<E: Environment> OutputMode<dyn SquareRoot<Output = Field<E>> + 'static> for Field<E>
sourceimpl<E: Environment> OutputMode<dyn Sub<Field<E>, Output = Field<E>> + 'static> for Field<E>
impl<E: Environment> OutputMode<dyn Sub<Field<E>, Output = Field<E>> + 'static> for Field<E>
type Case = (CircuitType<Field<E>>, CircuitType<Field<E>>)
sourcefn output_mode(case: &Self::Case) -> Mode
fn output_mode(case: &Self::Case) -> Mode
Returns the mode of the output.
sourceimpl<E: Environment> OutputMode<dyn Ternary<Output = Field<E>, Boolean = Boolean<E>> + 'static> for Field<E>
impl<E: Environment> OutputMode<dyn Ternary<Output = Field<E>, Boolean = Boolean<E>> + 'static> for Field<E>
type Case = (CircuitType<Boolean<E>>, Mode, Mode)
sourcefn output_mode(parameter: &Self::Case) -> Mode
fn output_mode(parameter: &Self::Case) -> Mode
Returns the mode of the output.
sourceimpl<E: Environment> OutputMode<dyn ToBits<Boolean = Boolean<E>> + 'static> for Field<E>
impl<E: Environment> OutputMode<dyn ToBits<Boolean = Boolean<E>> + 'static> for Field<E>
sourceimpl<E: Environment> OutputMode<dyn ToLowerBits<Boolean = Boolean<E>> + 'static> for Field<E>
impl<E: Environment> OutputMode<dyn ToLowerBits<Boolean = Boolean<E>> + 'static> for Field<E>
sourceimpl<E: Environment> OutputMode<dyn ToUpperBits<Boolean = Boolean<E>> + 'static> for Field<E>
impl<E: Environment> OutputMode<dyn ToUpperBits<Boolean = Boolean<E>> + 'static> for Field<E>
sourceimpl<E: Environment> OutputMode<dyn Zero<Boolean = Boolean<E>> + 'static> for Field<E>
impl<E: Environment> OutputMode<dyn Zero<Boolean = Boolean<E>> + 'static> for Field<E>
sourceimpl<E: Environment> Parser for Field<E>
impl<E: Environment> Parser for Field<E>
sourceimpl<E: Environment> Pow<&Field<E>> for &Field<E>
impl<E: Environment> Pow<&Field<E>> for &Field<E>
sourceimpl<E: Environment> Pow<&Field<E>> for Field<E>
impl<E: Environment> Pow<&Field<E>> for Field<E>
sourceimpl<E: Environment> Pow<Field<E>> for &Field<E>
impl<E: Environment> Pow<Field<E>> for &Field<E>
sourceimpl<E: Environment> Pow<Field<E>> for Field<E>
impl<E: Environment> Pow<Field<E>> for Field<E>
sourceimpl<E: Environment> Square for Field<E>
impl<E: Environment> Square for Field<E>
sourceimpl<E: Environment> SquareRoot for Field<E>
impl<E: Environment> SquareRoot for Field<E>
type Output = Field<E>
fn square_root(&self) -> Self::Output
sourceimpl<E: Environment> Sub<&Field<E>> for &Field<E>
impl<E: Environment> Sub<&Field<E>> for &Field<E>
sourceimpl<E: Environment> Sub<&Field<E>> for Field<E>
impl<E: Environment> Sub<&Field<E>> for Field<E>
sourceimpl<E: Environment> Sub<Field<E>> for &Field<E>
impl<E: Environment> Sub<Field<E>> for &Field<E>
sourceimpl<E: Environment> Sub<Field<E>> for Field<E>
impl<E: Environment> Sub<Field<E>> for Field<E>
sourceimpl<E: Environment> SubAssign<&Field<E>> for Field<E>
impl<E: Environment> SubAssign<&Field<E>> for Field<E>
sourcefn sub_assign(&mut self, other: &Field<E>)
fn sub_assign(&mut self, other: &Field<E>)
Performs the -=
operation. Read more
sourceimpl<E: Environment> SubAssign<Field<E>> for Field<E>
impl<E: Environment> SubAssign<Field<E>> for Field<E>
sourcefn sub_assign(&mut self, other: Field<E>)
fn sub_assign(&mut self, other: Field<E>)
Performs the -=
operation. Read more
sourceimpl<E: Environment> Ternary for Field<E>
impl<E: Environment> Ternary for Field<E>
sourceimpl<E: Environment> ToBits for &Field<E>
impl<E: Environment> ToBits for &Field<E>
sourcefn to_bits_le(&self) -> Vec<Self::Boolean>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A> where
A: Allocator,
fn to_bits_le(&self) -> Vec<Self::Boolean>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A> where
A: Allocator,
A: Allocator,
Outputs the little-endian bit representation of self
without trailing zeros.
sourcefn to_bits_be(&self) -> Vec<Self::Boolean>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A> where
A: Allocator,
fn to_bits_be(&self) -> Vec<Self::Boolean>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A> where
A: Allocator,
A: Allocator,
Outputs the big-endian bit representation of self
without leading zeros.
type Boolean = Boolean<E>
sourceimpl<E: Environment> ToBits for Field<E>
impl<E: Environment> ToBits for Field<E>
sourcefn to_bits_le(&self) -> Vec<Self::Boolean>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A> where
A: Allocator,
fn to_bits_le(&self) -> Vec<Self::Boolean>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A> where
A: Allocator,
A: Allocator,
Outputs the little-endian bit representation of self
without trailing zeros.
sourcefn to_bits_be(&self) -> Vec<Self::Boolean>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A> where
A: Allocator,
fn to_bits_be(&self) -> Vec<Self::Boolean>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A> where
A: Allocator,
A: Allocator,
Outputs the big-endian bit representation of self
without leading zeros.
type Boolean = Boolean<E>
sourceimpl<E: Environment> ToLowerBits for Field<E>
impl<E: Environment> ToLowerBits for Field<E>
sourcefn to_lower_bits_le(&self, k: usize) -> Vec<Self::Boolean>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A> where
A: Allocator,
fn to_lower_bits_le(&self, k: usize) -> Vec<Self::Boolean>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A> where
A: Allocator,
A: Allocator,
Outputs the lower k
bits of an n
-bit field element in little-endian representation.
Enforces that the upper n - k
bits are zero.
sourcefn to_lower_bits_be(&self, k: usize) -> Vec<Self::Boolean>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A> where
A: Allocator,
fn to_lower_bits_be(&self, k: usize) -> Vec<Self::Boolean>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A> where
A: Allocator,
A: Allocator,
Outputs the lower k
bits of an n
-bit field element in big-endian representation.
Enforces that the upper n - k
bits are zero.
type Boolean = Boolean<E>
sourceimpl<E: Environment> ToUpperBits for Field<E>
impl<E: Environment> ToUpperBits for Field<E>
sourcefn to_upper_bits_le(&self, k: usize) -> Vec<Self::Boolean>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A> where
A: Allocator,
fn to_upper_bits_le(&self, k: usize) -> Vec<Self::Boolean>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A> where
A: Allocator,
A: Allocator,
Outputs the upper k
bits of an n
-bit field element in little-endian representation.
Enforces that the lower n - k
bits are zero.
sourcefn to_upper_bits_be(&self, k: usize) -> Vec<Self::Boolean>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A> where
A: Allocator,
fn to_upper_bits_be(&self, k: usize) -> Vec<Self::Boolean>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A> where
A: Allocator,
A: Allocator,
Outputs the upper k
bits of an n
-bit field element in big-endian representation.
Enforces that the lower n - k
bits are zero.
type Boolean = Boolean<E>
sourceimpl<E: Environment> TypeName for Field<E>
impl<E: Environment> TypeName for Field<E>
sourceimpl<E: Environment> Zero for Field<E>
impl<E: Environment> Zero for Field<E>
impl<E: Environment> FieldTrait for Field<E>
Auto Trait Implementations
impl<E> RefUnwindSafe for Field<E> where
<E as Environment>::BaseField: UnwindSafe + RefUnwindSafe,
impl<E> !Send for Field<E>
impl<E> !Sync for Field<E>
impl<E> Unpin for Field<E> where
<E as Environment>::BaseField: Unpin,
impl<E> UnwindSafe for Field<E> where
<E as Environment>::BaseField: UnwindSafe + RefUnwindSafe,
Blanket Implementations
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more