crosshair-tool 0.0.84__cp312-cp312-macosx_10_13_universal2.whl → 0.0.85__cp312-cp312-macosx_10_13_universal2.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of crosshair-tool might be problematic. Click here for more details.

crosshair/util.py CHANGED
@@ -12,6 +12,7 @@ import sys
12
12
  import threading
13
13
  import traceback
14
14
  import types
15
+ from array import array
15
16
  from dataclasses import dataclass
16
17
  from enum import Enum
17
18
  from inspect import (
@@ -20,6 +21,7 @@ from inspect import (
20
21
  getmodulename,
21
22
  getsourcefile,
22
23
  getsourcelines,
24
+ isdatadescriptor,
23
25
  isfunction,
24
26
  )
25
27
  from time import monotonic
@@ -52,6 +54,19 @@ from crosshair.tracers import COMPOSITE_TRACER, NoTracing, ResumedTracing, is_tr
52
54
  _DEBUG_STREAM: Optional[TextIO] = None
53
55
 
54
56
 
57
+ if sys.version_info >= (3, 12):
58
+ from collections.abc import Buffer
59
+
60
+ def is_bytes_like(obj: object) -> bool:
61
+ return isinstance(obj, Buffer)
62
+
63
+ else:
64
+ from collections.abc import ByteString
65
+
66
+ def is_bytes_like(obj: object) -> bool:
67
+ return isinstance(obj, (ByteString, array))
68
+
69
+
55
70
  def is_iterable(o: object) -> bool:
56
71
  try:
57
72
  iter(o) # type: ignore
@@ -148,7 +163,7 @@ else:
148
163
 
149
164
 
150
165
  class IdKeyedDict(collections.abc.MutableMapping):
151
- def __init__(self):
166
+ def __init__(self) -> None:
152
167
  # Confusingly, we hold both the key object and value object in
153
168
  # our inner dict. Holding the key object ensures that we don't
154
169
  # GC the key object, which could lead to reusing the same id()
@@ -665,25 +680,39 @@ class IgnoreAttempt(ControlFlowException):
665
680
  debug("IgnoreAttempt stack:", ch_stack())
666
681
 
667
682
 
668
- ExtraUnionType = getattr(types, "UnionType") if sys.version_info >= (3, 10) else None
683
+ if (3, 10) <= sys.version_info < (3, 14):
684
+ # Specialize some definitions for the Python versions where
685
+ # typing.Union != types.UnionType:
669
686
 
687
+ def origin_of(typ: Type) -> Type:
688
+ if hasattr(typ, "__origin__"):
689
+ return typ.__origin__
690
+ elif isinstance(typ, types.UnionType):
691
+ return cast(Type, Union)
692
+ else:
693
+ return typ
670
694
 
671
- def origin_of(typ: Type) -> Type:
672
- if hasattr(typ, "__origin__"):
673
- return typ.__origin__
674
- elif ExtraUnionType and isinstance(typ, ExtraUnionType):
675
- return cast(Type, Union)
676
- else:
677
- return typ
695
+ def type_args_of(typ: Type) -> Tuple[Type, ...]:
696
+ if getattr(typ, "__args__", None):
697
+ if isinstance(typ, types.UnionType):
698
+ return typ.__args__
699
+ return typing_inspect.get_args(typ, evaluate=True)
700
+ else:
701
+ return ()
702
+
703
+ else:
678
704
 
705
+ def type_args_of(typ: Type) -> Tuple[Type, ...]:
706
+ if getattr(typ, "__args__", None):
707
+ return typing_inspect.get_args(typ, evaluate=True)
708
+ else:
709
+ return ()
679
710
 
680
- def type_args_of(typ: Type) -> Tuple[Type, ...]:
681
- if getattr(typ, "__args__", None):
682
- if ExtraUnionType and isinstance(typ, ExtraUnionType):
683
- return typ.__args__
684
- return typing_inspect.get_args(typ, evaluate=True)
685
- else:
686
- return ()
711
+ def origin_of(typ: Type) -> Type:
712
+ origin = getattr(typ, "__origin__", None)
713
+ # 3.14 unifies typing.Union and types.Union, so that's good!
714
+ # But a of 3.14.0a6, types.Union.__origin__ yields a data descriptor, so we need to check that.
715
+ return typ if origin is None or isdatadescriptor(origin) else origin
687
716
 
688
717
 
689
718
  def type_arg_of(typ: Type, index: int) -> Type:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crosshair-tool
3
- Version: 0.0.84
3
+ Version: 0.0.85
4
4
  Summary: Analyze Python code for correctness using symbolic execution.
5
5
  Home-page: https://github.com/pschanely/CrossHair
6
6
  Author: Phillip Schanely
@@ -1,10 +1,10 @@
1
- _crosshair_tracers.cpython-312-darwin.so,sha256=kaEQaagoeG5qd0WXexCucUujYK775TfBYr94ilpoZJY,107040
1
+ _crosshair_tracers.cpython-312-darwin.so,sha256=C9W9bj_mWO0khx9I68UMrXxBRhZGH5WwDIXzxiVhTOg,107120
2
2
  crosshair/_tracers_pycompat.h,sha256=6IYnbQxrYkhBsLDAHSX25DPOwo1oYHCZUVWZ8c7YCnQ,14356
3
3
  crosshair/pure_importer.py,sha256=-t4eowrZOQmfqK1N2tjI5POoaxRGavytwMmbRivelFg,878
4
4
  crosshair/options.py,sha256=htQNgnrpoRjSNq6rfLBAF8nos-NNIwmP6tQYyI8ugsM,6775
5
5
  crosshair/lsp_server_test.py,sha256=7LO1Qqxkper3Xt2krgOlGqF1O_uDObo76o4FZbIqykY,969
6
6
  crosshair/conftest.py,sha256=BkLszApkdy6FrvzaHO7xh8_BJrG9AfytFTse-HuQVvg,653
7
- crosshair/copyext_test.py,sha256=5i2GHwpFjcEFGP24-ITu49Ebg__S2BE-qMPkK7CJMHo,1839
7
+ crosshair/copyext_test.py,sha256=uJzdC9m2FqMjqQ-ITFoP0MZg3OCiO8paU-d533KocD8,2108
8
8
  crosshair/objectproxy.py,sha256=Uc6mNkJBInvETGWBHI10GSNEIrBYDIxlAZ30M3PAIhQ,8935
9
9
  crosshair/objectproxy_test.py,sha256=KykRJLSHCDA7jb_XPBDhXHnS6Q1fG4oIJ579CeSEz3k,567
10
10
  crosshair/stubs_parser.py,sha256=rlBTQus5BlZ3Ygg6Xzk5dbQbDtRpv6w9i2HQmGrPVmc,14240
@@ -12,18 +12,18 @@ crosshair/_preliminaries_test.py,sha256=r2PohNNMfIkDqsnvI6gKlJTbwBaZA9NQJueQfJMN
12
12
  crosshair/dynamic_typing_test.py,sha256=oyg94OXjF_2jNFy33UJjkfWnDXKnM4or2TXbxrOqOQs,5478
13
13
  crosshair/enforce.py,sha256=FsZx3D-KtGrhb8xdAZbPUtwvVmEu8IAn7rwf7tmkrRY,10010
14
14
  crosshair/path_search_test.py,sha256=7cqzAMXUYAtA00mq9XR5AaZChqeQyXyCfuuv53_51pk,1692
15
- crosshair/condition_parser.py,sha256=gPVDyDde1xLCi64g5wAGjalvmH-s-PMnFl4U3o49VB0,42563
16
- crosshair/util.py,sha256=LZ6zjEjUnGfI8eS1ugFeq1RPvAnQlIUKEqT4bAHxrNg,21000
17
- crosshair/dynamic_typing.py,sha256=iQBRlRB1U0X3Ieg9sFBgbztWNkpG5tFCFdo75LdFCX4,11982
15
+ crosshair/condition_parser.py,sha256=oquaht026eZUigh2lyaFLXYDbmENdBKjddszx0a-B3w,42647
16
+ crosshair/util.py,sha256=OtkhDSdggqt-A7sTfp4sHa69_M7HNyD8w4gHhxcEUDo,21977
17
+ crosshair/dynamic_typing.py,sha256=jbI9FXv5-WXREQjeDtlDQladv-xCW21TUOM3qErJaJ4,11998
18
18
  crosshair/register_contract.py,sha256=EnDAxngJhKvJLFdw5kVgqaYDQ5hAZXKwAGBdXpot-AQ,10386
19
- crosshair/tracers.py,sha256=WnvM22QUwQVfKBZrZfXe_kn0zyYKQrGKIP_BoiyN2Ek,16452
20
- crosshair/_tracers.h,sha256=WUJB5WczyZ9g01Q8xcUi5h9NSQVO6E3aq88CXbm76g0,2070
21
- crosshair/type_repo.py,sha256=CQ3p95BGb7gmiBUOf1rJvwmdo13xt60F-rZYtwp9l5s,4615
19
+ crosshair/tracers.py,sha256=_jaSDgZ_pYdqacWE_msXn7W7CoSdQ_-7hlrxa891oHo,17139
20
+ crosshair/_tracers.h,sha256=qaDWd-_eCZckSbezrXXst6lppzFiM2kD2AcZgvVQm18,2124
21
+ crosshair/type_repo.py,sha256=dqMnDNgBqchRwsbXJcZmPyPHfiQC9kqFAB7z-zoA_0I,4649
22
22
  crosshair/fnutil.py,sha256=X80bD2Lh4QAh-rF561r3JRxjxcuZepF3hJaxaj1GG9s,13123
23
- crosshair/unicode_categories.py,sha256=iwRwrKQwbhX1rN3_zg3j83MUMIwk5cQJqUMJuCGWta0,285926
24
- crosshair/copyext.py,sha256=fSQiOEGcBIpmJnFZq-GZaDlI_qsUuDfFV6Q5tf7G1vI,4579
25
- crosshair/_tracers_test.py,sha256=wTnmXDujthmD-BS7ISWRpxWTFQmsMA4RW3_W89lzICE,3488
26
- crosshair/__init__.py,sha256=b1AlC2gVScI7UKg6pgQ__eqk2hFpsmx_rTHMkMyLoJQ,936
23
+ crosshair/unicode_categories.py,sha256=g4pnUPanx8KkpwI06ZUGx8GR8Myruf_EpTjyti_V4z8,333519
24
+ crosshair/copyext.py,sha256=GBGQP9YAHoezLXwb_M59Hh1VXSou5EQt4ZmmUA0T_og,4899
25
+ crosshair/_tracers_test.py,sha256=KpCGspjOUeZuhwTYgn_RxI4M4wMbT5rldusFDgneQ6M,3596
26
+ crosshair/__init__.py,sha256=vw6g0DHh0Clj2rgk1Iu4a-sWjwIf5SwN6IR04XBP47s,936
27
27
  crosshair/core.py,sha256=K7147xrvcvtrP1T9oIRywq2uHMMsIu8ZwFZWBQXPozg,63634
28
28
  crosshair/path_cover.py,sha256=wV0Vy8IPDzqXQ2VI8a94FxltS9p-Y1oF17OKePjvpgs,6710
29
29
  crosshair/enforce_test.py,sha256=C6CQ4P1FjkdIJeJg3aJynp1iLDCE6BFCEVtSqXbvmQk,4665
@@ -36,30 +36,30 @@ crosshair/auditwall.py,sha256=FjpeqM6HxsKYEfVJ20CRzkQu1I2zt1dpzwejrDp-W9U,4975
36
36
  crosshair/simplestructs_test.py,sha256=6uDdrSISHLhwnFuESkR8mUGw7m1llM6vCNDFChkfSs8,8639
37
37
  crosshair/z3util_test.py,sha256=CZovn4S9mYcG_yQegcxm80VHrvUdvNei0gvGTF9TOrk,173
38
38
  crosshair/diff_behavior.py,sha256=_5X_pTN0_-rSPrh8dfpODJG_phFMn7fWc-_zLgO3UTk,11253
39
- crosshair/condition_parser_test.py,sha256=jvNtJb_CFDNo2zJzmwnbRRXIRHFH3ZfP_nJldsiZ1sQ,15532
39
+ crosshair/condition_parser_test.py,sha256=eUQYnVkHewn8qg-XbzcElb0mHkPxPJAX548dPVyxqqk,15532
40
40
  crosshair/pure_importer_test.py,sha256=Xjtlwn1mj7g-6VA87lrvzfUADCjlmn1wgHtbrnc0uuY,421
41
- crosshair/fnutil_test.py,sha256=cLHJ9uhQf797sTxuh4BGgQ0Fo5rcQFStkiPbzQPhIXA,2091
41
+ crosshair/fnutil_test.py,sha256=wXtfIxAupRm0KUzKob8luEsNI4YegBQUfwz7msWbfHY,2186
42
42
  crosshair/stubs_parser_test.py,sha256=0itTT0Udul_51RJXNv6KB97z44gYze6NZfKJL7yIDzA,1228
43
43
  crosshair/options_test.py,sha256=lzA-XtwEwQPa4wV1wwhCRKhyLOvIhThU9WK5QRaRbxQ,379
44
44
  crosshair/patch_equivalence_test.py,sha256=mvYpsbHZS2AiQra-jK8T8QywAG1gNNCUNQPPWI9k5t8,2506
45
45
  crosshair/abcstring.py,sha256=ROU8LzS7kfEU2L_D3QfhVxIjrYr1VctwUWfylC7KlCc,6549
46
- crosshair/_mark_stacks.h,sha256=4n3ikcrMDIUWHLf6CQ1Wf3brHw79E3-fCbtHLSSdRCk,29844
46
+ crosshair/_mark_stacks.h,sha256=rvIET5OGjKMcUZxEtIb9RhxRDveAfPXb3HLZZWfM3Bs,29261
47
47
  crosshair/fuzz_core_test.py,sha256=q7WsZt6bj5OJrXaVsT3JaRYWWnL8X_1flSfty4Z7CcA,16903
48
48
  crosshair/unicode_categories_test.py,sha256=ZAU37IDGm9PDvwy_CGFcrF9Waa8JuUNdI4aq74wkB6c,739
49
49
  crosshair/statespace_test.py,sha256=LOblIarBbcB9oD_gVR5kK_4P2PWQymVGgJr3wNqP3Fs,2621
50
50
  crosshair/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
- crosshair/lsp_server.py,sha256=_43KoCY7AfTnBWL9pgYdYCiL-GHUdM01RNYGJXrCPqw,8670
51
+ crosshair/lsp_server.py,sha256=j7SX4pdVwa2MrtkNIjajLilzl5CZTY6PrBQsa26cdNo,8670
52
52
  crosshair/path_search.py,sha256=wwZjp-3E4dENnJa6BlnSq8FARkIx0PyUYc7kvH32A2k,5588
53
53
  crosshair/auditwall_test.py,sha256=VPcw_OW3nl3BkOZY4wEEtVDyTamdgqD4IjRccI2p5vI,2030
54
54
  crosshair/smtlib_test.py,sha256=edzEn19u2YYHxSzG9RrMiu2HTiEexAuehC3IlG9LuJM,511
55
55
  crosshair/register_contract_test.py,sha256=DhvKIcF3LgQfHfUSCccoA11ctCdFaQR263Pc4YUuxyk,4970
56
56
  crosshair/statespace.py,sha256=PIT5ajZZcur88_5Cs0QkPkUVa-fqKwsqgNrRNPKRoSo,41547
57
- crosshair/opcode_intercept_test.py,sha256=iatuGm_NUbbAfjIHox-5ABYGIYyC20H73y1k6_JFlOE,5733
57
+ crosshair/opcode_intercept_test.py,sha256=rWO84XLQF8YEQLIxvrlnJWLqMfKXgah_6AW3u_NADlQ,6189
58
58
  crosshair/main_test.py,sha256=DFXtE--616vCF1WAS576SHXO19K0LsDPzJIWNT5vuXM,14383
59
59
  crosshair/codeconfig_test.py,sha256=RnC-RnNpr6If4eHmOepDZ33MCmfyhup08dzHKCm5xWA,3350
60
60
  crosshair/watcher.py,sha256=kCCMlLe2KhW5MbEbMmixNRjRAvu5CypIAGd1V_YZ9QM,10048
61
61
  crosshair/test_util_test.py,sha256=FIOWVBMiF-zyq0pGsDQ8W6lB6_E9sGpD80dioHHETyQ,512
62
- crosshair/opcode_intercept.py,sha256=P-jGaFhiCsofA89ErT8VHi9bdt2xbBj4PTPaRugBpn0,18309
62
+ crosshair/opcode_intercept.py,sha256=yNixjTRjc8R9PXO1xGF4BoQ-IAHXup7CWgUwbubRzZc,18996
63
63
  crosshair/simplestructs.py,sha256=CiZSuHH_j_bYitaW-n7vWd_42xSyV6Jh8es3BQLlcHk,34221
64
64
  crosshair/tracers_test.py,sha256=EBK_ZCy2MsxqmEaGjo0uw9zAztW9O6fhCW_0PJxyTS8,3270
65
65
  crosshair/smtlib.py,sha256=hh-P32KHoH9BCq3oDYGp2PfOeOb8CwDj8tTkgqroLD8,689
@@ -98,16 +98,16 @@ crosshair/examples/icontract/correct_code/arith.py,sha256=ZSwsotmq_l1Mp3dOgjcRJs
98
98
  crosshair/examples/icontract/bugs_detected/wrong_sign.py,sha256=afnirsfgV8uNFT-G_FlIbUFy7lV0jYCMPl9G2Dm5ayA,196
99
99
  crosshair/examples/icontract/bugs_detected/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
100
100
  crosshair/examples/icontract/bugs_detected/showcase.py,sha256=L4iL1JCWCpOISbEc5yce5bW_Th5eAjYVKRzsykb7m9M,1248
101
- crosshair/libimpl/collectionslib.py,sha256=bf3DVbA8XxAptfSv5iTwB2-GoFHu2ytm5QWjmBMFp00,8277
101
+ crosshair/libimpl/collectionslib.py,sha256=VuDIOUOGORiUT9J0tDVECr6oC-yUR3WAiFnMeVGzi-o,8583
102
102
  crosshair/libimpl/zliblib_test.py,sha256=mckg9PnZrBUTStzMzHIoZl8JPuAzsIfrEruNKNDpYiE,388
103
103
  crosshair/libimpl/unicodedatalib.py,sha256=q5LoCaEbHJrUwVWtUrlS3n_X21yp15xTS42l-9AQ6Us,3103
104
104
  crosshair/libimpl/datetimelib_test.py,sha256=v9Cg512AXIGy7_dsN2y_ZD7W7fqfSSz07eiCUZukM60,2659
105
105
  crosshair/libimpl/heapqlib_test.py,sha256=NdwTihD0xGy4qIDaS5a9-t3q437rP47GNdtceEBquNA,537
106
106
  crosshair/libimpl/binascii_test.py,sha256=LOBqLAJ77Kx8vorjVTaT3X0Z93zw4P5BvwUapMCiSLg,1970
107
- crosshair/libimpl/collectionslib_test.py,sha256=HihBzwG2guM19lx8AmR4WjXZDxqkY_qXCnBbl6Iq5pI,8832
108
- crosshair/libimpl/timelib.py,sha256=9wwj0IPUOH_aYbZ3QVBaBxXSKQzi3_HJZRtmGzzKxt8,1811
107
+ crosshair/libimpl/collectionslib_test.py,sha256=3h7XTToKWauMhjrEwLXVI0jT8FZKBlkvlw0oiPMmuKM,9164
108
+ crosshair/libimpl/timelib.py,sha256=MXEFOZjFGa1-yLvmB3l3DFTLF9PSluOlmRK-ZJaA_oI,2409
109
109
  crosshair/libimpl/jsonlib_test.py,sha256=U40WJf-69dtflz75sIsl5zA3IV5R6Ltc4Z9jv_Fh-Fw,1382
110
- crosshair/libimpl/builtinslib.py,sha256=WNYNVbQhkOJogL6WBqiaVL5Q6MzcEjZpx3rNf3xP9VQ,182300
110
+ crosshair/libimpl/builtinslib.py,sha256=lMYlTJsirb-rx8RO3EU3-LwEivmWtdQ2VHfuubbsIKs,182505
111
111
  crosshair/libimpl/mathlib_test.py,sha256=QShLCXHdv3tx5PQxcSoR0MHeZ1huaiV6d3u7C2mGOn4,1861
112
112
  crosshair/libimpl/fractionlib.py,sha256=qdbiAHHC480YdKq3wYK_piZ3UD7oT64YfuNclypMUfQ,458
113
113
  crosshair/libimpl/binascii_ch_test.py,sha256=hFqSfF1Q8jl2LNBIWaQ6vBJIIshPOmSwrR0T1Ko4Leo,1009
@@ -125,11 +125,11 @@ crosshair/libimpl/weakreflib_test.py,sha256=CdGJhW32qJoxedn8QzPcMcKKmfl9Nv4FPDYe
125
125
  crosshair/libimpl/mathlib.py,sha256=ci_byDulWf1VOitpD3C-TwToL6CRYKkJUVMxjAYzUH8,4256
126
126
  crosshair/libimpl/pathliblib_test.py,sha256=NDeNOI24naLcvz6Lrx51nS-JhILHJjY1JNhRQO3Lufw,252
127
127
  crosshair/libimpl/randomlib.py,sha256=loyhlbRBJEs32kKFv_1O5PxKQU47F5kCz54OaNVuzUk,6161
128
- crosshair/libimpl/timelib_test.py,sha256=cJhkLeYYJqWLc2i4C9JEU-svI-KnRnmaPYsou0Ou7jk,1631
128
+ crosshair/libimpl/timelib_test.py,sha256=Ercmhw1Yc96CYnWhqIW7eu31R95uTGVZcgzxSiZoRzI,1851
129
129
  crosshair/libimpl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
130
130
  crosshair/libimpl/importliblib_test.py,sha256=DM8wWvPYbDTsdKVlS-JMrZ2cQpWSy4yXjZGPMQwF7Ss,1020
131
131
  crosshair/libimpl/relib_test.py,sha256=3raQ0JoU4vu8_NKfrjk7TkUIqVuuhR8mGCRPJPb0RI0,16085
132
- crosshair/libimpl/arraylib.py,sha256=zM5uuMD-FDDEpkp9dh3SnNrqziaT8unO6A8-Une_CmU,5181
132
+ crosshair/libimpl/arraylib.py,sha256=vW0lvkYJx8B3hLnhwXhCc-ZwtWtEwZFLm7T8ahrrKgs,4877
133
133
  crosshair/libimpl/urlliblib.py,sha256=EaC-nWdi-IFG3ewZrzgCqbKc9Sf9wlUN0wvGjTU5TOM,614
134
134
  crosshair/libimpl/bisectlib_test.py,sha256=ZQtYmBYD0Pb1IiFelsgdvqyeUMKaqaDb1BRb87LTSbI,753
135
135
  crosshair/libimpl/itertoolslib.py,sha256=1bwV8voMV2j18KjXYMKkuNSC8p4VE_ZvY-74rAbWjB4,1245
@@ -166,9 +166,9 @@ crosshair/libimpl/encodings/ascii.py,sha256=Cz1xraTkXdQ5aBKDkorX4rAvrmf877_EqzC9
166
166
  crosshair/libimpl/encodings/__init__.py,sha256=5LTEj1M-S00eZ4rfQWczAixg57vyh_9vZ5m5EKB5Ksc,680
167
167
  crosshair/libimpl/encodings/latin_1.py,sha256=ftUsPjUb9L7UKXKi9P7OAqOl9FkNP98M9jMAvseXBCQ,1242
168
168
  crosshair/libimpl/encodings/_encutil.py,sha256=nwVWqcGM1f7-hAC3Z46KnfrLzAjhfy4zaTa11uVBk6M,6828
169
- crosshair_tool-0.0.84.dist-info/RECORD,,
170
- crosshair_tool-0.0.84.dist-info/WHEEL,sha256=9rTMUFCdTklDZ8sW8OjWrj18_yWWDcqcZag3bdobfPU,115
171
- crosshair_tool-0.0.84.dist-info/entry_points.txt,sha256=u5FIPVn1jqn4Kzg5K_iNnbP6L4hQw5FWjQ0UMezG2VE,96
172
- crosshair_tool-0.0.84.dist-info/top_level.txt,sha256=2jLWtM-BWg_ZYNbNfrcds0HFZD62a6J7ZIbcgcQrRk4,29
173
- crosshair_tool-0.0.84.dist-info/METADATA,sha256=O2N30DECyCwy65MSgnkJEOSpXt-oJmp_pfwciVHHDho,6717
174
- crosshair_tool-0.0.84.dist-info/licenses/LICENSE,sha256=NVyMvNqn1pH6RSHs6RWRcJyJvORnpgGFBlF73buqYJ0,4459
169
+ crosshair_tool-0.0.85.dist-info/RECORD,,
170
+ crosshair_tool-0.0.85.dist-info/WHEEL,sha256=9_3tTSxMJq-dgdzMiScNvtT5eTBVd3l6RgHS7HwTzpA,115
171
+ crosshair_tool-0.0.85.dist-info/entry_points.txt,sha256=u5FIPVn1jqn4Kzg5K_iNnbP6L4hQw5FWjQ0UMezG2VE,96
172
+ crosshair_tool-0.0.85.dist-info/top_level.txt,sha256=2jLWtM-BWg_ZYNbNfrcds0HFZD62a6J7ZIbcgcQrRk4,29
173
+ crosshair_tool-0.0.85.dist-info/METADATA,sha256=ceFH89wcuwsmpx0R5LKTkwTiag76wifHPC545rEm4dQ,6717
174
+ crosshair_tool-0.0.85.dist-info/licenses/LICENSE,sha256=NVyMvNqn1pH6RSHs6RWRcJyJvORnpgGFBlF73buqYJ0,4459
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (77.0.3)
2
+ Generator: setuptools (78.1.0)
3
3
  Root-Is-Purelib: false
4
4
  Tag: cp312-cp312-macosx_10_13_universal2
5
5