use crate::HostTypes;
pub trait CochainGroup<H: HostTypes> {
fn cochain_degree(&self) -> i64;
fn cochain_rank(&self) -> u64;
type ChainGroup: crate::bridge::homology::ChainGroup<H>;
fn dual_of(&self) -> &Self::ChainGroup;
}
pub trait CoboundaryOperator<H: HostTypes> {
type CochainGroup: CochainGroup<H>;
fn coboundary_source(&self) -> &Self::CochainGroup;
fn coboundary_target(&self) -> &Self::CochainGroup;
fn satisfies_coboundary_squared_zero(&self) -> bool;
}
pub trait CochainComplex<H: HostTypes> {
type CochainGroup: CochainGroup<H>;
fn has_cochain_group(&self) -> &[Self::CochainGroup];
type CoboundaryOperator: CoboundaryOperator<H>;
fn has_coboundary(&self) -> &[Self::CoboundaryOperator];
}
pub trait CohomologyGroup<H: HostTypes> {
fn cohomology_degree(&self) -> i64;
fn cohomology_rank(&self) -> u64;
}
pub trait Sheaf<H: HostTypes> {
type SimplicialComplex: crate::bridge::homology::SimplicialComplex<H>;
fn sheaf_over(&self) -> &Self::SimplicialComplex;
type Ring: crate::kernel::schema::Ring<H>;
fn coefficient_in(&self) -> &Self::Ring;
type Stalk: Stalk<H>;
fn has_stalks(&self) -> &[Self::Stalk];
type Section: Section<H>;
fn has_global_section(&self) -> &[Self::Section];
}
pub trait Stalk<H: HostTypes> {
type Simplex: crate::bridge::homology::Simplex<H>;
fn stalk_at(&self) -> &Self::Simplex;
}
pub trait Section<H: HostTypes> {}
pub trait LocalSection<H: HostTypes>: Section<H> {}
pub trait RestrictionMap<H: HostTypes> {
type Simplex: crate::bridge::homology::Simplex<H>;
fn restricts_from(&self) -> &Self::Simplex;
fn restricts_to(&self) -> &Self::Simplex;
}
pub trait GluingObstruction<H: HostTypes> {
type CohomologyGroup: CohomologyGroup<H>;
fn obstruction_class(&self) -> &Self::CohomologyGroup;
type RefinementSuggestion: crate::bridge::resolver::RefinementSuggestion<H>;
fn addresses_suggestion(&self) -> &[Self::RefinementSuggestion];
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullCochainGroup<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullCochainGroup<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullCochainGroup<H> {
pub const ABSENT: NullCochainGroup<H> = NullCochainGroup {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> CochainGroup<H> for NullCochainGroup<H> {
fn cochain_degree(&self) -> i64 {
0
}
fn cochain_rank(&self) -> u64 {
0
}
type ChainGroup = crate::bridge::homology::NullChainGroup<H>;
fn dual_of(&self) -> &Self::ChainGroup {
&<crate::bridge::homology::NullChainGroup<H>>::ABSENT
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullCoboundaryOperator<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullCoboundaryOperator<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullCoboundaryOperator<H> {
pub const ABSENT: NullCoboundaryOperator<H> = NullCoboundaryOperator {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> CoboundaryOperator<H> for NullCoboundaryOperator<H> {
type CochainGroup = NullCochainGroup<H>;
fn coboundary_source(&self) -> &Self::CochainGroup {
&<NullCochainGroup<H>>::ABSENT
}
fn coboundary_target(&self) -> &Self::CochainGroup {
&<NullCochainGroup<H>>::ABSENT
}
fn satisfies_coboundary_squared_zero(&self) -> bool {
false
}
}
#[doc(hidden)]
#[doc = "THEORY-DEFERRED \u{2014} not a valid implementation; see [docs/theory_deferred.md]. Exists only to satisfy downstream trait-bound references."]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullCochainComplex<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullCochainComplex<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullCochainComplex<H> {
pub const ABSENT: NullCochainComplex<H> = NullCochainComplex {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> CochainComplex<H> for NullCochainComplex<H> {
type CochainGroup = NullCochainGroup<H>;
fn has_cochain_group(&self) -> &[Self::CochainGroup] {
&[]
}
type CoboundaryOperator = NullCoboundaryOperator<H>;
fn has_coboundary(&self) -> &[Self::CoboundaryOperator] {
&[]
}
}
#[doc(hidden)]
#[doc = "THEORY-DEFERRED \u{2014} not a valid implementation; see [docs/theory_deferred.md]. Exists only to satisfy downstream trait-bound references."]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullCohomologyGroup<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullCohomologyGroup<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullCohomologyGroup<H> {
pub const ABSENT: NullCohomologyGroup<H> = NullCohomologyGroup {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> CohomologyGroup<H> for NullCohomologyGroup<H> {
fn cohomology_degree(&self) -> i64 {
0
}
fn cohomology_rank(&self) -> u64 {
0
}
}
#[doc(hidden)]
#[doc = "THEORY-DEFERRED \u{2014} not a valid implementation; see [docs/theory_deferred.md]. Exists only to satisfy downstream trait-bound references."]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullSheaf<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullSheaf<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullSheaf<H> {
pub const ABSENT: NullSheaf<H> = NullSheaf {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> Sheaf<H> for NullSheaf<H> {
type SimplicialComplex = crate::bridge::homology::NullSimplicialComplex<H>;
fn sheaf_over(&self) -> &Self::SimplicialComplex {
&<crate::bridge::homology::NullSimplicialComplex<H>>::ABSENT
}
type Ring = crate::kernel::schema::NullRing<H>;
fn coefficient_in(&self) -> &Self::Ring {
&<crate::kernel::schema::NullRing<H>>::ABSENT
}
type Stalk = NullStalk<H>;
fn has_stalks(&self) -> &[Self::Stalk] {
&[]
}
type Section = NullSection<H>;
fn has_global_section(&self) -> &[Self::Section] {
&[]
}
}
#[doc(hidden)]
#[doc = "THEORY-DEFERRED \u{2014} not a valid implementation; see [docs/theory_deferred.md]. Exists only to satisfy downstream trait-bound references."]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullStalk<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullStalk<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullStalk<H> {
pub const ABSENT: NullStalk<H> = NullStalk {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> Stalk<H> for NullStalk<H> {
type Simplex = crate::bridge::homology::NullSimplex<H>;
fn stalk_at(&self) -> &Self::Simplex {
&<crate::bridge::homology::NullSimplex<H>>::ABSENT
}
}
#[doc(hidden)]
#[doc = "THEORY-DEFERRED \u{2014} not a valid implementation; see [docs/theory_deferred.md]. Exists only to satisfy downstream trait-bound references."]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullSection<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullSection<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullSection<H> {
pub const ABSENT: NullSection<H> = NullSection {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> Section<H> for NullSection<H> {}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullLocalSection<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullLocalSection<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullLocalSection<H> {
pub const ABSENT: NullLocalSection<H> = NullLocalSection {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> Section<H> for NullLocalSection<H> {}
impl<H: HostTypes> LocalSection<H> for NullLocalSection<H> {}
#[doc(hidden)]
#[doc = "THEORY-DEFERRED \u{2014} not a valid implementation; see [docs/theory_deferred.md]. Exists only to satisfy downstream trait-bound references."]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullRestrictionMap<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullRestrictionMap<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullRestrictionMap<H> {
pub const ABSENT: NullRestrictionMap<H> = NullRestrictionMap {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> RestrictionMap<H> for NullRestrictionMap<H> {
type Simplex = crate::bridge::homology::NullSimplex<H>;
fn restricts_from(&self) -> &Self::Simplex {
&<crate::bridge::homology::NullSimplex<H>>::ABSENT
}
fn restricts_to(&self) -> &Self::Simplex {
&<crate::bridge::homology::NullSimplex<H>>::ABSENT
}
}
#[doc(hidden)]
#[doc = "THEORY-DEFERRED \u{2014} not a valid implementation; see [docs/theory_deferred.md]. Exists only to satisfy downstream trait-bound references."]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullGluingObstruction<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullGluingObstruction<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullGluingObstruction<H> {
pub const ABSENT: NullGluingObstruction<H> = NullGluingObstruction {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> GluingObstruction<H> for NullGluingObstruction<H> {
type CohomologyGroup = NullCohomologyGroup<H>;
fn obstruction_class(&self) -> &Self::CohomologyGroup {
&<NullCohomologyGroup<H>>::ABSENT
}
type RefinementSuggestion = crate::bridge::resolver::NullRefinementSuggestion<H>;
fn addresses_suggestion(&self) -> &[Self::RefinementSuggestion] {
&[]
}
}
#[derive(Debug)]
pub struct CochainGroupHandle<H: HostTypes> {
pub fingerprint: crate::enforcement::ContentFingerprint,
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Copy for CochainGroupHandle<H> {}
impl<H: HostTypes> Clone for CochainGroupHandle<H> {
#[inline]
fn clone(&self) -> Self {
*self
}
}
impl<H: HostTypes> PartialEq for CochainGroupHandle<H> {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.fingerprint == other.fingerprint
}
}
impl<H: HostTypes> Eq for CochainGroupHandle<H> {}
impl<H: HostTypes> core::hash::Hash for CochainGroupHandle<H> {
#[inline]
fn hash<S: core::hash::Hasher>(&self, state: &mut S) {
self.fingerprint.hash(state);
}
}
impl<H: HostTypes> CochainGroupHandle<H> {
#[inline]
#[must_use]
pub const fn new(fingerprint: crate::enforcement::ContentFingerprint) -> Self {
Self {
fingerprint,
_phantom: core::marker::PhantomData,
}
}
}
pub trait CochainGroupResolver<H: HostTypes> {
fn resolve(&self, handle: CochainGroupHandle<H>) -> Option<CochainGroupRecord<H>>;
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct CochainGroupRecord<H: HostTypes> {
pub cochain_degree: i64,
pub cochain_rank: u64,
pub dual_of_handle: crate::bridge::homology::ChainGroupHandle<H>,
#[doc(hidden)]
pub _phantom: core::marker::PhantomData<H>,
}
pub struct ResolvedCochainGroup<'r, R: CochainGroupResolver<H>, H: HostTypes> {
handle: CochainGroupHandle<H>,
resolver: &'r R,
record: Option<CochainGroupRecord<H>>,
}
impl<'r, R: CochainGroupResolver<H>, H: HostTypes> ResolvedCochainGroup<'r, R, H> {
#[inline]
pub fn new(handle: CochainGroupHandle<H>, resolver: &'r R) -> Self {
let record = resolver.resolve(handle);
Self {
handle,
resolver,
record,
}
}
#[inline]
#[must_use]
pub const fn handle(&self) -> CochainGroupHandle<H> {
self.handle
}
#[inline]
#[must_use]
pub const fn resolver(&self) -> &'r R {
self.resolver
}
#[inline]
#[must_use]
pub const fn record(&self) -> Option<&CochainGroupRecord<H>> {
self.record.as_ref()
}
}
impl<'r, R: CochainGroupResolver<H>, H: HostTypes> CochainGroup<H>
for ResolvedCochainGroup<'r, R, H>
{
fn cochain_degree(&self) -> i64 {
match &self.record {
Some(r) => r.cochain_degree,
None => 0,
}
}
fn cochain_rank(&self) -> u64 {
match &self.record {
Some(r) => r.cochain_rank,
None => 0,
}
}
type ChainGroup = crate::bridge::homology::NullChainGroup<H>;
fn dual_of(&self) -> &Self::ChainGroup {
&<crate::bridge::homology::NullChainGroup<H>>::ABSENT
}
}
impl<'r, R: CochainGroupResolver<H>, H: HostTypes> ResolvedCochainGroup<'r, R, H> {
#[inline]
pub fn resolve_dual_of<'r2, R2: crate::bridge::homology::ChainGroupResolver<H>>(
&self,
r: &'r2 R2,
) -> Option<crate::bridge::homology::ResolvedChainGroup<'r2, R2, H>> {
let record = self.record.as_ref()?;
Some(crate::bridge::homology::ResolvedChainGroup::new(
record.dual_of_handle,
r,
))
}
}
#[derive(Debug)]
pub struct CoboundaryOperatorHandle<H: HostTypes> {
pub fingerprint: crate::enforcement::ContentFingerprint,
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Copy for CoboundaryOperatorHandle<H> {}
impl<H: HostTypes> Clone for CoboundaryOperatorHandle<H> {
#[inline]
fn clone(&self) -> Self {
*self
}
}
impl<H: HostTypes> PartialEq for CoboundaryOperatorHandle<H> {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.fingerprint == other.fingerprint
}
}
impl<H: HostTypes> Eq for CoboundaryOperatorHandle<H> {}
impl<H: HostTypes> core::hash::Hash for CoboundaryOperatorHandle<H> {
#[inline]
fn hash<S: core::hash::Hasher>(&self, state: &mut S) {
self.fingerprint.hash(state);
}
}
impl<H: HostTypes> CoboundaryOperatorHandle<H> {
#[inline]
#[must_use]
pub const fn new(fingerprint: crate::enforcement::ContentFingerprint) -> Self {
Self {
fingerprint,
_phantom: core::marker::PhantomData,
}
}
}
pub trait CoboundaryOperatorResolver<H: HostTypes> {
fn resolve(&self, handle: CoboundaryOperatorHandle<H>) -> Option<CoboundaryOperatorRecord<H>>;
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct CoboundaryOperatorRecord<H: HostTypes> {
pub coboundary_source_handle: CochainGroupHandle<H>,
pub coboundary_target_handle: CochainGroupHandle<H>,
pub satisfies_coboundary_squared_zero: bool,
#[doc(hidden)]
pub _phantom: core::marker::PhantomData<H>,
}
pub struct ResolvedCoboundaryOperator<'r, R: CoboundaryOperatorResolver<H>, H: HostTypes> {
handle: CoboundaryOperatorHandle<H>,
resolver: &'r R,
record: Option<CoboundaryOperatorRecord<H>>,
}
impl<'r, R: CoboundaryOperatorResolver<H>, H: HostTypes> ResolvedCoboundaryOperator<'r, R, H> {
#[inline]
pub fn new(handle: CoboundaryOperatorHandle<H>, resolver: &'r R) -> Self {
let record = resolver.resolve(handle);
Self {
handle,
resolver,
record,
}
}
#[inline]
#[must_use]
pub const fn handle(&self) -> CoboundaryOperatorHandle<H> {
self.handle
}
#[inline]
#[must_use]
pub const fn resolver(&self) -> &'r R {
self.resolver
}
#[inline]
#[must_use]
pub const fn record(&self) -> Option<&CoboundaryOperatorRecord<H>> {
self.record.as_ref()
}
}
impl<'r, R: CoboundaryOperatorResolver<H>, H: HostTypes> CoboundaryOperator<H>
for ResolvedCoboundaryOperator<'r, R, H>
{
type CochainGroup = NullCochainGroup<H>;
fn coboundary_source(&self) -> &Self::CochainGroup {
&<NullCochainGroup<H>>::ABSENT
}
fn coboundary_target(&self) -> &Self::CochainGroup {
&<NullCochainGroup<H>>::ABSENT
}
fn satisfies_coboundary_squared_zero(&self) -> bool {
match &self.record {
Some(r) => r.satisfies_coboundary_squared_zero,
None => false,
}
}
}
impl<'r, R: CoboundaryOperatorResolver<H>, H: HostTypes> ResolvedCoboundaryOperator<'r, R, H> {
#[inline]
pub fn resolve_coboundary_source<'r2, R2: CochainGroupResolver<H>>(
&self,
r: &'r2 R2,
) -> Option<ResolvedCochainGroup<'r2, R2, H>> {
let record = self.record.as_ref()?;
Some(ResolvedCochainGroup::new(
record.coboundary_source_handle,
r,
))
}
#[inline]
pub fn resolve_coboundary_target<'r2, R2: CochainGroupResolver<H>>(
&self,
r: &'r2 R2,
) -> Option<ResolvedCochainGroup<'r2, R2, H>> {
let record = self.record.as_ref()?;
Some(ResolvedCochainGroup::new(
record.coboundary_target_handle,
r,
))
}
}
#[derive(Debug)]
pub struct LocalSectionHandle<H: HostTypes> {
pub fingerprint: crate::enforcement::ContentFingerprint,
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Copy for LocalSectionHandle<H> {}
impl<H: HostTypes> Clone for LocalSectionHandle<H> {
#[inline]
fn clone(&self) -> Self {
*self
}
}
impl<H: HostTypes> PartialEq for LocalSectionHandle<H> {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.fingerprint == other.fingerprint
}
}
impl<H: HostTypes> Eq for LocalSectionHandle<H> {}
impl<H: HostTypes> core::hash::Hash for LocalSectionHandle<H> {
#[inline]
fn hash<S: core::hash::Hasher>(&self, state: &mut S) {
self.fingerprint.hash(state);
}
}
impl<H: HostTypes> LocalSectionHandle<H> {
#[inline]
#[must_use]
pub const fn new(fingerprint: crate::enforcement::ContentFingerprint) -> Self {
Self {
fingerprint,
_phantom: core::marker::PhantomData,
}
}
}
pub trait LocalSectionResolver<H: HostTypes> {
fn resolve(&self, handle: LocalSectionHandle<H>) -> Option<LocalSectionRecord<H>>;
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct LocalSectionRecord<H: HostTypes> {
#[doc(hidden)]
pub _phantom: core::marker::PhantomData<H>,
}
pub struct ResolvedLocalSection<'r, R: LocalSectionResolver<H>, H: HostTypes> {
handle: LocalSectionHandle<H>,
resolver: &'r R,
record: Option<LocalSectionRecord<H>>,
}
impl<'r, R: LocalSectionResolver<H>, H: HostTypes> ResolvedLocalSection<'r, R, H> {
#[inline]
pub fn new(handle: LocalSectionHandle<H>, resolver: &'r R) -> Self {
let record = resolver.resolve(handle);
Self {
handle,
resolver,
record,
}
}
#[inline]
#[must_use]
pub const fn handle(&self) -> LocalSectionHandle<H> {
self.handle
}
#[inline]
#[must_use]
pub const fn resolver(&self) -> &'r R {
self.resolver
}
#[inline]
#[must_use]
pub const fn record(&self) -> Option<&LocalSectionRecord<H>> {
self.record.as_ref()
}
}
impl<'r, R: LocalSectionResolver<H>, H: HostTypes> Section<H> for ResolvedLocalSection<'r, R, H> {}
impl<'r, R: LocalSectionResolver<H>, H: HostTypes> LocalSection<H>
for ResolvedLocalSection<'r, R, H>
{
}
pub mod coboundary_squared_zero {
pub const FOR_ALL: &str = "https://uor.foundation/schema/term_coboundarySquaredZero_forAll";
pub const LHS: &str = "https://uor.foundation/schema/term_coboundarySquaredZero_lhs";
pub const RHS: &str = "https://uor.foundation/schema/term_coboundarySquaredZero_rhs";
pub const VERIFICATION_DOMAIN: &str = "https://uor.foundation/op/Topological";
}
pub mod de_rham_duality {
pub const FOR_ALL: &str = "https://uor.foundation/schema/term_deRhamDuality_forAll";
pub const LHS: &str = "https://uor.foundation/schema/term_deRhamDuality_lhs";
pub const RHS: &str = "https://uor.foundation/schema/term_deRhamDuality_rhs";
pub const VERIFICATION_DOMAIN: &str = "https://uor.foundation/op/Topological";
}
pub mod sheaf_cohomology_bridge {
pub const FOR_ALL: &str = "https://uor.foundation/schema/term_sheafCohomologyBridge_forAll";
pub const LHS: &str = "https://uor.foundation/schema/term_sheafCohomologyBridge_lhs";
pub const RHS: &str = "https://uor.foundation/schema/term_sheafCohomologyBridge_rhs";
pub const VERIFICATION_DOMAIN: &str = "https://uor.foundation/op/Topological";
}
pub mod local_global_principle {
pub const FOR_ALL: &str = "https://uor.foundation/schema/term_localGlobalPrinciple_forAll";
pub const LHS: &str = "https://uor.foundation/schema/term_localGlobalPrinciple_lhs";
pub const RHS: &str = "https://uor.foundation/schema/term_localGlobalPrinciple_rhs";
pub const VERIFICATION_DOMAIN: &str = "https://uor.foundation/op/Topological";
}