Skip to main content

python-exiv2 is a low level interface (or binding) to the exiv2 C++ library. It is built using SWIG to automatically generate the interface code. The intention is to give direct access to all of the top-level classes in libexiv2, but with additional “Pythonic” helpers where necessary. Not everything in libexiv2 is available in the Python interface. If you need something that’s not there, please let me know.

Introduction

There are several other ways to access libexiv2 from within Python. The first one I used was pyexiv2 (old). After its development ceased I moved on to using gexiv2 and PyGObject. This works well, providing a Metadata object with high level functions such as set_tag_string and set_tag_multiple to get and set metadata values.

A more recent development is pyexiv2 (new). This new project is potentially very useful, providing a simple interface with functions to read and modify metadata using Python dict parameters.

For more complicated metadata operations I think a lower level interface is required, which is where this project comes in. Here is an example of its use:

Python 3.6.12 (default, Dec 02 2020, 09:44:23) [GCC] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import exiv2
>>> image = exiv2.ImageFactory.open('IMG_0211.JPG')
>>> image.readMetadata()
>>> data = image.exifData()
>>> data['Exif.Image.Artist']._print()
'Jim Easterbrook'
>>>

Documentation

The libexiv2 library is well documented for C++ users, in Doxygen format. Recent versions of SWIG can convert this documentation to pydoc format in the Python interface:

$ pydoc3 exiv2.Image.exifData

Help on method_descriptor in exiv2.Image:

exiv2.Image.exifData = exifData(...)
    Returns an ExifData instance containing currently buffered
        Exif data.

    The contained Exif data may have been read from the image by
    a previous call to readMetadata() or added directly. The Exif
    data in the returned instance will be written to the image when
    writeMetadata() is called.

    :rtype: :py:class:`ExifData`
    :return: modifiable ExifData instance containing Exif values

Assignment

libexiv2 stores metadata values in a generalised container whose type can be set by the type of a value assigned to it, for example:

// C or C++
exifData["Exif.Image.SamplesPerPixel"] = uint16_t(162);

This forces the Exif.Image.SamplesPerPixel value to be an unsigned short. Python doesn’t have such specific integer types, so if you want to set the type you need to create an exiv2 value of the appropriate type and assign that:

# Python
exifData["Exif.Image.SamplesPerPixel"] = exiv2.UShortValue(162)

This allows you to set the value to any type, just like in C++, but the Python interface warns you if you set a type that isn’t the default for that tag. Alternatively you can use any Python object and let libexiv2 convert the string representation of that object to the appropriate type:

# Python
exifData["Exif.Image.SamplesPerPixel"] = 162

Iterators

Several libexiv2 classes use C++ iterators to expose private data, for example the ExifData class has a private member of std::list<Exifdatum> type. The classes have public begin and end methods that return std::list iterators. In C++ you can dereference one of these iterators to access the Exifdatum object, but Python doesn’t have a dereference operator.

This Python interface converts the std::list iterator to a Python object that has access to all the Exifdatum object’s methods. For example:

Python 3.6.12 (default, Dec 02 2020, 09:44:23) [GCC] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import exiv2
>>> image = exiv2.ImageFactory.open('IMG_0211.JPG')
>>> image.readMetadata()
>>> data = image.exifData()
>>> b = data.begin()
>>> b.key()
'Exif.Image.ProcessingSoftware'
>>>

The Python objects can be used to iterate over the data in a very C++ like style:

>>> data = image.exifData()
>>> b = data.begin()
>>> e = data.end()
>>> while b != e:
...     b.key()
...     next(b)
...
'Exif.Image.ProcessingSoftware'
<Swig Object of type 'ExifDataIterator *' at 0x7f2cbf6c2fb8>
'Exif.Image.ImageDescription'
<Swig Object of type 'ExifDataIterator *' at 0x7f2cbf6c2fb8>
[skip 227 line pairs]
'Exif.Thumbnail.JPEGInterchangeFormat'
<Swig Object of type 'ExifDataIterator *' at 0x7f2cbf6c2fb8>
'Exif.Thumbnail.JPEGInterchangeFormatLength'
<Swig Object of type 'ExifDataIterator *' at 0x7f2cbf6c2fb8>
>>>

The <Swig Object of type 'ExifDataIterator *' at 0x7f2cbf6c2fb8> lines are the Python interpreter showing the return value of next(b). You can also iterate in a more Pythonic style:

>>> data = image.exifData()
>>> for datum in data:
...     datum.key()
...
'Exif.Image.ProcessingSoftware'
'Exif.Image.ImageDescription'
[skip 227 lines]
'Exif.Thumbnail.JPEGInterchangeFormat'
'Exif.Thumbnail.JPEGInterchangeFormatLength'
>>>

Warning: segmentation faults

It is easy to crash python-exiv2 if you delete objects which contain data that another object is pointing to. For example, deleting an Image after extracting its metadata can cause a segfault when the metadata is accessed. Ideally the Python interface to libexiv2 would use Python objects’ reference counts to ensure this doesn’t happen, preventing the deletion of the Image object until all references to it have been deleted. Unfortunately I haven’t found a sensible way to do this in the Python interface, so some care is needed when using it.

Error handling

libexiv2 has a multilevel warning system a bit like Python’s standard logger. The Python interface redirects all Exiv2 messages to Python logging with an appropriate log level. The exiv2.LogMsg.setLevel function can be used to control what severity of messages are logged.

Installation

Python “wheels” are available for Windows (Python 3.5 to 3.9) and Linux & MacOS (Python 3.6 to 3.10). These include the libexiv2 library and should not need any other software to be installed. They can be installed with Python’s pip package. For example, on Windows:

C:\Users\Jim>pip install python-exiv2

or on Linux or MacOS:

$ sudo pip3 install python-exiv2

You can install for a single user with the --user option:

$ pip3 install --user python-exiv2

If the available wheels are not compatible with your operating system then pip will download the python-exiv2 source and attempt to compile it. For more information, and details of how to compile python-exiv2 and libexiv2, see INSTALL.rst.

Problems?

Please email jim@jim-easterbrook.me.uk if you find any problems (or solutions!).

Download files

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

Source Distribution

python-exiv2-0.5.2.zip (4.1 MB view details)

Uploaded Source

Built Distributions

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

python_exiv2-0.5.2-cp310-cp310-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.10Windows x86-64

python_exiv2-0.5.2-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (6.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.12+ x86-64

python_exiv2-0.5.2-cp310-cp310-macosx_10_9_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

python_exiv2-0.5.2-cp39-cp39-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.9Windows x86-64

python_exiv2-0.5.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (6.2 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.12+ x86-64

python_exiv2-0.5.2-cp39-cp39-macosx_10_9_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

python_exiv2-0.5.2-cp38-cp38-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.8Windows x86-64

python_exiv2-0.5.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (6.2 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.12+ x86-64

python_exiv2-0.5.2-cp38-cp38-macosx_10_9_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

python_exiv2-0.5.2-cp37-cp37m-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.7mWindows x86-64

python_exiv2-0.5.2-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (6.1 MB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.12+ x86-64

python_exiv2-0.5.2-cp37-cp37m-macosx_10_9_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.7mmacOS 10.9+ x86-64

python_exiv2-0.5.2-cp36-cp36m-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.6mWindows x86-64

python_exiv2-0.5.2-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (6.1 MB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.12+ x86-64

python_exiv2-0.5.2-cp36-cp36m-macosx_10_9_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.6mmacOS 10.9+ x86-64

python_exiv2-0.5.2-cp35-cp35m-win_amd64.whl (1.6 MB view details)

Uploaded CPython 3.5mWindows x86-64

File details

Details for the file python-exiv2-0.5.2.zip.

File metadata

  • Download URL: python-exiv2-0.5.2.zip
  • Upload date:
  • Size: 4.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.26.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python-exiv2-0.5.2.zip
Algorithm Hash digest
SHA256 793b63d09ad4f756097d3737a72752f0b26a0efa4ab90ffdeae3f2c1b49e9875
MD5 1f8ae019b591722ca919ebd45855d273
BLAKE2b-256 839441f217afeebfed6349029efad1caf1b2cdccf1f493ed83ebfc94c9758f6f

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.2-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: python_exiv2-0.5.2-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.26.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python_exiv2-0.5.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 53ce670cd11b67f767ff0dc553d72ef0b9bd2b449a558a74b59ccdf159a56cf9
MD5 3e04d8d7a8c0ec33db3c1235ad3bea01
BLAKE2b-256 e44558f548ada0b9ac7f052240afa49d7698de173e04cf1d6799c0fe03072fab

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.2-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for python_exiv2-0.5.2-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 ecc714086383049706da902a7eb4819e557c870b80cc8a2702253bc3b3601818
MD5 aa1516ba9da337b310a5d9ca55464d35
BLAKE2b-256 888af8751f7264f678ce912d8ec968b0954ebde3bcd4adb595d420782a1b29b7

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.2-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: python_exiv2-0.5.2-cp310-cp310-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.10, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.26.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python_exiv2-0.5.2-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 1629f26239415758c9076c715bf1677f314c99ef58e1c3807ca056296efae4d5
MD5 62053c851b96bb8b76407438bc12bb83
BLAKE2b-256 dea23224cd40ff8e3999c3f457ba92e7bf921c5cc597927c52414fb90ea4f743

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.2-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: python_exiv2-0.5.2-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.26.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python_exiv2-0.5.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 f21a08dc7ed5faca299c936a34aa7ec7c9c3991fc834c71bced6a041a24f06a4
MD5 90662e9b911c2c0a798a35be8f5c3db6
BLAKE2b-256 eb43db7906f7c2155b4d9c058a94b4016d64992b037fcaad0a00914e5edfa5c5

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for python_exiv2-0.5.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 03b15c8646f0f0c4a84ef22a1ddd7011bd13c2870f8ca9dd4afc26104d587192
MD5 24adcceea715b3407837205eefa2ee5b
BLAKE2b-256 fd9b38a59830606b5e7fcac14ef1a9140ea30d7b22711bbca70a64640b591232

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.2-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: python_exiv2-0.5.2-cp39-cp39-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.9, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.26.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python_exiv2-0.5.2-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 b446a23cbde24cf7471e1d90ede2336f2f43fa8e60746e43eab2d5d4af1f784e
MD5 5b5d3116c1b0cc7dd37c01d154b29fd0
BLAKE2b-256 db6706176a4b9c5c70e060974b98d2ae3ed0ccebe8970bd3a17fe10e43c667f0

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.2-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: python_exiv2-0.5.2-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.26.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python_exiv2-0.5.2-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 878a98e359eee1af677b0feba72ecf34488cf7a097ce4e8857aac8fc886028ce
MD5 5611766236466abe4d39082f01987a02
BLAKE2b-256 69a1ca86dce34db3548f803988688c613c4385b5bbca8ef93ac0ebeee996a637

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for python_exiv2-0.5.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 63a1278dbb2f2397eb191a4e761afec81bd5325c942a0fd40785790e29931e6c
MD5 c8b85d0cc8b075bbf3bffb1f0e752d61
BLAKE2b-256 39d30376958b9210ffe01a13edba8576baa093e6f67a897a969283f1d75c3a50

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.2-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: python_exiv2-0.5.2-cp38-cp38-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.8, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.26.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python_exiv2-0.5.2-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 78701dd0b132d544ead5ff397cea11886c0c1ef0876618083d5d297393173e37
MD5 deddf57fbd7eb7cf1ad5eff8efa29a07
BLAKE2b-256 91ecabf43eb8831c56f6c4c562244c8f08943ee072108e1e386bd8d88ed92c79

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.2-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: python_exiv2-0.5.2-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.26.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python_exiv2-0.5.2-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 ca776155a9320214f91c2ae57cfe7631228fd0a5eeeb7fbea639ec6f0ac39c94
MD5 43231d9bf226ec4f25c6009555e69969
BLAKE2b-256 dd73624aa9876f222c27acd42655362659cadd4c2456403c0ac72d89c3950011

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.2-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for python_exiv2-0.5.2-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 aca4787b133889d473e32e872a2ddd728b860ee681e67db752e7a3c122ee1e7a
MD5 858ae82a57c93b1e33077923049e3833
BLAKE2b-256 51b936d73f9185c7def80addf90967a1d0675963fc293c13b54ac396fd714dca

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.2-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: python_exiv2-0.5.2-cp37-cp37m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.7m, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.26.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python_exiv2-0.5.2-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 b908ed0356126d0d6a095e4010a6311932ad7835c46508ba660664580bca5ba2
MD5 93427beef14d54343db2dce4efb5946a
BLAKE2b-256 23e8cf0c791f935d300c3ca8b341f5c63a735486d695d266d6459e41eb361d9c

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.2-cp36-cp36m-win_amd64.whl.

File metadata

  • Download URL: python_exiv2-0.5.2-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.6m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.26.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python_exiv2-0.5.2-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 bdc1601a2058ee74ddb6913ed1d7d6438128012f11191584ade9f20ae2afc26d
MD5 b326f685a00120ec9f08b435badb95d3
BLAKE2b-256 3034c2fecb17839ea1831359c6de8b9fe7090f7b574a35b8865f76714a052c21

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.2-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for python_exiv2-0.5.2-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 3afec8d1026af9ac8a22729adffa9c67e565450400ce8cf0da213086d7814065
MD5 e4ae4990f375b8e70b676552ec225924
BLAKE2b-256 a0fe355b9c346a8cf7cdc69f2e2a57790df08cb0ba9afcaf4ad1437c9f8876c7

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.2-cp36-cp36m-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: python_exiv2-0.5.2-cp36-cp36m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.6m, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.26.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python_exiv2-0.5.2-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 6551615506f6f07286f6793d7c4e945a7e6f95e6fc0e991dd49c182ee6e42b0f
MD5 71d2b2b674ed8e912def350485c13e69
BLAKE2b-256 453759cd92a95c4bcff1ba303708cd722b20791b888b8fe61622df08caae66cb

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.2-cp35-cp35m-win_amd64.whl.

File metadata

  • Download URL: python_exiv2-0.5.2-cp35-cp35m-win_amd64.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.5m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.26.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python_exiv2-0.5.2-cp35-cp35m-win_amd64.whl
Algorithm Hash digest
SHA256 de069585d6d3c12d38cb7bbb36ba5e92dc96f596f7cf2da26688dbacca111422
MD5 42fb9907cc2a59e7c4f8eb714a0a4b20
BLAKE2b-256 dc4a9d8f8188fc02b5ecde75d51f3b6aafb777d86656ac14853f6aa987ca4e97

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