Skip to main content

A robust Python wrapper for high-performance PDF rendering and text extraction using C++ core.

Project description

WinnerZ Python Library Documentation

Overview

The winnerz library is a robust Python wrapper designed for processing, rendering, and manipulating PDF documents. It relies on a high-performance, multi-threaded C++ core extension (winnerz_core) for intensive operations while providing seamless fallback mechanisms and caching strategies in Python.

The architecture emphasizes blistering-fast text extraction, reliability, and fault-tolerance, specifically in handling binary dependencies, dynamic core library loading, and flexible preview rendering via PDFium.

Architecture

The system is divided into several conceptual layers:

  1. Core Loader & Diagnostics: Handles the dynamic importing of the C++ binary (winnerz_core), including binary size verification, truncation repair, and Windows DLL directory management.
  2. Document Object Model: Provides Pythonic abstractions (Document, Page) to interact with PDF files, managing resources and state safely.
  3. Thread-Safe Interpreter Pipeline: A C++ native, thread-safe PDF token interpreter that leverages std::async for parallel multi-page text extraction, eliminating GIL bottlenecks.
  4. Micro-OCR Fallback Engine: A pure C++ built-in OCR engine that activates automatically when encountering corrupted or missing ToUnicode tables. It uses 64-bit bitwise packing and hardware POPCOUNT for blazing fast template matching without external dependencies like Tesseract.
  5. Rendering & Editing Pipeline: A native C++ rendering and editing engine utilizing integrated PDFium capabilities, completely independent of external Python pip packages.
  6. Geometry & Data Structures: Implements domain-specific types (Rect, Matrix, Pixmap) to standardize data flow between the C++ layer and Python runtime.

Core Loading Mechanism

The library initializes the C++ binary through _load_core(). This system provides the following safety guarantees:

  • Thread Safety: Uses threading.Lock() to ensure the core is initialized exactly once.
  • Retry Logic: Implements a retry loop (_CORE_IMPORT_RETRIES = 3) to mitigate transient filesystem or OS-level loading issues.
  • Self-Healing: If a truncated binary is detected (e.g., due to an interrupted build or copy), _try_repair_truncated_core_binary() attempts to restore it from other valid candidate binaries in the directory.
  • Diagnostic Reporting: Generates detailed error messages specifying binary ABI mismatches (e.g., GLIBC mismatches) or binary sizes to accelerate debugging.

Environment Variables

  • WINNERZ_PREVIEW_BACKEND: Controls the backend used for rendering preview data when the C++ core returns placeholder data.
    • Valid values: auto (default), pdfium.
    • Resolution order for auto: Uses PDFium when available.

Advanced Features

Micro-OCR Anti-Obfuscation

WinnerZ includes a built-in, lightweight Micro-OCR engine written entirely in C++. When a PDF intentionally hides its text by removing the ToUnicode table or scrambling encodings, the engine automatically falls back to rendering the vector glyphs and performing Image-over-Union (IoU) template matching.

  • Broad Language Support: Contains 2170+ built-in templates covering English, Vietnamese, Latin Extended, Cyrillic, Greek, and Thai.
  • Hardware Accelerated: Uses 64-bit Bitwise Packing and CPU __popcnt64 instructions to evaluate millions of pixel comparisons in milliseconds.
  • Zero Dependencies: Does not require Tesseract, ONNX, or any heavy AI models.

Concurrency & Multi-threading Architecture

WinnerZ features a sophisticated threading model designed to maximize hardware utilization while complying with Python's Global Interpreter Lock (GIL). Functions are grouped into three categories:

Group 1: Native C++ Multi-threading (Fully Automatic)

These functions automatically spawn C++ threads to utilize all CPU cores. They bypass the Python GIL and run at maximum hardware speeds.

  • doc.get_all_text(): Extracts plain text only from all pages simultaneously. Extremely fast, but strips out all spatial coordinates and font data.
  • doc.get_all_dicts_json(include_chars=False, sort=False): High-performance multi-threaded extraction of rich text structures (bbox, fonts, colors, ascender, descender). Returns a JSON string of the entire document's data in seconds. Parse with json.loads() to bypass GIL object-creation overhead.
  • doc.insert_text_json(): Batch inserts text tasks across hundreds of pages in parallel.
  • doc.redact_pages_bytes(): Performs batch redaction across multiple pages simultaneously.

Group 2: GIL-Released Methods (Python ThreadPool Ready)

These functions process a single page at a time but explicitly release the Python GIL (py::gil_scoped_release) during computation. To achieve multi-threading, you must wrap them in Python's concurrent.futures.ThreadPoolExecutor. This is the optimal architecture for extracting complex Python objects (like dicts) concurrently without lock contention.

  • page.get_text("dict"): Extracts text along with precise spatial coordinates (bbox), fonts, and colors.
  • page.get_text("blocks"), page.get_text("rawdict")
  • page.get_text_plain()

Group 3: Single-threaded (GIL Locked)

These functions execute sequentially.

  • page.get_drawings()
  • page.get_pixmap()

Class Reference

Document

Represents a PDF document instance. It manages the lifecycle of the underlying file, featuring a lazy-loading fallback architecture: it natively opens the PDF via C++ by default and only invokes the native C++ PDFium backend for decryption or file repair if the document is encrypted or structurally corrupted.

Constructor:

  • Document(path_or_bytes): Resolves the file path or raw memory bytes (Zero-Disk mode) and instantly initializes the C++ core. If encryption is detected (e.g. RC4/AES), it falls back to an automatic decryption routine seamlessly in RAM or via a temporary file.

Methods:

  • __getitem__(index): Retrieves a Page object at the specified 0-based index. Supports negative indexing.
  • __len__(): Returns the total number of pages in the document.
  • get_all_text(): A highly optimized utility that utilizes C++ multi-threading to extract plain text only from all pages. It scales automatically with CPU cores and bypasses the Python GIL. Note: This function discards all spatial coordinates (bboxes) and font data.
  • get_all_dicts_json(include_chars=False, sort=False): Extracts rich structural data (similar to get_text("dict")) for all pages simultaneously using native C++ threads. Returns a massive JSON string. Use json.loads() to parse it instantly into a list of Python dictionaries, completely bypassing the single-threaded PyBind11 object creation overhead.
  • tobytes(): (Zero-Disk) Returns the finalized PDF as a raw byte array directly from RAM, avoiding any disk I/O.
  • insert_text_json(json_str, fonts_dir="", progress_cb=None): High-speed native multi-threaded C++ text insertion. Renders a JSON string of tasks directly into the PDF document in RAM in parallel. Bypasses intermediate rendering pipelines and significantly boosts performance. Evaluates fallback fonts in fonts_dir on a per-character basis. Supports "multiline": true in JSON to enable Word-wrap mode within the bounding box.
  • redact_pages_bytes(page_rects_map): (Native C++) Performs parallel Block Redaction across multiple pages and returns the cleaned PDF as bytes directly in RAM. Use with caution on very large files to avoid memory pressure.
  • get_page_font_basenames(page_index=0): Extracts the true BaseFont name (e.g., 'TimesNewRomanPS-BoldMT') from internal PDF resource identifiers (e.g., 'R14') by automatically stripping subset prefixes ('ABCDEF+'). Crucial for accurate font mapping and reconstruction.
  • close(): Cleans up temporary resources, such as decrypted temporary files and in-memory editing buffers.

Page

Represents a single page within a Document.

Methods:

  • get_text(mode="dict", sort=False): Extracts text content.
    • mode: Can be dict, rawdict, blocks, text, json, or rawjson.
  • get_drawings(): Extracts vector drawings and graphics, mapping them to structured dictionaries containing rect, fill, and stroke properties.
  • get_pixmap(matrix=None, clip=None): Renders the page to a bitmap image (Pixmap) using the C++ core engine.
  • redact_text(rects, output_path, min_overlap_ratio=0.0): (Legacy C++ Core) Applies text-only redaction to the specified rectangles and saves the output to a new PDF file.
  • clean_contents(): Completely wipes out the vector graphics and text layer of the current page.
  • insert_image(rect, stream=None): Inserts an image (from bytes) into the specified rectangle. It handles internal PDF matrix transformations automatically.
  • show_pdf_page(rect, doc_src, page_idx, overlay=True, keep_proportion=True): Queues a complex overlay operation. It places a page from another document (doc_src) onto the current page, scaling it to fit rect while optionally keeping aspect ratio via keep_proportion. The actual merge is executed efficiently during doc.save().
  • rect (Property): Retrieves the bounding box of the page as a Rect.

Pixmap

Represents an uncompressed image buffer containing pixel data.

Properties:

  • width, height: Dimensions in pixels.
  • n: Number of channels (e.g., 4 for RGBA).
  • stride: Number of bytes per row.
  • samples: Raw byte array of pixel data.

Methods:

  • pixel(x, y): Returns a tuple representing the pixel color at the specified coordinates.
  • tobytes(fmt="raw"): Encodes the pixmap to the requested format. Supported formats include raw, rgba, png, jpg, and jpeg. Output formats other than raw require the Pillow library.

Geometry Classes

  • Rect(x0, y0, x1, y1): Represents a rectangle. Provides properties for width, height, and is_empty. Overloads the & operator to compute the intersection of two rectangles.
  • Matrix(sx=1.0, sy=1.0): Represents a 2D scaling matrix.

Caching Strategy

The module implements file-based caching for document instances to minimize redundant initialization and file I/O operations.

  • Global Document Cache: Managed via winnerz.open(path). Validates cache hits using file signature metrics (file size and modification time in nanoseconds).

    [!TIP] If you need to open multiple copies of the same file concurrently or bypass this cache (e.g., in background workers), initialize the document directly using winnerz.Document(path) instead of winnerz.open().

  • Preview Document Cache: A separate caching layer for rendering backends to keep the preview document context alive across multiple page renders.
  • C++ Thread-Safe Font Cache: The C++ core utilizes a lock-guarded (std::recursive_mutex) internal cache for Unicode, Width, and CodeSpace maps to prevent data races during parallel text extraction.

Logging

WinnerZ uses standard Python logging under the winnerz logger namespace. Error and debug messages are routed seamlessly to this logger, allowing you to configure professional logging streams similar to pymupdf.

import logging
logging.getLogger("winnerz").setLevel(logging.DEBUG)

Performance Benchmark

Thanks to the native C++ multi-threading pipeline and persistent object caching, WinnerZ outperforms established industry standards like PyMuPDF (fitz) significantly in bulk text extraction tasks.

Tested on a standard 185-page PDF file (Plain Text Extraction):

  • ⏱️ PyMuPDF (fitz): ~0.44s
  • 🚀 WinnerZ (get_all_text()): ~0.18s (2.5x Faster)

Tested on a 22MB Russian Chemistry Book (Structured Dictionary/JSON Extraction):

  • ⏱️ PyMuPDF Single-Thread (get_text("json")): ~24.2s
  • 🚀 WinnerZ Native Multi-Thread (get_all_dicts_json()): ~11.4s (> 2x Faster)

C++ Micro-OCR Benchmark

Tested on a 100% text-obfuscated PDF file (Forcing the system to Micro-OCR all characters):

  • 🐢 Traditional OCR (Tesseract): ~3 - 5 seconds / page
  • ⚡ WinnerZ Micro-OCR (Bitwise Optimized): ~0.33 seconds / page (~15x Faster)

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

winnerz-1.2.16.tar.gz (22.5 MB view details)

Uploaded Source

Built Distributions

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

winnerz-1.2.16-cp312-cp312-win_amd64.whl (7.2 MB view details)

Uploaded CPython 3.12Windows x86-64

winnerz-1.2.16-cp312-cp312-manylinux_2_28_x86_64.whl (12.0 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

winnerz-1.2.16-cp312-cp312-macosx_11_0_arm64.whl (2.8 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

winnerz-1.2.16-cp312-cp312-macosx_10_9_x86_64.whl (2.8 MB view details)

Uploaded CPython 3.12macOS 10.9+ x86-64

winnerz-1.2.16-cp311-cp311-win_amd64.whl (7.2 MB view details)

Uploaded CPython 3.11Windows x86-64

winnerz-1.2.16-cp311-cp311-manylinux_2_28_x86_64.whl (10.3 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

winnerz-1.2.16-cp311-cp311-macosx_11_0_arm64.whl (2.8 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

winnerz-1.2.16-cp311-cp311-macosx_10_9_x86_64.whl (2.8 MB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

winnerz-1.2.16-cp310-cp310-win_amd64.whl (7.2 MB view details)

Uploaded CPython 3.10Windows x86-64

winnerz-1.2.16-cp310-cp310-manylinux_2_28_x86_64.whl (8.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

winnerz-1.2.16-cp310-cp310-macosx_11_0_arm64.whl (2.8 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

winnerz-1.2.16-cp310-cp310-macosx_10_9_x86_64.whl (2.8 MB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

winnerz-1.2.16-cp39-cp39-win_amd64.whl (7.2 MB view details)

Uploaded CPython 3.9Windows x86-64

winnerz-1.2.16-cp39-cp39-manylinux_2_28_x86_64.whl (6.8 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.28+ x86-64

winnerz-1.2.16-cp39-cp39-macosx_11_0_arm64.whl (2.8 MB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

winnerz-1.2.16-cp39-cp39-macosx_10_9_x86_64.whl (2.8 MB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

File details

Details for the file winnerz-1.2.16.tar.gz.

File metadata

  • Download URL: winnerz-1.2.16.tar.gz
  • Upload date:
  • Size: 22.5 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for winnerz-1.2.16.tar.gz
Algorithm Hash digest
SHA256 8b1e8e6f2451161f6202bca892bb78b63197d35ee5040bca3de9735942ba5ee5
MD5 37633e27cab4239b2e8da87f2bb54a43
BLAKE2b-256 1d81d19252bbc7df81e92fd7eb21cbca0daf7968c404c9dd6c9bb07bc82f42e9

See more details on using hashes here.

File details

Details for the file winnerz-1.2.16-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: winnerz-1.2.16-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 7.2 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for winnerz-1.2.16-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 f8f84268382d85a1a8f12b675c0e33b2893befb60b7769f2d2609d90832fc1ca
MD5 85a1b31234f54595fb0a7cd82d8d3157
BLAKE2b-256 4f4572e80f4119d3a807af79ade28adc8841f3da04f677d2c1b0015c02fb9e67

See more details on using hashes here.

File details

Details for the file winnerz-1.2.16-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for winnerz-1.2.16-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1350065e5ae043563d3e2ba985855eec84b7568b75dda376c5401ecfeb9bed05
MD5 3fd75af2942affd000385b88862b3d78
BLAKE2b-256 634c6671174d73ed6bb72a890a2921c506c42a03c28ed4eec16ba21d52333c9f

See more details on using hashes here.

File details

Details for the file winnerz-1.2.16-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for winnerz-1.2.16-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 82af84bb1d9a1233edcf9a056688b322ceaff38d80573fcf08d1c9366abf86e7
MD5 e418202fa81f74c0ea659f8e76518409
BLAKE2b-256 e5b8e95224ec25b17fc9a045d168b55cd8bbc6550b4c856a10a0cdc94120308d

See more details on using hashes here.

File details

Details for the file winnerz-1.2.16-cp312-cp312-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for winnerz-1.2.16-cp312-cp312-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 37c3016f126cbc4abda8f697b13d4aa690a7b582f37492028acd03ea46d403a0
MD5 c3e824a44727d7523101c4e6841fc379
BLAKE2b-256 bf8d34da7108ec1a06dc0e854c9dac214954ad110d097c9154ecc9cb9e54dfc7

See more details on using hashes here.

File details

Details for the file winnerz-1.2.16-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: winnerz-1.2.16-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 7.2 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for winnerz-1.2.16-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 882754668066855e1aa28c656b8bf7b3c927ce762cdabe2029f626a58eb0689d
MD5 5b0e3275330ece06f07290d441a91100
BLAKE2b-256 b7c72ef270a408ca9089f2ba932666e8dedcd770ac1b0da655b346a863abe23d

See more details on using hashes here.

File details

Details for the file winnerz-1.2.16-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for winnerz-1.2.16-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 756a9e9d19ab180a4a4c21c3ca4ee00d62bad2bf29bc23ef1ae49ee78cfad97b
MD5 c12fd3f34cc0f2e53f04c3d3f6e20633
BLAKE2b-256 466a755c7b50fea8255f4f968361ca4886b4026b5ee66da52006d453ec7dd5d2

See more details on using hashes here.

File details

Details for the file winnerz-1.2.16-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for winnerz-1.2.16-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8f16a4e2c13606ed5c3a11841ed01bd401b828d57b9cf31eb8ce540f965a8d0f
MD5 b17d18695f6c9fc545945977b05d0955
BLAKE2b-256 f2a2a6e2d1b3b15e4401d45626476ffd5d642855effb2265b2b1e147e1bd5920

See more details on using hashes here.

File details

Details for the file winnerz-1.2.16-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for winnerz-1.2.16-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 a432bb8e93e4271d59c607457dc200adb0d55e63878f122b387c3daaa3408e4f
MD5 e822634b682f71ff60b6f87c3d943a35
BLAKE2b-256 e9b62a308ac5e89abf247a2a9f9803b246e70781f6cc389f5d9c47d881f1ee8a

See more details on using hashes here.

File details

Details for the file winnerz-1.2.16-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: winnerz-1.2.16-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 7.2 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for winnerz-1.2.16-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 d3336cf42e4b889896bb4ca430853cf5db96ef15b72fc4cb20e016677680b9c9
MD5 6e4d793bf4e085982bb748e53910584a
BLAKE2b-256 979af2db7b2aa80d30c48854b873e7a74a38fc33dedb762a464ec6b9c4fdea6a

See more details on using hashes here.

File details

Details for the file winnerz-1.2.16-cp310-cp310-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for winnerz-1.2.16-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 33fd219494ce324bdc8b16123b70df733006f66a61bda5b8926b6133ff27df48
MD5 748e86c6a29900370039d9348c3b8ea9
BLAKE2b-256 d4081a39e76b3e00745e2ef87f878adc4e7be2f6debc193219f61abe342e8cc0

See more details on using hashes here.

File details

Details for the file winnerz-1.2.16-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for winnerz-1.2.16-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1e94357cf6a0b2a905e1fbd90d13dc63bfd7f3598f4954152664847ba7515159
MD5 f8e2c1b87fd167aeb274480788ceafb9
BLAKE2b-256 f5908a8a7107edf06ed6ed63285964bd89c574932496e17e02f7064af2714295

See more details on using hashes here.

File details

Details for the file winnerz-1.2.16-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for winnerz-1.2.16-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 3db4ad2399205a4c934ab379cfddb0b73fb465edc6797c496f67842c602a3f11
MD5 c53c1acd3b5607352b5bb86f13cec39e
BLAKE2b-256 7b1e83e9b5c0401a62130adc63a9819e90ccba3a30743888dbb9d17647e10727

See more details on using hashes here.

File details

Details for the file winnerz-1.2.16-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: winnerz-1.2.16-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 7.2 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for winnerz-1.2.16-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 0fe3b14b9e1672575fe04526bfff9852823d23fa6a0f2606a5a54d648d8e0d42
MD5 768aadb5c80facf39b612d07d8472813
BLAKE2b-256 32104186b9750c30767e61434dac63e6db7af3a270d8cf884d8d7b09b1b65473

See more details on using hashes here.

File details

Details for the file winnerz-1.2.16-cp39-cp39-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for winnerz-1.2.16-cp39-cp39-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 362e341b77bdb060df1a7af30d404ee19132dd5abbef3a83d5eb61e3e6f470b9
MD5 2d01bd46240da4897a242dd1a18fd9a4
BLAKE2b-256 1c03a31919a4cd7d632453a5e7ac9acce2ebc35e16ebe500afbbc3498800cdd3

See more details on using hashes here.

File details

Details for the file winnerz-1.2.16-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for winnerz-1.2.16-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ae63af8b4c1430e6d7d98992d56efe206d8b8c77b6d24cb49ed4440b9f7d628b
MD5 e6380fe88749205c9503fb7a75d7a45a
BLAKE2b-256 ba125d2dd4b083496d48d954ade0f6330d779e8b57765a65d5fa5d69ea7393d2

See more details on using hashes here.

File details

Details for the file winnerz-1.2.16-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for winnerz-1.2.16-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 9d3b6a6812b5ab5fd9fca0d437a59dc0539b2f358cd9f4f2eb4fdd2514be87a6
MD5 ad0638f9fc51351bf17fb90d26f989f0
BLAKE2b-256 63ec7679d7b8c917d3ca222cc349ae4a580eb3be81ce3fb02283f79fb83b4fb1

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