pub struct HostFunctionCosts {Show 42 fields
pub read_value: HostFunction<[Cost; 3]>,
pub dictionary_get: HostFunction<[Cost; 3]>,
pub write: HostFunction<[Cost; 4]>,
pub dictionary_put: HostFunction<[Cost; 4]>,
pub add: HostFunction<[Cost; 4]>,
pub new_uref: HostFunction<[Cost; 3]>,
pub load_named_keys: HostFunction<[Cost; 2]>,
pub ret: HostFunction<[Cost; 2]>,
pub get_key: HostFunction<[Cost; 5]>,
pub has_key: HostFunction<[Cost; 2]>,
pub put_key: HostFunction<[Cost; 4]>,
pub remove_key: HostFunction<[Cost; 2]>,
pub revert: HostFunction<[Cost; 1]>,
pub is_valid_uref: HostFunction<[Cost; 2]>,
pub add_associated_key: HostFunction<[Cost; 3]>,
pub remove_associated_key: HostFunction<[Cost; 2]>,
pub update_associated_key: HostFunction<[Cost; 3]>,
pub set_action_threshold: HostFunction<[Cost; 2]>,
pub get_caller: HostFunction<[Cost; 1]>,
pub get_blocktime: HostFunction<[Cost; 1]>,
pub create_purse: HostFunction<[Cost; 2]>,
pub transfer_to_account: HostFunction<[Cost; 7]>,
pub transfer_from_purse_to_account: HostFunction<[Cost; 9]>,
pub transfer_from_purse_to_purse: HostFunction<[Cost; 8]>,
pub get_balance: HostFunction<[Cost; 3]>,
pub get_phase: HostFunction<[Cost; 1]>,
pub get_system_contract: HostFunction<[Cost; 3]>,
pub get_main_purse: HostFunction<[Cost; 1]>,
pub read_host_buffer: HostFunction<[Cost; 3]>,
pub create_contract_package_at_hash: HostFunction<[Cost; 2]>,
pub create_contract_user_group: HostFunction<[Cost; 8]>,
pub add_contract_version: HostFunction<[Cost; 10]>,
pub disable_contract_version: HostFunction<[Cost; 4]>,
pub call_contract: HostFunction<[Cost; 7]>,
pub call_versioned_contract: HostFunction<[Cost; 9]>,
pub get_named_arg_size: HostFunction<[Cost; 3]>,
pub get_named_arg: HostFunction<[Cost; 4]>,
pub remove_contract_user_group: HostFunction<[Cost; 4]>,
pub provision_contract_user_group_uref: HostFunction<[Cost; 5]>,
pub remove_contract_user_group_urefs: HostFunction<[Cost; 6]>,
pub print: HostFunction<[Cost; 2]>,
pub blake2b: HostFunction<[Cost; 4]>,
}
Expand description
Definition of a host function cost table.
Fields
read_value: HostFunction<[Cost; 3]>
Cost of calling the read_value
host function.
dictionary_get: HostFunction<[Cost; 3]>
Cost of calling the dictionary_get
host function.
write: HostFunction<[Cost; 4]>
Cost of calling the write
host function.
dictionary_put: HostFunction<[Cost; 4]>
Cost of calling the dictionary_put
host function.
add: HostFunction<[Cost; 4]>
Cost of calling the add
host function.
new_uref: HostFunction<[Cost; 3]>
Cost of calling the new_uref
host function.
load_named_keys: HostFunction<[Cost; 2]>
Cost of calling the load_named_keys
host function.
ret: HostFunction<[Cost; 2]>
Cost of calling the ret
host function.
get_key: HostFunction<[Cost; 5]>
Cost of calling the get_key
host function.
has_key: HostFunction<[Cost; 2]>
Cost of calling the has_key
host function.
put_key: HostFunction<[Cost; 4]>
Cost of calling the put_key
host function.
remove_key: HostFunction<[Cost; 2]>
Cost of calling the remove_key
host function.
revert: HostFunction<[Cost; 1]>
Cost of calling the revert
host function.
is_valid_uref: HostFunction<[Cost; 2]>
Cost of calling the is_valid_uref
host function.
add_associated_key: HostFunction<[Cost; 3]>
Cost of calling the add_associated_key
host function.
remove_associated_key: HostFunction<[Cost; 2]>
Cost of calling the remove_associated_key
host function.
update_associated_key: HostFunction<[Cost; 3]>
Cost of calling the update_associated_key
host function.
set_action_threshold: HostFunction<[Cost; 2]>
Cost of calling the set_action_threshold
host function.
get_caller: HostFunction<[Cost; 1]>
Cost of calling the get_caller
host function.
get_blocktime: HostFunction<[Cost; 1]>
Cost of calling the get_blocktime
host function.
create_purse: HostFunction<[Cost; 2]>
Cost of calling the create_purse
host function.
transfer_to_account: HostFunction<[Cost; 7]>
Cost of calling the transfer_to_account
host function.
transfer_from_purse_to_account: HostFunction<[Cost; 9]>
Cost of calling the transfer_from_purse_to_account
host function.
transfer_from_purse_to_purse: HostFunction<[Cost; 8]>
Cost of calling the transfer_from_purse_to_purse
host function.
get_balance: HostFunction<[Cost; 3]>
Cost of calling the get_balance
host function.
get_phase: HostFunction<[Cost; 1]>
Cost of calling the get_phase
host function.
get_system_contract: HostFunction<[Cost; 3]>
Cost of calling the get_system_contract
host function.
get_main_purse: HostFunction<[Cost; 1]>
Cost of calling the get_main_purse
host function.
read_host_buffer: HostFunction<[Cost; 3]>
Cost of calling the read_host_buffer
host function.
create_contract_package_at_hash: HostFunction<[Cost; 2]>
Cost of calling the create_contract_package_at_hash
host function.
create_contract_user_group: HostFunction<[Cost; 8]>
Cost of calling the create_contract_user_group
host function.
add_contract_version: HostFunction<[Cost; 10]>
Cost of calling the add_contract_version
host function.
disable_contract_version: HostFunction<[Cost; 4]>
Cost of calling the disable_contract_version
host function.
call_contract: HostFunction<[Cost; 7]>
Cost of calling the call_contract
host function.
call_versioned_contract: HostFunction<[Cost; 9]>
Cost of calling the call_versioned_contract
host function.
get_named_arg_size: HostFunction<[Cost; 3]>
Cost of calling the get_named_arg_size
host function.
get_named_arg: HostFunction<[Cost; 4]>
Cost of calling the get_named_arg
host function.
remove_contract_user_group: HostFunction<[Cost; 4]>
Cost of calling the remove_contract_user_group
host function.
provision_contract_user_group_uref: HostFunction<[Cost; 5]>
Cost of calling the provision_contract_user_group_uref
host function.
remove_contract_user_group_urefs: HostFunction<[Cost; 6]>
Cost of calling the remove_contract_user_group_urefs
host function.
print: HostFunction<[Cost; 2]>
Cost of calling the print
host function.
blake2b: HostFunction<[Cost; 4]>
Cost of calling the blake2b
host function.
Trait Implementations
sourceimpl Clone for HostFunctionCosts
impl Clone for HostFunctionCosts
sourcefn clone(&self) -> HostFunctionCosts
fn clone(&self) -> HostFunctionCosts
Returns a copy of the value. Read more
1.0.0 · sourcefn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source
. Read more
sourceimpl DataSize for HostFunctionCosts
impl DataSize for HostFunctionCosts
sourceconst IS_DYNAMIC: bool
const IS_DYNAMIC: bool
If true
, the type has a heap size that can vary at runtime, depending on the actual value.
sourceconst STATIC_HEAP_SIZE: usize
const STATIC_HEAP_SIZE: usize
The amount of space a value of the type always occupies. If IS_DYNAMIC
is false, this is
the total amount of heap memory occupied by the value. Otherwise this is a lower bound. Read more
sourcefn estimate_heap_size(&self) -> usize
fn estimate_heap_size(&self) -> usize
Estimates the size of heap memory taken up by this value. Read more
sourceimpl Debug for HostFunctionCosts
impl Debug for HostFunctionCosts
sourceimpl Default for HostFunctionCosts
impl Default for HostFunctionCosts
sourceimpl<'de> Deserialize<'de> for HostFunctionCosts
impl<'de> Deserialize<'de> for HostFunctionCosts
sourcefn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error> where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error> where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read more
sourceimpl Distribution<HostFunctionCosts> for Standard
impl Distribution<HostFunctionCosts> for Standard
sourcefn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> HostFunctionCosts
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> HostFunctionCosts
Generate a random value of T
, using rng
as the source of randomness.
sourcefn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T> where
R: Rng,
fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T> where
R: Rng,
Create an iterator that generates random values of T
, using rng
as
the source of randomness. Read more
sourceimpl FromBytes for HostFunctionCosts
impl FromBytes for HostFunctionCosts
sourceimpl PartialEq<HostFunctionCosts> for HostFunctionCosts
impl PartialEq<HostFunctionCosts> for HostFunctionCosts
sourcefn eq(&self, other: &HostFunctionCosts) -> bool
fn eq(&self, other: &HostFunctionCosts) -> bool
This method tests for self
and other
values to be equal, and is used
by ==
. Read more
sourcefn ne(&self, other: &HostFunctionCosts) -> bool
fn ne(&self, other: &HostFunctionCosts) -> bool
This method tests for !=
.
sourceimpl Serialize for HostFunctionCosts
impl Serialize for HostFunctionCosts
sourceimpl ToBytes for HostFunctionCosts
impl ToBytes for HostFunctionCosts
sourcefn serialized_length(&self) -> usize
fn serialized_length(&self) -> usize
Returns the length of the Vec<u8>
which would be returned from a successful call to
to_bytes()
or into_bytes()
. The data is not actually serialized, so this call is
relatively cheap. Read more
impl Copy for HostFunctionCosts
impl Eq for HostFunctionCosts
impl StructuralEq for HostFunctionCosts
impl StructuralPartialEq for HostFunctionCosts
Auto Trait Implementations
impl RefUnwindSafe for HostFunctionCosts
impl Send for HostFunctionCosts
impl Sync for HostFunctionCosts
impl Unpin for HostFunctionCosts
impl UnwindSafe for HostFunctionCosts
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
impl<T> Downcast for T where
T: Any,
impl<T> Downcast for T where
T: Any,
fn into_any(self: Box<T, Global>) -> Box<dyn Any + 'static, Global>
fn into_any(self: Box<T, Global>) -> Box<dyn Any + 'static, Global>
Convert Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
. Read more
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>
Convert Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
. Read more
fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
Convert &Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s. Read more
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Convert &mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s. Read more
sourceimpl<Q, K> Equivalent<K> for Q where
Q: Eq + ?Sized,
K: Borrow<Q> + ?Sized,
impl<Q, K> Equivalent<K> for Q where
Q: Eq + ?Sized,
K: Borrow<Q> + ?Sized,
sourcefn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
Compare self to key
and return true
if they are equal.
impl<T> FmtForward for T
impl<T> FmtForward for T
fn fmt_binary(self) -> FmtBinary<Self> where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self> where
Self: Binary,
Causes self
to use its Binary
implementation when Debug
-formatted.
fn fmt_display(self) -> FmtDisplay<Self> where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self> where
Self: Display,
Causes self
to use its Display
implementation when
Debug
-formatted. Read more
fn fmt_lower_exp(self) -> FmtLowerExp<Self> where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self> where
Self: LowerExp,
Causes self
to use its LowerExp
implementation when
Debug
-formatted. Read more
fn fmt_lower_hex(self) -> FmtLowerHex<Self> where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self> where
Self: LowerHex,
Causes self
to use its LowerHex
implementation when
Debug
-formatted. Read more
fn fmt_octal(self) -> FmtOctal<Self> where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self> where
Self: Octal,
Causes self
to use its Octal
implementation when Debug
-formatted.
fn fmt_pointer(self) -> FmtPointer<Self> where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self> where
Self: Pointer,
Causes self
to use its Pointer
implementation when
Debug
-formatted. Read more
fn fmt_upper_exp(self) -> FmtUpperExp<Self> where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self> where
Self: UpperExp,
Causes self
to use its UpperExp
implementation when
Debug
-formatted. Read more
fn fmt_upper_hex(self) -> FmtUpperHex<Self> where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self> where
Self: UpperHex,
Causes self
to use its UpperHex
implementation when
Debug
-formatted. Read more
sourceimpl<T> Instrument for T
impl<T> Instrument for T
sourcefn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
sourcefn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
impl<T> PipeAsRef for T
impl<T> PipeAsRef for T
fn pipe_as_ref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R where
Self: AsRef<T>,
T: 'a,
R: 'a,
fn pipe_as_ref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R where
Self: AsRef<T>,
T: 'a,
R: 'a,
Pipes a trait borrow into a function that cannot normally be called in suffix position. Read more
fn pipe_as_mut<'a, T, R>(&'a mut self, func: impl FnOnce(&'a mut T) -> R) -> R where
Self: AsMut<T>,
T: 'a,
R: 'a,
fn pipe_as_mut<'a, T, R>(&'a mut self, func: impl FnOnce(&'a mut T) -> R) -> R where
Self: AsMut<T>,
T: 'a,
R: 'a,
Pipes a trait mutable borrow into a function that cannot normally be called in suffix position. Read more
impl<T> PipeBorrow for T
impl<T> PipeBorrow for T
fn pipe_borrow<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R where
Self: Borrow<T>,
T: 'a,
R: 'a,
fn pipe_borrow<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R where
Self: Borrow<T>,
T: 'a,
R: 'a,
Pipes a trait borrow into a function that cannot normally be called in suffix position. Read more
fn pipe_borrow_mut<'a, T, R>(
&'a mut self,
func: impl FnOnce(&'a mut T) -> R
) -> R where
Self: BorrowMut<T>,
T: 'a,
R: 'a,
fn pipe_borrow_mut<'a, T, R>(
&'a mut self,
func: impl FnOnce(&'a mut T) -> R
) -> R where
Self: BorrowMut<T>,
T: 'a,
R: 'a,
Pipes a trait mutable borrow into a function that cannot normally be called in suffix position. Read more
impl<T> PipeDeref for T
impl<T> PipeDeref for T
fn pipe_deref<'a, R>(&'a self, func: impl FnOnce(&'a Self::Target) -> R) -> R where
Self: Deref,
R: 'a,
fn pipe_deref<'a, R>(&'a self, func: impl FnOnce(&'a Self::Target) -> R) -> R where
Self: Deref,
R: 'a,
Pipes a dereference into a function that cannot normally be called in suffix position. Read more
fn pipe_deref_mut<'a, R>(
&'a mut self,
func: impl FnOnce(&'a mut Self::Target) -> R
) -> R where
Self: DerefMut,
R: 'a,
fn pipe_deref_mut<'a, R>(
&'a mut self,
func: impl FnOnce(&'a mut Self::Target) -> R
) -> R where
Self: DerefMut,
R: 'a,
Pipes a mutable dereference into a function that cannot normally be called in suffix position. Read more
impl<T> PipeRef for T
impl<T> PipeRef for T
impl<T> Tap for T
impl<T> Tap for T
fn tap<F, R>(self, func: F) -> Self where
F: FnOnce(&Self) -> R,
fn tap<F, R>(self, func: F) -> Self where
F: FnOnce(&Self) -> R,
Provides immutable access for inspection. Read more
fn tap_dbg<F, R>(self, func: F) -> Self where
F: FnOnce(&Self) -> R,
fn tap_dbg<F, R>(self, func: F) -> Self where
F: FnOnce(&Self) -> R,
Calls tap
in debug builds, and does nothing in release builds.
fn tap_mut<F, R>(self, func: F) -> Self where
F: FnOnce(&mut Self) -> R,
fn tap_mut<F, R>(self, func: F) -> Self where
F: FnOnce(&mut Self) -> R,
Provides mutable access for modification. Read more
fn tap_mut_dbg<F, R>(self, func: F) -> Self where
F: FnOnce(&mut Self) -> R,
fn tap_mut_dbg<F, R>(self, func: F) -> Self where
F: FnOnce(&mut Self) -> R,
Calls tap_mut
in debug builds, and does nothing in release builds.
impl<T, U> TapAsRef<U> for T where
U: ?Sized,
impl<T, U> TapAsRef<U> for T where
U: ?Sized,
fn tap_ref<F, R>(self, func: F) -> Self where
Self: AsRef<T>,
F: FnOnce(&T) -> R,
fn tap_ref<F, R>(self, func: F) -> Self where
Self: AsRef<T>,
F: FnOnce(&T) -> R,
Provides immutable access to the reference for inspection.
fn tap_ref_dbg<F, R>(self, func: F) -> Self where
Self: AsRef<T>,
F: FnOnce(&T) -> R,
fn tap_ref_dbg<F, R>(self, func: F) -> Self where
Self: AsRef<T>,
F: FnOnce(&T) -> R,
Calls tap_ref
in debug builds, and does nothing in release builds.
fn tap_ref_mut<F, R>(self, func: F) -> Self where
Self: AsMut<T>,
F: FnOnce(&mut T) -> R,
fn tap_ref_mut<F, R>(self, func: F) -> Self where
Self: AsMut<T>,
F: FnOnce(&mut T) -> R,
Provides mutable access to the reference for modification.
fn tap_ref_mut_dbg<F, R>(self, func: F) -> Self where
Self: AsMut<T>,
F: FnOnce(&mut T) -> R,
fn tap_ref_mut_dbg<F, R>(self, func: F) -> Self where
Self: AsMut<T>,
F: FnOnce(&mut T) -> R,
Calls tap_ref_mut
in debug builds, and does nothing in release builds.
impl<T, U> TapBorrow<U> for T where
U: ?Sized,
impl<T, U> TapBorrow<U> for T where
U: ?Sized,
fn tap_borrow<F, R>(self, func: F) -> Self where
Self: Borrow<T>,
F: FnOnce(&T) -> R,
fn tap_borrow<F, R>(self, func: F) -> Self where
Self: Borrow<T>,
F: FnOnce(&T) -> R,
Provides immutable access to the borrow for inspection. Read more
fn tap_borrow_dbg<F, R>(self, func: F) -> Self where
Self: Borrow<T>,
F: FnOnce(&T) -> R,
fn tap_borrow_dbg<F, R>(self, func: F) -> Self where
Self: Borrow<T>,
F: FnOnce(&T) -> R,
Calls tap_borrow
in debug builds, and does nothing in release builds.
fn tap_borrow_mut<F, R>(self, func: F) -> Self where
Self: BorrowMut<T>,
F: FnOnce(&mut T) -> R,
fn tap_borrow_mut<F, R>(self, func: F) -> Self where
Self: BorrowMut<T>,
F: FnOnce(&mut T) -> R,
Provides mutable access to the borrow for modification.
fn tap_borrow_mut_dbg<F, R>(self, func: F) -> Self where
Self: BorrowMut<T>,
F: FnOnce(&mut T) -> R,
fn tap_borrow_mut_dbg<F, R>(self, func: F) -> Self where
Self: BorrowMut<T>,
F: FnOnce(&mut T) -> R,
Calls tap_borrow_mut
in debug builds, and does nothing in release
builds. Read more
impl<T> TapDeref for T
impl<T> TapDeref for T
fn tap_deref<F, R>(self, func: F) -> Self where
Self: Deref,
F: FnOnce(&Self::Target) -> R,
fn tap_deref<F, R>(self, func: F) -> Self where
Self: Deref,
F: FnOnce(&Self::Target) -> R,
Immutably dereferences self
for inspection.
fn tap_deref_dbg<F, R>(self, func: F) -> Self where
Self: Deref,
F: FnOnce(&Self::Target) -> R,
fn tap_deref_dbg<F, R>(self, func: F) -> Self where
Self: Deref,
F: FnOnce(&Self::Target) -> R,
Calls tap_deref
in debug builds, and does nothing in release builds.
fn tap_deref_mut<F, R>(self, func: F) -> Self where
Self: DerefMut,
F: FnOnce(&mut Self::Target) -> R,
fn tap_deref_mut<F, R>(self, func: F) -> Self where
Self: DerefMut,
F: FnOnce(&mut Self::Target) -> R,
Mutably dereferences self
for modification.
fn tap_deref_mut_dbg<F, R>(self, func: F) -> Self where
Self: DerefMut,
F: FnOnce(&mut Self::Target) -> R,
fn tap_deref_mut_dbg<F, R>(self, func: F) -> Self where
Self: DerefMut,
F: FnOnce(&mut Self::Target) -> R,
Calls tap_deref_mut
in debug builds, and does nothing in release
builds. Read more
sourceimpl<T> ToOwned for T where
T: Clone,
impl<T> ToOwned for T where
T: Clone,
type Owned = T
type Owned = T
The resulting type after obtaining ownership.
sourcefn clone_into(&self, target: &mut T)
fn clone_into(&self, target: &mut T)
toowned_clone_into
)Uses borrowed data to replace owned data, usually by cloning. Read more
impl<V, T> VZip<V> for T where
V: MultiLane<T>,
impl<V, T> VZip<V> for T where
V: MultiLane<T>,
fn vzip(self) -> V
sourceimpl<T> WithSubscriber for T
impl<T> WithSubscriber for T
sourcefn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> where
S: Into<Dispatch>,
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> where
S: Into<Dispatch>,
Attaches the provided Subscriber
to this type, returning a
WithDispatch
wrapper. Read more
sourcefn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
Attaches the current default Subscriber
to this type, returning a
WithDispatch
wrapper. Read more