Skip to main content

PyPI version

Crackle: Next gen. 3D segmentation compression codec.

# Command Line Interface
crackle data.npy # creates data.ckl
crackle -m 5 data.npy # use a 5th order context model
crackle -p data.npy # use pin encoding for labels
crackle -p -m 5 data.npy # use pins and markov model
crackle -d data.ckl # recovers data.npy
crackle -m 0 data.ckl # change markov model order
crackle --test data.ckl # check for file corruption

# convert between file types if you have the libraries installed
crackle -z --to tiff -k data.ckl # data.ckl -> zlib compressed data.tiff
crackle --to nrrd data.ckl # data.ckl -> data.nrrd
import crackle
import numpy

labels = np.load("example.npy") # a 2D or 3D dense segmentation

binary = crackle.compress(labels, allow_pins=False, markov_model_order=0)
labels = crackle.decompress(binary, parallel=0) # use all cores (default)

# faster extraction of binary images
binary_image = crackle.decompress(binary, label=1241)

# get unique labels without decompressing
uniq = crackle.labels(binary) 
# get unique labels for a z-range
uniq = crackle.labels_for_z_range(binary, 5, 10)
# get num labels without decompressing
N = crackle.num_labels(binary) 
# get min and max without decompressing
mn = crackle.min(binary)
mx = crackle.max(binary)
# check if label in array in log(N) time
has_label = crackle.contains(binary, label)
# extract a range of labels in something like log(N) time
labels = crackle.contains_range(binary, low, high)

# iterate over all binary images rapidly. crop
# close crops to the ROI and makes iteration a bit faster
for label, binimg in crackle.each(binary, crop=True):
  pass

# iterate over 255 labels at a time. Useful if your downstream
# processing supports multilabel images but you need an 8x reduction
# in memory usage compared to a uint64 image. Much faster than binary
# image iteration. img is reused for 255 iterations before being replaced.
for label, tmp_label, img in crackle.each(binary, multi=True):
  pass

# Remap labels without decompressing. Could
# be useful for e.g. proofreading.
remapped = crackle.remap(
  binary, { 1: 2, 2: 3, ... },
  preserve_missing_labels=True
)

# change dtype to smallest possible w/o precision loss
remapped = crackle.refit(binary)
# renumber array and change dtype to smallest possible
remapped = crackle.renumber(binary, start=0)

is_equal = crackle.array_equal(binary1, binary2)
arr == arr2 # syntactic sugar for CrackleArrays
arr.array_equal(arr2) # method call for CrackleArrays

# for working with files
# if .gz is appended to the filename, the file will be
# automatically gzipped (or ungzipped)
crackle.save(labels, "example.ckl.gz")
labels = crackle.load("example.ckl.gz")

# Save a crackle array as a numpy array
# in a memory efficient manner.
crackle.save(binary, "example.npy.gz")

arr = crackle.CrackleArray(binary, parallel=0) # 0 means use all cores (default)
res = arr[:10,:10,:10] # array slicing (efficient z ranges)
arr[:,:,30] = 20 # write to a crackle array (whole z slices write faster)
20 in arr # log(N) check
arr = arr.numpy() # convert to a numpy array

# low memory extraction of point clouds
ptc = crackle.point_cloud(binary) # { label: np.ndarray, ... }
ptc = crackle.point_cloud(binary, label=777)
ptc = crackle.point_cloud(binary) 

# rapid and low memory
voxel_counts = crackle.voxel_counts(binary)
centroids = crackle.centroids(binary)
bbxes = crackle.bounding_boxes(binary)

# extract the 4-way or 6-way voxel connectivity graph
# note: 4-way is stored in the format so is extremely fast
vcg = crackle.voxel_connectivity_graph(binary, connectivity=6)

# surface area for 6-connected region contacts
contacts = crackle.contacts(binary, anisotropy=(32,32,40))

# low memory CCL, the more memory you provide, the faster it goes
ccl_binary = crackle.connected_components(
  binary, 
  connectivity=26, # 6 (faces) & 26 (faces,edges,corners) supported
  memory_target=int(1e9), # bytes
  progress=True,
  return_mapping = False, # can also return { cc label: original label }
)

# building big arrays with low memory
binary = crackle.zeros([5000,5000,5000], dtype=np.uint64, order='F')

part1 = np.zeros([1000, 1000, 1000], dtype=np.uint32)
part2 = crackle.ones([1000, 1000, 1000], dtype=np.uint32)

binary = crackle.asfortranarray(binary)
binary = crackle.ascontiguousarray(binary)

# creates a crackle binary with part1 stacked atop part2
# in the z dimension. x and y dimensions must match
# without needing to decompress anything.
binary = crackle.zstack([ part1, part2 ])

# splits a crackle binary into before, middle (single slice),
# and after sections without decompressing.
before, middle, after = crackle.zsplit(binary, z=742)

# splits binary into individual z slices
sections = crackle.zshatter(binary)

This repository is currently Beta. It works and the format is reasonably fixed. There may be some improvements down the line (such as 3d compression of crack codes, 2d chunking), but they will be a new format version number if necessary to retain backwards compatibility.

Crackle is a compression codec for 3D dense segmentation (labeled) images. The algorithm accepts both signed and unsigned integer labels (though the implementation currently has some restrictions on signed integers). It is written in C++ and has Python bindings. Crackle uses a two pass compression strategy where the output of crackle may be further comrpessed with a bitstream compressor like gzip, bzip2, zstd, or lzma. However, if the Crackle binary, which is already small, is not further compressed, it supports several efficient operations:

  • Query if a label exists in the image
  • Extract unique labels
  • Remap labels
  • Decode by Z-Range

Crackle is inspired by Compresso [1]. Compresso innovated by separating labels from boundary structures. There were conceptually four (but really five) elements in the format: header, labels, bit packed and RLE encoded binary image boundaries, and indeterminate boundary locations.

Crackle improves upon Compresso by replacing the bit-packed boundary map with a "crack code" and can also use 3D information to reduce redundancy in labels using "pins".

See benchmarks for more information on Crackle's size and compute effiency.

Optional Performance Enhancing Sidecar .ckl.meta.parquet File

Counting voxels or measuring bounding boxes is fully supported by the bare crackle file, but requires computation which on large images or numerous images can become substantial. Therefore, crackle comes with a facility for generating a .parquet file containing this metadata information for faster retrieval. Currently, to avoid engineering complexity, crackle does not make use of this file, so use pyarrow, duckdb, or similar to read it. This extra file adds nothing except performance enhancement for some use cases. All data can be generated from the crackle file alone, and nothing is lost if the sidecar file is lost.

You will need pyarrow installed to generate this file: pip install pyarrow

crackle -M myfile.ckl # generates myfile.ckl.meta.parquet
import crackle

arr = crackle.aload("myfile.ckl")
arr.cache_meta("myfile.ckl.meta.parquet") # generate the sidecar file

You can then read the parquet files using your favorite parquet reader. Sometimes it is faster to use crackle methods on single files, but when tested on hundreds of thousands of files, reading voxel counts out of parquet was 100x faster (20 files per second versus 2000 on a Macbook M3).

Parquet Schema

Bbox type is uint16 unless the xy dimensions of the crackle file exceed 16-bits (65,535) in which case it is uint32.

label: uint64
voxel_count: uint32
min_x: uint16 or uint32
max_x: uint16 or uint32
min_y: uint16 or uint32
max_y: uint16 or uint32
# if it's a 3d crackle file
min_z: uint16 or uint32
max_z: uint16 or uint32

Reading Example

import pyarrow.parquet as pq
table = pq.read_table("myfile.ckl.meta.parquet")
print(table)

Installation

pip install crackle-codec 

Building from source (requires cmake and a c++ compiler):

git clone https://github.com/seung-lab/crackle.git
cd crackle
git submodule update --init --recursive # fetches google/crc32c library
python setup.py develop

Versions

Format Version Description
0 Initial release w/ flat, pins, crack codes with finite context modeling. Beta.
1 Incr. header to 29 bytes from 24. num_label_bytes u32->u64, adds crcs to protect stream components.

Stream Format

Section Bytes Description
Header v0: 24, v1: 29 Metadata incl. length of fields.
Crack Index header.sz * sizeof(uint32), v1: +4 Number of bytes for the crack codes in each slice + CRC32c(le)
Labels header.num_label_bytes Can be either "flat" labels or "pins". Describes how to color connected components.
Crack Codes Variable length. Instructions for drawing crack boundaries.
Labels crc32c (v1 only) 4(le) v0: n/a, v1: crc32c of the labels binary.
Crack crc32c (v1 only) header.sz * 4(le) v0: n/a, v1: crc32c of the uncompressed uint32_t fortran order connected component labeling of each z-slice.

A Note on CRCs

CRCs protect each step of the decoding process. The fixed width header is protected by crc8, which contains information for decoding the crack index. The crack index is in turn protected by a crc32c. This is not overkill because a very large volume or a volume that is randomly accessible in XY as well as Z would need a crc32 vs a crc16.

The crack index is used for decoding the structural information (the connected components for each slice). We store a crc32c for each z-slice. This allows random z access to be validated while balancing against the storage cost of creating too many crc (e.g. vs. once per a grid).

We also store a crc32c for the labels binary independently of the crack codes.

All crcs are stored little endian.

Why not store a single crc for the entire uncompressed image? This would make it difficult to validate as a single crackle file could represent many terabytes of data. It would also make it difficult to edit the labels (remap) independently of the structure. Storing a crc32c per a z-slice also allows for z-stacking independent slices without recalculating crcs.

The downside to this strategy is a small increase in the file size and an increase in false positives for crc32s. This is the price of having the format be more of a random-access array format than a bitstream format. However, as crackle is designed to be two stage compressed, for example, with lzip, an LZMA variant with error correction properties, these issues are mitigated when archived.

crc8 (0xe7, initialized with 0xFF) was selected due to its ability to reliably detect two bit flips in up to 247 bits of message data, the best available for our header length.

crc32c was selected as the polynomial due to the availability of high performance implementations. This is important to avoid CRC calculation being a significant cost to the codec.

Error Detection and (Limited, Human Assisted) Correction

Due to this mutli-crc strategy, it is possible to narrow down corruptions to the section of the binary where they occur. For example, if you are concerned with only z=1-100 and the error occurs at z=200, you're ok. If the error occurs in the labels_binary, but you were planning on applying a full new mapping anyway, you can get away with discarding the extant labeling. Certain bit flips in the labels binary will create out of range keys, which will aid in identifying exactly where the error occured. Headers can be repaired potentially be human inspection (if they know the dataset).

Header

Attribute Value Type Description
magic crkl char[4] File magic number.
format_version 0 or 1 u8 Stream version.
format_field bitfield u16 See below.
sx, sy, sz >= 0 u32 x 3 Size of array dimensions.
grid_size log2(grid_size) u8 Stores log2 of grid dimensions in voxels.
num_label_bytes Any. u64 Number of bytes of the labels section. Note the labels come in at least two format types.
crc8 Any. u8 CRC8 of format_field thru num_label_bytes using polynomial 0xe7 (implicit) and 0xFF initialization.

Format Field (u16): DDSSCLLFGOOOOURR (each letter represents a bit, left is LSB)

DD: 2^(DD) = byte width of returned array (1,2,4,8 bytes)
SS: 2^(SS) = byte width of stored labels (sometimes you can store values in 2 bytes when the final array is 8 bytes)
C: 1: crack codes denote impermissible boundaries 0: they denote permissible boundaries.
LL: 0: "flat" label format, 1: fixed width pins (unused?) 2: variable width pins 3: reserved
F: whether the array is to be rendered as C (0) or F (1) order
G: Signed (if (1), data are signed int, otherwise unsigned int)
OOOO: Nth-Order of Markov Chain (as an unsigned integer, typical values 0, or 3 to 7). If 0, markov compression is disabled.
U: if 0, unique labels are sorted, else, unsorted
R: Reserved

CRC8 only covers the header. It doesn't cover the magic number or format version since those are easily human correctable if needed.

Flat Label Format

Attribute Type Description
num_unique u64 Number of unique labels in this volume.
unique_labels stored_type[num_unique] Sorted ascending array of all unique values in image, stored in the smallest data type that will hold them.
cc_per_grid smallest_type(sx * sy)[sz] Array containing the number of CCL IDs in each grid (usually a z-slice).
cc_to_labels smallest_type(num_labels)[sum(cc_per_grid)] Array mapping CCL IDs to their proper value by indexing the unique labels array.

Flat labels are random access read, allow efficient reading of unique labels, efficient remapping, and efficient search for a given label's existence. Since the connected component labels can often use a smaller byte width than the unique values, even noise arrays can see some value from compression.

Encoding flat labels is fast.

Condensed (Variable Width) Pins Label Format

Attribute Type Description
background_color stored_data_width Background color of image.
num_unique u64 Number of unique labels in this volume.
unique_labels stored_type[num_unique] Sorted ascending array of all unique values in image, stored in the smallest data type that will hold them.
cc_per_grid smallest_type(sx * sy)[sz] Array containing the number of CCL IDs in each grid (usually a z-slice).
fmt_byte u8 00CCDDNN DD: 2^(DD) is the depth width NN: 2^(NN) is the num pins width, CC: 2^(CC) is the single components width.
pin_section Bitstream to end of labels section. Contains pin information.

PIN SECTION: | PINS FOR LABEL 0 | PINS FOR LABEL 1 | ... | PINS FOR LABEL N |

PINS: | num_pins | INDEX_0 | INDEX_1 | ... | INDEX_N | DEPTH_0 | DEPTH_1 | ... | DEPTH_N | num_single_labels | CC 0 | CC 1 | ... | CC N |

Both num_pins and num_single_labels use the num_pins_width.

Note that INDEX_0 to INDEX_N are stored with a difference filter applied to improve compressibility.

A pin (color, position, depth) is a line segment that joins together multiple connected component IDs and labels them with a color (an index into UNIQUE LABELS) in order to use 3D information to compress the labels as compared with the flat label format. Pins are slow to compute but fast to decode, however random access is lost (a full scan of the labels section is needed to decode a subset of crack codes). The most frequent pin is replaced with a background color. Like with flat, efficient reading of unique labels, efficient remapping, and search are supported.

Depending on the image statistics and quality of the pin solver, pins can be much smaller than flat or larger (some heuristics are used to avoid this case). An excellent example of where pins do well is a binary image where remarkable savings can be achieved in the labels section (though overall it is probably a small part of the file).

For very short pins (e.g. depth 0 or 1) that take more bytes to record than simply listing the corresponding CC label, we list the CC label instead. This calculation is made depending on the dimensions of the image and the max pin depth, and the byte width of the CCL labels.

Example calculation. For a 512 x 512 x 32 file with an average of 1000 CCL's per a slice and a maximum pin depth of 30, a pin takes 4 index + 1 depth = 5 bytes while a CCL takes 2 bytes. Therefore, depth 1 and 2 pins can be efficiently replaced with 1 and 2 CCL labels for a 60% and 20% savings respectively. CCLs are also difference coded to enhance second stage compressibility.

Fixed Width Pins (disabled)

| BACKGROUND COLOR (STORED_DATA_WIDTH) | NUM_LABELS (u64) | UNIQUE LABELS (NUM_LABELS \* STORED_DATA_WIDTH) | PIN SECTION |

PIN SECTION: |PIN0|PIN1|PIN2|...|PINN| PIN: |LABEL|INDEX|DEPTH|

A fixed width variant of pins has also been developed but is not enabled. It frequently is not significantly smaller than flat outside of special circumstances such as a binary image. An advantage this format would have over condensed is that the pins can be sorted and searched rapidly by index, which reduces the amount of reading one might have to do on an mmapped file. Please raise an issue if this seems like something that might be useful to you.

Crack Code Format

CRACK CODE: MARKOV MODEL | CHAIN 0 | CHAIN 1 | ... | CHAIN N |

CHAIN: | BEGINNING OF CHAIN INDEX (sizeof(sx * sy)) | BIT PACKED MOVES (2 bits each) |

MARKOV MODEL (if enabled): priority order of moves UDLR packed per a byte. 4^order bytes.

The BEGINNING OF CHAIN INDEX (BOC) locates the grid vertex where the crack code will begin. Vertices are the corners of the pixel grid, with 0 at the top left and sx*sy-1 at the bottom right (fortran order).

The crack code is a NEWS code (up,right,left,down). Impossible combinations of directions are used to signal branching and branch termination. The next chain begins in the next byte when a termination signal causes the current branch count to reach zero.

There may be ways to further improve the design of the crack code. For example, by applying a difference filter a few more percent compression under gzip can be obtained. In the literature, there are other shorter codes such as a left,right,straight (LRS) code and fancy large context compressors that can achieve fewer than one bit per a move.

Boundary Structure: Crack Code

Our different approach is partially inspired by the work of Zingaretti et al. [2]. We represent the boundary not by border voxels, but by a "crack code" that represents the edges between voxels. This code can be thought of as directions to draw edges on a graph where the vertices are where the corners of four pixels touch and the edges are the cracks in between them.

Since this regular graph is 4-connected, each "move" in a cardinal direction can be described using two bits. To represent special symbols such as "branch" and "terminate", an impossible set of instructions on an undirected graph such as "left-right" or "up-down" can be used (occupying 4 bits). In order to avoid creating palendromic sequences such as (3, 0, 3) meaning (down, branch) but can be read (terminate, down), we can use the left-right impossible directions to rewrite it as (3, 2, 1).

While the image is 3D, we treat the image in layers because working in 3D introduces a large increase in geometric complexity (a cube has 6 faces, 12 edges, and 8 corners while a square has 4 edges and 4 corners). This increase in complexity would inflate the size of the crack code and make the implementation more difficult.

Label Map: Method of Pins

Each 2D CCL region must has a label assigned. Due to the 2D nature of the crack code, we cannot use 3D CCL. However, for example, a solid cube of height 100 would need 100 labels to represent the same color on every slice as in Compresso.

It is still possible to reduce the amount of redundant information even without 3D CCL. For each label, we find a set of vertical line segments ("pins") that fully cover the label's 2D CCL regions. Sharp readers may note that this is the NP-hard set cover problem.

Once a reasonably small or minimal set of pins are found, they can be encoded in two forms:

Condensed Form: [label][num_pins][pin_1][pin_2]...[pin_N] Fixed Width Form: [label][pin_1][label][pin_2]...[label][pin_N] Pin Format: [linear index of pin top][number of voxels to bottom]

Fixed width example with label 1 with a pin between (1,1,1) and (1,1,5) on a 10x10x10 image: [1][111][4]

An alternative formulation [label][idx1][idx2] was shown in an experiment on connectomics.npy.cpso to compress slightly worse than Compresso labels. However, this alternative formulation theoretically allows arbitrary pin orientations and so might be useful for reducing the overall number of pins.

The condensed format is a bit smaller than the fixed width format, but the fixed width format enables rapid searches if the set of pins are sorted by either the label (enables fast label in file) or the likely more useful sorting by top index to filter candidate pins when performing random access to a z-slice.

References

  1. Matejek, B., Haehn, D., Lekschas, F., Mitzenmacher, M., Pfister, H., 2017. Compresso: Efficient Compression of Segmentation Data for Connectomics, in: Descoteaux, M., Maier-Hein, L., Franz, A., Jannin, P., Collins, D.L., Duchesne, S. (Eds.), Medical Image Computing and Computer Assisted Intervention − MICCAI 2017, Lecture Notes in Computer Science. Springer International Publishing, Cham, pp. 781–788. https://doi.org/10.1007/978-3-319-66182-7_89

  2. Zingaretti, P., Gasparroni, M., Vecci, L., 1998. Fast chain coding of region boundaries. IEEE Transactions on Pattern Analysis and Machine Intelligence 20, 407–415. https://doi.org/10.1109/34.677272

  3. Freeman, H., 1974. Computer Processing of Line-Drawing Images. ACM Comput. Surv. 6, 57–97. https://doi.org/10.1145/356625.356627

Download files

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

Source Distribution

crackle_codec-0.43.0.tar.gz (135.9 kB view details)

Uploaded Source

Built Distributions

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

crackle_codec-0.43.0-cp314-cp314t-win_amd64.whl (402.0 kB view details)

Uploaded CPython 3.14tWindows x86-64

crackle_codec-0.43.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (511.1 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.43.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (493.1 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.43.0-cp314-cp314t-macosx_11_0_arm64.whl (523.9 kB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

crackle_codec-0.43.0-cp314-cp314t-macosx_10_15_x86_64.whl (549.8 kB view details)

Uploaded CPython 3.14tmacOS 10.15+ x86-64

crackle_codec-0.43.0-cp314-cp314-win_amd64.whl (395.5 kB view details)

Uploaded CPython 3.14Windows x86-64

crackle_codec-0.43.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (511.4 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.43.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (489.9 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.43.0-cp314-cp314-macosx_11_0_arm64.whl (515.2 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

crackle_codec-0.43.0-cp314-cp314-macosx_10_15_x86_64.whl (540.4 kB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

crackle_codec-0.43.0-cp313-cp313-win_amd64.whl (386.8 kB view details)

Uploaded CPython 3.13Windows x86-64

crackle_codec-0.43.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (510.9 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.43.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (489.5 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.43.0-cp313-cp313-macosx_11_0_arm64.whl (515.0 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

crackle_codec-0.43.0-cp313-cp313-macosx_10_13_x86_64.whl (540.0 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

crackle_codec-0.43.0-cp312-cp312-win_amd64.whl (386.7 kB view details)

Uploaded CPython 3.12Windows x86-64

crackle_codec-0.43.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (510.9 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.43.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (489.5 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.43.0-cp312-cp312-macosx_11_0_arm64.whl (514.9 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

crackle_codec-0.43.0-cp312-cp312-macosx_10_13_x86_64.whl (539.9 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

crackle_codec-0.43.0-cp311-cp311-win_amd64.whl (384.8 kB view details)

Uploaded CPython 3.11Windows x86-64

crackle_codec-0.43.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (505.3 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.43.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (488.2 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.43.0-cp311-cp311-macosx_11_0_arm64.whl (505.1 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

crackle_codec-0.43.0-cp311-cp311-macosx_10_9_x86_64.whl (543.6 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

crackle_codec-0.43.0-cp310-cp310-win_amd64.whl (384.0 kB view details)

Uploaded CPython 3.10Windows x86-64

crackle_codec-0.43.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (505.3 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.43.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (487.5 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.43.0-cp310-cp310-macosx_11_0_arm64.whl (503.4 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

crackle_codec-0.43.0-cp310-cp310-macosx_10_9_x86_64.whl (542.2 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

crackle_codec-0.43.0-cp39-cp39-win_amd64.whl (383.8 kB view details)

Uploaded CPython 3.9Windows x86-64

crackle_codec-0.43.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (504.3 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.43.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (487.4 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.43.0-cp39-cp39-macosx_11_0_arm64.whl (503.6 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

crackle_codec-0.43.0-cp39-cp39-macosx_10_9_x86_64.whl (542.0 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

File details

Details for the file crackle_codec-0.43.0.tar.gz.

File metadata

  • Download URL: crackle_codec-0.43.0.tar.gz
  • Upload date:
  • Size: 135.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.3

File hashes

Hashes for crackle_codec-0.43.0.tar.gz
Algorithm Hash digest
SHA256 c919a9ba7f93530c06b3afe8f93806aeedebadd49323ef92ad41907c3b066aaa
MD5 9ce55515b2db1726630af63482235999
BLAKE2b-256 b895d6f4ad78e313e81b4adef1d72344b35f2c0f9fa22880584d3dabd8e89df6

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp314-cp314t-win_amd64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 015e1df6689fe2a10539d97c0d40cd724578146c01fbcd6a28998da6ad157830
MD5 56e9d53ca722481515d4907edb4a934e
BLAKE2b-256 36fcf65f542f7a66a01f643fdfbe3bddac54337fe10a92dd5cdcedcfbdb8f474

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3eed3f4d1ef75d5b4b3f5e85fc1880bbaa8f0611c50e724caac6f00d222b0e7b
MD5 a5353d6ceb5385301a3ae04120b2f832
BLAKE2b-256 655478c07fbda1cc7fc42b027e2aec79cd5b75bffd54cb43f57d51149b59241a

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 7a5c0a72788ee2ccc7d4942e2ddadc2af4713a13b9655aa1da290f1667a56dac
MD5 bb91648a8c0f5b8820295c67bad21c89
BLAKE2b-256 7c12fdb99ea927e02718b9b78c009be9c9872567a6ff1266adc8d0ae57fb9d85

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp314-cp314t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 247d955da2365c978704a6662b6b49b665cfb2096e9adfa4820ef2220f3de76c
MD5 e5f6e80fb0e4979e0c6fff1a16ff886f
BLAKE2b-256 6b4aa7a8f717a9993c2b386cc0fa2e5cdb61f0198e899762cc5bf751810659e4

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp314-cp314t-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp314-cp314t-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 4b75d9ecfca403e6fcb0ca34aed9eb326233c9655f31928e44eabf8f4d17625c
MD5 c1cd74c5c54a128a8950151c7d87feab
BLAKE2b-256 d75cc6405cea0e2b8af2173fef1a94294cd6662ed11b0ac26241e619b6c1b1a0

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 08879b48698fe82b9a592e300db7803f8d111757bb2fa75f1a31ba77a01a769d
MD5 18ee5991378c8fa9e521a0e949683d0f
BLAKE2b-256 c56bd90a5e08cedbc5ceecf53b57444f8befde0b2cb37c2a329c8e8a4edf1141

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 44f6bcb2d71a867964ba2489c6873ef5f09c851b1b0ebf99cc00bb2b975dcaa1
MD5 6fc78f2c50d7642401c8b82078ed66aa
BLAKE2b-256 99b7fe1c4e4b4220b8bf71e28d8a439cf2b3e2e6abe16dbc7656352e31688d73

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 49faceeff21cf78767d1c81ed0dc69dc859f17e14f3740893ca5f6e3ce9a95b0
MD5 a0caf0c1382cf2583bb0e23699efee22
BLAKE2b-256 331fc7ff0013877365799152dbe789620f4f8c3ab0d1bec4a212add22362ad67

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7914e7fbe2b332fb115116635821f377dabb6094962531fbd322f6c9f569a410
MD5 7e47c708f8f5d2aef83823b482f3c2a7
BLAKE2b-256 0611c5761a119dd6e329966c36a3c98a69fa453691b0aeea52738482767d23fd

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp314-cp314-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 df8ac9ec753930fceb7f17228794008aad82cfa918587ed8de5dabe0326b170d
MD5 3b92984f590c13ed1841aec700fd6984
BLAKE2b-256 09a58584fdf9236b49c2f22399e87381af46b058de5e3402d0461b980f1a4655

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 2c4b61ffdaeeb0f90d3f588177a7a79f406d2721bce2cdd7bfc961742532d510
MD5 d739972c3b277db7570895aa6a1b0c8e
BLAKE2b-256 3672258c8556c9f9fbac2e4b0f00c4bbda69421f28adcffd758e94255f805b89

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ea3f5b0d8f5ba40207ab8e3bbb55c5879cc6a9a89ff06e3c52b868a58eee655c
MD5 54f8c0be09f164dddb8309aedabdc20e
BLAKE2b-256 f29227497267f85054723587d5ac046be7581dcf4bd0258ec7e01ae3bed5d0f0

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 e21851615a0b6d5a0cad8a4356fa4a5092aaa65090cf0bf3de5abda8840fb567
MD5 6bf086faf2b61b2d414118f49b53a276
BLAKE2b-256 01a7662df0e26d70918170b68ba1b876b7491a99692b9f6e3fb287192ad40052

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 adbff5d5abca179b390713f8c73b0e74397812ef99fa5c8dac83d677f4f71954
MD5 ad37a0896f37050ce9f98f65958e31c3
BLAKE2b-256 3531f6a9d37699f9d2ffd904b6ca2904e9950d10a61f97a842d176923eb96d2d

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 1c16c4fd964137735fd42b187f7cbf3c297061f50ffe8b4c28ecc01dfc23dd5a
MD5 777da0dcfdad1aeaf3f524a703b6c639
BLAKE2b-256 f9a060b7a2b43ff72f60b7ed06eb991a789e920c76fae3ef57697b3de29c331b

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 971a7226aa06fd9c4f7b76317a6dc3dc573afe89e2431f7ff3f02c76c953ecbc
MD5 11da3b7c95cfcff52358c9b9753fee1f
BLAKE2b-256 70f07edf06e7f6259b1d5fe31b5486d36132fd0dbc151d928fc577f588478a40

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b377e2b97030e02657f1649f17c9d696c25aa8702e9d21d63c6fdc51392b8ddc
MD5 2cb96d812753439fdf095537d204b282
BLAKE2b-256 3aef5eddc194cfdb86e80a38862d383a582556638cbdcc3ae14c5f4e4b2a5913

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c57bb6c05007a99e22456b00d9f9f5be4154712658376a6809478d92ea94cfa3
MD5 55e5e89c696bfd63dba5f9833542b75a
BLAKE2b-256 8f8d22acd0a6055701d75b7110473ebbb6e092767ec73388f0aafbef6c4eb64a

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fe52c73644850f2c7097953b410eb5cce4660fee03ffd12f05fbd6f77e0796a1
MD5 b87488d3ef19d282da7b54deb6947243
BLAKE2b-256 5c7e7fbb75fda78fc435113258cbe069781efa8f253fc0f92462168a231aac57

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 d8a104a728edafd430494c09aaa6a15fb7cb5def354e2aa17be0e5f448c5216e
MD5 61367178bba8ffb32544592d2a24ff5f
BLAKE2b-256 132bf0f17b27c7502f0924bbc2c1a7bd0f214d50303047bd629a1f423d95a63b

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 37d7b1db3ec9f50145cbc7a28e510d4b311ef0383310f29c6e2a666b9cb6e01d
MD5 ae389d6fc265d197356c7f206ced6402
BLAKE2b-256 b9efbf1a4d360a4abb9d5a3663974f5c6b16b1618bc9e2979fece43ea864d81c

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 78d3615be8caf5d151281b44de0236a260683060317c54ff0adbc17f6854fef3
MD5 8c75032bac28f6cc6748d3f76b815161
BLAKE2b-256 501a76ff20d65e0b94190703aabc887ff06ff4f00d59048c4a7fc0abfd9f077b

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 29c5d896fce0b94b8ba7a4a73889481ec52846ab943e8bde18a681fb08d7ead0
MD5 1d86ffd8644d066153d1738c5aa9cddc
BLAKE2b-256 61568e6e9b7cab9b02167c88681d218ef2ae6fea13c601f06ec5bc40b699a813

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 77875cab847dd65ec7ef1df1f47f9dc9cdfe034a82d8acbe8978c578eceae396
MD5 b4b43f8e7d509638903561708f3883c3
BLAKE2b-256 1e384f565e90e8d1400b77cd5739a76c1262bb44c11195bb42d11977afddc449

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 0206a83a8c4f8d417bd15842b8d5960e07432a7dfa4d0fbc31bdd1affbe7b0fc
MD5 70702a86f8d8edca6886cb786d750553
BLAKE2b-256 8d914e92e9286ea9bb6a903c08cc11da9f2a04618cc9d92a1c80237dc1951356

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 f9646586cd4ed1861d7e9f6dd69b55d284ff49930227fd668ed9d7f900ccf9f7
MD5 1f3211c4f7ec04f40db4b1de037ace72
BLAKE2b-256 581f3b914e22f4d506bc5f7d7a88851676a28e848997533b502b93a9b9369fab

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6f759f783048a1cce3c595a3b68a187da6844ebd2d8e92b78b0dae99e5f28f04
MD5 1c3215b8661c9bea1c02d01518364505
BLAKE2b-256 8010b345f6f2fc1e9504721f7de9bfc33421026d2605418f994a76e0a0436e83

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a8e97161a996b255e0f9470b61db49d637c16f1e256e9be3b6a3bd491c858cba
MD5 e9202efb36f2623f427ff09a78e0dd98
BLAKE2b-256 b29f562e42934222fabc4591f97a42d0ab77dd41bb2fef5f9cef3f652bac9555

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 106e17f2234bd7f3e8f36127d0325aedf7e422124c686465c2cb124a071de478
MD5 33d010480488c28195fcac27bf8ce303
BLAKE2b-256 5e4f31a2100f078533ad37288ee5c2b36633f41ca3334cee4b0180f9ff3ea37b

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 77e944ad2a486964217dbca856a3f049a50b31776b25a16b143a04809e1b66eb
MD5 5faa19f1c4c4e6d9fc876567570848b7
BLAKE2b-256 eb93034f86b108a0c642563518dfdb6416397b6f3645b390516c8ed4f82b7ce5

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 276b3d22e6b1b3b0d714c81511b3d5058661f142ca47e519e9e4856fb67e1faf
MD5 b1b1315a6cdc9dc47f2e7dd467b1df0a
BLAKE2b-256 18c06e35d5f99675568a9243c0d5e3b4f627ed20d190edad34813851789e835a

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 32cc0e783546c07c6795347a11e72a77b500a2ed1bf2aa5666e839e9949aa550
MD5 38db9a91c43d8ef3e6d3532e7b72391e
BLAKE2b-256 4a6f5b10d7dfce92056bc3231fbf2fe41754a5940b8e77dab0329a3f0ce3d56b

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 e3adcd5b48b3b69788b3d5afefeebbf20f182099c80680e021889e6b89846518
MD5 e7019fe9d9fa3d58a799fa7c1f2e2763
BLAKE2b-256 bda20c6dac152c3db435f4780fe355a48e9e9d073abda6892d30a0d94c95744b

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 de06cf0c3c0fc320fb23ab78e0e031c34bfc5c6624b1997d26ff3777d80a3ebf
MD5 08e05667afe641ad47f005f49e8df2ca
BLAKE2b-256 40a1b98f14f983529d5001b4d8823d5ebc1c86b55e8faef9a75387917a4d1bf5

See more details on using hashes here.

File details

Details for the file crackle_codec-0.43.0-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.43.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 0352601d8df51a300be0cacee86346bd46d985a1f8bcb41e3e174927636d7e2f
MD5 81cdeb25866b9add982feb2682eff697
BLAKE2b-256 4ef513ff125e5c071d24820131440e845761802ed3756c28b298b1506c5c531e

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