mirror of
https://github.com/Hestia-Homes/ML.git
synced 2026-06-08 11:17:25 +00:00
Compare commits
34 commits
sap@v0.11.
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b8dcf626b2 | ||
|
|
d09c534e0d | ||
|
|
9925b54af2 | ||
|
|
d307d9e093 | ||
|
|
1944ea1cf1 | ||
|
|
8399092e20 | ||
|
|
dc260fddd0 | ||
|
|
6f00d6afb8 | ||
|
|
1f0414a905 | ||
|
|
5e0118ca0b | ||
|
|
7e3a6f7700 | ||
|
|
396a5ffb08 | ||
|
|
a78c5a50b0 | ||
|
|
dc70b84626 | ||
|
|
e0954b52bc | ||
|
|
9e23eae27a | ||
|
|
0768ace947 | ||
|
|
4ff7cfb271 | ||
|
|
a4dffe527a | ||
|
|
8adfa72036 | ||
|
|
29b350e33b | ||
|
|
b985bbf753 | ||
|
|
f43d077479 | ||
|
|
52f33239f4 | ||
|
|
874b1db5f3 | ||
|
|
7a3477c0e1 | ||
|
|
87e3cc391e | ||
|
|
380bd6b595 | ||
|
|
50a3e2d5be | ||
|
|
620c1d10a1 | ||
|
|
179c334b6e | ||
|
|
502621e434 | ||
|
|
e97c01c366 | ||
|
|
94a6aaa38f |
15 changed files with 91 additions and 95 deletions
9
.dockerignore
Normal file
9
.dockerignore
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
modules/ml-pipeline/src/pipeline/data/predictions
|
||||||
|
modules/ml-pipeline/src/pipeline/data/fit_predictions
|
||||||
|
modules/ml-pipeline/src/pipeline/data/prepared_data
|
||||||
|
modules/ml-pipeline/src/pipeline/data/model/allmodels
|
||||||
|
modules/ml-pipeline/src/pipeline/metrics
|
||||||
|
modules/ml-pipeline/src/pipeline/__pycache__
|
||||||
|
modules/ml-pipeline/src/pipeline/.dvc
|
||||||
|
modules/ml-pipeline/src/pipeline/analysis
|
||||||
|
modules/ml-pipeline/src/pipeline/metrics
|
||||||
4
.github/workflows/Deploy.yml
vendored
4
.github/workflows/Deploy.yml
vendored
|
|
@ -19,8 +19,8 @@ jobs:
|
||||||
|
|
||||||
- name: Install Serverless and plugins
|
- name: Install Serverless and plugins
|
||||||
run: |
|
run: |
|
||||||
npm install -g serverless
|
npm install -g serverless@^3.38.0
|
||||||
npm install -g serverless-domain-manager
|
npm install -g serverless-domain-manager@^7.3.8
|
||||||
|
|
||||||
- name: Install DVC
|
- name: Install DVC
|
||||||
run: |
|
run: |
|
||||||
|
|
|
||||||
|
|
@ -8,25 +8,25 @@
|
||||||
"active": true
|
"active": true
|
||||||
},
|
},
|
||||||
"sap": {
|
"sap": {
|
||||||
"version": "v0.10.1",
|
"version": "v0.14.0",
|
||||||
"stage": {
|
"stage": {
|
||||||
"dev": "v0.10.1"
|
"dev": "v0.14.0"
|
||||||
},
|
},
|
||||||
"registered": true,
|
"registered": true,
|
||||||
"active": true
|
"active": true
|
||||||
},
|
},
|
||||||
"heat": {
|
"heat": {
|
||||||
"version": "v0.4.0",
|
"version": "v0.5.0",
|
||||||
"stage": {
|
"stage": {
|
||||||
"dev": "v0.4.0"
|
"dev": "v0.5.0"
|
||||||
},
|
},
|
||||||
"registered": true,
|
"registered": true,
|
||||||
"active": true
|
"active": true
|
||||||
},
|
},
|
||||||
"carbon": {
|
"carbon": {
|
||||||
"version": "v0.4.0",
|
"version": "v0.5.0",
|
||||||
"stage": {
|
"stage": {
|
||||||
"dev": "v0.4.0"
|
"dev": "v0.5.0"
|
||||||
},
|
},
|
||||||
"registered": true,
|
"registered": true,
|
||||||
"active": true
|
"active": true
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,9 @@
|
||||||
modules/ml-pipeline/src/pipeline/data/predictions*
|
modules/ml-pipeline/src/pipeline/data/predictions
|
||||||
modules/ml-pipeline/src/pipeline/data/prepared_data*
|
modules/ml-pipeline/src/pipeline/data/fit_predictions
|
||||||
modules/ml-pipeline/src/pipeline/data/model/allmodels*
|
modules/ml-pipeline/src/pipeline/data/prepared_data
|
||||||
modules/ml-pipeline/src/pipeline/metrics*
|
modules/ml-pipeline/src/pipeline/data/model/allmodels
|
||||||
|
modules/ml-pipeline/src/pipeline/metrics
|
||||||
|
modules/ml-pipeline/src/__pycache__
|
||||||
|
modules/ml-pipeline/src/.dvc
|
||||||
|
modules/ml-pipeline/src/analysis
|
||||||
|
modules/ml-pipeline/src/metrics
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,8 @@
|
||||||
pipeline/data/predictions*
|
pipeline/data/predictions
|
||||||
pipeline/data/prepared_data/train.parquet*
|
pipeline/data/fit_predictions
|
||||||
pipeline/data/model/allmodels*
|
pipeline/data/prepared_data/train.parquet
|
||||||
pipeline/metrics*
|
pipeline/data/fit_predictions
|
||||||
|
pipeline/data/model/allmodels
|
||||||
|
pipeline/metrics
|
||||||
|
pipeline/.dvc
|
||||||
|
pipeline/analysis
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
# Dockerfile that can be used to test loading a model to generate a prediction (part of CI/CD flow)
|
# Dockerfile that can be used to test loading a model to generate a prediction (part of CI/CD flow)
|
||||||
FROM python:3.10.12-slim
|
FROM python:3.10.12-slim
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y libgomp1
|
RUN apt-get update && apt-get install -y libgomp1 gcc python3-dev
|
||||||
|
|
||||||
COPY pipeline/requirements/predictions/requirements.txt requirements.txt
|
COPY pipeline/requirements/predictions/requirements.txt requirements.txt
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -78,6 +78,18 @@ def generate_scenario_predictions(
|
||||||
|
|
||||||
scenario_data = pd.DataFrame()
|
scenario_data = pd.DataFrame()
|
||||||
|
|
||||||
|
# If we have no scenario data, we can save empty dataframes
|
||||||
|
if scenario_data_filepaths is None:
|
||||||
|
logger.info("No scenario data filepaths provided")
|
||||||
|
output_dataclient.save_data(
|
||||||
|
obj=scenario_data, location=comparison_output_filepath, save_config=None
|
||||||
|
)
|
||||||
|
|
||||||
|
output_dataclient.save_data(
|
||||||
|
obj=scenario_data, location=metrics_output_filepath, save_config=None
|
||||||
|
)
|
||||||
|
return
|
||||||
|
|
||||||
# Can have multiple scenario data files
|
# Can have multiple scenario data files
|
||||||
for scenario_data_filepath in scenario_data_filepaths:
|
for scenario_data_filepath in scenario_data_filepaths:
|
||||||
scenario_data = pd.concat(
|
scenario_data = pd.concat(
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,9 @@ default:
|
||||||
scenario_data_filepaths:
|
scenario_data_filepaths:
|
||||||
# - s3://retrofit-data-dev/scenario_data/22-03-2024-19-20-09/recommendations_scoring_data.parquet
|
# - s3://retrofit-data-dev/scenario_data/22-03-2024-19-20-09/recommendations_scoring_data.parquet
|
||||||
# - s3://retrofit-data-dev/scenario_data/24-03-2024-20-23-25/recommendations_scoring_data.parquet
|
# - s3://retrofit-data-dev/scenario_data/24-03-2024-20-23-25/recommendations_scoring_data.parquet
|
||||||
- s3://retrofit-data-dev/scenario_data/27-03-2024-11-38-15/recommendations_scoring_data.parquet
|
# - s3://retrofit-data-dev/scenario_data/27-03-2024-11-38-15/recommendations_scoring_data.parquet
|
||||||
|
# - s3://retrofit-data-dev/scenario_data/26-05-2024-08-47-45/recommendations_scoring_data.parquet
|
||||||
|
# - s3://retrofit-data-dev/scenario_data/26-05-2024-10-44-53/recommendations_scoring_data.parquet
|
||||||
|
- s3://retrofit-data-dev/scenario_data/28-05-2024-19-22-41/recommendations_scoring_data.parquet
|
||||||
comparison_output_filepath: ./metrics/scenario_table.md
|
comparison_output_filepath: ./metrics/scenario_table.md
|
||||||
metrics_output_filepath: ./metrics/scenario_metrics.md
|
metrics_output_filepath: ./metrics/scenario_metrics.md
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,10 @@ default:
|
||||||
prepare_data:
|
prepare_data:
|
||||||
input_dataclient_type: aws-s3
|
input_dataclient_type: aws-s3
|
||||||
output_dataclient_type: local
|
output_dataclient_type: local
|
||||||
data_filepath: s3://retrofit-data-dev/sap_change_model/2024-03-22-18-56-53/dataset_rooms.parquet
|
# data_filepath: s3://retrofit-data-dev/sap_change_model/2024-03-22-18-56-53/dataset_rooms.parquet
|
||||||
|
# data_filepath: s3://retrofit-data-dev/sap_change_model/2024-05-25-08-36-36/dataset_rooms.parquet
|
||||||
|
# data_filepath: s3://retrofit-data-dev/sap_change_model/2024-05-26-10-31-39/dataset_rooms.parquet
|
||||||
|
data_filepath: s3://retrofit-data-dev/sap_change_model/2024-05-28-19-08-25/dataset_rooms.parquet
|
||||||
train_proportion: 0.9
|
train_proportion: 0.9
|
||||||
output_train_filepath: ./data/prepared_data/train.parquet
|
output_train_filepath: ./data/prepared_data/train.parquet
|
||||||
output_test_filepath: ./data/prepared_data/test.parquet
|
output_test_filepath: ./data/prepared_data/test.parquet
|
||||||
|
|
|
||||||
|
|
@ -35,52 +35,12 @@ stages:
|
||||||
- number_habitable_rooms
|
- number_habitable_rooms
|
||||||
- number_heated_rooms
|
- number_heated_rooms
|
||||||
default.feature_processor.feature_processor_config.retain_features:
|
default.feature_processor.feature_processor_config.retain_features:
|
||||||
- uprn
|
|
||||||
- sap_starting
|
|
||||||
- hot_water_energy_eff_ending
|
|
||||||
- mainheat_energy_eff_ending
|
|
||||||
- constituency
|
|
||||||
- roof_energy_eff_ending
|
|
||||||
- walls_energy_eff_ending
|
|
||||||
- secondheat_description_ending
|
|
||||||
- property_type
|
|
||||||
- mainheatc_energy_eff_ending
|
|
||||||
- built_form
|
|
||||||
- walls_insulation_thickness_ending
|
|
||||||
- potential_energy_efficiency
|
|
||||||
- transaction_type_ending
|
|
||||||
- floor_thermal_transmittance_ending
|
|
||||||
- low_energy_lighting_ending
|
|
||||||
- heat_demand_starting
|
|
||||||
- photo_supply_ending
|
|
||||||
- carbon_starting
|
|
||||||
- walls_thermal_transmittance_ending
|
|
||||||
- roof_insulation_thickness_ending
|
|
||||||
- total_floor_area_ending
|
|
||||||
- number_open_fireplaces_ending
|
|
||||||
- windows_energy_eff_ending
|
|
||||||
- floor_height_ending
|
|
||||||
- extension_count_ending
|
|
||||||
- has_air_source_heat_pump_ending
|
|
||||||
- charging_system_ending
|
|
||||||
- construction_age_band
|
|
||||||
- glazed_type_ending
|
|
||||||
- roof_thermal_transmittance_ending
|
|
||||||
- floor_insulation_thickness_ending
|
|
||||||
- has_mains_gas_ending
|
|
||||||
- estimated_perimeter_starting
|
|
||||||
- energy_consumption_potential
|
|
||||||
- environment_impact_potential
|
|
||||||
- heater_type_ending
|
|
||||||
- multi_glaze_proportion_ending
|
|
||||||
- lighting_energy_eff_ending
|
|
||||||
- fixed_lighting_outlets_count
|
|
||||||
default.feature_processor.feature_processor_config.subsample_amount:
|
default.feature_processor.feature_processor_config.subsample_amount:
|
||||||
default.feature_processor.feature_processor_config.subsample_seed: 0
|
default.feature_processor.feature_processor_config.subsample_seed: 0
|
||||||
default.feature_processor.feature_processor_config.target: sap_ending
|
default.feature_processor.feature_processor_config.target: sap_ending
|
||||||
default.feature_processor.feature_processor_type: dataframe
|
default.feature_processor.feature_processor_type: dataframe
|
||||||
default.prepare_data.data_filepath:
|
default.prepare_data.data_filepath:
|
||||||
s3://retrofit-data-dev/sap_change_model/2024-03-22-18-56-53/dataset_rooms.parquet
|
s3://retrofit-data-dev/sap_change_model/2024-05-28-19-08-25/dataset_rooms.parquet
|
||||||
default.prepare_data.input_dataclient_type: aws-s3
|
default.prepare_data.input_dataclient_type: aws-s3
|
||||||
default.prepare_data.output_dataclient_type: local
|
default.prepare_data.output_dataclient_type: local
|
||||||
default.prepare_data.output_test_filepath: ./data/prepared_data/test.parquet
|
default.prepare_data.output_test_filepath: ./data/prepared_data/test.parquet
|
||||||
|
|
@ -89,8 +49,8 @@ stages:
|
||||||
outs:
|
outs:
|
||||||
- path: data/prepared_data/
|
- path: data/prepared_data/
|
||||||
hash: md5
|
hash: md5
|
||||||
md5: efa416abea618ae6220a0c3d597603cf.dir
|
md5: 80c9e138146a1d96b9d16091c207e2e8.dir
|
||||||
size: 44750997
|
size: 45056059
|
||||||
nfiles: 2
|
nfiles: 2
|
||||||
build_model:
|
build_model:
|
||||||
cmd: python 2_build_model.py
|
cmd: python 2_build_model.py
|
||||||
|
|
@ -101,8 +61,8 @@ stages:
|
||||||
size: 4820
|
size: 4820
|
||||||
- path: data/prepared_data
|
- path: data/prepared_data
|
||||||
hash: md5
|
hash: md5
|
||||||
md5: efa416abea618ae6220a0c3d597603cf.dir
|
md5: 80c9e138146a1d96b9d16091c207e2e8.dir
|
||||||
size: 44750997
|
size: 45056059
|
||||||
nfiles: 2
|
nfiles: 2
|
||||||
params:
|
params:
|
||||||
configs/build_model.yaml:
|
configs/build_model.yaml:
|
||||||
|
|
@ -134,17 +94,17 @@ stages:
|
||||||
outs:
|
outs:
|
||||||
- path: data/fit_predictions/
|
- path: data/fit_predictions/
|
||||||
hash: md5
|
hash: md5
|
||||||
md5: de46250d454c4d713ab580b10ff3fd31.dir
|
md5: d9c9afc05e8780db47c0548b19bf7d19.dir
|
||||||
size: 3349318
|
size: 3349989
|
||||||
nfiles: 1
|
nfiles: 1
|
||||||
- path: data/model/
|
- path: data/model/
|
||||||
hash: md5
|
hash: md5
|
||||||
md5: 18bd7a93ece75a65d3a950b7dfdab4fb.dir
|
md5: 13c3100e1486c27a83a8a47491077842.dir
|
||||||
size: 735951861
|
size: 773523079
|
||||||
nfiles: 35
|
nfiles: 36
|
||||||
- path: metrics/fit_metrics.json
|
- path: metrics/fit_metrics.json
|
||||||
hash: md5
|
hash: md5
|
||||||
md5: 8a952a5e884c268e6059357a627b9251
|
md5: 2ff70a2a45813e1bcdf2ea3aa8e07d4a
|
||||||
size: 224
|
size: 224
|
||||||
generate_predictions:
|
generate_predictions:
|
||||||
cmd: python 3_generate_predictions.py
|
cmd: python 3_generate_predictions.py
|
||||||
|
|
@ -155,13 +115,13 @@ stages:
|
||||||
size: 2464
|
size: 2464
|
||||||
- path: data/model
|
- path: data/model
|
||||||
hash: md5
|
hash: md5
|
||||||
md5: 18bd7a93ece75a65d3a950b7dfdab4fb.dir
|
md5: 13c3100e1486c27a83a8a47491077842.dir
|
||||||
size: 735951861
|
size: 773523079
|
||||||
nfiles: 35
|
nfiles: 36
|
||||||
- path: data/prepared_data
|
- path: data/prepared_data
|
||||||
hash: md5
|
hash: md5
|
||||||
md5: efa416abea618ae6220a0c3d597603cf.dir
|
md5: 80c9e138146a1d96b9d16091c207e2e8.dir
|
||||||
size: 44750997
|
size: 45056059
|
||||||
nfiles: 2
|
nfiles: 2
|
||||||
params:
|
params:
|
||||||
configs/settings.yaml:
|
configs/settings.yaml:
|
||||||
|
|
@ -173,8 +133,8 @@ stages:
|
||||||
outs:
|
outs:
|
||||||
- path: data/predictions/
|
- path: data/predictions/
|
||||||
hash: md5
|
hash: md5
|
||||||
md5: 07ef721a0dc94a52e3ba7a70ac45b8ff.dir
|
md5: 5d07bcebf3160a72bb18dfd79106e85c.dir
|
||||||
size: 463563
|
size: 463197
|
||||||
nfiles: 1
|
nfiles: 1
|
||||||
generate_metrics:
|
generate_metrics:
|
||||||
cmd: python 4_generate_metrics.py
|
cmd: python 4_generate_metrics.py
|
||||||
|
|
@ -185,13 +145,13 @@ stages:
|
||||||
size: 3484
|
size: 3484
|
||||||
- path: data/predictions
|
- path: data/predictions
|
||||||
hash: md5
|
hash: md5
|
||||||
md5: 07ef721a0dc94a52e3ba7a70ac45b8ff.dir
|
md5: 5d07bcebf3160a72bb18dfd79106e85c.dir
|
||||||
size: 463563
|
size: 463197
|
||||||
nfiles: 1
|
nfiles: 1
|
||||||
- path: data/prepared_data
|
- path: data/prepared_data
|
||||||
hash: md5
|
hash: md5
|
||||||
md5: efa416abea618ae6220a0c3d597603cf.dir
|
md5: 80c9e138146a1d96b9d16091c207e2e8.dir
|
||||||
size: 44750997
|
size: 45056059
|
||||||
nfiles: 2
|
nfiles: 2
|
||||||
params:
|
params:
|
||||||
configs/settings.yaml:
|
configs/settings.yaml:
|
||||||
|
|
@ -201,30 +161,30 @@ stages:
|
||||||
outs:
|
outs:
|
||||||
- path: metrics/metrics.json
|
- path: metrics/metrics.json
|
||||||
hash: md5
|
hash: md5
|
||||||
md5: 9f863f47799d42c101eba3b03a179455
|
md5: 3e08df02fd5c5d094bcf936e1338d596
|
||||||
size: 224
|
size: 223
|
||||||
generate_scenerio_metrics:
|
generate_scenerio_metrics:
|
||||||
cmd: python 5_generate_scenarios.py
|
cmd: python 5_generate_scenarios.py
|
||||||
deps:
|
deps:
|
||||||
- path: 5_generate_scenarios.py
|
- path: 5_generate_scenarios.py
|
||||||
hash: md5
|
hash: md5
|
||||||
md5: a18f6c6ae2082f038df47386cf3e418e
|
md5: 40506749fefd926d47c60ff5b16db307
|
||||||
size: 4896
|
size: 5337
|
||||||
params:
|
params:
|
||||||
configs/scenarios.yaml:
|
configs/scenarios.yaml:
|
||||||
default.scenarios:
|
default.scenarios:
|
||||||
input_dataclient_type: aws-s3
|
input_dataclient_type: aws-s3
|
||||||
output_dataclient_type: local
|
output_dataclient_type: local
|
||||||
scenario_data_filepaths:
|
scenario_data_filepaths:
|
||||||
- s3://retrofit-data-dev/scenario_data/27-03-2024-11-38-15/recommendations_scoring_data.parquet
|
- s3://retrofit-data-dev/scenario_data/28-05-2024-19-22-41/recommendations_scoring_data.parquet
|
||||||
comparison_output_filepath: ./metrics/scenario_table.md
|
comparison_output_filepath: ./metrics/scenario_table.md
|
||||||
metrics_output_filepath: ./metrics/scenario_metrics.md
|
metrics_output_filepath: ./metrics/scenario_metrics.md
|
||||||
outs:
|
outs:
|
||||||
- path: metrics/scenario_metrics.md
|
- path: metrics/scenario_metrics.md
|
||||||
hash: md5
|
hash: md5
|
||||||
md5: 64e7db945ff655ae03c20c9845f19106
|
md5: fa4d6d7bbd7818613800da5f8f37ea96
|
||||||
size: 363
|
size: 363
|
||||||
- path: metrics/scenario_table.md
|
- path: metrics/scenario_table.md
|
||||||
hash: md5
|
hash: md5
|
||||||
md5: d4f8afe07b774374aeaa48f1b7b8a5fc
|
md5: d6baf100a1623cc2467c2f8221d314c9
|
||||||
size: 2133
|
size: 2133
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
joblib==1.3.2
|
joblib==1.3.2
|
||||||
boto3==1.28.17
|
boto3==1.28.17
|
||||||
pandas==2.1.4
|
pandas==2.1.4
|
||||||
autogluon==1.0.0
|
autogluon.tabular[all]==1.0.0
|
||||||
dynaconf==3.2.1
|
dynaconf==3.2.1
|
||||||
pyarrow==13.0.0
|
pyarrow==13.0.0
|
||||||
pre-commit==3.3.3
|
pre-commit==3.3.3
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
joblib==1.3.2
|
joblib==1.3.2
|
||||||
boto3==1.28.17
|
boto3==1.28.17
|
||||||
pandas==2.1.4
|
pandas==2.1.4
|
||||||
autogluon==1.0.0
|
autogluon.tabular[all]==1.0.0
|
||||||
dynaconf==3.2.1
|
dynaconf==3.2.1
|
||||||
pyarrow==13.0.0
|
pyarrow==13.0.0
|
||||||
PyYAML==6.0.1
|
PyYAML==6.0.1
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
joblib==1.3.2
|
joblib==1.3.2
|
||||||
boto3==1.28.17
|
boto3==1.28.17
|
||||||
pandas==2.1.4
|
pandas==2.1.4
|
||||||
autogluon==1.0.0
|
autogluon.tabular[all]==1.0.0
|
||||||
ray==2.6.3
|
ray==2.6.3
|
||||||
dynaconf==3.2.1
|
dynaconf==3.2.1
|
||||||
alibi==0.9.5
|
alibi==0.9.5
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
boto3==1.28.41
|
boto3==1.28.41
|
||||||
pandas==2.1.4
|
pandas==2.1.4
|
||||||
autogluon==1.0.0
|
autogluon.tabular[all]==1.0.0
|
||||||
dynaconf==3.2.1
|
dynaconf==3.2.1
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
dvc==3.36.0
|
dvc==3.51.0
|
||||||
dvc-s3==3.0.1
|
dvc-s3==3.2.0
|
||||||
gto==1.6.1
|
gto==1.7.1
|
||||||
pyOpenSSL==23.3.0
|
pyOpenSSL==23.3.0
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue