trenchfoot 0.4.3__py3-none-any.whl → 0.4.5__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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "out_root": "/home/liam/projects/chiark/trenchfoot/packages/trenchfoot/scenarios",
3
- "preview_enabled": true,
3
+ "preview_enabled": false,
4
4
  "volumetric_requested": false,
5
5
  "volumetric_available": false,
6
6
  "mesh_characteristic_length": 0.3,
@@ -1216,18 +1216,30 @@ def make_ground_surface_plane(path_xy: List[Tuple[float,float]], width_top: floa
1216
1216
  return result
1217
1217
  else:
1218
1218
  # Open paths: ground forms annulus with extensions past trench endpoints.
1219
- # The outer ring (ground boundary) is extended, but the inner ring (trench
1220
- # opening) stays at its original position. This creates ground fill at the
1221
- # trench ends rather than extending the trench opening itself.
1219
+ # The inner ring (trench opening) uses offset polyline with miter junctions.
1220
+ # The outer ring (ground boundary) is a simple bounding rectangle to ensure
1221
+ # full ground coverage - using offset polyline here would create miter junctions
1222
+ # that "cut in" at corners, leaving gaps in the ground surface.
1222
1223
 
1223
1224
  # Inner boundary: trench opening at original position (not extended)
1224
1225
  L_inner, R_inner = _offset_polyline(path_xy, half_top)
1225
1226
  inner_ring = _ensure_ccw(_ring_from_LR(L_inner, R_inner))
1226
1227
 
1227
- # Outer boundary: offset by margin, extended at ends
1228
- L_outer, R_outer = _offset_polyline(path_xy, half_top + m)
1229
- L_outer_ext, R_outer_ext = _extend_polyline_ends(L_outer, R_outer, path_xy, m)
1230
- outer_ring = _ensure_ccw(_ring_from_LR(L_outer_ext, R_outer_ext))
1228
+ # Outer boundary: bounding rectangle around trench opening, expanded by margin.
1229
+ # This ensures the ground surface is rectangular and fully covers the area
1230
+ # around the trench, avoiding miter junction artifacts at corners.
1231
+ inner_ring_arr = np.array(inner_ring)
1232
+ x_min = inner_ring_arr[:, 0].min() - m
1233
+ x_max = inner_ring_arr[:, 0].max() + m
1234
+ y_min = inner_ring_arr[:, 1].min() - m
1235
+ y_max = inner_ring_arr[:, 1].max() + m
1236
+ outer_ring = np.array([
1237
+ [x_min, y_min],
1238
+ [x_max, y_min],
1239
+ [x_max, y_max],
1240
+ [x_min, y_max],
1241
+ ], dtype=float)
1242
+ outer_ring = _ensure_ccw(outer_ring)
1231
1243
 
1232
1244
  # Triangulate the annular region (leaves hole open)
1233
1245
  combined_xy, tris = _triangulate_annulus(outer_ring, inner_ring)
@@ -1328,6 +1340,58 @@ def _point_inside_trench(
1328
1340
  return abs(local_u) <= half_w
1329
1341
 
1330
1342
 
1343
+ def _is_beyond_trench_ends(
1344
+ x: float, y: float,
1345
+ path_xy: List[Tuple[float, float]],
1346
+ ) -> bool:
1347
+ """Check if a point is beyond the ends of an open trench path.
1348
+
1349
+ For open paths (not closed loops), points that project beyond the first
1350
+ or last vertex of the path are outside the trench void, even if their
1351
+ perpendicular distance would put them within the trench walls.
1352
+
1353
+ Returns True if the point is beyond either end of an open path.
1354
+ Returns False for closed paths (where there are no "ends").
1355
+ """
1356
+ if _is_path_closed(path_xy):
1357
+ return False # Closed paths have no ends to be beyond
1358
+
1359
+ P = np.array(path_xy, float)
1360
+ query = np.array([x, y], float)
1361
+
1362
+ # Check start of path (s=0)
1363
+ start = P[0]
1364
+ if len(P) > 1:
1365
+ # Tangent at start points in the direction of the path
1366
+ tangent_start = P[1] - P[0]
1367
+ tangent_start = tangent_start / (np.linalg.norm(tangent_start) + 1e-12)
1368
+ # Vector from start to query point
1369
+ to_query = query - start
1370
+ # Distance along tangent (negative means before the start)
1371
+ along_start = float(np.dot(to_query, tangent_start))
1372
+ # The trench has a vertical end wall at the start vertex.
1373
+ # Any point projecting before this wall is outside the trench.
1374
+ if along_start < 0:
1375
+ return True
1376
+
1377
+ # Check end of path (s=1)
1378
+ end = P[-1]
1379
+ if len(P) > 1:
1380
+ # Tangent at end points in the direction we came from
1381
+ tangent_end = P[-1] - P[-2]
1382
+ tangent_end = tangent_end / (np.linalg.norm(tangent_end) + 1e-12)
1383
+ # Vector from end to query point
1384
+ to_query = query - end
1385
+ # Distance along tangent (positive means past the end)
1386
+ along_end = float(np.dot(to_query, tangent_end))
1387
+ # The trench has a vertical end wall at the end vertex.
1388
+ # Any point projecting past this wall is outside the trench.
1389
+ if along_end > 0:
1390
+ return True
1391
+
1392
+ return False
1393
+
1394
+
1331
1395
  @dataclass
1332
1396
  class TruncationResult:
1333
1397
  """Result of computing pipe truncation."""
@@ -1393,6 +1457,11 @@ def _compute_pipe_truncation(
1393
1457
  if abs(local_u) + effective_radius > half_w:
1394
1458
  return False
1395
1459
 
1460
+ # Check trench end boundaries: for open trenches, pipe must not extend
1461
+ # beyond the vertical end walls at the start/end of the path
1462
+ if _is_beyond_trench_ends(x, y, path_xy):
1463
+ return False
1464
+
1396
1465
  return True
1397
1466
 
1398
1467
  def binary_search_boundary(t_inside: float, t_outside: float, tol: float = 0.001) -> float:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: trenchfoot
3
- Version: 0.4.3
3
+ Version: 0.4.5
4
4
  Summary: Synthetic trench scenario generator bundle (surfaces + volumetrics).
5
5
  Author: Liam Moore
6
6
  License-File: LICENSE
@@ -6,8 +6,8 @@ trenchfoot/gmsh_sloped_trench_mesher.py,sha256=D7EL6V0wkE6tvDARmm006yZE6KEzCl25O
6
6
  trenchfoot/plot_mesh.py,sha256=26dOlVfaM1WsUfr_sXVqA7axtY9qjY3WCNM7cUBTS7Q,3810
7
7
  trenchfoot/render_colors.py,sha256=CWMre6DYa2EyrCgZsEY0bv313WqEhQdr3CdPF1xI-40,1649
8
8
  trenchfoot/scene_spec_example.json,sha256=UcV25ku422UO0ZZPDrJwrT1zwmjoOIpnBdLuEdh-AZA,1028
9
- trenchfoot/trench_scene_generator_v3.py,sha256=ZWashBnNSWyv6Z_hh_zg8nngO4ySIuijgHtlCnqs0rY,75147
10
- trenchfoot/scenarios/SUMMARY.json,sha256=9bd-6Zi65TSplsJ4cZpUGY2zcPOGIqRp_RmbZ9P16Hc,6830
9
+ trenchfoot/trench_scene_generator_v3.py,sha256=Ct8DCQ1iur0Ia7RyYbmCKr525p3Od7zQhd2Of1KcwFM,77837
10
+ trenchfoot/scenarios/SUMMARY.json,sha256=BWcI0HA4DWG-XOsr3bVJZGK5VmNtxSaOG86kxihfmh0,6831
11
11
  trenchfoot/scenarios/S01_straight_vwalls/ground_truth_isosurface.html,sha256=SLPROqEefBB8OgmZSW6DBmJxuSDxVQhWTn9eG3q6QRU,5880178
12
12
  trenchfoot/scenarios/S01_straight_vwalls/metrics.json,sha256=WZsyUfDIcJW1FFHfNq1wF8zn0r-XL3jCrkmowV4OFwA,691
13
13
  trenchfoot/scenarios/S01_straight_vwalls/preview.png,sha256=adsx3-6oMu9WaixggXRhuXi_KM-q5s2RNSBLR_stq80,199624
@@ -16,56 +16,56 @@ trenchfoot/scenarios/S01_straight_vwalls/preview_side.png,sha256=zBqMghMiEAYvceP
16
16
  trenchfoot/scenarios/S01_straight_vwalls/preview_top.png,sha256=L0qGIFib1cAwSwJJ16cRtYSlPMOo4uQhNGt6OvM58XQ,39495
17
17
  trenchfoot/scenarios/S01_straight_vwalls/scene.json,sha256=kbHRC9zMVDGHbuLh2wRsvchfVfcbdDEVvxsMwHHBoHw,343
18
18
  trenchfoot/scenarios/S01_straight_vwalls/sdf_metadata.json,sha256=lo4IULejtQ0vg2rH8JDfRvB2WCxvUxM_N4JJjtBbU4Y,854
19
- trenchfoot/scenarios/S01_straight_vwalls/trench_scene.obj,sha256=g9cXh8VhbQJZWrUNJvHw90roxfRiuRkEWWxmWPtisd4,649
19
+ trenchfoot/scenarios/S01_straight_vwalls/trench_scene.obj,sha256=MexC92x_MwFzKjHnbt12TYrL-UAJCb2qpjap5O9UkWg,563
20
20
  trenchfoot/scenarios/S01_straight_vwalls/meshes/trench_scene_culled.obj,sha256=6-usCEpAfhhZcdCxAy7NcXrkBwv-mEh40A6zN50k0Jo,519
21
21
  trenchfoot/scenarios/S01_straight_vwalls/point_clouds/culled/resolution0p050.pth,sha256=w4AKFbud2V0NhAtudGXXheLynAq-NLxUFSPxLczK3T0,1352093
22
22
  trenchfoot/scenarios/S01_straight_vwalls/point_clouds/full/resolution0p050.pth,sha256=w4AKFbud2V0NhAtudGXXheLynAq-NLxUFSPxLczK3T0,1352093
23
23
  trenchfoot/scenarios/S01_straight_vwalls/volumetric/trench_volume.msh,sha256=mpKNhdAPEogyDQrE9IGTgg535ZBNYXiLpIcmvl6QYPA,15007
24
24
  trenchfoot/scenarios/S02_straight_slope_pipe/ground_truth_isosurface.html,sha256=vHMtovoUUkmSGVh150se7hJERRBILzGr0iZYaJ6R1pw,6321783
25
- trenchfoot/scenarios/S02_straight_slope_pipe/metrics.json,sha256=DB-jNM62lZQiSaAy5meyYL92qIsUyrpFW2s8XblPtZw,942
25
+ trenchfoot/scenarios/S02_straight_slope_pipe/metrics.json,sha256=g8qKCa5t5gGE3-P9PTjFUn-z2ka3lxyWoI_pGjfAc9Q,929
26
26
  trenchfoot/scenarios/S02_straight_slope_pipe/preview.png,sha256=Aj5XpJMSdRNqnrPzL4oe-d0RjLdFT2V7OFrrZxwlsx8,251134
27
27
  trenchfoot/scenarios/S02_straight_slope_pipe/preview_oblique.png,sha256=8gTOJkd63NtXRkHcS31Sun_ClXiufqsxFeTVrPcG1no,173774
28
28
  trenchfoot/scenarios/S02_straight_slope_pipe/preview_side.png,sha256=Zwft-WEogsjPGcaUl7-Xd4kRIjewlbJ9h52MjS0pXB4,56706
29
29
  trenchfoot/scenarios/S02_straight_slope_pipe/preview_top.png,sha256=Su71iVHxgWIVPaYde4qnMiBR_gXix1n9bCSgmiYkO6M,57538
30
30
  trenchfoot/scenarios/S02_straight_slope_pipe/scene.json,sha256=W1ApzLHEnHQn-7AdWxh2xiEinj6Yb7830sQXNxmmmDw,486
31
31
  trenchfoot/scenarios/S02_straight_slope_pipe/sdf_metadata.json,sha256=5zWHXErct6UJro-6PzkCJqENG8PNAABVHBIIPg5sJfE,1211
32
- trenchfoot/scenarios/S02_straight_slope_pipe/trench_scene.obj,sha256=omKinM35RiOV-Npmo6RqnoQw_Uj7wP-K0p13opSLpEw,333169
32
+ trenchfoot/scenarios/S02_straight_slope_pipe/trench_scene.obj,sha256=2FPl5hrUiE3WSW1vI2kkzhPpEshsyInEawOM2Ayk1pw,340328
33
33
  trenchfoot/scenarios/S02_straight_slope_pipe/meshes/trench_scene_culled.obj,sha256=OOiw80NuCBejzeN3MWAip9Haw8yQsLZEdlMQdDIgEMU,847
34
34
  trenchfoot/scenarios/S02_straight_slope_pipe/point_clouds/culled/resolution0p050.pth,sha256=Ug9hTIsm6iQKRs9cucXJyJpxpSvQ5f2GS1ytZmxi1mE,1623389
35
35
  trenchfoot/scenarios/S02_straight_slope_pipe/point_clouds/full/resolution0p050.pth,sha256=JgIRni8xWKtz2mm0gpSdmavGe-FF71mDervavM4Rqw8,1718877
36
36
  trenchfoot/scenarios/S02_straight_slope_pipe/volumetric/trench_volume.msh,sha256=kNFAqjr7dM-KX4JQV1u5GbHbWWFIfiEur1wV1fJCePA,47084
37
37
  trenchfoot/scenarios/S03_L_slope_two_pipes_box/ground_truth_isosurface.html,sha256=0kRp_SHowhOHCljQV7CYaI0ur1KOzUjjjIJSwMdMoOI,6791920
38
- trenchfoot/scenarios/S03_L_slope_two_pipes_box/metrics.json,sha256=d5fp32sI0QkbNjBJVMeRcD4cw6ZrB6QqrzSWMiRtH8Q,1111
38
+ trenchfoot/scenarios/S03_L_slope_two_pipes_box/metrics.json,sha256=K1A8yiazMdnH4QBPIdrl88Uhaei8LdEz9P-RWKmYAi0,1124
39
39
  trenchfoot/scenarios/S03_L_slope_two_pipes_box/preview.png,sha256=q0V_2HSLUl2ovWLc4INKV87aLVh3vzqabMyKr8XEWEg,224248
40
40
  trenchfoot/scenarios/S03_L_slope_two_pipes_box/preview_oblique.png,sha256=Nvp0hvmG9HvZgbiEgbbI3uJtCLNFgLdamh8p2dw3ucY,154869
41
41
  trenchfoot/scenarios/S03_L_slope_two_pipes_box/preview_side.png,sha256=57DnWIuV4p-7eguJVSshd0SZ0COy7Y2cedUMp_DrrjY,51284
42
42
  trenchfoot/scenarios/S03_L_slope_two_pipes_box/preview_top.png,sha256=rs-CMZwaNUl5xef85WEckQqm_UqNrGcfE39nofvsp0E,48235
43
43
  trenchfoot/scenarios/S03_L_slope_two_pipes_box/scene.json,sha256=72g4wMT8tWcLRDYyMoJXOK50PbpfC1DDt6VUYGZgFzM,941
44
44
  trenchfoot/scenarios/S03_L_slope_two_pipes_box/sdf_metadata.json,sha256=6ESVHVGuw_PJzIUD65bMoTLazbU8_a29zEUjmwaQYGo,1774
45
- trenchfoot/scenarios/S03_L_slope_two_pipes_box/trench_scene.obj,sha256=yKUkkqHSDMd0ywmUEP46TIfATmcRoeKDqH4x-nlkTVg,677447
45
+ trenchfoot/scenarios/S03_L_slope_two_pipes_box/trench_scene.obj,sha256=YZvY0bhO5vjCb5seQb7-SG9SbgqdyMCCM6Og95heFaE,676874
46
46
  trenchfoot/scenarios/S03_L_slope_two_pipes_box/meshes/trench_scene_culled.obj,sha256=At4lipowr_3MY1rxmcKa479F_mQ-jJDVQJe0yHTrFSc,1835
47
47
  trenchfoot/scenarios/S03_L_slope_two_pipes_box/point_clouds/culled/resolution0p050.pth,sha256=KqbuoZ1tUPDhlnDgmhd-7WBb92TABsEmOzEsB__KtlA,2456029
48
48
  trenchfoot/scenarios/S03_L_slope_two_pipes_box/point_clouds/full/resolution0p050.pth,sha256=4fXvfu0TMO9FJaoqYrW21SCGe3eKuSLkSUl9CdE14rw,2622685
49
49
  trenchfoot/scenarios/S03_L_slope_two_pipes_box/volumetric/trench_volume.msh,sha256=cPgHKHlzPPtWX8H1yaxAYsEgYba3fr2JjfPvgg2a000,87383
50
50
  trenchfoot/scenarios/S04_U_slope_multi_noise/ground_truth_isosurface.html,sha256=E7sa8dlDyICJBlnL9X2C8IEopEJzDMhHdLbW-WpoPFc,7184880
51
- trenchfoot/scenarios/S04_U_slope_multi_noise/metrics.json,sha256=QVKiwzfcRRWjW2-d1XHkctvEes3G8OGA6vUmwLVX1gU,1293
51
+ trenchfoot/scenarios/S04_U_slope_multi_noise/metrics.json,sha256=2o8LwqD4KKGwQC1oHs60i6aOP5nK2vOzLAVvGvQZ94w,1294
52
52
  trenchfoot/scenarios/S04_U_slope_multi_noise/preview.png,sha256=ZbLgrL0nRtUX1y77i7b3LCxw4w_j5Ivmmh0i2YzrBDs,238958
53
53
  trenchfoot/scenarios/S04_U_slope_multi_noise/preview_oblique.png,sha256=HKUWhUuuql2YZzqq4B5oDpQSCWy9RhuwY_JxVZ-bEbg,162693
54
54
  trenchfoot/scenarios/S04_U_slope_multi_noise/preview_side.png,sha256=S7n1ivuo1PFcMp_WuEEnJnCx2JMP5yiCCCYOFDzJtfY,77730
55
55
  trenchfoot/scenarios/S04_U_slope_multi_noise/preview_top.png,sha256=auLgGMvU1bRua43WrU-O2WelPy0TbPZZD7ALFIvqlqk,65419
56
56
  trenchfoot/scenarios/S04_U_slope_multi_noise/scene.json,sha256=jkUNZ_rHSjVajoj54o8KoeWzY3pFH97L5pdWiH_C75w,1119
57
57
  trenchfoot/scenarios/S04_U_slope_multi_noise/sdf_metadata.json,sha256=78CdQZwn01CBBfMr-4jUc3eOGNw9jxmWEmjwd7KvM6o,2234
58
- trenchfoot/scenarios/S04_U_slope_multi_noise/trench_scene.obj,sha256=ncMNawv9MeZBWbL24U7n4iqw_D5DAmP8zZ2I9rRyeQg,1211491
58
+ trenchfoot/scenarios/S04_U_slope_multi_noise/trench_scene.obj,sha256=er_f18snk8TQcboKdmlH2kOMAffR6S0BpliETvQT5iQ,1212223
59
59
  trenchfoot/scenarios/S04_U_slope_multi_noise/meshes/trench_scene_culled.obj,sha256=ykw_tzhXknXt3DbmSk3cBzbOL91Jm4zxjthp799YkWw,3206
60
60
  trenchfoot/scenarios/S04_U_slope_multi_noise/volumetric/trench_volume.msh,sha256=7KfGkJAlv19rzbaPhzbmy9UWo42Db_4VhAtisn6aMak,144623
61
61
  trenchfoot/scenarios/S05_wide_slope_pair/ground_truth_isosurface.html,sha256=MVKZHfrF2emDTNmpn7AhxqYUlcBXDUzY7_qSek2RpWg,6304070
62
- trenchfoot/scenarios/S05_wide_slope_pair/metrics.json,sha256=9ksX7RfFS0krZmBG6K-qOEHAVLqs589Vmtcji34CroA,1111
62
+ trenchfoot/scenarios/S05_wide_slope_pair/metrics.json,sha256=ejqAir1__oegf0jF_N6R3vyFfCjlzP-zF-qsulS4ln4,1109
63
63
  trenchfoot/scenarios/S05_wide_slope_pair/preview_oblique.png,sha256=S0MwfT2bC0T7AAUsqwDAIBxxRea6lHeYhQYrumwJfFU,139982
64
64
  trenchfoot/scenarios/S05_wide_slope_pair/preview_side.png,sha256=8hiJ5ZZZ6iqIdPakWsgWDPrJnEuU7Qqy-odjnR38ocM,67796
65
65
  trenchfoot/scenarios/S05_wide_slope_pair/preview_top.png,sha256=bDdjWwBN6QQfZ2kV71VbV_Q59nrPYAiUMh3ivRo4L9M,57737
66
66
  trenchfoot/scenarios/S05_wide_slope_pair/scene.json,sha256=jmNMzqR8m4DvR35325GH87FdYXRgVb5VuKu7ZwDovW0,1028
67
67
  trenchfoot/scenarios/S05_wide_slope_pair/sdf_metadata.json,sha256=PRaqys_akemKtlfTwhJBELx5erUHKarjHMgMvU5R4kc,1776
68
- trenchfoot/scenarios/S05_wide_slope_pair/trench_scene.obj,sha256=5LGCU4aPyHoDLzHXBFbOZlDSNMdZop2eVx6Xi2jI3Qs,694675
68
+ trenchfoot/scenarios/S05_wide_slope_pair/trench_scene.obj,sha256=udbLJuiOVA9VyNvZbWwmuTdgyXKmu2a_sLTGJDp61o0,693480
69
69
  trenchfoot/scenarios/S05_wide_slope_pair/volumetric/trench_volume.msh,sha256=pHrj2dJgpSklpxiHHThiZINJQWpUdvkfhUnVBpKASEM,123235
70
70
  trenchfoot/scenarios/S06_bumpy_wide_loop/ground_truth_isosurface.html,sha256=_p4-B7sg_lfvKzVwJyfg6ub5Nk_x-ekzmLUE2NxQvkQ,6600554
71
71
  trenchfoot/scenarios/S06_bumpy_wide_loop/metrics.json,sha256=CH9ubdgvXhEBX6hi0Hme8B2jMX_HVHQGyqh5w8a-veE,1220
@@ -85,8 +85,8 @@ trenchfoot/scenarios/S07_circular_well/scene.json,sha256=tLLEgEWNxARpvHXkgLNDRvm
85
85
  trenchfoot/scenarios/S07_circular_well/sdf_metadata.json,sha256=5_D_rA_CqWgg2uSgVlqWCO4zQg0Gg5NWUnXHtCERBUA,4776
86
86
  trenchfoot/scenarios/S07_circular_well/trench_scene.obj,sha256=PHsRceUTwRAc44sppI2HnCeWkqUPafS-LcTe_50rP84,1608845
87
87
  trenchfoot/scenarios/S07_circular_well/volumetric/trench_volume.msh,sha256=dqhtd3SFKj5RLT_BcWIIvVGCbAqvOx7RX25-K7NKX10,615212
88
- trenchfoot-0.4.3.dist-info/METADATA,sha256=Q1uoSprpp1KPEqt9WJSY02JwabLR19v4oXtJjmK4C50,5292
89
- trenchfoot-0.4.3.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
90
- trenchfoot-0.4.3.dist-info/entry_points.txt,sha256=5TejAGmc4GnNYLn7MhhLtSCNz9240RvzcNaetF4IHfg,119
91
- trenchfoot-0.4.3.dist-info/licenses/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
92
- trenchfoot-0.4.3.dist-info/RECORD,,
88
+ trenchfoot-0.4.5.dist-info/METADATA,sha256=u8rwlE8sWWjnjx5bU84gZuN88ppNvzv4GZ9BKpqRJGE,5292
89
+ trenchfoot-0.4.5.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
90
+ trenchfoot-0.4.5.dist-info/entry_points.txt,sha256=5TejAGmc4GnNYLn7MhhLtSCNz9240RvzcNaetF4IHfg,119
91
+ trenchfoot-0.4.5.dist-info/licenses/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
92
+ trenchfoot-0.4.5.dist-info/RECORD,,