Skip to main content

Acquisition is a mechanism that allows objects to obtain attributes from the containment hierarchy they're in.

Project description

Environmental Acquisiton

This package implements “environmental acquisiton” for Python, as proposed in the OOPSLA96 paper by Joseph Gil and David H. Lorenz:

We propose a new programming paradigm, environmental acquisition in the context of object aggregation, in which objects acquire behaviour from their current containers at runtime. The key idea is that the behaviour of a component may depend upon its enclosing composite(s). In particular, we propose a form of feature sharing in which an object “inherits” features from the classes of objects in its environment. By examining the declaration of classes, it is possible to determine which kinds of classes may contain a component, and which components must be contained in a given kind of composite. These relationships are the basis for language constructs that supports acquisition.

Introductory Example

Zope implements acquisition with “Extension Class” mix-in classes. To use acquisition your classes must inherit from an acquisition base class. For example:

>>> import ExtensionClass, Acquisition

>>> class C(ExtensionClass.Base):
...     color = 'red'

>>> class A(Acquisition.Implicit):
...     def report(self):
...         print(self.color)
...
>>> a = A()
>>> c = C()
>>> c.a = a

>>> c.a.report()
red

>>> d = C()
>>> d.color = 'green'
>>> d.a = a

>>> d.a.report()
green

>>> try:
...     a.report()
... except AttributeError:
...     pass
... else:
...     raise AssertionError('AttributeError not raised.')

The class A inherits acquisition behavior from Acquisition.Implicit. The object, a, “has” the color of objects c and d when it is accessed through them, but it has no color by itself. The object a obtains attributes from its environment, where its environment is defined by the access path used to reach a.

Acquisition Wrappers

When an object that supports acquisition is accessed through an extension class instance, a special object, called an acquisition wrapper, is returned. In the example above, the expression c.a returns an acquisition wrapper that contains references to both c and a. It is this wrapper that performs attribute lookup in c when an attribute cannot be found in a.

Acquisition wrappers provide access to the wrapped objects through the attributes aq_parent, aq_self, aq_base. Continue the example from above:

>>> c.a.aq_parent is c
True
>>> c.a.aq_self is a
True

Explicit and Implicit Acquisition

Two styles of acquisition are supported: implicit and explicit acquisition.

Implicit acquisition

Implicit acquisition is so named because it searches for attributes from the environment automatically whenever an attribute cannot be obtained directly from an object or through inheritance.

An attribute can be implicitly acquired if its name does not begin with an underscore.

To support implicit acquisition, your class should inherit from the mix-in class Acquisition.Implicit.

Explicit Acquisition

When explicit acquisition is used, attributes are not automatically obtained from the environment. Instead, the method aq_acquire must be used. For example:

>>> print(c.a.aq_acquire('color'))
red

To support explicit acquisition, your class should inherit from the mix-in class Acquisition.Explicit.

Controlling Acquisition

A class (or instance) can provide attribute by attribute control over acquisition. You should subclass from Acquisition.Explicit, and set all attributes that should be acquired to the special value Acquisition.Acquired. Setting an attribute to this value also allows inherited attributes to be overridden with acquired ones. For example:

>>> class C(Acquisition.Explicit):
...     id = 1
...     secret = 2
...     color = Acquisition.Acquired
...     __roles__ = Acquisition.Acquired

The only attributes that are automatically acquired from containing objects are color, and __roles__. Note that the __roles__ attribute is acquired even though its name begins with an underscore. In fact, the special Acquisition.Acquired value can be used in Acquisition.Implicit objects to implicitly acquire selected objects that smell like private objects.

Sometimes, you want to dynamically make an implicitly acquiring object acquire explicitly. You can do this by getting the object’s aq_explicit attribute. This attribute provides the object with an explicit wrapper that replaces the original implicit wrapper.

Filtered Acquisition

The acquisition method, aq_acquire, accepts two optional arguments. The first of the additional arguments is a “filtering” function that is used when considering whether to acquire an object. The second of the additional arguments is an object that is passed as extra data when calling the filtering function and which defaults to None. The filter function is called with five arguments:

  • The object that the aq_acquire method was called on,

  • The object where an object was found,

  • The name of the object, as passed to aq_acquire,

  • The object found, and

  • The extra data passed to aq_acquire.

If the filter returns a true object that the object found is returned, otherwise, the acquisition search continues.

Here’s an example:

>>> from Acquisition import Explicit

>>> class HandyForTesting(object):
...     def __init__(self, name):
...         self.name = name
...     def __str__(self):
...         return "%s(%s)" % (self.name, self.__class__.__name__)
...     __repr__=__str__
...
>>> class E(Explicit, HandyForTesting): pass
...
>>> class Nice(HandyForTesting):
...     isNice = 1
...     def __str__(self):
...         return HandyForTesting.__str__(self)+' and I am nice!'
...     __repr__ = __str__
...
>>> a = E('a')
>>> a.b = E('b')
>>> a.b.c = E('c')
>>> a.p = Nice('spam')
>>> a.b.p = E('p')

>>> def find_nice(self, ancestor, name, object, extra):
...     return hasattr(object,'isNice') and object.isNice

>>> print(a.b.c.aq_acquire('p', find_nice))
spam(Nice) and I am nice!

The filtered acquisition in the last line skips over the first attribute it finds with the name p, because the attribute doesn’t satisfy the condition given in the filter.

Filtered acquisition is rarely used in Zope.

Acquiring from Context

Normally acquisition allows objects to acquire data from their containers. However an object can acquire from objects that aren’t its containers.

Most of the examples we’ve seen so far show establishing of an acquisition context using getattr semantics. For example, a.b is a reference to b in the context of a.

You can also manually set acquisition context using the __of__ method. For example:

>>> from Acquisition import Implicit
>>> class C(Implicit): pass
...
>>> a = C()
>>> b = C()
>>> a.color = "red"
>>> print(b.__of__(a).color)
red

In this case, a does not contain b, but it is put in b’s context using the __of__ method.

Here’s another subtler example that shows how you can construct an acquisition context that includes non-container objects:

>>> from Acquisition import Implicit

>>> class C(Implicit):
...     def __init__(self, name):
...         self.name = name

>>> a = C("a")
>>> a.b = C("b")
>>> a.b.color = "red"
>>> a.x = C("x")

>>> print(a.b.x.color)
red

Even though b does not contain x, x can acquire the color attribute from b. This works because in this case, x is accessed in the context of b even though it is not contained by b.

Here acquisition context is defined by the objects used to access another object.

Containment Before Context

If in the example above suppose both a and b have an color attribute:

>>> a = C("a")
>>> a.color = "green"
>>> a.b = C("b")
>>> a.b.color = "red"
>>> a.x = C("x")

>>> print(a.b.x.color)
green

Why does a.b.x.color acquire color from a and not from b? The answer is that an object acquires from its containers before non-containers in its context.

To see why consider this example in terms of expressions using the __of__ method:

a.x -> x.__of__(a)

a.b -> b.__of__(a)

a.b.x -> x.__of__(a).__of__(b.__of__(a))

Keep in mind that attribute lookup in a wrapper is done by trying to look up the attribute in the wrapped object first and then in the parent object. So in the expressions above proceeds from left to right.

The upshot of these rules is that attributes are looked up by containment before context.

This rule holds true also for more complex examples. For example, a.b.c.d.e.f.g.attribute would search for attribute in g and all its containers first. (Containers are searched in order from the innermost parent to the outermost container.) If the attribute is not found in g or any of its containers, then the search moves to f and all its containers, and so on.

Additional Attributes and Methods

You can use the special method aq_inner to access an object wrapped only by containment. So in the example above, a.b.x.aq_inner is equivalent to a.x.

You can find out the acquisition context of an object using the aq_chain method like so:

>>> [obj.name for obj in a.b.x.aq_chain]
['x', 'b', 'a']

You can find out if an object is in the containment context of another object using the aq_inContextOf method. For example:

>>> a.b.aq_inContextOf(a)
True

Acquisition Module Functions

In addition to using acquisition attributes and methods directly on objects you can use similar functions defined in the Acquisition module. These functions have the advantage that you don’t need to check to make sure that the object has the method or attribute before calling it.

aq_acquire(object, name [, filter, extra, explicit, default, containment])

Acquires an object with the given name.

This function can be used to explictly acquire when using explicit acquisition and to acquire names that wouldn’t normally be acquired.

The function accepts a number of optional arguments:

filter

A callable filter object that is used to decide if an object should be acquired.

The filter is called with five arguments:

  • The object that the aq_acquire method was called on,

  • The object where an object was found,

  • The name of the object, as passed to aq_acquire,

  • The object found, and

  • The extra argument passed to aq_acquire.

If the filter returns a true object that the object found is returned, otherwise, the acquisition search continues.

extra

Extra data to be passed as the last argument to the filter.

explicit

A flag (boolean value) indicating whether explicit acquisition should be used. The default value is true. If the flag is true, then acquisition will proceed regardless of whether wrappers encountered in the search of the acquisition hierarchy are explicit or implicit wrappers. If the flag is false, then parents of explicit wrappers are not searched.

This argument is useful if you want to apply a filter without overriding explicit wrappers.

default

A default value to return if no value can be acquired.

containment

A flag indicating whether the search should be limited to the containment hierarchy.

In addition, arguments can be provided as keywords.

aq_base(object)

Return the object with all wrapping removed.

aq_chain(object [, containment])

Return a list containing the object and it’s acquisition parents. The optional argument, containment, controls whether the containment or access hierarchy is used.

aq_get(object, name [, default, containment])

Acquire an attribute, name. A default value can be provided, as can a flag that limits search to the containment hierarchy.

aq_inner(object)

Return the object with all but the innermost layer of wrapping removed.

aq_parent(object)

Return the acquisition parent of the object or None if the object is unwrapped.

aq_self(object)

Return the object with one layer of wrapping removed, unless the object is unwrapped, in which case the object is returned.

In most cases it is more convenient to use these module functions instead of the acquisition attributes and methods directly.

Acquisition and Methods

Python methods of objects that support acquisition can use acquired attributes. When a Python method is called on an object that is wrapped by an acquisition wrapper, the wrapper is passed to the method as the first argument. This rule also applies to user-defined method types and to C methods defined in pure mix-in classes.

Unfortunately, C methods defined in extension base classes that define their own data structures, cannot use aquired attributes at this time. This is because wrapper objects do not conform to the data structures expected by these methods. In practice, you will seldom find this a problem.

Conclusion

Acquisition provides a powerful way to dynamically share information between objects. Zope uses acquisition for a number of its key features including security, object publishing, and DTML variable lookup. Acquisition also provides an elegant solution to the problem of circular references for many classes of problems. While acquisition is powerful, you should take care when using acquisition in your applications. The details can get complex, especially with the differences between acquiring from context and acquiring from containment.

Changelog

5.2 (2024-02-13)

  • Add preliminary support for Python 3.13 as of 3.13a3.

5.1 (2023-10-05)

  • Add support for Python 3.12.

5.0 (2023-03-24)

  • Build Linux binary wheels for Python 3.11.

  • Drop support for Python 2.7, 3.5, 3.6.

  • Add preliminary support for Python 3.12a5.

4.13 (2022-11-17)

  • Add support for building arm64 wheels on macOS.

4.12 (2022-11-03)

  • Add support for final Python 3.11 release.

4.11 (2022-09-16)

  • Add support for Python 3.11 (as of 3.11.0rc1).

  • Switch from -Ofast to -O3 when compiling code for Linux wheels. (#64)

4.10 (2021-12-07)

  • Fix bug in the PURE_PYTHON version affecting aq_acquire applied to a class with a filter.

  • Improve interface documentation.

  • Add support for Python 3.10.

4.9 (2021-08-19)

  • On CPython no longer omit compiling the C code when PURE_PYTHON is required. Just evaluate it at runtime. (#53)

4.8 (2021-07-20)

  • Various fixes for the PURE_PYTHON version, e.g. make Acquired an str (as required by Zope), avoid infinite __cmp__ loop. (#51, #48)

  • Create aarch64 wheels.

4.7 (2020-10-07)

  • Add support for Python 3.8 and 3.9.

4.6 (2019-04-24)

  • Drop support for Python 3.4.

  • Add support for Python 3.8a3.

  • Add support to call bytes() on an object wrapped by an ImplicitAcquisitionWrapper. (#38)

4.5 (2018-10-05)

  • Avoid deprecation warnings by using current API.

  • Add support for Python 3.7.

4.4.4 (2017-11-24)

  • Add Appveyor configuration to automate building Windows eggs.

4.4.3 (2017-11-23)

  • Fix the extremely rare potential for a crash when the C extensions are in use. See issue 21.

4.4.2 (2017-05-12)

  • Fix C capsule name to fix import errors.

  • Ensure our dependencies match our expactations about C extensions.

4.4.1 (2017-05-04)

  • Fix C code under Python 3.4, with missing Py_XSETREF.

4.4.0 (2017-05-04)

  • Enable the C extension under Python 3.

  • Drop support for Python 3.3.

4.3.0 (2017-01-20)

  • Make tests compatible with ExtensionClass 4.2.0.

  • Drop support for Python 2.6 and 3.2.

  • Add support for Python 3.5 and 3.6.

4.2.2 (2015-05-19)

4.2.1 (2015-04-23)

4.2 (2015-04-04)

  • Add support for PyPy, PyPy3, and Python 3.2, 3.3, and 3.4.

4.1 (2014-12-18)

  • Bump dependency on ExtensionClass to match current release.

4.0.3 (2014-11-02)

  • Skip readme.rst tests when tests are run outside a source checkout.

4.0.2 (2014-11-02)

  • Include *.rst files in the release.

4.0.1 (2014-10-30)

  • Tolerate Unicode attribute names (ASCII only). LP #143358.

  • Make module-level aq_acquire API respect the default parameter. LP #1387363.

  • Don’t raise an attribute error for __iter__ if the fallback to __getitem__ succeeds. LP #1155760.

4.0 (2013-02-24)

  • Added trove classifiers to project metadata.

4.0a1 (2011-12-13)

  • Raise RuntimeError: Recursion detected in acquisition wrapper if an object with a __parent__ pointer points to a wrapper that in turn points to the original object.

  • Prevent wrappers to be created while accessing __parent__ on types derived from Explicit or Implicit base classes.

2.13.9 (2015-02-17)

  • Tolerate Unicode attribute names (ASCII only). LP #143358.

  • Make module-level aq_acquire API respect the default parameter. LP #1387363.

  • Don’t raise an attribute error for __iter__ if the fallback to __getitem__ succeeds. LP #1155760.

2.13.8 (2011-06-11)

  • Fixed a segfault on 64bit platforms when providing the explicit argument to the aq_acquire method of an Acquisition wrapper. Thx to LP #675064 for the hint to the solution. The code passed an int instead of a pointer into a function.

2.13.7 (2011-03-02)

  • Fixed bug: When an object did not implement __unicode__, calling unicode(wrapped) was calling __str__ with an unwrapped self.

2.13.6 (2011-02-19)

  • Add aq_explicit to IAcquisitionWrapper.

  • Fixed bug: unicode(wrapped) was not calling a __unicode__ method on wrapped objects.

2.13.5 (2010-09-29)

  • Fixed unit tests that failed on 64bit Python on Windows machines.

2.13.4 (2010-08-31)

  • LP 623665: Fixed typo in Acquisition.h.

2.13.3 (2010-04-19)

  • Use the doctest module from the standard library and no longer depend on zope.testing.

2.13.2 (2010-04-04)

  • Give both wrapper classes a __getnewargs__ method, which causes the ZODB optimization to fail and create persistent references using the _p_oid alone. This happens to be the persistent oid of the wrapped object. This lets these objects to be persisted correctly, even though they are passed to the ZODB in a wrapped state.

  • Added failing tests for http://dev.plone.org/plone/ticket/10318. This shows an edge-case where AQ wrappers can be pickled using the specific combination of cPickle, pickle protocol one and a custom Pickler class with an inst_persistent_id hook. Unfortunately this is the exact combination used by ZODB3.

2.13.1 (2010-02-23)

  • Update to include ExtensionClass 2.13.0.

  • Fix the tp_name of the ImplicitAcquisitionWrapper and ExplicitAcquisitionWrapper to match their Python visible names and thus have a correct __name__.

  • Expand the tp_name of our extension types to hold the fully qualified name. This ensures classes have their __module__ set correctly.

2.13.0 (2010-02-14)

2.12.4 (2009-10-29)

  • Fix iteration proxying to pass self acquisition-wrapped into both __iter__ as well as __getitem__ (this fixes https://bugs.launchpad.net/zope2/+bug/360761).

  • Add tests for the __getslice__ proxying, including open-ended slicing.

2.12.3 (2009-08-08)

  • More 64-bit fixes in Py_BuildValue calls.

  • More 64-bit issues fixed: Use correct integer size for slice operations.

2.12.2 (2009-08-02)

2.12.1 (2009-04-15)

  • Update for iteration proxying: The proxy for __iter__ must not rely on the object to have an __iter__ itself, but also support fall-back iteration via __getitem__ (this fixes https://bugs.launchpad.net/zope2/+bug/360761).

2.12 (2009-01-25)

  • Release as separate package.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

Acquisition-5.2.tar.gz (66.0 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

Acquisition-5.2-cp312-cp312-win_amd64.whl (65.2 kB view details)

Uploaded CPython 3.12Windows x86-64

Acquisition-5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (122.0 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

Acquisition-5.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (122.2 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

Acquisition-5.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (114.3 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

Acquisition-5.2-cp312-cp312-macosx_11_0_arm64.whl (64.6 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

Acquisition-5.2-cp312-cp312-macosx_10_9_x86_64.whl (65.3 kB view details)

Uploaded CPython 3.12macOS 10.9+ x86-64

Acquisition-5.2-cp311-cp311-win_amd64.whl (65.1 kB view details)

Uploaded CPython 3.11Windows x86-64

Acquisition-5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (122.3 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

Acquisition-5.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (122.8 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

Acquisition-5.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (115.7 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

Acquisition-5.2-cp311-cp311-macosx_11_0_arm64.whl (64.9 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

Acquisition-5.2-cp311-cp311-macosx_10_9_x86_64.whl (65.5 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

Acquisition-5.2-cp310-cp310-win_amd64.whl (65.0 kB view details)

Uploaded CPython 3.10Windows x86-64

Acquisition-5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (118.6 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

Acquisition-5.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (119.3 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

Acquisition-5.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (112.3 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

Acquisition-5.2-cp310-cp310-macosx_11_0_arm64.whl (64.9 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

Acquisition-5.2-cp310-cp310-macosx_10_9_x86_64.whl (65.5 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

Acquisition-5.2-cp39-cp39-win_amd64.whl (65.0 kB view details)

Uploaded CPython 3.9Windows x86-64

Acquisition-5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (118.0 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARM64

Acquisition-5.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (118.7 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

Acquisition-5.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (111.6 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

Acquisition-5.2-cp39-cp39-macosx_11_0_arm64.whl (65.0 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

Acquisition-5.2-cp39-cp39-macosx_10_9_x86_64.whl (65.5 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

Acquisition-5.2-cp38-cp38-win_amd64.whl (65.0 kB view details)

Uploaded CPython 3.8Windows x86-64

Acquisition-5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (119.0 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ ARM64

Acquisition-5.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (119.7 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

Acquisition-5.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (112.7 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

Acquisition-5.2-cp38-cp38-macosx_11_0_arm64.whl (65.0 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

Acquisition-5.2-cp38-cp38-macosx_10_9_x86_64.whl (65.5 kB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

Acquisition-5.2-cp37-cp37m-win_amd64.whl (65.0 kB view details)

Uploaded CPython 3.7mWindows x86-64

Acquisition-5.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (109.6 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ ARM64

Acquisition-5.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (109.2 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

Acquisition-5.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (102.2 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

Acquisition-5.2-cp37-cp37m-macosx_11_0_x86_64.whl (65.5 kB view details)

Uploaded CPython 3.7mmacOS 11.0+ x86-64

File details

Details for the file Acquisition-5.2.tar.gz.

File metadata

  • Download URL: Acquisition-5.2.tar.gz
  • Upload date:
  • Size: 66.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.7

File hashes

Hashes for Acquisition-5.2.tar.gz
Algorithm Hash digest
SHA256 7163b4d40ef7ed01a89bafc0ae599fdb24df9e9c0319276cf67b40af974c41a5
MD5 a3c5970e08509a2758ff20a01c4a7189
BLAKE2b-256 72a2b7a46ba4de11295df3ab86bbdc81193c34d0d09601747993a541fd7995af

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: Acquisition-5.2-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 65.2 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.12.0

File hashes

Hashes for Acquisition-5.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 a759f82ef8ceaad2cd1c336eba8f8cff0f02ec023e921cf7587ae4700df2ccb8
MD5 66887263e483a3672df6c8389ac13617
BLAKE2b-256 b75722e7f4f9f64e89cba8e37e12c3d521dc0171055f34655d4e4d31a509f66f

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for Acquisition-5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f02465f2b4e8cfd6683d2045d247fbf0e15e74151d1748a7f0e3dadef53f3344
MD5 03483a14f55f191a0e1d1ed8c5a36803
BLAKE2b-256 3de35b519eac946c92419bc037f8f6d0c075e39656381422298f594d006de006

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for Acquisition-5.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f4210e3ca19195b217ba5317524fb9f493ed903d1787452db0dbd1e3913189f8
MD5 ce40afd8f1a96c019dcb76b88b3d0f40
BLAKE2b-256 d5185535a372f844449f6cb9b85a83c2b54604bb3fe48a96a2d729646f91650e

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for Acquisition-5.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 4e6700b01938accfef14fb0900fb83aa6d6968da9cc3b88dcd0b063c9b782275
MD5 9447a4e2d63d57b0c12f70c586e48fc1
BLAKE2b-256 33028f9b1c247a18b4809f0e2ba78da92d07bec9bb8b079875001f743105be0d

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for Acquisition-5.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8317e3d37e5e0c4a81025ba4795157c011608ac6435fc4c30bcdb0a4c255dbd2
MD5 694f3bd6a5978d548e52f7e068da320c
BLAKE2b-256 55919c0905a39465a4d2145206e0b97fd41358ced0ad436529d48376a4457e2a

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp312-cp312-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for Acquisition-5.2-cp312-cp312-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 6650d66641c6ea5148cb56f22a4e047cd2914e65eb8bac8941938020d1356e4b
MD5 9a3bda21a4796a3c670ba3d311efa8cf
BLAKE2b-256 f73b477393ed96d138c205861667e54664f495b875f20fa2e6403f19d047dda8

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: Acquisition-5.2-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 65.1 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.11.0

File hashes

Hashes for Acquisition-5.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 dac7070b4c225df06ef0ba2094818f073f18154682e35e2dcbd564f19a818296
MD5 824cc6af2f0a21555f1c43edd32a3b18
BLAKE2b-256 faa28f588d65dd674fc935a16b9cc36ebdafe137a83d97d034064742774df903

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for Acquisition-5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0777e0da5005cede46ebb92961da092e8e2137ddcc494e2003bbf5684f148b10
MD5 df2bab79eae5fbcbdee522d8ed05d7d9
BLAKE2b-256 2322e834c7f79d105c0146741c54ae95c16aa9b12fe68c234e59f9fc601e9b5e

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for Acquisition-5.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c19a70dceec364c90470f8aa50c60c4d3f7d548a347178009eb72d397b4deaad
MD5 0e9b015b6e9be2c402cd724466a40ae1
BLAKE2b-256 7ec2dc41ed1c4e79cffb55525e23c45d0770565477ad709c6f8047bfe0b4658c

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for Acquisition-5.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 6eaedfdcf5d1aa40f31f8ecae50072466ec3669a1603870de5a7dbde729569f2
MD5 7fa46f41ebc2cf6582e250d6a521d7a4
BLAKE2b-256 b1114353e565760680ca31e55fcaf4c950668ece32fda903441937a9493f83f4

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for Acquisition-5.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 342ed83dbb81b691801927fd08f1b93900b2f43335919f695c7de218dafff091
MD5 bb60ec6d676ab89d82ca49433500e60b
BLAKE2b-256 dcd603181dd93baef629dcad5bd48506942af224e4e3c1febb776ef393510ec3

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for Acquisition-5.2-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d056febe31ae19e9c9cb7b0399ac4f72525d17b3bfe5df4a21b7cac75bc97a53
MD5 1bdcc74211fd3206eaefeb1d63fcd4a2
BLAKE2b-256 38ef6d78f4ef9e7a46d23963763b15e053cbe6691d6c895388890f89acd8946b

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: Acquisition-5.2-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 65.0 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.10.0

File hashes

Hashes for Acquisition-5.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 e4a2ee474d5b2ce580596a747d3cfcaa344a8440bcb6862664e06af8492f023d
MD5 fe2b3c7f41b771d3e6665431f92bc60c
BLAKE2b-256 0d138726604cc0bfcc796f18c64337116c446c57a8a5a278f245cf2607773dfa

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for Acquisition-5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 dde700d541a3207efefe1c7c6daaf0d4889395834b23fad95282f5eb2c3afa9b
MD5 5f30454f58f1e95e5ab8edf7fa407f07
BLAKE2b-256 7bd440bb833212a80c4a7e64103aa8fd2d6275b19e42c525852673903f215455

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for Acquisition-5.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3b9921c83e1cc73b4e45cbf6517bda24388b1885ebb80a98879aeeeace494f26
MD5 22f4797fe4d524b82381d269b9589d61
BLAKE2b-256 61c19b382506c05c264732835eced6da471ba1ed5dc5b4fe38b1536c9f9e95d0

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for Acquisition-5.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 f1b1e989540f2dda401e533a37e2906bcf9fd9efca7b0dd5b5c90b555e8deb4c
MD5 db274138d54f9b33d9b990e13cc4973f
BLAKE2b-256 4683ae394869a8c66e37ba3498468182d5fccb53114bca8465e08f73b4a14125

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for Acquisition-5.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ca3202d947ceb052d1cd6bff1f808cb1bc96db58a31185da86489520789bf684
MD5 d2cf0a37260ca46bc74587e67f8e96f9
BLAKE2b-256 f7d0a29dfaa711f54894619619a263a3b5359b2062a03644211cbc8f1feaa59a

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for Acquisition-5.2-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 45759205d79c52540d0de41b31f252bc69a2b88aa64067e4adad2c986e7f731c
MD5 33a65609c4914074bc1560e2f866b912
BLAKE2b-256 ebc284b99975dfa4a0db16b2737ac506f3d44dd2e12637d4f2081b18311bef2b

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: Acquisition-5.2-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 65.0 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.9.0

File hashes

Hashes for Acquisition-5.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 a5d1f1d2ddeb68d6cae49a208feaf47c5b63435f9fc57f6764bbe34b14bdc4c3
MD5 2e48dc201330f5f5d6b34ba516fba155
BLAKE2b-256 1e75468a5e21252087bb6bd22d7c6b4a2881562887a3102cfb676574e04614be

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for Acquisition-5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 954a04047c9fc96d1110257368824bff42a70ff02dad18ae2fc229f764b5699c
MD5 ec559f870431415e0ac19c5cbe9229e3
BLAKE2b-256 1bff72be57198398f0f8c850ab5f4427e7ca1190f2fe4a441a796c1c25985c31

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for Acquisition-5.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7543c76aa8e5e1140fedf4d6d0bf764891de699a3fbeea57eb841645a6730346
MD5 65782a5996af6b05f1c13a31d8853954
BLAKE2b-256 c2d257283bd0ae3c4b350fad0ad97c90c9a01788cc5f6e0f676981b16b517bc6

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for Acquisition-5.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 b952d94915fdc91df770cc2060b15cf48616a15a2a3eca53bce64b18419314d6
MD5 1b4bb96fdb7a796f742f7cb4db8f2028
BLAKE2b-256 155190d28a7c083bca110afd25ed59061e6976c778e7b74ed237dc6911d9e2c6

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for Acquisition-5.2-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a6d5e222dc5deee67762d38cac31be78f9c84550a648866da176be0c55187d79
MD5 2966851e59afa6cb6a12a0940c826246
BLAKE2b-256 529523b72b1ffc1cca1bf3467530fbf65eb68c6e19fa82537ba67fdc4fd286ed

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for Acquisition-5.2-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 08cc1af49bd6188cf8ef044453adad5e07a0ef40792d428e9c6162a409a23c1e
MD5 75ebc59839450fc33c650ee93c2bccec
BLAKE2b-256 1cb74b6527e4adaf0809fce550b5336cb2e94abbeb0e242ae9f52b4ca9cac290

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: Acquisition-5.2-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 65.0 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.8.0

File hashes

Hashes for Acquisition-5.2-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 3a7d991b68cbc28f4350fcb21a9957400b9b458513de028678bd65a64a0c9549
MD5 886aa4f4cd6f33cd79329440ca13cc94
BLAKE2b-256 7c484fee7a8fb52221cd89cf59e5e1cbfea0705af60fd6362057851fff6181e9

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for Acquisition-5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 8b5c9c92f84de9d2c8ab778d20caa9f0f9a85b7f4212896aa64fbc66ac5edeff
MD5 fcb1b44dd2160f94d293d3fe4e683f84
BLAKE2b-256 34d8efdfeb67daa973608ee100e8bdeb2e06592bb670d17d73e85ec891399098

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for Acquisition-5.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 38e9015db06fbda90f09cbe70dd5dddd59b678cfd218e70b7edbf109c4366e53
MD5 94bfb9a302d005bc0a901e02525e40eb
BLAKE2b-256 3ec88dee770114abce9b74cc2c554ad39488d7439c4c89fc0ea152b73f0f92a9

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for Acquisition-5.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 b354776cdf5e1f4cdf9a4ebbaec4c3110cbf7ad2ec1d1e693101990ea36a6c80
MD5 5914cebd613c0a3b3ba857ce7ff4126f
BLAKE2b-256 6ebb94e1325624fd964c94bb313c5a08af29f832c2fe478d18b4fca57206d038

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for Acquisition-5.2-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 64468ba4c40bb3f780ab98ced081581df22700696f74b8f0670401bce2029361
MD5 1a1ed4bd7aa944068616c2c483928949
BLAKE2b-256 4fdcbaf25a3af4f635a7f4493fb4f32e5ab16630834980021d0baa5a75deacd3

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for Acquisition-5.2-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 406fb666c1b17a9f8b9c06645adad59d2cb2e79884eeb5d671bdf69ec33b8e4c
MD5 59ba162d3ca50c0c96db48aab2161791
BLAKE2b-256 0942c09494d50954d5b48690080c164ec2ecca2f1df3be6e9f26f128666e06ff

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: Acquisition-5.2-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 65.0 kB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.7.5

File hashes

Hashes for Acquisition-5.2-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 4dbde0c831fb5ac78ff6ce38383b02edb28b8fd732dcf64c60737c0ddb427179
MD5 9c9e28fff033ef36fac146928b04a04d
BLAKE2b-256 90badfdda4791b9ea230a3b16895d4dcfeeb198ecca39e3faa383130f17ce378

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for Acquisition-5.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d232abe21c47e2e9b2d48cdc2388a56dc7764ea041838ca2940067f0d9691c69
MD5 12ac6286b7eee6e5ab66ee1d5f06a7e4
BLAKE2b-256 5fd004b66d8b36bc1666746ca3ec4a213cc15909b8c8eee00ed6ecd77c4368d2

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for Acquisition-5.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4091e21321cfe55ffa45ea8381c5e03e097554d4d9cc4ed38bf2b81b350445d3
MD5 53a7fc20204e2c7d7836bb6b9efba697
BLAKE2b-256 25c7758075ead4f5a90f26ed81ea6e17cc510b4835391cf4a84ef45abdfde86a

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for Acquisition-5.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 3a848a3bc3293b8123243dd48a2f8718393396e41e0344328c145129c67489b1
MD5 7b29c7f1b0fd9f7a554a4355ee2c525d
BLAKE2b-256 aab769e04fa167aa5589ae293f0908bffc3fa95725b63d6a09a82cd973c5cd68

See more details on using hashes here.

File details

Details for the file Acquisition-5.2-cp37-cp37m-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for Acquisition-5.2-cp37-cp37m-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 3497d5750a82ac30492e8a23916a010f86f17c5e396835bccaec611fa937821e
MD5 aeade06c219a8507d7e95df3516474f0
BLAKE2b-256 581d41d1c66066ac67d0cb0df5d8a65b19794f2fa73bc87dd66d5cadaa69bba3

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page