megadetector 10.0.3__py3-none-any.whl → 10.0.4__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.

Potentially problematic release.


This version of megadetector might be problematic. Click here for more details.

@@ -16,6 +16,8 @@ import builtins
16
16
  import datetime
17
17
  import tempfile
18
18
  import shutil
19
+ import platform
20
+ import sys
19
21
  import uuid
20
22
 
21
23
  import jsonpickle
@@ -1053,6 +1055,57 @@ def make_test_folder(subfolder=None):
1053
1055
  append_guid=True)
1054
1056
 
1055
1057
 
1058
+ #%% Environment utilities
1059
+
1060
+ def is_sphinx_build():
1061
+ """
1062
+ Determine whether we are running in the context of our Sphinx build.
1063
+
1064
+ Returns:
1065
+ bool: True if we're running a Sphinx build
1066
+ """
1067
+
1068
+ is_sphinx = hasattr(builtins, '__sphinx_build__')
1069
+ return is_sphinx
1070
+
1071
+
1072
+ def is_running_in_gha():
1073
+ """
1074
+ Determine whether we are running on a GitHub Actions runner.
1075
+
1076
+ Returns:
1077
+ bool: True if we're running in a GHA runner
1078
+ """
1079
+
1080
+ running_in_gha = False
1081
+
1082
+ if ('GITHUB_ACTIONS' in os.environ):
1083
+ # Documentation is inconsistent on how this variable presents itself
1084
+ if isinstance(os.environ['GITHUB_ACTIONS'],bool) and \
1085
+ os.environ['GITHUB_ACTIONS']:
1086
+ running_in_gha = True
1087
+ elif isinstance(os.environ['GITHUB_ACTIONS'],str) and \
1088
+ os.environ['GITHUB_ACTIONS'].lower() == ('true'):
1089
+ running_in_gha = True
1090
+
1091
+ return running_in_gha
1092
+
1093
+
1094
+ def environment_is_wsl():
1095
+ """
1096
+ Determines whether we're running in WSL.
1097
+
1098
+ Returns:
1099
+ True if we're running in WSL
1100
+ """
1101
+
1102
+ if sys.platform not in ('linux','posix'):
1103
+ return False
1104
+ platform_string = ' '.join(platform.uname()).lower()
1105
+ return 'microsoft' in platform_string and 'wsl' in platform_string
1106
+
1107
+
1108
+
1056
1109
  #%% Tests
1057
1110
 
1058
1111
  def test_write_json():
@@ -21,6 +21,7 @@ since much of what it tries to test is, e.g., imports.
21
21
  import os
22
22
  import json
23
23
  import glob
24
+ import sys
24
25
  import tempfile
25
26
  import urllib
26
27
  import urllib.request
@@ -141,9 +142,6 @@ class MDTestOptions:
141
142
  #: Number of cores to use for multi-CPU inference tests
142
143
  self.n_cores_for_multiprocessing_tests = 2
143
144
 
144
- #: Number of cores to use for multi-CPU video tests
145
- self.n_cores_for_video_tests = 2
146
-
147
145
  #: Batch size to use when testing batches of size > 1
148
146
  self.alternative_batch_size = 3
149
147
 
@@ -1062,7 +1060,6 @@ def run_python_tests(options):
1062
1060
  video_options.input_video_file = os.path.join(options.scratch_dir,options.test_videos[0])
1063
1061
  video_options.output_json_file = os.path.join(options.scratch_dir,'single_video_output.json')
1064
1062
  video_options.frame_sample = 10
1065
- video_options.n_cores = options.n_cores_for_video_tests
1066
1063
  video_options.detector_options = copy(options.detector_options)
1067
1064
 
1068
1065
  _ = process_videos(video_options)
@@ -1086,7 +1083,6 @@ def run_python_tests(options):
1086
1083
  video_options.output_video_file = None
1087
1084
  video_options.recursive = True
1088
1085
  video_options.verbose = True
1089
- video_options.n_cores = options.n_cores_for_video_tests
1090
1086
  video_options.json_confidence_threshold = 0.05
1091
1087
  video_options.time_sample = 2
1092
1088
  video_options.detector_options = copy(options.detector_options)
@@ -1295,7 +1291,7 @@ def run_cli_tests(options):
1295
1291
 
1296
1292
  batch_string = ' --batch_size {}'.format(options.alternative_batch_size)
1297
1293
 
1298
- # I reduce the number of loader workers here to force batching to actually appen; with a small
1294
+ # I reduce the number of loader workers here to force batching to actually append; with a small
1299
1295
  # number of images and a few that are intentionally corrupt, with the default number of loader
1300
1296
  # workers we end up with batches that are mostly just one image.
1301
1297
  cmd = base_cmd + ' --use_image_queue --preprocess_on_image_queue --loader_workers 2' + batch_string
@@ -1591,9 +1587,9 @@ def run_cli_tests(options):
1591
1587
 
1592
1588
  cmd += ' "{}" "{}"'.format(options.default_model,options.scratch_dir)
1593
1589
  cmd += ' --output_json_file "{}"'.format(video_inference_output_file)
1594
- cmd += ' --n_cores {}'.format(options.n_cores_for_video_tests)
1595
1590
  cmd += ' --frame_sample 4'
1596
1591
  cmd += ' --verbose'
1592
+ cmd += ' --recursive'
1597
1593
  cmd += ' --detector_options {}'.format(dict_to_kvp_list(options.detector_options))
1598
1594
 
1599
1595
  cmd_results = execute_and_print(cmd)
@@ -1789,6 +1785,11 @@ def test_suite_entry_point():
1789
1785
  options.skip_localhost_downloads = True
1790
1786
  options.skip_import_tests = False
1791
1787
 
1788
+ if sys.platform == 'darwin':
1789
+ print('Detected a Mac environment, widening tolerance')
1790
+ options.max_coord_error = 0.05
1791
+ options.max_conf_error = 0.05
1792
+
1792
1793
  options = download_test_data(options)
1793
1794
 
1794
1795
  run_tests(options)
@@ -36,6 +36,7 @@ from tqdm import tqdm
36
36
  from megadetector.utils.ct_utils import is_iterable
37
37
  from megadetector.utils.ct_utils import make_test_folder
38
38
  from megadetector.utils.ct_utils import sort_dictionary_by_value
39
+ from megadetector.utils.ct_utils import environment_is_wsl
39
40
 
40
41
  # Should all be lower-case
41
42
  IMG_EXTENSIONS = ('.jpg', '.jpeg', '.gif', '.png', '.tif', '.tiff', '.bmp')
@@ -622,21 +623,7 @@ def is_executable(filename):
622
623
  return which(filename) is not None
623
624
 
624
625
 
625
- #%% Platform-independent way to open files in their associated application
626
-
627
- def environment_is_wsl():
628
- """
629
- Determines whether we're running in WSL.
630
-
631
- Returns:
632
- True if we're running in WSL.
633
- """
634
-
635
- if sys.platform not in ('linux','posix'):
636
- return False
637
- platform_string = ' '.join(platform.uname()).lower()
638
- return 'microsoft' in platform_string and 'wsl' in platform_string
639
-
626
+ #%% WSL utilities
640
627
 
641
628
  def wsl_path_to_windows_path(filename, failure_behavior='none'):
642
629
  r"""
@@ -731,6 +718,8 @@ def windows_path_to_wsl_path(filename, failure_behavior='none'):
731
718
  # ...def window_path_to_wsl_path(...)
732
719
 
733
720
 
721
+ #%% Platform-independent file openers
722
+
734
723
  def open_file_in_chrome(filename):
735
724
  """
736
725
  Open a file in chrome, regardless of file type. I typically use this to open
@@ -552,7 +552,7 @@ def render_detection_bounding_boxes(detections,
552
552
  custom_strings (list of str, optional): optional set of strings to append to detection labels, should
553
553
  have the same length as [detections]. Appended before any classification labels.
554
554
  box_sort_order (str, optional): sorting scheme for detection boxes, can be None, "confidence", or
555
- "reverse_confidence".
555
+ "reverse_confidence". "confidence" puts the highest-confidence boxes on top.
556
556
  verbose (bool, optional): enable additional debug output
557
557
  """
558
558
 
@@ -24,10 +24,13 @@ from megadetector.detection.run_detector import get_typical_confidence_threshold
24
24
  from megadetector.utils.ct_utils import get_max_conf
25
25
  from megadetector.utils import write_html_image_list
26
26
  from megadetector.utils.path_utils import path_is_abs
27
+ from megadetector.utils.path_utils import open_file
27
28
  from megadetector.utils.wi_utils import load_md_or_speciesnet_file
28
29
  from megadetector.visualization import visualization_utils as vis_utils
29
30
  from megadetector.visualization.visualization_utils import blur_detections
30
31
 
32
+ default_box_sort_order = 'confidence'
33
+
31
34
 
32
35
  #%% Constants
33
36
 
@@ -49,7 +52,7 @@ def _render_image(entry,
49
52
  out_dir,
50
53
  images_dir,
51
54
  output_image_width,
52
- box_sort_order=None,
55
+ box_sort_order=default_box_sort_order,
53
56
  category_names_to_blur=None):
54
57
  """
55
58
  Internal function for rendering a single image.
@@ -153,7 +156,7 @@ def visualize_detector_output(detector_output_path,
153
156
  parallelize_rendering=False,
154
157
  parallelize_rendering_n_cores=10,
155
158
  parallelize_rendering_with_threads=True,
156
- box_sort_order=None,
159
+ box_sort_order=default_box_sort_order,
157
160
  category_names_to_blur=None):
158
161
  """
159
162
  Draws bounding boxes on images given the output of a detector.
@@ -424,8 +427,7 @@ def main(): # noqa
424
427
  html_output_file=args.html_output_file,
425
428
  category_names_to_blur=category_names_to_blur)
426
429
 
427
- if args.html_output_file is not None and args.open_html_output_file:
428
- from megadetector.utils.path_utils import open_file
430
+ if (args.html_output_file is not None) and args.open_html_output_file:
429
431
  open_file(args.html_output_file)
430
432
 
431
433
  if __name__ == '__main__':
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: megadetector
3
- Version: 10.0.3
3
+ Version: 10.0.4
4
4
  Summary: MegaDetector is an AI model that helps conservation folks spend less time doing boring things with camera trap images.
5
5
  Author-email: Your friendly neighborhood MegaDetector team <cameratraps@lila.science>
6
6
  Maintainer-email: Your friendly neighborhood MegaDetector team <cameratraps@lila.science>
@@ -30,6 +30,7 @@ megadetector/classification/efficientnet/__init__.py,sha256=e-jfknjzCc5a0CSW-TaZ
30
30
  megadetector/classification/efficientnet/model.py,sha256=o7m379-FVeHrioW1HSJ48fLUqH9MMlf4b1BwktL2EoQ,17120
31
31
  megadetector/classification/efficientnet/utils.py,sha256=76SQdh0zK7CFcwTW4kiechCGMHSftPT0tC1PtqNRLZI,24756
32
32
  megadetector/data_management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
+ megadetector/data_management/animl_to_md.py,sha256=Z6PDJxeM_5dMZJBM3j0mxDPW2_1bNkXx0M3_qq42_Ig,4416
33
34
  megadetector/data_management/camtrap_dp_to_coco.py,sha256=HoCGMzZTEvnudnAjbOr-mCizXHmc8mMNSUChy_Q9PkI,9673
34
35
  megadetector/data_management/cct_json_utils.py,sha256=iybRIlARCsId-yWiwRckNZhfmY5aFFfsiJbyaXCDr1E,19535
35
36
  megadetector/data_management/cct_to_md.py,sha256=e1fYevSz0m65n5H16uB6uwzNiXiwxjdB2ka5p68R4d0,5120
@@ -51,6 +52,7 @@ megadetector/data_management/speciesnet_to_md.py,sha256=kINd7PfWC1G-kawZH8YDigtB
51
52
  megadetector/data_management/wi_download_csv_to_coco.py,sha256=rhqWSEmDiXs1GbHavoNwdGSqk01-a-4xmz7z7x1Qjs4,7973
52
53
  megadetector/data_management/yolo_output_to_md_output.py,sha256=4wU31dHo8rSwge91m0bO0YAYrytvmxZH0YRHiRjRGa8,22509
53
54
  megadetector/data_management/yolo_to_coco.py,sha256=5fa7VAbRZQgWK-03DeyVhpj6qeIW6cT7v8B33rhsN3I,31003
55
+ megadetector/data_management/zamba_to_md.py,sha256=f6hK0pdVY0FhN_7DqKhY5BswYps7fO-Hy5ojmRvntok,5314
54
56
  megadetector/data_management/annotations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
57
  megadetector/data_management/annotations/annotation_constants.py,sha256=Fp_uaFQbMzhjMBcXOBUuTA9eOmenjPboMQojPQUaJjI,951
56
58
  megadetector/data_management/databases/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -70,20 +72,20 @@ megadetector/data_management/lila/lila_common.py,sha256=IRWs46TrxcjckLidDwXPmb5O
70
72
  megadetector/data_management/lila/test_lila_metadata_urls.py,sha256=ThU78Ks5V3rFyJSKStFcM5M2yTlhR_pgMTa6_KuF5Hs,5256
71
73
  megadetector/detection/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
74
  megadetector/detection/change_detection.py,sha256=Ne3GajbH_0KPBU8ruHp4Rkr0uKd5oKAMQ3CQTRKRHgQ,28659
73
- megadetector/detection/process_video.py,sha256=WQMhP6kjjsQIA_V0SMQ66yAyFatt34VPgEvLvaqolnc,17292
74
- megadetector/detection/pytorch_detector.py,sha256=Jczkwd47I8X-CtddvB7HvREYau0QNtzGAuOLVCWT9Pc,60407
75
+ megadetector/detection/process_video.py,sha256=iE-TA42IhrVwl3ftZ12mgaWv5CuttsI5SsivxSzpRiY,17498
76
+ megadetector/detection/pytorch_detector.py,sha256=ixU-2_AnCwEP33FaaqTZRoi1WxIUeM4x_ksbNT-tezA,59817
75
77
  megadetector/detection/run_detector.py,sha256=TTX29zxDN_O7ja61sOmMIVewUz3yRvKg1D1AAYhVEkc,46851
76
- megadetector/detection/run_detector_batch.py,sha256=j2wu6gQ593T6N1o4-KsT6mNaGQbc8Rr6NdGAA5rxYXE,88307
78
+ megadetector/detection/run_detector_batch.py,sha256=aZgiywL6arrdQ_l3jzlHctlccqL537lwVStjhi1hIWw,89823
77
79
  megadetector/detection/run_inference_with_yolov5_val.py,sha256=A-AQuARVVy7oR9WtenCZwzvd5U3HQwihMr4Jkiv9U0g,53515
78
- megadetector/detection/run_md_and_speciesnet.py,sha256=WJqwu62j_XS1LUr1pak8eeKnJ8-OsX5Fy8644cmHC54,49646
80
+ megadetector/detection/run_md_and_speciesnet.py,sha256=Dp_SpJZp0pX9jzFtxM6zPCyBNq49uyQpMDAdNDLVorM,50280
79
81
  megadetector/detection/run_tiled_inference.py,sha256=wrQkKIloHBO9v2i0nZ1_Tt75iFtVrnco3Y4FafoVxdw,39382
80
82
  megadetector/detection/tf_detector.py,sha256=3b2MiqgMw8KBDzHQliUSDXWrmKpa9iZnfe6EgYpMcYo,8398
81
- megadetector/detection/video_utils.py,sha256=YSWpyUO1XKEemsNNfnbRbZFkt69JhFSJki3Q3Symhqg,49628
83
+ megadetector/detection/video_utils.py,sha256=JkCTK1-aNmLDHOEvlI1w5KS2ZssSdgzerLIUE8iX2_I,49785
82
84
  megadetector/postprocessing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
85
  megadetector/postprocessing/add_max_conf.py,sha256=9MYtsH2mwkiaZb7Qcor5J_HskfAj7d9srp8G_Qldpk0,1722
84
86
  megadetector/postprocessing/categorize_detections_by_size.py,sha256=DpZpRNFlyeOfWuOc6ICuENgIWDCEtiErJ_frBZp9lYM,5382
85
87
  megadetector/postprocessing/classification_postprocessing.py,sha256=CaT0O1-Y3FcdW1tO147etsTQhMBDoMHZwtYZbdukpMI,59916
86
- megadetector/postprocessing/combine_batch_outputs.py,sha256=I7cVKoAi_Dr5a8TBZGp9hU1QmkaDHB5tIgN3oGOeUfk,8417
88
+ megadetector/postprocessing/combine_batch_outputs.py,sha256=BEP8cVa0sMIPg7tkWQc_8vOEPnbmWjOsQdVJHe61uz8,8468
87
89
  megadetector/postprocessing/compare_batch_results.py,sha256=RDlKLwea76rOWiDneSJUj6P_oMBMnD2BY4inoxLqQiw,84258
88
90
  megadetector/postprocessing/convert_output_format.py,sha256=FiwKSiMyEeNVLLfjpQtx3CrMbchwNUaW2TgLmdXGFVo,14892
89
91
  megadetector/postprocessing/create_crop_folder.py,sha256=T37HnvBEakikXY3n3Bgk5boFo_0-Z5aKnkEWXv-Ki4s,23166
@@ -97,8 +99,8 @@ megadetector/postprocessing/merge_detections.py,sha256=hvb4TJ6u1PyWOVQai9wZk72li
97
99
  megadetector/postprocessing/postprocess_batch_results.py,sha256=iAoCLKgwfC_vlrUGNg9cI694nzohJLNvdT7R0FScfLI,84597
98
100
  megadetector/postprocessing/remap_detection_categories.py,sha256=BE6Ce-PGBEx1FyG3XwbYp2D5sh5xUlVf6fonaMuPMAg,7927
99
101
  megadetector/postprocessing/render_detection_confusion_matrix.py,sha256=oNvDTh5td5ynELNnhz4XaLP2HiwLuojkJlob15TpgcY,26365
100
- megadetector/postprocessing/separate_detections_into_folders.py,sha256=rRYvRblQFKYTV-dNt7e19Eco9eLTaGru_i9aOCGyEH0,32258
101
- megadetector/postprocessing/subset_json_detector_output.py,sha256=Quz6xxM1T0N6bb1zGVKMv5GHBECLwNtuu9Sb35bWPhI,32188
102
+ megadetector/postprocessing/separate_detections_into_folders.py,sha256=Yvpkl_MsWbGoo4zvQHrXHkATRJaYdYligItfg9bvuV8,32262
103
+ megadetector/postprocessing/subset_json_detector_output.py,sha256=FiP1sUYfIBqOiSwjkJ6qkj4hvlF7yJsF7-y9tmfSShc,32187
102
104
  megadetector/postprocessing/top_folders_to_bottom.py,sha256=zYrqMHjUZG8urh2CYphfs91ZQ620uqe-TL8jVYy8KVw,6049
103
105
  megadetector/postprocessing/validate_batch_results.py,sha256=9nr7LeKMdki9Y821ag2bZFQCxuq0OqINDH7cPXyVcY8,12059
104
106
  megadetector/postprocessing/repeat_detection_elimination/find_repeat_detections.py,sha256=XgVeyga8iSC01MAjXxb2rn-CgJTYHqC_gfxxEoSn4aw,9420
@@ -118,12 +120,12 @@ megadetector/taxonomy_mapping/validate_lila_category_mappings.py,sha256=sAKYreO1
118
120
  megadetector/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
119
121
  megadetector/tests/test_nms_synthetic.py,sha256=oY6xmT1sLSSN7weQJ8TPTaZgAiSiZ6s43EffUhwLWIw,14707
120
122
  megadetector/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
121
- megadetector/utils/ct_utils.py,sha256=i8CjVxQPM50WppFRgQGzXc6-itkfW0e7heB6r5IE_0w,58740
123
+ megadetector/utils/ct_utils.py,sha256=7K5gRd_Q9DVtMxly5eW8BIgtcGHIwiTeNdyeiLYfN-A,60033
122
124
  megadetector/utils/directory_listing.py,sha256=CZBzwg0Fus1xuRAp3ycEBjViDdwwk4eKdGq06ZERLDg,6414
123
125
  megadetector/utils/extract_frames_from_video.py,sha256=vjSVgxtb5z2syHCVYWc2KdNUpc-O6yY8nkbj_wqsIvY,12255
124
126
  megadetector/utils/gpu_test.py,sha256=5zUfAVeSjH8I08eCqayFmMxL-0mix8SjJJTe5ORABvU,3544
125
- megadetector/utils/md_tests.py,sha256=MrwJam7sjqV12xzu_wRFJd6t_5oMg8TpN795N0i_gEw,80384
126
- megadetector/utils/path_utils.py,sha256=tUNnx2OzDm4ND5rEhIw60DS0dUfXqByk6JJ4DKNlibU,98982
127
+ megadetector/utils/md_tests.py,sha256=Iup4KjyIpLUpZ4TzzwEyGK61rg6aH7NrEQsdQ-ov51I,80300
128
+ megadetector/utils/path_utils.py,sha256=qU1jTBHYy11i5vOMslFEUjc1VBnxQHnDCPYkVzuUXms,98686
127
129
  megadetector/utils/process_utils.py,sha256=gQcpH9WYvGPUs0FhtJ5_Xvl6JsvoGz8_mnDQk0PbTRM,5673
128
130
  megadetector/utils/split_locations_into_train_val.py,sha256=fd_6pj1aWY6hybwaXvBn9kBcOHjI90U-OsTmEAGpeu8,10297
129
131
  megadetector/utils/string_utils.py,sha256=r2Maw3zbzk3EyaZcNkdqr96yP_8m4ey6v0WxlemEY9U,6155
@@ -133,12 +135,12 @@ megadetector/utils/write_html_image_list.py,sha256=6Tbe5wyUxoBYJgH9yVrxxKCeWF2BV
133
135
  megadetector/visualization/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
134
136
  megadetector/visualization/plot_utils.py,sha256=uDDlOhdaJ3V8sGj2kS9b0cgszKc8WCq2_ofl6TW_XUs,10727
135
137
  megadetector/visualization/render_images_with_thumbnails.py,sha256=-XX4PG4wnrFjFTIwd0sMxXxKMxPuu0SZ_TfK3dI1x8Y,8425
136
- megadetector/visualization/visualization_utils.py,sha256=_f8x6Tx5mWeGYpvTbkBDOGGaxenK-qPi2ba3ndOLQDk,75865
138
+ megadetector/visualization/visualization_utils.py,sha256=E5uvysS3F1S_yiPFxZty3U2f6cjuE8zG6XWggYOu-5o,75921
137
139
  megadetector/visualization/visualize_db.py,sha256=8YDWSR0eMehXYdPtak9z8UUw35xV7hu-0eCuzgSLjWc,25558
138
- megadetector/visualization/visualize_detector_output.py,sha256=uMa5QzJEr72Z3NyPBYOTHS_hs-WtN4jFQDg6suBJZ_4,20217
140
+ megadetector/visualization/visualize_detector_output.py,sha256=nrVpzjdm8OpuicRWbT7Dvob7lcaha0X26koBOmPaJYw,20286
139
141
  megadetector/visualization/visualize_video_output.py,sha256=WqG9lr9LWO5x3NW3WRKrC_DOvyftLu0VkXkmCIFtbik,20257
140
- megadetector-10.0.3.dist-info/licenses/LICENSE,sha256=RMa3qq-7Cyk7DdtqRj_bP1oInGFgjyHn9-PZ3PcrqIs,1100
141
- megadetector-10.0.3.dist-info/METADATA,sha256=mUoOYppfputCqFcprgWezSiulGDhC9KmgpJQKgRD0L8,6353
142
- megadetector-10.0.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
143
- megadetector-10.0.3.dist-info/top_level.txt,sha256=wf9DXa8EwiOSZ4G5IPjakSxBPxTDjhYYnqWRfR-zS4M,13
144
- megadetector-10.0.3.dist-info/RECORD,,
142
+ megadetector-10.0.4.dist-info/licenses/LICENSE,sha256=RMa3qq-7Cyk7DdtqRj_bP1oInGFgjyHn9-PZ3PcrqIs,1100
143
+ megadetector-10.0.4.dist-info/METADATA,sha256=EzJOHeSHWnVFX6mWhnmC70BW8uIKtbIKUYKsUcSrXSQ,6353
144
+ megadetector-10.0.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
145
+ megadetector-10.0.4.dist-info/top_level.txt,sha256=wf9DXa8EwiOSZ4G5IPjakSxBPxTDjhYYnqWRfR-zS4M,13
146
+ megadetector-10.0.4.dist-info/RECORD,,