patchworks 0.11.2__tar.gz → 0.11.3__tar.gz

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.
Files changed (80) hide show
  1. {patchworks-0.11.2 → patchworks-0.11.3}/PKG-INFO +1 -1
  2. {patchworks-0.11.2 → patchworks-0.11.3}/docs/guide/snakemake.md +6 -0
  3. patchworks-0.11.3/workflow/.snakemake/iocache/latest.pkl +0 -0
  4. {patchworks-0.11.2 → patchworks-0.11.3}/workflow/config/config.yaml +2 -0
  5. {patchworks-0.11.2 → patchworks-0.11.3}/workflow/scripts/prepare_tiles.py +5 -0
  6. patchworks-0.11.2/workflow/.snakemake/metadata/L3RtcC9wd193Zi9vdXQvbGFiZWxzLmRvbmU= +0 -1
  7. patchworks-0.11.2/workflow/.snakemake/metadata/L3RtcC9wd193Zi9vdXQvc2VnLzAuZG9uZQ== +0 -1
  8. patchworks-0.11.2/workflow/.snakemake/metadata/L3RtcC9wd193Zi9vdXQvc2VnLzEuZG9uZQ== +0 -1
  9. patchworks-0.11.2/workflow/.snakemake/metadata/L3RtcC9wd193Zi9vdXQvc2VnLzIuZG9uZQ== +0 -1
  10. patchworks-0.11.2/workflow/.snakemake/metadata/L3RtcC9wd193Zi9vdXQvc2VnLzMuZG9uZQ== +0 -1
  11. patchworks-0.11.2/workflow/.snakemake/metadata/L3RtcC9wd193Zi9vdXQvc2VnLzQuZG9uZQ== +0 -1
  12. patchworks-0.11.2/workflow/.snakemake/metadata/L3RtcC9wd193Zi9vdXQvc2VnLzUuZG9uZQ== +0 -1
  13. patchworks-0.11.2/workflow/.snakemake/metadata/L3RtcC9wd193Zi9vdXQvc2VnLzYuZG9uZQ== +0 -1
  14. patchworks-0.11.2/workflow/.snakemake/metadata/L3RtcC9wd193Zi9vdXQvc2VnLzcuZG9uZQ== +0 -1
  15. patchworks-0.11.2/workflow/.snakemake/metadata/L3RtcC9wd193Zi9vdXQvc3RhZ2UuemFycg== +0 -1
  16. patchworks-0.11.2/workflow/.snakemake/metadata/L3RtcC9wd193Zi9vdXQvdGlsZXMuanNvbg== +0 -1
  17. {patchworks-0.11.2 → patchworks-0.11.3}/.github/workflows/docs.yml +0 -0
  18. {patchworks-0.11.2 → patchworks-0.11.3}/.github/workflows/lint.yml +0 -0
  19. {patchworks-0.11.2 → patchworks-0.11.3}/.github/workflows/release.yml +0 -0
  20. {patchworks-0.11.2 → patchworks-0.11.3}/.gitignore +0 -0
  21. {patchworks-0.11.2 → patchworks-0.11.3}/.markdownlint-cli2.yaml +0 -0
  22. {patchworks-0.11.2 → patchworks-0.11.3}/README.md +0 -0
  23. {patchworks-0.11.2 → patchworks-0.11.3}/cliff.toml +0 -0
  24. {patchworks-0.11.2 → patchworks-0.11.3}/docs/api/chunks.md +0 -0
  25. {patchworks-0.11.2 → patchworks-0.11.3}/docs/api/cluster.md +0 -0
  26. {patchworks-0.11.2 → patchworks-0.11.3}/docs/api/io.md +0 -0
  27. {patchworks-0.11.2 → patchworks-0.11.3}/docs/api/merge_tile_labels.md +0 -0
  28. {patchworks-0.11.2 → patchworks-0.11.3}/docs/api/plugins/cellpose.md +0 -0
  29. {patchworks-0.11.2 → patchworks-0.11.3}/docs/api/plugins/napari.md +0 -0
  30. {patchworks-0.11.2 → patchworks-0.11.3}/docs/api/plugins/ome_zarr.md +0 -0
  31. {patchworks-0.11.2 → patchworks-0.11.3}/docs/api/relabel.md +0 -0
  32. {patchworks-0.11.2 → patchworks-0.11.3}/docs/api/tile_process.md +0 -0
  33. {patchworks-0.11.2 → patchworks-0.11.3}/docs/examples/cellpose_2d.md +0 -0
  34. {patchworks-0.11.2 → patchworks-0.11.3}/docs/examples/cellpose_2d.py +0 -0
  35. {patchworks-0.11.2 → patchworks-0.11.3}/docs/examples/cellpose_3d.md +0 -0
  36. {patchworks-0.11.2 → patchworks-0.11.3}/docs/examples/cellpose_3d.py +0 -0
  37. {patchworks-0.11.2 → patchworks-0.11.3}/docs/examples/custom.md +0 -0
  38. {patchworks-0.11.2 → patchworks-0.11.3}/docs/examples/custom_method.py +0 -0
  39. {patchworks-0.11.2 → patchworks-0.11.3}/docs/examples/standalone_merge.md +0 -0
  40. {patchworks-0.11.2 → patchworks-0.11.3}/docs/examples/stardist.md +0 -0
  41. {patchworks-0.11.2 → patchworks-0.11.3}/docs/examples/stardist_2d.py +0 -0
  42. {patchworks-0.11.2 → patchworks-0.11.3}/docs/getting_started.md +0 -0
  43. {patchworks-0.11.2 → patchworks-0.11.3}/docs/guide/gpu_distributed.md +0 -0
  44. {patchworks-0.11.2 → patchworks-0.11.3}/docs/guide/merging.md +0 -0
  45. {patchworks-0.11.2 → patchworks-0.11.3}/docs/guide/ome_zarr_napari.md +0 -0
  46. {patchworks-0.11.2 → patchworks-0.11.3}/docs/guide/performance.md +0 -0
  47. {patchworks-0.11.2 → patchworks-0.11.3}/docs/guide/pitfalls.md +0 -0
  48. {patchworks-0.11.2 → patchworks-0.11.3}/docs/guide/skip_empty.md +0 -0
  49. {patchworks-0.11.2 → patchworks-0.11.3}/docs/guide/tiling.md +0 -0
  50. {patchworks-0.11.2 → patchworks-0.11.3}/docs/index.md +0 -0
  51. {patchworks-0.11.2 → patchworks-0.11.3}/mkdocs.yml +0 -0
  52. {patchworks-0.11.2 → patchworks-0.11.3}/pyproject.toml +0 -0
  53. {patchworks-0.11.2 → patchworks-0.11.3}/src/patchworks/__init__.py +0 -0
  54. {patchworks-0.11.2 → patchworks-0.11.3}/src/patchworks/_chunks.py +0 -0
  55. {patchworks-0.11.2 → patchworks-0.11.3}/src/patchworks/_cluster.py +0 -0
  56. {patchworks-0.11.2 → patchworks-0.11.3}/src/patchworks/_core.py +0 -0
  57. {patchworks-0.11.2 → patchworks-0.11.3}/src/patchworks/_distributed.py +0 -0
  58. {patchworks-0.11.2 → patchworks-0.11.3}/src/patchworks/_io.py +0 -0
  59. {patchworks-0.11.2 → patchworks-0.11.3}/src/patchworks/_merge.py +0 -0
  60. {patchworks-0.11.2 → patchworks-0.11.3}/src/patchworks/_relabel.py +0 -0
  61. {patchworks-0.11.2 → patchworks-0.11.3}/src/patchworks/plugins/__init__.py +0 -0
  62. {patchworks-0.11.2 → patchworks-0.11.3}/src/patchworks/plugins/cellpose.py +0 -0
  63. {patchworks-0.11.2 → patchworks-0.11.3}/src/patchworks/plugins/napari.py +0 -0
  64. {patchworks-0.11.2 → patchworks-0.11.3}/src/patchworks/plugins/ome_zarr.py +0 -0
  65. {patchworks-0.11.2 → patchworks-0.11.3}/tests/test_core.py +0 -0
  66. {patchworks-0.11.2 → patchworks-0.11.3}/tests/test_distributed.py +0 -0
  67. {patchworks-0.11.2 → patchworks-0.11.3}/tests/test_napari.py +0 -0
  68. {patchworks-0.11.2 → patchworks-0.11.3}/tests/test_ome_zarr.py +0 -0
  69. {patchworks-0.11.2 → patchworks-0.11.3}/workflow/README.md +0 -0
  70. {patchworks-0.11.2 → patchworks-0.11.3}/workflow/Snakefile +0 -0
  71. {patchworks-0.11.2 → patchworks-0.11.3}/workflow/pixi.toml +0 -0
  72. {patchworks-0.11.2 → patchworks-0.11.3}/workflow/profile/slurm/config.yaml +0 -0
  73. {patchworks-0.11.2 → patchworks-0.11.3}/workflow/rules/common.smk +0 -0
  74. {patchworks-0.11.2 → patchworks-0.11.3}/workflow/rules/convert.smk +0 -0
  75. {patchworks-0.11.2 → patchworks-0.11.3}/workflow/rules/merge.smk +0 -0
  76. {patchworks-0.11.2 → patchworks-0.11.3}/workflow/rules/segment.smk +0 -0
  77. {patchworks-0.11.2 → patchworks-0.11.3}/workflow/scripts/_pw.py +0 -0
  78. {patchworks-0.11.2 → patchworks-0.11.3}/workflow/scripts/convert.py +0 -0
  79. {patchworks-0.11.2 → patchworks-0.11.3}/workflow/scripts/merge.py +0 -0
  80. {patchworks-0.11.2 → patchworks-0.11.3}/workflow/scripts/segment_tile.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: patchworks
3
- Version: 0.11.2
3
+ Version: 0.11.3
4
4
  Summary: Tiled processing of arbitrarily large images with globally consistent labels
5
5
  Project-URL: Homepage, https://github.com/imcf/patchworks
6
6
  Project-URL: Issues, https://github.com/imcf/patchworks/issues
@@ -56,6 +56,7 @@ shard: false # true → pack chunks into shards (fewer files)
56
56
  channel: 0 # channel to segment (null = keep all)
57
57
  level: 0 # pyramid level (0 = full resolution)
58
58
  tile_shape: "auto" # "auto", or e.g. [16, 1024, 1024] (zyx)
59
+ gpu_memory_gb: null # for "auto" on SLURM: your segment GPU's VRAM
59
60
  overlap: 30 # halo ≈ one object diameter
60
61
  skip_empty: true # skip background tiles
61
62
  empty_threshold: null # null → Otsu
@@ -81,6 +82,11 @@ sequential_labels: true # renumber labels to a contiguous 1..N
81
82
  more (faster) jobs; very large 3-D tiles are slow. Keep `do_3D: false` (2-D
82
83
  per slice) if your objects segment fine per slice — it is much faster.
83
84
 
85
+ Tile planning runs on a **CPU** node, which cannot see the segment GPU, so
86
+ it logs `GPU memory query failed … using 8 GiB default` and sizes tiles for
87
+ 8 GiB. Harmless, but to size for the real GPU set `gpu_memory_gb:` to its
88
+ VRAM (e.g. `24`, `40`, `80`) — or just set `tile_shape` explicitly.
89
+
84
90
  ## 4. Dry-run (always do this first)
85
91
 
86
92
  Check the plan without running anything:
@@ -22,6 +22,8 @@ shard: false # true → pack chunks into shards (zarr v3; fewer files)
22
22
  channel: 0 # channel to segment
23
23
  level: 0 # pyramid level to segment (0 = full res)
24
24
  tile_shape: "auto" # "auto", or e.g. [16, 1024, 1024] (zyx)
25
+ gpu_memory_gb: null # for "auto" on a CPU prepare node: your segment GPU's VRAM
26
+ # (e.g. 24, 40, 80). null → 8 GiB guess + a harmless warning
25
27
  overlap: 30 # halo (≈ one object diameter)
26
28
  skip_empty: true # skip background tiles
27
29
  empty_threshold: null # null → Otsu; or a number
@@ -20,12 +20,17 @@ image = open_image(work_dir, cfg["channel"], cfg["level"])
20
20
  ts = cfg.get("tile_shape", "auto")
21
21
  if ts == "auto":
22
22
  cp = cfg["cellpose"]
23
+ # prepare runs on a CPU node, so the segment GPU's VRAM can't be queried
24
+ # here; pass gpu_memory_gb from the config to size tiles for it (avoids the
25
+ # "GPU memory query failed" fallback). None => the built-in 8 GiB default.
26
+ gpu_gb = cfg.get("gpu_memory_gb")
23
27
  tile_shape = tuple(
24
28
  partial(
25
29
  auto_tile_shape_cellpose,
26
30
  do_3D=cp.get("do_3D", False),
27
31
  use_gpu=cp.get("gpu", True),
28
32
  diameter=cp.get("diameter"),
33
+ gpu_memory=int(gpu_gb * 1024**3) if gpu_gb else None,
29
34
  )(image.shape, image.dtype)
30
35
  )
31
36
  else:
@@ -1 +0,0 @@
1
- {"rule": "merge", "input": ["/tmp/pw_wf/out/seg/0.done", "/tmp/pw_wf/out/seg/1.done", "/tmp/pw_wf/out/seg/2.done", "/tmp/pw_wf/out/seg/3.done", "/tmp/pw_wf/out/seg/4.done", "/tmp/pw_wf/out/seg/5.done", "/tmp/pw_wf/out/seg/6.done", "/tmp/pw_wf/out/seg/7.done"], "log": [], "shellcmd": null, "params": [], "code": " \"../scripts/merge.py\"\n", "record_format_version": 6, "conda_env": null, "container_img_url": null, "software_stack_hash": "d41d8cd98f00b204e9800998ecf8427e", "job_hash": 8289946198395, "starttime": 1782306826.05809, "endtime": 1782306826.057891, "incomplete": false, "external_jobid": null, "input_checksums": {"/tmp/pw_wf/out/seg/0.done": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "/tmp/pw_wf/out/seg/1.done": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "/tmp/pw_wf/out/seg/2.done": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "/tmp/pw_wf/out/seg/3.done": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "/tmp/pw_wf/out/seg/4.done": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "/tmp/pw_wf/out/seg/5.done": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "/tmp/pw_wf/out/seg/6.done": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "/tmp/pw_wf/out/seg/7.done": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}}
@@ -1 +0,0 @@
1
- {"rule": "segment", "input": ["/tmp/pw_wf/out/image.zarr/zarr.json", "/tmp/pw_wf/out/stage.zarr", "/tmp/pw_wf/out/tiles.json"], "log": [], "shellcmd": null, "params": [], "code": " \"../scripts/segment_tile.py\"\n", "record_format_version": 6, "conda_env": null, "container_img_url": null, "software_stack_hash": "d41d8cd98f00b204e9800998ecf8427e", "job_hash": 8289938895482, "starttime": 1782306823.2564273, "endtime": 1782306823.255227, "incomplete": false, "external_jobid": null, "input_checksums": {"/tmp/pw_wf/out/tiles.json": "sha256:d5abe0a9301e6274b02cdae545a8b5e414d3b51c1396d18ae9bcb1ea935bfe67", "/tmp/pw_wf/out/image.zarr/zarr.json": "sha256:8baa9bb439818b6e4a5358464300e6239dae6fddb2b31fa26717a7c56eaf1458"}}
@@ -1 +0,0 @@
1
- {"rule": "segment", "input": ["/tmp/pw_wf/out/image.zarr/zarr.json", "/tmp/pw_wf/out/stage.zarr", "/tmp/pw_wf/out/tiles.json"], "log": [], "shellcmd": null, "params": [], "code": " \"../scripts/segment_tile.py\"\n", "record_format_version": 6, "conda_env": null, "container_img_url": null, "software_stack_hash": "d41d8cd98f00b204e9800998ecf8427e", "job_hash": 8289938895635, "starttime": 1782306823.2361996, "endtime": 1782306823.2352273, "incomplete": false, "external_jobid": null, "input_checksums": {"/tmp/pw_wf/out/tiles.json": "sha256:d5abe0a9301e6274b02cdae545a8b5e414d3b51c1396d18ae9bcb1ea935bfe67", "/tmp/pw_wf/out/image.zarr/zarr.json": "sha256:8baa9bb439818b6e4a5358464300e6239dae6fddb2b31fa26717a7c56eaf1458"}}
@@ -1 +0,0 @@
1
- {"rule": "segment", "input": ["/tmp/pw_wf/out/image.zarr/zarr.json", "/tmp/pw_wf/out/stage.zarr", "/tmp/pw_wf/out/tiles.json"], "log": [], "shellcmd": null, "params": [], "code": " \"../scripts/segment_tile.py\"\n", "record_format_version": 6, "conda_env": null, "container_img_url": null, "software_stack_hash": "d41d8cd98f00b204e9800998ecf8427e", "job_hash": 8289938895788, "starttime": 1782306820.7251186, "endtime": 1782306820.724245, "incomplete": false, "external_jobid": null, "input_checksums": {"/tmp/pw_wf/out/tiles.json": "sha256:d5abe0a9301e6274b02cdae545a8b5e414d3b51c1396d18ae9bcb1ea935bfe67", "/tmp/pw_wf/out/image.zarr/zarr.json": "sha256:8baa9bb439818b6e4a5358464300e6239dae6fddb2b31fa26717a7c56eaf1458"}}
@@ -1 +0,0 @@
1
- {"rule": "segment", "input": ["/tmp/pw_wf/out/image.zarr/zarr.json", "/tmp/pw_wf/out/stage.zarr", "/tmp/pw_wf/out/tiles.json"], "log": [], "shellcmd": null, "params": [], "code": " \"../scripts/segment_tile.py\"\n", "record_format_version": 6, "conda_env": null, "container_img_url": null, "software_stack_hash": "d41d8cd98f00b204e9800998ecf8427e", "job_hash": 8289938792521, "starttime": 1782306820.8450873, "endtime": 1782306820.8442442, "incomplete": false, "external_jobid": null, "input_checksums": {"/tmp/pw_wf/out/tiles.json": "sha256:d5abe0a9301e6274b02cdae545a8b5e414d3b51c1396d18ae9bcb1ea935bfe67", "/tmp/pw_wf/out/image.zarr/zarr.json": "sha256:8baa9bb439818b6e4a5358464300e6239dae6fddb2b31fa26717a7c56eaf1458"}}
@@ -1 +0,0 @@
1
- {"rule": "segment", "input": ["/tmp/pw_wf/out/image.zarr/zarr.json", "/tmp/pw_wf/out/stage.zarr", "/tmp/pw_wf/out/tiles.json"], "log": [], "shellcmd": null, "params": [], "code": " \"../scripts/segment_tile.py\"\n", "record_format_version": 6, "conda_env": null, "container_img_url": null, "software_stack_hash": "d41d8cd98f00b204e9800998ecf8427e", "job_hash": 8289938792674, "starttime": 1782306820.7828398, "endtime": 1782306820.7822447, "incomplete": false, "external_jobid": null, "input_checksums": {"/tmp/pw_wf/out/tiles.json": "sha256:d5abe0a9301e6274b02cdae545a8b5e414d3b51c1396d18ae9bcb1ea935bfe67", "/tmp/pw_wf/out/image.zarr/zarr.json": "sha256:8baa9bb439818b6e4a5358464300e6239dae6fddb2b31fa26717a7c56eaf1458"}}
@@ -1 +0,0 @@
1
- {"rule": "segment", "input": ["/tmp/pw_wf/out/image.zarr/zarr.json", "/tmp/pw_wf/out/stage.zarr", "/tmp/pw_wf/out/tiles.json"], "log": [], "shellcmd": null, "params": [], "code": " \"../scripts/segment_tile.py\"\n", "record_format_version": 6, "conda_env": null, "container_img_url": null, "software_stack_hash": "d41d8cd98f00b204e9800998ecf8427e", "job_hash": 8289938792827, "starttime": 1782306823.5588164, "endtime": 1782306823.558225, "incomplete": false, "external_jobid": null, "input_checksums": {"/tmp/pw_wf/out/tiles.json": "sha256:d5abe0a9301e6274b02cdae545a8b5e414d3b51c1396d18ae9bcb1ea935bfe67", "/tmp/pw_wf/out/image.zarr/zarr.json": "sha256:8baa9bb439818b6e4a5358464300e6239dae6fddb2b31fa26717a7c56eaf1458"}}
@@ -1 +0,0 @@
1
- {"rule": "segment", "input": ["/tmp/pw_wf/out/image.zarr/zarr.json", "/tmp/pw_wf/out/stage.zarr", "/tmp/pw_wf/out/tiles.json"], "log": [], "shellcmd": null, "params": [], "code": " \"../scripts/segment_tile.py\"\n", "record_format_version": 6, "conda_env": null, "container_img_url": null, "software_stack_hash": "d41d8cd98f00b204e9800998ecf8427e", "job_hash": 8289938792980, "starttime": 1782306823.0890763, "endtime": 1782306823.0882282, "incomplete": false, "external_jobid": null, "input_checksums": {"/tmp/pw_wf/out/tiles.json": "sha256:d5abe0a9301e6274b02cdae545a8b5e414d3b51c1396d18ae9bcb1ea935bfe67", "/tmp/pw_wf/out/image.zarr/zarr.json": "sha256:8baa9bb439818b6e4a5358464300e6239dae6fddb2b31fa26717a7c56eaf1458"}}
@@ -1 +0,0 @@
1
- {"rule": "segment", "input": ["/tmp/pw_wf/out/image.zarr/zarr.json", "/tmp/pw_wf/out/stage.zarr", "/tmp/pw_wf/out/tiles.json"], "log": [], "shellcmd": null, "params": [], "code": " \"../scripts/segment_tile.py\"\n", "record_format_version": 6, "conda_env": null, "container_img_url": null, "software_stack_hash": "d41d8cd98f00b204e9800998ecf8427e", "job_hash": 8289938793133, "starttime": 1782306821.0048127, "endtime": 1782306821.0042431, "incomplete": false, "external_jobid": null, "input_checksums": {"/tmp/pw_wf/out/tiles.json": "sha256:d5abe0a9301e6274b02cdae545a8b5e414d3b51c1396d18ae9bcb1ea935bfe67", "/tmp/pw_wf/out/image.zarr/zarr.json": "sha256:8baa9bb439818b6e4a5358464300e6239dae6fddb2b31fa26717a7c56eaf1458"}}
@@ -1 +0,0 @@
1
- {"rule": "prepare", "input": ["/tmp/pw_wf/out/image.zarr/zarr.json"], "log": [], "shellcmd": null, "params": [], "code": " \"../scripts/prepare_tiles.py\"\n", "record_format_version": 6, "conda_env": null, "container_img_url": null, "software_stack_hash": "d41d8cd98f00b204e9800998ecf8427e", "job_hash": 8289946375343, "starttime": 1782306818.2703326, "endtime": 1782306818.2701185, "incomplete": false, "external_jobid": null, "input_checksums": {"/tmp/pw_wf/out/image.zarr/zarr.json": "sha256:8baa9bb439818b6e4a5358464300e6239dae6fddb2b31fa26717a7c56eaf1458"}}
@@ -1 +0,0 @@
1
- {"rule": "prepare", "input": ["/tmp/pw_wf/out/image.zarr/zarr.json"], "log": [], "shellcmd": null, "params": [], "code": " \"../scripts/prepare_tiles.py\"\n", "record_format_version": 6, "conda_env": null, "container_img_url": null, "software_stack_hash": "d41d8cd98f00b204e9800998ecf8427e", "job_hash": 8289946375343, "starttime": 1782306818.2703326, "endtime": 1782306818.2692626, "incomplete": false, "external_jobid": null, "input_checksums": {"/tmp/pw_wf/out/image.zarr/zarr.json": "sha256:8baa9bb439818b6e4a5358464300e6239dae6fddb2b31fa26717a7c56eaf1458"}}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes