Skip to main content

Copy-Patch Compiler

Project description

Copapy

Copapy is a Python framework for deterministic, low-latency realtime computation with automatic differentiation support, targeting hardware applications - for example in the fields of robotics, aerospace, SDR, embedded systems and control systems in general.

GPU frameworks like PyTorch, JAX and TensorFlow jump-started the development in the field of AI. With the right balance of flexibility and performance, they allow for fast iteration of new ideas while still being performant enough to test or even use them in production.

This is exactly what Copapy aims for - but in the field of embedded realtime computation. While making use of the ergonomics of Python, the tooling, and the general Python ecosystem, Copapy runs seamlessly optimized machine code. Despite being highly portable, the copy-and-patch compiler allows for effortless and fast deployment without any dependencies beyond Python. It's designed to feel like writing Python scripts with a shallow learning curve, but under the hood it produces high-performance, statically typed and memory-safe code with a minimized set of possible runtime errors[^1]. To maximize productivity, the framework provides detailed type hints to catch most errors even before compilation.

Embedded systems come with a variety of CPU architectures. The copy-and-patch compiler already supports the most common ones[^3], and porting it to new architectures is straightforward if a C compiler for the target architecture is available[^2]. The generated code depends only on the CPU architecture. The generated binaries neither perform system calls nor rely on external libraries like libc. This makes Copapy both highly deterministic and easy to deploy on different realtime operating systems (RTOS) or bare metal.

The main features can be summarized as:

  • Fast to write & easy to read
  • Memory and type safety with a minimal set of runtime errors
  • Deterministic execution
  • Automatic differentiation for efficient realtime optimization (reverse-mode)
  • Optimized machine code for x86_64, 32 Bit ARM (Cortex-A and Cortex-M) and AArch64
  • Highly portable to new architectures
  • Small Python package with minimal dependencies and no cross-compile toolchain required

Execution of the compiled code is managed by a runner application. The runner is implemented in C and handles I/O and communication with the Copapy framework. The overall design emphasizes minimal complexity of the runner to simplify portability, since this part must be adapted for the individual hardware/application. Because patching of memory addresses is done by the runner, the different architecture-specific relocation types are unified to an architecture-independent format by Copapy before sending the patch instructions to the runner. This keeps the runner implementation as minimal as possible.

Copapy architecture

The design targets either an architecture with a realtime-patched Linux kernel - where the runner uses the same CPU and memory as Linux but executes in a realtime thread - or a setup where even higher determinism is required. In such cases, the runner can be executed on a separate crossover MCU running on bare metal or a RTOS.

The Copapy framework also includes a runner as Python module build from the same C code. This allows frictionless testing of code and might be valuable for using Copapy in conventional application development.

Current state

While hardware I/O is obviously a core aspect of the project it is not yet available. However the computation engine is already fully functional - for all above mentioned target architectures - and available for testing and experimentation simply by installing the package. The project focuses now on integration into the first demonstration hardware platform.

Furthermore in development are currently:

  • Array stencils for handling large arrays and generating SIMD-optimized code - e.g., for machine vision and neural network applications
  • Constant regrouping for further symbolic optimization of the computation graph

Despite missing SIMD-optimization, benchmark performance shows promising numbers. The following chart plots the results in comparison to NumPy 2.3.5:

Copapy architecture

For the benchmark (tests/benchmark.py) the timing of 30000 iterations for calculating the therm sum((v1 + i) @ v2 for i in range(10)) where measured on an Ryzen 5 3400G. Where the vectors v1 and v2 both have a lengths of v_size which was varied according to the chart from 10 to 500. For the NumPy case the "i in range(10)" loop was vectorized like this: np.sum((v1 + i) @ v2) with i being here a NDArray with a dimension of [10, 1]. The number of calculated scalar operations is the same for both contenders. Obviously Copapy profits from less overheat by calling a single function from python per iteration, where the NumPy variant requires 3. Interestingly there is no indication visible in the chart that for increasing v_size the calling overhead for NumPy will be compensated by using faster SIMD instructions. It is to note that in this benchmark the Copapy case does not move any data between python and the compiled code.

Furthermore for many applications copypy will benefit by reducing the actual number of operations significantly compared to a NumPy implementation, by precompute constant values know at compile time and benefiting from sparcity. Multiplying by zero (e.g. in a diagonal matrix) eliminate a hole branch in the computation graph. Operations without effect, like multiplications by 1 oder additions with zero gets eliminated at compile time.

For Testing and using Copapy to speed up computations in conventional Python programs there is also the @cp.jit decorator available, to compile functions on first use and cache the compiled version for later calls:

import copapy as cp

@cp.jit
def calculation(x: float, y: float) -> float:
    return sum(x ** 2 + y ** 2 + i for i in range(10))

# Compile and run:
result1 = calculation(2.5, 1.2)

# Run cached compiled version:
result2 = calculation(3.1, 4.7)

It is to note that cp.jit is not optimized very much at the moment concerning transfer data between Python and the compiled code back and forth.

Install

To install Copapy, you can use pip. Precompiled wheels are available for Linux (x86_64, AArch64, ARMv7), Windows (x86_64) and macOS (x86_64, AArch64):

pip install copapy

Examples

Basic example

A very simple example program using Copapy can look like this:

import copapy as cp

# Define variables
a = cp.value(0.25)
b = cp.value(0.87)

# Define computations
c = a + b * 2.0
d = c ** 2 + cp.sin(a)
e = cp.sqrt(b)

# Create a target (default is local), compile and run
tg = cp.Target()
tg.compile(c, d, e)
tg.run()

# Read the results
print("Result c:", tg.read_value(c))
print("Result d:", tg.read_value(d))
print("Result e:", tg.read_value(e))

Inverse kinematics

Another example using autograd in Copapy, here implementing gradient descent to solve an inverse kinematics problem for a two-joint 2D arm:

import copapy as cp

# Arm lengths
l1, l2 = 1.8, 2.0

# Target position
target = cp.vector([0.7, 0.7])

# Learning rate for iterative adjustment
alpha = 0.1

def forward_kinematics(theta1, theta2):
    """Return positions of joint and end-effector."""
    joint = cp.vector([l1 * cp.cos(theta1), l1 * cp.sin(theta1)])
    end_effector = joint + cp.vector([l2 * cp.cos(theta1 + theta2),
                                     l2 * cp.sin(theta1 + theta2)])
    return joint, end_effector

# Start values
theta = cp.vector([cp.value(0.0), cp.value(0.0)])

# Iterative inverse kinematics
for _ in range(48):
    joint, effector = forward_kinematics(theta[0], theta[1])
    error = ((target - effector) ** 2).sum()

    theta -= alpha * cp.grad(error, theta)

tg = cp.Target()
tg.compile(error, theta, joint)
tg.run()

print(f"Joint angles: {tg.read_value(theta)}")
print(f"Joint position: {tg.read_value(joint)}")
print(f"End-effector position: {tg.read_value(effector)}")
print(f"quadratic error = {tg.read_value(error)}")
Joint angles: [-0.7221821546554565, 2.6245293617248535]
Joint position: [1.3509329557418823, -1.189529299736023]
End-effector position: [0.6995794177055359, 0.7014330625534058]
quadratic error = 2.2305819129542215e-06

How it works

The compilation step starts with tracing the Python code to generate an acyclic directed graph (DAG) of variables and operations. The code can contain functions, closures, branching, and so on, but conditional branching is only allowed when the condition is known at tracing time (a cp.iif function exists to work around this). In the next step, this DAG is optimized and linearized into a sequence of operations. Each operation is mapped to a precompiled stencil or a combination of several stencils. A stencil is a piece of machine code with placeholders for memory addresses pointing to other code or data. The compiler generates patch instructions that fill these placeholders with the correct memory addresses.

After compilation, the binary code built from the stencils, the constant data, and the patch instructions is handed to the runner for execution. The runner allocates memory for code and data, copies both into place, applies the patch instructions, and finally executes the code.

The C code for a very simple stencil can look like this:

add_float_float(float arg1, float arg2) {
    result_float_float(arg1 + arg2, arg2);
}

The call to the dummy function result_float_float ensures that the compiler keeps the result and the second operand in registers for later use. The dummy function acts as a placeholder for the next stencil. Copapy uses two virtual registers, which map on most relevant architectures to actual hardware registers. Data that cannot be kept in a register is stored in statically allocated heap memory. Stack memory may be used inside some stencils, but its usage is essentially fixed and independent of the Copapy program, so total memory requirements are known at compile time.

The machine code for the function above, compiled for x86_64, looks like this:

0000000000000000 <add_float_float>:
   0:    f3 0f 58 c1              addss  %xmm1,%xmm0
   4:    e9 00 00 00 00           jmp    9 <.LC1+0x1>
            5: R_X86_64_PLT32    result_float_float-0x4

Based on the relocation entry for the jmp to the symbol result_float_float, the jmp instruction is stripped when it is the last instruction in a stencil. Thus, a Copapy addition operation results in a single instruction. For stencils containing multiple branch exits, only the final jmp is removed; the others are patched to jump to the next stencil.

For more complex operations - where inlining is less useful - stencils call a non-stencil function, such as in this example:

0000000000000000 <sin_float>:
   0:    48 83 ec 08              sub    $0x8,%rsp
   4:    e8 00 00 00 00           call   9 <sin_float+0x9>
            5: R_X86_64_PLT32    sinf-0x4
   9:    48 83 c4 08              add    $0x8,%rsp
   d:    e9 00 00 00 00           jmp    12 <.LC0+0x2>
            e: R_X86_64_PLT32    result_float-0x4

Unlike stencils, non-stencil functions like sinf are not stripped and do not need to be tail-call-optimizable. These functions can be provided as C code and compiled together with the stencils or can be object files like in the case of sinf compiled from C and assembly code and merged into the stencil object files. Math functions like sinf are currently provided by the MUSL C library, with architecture-specific optimizations.

Non-stencil functions and constants are stored together with the stencils in an ELF object file for each supported CPU architecture. The required non-stencil functions and constants are bundled during compilation. The compiler includes only the data and code required for a specific Copapy program.

The Copapy compilation process is independent of the actual instruction set. It relies purely on relocation entries and symbol metadata from the ELF file generated by the C compiler.

Developer Guide

Feedback and contributions are welcome - please open an issue or submit a pull request on GitHub.

To get started with development, first clone the repository:

git clone https://github.com/Nonannet/copapy.git
cd copapy

You may set up a virtual environment:

python -m venv .venv
source .venv/bin/activate  # On Windows: `.venv\Scripts\activate`

Build and install the package and dev dependencies:

pip install -e .[dev]

If the build fails because no suitable C compiler is installed, you can either install one or use the binary package from PyPI:

pip install copapy[dev]

When running pytest, it will use the binary components from PyPI, but all Python code is executed from the local repository.

To run all tests, you need the stencil object files and the compiled runner. You can download them from GitHub or build them yourself with gcc.

Download the latest binaries from GitHub:

python tools/get_binaries.py

Build the binaries from source on Linux:

bash tools/build.sh

Run the tests:

pytest

License

This project is licensed under the MIT license - see the LICENSE file for details.

[^1]: Errors like divide-by-zero are currently still possible. The feasibility of tracking value ranges in the type system is under investigation to enable compile-time checks.

[^2]: The compiler must support tail-call optimization (TCO). Currently, GCC is supported. Porting to a new architecture requires implementing a subset of relocation types used by that architecture.

[^3]: Supported architectures: x86_64, AArch64, ARMv6/7 (non-Thumb) and ARMv7 Thumb for Cortex-A and Cortex-M. Code for x86 32-bit exists but has unresolved issues and a low priority.

Project details


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.

copapy-0.0.7.post0-cp314-cp314t-win_amd64.whl (198.3 kB view details)

Uploaded CPython 3.14tWindows x86-64

copapy-0.0.7.post0-cp314-cp314t-musllinux_1_2_x86_64.whl (206.3 kB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ x86-64

copapy-0.0.7.post0-cp314-cp314t-musllinux_1_2_armv7l.whl (206.0 kB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARMv7l

copapy-0.0.7.post0-cp314-cp314t-musllinux_1_2_aarch64.whl (206.3 kB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARM64

copapy-0.0.7.post0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (206.5 kB view details)

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

copapy-0.0.7.post0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl (212.0 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ ARMv7lmanylinux: glibc 2.31+ ARMv7l

copapy-0.0.7.post0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (207.1 kB view details)

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

copapy-0.0.7.post0-cp314-cp314t-macosx_10_15_x86_64.whl (193.2 kB view details)

Uploaded CPython 3.14tmacOS 10.15+ x86-64

copapy-0.0.7.post0-cp314-cp314t-macosx_10_15_universal2.whl (197.5 kB view details)

Uploaded CPython 3.14tmacOS 10.15+ universal2 (ARM64, x86-64)

copapy-0.0.7.post0-cp314-cp314-win_amd64.whl (198.3 kB view details)

Uploaded CPython 3.14Windows x86-64

copapy-0.0.7.post0-cp314-cp314-musllinux_1_2_x86_64.whl (206.2 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

copapy-0.0.7.post0-cp314-cp314-musllinux_1_2_armv7l.whl (205.9 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARMv7l

copapy-0.0.7.post0-cp314-cp314-musllinux_1_2_aarch64.whl (206.3 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

copapy-0.0.7.post0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (206.4 kB view details)

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

copapy-0.0.7.post0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl (211.8 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARMv7lmanylinux: glibc 2.31+ ARMv7l

copapy-0.0.7.post0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (207.0 kB view details)

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

copapy-0.0.7.post0-cp314-cp314-macosx_10_15_x86_64.whl (193.2 kB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

copapy-0.0.7.post0-cp314-cp314-macosx_10_15_universal2.whl (197.5 kB view details)

Uploaded CPython 3.14macOS 10.15+ universal2 (ARM64, x86-64)

copapy-0.0.7.post0-cp313-cp313-win_amd64.whl (195.6 kB view details)

Uploaded CPython 3.13Windows x86-64

copapy-0.0.7.post0-cp313-cp313-musllinux_1_2_x86_64.whl (206.0 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

copapy-0.0.7.post0-cp313-cp313-musllinux_1_2_armv7l.whl (205.8 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARMv7l

copapy-0.0.7.post0-cp313-cp313-musllinux_1_2_aarch64.whl (206.2 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

copapy-0.0.7.post0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (206.3 kB view details)

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

copapy-0.0.7.post0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl (211.7 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARMv7lmanylinux: glibc 2.31+ ARMv7l

copapy-0.0.7.post0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (206.9 kB view details)

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

copapy-0.0.7.post0-cp313-cp313-macosx_10_13_x86_64.whl (193.1 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

copapy-0.0.7.post0-cp313-cp313-macosx_10_13_universal2.whl (197.5 kB view details)

Uploaded CPython 3.13macOS 10.13+ universal2 (ARM64, x86-64)

copapy-0.0.7.post0-cp312-cp312-win_amd64.whl (195.6 kB view details)

Uploaded CPython 3.12Windows x86-64

copapy-0.0.7.post0-cp312-cp312-musllinux_1_2_x86_64.whl (206.0 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

copapy-0.0.7.post0-cp312-cp312-musllinux_1_2_armv7l.whl (205.7 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARMv7l

copapy-0.0.7.post0-cp312-cp312-musllinux_1_2_aarch64.whl (206.1 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

copapy-0.0.7.post0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (206.2 kB view details)

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

copapy-0.0.7.post0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl (211.9 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARMv7lmanylinux: glibc 2.31+ ARMv7l

copapy-0.0.7.post0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (206.8 kB view details)

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

copapy-0.0.7.post0-cp312-cp312-macosx_10_13_x86_64.whl (193.1 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

copapy-0.0.7.post0-cp312-cp312-macosx_10_13_universal2.whl (197.5 kB view details)

Uploaded CPython 3.12macOS 10.13+ universal2 (ARM64, x86-64)

copapy-0.0.7.post0-cp311-cp311-win_amd64.whl (195.6 kB view details)

Uploaded CPython 3.11Windows x86-64

copapy-0.0.7.post0-cp311-cp311-musllinux_1_2_x86_64.whl (206.6 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

copapy-0.0.7.post0-cp311-cp311-musllinux_1_2_armv7l.whl (206.4 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARMv7l

copapy-0.0.7.post0-cp311-cp311-musllinux_1_2_aarch64.whl (206.7 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

copapy-0.0.7.post0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (206.7 kB view details)

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

copapy-0.0.7.post0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl (212.4 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARMv7lmanylinux: glibc 2.31+ ARMv7l

copapy-0.0.7.post0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (207.4 kB view details)

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

copapy-0.0.7.post0-cp311-cp311-macosx_10_9_x86_64.whl (193.1 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

copapy-0.0.7.post0-cp311-cp311-macosx_10_9_universal2.whl (197.5 kB view details)

Uploaded CPython 3.11macOS 10.9+ universal2 (ARM64, x86-64)

copapy-0.0.7.post0-cp310-cp310-win_amd64.whl (195.6 kB view details)

Uploaded CPython 3.10Windows x86-64

copapy-0.0.7.post0-cp310-cp310-musllinux_1_2_x86_64.whl (205.7 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

copapy-0.0.7.post0-cp310-cp310-musllinux_1_2_armv7l.whl (205.5 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ ARMv7l

copapy-0.0.7.post0-cp310-cp310-musllinux_1_2_aarch64.whl (205.9 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ ARM64

copapy-0.0.7.post0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (205.9 kB view details)

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

copapy-0.0.7.post0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl (211.5 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARMv7lmanylinux: glibc 2.31+ ARMv7l

copapy-0.0.7.post0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (206.5 kB view details)

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

copapy-0.0.7.post0-cp310-cp310-macosx_10_9_x86_64.whl (193.1 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

copapy-0.0.7.post0-cp310-cp310-macosx_10_9_universal2.whl (197.5 kB view details)

Uploaded CPython 3.10macOS 10.9+ universal2 (ARM64, x86-64)

File details

Details for the file copapy-0.0.7.post0-cp314-cp314t-win_amd64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 4f7b8f3b25aba5878c139c9a335ee26d73d036ca7d976ceb668a335b3d37b9d7
MD5 c6885d57863ae896561923e3ab20ee60
BLAKE2b-256 0e67fc77990ad08b06379d3ef6062368511c174991781e42b82b93ee26c0a87a

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp314-cp314t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 bbde6c8c68cd554eb530df25dce5ca1577ef77e4d4ae7194f66843a7169a3437
MD5 5a9561ddbfffe229dc46c9dfdf106d46
BLAKE2b-256 afb89bd6bd37a326a97574876969849a599be7024fbd0079f588db4d857acd97

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp314-cp314t-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp314-cp314t-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 157717562508dabd2d594d1ffa5a769a32d9baedc98004ea644a8b79f219cde1
MD5 83dfcb032eb2277efcded05e578c33ab
BLAKE2b-256 9cdb0081346c3e56fc928c4f60887892afd976c97ec95b5bd61f205e8b58bc20

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp314-cp314t-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp314-cp314t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 2c4fead82ca80b3a68ef18b261d950a18af1e058805e267db94926590a5c4d5b
MD5 d5a5d2139eb85285c64bbbc9507a07e9
BLAKE2b-256 cdcbcbce4f78b2f0a2e3ca8be4413930c24db414c8f5d00fc95277f226989328

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 bdb3acfd016a4e3d5a9d6f729ad541500a6511a3356e061bb219e9a445b9f852
MD5 0e9ff4a2c67fd7797f2fe4c609f48b66
BLAKE2b-256 24e3fec3569622aaac16cef61b15b3ed600043b5b81edd5671e71e8e8ff050eb

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl
Algorithm Hash digest
SHA256 7d3fec41263da7ac537e472078af06d5bfc066d26db2266bec20affe5909fede
MD5 84dfd0162208891be7402e60631fff9a
BLAKE2b-256 b0518c62d4818663c9a960dcfa3aa67dc193a4c70c2172abab1bb5ca4fcf4a6a

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 0fbff7200b0ba6becf5754fb9e4e05118f52ebbb87394fb4711d9cfc1403fd78
MD5 062c4e401319d4dc39e2e5f4c7b6966e
BLAKE2b-256 4241affbbd62eeab6c534e004f40d4ccbe3cb1609f8c013eec97225b842e4574

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp314-cp314t-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp314-cp314t-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 36dc8f7207640dd600efa0fa6c207fe4549d387978c5e5db418185cad56a2c7b
MD5 d78864d122e47c3820c521fae4a14537
BLAKE2b-256 e6032438437c1174bcbe732f8ee3cef8add0621297f71b9aa8a8c9b8a558e38a

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp314-cp314t-macosx_10_15_universal2.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp314-cp314t-macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 dc904e3fc917f4b8489478a03762cf2ece655d53cf8f15919a9699f8a4e27100
MD5 6992829b213c23cde876acfca8a5d5a5
BLAKE2b-256 92c872b148fc6a95131d66ce80830ead9d42db3a24737c7c458f4ad23c73dce8

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 8a94fad55e58baa2c69d6b91530a9bfda1c278afe73d664495b8a46e45d3c847
MD5 012a27e168a27e4e5e073088644d9511
BLAKE2b-256 9237f262f422b042aad6bf3495f5a568d5a284e99fbce43e3ffd72700cec85b4

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp314-cp314-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 0a6047e7fbf4d3d0b0e0f4cc90c743fc122d609ed0440f6f5434cac74c2c9d07
MD5 cb6f707c40e3e3fd5d4aafd4af4ba68d
BLAKE2b-256 bf50a3311a3cf241b929c9d4adfc61ebab8486bed77563782456d905971bb110

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp314-cp314-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp314-cp314-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 2adc8a630c468b0c84707d4ea244e1d92762de10ed48a13c10a2ce552dd4cc9e
MD5 1fb395ce34772fad355da4557df60389
BLAKE2b-256 eaa6d02ceb924a5dd7971652a81a983a209a68ea313924ee7531f91aa18ef46c

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp314-cp314-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 77832b3648a051e35b51ce9a706c2297b410dee40e3e4d445f7cb6960a954fa8
MD5 d3d9c57b8e9aa0b2653c2c15a9569f9b
BLAKE2b-256 6ed666952cf6029effc9b919c346a9b00296f076d70e6904f9a9b13bcafbb454

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b80b1e3869d3e4a825f683751b85dfaabd9605a7ea1d1fe13fea4f1433d1a127
MD5 e80adc0186269068670d31a305bd2bc6
BLAKE2b-256 794f9b316bab3c6d1202e34c7d6016f24434e7d8f5f42c6d9fc729f4a004b058

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl
Algorithm Hash digest
SHA256 160f89660c9bba3e35b2896fb6395b1ae47d9a0b081a9c4d54402b504784d476
MD5 d51f2c916dbdd8efbd176a5324571a00
BLAKE2b-256 0bb845ff7f80995c6fbb21acb8e0f112eb705d6ae34a7091fd37ebdf95332139

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 d1ae8e3f383aa8952a6aff978fa9a83e3e0dca170d17097d19612d9b9f3bb9de
MD5 ff338d3b7cf6eee4564ae0070dcaac14
BLAKE2b-256 3eacd858b335d8d5749ea78fba8d1289369121f6d4d9dace26d281bbe2195192

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp314-cp314-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 cfe8d87c8306036b3ebce81109636697e42ddc5b6a863dd7fce260b1f2995a2c
MD5 146c2603ec8ea29c566a45e652a559e0
BLAKE2b-256 543976a2df29f44c774005dd69e6bdd1903a514d2a20d7c35466074e7e971b8f

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp314-cp314-macosx_10_15_universal2.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp314-cp314-macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 55b2fca243faba79039b1ebe9f3093cd0bd0cfc9ecfd5c903ea1a695882c8db9
MD5 ad331bbe5faa105274ed8d5c836b4285
BLAKE2b-256 79a1ae274d2e7676d0630ce330a5141f96209df871acba1b5bec5b74e8d7444b

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 3b5b695c7540bb503a93349904a7262504fda88b48b45566e2366d4fdd9aedcc
MD5 78b0efa839ba594eb5b0f6909e57588c
BLAKE2b-256 27173aa6862aea4a84043a2effe83acb52c91affd1b029ca6721c8c3b6716eca

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 ebd80928ee7c82e19610da971e9da4edf4b2de2ef34af36f9e791ff08fa2c3f9
MD5 b1dc35266c537b513b5d1d60d74c4604
BLAKE2b-256 a85b47cd1d6b27f389651162576bf6852d848e97c35cea4c0e84d7f3d660907f

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp313-cp313-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp313-cp313-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 85b227129ce3bfdc3a4373b0b2319162be18a0335fb3c2576215a4ed5cef7493
MD5 68c928c4a80b9e7689e502bec335b8d3
BLAKE2b-256 3d67225336c7d4b91ec7caf39c382b2d644c6d5a1b1cba224b54896c925d47dd

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp313-cp313-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 a417b74c9e6ef96c9a2e2aafafdba192dbf8a3ed0ec5656040e74e300007f3fb
MD5 19a6c082df653c69b46c7e3c858a39ec
BLAKE2b-256 095f0f56eedf26abfe1b2e25c6f2b1fc2b8fa7a0a19cbdd2e7480b9f51ded380

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 12bb396c56e03dbe12b33e8234aca965934e6fee1db1afb9f546c242a382c5be
MD5 590aee07da4d1b7e640be7f51f2d4828
BLAKE2b-256 e8b6eb26ee9383feab8802f55e067a3db2e31f4c71696b9fe8bc685d35847cc8

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl
Algorithm Hash digest
SHA256 aeba9b1e1ab8fe501369aba6c6ee32ed4dec0c9cb034826b800d909f0f182302
MD5 c7db933a8fbb4bad2002b4e34fb7b02a
BLAKE2b-256 fdb6610d6e69f90fb2cbaffa83e88eaffc9514722c457be287ba5329b7960819

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c50d5126bc0492aabc5b17ea104a14a476b8ace9a7d5f9df42098bfb3813aeb7
MD5 862f76ba05566975d37d5d449a5c6128
BLAKE2b-256 8cd944950f48c057a9538c3d919f6eef9711fb0160dea123f8254ca10e597836

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 3270e0cd1db48a0700d03f6be46228c0f9f0d7e0c961bcbd325a954d5875821b
MD5 2b67e48990ea00b1472d7ccf2c58efa3
BLAKE2b-256 4a71ed6d0c0554a4276742e43c557dea6909735f2a01e1aa4e95a5ebc52ca463

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp313-cp313-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 c081369536d15a033216d333248a4f2fd49326811adb3ad7a0799b54cd5c5a25
MD5 8077f6c852de3b1e47804c9d4fae4b02
BLAKE2b-256 944ef1194b0f50d44e0b44bf740c6e7c7eb03cf2eb47718e51bdfa68c2025df1

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 e99bf8ed509af13cd8d637f6b96a088168910c41b0a2dd3e1cf1060efde25e63
MD5 93f4d2ec70ae9b7fd54a36af768ebf4b
BLAKE2b-256 5a6214d3146515ab7930f181cfc981074a8d9ed8152e7425bb5b00cefebc99e9

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 b572208c81fe0b6f1c4f92e53a15cb5853d17614db4b196debcdca26b5886ebe
MD5 76a1c76fe0546bb33df9c856ae50015f
BLAKE2b-256 1cb8e968ea9804bd1b1fff08b873d652f3a3f63fd1240f977ff3b0e9f4d27ebd

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp312-cp312-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp312-cp312-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 95c0f6ee4f7375aa290a58cab875d0a715141fe0f767b66b5d0f1d910c219b36
MD5 b683ef667c753803e83ca52e00b71b55
BLAKE2b-256 86f59071bbd39bbecc61f80bedb70e0741f2ab5cd89eb12a2b82f42e01875058

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp312-cp312-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 1495104cb58fe059481bc0a4aec4825aed39fba349ec521007bbbe11de5b2aab
MD5 b5ca0db5619bf8d9f721e06e11f86e3a
BLAKE2b-256 af361b3568349154a68e5715052e615d7ca3fb2c83319107d02957d7cba58d02

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1b30b63830fdfa3c35dec87e7205b88eb4699cd756a868edd62c80d930ae6839
MD5 1c30da2c3fbe0674ba882b36fe1b5a54
BLAKE2b-256 a88095175addb5b754c75055b2587f0b655b9d00fc1c7b3944652c0e5a8cb804

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl
Algorithm Hash digest
SHA256 52dc258c3259b7f690ca363f9fe5875175b817304eff21dd667ea778615ea797
MD5 1df93f9a49e47927e3a28c5d045b0ee8
BLAKE2b-256 c1aaf0b50075316097506d4eb551fbb1f8e6f8c8906ef45df71a1a3942c8e5c4

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 24c5b145b81e26b93007bcbc9b06e8577e2c8eb8de2e74b8353916132fbd9657
MD5 d4270aeb2a96a4d3ad68b76fe194ece2
BLAKE2b-256 a7d67986ffa790c6834cb88e5250464fd9d19d8245c7a03748a02179dab35afc

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 f2975a315d567b8970c1e6424b1b2fae4d26ffd13d2341a1d0cca9958ffdaba0
MD5 3ac2780aeaa433fe809c38881830b3e0
BLAKE2b-256 5b40b64facb66d52349f5d1f80e84c94303cbf827e3a74a7033df71916589079

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp312-cp312-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 9b68416caa4aef891a121b3605bb9377eb7e9e76a152b855ca505533fd42d364
MD5 7820b0e030fd16f3d4221f4fd0c3b328
BLAKE2b-256 8a740f9e54ed06193ee4acfa66237987937266f2648555fcd4ba4d4bd4354f16

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 f169f5ed93d0484ad6f49a59cb2a3f44c6329a9b7e5e36210f23fc2dc0b9862a
MD5 a28a48d8e5097f3d7a1f80524658a111
BLAKE2b-256 620e7a18d76384255f1f3fa5e6cedb683628f7ad2f3a9fb292766644253dbf2c

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 683336506d3add17890d57ea085bd12c1ac9ea582875b489a51cfe6b9479cca9
MD5 0a6b3a39165675b4dfdc7f9e62e0d119
BLAKE2b-256 44896ceb2d1b43f93504f063c45c43f766e886b2733debbe374c1fe572310285

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp311-cp311-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp311-cp311-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 a3a7fe40d2385dd6ad0ca37d667b3e73b9a186b03374eb333ef683600d62d295
MD5 779319fbe0f96b4fc5a49c4383ade4a9
BLAKE2b-256 6f4ef3301fb6c143025d4c2725edcdd1bf484cca214e44e7a03affc3480e233f

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp311-cp311-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 39d80c7bd8b9da87e064a1edf92a109afeec3d36f2a0aff030ccd89cf62589c0
MD5 37c1f947d2fd4a4d3ab2bde3602744bd
BLAKE2b-256 a2b10222eadb16548333879bef9c8d3ad19cea1d31e59c17605173b1a1eda95b

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5511f08c3b3a61a253ca0943fab9dd3a65fccb59cc66a84f80c74dd471b83d9b
MD5 1bbf63ab901682c87f6c99b1fbfaf5d4
BLAKE2b-256 208c50b6870b600e992b9c02c61e3308b129b4759007720118bf2c7aafc6de69

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl
Algorithm Hash digest
SHA256 76c5909307ec0cc65dd480fb37d9fe397bf775942c6b2ca9324a86e00149f441
MD5 0036901fd3991325d54f825251993500
BLAKE2b-256 6734f468fbe6e5545125c74fb3d1f03331351d3b428bc54e135d4ea4ce21c2f1

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f387e2a8fe7f43b0a2af2ea5f29f1d8efb18d31e06d59f484678af40f6be6c00
MD5 59dc9782410775053cdf5875755e827e
BLAKE2b-256 dc4aeea3ab0f4471d4affddf2d26c8151febda4d47948e594a1f2e3a1185e689

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 bc8a88d93522dbc02f40993223200f1e019867e9a899840c36ea109b6a788924
MD5 4772658e7cae4957f050aa7c6c5b5c14
BLAKE2b-256 3e78b0d33325a0d21397435ebdbc70e0d5b7eedd115515eaf211e660df6d3271

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp311-cp311-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 274e2362d814ff6627338d5d296206ab836a047b26f448684092c4ad6d3cac8b
MD5 0d71b02be9831bf5c9fc6ed64005049b
BLAKE2b-256 8d75d6671bb23167b5540f4786864cb5f5997407d46c58d90dae03f929d855db

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 3ef9e679cf39a9ba454792044e554907e8b29e3cf99405eb8f680deb07274075
MD5 b8e745c83b1d4ec89e39cdfde8f8e4e4
BLAKE2b-256 5ab447cc9343b617ed49a497cda327e5af3288cd9e954e9806346f3da3896454

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c8f290df867daca2ae23ff5532287ebbaa129c25ed4f58dc668b46674e2cd885
MD5 3f4d1d2d224015a7bae73bb88e4199f7
BLAKE2b-256 536f29d19915abc76856fff6fd02590b8cd980116a7c7fa0c16fe662ea830d3c

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp310-cp310-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp310-cp310-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 e677656d29b80a9513843faa1e87e8c1e672fa586b03b70e9276b2e4b2eb66c4
MD5 7cc469835229bdfa4355fd7b2b137b68
BLAKE2b-256 342174fc267a2d208fa4d273d26a3d02c7abaa5244e68adb36b11e4b5ab9e74b

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp310-cp310-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 377ef77f1f27bf7bb6bfd56db90319eac88d2412ebc9e4eba85953102a65a345
MD5 5ff44b302ffef3a5608ea67ce6bcb5f3
BLAKE2b-256 34aac17925a87d270377bd45973dce8b4308ea208f1301087806dc4ea5b30bea

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 848882267f265d11c575078f2f659bd04cbba09ab9b9f595809468b5636d036a
MD5 70ffd3909a2c29740f0f70401484f749
BLAKE2b-256 e03c051567b2379e2378fb504501674ee562f7545c7b00694dc69ed6e81039a3

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl
Algorithm Hash digest
SHA256 8f49304d229a3f809b56375e1dc2842e032c0b5206cb87524e64ac5ded8ae87f
MD5 29a0ea7647ad53306e7fc94c634abba5
BLAKE2b-256 cd86b24ca8d39913e94d2a21fe3611466733c6830055da3aa3ed69df794e51e9

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 418167248c23b648ef7749fe9e3c89e43a748ef3c89d9972f1e0459e526c473b
MD5 4d0885ccb129727c80b13af5e0ef6778
BLAKE2b-256 71b186df2838b20fec29afc5c5f725e49966907fb79604601f3821a5fc9c8773

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 56e713d8c03501558f5ca121dd62544ead0c28ff56848a8888a08777d72e5274
MD5 939079797ec6df14bd605f2a1734e9bb
BLAKE2b-256 37de54b81af489846f64ecb3bdab83e20bfd359c3a450ccce74f180ae4fd160e

See more details on using hashes here.

File details

Details for the file copapy-0.0.7.post0-cp310-cp310-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for copapy-0.0.7.post0-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 60fd9f8b5c326bbe5e1d99a4623321bfcaf2719efb6fc12d84e4273ad1e6fde1
MD5 44c04bd08ae8c438d85dc04d02eece74
BLAKE2b-256 fe529cc50c635d24cc38535275333d3b48627d93963f1dd25c6bd157cfc5f4b9

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