endoreg-db 0.8.4.2__py3-none-any.whl → 0.8.4.3__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 endoreg-db might be problematic. Click here for more details.
- endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +23 -1
- endoreg_db/data/setup_config.yaml +38 -0
- endoreg_db/management/commands/load_ai_model_data.py +17 -15
- endoreg_db/management/commands/setup_endoreg_db.py +207 -39
- endoreg_db/management/commands/validate_ai_models.py +124 -0
- endoreg_db/models/medical/hardware/endoscopy_processor.py +10 -1
- endoreg_db/models/metadata/model_meta_logic.py +116 -53
- endoreg_db/services/video_import.py +172 -179
- endoreg_db/utils/setup_config.py +177 -0
- {endoreg_db-0.8.4.2.dist-info → endoreg_db-0.8.4.3.dist-info}/METADATA +1 -1
- {endoreg_db-0.8.4.2.dist-info → endoreg_db-0.8.4.3.dist-info}/RECORD +13 -10
- {endoreg_db-0.8.4.2.dist-info → endoreg_db-0.8.4.3.dist-info}/WHEEL +0 -0
- {endoreg_db-0.8.4.2.dist-info → endoreg_db-0.8.4.3.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Configuration loader for EndoReg DB setup.
|
|
3
|
+
Handles loading and parsing of setup configuration from YAML files.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import glob
|
|
7
|
+
import logging
|
|
8
|
+
import os
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Any, Dict, List, Optional
|
|
11
|
+
|
|
12
|
+
import yaml
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class SetupConfig:
|
|
18
|
+
"""
|
|
19
|
+
Handles loading and accessing setup configuration from YAML files.
|
|
20
|
+
Provides methods to get model names, search patterns, and fallback configurations.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
def __init__(self, config_file: Optional[Path] = None):
|
|
24
|
+
"""
|
|
25
|
+
Initialize the setup configuration.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
config_file: Path to the setup configuration YAML file.
|
|
29
|
+
If None, uses default location.
|
|
30
|
+
"""
|
|
31
|
+
if config_file is None:
|
|
32
|
+
# Default to setup_config.yaml in data directory
|
|
33
|
+
config_file = Path(__file__).parent.parent / "data" / "setup_config.yaml"
|
|
34
|
+
|
|
35
|
+
self.config_file = config_file
|
|
36
|
+
self._config = self._load_config()
|
|
37
|
+
|
|
38
|
+
def _load_config(self) -> Dict[str, Any]:
|
|
39
|
+
"""Load configuration from YAML file."""
|
|
40
|
+
try:
|
|
41
|
+
if self.config_file.exists():
|
|
42
|
+
with open(self.config_file, "r") as f:
|
|
43
|
+
config = yaml.safe_load(f)
|
|
44
|
+
logger.info(f"Loaded setup configuration from {self.config_file}")
|
|
45
|
+
return config or {}
|
|
46
|
+
else:
|
|
47
|
+
logger.warning(f"Setup config file not found: {self.config_file}")
|
|
48
|
+
return self._get_default_config()
|
|
49
|
+
except Exception as e:
|
|
50
|
+
logger.error(f"Error loading setup config: {e}")
|
|
51
|
+
return self._get_default_config()
|
|
52
|
+
|
|
53
|
+
def _get_default_config(self) -> Dict[str, Any]:
|
|
54
|
+
"""Return default configuration if file is not available."""
|
|
55
|
+
return {
|
|
56
|
+
"default_models": {
|
|
57
|
+
"primary_classification_model": "image_multilabel_classification_colonoscopy_default",
|
|
58
|
+
"primary_labelset": "multilabel_classification_colonoscopy_default",
|
|
59
|
+
},
|
|
60
|
+
"huggingface_fallback": {
|
|
61
|
+
"enabled": True,
|
|
62
|
+
"repo_id": "wg-lux/colo_segmentation_RegNetX800MF_base",
|
|
63
|
+
"filename": "colo_segmentation_RegNetX800MF_base.ckpt",
|
|
64
|
+
"labelset_name": "multilabel_classification_colonoscopy_default",
|
|
65
|
+
},
|
|
66
|
+
"weights_search_patterns": [
|
|
67
|
+
"colo_segmentation_RegNetX800MF_*.ckpt",
|
|
68
|
+
"image_multilabel_classification_colonoscopy_default_*.ckpt",
|
|
69
|
+
"*_colonoscopy_*.ckpt",
|
|
70
|
+
],
|
|
71
|
+
"weights_search_dirs": ["tests/assets", "assets", "data/storage/model_weights", "${STORAGE_DIR}/model_weights"],
|
|
72
|
+
"auto_generation_defaults": {
|
|
73
|
+
"activation": "sigmoid",
|
|
74
|
+
"mean": "0.485,0.456,0.406",
|
|
75
|
+
"std": "0.229,0.224,0.225",
|
|
76
|
+
"size_x": 224,
|
|
77
|
+
"size_y": 224,
|
|
78
|
+
"axes": "CHW",
|
|
79
|
+
"batchsize": 32,
|
|
80
|
+
"num_workers": 4,
|
|
81
|
+
},
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
def get_primary_model_name(self) -> str:
|
|
85
|
+
"""Get the primary classification model name."""
|
|
86
|
+
return self._config.get("default_models", {}).get("primary_classification_model", "image_multilabel_classification_colonoscopy_default")
|
|
87
|
+
|
|
88
|
+
def get_primary_labelset_name(self) -> str:
|
|
89
|
+
"""Get the primary labelset name."""
|
|
90
|
+
return self._config.get("default_models", {}).get("primary_labelset", "multilabel_classification_colonoscopy_default")
|
|
91
|
+
|
|
92
|
+
def get_huggingface_config(self) -> Dict[str, Any]:
|
|
93
|
+
"""Get HuggingFace fallback configuration."""
|
|
94
|
+
return self._config.get("huggingface_fallback", {})
|
|
95
|
+
|
|
96
|
+
def get_weights_search_patterns(self) -> List[str]:
|
|
97
|
+
"""Get weight file search patterns."""
|
|
98
|
+
return self._config.get("weights_search_patterns", ["colo_segmentation_RegNetX800MF_*.ckpt", "*_colonoscopy_*.ckpt"])
|
|
99
|
+
|
|
100
|
+
def get_weights_search_dirs(self) -> List[Path]:
|
|
101
|
+
"""
|
|
102
|
+
Get weight file search directories with environment variable substitution.
|
|
103
|
+
"""
|
|
104
|
+
dirs = self._config.get("weights_search_dirs", [])
|
|
105
|
+
resolved_dirs = []
|
|
106
|
+
|
|
107
|
+
for dir_str in dirs:
|
|
108
|
+
# Handle environment variable substitution
|
|
109
|
+
if "${" in dir_str:
|
|
110
|
+
dir_str = os.path.expandvars(dir_str)
|
|
111
|
+
|
|
112
|
+
resolved_dirs.append(Path(dir_str))
|
|
113
|
+
|
|
114
|
+
return resolved_dirs
|
|
115
|
+
|
|
116
|
+
def get_auto_generation_defaults(self) -> Dict[str, Any]:
|
|
117
|
+
"""Get default values for auto-generated metadata."""
|
|
118
|
+
return self._config.get("auto_generation_defaults", {})
|
|
119
|
+
|
|
120
|
+
def find_model_weights_files(self) -> List[Path]:
|
|
121
|
+
"""
|
|
122
|
+
Find model weight files using configured search patterns and directories.
|
|
123
|
+
|
|
124
|
+
Returns:
|
|
125
|
+
List of paths to found weight files
|
|
126
|
+
"""
|
|
127
|
+
found_files = []
|
|
128
|
+
search_dirs = self.get_weights_search_dirs()
|
|
129
|
+
search_patterns = self.get_weights_search_patterns()
|
|
130
|
+
|
|
131
|
+
for search_dir in search_dirs:
|
|
132
|
+
if not search_dir.exists():
|
|
133
|
+
continue
|
|
134
|
+
|
|
135
|
+
for pattern in search_patterns:
|
|
136
|
+
# Use glob to find files matching pattern
|
|
137
|
+
pattern_path = search_dir / pattern
|
|
138
|
+
matches = glob.glob(str(pattern_path))
|
|
139
|
+
for match in matches:
|
|
140
|
+
path = Path(match)
|
|
141
|
+
if path.exists() and path not in found_files:
|
|
142
|
+
found_files.append(path)
|
|
143
|
+
logger.info(f"Found weight file: {path}")
|
|
144
|
+
|
|
145
|
+
return found_files
|
|
146
|
+
|
|
147
|
+
def get_model_specific_config(self, model_name: str) -> Optional[Dict[str, Any]]:
|
|
148
|
+
"""
|
|
149
|
+
Get model-specific configuration from YAML metadata files.
|
|
150
|
+
|
|
151
|
+
Args:
|
|
152
|
+
model_name: Name of the model to get config for
|
|
153
|
+
|
|
154
|
+
Returns:
|
|
155
|
+
Model-specific setup configuration if found
|
|
156
|
+
"""
|
|
157
|
+
# This would need to parse the ai_model_meta YAML files
|
|
158
|
+
# and extract setup_config sections for the specified model
|
|
159
|
+
try:
|
|
160
|
+
from endoreg_db.data import AI_MODEL_META_DATA_DIR
|
|
161
|
+
|
|
162
|
+
for yaml_file in AI_MODEL_META_DATA_DIR.glob("*.yaml"):
|
|
163
|
+
with open(yaml_file, "r") as f:
|
|
164
|
+
data = yaml.safe_load(f)
|
|
165
|
+
|
|
166
|
+
if isinstance(data, list):
|
|
167
|
+
for item in data:
|
|
168
|
+
if item.get("fields", {}).get("name") == model_name or item.get("fields", {}).get("model") == model_name:
|
|
169
|
+
return item.get("setup_config", {})
|
|
170
|
+
except Exception as e:
|
|
171
|
+
logger.warning(f"Error loading model-specific config for {model_name}: {e}")
|
|
172
|
+
|
|
173
|
+
return None
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
# Global instance for easy access
|
|
177
|
+
setup_config = SetupConfig()
|
|
@@ -18,13 +18,14 @@ endoreg_db/config/env.py,sha256=S244AQRkDP0PpP0MPaShgqeBJgI1BQknfER1_vUFMD4,2673
|
|
|
18
18
|
endoreg_db/data/__init__.py,sha256=Wqu24f5-FVKE5pis0wGDYsMHOTkieN40b10S5zU5240,5932
|
|
19
19
|
endoreg_db/data/db_summary.csv,sha256=K4PcufVHQ64H1i2MbCShMxReEa96I8cL6IfwCVpqF2M,1225
|
|
20
20
|
endoreg_db/data/db_summary.xlsx,sha256=pwsc_IcxNETNrYjDXjpSW83b8f-WsSunRDiJLZXENZ0,5829
|
|
21
|
+
endoreg_db/data/setup_config.yaml,sha256=ZlL_DwHNqdulPzfZzNDlsMEHC9hSrZZ3Ri9OUDJKXn8,1301
|
|
21
22
|
endoreg_db/data/ai_model/data.yaml,sha256=9XIRMS_meioGu-vYY6zUvz4RUXhRLdalaHhCTdaq4nA,306
|
|
22
23
|
endoreg_db/data/ai_model_label/label/data.yaml,sha256=qkt0FfrLvPrcW_N0GUzu3q9TpiXrvZU047xAIOk_33A,1737
|
|
23
24
|
endoreg_db/data/ai_model_label/label/polyp_classification.yaml,sha256=lHx2VwwVgKzOM_3PcuHuSIStgvMK6rHVi3WP67Qjv70,936
|
|
24
25
|
endoreg_db/data/ai_model_label/label-set/data.yaml,sha256=ocaxnkqiZgwi4sY561TbP_DEQWkPG1hBZ3olwPOqiXQ,789
|
|
25
26
|
endoreg_db/data/ai_model_label/label-set/polyp_classifications.yaml,sha256=GVmctJCgnr2lPUMttgPThNXoLcUl4XpliiuSjvE6h_Q,443
|
|
26
27
|
endoreg_db/data/ai_model_label/label-type/data.yaml,sha256=vffKYpTae_gu63_wza6LONs5ys4pna1EbrUUO6CafQs,136
|
|
27
|
-
endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml,sha256=
|
|
28
|
+
endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml,sha256=VelCJXavWT4HYbPko1S8O1gv7wBZBsvz6r5FvjXTm2o,1196
|
|
28
29
|
endoreg_db/data/ai_model_type/data.yaml,sha256=vCMMo8wiI5uL2zrQROmgsHq1GrC8IdagGIgNdQunUeQ,149
|
|
29
30
|
endoreg_db/data/ai_model_video_segmentation_label/base_segmentation.yaml,sha256=EZ83vq02Cf2KfflWQ4HEe1NHmuzSCsmKtWW5Bv8jet0,4060
|
|
30
31
|
endoreg_db/data/ai_model_video_segmentation_labelset/data.yaml,sha256=07uB1ousJVNpp8B9enJ_YIdZf3y4sBPlME4bZwDv6ho,404
|
|
@@ -257,7 +258,7 @@ endoreg_db/management/commands/import_report.py,sha256=vFst-NeQdL-w62yoH4kDamq-2
|
|
|
257
258
|
endoreg_db/management/commands/import_video.py,sha256=AMvgi1eN0F_hjhgnNNYIFkJtHfjalBfh2lfDxw6VTzE,17980
|
|
258
259
|
endoreg_db/management/commands/import_video_with_classification.py,sha256=ulZH5jvAWu_pJ1kI9B3hbIO1-p_BReY0zbIQDS_d9OI,14726
|
|
259
260
|
endoreg_db/management/commands/init_default_ai_model.py,sha256=98yBigGZ5gkA-b1LPcvzS5x2jAms3pX58fU-TEAcjKw,4669
|
|
260
|
-
endoreg_db/management/commands/load_ai_model_data.py,sha256=
|
|
261
|
+
endoreg_db/management/commands/load_ai_model_data.py,sha256=O_mzGGcpnVacC4EZmEGbTp4EADNXJRsvaZoNFgh2wFU,2867
|
|
261
262
|
endoreg_db/management/commands/load_ai_model_label_data.py,sha256=jnm2720TsnRTBKF6guwnjLo7sropW_YoRjgyjo1TUr8,2143
|
|
262
263
|
endoreg_db/management/commands/load_base_db_data.py,sha256=0Go2cYbqfx6MBSeQaHPAq22yeJxOyX25xpmcBcE9Auw,9374
|
|
263
264
|
endoreg_db/management/commands/load_center_data.py,sha256=GQpbe7dxgbTgd66oBqrBXax-os3ibnPmCeSEFDVauPU,2570
|
|
@@ -290,10 +291,11 @@ endoreg_db/management/commands/load_unit_data.py,sha256=tcux-iL-ByT2ApgmHEkLllZS
|
|
|
290
291
|
endoreg_db/management/commands/load_user_groups.py,sha256=D7SK2FvZEHoE4TIXNGCjDw5_12MH9bpGZvoS7eEv0Os,1031
|
|
291
292
|
endoreg_db/management/commands/register_ai_model.py,sha256=KixTfuQR6TUfRmzB5GOos16BFOz7NL4TzLzBkgtPPgE,2510
|
|
292
293
|
endoreg_db/management/commands/reset_celery_schedule.py,sha256=U-m_FNRTw6LAwJoT9RUE4qrhmQXm7AyFToPcHYyJpIE,386
|
|
293
|
-
endoreg_db/management/commands/setup_endoreg_db.py,sha256=
|
|
294
|
+
endoreg_db/management/commands/setup_endoreg_db.py,sha256=C0ooVVmrzX-_ksoma3s3rZtJUcUsxvO4ddm1VhlYiiU,17640
|
|
294
295
|
endoreg_db/management/commands/start_filewatcher.py,sha256=3jESBqRiYPa9f35--zd70qQaYnyT0tzRO_b_HJuyteQ,4093
|
|
295
296
|
endoreg_db/management/commands/storage_management.py,sha256=NpToX59ndwTFNmnSoeppmiPdMvpjSHH7mAdIe4SvUoI,22396
|
|
296
297
|
endoreg_db/management/commands/summarize_db_content.py,sha256=pOIz3qbY4Ktmh0zV_DKFx971VD0pPx027gCD7a47EL0,10766
|
|
298
|
+
endoreg_db/management/commands/validate_ai_models.py,sha256=Z7Ga-PndTFVG8GnkYbS58h8ofiyhnxZDcyP5Qqpl1c8,4684
|
|
297
299
|
endoreg_db/management/commands/validate_video.py,sha256=cns_kNgztyp6XTeXuDeLEet8vAATkpxZwJuSWuQ5Olk,11302
|
|
298
300
|
endoreg_db/management/commands/validate_video_files.py,sha256=0lvA0Z8BKiibjyqc4ueI646IIc5bKI3sIOxiiF5_bTk,6509
|
|
299
301
|
endoreg_db/management/commands/video_validation.py,sha256=xnAoCPB44dmnRbn6FqUjqRXQ-ZhDPNX1T5kCpAU8sgc,771
|
|
@@ -435,7 +437,7 @@ endoreg_db/models/medical/finding/finding_intervention.py,sha256=FBwjI15yitMpTXk
|
|
|
435
437
|
endoreg_db/models/medical/finding/finding_type.py,sha256=ohDEmLcgEpYjG5q0uhCaq2xQS8jH_rj4qyKQ2DUumqQ,1117
|
|
436
438
|
endoreg_db/models/medical/hardware/__init__.py,sha256=uX2-UpBzX2chpZEeCyqbv2BSrv3OZNG9PrB8sHEWpHQ,178
|
|
437
439
|
endoreg_db/models/medical/hardware/endoscope.py,sha256=8T8R2Bo2T29psQ3C_HTrhBogN8hiysuZkJOxUefqGoI,1657
|
|
438
|
-
endoreg_db/models/medical/hardware/endoscopy_processor.py,sha256=
|
|
440
|
+
endoreg_db/models/medical/hardware/endoscopy_processor.py,sha256=9HMTgODfJo36gDg4N3QtcH3_NOriOanwYMtIPTlULVk,6626
|
|
439
441
|
endoreg_db/models/medical/laboratory/__init__.py,sha256=595XF1ikkwzQWbUsyasU23v1kDRugrgTp3eUfrMd0UQ,62
|
|
440
442
|
endoreg_db/models/medical/laboratory/lab_value.py,sha256=uw4mjguVrqvsxQ-NzGO0DoNlSCaydI8KaJgUhuM16wo,20258
|
|
441
443
|
endoreg_db/models/medical/medication/__init__.py,sha256=BHh6ARvm2uVNswN12EQAEMFPnoGBiVwl7RCjKrW6C2I,761
|
|
@@ -464,7 +466,7 @@ endoreg_db/models/medical/risk/risk_type.py,sha256=kEugcaWSTEWH_Vxq4dcF80Iv1L4_K
|
|
|
464
466
|
endoreg_db/models/metadata/__init__.py,sha256=8I6oLj3YTmeaPGJpL0AWG5gLwp38QzrEggxSkTisv7c,474
|
|
465
467
|
endoreg_db/models/metadata/frame_ocr_result.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
466
468
|
endoreg_db/models/metadata/model_meta.py,sha256=F_r-PTLeNi4J-4EaGCQkGIguhdl7Bwba7_i56ZAjc-4,7589
|
|
467
|
-
endoreg_db/models/metadata/model_meta_logic.py,sha256=
|
|
469
|
+
endoreg_db/models/metadata/model_meta_logic.py,sha256=wESdSRvnA0SthaZD2W29nbMGrichRCwaKQGnE5uCAao,16046
|
|
468
470
|
endoreg_db/models/metadata/pdf_meta.py,sha256=BTmpSgqxmPKi0apcNjyrZAS4AFKCPXVdBd6VBeyyv6E,3174
|
|
469
471
|
endoreg_db/models/metadata/sensitive_meta.py,sha256=ekLHrW-b5uYcjfkRd0EW5ncx5ef8Bu-K6msDkpWCAbk,13034
|
|
470
472
|
endoreg_db/models/metadata/sensitive_meta_logic.py,sha256=by3eCW8CgglK1SHiDOepHhTOGaugswxJhkH0BZp7-gs,33909
|
|
@@ -602,7 +604,7 @@ endoreg_db/services/pseudonym_service.py,sha256=CJhbtRa6K6SPbphgCZgEMi8AFQtB18CU
|
|
|
602
604
|
endoreg_db/services/requirements_object.py,sha256=290zf8AEbVtCoHhW4Jr7_ud-RvrqYmb1Nz9UBHtTnc0,6164
|
|
603
605
|
endoreg_db/services/segment_sync.py,sha256=YgHvIHkbW4mqCu0ACf3zjRSZnNfxWwt4gh5syUVXuE0,6400
|
|
604
606
|
endoreg_db/services/storage_aware_video_processor.py,sha256=kKFK64vXLeBSVkp1YJonU3gFDTeXZ8C4qb9QZZB99SE,13420
|
|
605
|
-
endoreg_db/services/video_import.py,sha256=
|
|
607
|
+
endoreg_db/services/video_import.py,sha256=FTFXb4A7cGp6uphDds5hyjdOcXnWAV-3LbjSIfaswvg,46241
|
|
606
608
|
endoreg_db/tasks/upload_tasks.py,sha256=OJq7DhNwcbWdXzHY8jz5c51BCVkPN5gSWOz-6Fx6W5M,7799
|
|
607
609
|
endoreg_db/tasks/video_ingest.py,sha256=kxFuYkHijINV0VabQKCFVpJRv6eCAw07tviONurDgg8,5265
|
|
608
610
|
endoreg_db/tasks/video_processing_tasks.py,sha256=rZ7Kr49bAR4Q-vALO2SURebrhcJ5hSFGwjF4aULrOao,14089
|
|
@@ -644,6 +646,7 @@ endoreg_db/utils/parse_and_generate_yaml.py,sha256=k7y0fl9Jbb_LNryeJYd6tebklRlu1
|
|
|
644
646
|
endoreg_db/utils/paths.py,sha256=ncXtB_l6FBVXXdk59U7v4FhSvLO7Yb0DQ-GQMcOqiTw,3398
|
|
645
647
|
endoreg_db/utils/permissions.py,sha256=IqxG9IqJBSZuxvT1ItVgGS8fMzkA2OLdDV6y8mKHSuo,5096
|
|
646
648
|
endoreg_db/utils/requirement_helpers.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
649
|
+
endoreg_db/utils/setup_config.py,sha256=yeDPStTEJm8Xy6ah5AJTpXMoPUyouxuPIsRUpqdiXf4,6775
|
|
647
650
|
endoreg_db/utils/translation.py,sha256=77Xel12pAGo0rQ0NxB7nfejvMb0GBjEmhC3I7mcU91I,1256
|
|
648
651
|
endoreg_db/utils/uuid.py,sha256=T4HXqYtKwXFqE5kPyvlgWHyllBBF6LL6N48nl9TpwBk,53
|
|
649
652
|
endoreg_db/utils/validate_endo_roi.py,sha256=Ct2H0JJW9gxYZc7099NYee4kxdKL90a3LGYahqibwms,925
|
|
@@ -786,7 +789,7 @@ endoreg_db/views/video/video_meta.py,sha256=C1wBMTtQb_yzEUrhFGAy2UHEWMk_CbU75WXX
|
|
|
786
789
|
endoreg_db/views/video/video_processing_history.py,sha256=mhFuS8RG5GV8E-lTtuD0qrq-bIpnUFp8vy9aERfC-J8,770
|
|
787
790
|
endoreg_db/views/video/video_remove_frames.py,sha256=2FmvNrSPM0fUXiBxINN6vBUUDCqDlBkNcGR3WsLDgKo,1696
|
|
788
791
|
endoreg_db/views/video/video_stream.py,sha256=kLyuf0ORTmsLeYUQkTQ6iRYqlIQozWhMMR3Lhfe_trk,12148
|
|
789
|
-
endoreg_db-0.8.4.
|
|
790
|
-
endoreg_db-0.8.4.
|
|
791
|
-
endoreg_db-0.8.4.
|
|
792
|
-
endoreg_db-0.8.4.
|
|
792
|
+
endoreg_db-0.8.4.3.dist-info/METADATA,sha256=KnYipnhERrjdiE4CzHQjRa9sPk9NYl62tJ3UY3cIgZk,14758
|
|
793
|
+
endoreg_db-0.8.4.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
794
|
+
endoreg_db-0.8.4.3.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
795
|
+
endoreg_db-0.8.4.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|