parsl 2023.6.5__py3-none-any.whl → 2023.6.12__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.
- parsl/addresses.py +2 -1
- parsl/configs/vineex_local.py +26 -0
- parsl/data_provider/data_manager.py +2 -1
- parsl/data_provider/files.py +1 -1
- parsl/dataflow/memoization.py +1 -1
- parsl/executors/taskvine/__init__.py +3 -0
- parsl/executors/taskvine/errors.py +22 -0
- parsl/executors/taskvine/exec_parsl_function.py +207 -0
- parsl/executors/taskvine/executor.py +1055 -0
- parsl/executors/workqueue/executor.py +4 -5
- parsl/launchers/base.py +17 -0
- parsl/launchers/launchers.py +1 -16
- parsl/monitoring/monitoring.py +19 -8
- parsl/providers/cluster_provider.py +2 -2
- parsl/providers/condor/condor.py +1 -1
- parsl/providers/kubernetes/kube.py +2 -1
- parsl/providers/slurm/slurm.py +1 -1
- parsl/tests/configs/taskvine_ex.py +11 -0
- parsl/tests/conftest.py +6 -6
- parsl/tests/scaling_tests/vineex_condor.py +10 -0
- parsl/tests/scaling_tests/vineex_local.py +10 -0
- parsl/tests/test_bash_apps/test_pipeline.py +2 -2
- parsl/tests/test_error_handling/test_retry_handler.py +1 -1
- parsl/utils.py +2 -2
- parsl/version.py +1 -1
- {parsl-2023.6.5.dist-info → parsl-2023.6.12.dist-info}/METADATA +2 -2
- {parsl-2023.6.5.dist-info → parsl-2023.6.12.dist-info}/RECORD +40 -32
- parsl/tests/configs/workqueue_blocks.py +0 -12
- /parsl/tests/{workqueue_tests → scaling_tests}/__init__.py +0 -0
- /parsl/tests/{workqueue_tests → scaling_tests}/htex_local.py +0 -0
- /parsl/tests/{workqueue_tests → scaling_tests}/local_threads.py +0 -0
- /parsl/tests/{workqueue_tests → scaling_tests}/test_scale.py +0 -0
- /parsl/tests/{workqueue_tests → scaling_tests}/wqex_condor.py +0 -0
- /parsl/tests/{workqueue_tests → scaling_tests}/wqex_local.py +0 -0
- {parsl-2023.6.5.data → parsl-2023.6.12.data}/scripts/exec_parsl_function.py +0 -0
- {parsl-2023.6.5.data → parsl-2023.6.12.data}/scripts/parsl_coprocess.py +0 -0
- {parsl-2023.6.5.data → parsl-2023.6.12.data}/scripts/process_worker_pool.py +0 -0
- {parsl-2023.6.5.dist-info → parsl-2023.6.12.dist-info}/LICENSE +0 -0
- {parsl-2023.6.5.dist-info → parsl-2023.6.12.dist-info}/WHEEL +0 -0
- {parsl-2023.6.5.dist-info → parsl-2023.6.12.dist-info}/entry_points.txt +0 -0
- {parsl-2023.6.5.dist-info → parsl-2023.6.12.dist-info}/top_level.txt +0 -0
@@ -122,8 +122,7 @@ class WorkQueueExecutor(BlockProviderExecutor, putils.RepresentationMixin):
|
|
122
122
|
In this case, environment variables can be used to influence the
|
123
123
|
choice of port, documented here:
|
124
124
|
https://ccl.cse.nd.edu/software/manuals/api/html/work__queue_8h.html#a21714a10bcdfcf5c3bd44a96f5dcbda6
|
125
|
-
|
126
|
-
Default: 0.
|
125
|
+
Default: WORK_QUEUE_DEFAULT_PORT.
|
127
126
|
|
128
127
|
env: dict{str}
|
129
128
|
Dictionary that contains the environmental variables that
|
@@ -179,7 +178,7 @@ class WorkQueueExecutor(BlockProviderExecutor, putils.RepresentationMixin):
|
|
179
178
|
invocations of an app have similar performance characteristics,
|
180
179
|
this will provide a reasonable set of categories automatically.
|
181
180
|
|
182
|
-
max_retries:
|
181
|
+
max_retries: int
|
183
182
|
Set the number of retries that Work Queue will make when a task
|
184
183
|
fails. This is distinct from Parsl level retries configured in
|
185
184
|
parsl.config.Config. Set to None to allow Work Queue to retry
|
@@ -234,7 +233,7 @@ class WorkQueueExecutor(BlockProviderExecutor, putils.RepresentationMixin):
|
|
234
233
|
autolabel: bool = False,
|
235
234
|
autolabel_window: int = 1,
|
236
235
|
autocategory: bool = True,
|
237
|
-
max_retries:
|
236
|
+
max_retries: int = 1,
|
238
237
|
init_command: str = "",
|
239
238
|
worker_options: str = "",
|
240
239
|
full_debug: bool = True,
|
@@ -261,7 +260,7 @@ class WorkQueueExecutor(BlockProviderExecutor, putils.RepresentationMixin):
|
|
261
260
|
self.storage_access = storage_access
|
262
261
|
self.use_cache = use_cache
|
263
262
|
self.working_dir = working_dir
|
264
|
-
self.registered_files = set()
|
263
|
+
self.registered_files: Set[str] = set()
|
265
264
|
self.full_debug = full_debug
|
266
265
|
self.source = True if pack else source
|
267
266
|
self.pack = pack
|
parsl/launchers/base.py
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
from abc import ABCMeta, abstractmethod
|
2
|
+
|
3
|
+
from parsl.utils import RepresentationMixin
|
4
|
+
|
5
|
+
|
6
|
+
class Launcher(RepresentationMixin, metaclass=ABCMeta):
|
7
|
+
"""Launchers are basically wrappers for user submitted scripts as they
|
8
|
+
are submitted to a specific execution resource.
|
9
|
+
"""
|
10
|
+
def __init__(self, debug: bool = True):
|
11
|
+
self.debug = debug
|
12
|
+
|
13
|
+
@abstractmethod
|
14
|
+
def __call__(self, command: str, tasks_per_node: int, nodes_per_block: int) -> str:
|
15
|
+
""" Wraps the command with the Launcher calls.
|
16
|
+
"""
|
17
|
+
pass
|
parsl/launchers/launchers.py
CHANGED
@@ -1,25 +1,10 @@
|
|
1
|
-
from abc import ABCMeta, abstractmethod
|
2
1
|
import logging
|
3
2
|
|
4
|
-
from parsl.
|
3
|
+
from parsl.launchers.base import Launcher
|
5
4
|
|
6
5
|
logger = logging.getLogger(__name__)
|
7
6
|
|
8
7
|
|
9
|
-
class Launcher(RepresentationMixin, metaclass=ABCMeta):
|
10
|
-
"""Launchers are basically wrappers for user submitted scripts as they
|
11
|
-
are submitted to a specific execution resource.
|
12
|
-
"""
|
13
|
-
def __init__(self, debug: bool = True):
|
14
|
-
self.debug = debug
|
15
|
-
|
16
|
-
@abstractmethod
|
17
|
-
def __call__(self, command: str, tasks_per_node: int, nodes_per_block: int) -> str:
|
18
|
-
""" Wraps the command with the Launcher calls.
|
19
|
-
"""
|
20
|
-
pass
|
21
|
-
|
22
|
-
|
23
8
|
class SimpleLauncher(Launcher):
|
24
9
|
""" Does no wrapping. Just returns the command as-is
|
25
10
|
"""
|
parsl/monitoring/monitoring.py
CHANGED
@@ -139,7 +139,7 @@ class MonitoringHub(RepresentationMixin):
|
|
139
139
|
self._dfk_channel = None # type: Any
|
140
140
|
|
141
141
|
if _db_manager_excepts:
|
142
|
-
raise
|
142
|
+
raise _db_manager_excepts
|
143
143
|
|
144
144
|
self.client_address = client_address
|
145
145
|
self.client_port_range = client_port_range
|
@@ -170,12 +170,23 @@ class MonitoringHub(RepresentationMixin):
|
|
170
170
|
self.logger.debug("Initializing ZMQ Pipes to client")
|
171
171
|
self.monitoring_hub_active = True
|
172
172
|
|
173
|
-
comm_q
|
174
|
-
|
175
|
-
|
176
|
-
self.
|
177
|
-
self.
|
178
|
-
|
173
|
+
comm_q: Queue[Union[Tuple[int, int], str]]
|
174
|
+
comm_q = SizedQueue(maxsize=10)
|
175
|
+
|
176
|
+
self.exception_q: Queue[Tuple[str, str]]
|
177
|
+
self.exception_q = SizedQueue(maxsize=10)
|
178
|
+
|
179
|
+
self.priority_msgs: Queue[Tuple[Any, int]]
|
180
|
+
self.priority_msgs = SizedQueue()
|
181
|
+
|
182
|
+
self.resource_msgs: Queue[AddressedMonitoringMessage]
|
183
|
+
self.resource_msgs = SizedQueue()
|
184
|
+
|
185
|
+
self.node_msgs: Queue[AddressedMonitoringMessage]
|
186
|
+
self.node_msgs = SizedQueue()
|
187
|
+
|
188
|
+
self.block_msgs: Queue[AddressedMonitoringMessage]
|
189
|
+
self.block_msgs = SizedQueue()
|
179
190
|
|
180
191
|
self.router_proc = ForkProcess(target=router_starter,
|
181
192
|
args=(comm_q, self.exception_q, self.priority_msgs, self.node_msgs, self.block_msgs, self.resource_msgs),
|
@@ -328,7 +339,7 @@ def filesystem_receiver(logdir: str, q: "queue.Queue[AddressedMonitoringMessage]
|
|
328
339
|
with open(full_path_filename, "rb") as f:
|
329
340
|
message = deserialize(f.read())
|
330
341
|
logger.info(f"Message received is: {message}")
|
331
|
-
assert
|
342
|
+
assert isinstance(message, tuple)
|
332
343
|
q.put(cast(AddressedMonitoringMessage, message))
|
333
344
|
os.remove(full_path_filename)
|
334
345
|
except Exception:
|
@@ -67,9 +67,9 @@ class ClusterProvider(ExecutionProvider):
|
|
67
67
|
self.walltime = walltime
|
68
68
|
self.cmd_timeout = cmd_timeout
|
69
69
|
if not callable(self.launcher):
|
70
|
-
raise
|
70
|
+
raise BadLauncher(self.launcher,
|
71
71
|
"Launcher for executor: {} is of type: {}. Expects a parsl.launcher.launcher.Launcher or callable".format(
|
72
|
-
label, type(self.launcher)))
|
72
|
+
label, type(self.launcher)))
|
73
73
|
|
74
74
|
self.script_dir = None
|
75
75
|
|
parsl/providers/condor/condor.py
CHANGED
@@ -8,6 +8,7 @@ from parsl.channels import LocalChannel
|
|
8
8
|
from parsl.providers.base import JobState, JobStatus
|
9
9
|
from parsl.utils import RepresentationMixin
|
10
10
|
from parsl.launchers import SingleNodeLauncher
|
11
|
+
from parsl.launchers.base import Launcher
|
11
12
|
from parsl.providers.condor.template import template_string
|
12
13
|
from parsl.providers.cluster_provider import ClusterProvider
|
13
14
|
from parsl.providers.errors import ScaleOutFailed
|
@@ -16,7 +17,6 @@ logger = logging.getLogger(__name__)
|
|
16
17
|
|
17
18
|
from typing import Dict, List, Optional
|
18
19
|
from parsl.channels.base import Channel
|
19
|
-
from parsl.launchers.launchers import Launcher
|
20
20
|
|
21
21
|
# See http://pages.cs.wisc.edu/~adesmet/status.html
|
22
22
|
translate_table = {
|
@@ -128,7 +128,8 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
|
|
128
128
|
self.kube_client = client.CoreV1Api()
|
129
129
|
|
130
130
|
# Dictionary that keeps track of jobs, keyed on job_id
|
131
|
-
self.resources
|
131
|
+
self.resources: Dict[object, Dict[str, Any]]
|
132
|
+
self.resources = {}
|
132
133
|
|
133
134
|
def submit(self, cmd_string, tasks_per_node, job_name="parsl"):
|
134
135
|
""" Submit a job
|
parsl/providers/slurm/slurm.py
CHANGED
@@ -10,7 +10,7 @@ from typing import Optional
|
|
10
10
|
from parsl.channels import LocalChannel
|
11
11
|
from parsl.channels.base import Channel
|
12
12
|
from parsl.launchers import SingleNodeLauncher
|
13
|
-
from parsl.launchers.
|
13
|
+
from parsl.launchers.base import Launcher
|
14
14
|
from parsl.providers.cluster_provider import ClusterProvider
|
15
15
|
from parsl.providers.base import JobState, JobStatus
|
16
16
|
from parsl.providers.slurm.template import template_string
|
@@ -0,0 +1,11 @@
|
|
1
|
+
from parsl.config import Config
|
2
|
+
from parsl.executors.taskvine import TaskVineExecutor
|
3
|
+
|
4
|
+
from parsl.data_provider.http import HTTPInTaskStaging
|
5
|
+
from parsl.data_provider.ftp import FTPInTaskStaging
|
6
|
+
from parsl.data_provider.file_noop import NoOpFileStaging
|
7
|
+
|
8
|
+
|
9
|
+
def fresh_config():
|
10
|
+
return Config(executors=[TaskVineExecutor(port=9000,
|
11
|
+
storage_access=[FTPInTaskStaging(), HTTPInTaskStaging(), NoOpFileStaging()])])
|
parsl/tests/conftest.py
CHANGED
@@ -124,7 +124,7 @@ def load_dfk_session(request, pytestconfig):
|
|
124
124
|
|
125
125
|
yield
|
126
126
|
|
127
|
-
if
|
127
|
+
if parsl.dfk() != dfk:
|
128
128
|
raise RuntimeError("DFK changed unexpectedly during test")
|
129
129
|
dfk.cleanup()
|
130
130
|
parsl.clear()
|
@@ -158,16 +158,16 @@ def load_dfk_local_module(request, pytestconfig):
|
|
158
158
|
assert isinstance(c, parsl.Config)
|
159
159
|
dfk = parsl.load(c)
|
160
160
|
|
161
|
-
if
|
161
|
+
if callable(local_setup):
|
162
162
|
local_setup()
|
163
163
|
|
164
164
|
yield
|
165
165
|
|
166
|
-
if
|
166
|
+
if callable(local_teardown):
|
167
167
|
local_teardown()
|
168
168
|
|
169
|
-
if
|
170
|
-
if
|
169
|
+
if local_config:
|
170
|
+
if parsl.dfk() != dfk:
|
171
171
|
raise RuntimeError("DFK changed unexpectedly during test")
|
172
172
|
dfk.cleanup()
|
173
173
|
parsl.clear()
|
@@ -271,7 +271,7 @@ def pytest_ignore_collect(path):
|
|
271
271
|
return True
|
272
272
|
elif 'manual_tests' in path.strpath:
|
273
273
|
return True
|
274
|
-
elif '
|
274
|
+
elif 'scaling_tests/test_scale' in path.strpath:
|
275
275
|
return True
|
276
276
|
else:
|
277
277
|
return False
|
@@ -52,7 +52,7 @@ def test_increment(depth=5):
|
|
52
52
|
futs = {}
|
53
53
|
for i in range(1, depth):
|
54
54
|
print("Launching {0} with {1}".format(i, prev))
|
55
|
-
assert
|
55
|
+
assert isinstance(prev, DataFuture) or isinstance(prev, File)
|
56
56
|
output = File("test{0}.txt".format(i))
|
57
57
|
fu = increment(inputs=[prev], # Depend on the future from previous call
|
58
58
|
# Name the file to be created here
|
@@ -62,7 +62,7 @@ def test_increment(depth=5):
|
|
62
62
|
[prev] = fu.outputs
|
63
63
|
futs[i] = prev
|
64
64
|
print(prev.filepath)
|
65
|
-
assert
|
65
|
+
assert isinstance(prev, DataFuture)
|
66
66
|
|
67
67
|
for key in futs:
|
68
68
|
if key > 0:
|
parsl/utils.py
CHANGED
@@ -55,7 +55,7 @@ def get_all_checkpoints(rundir: str = "runinfo") -> List[str]:
|
|
55
55
|
|
56
56
|
"""
|
57
57
|
|
58
|
-
if
|
58
|
+
if not os.path.isdir(rundir):
|
59
59
|
return []
|
60
60
|
|
61
61
|
dirs = sorted(os.listdir(rundir))
|
@@ -99,7 +99,7 @@ def get_last_checkpoint(rundir: str = "runinfo") -> List[str]:
|
|
99
99
|
last_runid = dirs[-1]
|
100
100
|
last_checkpoint = os.path.abspath(f'{rundir}/{last_runid}/checkpoint')
|
101
101
|
|
102
|
-
if
|
102
|
+
if not os.path.isdir(last_checkpoint):
|
103
103
|
return []
|
104
104
|
|
105
105
|
return [last_checkpoint]
|
parsl/version.py
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: parsl
|
3
|
-
Version: 2023.6.
|
3
|
+
Version: 2023.6.12
|
4
4
|
Summary: Simple data dependent workflows in Python
|
5
5
|
Home-page: https://github.com/Parsl/parsl
|
6
|
-
Download-URL: https://github.com/Parsl/parsl/archive/2023.06.
|
6
|
+
Download-URL: https://github.com/Parsl/parsl/archive/2023.06.12.tar.gz
|
7
7
|
Author: The Parsl Team
|
8
8
|
Author-email: parsl@googlegroups.com
|
9
9
|
License: Apache 2.0
|
@@ -1,13 +1,13 @@
|
|
1
1
|
parsl/__init__.py,sha256=DNTVMq4NzT0L1EYdXkb2Eac8sJk2_V1NSZubly-s8gs,1794
|
2
|
-
parsl/addresses.py,sha256=
|
2
|
+
parsl/addresses.py,sha256=Qp48xs39z55hsNaCihH7W1i2K6gOSd3Pcj7ZDQyl3ak,3886
|
3
3
|
parsl/config.py,sha256=T916fJWEQ2GGiDUv83QiM8mUnxc8pt6-VEwfyt2sV1k,6623
|
4
4
|
parsl/errors.py,sha256=ySR8ClOEf3aJZVS46IkpM8m5n-9O1zbGcEt8lPhJKlA,763
|
5
5
|
parsl/log_utils.py,sha256=AGem-dhQs5TYUyJg6GKkRuHxAw8FHhYlWB_0s7_ROw4,3175
|
6
6
|
parsl/multiprocessing.py,sha256=uY64wcQmWt2rgylQm4lmr3HE8AxwFGeQQj4l1jKnnrY,1970
|
7
7
|
parsl/process_loggers.py,sha256=1G3Rfrh5wuZNo2X03grG4kTYPGOxz7hHCyG6L_A3b0A,1137
|
8
8
|
parsl/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
9
|
-
parsl/utils.py,sha256=
|
10
|
-
parsl/version.py,sha256=
|
9
|
+
parsl/utils.py,sha256=I4sBv2y7zPh6I6IeGNMJUH7k-y4fCUxquqLJhBGNxEU,10882
|
10
|
+
parsl/version.py,sha256=YyyRLJpY-_zVmV_eJ9sxuH7Bd0bsC8e9c5TJEy3ceg8,131
|
11
11
|
parsl/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
12
12
|
parsl/app/app.py,sha256=e_7h07nsHJlqF33yZwrmbUzizaSTU-9KKuHtcwQSUx0,7760
|
13
13
|
parsl/app/bash.py,sha256=Kqkss4dhWB6Mid2aax4CswZ_1nAqolIUGJo6mbTW7cQ,5421
|
@@ -52,11 +52,12 @@ parsl/configs/stampede2.py,sha256=vr8MYCqt3gYPZXpMy21L4tcdwUmIcHGv5uDbSjcMXdc,12
|
|
52
52
|
parsl/configs/summit.py,sha256=kssMiF_vYwpMxF4CYlr9jbL-Vz4zOekNCPryinCEef0,1079
|
53
53
|
parsl/configs/theta.py,sha256=t_Ih7Rq3y1wo2kuWb9ZwKZAtKiY6gUtGQHv9TPFlQHc,1148
|
54
54
|
parsl/configs/toss3_llnl.py,sha256=9VAqKpDvwTSlvDXFw2gSI9ViVv0jJbr1cPBTnCGZlp4,998
|
55
|
+
parsl/configs/vineex_local.py,sha256=qxFwziLgBDQuGMetuLlmrZbz4Cvs5wBwdnsi1_RWv6k,837
|
55
56
|
parsl/configs/wqex_local.py,sha256=QocsrCKR94agZndabH7vX3NTGLqx_y126Wgmo-17xNs,794
|
56
57
|
parsl/data_provider/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
57
|
-
parsl/data_provider/data_manager.py,sha256=
|
58
|
+
parsl/data_provider/data_manager.py,sha256=ih_IUVb5mzW2TTpvt5mRCX7c_HEGx4wtoU9PVfxGhTg,7250
|
58
59
|
parsl/data_provider/file_noop.py,sha256=Swv2iDQZQX_1HRaYKz22BSOeXvq5PxujuS80zdBlrSA,499
|
59
|
-
parsl/data_provider/files.py,sha256=
|
60
|
+
parsl/data_provider/files.py,sha256=Pq7hHhkxx2zu77p2S981bKMHx0mIwnSbbhtStH0vPgo,3206
|
60
61
|
parsl/data_provider/ftp.py,sha256=kpQ82GmPOQVuZu_SLT-RkqUXhQBFzZN5puVk0daeGF4,2759
|
61
62
|
parsl/data_provider/globus.py,sha256=5r8AsCCt6g1xr9vvsC_Is9ICei4hKwebF09WkFnwyFE,12269
|
62
63
|
parsl/data_provider/http.py,sha256=nDHTW7XmJqAukWJjPRQjyhUXt8r6GsQ36mX9mv_wOig,2986
|
@@ -69,7 +70,7 @@ parsl/dataflow/executor_status.py,sha256=7LuX1BNimybA99a9AISfFJWAmLqT0CrNwXczcYB
|
|
69
70
|
parsl/dataflow/futures.py,sha256=AP0b7DD6dEACN8ejhVKwKiPO7e2q-xift2JjmJur5ao,4130
|
70
71
|
parsl/dataflow/job_error_handler.py,sha256=nwcT7xHRAoXOd8-b6cdkgY6Rizv7juuOnFNxRfr3T3o,1875
|
71
72
|
parsl/dataflow/job_status_poller.py,sha256=8puCf1NuuwhuBv_WJjnrJjI4Dogr-lzTP4Vns9cc2_o,4942
|
72
|
-
parsl/dataflow/memoization.py,sha256=
|
73
|
+
parsl/dataflow/memoization.py,sha256=kvkN4wY7bZMxCjSAwnIFFgq4Q9bh088bLiud3Ir__cs,9702
|
73
74
|
parsl/dataflow/rundirs.py,sha256=XKmBZpBEIsGACBhYOkbbs2e5edC0pQegJcSlk4FWeag,1154
|
74
75
|
parsl/dataflow/states.py,sha256=hV6mfv-y4A6xrujeQglcomnfEs7y3Xm2g6JFwC6dvgQ,2612
|
75
76
|
parsl/dataflow/strategy.py,sha256=-H8WbpSRgNLcYLUK6m-zhTjzK1_toeyFZ_R--qtKiyk,12556
|
@@ -96,19 +97,24 @@ parsl/executors/high_throughput/monitoring_info.py,sha256=3gQpwQjjNDEBz0cQqJZB6h
|
|
96
97
|
parsl/executors/high_throughput/probe.py,sha256=lvnuf-vBv57tHvFh-J51F9sDYBES7jCgs6KYgWvmKRs,2749
|
97
98
|
parsl/executors/high_throughput/process_worker_pool.py,sha256=ToMA-MBZurkcgn4m-H-ckE1-F9ubwCwjHHfhm-LMB5c,33011
|
98
99
|
parsl/executors/high_throughput/zmq_pipes.py,sha256=yTURJSHGY-n1rI5OfzJbcTa1Ji7jiY8nuisqBWgpEZw,5720
|
100
|
+
parsl/executors/taskvine/__init__.py,sha256=CD_JMWUfpyJtmtZzYGQ8TtUHir4WtDyXIDxViBnAyC0,95
|
101
|
+
parsl/executors/taskvine/errors.py,sha256=Zq5FQsnHqjjiT10JDVxvE0g3CwMjzy9qbIPwQUuqD_c,466
|
102
|
+
parsl/executors/taskvine/exec_parsl_function.py,sha256=kYJmpgsswNMqV2-_dOmtgZHhb9OuKMvB-UwaNO2A2z0,7759
|
103
|
+
parsl/executors/taskvine/executor.py,sha256=LDa1hXtuA-X4kbRe_23y8eUnickxjghGR9KSqQKmcLg,48948
|
99
104
|
parsl/executors/workqueue/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
100
105
|
parsl/executors/workqueue/errors.py,sha256=cViEm971bK2UVlDk4PUsSJd692aka9dgwwRbI3nypIs,471
|
101
106
|
parsl/executors/workqueue/exec_parsl_function.py,sha256=kYJmpgsswNMqV2-_dOmtgZHhb9OuKMvB-UwaNO2A2z0,7759
|
102
|
-
parsl/executors/workqueue/executor.py,sha256=
|
107
|
+
parsl/executors/workqueue/executor.py,sha256=NxR89IwQ8bHSDOd0JH5KI9TW_oCtpBdErBIx9nGqgrI,48130
|
103
108
|
parsl/executors/workqueue/parsl_coprocess.py,sha256=o2hnOQZV1WzLmz9FtKbBQWPZfUcwHCTUMhxneR9IJUE,5514
|
104
109
|
parsl/executors/workqueue/parsl_coprocess_stub.py,sha256=_bJmpPIgL42qM6bVzeEKt1Mn1trSP41rtJguXxPGfHI,735
|
105
110
|
parsl/launchers/__init__.py,sha256=k8zAB3IBP-brfqXUptKwGkvsIRaXjAJZNBJa2XVtY1A,546
|
111
|
+
parsl/launchers/base.py,sha256=CblcvPTJiu-MNLWaRtFe29SZQ0BpTOlaY8CGcHdlHIE,538
|
106
112
|
parsl/launchers/errors.py,sha256=TtwJXGNjGOOcnAr3jL1OkrHeT3KuaGASgoC2oxx9hR4,409
|
107
|
-
parsl/launchers/launchers.py,sha256=
|
113
|
+
parsl/launchers/launchers.py,sha256=t9nuX38GMlAUPHs0aksnMd_5jI59IcqwlUD667w1cu4,15358
|
108
114
|
parsl/monitoring/__init__.py,sha256=0ywNz6i0lM1xo_7_BIxhETDGeVd2C_0wwD7qgeaMR4c,83
|
109
115
|
parsl/monitoring/db_manager.py,sha256=Vau1cWuSy-s0SCVkOf8ppts0p4AkioOWG9zK1Cv6li0,36233
|
110
116
|
parsl/monitoring/message_type.py,sha256=Khn88afNxcOIciKiCK4GLnn90I5BlRTiOL3zK-P07yQ,401
|
111
|
-
parsl/monitoring/monitoring.py,sha256=
|
117
|
+
parsl/monitoring/monitoring.py,sha256=d4EWEikdxjUoPAfjNFe1Io3DvBkmDk9WM1roL3aL9lc,23396
|
112
118
|
parsl/monitoring/radios.py,sha256=T2_6QuUjC-dd_7qMnIk6WHQead1iWz7m_P6ZC4QAqdA,5265
|
113
119
|
parsl/monitoring/remote.py,sha256=bQedanIJe-OCvLIDtKlgsjslNe1YJia0Psdi8MDnmQE,13172
|
114
120
|
parsl/monitoring/types.py,sha256=SO6Fjjbb83sv_MtbutoxGssiWh6oXKkEEsD4EvwOnZ4,629
|
@@ -137,7 +143,7 @@ parsl/monitoring/visualization/templates/workflow.html,sha256=QCSHAPHK_2C3gNcZ3N
|
|
137
143
|
parsl/monitoring/visualization/templates/workflows_summary.html,sha256=7brKKNsxcT4z-l10BKJlgTxQtGL033ZS5jEDdSmsPEE,891
|
138
144
|
parsl/providers/__init__.py,sha256=jd-1_vd-HtWYDHzwO30lNW5GMw6nfeTyNn3tI8CG7L4,1207
|
139
145
|
parsl/providers/base.py,sha256=WOcjcTZEGAc3uFWivZymJQUymT2gUbs52SKViJqMolQ,9390
|
140
|
-
parsl/providers/cluster_provider.py,sha256=
|
146
|
+
parsl/providers/cluster_provider.py,sha256=Qk6egBfZFJHBU06oYFg1isRNTRBvO1rgfipcnQHW1TE,4847
|
141
147
|
parsl/providers/errors.py,sha256=0Q0LaujNpTCwSyowOzrVxrN3CDzh9L5ciXcsDXkKhSY,2228
|
142
148
|
parsl/providers/ad_hoc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
143
149
|
parsl/providers/ad_hoc/ad_hoc.py,sha256=1R5bREmnIQjuS08g-M8_ievMZBPiDG27PTZNjXFp99Y,8273
|
@@ -151,7 +157,7 @@ parsl/providers/cobalt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
|
|
151
157
|
parsl/providers/cobalt/cobalt.py,sha256=AIQul3Lc5QsNh7EnRB8jSMnp3AxvZdEzzNyB0twnbAc,8223
|
152
158
|
parsl/providers/cobalt/template.py,sha256=a7fIkMLrYZ6uHgOPQgp8YPJA8f7SgxloFdEx51OJvuY,273
|
153
159
|
parsl/providers/condor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
154
|
-
parsl/providers/condor/condor.py,sha256=
|
160
|
+
parsl/providers/condor/condor.py,sha256=0dFxaqTegcUb7e8MJJxtyNKwoHsN6fQR4YwMYx9LWm0,13178
|
155
161
|
parsl/providers/condor/template.py,sha256=Jm2ezWo7ERMNPFvjLLEriaP5n5kD0vQBnikn9kpUTdU,960
|
156
162
|
parsl/providers/googlecloud/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
157
163
|
parsl/providers/googlecloud/googlecloud.py,sha256=iyMsyeQiVBI29yf40lb7q4yo8RaTCaTHJSkDkqCocS4,8009
|
@@ -159,7 +165,7 @@ parsl/providers/grid_engine/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMp
|
|
159
165
|
parsl/providers/grid_engine/grid_engine.py,sha256=kvWB_GCeZ7FLKfqyToPnP-PyQ9LD8s-ueMimZe5gImQ,8621
|
160
166
|
parsl/providers/grid_engine/template.py,sha256=a7iViKr8LXcFTPmsf_qQeVK5o_RekOAIlUOF0X1q-2M,273
|
161
167
|
parsl/providers/kubernetes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
162
|
-
parsl/providers/kubernetes/kube.py,sha256=
|
168
|
+
parsl/providers/kubernetes/kube.py,sha256=RHgTzoVBb8PpBDOgEhrXg98dORy6STp_4ZFzS9JsZEA,12790
|
163
169
|
parsl/providers/kubernetes/template.py,sha256=VsRz6cmNaII-y4OdMT6sCwzQy95SJX6NMB0hmmFBhX4,50
|
164
170
|
parsl/providers/local/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
165
171
|
parsl/providers/local/local.py,sha256=VC0nDh0cwuhXfA6ysk5SRg3wtXw9lmrH51J2RXsllJ4,11348
|
@@ -170,7 +176,7 @@ parsl/providers/pbspro/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
|
|
170
176
|
parsl/providers/pbspro/pbspro.py,sha256=XIZK1YkYqwq4rws_2lm43yamdXDnxfoGfCFIxOhMh2Q,7792
|
171
177
|
parsl/providers/pbspro/template.py,sha256=ozMbrx0HNsLnSoWbkZhy-55yJoTX5gpdRrDuVn6TFWA,369
|
172
178
|
parsl/providers/slurm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
173
|
-
parsl/providers/slurm/slurm.py,sha256=
|
179
|
+
parsl/providers/slurm/slurm.py,sha256=xvWSG2lh7D8JmjP7Gsy3nJHH7wuCTiwiBEWuJ6gF3v4,11697
|
174
180
|
parsl/providers/slurm/template.py,sha256=cc-3l5wnThEWfqzpniPgi3FP6934Ni05UZ9r0A1RA8s,369
|
175
181
|
parsl/providers/torque/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
176
182
|
parsl/providers/torque/template.py,sha256=4qfc2gmlEhRCAD7erFDOs4prJQ43I8s4E8DSUSVQx3A,358
|
@@ -181,7 +187,7 @@ parsl/serialize/concretes.py,sha256=vQTn3zFd-npcthfdbYaGeBIiWlVYetQ8pSXbZfSnxDk,
|
|
181
187
|
parsl/serialize/facade.py,sha256=pT_4YdXpCT65PIUmcpv8bODhkJryc6Cpdg2FW-B4QXQ,4940
|
182
188
|
parsl/tests/__init__.py,sha256=s_zoz7Ipgykh-QTQvctdpxENrMnmpXY8oe1bJbUmpqY,204
|
183
189
|
parsl/tests/callables_helper.py,sha256=ceP1YYsNtrZgKT6MAIvpgdccEjQ_CpFEOnZBGHKGOx0,30
|
184
|
-
parsl/tests/conftest.py,sha256=
|
190
|
+
parsl/tests/conftest.py,sha256=562NStsVPZD0PnHGuqf9Q2LTozKNSghboHx44Ij7-ow,9375
|
185
191
|
parsl/tests/test_aalst_patterns.py,sha256=fi6JHKidV7vMJLv2nnu_-Q0ngGLc89mRm8rFrGIwiUM,9615
|
186
192
|
parsl/tests/test_callables.py,sha256=_QsdS8v2nGgOj4_X69NFHZOGUnqbOrOMCA9pCJColZw,1974
|
187
193
|
parsl/tests/test_flux.py,sha256=st9v55o5ZajK_LQUXh1saLwFh2gpaQFGG5mzdnJMNu0,5098
|
@@ -224,9 +230,9 @@ parsl/tests/configs/osg_htex.py,sha256=lnI9PJWQKOB-G3OsuC__RZKNH0r3817wCJ8ouFFVg
|
|
224
230
|
parsl/tests/configs/petrelkube.py,sha256=Tek05ztr2GDuYp1TiOFm89l0DrhP6lZQ5Fj8u8Z12wI,1657
|
225
231
|
parsl/tests/configs/summit.py,sha256=loBqZjMYicBJnQaj12TuHOwYhLzJexncNOG6S1lvt-4,1336
|
226
232
|
parsl/tests/configs/swan_htex.py,sha256=-gIl_Pcya0n7IVC8_UcATJZLEX4wnnmgZpZgGvVskD4,1473
|
233
|
+
parsl/tests/configs/taskvine_ex.py,sha256=tFAGiVTAAvwnWTznwUyYxhiKgKccrtqJYPvRqt7-Pkc,457
|
227
234
|
parsl/tests/configs/theta.py,sha256=iHxdS1lwiLzMcS8Rk57g35WbThtMBarumomCLidwHS8,1257
|
228
235
|
parsl/tests/configs/user_opts.py,sha256=oByBH5r3YhKZS_PN4SMX0lqreXfwRaloLc4u4XEy5Tw,6581
|
229
|
-
parsl/tests/configs/workqueue_blocks.py,sha256=9F6mQp2-RAd67EnicflRq6pep1ZibSyGEWenRuvmvOo,578
|
230
236
|
parsl/tests/configs/workqueue_ex.py,sha256=HAZzTJID4jtc07yNPZ4zIs0EXfE-IPorAvslHhQPYO8,451
|
231
237
|
parsl/tests/integration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
232
238
|
parsl/tests/integration/latency.py,sha256=kWYkXsbnVnpwS6rHsdm7a1FsUOJWHhuXDsRPlApw6iE,3289
|
@@ -254,6 +260,14 @@ parsl/tests/manual_tests/test_oauth_ssh.py,sha256=v7msnSS5ywrWl7oqB_gR72oU2owrpz
|
|
254
260
|
parsl/tests/manual_tests/test_regression_220.py,sha256=Lskfd6R9ZboJ3-mJ7LZBGhuLc6ylksjAwewhkn_IuVI,930
|
255
261
|
parsl/tests/manual_tests/test_udp_simple.py,sha256=DPTsUoZEPx5NLG4tPAv2_FWKshNno_aofVU4u8Q95Qs,1036
|
256
262
|
parsl/tests/manual_tests/test_worker_count.py,sha256=88PkYkg-Vo6RUBnui2zIxAIXXaqTCqv0xCKUFHXaZTo,2071
|
263
|
+
parsl/tests/scaling_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
264
|
+
parsl/tests/scaling_tests/htex_local.py,sha256=ct1cTBg0Ttjn09O793j_PsrceqX_Y_wCbnq1asEEfcA,526
|
265
|
+
parsl/tests/scaling_tests/local_threads.py,sha256=RbqOr2ELWBDFwmCCbvmyd4zEJDvonQGRbs7Apc6cy9g,138
|
266
|
+
parsl/tests/scaling_tests/test_scale.py,sha256=umw_METEyWlQm2DbWdjkekNTmOdkKdWQY8PRDiHIvDw,3835
|
267
|
+
parsl/tests/scaling_tests/vineex_condor.py,sha256=n1wo96sOIiJ1NjmjujMF5iU30y2eoTMczfoc9XnJu5I,308
|
268
|
+
parsl/tests/scaling_tests/vineex_local.py,sha256=8rUSfM1g4Z_jCr880j0LU6_mOLSzwv9xtXpCZfaV9Hw,306
|
269
|
+
parsl/tests/scaling_tests/wqex_condor.py,sha256=agE-fmo5upiHhWx4VcGGi2xNg9pb1TsAimWvM_NqpU4,522
|
270
|
+
parsl/tests/scaling_tests/wqex_local.py,sha256=QYJ4gte1RdlE6ewdbMUcOYbJL9rl_2MzrVbulHOKCu4,520
|
257
271
|
parsl/tests/site_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
258
272
|
parsl/tests/site_tests/site_config_selector.py,sha256=_NQMWzC1e3g4NlgS9_DAYut0c-2Ee49Q-5ddpuHbbis,2137
|
259
273
|
parsl/tests/site_tests/test_provider.py,sha256=dTOdcmRAl_6ANGmExTLOABCjdM_HkLAfi7rEQNIX0K0,2687
|
@@ -278,7 +292,7 @@ parsl/tests/test_bash_apps/test_memoize.py,sha256=YTqdy2DBUfl8shnNJrQjEjzK1YMvCI
|
|
278
292
|
parsl/tests/test_bash_apps/test_memoize_ignore_args.py,sha256=jbW0DPpTaGul65KK4AkDqfNV70r_RlB5xtC5bFGGtcQ,1343
|
279
293
|
parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py,sha256=03jL68xJxPCtO3nlCCycwOibQHuTeC6pQdPqSoc58s0,1384
|
280
294
|
parsl/tests/test_bash_apps/test_multiline.py,sha256=5c4MOp0dyHmzq0xtOIU4UinW4YD6dMn7fuz60yiDqbk,1600
|
281
|
-
parsl/tests/test_bash_apps/test_pipeline.py,sha256=
|
295
|
+
parsl/tests/test_bash_apps/test_pipeline.py,sha256=5kIc9KgVrOLaiul-MR_4-th551YhXs0AE3hJ64NEIJQ,3795
|
282
296
|
parsl/tests/test_bash_apps/test_stdout.py,sha256=rGKmIAERMQbeq8LgYcCDs5-MrExNskCfdx-FyNT-NJA,2696
|
283
297
|
parsl/tests/test_channels/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
284
298
|
parsl/tests/test_channels/test_large_output.py,sha256=PGeNSW_sN5mR7KF1hVL2CPfktydYxo4oNz1wVQ-ENN0,595
|
@@ -312,7 +326,7 @@ parsl/tests/test_error_handling/test_python_walltime.py,sha256=mQ2WE9aZQkzJcAdvV
|
|
312
326
|
parsl/tests/test_error_handling/test_rand_fail.py,sha256=OgHDOGWwdSzdpxpQQ0RbDc1k2mLtWxEcQ6akL23EA_w,3864
|
313
327
|
parsl/tests/test_error_handling/test_resource_spec.py,sha256=1oOJC6fnG_TuaGBfGjaucJjxwL9GIUSXc8K-e_zSyus,1185
|
314
328
|
parsl/tests/test_error_handling/test_retries.py,sha256=2WV_SLqIgEe1Xp47gkvzyIHUk4tmJ97n8VSpFjzo3qY,2445
|
315
|
-
parsl/tests/test_error_handling/test_retry_handler.py,sha256=
|
329
|
+
parsl/tests/test_error_handling/test_retry_handler.py,sha256=5RPgF1DkMeSLiEBbTcX6rpaMaBfd6Lt1bqJRYUDUJE0,1406
|
316
330
|
parsl/tests/test_error_handling/test_retry_handler_failure.py,sha256=Y12jOq1ShyRk-qcMyk46gBWe74lZaw36UtIa9Pb-4XM,551
|
317
331
|
parsl/tests/test_error_handling/test_serialization_fail.py,sha256=rkzlXJ-DzD6GaiTF2eTqNkmQ0TbtwbOydHX2-iq0XY8,647
|
318
332
|
parsl/tests/test_error_handling/test_wrap_with_logs.py,sha256=AHQZj7wae759FOcAUeHZX47mx1MKOfDv2YBLnaDVW7Q,741
|
@@ -381,20 +395,14 @@ parsl/tests/test_staging/test_staging_https_in_task.py,sha256=Ezqcsr_wUXCYXv2sd9
|
|
381
395
|
parsl/tests/test_threads/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
382
396
|
parsl/tests/test_threads/test_configs.py,sha256=QA9YjIMAtZ2jmkfOWqBzEfzQQcFVCDizH7Qwiy2HIMQ,909
|
383
397
|
parsl/tests/test_threads/test_lazy_errors.py,sha256=nGhYfCMHFZYSy6YJ4gnAmiLl9SfYs0WVnuvj8DXQ9bw,560
|
384
|
-
parsl/tests/workqueue_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
385
|
-
parsl/tests/workqueue_tests/htex_local.py,sha256=ct1cTBg0Ttjn09O793j_PsrceqX_Y_wCbnq1asEEfcA,526
|
386
|
-
parsl/tests/workqueue_tests/local_threads.py,sha256=RbqOr2ELWBDFwmCCbvmyd4zEJDvonQGRbs7Apc6cy9g,138
|
387
|
-
parsl/tests/workqueue_tests/test_scale.py,sha256=umw_METEyWlQm2DbWdjkekNTmOdkKdWQY8PRDiHIvDw,3835
|
388
|
-
parsl/tests/workqueue_tests/wqex_condor.py,sha256=agE-fmo5upiHhWx4VcGGi2xNg9pb1TsAimWvM_NqpU4,522
|
389
|
-
parsl/tests/workqueue_tests/wqex_local.py,sha256=QYJ4gte1RdlE6ewdbMUcOYbJL9rl_2MzrVbulHOKCu4,520
|
390
398
|
parsl/usage_tracking/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
391
399
|
parsl/usage_tracking/usage.py,sha256=TEuAIm_U_G2ojZxvd0bbVa6gZlU61_mVRa2yJC9mGiI,7555
|
392
|
-
parsl-2023.6.
|
393
|
-
parsl-2023.6.
|
394
|
-
parsl-2023.6.
|
395
|
-
parsl-2023.6.
|
396
|
-
parsl-2023.6.
|
397
|
-
parsl-2023.6.
|
398
|
-
parsl-2023.6.
|
399
|
-
parsl-2023.6.
|
400
|
-
parsl-2023.6.
|
400
|
+
parsl-2023.6.12.data/scripts/exec_parsl_function.py,sha256=kYJmpgsswNMqV2-_dOmtgZHhb9OuKMvB-UwaNO2A2z0,7759
|
401
|
+
parsl-2023.6.12.data/scripts/parsl_coprocess.py,sha256=V5yr9c-DvZHaBPvJOUsaAxJo2s1-ZsJqO1EhauYQd2A,5499
|
402
|
+
parsl-2023.6.12.data/scripts/process_worker_pool.py,sha256=o1Zp2j9KHIwR9OO8Z8mtZX_5gMDtnaJDE00KhVknG7g,32997
|
403
|
+
parsl-2023.6.12.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
|
404
|
+
parsl-2023.6.12.dist-info/METADATA,sha256=ZnT_s0k9capbHHh6r4XEzRhTKNILGeFDVTR4q9ZVCdk,3633
|
405
|
+
parsl-2023.6.12.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
|
406
|
+
parsl-2023.6.12.dist-info/entry_points.txt,sha256=XqnsWDYoEcLbsMcpnYGKLEnSBmaIe1YoM5YsBdJG2tI,176
|
407
|
+
parsl-2023.6.12.dist-info/top_level.txt,sha256=PIheYoUFQtF2icLsgOykgU-Cjuwr2Oi6On2jo5RYgRM,6
|
408
|
+
parsl-2023.6.12.dist-info/RECORD,,
|
@@ -1,12 +0,0 @@
|
|
1
|
-
from parsl.config import Config
|
2
|
-
from parsl.executors import WorkQueueExecutor
|
3
|
-
|
4
|
-
from parsl.data_provider.http import HTTPInTaskStaging
|
5
|
-
from parsl.data_provider.ftp import FTPInTaskStaging
|
6
|
-
from parsl.data_provider.file_noop import NoOpFileStaging
|
7
|
-
|
8
|
-
from parsl.providers import LocalProvider
|
9
|
-
|
10
|
-
config = Config(executors=[WorkQueueExecutor(port=0,
|
11
|
-
storage_access=[FTPInTaskStaging(), HTTPInTaskStaging(), NoOpFileStaging()],
|
12
|
-
provider=LocalProvider(init_blocks=0, min_blocks=0, max_blocks=1))])
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|