supervisely 6.73.347__py3-none-any.whl → 6.73.349__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.
supervisely/__init__.py CHANGED
@@ -54,6 +54,7 @@ from supervisely.task.progress import (
54
54
 
55
55
 
56
56
  import supervisely.project as project
57
+ import supervisely.api.constants as api_constants
57
58
  from supervisely.project import read_project, get_project_class
58
59
  from supervisely.project.download import download, download_async, download_fast
59
60
  from supervisely.project.upload import upload
@@ -0,0 +1,3 @@
1
+ # coding: utf-8
2
+
3
+ DOWNLOAD_BATCH_SIZE = None
@@ -23,7 +23,7 @@ import numpy as np
23
23
  from requests_toolbelt import MultipartDecoder, MultipartEncoder
24
24
  from tqdm import tqdm
25
25
 
26
- from supervisely._utils import batched
26
+ from supervisely._utils import batched, logger, run_coroutine
27
27
  from supervisely.api.module_api import ApiField, ModuleApi, RemoveableBulkModuleApi
28
28
  from supervisely.geometry.rectangle import Rectangle
29
29
  from supervisely.video_annotation.key_id_map import KeyIdMap
@@ -473,24 +473,24 @@ class FigureApi(RemoveableBulkModuleApi):
473
473
  :rtype: :class: `Dict[int, List[FigureInfo]]`
474
474
  """
475
475
  fields = [
476
- "id",
477
- "createdAt",
478
- "updatedAt",
479
- "imageId",
480
- "objectId",
481
- "classId",
482
- "projectId",
483
- "datasetId",
484
- "geometry",
485
- "geometryType",
486
- "geometryMeta",
487
- "tags",
488
- "meta",
489
- "area",
490
- "priority",
476
+ ApiField.ID,
477
+ ApiField.CREATED_AT,
478
+ ApiField.UPDATED_AT,
479
+ ApiField.IMAGE_ID,
480
+ ApiField.OBJECT_ID,
481
+ ApiField.CLASS_ID,
482
+ ApiField.PROJECT_ID,
483
+ ApiField.DATASET_ID,
484
+ ApiField.GEOMETRY,
485
+ ApiField.GEOMETRY_TYPE,
486
+ ApiField.GEOMETRY_META,
487
+ ApiField.TAGS,
488
+ ApiField.META,
489
+ ApiField.AREA,
490
+ ApiField.PRIORITY,
491
491
  ]
492
492
  if skip_geometry is True:
493
- fields = [x for x in fields if x != "geometry"]
493
+ fields = [x for x in fields if x != ApiField.GEOMETRY]
494
494
 
495
495
  if image_ids is None:
496
496
  filters = []
@@ -498,8 +498,8 @@ class FigureApi(RemoveableBulkModuleApi):
498
498
  filters = [
499
499
  {
500
500
  ApiField.FIELD: ApiField.ENTITY_ID,
501
- "operator": "in",
502
- "value": image_ids,
501
+ ApiField.OPERATOR: "in",
502
+ ApiField.VALUE: image_ids,
503
503
  }
504
504
  ]
505
505
  data = {
@@ -784,3 +784,192 @@ class FigureApi(RemoveableBulkModuleApi):
784
784
 
785
785
  if tasks:
786
786
  await asyncio.gather(*tasks)
787
+
788
+ async def download_async(
789
+ self,
790
+ dataset_id: int,
791
+ image_ids: Optional[List[int]] = None,
792
+ skip_geometry: bool = False,
793
+ semaphore: Optional[asyncio.Semaphore] = None,
794
+ log_progress: bool = True,
795
+ ) -> Dict[int, List[FigureInfo]]:
796
+ """
797
+ Asynchronously download figures for the given dataset ID. Can be filtered by image IDs.
798
+ This method is significantly faster than the synchronous version for large datasets.
799
+
800
+ :param dataset_id: Dataset ID in Supervisely.
801
+ :type dataset_id: int
802
+ :param image_ids: Specify the list of image IDs within the given dataset ID. If image_ids is None, the method returns all possible pairs of images with figures.
803
+ :type image_ids: List[int], optional
804
+ :param skip_geometry: Skip the download of figure geometry. May be useful for a significant api request speed increase in the large datasets.
805
+ :type skip_geometry: bool
806
+ :param semaphore: Semaphore to limit the number of concurrent downloads.
807
+ :type semaphore: Optional[asyncio.Semaphore], optional
808
+ :param log_progress: If True, log the progress of the download.
809
+ :type log_progress: bool, optional
810
+ :return: A dictionary where keys are image IDs and values are lists of figures.
811
+ :rtype: Dict[int, List[FigureInfo]]
812
+
813
+ :Usage example:
814
+
815
+ .. code-block:: python
816
+
817
+ import supervisely as sly
818
+
819
+ os.environ['SERVER_ADDRESS'] = 'https://app.supervisely.com'
820
+ os.environ['API_TOKEN'] = 'Your Supervisely API Token'
821
+ api = sly.Api.from_env()
822
+
823
+ dataset_id = 12345
824
+ download_coroutine = api.image.figure.download_async(dataset_id)
825
+ figures = sly.run_coroutine(download_coroutine)
826
+ """
827
+ fields = [
828
+ ApiField.ID,
829
+ ApiField.CREATED_AT,
830
+ ApiField.UPDATED_AT,
831
+ ApiField.IMAGE_ID,
832
+ ApiField.OBJECT_ID,
833
+ ApiField.CLASS_ID,
834
+ ApiField.PROJECT_ID,
835
+ ApiField.DATASET_ID,
836
+ ApiField.GEOMETRY,
837
+ ApiField.GEOMETRY_TYPE,
838
+ ApiField.GEOMETRY_META,
839
+ ApiField.TAGS,
840
+ ApiField.META,
841
+ ApiField.AREA,
842
+ ApiField.PRIORITY,
843
+ ]
844
+ if skip_geometry is True:
845
+ fields = [x for x in fields if x != ApiField.GEOMETRY]
846
+
847
+ if image_ids is None:
848
+ filters = []
849
+ else:
850
+ filters = [
851
+ {
852
+ ApiField.FIELD: ApiField.ENTITY_ID,
853
+ ApiField.OPERATOR: "in",
854
+ ApiField.VALUE: image_ids,
855
+ }
856
+ ]
857
+
858
+ data = {
859
+ ApiField.DATASET_ID: dataset_id,
860
+ ApiField.FIELDS: fields,
861
+ ApiField.FILTER: filters,
862
+ }
863
+
864
+ # Get first page to determine total pages
865
+ if semaphore is None:
866
+ semaphore = self._api.get_default_semaphore()
867
+ images_figures = defaultdict(list)
868
+ pages_count = None
869
+ total = 0
870
+ tasks = []
871
+
872
+ async def _get_page(page_data, page_num):
873
+ async with semaphore:
874
+ response = await self._api.post_async("figures.list", page_data)
875
+ response_json = response.json()
876
+ nonlocal pages_count, total
877
+ pages_count = response_json["pagesCount"]
878
+ if page_num == 1:
879
+ total = response_json["total"]
880
+
881
+ page_figures = []
882
+ for info in response_json["entities"]:
883
+ figure_info = self._convert_json_info(info, True)
884
+ page_figures.append(figure_info)
885
+ return page_figures
886
+
887
+ # Get first page
888
+ data[ApiField.PAGE] = 1
889
+ first_page_figures = await _get_page(data, 1)
890
+
891
+ if log_progress:
892
+ progress_cb = tqdm(total=total, desc="Downloading figures")
893
+
894
+ for figure in first_page_figures:
895
+ images_figures[figure.entity_id].append(figure)
896
+ if log_progress:
897
+ progress_cb.update(1)
898
+
899
+ # Get rest of the pages in parallel
900
+ if pages_count > 1:
901
+ for page in range(2, pages_count + 1):
902
+ page_data = data.copy()
903
+ page_data[ApiField.PAGE] = page
904
+ tasks.append(asyncio.create_task(_get_page(page_data, page)))
905
+
906
+ for task in asyncio.as_completed(tasks):
907
+ page_figures = await task
908
+ for figure in page_figures:
909
+ images_figures[figure.entity_id].append(figure)
910
+ if log_progress:
911
+ progress_cb.update(1)
912
+
913
+ return dict(images_figures)
914
+
915
+ def download_fast(
916
+ self,
917
+ dataset_id: int,
918
+ image_ids: Optional[List[int]] = None,
919
+ skip_geometry: bool = False,
920
+ semaphore: Optional[asyncio.Semaphore] = None,
921
+ log_progress: bool = True,
922
+ ) -> Dict[int, List[FigureInfo]]:
923
+ """
924
+ Download figures for the given dataset ID. Can be filtered by image IDs.
925
+ This method is significantly faster than the synchronous version for large datasets and
926
+ is designed to be used in an asynchronous context.
927
+ Will fallback to the synchronous version if async fails.
928
+
929
+ :param dataset_id: Dataset ID in Supervisely.
930
+ :type dataset_id: int
931
+ :param image_ids: Specify the list of image IDs within the given dataset ID. If image_ids is None, the method returns all possible pairs of images with figures.
932
+ :type image_ids: List[int], optional
933
+ :param skip_geometry: Skip the download of figure geometry. May be useful for a significant api request speed increase in the large datasets.
934
+ :type skip_geometry: bool
935
+ :param semaphore: Semaphore to limit the number of concurrent downloads.
936
+ :type semaphore: Optional[asyncio.Semaphore], optional
937
+ :param log_progress: If True, log the progress of the download.
938
+ :type log_progress: bool, optional
939
+
940
+ :return: A dictionary where keys are image IDs and values are lists of figures.
941
+ :rtype: Dict[int, List[FigureInfo]]
942
+
943
+ :Usage example:
944
+
945
+ .. code-block:: python
946
+
947
+ import supervisely as sly
948
+
949
+ os.environ['SERVER_ADDRESS'] = 'https://app.supervisely.com'
950
+ os.environ['API_TOKEN'] = 'Your Supervisely API Token'
951
+ api = sly.Api.from_env()
952
+
953
+ dataset_id = 12345
954
+ figures = api.image.figure.download_fast(dataset_id)
955
+ """
956
+ try:
957
+ return run_coroutine(
958
+ self.download_async(
959
+ dataset_id=dataset_id,
960
+ image_ids=image_ids,
961
+ skip_geometry=skip_geometry,
962
+ semaphore=semaphore,
963
+ log_progress=log_progress,
964
+ )
965
+ )
966
+ except Exception:
967
+ # Fallback to the synchronous version if async fails
968
+ logger.debug("Async download of figures is failed, falling back to sync download.")
969
+ if log_progress:
970
+ logger.debug("Downloading figures without progress bar.")
971
+ return self.download(
972
+ dataset_id=dataset_id,
973
+ image_ids=image_ids,
974
+ skip_geometry=skip_geometry,
975
+ )
@@ -55,6 +55,7 @@ from supervisely._utils import (
55
55
  from supervisely.annotation.annotation import Annotation
56
56
  from supervisely.annotation.tag import Tag
57
57
  from supervisely.annotation.tag_meta import TagApplicableTo, TagMeta, TagValueType
58
+ from supervisely.api.constants import DOWNLOAD_BATCH_SIZE
58
59
  from supervisely.api.dataset_api import DatasetInfo
59
60
  from supervisely.api.entity_annotation.figure_api import FigureApi
60
61
  from supervisely.api.entity_annotation.tag_api import TagApi
@@ -368,7 +369,7 @@ class ImageInfo(NamedTuple):
368
369
  #: :class:`int`: ID of the blob file in Supervisely storage related to the image.
369
370
  related_data_id: Optional[int] = None
370
371
 
371
- #: :class:`str`: Unique ID of the image that links it to the corresponding blob file in Supervisely storage
372
+ #: :class:`str`: Unique ID of the image that links it to the corresponding blob file in Supervisely storage
372
373
  #: uses for downloading source blob file.
373
374
  download_id: Optional[str] = None
374
375
 
@@ -1015,7 +1016,14 @@ class ImageApi(RemoveableBulkModuleApi):
1015
1016
  """
1016
1017
  Get image id and it content from given dataset and list of images ids.
1017
1018
  """
1018
- for batch_ids in batched(ids):
1019
+ if DOWNLOAD_BATCH_SIZE is not None and isinstance(DOWNLOAD_BATCH_SIZE, int):
1020
+ batches = batched(ids, DOWNLOAD_BATCH_SIZE)
1021
+ logger.debug(
1022
+ f"Batch size for func 'ImageApi._download_batch' changed to: {DOWNLOAD_BATCH_SIZE}"
1023
+ )
1024
+ else:
1025
+ batches = batched(ids)
1026
+ for batch_ids in batches:
1019
1027
  response = self._api.post(
1020
1028
  "images.bulk.download",
1021
1029
  {ApiField.DATASET_ID: dataset_id, ApiField.IMAGE_IDS: batch_ids},
@@ -2352,7 +2360,9 @@ class ImageApi(RemoveableBulkModuleApi):
2352
2360
 
2353
2361
  for batch in blob_image_infos_generator:
2354
2362
  names = [item.name for item in batch]
2355
- metas_batch = [metas[name] for name in names] if metas is not None else [{}] * len(names)
2363
+ metas_batch = (
2364
+ [metas[name] for name in names] if metas is not None else [{}] * len(names)
2365
+ )
2356
2366
  items = [
2357
2367
  {ApiField.TEAM_FILE_ID: team_file_id, ApiField.SOURCE_BLOB: item.offsets_dict}
2358
2368
  for item in batch
@@ -284,8 +284,64 @@ def download_fast(
284
284
  Download project in a fast mode.
285
285
  Items are downloaded asynchronously. If an error occurs, the method will fallback to synchronous download.
286
286
  Automatically detects project type.
287
- You can pass :class:`ProjectInfo` as `project_info` kwarg to avoid additional API requests.
287
+
288
+ :param api: Supervisely API address and token.
289
+ :type api: :class:`Api<supervisely.api.api.Api>`
290
+ :param project_id: Supervisely downloadable project ID.
291
+ :type project_id: :class:`int`
292
+ :param dest_dir: Destination directory.
293
+ :type dest_dir: :class:`str`
294
+ :param dataset_ids: Filter datasets by IDs.
295
+ :type dataset_ids: :class:`list` [ :class:`int` ], optional
296
+ :param log_progress: Show uploading progress bar.
297
+ :type log_progress: :class:`bool`
298
+ :param progress_cb: Function for tracking download progress.
299
+ :type progress_cb: tqdm or callable, optional
300
+ :param semaphore: Semaphore to limit the number of concurrent downloads of items.
301
+ :type semaphore: :class:`asyncio.Semaphore`, optional
302
+ :param only_image_tags: Download project with only images tags (without objects tags).
303
+ :type only_image_tags: :class:`bool`, optional
304
+ :param save_image_info: Download images infos or not.
305
+ :type save_image_info: :class:`bool`, optional
306
+ :param save_images: Download images or not.
307
+ :type save_images: :class:`bool`, optional
308
+ :param save_image_meta: Download images metadata in JSON format or not.
309
+ :type save_image_meta: :class:`bool`, optional
310
+ :param images_ids: Filter images by IDs.
311
+ :type images_ids: :class:`list` [ :class:`int` ], optional
312
+ :param resume_download: Resume download enables to download only missing files avoiding erase of existing files.
313
+ :type resume_download: :class:`bool`, optional
314
+ :param switch_size: Size threshold that determines how an item will be downloaded.
315
+ Items larger than this size will be downloaded as single files, while smaller items will be downloaded as a batch.
316
+ Useful for projects with different item sizes and when you exactly know which size will perform better with batch download.
317
+ :type switch_size: :class:`int`, optional
318
+ :param batch_size: Number of items to download in a single batch.
319
+ :type batch_size: :class:`int`, optional
320
+ :param download_blob_files: Download project with Blob files in native format.
321
+ If False - download project like a regular project in classic Supervisely format.
322
+ :type download_blob_files: :class:`bool`, optional
323
+ :param project_info: Project info object. To avoid additional API requests.
324
+ :type project_info: :class:`ProjectInfo`, optional
325
+ :return: None
326
+ :rtype: NoneType
327
+
328
+ :Usage example:
329
+
330
+ .. code-block:: python
331
+
332
+ import supervisely as sly
333
+
334
+ os.environ['SERVER_ADDRESS'] = 'https://app.supervisely.com'
335
+ os.environ['API_TOKEN'] = 'Your Supervisely API Token'
336
+ api = sly.Api.from_env()
337
+
338
+ project_id = 8888
339
+ save_directory = "/path/to/save/projects"
340
+
341
+ sly.download_fast(api, project_id, save_directory)
342
+
288
343
  """
344
+
289
345
  download_async_or_sync(
290
346
  api=api,
291
347
  project_id=project_id,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: supervisely
3
- Version: 6.73.347
3
+ Version: 6.73.349
4
4
  Summary: Supervisely Python SDK.
5
5
  Home-page: https://github.com/supervisely/supervisely
6
6
  Author: Supervisely
@@ -1,5 +1,5 @@
1
1
  supervisely/README.md,sha256=XM-DiMC6To3I9RjQZ0c61905EFRR_jnCUx2q3uNR-X8,3331
2
- supervisely/__init__.py,sha256=mVZ34ziMzw-Hlr5kaTt1xSh5VZIWrTgTNeSyLKcrOyI,10867
2
+ supervisely/__init__.py,sha256=_qphKFT0_toEQmF5IjB1sWjztbF4lP1tLY29PBJhArY,10917
3
3
  supervisely/_utils.py,sha256=DA-sPMk68GyInrc4DMxO-Azp5-uWkwZx_NAr8mXVI0o,18280
4
4
  supervisely/function_wrapper.py,sha256=R5YajTQ0GnRp2vtjwfC9hINkzQc0JiyGsu8TER373xY,1912
5
5
  supervisely/sly_logger.py,sha256=z92Vu5hmC0GgTIJO1n6kPDayRW9__8ix8hL6poDZj-Y,6274
@@ -24,11 +24,12 @@ supervisely/api/agent_api.py,sha256=ShWAIlXcWXcyI9fqVuP5GZVCigCMJmjnvdGUfLspD6Y,
24
24
  supervisely/api/annotation_api.py,sha256=XE3Sr_oQOMraZ9NlWs9ZqUsff1j47XRDh9Fy8rW4ubw,82763
25
25
  supervisely/api/api.py,sha256=D90G6ivwyHHK7WVo4ByKtv65lSED_Sm1qlp_TpyCeAc,67398
26
26
  supervisely/api/app_api.py,sha256=RsbVej8WxWVn9cNo5s3Fqd1symsCdsfOaKVBKEUapRY,71927
27
+ supervisely/api/constants.py,sha256=qwK9Q3mHGz5Ny5WuBmPQgawBWfzCT2DRiw3IcaCDRmo,44
27
28
  supervisely/api/dataset_api.py,sha256=c6rEVySSxbyDB5fUCilsc5AKk0pWN_5vVN6OceDbEvc,47918
28
29
  supervisely/api/file_api.py,sha256=EX_Cam93QkR5SOOIkIznkzERIr0u7N7GHVGK27iOm20,92952
29
30
  supervisely/api/github_api.py,sha256=NIexNjEer9H5rf5sw2LEZd7C1WR-tK4t6IZzsgeAAwQ,623
30
31
  supervisely/api/image_annotation_tool_api.py,sha256=YcUo78jRDBJYvIjrd-Y6FJAasLta54nnxhyaGyanovA,5237
31
- supervisely/api/image_api.py,sha256=pPY8K4hKKE4hvWNB6VEXd-AypSCqrivCWWsHDQKKu6g,223223
32
+ supervisely/api/image_api.py,sha256=sE2lIPPYLv1tJsuFSjc9IvLVB07kmq9PnPodU3J6aEs,223637
32
33
  supervisely/api/import_storage_api.py,sha256=BDCgmR0Hv6OoiRHLCVPKt3iDxSVlQp1WrnKhAK_Zl84,460
33
34
  supervisely/api/issues_api.py,sha256=BqDJXmNoTzwc3xe6_-mA7FDFC5QQ-ahGbXk_HmpkSeQ,17925
34
35
  supervisely/api/labeling_job_api.py,sha256=VM1pjM65cUTeer1hrI7cSmCUOHJb7fzK6gJ-abA07hg,55097
@@ -49,7 +50,7 @@ supervisely/api/video_annotation_tool_api.py,sha256=3A9-U8WJzrTShP_n9T8U01M9FzGY
49
50
  supervisely/api/workspace_api.py,sha256=5KAxpI9DKBmgF_pyQaXHpGT30HZ9wRtR6DP3FoYFZtY,9228
50
51
  supervisely/api/entity_annotation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
52
  supervisely/api/entity_annotation/entity_annotation_api.py,sha256=K79KdDyepQv4FiNQHBj9V4-zLIemxK9WG1ig1bfBKb8,3083
52
- supervisely/api/entity_annotation/figure_api.py,sha256=_v7Nhi63Ksw1OE38ZvFwj9F4O0GNmf96U3gFyGTs4Hs,27776
53
+ supervisely/api/entity_annotation/figure_api.py,sha256=rmsE3L_JfqN94sLN637pQ0syiBAXPd8RyAwhl41j1xs,35318
53
54
  supervisely/api/entity_annotation/object_api.py,sha256=gbcNvN_KY6G80Me8fHKQgryc2Co7VU_kfFd1GYILZ4E,8875
54
55
  supervisely/api/entity_annotation/tag_api.py,sha256=M-28m9h8R4k9Eqo6P1S0UH8_D5kqCwAvQLYY6_Yz4oM,11161
55
56
  supervisely/api/pointcloud/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1017,7 +1018,7 @@ supervisely/pointcloud_episodes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm
1017
1018
  supervisely/pointcloud_episodes/pointcloud_episodes.py,sha256=cRXdtw7bMsbsdVQjxfWxFSESrO-LGiqqsZyyExl2Mbg,3430
1018
1019
  supervisely/project/__init__.py,sha256=hlzdj9Pgy53Q3qdP8LMtGTChvZHQuuShdtui2eRUQeE,2601
1019
1020
  supervisely/project/data_version.py,sha256=P5Lui6i64pYeJWmAdGJDv8GRXxjfpSSZ8zT_MxIrynE,19553
1020
- supervisely/project/download.py,sha256=4QOEQZnolmOpEO6Wl6DIc73BwIYr9m-6anbarrU6VwQ,24902
1021
+ supervisely/project/download.py,sha256=N6UEXY_eLtzjz61Y2SaJLg2-vv_Cvp9cXCUUM9R8-d8,27677
1021
1022
  supervisely/project/pointcloud_episode_project.py,sha256=yiWdNBQiI6f1O9sr1pg8JHW6O-w3XUB1rikJNn3Oung,41866
1022
1023
  supervisely/project/pointcloud_project.py,sha256=Kx1Vaes-krwG3BiRRtHRLQxb9G5m5bTHPN9IzRqmNWo,49399
1023
1024
  supervisely/project/project.py,sha256=OunVB11sVQSOvkqkjsEEkX1nq9OUXOXpHTdcLDjOFe0,233256
@@ -1082,9 +1083,9 @@ supervisely/worker_proto/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
1082
1083
  supervisely/worker_proto/worker_api_pb2.py,sha256=VQfi5JRBHs2pFCK1snec3JECgGnua3Xjqw_-b3aFxuM,59142
1083
1084
  supervisely/worker_proto/worker_api_pb2_grpc.py,sha256=3BwQXOaP9qpdi0Dt9EKG--Lm8KGN0C5AgmUfRv77_Jk,28940
1084
1085
  supervisely_lib/__init__.py,sha256=7-3QnN8Zf0wj8NCr2oJmqoQWMKKPKTECvjH9pd2S5vY,159
1085
- supervisely-6.73.347.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
1086
- supervisely-6.73.347.dist-info/METADATA,sha256=7GkOnoQKswP3aWdQvd8kRV27PVdnozTXeuKEqlGv734,33596
1087
- supervisely-6.73.347.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
1088
- supervisely-6.73.347.dist-info/entry_points.txt,sha256=U96-5Hxrp2ApRjnCoUiUhWMqijqh8zLR03sEhWtAcms,102
1089
- supervisely-6.73.347.dist-info/top_level.txt,sha256=kcFVwb7SXtfqZifrZaSE3owHExX4gcNYe7Q2uoby084,28
1090
- supervisely-6.73.347.dist-info/RECORD,,
1086
+ supervisely-6.73.349.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
1087
+ supervisely-6.73.349.dist-info/METADATA,sha256=OuZBH6eZb1yw77nA2ghY1OmGJ9ZPmki8IlMCPIE_2bU,33596
1088
+ supervisely-6.73.349.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
1089
+ supervisely-6.73.349.dist-info/entry_points.txt,sha256=U96-5Hxrp2ApRjnCoUiUhWMqijqh8zLR03sEhWtAcms,102
1090
+ supervisely-6.73.349.dist-info/top_level.txt,sha256=kcFVwb7SXtfqZifrZaSE3owHExX4gcNYe7Q2uoby084,28
1091
+ supervisely-6.73.349.dist-info/RECORD,,