splat64 0.32.0__py3-none-any.whl → 0.32.2__py3-none-any.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.
splat/__init__.py CHANGED
@@ -1,7 +1,7 @@
1
1
  __package_name__ = __name__
2
2
 
3
3
  # Should be synced with pyproject.toml
4
- __version__ = "0.32.0"
4
+ __version__ = "0.32.2"
5
5
  __author__ = "ethteck"
6
6
 
7
7
  from . import util as util
@@ -7,7 +7,7 @@ from typing import Set
7
7
 
8
8
  class SpimdisasmDisassembler(disassembler.Disassembler):
9
9
  # This value should be kept in sync with the version listed on requirements.txt and pyproject.toml
10
- SPIMDISASM_MIN = (1, 31, 0)
10
+ SPIMDISASM_MIN = (1, 32, 0)
11
11
 
12
12
  def configure(self):
13
13
  # Configure spimdisasm
splat/scripts/split.py CHANGED
@@ -271,11 +271,9 @@ def do_scan(
271
271
  for segment in scan_bar:
272
272
  assert isinstance(segment, Segment)
273
273
  scan_bar.set_description(f"Scanning {brief_seg_name(segment, 20)}")
274
- typ = segment.type
275
- if segment.type == "bin" and segment.is_name_default():
276
- typ = "unk"
277
274
 
278
- stats.add_size(typ, segment.size)
275
+ for ty, sub_stats in segment.statistics.items():
276
+ stats.add_size(ty, sub_stats.size)
279
277
 
280
278
  if segment.should_scan():
281
279
  # Check cache but don't write anything
@@ -287,7 +285,8 @@ def do_scan(
287
285
 
288
286
  processed_segments.append(segment)
289
287
 
290
- stats.count_split(typ)
288
+ for ty, sub_stats in segment.statistics.items():
289
+ stats.count_split(ty, sub_stats.count)
291
290
 
292
291
  symbols.mark_c_funcs_as_defined()
293
292
  return processed_segments
@@ -305,7 +304,8 @@ def do_split(
305
304
  split_bar.set_description(f"Splitting {brief_seg_name(segment, 20)}")
306
305
 
307
306
  if cache.check_cache_hit(segment, True):
308
- stats.count_cached(segment.type)
307
+ for ty, sub_stats in segment.statistics.items():
308
+ stats.count_cached(ty, sub_stats.count)
309
309
  continue
310
310
 
311
311
  if segment.should_split():
@@ -3,7 +3,7 @@ from typing import Optional
3
3
 
4
4
  from ...util import log, options
5
5
 
6
- from .segment import CommonSegment
6
+ from .segment import CommonSegment, SegmentType
7
7
 
8
8
 
9
9
  class CommonSegBin(CommonSegment):
@@ -33,3 +33,10 @@ class CommonSegBin(CommonSegment):
33
33
 
34
34
  f.write(rom_bytes[self.rom_start : self.rom_end])
35
35
  self.log(f"Wrote {self.name} to {path}")
36
+
37
+ @property
38
+ def statistics_type(self) -> SegmentType:
39
+ stats_type = self.type
40
+ if self.is_name_default():
41
+ stats_type = "unk"
42
+ return stats_type
@@ -122,7 +122,7 @@ class CommonSegCodeSubsegment(Segment):
122
122
  )
123
123
 
124
124
  # Gather symbols found by spimdisasm and create those symbols in splat's side
125
- for referenced_vram in func_spim.instrAnalyzer.referencedVrams:
125
+ for referenced_vram in func_spim.referencedVrams:
126
126
  context_sym = self.spim_section.get_section().getSymbol(
127
127
  referenced_vram, tryPlusOffset=False
128
128
  )
@@ -145,6 +145,16 @@ class CommonSegData(CommonSegCodeSubsegment, CommonSegGroup):
145
145
  self.get_most_parent(), symbol.contextSym
146
146
  )
147
147
 
148
+ # Gather symbols found by spimdisasm and create those symbols in splat's side
149
+ for referenced_vram in symbol.referencedVrams:
150
+ context_sym = self.spim_section.get_section().getSymbol(
151
+ referenced_vram, tryPlusOffset=False
152
+ )
153
+ if context_sym is not None:
154
+ symbols.create_symbol_from_spim_symbol(
155
+ self.get_most_parent(), context_sym
156
+ )
157
+
148
158
  # Hint to the user that we are now in the .rodata section and no longer in the .data section (assuming rodata follows data)
149
159
  if (
150
160
  self.suggestion_rodata_section_start
@@ -3,7 +3,7 @@ from typing import List, Optional
3
3
  from ...util import log
4
4
 
5
5
  from .segment import CommonSegment
6
- from ..segment import Segment
6
+ from ..segment import empty_statistics, Segment, SegmentStatistics
7
7
 
8
8
 
9
9
  class CommonSegGroup(CommonSegment):
@@ -124,6 +124,14 @@ class CommonSegGroup(CommonSegment):
124
124
  return True
125
125
  return False
126
126
 
127
+ @property
128
+ def statistics(self) -> SegmentStatistics:
129
+ stats = empty_statistics()
130
+ for sub in self.subsegments:
131
+ for ty, info in sub.statistics.items():
132
+ stats[ty] = stats[ty].merge(info)
133
+ return stats
134
+
127
135
  def get_linker_entries(self):
128
136
  return [entry for sub in self.subsegments for entry in sub.get_linker_entries()]
129
137
 
@@ -112,6 +112,16 @@ class CommonSegRodata(CommonSegData):
112
112
  )
113
113
  generated_symbol.linker_section = self.get_linker_section_linksection()
114
114
 
115
+ # Gather symbols found by spimdisasm and create those symbols in splat's side
116
+ for referenced_vram in symbol.referencedVrams:
117
+ context_sym = self.spim_section.get_section().getSymbol(
118
+ referenced_vram, tryPlusOffset=False
119
+ )
120
+ if context_sym is not None:
121
+ symbols.create_symbol_from_spim_symbol(
122
+ self.get_most_parent(), context_sym
123
+ )
124
+
115
125
  possible_text = self.get_possible_text_subsegment_for_symbol(symbol)
116
126
  if possible_text is not None:
117
127
  text_segment, refenceeFunction = possible_text
@@ -1,4 +1,4 @@
1
- from ...segtypes.segment import Segment
1
+ from ...segtypes.segment import Segment, SegmentType
2
2
 
3
3
 
4
4
  class CommonSegment(Segment):
splat/segtypes/segment.py CHANGED
@@ -1,3 +1,5 @@
1
+ import collections
2
+ import dataclasses
1
3
  import importlib
2
4
  import importlib.util
3
5
  from pathlib import Path
@@ -67,6 +69,27 @@ def parse_segment_section_order(segment: Union[dict, list]) -> List[str]:
67
69
  return default
68
70
 
69
71
 
72
+ SegmentType = str
73
+
74
+
75
+ @dataclasses.dataclass
76
+ class SegmentStatisticsInfo:
77
+ size: int
78
+ count: int
79
+
80
+ def merge(self, other: "SegmentStatisticsInfo") -> "SegmentStatisticsInfo":
81
+ return SegmentStatisticsInfo(
82
+ size=self.size + other.size, count=self.count + other.count
83
+ )
84
+
85
+
86
+ SegmentStatistics = dict[SegmentType, SegmentStatisticsInfo]
87
+
88
+
89
+ def empty_statistics() -> SegmentStatistics:
90
+ return collections.defaultdict(lambda: SegmentStatisticsInfo(size=0, count=0))
91
+
92
+
70
93
  class Segment:
71
94
  require_unique_name = True
72
95
 
@@ -520,6 +543,17 @@ class Segment:
520
543
  else:
521
544
  return None
522
545
 
546
+ @property
547
+ def statistics(self) -> SegmentStatistics:
548
+ stats = empty_statistics()
549
+ if self.size is not None:
550
+ stats[self.statistics_type] = SegmentStatisticsInfo(size=self.size, count=1)
551
+ return stats
552
+
553
+ @property
554
+ def statistics_type(self) -> SegmentType:
555
+ return self.type
556
+
523
557
  @property
524
558
  def vram_end(self) -> Optional[int]:
525
559
  if self.vram_start is not None and self.size is not None:
splat/util/statistics.py CHANGED
@@ -24,15 +24,15 @@ class Statistics:
24
24
  self.seg_sizes[typ] = 0
25
25
  self.seg_sizes[typ] += 0 if size is None else size
26
26
 
27
- def count_split(self, typ: str):
27
+ def count_split(self, typ: str, count: int = 1):
28
28
  if typ not in self.seg_split:
29
29
  self.seg_split[typ] = 0
30
- self.seg_split[typ] += 1
30
+ self.seg_split[typ] += count
31
31
 
32
- def count_cached(self, typ: str):
32
+ def count_cached(self, typ: str, count: int = 1):
33
33
  if typ not in self.seg_cached:
34
34
  self.seg_cached[typ] = 0
35
- self.seg_cached[typ] += 1
35
+ self.seg_cached[typ] += count
36
36
 
37
37
  def print_statistics(self, total_size: int):
38
38
  unk_size = self.seg_sizes.get("unk", 0)
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: splat64
3
- Version: 0.32.0
3
+ Version: 0.32.2
4
4
  Summary: A binary splitting tool to assist with decompilation and modding projects
5
5
  Project-URL: Repository, https://github.com/ethteck/splat
6
6
  Project-URL: Issues, https://github.com/ethteck/splat/issues
@@ -26,6 +26,7 @@ License: MIT License
26
26
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27
27
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28
28
  SOFTWARE.
29
+ License-File: LICENSE
29
30
  Classifier: License :: OSI Approved :: MIT License
30
31
  Classifier: Programming Language :: Python :: 3
31
32
  Requires-Python: >=3.9
@@ -41,7 +42,7 @@ Requires-Dist: mypy; extra == 'dev'
41
42
  Requires-Dist: n64img>=0.3.3; extra == 'dev'
42
43
  Requires-Dist: pygfxd; extra == 'dev'
43
44
  Requires-Dist: rabbitizer<2.0.0,>=1.12.0; extra == 'dev'
44
- Requires-Dist: spimdisasm<2.0.0,>=1.31.0; extra == 'dev'
45
+ Requires-Dist: spimdisasm<2.0.0,>=1.32.0; extra == 'dev'
45
46
  Requires-Dist: types-colorama; extra == 'dev'
46
47
  Requires-Dist: types-pyyaml; extra == 'dev'
47
48
  Provides-Extra: mips
@@ -49,7 +50,7 @@ Requires-Dist: crunch64<1.0.0,>=0.5.1; extra == 'mips'
49
50
  Requires-Dist: n64img>=0.3.3; extra == 'mips'
50
51
  Requires-Dist: pygfxd; extra == 'mips'
51
52
  Requires-Dist: rabbitizer<2.0.0,>=1.12.0; extra == 'mips'
52
- Requires-Dist: spimdisasm<2.0.0,>=1.31.0; extra == 'mips'
53
+ Requires-Dist: spimdisasm<2.0.0,>=1.32.0; extra == 'mips'
53
54
  Description-Content-Type: text/markdown
54
55
 
55
56
  # splat
@@ -75,7 +76,7 @@ The brackets corresponds to the optional dependencies to install while installin
75
76
  If you use a `requirements.txt` file in your repository, then you can add this library with the following line:
76
77
 
77
78
  ```txt
78
- splat64[mips]>=0.32.0,<1.0.0
79
+ splat64[mips]>=0.32.2,<1.0.0
79
80
  ```
80
81
 
81
82
  ### Optional dependencies
@@ -1,4 +1,4 @@
1
- splat/__init__.py,sha256=s7UKbK2EKKRakorwkWyarL3p9JgerrDcbJLYTfv-ucg,291
1
+ splat/__init__.py,sha256=a-EuQ-1jQ9RLrnfrNmIp7R4dCc2ShUTZv0j4car-jHI,291
2
2
  splat/__main__.py,sha256=T333dHDgr-2HYYhtARnYMEjdECnYiNIKfcXDD99o22A,732
3
3
  splat/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  splat/disassembler/__init__.py,sha256=IubLMnm_F5cZ7WUPBfk1VJ7vdj6i1if5GG6RBvEoBEA,226
@@ -6,7 +6,7 @@ splat/disassembler/disassembler.py,sha256=2ynehZRz1P6UnaBk6DWRy4c3ynRnnWApMhf0K9
6
6
  splat/disassembler/disassembler_instance.py,sha256=09GW7QYoNolgE2wnO7ALngw_CxgF-mfyLiXBsyv22jA,916
7
7
  splat/disassembler/disassembler_section.py,sha256=J9jtplQVDVeGBmyEOcMpC3Hv3DyecqaNjlYc7zqEqDI,7459
8
8
  splat/disassembler/null_disassembler.py,sha256=jYuDMtfPiBifwz0H-ZHLMWtpGa19X_iLgy4K-dQhPYY,328
9
- splat/disassembler/spimdisasm_disassembler.py,sha256=WZf2Vtyq2P95Lc_D6TtKXSy8zMWmQLKdSkDyNhyWuEI,5685
9
+ splat/disassembler/spimdisasm_disassembler.py,sha256=Z3eLbmO1Q7uY9zdbFzGJH1zE1LgHSLRQWRwyYpNFuzQ,5685
10
10
  splat/platforms/__init__.py,sha256=qjqKi63k5N3DUdILNfuk6qpJJkVeAWpjAs36L97vvP4,100
11
11
  splat/platforms/n64.py,sha256=kgWr6nesGC0X-qVydmu8tSq48NbqVf9mF6EyqvUuoUM,421
12
12
  splat/platforms/ps2.py,sha256=QI_8Ve43LZeNqpuk8_CFxIqsNJpMTacRHXdZVh3iY6c,336
@@ -15,35 +15,35 @@ splat/platforms/psx.py,sha256=YxQERdOBr4p3ab9Wk80FNhVYi-uvmh7p_jeykSFp23M,40
15
15
  splat/scripts/__init__.py,sha256=OY0nHg6a7JB437Sb96qLbZ_7ByVsal1gStj35wJAI_Y,101
16
16
  splat/scripts/capy.py,sha256=svbOfLO34-QN3xLiBy9vk2RGs_To8TWMWEKBw6yx2xQ,3674
17
17
  splat/scripts/create_config.py,sha256=nFwIt1UWzlWE9C3i-2dGsVyGX2cuXzIqkp2kur2-pdE,7670
18
- splat/scripts/split.py,sha256=oY4gFTfEr7bHsO9-VatvBxv1gdGYQGag9fFXHqA6HjA,20604
18
+ splat/scripts/split.py,sha256=INZ8gwyv9ulSfrNYJuPykkg5BWWsYLnto6JVXXIiHG0,20704
19
19
  splat/segtypes/__init__.py,sha256=-upUw_4JGQtvyp6IfTMzOq_CK3xvVaT_0K0_EipHyOo,208
20
20
  splat/segtypes/linker_entry.py,sha256=m2qrZEZaRqsurUVlgo5rQt-4OZwDywK8hTqY1SoF2D8,24689
21
- splat/segtypes/segment.py,sha256=wTvx4AyL8jacHJ9PeqmqrvfCF8JOnCTOflVE7fLboM8,27902
21
+ splat/segtypes/segment.py,sha256=Ey4d4hxGWL4e8ZsxVRGXafP9GCFXB-3F6loaBFVDU-k,28764
22
22
  splat/segtypes/common/__init__.py,sha256=mnq0acScilSCCo6q2PvkDk0Or3V8qitA7I8QMVw8haI,631
23
23
  splat/segtypes/common/asm.py,sha256=_EfIbDOlQdmvAVqPq_Jxgp335zIxEPLnuQc96x9EyOY,1819
24
24
  splat/segtypes/common/asmtu.py,sha256=hrflvDGZ4BcVEA8CRkkIOlqt0tUCC4iNb4oclht2o6s,2274
25
- splat/segtypes/common/bin.py,sha256=3wBV6qe9xSXqq-WONylLM5UmFLa8xbU-N22atGyOYQk,1032
25
+ splat/segtypes/common/bin.py,sha256=6rxYRXTdAVEs3AFMgmhelOwOmKMg3bbkl-j4k4wqql4,1229
26
26
  splat/segtypes/common/bss.py,sha256=EIN8E7CfqwcWRMWb_JIbGBicu6VKREdIbvQZNBM-6sM,3037
27
27
  splat/segtypes/common/c.py,sha256=NWLc1ArOQ3t2xfIJj8I2AGzm8xNR9DPbb5Wgg9L1VNY,19755
28
28
  splat/segtypes/common/code.py,sha256=23VZJXNFi3PYq3xH269DlxjCiqasSQnMuxwQkh-1qXU,10629
29
- splat/segtypes/common/codesubsegment.py,sha256=hkwuTBjxhn3IeiEoO-FhSg5lsyj9rxkuOSdsFrj-hME,7029
29
+ splat/segtypes/common/codesubsegment.py,sha256=fRDFUu9RzBSMeHo_vsT0Ko1qoeLDq8kLaIX4asJGMa4,7015
30
30
  splat/segtypes/common/cpp.py,sha256=p-duowCt4czrmaWgj1LuFw5LGfdyB_uaeLTKVmH80Cg,180
31
- splat/segtypes/common/data.py,sha256=EvR2aXnRqIAMOKYZgBFt2WSxEZ5d52IB4gdRGkjLeeA,5513
31
+ splat/segtypes/common/data.py,sha256=ZR6ZVgAOWuKJOMpKAe4nK2ORH9oAjQ8uSszcTJaZ1j8,5997
32
32
  splat/segtypes/common/databin.py,sha256=ucbbsc_M1332KifjExuDsf1wqm4-GZAiLqOwwrUwUpQ,1194
33
33
  splat/segtypes/common/eh_frame.py,sha256=MzL373ej2E38leM47py3T5beLq2IolsYszLZM8PYS2Y,913
34
34
  splat/segtypes/common/gcc_except_table.py,sha256=-ZrQL5dCcRu7EPFFPgL8lIJwWL5FsEeeQoSUVfTkyIg,2112
35
- splat/segtypes/common/group.py,sha256=gTZUgBSlWPmjExdM-RS6T1-vv5hCVv-i10Ob1faxgbY,5634
35
+ splat/segtypes/common/group.py,sha256=DIDLeiOlpguIPatw8a9vHmvsQ2LXI-QWbFy_D7PhVgQ,5928
36
36
  splat/segtypes/common/hasm.py,sha256=HW6OADo-2D3Jln0q5KAoE8zUGOUiJAUEHqHOG4dRmw8,1130
37
37
  splat/segtypes/common/header.py,sha256=NspQdk-L69j9dOBzBtDKb7bc11Gwa0WDWIVCd2P4mfE,1257
38
38
  splat/segtypes/common/lib.py,sha256=WaJH0DH0B8iJvhYQWYBjThbNeEXz3Yh7E8ZyONe5JtQ,2349
39
39
  splat/segtypes/common/linker_offset.py,sha256=IaEXMXq62BS2g95I4lS0wax5Ehjfi3O3C-uSDUbMjvI,767
40
40
  splat/segtypes/common/pad.py,sha256=-7SaRgXrmGeOINKVV9v1c3e9jn8aVQknD8EVaEPcPrw,758
41
41
  splat/segtypes/common/rdata.py,sha256=ab2MFZVjlnD2p5nDVNroo3W9blaVJND2jN2PJPy6a_Y,142
42
- splat/segtypes/common/rodata.py,sha256=YLCRkEZB_EyUVU8-f8UNMRN8VDXtkXZdmVr7F-ToUqg,5691
42
+ splat/segtypes/common/rodata.py,sha256=sv-QCqKTQ2RNB5W0-BjiiSQhxB99pU0gEBFbd8e9SZo,6175
43
43
  splat/segtypes/common/rodatabin.py,sha256=uqp60QuwHwvlMwHq0nZrU3y3yYcHbv2twT0PIDp4NzM,1199
44
44
  splat/segtypes/common/sbss.py,sha256=blIEuVYie4qNEOYMmlSdltn5f4MvgJu3AV8vqVD8Nh4,131
45
45
  splat/segtypes/common/sdata.py,sha256=dnLzNSNtSyclLZiNUmFTv0e0BWN8glxB1km1MSRq6xY,136
46
- splat/segtypes/common/segment.py,sha256=gFPzEi0Jq0NGtL4xlblIlNZus7dHkxebLKkr6jhOkxs,81
46
+ splat/segtypes/common/segment.py,sha256=vVFyFjs-gS5qIWO8Pd0pMJYxboP-iBRKvxcDV8YxdYM,94
47
47
  splat/segtypes/common/textbin.py,sha256=6WXGaAPJhqFYamqoUPeSr2nq2M6Go3BxG1_s7UozEUA,4296
48
48
  splat/segtypes/n64/__init__.py,sha256=tf2yWlijeKmOp1OhEEL-aW88mU-mWQRC2lSjQ5Ww1eI,569
49
49
  splat/segtypes/n64/ci.py,sha256=An7wIHcoZ89KiGCKpCRbM7IrmDNYBidXT-6kjKn2vH0,2400
@@ -84,7 +84,7 @@ splat/util/options.py,sha256=XrOq83KPdNU-RjrIMx-G6jZ8-y0wtsnazuuqcSaSWeY,28061
84
84
  splat/util/palettes.py,sha256=d3KoZnwt-zunI9eNwb3txysXg4DY3xnF0O5aQRxM4so,2920
85
85
  splat/util/progress_bar.py,sha256=41VehpIFK1cphENaXV_Aq6_3mFx25eQ8V7Z51SKFPeM,166
86
86
  splat/util/relocs.py,sha256=cgQYSaAtNpLlUZQdhEfa7ZpI8i0HqoDhwB88QtFqdJs,4212
87
- splat/util/statistics.py,sha256=Y8XDVoupo_gy_Nm0VApd2kDZH3p4wQHWFaOACfwNpng,1866
87
+ splat/util/statistics.py,sha256=8C88vLW8q4Xd4i1Crz8X24NLoraLyKd0lw3ebbeonSo,1906
88
88
  splat/util/symbols.py,sha256=CMYn6dQDJJEx6bd6IHai8jnqkRwC3EkLdtvMJWz4AlM,29688
89
89
  splat/util/utils.py,sha256=EtuU2f7S3vI8kH9C9KaIpjANsUCUkoFz4VBNLWK9lQY,187
90
90
  splat/util/vram_classes.py,sha256=UH4rkugEwoec_-alJ4smNOcnU51G-V5OG7Pfsj47eaM,3491
@@ -93,8 +93,8 @@ splat/util/n64/find_code_length.py,sha256=uUoPoUORAjsAvH8oGqwnGvw6j8I_NnSrZtA-x9
93
93
  splat/util/n64/rominfo.py,sha256=U6TieblUAmxhZsn7u8nbjOKkbC6ygsC_7IiLLaOWwUE,14646
94
94
  splat/util/psx/__init__.py,sha256=kCCaR-KB1mNlIcXB4OuuSQ2zVLbWg_SnIZIUeyjeBBI,39
95
95
  splat/util/psx/psxexeinfo.py,sha256=MrxY28nes0uzpFmCz0o9JFbF8s1eQRQNOpC_82wsMVI,5725
96
- splat64-0.32.0.dist-info/METADATA,sha256=91ka7AhW5E0tUZs6oYiujZXFf8KJflCGREDZK_nwZE8,3808
97
- splat64-0.32.0.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
98
- splat64-0.32.0.dist-info/entry_points.txt,sha256=O7Xy-qNOHcI87-OQrWJ-OhRDws74SuwVb_4rtnp0eLo,52
99
- splat64-0.32.0.dist-info/licenses/LICENSE,sha256=97VMVzjG8yQvsf8NG2M9IFSbh7R8cifJnc6QK1cZqj8,1070
100
- splat64-0.32.0.dist-info/RECORD,,
96
+ splat64-0.32.2.dist-info/METADATA,sha256=yd7HFS__8mQ3lqO6kA14ZYdwImHBVTcQc0zdtOaGDYI,3830
97
+ splat64-0.32.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
98
+ splat64-0.32.2.dist-info/entry_points.txt,sha256=O7Xy-qNOHcI87-OQrWJ-OhRDws74SuwVb_4rtnp0eLo,52
99
+ splat64-0.32.2.dist-info/licenses/LICENSE,sha256=97VMVzjG8yQvsf8NG2M9IFSbh7R8cifJnc6QK1cZqj8,1070
100
+ splat64-0.32.2.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.26.3
2
+ Generator: hatchling 1.27.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any