Skip to main content

Flashlight Text bindings for Python

Project description

Flashlight Text Python Bindings

Quickstart

The Flashlight Text Python package containing beam search decoder and Dictionary components is available on PyPI:

pip install flashlight-text

To enable optional KenLM support in Python with the decoder, KenLM must be installed via pip:

pip install git+https://github.com.kpu/kenlm.git

Contents

Installation

Dependencies

We require python >= 3.6 with the following packages installed:

  • cmake >= 3.18, and make (installable via pip install cmake)
  • KenLM (must be installed pip install git+https://github.com/kpu/kenlm.git)

Build Instructions

Once the dependencies are satisfied, from the project root, use:

pip install .

Using the environment variable USE_KENLM=0 removes the KenLM dependency but precludes using the decoder with a language model unless you write C++/pybind11 bindings for your own language model.

Install in editable mode for development:

pip install -e .

(pypi installation coming soon)

Note: if you encounter errors, you'll probably have to rm -rf build dist before retrying the install.

Python API Documentation

Beam Search Decoder

Bindings for the lexicon and lexicon-free beam search decoders are supported for CTC/ASG models only (no seq2seq model support). Out-of-the-box language model support includes KenLM; users can define custom a language model in Python and use it for decoding; see the documentation below.

To run decoder one first should define options:

    from flashlight.lib.text.decoder import LexiconDecoderOptions, LexiconFreeDecoderOptions

    # for lexicon-based decoder
    options = LexiconDecoderOptions(
        beam_size, # number of top hypothesis to preserve at each decoding step
        token_beam_size, # restrict number of tokens by top am scores (if you have a huge token set)
        beam_threshold, # preserve a hypothesis only if its score is not far away from the current best hypothesis score
        lm_weight, # language model weight for LM score
        word_score, # score for words appearance in the transcription
        unk_score, # score for unknown word appearance in the transcription
        sil_score, # score for silence appearance in the transcription
        log_add, # the way how to combine scores during hypotheses merging (log add operation, max)
        criterion_type # supports only CriterionType.ASG or CriterionType.CTC
    )
    # for lexicon free-based decoder
    options = LexiconFreeDecoderOptions(
        beam_size, # number of top hypothesis to preserve at each decoding step
        token_beam_size, # restrict number of tokens by top am scores (if you have a huge token set)
        beam_threshold, # preserve a hypothesis only if its score is not far away from the current best hypothesis score
        lm_weight, # language model weight for LM score
        sil_score, # score for silence appearance in the transcription
        log_add, # the way how to combine scores during hypotheses merging (log add operation, max)
        criterion_type # supports only CriterionType.ASG or CriterionType.CTC
    )

Now, prepare a tokens dictionary (tokens for which a model returns probability for each frame) and a lexicon (mapping between words and their spellings within a tokens set).

For further details on tokens and lexicon file formats, see the Data Preparation documentation in Flashlight.

from flashlight.lib.text.dictionary import Dictionary, load_words, create_word_dict

tokens_dict = Dictionary("path/tokens.txt")
# for ASG add used repetition symbols, for example
# token_dict.add_entry("1")
# token_dict.add_entry("2")

lexicon = load_words("path/lexicon.txt") # returns LexiconMap
word_dict = create_word_dict(lexicon) # returns Dictionary

To create a KenLM language model, use:

from flashlight.lib.text.decoder import KenLM
lm = KenLM("path/lm.arpa", word_dict) # or "path/lm.bin"

Get the unknown and silence token indices from the token and word dictionaries to pass to the decoder:

sil_idx = token_dict.get_index("|")
unk_idx = word_dict.get_index("<unk>")

Now, define the lexicon Trie to restrict the beam search decoder search:

from flashlight.lib.text.decoder import Trie, SmearingMode
from flashlight.lib.text.dictionary import pack_replabels

trie = Trie(token_dict.index_size(), sil_idx)
start_state = lm.start(False)

def tkn_to_idx(spelling: list, token_dict : Dictionary, maxReps : int = 0):
    result = []
    for token in spelling:
        result.append(token_dict.get_index(token))
    return pack_replabels(result, token_dict, maxReps)


for word, spellings in lexicon.items():
    usr_idx = word_dict.get_index(word)
    _, score = lm.score(start_state, usr_idx)
    for spelling in spellings:
        # convert spelling string into vector of indices
        spelling_idxs = tkn_to_idx(spelling, token_dict, 1)
        trie.insert(spelling_idxs, usr_idx, score)

    trie.smear(SmearingMode.MAX) # propagate word score to each spelling node to have some lm proxy score in each node.

Finally, we can run lexicon-based decoder:

import numpy
from flashlight.lib.text.decoder import LexiconDecoder


blank_idx = token_dict.get_index("#") # for CTC
transitions = numpy.zeros((token_dict.index_size(), token_dict.index_size()) # for ASG fill up with correct values
is_token_lm = False # we use word-level LM
decoder = LexiconDecoder(options, trie, lm, sil_idx, blank_idx, unk_idx, transitions, is_token_lm)
# emissions is numpy.array of emitting model predictions with shape [T, N], where T is time, N is number of tokens
results = decoder.decode(emissions.ctypes.data, T, N)
# results[i].tokens contains tokens sequence (with length T)
# results[i].score contains score of the hypothesis
# results is sorted array with the best hypothesis stored with index=0.

Decoding with your own language model

One can define custom language model in python and use it for beam search decoding.

To store language model state, derive from the LMState base class and define additional data corresponding to each state by creating dict(LMState, info) inside the language model class:

import numpy
from flashlight.lib.text.decoder import LM


class MyPyLM(LM):
    mapping_states = dict() # store simple additional int for each state

    def __init__(self):
        LM.__init__(self)

    def start(self, start_with_nothing):
        state = LMState()
        self.mapping_states[state] = 0
        return state

    def score(self, state : LMState, token_index : int):
        """
        Evaluate language model based on the current lm state and new word
        Parameters:
        -----------
        state: current lm state
        token_index: index of the word
                    (can be lexicon index then you should store inside LM the
                    mapping between indices of lexicon and lm, or lm index of a word)

        Returns:
        --------
        (LMState, float): pair of (new state, score for the current word)
        """
        outstate = state.child(token_index)
        if outstate not in self.mapping_states:
            self.mapping_states[outstate] = self.mapping_states[state] + 1
        return (outstate, -numpy.random.random())

    def finish(self, state: LMState):
        """
        Evaluate eos for language model based on the current lm state

        Returns:
        --------
        (LMState, float): pair of (new state, score for the current word)
        """
        outstate = state.child(-1)
        if outstate not in self.mapping_states:
            self.mapping_states[outstate] = self.mapping_states[state] + 1
        return (outstate, -1)

LMState is a C++ base class for language model state. Its compare method (for comparing one state with another) is used inside the beam search decoder. It also has a LMState child(int index) method which returns a state obtained by following the token with this index from current state.

All LM states are organized as a trie. We use the child method in python to properly create this trie (which will be used inside the decoder to compare states) and can store additional state data in mapping_states.

This language model can be used as follows. Here, we print the state and its additional stored info inside lm.mapping_states:

custom_lm = MyLM()

state = custom_lm.start(True)
print(state, custom_lm.mapping_states[state])

for i in range(5):
    state, score = custom_lm.score(state, i)
    print(state, custom_lm.mapping_states[state], score)

state, score = custom_lm.finish(state)
print(state, custom_lm.mapping_states[state], score)

and for the decoder:

decoder = LexiconDecoder(options, trie, custom_lm, sil_idx, blank_inx, unk_idx, transitions, False)

Tests and Examples

An integration test for Python decoder bindings can be found in bindings/python/test/test_decoder.py. To run, use:

cd bindings/python/test
python3 -m unittest discover -v .

Project details


Release history Release notifications | RSS feed

Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

flashlight_text-0.0.4.dev298-pp39-pypy39_pp73-macosx_11_0_arm64.whl (909.9 kB view details)

Uploaded PyPymacOS 11.0+ ARM64

flashlight_text-0.0.4.dev298-pp38-pypy38_pp73-macosx_11_0_arm64.whl (909.9 kB view details)

Uploaded PyPymacOS 11.0+ ARM64

flashlight_text-0.0.4.dev298-cp311-cp311-musllinux_1_1_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.11musllinux: musl 1.1+ ARM64

flashlight_text-0.0.4.dev298-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

flashlight_text-0.0.4.dev298-cp311-cp311-macosx_11_0_arm64.whl (910.0 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

flashlight_text-0.0.4.dev298-cp310-cp310-musllinux_1_1_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.10musllinux: musl 1.1+ ARM64

flashlight_text-0.0.4.dev298-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

flashlight_text-0.0.4.dev298-cp310-cp310-macosx_11_0_arm64.whl (910.1 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

flashlight_text-0.0.4.dev298-cp39-cp39-musllinux_1_1_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.9musllinux: musl 1.1+ ARM64

flashlight_text-0.0.4.dev298-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARM64

flashlight_text-0.0.4.dev298-cp39-cp39-macosx_11_0_arm64.whl (910.4 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

flashlight_text-0.0.4.dev298-cp38-cp38-musllinux_1_1_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.8musllinux: musl 1.1+ ARM64

flashlight_text-0.0.4.dev298-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ ARM64

flashlight_text-0.0.4.dev298-cp38-cp38-macosx_11_0_arm64.whl (909.6 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

flashlight_text-0.0.4.dev298-cp37-cp37m-musllinux_1_1_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.7mmusllinux: musl 1.1+ ARM64

flashlight_text-0.0.4.dev298-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.3 MB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ ARM64

flashlight_text-0.0.4.dev298-cp36-cp36m-musllinux_1_1_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.6mmusllinux: musl 1.1+ ARM64

flashlight_text-0.0.4.dev298-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.3 MB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.17+ ARM64

File details

Details for the file flashlight_text-0.0.4.dev298-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev298-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 5b5aa77631162e03f1f8d2b90292b6ded4cc405b06ab9eaf8653321a606da288
MD5 e0c145a5473962a2b3c25ca6a138865f
BLAKE2b-256 c9182ff15dbab7a6136d08159ffcd71b03feb1eea257fe7d04b175deefdfac6a

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev298-pp39-pypy39_pp73-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev298-pp39-pypy39_pp73-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5a21dc272310c5ced96e51795e8d13ae996c02510e238fc912d8388ebde69712
MD5 5889c3e7879589bf0452585fcd26dcc9
BLAKE2b-256 b8fe0e71a6b104b0719fd20a99989d39292db13a85e4d1390db9e796dcdb8fc0

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev298-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev298-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 9af1df24dc345afb4f4468381bb48f74c0c94c87ba3ead2c03527c642a1fc1cd
MD5 3390adfd7cdc56b11513c695ea2903f8
BLAKE2b-256 cd85eb17e0255679939f83145bd37f2d75d04be4c8b6bd39a022e44911421513

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev298-pp38-pypy38_pp73-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev298-pp38-pypy38_pp73-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bb40abb3d1ae04d2aec65bd907db4146d5ee648d71912331115cf477ad64fbfd
MD5 7e2376c64edf9906ee2ccab275d72c1e
BLAKE2b-256 ddafdd84113a34a0bff88ec994c210103976d77e60ad1b729a5cbab810426283

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev298-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev298-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 64df6225e893509c258a10a7e6381089257578bf4c4bd100fb150593090d0b0f
MD5 6156fc9198cfb122e53e4dae9d3c6482
BLAKE2b-256 e1e083ca65bb719360b52968f1e712e33fa1f0e8fe92b9dde4392f87b443939b

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev298-cp311-cp311-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev298-cp311-cp311-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 9555096b5c4a4492307e9b6e9090428a3c24af6fde26eddfc6dc0b7a7abe94f9
MD5 afd932e3fddd6017b2fd5f5fc1ef6eda
BLAKE2b-256 c3f168f39d10a64eec7cdb588a922553a3ed23dc7b788d159caf0709b80447a1

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev298-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev298-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 64d229bb243ed07516ea1c1cd79a471a282a141755b85af7f2abf21033651203
MD5 539a669cddc21f11f7390df29ca20b44
BLAKE2b-256 f138504ca76fed1c7ff82de3e2a20c2052d4494599ea399d7edae14514cc2064

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev298-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev298-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c4f9940c058549a5a0ad07714f0413e102a59d14f5368c6d77eeb138ae5008eb
MD5 3d14f831d62ef9b47485cdbd1a50d2dd
BLAKE2b-256 57181010243091a9143c26839a9d440c116a992eee25d698e7a6c1ddd259ffe9

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev298-cp310-cp310-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev298-cp310-cp310-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 b85125edd055e93953e699014e9079973c66a3fc2dda81ffbf4fde623bfad366
MD5 2f9738d1c5aa858d0f870af986850c0a
BLAKE2b-256 84536993da56013075b58d7690eaf2fb3179c072711fe86054ed9258ea08b455

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev298-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev298-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0081048f13335f28d388037b00084d4afbef6e401570fff496c0450885afa2f7
MD5 d9a47670884399be09475d343a6af68b
BLAKE2b-256 b66c56cd5c1b0a2138635c24eb3afe3a6968248de156d18b1f7f0ae553faa2ab

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev298-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev298-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 425feb2d6c8263d8fd30dad867524519bad24d197ac4b1bd688ed2e37a5cca7d
MD5 41f1639d9911db8cecdc6c3111616323
BLAKE2b-256 760f641d1f1951d91ab8941b1185c08123d44a684942c3dfd33c08b0f0e51829

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev298-cp39-cp39-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev298-cp39-cp39-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 5aae0f9e3d04079a7c2fa367221b8b9181e7852362aa5ea1ae8ea603c1203b84
MD5 181c9a8699275a9cf7c9498e04212120
BLAKE2b-256 ca3bd01bc7d85c5cb07534871dd26e052d91f1db513c88003593c834ddee3a9b

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev298-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev298-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c9e8425a728aa92a18ec941acfa6e8731f14ce5cbe390782aed699c361037bcc
MD5 542adbb3d0a9ef77db6bcebadc1b7611
BLAKE2b-256 c04d435bce6f0739f736fa37ddd6dccea940897ba82767f6b4f7ec083f4862c4

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev298-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev298-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 53fa06275097066d78dd44c3267040b1679566c91f9d12e2f841fa138a89e3e8
MD5 aca7a53a0fa882fd693162b49ed59fd2
BLAKE2b-256 467d4da8748391873b08e8054d72db9f193519f521a90b96aa4aff6ecc062ee8

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev298-cp38-cp38-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev298-cp38-cp38-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 806fbd5b3e61ae972ce8877c6a443d0b29f681617c80136a323e508a2be9ee5d
MD5 182c3afa461acb13276e730950b8a418
BLAKE2b-256 5085b3c45f85c21b3367a01fa90f637f80dd0f7615b81c5db8e8ed1b1350dc1f

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev298-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev298-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ef0ddc49fc0034b22943b3497173609bba4e8d896f31a2b00190d08103fa301a
MD5 880cc4449638264e93e5af0f55e939df
BLAKE2b-256 e11e5b5822803e7664f3a783e4bc3bb0fe975ffa477be04603bb21af2e718728

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev298-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev298-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f8b4dd634b1c59c9aece3a0e124aed355e620ceaf1b8a5e2f79f86cdc5f48c8e
MD5 a8c65985526c1da611984bd2f7d19197
BLAKE2b-256 a97e47a7010c267bc8e7d6a0557801f4df53a6fe4035ca7659dc3564131e5e69

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev298-cp37-cp37m-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev298-cp37-cp37m-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 aa0bd6bb0b7ff26d7e1b335dfbeb6e379626da058754df9f72054fece0d29d03
MD5 4cc3f4180b38800c641f4e51a773547f
BLAKE2b-256 73afae84e66b87831bf3e768fc5197ebf471cb7ae1b442c4f5eead2d180e6c5b

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev298-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev298-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 56bd508428af7f0d2dd61d6cad4c5d43f9ded9515bd53d1cb331b23f3477265e
MD5 e5e65f4815c372f48fde506be38f8d06
BLAKE2b-256 e6e24039ebe0768fe3429b70f34102ba3128e187cdca90ede7115d5c4e3619aa

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev298-cp36-cp36m-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev298-cp36-cp36m-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 7ca90dfbc1781d4299468217cb9005d5cb301d6177913bdfed294c48bc06470e
MD5 e2c50dad82712afb3e317ed267026e72
BLAKE2b-256 92d8725d9069e9a3d8fd5eb270b18c3846d84a7bddbc29c4a9c307fc4d002991

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev298-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev298-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 386113a3e9cf4d0dad7906c1b84242dbdab0540a40f237be55fa9efda3167eea
MD5 a5fba79f28a09266910c658d24ffc8d0
BLAKE2b-256 78833d0bc8b36c7f1db8fa9e163541b59c7a6f9794c77a993eb04326aba7bdf5

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