From d879e7dd0ade8d4c2b44492782495978f197e9f5 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 11 Oct 2024 10:57:45 +0200 Subject: [PATCH 001/148] use BuildingSimSettings no as possible and update docs --- bim2sim/examples/e1_template_plugin.py | 15 +-------------- .../PluginTemplate/bim2sim_template/__init__.py | 7 ++----- 2 files changed, 3 insertions(+), 19 deletions(-) diff --git a/bim2sim/examples/e1_template_plugin.py b/bim2sim/examples/e1_template_plugin.py index 25e2791aa9..b483ca6cbb 100644 --- a/bim2sim/examples/e1_template_plugin.py +++ b/bim2sim/examples/e1_template_plugin.py @@ -12,7 +12,7 @@ def run_simple_project(): - """Run the building simulation with teaser as backend in interactive mode. + """Run a bim2sim project with the TemplatePlugin. This example will show how to set up a project based on an IFC file, how to create bim2sim elements based on the existing IFC data with all @@ -77,19 +77,6 @@ def run_simple_project(): Path(bim2sim.__file__).parent.parent / 'test/resources/weather_files/DEU_NW_Aachen.105010_TMYx.mos') - # Assign relevant elements - # TODO this is currently not true, as we need to use TEASERTemplate, - # we need to solve #511 and #583 first - # The template plugin uses the BaseSimSettings which don't have any - # relevant elements defined. This means without overwriting the - # `relevant_elements` setting, no bim2sim elements will be created. - # Let's assign all `bps_elements` and the `Material` element. This way - # the IFC will be searched for all IFC entities that should be mapped into - # the classes defined in `bps_elements` and in the class `Material`. - # For further information about the elements structure and the mapping - # procedure please read the `elements` documentation - project.sim_settings.relevant_elements = {*bps_elements.items, Material} - # Assign the enrichment for use conditions of thermal zones. # bim2sim allows to enrich the use conditions, e.g. how many persons are diff --git a/bim2sim/plugins/PluginTemplate/bim2sim_template/__init__.py b/bim2sim/plugins/PluginTemplate/bim2sim_template/__init__.py index 2ea257fd1e..47d4f53a3a 100644 --- a/bim2sim/plugins/PluginTemplate/bim2sim_template/__init__.py +++ b/bim2sim/plugins/PluginTemplate/bim2sim_template/__init__.py @@ -4,15 +4,12 @@ """ from bim2sim.plugins import Plugin from bim2sim.tasks import common, bps -from bim2sim.plugins.PluginTEASER.bim2sim_teaser.sim_settings import \ - TEASERSimSettings +from bim2sim.sim_settings import BuildingSimSettings class PluginTemplate(Plugin): name = 'Template' - # TODO BuildingSimSetting don't work due to issues with #511 and #583 - sim_settings = TEASERSimSettings - # sim_settings = BuildingSimSettings + sim_settings = BuildingSimSettings default_tasks = [ common.LoadIFC, common.CheckIfc, From 11e2487d59d3d5f6e582362b0c809c7fb1239ac7 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 11 Oct 2024 11:45:08 +0200 Subject: [PATCH 002/148] fix teaser install, adjust python version and ifcopenshell version, update examples --- bim2sim/examples/e1_template_plugin.py | 2 +- .../examples/e2_complex_project_teaser.py | 10 ++-------- docs/source/user-guide/PluginTemplate.md | 9 ++++----- pyproject.toml | 9 ++++++--- 4 files changed, 13 insertions(+), 17 deletions(-) diff --git a/bim2sim/examples/e1_template_plugin.py b/bim2sim/examples/e1_template_plugin.py index b483ca6cbb..758577a20e 100644 --- a/bim2sim/examples/e1_template_plugin.py +++ b/bim2sim/examples/e1_template_plugin.py @@ -30,7 +30,7 @@ def run_simple_project(): # Download additional test resources for arch domain, you might want to set # force_new to True to update your test resources - download_test_resources(IFCDomain.arch, force_new=True) + # download_test_resources(IFCDomain.arch, force_new=True) # Set the ifc path to use and define which domain the IFC belongs to. # This is done via a dictionary, where the key is the domain and the value diff --git a/bim2sim/plugins/PluginTEASER/bim2sim_teaser/examples/e2_complex_project_teaser.py b/bim2sim/plugins/PluginTEASER/bim2sim_teaser/examples/e2_complex_project_teaser.py index dcfcd006a2..3bb3025f54 100644 --- a/bim2sim/plugins/PluginTEASER/bim2sim_teaser/examples/e2_complex_project_teaser.py +++ b/bim2sim/plugins/PluginTEASER/bim2sim_teaser/examples/e2_complex_project_teaser.py @@ -2,7 +2,7 @@ from pathlib import Path import bim2sim -from bim2sim import Project, ConsoleDecisionHandler +from bim2sim import Project from bim2sim.kernel.decision.decisionhandler import DebugDecisionHandler from bim2sim.kernel.log import default_logging_setup from bim2sim.utilities.types import IFCDomain, LOD, ZoningCriteria @@ -97,22 +97,16 @@ def run_example_complex_building_teaser(): # create plots based on the results after simulation project.sim_settings.create_plots = True - # Run the project with pre configured answers for decisions + # Run the project with pre-configured answers for decisions space_boundary_genenerator = 'Other' handle_proxies = (*(None,) * 12,) construction_year = 2015 answers = (space_boundary_genenerator, *handle_proxies, construction_year) - # handler = ConsoleDecisionHandler() handler = DebugDecisionHandler(answers) handler.handle(project.run()) - # Have a look at the elements/elements that were created - elements = project.playground.state['elements'] - # filter the elements only for outer walls - df_finals = project.playground.state['df_finals'] - if __name__ == '__main__': run_example_complex_building_teaser() diff --git a/docs/source/user-guide/PluginTemplate.md b/docs/source/user-guide/PluginTemplate.md index ce485e399d..a2b35453a8 100644 --- a/docs/source/user-guide/PluginTemplate.md +++ b/docs/source/user-guide/PluginTemplate.md @@ -42,15 +42,14 @@ micromamba activate bim2sim # clone bim2sim repository (you can also use SSH if you prefer) # the option "--recurse-submodules" is needed to load submodules -git clone --recurse-submodules https://github.com/BIM2SIM/bim2sim.git -# change into bim2sim folder -cd bim2sim -# use of development branch is recommended, as main branch is currently not updated regulary -git checkout development +git clone -b development https://github.com/BIM2SIM/bim2sim.git # install conda-forge packages (OCC not available via PyPi) micromamba install -c conda-forge pythonocc-core=7.7.0 +# change into bim2sim folder +cd bim2sim + # install pip requirements pip install -e '.' diff --git a/pyproject.toml b/pyproject.toml index 6630724969..e3b3ce287d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,7 +23,7 @@ authors = [ ] description = "bim2sim is a framework to create simulation models for different purposes based on BIM models in IFC format." readme = "README.md" -requires-python = ">=3.10, <=3.10.14" +requires-python = ">=3.10, <=3.11.10" classifiers = [ "Development Status :: XXX", # see https://en.wikipedia.org/wiki/Software_release_life_cycle "License :: XXX", @@ -33,7 +33,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", ] dependencies = [ - "ifcopenshell>=0.7.0", + "ifcopenshell==0.7.0.240627", "docopt==0.6.2", "numpy==1.26.0", "pandas==2.1.3", @@ -47,6 +47,9 @@ dependencies = [ "rwthcolors==0.2.4", "SciencePlots==2.1.0", "pillow==10.1.0", + "gitpython==3.1.40", + "svglib==1.5.1", + "reportlab==4.2.2", "scipy==1.11.3", # is a dependency from networkx, should installed automatically ] @@ -63,7 +66,7 @@ PluginTEASER = [ "RWTHColors", "scienceplots", "ebcpy", - "TEASER@git+https://github.com/RWTH-EBC/TEASER#egg=development", + "TEASER@git+https://github.com/RWTH-EBC/TEASER@development#egg=TEASER[report]", "BuildingsPy@git+https://github.com/DaJansenGit/BuildingsPy.git", ] PluginEnergyPlus = [ From d4b45ced8924c7b746c64b9f8bd76840aef10fe4 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 11 Oct 2024 12:53:25 +0200 Subject: [PATCH 003/148] cleanup some plugin comments --- .../examples/e1_simple_project_comfort_energyplus.py | 2 +- .../examples/e2_complex_project_bps_energyplus.py | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/bim2sim/plugins/PluginComfort/bim2sim_comfort/examples/e1_simple_project_comfort_energyplus.py b/bim2sim/plugins/PluginComfort/bim2sim_comfort/examples/e1_simple_project_comfort_energyplus.py index 810ba54ac8..5b6cb7c1b7 100644 --- a/bim2sim/plugins/PluginComfort/bim2sim_comfort/examples/e1_simple_project_comfort_energyplus.py +++ b/bim2sim/plugins/PluginComfort/bim2sim_comfort/examples/e1_simple_project_comfort_energyplus.py @@ -44,7 +44,7 @@ def run_example_1(): 'test/resources/weather_files/DEU_NW_Aachen.105010_TMYx.epw') # specified settings for workflows can be changed later as well - project.sim_settings.ep_install_path = 'C://EnergyPlusV9-4-0/' + # project.sim_settings.ep_install_path = 'C://EnergyPlusV9-4-0/' project.sim_settings.layers_and_materials = LOD.low project.sim_settings.construction_class_walls = 'heavy' project.sim_settings.construction_class_windows = \ diff --git a/bim2sim/plugins/PluginEnergyPlus/bim2sim_energyplus/examples/e2_complex_project_bps_energyplus.py b/bim2sim/plugins/PluginEnergyPlus/bim2sim_energyplus/examples/e2_complex_project_bps_energyplus.py index 4a6d7381b4..0ee787af94 100644 --- a/bim2sim/plugins/PluginEnergyPlus/bim2sim_energyplus/examples/e2_complex_project_bps_energyplus.py +++ b/bim2sim/plugins/PluginEnergyPlus/bim2sim_energyplus/examples/e2_complex_project_bps_energyplus.py @@ -2,12 +2,11 @@ from pathlib import Path import bim2sim -from bim2sim import Project, ConsoleDecisionHandler +from bim2sim import Project from bim2sim.kernel.decision.decisionhandler import DebugDecisionHandler from bim2sim.kernel.log import default_logging_setup -from bim2sim.utilities.types import IFCDomain, LOD, ZoningCriteria -from bim2sim.utilities.common_functions import download_test_resources, \ - download_library +from bim2sim.utilities.types import IFCDomain, LOD +from bim2sim.utilities.common_functions import download_test_resources def run_example_complex_building_teaser(): @@ -43,7 +42,7 @@ def run_example_complex_building_teaser(): # Set the install path to your EnergyPlus installation according to your # system requirements - project.sim_settings.ep_install_path = 'C://EnergyPlusV9-4-0/' + # project.sim_settings.ep_install_path = 'C://EnergyPlusV9-4-0/' # combine spaces to thermal zones based on their usage # use cooling From 242438c8da9a3d775f368a083a43c5918a66a3db Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 11 Oct 2024 12:53:40 +0200 Subject: [PATCH 004/148] bump to python 3.11 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index e3b3ce287d..f77edc05ce 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -74,7 +74,7 @@ PluginEnergyPlus = [ "numpy-stl", "energyplus-regressions", "eppy@git+https://github.com/BIM2SIM/eppy", - "geomeppy@git+https://github.com/BIM2SIM/geomeppy#egg=fix_dependencies", + "geomeppy@git+https://github.com/BIM2SIM/geomeppy@fix_dependencies#egg=geomeppy", "OCCUtils@git+https://github.com/tpaviot/pythonocc-utils", # from base requiremts.txt ] PluginAixLib = [ From 3e1dca2c5615881cba80b7a37a3fa6c02b19a58f Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 11 Oct 2024 13:00:39 +0200 Subject: [PATCH 005/148] correct git dependency syntax and add python 3.11 to programming languages --- pyproject.toml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index f77edc05ce..3b98005505 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,6 +31,7 @@ classifiers = [ "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", ] dependencies = [ "ifcopenshell==0.7.0.240627", @@ -78,12 +79,12 @@ PluginEnergyPlus = [ "OCCUtils@git+https://github.com/tpaviot/pythonocc-utils", # from base requiremts.txt ] PluginAixLib = [ - "pyvis@git+https://github.com/squidKid-deluxe/pyvis.git#egg=fix-show", + "pyvis@git+https://github.com/squidKid-deluxe/pyvis@fix-show#egg=pyvis", ] PluginCFD = [ # prepared to add dependencies, same installtion routine like other plugins ] PluginHKESim = [ - "pyvis@git+https://github.com/squidKid-deluxe/pyvis.git#egg=fix-show", + "pyvis@git+https://github.com/squidKid-deluxe/pyvis@fix-show#egg=pyvis", ] PluginLCA = [ # prepared to add dependencies, same installtion routine like other plugins ] From f0f4bf0e23d89b645f6e7334804741f44e88e90c Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 11 Oct 2024 13:16:45 +0200 Subject: [PATCH 006/148] prevent usage of sphinx 8.1 as this has errors with mermaid integrations --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 7a98115eac..f9154399fe 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,4 +1,4 @@ -sphinx +sphinx<=8.0.2 sphinx-rtd-theme livereload myst-parser From 4cfa609e6532abef06f1a19a11013505275e26d0 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 11 Oct 2024 14:56:08 +0200 Subject: [PATCH 007/148] try new docker image with micromamba for python 3.11 --- .gitlab-ci.yml | 18 ++++++++++++++++++ new.Dockerfile | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 new.Dockerfile diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4e3d239d60..82a8de6de5 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -35,6 +35,24 @@ include: - python ./test/resources/dl_test_resources.py --domain=hydraulic --force_new - python ./test/resources/dl_test_resources.py --domain=arch --force_new +build_new:development: + image: docker:24.0.5 + stage: build-env + services: + - name: docker:24.0.5-dind + variables: + HEALTHCHECK_TCP_PORT: "2376" + before_script: + - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN + script: + - docker build -t $CI_REGISTRY/new:development -f new.Dockerfile . + - docker push $CI_REGISTRY/new:development +# rules: +# - if: '$CI_COMMIT_REF_NAME == "development"' +# changes: +# - envBase.Dockerfile +# - requirements.txt +# - .gitlab-ci.yml build_env:main: image: docker:24.0.5 diff --git a/new.Dockerfile b/new.Dockerfile new file mode 100644 index 0000000000..67e117e5f1 --- /dev/null +++ b/new.Dockerfile @@ -0,0 +1,43 @@ +# Use Ubuntu 20.04 as the base image +FROM mambaorg/micromamba:ubuntu20.04 + +# Set environment variables +ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 + +# Install necessary packages +USER root +RUN apt-get update && \ + apt-get install -y libgl1-mesa-dev gcc g++ && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* +USER mambauser + +# Set working directory +WORKDIR /bim2sim + +# Copy code +COPY --chown=mambauser:mambauser . . + +# Create environment and install dependencies +RUN micromamba create -n env python=3.11 -y && \ + micromamba install -n env -y -c conda-forge pythonocc-core=7.7.0 nomkl + +# Activate the environment and install the requirements +RUN micromamba run -n env /bin/bash -c "\ + set -e && \ + echo 'Python version:' && python --version && \ + echo 'Pip version:' && pip --version && \ + echo 'Contents of current directory:' && ls -la && \ + echo 'Contents of pyproject.toml:' && cat pyproject.toml && \ + echo 'Installing package...' && \ + pip install -v . && \ + echo 'Installation completed successfully'" + +# install bim2sim itself +RUN micromamba run -n env pip install --no-cache-dir -e '.' + +# Clean up +RUN micromamba clean --all --yes + +# Set default command to activate the environment +CMD ["micromamba", "run", "-n", "env", "/bin/bash"] \ No newline at end of file From ac1baeb367e1503441f61a4629acce80d4a7d8c3 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 11 Oct 2024 15:26:48 +0200 Subject: [PATCH 008/148] add git to docker image --- .gitlab-ci.yml | 888 ++++++++++++++++++++++++------------------------- new.Dockerfile | 2 +- 2 files changed, 445 insertions(+), 445 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 82a8de6de5..392f24d182 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -53,447 +53,447 @@ build_new:development: # - envBase.Dockerfile # - requirements.txt # - .gitlab-ci.yml - -build_env:main: - image: docker:24.0.5 - stage: build-env - services: - - name: docker:24.0.5-dind - variables: - HEALTHCHECK_TCP_PORT: "2376" - before_script: - - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN - script: - - docker build -t $CI_REGISTRY/environment:main -f envBase.Dockerfile . - - docker push $CI_REGISTRY/environment:main - rules: - - if: '$CI_COMMIT_REF_NAME == "main"' - changes: - - envBase.Dockerfile - - requirements.txt - -build_env:development: - image: docker:24.0.5 - stage: build-env - services: - - name: docker:24.0.5-dind - variables: - HEALTHCHECK_TCP_PORT: "2376" - before_script: - - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN - script: - - docker build -t $CI_REGISTRY/environment:development -f envBase.Dockerfile . - - docker push $CI_REGISTRY/environment:development - rules: - - if: '$CI_COMMIT_REF_NAME == "development"' - changes: - - envBase.Dockerfile - - requirements.txt - - .gitlab-ci.yml - -build_env:dymola: - image: docker:24.0.5 - stage: build-env - services: - - name: docker:24.0.5-dind - variables: - HEALTHCHECK_TCP_PORT: "2376" - before_script: - - docker login -u $CI_DEPLOY_TOKEN_USERNAME_DYMOLA -p $CI_DEPLOY_TOKEN_PASSWORD_DYMOLA $CI_REGISTRY_LOGIN_DYMOLA # login dymola docker reg - script: - - docker build -t $CI_REGISTRY/environment:dymola -f envBaseDymola.Dockerfile . - - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN # login bim2sim reg - - docker push $CI_REGISTRY/environment:dymola - rules: - - if: '$CI_COMMIT_REF_NAME == "development"' - changes: - - envBaseDymola.Dockerfile - - requirements.txt - - .gitlab-ci.yml - - -build_env:energyplus: - image: docker:24.0.5 - stage: build-env-plugins - services: - - name: docker:24.0.5-dind - variables: - HEALTHCHECK_TCP_PORT: "2376" - before_script: - - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN - script: - - docker build -t $CI_REGISTRY/environment:energyplus -f bim2sim/plugins/PluginEnergyPlus/envEP.Dockerfile . - - docker push $CI_REGISTRY/environment:energyplus - rules: - - if: '$CI_COMMIT_REF_NAME == "development"' - changes: - - envBase.Dockerfile - - bim2sim/plugins/PluginEnergyPlus/envEP.Dockerfile - - bim2sim/plugins/PluginEnergyPlus/requirements.txt - - requirements.txt - - .gitlab-ci.yml - - -build_env:cfd: - image: docker:24.0.5 - stage: build-env-plugins - services: - - name: docker:24.0.5-dind - variables: - HEALTHCHECK_TCP_PORT: "2376" - before_script: - - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN - script: - - docker build -t $CI_REGISTRY/environment:cfd -f bim2sim/plugins/PluginCFD/envCFD.Dockerfile . - - docker push $CI_REGISTRY/environment:cfd - timeout: 6 hours - rules: - - if: '$CI_COMMIT_REF_NAME == "development"' - changes: - - envBase.Dockerfile - - bim2sim/plugins/PluginCFD/envCFD.Dockerfile - - requirements.txt - - .gitlab-ci.yml - -build_env:teaser: - image: docker:24.0.5 - stage: build-env-plugins - services: - - name: docker:24.0.5-dind - variables: - HEALTHCHECK_TCP_PORT: "2376" - before_script: - - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN - script: - - docker build -t $CI_REGISTRY/environment:teaser -f bim2sim/plugins/PluginTEASER/envTEASER.Dockerfile . - - docker push $CI_REGISTRY/environment:teaser - rules: - - if: '$CI_COMMIT_REF_NAME == "development"' - changes: - - envBase.Dockerfile - - bim2sim/plugins/PluginTEASER/requirements.txt - - bim2sim/plugins/PluginTEASER/envTEASER.Dockerfile - - requirements.txt - - .gitlab-ci.yml - -build_env:teaser-dymola: - image: docker:24.0.5 - stage: build-env-plugins - services: - - name: docker:24.0.5-dind - variables: - HEALTHCHECK_TCP_PORT: "2376" - before_script: - - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN - script: - - docker build -t $CI_REGISTRY/environment:teaser-dymola -f bim2sim/plugins/PluginTEASER/envTEASER-dymola.Dockerfile . - - docker push $CI_REGISTRY/environment:teaser-dymola - rules: - - if: '$CI_COMMIT_REF_NAME == "development"' - changes: - - envBase.Dockerfile - - bim2sim/plugins/PluginTEASER/requirements.txt - - bim2sim/plugins/PluginTEASER/envTEASER.Dockerfile - - requirements.txt - - .gitlab-ci.yml - -build_env:aixlib: - image: docker:24.0.5 - stage: build-env-plugins - services: - - name: docker:24.0.5-dind - variables: - HEALTHCHECK_TCP_PORT: "2376" - before_script: - - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN - script: - - docker build -t $CI_REGISTRY/environment:aixlib -f bim2sim/plugins/PluginAixLib/envAixLib.Dockerfile . - - docker push $CI_REGISTRY/environment:aixlib - rules: - - if: '$CI_COMMIT_REF_NAME == "development"' - changes: - - envBase.Dockerfile - - bim2sim/plugins/PluginAixLib/requirements.txt - - bim2sim/plugins/PluginAixLib/envAixLib.Dockerfile - - requirements.txt - - .gitlab-ci.yml - -build_tool:release: - image: docker:24.0.5 - stage: build-tool - services: - - name: docker:24.0.5-dind - variables: - HEALTHCHECK_TCP_PORT: "2376" - before_script: - - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN - script: - - docker build -t $CI_REGISTRY/tool:latest . - - docker push $CI_REGISTRY/tool:latest - rules: - - if: '$CI_COMMIT_REF_NAME == "main"' - -build_tool:development: - image: docker:24.0.5 - stage: build-tool - services: - - name: docker:24.0.5-dind - variables: - HEALTHCHECK_TCP_PORT: "2376" - before_script: - - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN - script: - - docker build -t $CI_REGISTRY/tool:development . - - docker push $CI_REGISTRY/tool:development - rules: - - if: '$CI_COMMIT_REF_NAME == "development"' - -build_tool:webdevelop: - image: docker:24.0.5 - stage: build-tool - services: - - name: docker:24.0.5-dind - variables: - HEALTHCHECK_TCP_PORT: "2376" - before_script: - - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN - script: - - docker build -t $CI_REGISTRY/tool:web_develop -f total.Dockerfile . - - docker push $CI_REGISTRY/tool:web_develop - rules: - - if: '$CI_COMMIT_REF_NAME == "development"' - -build_tool:cfd: - image: docker:24.0.5 - stage: build-tool - services: - - name: docker:24.0.5-dind - variables: - HEALTHCHECK_TCP_PORT: "2376" - before_script: - - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN - script: - - docker build -t $CI_REGISTRY/tool:cfd -f bim2sim/plugins/PluginCFD/cfd.Dockerfile . - - docker push $CI_REGISTRY/tool:cfd - rules: - - if: '$CI_COMMIT_REF_NAME == "development"' - changes: - - bim2sim/plugins/PluginCFD/* - -build_tool:teaser: - image: docker:24.0.5 - stage: build-tool - services: - - name: docker:24.0.5-dind - variables: - HEALTHCHECK_TCP_PORT: "2376" - before_script: - - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN - script: - - docker build -t $CI_REGISTRY/tool:teaser -f bim2sim/plugins/PluginTEASER/teaser.Dockerfile . - - docker push $CI_REGISTRY/tool:teaser - rules: - - if: '$CI_COMMIT_REF_NAME == "development"' - changes: - - bim2sim/plugins/PluginTEASER/* - -build_tool:aixlib: - image: docker:24.0.5 - stage: build-tool - services: - - name: docker:24.0.5-dind - variables: - HEALTHCHECK_TCP_PORT: "2376" - before_script: - - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN - script: - - docker build -t $CI_REGISTRY/tool:aixlib -f bim2sim/plugins/PluginAixLib/aixlib.Dockerfile . - - docker push $CI_REGISTRY/tool:aixlib - rules: - - if: '$CI_COMMIT_REF_NAME == "development"' - changes: - - bim2sim/plugins/PluginAixLib/* - -test_Base: - image: $CI_REGISTRY/environment:development - stage: test - before_script: - - pip install coverage - - pip install coverage-badge - script: - - mv ./* /bim2sim-coding/ - - cd /bim2sim-coding - - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - - coverage run -m unittest discover /bim2sim-coding/test - - coverage report -i - -test_EP: - image: $CI_REGISTRY/environment:energyplus - stage: test - before_script: - - pip install coverage - - pip install coverage-badge - # reinstall requirements to test current branch status - - pip install -r bim2sim/plugins/PluginEnergyPlus/requirements.txt - script: - - mv ./* /bim2sim-coding/ - - cd /bim2sim-coding - - cat /bim2sim-coding/bim2sim/plugins/PluginEnergyPlus/data/Minimal.idf - - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - - coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginEnergyPlus/test/integration - - coverage report -i - -test_EP_regression: - image: $CI_REGISTRY/environment:energyplus - stage: test - before_script: - - pip install coverage - - pip install coverage-badge - # reinstall requirements to test current branch status - - pip install -r bim2sim/plugins/PluginEnergyPlus/requirements.txt - script: - - mv ./* /bim2sim-coding/ - - cd /bim2sim-coding - - cat /bim2sim-coding/bim2sim/plugins/PluginEnergyPlus/data/Minimal.idf - - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new --with_regression - - coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginEnergyPlus/test/regression - - coverage report -i - -test_Comfort: - # EnergyPlus environment is currently used for comfort test, same requirements - image: $CI_REGISTRY/environment:energyplus - stage: test - before_script: - - pip install coverage - - pip install coverage-badge - # reinstall requirements to test current branch status - - pip install -r bim2sim/plugins/PluginEnergyPlus/requirements.txt - script: - - mv ./* /bim2sim-coding/ - - cd /bim2sim-coding - - cat /bim2sim-coding/bim2sim/plugins/PluginEnergyPlus/data/Minimal.idf - - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - - coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginComfort/test/integration - - coverage report -i - -test_Comfort_regression: - # EnergyPlus environment is currently used for comfort test, same requirements - image: $CI_REGISTRY/environment:energyplus - stage: test - before_script: - - pip install coverage - - pip install coverage-badge - # reinstall requirements to test current branch status - - pip install -r bim2sim/plugins/PluginEnergyPlus/requirements.txt - script: - - mv ./* /bim2sim-coding/ - - cd /bim2sim-coding - - cat /bim2sim-coding/bim2sim/plugins/PluginEnergyPlus/data/Minimal.idf - - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new --with_regression - - coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginComfort/test/regression - - coverage report -i - - -test_TEASER: - image: $CI_REGISTRY/environment:teaser - stage: test - before_script: - - pip install coverage - - pip install coverage-badge - # reinstall requirements to test current branch status - - pip install -r bim2sim/plugins/PluginTEASER/requirements.txt - # TODO temp workaround as CI does not seem to take current image - - pip install scipy==1.11.3 - script: - - mv ./* /bim2sim-coding/ - - cd /bim2sim-coding - - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - - coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginTEASER/test/integration - - coverage report -i - -test_TEASER_regression: - image: $CI_REGISTRY/environment:teaser-dymola - stage: test - before_script: - - pip install coverage - - pip install coverage-badge - # reinstall requirements to test current branch status - - pip install -r requirements.txt - - pip install -r bim2sim/plugins/PluginTEASER/requirements.txt - # TODO temp workaround as CI does not seem to take current image - - pip install scipy==1.11.3 - script: - - mv ./* /bim2sim-coding/ - - cd /bim2sim-coding - - python /bim2sim-coding/bim2sim/plugins/PluginTEASER/test/regression/prepare_regression_tests.py - - xvfb-run -n 77 coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginTEASER/test/regression - - coverage report -i - - mkdir /builds/EBC/EBC_all/github_ci/bim2sim/logs/ - - cp *.log /builds/EBC/EBC_all/github_ci/bim2sim/logs/ - - ls -la /builds/EBC/EBC_all/github_ci/bim2sim - - ls -la /builds/EBC/EBC_all/github_ci/bim2sim/logs - artifacts: - paths: -# - logs/* -# - logs/failed-simulator-dymola.log - - /builds/EBC/EBC_all/github_ci/bim2sim/logs/* -# - bim2sim-coding/simulator-dymola.log -# - bim2sim-coding/comparison-dymola.log -# - bim2sim-coding/unitTests-dymola.log - -test_CFD: - image: $CI_REGISTRY/environment:cfd - stage: test - before_script: - - pip install coverage - - pip install coverage-badge - script: - - mv ./* /bim2sim-coding/ - - cd /bim2sim-coding - - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - - coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginCFD/test/integration - - coverage report -i - -test_AixLib: - image: $CI_REGISTRY/environment:aixlib - stage: test - before_script: - - pip install coverage - - pip install coverage-badge - # reinstall requirements to test current branch status - - pip install -r bim2sim/plugins/PluginAixLib/requirements.txt - script: - - mv ./* /bim2sim-coding/ - - cd /bim2sim-coding - - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - - coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginAixLib/test/integration - - coverage report -i - -test_HKESim: - image: $CI_REGISTRY/environment:aixlib - stage: test - before_script: - - pip install coverage - - pip install coverage-badge - # reinstall requirements to test current branch status - - pip install -r bim2sim/plugins/PluginHKESim/requirements.txt - script: - - mv ./* /bim2sim-coding/ - - cd /bim2sim-coding - - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - - coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginHKESim/test/integration - - coverage report -i - -test_LCA: - image: $CI_REGISTRY/environment:development - stage: test - before_script: - - pip install coverage - - pip install coverage-badge - script: - - mv ./* /bim2sim-coding/ - - cd /bim2sim-coding - - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - - coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginLCA/test/integration - - coverage report -i +# +#build_env:main: +# image: docker:24.0.5 +# stage: build-env +# services: +# - name: docker:24.0.5-dind +# variables: +# HEALTHCHECK_TCP_PORT: "2376" +# before_script: +# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN +# script: +# - docker build -t $CI_REGISTRY/environment:main -f envBase.Dockerfile . +# - docker push $CI_REGISTRY/environment:main +# rules: +# - if: '$CI_COMMIT_REF_NAME == "main"' +# changes: +# - envBase.Dockerfile +# - requirements.txt +# +#build_env:development: +# image: docker:24.0.5 +# stage: build-env +# services: +# - name: docker:24.0.5-dind +# variables: +# HEALTHCHECK_TCP_PORT: "2376" +# before_script: +# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN +# script: +# - docker build -t $CI_REGISTRY/environment:development -f envBase.Dockerfile . +# - docker push $CI_REGISTRY/environment:development +# rules: +# - if: '$CI_COMMIT_REF_NAME == "development"' +# changes: +# - envBase.Dockerfile +# - requirements.txt +# - .gitlab-ci.yml +# +#build_env:dymola: +# image: docker:24.0.5 +# stage: build-env +# services: +# - name: docker:24.0.5-dind +# variables: +# HEALTHCHECK_TCP_PORT: "2376" +# before_script: +# - docker login -u $CI_DEPLOY_TOKEN_USERNAME_DYMOLA -p $CI_DEPLOY_TOKEN_PASSWORD_DYMOLA $CI_REGISTRY_LOGIN_DYMOLA # login dymola docker reg +# script: +# - docker build -t $CI_REGISTRY/environment:dymola -f envBaseDymola.Dockerfile . +# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN # login bim2sim reg +# - docker push $CI_REGISTRY/environment:dymola +# rules: +# - if: '$CI_COMMIT_REF_NAME == "development"' +# changes: +# - envBaseDymola.Dockerfile +# - requirements.txt +# - .gitlab-ci.yml +# +# +#build_env:energyplus: +# image: docker:24.0.5 +# stage: build-env-plugins +# services: +# - name: docker:24.0.5-dind +# variables: +# HEALTHCHECK_TCP_PORT: "2376" +# before_script: +# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN +# script: +# - docker build -t $CI_REGISTRY/environment:energyplus -f bim2sim/plugins/PluginEnergyPlus/envEP.Dockerfile . +# - docker push $CI_REGISTRY/environment:energyplus +# rules: +# - if: '$CI_COMMIT_REF_NAME == "development"' +# changes: +# - envBase.Dockerfile +# - bim2sim/plugins/PluginEnergyPlus/envEP.Dockerfile +# - bim2sim/plugins/PluginEnergyPlus/requirements.txt +# - requirements.txt +# - .gitlab-ci.yml +# +# +#build_env:cfd: +# image: docker:24.0.5 +# stage: build-env-plugins +# services: +# - name: docker:24.0.5-dind +# variables: +# HEALTHCHECK_TCP_PORT: "2376" +# before_script: +# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN +# script: +# - docker build -t $CI_REGISTRY/environment:cfd -f bim2sim/plugins/PluginCFD/envCFD.Dockerfile . +# - docker push $CI_REGISTRY/environment:cfd +# timeout: 6 hours +# rules: +# - if: '$CI_COMMIT_REF_NAME == "development"' +# changes: +# - envBase.Dockerfile +# - bim2sim/plugins/PluginCFD/envCFD.Dockerfile +# - requirements.txt +# - .gitlab-ci.yml +# +#build_env:teaser: +# image: docker:24.0.5 +# stage: build-env-plugins +# services: +# - name: docker:24.0.5-dind +# variables: +# HEALTHCHECK_TCP_PORT: "2376" +# before_script: +# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN +# script: +# - docker build -t $CI_REGISTRY/environment:teaser -f bim2sim/plugins/PluginTEASER/envTEASER.Dockerfile . +# - docker push $CI_REGISTRY/environment:teaser +# rules: +# - if: '$CI_COMMIT_REF_NAME == "development"' +# changes: +# - envBase.Dockerfile +# - bim2sim/plugins/PluginTEASER/requirements.txt +# - bim2sim/plugins/PluginTEASER/envTEASER.Dockerfile +# - requirements.txt +# - .gitlab-ci.yml +# +#build_env:teaser-dymola: +# image: docker:24.0.5 +# stage: build-env-plugins +# services: +# - name: docker:24.0.5-dind +# variables: +# HEALTHCHECK_TCP_PORT: "2376" +# before_script: +# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN +# script: +# - docker build -t $CI_REGISTRY/environment:teaser-dymola -f bim2sim/plugins/PluginTEASER/envTEASER-dymola.Dockerfile . +# - docker push $CI_REGISTRY/environment:teaser-dymola +# rules: +# - if: '$CI_COMMIT_REF_NAME == "development"' +# changes: +# - envBase.Dockerfile +# - bim2sim/plugins/PluginTEASER/requirements.txt +# - bim2sim/plugins/PluginTEASER/envTEASER.Dockerfile +# - requirements.txt +# - .gitlab-ci.yml +# +#build_env:aixlib: +# image: docker:24.0.5 +# stage: build-env-plugins +# services: +# - name: docker:24.0.5-dind +# variables: +# HEALTHCHECK_TCP_PORT: "2376" +# before_script: +# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN +# script: +# - docker build -t $CI_REGISTRY/environment:aixlib -f bim2sim/plugins/PluginAixLib/envAixLib.Dockerfile . +# - docker push $CI_REGISTRY/environment:aixlib +# rules: +# - if: '$CI_COMMIT_REF_NAME == "development"' +# changes: +# - envBase.Dockerfile +# - bim2sim/plugins/PluginAixLib/requirements.txt +# - bim2sim/plugins/PluginAixLib/envAixLib.Dockerfile +# - requirements.txt +# - .gitlab-ci.yml +# +#build_tool:release: +# image: docker:24.0.5 +# stage: build-tool +# services: +# - name: docker:24.0.5-dind +# variables: +# HEALTHCHECK_TCP_PORT: "2376" +# before_script: +# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN +# script: +# - docker build -t $CI_REGISTRY/tool:latest . +# - docker push $CI_REGISTRY/tool:latest +# rules: +# - if: '$CI_COMMIT_REF_NAME == "main"' +# +#build_tool:development: +# image: docker:24.0.5 +# stage: build-tool +# services: +# - name: docker:24.0.5-dind +# variables: +# HEALTHCHECK_TCP_PORT: "2376" +# before_script: +# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN +# script: +# - docker build -t $CI_REGISTRY/tool:development . +# - docker push $CI_REGISTRY/tool:development +# rules: +# - if: '$CI_COMMIT_REF_NAME == "development"' +# +#build_tool:webdevelop: +# image: docker:24.0.5 +# stage: build-tool +# services: +# - name: docker:24.0.5-dind +# variables: +# HEALTHCHECK_TCP_PORT: "2376" +# before_script: +# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN +# script: +# - docker build -t $CI_REGISTRY/tool:web_develop -f total.Dockerfile . +# - docker push $CI_REGISTRY/tool:web_develop +# rules: +# - if: '$CI_COMMIT_REF_NAME == "development"' +# +#build_tool:cfd: +# image: docker:24.0.5 +# stage: build-tool +# services: +# - name: docker:24.0.5-dind +# variables: +# HEALTHCHECK_TCP_PORT: "2376" +# before_script: +# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN +# script: +# - docker build -t $CI_REGISTRY/tool:cfd -f bim2sim/plugins/PluginCFD/cfd.Dockerfile . +# - docker push $CI_REGISTRY/tool:cfd +# rules: +# - if: '$CI_COMMIT_REF_NAME == "development"' +# changes: +# - bim2sim/plugins/PluginCFD/* +# +#build_tool:teaser: +# image: docker:24.0.5 +# stage: build-tool +# services: +# - name: docker:24.0.5-dind +# variables: +# HEALTHCHECK_TCP_PORT: "2376" +# before_script: +# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN +# script: +# - docker build -t $CI_REGISTRY/tool:teaser -f bim2sim/plugins/PluginTEASER/teaser.Dockerfile . +# - docker push $CI_REGISTRY/tool:teaser +# rules: +# - if: '$CI_COMMIT_REF_NAME == "development"' +# changes: +# - bim2sim/plugins/PluginTEASER/* +# +#build_tool:aixlib: +# image: docker:24.0.5 +# stage: build-tool +# services: +# - name: docker:24.0.5-dind +# variables: +# HEALTHCHECK_TCP_PORT: "2376" +# before_script: +# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN +# script: +# - docker build -t $CI_REGISTRY/tool:aixlib -f bim2sim/plugins/PluginAixLib/aixlib.Dockerfile . +# - docker push $CI_REGISTRY/tool:aixlib +# rules: +# - if: '$CI_COMMIT_REF_NAME == "development"' +# changes: +# - bim2sim/plugins/PluginAixLib/* +# +#test_Base: +# image: $CI_REGISTRY/environment:development +# stage: test +# before_script: +# - pip install coverage +# - pip install coverage-badge +# script: +# - mv ./* /bim2sim-coding/ +# - cd /bim2sim-coding +# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new +# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new +# - coverage run -m unittest discover /bim2sim-coding/test +# - coverage report -i +# +#test_EP: +# image: $CI_REGISTRY/environment:energyplus +# stage: test +# before_script: +# - pip install coverage +# - pip install coverage-badge +# # reinstall requirements to test current branch status +# - pip install -r bim2sim/plugins/PluginEnergyPlus/requirements.txt +# script: +# - mv ./* /bim2sim-coding/ +# - cd /bim2sim-coding +# - cat /bim2sim-coding/bim2sim/plugins/PluginEnergyPlus/data/Minimal.idf +# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new +# - coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginEnergyPlus/test/integration +# - coverage report -i +# +#test_EP_regression: +# image: $CI_REGISTRY/environment:energyplus +# stage: test +# before_script: +# - pip install coverage +# - pip install coverage-badge +# # reinstall requirements to test current branch status +# - pip install -r bim2sim/plugins/PluginEnergyPlus/requirements.txt +# script: +# - mv ./* /bim2sim-coding/ +# - cd /bim2sim-coding +# - cat /bim2sim-coding/bim2sim/plugins/PluginEnergyPlus/data/Minimal.idf +# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new --with_regression +# - coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginEnergyPlus/test/regression +# - coverage report -i +# +#test_Comfort: +# # EnergyPlus environment is currently used for comfort test, same requirements +# image: $CI_REGISTRY/environment:energyplus +# stage: test +# before_script: +# - pip install coverage +# - pip install coverage-badge +# # reinstall requirements to test current branch status +# - pip install -r bim2sim/plugins/PluginEnergyPlus/requirements.txt +# script: +# - mv ./* /bim2sim-coding/ +# - cd /bim2sim-coding +# - cat /bim2sim-coding/bim2sim/plugins/PluginEnergyPlus/data/Minimal.idf +# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new +# - coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginComfort/test/integration +# - coverage report -i +# +#test_Comfort_regression: +# # EnergyPlus environment is currently used for comfort test, same requirements +# image: $CI_REGISTRY/environment:energyplus +# stage: test +# before_script: +# - pip install coverage +# - pip install coverage-badge +# # reinstall requirements to test current branch status +# - pip install -r bim2sim/plugins/PluginEnergyPlus/requirements.txt +# script: +# - mv ./* /bim2sim-coding/ +# - cd /bim2sim-coding +# - cat /bim2sim-coding/bim2sim/plugins/PluginEnergyPlus/data/Minimal.idf +# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new --with_regression +# - coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginComfort/test/regression +# - coverage report -i +# +# +#test_TEASER: +# image: $CI_REGISTRY/environment:teaser +# stage: test +# before_script: +# - pip install coverage +# - pip install coverage-badge +# # reinstall requirements to test current branch status +# - pip install -r bim2sim/plugins/PluginTEASER/requirements.txt +# # TODO temp workaround as CI does not seem to take current image +# - pip install scipy==1.11.3 +# script: +# - mv ./* /bim2sim-coding/ +# - cd /bim2sim-coding +# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new +# - coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginTEASER/test/integration +# - coverage report -i +# +#test_TEASER_regression: +# image: $CI_REGISTRY/environment:teaser-dymola +# stage: test +# before_script: +# - pip install coverage +# - pip install coverage-badge +# # reinstall requirements to test current branch status +# - pip install -r requirements.txt +# - pip install -r bim2sim/plugins/PluginTEASER/requirements.txt +# # TODO temp workaround as CI does not seem to take current image +# - pip install scipy==1.11.3 +# script: +# - mv ./* /bim2sim-coding/ +# - cd /bim2sim-coding +# - python /bim2sim-coding/bim2sim/plugins/PluginTEASER/test/regression/prepare_regression_tests.py +# - xvfb-run -n 77 coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginTEASER/test/regression +# - coverage report -i +# - mkdir /builds/EBC/EBC_all/github_ci/bim2sim/logs/ +# - cp *.log /builds/EBC/EBC_all/github_ci/bim2sim/logs/ +# - ls -la /builds/EBC/EBC_all/github_ci/bim2sim +# - ls -la /builds/EBC/EBC_all/github_ci/bim2sim/logs +# artifacts: +# paths: +## - logs/* +## - logs/failed-simulator-dymola.log +# - /builds/EBC/EBC_all/github_ci/bim2sim/logs/* +## - bim2sim-coding/simulator-dymola.log +## - bim2sim-coding/comparison-dymola.log +## - bim2sim-coding/unitTests-dymola.log +# +#test_CFD: +# image: $CI_REGISTRY/environment:cfd +# stage: test +# before_script: +# - pip install coverage +# - pip install coverage-badge +# script: +# - mv ./* /bim2sim-coding/ +# - cd /bim2sim-coding +# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new +# - coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginCFD/test/integration +# - coverage report -i +# +#test_AixLib: +# image: $CI_REGISTRY/environment:aixlib +# stage: test +# before_script: +# - pip install coverage +# - pip install coverage-badge +# # reinstall requirements to test current branch status +# - pip install -r bim2sim/plugins/PluginAixLib/requirements.txt +# script: +# - mv ./* /bim2sim-coding/ +# - cd /bim2sim-coding +# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new +# - coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginAixLib/test/integration +# - coverage report -i +# +#test_HKESim: +# image: $CI_REGISTRY/environment:aixlib +# stage: test +# before_script: +# - pip install coverage +# - pip install coverage-badge +# # reinstall requirements to test current branch status +# - pip install -r bim2sim/plugins/PluginHKESim/requirements.txt +# script: +# - mv ./* /bim2sim-coding/ +# - cd /bim2sim-coding +# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new +# - coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginHKESim/test/integration +# - coverage report -i +# +#test_LCA: +# image: $CI_REGISTRY/environment:development +# stage: test +# before_script: +# - pip install coverage +# - pip install coverage-badge +# script: +# - mv ./* /bim2sim-coding/ +# - cd /bim2sim-coding +# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new +# - coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginLCA/test/integration +# - coverage report -i diff --git a/new.Dockerfile b/new.Dockerfile index 67e117e5f1..8bf132e810 100644 --- a/new.Dockerfile +++ b/new.Dockerfile @@ -7,7 +7,7 @@ ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 # Install necessary packages USER root RUN apt-get update && \ - apt-get install -y libgl1-mesa-dev gcc g++ && \ + apt-get install -y libgl1-mesa-dev gcc g++ git && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* USER mambauser From c9b2fd6f3acacb2d2fe3afe37ccc7f892a969875 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 11 Oct 2024 15:36:11 +0200 Subject: [PATCH 009/148] update entrypoint of image --- new.Dockerfile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/new.Dockerfile b/new.Dockerfile index 8bf132e810..2d6c38092b 100644 --- a/new.Dockerfile +++ b/new.Dockerfile @@ -39,5 +39,6 @@ RUN micromamba run -n env pip install --no-cache-dir -e '.' # Clean up RUN micromamba clean --all --yes -# Set default command to activate the environment -CMD ["micromamba", "run", "-n", "env", "/bin/bash"] \ No newline at end of file +# Set the default command to run your application in the 'env' environment +ENTRYPOINT ["micromamba", "run", "-n", "env"] +CMD ["python", "-c", "import bim2sim; print('bim2sim version:', bim2sim.VERSION)"] \ No newline at end of file From effece9168f8130f84666cdd27a77408eff7eb49 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Mon, 14 Oct 2024 08:41:54 +0200 Subject: [PATCH 010/148] try to run tests with new image --- .gitlab-ci.yml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 392f24d182..818a60b2c4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -314,19 +314,19 @@ build_new:development: # changes: # - bim2sim/plugins/PluginAixLib/* # -#test_Base: -# image: $CI_REGISTRY/environment:development -# stage: test -# before_script: -# - pip install coverage -# - pip install coverage-badge -# script: -# - mv ./* /bim2sim-coding/ -# - cd /bim2sim-coding -# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new -# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new -# - coverage run -m unittest discover /bim2sim-coding/test -# - coverage report -i +test_Base_new: + image: $CI_REGISTRY/new:development + stage: test + before_script: + - pip install coverage + - pip install coverage-badge + script: + - mv ./* /bim2sim-coding/ + - cd /bim2sim-coding + - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new + - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new + - coverage run -m unittest discover /bim2sim-coding/test + - coverage report -i # #test_EP: # image: $CI_REGISTRY/environment:energyplus From 02be120d46e3f2665946bb918e49050c8dfe4f91 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Mon, 14 Oct 2024 08:48:37 +0200 Subject: [PATCH 011/148] test to activate environment by default via micromamba --- .gitlab-ci.yml | 66 +++++++++++++++++++++++++------------------------- new.Dockerfile | 11 ++++++--- 2 files changed, 41 insertions(+), 36 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 818a60b2c4..e7e4552687 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,11 +1,11 @@ stages: - - test - - doc - - code_quality - - deploy +# - test +# - doc +# - code_quality +# - deploy - build-env - - build-env-plugins - - build-tool +# - build-env-plugins +# - build-tool variables: # TODO variable inside variable seems not be working on our gitlab instance, @@ -19,21 +19,21 @@ variables: TEST_ENGINE: "unittest" TEST_PATH: test -include: - - project: 'EBC/EBC_all/gitlab_ci/templates' - file: 'python/code-quality/pylint.gitlab-ci.yml' - - project: 'EBC/EBC_all/gitlab_ci/templates' - file: 'python/doc/sphinxdoc.gitlab-ci.yml' - - project: 'EBC/EBC_all/gitlab_ci/templates' - file: 'pages/gh-pages.gitlab-ci.yml' - - project: 'EBC/EBC_all/gitlab_ci/templates' - file: 'python/tests/coverage.gitlab-ci.yml' +#include: +# - project: 'EBC/EBC_all/gitlab_ci/templates' +# file: 'python/code-quality/pylint.gitlab-ci.yml' +# - project: 'EBC/EBC_all/gitlab_ci/templates' +# file: 'python/doc/sphinxdoc.gitlab-ci.yml' +# - project: 'EBC/EBC_all/gitlab_ci/templates' +# file: 'pages/gh-pages.gitlab-ci.yml' +# - project: 'EBC/EBC_all/gitlab_ci/templates' +# file: 'python/tests/coverage.gitlab-ci.yml' # This is a workaround to download the test files by overwriting the utils method from original CI testing of EBC -.install_local_repository: - script: - - python ./test/resources/dl_test_resources.py --domain=hydraulic --force_new - - python ./test/resources/dl_test_resources.py --domain=arch --force_new +#.install_local_repository: +# script: +# - python ./test/resources/dl_test_resources.py --domain=hydraulic --force_new +# - python ./test/resources/dl_test_resources.py --domain=arch --force_new build_new:development: image: docker:24.0.5 @@ -314,20 +314,20 @@ build_new:development: # changes: # - bim2sim/plugins/PluginAixLib/* # -test_Base_new: - image: $CI_REGISTRY/new:development - stage: test - before_script: - - pip install coverage - - pip install coverage-badge - script: - - mv ./* /bim2sim-coding/ - - cd /bim2sim-coding - - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - - coverage run -m unittest discover /bim2sim-coding/test - - coverage report -i -# +#test_Base_new: +# image: $CI_REGISTRY/new:development +# stage: test +# before_script: +# - pip install coverage +# - pip install coverage-badge +# script: +# - mv ./* /bim2sim-coding/ +# - cd /bim2sim-coding +# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new +# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new +# - coverage run -m unittest discover /bim2sim-coding/test +# - coverage report -i +## #test_EP: # image: $CI_REGISTRY/environment:energyplus # stage: test diff --git a/new.Dockerfile b/new.Dockerfile index 2d6c38092b..383b52d8cc 100644 --- a/new.Dockerfile +++ b/new.Dockerfile @@ -39,6 +39,11 @@ RUN micromamba run -n env pip install --no-cache-dir -e '.' # Clean up RUN micromamba clean --all --yes -# Set the default command to run your application in the 'env' environment -ENTRYPOINT ["micromamba", "run", "-n", "env"] -CMD ["python", "-c", "import bim2sim; print('bim2sim version:', bim2sim.VERSION)"] \ No newline at end of file +# Set up the shell to use micromamba activate +SHELL ["/bin/bash", "-c"] +RUN echo "source /opt/conda/etc/profile.d/micromamba.sh" >> ~/.bashrc && \ + echo "micromamba activate env" >> ~/.bashrc + +# Set the entrypoint to use bash, which will source .bashrc and activate the environment +ENTRYPOINT ["/bin/bash", "-c"] +CMD ["python -c \"import bim2sim; print('bim2sim version:', bim2sim.VERSION)\""] \ No newline at end of file From c06dcdb26d9c3b8d7616c7a2f8ca0271bffea677 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Mon, 14 Oct 2024 09:03:40 +0200 Subject: [PATCH 012/148] test with new image --- .gitlab-ci.yml | 54 +++++++++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e7e4552687..ed0b0e4dea 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,9 +1,9 @@ stages: -# - test + - test # - doc # - code_quality # - deploy - - build-env +# - build-env # - build-env-plugins # - build-tool @@ -35,18 +35,18 @@ variables: # - python ./test/resources/dl_test_resources.py --domain=hydraulic --force_new # - python ./test/resources/dl_test_resources.py --domain=arch --force_new -build_new:development: - image: docker:24.0.5 - stage: build-env - services: - - name: docker:24.0.5-dind - variables: - HEALTHCHECK_TCP_PORT: "2376" - before_script: - - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN - script: - - docker build -t $CI_REGISTRY/new:development -f new.Dockerfile . - - docker push $CI_REGISTRY/new:development +#build_new:development: +# image: docker:24.0.5 +# stage: build-env +# services: +# - name: docker:24.0.5-dind +# variables: +# HEALTHCHECK_TCP_PORT: "2376" +# before_script: +# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN +# script: +# - docker build -t $CI_REGISTRY/new:development -f new.Dockerfile . +# - docker push $CI_REGISTRY/new:development # rules: # - if: '$CI_COMMIT_REF_NAME == "development"' # changes: @@ -314,19 +314,19 @@ build_new:development: # changes: # - bim2sim/plugins/PluginAixLib/* # -#test_Base_new: -# image: $CI_REGISTRY/new:development -# stage: test -# before_script: -# - pip install coverage -# - pip install coverage-badge -# script: -# - mv ./* /bim2sim-coding/ -# - cd /bim2sim-coding -# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new -# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new -# - coverage run -m unittest discover /bim2sim-coding/test -# - coverage report -i +test_Base_new: + image: $CI_REGISTRY/new:development + stage: test + before_script: + - pip install coverage + - pip install coverage-badge + script: + - mv ./* /bim2sim-coding/ + - cd /bim2sim-coding + - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new + - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new + - coverage run -m unittest discover /bim2sim-coding/test + - coverage report -i ## #test_EP: # image: $CI_REGISTRY/environment:energyplus From fdf00345ebea4cf3cf97b1795dbd8e3c7968f3d6 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Mon, 14 Oct 2024 09:08:31 +0200 Subject: [PATCH 013/148] test activating environment by script --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ed0b0e4dea..0f6b849c75 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -318,6 +318,7 @@ test_Base_new: image: $CI_REGISTRY/new:development stage: test before_script: + - micromamba activate env - pip install coverage - pip install coverage-badge script: From a0f8fd61b2e9bb531d2a40ec08ee744b30933b1b Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Mon, 14 Oct 2024 09:18:12 +0200 Subject: [PATCH 014/148] try old miniconda with new python version and pyproject.toml --- .gitlab-ci.yml | 19 +++++++++++++++++++ envBase.Dockerfile => Base.Dockerfile | 20 ++++++++++---------- 2 files changed, 29 insertions(+), 10 deletions(-) rename envBase.Dockerfile => Base.Dockerfile (78%) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0f6b849c75..cb0bb6bbc3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -35,6 +35,25 @@ variables: # - python ./test/resources/dl_test_resources.py --domain=hydraulic --force_new # - python ./test/resources/dl_test_resources.py --domain=arch --force_new +build_new:development: + image: docker:24.0.5 + stage: build-env + services: + - name: docker:24.0.5-dind + variables: + HEALTHCHECK_TCP_PORT: "2376" + before_script: + - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN + script: + - docker build -t $CI_REGISTRY/base:development -f Base.Dockerfile . + - docker push $CI_REGISTRY/base:development +# rules: +# - if: '$CI_COMMIT_REF_NAME == "development"' +# changes: +# - envBase.Dockerfile +# - requirements.txt +# - .gitlab-ci.yml + #build_new:development: # image: docker:24.0.5 # stage: build-env diff --git a/envBase.Dockerfile b/Base.Dockerfile similarity index 78% rename from envBase.Dockerfile rename to Base.Dockerfile index 5779cae86f..e0aaa8531c 100644 --- a/envBase.Dockerfile +++ b/Base.Dockerfile @@ -42,12 +42,12 @@ RUN apt-get -y install gcc RUN apt-get -y install g++ # Copy files -COPY ./requirements.txt . +COPY . . # Turn off SSL as it leads to errors in current runner systems RUN conda config --set ssl_verify False -RUN conda create -n env python=3.10 +RUN conda create -n env python=3.11 RUN conda update -n base -c defaults conda RUN echo "source activate env" > ~/.bashrc ENV PATH /opt/conda/envs/env/bin:$PATH @@ -64,17 +64,17 @@ RUN /opt/conda/bin/conda install --yes --freeze-installed \ && find /opt/conda/ -follow -type f -name '*.js.map' -delete -RUN pip install --default-timeout=100 -r ./requirements.txt +RUN pip install --no-cache-dir -e '.' # Set Pythonpath -ENV PYTHONPATH "${PYTHONPATH}:/bim2sim-coding/bim2sim" -ENV PYTHONPATH "${PYTHONPATH}:/bim2sim-coding/bim2sim/plugins/PluginEnergyPlus" -ENV PYTHONPATH "${PYTHONPATH}:/bim2sim-coding/bim2sim/plugins/PluginCFD" -ENV PYTHONPATH "${PYTHONPATH}:/bim2sim-coding/bim2sim/plugins/PluginAixLib" -ENV PYTHONPATH "${PYTHONPATH}:/bim2sim-coding/bim2sim/plugins/PluginHKESim" -ENV PYTHONPATH "${PYTHONPATH}:/bim2sim-coding/bim2sim/plugins/PluginTEASER" -ENV PYTHONPATH "${PYTHONPATH}:/bim2sim-coding/bim2sim/plugins/PluginLCA" +#ENV PYTHONPATH "${PYTHONPATH}:/bim2sim-coding/bim2sim" +#ENV PYTHONPATH "${PYTHONPATH}:/bim2sim-coding/bim2sim/plugins/PluginEnergyPlus" +#ENV PYTHONPATH "${PYTHONPATH}:/bim2sim-coding/bim2sim/plugins/PluginCFD" +#ENV PYTHONPATH "${PYTHONPATH}:/bim2sim-coding/bim2sim/plugins/PluginAixLib" +#ENV PYTHONPATH "${PYTHONPATH}:/bim2sim-coding/bim2sim/plugins/PluginHKESim" +#ENV PYTHONPATH "${PYTHONPATH}:/bim2sim-coding/bim2sim/plugins/PluginTEASER" +#ENV PYTHONPATH "${PYTHONPATH}:/bim2sim-coding/bim2sim/plugins/PluginLCA" ######################################################## From d8f103fadc949e035d043de1bbf4cb023513838c Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Mon, 14 Oct 2024 09:18:39 +0200 Subject: [PATCH 015/148] update pipeline --- .gitlab-ci.yml | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cb0bb6bbc3..aa435fc455 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,9 +1,9 @@ stages: - - test +# - test # - doc # - code_quality # - deploy -# - build-env + - build-env # - build-env-plugins # - build-tool @@ -333,20 +333,20 @@ build_new:development: # changes: # - bim2sim/plugins/PluginAixLib/* # -test_Base_new: - image: $CI_REGISTRY/new:development - stage: test - before_script: - - micromamba activate env - - pip install coverage - - pip install coverage-badge - script: - - mv ./* /bim2sim-coding/ - - cd /bim2sim-coding - - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - - coverage run -m unittest discover /bim2sim-coding/test - - coverage report -i +#test_Base_new: +# image: $CI_REGISTRY/new:development +# stage: test +# before_script: +# - micromamba activate env +# - pip install coverage +# - pip install coverage-badge +# script: +# - mv ./* /bim2sim-coding/ +# - cd /bim2sim-coding +# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new +# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new +# - coverage run -m unittest discover /bim2sim-coding/test +# - coverage report -i ## #test_EP: # image: $CI_REGISTRY/environment:energyplus From 68e67ead0767f78e2ffdaf4f0f76e24fde1b23b5 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Mon, 14 Oct 2024 09:28:47 +0200 Subject: [PATCH 016/148] specify python version --- Base.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Base.Dockerfile b/Base.Dockerfile index e0aaa8531c..02d7ef53b7 100644 --- a/Base.Dockerfile +++ b/Base.Dockerfile @@ -47,7 +47,7 @@ COPY . . # Turn off SSL as it leads to errors in current runner systems RUN conda config --set ssl_verify False -RUN conda create -n env python=3.11 +RUN conda create -n env python=3.11.10 RUN conda update -n base -c defaults conda RUN echo "source activate env" > ~/.bashrc ENV PATH /opt/conda/envs/env/bin:$PATH From d4a979c71e052dea695ea5719dff2e071028e666 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Mon, 14 Oct 2024 09:32:03 +0200 Subject: [PATCH 017/148] update miniconda to use python 3.11 --- Base.Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Base.Dockerfile b/Base.Dockerfile index 02d7ef53b7..221892ec5a 100644 --- a/Base.Dockerfile +++ b/Base.Dockerfile @@ -15,7 +15,7 @@ RUN apt-get update --fix-missing && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* -RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-4.5.11-Linux-x86_64.sh -O ~/miniconda.sh && \ +RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.2-0-Linux-x86_64.sh -O ~/miniconda.sh && \ /bin/bash ~/miniconda.sh -b -p /opt/conda && \ rm ~/miniconda.sh && \ /opt/conda/bin/conda clean -tipsy && \ @@ -47,7 +47,7 @@ COPY . . # Turn off SSL as it leads to errors in current runner systems RUN conda config --set ssl_verify False -RUN conda create -n env python=3.11.10 +RUN conda create -n env python=3.11 RUN conda update -n base -c defaults conda RUN echo "source activate env" > ~/.bashrc ENV PATH /opt/conda/envs/env/bin:$PATH From a18a5fc382587535a92bc0ddfa82852ff467e04f Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 18 Oct 2024 15:00:02 +0200 Subject: [PATCH 018/148] update miniconda version --- Base.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Base.Dockerfile b/Base.Dockerfile index 221892ec5a..08ee44c379 100644 --- a/Base.Dockerfile +++ b/Base.Dockerfile @@ -15,7 +15,7 @@ RUN apt-get update --fix-missing && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* -RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.2-0-Linux-x86_64.sh -O ~/miniconda.sh && \ +RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-py39_24.7.1-0-Linux-x86_64.sh -O ~/miniconda.sh && \ /bin/bash ~/miniconda.sh -b -p /opt/conda && \ rm ~/miniconda.sh && \ /opt/conda/bin/conda clean -tipsy && \ From c8743ab8845db3fde5812ea9c6f0b5f6b71043bd Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 18 Oct 2024 15:15:41 +0200 Subject: [PATCH 019/148] update miniconda version --- Base.Dockerfile | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/Base.Dockerfile b/Base.Dockerfile index 08ee44c379..9a7a27f9d1 100644 --- a/Base.Dockerfile +++ b/Base.Dockerfile @@ -8,20 +8,30 @@ FROM ubuntu:20.04 # $ docker push continuumio/miniconda3:4.5.11 ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 -ENV PATH /opt/conda/bin:$PATH +ENV PATH="/root/miniconda3/bin:${PATH}" +ARG PATH="/root/miniconda3/bin:${PATH}" RUN apt-get update --fix-missing && \ apt-get install -y wget bzip2 ca-certificates curl git && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* -RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-py39_24.7.1-0-Linux-x86_64.sh -O ~/miniconda.sh && \ - /bin/bash ~/miniconda.sh -b -p /opt/conda && \ - rm ~/miniconda.sh && \ - /opt/conda/bin/conda clean -tipsy && \ - ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh && \ - echo ". /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc && \ - echo "conda activate base" >> ~/.bashrc +# Install Miniconda on x86 or ARM platforms +RUN arch=$(uname -m) && \ + if [ "$arch" = "x86_64" ]; then \ + MINICONDA_URL="https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh"; \ + elif [ "$arch" = "aarch64" ]; then \ + MINICONDA_URL="https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh"; \ + else \ + echo "Unsupported architecture: $arch"; \ + exit 1; \ + fi && \ + wget $MINICONDA_URL -O miniconda.sh && \ + mkdir -p /root/.conda && \ + bash miniconda.sh -b -p /root/miniconda3 && \ + rm -f miniconda.sh + +RUN conda --version ENV TINI_VERSION v0.16.1 ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /usr/bin/tini From 61a9e5b5b1fe5d777b5112ffd123fa947be29b50 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 18 Oct 2024 15:22:24 +0200 Subject: [PATCH 020/148] update miniconda --- Base.Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Base.Dockerfile b/Base.Dockerfile index 9a7a27f9d1..bd08478e12 100644 --- a/Base.Dockerfile +++ b/Base.Dockerfile @@ -65,10 +65,10 @@ SHELL ["conda", "run", "-n", "env", "/bin/bash", "-c"] # install needed packages ## install pythonocc via conda -RUN /opt/conda/bin/conda install --yes --freeze-installed \ +RUN conda install --yes --freeze-installed \ -c conda-forge pythonocc-core=7.7.0 \ nomkl \ - && /opt/conda/bin/conda clean -afy \ + && conda clean -afy \ && find /opt/conda/ -follow -type f -name '*.a' -delete \ && find /opt/conda/ -follow -type f -name '*.pyc' -delete \ && find /opt/conda/ -follow -type f -name '*.js.map' -delete From 863450f8c2492579ec03b750f3b70af8dee68a75 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 18 Oct 2024 16:05:46 +0200 Subject: [PATCH 021/148] try micromamba again --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index aa435fc455..e7b05c5f03 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -45,7 +45,7 @@ build_new:development: before_script: - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN script: - - docker build -t $CI_REGISTRY/base:development -f Base.Dockerfile . + - docker build -t $CI_REGISTRY/base:development -f micromamba.Dockerfile . - docker push $CI_REGISTRY/base:development # rules: # - if: '$CI_COMMIT_REF_NAME == "development"' From 6f8c29a63c5bf6714bbd134be96eafdc968b30d2 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 18 Oct 2024 16:09:31 +0200 Subject: [PATCH 022/148] try micromamba again --- env.yaml | 6 ++++++ micromamba.Dockerfile | 15 +++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 env.yaml create mode 100644 micromamba.Dockerfile diff --git a/env.yaml b/env.yaml new file mode 100644 index 0000000000..10f5d53d68 --- /dev/null +++ b/env.yaml @@ -0,0 +1,6 @@ +name: base +channels: + - conda-forge +dependencies: + - pythonocc-core=7.7.0 + - python=3.11 \ No newline at end of file diff --git a/micromamba.Dockerfile b/micromamba.Dockerfile new file mode 100644 index 0000000000..0250e7f4e2 --- /dev/null +++ b/micromamba.Dockerfile @@ -0,0 +1,15 @@ +FROM mambaorg/micromamba:2.0.2 + +RUN micromamba install -y -n base -c conda-forge gcc git + +COPY --chown=$MAMBA_USER:$MAMBA_USER env.yaml /tmp/env.yaml +RUN micromamba install -y -n base -f /tmp/env.yaml && \ + micromamba clean --all --yes + + +# Copy files +COPY --chown=$MAMBA_USER:$MAMBA_USER . . + +ARG MAMBA_DOCKERFILE_ACTIVATE=1 + +RUN pip install --no-cache-dir -e '.' \ No newline at end of file From 92100fc9ba2c419933d33590771a8842dfd8f501 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 18 Oct 2024 16:24:48 +0200 Subject: [PATCH 023/148] try micromamba again --- env.yaml | 5 ++++- micromamba.Dockerfile | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/env.yaml b/env.yaml index 10f5d53d68..a14c07d53c 100644 --- a/env.yaml +++ b/env.yaml @@ -3,4 +3,7 @@ channels: - conda-forge dependencies: - pythonocc-core=7.7.0 - - python=3.11 \ No newline at end of file + - python=3.11 + - pip + - gcc + - git \ No newline at end of file diff --git a/micromamba.Dockerfile b/micromamba.Dockerfile index 0250e7f4e2..763f824129 100644 --- a/micromamba.Dockerfile +++ b/micromamba.Dockerfile @@ -1,7 +1,5 @@ FROM mambaorg/micromamba:2.0.2 -RUN micromamba install -y -n base -c conda-forge gcc git - COPY --chown=$MAMBA_USER:$MAMBA_USER env.yaml /tmp/env.yaml RUN micromamba install -y -n base -f /tmp/env.yaml && \ micromamba clean --all --yes @@ -12,4 +10,6 @@ COPY --chown=$MAMBA_USER:$MAMBA_USER . . ARG MAMBA_DOCKERFILE_ACTIVATE=1 +ENV PIP_DEFAULT_TIMEOUT=100 + RUN pip install --no-cache-dir -e '.' \ No newline at end of file From 8a1bb795c8587cae23650f91031d44db0fdf2e44 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 18 Oct 2024 16:30:43 +0200 Subject: [PATCH 024/148] try micromamba again --- micromamba.Dockerfile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/micromamba.Dockerfile b/micromamba.Dockerfile index 763f824129..1fb98872d5 100644 --- a/micromamba.Dockerfile +++ b/micromamba.Dockerfile @@ -10,6 +10,8 @@ COPY --chown=$MAMBA_USER:$MAMBA_USER . . ARG MAMBA_DOCKERFILE_ACTIVATE=1 -ENV PIP_DEFAULT_TIMEOUT=100 +ENV PIP_DEFAULT_TIMEOUT=500 -RUN pip install --no-cache-dir -e '.' \ No newline at end of file +RUN pip install --no-cache-dir -e '.' -i https://pypi.tuna.tsinghua.edu.cn/simple || \ + pip install --no-cache-dir -e '.' -i https://pypi.tuna.tsinghua.edu.cn/simple || \ + pip install --no-cache-dir -e '.' -i https://pypi.tuna.tsinghua.edu.cn/simple \ No newline at end of file From 25faa628a9a810b352b161b091e96d8da6b84003 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 18 Oct 2024 16:37:12 +0200 Subject: [PATCH 025/148] test new image --- .gitlab-ci.yml | 52 +++++++++++++++++++++---------------------- micromamba.Dockerfile | 4 +--- 2 files changed, 27 insertions(+), 29 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e7b05c5f03..40d39f56c1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -35,18 +35,18 @@ variables: # - python ./test/resources/dl_test_resources.py --domain=hydraulic --force_new # - python ./test/resources/dl_test_resources.py --domain=arch --force_new -build_new:development: - image: docker:24.0.5 - stage: build-env - services: - - name: docker:24.0.5-dind - variables: - HEALTHCHECK_TCP_PORT: "2376" - before_script: - - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN - script: - - docker build -t $CI_REGISTRY/base:development -f micromamba.Dockerfile . - - docker push $CI_REGISTRY/base:development +#build_new:development: +# image: docker:24.0.5 +# stage: build-env +# services: +# - name: docker:24.0.5-dind +# variables: +# HEALTHCHECK_TCP_PORT: "2376" +# before_script: +# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN +# script: +# - docker build -t $CI_REGISTRY/base:development -f micromamba.Dockerfile . +# - docker push $CI_REGISTRY/base:development # rules: # - if: '$CI_COMMIT_REF_NAME == "development"' # changes: @@ -333,20 +333,20 @@ build_new:development: # changes: # - bim2sim/plugins/PluginAixLib/* # -#test_Base_new: -# image: $CI_REGISTRY/new:development -# stage: test -# before_script: -# - micromamba activate env -# - pip install coverage -# - pip install coverage-badge -# script: -# - mv ./* /bim2sim-coding/ -# - cd /bim2sim-coding -# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new -# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new -# - coverage run -m unittest discover /bim2sim-coding/test -# - coverage report -i +test_Base_new: + image: $CI_REGISTRY/base:development + stage: test + before_script: + - micromamba activate env + - pip install coverage + - pip install coverage-badge + script: + - mv ./* /bim2sim-coding/ + - cd /bim2sim-coding + - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new + - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new + - coverage run -m unittest discover /bim2sim-coding/test + - coverage report -i ## #test_EP: # image: $CI_REGISTRY/environment:energyplus diff --git a/micromamba.Dockerfile b/micromamba.Dockerfile index 1fb98872d5..7a57d2b1b2 100644 --- a/micromamba.Dockerfile +++ b/micromamba.Dockerfile @@ -12,6 +12,4 @@ ARG MAMBA_DOCKERFILE_ACTIVATE=1 ENV PIP_DEFAULT_TIMEOUT=500 -RUN pip install --no-cache-dir -e '.' -i https://pypi.tuna.tsinghua.edu.cn/simple || \ - pip install --no-cache-dir -e '.' -i https://pypi.tuna.tsinghua.edu.cn/simple || \ - pip install --no-cache-dir -e '.' -i https://pypi.tuna.tsinghua.edu.cn/simple \ No newline at end of file +RUN pip install --no-cache-dir -e '.' -i https://pypi.tuna.tsinghua.edu.cn/simple \ No newline at end of file From 2d7c30407a386c4c12fe86fdceb80a810376fbbe Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 18 Oct 2024 16:37:40 +0200 Subject: [PATCH 026/148] test new image --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 40d39f56c1..100f341b83 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,9 +1,9 @@ stages: -# - test + - test # - doc # - code_quality # - deploy - - build-env +# - build-env # - build-env-plugins # - build-tool From 54ba8d65d0357e6cea5ef772a1c23381ff7e74e9 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 18 Oct 2024 16:45:16 +0200 Subject: [PATCH 027/148] test new image --- .gitlab-ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 100f341b83..789861d57a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -337,7 +337,6 @@ test_Base_new: image: $CI_REGISTRY/base:development stage: test before_script: - - micromamba activate env - pip install coverage - pip install coverage-badge script: From 37aa96e16f90c4e50793aeeee4c8aa7fbb4811e6 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 18 Oct 2024 16:57:14 +0200 Subject: [PATCH 028/148] test new image --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 789861d57a..55c10375ec 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -336,10 +336,10 @@ variables: test_Base_new: image: $CI_REGISTRY/base:development stage: test - before_script: + script: + - micromamba activate base - pip install coverage - pip install coverage-badge - script: - mv ./* /bim2sim-coding/ - cd /bim2sim-coding - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new From 776bb2535d83b07dca49ef79d82791b5aaac3329 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 18 Oct 2024 16:59:55 +0200 Subject: [PATCH 029/148] test new image --- .gitlab-ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 55c10375ec..8f0a666ca2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -336,10 +336,12 @@ variables: test_Base_new: image: $CI_REGISTRY/base:development stage: test - script: + before_script: + - eval "$(micromamba shell hook --shell bash)" - micromamba activate base - pip install coverage - pip install coverage-badge + script: - mv ./* /bim2sim-coding/ - cd /bim2sim-coding - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new From 2dcb17cac1fd323629d0b1a72060e78e73f844c8 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 18 Oct 2024 17:04:49 +0200 Subject: [PATCH 030/148] make sure directory exists --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8f0a666ca2..05750c984c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -342,6 +342,7 @@ test_Base_new: - pip install coverage - pip install coverage-badge script: + - mkdir -p /bim2sim-coding/ - mv ./* /bim2sim-coding/ - cd /bim2sim-coding - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new From dd82d0120adbce6ce3476749738ea059f2fc8802 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 18 Oct 2024 17:14:15 +0200 Subject: [PATCH 031/148] dont use root directory due to permissions issues --- .gitlab-ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 05750c984c..fb32f1d2ad 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -342,12 +342,12 @@ test_Base_new: - pip install coverage - pip install coverage-badge script: - - mkdir -p /bim2sim-coding/ - - mv ./* /bim2sim-coding/ - - cd /bim2sim-coding - - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - - coverage run -m unittest discover /bim2sim-coding/test + - mkdir -p ~/bim2sim-coding/ + - mv ./* ~/bim2sim-coding/ + - cd ~/bim2sim-coding + - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new + - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new + - coverage run -m unittest discover ~/bim2sim-coding/test - coverage report -i ## #test_EP: From bc10b0718e837cf903268f5dba65e1fa5fdf0555 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 18 Oct 2024 17:14:43 +0200 Subject: [PATCH 032/148] try sudo --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fb32f1d2ad..ba62690adf 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -342,7 +342,7 @@ test_Base_new: - pip install coverage - pip install coverage-badge script: - - mkdir -p ~/bim2sim-coding/ + - sudo mkdir -p ~/bim2sim-coding/ - mv ./* ~/bim2sim-coding/ - cd ~/bim2sim-coding - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new From fe3aa399b0ce3588e6bcec477eaed8d8d183be6a Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 18 Oct 2024 17:21:36 +0200 Subject: [PATCH 033/148] don't use -e for pip install --- micromamba.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/micromamba.Dockerfile b/micromamba.Dockerfile index 7a57d2b1b2..8b6ad42b54 100644 --- a/micromamba.Dockerfile +++ b/micromamba.Dockerfile @@ -12,4 +12,4 @@ ARG MAMBA_DOCKERFILE_ACTIVATE=1 ENV PIP_DEFAULT_TIMEOUT=500 -RUN pip install --no-cache-dir -e '.' -i https://pypi.tuna.tsinghua.edu.cn/simple \ No newline at end of file +RUN pip install --no-cache-dir '.' -i https://pypi.tuna.tsinghua.edu.cn/simple \ No newline at end of file From 3bcbbd5b599ebdc257a28bdff34475f641fb3e31 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 18 Oct 2024 17:24:03 +0200 Subject: [PATCH 034/148] don't use -e for pip install --- .gitlab-ci.yml | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ba62690adf..9fd836cdc8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,7 +3,7 @@ stages: # - doc # - code_quality # - deploy -# - build-env + - build-env # - build-env-plugins # - build-tool @@ -35,24 +35,24 @@ variables: # - python ./test/resources/dl_test_resources.py --domain=hydraulic --force_new # - python ./test/resources/dl_test_resources.py --domain=arch --force_new -#build_new:development: -# image: docker:24.0.5 -# stage: build-env -# services: -# - name: docker:24.0.5-dind -# variables: -# HEALTHCHECK_TCP_PORT: "2376" -# before_script: -# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN -# script: -# - docker build -t $CI_REGISTRY/base:development -f micromamba.Dockerfile . -# - docker push $CI_REGISTRY/base:development -# rules: -# - if: '$CI_COMMIT_REF_NAME == "development"' -# changes: -# - envBase.Dockerfile -# - requirements.txt -# - .gitlab-ci.yml +build_new:development: + image: docker:24.0.5 + stage: build-env + services: + - name: docker:24.0.5-dind + variables: + HEALTHCHECK_TCP_PORT: "2376" + before_script: + - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN + script: + - docker build -t $CI_REGISTRY/base:development -f micromamba.Dockerfile . + - docker push $CI_REGISTRY/base:development + rules: + - if: '$CI_COMMIT_REF_NAME == "development"' + changes: + - envBase.Dockerfile + - requirements.txt + - .gitlab-ci.yml #build_new:development: # image: docker:24.0.5 @@ -342,7 +342,7 @@ test_Base_new: - pip install coverage - pip install coverage-badge script: - - sudo mkdir -p ~/bim2sim-coding/ + - mkdir -p ~/bim2sim-coding/ - mv ./* ~/bim2sim-coding/ - cd ~/bim2sim-coding - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new From 8e2da029f824a48ab0d36d0de3ae1c9a8bb81604 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 18 Oct 2024 17:27:48 +0200 Subject: [PATCH 035/148] don't use -e for pip install --- .gitlab-ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9fd836cdc8..9e00100ec8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -47,12 +47,12 @@ build_new:development: script: - docker build -t $CI_REGISTRY/base:development -f micromamba.Dockerfile . - docker push $CI_REGISTRY/base:development - rules: - - if: '$CI_COMMIT_REF_NAME == "development"' - changes: - - envBase.Dockerfile - - requirements.txt - - .gitlab-ci.yml +# rules: +# - if: '$CI_COMMIT_REF_NAME == "development"' +# changes: +# - envBase.Dockerfile +# - requirements.txt +# - .gitlab-ci.yml #build_new:development: # image: docker:24.0.5 From 4a48bfa2bd0ce7cca5ef6c1756da123fe869aee6 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 18 Oct 2024 17:41:03 +0200 Subject: [PATCH 036/148] don't use -e for pip install --- pyproject.toml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 3b98005505..fc6cb964ca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -56,10 +56,13 @@ dependencies = [ # root folder of the python/django not found automatically [tool.setuptools.packages.find] -where = ["bim2sim"] -#include = ["pkg*"] # alternatively: `exclude = ["additional*"]` +where = ["."] # Look for packages in the root directory +include = ["bim2sim*"] # Include all packages starting with bim2sim namespaces = false +[project.scripts] +bim2sim = "bim2sim.__main__:commandline_interface" + [project.optional-dependencies] PluginTEASER = [ "pyqt5", From 6a43951daa3772103db57898bd39a9606e1ccc80 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 18 Oct 2024 17:45:56 +0200 Subject: [PATCH 037/148] build --- .gitlab-ci.yml | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9e00100ec8..f5a45b4355 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,5 +1,5 @@ stages: - - test +# - test # - doc # - code_quality # - deploy @@ -333,22 +333,22 @@ build_new:development: # changes: # - bim2sim/plugins/PluginAixLib/* # -test_Base_new: - image: $CI_REGISTRY/base:development - stage: test - before_script: - - eval "$(micromamba shell hook --shell bash)" - - micromamba activate base - - pip install coverage - - pip install coverage-badge - script: - - mkdir -p ~/bim2sim-coding/ - - mv ./* ~/bim2sim-coding/ - - cd ~/bim2sim-coding - - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - - coverage run -m unittest discover ~/bim2sim-coding/test - - coverage report -i +#test_Base_new: +# image: $CI_REGISTRY/base:development +# stage: test +# before_script: +# - eval "$(micromamba shell hook --shell bash)" +# - micromamba activate base +# - pip install coverage +# - pip install coverage-badge +# script: +# - mkdir -p ~/bim2sim-coding/ +# - mv ./* ~/bim2sim-coding/ +# - cd ~/bim2sim-coding +# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new +# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new +# - coverage run -m unittest discover ~/bim2sim-coding/test +# - coverage report -i ## #test_EP: # image: $CI_REGISTRY/environment:energyplus From 1bb8b0e0b0c36c06f7b5727e7568dea2c76195ec Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 18 Oct 2024 17:52:46 +0200 Subject: [PATCH 038/148] build --- .gitlab-ci.yml | 34 +++++++++++++++++----------------- pyproject.toml | 3 +++ 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f5a45b4355..9e00100ec8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,5 +1,5 @@ stages: -# - test + - test # - doc # - code_quality # - deploy @@ -333,22 +333,22 @@ build_new:development: # changes: # - bim2sim/plugins/PluginAixLib/* # -#test_Base_new: -# image: $CI_REGISTRY/base:development -# stage: test -# before_script: -# - eval "$(micromamba shell hook --shell bash)" -# - micromamba activate base -# - pip install coverage -# - pip install coverage-badge -# script: -# - mkdir -p ~/bim2sim-coding/ -# - mv ./* ~/bim2sim-coding/ -# - cd ~/bim2sim-coding -# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new -# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new -# - coverage run -m unittest discover ~/bim2sim-coding/test -# - coverage report -i +test_Base_new: + image: $CI_REGISTRY/base:development + stage: test + before_script: + - eval "$(micromamba shell hook --shell bash)" + - micromamba activate base + - pip install coverage + - pip install coverage-badge + script: + - mkdir -p ~/bim2sim-coding/ + - mv ./* ~/bim2sim-coding/ + - cd ~/bim2sim-coding + - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new + - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new + - coverage run -m unittest discover ~/bim2sim-coding/test + - coverage report -i ## #test_EP: # image: $CI_REGISTRY/environment:energyplus diff --git a/pyproject.toml b/pyproject.toml index fc6cb964ca..4c77393a1f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -60,6 +60,9 @@ where = ["."] # Look for packages in the root directory include = ["bim2sim*"] # Include all packages starting with bim2sim namespaces = false +[tool.setuptools.package-data] +"*" = ["assets/**/*"] + [project.scripts] bim2sim = "bim2sim.__main__:commandline_interface" From a5119b9ab0d1ec520e59c655dd05492b7090a560 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Fri, 18 Oct 2024 18:31:51 +0200 Subject: [PATCH 039/148] build --- .gitlab-ci.yml | 6 +++--- pyproject.toml | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9e00100ec8..abd8b1d1e8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,9 +1,9 @@ stages: + - build-env - test # - doc # - code_quality # - deploy - - build-env # - build-env-plugins # - build-tool @@ -339,12 +339,12 @@ test_Base_new: before_script: - eval "$(micromamba shell hook --shell bash)" - micromamba activate base - - pip install coverage - - pip install coverage-badge script: - mkdir -p ~/bim2sim-coding/ - mv ./* ~/bim2sim-coding/ - cd ~/bim2sim-coding + - pip uninstall -y bim2sim + - pip install -e .[test] - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - coverage run -m unittest discover ~/bim2sim-coding/test diff --git a/pyproject.toml b/pyproject.toml index 4c77393a1f..dc5580308a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -60,6 +60,7 @@ where = ["."] # Look for packages in the root directory include = ["bim2sim*"] # Include all packages starting with bim2sim namespaces = false + [tool.setuptools.package-data] "*" = ["assets/**/*"] From 52f5c1fee49536bc42d2c6c6e74d8bf744a7c3cb Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 11:11:15 +0200 Subject: [PATCH 040/148] build of base for different python versions --- .gitlab-ci.yml | 208 +++++++++++++++++++++++++++++++++++------- micromamba.Dockerfile | 12 ++- 2 files changed, 187 insertions(+), 33 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index abd8b1d1e8..e21817bee6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,6 @@ stages: - build-env - - test +# - test # - doc # - code_quality # - deploy @@ -35,23 +35,169 @@ variables: # - python ./test/resources/dl_test_resources.py --domain=hydraulic --force_new # - python ./test/resources/dl_test_resources.py --domain=arch --force_new -build_new:development: - image: docker:24.0.5 - stage: build-env - services: - - name: docker:24.0.5-dind - variables: - HEALTHCHECK_TCP_PORT: "2376" - before_script: - - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN - script: - - docker build -t $CI_REGISTRY/base:development -f micromamba.Dockerfile . - - docker push $CI_REGISTRY/base:development + + +.build_template: &build_template + image: docker:24.0.5 + stage: build-env + services: + - name: docker:24.0.5-dind + variables: + HEALTHCHECK_TCP_PORT: "2376" + before_script: + - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN + script: + - docker build -t $CI_REGISTRY/bim2sim:$TAG -f micromamba.Dockerfile --build-arg PYTHON_VERSION=${PYTHON_VERSION} . + - docker push $CI_REGISTRY/bim2sim:$TAG + +#.test_template: &test_template +# stage: test +# before_script: +# - eval "$(micromamba shell hook --shell bash)" +# - micromamba activate base +# script: +# - mkdir -p ~/bim2sim-coding/ +# - mv ./* ~/bim2sim-coding/ +# - cd ~/bim2sim-coding +# - pip uninstall -y bim2sim +# - pip install -e .[test] +# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new +# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new +# - coverage run -m unittest discover ~/bim2sim-coding/test +# - coverage report -i +# artifacts: +# reports: +# coverage_report: +# coverage_format: cobertura +# path: coverage.xml + +# development builds +build:dev:py3.9: + <<: *build_template + variables: + PYTHON_VERSION: "3.9" + TAG: dev-py3.9-$CI_PIPELINE_IID + rules: + - if: '$CI_COMMIT_REF_NAME == "development"' + changes: + - micromamba.Dockerfile + - pyproject.toml + - .gitlab-ci.yml + +build:dev:py3.10: + <<: *build_template + variables: + PYTHON_VERSION: "3.10" + TAG: dev-py3.10-$CI_PIPELINE_IID + rules: + - if: '$CI_COMMIT_REF_NAME == "development"' + changes: + - micromamba.Dockerfile + - pyproject.toml + - .gitlab-ci.yml + +build:dev:py3.11: + <<: *build_template + variables: + PYTHON_VERSION: "3.11" + TAG: dev-py3.11-$CI_PIPELINE_IID + rules: + - if: '$CI_COMMIT_REF_NAME == "development"' + changes: + - micromamba.Dockerfile + - pyproject.toml + - .gitlab-ci.yml + +# Main branch builds +build:main:py3.9: + <<: *build_template + variables: + PYTHON_VERSION: "3.9" + TAG: main-py3.9-$CI_PIPELINE_IID + rules: + - if: '$CI_COMMIT_REF_NAME == "main"' + changes: + - micromamba.Dockerfile + - pyproject.toml + - .gitlab-ci.yml + +build:main:py3.10: + <<: *build_template + variables: + PYTHON_VERSION: "3.10" + TAG: main-py3.10-$CI_PIPELINE_IID + rules: + - if: '$CI_COMMIT_REF_NAME == "main"' + changes: + - micromamba.Dockerfile + - pyproject.toml + - .gitlab-ci.yml + +build:main:py3.11: + <<: *build_template + variables: + PYTHON_VERSION: "3.11" + TAG: main-py3.11-$CI_PIPELINE_IID + rules: + - if: '$CI_COMMIT_REF_NAME == "main"' + changes: + - micromamba.Dockerfile + - pyproject.toml + - .gitlab-ci.yml + +#test_base:py3.9: +# <<: *test_template +# image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py3.9-${CI_PIPELINE_IID} +# variables: +# PYTHON_VERSION: "3.9" +# +#test_base:py3.10: +# <<: *test_template +# image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py3.10-${CI_PIPELINE_IID} +# variables: +# PYTHON_VERSION: "3.10" +# +#test_base:py3.11: +# <<: *test_template +# image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py3.11-${CI_PIPELINE_IID} +# variables: +# PYTHON_VERSION: "3.11" + +# +#test_Base_new: +# image: $CI_REGISTRY/base:development +# stage: test +# before_script: +# - eval "$(micromamba shell hook --shell bash)" +# - micromamba activate base +# script: +# - mkdir -p ~/bim2sim-coding/ +# - mv ./* ~/bim2sim-coding/ +# - cd ~/bim2sim-coding +# - pip uninstall -y bim2sim +# - pip install -e .[test] +# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new +# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new +# - coverage run -m unittest discover ~/bim2sim-coding/test +# - coverage report -i + +#build:development: +# image: docker:24.0.5 +# stage: build-env +# services: +# - name: docker:24.0.5-dind +# variables: +# HEALTHCHECK_TCP_PORT: "2376" +# before_script: +# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN +# script: +# - docker build -t $CI_REGISTRY/bim2sim: -f micromamba.Dockerfile . +# - docker push $CI_REGISTRY/bim2sim: # rules: # - if: '$CI_COMMIT_REF_NAME == "development"' # changes: # - envBase.Dockerfile -# - requirements.txt +# - pyproject.toml # - .gitlab-ci.yml #build_new:development: @@ -333,23 +479,23 @@ build_new:development: # changes: # - bim2sim/plugins/PluginAixLib/* # -test_Base_new: - image: $CI_REGISTRY/base:development - stage: test - before_script: - - eval "$(micromamba shell hook --shell bash)" - - micromamba activate base - script: - - mkdir -p ~/bim2sim-coding/ - - mv ./* ~/bim2sim-coding/ - - cd ~/bim2sim-coding - - pip uninstall -y bim2sim - - pip install -e .[test] - - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - - coverage run -m unittest discover ~/bim2sim-coding/test - - coverage report -i -## +#test_Base_new: +# image: $CI_REGISTRY/base:development +# stage: test +# before_script: +# - eval "$(micromamba shell hook --shell bash)" +# - micromamba activate base +# script: +# - mkdir -p ~/bim2sim-coding/ +# - mv ./* ~/bim2sim-coding/ +# - cd ~/bim2sim-coding +# - pip uninstall -y bim2sim +# - pip install -e .[test] +# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new +# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new +# - coverage run -m unittest discover ~/bim2sim-coding/test +# - coverage report -i +### #test_EP: # image: $CI_REGISTRY/environment:energyplus # stage: test diff --git a/micromamba.Dockerfile b/micromamba.Dockerfile index 8b6ad42b54..99863a4d9f 100644 --- a/micromamba.Dockerfile +++ b/micromamba.Dockerfile @@ -1,9 +1,16 @@ +ARG PYTHON_VERSION=3.9 FROM mambaorg/micromamba:2.0.2 +# Set the Python version as an environment variable +ENV PYTHON_VERSION=${PYTHON_VERSION} + +# Copy the environment file COPY --chown=$MAMBA_USER:$MAMBA_USER env.yaml /tmp/env.yaml -RUN micromamba install -y -n base -f /tmp/env.yaml && \ - micromamba clean --all --yes +# Modify the env.yaml file to include the specified Python version +RUN sed -i "s/python=.*/python=${PYTHON_VERSION}/" /tmp/env.yaml && \ + micromamba install -y -n base -f /tmp/env.yaml && \ + micromamba clean --all --yes # Copy files COPY --chown=$MAMBA_USER:$MAMBA_USER . . @@ -12,4 +19,5 @@ ARG MAMBA_DOCKERFILE_ACTIVATE=1 ENV PIP_DEFAULT_TIMEOUT=500 +# Install the package RUN pip install --no-cache-dir '.' -i https://pypi.tuna.tsinghua.edu.cn/simple \ No newline at end of file From 2a444fa8ea0666071cd295476f249f2e9bbfcc72 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 11:16:04 +0200 Subject: [PATCH 041/148] build of base for different python versions --- .gitlab-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e21817bee6..33f98b1c97 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -78,7 +78,7 @@ build:dev:py3.9: PYTHON_VERSION: "3.9" TAG: dev-py3.9-$CI_PIPELINE_IID rules: - - if: '$CI_COMMIT_REF_NAME == "development"' + - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' changes: - micromamba.Dockerfile - pyproject.toml @@ -90,7 +90,7 @@ build:dev:py3.10: PYTHON_VERSION: "3.10" TAG: dev-py3.10-$CI_PIPELINE_IID rules: - - if: '$CI_COMMIT_REF_NAME == "development"' + - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' changes: - micromamba.Dockerfile - pyproject.toml @@ -102,7 +102,7 @@ build:dev:py3.11: PYTHON_VERSION: "3.11" TAG: dev-py3.11-$CI_PIPELINE_IID rules: - - if: '$CI_COMMIT_REF_NAME == "development"' + - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' changes: - micromamba.Dockerfile - pyproject.toml From 84199bdc785f82db71f2265642ae7b4edd4de4e9 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 11:22:56 +0200 Subject: [PATCH 042/148] add tests for python versions, branches and plugins --- .gitlab-ci.yml | 90 ++++++++++++++++++++++++++++---------------------- 1 file changed, 50 insertions(+), 40 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 33f98b1c97..45cca0d686 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,6 @@ stages: - build-env -# - test + - test # - doc # - code_quality # - deploy @@ -11,13 +11,15 @@ variables: # TODO variable inside variable seems not be working on our gitlab instance, # see post below, therefore use hardcoded image here for sphinx job # https://stackoverflow.com/questions/67005507/variable-inside-variable-gitlab-ci - PYTHON_VERSION: "registry.git.rwth-aachen.de/ebc/ebc_all/github_ci/bim2sim/environment:development" +# PYTHON_VERSION: "registry.git.rwth-aachen.de/ebc/ebc_all/github_ci/bim2sim/environment:development" # PYTHON_VERSION: "${CI_REGISTRY}/environment:development" GIT_SUBMODULE_STRATEGY: recursive GH_REPO_URL: "git@github.com:BIM2SIM/bim2sim.git" GH_PAGES_URL: "https://bim2sim.github.io/${CI_PROJECT_NAME}/" TEST_ENGINE: "unittest" TEST_PATH: test + PLUGINS: "PluginTEASER PluginEnergyPlus PluginAixLib PluginCFD PluginHKESim PluginLCA" + #include: # - project: 'EBC/EBC_all/gitlab_ci/templates' @@ -50,28 +52,35 @@ variables: - docker build -t $CI_REGISTRY/bim2sim:$TAG -f micromamba.Dockerfile --build-arg PYTHON_VERSION=${PYTHON_VERSION} . - docker push $CI_REGISTRY/bim2sim:$TAG -#.test_template: &test_template -# stage: test -# before_script: -# - eval "$(micromamba shell hook --shell bash)" -# - micromamba activate base -# script: -# - mkdir -p ~/bim2sim-coding/ -# - mv ./* ~/bim2sim-coding/ -# - cd ~/bim2sim-coding -# - pip uninstall -y bim2sim -# - pip install -e .[test] -# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new -# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new -# - coverage run -m unittest discover ~/bim2sim-coding/test -# - coverage report -i -# artifacts: -# reports: -# coverage_report: -# coverage_format: cobertura -# path: coverage.xml +.test_template: &test_template + stage: test + before_script: + - eval "$(micromamba shell hook --shell bash)" + - micromamba activate base + script: + - mkdir -p ~/bim2sim-coding/ + - mv ./* ~/bim2sim-coding/ + - cd ~/bim2sim-coding + - pip uninstall -y bim2sim + - pip install -e .[test] + - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new + - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new + - coverage run -m unittest discover ~/bim2sim-coding/test + - | + for plugin in $PLUGINS; do + echo "Testing $plugin" + pip install -e .[$plugin] + coverage run -m unittest discover ~/bim2sim-coding/test/plugins/${plugin,,} + done + - coverage report -i + - coverage xml + artifacts: + reports: + coverage_report: + coverage_format: cobertura + path: coverage.xml -# development builds +# Development branch builds build:dev:py3.9: <<: *build_template variables: @@ -145,23 +154,24 @@ build:main:py3.11: - pyproject.toml - .gitlab-ci.yml -#test_base:py3.9: -# <<: *test_template -# image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py3.9-${CI_PIPELINE_IID} -# variables: -# PYTHON_VERSION: "3.9" -# -#test_base:py3.10: -# <<: *test_template -# image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py3.10-${CI_PIPELINE_IID} -# variables: -# PYTHON_VERSION: "3.10" -# -#test_base:py3.11: -# <<: *test_template -# image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py3.11-${CI_PIPELINE_IID} -# variables: -# PYTHON_VERSION: "3.11" +# Tests +test:py3.9: + <<: *test_template + image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py3.9-${CI_PIPELINE_IID} + variables: + PYTHON_VERSION: "3.9" + +test:py3.10: + <<: *test_template + image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py3.10-${CI_PIPELINE_IID} + variables: + PYTHON_VERSION: "3.10" + +test:py3.11: + <<: *test_template + image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py3.11-${CI_PIPELINE_IID} + variables: + PYTHON_VERSION: "3.11" # #test_Base_new: From 0c52fd711bcc0b0eb74a22b2300eab1351427025 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 11:30:20 +0200 Subject: [PATCH 043/148] temp hard code image for testing purpose --- .gitlab-ci.yml | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 45cca0d686..cb24237cdd 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,6 @@ stages: - - build-env - test + - build-env # - doc # - code_quality # - deploy @@ -85,7 +85,7 @@ build:dev:py3.9: <<: *build_template variables: PYTHON_VERSION: "3.9" - TAG: dev-py3.9-$CI_PIPELINE_IID + TAG: dev-py3.9 rules: - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' changes: @@ -97,7 +97,7 @@ build:dev:py3.10: <<: *build_template variables: PYTHON_VERSION: "3.10" - TAG: dev-py3.10-$CI_PIPELINE_IID + TAG: dev-py3.10 rules: - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' changes: @@ -109,7 +109,7 @@ build:dev:py3.11: <<: *build_template variables: PYTHON_VERSION: "3.11" - TAG: dev-py3.11-$CI_PIPELINE_IID + TAG: dev-py3.11 rules: - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' changes: @@ -122,7 +122,7 @@ build:main:py3.9: <<: *build_template variables: PYTHON_VERSION: "3.9" - TAG: main-py3.9-$CI_PIPELINE_IID + TAG: main-py3.9 rules: - if: '$CI_COMMIT_REF_NAME == "main"' changes: @@ -134,7 +134,7 @@ build:main:py3.10: <<: *build_template variables: PYTHON_VERSION: "3.10" - TAG: main-py3.10-$CI_PIPELINE_IID + TAG: main-py3.10 rules: - if: '$CI_COMMIT_REF_NAME == "main"' changes: @@ -146,7 +146,7 @@ build:main:py3.11: <<: *build_template variables: PYTHON_VERSION: "3.11" - TAG: main-py3.11-$CI_PIPELINE_IID + TAG: main-py3.11 rules: - if: '$CI_COMMIT_REF_NAME == "main"' changes: @@ -157,19 +157,22 @@ build:main:py3.11: # Tests test:py3.9: <<: *test_template - image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py3.9-${CI_PIPELINE_IID} +# image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py3.9-${CI_PIPELINE_IID} + image: $CI_REGISTRY/bim2sim:dev-py3.9-${CI_PIPELINE_IID} variables: PYTHON_VERSION: "3.9" test:py3.10: <<: *test_template - image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py3.10-${CI_PIPELINE_IID} +# image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py3.10-${CI_PIPELINE_IID} + image: $CI_REGISTRY/bim2sim:dev-py3.10-${CI_PIPELINE_IID} variables: PYTHON_VERSION: "3.10" test:py3.11: <<: *test_template - image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py3.11-${CI_PIPELINE_IID} +# image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py3.11-${CI_PIPELINE_IID} + image: $CI_REGISTRY/bim2sim:dev-py3.11-${CI_PIPELINE_IID} variables: PYTHON_VERSION: "3.11" From c1658b5d69cd859aabac7efc8f02243ab0d6d6ab Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 11:31:22 +0200 Subject: [PATCH 044/148] remove CI_PIPELINE_IID as image tagging --- .gitlab-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cb24237cdd..a4ae6f738a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -158,21 +158,21 @@ build:main:py3.11: test:py3.9: <<: *test_template # image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py3.9-${CI_PIPELINE_IID} - image: $CI_REGISTRY/bim2sim:dev-py3.9-${CI_PIPELINE_IID} + image: $CI_REGISTRY/bim2sim:dev-py3.9 variables: PYTHON_VERSION: "3.9" test:py3.10: <<: *test_template # image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py3.10-${CI_PIPELINE_IID} - image: $CI_REGISTRY/bim2sim:dev-py3.10-${CI_PIPELINE_IID} + image: $CI_REGISTRY/bim2sim:dev-py3.10 variables: PYTHON_VERSION: "3.10" test:py3.11: <<: *test_template # image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py3.11-${CI_PIPELINE_IID} - image: $CI_REGISTRY/bim2sim:dev-py3.11-${CI_PIPELINE_IID} + image: $CI_REGISTRY/bim2sim:dev-py3.11 variables: PYTHON_VERSION: "3.11" From 9c4f26911cc2c9a858e76b284fde25a930fad4ec Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 11:35:56 +0200 Subject: [PATCH 045/148] try to generate seperate jobs for testing --- .gitlab-ci.yml | 84 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 75 insertions(+), 9 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a4ae6f738a..9be837b3eb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -19,9 +19,11 @@ variables: TEST_ENGINE: "unittest" TEST_PATH: test PLUGINS: "PluginTEASER PluginEnergyPlus PluginAixLib PluginCFD PluginHKESim PluginLCA" + PYTHON_VERSIONS: "3.9 3.10 3.11" -#include: +include: + - generated-config.yml # - project: 'EBC/EBC_all/gitlab_ci/templates' # file: 'python/code-quality/pylint.gitlab-ci.yml' # - project: 'EBC/EBC_all/gitlab_ci/templates' @@ -62,16 +64,10 @@ variables: - mv ./* ~/bim2sim-coding/ - cd ~/bim2sim-coding - pip uninstall -y bim2sim - - pip install -e .[test] + - pip install -e .[test,$PLUGIN] - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - - coverage run -m unittest discover ~/bim2sim-coding/test - - | - for plugin in $PLUGINS; do - echo "Testing $plugin" - pip install -e .[$plugin] - coverage run -m unittest discover ~/bim2sim-coding/test/plugins/${plugin,,} - done + - coverage run -m unittest discover ~/bim2sim-coding/test/plugins/${PLUGIN,,} - coverage report -i - coverage xml artifacts: @@ -80,6 +76,76 @@ variables: coverage_format: cobertura path: coverage.xml +.generate_jobs: + stage: .pre + script: + - | + echo "test_base_py3.9: + <<: *test_template + image: \$CI_REGISTRY/bim2sim:\${CI_COMMIT_REF_SLUG}-py3.9-\${CI_PIPELINE_IID} + variables: + PYTHON_VERSION: \"3.9\" + script: + - mkdir -p ~/bim2sim-coding/ + - mv ./* ~/bim2sim-coding/ + - cd ~/bim2sim-coding + - pip uninstall -y bim2sim + - pip install -e .[test] + - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new + - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new + - coverage run -m unittest discover ~/bim2sim-coding/test + - coverage report -i + - coverage xml + + test_base_py3.10: + <<: *test_template + image: \$CI_REGISTRY/bim2sim:\${CI_COMMIT_REF_SLUG}-py3.10-\${CI_PIPELINE_IID} + variables: + PYTHON_VERSION: \"3.10\" + script: + - mkdir -p ~/bim2sim-coding/ + - mv ./* ~/bim2sim-coding/ + - cd ~/bim2sim-coding + - pip uninstall -y bim2sim + - pip install -e .[test] + - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new + - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new + - coverage run -m unittest discover ~/bim2sim-coding/test + - coverage report -i + - coverage xml + + test_base_py3.11: + <<: *test_template + image: \$CI_REGISTRY/bim2sim:\${CI_COMMIT_REF_SLUG}-py3.11-\${CI_PIPELINE_IID} + variables: + PYTHON_VERSION: \"3.11\" + script: + - mkdir -p ~/bim2sim-coding/ + - mv ./* ~/bim2sim-coding/ + - cd ~/bim2sim-coding + - pip uninstall -y bim2sim + - pip install -e .[test] + - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new + - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new + - coverage run -m unittest discover ~/bim2sim-coding/test + - coverage report -i + - coverage xml" > generated-config.yml + - | + for plugin in $PLUGINS; do + for version in $PYTHON_VERSIONS; do + echo " + test_${plugin,,}_py${version/./}: + <<: *test_template + image: \$CI_REGISTRY/bim2sim:\${CI_COMMIT_REF_SLUG}-py${version}-\${CI_PIPELINE_IID} + variables: + PYTHON_VERSION: \"${version}\" + PLUGIN: \"${plugin}\"" >> generated-config.yml + done + done + artifacts: + paths: + - generated-config.yml + # Development branch builds build:dev:py3.9: <<: *build_template From 08cf805d72d1aa8fdfcfe78be93af6a43230f9ff Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 11:39:05 +0200 Subject: [PATCH 046/148] try to generate seperate jobs for testing --- .gitlab-ci.yml | 105 +++++++++++++++++-------------------------------- 1 file changed, 37 insertions(+), 68 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9be837b3eb..ea218128f3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -22,8 +22,7 @@ variables: PYTHON_VERSIONS: "3.9 3.10 3.11" -include: - - generated-config.yml +#include: # - project: 'EBC/EBC_all/gitlab_ci/templates' # file: 'python/code-quality/pylint.gitlab-ci.yml' # - project: 'EBC/EBC_all/gitlab_ci/templates' @@ -76,75 +75,45 @@ include: coverage_format: cobertura path: coverage.xml -.generate_jobs: - stage: .pre +.base_test_template: &base_test_template + <<: *test_template script: - - | - echo "test_base_py3.9: - <<: *test_template - image: \$CI_REGISTRY/bim2sim:\${CI_COMMIT_REF_SLUG}-py3.9-\${CI_PIPELINE_IID} - variables: - PYTHON_VERSION: \"3.9\" - script: - - mkdir -p ~/bim2sim-coding/ - - mv ./* ~/bim2sim-coding/ - - cd ~/bim2sim-coding - - pip uninstall -y bim2sim - - pip install -e .[test] - - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - - coverage run -m unittest discover ~/bim2sim-coding/test - - coverage report -i - - coverage xml + - mkdir -p ~/bim2sim-coding/ + - mv ./* ~/bim2sim-coding/ + - cd ~/bim2sim-coding + - pip uninstall -y bim2sim + - pip install -e .[test] + - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new + - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new + - coverage run -m unittest discover ~/bim2sim-coding/test + - coverage report -i + - coverage xml + +test_base: + parallel: + matrix: + - PYTHON_VERSION: [3.9, 3.10, 3.11] + <<: *base_test_template + image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py${PYTHON_VERSION}-${CI_PIPELINE_IID} + +.plugin_test: + parallel: + matrix: + - PYTHON_VERSION: [3.9, 3.10, 3.11] + - PLUGIN: + - PluginTEASER + - PluginEnergyPlus + - PluginAixLib + - PluginCFD + - PluginHKESim + - PluginLCA + <<: *test_template + image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py${PYTHON_VERSION}-${CI_PIPELINE_IID} + +test_plugins: + extends: .plugin_test - test_base_py3.10: - <<: *test_template - image: \$CI_REGISTRY/bim2sim:\${CI_COMMIT_REF_SLUG}-py3.10-\${CI_PIPELINE_IID} - variables: - PYTHON_VERSION: \"3.10\" - script: - - mkdir -p ~/bim2sim-coding/ - - mv ./* ~/bim2sim-coding/ - - cd ~/bim2sim-coding - - pip uninstall -y bim2sim - - pip install -e .[test] - - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - - coverage run -m unittest discover ~/bim2sim-coding/test - - coverage report -i - - coverage xml - test_base_py3.11: - <<: *test_template - image: \$CI_REGISTRY/bim2sim:\${CI_COMMIT_REF_SLUG}-py3.11-\${CI_PIPELINE_IID} - variables: - PYTHON_VERSION: \"3.11\" - script: - - mkdir -p ~/bim2sim-coding/ - - mv ./* ~/bim2sim-coding/ - - cd ~/bim2sim-coding - - pip uninstall -y bim2sim - - pip install -e .[test] - - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - - coverage run -m unittest discover ~/bim2sim-coding/test - - coverage report -i - - coverage xml" > generated-config.yml - - | - for plugin in $PLUGINS; do - for version in $PYTHON_VERSIONS; do - echo " - test_${plugin,,}_py${version/./}: - <<: *test_template - image: \$CI_REGISTRY/bim2sim:\${CI_COMMIT_REF_SLUG}-py${version}-\${CI_PIPELINE_IID} - variables: - PYTHON_VERSION: \"${version}\" - PLUGIN: \"${plugin}\"" >> generated-config.yml - done - done - artifacts: - paths: - - generated-config.yml # Development branch builds build:dev:py3.9: From 2a90131568dadc62d9dc1a334c2ed672b7ff3753 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 11:49:15 +0200 Subject: [PATCH 047/148] try to generate seperate jobs for testing --- .gitlab-ci.yml | 145 +++++++++++++++++++++++++++++-------------------- 1 file changed, 85 insertions(+), 60 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ea218128f3..e03f214b69 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -52,66 +52,61 @@ variables: script: - docker build -t $CI_REGISTRY/bim2sim:$TAG -f micromamba.Dockerfile --build-arg PYTHON_VERSION=${PYTHON_VERSION} . - docker push $CI_REGISTRY/bim2sim:$TAG - -.test_template: &test_template - stage: test - before_script: - - eval "$(micromamba shell hook --shell bash)" - - micromamba activate base - script: - - mkdir -p ~/bim2sim-coding/ - - mv ./* ~/bim2sim-coding/ - - cd ~/bim2sim-coding - - pip uninstall -y bim2sim - - pip install -e .[test,$PLUGIN] - - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - - coverage run -m unittest discover ~/bim2sim-coding/test/plugins/${PLUGIN,,} - - coverage report -i - - coverage xml - artifacts: - reports: - coverage_report: - coverage_format: cobertura - path: coverage.xml - -.base_test_template: &base_test_template - <<: *test_template - script: - - mkdir -p ~/bim2sim-coding/ - - mv ./* ~/bim2sim-coding/ - - cd ~/bim2sim-coding - - pip uninstall -y bim2sim - - pip install -e .[test] - - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - - coverage run -m unittest discover ~/bim2sim-coding/test - - coverage report -i - - coverage xml - -test_base: - parallel: - matrix: - - PYTHON_VERSION: [3.9, 3.10, 3.11] - <<: *base_test_template - image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py${PYTHON_VERSION}-${CI_PIPELINE_IID} - -.plugin_test: - parallel: - matrix: - - PYTHON_VERSION: [3.9, 3.10, 3.11] - - PLUGIN: - - PluginTEASER - - PluginEnergyPlus - - PluginAixLib - - PluginCFD - - PluginHKESim - - PluginLCA - <<: *test_template - image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py${PYTHON_VERSION}-${CI_PIPELINE_IID} - -test_plugins: - extends: .plugin_test +# +# +#.test_template: &test_template +# stage: test +# before_script: +# - eval "$(micromamba shell hook --shell bash)" +# - micromamba activate base +# script: +# - mkdir -p ~/bim2sim-coding/ +# - mv ./* ~/bim2sim-coding/ +# - cd ~/bim2sim-coding +# - pip uninstall -y bim2sim +# - pip install -e .[test,$PLUGIN] +# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new +# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new +# - coverage run -m unittest discover ~/bim2sim-coding/test/plugins/${PLUGIN,,} +# - coverage report -i +# - coverage xml +# artifacts: +# reports: +# coverage_report: +# coverage_format: cobertura +# path: coverage.xml +# +#.base_test_template: &base_test_template +# <<: *test_template +# script: +# - mkdir -p ~/bim2sim-coding/ +# - mv ./* ~/bim2sim-coding/ +# - cd ~/bim2sim-coding +# - pip uninstall -y bim2sim +# - pip install -e .[test] +# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new +# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new +# - coverage run -m unittest discover ~/bim2sim-coding/test +# - coverage report -i +# - coverage xml +# +#test_base: +# parallel: +# matrix: +# - PYTHON_VERSION: ["3.9", "3.10", "3.11"] +# <<: *base_test_template +# image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py${PYTHON_VERSION} +# +#.plugin_test: +# parallel: +# matrix: +# - PYTHON_VERSION: ["3.9", "3.10", "3.11"] +# PLUGIN: [PluginTEASER, PluginEnergyPlus, PluginAixLib, PluginCFD, PluginHKESim, PluginLCA] +# <<: *test_template +# image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py${PYTHON_VERSION} +# +#test_plugins: +# extends: .plugin_test @@ -189,7 +184,37 @@ build:main:py3.11: - pyproject.toml - .gitlab-ci.yml + + # Tests +.test_template: &test_template + stage: test + before_script: + - eval "$(micromamba shell hook --shell bash)" + - micromamba activate base + script: + - mkdir -p ~/bim2sim-coding/ + - mv ./* ~/bim2sim-coding/ + - cd ~/bim2sim-coding + - pip uninstall -y bim2sim + - pip install -e .[test] + - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new + - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new + - coverage run -m unittest discover ~/bim2sim-coding/test + - | + for plugin in $PLUGINS; do + echo "Testing $plugin" + pip install -e .[$plugin] + coverage run -m unittest discover ~/bim2sim-coding/test/plugins/${plugin,,} + done + - coverage report -i + - coverage xml + artifacts: + reports: + coverage_report: + coverage_format: cobertura + path: coverage.xml + test:py3.9: <<: *test_template # image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py3.9-${CI_PIPELINE_IID} From bac4b61ce5cc8ea2f2fb881137b03c9fdf6f0d35 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 11:50:38 +0200 Subject: [PATCH 048/148] try to generate seperate jobs for testing --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e03f214b69..b9c0ff1d32 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,6 @@ stages: - - test - build-env + - test # - doc # - code_quality # - deploy From 80ca4ee04a3922c232ec0d963cea1a9b28965087 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 12:02:19 +0200 Subject: [PATCH 049/148] add seperate jobs for the plugins --- .gitlab-ci.yml | 86 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 64 insertions(+), 22 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b9c0ff1d32..d09d95dcde 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,6 @@ stages: - - build-env - test + - build-env # - doc # - code_quality # - deploy @@ -184,10 +184,8 @@ build:main:py3.11: - pyproject.toml - .gitlab-ci.yml - - # Tests -.test_template: &test_template +.test_template_base: &test_template_base stage: test before_script: - eval "$(micromamba shell hook --shell bash)" @@ -201,12 +199,6 @@ build:main:py3.11: - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - coverage run -m unittest discover ~/bim2sim-coding/test - - | - for plugin in $PLUGINS; do - echo "Testing $plugin" - pip install -e .[$plugin] - coverage run -m unittest discover ~/bim2sim-coding/test/plugins/${plugin,,} - done - coverage report -i - coverage xml artifacts: @@ -215,26 +207,76 @@ build:main:py3.11: coverage_format: cobertura path: coverage.xml -test:py3.9: - <<: *test_template -# image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py3.9-${CI_PIPELINE_IID} +.test_template_plugin_integration: &test_template_plugin_integration + stage: test + before_script: + - eval "$(micromamba shell hook --shell bash)" + - micromamba activate base + script: + - mkdir -p ~/bim2sim-coding/ + - mv ./* ~/bim2sim-coding/ + - cd ~/bim2sim-coding + - pip uninstall -y bim2sim + - pip install -e .[test] + - pip install -e .[$plugin] + - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new + - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new + - coverage run -m unittest discover ~/bim2sim-coding/bim2sim/plugins/${plugin}/test/integration + - coverage report -i + - coverage xml + artifacts: + reports: + coverage_report: + coverage_format: cobertura + path: coverage.xml + +test_base:py3.9: + <<: *test_template_base + image: $CI_REGISTRY/bim2sim:dev-py3.9 + +test_base:py3.10: + <<: *test_template_base + image: $CI_REGISTRY/bim2sim:dev-py3.10 + +test_base:py3.11: + <<: *test_template_base + image: $CI_REGISTRY/bim2sim:dev-py3.11 + +test_PluginTEASER_integration:py3.9: + <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.9 variables: - PYTHON_VERSION: "3.9" + plugin: "PluginTEASER" -test:py3.10: - <<: *test_template -# image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py3.10-${CI_PIPELINE_IID} +test_PluginTEASER_integration:py3.10: + <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.10 variables: - PYTHON_VERSION: "3.10" + plugin: "PluginTEASER" -test:py3.11: - <<: *test_template -# image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py3.11-${CI_PIPELINE_IID} +test_PluginTEASER_integration:py3.11: + <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.11 variables: - PYTHON_VERSION: "3.11" + plugin: "PluginTEASER" + +test_PluginAixLib_integration:py3.9: + <<: *test_template_plugin_integration + image: $CI_REGISTRY/bim2sim:dev-py3.9 + variables: + plugin: "PluginAixLib" + +test_PluginAixLib_integration:py3.10: + <<: *test_template_plugin_integration + image: $CI_REGISTRY/bim2sim:dev-py3.10 + variables: + plugin: "PluginAixLib" + +test_PluginAixLib_integration:py3.11: + <<: *test_template_plugin_integration + image: $CI_REGISTRY/bim2sim:dev-py3.11 + variables: + plugin: "PluginAixLib" # #test_Base_new: From 08f38f66fcc405b5c4bbfcfdccfb20a38569e5e7 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 12:06:22 +0200 Subject: [PATCH 050/148] temp remove coverage report --- .gitlab-ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d09d95dcde..79118f548a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -199,8 +199,8 @@ build:main:py3.11: - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - coverage run -m unittest discover ~/bim2sim-coding/test - - coverage report -i - - coverage xml +# - coverage report -i +# - coverage xml artifacts: reports: coverage_report: @@ -222,8 +222,8 @@ build:main:py3.11: - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - coverage run -m unittest discover ~/bim2sim-coding/bim2sim/plugins/${plugin}/test/integration - - coverage report -i - - coverage xml +# - coverage report -i +# - coverage xml artifacts: reports: coverage_report: From c8eb6e3dc3b40f63fde6a0554770850f836cb6cb Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 12:20:20 +0200 Subject: [PATCH 051/148] add more plugin tests and configure logging level to reduce output in log --- .gitlab-ci.yml | 75 +++++++++++++++++++++++++++++++++------ bim2sim/utilities/test.py | 5 +++ 2 files changed, 70 insertions(+), 10 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 79118f548a..793d460be1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -196,16 +196,17 @@ build:main:py3.11: - cd ~/bim2sim-coding - pip uninstall -y bim2sim - pip install -e .[test] + - export BIM2SIM_LOG_LEVEL=ERROR - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - coverage run -m unittest discover ~/bim2sim-coding/test # - coverage report -i # - coverage xml - artifacts: - reports: - coverage_report: - coverage_format: cobertura - path: coverage.xml +# artifacts: +# reports: +# coverage_report: +# coverage_format: cobertura +# path: coverage.xml .test_template_plugin_integration: &test_template_plugin_integration stage: test @@ -219,16 +220,17 @@ build:main:py3.11: - pip uninstall -y bim2sim - pip install -e .[test] - pip install -e .[$plugin] + - export BIM2SIM_LOG_LEVEL=ERROR - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - coverage run -m unittest discover ~/bim2sim-coding/bim2sim/plugins/${plugin}/test/integration # - coverage report -i # - coverage xml - artifacts: - reports: - coverage_report: - coverage_format: cobertura - path: coverage.xml +# artifacts: +# reports: +# coverage_report: +# coverage_format: cobertura +# path: coverage.xml test_base:py3.9: <<: *test_template_base @@ -278,6 +280,59 @@ test_PluginAixLib_integration:py3.11: variables: plugin: "PluginAixLib" +test_PluginEnergyPlus_integration:py3.9: + <<: *test_template_plugin_integration + image: $CI_REGISTRY/bim2sim:dev-py3.9 + variables: + plugin: "PluginEnergyPlus" + +test_PluginEnergyPlus_integration:py3.10: + <<: *test_template_plugin_integration + image: $CI_REGISTRY/bim2sim:dev-py3.10 + variables: + plugin: "PluginEnergyPlus" + +test_PluginEnergyPlus_integration:py3.11: + <<: *test_template_plugin_integration + image: $CI_REGISTRY/bim2sim:dev-py3.11 + variables: + plugin: "PluginEnergyPlus" + +test_PluginHKESim_integration:py3.9: + <<: *test_template_plugin_integration + image: $CI_REGISTRY/bim2sim:dev-py3.9 + variables: + plugin: "PluginHKESim" + +test_PluginHKESim_integration:py3.10: + <<: *test_template_plugin_integration + image: $CI_REGISTRY/bim2sim:dev-py3.10 + variables: + plugin: "PluginHKESim" + +test_PluginHKESim_integration:py3.11: + <<: *test_template_plugin_integration + image: $CI_REGISTRY/bim2sim:dev-py3.11 + variables: + plugin: "PluginHKESim" + +test_PluginLCA_integration:py3.9: + <<: *test_template_plugin_integration + image: $CI_REGISTRY/bim2sim:dev-py3.9 + variables: + plugin: "PluginLCA" + +test_PluginLCA_integration:py3.10: + <<: *test_template_plugin_integration + image: $CI_REGISTRY/bim2sim:dev-py3.10 + variables: + plugin: "PluginLCA" + +test_PluginLCA_integration:py3.11: + <<: *test_template_plugin_integration + image: $CI_REGISTRY/bim2sim:dev-py3.11 + variables: + plugin: "PluginLCA" # #test_Base_new: # image: $CI_REGISTRY/base:development diff --git a/bim2sim/utilities/test.py b/bim2sim/utilities/test.py index f8f7b22fbd..c0e622a9cb 100644 --- a/bim2sim/utilities/test.py +++ b/bim2sim/utilities/test.py @@ -1,3 +1,4 @@ +import logging import os import tempfile from pathlib import Path @@ -5,6 +6,10 @@ from bim2sim.project import Project +# Set up logging at the module level +log_level = os.environ.get('BIM2SIM_LOG_LEVEL', 'ERROR') +logging.getLogger('bim2sim.QualityReport').setLevel(getattr(logging, log_level)) + class IntegrationBase: """Base class mixin for Integration tests""" From e045f1ec3b7cc9d5efd4f63c0a25f2395a7669c3 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 12:42:13 +0200 Subject: [PATCH 052/148] try to build dymola images with micromamba --- .gitlab-ci.yml | 108 ++++++++++++++++-------------------- micromambaDymola.Dockerfile | 61 ++++++++++++++++++++ 2 files changed, 108 insertions(+), 61 deletions(-) create mode 100644 micromambaDymola.Dockerfile diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 793d460be1..74511a36a1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,6 @@ stages: - - test - build-env + - test # - doc # - code_quality # - deploy @@ -18,8 +18,6 @@ variables: GH_PAGES_URL: "https://bim2sim.github.io/${CI_PROJECT_NAME}/" TEST_ENGINE: "unittest" TEST_PATH: test - PLUGINS: "PluginTEASER PluginEnergyPlus PluginAixLib PluginCFD PluginHKESim PluginLCA" - PYTHON_VERSIONS: "3.9 3.10 3.11" #include: @@ -50,65 +48,8 @@ variables: before_script: - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN script: - - docker build -t $CI_REGISTRY/bim2sim:$TAG -f micromamba.Dockerfile --build-arg PYTHON_VERSION=${PYTHON_VERSION} . + - docker build -t $CI_REGISTRY/bim2sim:$TAG -f ${DOCKERFILE} --build-arg PYTHON_VERSION=${PYTHON_VERSION} . - docker push $CI_REGISTRY/bim2sim:$TAG -# -# -#.test_template: &test_template -# stage: test -# before_script: -# - eval "$(micromamba shell hook --shell bash)" -# - micromamba activate base -# script: -# - mkdir -p ~/bim2sim-coding/ -# - mv ./* ~/bim2sim-coding/ -# - cd ~/bim2sim-coding -# - pip uninstall -y bim2sim -# - pip install -e .[test,$PLUGIN] -# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new -# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new -# - coverage run -m unittest discover ~/bim2sim-coding/test/plugins/${PLUGIN,,} -# - coverage report -i -# - coverage xml -# artifacts: -# reports: -# coverage_report: -# coverage_format: cobertura -# path: coverage.xml -# -#.base_test_template: &base_test_template -# <<: *test_template -# script: -# - mkdir -p ~/bim2sim-coding/ -# - mv ./* ~/bim2sim-coding/ -# - cd ~/bim2sim-coding -# - pip uninstall -y bim2sim -# - pip install -e .[test] -# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new -# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new -# - coverage run -m unittest discover ~/bim2sim-coding/test -# - coverage report -i -# - coverage xml -# -#test_base: -# parallel: -# matrix: -# - PYTHON_VERSION: ["3.9", "3.10", "3.11"] -# <<: *base_test_template -# image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py${PYTHON_VERSION} -# -#.plugin_test: -# parallel: -# matrix: -# - PYTHON_VERSION: ["3.9", "3.10", "3.11"] -# PLUGIN: [PluginTEASER, PluginEnergyPlus, PluginAixLib, PluginCFD, PluginHKESim, PluginLCA] -# <<: *test_template -# image: $CI_REGISTRY/bim2sim:${CI_COMMIT_REF_SLUG}-py${PYTHON_VERSION} -# -#test_plugins: -# extends: .plugin_test - - # Development branch builds build:dev:py3.9: @@ -116,6 +57,7 @@ build:dev:py3.9: variables: PYTHON_VERSION: "3.9" TAG: dev-py3.9 + DOCKERFILE: micromamba.Dockerfile rules: - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' changes: @@ -128,6 +70,7 @@ build:dev:py3.10: variables: PYTHON_VERSION: "3.10" TAG: dev-py3.10 + DOCKERFILE: micromamba.Dockerfile rules: - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' changes: @@ -140,6 +83,46 @@ build:dev:py3.11: variables: PYTHON_VERSION: "3.11" TAG: dev-py3.11 + DOCKERFILE: micromamba.Dockerfile + rules: + - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' + changes: + - micromamba.Dockerfile + - pyproject.toml + - .gitlab-ci.yml + +build:dev-dymola:py3.9: + <<: *build_template + variables: + PYTHON_VERSION: "3.9" + TAG: dev-dymola-py3.9 + DOCKERFILE: micromambaDymola.Dockerfile + rules: + - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' + changes: + - micromamba.Dockerfile + - pyproject.toml + - .gitlab-ci.yml + +build:dev-dymola:py3.10: + <<: *build_template + variables: + PYTHON_VERSION: "3.10" + TAG: dev-dymola-py3.10 + DOCKERFILE: micromambaDymola.Dockerfile + rules: + - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' + changes: + - micromamba.Dockerfile + - pyproject.toml + - .gitlab-ci.yml + +build:dev-dymola:py3.11: + <<: *build_template + variables: + PYTHON_VERSION: "3.11" + TAG: dev-dymola-py3.11 + DOCKERFILE: micromambaDymola.Dockerfile rules: - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' changes: @@ -153,6 +136,7 @@ build:main:py3.9: variables: PYTHON_VERSION: "3.9" TAG: main-py3.9 + DOCKERFILE: micromamba.Dockerfile rules: - if: '$CI_COMMIT_REF_NAME == "main"' changes: @@ -165,6 +149,7 @@ build:main:py3.10: variables: PYTHON_VERSION: "3.10" TAG: main-py3.10 + DOCKERFILE: micromamba.Dockerfile rules: - if: '$CI_COMMIT_REF_NAME == "main"' changes: @@ -177,6 +162,7 @@ build:main:py3.11: variables: PYTHON_VERSION: "3.11" TAG: main-py3.11 + DOCKERFILE: micromamba.Dockerfile rules: - if: '$CI_COMMIT_REF_NAME == "main"' changes: diff --git a/micromambaDymola.Dockerfile b/micromambaDymola.Dockerfile new file mode 100644 index 0000000000..851efc964f --- /dev/null +++ b/micromambaDymola.Dockerfile @@ -0,0 +1,61 @@ +ARG PYTHON_VERSION=3.9 +# bring in the micromamba image so we can copy files from it +FROM mambaorg/micromamba:2.0.2 as micromamba + +# This is the image we are going add micromaba to: +FROM registry.git.rwth-aachen.de/ebc/ebc_intern/dymola-docker:Dymola_2022 + +USER root + +# if your image defaults to a non-root user, then you may want to make the +# next 3 ARG commands match the values in your image. You can get the values +# by running: docker run --rm -it my/image id -a +ARG MAMBA_USER=mambauser +ARG MAMBA_USER_ID=57439 +ARG MAMBA_USER_GID=57439 +ENV MAMBA_USER=$MAMBA_USER +ENV MAMBA_ROOT_PREFIX="/opt/conda" +ENV MAMBA_EXE="/bin/micromamba" + +COPY --from=micromamba "$MAMBA_EXE" "$MAMBA_EXE" +COPY --from=micromamba /usr/local/bin/_activate_current_env.sh /usr/local/bin/_activate_current_env.sh +COPY --from=micromamba /usr/local/bin/_dockerfile_shell.sh /usr/local/bin/_dockerfile_shell.sh +COPY --from=micromamba /usr/local/bin/_entrypoint.sh /usr/local/bin/_entrypoint.sh +COPY --from=micromamba /usr/local/bin/_dockerfile_initialize_user_accounts.sh /usr/local/bin/_dockerfile_initialize_user_accounts.sh +COPY --from=micromamba /usr/local/bin/_dockerfile_setup_root_prefix.sh /usr/local/bin/_dockerfile_setup_root_prefix.sh + +RUN /usr/local/bin/_dockerfile_initialize_user_accounts.sh && \ + /usr/local/bin/_dockerfile_setup_root_prefix.sh + +USER $MAMBA_USER + +SHELL ["/usr/local/bin/_dockerfile_shell.sh"] + +ENTRYPOINT ["/usr/local/bin/_entrypoint.sh"] +# Optional: if you want to customize the ENTRYPOINT and have a conda +# environment activated, then do this: +# ENTRYPOINT ["/usr/local/bin/_entrypoint.sh", "my_entrypoint_program"] + +# You can modify the CMD statement as needed.... +CMD ["/bin/bash"] + +# Set the Python version as an environment variable +ENV PYTHON_VERSION=${PYTHON_VERSION} + +# Copy the environment file +COPY --chown=$MAMBA_USER:$MAMBA_USER env.yaml /tmp/env.yaml + +# Modify the env.yaml file to include the specified Python version +RUN sed -i "s/python=.*/python=${PYTHON_VERSION}/" /tmp/env.yaml && \ + micromamba install -y -n base -f /tmp/env.yaml && \ + micromamba clean --all --yes + +# Copy files +COPY --chown=$MAMBA_USER:$MAMBA_USER . . + +ARG MAMBA_DOCKERFILE_ACTIVATE=1 + +ENV PIP_DEFAULT_TIMEOUT=500 + +# Install the package +RUN pip install --no-cache-dir '.' -i https://pypi.tuna.tsinghua.edu.cn/simple \ No newline at end of file From 8756792ac6065f928da3fbcf4f4aa92364e4443f Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 12:47:14 +0200 Subject: [PATCH 053/148] login to dymola registry --- .gitlab-ci.yml | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 74511a36a1..8b1185dd3a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -37,7 +37,6 @@ variables: # - python ./test/resources/dl_test_resources.py --domain=arch --force_new - .build_template: &build_template image: docker:24.0.5 stage: build-env @@ -51,6 +50,21 @@ variables: - docker build -t $CI_REGISTRY/bim2sim:$TAG -f ${DOCKERFILE} --build-arg PYTHON_VERSION=${PYTHON_VERSION} . - docker push $CI_REGISTRY/bim2sim:$TAG +.build_template_dymola: &build_template_dymola + image: docker:24.0.5 + stage: build-env + services: + - name: docker:24.0.5-dind + variables: + HEALTHCHECK_TCP_PORT: "2376" + before_script: + - docker login -u $CI_DEPLOY_TOKEN_USERNAME_DYMOLA -p $CI_DEPLOY_TOKEN_PASSWORD_DYMOLA $CI_REGISTRY_LOGIN_DYMOLA # login dymola docker reg + script: + - docker build -t $CI_REGISTRY/bim2sim:$TAG -f ${DOCKERFILE} --build-arg PYTHON_VERSION=${PYTHON_VERSION} . + - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN # login bim2sim reg + - docker push $CI_REGISTRY/bim2sim:$TAG + + # Development branch builds build:dev:py3.9: <<: *build_template @@ -92,7 +106,7 @@ build:dev:py3.11: - .gitlab-ci.yml build:dev-dymola:py3.9: - <<: *build_template + <<: *build_template_dymola variables: PYTHON_VERSION: "3.9" TAG: dev-dymola-py3.9 @@ -105,7 +119,7 @@ build:dev-dymola:py3.9: - .gitlab-ci.yml build:dev-dymola:py3.10: - <<: *build_template + <<: *build_template_dymola variables: PYTHON_VERSION: "3.10" TAG: dev-dymola-py3.10 @@ -118,7 +132,7 @@ build:dev-dymola:py3.10: - .gitlab-ci.yml build:dev-dymola:py3.11: - <<: *build_template + <<: *build_template_dymola variables: PYTHON_VERSION: "3.11" TAG: dev-dymola-py3.11 From f73bfee02c4324c1f5c6acb9284d2be5e4fe265d Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 12:55:46 +0200 Subject: [PATCH 054/148] install CA certificates --- micromambaDymola.Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/micromambaDymola.Dockerfile b/micromambaDymola.Dockerfile index 851efc964f..232d54686a 100644 --- a/micromambaDymola.Dockerfile +++ b/micromambaDymola.Dockerfile @@ -7,6 +7,9 @@ FROM registry.git.rwth-aachen.de/ebc/ebc_intern/dymola-docker:Dymola_2022 USER root +# Install CA certificates +RUN apt-get update && apt-get install -y ca-certificates && update-ca-certificates + # if your image defaults to a non-root user, then you may want to make the # next 3 ARG commands match the values in your image. You can get the values # by running: docker run --rm -it my/image id -a From c9766c23b745b74a1a32a4e71311e89ea1c609c5 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 12:57:07 +0200 Subject: [PATCH 055/148] install CA certificates --- .gitlab-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8b1185dd3a..6ae7c68e2b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -114,7 +114,7 @@ build:dev-dymola:py3.9: rules: - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' changes: - - micromamba.Dockerfile + - micromambaDymola.Dockerfile - pyproject.toml - .gitlab-ci.yml @@ -127,7 +127,7 @@ build:dev-dymola:py3.10: rules: - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' changes: - - micromamba.Dockerfile + - micromambaDymola.Dockerfile - pyproject.toml - .gitlab-ci.yml @@ -140,7 +140,7 @@ build:dev-dymola:py3.11: rules: - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' changes: - - micromamba.Dockerfile + - micromambaDymola.Dockerfile - pyproject.toml - .gitlab-ci.yml From 4f093626821c6d0663fe166f7f5a2dcc63b195bf Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 13:11:24 +0200 Subject: [PATCH 056/148] try to solve permission errors --- micromambaDymola.Dockerfile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/micromambaDymola.Dockerfile b/micromambaDymola.Dockerfile index 232d54686a..28a7c5cd4d 100644 --- a/micromambaDymola.Dockerfile +++ b/micromambaDymola.Dockerfile @@ -54,7 +54,11 @@ RUN sed -i "s/python=.*/python=${PYTHON_VERSION}/" /tmp/env.yaml && \ micromamba clean --all --yes # Copy files -COPY --chown=$MAMBA_USER:$MAMBA_USER . . +COPY . /app +WORKDIR /app + +# Set permissions for the app directory +RUN chown -R $MAMBA_USER:$MAMBA_USER /app ARG MAMBA_DOCKERFILE_ACTIVATE=1 From a261e19fc2e06e45780c60490b310d88a70b4c89 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 13:17:28 +0200 Subject: [PATCH 057/148] try to solve permission errors --- micromambaDymola.Dockerfile | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/micromambaDymola.Dockerfile b/micromambaDymola.Dockerfile index 28a7c5cd4d..24541a90c6 100644 --- a/micromambaDymola.Dockerfile +++ b/micromambaDymola.Dockerfile @@ -53,16 +53,24 @@ RUN sed -i "s/python=.*/python=${PYTHON_VERSION}/" /tmp/env.yaml && \ micromamba install -y -n base -f /tmp/env.yaml && \ micromamba clean --all --yes -# Copy files -COPY . /app +# Create a directory for the app and set it as the working directory +RUN mkdir /app && chown $MAMBA_USER:$MAMBA_USER /app WORKDIR /app -# Set permissions for the app directory -RUN chown -R $MAMBA_USER:$MAMBA_USER /app +USER $MAMBA_USER + +SHELL ["/usr/local/bin/_dockerfile_shell.sh"] + +ENTRYPOINT ["/usr/local/bin/_entrypoint.sh"] + +CMD ["/bin/bash"] ARG MAMBA_DOCKERFILE_ACTIVATE=1 ENV PIP_DEFAULT_TIMEOUT=500 +# Copy files as the MAMBA_USER +COPY --chown=$MAMBA_USER:$MAMBA_USER . . + # Install the package -RUN pip install --no-cache-dir '.' -i https://pypi.tuna.tsinghua.edu.cn/simple \ No newline at end of file +RUN pip install --no-cache-dir -e . -i https://pypi.tuna.tsinghua.edu.cn/simple \ No newline at end of file From 891c0cd2668dbdd9a28ac191eb9623da85532362 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 13:31:48 +0200 Subject: [PATCH 058/148] try to solve permission errors --- micromambaDymola.Dockerfile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/micromambaDymola.Dockerfile b/micromambaDymola.Dockerfile index 24541a90c6..b2f494d943 100644 --- a/micromambaDymola.Dockerfile +++ b/micromambaDymola.Dockerfile @@ -53,11 +53,8 @@ RUN sed -i "s/python=.*/python=${PYTHON_VERSION}/" /tmp/env.yaml && \ micromamba install -y -n base -f /tmp/env.yaml && \ micromamba clean --all --yes -# Create a directory for the app and set it as the working directory -RUN mkdir /app && chown $MAMBA_USER:$MAMBA_USER /app -WORKDIR /app - USER $MAMBA_USER +WORKDIR /home/$MAMBA_USER SHELL ["/usr/local/bin/_dockerfile_shell.sh"] @@ -69,8 +66,11 @@ ARG MAMBA_DOCKERFILE_ACTIVATE=1 ENV PIP_DEFAULT_TIMEOUT=500 -# Copy files as the MAMBA_USER +# Copy files to the user's home directory COPY --chown=$MAMBA_USER:$MAMBA_USER . . # Install the package -RUN pip install --no-cache-dir -e . -i https://pypi.tuna.tsinghua.edu.cn/simple \ No newline at end of file +RUN pip install --no-cache-dir --user -e . -i https://pypi.tuna.tsinghua.edu.cn/simple + +# Add .local/bin to PATH +ENV PATH=/home/$MAMBA_USER/.local/bin:$PATH \ No newline at end of file From 5c7f35bf6d8266297fe00fd6c0f13c78d355ba8e Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 13:40:33 +0200 Subject: [PATCH 059/148] add regression tests for PluginTEASER --- .gitlab-ci.yml | 48 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6ae7c68e2b..fa434d5295 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,8 @@ stages: - - build-env - - test +# - build-env +# - test_base +# - test_integration + - test_regression # - doc # - code_quality # - deploy @@ -186,7 +188,7 @@ build:main:py3.11: # Tests .test_template_base: &test_template_base - stage: test + stage: test_base before_script: - eval "$(micromamba shell hook --shell bash)" - micromamba activate base @@ -209,7 +211,7 @@ build:main:py3.11: # path: coverage.xml .test_template_plugin_integration: &test_template_plugin_integration - stage: test + stage: test_integration before_script: - eval "$(micromamba shell hook --shell bash)" - micromamba activate base @@ -224,6 +226,23 @@ build:main:py3.11: - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - coverage run -m unittest discover ~/bim2sim-coding/bim2sim/plugins/${plugin}/test/integration + +.test_template_plugin_regression: &test_template_plugin_regression + stage: test_regression + before_script: + - eval "$(micromamba shell hook --shell bash)" + - micromamba activate base + script: + - mkdir -p ~/bim2sim-coding/ + - mv ./* ~/bim2sim-coding/ + - cd ~/bim2sim-coding + - pip uninstall -y bim2sim + - pip install -e .[test] + - pip install -e .[$plugin] + - export BIM2SIM_LOG_LEVEL=ERROR + - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new + - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new + - coverage run -m unittest discover ~/bim2sim-coding/bim2sim/plugins/${plugin}/test/regression # - coverage report -i # - coverage xml # artifacts: @@ -333,6 +352,27 @@ test_PluginLCA_integration:py3.11: image: $CI_REGISTRY/bim2sim:dev-py3.11 variables: plugin: "PluginLCA" + + +test_PluginTEASER_regression:py3.9: + <<: *test_template_plugin_regression + image: $CI_REGISTRY/bim2sim:dev-dymola-py3.9 + variables: + plugin: "PluginTEASER" + +test_PluginTEASER_regression:py3.10: + <<: *test_template_plugin_regression + image: $CI_REGISTRY/bim2sim:dev-dymola-py3.10 + variables: + plugin: "PluginTEASER" + +test_PluginTEASER_regression:py3.11: + <<: *test_template_plugin_regression + image: $CI_REGISTRY/bim2sim:dev-dymola-py3.11 + variables: + plugin: "PluginTEASER" + + # #test_Base_new: # image: $CI_REGISTRY/base:development From 74ca6f064bdc942747a529a0bdaf1c4e52fb4f68 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 13:42:52 +0200 Subject: [PATCH 060/148] run regression tests only --- .gitlab-ci.yml | 568 ++++++++++++++++++++++++------------------------- 1 file changed, 284 insertions(+), 284 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fa434d5295..48060cb550 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -52,181 +52,181 @@ variables: - docker build -t $CI_REGISTRY/bim2sim:$TAG -f ${DOCKERFILE} --build-arg PYTHON_VERSION=${PYTHON_VERSION} . - docker push $CI_REGISTRY/bim2sim:$TAG -.build_template_dymola: &build_template_dymola - image: docker:24.0.5 - stage: build-env - services: - - name: docker:24.0.5-dind - variables: - HEALTHCHECK_TCP_PORT: "2376" - before_script: - - docker login -u $CI_DEPLOY_TOKEN_USERNAME_DYMOLA -p $CI_DEPLOY_TOKEN_PASSWORD_DYMOLA $CI_REGISTRY_LOGIN_DYMOLA # login dymola docker reg - script: - - docker build -t $CI_REGISTRY/bim2sim:$TAG -f ${DOCKERFILE} --build-arg PYTHON_VERSION=${PYTHON_VERSION} . - - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN # login bim2sim reg - - docker push $CI_REGISTRY/bim2sim:$TAG - - -# Development branch builds -build:dev:py3.9: - <<: *build_template - variables: - PYTHON_VERSION: "3.9" - TAG: dev-py3.9 - DOCKERFILE: micromamba.Dockerfile - rules: - - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' - changes: - - micromamba.Dockerfile - - pyproject.toml - - .gitlab-ci.yml - -build:dev:py3.10: - <<: *build_template - variables: - PYTHON_VERSION: "3.10" - TAG: dev-py3.10 - DOCKERFILE: micromamba.Dockerfile - rules: - - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' - changes: - - micromamba.Dockerfile - - pyproject.toml - - .gitlab-ci.yml - -build:dev:py3.11: - <<: *build_template - variables: - PYTHON_VERSION: "3.11" - TAG: dev-py3.11 - DOCKERFILE: micromamba.Dockerfile - rules: - - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' - changes: - - micromamba.Dockerfile - - pyproject.toml - - .gitlab-ci.yml - -build:dev-dymola:py3.9: - <<: *build_template_dymola - variables: - PYTHON_VERSION: "3.9" - TAG: dev-dymola-py3.9 - DOCKERFILE: micromambaDymola.Dockerfile - rules: - - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' - changes: - - micromambaDymola.Dockerfile - - pyproject.toml - - .gitlab-ci.yml - -build:dev-dymola:py3.10: - <<: *build_template_dymola - variables: - PYTHON_VERSION: "3.10" - TAG: dev-dymola-py3.10 - DOCKERFILE: micromambaDymola.Dockerfile - rules: - - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' - changes: - - micromambaDymola.Dockerfile - - pyproject.toml - - .gitlab-ci.yml - -build:dev-dymola:py3.11: - <<: *build_template_dymola - variables: - PYTHON_VERSION: "3.11" - TAG: dev-dymola-py3.11 - DOCKERFILE: micromambaDymola.Dockerfile - rules: - - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' - changes: - - micromambaDymola.Dockerfile - - pyproject.toml - - .gitlab-ci.yml - -# Main branch builds -build:main:py3.9: - <<: *build_template - variables: - PYTHON_VERSION: "3.9" - TAG: main-py3.9 - DOCKERFILE: micromamba.Dockerfile - rules: - - if: '$CI_COMMIT_REF_NAME == "main"' - changes: - - micromamba.Dockerfile - - pyproject.toml - - .gitlab-ci.yml - -build:main:py3.10: - <<: *build_template - variables: - PYTHON_VERSION: "3.10" - TAG: main-py3.10 - DOCKERFILE: micromamba.Dockerfile - rules: - - if: '$CI_COMMIT_REF_NAME == "main"' - changes: - - micromamba.Dockerfile - - pyproject.toml - - .gitlab-ci.yml - -build:main:py3.11: - <<: *build_template - variables: - PYTHON_VERSION: "3.11" - TAG: main-py3.11 - DOCKERFILE: micromamba.Dockerfile - rules: - - if: '$CI_COMMIT_REF_NAME == "main"' - changes: - - micromamba.Dockerfile - - pyproject.toml - - .gitlab-ci.yml - -# Tests -.test_template_base: &test_template_base - stage: test_base - before_script: - - eval "$(micromamba shell hook --shell bash)" - - micromamba activate base - script: - - mkdir -p ~/bim2sim-coding/ - - mv ./* ~/bim2sim-coding/ - - cd ~/bim2sim-coding - - pip uninstall -y bim2sim - - pip install -e .[test] - - export BIM2SIM_LOG_LEVEL=ERROR - - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - - coverage run -m unittest discover ~/bim2sim-coding/test -# - coverage report -i -# - coverage xml -# artifacts: -# reports: -# coverage_report: -# coverage_format: cobertura -# path: coverage.xml - -.test_template_plugin_integration: &test_template_plugin_integration - stage: test_integration - before_script: - - eval "$(micromamba shell hook --shell bash)" - - micromamba activate base - script: - - mkdir -p ~/bim2sim-coding/ - - mv ./* ~/bim2sim-coding/ - - cd ~/bim2sim-coding - - pip uninstall -y bim2sim - - pip install -e .[test] - - pip install -e .[$plugin] - - export BIM2SIM_LOG_LEVEL=ERROR - - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - - coverage run -m unittest discover ~/bim2sim-coding/bim2sim/plugins/${plugin}/test/integration - +#.build_template_dymola: &build_template_dymola +# image: docker:24.0.5 +# stage: build-env +# services: +# - name: docker:24.0.5-dind +# variables: +# HEALTHCHECK_TCP_PORT: "2376" +# before_script: +# - docker login -u $CI_DEPLOY_TOKEN_USERNAME_DYMOLA -p $CI_DEPLOY_TOKEN_PASSWORD_DYMOLA $CI_REGISTRY_LOGIN_DYMOLA # login dymola docker reg +# script: +# - docker build -t $CI_REGISTRY/bim2sim:$TAG -f ${DOCKERFILE} --build-arg PYTHON_VERSION=${PYTHON_VERSION} . +# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN # login bim2sim reg +# - docker push $CI_REGISTRY/bim2sim:$TAG +# +# +## Development branch builds +#build:dev:py3.9: +# <<: *build_template +# variables: +# PYTHON_VERSION: "3.9" +# TAG: dev-py3.9 +# DOCKERFILE: micromamba.Dockerfile +# rules: +# - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' +# changes: +# - micromamba.Dockerfile +# - pyproject.toml +# - .gitlab-ci.yml +# +#build:dev:py3.10: +# <<: *build_template +# variables: +# PYTHON_VERSION: "3.10" +# TAG: dev-py3.10 +# DOCKERFILE: micromamba.Dockerfile +# rules: +# - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' +# changes: +# - micromamba.Dockerfile +# - pyproject.toml +# - .gitlab-ci.yml +# +#build:dev:py3.11: +# <<: *build_template +# variables: +# PYTHON_VERSION: "3.11" +# TAG: dev-py3.11 +# DOCKERFILE: micromamba.Dockerfile +# rules: +# - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' +# changes: +# - micromamba.Dockerfile +# - pyproject.toml +# - .gitlab-ci.yml +# +#build:dev-dymola:py3.9: +# <<: *build_template_dymola +# variables: +# PYTHON_VERSION: "3.9" +# TAG: dev-dymola-py3.9 +# DOCKERFILE: micromambaDymola.Dockerfile +# rules: +# - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' +# changes: +# - micromambaDymola.Dockerfile +# - pyproject.toml +# - .gitlab-ci.yml +# +#build:dev-dymola:py3.10: +# <<: *build_template_dymola +# variables: +# PYTHON_VERSION: "3.10" +# TAG: dev-dymola-py3.10 +# DOCKERFILE: micromambaDymola.Dockerfile +# rules: +# - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' +# changes: +# - micromambaDymola.Dockerfile +# - pyproject.toml +# - .gitlab-ci.yml +# +#build:dev-dymola:py3.11: +# <<: *build_template_dymola +# variables: +# PYTHON_VERSION: "3.11" +# TAG: dev-dymola-py3.11 +# DOCKERFILE: micromambaDymola.Dockerfile +# rules: +# - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' +# changes: +# - micromambaDymola.Dockerfile +# - pyproject.toml +# - .gitlab-ci.yml +# +## Main branch builds +#build:main:py3.9: +# <<: *build_template +# variables: +# PYTHON_VERSION: "3.9" +# TAG: main-py3.9 +# DOCKERFILE: micromamba.Dockerfile +# rules: +# - if: '$CI_COMMIT_REF_NAME == "main"' +# changes: +# - micromamba.Dockerfile +# - pyproject.toml +# - .gitlab-ci.yml +# +#build:main:py3.10: +# <<: *build_template +# variables: +# PYTHON_VERSION: "3.10" +# TAG: main-py3.10 +# DOCKERFILE: micromamba.Dockerfile +# rules: +# - if: '$CI_COMMIT_REF_NAME == "main"' +# changes: +# - micromamba.Dockerfile +# - pyproject.toml +# - .gitlab-ci.yml +# +#build:main:py3.11: +# <<: *build_template +# variables: +# PYTHON_VERSION: "3.11" +# TAG: main-py3.11 +# DOCKERFILE: micromamba.Dockerfile +# rules: +# - if: '$CI_COMMIT_REF_NAME == "main"' +# changes: +# - micromamba.Dockerfile +# - pyproject.toml +# - .gitlab-ci.yml +# +## Tests +#.test_template_base: &test_template_base +# stage: test_base +# before_script: +# - eval "$(micromamba shell hook --shell bash)" +# - micromamba activate base +# script: +# - mkdir -p ~/bim2sim-coding/ +# - mv ./* ~/bim2sim-coding/ +# - cd ~/bim2sim-coding +# - pip uninstall -y bim2sim +# - pip install -e .[test] +# - export BIM2SIM_LOG_LEVEL=ERROR +# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new +# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new +# - coverage run -m unittest discover ~/bim2sim-coding/test +## - coverage report -i +## - coverage xml +## artifacts: +## reports: +## coverage_report: +## coverage_format: cobertura +## path: coverage.xml +# +#.test_template_plugin_integration: &test_template_plugin_integration +# stage: test_integration +# before_script: +# - eval "$(micromamba shell hook --shell bash)" +# - micromamba activate base +# script: +# - mkdir -p ~/bim2sim-coding/ +# - mv ./* ~/bim2sim-coding/ +# - cd ~/bim2sim-coding +# - pip uninstall -y bim2sim +# - pip install -e .[test] +# - pip install -e .[$plugin] +# - export BIM2SIM_LOG_LEVEL=ERROR +# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new +# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new +# - coverage run -m unittest discover ~/bim2sim-coding/bim2sim/plugins/${plugin}/test/integration +# .test_template_plugin_regression: &test_template_plugin_regression stage: test_regression before_script: @@ -243,115 +243,115 @@ build:main:py3.11: - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - coverage run -m unittest discover ~/bim2sim-coding/bim2sim/plugins/${plugin}/test/regression -# - coverage report -i -# - coverage xml -# artifacts: -# reports: -# coverage_report: -# coverage_format: cobertura -# path: coverage.xml - -test_base:py3.9: - <<: *test_template_base - image: $CI_REGISTRY/bim2sim:dev-py3.9 - -test_base:py3.10: - <<: *test_template_base - image: $CI_REGISTRY/bim2sim:dev-py3.10 - -test_base:py3.11: - <<: *test_template_base - image: $CI_REGISTRY/bim2sim:dev-py3.11 - -test_PluginTEASER_integration:py3.9: - <<: *test_template_plugin_integration - image: $CI_REGISTRY/bim2sim:dev-py3.9 - variables: - plugin: "PluginTEASER" - -test_PluginTEASER_integration:py3.10: - <<: *test_template_plugin_integration - image: $CI_REGISTRY/bim2sim:dev-py3.10 - variables: - plugin: "PluginTEASER" - -test_PluginTEASER_integration:py3.11: - <<: *test_template_plugin_integration - image: $CI_REGISTRY/bim2sim:dev-py3.11 - variables: - plugin: "PluginTEASER" - -test_PluginAixLib_integration:py3.9: - <<: *test_template_plugin_integration - image: $CI_REGISTRY/bim2sim:dev-py3.9 - variables: - plugin: "PluginAixLib" - -test_PluginAixLib_integration:py3.10: - <<: *test_template_plugin_integration - image: $CI_REGISTRY/bim2sim:dev-py3.10 - variables: - plugin: "PluginAixLib" - -test_PluginAixLib_integration:py3.11: - <<: *test_template_plugin_integration - image: $CI_REGISTRY/bim2sim:dev-py3.11 - variables: - plugin: "PluginAixLib" - -test_PluginEnergyPlus_integration:py3.9: - <<: *test_template_plugin_integration - image: $CI_REGISTRY/bim2sim:dev-py3.9 - variables: - plugin: "PluginEnergyPlus" - -test_PluginEnergyPlus_integration:py3.10: - <<: *test_template_plugin_integration - image: $CI_REGISTRY/bim2sim:dev-py3.10 - variables: - plugin: "PluginEnergyPlus" - -test_PluginEnergyPlus_integration:py3.11: - <<: *test_template_plugin_integration - image: $CI_REGISTRY/bim2sim:dev-py3.11 - variables: - plugin: "PluginEnergyPlus" - -test_PluginHKESim_integration:py3.9: - <<: *test_template_plugin_integration - image: $CI_REGISTRY/bim2sim:dev-py3.9 - variables: - plugin: "PluginHKESim" - -test_PluginHKESim_integration:py3.10: - <<: *test_template_plugin_integration - image: $CI_REGISTRY/bim2sim:dev-py3.10 - variables: - plugin: "PluginHKESim" - -test_PluginHKESim_integration:py3.11: - <<: *test_template_plugin_integration - image: $CI_REGISTRY/bim2sim:dev-py3.11 - variables: - plugin: "PluginHKESim" - -test_PluginLCA_integration:py3.9: - <<: *test_template_plugin_integration - image: $CI_REGISTRY/bim2sim:dev-py3.9 - variables: - plugin: "PluginLCA" - -test_PluginLCA_integration:py3.10: - <<: *test_template_plugin_integration - image: $CI_REGISTRY/bim2sim:dev-py3.10 - variables: - plugin: "PluginLCA" - -test_PluginLCA_integration:py3.11: - <<: *test_template_plugin_integration - image: $CI_REGISTRY/bim2sim:dev-py3.11 - variables: - plugin: "PluginLCA" +## - coverage report -i +## - coverage xml +## artifacts: +## reports: +## coverage_report: +## coverage_format: cobertura +## path: coverage.xml +# +#test_base:py3.9: +# <<: *test_template_base +# image: $CI_REGISTRY/bim2sim:dev-py3.9 +# +#test_base:py3.10: +# <<: *test_template_base +# image: $CI_REGISTRY/bim2sim:dev-py3.10 +# +#test_base:py3.11: +# <<: *test_template_base +# image: $CI_REGISTRY/bim2sim:dev-py3.11 +# +#test_PluginTEASER_integration:py3.9: +# <<: *test_template_plugin_integration +# image: $CI_REGISTRY/bim2sim:dev-py3.9 +# variables: +# plugin: "PluginTEASER" +# +#test_PluginTEASER_integration:py3.10: +# <<: *test_template_plugin_integration +# image: $CI_REGISTRY/bim2sim:dev-py3.10 +# variables: +# plugin: "PluginTEASER" +# +#test_PluginTEASER_integration:py3.11: +# <<: *test_template_plugin_integration +# image: $CI_REGISTRY/bim2sim:dev-py3.11 +# variables: +# plugin: "PluginTEASER" +# +#test_PluginAixLib_integration:py3.9: +# <<: *test_template_plugin_integration +# image: $CI_REGISTRY/bim2sim:dev-py3.9 +# variables: +# plugin: "PluginAixLib" +# +#test_PluginAixLib_integration:py3.10: +# <<: *test_template_plugin_integration +# image: $CI_REGISTRY/bim2sim:dev-py3.10 +# variables: +# plugin: "PluginAixLib" +# +#test_PluginAixLib_integration:py3.11: +# <<: *test_template_plugin_integration +# image: $CI_REGISTRY/bim2sim:dev-py3.11 +# variables: +# plugin: "PluginAixLib" +# +#test_PluginEnergyPlus_integration:py3.9: +# <<: *test_template_plugin_integration +# image: $CI_REGISTRY/bim2sim:dev-py3.9 +# variables: +# plugin: "PluginEnergyPlus" +# +#test_PluginEnergyPlus_integration:py3.10: +# <<: *test_template_plugin_integration +# image: $CI_REGISTRY/bim2sim:dev-py3.10 +# variables: +# plugin: "PluginEnergyPlus" +# +#test_PluginEnergyPlus_integration:py3.11: +# <<: *test_template_plugin_integration +# image: $CI_REGISTRY/bim2sim:dev-py3.11 +# variables: +# plugin: "PluginEnergyPlus" +# +#test_PluginHKESim_integration:py3.9: +# <<: *test_template_plugin_integration +# image: $CI_REGISTRY/bim2sim:dev-py3.9 +# variables: +# plugin: "PluginHKESim" +# +#test_PluginHKESim_integration:py3.10: +# <<: *test_template_plugin_integration +# image: $CI_REGISTRY/bim2sim:dev-py3.10 +# variables: +# plugin: "PluginHKESim" +# +#test_PluginHKESim_integration:py3.11: +# <<: *test_template_plugin_integration +# image: $CI_REGISTRY/bim2sim:dev-py3.11 +# variables: +# plugin: "PluginHKESim" +# +#test_PluginLCA_integration:py3.9: +# <<: *test_template_plugin_integration +# image: $CI_REGISTRY/bim2sim:dev-py3.9 +# variables: +# plugin: "PluginLCA" +# +#test_PluginLCA_integration:py3.10: +# <<: *test_template_plugin_integration +# image: $CI_REGISTRY/bim2sim:dev-py3.10 +# variables: +# plugin: "PluginLCA" +# +#test_PluginLCA_integration:py3.11: +# <<: *test_template_plugin_integration +# image: $CI_REGISTRY/bim2sim:dev-py3.11 +# variables: +# plugin: "PluginLCA" test_PluginTEASER_regression:py3.9: From 46b1d75a5e9c2de97bef007599984e0d070459e1 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 19:55:14 +0200 Subject: [PATCH 061/148] try other syntax for report feature of TEASER requirement --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index dc5580308a..521aa3dbba 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -74,7 +74,7 @@ PluginTEASER = [ "RWTHColors", "scienceplots", "ebcpy", - "TEASER@git+https://github.com/RWTH-EBC/TEASER@development#egg=TEASER[report]", + "TEASER[report] @ git+https://github.com/RWTH-EBC/TEASER@development", "BuildingsPy@git+https://github.com/DaJansenGit/BuildingsPy.git", ] PluginEnergyPlus = [ From 378f1ef843d19e47943d7552aa322efd1e2f2d44 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 20:01:19 +0200 Subject: [PATCH 062/148] try other syntax for report feature of TEASER requirement --- .gitlab-ci.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 48060cb550..1468471cab 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -242,7 +242,13 @@ variables: - export BIM2SIM_LOG_LEVEL=ERROR - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - - coverage run -m unittest discover ~/bim2sim-coding/bim2sim/plugins/${plugin}/test/regression + # use xvfb-run -n 77 command if dymola image is used + - | + if [[ "$CI_JOB_IMAGE" == *"dymola"* ]]; then + xvfb-run -n 77 coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/${plugin}/test/regression + else + coverage run -m unittest discover ~/bim2sim-coding/bim2sim/plugins/${plugin}/test/regression + fi ## - coverage report -i ## - coverage xml ## artifacts: From 97ab9b60d4e062999b07db567bb44a1452d93669 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 20:03:32 +0200 Subject: [PATCH 063/148] try other syntax for report feature of TEASER requirement --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1468471cab..c197cdd4c4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -245,7 +245,7 @@ variables: # use xvfb-run -n 77 command if dymola image is used - | if [[ "$CI_JOB_IMAGE" == *"dymola"* ]]; then - xvfb-run -n 77 coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/${plugin}/test/regression + xvfb-run -n 77 coverage run -m unittest discover ~/bim2sim-coding/bim2sim/plugins/${plugin}/test/regression else coverage run -m unittest discover ~/bim2sim-coding/bim2sim/plugins/${plugin}/test/regression fi From b3fc1c02915955e772870ac1d57312c276f83566 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 20:10:53 +0200 Subject: [PATCH 064/148] add with regression for download of files --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c197cdd4c4..408b046142 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -240,8 +240,8 @@ variables: - pip install -e .[test] - pip install -e .[$plugin] - export BIM2SIM_LOG_LEVEL=ERROR - - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new + - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new --with_regression + - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new --with_regression # use xvfb-run -n 77 command if dymola image is used - | if [[ "$CI_JOB_IMAGE" == *"dymola"* ]]; then From f33946a8a3d5f9e6b751f412bddf70377e0a6776 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 20:50:42 +0200 Subject: [PATCH 065/148] add log files --- .gitlab-ci.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 408b046142..9f12e8ca11 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -249,6 +249,18 @@ variables: else coverage run -m unittest discover ~/bim2sim-coding/bim2sim/plugins/${plugin}/test/regression fi + - mkdir /builds/EBC/EBC_all/github_ci/bim2sim/logs/ + - cp *.log /builds/EBC/EBC_all/github_ci/bim2sim/logs/ + - ls -la /builds/EBC/EBC_all/github_ci/bim2sim + - ls -la /builds/EBC/EBC_all/github_ci/bim2sim/logs + artifacts: + paths: + # - logs/* + # - logs/failed-simulator-dymola.log + - /builds/EBC/EBC_all/github_ci/bim2sim/logs/* + # - bim2sim-coding/simulator-dymola.log + # - bim2sim-coding/comparison-dymola.log + # - bim2sim-coding/unitTests-dymola.log ## - coverage report -i ## - coverage xml ## artifacts: From 6804267d5995ffe0fd61fa2bdb0995822d5b4c9e Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 20:54:11 +0200 Subject: [PATCH 066/148] add log files --- .gitlab-ci.yml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9f12e8ca11..aa39b35212 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -240,8 +240,10 @@ variables: - pip install -e .[test] - pip install -e .[$plugin] - export BIM2SIM_LOG_LEVEL=ERROR + # TODO select files to download based on plugin - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new --with_regression - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new --with_regression + # TODO for EP image install .idf file (see previous pipeline) # use xvfb-run -n 77 command if dymola image is used - | if [[ "$CI_JOB_IMAGE" == *"dymola"* ]]; then @@ -249,10 +251,13 @@ variables: else coverage run -m unittest discover ~/bim2sim-coding/bim2sim/plugins/${plugin}/test/regression fi - - mkdir /builds/EBC/EBC_all/github_ci/bim2sim/logs/ - - cp *.log /builds/EBC/EBC_all/github_ci/bim2sim/logs/ - - ls -la /builds/EBC/EBC_all/github_ci/bim2sim - - ls -la /builds/EBC/EBC_all/github_ci/bim2sim/logs + - | + if [[ "$CI_JOB_IMAGE" == *"dymola"* ]]; then + mkdir -p /builds/EBC/EBC_all/github_ci/bim2sim/logs/ + cp *.log /builds/EBC/EBC_all/github_ci/bim2sim/logs/ + ls -la /builds/EBC/EBC_all/github_ci/bim2sim + ls -la /builds/EBC/EBC_all/github_ci/bim2sim/logs + fi artifacts: paths: # - logs/* From 8d95b9e50f5f1e34de865ed05e4cbdd203e34e8c Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 21:04:22 +0200 Subject: [PATCH 067/148] add log files --- .gitlab-ci.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index aa39b35212..d2b6d274e0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -251,13 +251,13 @@ variables: else coverage run -m unittest discover ~/bim2sim-coding/bim2sim/plugins/${plugin}/test/regression fi - - | - if [[ "$CI_JOB_IMAGE" == *"dymola"* ]]; then - mkdir -p /builds/EBC/EBC_all/github_ci/bim2sim/logs/ - cp *.log /builds/EBC/EBC_all/github_ci/bim2sim/logs/ - ls -la /builds/EBC/EBC_all/github_ci/bim2sim - ls -la /builds/EBC/EBC_all/github_ci/bim2sim/logs - fi + - ls -la ./ + - ls -la /builds/EBC/EBC_all/github_ci/bim2sim + - ls -la /builds/EBC/EBC_all/github_ci/bim2sim/logs + - mkdir -p /builds/EBC/EBC_all/github_ci/bim2sim/logs/ + - cp *.log /builds/EBC/EBC_all/github_ci/bim2sim/logs/ + - ls -la /builds/EBC/EBC_all/github_ci/bim2sim + - ls -la /builds/EBC/EBC_all/github_ci/bim2sim/logs artifacts: paths: # - logs/* From 5aeb75a911343cc982c577eee331126e22623ea1 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 21:08:36 +0200 Subject: [PATCH 068/148] add log files --- .gitlab-ci.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d2b6d274e0..a047fb017b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -241,8 +241,10 @@ variables: - pip install -e .[$plugin] - export BIM2SIM_LOG_LEVEL=ERROR # TODO select files to download based on plugin - - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new --with_regression - - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new --with_regression +# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new --with_regression +# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new --with_regression +# TODO run this only for TEASER + - python ~/bim2sim-coding/bim2sim/plugins/PluginTEASER/test/regression/prepare_regression_tests.py # TODO for EP image install .idf file (see previous pipeline) # use xvfb-run -n 77 command if dymola image is used - | From 2a942df64d2b993d7660c32576730e62fb0aa127 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 21:12:15 +0200 Subject: [PATCH 069/148] add log files --- .gitlab-ci.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a047fb017b..87433db1bd 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -247,19 +247,24 @@ variables: - python ~/bim2sim-coding/bim2sim/plugins/PluginTEASER/test/regression/prepare_regression_tests.py # TODO for EP image install .idf file (see previous pipeline) # use xvfb-run -n 77 command if dymola image is used + # use set +e to make sure the pipeline does not stop when the job returns exit code 1 - | + set +e if [[ "$CI_JOB_IMAGE" == *"dymola"* ]]; then xvfb-run -n 77 coverage run -m unittest discover ~/bim2sim-coding/bim2sim/plugins/${plugin}/test/regression else coverage run -m unittest discover ~/bim2sim-coding/bim2sim/plugins/${plugin}/test/regression fi + test_exit_code=$? + set -e - ls -la ./ - ls -la /builds/EBC/EBC_all/github_ci/bim2sim - - ls -la /builds/EBC/EBC_all/github_ci/bim2sim/logs + - ls -la /builds/EBC/EBC_all/github_ci/bim2sim/logs || true - mkdir -p /builds/EBC/EBC_all/github_ci/bim2sim/logs/ - - cp *.log /builds/EBC/EBC_all/github_ci/bim2sim/logs/ + - cp *.log /builds/EBC/EBC_all/github_ci/bim2sim/logs/ || true - ls -la /builds/EBC/EBC_all/github_ci/bim2sim - ls -la /builds/EBC/EBC_all/github_ci/bim2sim/logs + - exit $test_exit_code artifacts: paths: # - logs/* From ed7a7390f6bc7a034a7c1b2c6b1abf242304261e Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 21:23:28 +0200 Subject: [PATCH 070/148] add log files --- .gitlab-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 87433db1bd..5df2893647 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -258,18 +258,18 @@ variables: test_exit_code=$? set -e - ls -la ./ - - ls -la /builds/EBC/EBC_all/github_ci/bim2sim - - ls -la /builds/EBC/EBC_all/github_ci/bim2sim/logs || true - mkdir -p /builds/EBC/EBC_all/github_ci/bim2sim/logs/ - cp *.log /builds/EBC/EBC_all/github_ci/bim2sim/logs/ || true - ls -la /builds/EBC/EBC_all/github_ci/bim2sim - ls -la /builds/EBC/EBC_all/github_ci/bim2sim/logs - exit $test_exit_code artifacts: + when: always paths: + - bim2sim/logs/* # - logs/* # - logs/failed-simulator-dymola.log - - /builds/EBC/EBC_all/github_ci/bim2sim/logs/* +# - /builds/EBC/EBC_all/github_ci/bim2sim/logs/* # - bim2sim-coding/simulator-dymola.log # - bim2sim-coding/comparison-dymola.log # - bim2sim-coding/unitTests-dymola.log From 158993a35a89b8fc5f923e272d667cd48a106992 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 21:26:47 +0200 Subject: [PATCH 071/148] add log files --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5df2893647..7f394c0c35 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -267,9 +267,10 @@ variables: when: always paths: - bim2sim/logs/* + - logs/* # - logs/* # - logs/failed-simulator-dymola.log -# - /builds/EBC/EBC_all/github_ci/bim2sim/logs/* + - /builds/EBC/EBC_all/github_ci/bim2sim/logs/* # - bim2sim-coding/simulator-dymola.log # - bim2sim-coding/comparison-dymola.log # - bim2sim-coding/unitTests-dymola.log From c6cb82e3f5890d6c4dd074ce194ee06278ae4297 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 21:44:23 +0200 Subject: [PATCH 072/148] try to copy license to mambauser home directory as we are not using root user --- .gitlab-ci.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7f394c0c35..111da8fdc7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -230,6 +230,12 @@ variables: .test_template_plugin_regression: &test_template_plugin_regression stage: test_regression before_script: + - sudo mkdir -p /home/mambauser/.dassaultsystemes/dymola/ + - sudo cp /root/.dassaultsystemes/dymola/dymola.lic /home/mambauser/.dassaultsystemes/dymola/ + - sudo cp /root/.dassaultsystemes/dymola/setup.dymx /home/mambauser/.dassaultsystemes/dymola/ + - sudo chown -R mambauser:mambauser /home/mambauser/.dassaultsystemes + - export DYMOLA_RUNTIME_LICENSE=/home/mambauser/.dassaultsystemes/dymola/dymola.lic + - export DYNASIM_LICENSE_FILE=/home/mambauser/.dassaultsystemes/dymola/setup.dymx - eval "$(micromamba shell hook --shell bash)" - micromamba activate base script: From f5bc4702e0734a0d58d99b6c5ad597249ccd2185 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 21:49:12 +0200 Subject: [PATCH 073/148] change dockerfile to solve dymola license problem --- .gitlab-ci.yml | 104 ++++++++++++++++++------------------ micromambaDymola.Dockerfile | 8 +++ 2 files changed, 60 insertions(+), 52 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 111da8fdc7..5af7050c93 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,5 +1,5 @@ stages: -# - build-env + - build-env # - test_base # - test_integration - test_regression @@ -52,19 +52,19 @@ variables: - docker build -t $CI_REGISTRY/bim2sim:$TAG -f ${DOCKERFILE} --build-arg PYTHON_VERSION=${PYTHON_VERSION} . - docker push $CI_REGISTRY/bim2sim:$TAG -#.build_template_dymola: &build_template_dymola -# image: docker:24.0.5 -# stage: build-env -# services: -# - name: docker:24.0.5-dind -# variables: -# HEALTHCHECK_TCP_PORT: "2376" -# before_script: -# - docker login -u $CI_DEPLOY_TOKEN_USERNAME_DYMOLA -p $CI_DEPLOY_TOKEN_PASSWORD_DYMOLA $CI_REGISTRY_LOGIN_DYMOLA # login dymola docker reg -# script: -# - docker build -t $CI_REGISTRY/bim2sim:$TAG -f ${DOCKERFILE} --build-arg PYTHON_VERSION=${PYTHON_VERSION} . -# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN # login bim2sim reg -# - docker push $CI_REGISTRY/bim2sim:$TAG +.build_template_dymola: &build_template_dymola + image: docker:24.0.5 + stage: build-env + services: + - name: docker:24.0.5-dind + variables: + HEALTHCHECK_TCP_PORT: "2376" + before_script: + - docker login -u $CI_DEPLOY_TOKEN_USERNAME_DYMOLA -p $CI_DEPLOY_TOKEN_PASSWORD_DYMOLA $CI_REGISTRY_LOGIN_DYMOLA # login dymola docker reg + script: + - docker build -t $CI_REGISTRY/bim2sim:$TAG -f ${DOCKERFILE} --build-arg PYTHON_VERSION=${PYTHON_VERSION} . + - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN # login bim2sim reg + - docker push $CI_REGISTRY/bim2sim:$TAG # # ## Development branch builds @@ -107,44 +107,44 @@ variables: # - pyproject.toml # - .gitlab-ci.yml # -#build:dev-dymola:py3.9: -# <<: *build_template_dymola -# variables: -# PYTHON_VERSION: "3.9" -# TAG: dev-dymola-py3.9 -# DOCKERFILE: micromambaDymola.Dockerfile -# rules: -# - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' -# changes: -# - micromambaDymola.Dockerfile -# - pyproject.toml -# - .gitlab-ci.yml -# -#build:dev-dymola:py3.10: -# <<: *build_template_dymola -# variables: -# PYTHON_VERSION: "3.10" -# TAG: dev-dymola-py3.10 -# DOCKERFILE: micromambaDymola.Dockerfile -# rules: -# - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' -# changes: -# - micromambaDymola.Dockerfile -# - pyproject.toml -# - .gitlab-ci.yml -# -#build:dev-dymola:py3.11: -# <<: *build_template_dymola -# variables: -# PYTHON_VERSION: "3.11" -# TAG: dev-dymola-py3.11 -# DOCKERFILE: micromambaDymola.Dockerfile -# rules: -# - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' -# changes: -# - micromambaDymola.Dockerfile -# - pyproject.toml -# - .gitlab-ci.yml +build:dev-dymola:py3.9: + <<: *build_template_dymola + variables: + PYTHON_VERSION: "3.9" + TAG: dev-dymola-py3.9 + DOCKERFILE: micromambaDymola.Dockerfile + rules: + - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' + changes: + - micromambaDymola.Dockerfile + - pyproject.toml + - .gitlab-ci.yml + +build:dev-dymola:py3.10: + <<: *build_template_dymola + variables: + PYTHON_VERSION: "3.10" + TAG: dev-dymola-py3.10 + DOCKERFILE: micromambaDymola.Dockerfile + rules: + - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' + changes: + - micromambaDymola.Dockerfile + - pyproject.toml + - .gitlab-ci.yml + +build:dev-dymola:py3.11: + <<: *build_template_dymola + variables: + PYTHON_VERSION: "3.11" + TAG: dev-dymola-py3.11 + DOCKERFILE: micromambaDymola.Dockerfile + rules: + - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' + changes: + - micromambaDymola.Dockerfile + - pyproject.toml + - .gitlab-ci.yml # ## Main branch builds #build:main:py3.9: diff --git a/micromambaDymola.Dockerfile b/micromambaDymola.Dockerfile index b2f494d943..fa35d7e59f 100644 --- a/micromambaDymola.Dockerfile +++ b/micromambaDymola.Dockerfile @@ -20,6 +20,14 @@ ENV MAMBA_USER=$MAMBA_USER ENV MAMBA_ROOT_PREFIX="/opt/conda" ENV MAMBA_EXE="/bin/micromamba" +# copy license from dymola docker +RUN mkdir -p /home/$MAMBA_USER/.dassaultsystemes/dymola/ +COPY /root/.dassaultsystemes/dymola/dymola.lic /home/$MAMBA_USER/.dassaultsystemes/dymola/dymola.lic +COPY /root/.dassaultsystemes/dymola/setup.dymx /home/$MAMBA_USER/.dassaultsystemes/dymola/setup.dymx +RUN chown -R $MAMBA_USER:$MAMBA_USER /home/$MAMBA_USER/.dassaultsystemes +ENV DYMOLA_RUNTIME_LICENSE=/home/$MAMBA_USER/.dassaultsystemes/dymola/dymola.lic +ENV DYNASIM_LICENSE_FILE=/home/$MAMBA_USER/.dassaultsystemes/dymola/setup.dymx + COPY --from=micromamba "$MAMBA_EXE" "$MAMBA_EXE" COPY --from=micromamba /usr/local/bin/_activate_current_env.sh /usr/local/bin/_activate_current_env.sh COPY --from=micromamba /usr/local/bin/_dockerfile_shell.sh /usr/local/bin/_dockerfile_shell.sh From d3dffb05bb9304a1a1e1b4c28d2e066d377e4ecc Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 21:54:00 +0200 Subject: [PATCH 074/148] change dockerfile to solve dymola license problem --- micromambaDymola.Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/micromambaDymola.Dockerfile b/micromambaDymola.Dockerfile index fa35d7e59f..fafc7e34ce 100644 --- a/micromambaDymola.Dockerfile +++ b/micromambaDymola.Dockerfile @@ -23,10 +23,10 @@ ENV MAMBA_EXE="/bin/micromamba" # copy license from dymola docker RUN mkdir -p /home/$MAMBA_USER/.dassaultsystemes/dymola/ COPY /root/.dassaultsystemes/dymola/dymola.lic /home/$MAMBA_USER/.dassaultsystemes/dymola/dymola.lic -COPY /root/.dassaultsystemes/dymola/setup.dymx /home/$MAMBA_USER/.dassaultsystemes/dymola/setup.dymx +#COPY /root/.dassaultsystemes/dymola/setup.dymx /home/$MAMBA_USER/.dassaultsystemes/dymola/setup.dymx RUN chown -R $MAMBA_USER:$MAMBA_USER /home/$MAMBA_USER/.dassaultsystemes ENV DYMOLA_RUNTIME_LICENSE=/home/$MAMBA_USER/.dassaultsystemes/dymola/dymola.lic -ENV DYNASIM_LICENSE_FILE=/home/$MAMBA_USER/.dassaultsystemes/dymola/setup.dymx +#ENV DYNASIM_LICENSE_FILE=/home/$MAMBA_USER/.dassaultsystemes/dymola/setup.dymx COPY --from=micromamba "$MAMBA_EXE" "$MAMBA_EXE" COPY --from=micromamba /usr/local/bin/_activate_current_env.sh /usr/local/bin/_activate_current_env.sh From c276c348bdfc6760e285af0e51b0b7f3a85b6c97 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 22:00:18 +0200 Subject: [PATCH 075/148] change dockerfile to solve dymola license problem --- .gitlab-ci.yml | 9 ++------- micromambaDymola.Dockerfile | 9 ++------- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5af7050c93..c8efada359 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,8 +1,8 @@ stages: + - test_regression - build-env # - test_base # - test_integration - - test_regression # - doc # - code_quality # - deploy @@ -230,12 +230,7 @@ build:dev-dymola:py3.11: .test_template_plugin_regression: &test_template_plugin_regression stage: test_regression before_script: - - sudo mkdir -p /home/mambauser/.dassaultsystemes/dymola/ - - sudo cp /root/.dassaultsystemes/dymola/dymola.lic /home/mambauser/.dassaultsystemes/dymola/ - - sudo cp /root/.dassaultsystemes/dymola/setup.dymx /home/mambauser/.dassaultsystemes/dymola/ - - sudo chown -R mambauser:mambauser /home/mambauser/.dassaultsystemes - - export DYMOLA_RUNTIME_LICENSE=/home/mambauser/.dassaultsystemes/dymola/dymola.lic - - export DYNASIM_LICENSE_FILE=/home/mambauser/.dassaultsystemes/dymola/setup.dymx + - export DYMOLA_RUNTIME_LICENSE="ANY 50064@license2.rz.rwth-aachen.de" - eval "$(micromamba shell hook --shell bash)" - micromamba activate base script: diff --git a/micromambaDymola.Dockerfile b/micromambaDymola.Dockerfile index fafc7e34ce..17a60d34b7 100644 --- a/micromambaDymola.Dockerfile +++ b/micromambaDymola.Dockerfile @@ -20,13 +20,8 @@ ENV MAMBA_USER=$MAMBA_USER ENV MAMBA_ROOT_PREFIX="/opt/conda" ENV MAMBA_EXE="/bin/micromamba" -# copy license from dymola docker -RUN mkdir -p /home/$MAMBA_USER/.dassaultsystemes/dymola/ -COPY /root/.dassaultsystemes/dymola/dymola.lic /home/$MAMBA_USER/.dassaultsystemes/dymola/dymola.lic -#COPY /root/.dassaultsystemes/dymola/setup.dymx /home/$MAMBA_USER/.dassaultsystemes/dymola/setup.dymx -RUN chown -R $MAMBA_USER:$MAMBA_USER /home/$MAMBA_USER/.dassaultsystemes -ENV DYMOLA_RUNTIME_LICENSE=/home/$MAMBA_USER/.dassaultsystemes/dymola/dymola.lic -#ENV DYNASIM_LICENSE_FILE=/home/$MAMBA_USER/.dassaultsystemes/dymola/setup.dymx +# Add the DYMOLA_RUNTIME_LICENSE environment variable +ENV DYMOLA_RUNTIME_LICENSE="ANY 50064@license2.rz.rwth-aachen.de" COPY --from=micromamba "$MAMBA_EXE" "$MAMBA_EXE" COPY --from=micromamba /usr/local/bin/_activate_current_env.sh /usr/local/bin/_activate_current_env.sh From 06a2d73a587519135fa51b227fdc723953395e31 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 22:08:35 +0200 Subject: [PATCH 076/148] unify skip task message --- .../bim2sim_teaser/task/simulate_dymola_ebcpy.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/bim2sim/plugins/PluginTEASER/bim2sim_teaser/task/simulate_dymola_ebcpy.py b/bim2sim/plugins/PluginTEASER/bim2sim_teaser/task/simulate_dymola_ebcpy.py index ef3c2c4e22..b07cb45069 100644 --- a/bim2sim/plugins/PluginTEASER/bim2sim_teaser/task/simulate_dymola_ebcpy.py +++ b/bim2sim/plugins/PluginTEASER/bim2sim_teaser/task/simulate_dymola_ebcpy.py @@ -32,10 +32,9 @@ def run(self, bldg_names): """ if not self.playground.sim_settings.dymola_simulation: self.logger.warning( - f"{self.name} task was selected to run, but sim_setting for" - f" dymola_simulation is set to " - f"{self.playground.sim_settings.dymola_simulation}. " - f"Please set sim_setting to True or deactivate task.") + f"Skipping task {self.name} as sim_setting 'dymola_simulation' " + f"is set to {self.playground.sim_settings.dymola_simulation} " + f"and no simulation should be performed.") return None, else: if self.playground.sim_settings.path_aixlib: From 9a11541903d1df0733ec4bb6429a8e0276f706c5 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 22:13:08 +0200 Subject: [PATCH 077/148] prepare regression job to work for other plugins --- .gitlab-ci.yml | 23 ++++++------------- .../regression/prepare_regression_tests.py | 18 +++++++++++++++ .../regression/prepare_regression_tests.py | 12 ++++++++++ 3 files changed, 37 insertions(+), 16 deletions(-) create mode 100644 bim2sim/plugins/PluginAixLib/test/regression/prepare_regression_tests.py create mode 100644 bim2sim/plugins/PluginEnergyPlus/test/regression/prepare_regression_tests.py diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c8efada359..0f8805a0b1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -230,7 +230,6 @@ build:dev-dymola:py3.11: .test_template_plugin_regression: &test_template_plugin_regression stage: test_regression before_script: - - export DYMOLA_RUNTIME_LICENSE="ANY 50064@license2.rz.rwth-aachen.de" - eval "$(micromamba shell hook --shell bash)" - micromamba activate base script: @@ -241,11 +240,13 @@ build:dev-dymola:py3.11: - pip install -e .[test] - pip install -e .[$plugin] - export BIM2SIM_LOG_LEVEL=ERROR - # TODO select files to download based on plugin -# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new --with_regression -# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new --with_regression -# TODO run this only for TEASER - - python ~/bim2sim-coding/bim2sim/plugins/PluginTEASER/test/regression/prepare_regression_tests.py + # perform prepare_regression_tests if it exists + - | + if [ -f ~/bim2sim-coding/bim2sim/plugins/${plugin}/test/regression/prepare_regression_tests.py ]; then + python ~/bim2sim-coding/bim2sim/plugins/${plugin}/test/regression/prepare_regression_tests.py + else + echo "Skipping regression test preparation for ${plugin}: File not found" + fi # TODO for EP image install .idf file (see previous pipeline) # use xvfb-run -n 77 command if dymola image is used # use set +e to make sure the pipeline does not stop when the job returns exit code 1 @@ -258,23 +259,13 @@ build:dev-dymola:py3.11: fi test_exit_code=$? set -e - - ls -la ./ - mkdir -p /builds/EBC/EBC_all/github_ci/bim2sim/logs/ - cp *.log /builds/EBC/EBC_all/github_ci/bim2sim/logs/ || true - - ls -la /builds/EBC/EBC_all/github_ci/bim2sim - - ls -la /builds/EBC/EBC_all/github_ci/bim2sim/logs - exit $test_exit_code artifacts: when: always paths: - - bim2sim/logs/* - logs/* - # - logs/* - # - logs/failed-simulator-dymola.log - - /builds/EBC/EBC_all/github_ci/bim2sim/logs/* - # - bim2sim-coding/simulator-dymola.log - # - bim2sim-coding/comparison-dymola.log - # - bim2sim-coding/unitTests-dymola.log ## - coverage report -i ## - coverage xml ## artifacts: diff --git a/bim2sim/plugins/PluginAixLib/test/regression/prepare_regression_tests.py b/bim2sim/plugins/PluginAixLib/test/regression/prepare_regression_tests.py new file mode 100644 index 0000000000..ffb5b4b36d --- /dev/null +++ b/bim2sim/plugins/PluginAixLib/test/regression/prepare_regression_tests.py @@ -0,0 +1,18 @@ +from pathlib import Path + +from bim2sim.utilities.common_functions import download_test_resources, \ + download_library + + +def prepare_regression_tests(): + download_test_resources('hydraulic', True, force_new=True) + repo_url = "https://github.com/RWTH-EBC/AixLib.git" + branch_name = "main" + repo_name = "AixLib" + clone_dir = Path(__file__).parent / "library" / f"library_{repo_name}" + print(f"Cloning AixLib library to {clone_dir}") + download_library(repo_url, branch_name, clone_dir) + + +if __name__ == '__main__': + prepare_regression_tests() diff --git a/bim2sim/plugins/PluginEnergyPlus/test/regression/prepare_regression_tests.py b/bim2sim/plugins/PluginEnergyPlus/test/regression/prepare_regression_tests.py new file mode 100644 index 0000000000..2b48ff5014 --- /dev/null +++ b/bim2sim/plugins/PluginEnergyPlus/test/regression/prepare_regression_tests.py @@ -0,0 +1,12 @@ +from pathlib import Path + +from bim2sim.utilities.common_functions import download_test_resources, \ + download_library + + +def prepare_regression_tests(): + download_test_resources('arch', True, force_new=True) + + +if __name__ == '__main__': + prepare_regression_tests() From ee7d284a093503f8ac681746e9d2a31ae14802c5 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 22:36:53 +0200 Subject: [PATCH 078/148] try to build new energyplus image based on micromamba --- .gitlab-ci.yml | 51 +++++++++++++++++++++++++++++++-- micromambaEnergyPlus.Dockerfile | 35 ++++++++++++++++++++++ 2 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 micromambaEnergyPlus.Dockerfile diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0f8805a0b1..56eb3894c8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,6 @@ stages: - - test_regression - build-env + - test_regression # - test_base # - test_integration # - doc @@ -65,6 +65,7 @@ variables: - docker build -t $CI_REGISTRY/bim2sim:$TAG -f ${DOCKERFILE} --build-arg PYTHON_VERSION=${PYTHON_VERSION} . - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN # login bim2sim reg - docker push $CI_REGISTRY/bim2sim:$TAG + # # ## Development branch builds @@ -145,6 +146,48 @@ build:dev-dymola:py3.11: - micromambaDymola.Dockerfile - pyproject.toml - .gitlab-ci.yml + +build:dev-energyplus:py3.9: + <<: *build_template + variables: + PYTHON_VERSION: "3.9" + TAG: dev-energyplus-py3.9 + DOCKERFILE: micromambaEnergyPlus.Dockerfile + rules: + - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' + changes: + - micromambaEnergyPlus.Dockerfile + - pyproject.toml + - .gitlab-ci.yml + +build:dev-energyplus:py3.10: + <<: *build_template + variables: + PYTHON_VERSION: "3.10" + TAG: dev-energyplus-py3.10 + DOCKERFILE: micromambaEnergyPlus.Dockerfile + rules: + - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' + changes: + - micromambaEnergyPlus.Dockerfile + - pyproject.toml + - .gitlab-ci.yml + +build:dev-energyplus:py3.11: + <<: *build_template + variables: + PYTHON_VERSION: "3.11" + TAG: dev-energyplus-py3.11 + DOCKERFILE: micromambaEnergyPlus.Dockerfile + rules: + - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' + changes: + - micromambaEnergyPlus.Dockerfile + - pyproject.toml + - .gitlab-ci.yml + + + # ## Main branch builds #build:main:py3.9: @@ -247,7 +290,11 @@ build:dev-dymola:py3.11: else echo "Skipping regression test preparation for ${plugin}: File not found" fi - # TODO for EP image install .idf file (see previous pipeline) + # for EP image create Minimal.idf file + - | + if [[ "$CI_JOB_IMAGE" == *"energyplus"* ]]; then + cat ~/bim2sim-coding/bim2sim/plugins/PluginEnergyPlus/data/Minimal.idf + fi # use xvfb-run -n 77 command if dymola image is used # use set +e to make sure the pipeline does not stop when the job returns exit code 1 - | diff --git a/micromambaEnergyPlus.Dockerfile b/micromambaEnergyPlus.Dockerfile new file mode 100644 index 0000000000..f7deeb2ccc --- /dev/null +++ b/micromambaEnergyPlus.Dockerfile @@ -0,0 +1,35 @@ +ARG PYTHON_VERSION=3.9 +FROM registry.git.rwth-aachen.de/ebc/ebc_all/github_ci/bim2sim/bim2sim:dev-py${PYTHON_VERSION} + +RUN pip install --no-cache-dir '.[PluginEnergyPlus]' -i https://pypi.tuna.tsinghua.edu.cn/simple + +# EnergyPlus part +ENV ENERGYPLUS_VERSION=9.4.0 +ENV ENERGYPLUS_TAG=v9.4.0 +ENV ENERGYPLUS_SHA=998c4b761e +ENV ENERGYPLUS_INSTALL_VERSION=9-4-0 + +ENV ENERGYPLUS_DOWNLOAD_BASE_URL https://github.com/NREL/EnergyPlus/releases/download/$ENERGYPLUS_TAG +ENV ENERGYPLUS_DOWNLOAD_FILENAME EnergyPlus-$ENERGYPLUS_VERSION-$ENERGYPLUS_SHA-Linux-Ubuntu18.04-x86_64.sh +ENV ENERGYPLUS_DOWNLOAD_URL $ENERGYPLUS_DOWNLOAD_BASE_URL/$ENERGYPLUS_DOWNLOAD_FILENAME + +USER root + +# Install necessary packages and EnergyPlus +RUN apt-get update && apt-get install -y ca-certificates curl libx11-6 libexpat1 \ + && rm -rf /var/lib/apt/lists/* \ + && curl -SLO $ENERGYPLUS_DOWNLOAD_URL \ + && chmod +x $ENERGYPLUS_DOWNLOAD_FILENAME \ + && echo "y\r" | ./$ENERGYPLUS_DOWNLOAD_FILENAME \ + && rm $ENERGYPLUS_DOWNLOAD_FILENAME \ + && cd /usr/local/EnergyPlus-$ENERGYPLUS_INSTALL_VERSION \ + && rm -rf DataSets Documentation ExampleFiles WeatherData MacroDataSets PostProcess/convertESOMTRpgm \ + PostProcess/EP-Compare PreProcess/FMUParser PreProcess/ParametricPreProcessor PreProcess/IDFVersionUpdater + +# Remove broken symlinks +RUN cd /usr/local/bin && find -L . -type l -delete + +USER $MAMBA_USER + +VOLUME /var/simdata/energyplus +WORKDIR /var/simdata/energyplus \ No newline at end of file From b973393230a120d7d149c64b1565585f3035758e Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 22:48:07 +0200 Subject: [PATCH 079/148] try to build new energyplus image based on micromamba --- micromambaEnergyPlus.Dockerfile | 2 -- 1 file changed, 2 deletions(-) diff --git a/micromambaEnergyPlus.Dockerfile b/micromambaEnergyPlus.Dockerfile index f7deeb2ccc..173cbe726c 100644 --- a/micromambaEnergyPlus.Dockerfile +++ b/micromambaEnergyPlus.Dockerfile @@ -1,8 +1,6 @@ ARG PYTHON_VERSION=3.9 FROM registry.git.rwth-aachen.de/ebc/ebc_all/github_ci/bim2sim/bim2sim:dev-py${PYTHON_VERSION} -RUN pip install --no-cache-dir '.[PluginEnergyPlus]' -i https://pypi.tuna.tsinghua.edu.cn/simple - # EnergyPlus part ENV ENERGYPLUS_VERSION=9.4.0 ENV ENERGYPLUS_TAG=v9.4.0 From cef0043372d8f73ce3d7ec1db4d1a50b6cba2a1f Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 22:53:30 +0200 Subject: [PATCH 080/148] try to run regression tests for EP with new image --- .gitlab-ci.yml | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 56eb3894c8..9d0f6e4191 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,6 @@ stages: - - build-env - test_regression + - build-env # - test_base # - test_integration # - doc @@ -442,6 +442,23 @@ test_PluginTEASER_regression:py3.11: variables: plugin: "PluginTEASER" +test_PluginEnergyPlus_regression:py3.9: + <<: *test_template_plugin_regression + image: $CI_REGISTRY/bim2sim:dev-energyplus-py3.9 + variables: + plugin: "PluginEnergyPlus" + +test_PluginEnergyPlus_regression:py3.10: + <<: *test_template_plugin_regression + image: $CI_REGISTRY/bim2sim:dev-energyplus-py3.10 + variables: + plugin: "PluginEnergyPlus" + +test_PluginEnergyPlus_regression:py3.11: + <<: *test_template_plugin_regression + image: $CI_REGISTRY/bim2sim:dev-energyplus-py3.11 + variables: + plugin: "PluginEnergyPlus" # #test_Base_new: From e7603fd2c3d3360a86a54ead4339f37c8823f0a0 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 22:59:38 +0200 Subject: [PATCH 081/148] really use different python versions --- .gitlab-ci.yml | 84 +++++++++++++++++++++---------------------- env.yaml | 2 +- micromamba.Dockerfile | 3 +- 3 files changed, 44 insertions(+), 45 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9d0f6e4191..6f3c0c7513 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -66,48 +66,47 @@ variables: - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN # login bim2sim reg - docker push $CI_REGISTRY/bim2sim:$TAG -# -# -## Development branch builds -#build:dev:py3.9: -# <<: *build_template -# variables: -# PYTHON_VERSION: "3.9" -# TAG: dev-py3.9 -# DOCKERFILE: micromamba.Dockerfile -# rules: -# - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' -# changes: -# - micromamba.Dockerfile -# - pyproject.toml -# - .gitlab-ci.yml -# -#build:dev:py3.10: -# <<: *build_template -# variables: -# PYTHON_VERSION: "3.10" -# TAG: dev-py3.10 -# DOCKERFILE: micromamba.Dockerfile -# rules: -# - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' -# changes: -# - micromamba.Dockerfile -# - pyproject.toml -# - .gitlab-ci.yml -# -#build:dev:py3.11: -# <<: *build_template -# variables: -# PYTHON_VERSION: "3.11" -# TAG: dev-py3.11 -# DOCKERFILE: micromamba.Dockerfile -# rules: -# - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' -# changes: -# - micromamba.Dockerfile -# - pyproject.toml -# - .gitlab-ci.yml -# +# Development branch builds +build:dev:py3.9: + <<: *build_template + variables: + PYTHON_VERSION: "3.9" + TAG: dev-py3.9 + DOCKERFILE: micromamba.Dockerfile + rules: + - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' + changes: + - micromamba.Dockerfile + - pyproject.toml + - .gitlab-ci.yml + +build:dev:py3.10: + <<: *build_template + variables: + PYTHON_VERSION: "3.10" + TAG: dev-py3.10 + DOCKERFILE: micromamba.Dockerfile + rules: + - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' + changes: + - micromamba.Dockerfile + - pyproject.toml + - .gitlab-ci.yml + +build:dev:py3.11: + <<: *build_template + variables: + PYTHON_VERSION: "3.11" + TAG: dev-py3.11 + DOCKERFILE: micromamba.Dockerfile + rules: + - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' + changes: + - micromamba.Dockerfile + - pyproject.toml + - .gitlab-ci.yml + +# Build dymola images build:dev-dymola:py3.9: <<: *build_template_dymola variables: @@ -147,6 +146,7 @@ build:dev-dymola:py3.11: - pyproject.toml - .gitlab-ci.yml +# Build EnergyPlus images build:dev-energyplus:py3.9: <<: *build_template variables: diff --git a/env.yaml b/env.yaml index a14c07d53c..3064c5b8e0 100644 --- a/env.yaml +++ b/env.yaml @@ -3,7 +3,7 @@ channels: - conda-forge dependencies: - pythonocc-core=7.7.0 - - python=3.11 + - python - pip - gcc - git \ No newline at end of file diff --git a/micromamba.Dockerfile b/micromamba.Dockerfile index 99863a4d9f..30e8f48e42 100644 --- a/micromamba.Dockerfile +++ b/micromamba.Dockerfile @@ -8,8 +8,7 @@ ENV PYTHON_VERSION=${PYTHON_VERSION} COPY --chown=$MAMBA_USER:$MAMBA_USER env.yaml /tmp/env.yaml # Modify the env.yaml file to include the specified Python version -RUN sed -i "s/python=.*/python=${PYTHON_VERSION}/" /tmp/env.yaml && \ - micromamba install -y -n base -f /tmp/env.yaml && \ +RUN micromamba install -y -n base -f /tmp/env.yaml python=${PYTHON_VERSION} && \ micromamba clean --all --yes # Copy files From caf54b0da9deecd9b84fde8f142896ac2fd81300 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 23:35:25 +0200 Subject: [PATCH 082/148] try to run includes with PYTHON_VERSION variable --- .gitlab-ci.yml | 38 +++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6f3c0c7513..11089c177c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,11 +1,11 @@ stages: + - doc + - deploy + - code_quality - test_regression - build-env # - test_base # - test_integration -# - doc -# - code_quality -# - deploy # - build-env-plugins # - build-tool @@ -13,7 +13,7 @@ variables: # TODO variable inside variable seems not be working on our gitlab instance, # see post below, therefore use hardcoded image here for sphinx job # https://stackoverflow.com/questions/67005507/variable-inside-variable-gitlab-ci -# PYTHON_VERSION: "registry.git.rwth-aachen.de/ebc/ebc_all/github_ci/bim2sim/environment:development" + PYTHON_VERSION: "registry.git.rwth-aachen.de/ebc/ebc_all/github_ci/bim2sim/bim2sim:dev-py3.11" # PYTHON_VERSION: "${CI_REGISTRY}/environment:development" GIT_SUBMODULE_STRATEGY: recursive GH_REPO_URL: "git@github.com:BIM2SIM/bim2sim.git" @@ -22,13 +22,13 @@ variables: TEST_PATH: test -#include: -# - project: 'EBC/EBC_all/gitlab_ci/templates' -# file: 'python/code-quality/pylint.gitlab-ci.yml' -# - project: 'EBC/EBC_all/gitlab_ci/templates' -# file: 'python/doc/sphinxdoc.gitlab-ci.yml' -# - project: 'EBC/EBC_all/gitlab_ci/templates' -# file: 'pages/gh-pages.gitlab-ci.yml' +include: + - project: 'EBC/EBC_all/gitlab_ci/templates' + file: 'python/code-quality/pylint.gitlab-ci.yml' + - project: 'EBC/EBC_all/gitlab_ci/templates' + file: 'python/doc/sphinxdoc.gitlab-ci.yml' + - project: 'EBC/EBC_all/gitlab_ci/templates' + file: 'pages/gh-pages.gitlab-ci.yml' # - project: 'EBC/EBC_all/gitlab_ci/templates' # file: 'python/tests/coverage.gitlab-ci.yml' @@ -66,6 +66,20 @@ variables: - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN # login bim2sim reg - docker push $CI_REGISTRY/bim2sim:$TAG +# docu branch builds (image to build documentation needs extra requirements) +#build:dev-docu:py3.11: +# <<: *build_template +# variables: +# PYTHON_VERSION: "3.11" +# TAG: dev-docu-py3.11 +# DOCKERFILE: micromamba.Dockerfile +# rules: +# - if: '$CI_COMMIT_REF_NAME == "731-bump-python-to-311"' +# changes: +# - micromamba.Dockerfile +# - pyproject.toml +# - .gitlab-ci.yml + # Development branch builds build:dev:py3.9: <<: *build_template @@ -186,8 +200,6 @@ build:dev-energyplus:py3.11: - pyproject.toml - .gitlab-ci.yml - - # ## Main branch builds #build:main:py3.9: From f76f6201f73efd0288c1ac138421eaac124b8df8 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 23:39:21 +0200 Subject: [PATCH 083/148] try to run includes with PYTHON_VERSION variable --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 11089c177c..9fec129c5a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,7 @@ stages: - doc - - deploy - code_quality + - deploy - test_regression - build-env # - test_base @@ -13,7 +13,7 @@ variables: # TODO variable inside variable seems not be working on our gitlab instance, # see post below, therefore use hardcoded image here for sphinx job # https://stackoverflow.com/questions/67005507/variable-inside-variable-gitlab-ci - PYTHON_VERSION: "registry.git.rwth-aachen.de/ebc/ebc_all/github_ci/bim2sim/bim2sim:dev-py3.11" +# PYTHON_VERSION: "registry.git.rwth-aachen.de/ebc/ebc_all/github_ci/bim2sim/bim2sim:dev-py3.11" # PYTHON_VERSION: "${CI_REGISTRY}/environment:development" GIT_SUBMODULE_STRATEGY: recursive GH_REPO_URL: "git@github.com:BIM2SIM/bim2sim.git" From cba3d06264178379170503e6aad8d61729ecea9c Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 23:47:13 +0200 Subject: [PATCH 084/148] update rules in sphinxdoc --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9fec129c5a..9080430f8f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -13,7 +13,7 @@ variables: # TODO variable inside variable seems not be working on our gitlab instance, # see post below, therefore use hardcoded image here for sphinx job # https://stackoverflow.com/questions/67005507/variable-inside-variable-gitlab-ci -# PYTHON_VERSION: "registry.git.rwth-aachen.de/ebc/ebc_all/github_ci/bim2sim/bim2sim:dev-py3.11" + PYTHON_VERSION: "registry.git.rwth-aachen.de/ebc/ebc_all/github_ci/bim2sim/bim2sim:dev-py3.11" # PYTHON_VERSION: "${CI_REGISTRY}/environment:development" GIT_SUBMODULE_STRATEGY: recursive GH_REPO_URL: "git@github.com:BIM2SIM/bim2sim.git" @@ -25,6 +25,7 @@ variables: include: - project: 'EBC/EBC_all/gitlab_ci/templates' file: 'python/code-quality/pylint.gitlab-ci.yml' + ref: upate_bim2sim_python_image - project: 'EBC/EBC_all/gitlab_ci/templates' file: 'python/doc/sphinxdoc.gitlab-ci.yml' - project: 'EBC/EBC_all/gitlab_ci/templates' From 08292b92f0c1e908bc1faa34828ef12d2b6a279e Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 23:49:53 +0200 Subject: [PATCH 085/148] update rules in sphinxdoc --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9080430f8f..13e69abc17 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -15,7 +15,7 @@ variables: # https://stackoverflow.com/questions/67005507/variable-inside-variable-gitlab-ci PYTHON_VERSION: "registry.git.rwth-aachen.de/ebc/ebc_all/github_ci/bim2sim/bim2sim:dev-py3.11" # PYTHON_VERSION: "${CI_REGISTRY}/environment:development" - GIT_SUBMODULE_STRATEGY: recursive +# GIT_SUBMODULE_STRATEGY: recursive GH_REPO_URL: "git@github.com:BIM2SIM/bim2sim.git" GH_PAGES_URL: "https://bim2sim.github.io/${CI_PROJECT_NAME}/" TEST_ENGINE: "unittest" From a97cbf49a9d9e8f4be41779fa7551300d9a8f59e Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sat, 19 Oct 2024 23:56:47 +0200 Subject: [PATCH 086/148] update rules in sphinxdoc --- .gitlab-ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 13e69abc17..5abd903db2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -25,7 +25,6 @@ variables: include: - project: 'EBC/EBC_all/gitlab_ci/templates' file: 'python/code-quality/pylint.gitlab-ci.yml' - ref: upate_bim2sim_python_image - project: 'EBC/EBC_all/gitlab_ci/templates' file: 'python/doc/sphinxdoc.gitlab-ci.yml' - project: 'EBC/EBC_all/gitlab_ci/templates' From be8eb97ec78e56fbc83d1f8ac6c9d788c182c700 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sun, 20 Oct 2024 00:08:34 +0200 Subject: [PATCH 087/148] update rules in sphinxdoc --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5abd903db2..f6755e799b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -15,7 +15,7 @@ variables: # https://stackoverflow.com/questions/67005507/variable-inside-variable-gitlab-ci PYTHON_VERSION: "registry.git.rwth-aachen.de/ebc/ebc_all/github_ci/bim2sim/bim2sim:dev-py3.11" # PYTHON_VERSION: "${CI_REGISTRY}/environment:development" -# GIT_SUBMODULE_STRATEGY: recursive + GIT_SUBMODULE_STRATEGY: recursive GH_REPO_URL: "git@github.com:BIM2SIM/bim2sim.git" GH_PAGES_URL: "https://bim2sim.github.io/${CI_PROJECT_NAME}/" TEST_ENGINE: "unittest" From 63c6f7636de77a9ebd610c716a39c4b200ca9ac0 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sun, 20 Oct 2024 00:13:19 +0200 Subject: [PATCH 088/148] update rules in sphinxdoc --- .gitlab-ci.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f6755e799b..aaebdd9e97 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -33,6 +33,14 @@ include: # file: 'python/tests/coverage.gitlab-ci.yml' # This is a workaround to download the test files by overwriting the utils method from original CI testing of EBC +.install_local_repository: + script: + # TODO make this conditional + # if stage is doc, we need to install documentation specific dependencies + - pip install -e .[docu] +# - python ./test/resources/dl_test_resources.py --domain=hydraulic --force_new +# - python ./test/resources/dl_test_resources.py --domain=arch --force_new + #.install_local_repository: # script: # - python ./test/resources/dl_test_resources.py --domain=hydraulic --force_new From 311491146769533f53803b03a8638d4f32150566 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sun, 20 Oct 2024 00:14:41 +0200 Subject: [PATCH 089/148] update rules in sphinxdoc --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index aaebdd9e97..5b0b133e69 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -37,6 +37,8 @@ include: script: # TODO make this conditional # if stage is doc, we need to install documentation specific dependencies + - eval "$(micromamba shell hook --shell bash)" + - micromamba activate base - pip install -e .[docu] # - python ./test/resources/dl_test_resources.py --domain=hydraulic --force_new # - python ./test/resources/dl_test_resources.py --domain=arch --force_new From e75dce7f3820f9266c1b158f874c6c507d826a50 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sun, 20 Oct 2024 00:32:39 +0200 Subject: [PATCH 090/148] split run command for EP into multiple steps to identify error with python 3.9 and python 3.10 --- .gitlab-ci.yml | 20 ++++++++++---------- micromambaEnergyPlus.Dockerfile | 17 +++++++++++------ 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5b0b133e69..71cde428b4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,9 +1,9 @@ stages: - - doc - - code_quality - - deploy - - test_regression +# - doc +# - code_quality +# - deploy - build-env + - test_regression # - test_base # - test_integration # - build-env-plugins @@ -23,12 +23,12 @@ variables: include: - - project: 'EBC/EBC_all/gitlab_ci/templates' - file: 'python/code-quality/pylint.gitlab-ci.yml' - - project: 'EBC/EBC_all/gitlab_ci/templates' - file: 'python/doc/sphinxdoc.gitlab-ci.yml' - - project: 'EBC/EBC_all/gitlab_ci/templates' - file: 'pages/gh-pages.gitlab-ci.yml' +# - project: 'EBC/EBC_all/gitlab_ci/templates' +# file: 'python/code-quality/pylint.gitlab-ci.yml' +# - project: 'EBC/EBC_all/gitlab_ci/templates' +# file: 'python/doc/sphinxdoc.gitlab-ci.yml' +# - project: 'EBC/EBC_all/gitlab_ci/templates' +# file: 'pages/gh-pages.gitlab-ci.yml' # - project: 'EBC/EBC_all/gitlab_ci/templates' # file: 'python/tests/coverage.gitlab-ci.yml' diff --git a/micromambaEnergyPlus.Dockerfile b/micromambaEnergyPlus.Dockerfile index 173cbe726c..0305639231 100644 --- a/micromambaEnergyPlus.Dockerfile +++ b/micromambaEnergyPlus.Dockerfile @@ -15,12 +15,17 @@ USER root # Install necessary packages and EnergyPlus RUN apt-get update && apt-get install -y ca-certificates curl libx11-6 libexpat1 \ - && rm -rf /var/lib/apt/lists/* \ - && curl -SLO $ENERGYPLUS_DOWNLOAD_URL \ - && chmod +x $ENERGYPLUS_DOWNLOAD_FILENAME \ - && echo "y\r" | ./$ENERGYPLUS_DOWNLOAD_FILENAME \ - && rm $ENERGYPLUS_DOWNLOAD_FILENAME \ - && cd /usr/local/EnergyPlus-$ENERGYPLUS_INSTALL_VERSION \ + && rm -rf /var/lib/apt/lists/* + +RUN curl -SLO $ENERGYPLUS_DOWNLOAD_URL + +RUN chmod +x $ENERGYPLUS_DOWNLOAD_FILENAME + +RUN echo "y\r" | ./$ENERGYPLUS_DOWNLOAD_FILENAME + +RUN rm $ENERGYPLUS_DOWNLOAD_FILENAME + +RUN cd /usr/local/EnergyPlus-$ENERGYPLUS_INSTALL_VERSION \ && rm -rf DataSets Documentation ExampleFiles WeatherData MacroDataSets PostProcess/convertESOMTRpgm \ PostProcess/EP-Compare PreProcess/FMUParser PreProcess/ParametricPreProcessor PreProcess/IDFVersionUpdater From 725523d0626094b957bbd197cf6d2a0565d1a1cd Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sun, 20 Oct 2024 09:06:36 +0200 Subject: [PATCH 091/148] check whats wrong with coverage --- .gitlab-ci.yml | 72 +++++++++++++++++++++++++------------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 71cde428b4..ad5fd2cee6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -2,9 +2,9 @@ stages: # - doc # - code_quality # - deploy + - test_base - build-env - test_regression -# - test_base # - test_integration # - build-env-plugins # - build-tool @@ -251,29 +251,29 @@ build:dev-energyplus:py3.11: # - pyproject.toml # - .gitlab-ci.yml # -## Tests -#.test_template_base: &test_template_base -# stage: test_base -# before_script: -# - eval "$(micromamba shell hook --shell bash)" -# - micromamba activate base -# script: -# - mkdir -p ~/bim2sim-coding/ -# - mv ./* ~/bim2sim-coding/ -# - cd ~/bim2sim-coding -# - pip uninstall -y bim2sim -# - pip install -e .[test] -# - export BIM2SIM_LOG_LEVEL=ERROR -# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new -# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new -# - coverage run -m unittest discover ~/bim2sim-coding/test -## - coverage report -i -## - coverage xml -## artifacts: -## reports: -## coverage_report: -## coverage_format: cobertura -## path: coverage.xml +# Tests +.test_template_base: &test_template_base + stage: test_base + before_script: + - eval "$(micromamba shell hook --shell bash)" + - micromamba activate base + script: + - mkdir -p ~/bim2sim-coding/ + - mv ./* ~/bim2sim-coding/ + - cd ~/bim2sim-coding + - pip uninstall -y bim2sim + - pip install -e .[test] + - export BIM2SIM_LOG_LEVEL=ERROR + - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new + - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new + - coverage run -m unittest discover ~/bim2sim-coding/test + - coverage report -i + - coverage xml +# artifacts: +# reports: +# coverage_report: +# coverage_format: cobertura +# path: coverage.xml # #.test_template_plugin_integration: &test_template_plugin_integration # stage: test_integration @@ -343,18 +343,18 @@ build:dev-energyplus:py3.11: ## coverage_format: cobertura ## path: coverage.xml # -#test_base:py3.9: -# <<: *test_template_base -# image: $CI_REGISTRY/bim2sim:dev-py3.9 -# -#test_base:py3.10: -# <<: *test_template_base -# image: $CI_REGISTRY/bim2sim:dev-py3.10 -# -#test_base:py3.11: -# <<: *test_template_base -# image: $CI_REGISTRY/bim2sim:dev-py3.11 -# +test_base:py3.9: + <<: *test_template_base + image: $CI_REGISTRY/bim2sim:dev-py3.9 + +test_base:py3.10: + <<: *test_template_base + image: $CI_REGISTRY/bim2sim:dev-py3.10 + +test_base:py3.11: + <<: *test_template_base + image: $CI_REGISTRY/bim2sim:dev-py3.11 + #test_PluginTEASER_integration:py3.9: # <<: *test_template_plugin_integration # image: $CI_REGISTRY/bim2sim:dev-py3.9 From cb2b5b649595d95b440deb811e2723e8e8067742 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sun, 20 Oct 2024 09:16:24 +0200 Subject: [PATCH 092/148] try combined report --- .gitlab-ci.yml | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ad5fd2cee6..bc3ee6f52b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,6 +3,7 @@ stages: # - code_quality # - deploy - test_base + - report - build-env - test_regression # - test_integration @@ -268,12 +269,10 @@ build:dev-energyplus:py3.11: - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - coverage run -m unittest discover ~/bim2sim-coding/test - coverage report -i - - coverage xml -# artifacts: -# reports: -# coverage_report: -# coverage_format: cobertura -# path: coverage.xml + - coverage xml -o coverage-$PYTHON_VERSION.xml + artifacts: + paths: + - coverage-$PYTHON_VERSION.xml # #.test_template_plugin_integration: &test_template_plugin_integration # stage: test_integration @@ -355,6 +354,25 @@ test_base:py3.11: <<: *test_template_base image: $CI_REGISTRY/bim2sim:dev-py3.11 +combine-coverage: + stage: report + image: + name: registry.git.rwth-aachen.de/ebc/ebc_all/gitlab_ci/templates:python_3.11 + script: + - pip install coverage + - coverage combine coverage-*.xml + - coverage xml -o coverage.xml + - coverage report + artifacts: + reports: + coverage_report: + coverage_format: cobertura + path: coverage.xml + needs: + - test_base:py3.9 + - test_base:py3.10 + - test_base:py3.11 + #test_PluginTEASER_integration:py3.9: # <<: *test_template_plugin_integration # image: $CI_REGISTRY/bim2sim:dev-py3.9 From 79e43d77a4b424dc0a8b7b94bc564d7fb9176aaf Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sun, 20 Oct 2024 09:27:16 +0200 Subject: [PATCH 093/148] try combined report --- .gitlab-ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index bc3ee6f52b..a1e8432fdb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -270,9 +270,11 @@ build:dev-energyplus:py3.11: - coverage run -m unittest discover ~/bim2sim-coding/test - coverage report -i - coverage xml -o coverage-$PYTHON_VERSION.xml + - mkdir -p /builds/EBC/EBC_all/github_ci/bim2sim/reports/ + - cp coverage-$PYTHON_VERSION.xml /builds/EBC/EBC_all/github_ci/bim2sim/reports/ || true artifacts: paths: - - coverage-$PYTHON_VERSION.xml + - reports/coverage-$PYTHON_VERSION.xml # #.test_template_plugin_integration: &test_template_plugin_integration # stage: test_integration From e40f88696abe61d3db95a28dee147977d21034b4 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sun, 20 Oct 2024 09:35:47 +0200 Subject: [PATCH 094/148] try combined report --- .gitlab-ci.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a1e8432fdb..3c86c42d15 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -336,25 +336,25 @@ build:dev-energyplus:py3.11: when: always paths: - logs/* -## - coverage report -i -## - coverage xml -## artifacts: -## reports: -## coverage_report: -## coverage_format: cobertura -## path: coverage.xml -# + + test_base:py3.9: <<: *test_template_base image: $CI_REGISTRY/bim2sim:dev-py3.9 + variables: + PYTHON_VERSION: "3.9" test_base:py3.10: <<: *test_template_base image: $CI_REGISTRY/bim2sim:dev-py3.10 + variables: + PYTHON_VERSION: "3.10" test_base:py3.11: <<: *test_template_base image: $CI_REGISTRY/bim2sim:dev-py3.11 + variables: + PYTHON_VERSION: "3.11" combine-coverage: stage: report From 8af1c19124f873b00b90d6a8f5cdc57ea65ee487 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sun, 20 Oct 2024 09:41:04 +0200 Subject: [PATCH 095/148] try combined report --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3c86c42d15..54e3472f93 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -362,7 +362,7 @@ combine-coverage: name: registry.git.rwth-aachen.de/ebc/ebc_all/gitlab_ci/templates:python_3.11 script: - pip install coverage - - coverage combine coverage-*.xml + - coverage combine reports/coverage-*.xml - coverage xml -o coverage.xml - coverage report artifacts: From 4b35e7c99ebe18e2ed5cb6018a1e537fe66f9ac4 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sun, 20 Oct 2024 09:44:37 +0200 Subject: [PATCH 096/148] try combined report --- .gitlab-ci.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 54e3472f93..77c63204c2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -362,7 +362,11 @@ combine-coverage: name: registry.git.rwth-aachen.de/ebc/ebc_all/gitlab_ci/templates:python_3.11 script: - pip install coverage - - coverage combine reports/coverage-*.xml + - mkdir combined_coverage + - for file in reports/coverage-*.xml; do + coverage xml -o combined_coverage/$(basename $file) --data-file=$file; + done + - coverage combine combined_coverage/.coverage* - coverage xml -o coverage.xml - coverage report artifacts: From c397fa114d2659c220a0a65fca89516f016ac951 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sun, 20 Oct 2024 10:00:23 +0200 Subject: [PATCH 097/148] try combined report --- .gitlab-ci.yml | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 77c63204c2..1efb5387d2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -268,13 +268,14 @@ build:dev-energyplus:py3.11: - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - coverage run -m unittest discover ~/bim2sim-coding/test - - coverage report -i - - coverage xml -o coverage-$PYTHON_VERSION.xml - - mkdir -p /builds/EBC/EBC_all/github_ci/bim2sim/reports/ - - cp coverage-$PYTHON_VERSION.xml /builds/EBC/EBC_all/github_ci/bim2sim/reports/ || true + - ls -la +# - coverage report -i +# - coverage -o .coverage.$PYTHON_VERSION + - mkdir -p /builds/EBC/EBC_all/github_ci/bim2sim/coverage-data/ + - cp *.coverage /builds/EBC/EBC_all/github_ci/bim2sim/coverage-data/ || true artifacts: paths: - - reports/coverage-$PYTHON_VERSION.xml + - coverage-data/* # #.test_template_plugin_integration: &test_template_plugin_integration # stage: test_integration @@ -362,18 +363,15 @@ combine-coverage: name: registry.git.rwth-aachen.de/ebc/ebc_all/gitlab_ci/templates:python_3.11 script: - pip install coverage - - mkdir combined_coverage - - for file in reports/coverage-*.xml; do - coverage xml -o combined_coverage/$(basename $file) --data-file=$file; - done - - coverage combine combined_coverage/.coverage* - - coverage xml -o coverage.xml - - coverage report + - coverage combine combined_coverage.dat coverage-data/ + - mkdir -p $CI_COMMIT_REF_NAME/coverage + - coverage html -d $CI_COMMIT_REF_NAME/coverage + - coverage-badge -o $CI_COMMIT_REF_NAME/coverage/badge.svg artifacts: - reports: - coverage_report: - coverage_format: cobertura - path: coverage.xml + paths: + - $CI_COMMIT_REF_NAME/coverage + expire_in: 2 hrs + needs: - test_base:py3.9 - test_base:py3.10 From 79c88d03101334fd462b1c52e2d17e9c2fa8de3c Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sun, 20 Oct 2024 10:05:01 +0200 Subject: [PATCH 098/148] try combined report --- .gitlab-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1efb5387d2..67b398b7e1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -267,15 +267,15 @@ build:dev-energyplus:py3.11: - export BIM2SIM_LOG_LEVEL=ERROR - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - - coverage run -m unittest discover ~/bim2sim-coding/test + - coverage run --data-file=.coverage.$PYTHON_VERSION -m unittest discover ~/bim2sim-coding/test - ls -la # - coverage report -i # - coverage -o .coverage.$PYTHON_VERSION - mkdir -p /builds/EBC/EBC_all/github_ci/bim2sim/coverage-data/ - - cp *.coverage /builds/EBC/EBC_all/github_ci/bim2sim/coverage-data/ || true + - cp .coverage.$PYTHON_VERSION /builds/EBC/EBC_all/github_ci/bim2sim/coverage-data/ || true artifacts: paths: - - coverage-data/* + - coverage-data/.coverage.$PYTHON_VERSION # #.test_template_plugin_integration: &test_template_plugin_integration # stage: test_integration From 0ba59bc624228093f4d4bf1d5ebacb4d81159dbc Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sun, 20 Oct 2024 10:11:42 +0200 Subject: [PATCH 099/148] try combined report --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 67b398b7e1..6f661525f6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -363,7 +363,7 @@ combine-coverage: name: registry.git.rwth-aachen.de/ebc/ebc_all/gitlab_ci/templates:python_3.11 script: - pip install coverage - - coverage combine combined_coverage.dat coverage-data/ + - coverage combine coverage-data/ - mkdir -p $CI_COMMIT_REF_NAME/coverage - coverage html -d $CI_COMMIT_REF_NAME/coverage - coverage-badge -o $CI_COMMIT_REF_NAME/coverage/badge.svg From 72c7254577f9e4f7f699096a3d4779d3ba791d7a Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sun, 20 Oct 2024 10:19:11 +0200 Subject: [PATCH 100/148] try combined report --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6f661525f6..0abf3462c9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -364,6 +364,8 @@ combine-coverage: script: - pip install coverage - coverage combine coverage-data/ + - ls -la + - ls -la coverage-data/ - mkdir -p $CI_COMMIT_REF_NAME/coverage - coverage html -d $CI_COMMIT_REF_NAME/coverage - coverage-badge -o $CI_COMMIT_REF_NAME/coverage/badge.svg From 49db9f8ae7d9c9dc0dddb9622224d85dfc3907ab Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sun, 20 Oct 2024 10:25:44 +0200 Subject: [PATCH 101/148] try combined report --- .gitlab-ci.yml | 70 ++++++++++++++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0abf3462c9..c62b29ef49 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,9 +1,8 @@ stages: # - doc # - code_quality -# - deploy - test_base - - report + - deploy - build-env - test_regression # - test_integration @@ -28,8 +27,8 @@ include: # file: 'python/code-quality/pylint.gitlab-ci.yml' # - project: 'EBC/EBC_all/gitlab_ci/templates' # file: 'python/doc/sphinxdoc.gitlab-ci.yml' -# - project: 'EBC/EBC_all/gitlab_ci/templates' -# file: 'pages/gh-pages.gitlab-ci.yml' + - project: 'EBC/EBC_all/gitlab_ci/templates' + file: 'pages/gh-pages.gitlab-ci.yml' # - project: 'EBC/EBC_all/gitlab_ci/templates' # file: 'python/tests/coverage.gitlab-ci.yml' @@ -267,15 +266,21 @@ build:dev-energyplus:py3.11: - export BIM2SIM_LOG_LEVEL=ERROR - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - - coverage run --data-file=.coverage.$PYTHON_VERSION -m unittest discover ~/bim2sim-coding/test + - | + if [ "$COVERAGE" = "true" ]; then + coverage run -m unittest discover ~/bim2sim-coding/test + mkdir -p $CI_COMMIT_REF_NAME/coverage + coverage html -d $CI_COMMIT_REF_NAME/coverage + coverage-badge -o $CI_COMMIT_REF_NAME/coverage/badge.svg + else + python -m unittest discover ~/bim2sim-coding/test + fi - ls -la -# - coverage report -i -# - coverage -o .coverage.$PYTHON_VERSION - - mkdir -p /builds/EBC/EBC_all/github_ci/bim2sim/coverage-data/ - - cp .coverage.$PYTHON_VERSION /builds/EBC/EBC_all/github_ci/bim2sim/coverage-data/ || true artifacts: paths: - - coverage-data/.coverage.$PYTHON_VERSION + - $CI_COMMIT_REF_NAME/coverage + expire_in: 2 hrs + # #.test_template_plugin_integration: &test_template_plugin_integration # stage: test_integration @@ -344,40 +349,43 @@ test_base:py3.9: image: $CI_REGISTRY/bim2sim:dev-py3.9 variables: PYTHON_VERSION: "3.9" + COVERAGE: "false" test_base:py3.10: <<: *test_template_base image: $CI_REGISTRY/bim2sim:dev-py3.10 variables: PYTHON_VERSION: "3.10" + COVERAGE: "false" test_base:py3.11: <<: *test_template_base image: $CI_REGISTRY/bim2sim:dev-py3.11 variables: PYTHON_VERSION: "3.11" + COVERAGE: "true" -combine-coverage: - stage: report - image: - name: registry.git.rwth-aachen.de/ebc/ebc_all/gitlab_ci/templates:python_3.11 - script: - - pip install coverage - - coverage combine coverage-data/ - - ls -la - - ls -la coverage-data/ - - mkdir -p $CI_COMMIT_REF_NAME/coverage - - coverage html -d $CI_COMMIT_REF_NAME/coverage - - coverage-badge -o $CI_COMMIT_REF_NAME/coverage/badge.svg - artifacts: - paths: - - $CI_COMMIT_REF_NAME/coverage - expire_in: 2 hrs - - needs: - - test_base:py3.9 - - test_base:py3.10 - - test_base:py3.11 +#combine-coverage: +# stage: report +# image: +# name: registry.git.rwth-aachen.de/ebc/ebc_all/gitlab_ci/templates:python_3.11 +# script: +# - pip install coverage +# - coverage combine coverage-data/ +# - ls -la +# - ls -la coverage-data/ +# - mkdir -p $CI_COMMIT_REF_NAME/coverage +# - coverage html -d $CI_COMMIT_REF_NAME/coverage +# - coverage-badge -o $CI_COMMIT_REF_NAME/coverage/badge.svg +# artifacts: +# paths: +# - $CI_COMMIT_REF_NAME/coverage +# expire_in: 2 hrs +# +# needs: +# - test_base:py3.9 +# - test_base:py3.10 +# - test_base:py3.11 #test_PluginTEASER_integration:py3.9: # <<: *test_template_plugin_integration From 615513eb6c2ec916216e28151ff7532450de674d Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sun, 20 Oct 2024 10:32:09 +0200 Subject: [PATCH 102/148] try combined report --- .gitlab-ci.yml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c62b29ef49..66a7d54b15 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -269,9 +269,13 @@ build:dev-energyplus:py3.11: - | if [ "$COVERAGE" = "true" ]; then coverage run -m unittest discover ~/bim2sim-coding/test - mkdir -p $CI_COMMIT_REF_NAME/coverage - coverage html -d $CI_COMMIT_REF_NAME/coverage - coverage-badge -o $CI_COMMIT_REF_NAME/coverage/badge.svg + mkdir -p /builds/EBC/EBC_all/github_ci/bim2sim/$CI_COMMIT_REF_NAME/coverage + coverage html -d /builds/EBC/EBC_all/github_ci/bim2sim/$CI_COMMIT_REF_NAME/coverage + coverage-badge -o /builds/EBC/EBC_all/github_ci/bim2sim/$CI_COMMIT_REF_NAME/coverage/badge.svg + ls -la /builds/EBC/EBC_all/github_ci/bim2sim/$CI_COMMIT_REF_NAME/ + ls -la /builds/EBC/EBC_all/github_ci/bim2sim/$CI_COMMIT_REF_NAME/coverage + ls -la $CI_COMMIT_REF_NAME/ + ls -la $CI_COMMIT_REF_NAME/coverage else python -m unittest discover ~/bim2sim-coding/test fi From 1ef66f1af7cb6ab39db0b32abbd41a1db6e0af3d Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sun, 20 Oct 2024 10:35:45 +0200 Subject: [PATCH 103/148] try combined report --- .gitlab-ci.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 66a7d54b15..62701dc02b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -272,10 +272,6 @@ build:dev-energyplus:py3.11: mkdir -p /builds/EBC/EBC_all/github_ci/bim2sim/$CI_COMMIT_REF_NAME/coverage coverage html -d /builds/EBC/EBC_all/github_ci/bim2sim/$CI_COMMIT_REF_NAME/coverage coverage-badge -o /builds/EBC/EBC_all/github_ci/bim2sim/$CI_COMMIT_REF_NAME/coverage/badge.svg - ls -la /builds/EBC/EBC_all/github_ci/bim2sim/$CI_COMMIT_REF_NAME/ - ls -la /builds/EBC/EBC_all/github_ci/bim2sim/$CI_COMMIT_REF_NAME/coverage - ls -la $CI_COMMIT_REF_NAME/ - ls -la $CI_COMMIT_REF_NAME/coverage else python -m unittest discover ~/bim2sim-coding/test fi From 2daed2a2dc0693c98628ca79712892521bec44c2 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sun, 20 Oct 2024 11:10:03 +0200 Subject: [PATCH 104/148] put pipeline together --- .gitlab-ci.yml | 345 +++++++++++++++++++++++-------------------------- 1 file changed, 162 insertions(+), 183 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 62701dc02b..6f67249208 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,13 +1,13 @@ stages: -# - doc -# - code_quality - test_base + - test_integration + - test_regression + - doc + - code_quality - deploy - build-env - - test_regression -# - test_integration -# - build-env-plugins -# - build-tool + - build-env-plugins + - build-tool variables: # TODO variable inside variable seems not be working on our gitlab instance, @@ -23,10 +23,10 @@ variables: include: -# - project: 'EBC/EBC_all/gitlab_ci/templates' -# file: 'python/code-quality/pylint.gitlab-ci.yml' -# - project: 'EBC/EBC_all/gitlab_ci/templates' -# file: 'python/doc/sphinxdoc.gitlab-ci.yml' + - project: 'EBC/EBC_all/gitlab_ci/templates' + file: 'python/code-quality/pylint.gitlab-ci.yml' + - project: 'EBC/EBC_all/gitlab_ci/templates' + file: 'python/doc/sphinxdoc.gitlab-ci.yml' - project: 'EBC/EBC_all/gitlab_ci/templates' file: 'pages/gh-pages.gitlab-ci.yml' # - project: 'EBC/EBC_all/gitlab_ci/templates' @@ -40,8 +40,7 @@ include: - eval "$(micromamba shell hook --shell bash)" - micromamba activate base - pip install -e .[docu] -# - python ./test/resources/dl_test_resources.py --domain=hydraulic --force_new -# - python ./test/resources/dl_test_resources.py --domain=arch --force_new + #.install_local_repository: # script: @@ -210,47 +209,47 @@ build:dev-energyplus:py3.11: - pyproject.toml - .gitlab-ci.yml -# -## Main branch builds -#build:main:py3.9: -# <<: *build_template -# variables: -# PYTHON_VERSION: "3.9" -# TAG: main-py3.9 -# DOCKERFILE: micromamba.Dockerfile -# rules: -# - if: '$CI_COMMIT_REF_NAME == "main"' -# changes: -# - micromamba.Dockerfile -# - pyproject.toml -# - .gitlab-ci.yml -# -#build:main:py3.10: -# <<: *build_template -# variables: -# PYTHON_VERSION: "3.10" -# TAG: main-py3.10 -# DOCKERFILE: micromamba.Dockerfile -# rules: -# - if: '$CI_COMMIT_REF_NAME == "main"' -# changes: -# - micromamba.Dockerfile -# - pyproject.toml -# - .gitlab-ci.yml -# -#build:main:py3.11: -# <<: *build_template -# variables: -# PYTHON_VERSION: "3.11" -# TAG: main-py3.11 -# DOCKERFILE: micromamba.Dockerfile -# rules: -# - if: '$CI_COMMIT_REF_NAME == "main"' -# changes: -# - micromamba.Dockerfile -# - pyproject.toml -# - .gitlab-ci.yml -# + +# Main branch builds +build:main:py3.9: + <<: *build_template + variables: + PYTHON_VERSION: "3.9" + TAG: main-py3.9 + DOCKERFILE: micromamba.Dockerfile + rules: + - if: '$CI_COMMIT_REF_NAME == "main"' + changes: + - micromamba.Dockerfile + - pyproject.toml + - .gitlab-ci.yml + +build:main:py3.10: + <<: *build_template + variables: + PYTHON_VERSION: "3.10" + TAG: main-py3.10 + DOCKERFILE: micromamba.Dockerfile + rules: + - if: '$CI_COMMIT_REF_NAME == "main"' + changes: + - micromamba.Dockerfile + - pyproject.toml + - .gitlab-ci.yml + +build:main:py3.11: + <<: *build_template + variables: + PYTHON_VERSION: "3.11" + TAG: main-py3.11 + DOCKERFILE: micromamba.Dockerfile + rules: + - if: '$CI_COMMIT_REF_NAME == "main"' + changes: + - micromamba.Dockerfile + - pyproject.toml + - .gitlab-ci.yml + # Tests .test_template_base: &test_template_base stage: test_base @@ -281,24 +280,24 @@ build:dev-energyplus:py3.11: - $CI_COMMIT_REF_NAME/coverage expire_in: 2 hrs -# -#.test_template_plugin_integration: &test_template_plugin_integration -# stage: test_integration -# before_script: -# - eval "$(micromamba shell hook --shell bash)" -# - micromamba activate base -# script: -# - mkdir -p ~/bim2sim-coding/ -# - mv ./* ~/bim2sim-coding/ -# - cd ~/bim2sim-coding -# - pip uninstall -y bim2sim -# - pip install -e .[test] -# - pip install -e .[$plugin] -# - export BIM2SIM_LOG_LEVEL=ERROR -# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new -# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new -# - coverage run -m unittest discover ~/bim2sim-coding/bim2sim/plugins/${plugin}/test/integration -# + +.test_template_plugin_integration: &test_template_plugin_integration + stage: test_integration + before_script: + - eval "$(micromamba shell hook --shell bash)" + - micromamba activate base + script: + - mkdir -p ~/bim2sim-coding/ + - mv ./* ~/bim2sim-coding/ + - cd ~/bim2sim-coding + - pip uninstall -y bim2sim + - pip install -e .[test] + - pip install -e .[$plugin] + - export BIM2SIM_LOG_LEVEL=ERROR + - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new + - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new + - coverage run -m unittest discover ~/bim2sim-coding/bim2sim/plugins/${plugin}/test/integration + .test_template_plugin_regression: &test_template_plugin_regression stage: test_regression before_script: @@ -343,7 +342,8 @@ build:dev-energyplus:py3.11: paths: - logs/* - +# All tests are done with the dev image, as the code in fresh installed anyway, so only the micromamba environment and the occ version can change between dev and main +# Unit tests for base test_base:py3.9: <<: *test_template_base image: $CI_REGISTRY/bim2sim:dev-py3.9 @@ -365,119 +365,98 @@ test_base:py3.11: PYTHON_VERSION: "3.11" COVERAGE: "true" -#combine-coverage: -# stage: report -# image: -# name: registry.git.rwth-aachen.de/ebc/ebc_all/gitlab_ci/templates:python_3.11 -# script: -# - pip install coverage -# - coverage combine coverage-data/ -# - ls -la -# - ls -la coverage-data/ -# - mkdir -p $CI_COMMIT_REF_NAME/coverage -# - coverage html -d $CI_COMMIT_REF_NAME/coverage -# - coverage-badge -o $CI_COMMIT_REF_NAME/coverage/badge.svg -# artifacts: -# paths: -# - $CI_COMMIT_REF_NAME/coverage -# expire_in: 2 hrs -# -# needs: -# - test_base:py3.9 -# - test_base:py3.10 -# - test_base:py3.11 - -#test_PluginTEASER_integration:py3.9: -# <<: *test_template_plugin_integration -# image: $CI_REGISTRY/bim2sim:dev-py3.9 -# variables: -# plugin: "PluginTEASER" -# -#test_PluginTEASER_integration:py3.10: -# <<: *test_template_plugin_integration -# image: $CI_REGISTRY/bim2sim:dev-py3.10 -# variables: -# plugin: "PluginTEASER" -# -#test_PluginTEASER_integration:py3.11: -# <<: *test_template_plugin_integration -# image: $CI_REGISTRY/bim2sim:dev-py3.11 -# variables: -# plugin: "PluginTEASER" -# -#test_PluginAixLib_integration:py3.9: -# <<: *test_template_plugin_integration -# image: $CI_REGISTRY/bim2sim:dev-py3.9 -# variables: -# plugin: "PluginAixLib" -# -#test_PluginAixLib_integration:py3.10: -# <<: *test_template_plugin_integration -# image: $CI_REGISTRY/bim2sim:dev-py3.10 -# variables: -# plugin: "PluginAixLib" -# -#test_PluginAixLib_integration:py3.11: -# <<: *test_template_plugin_integration -# image: $CI_REGISTRY/bim2sim:dev-py3.11 -# variables: -# plugin: "PluginAixLib" -# -#test_PluginEnergyPlus_integration:py3.9: -# <<: *test_template_plugin_integration -# image: $CI_REGISTRY/bim2sim:dev-py3.9 -# variables: -# plugin: "PluginEnergyPlus" -# -#test_PluginEnergyPlus_integration:py3.10: -# <<: *test_template_plugin_integration -# image: $CI_REGISTRY/bim2sim:dev-py3.10 -# variables: -# plugin: "PluginEnergyPlus" -# -#test_PluginEnergyPlus_integration:py3.11: -# <<: *test_template_plugin_integration -# image: $CI_REGISTRY/bim2sim:dev-py3.11 -# variables: -# plugin: "PluginEnergyPlus" -# -#test_PluginHKESim_integration:py3.9: -# <<: *test_template_plugin_integration -# image: $CI_REGISTRY/bim2sim:dev-py3.9 -# variables: -# plugin: "PluginHKESim" -# -#test_PluginHKESim_integration:py3.10: -# <<: *test_template_plugin_integration -# image: $CI_REGISTRY/bim2sim:dev-py3.10 -# variables: -# plugin: "PluginHKESim" -# -#test_PluginHKESim_integration:py3.11: -# <<: *test_template_plugin_integration -# image: $CI_REGISTRY/bim2sim:dev-py3.11 -# variables: -# plugin: "PluginHKESim" -# -#test_PluginLCA_integration:py3.9: -# <<: *test_template_plugin_integration -# image: $CI_REGISTRY/bim2sim:dev-py3.9 -# variables: -# plugin: "PluginLCA" -# -#test_PluginLCA_integration:py3.10: -# <<: *test_template_plugin_integration -# image: $CI_REGISTRY/bim2sim:dev-py3.10 -# variables: -# plugin: "PluginLCA" -# -#test_PluginLCA_integration:py3.11: -# <<: *test_template_plugin_integration -# image: $CI_REGISTRY/bim2sim:dev-py3.11 -# variables: -# plugin: "PluginLCA" +# Integration tests +test_PluginTEASER_integration:py3.9: + <<: *test_template_plugin_integration + image: $CI_REGISTRY/bim2sim:dev-py3.9 + variables: + plugin: "PluginTEASER" + +test_PluginTEASER_integration:py3.10: + <<: *test_template_plugin_integration + image: $CI_REGISTRY/bim2sim:dev-py3.10 + variables: + plugin: "PluginTEASER" +test_PluginTEASER_integration:py3.11: + <<: *test_template_plugin_integration + image: $CI_REGISTRY/bim2sim:dev-py3.11 + variables: + plugin: "PluginTEASER" + +test_PluginAixLib_integration:py3.9: + <<: *test_template_plugin_integration + image: $CI_REGISTRY/bim2sim:dev-py3.9 + variables: + plugin: "PluginAixLib" + +test_PluginAixLib_integration:py3.10: + <<: *test_template_plugin_integration + image: $CI_REGISTRY/bim2sim:dev-py3.10 + variables: + plugin: "PluginAixLib" + +test_PluginAixLib_integration:py3.11: + <<: *test_template_plugin_integration + image: $CI_REGISTRY/bim2sim:dev-py3.11 + variables: + plugin: "PluginAixLib" + +test_PluginEnergyPlus_integration:py3.9: + <<: *test_template_plugin_integration + image: $CI_REGISTRY/bim2sim:dev-py3.9 + variables: + plugin: "PluginEnergyPlus" + +test_PluginEnergyPlus_integration:py3.10: + <<: *test_template_plugin_integration + image: $CI_REGISTRY/bim2sim:dev-py3.10 + variables: + plugin: "PluginEnergyPlus" + +test_PluginEnergyPlus_integration:py3.11: + <<: *test_template_plugin_integration + image: $CI_REGISTRY/bim2sim:dev-py3.11 + variables: + plugin: "PluginEnergyPlus" + +test_PluginHKESim_integration:py3.9: + <<: *test_template_plugin_integration + image: $CI_REGISTRY/bim2sim:dev-py3.9 + variables: + plugin: "PluginHKESim" + +test_PluginHKESim_integration:py3.10: + <<: *test_template_plugin_integration + image: $CI_REGISTRY/bim2sim:dev-py3.10 + variables: + plugin: "PluginHKESim" + +test_PluginHKESim_integration:py3.11: + <<: *test_template_plugin_integration + image: $CI_REGISTRY/bim2sim:dev-py3.11 + variables: + plugin: "PluginHKESim" + +test_PluginLCA_integration:py3.9: + <<: *test_template_plugin_integration + image: $CI_REGISTRY/bim2sim:dev-py3.9 + variables: + plugin: "PluginLCA" + +test_PluginLCA_integration:py3.10: + <<: *test_template_plugin_integration + image: $CI_REGISTRY/bim2sim:dev-py3.10 + variables: + plugin: "PluginLCA" + +test_PluginLCA_integration:py3.11: + <<: *test_template_plugin_integration + image: $CI_REGISTRY/bim2sim:dev-py3.11 + variables: + plugin: "PluginLCA" +# Regression tests test_PluginTEASER_regression:py3.9: <<: *test_template_plugin_regression image: $CI_REGISTRY/bim2sim:dev-dymola-py3.9 From 5ca12d7a23ad80b2c8b26f1af268cbf7e1a5fcb5 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sun, 20 Oct 2024 11:10:58 +0200 Subject: [PATCH 105/148] put pipeline together --- .gitlab-ci.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6f67249208..48f5212635 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -5,9 +5,8 @@ stages: - doc - code_quality - deploy - - build-env - - build-env-plugins - - build-tool + - build + variables: # TODO variable inside variable seems not be working on our gitlab instance, @@ -50,7 +49,7 @@ include: .build_template: &build_template image: docker:24.0.5 - stage: build-env + stage: build services: - name: docker:24.0.5-dind variables: @@ -63,7 +62,7 @@ include: .build_template_dymola: &build_template_dymola image: docker:24.0.5 - stage: build-env + stage: build services: - name: docker:24.0.5-dind variables: From d0f147009561ed5e441ad8289618d4189f60df51 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sun, 20 Oct 2024 11:15:29 +0200 Subject: [PATCH 106/148] cleanup pipeline --- .gitlab-ci.yml | 64 +++++++++++++++++++++++++------------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 48f5212635..ebb736ade3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,7 @@ stages: - - test_base - - test_integration - - test_regression + - Test Base + - Test Integration + - Test Regression - doc - code_quality - deploy @@ -251,7 +251,7 @@ build:main:py3.11: # Tests .test_template_base: &test_template_base - stage: test_base + stage: Test Base before_script: - eval "$(micromamba shell hook --shell bash)" - micromamba activate base @@ -281,7 +281,7 @@ build:main:py3.11: .test_template_plugin_integration: &test_template_plugin_integration - stage: test_integration + stage: Test Integration before_script: - eval "$(micromamba shell hook --shell bash)" - micromamba activate base @@ -298,7 +298,7 @@ build:main:py3.11: - coverage run -m unittest discover ~/bim2sim-coding/bim2sim/plugins/${plugin}/test/integration .test_template_plugin_regression: &test_template_plugin_regression - stage: test_regression + stage: Test Regression before_script: - eval "$(micromamba shell hook --shell bash)" - micromamba activate base @@ -343,21 +343,21 @@ build:main:py3.11: # All tests are done with the dev image, as the code in fresh installed anyway, so only the micromamba environment and the occ version can change between dev and main # Unit tests for base -test_base:py3.9: +py3.9: <<: *test_template_base image: $CI_REGISTRY/bim2sim:dev-py3.9 variables: PYTHON_VERSION: "3.9" COVERAGE: "false" -test_base:py3.10: +py3.10: <<: *test_template_base image: $CI_REGISTRY/bim2sim:dev-py3.10 variables: PYTHON_VERSION: "3.10" COVERAGE: "false" -test_base:py3.11: +py3.11: <<: *test_template_base image: $CI_REGISTRY/bim2sim:dev-py3.11 variables: @@ -365,135 +365,135 @@ test_base:py3.11: COVERAGE: "true" # Integration tests -test_PluginTEASER_integration:py3.9: +PluginTEASER_int:py3.9: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.9 variables: plugin: "PluginTEASER" -test_PluginTEASER_integration:py3.10: +PluginTEASER_int:py3.10: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.10 variables: plugin: "PluginTEASER" -test_PluginTEASER_integration:py3.11: +PluginTEASER_int:py3.11: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.11 variables: plugin: "PluginTEASER" -test_PluginAixLib_integration:py3.9: +PluginAixLib_int:py3.9: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.9 variables: plugin: "PluginAixLib" -test_PluginAixLib_integration:py3.10: +PluginAixLib_int:py3.10: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.10 variables: plugin: "PluginAixLib" -test_PluginAixLib_integration:py3.11: +PluginAixLib_int:py3.11: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.11 variables: plugin: "PluginAixLib" -test_PluginEnergyPlus_integration:py3.9: +PluginEnergyPlus_int:py3.9: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.9 variables: plugin: "PluginEnergyPlus" -test_PluginEnergyPlus_integration:py3.10: +PluginEnergyPlus_int:py3.10: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.10 variables: plugin: "PluginEnergyPlus" -test_PluginEnergyPlus_integration:py3.11: +PluginEnergyPlus_int:py3.11: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.11 variables: plugin: "PluginEnergyPlus" -test_PluginHKESim_integration:py3.9: +PluginHKESim_int:py3.9: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.9 variables: plugin: "PluginHKESim" -test_PluginHKESim_integration:py3.10: +PluginHKESim_int:py3.10: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.10 variables: plugin: "PluginHKESim" -test_PluginHKESim_integration:py3.11: +PluginHKESim_int:py3.11: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.11 variables: plugin: "PluginHKESim" -test_PluginLCA_integration:py3.9: +PluginLCA_int:py3.9: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.9 variables: plugin: "PluginLCA" -test_PluginLCA_integration:py3.10: +PluginLCA_int:py3.10: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.10 variables: plugin: "PluginLCA" -test_PluginLCA_integration:py3.11: +PluginLCA_int:py3.11: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.11 variables: plugin: "PluginLCA" # Regression tests -test_PluginTEASER_regression:py3.9: +PluginTEASER_reg:py3.9: <<: *test_template_plugin_regression image: $CI_REGISTRY/bim2sim:dev-dymola-py3.9 variables: plugin: "PluginTEASER" -test_PluginTEASER_regression:py3.10: +PluginTEASER_reg:py3.10: <<: *test_template_plugin_regression image: $CI_REGISTRY/bim2sim:dev-dymola-py3.10 variables: plugin: "PluginTEASER" -test_PluginTEASER_regression:py3.11: +PluginTEASER_reg:py3.11: <<: *test_template_plugin_regression image: $CI_REGISTRY/bim2sim:dev-dymola-py3.11 variables: plugin: "PluginTEASER" -test_PluginEnergyPlus_regression:py3.9: +PluginEnergyPlus_reg:py3.9: <<: *test_template_plugin_regression image: $CI_REGISTRY/bim2sim:dev-energyplus-py3.9 variables: plugin: "PluginEnergyPlus" -test_PluginEnergyPlus_regression:py3.10: +PluginEnergyPlus_reg:py3.10: <<: *test_template_plugin_regression image: $CI_REGISTRY/bim2sim:dev-energyplus-py3.10 variables: plugin: "PluginEnergyPlus" -test_PluginEnergyPlus_regression:py3.11: +PluginEnergyPlus_reg:py3.11: <<: *test_template_plugin_regression image: $CI_REGISTRY/bim2sim:dev-energyplus-py3.11 variables: plugin: "PluginEnergyPlus" # -#test_Base_new: +#Test Base_new: # image: $CI_REGISTRY/base:development # stage: test # before_script: @@ -808,7 +808,7 @@ test_PluginEnergyPlus_regression:py3.11: # changes: # - bim2sim/plugins/PluginAixLib/* # -#test_Base_new: +#Test Base_new: # image: $CI_REGISTRY/base:development # stage: test # before_script: From 977529e839e32d0a3c2042b6cbb094cd49bbbe5a Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sun, 20 Oct 2024 11:22:25 +0200 Subject: [PATCH 107/148] fix image for EP and add favicon --- .gitlab-ci.yml | 6 +++--- docs/source/conf.py | 1 + docs/source/img/static/favicon.ico | Bin 0 -> 15086 bytes 3 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 docs/source/img/static/favicon.ico diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ebb736ade3..18996ceec5 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -403,19 +403,19 @@ PluginAixLib_int:py3.11: PluginEnergyPlus_int:py3.9: <<: *test_template_plugin_integration - image: $CI_REGISTRY/bim2sim:dev-py3.9 + image: $CI_REGISTRY/bim2sim:dev-energyplus-py3.9 variables: plugin: "PluginEnergyPlus" PluginEnergyPlus_int:py3.10: <<: *test_template_plugin_integration - image: $CI_REGISTRY/bim2sim:dev-py3.10 + image: $CI_REGISTRY/bim2sim:dev-energyplus-py3.10 variables: plugin: "PluginEnergyPlus" PluginEnergyPlus_int:py3.11: <<: *test_template_plugin_integration - image: $CI_REGISTRY/bim2sim:dev-py3.11 + image: $CI_REGISTRY/bim2sim:dev-energyplus-py3.11 variables: plugin: "PluginEnergyPlus" diff --git a/docs/source/conf.py b/docs/source/conf.py index 94b9478dbd..cc5fb8f612 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -40,6 +40,7 @@ # so a file named "default.css" will overwrite the builtin "default.css". # html_static_path = ['_static'] html_logo = "img/static/b2s_logo.png" +html_favicon = 'img/static/favicon.ico' html_theme_options = { 'logo_only': True, 'display_version': False, diff --git a/docs/source/img/static/favicon.ico b/docs/source/img/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e1506c1a23cc08736931b9ddb3c0014c395fa484 GIT binary patch literal 15086 zcmeI3X?WH3mB-U(`exqE>ls^dp+#{)?AVT0YwKF7ecDo;s;vr$BKsz*Y!N|`9RUSg z07aA}WZ(AGbWK`F_s5{}66+lN%DWK2Ld`%Rl$Oo%1`tvwY8T z3f(Y_d-QoyAD-jiuz&T# z1^?}P;@|)8Tm5YmWKp}OaL(e)z+{^8^BJI~w4rF-qux@;Za6aAa*&|A;hflcG=$ouhD_x4;% znKazmGq+g&lKXUSxs|T^gB^NfmYvo!d`?#Ev+^~6wAR%1cB&@bj^%E*yhZm|d&U+k zdHG>$&)RA!ldrSt*QZ!($~r54@we8NzR5D5`>z4*V;+_{fYLiL;ILM<41$Q|LfN9-V&?ZIoI_An?QExZ{Z6M zTJehCx!%HG>8gjVZ1tnE-5+XwGpv61LMxNrf7V!NWv@Kq`+;4cALvWP`X?;wxm)$z zfBUzKoKJKlnh!2t`zQON?V#^TN71fs zwusI(C%$aCz3F&w{yi4|Bi~l7y)IbxD@%}ngIDB_tn(J%>pm|U|J;W^Dv1A;WzPPw z`^&EPrcE8;cFjI?Js_xDinCV5zQgI~o-pei-{|TajzYoQf%jIY8 zaGI%8Zctnr<~}KH#?8K#wCOi_97>ru+)}4puXC5V+=+4cE}ntk?76r55j{+sHqzr^ z+T`K>4&qko=;s-29@g%2Fm?YYp!#vhsD0%MQo7 zPhown$!n~5UYieSb9Qn3;j8;X}s0%oTr#@z20%aeN*Wxf3TLMSA2h)-kzql zUu~H)Z?=Z*6D&<@sNV3HWlSG2VE&1R1cB9^R#enoDQE~_wthQNQ~?>Wah@LgclL}6I>apQ;Rc$wQPww$DO=FIttC2P;4`nQX)-$Bv;qm{l# zB`-ZBy!N8Yy77(4Vf`Q3X}^P^|Lo(TH)mOnuoX6NvLeCt1oIS1GXzmlVMpj)0x zikFZ-9_4nNrTr@r&gNX<;$OJ!qOWOFuG2a4QRR`kHZcCLR6e&>{^yr{#;=zBq4-OF zg?%K-_Z=7R%n$pdN?};mQKcBdz9v0ARQqt9`(DQk+Cwly@v{5mi-%d|E2Axa>J0

_{LH(1!ViPue-x|A*D8)HekG2( zLOI^gd~ZE|DPHBwzti=a`b7QC`5q?@DxVGH|4rL3@$|g@-(;t1Grc}iES!_G;7-NW zk(M?0r@kiQRI=7YK2jijL40ZvzQJda7ZdYh#XqT&ly|OvXu$f@m4A3W_hA^ny&J-B z)I^TF|AKV=N@1L*-S4nhnesvSB>WKim!+JLb)f&$CpbsW*pjr$ZQ;mUQ$2oRyX7k% zRQw%c8H0cyF5rJg!2fV-cy~z{e~$AUKG1*m1x!tTj*WsXzzyVBtP5X5zRQtwdBT6J zGi!F}8h9&JwhQjbTX4JE^T7O17yUv0j-SQ zb)M(U92wF<$sGTmI!X9{{i6fM&-jLBI{6}OqDTG}1JND!?(gJ3Rk~HZ{xPduHQH^r{N#$3E@S48 zTrZjuRth^_<8iA!bF1%JL41gR?oCq;hYotqALgk@IKOT0d@EekORawp`3L8GRPwIZ zMZq}mg$|UdHbD)a@6;t4Q6pZ8v3{xfIZV*hiZ*<)>=y!0Z2sLx(v{;5l#|MXg;@^CSH z2hUt${)u^B_Z5!&Hu8T-cn)OG@e<4bpZxcL86xC=!7$K2zkKZyU`}g@K6mQVIj5x= zuE>Ai_>5Lpz4^NT?!`}}PQJnG)8r4-wW*(gZ>ifbUqm04S`oeOH1(_!#(dxF_Ta-* z^)jjHb1%OhqsNY3>idq(P4`8)C^$5;=Sfg6pYUhKQ zf#b^C=%dmbWY&Z{j{5s2)#?4BPYzY4KGvD$63;uJf4V-$=MtKgt1zcSO`mxp-p$`< zTgrVt=A8PV(5LUqd%FUsP#Mi#k#9ir;#DEJ;0h@@sTG zN4=0D?K`^7kvyAuAm(+jm4llncrQ17>h+eXz76ZhUl_`tI%#9;QRs937n*0HCq%wm zvGxh={|MD&SNopRJ3XrN^jVIkZ* z(en4TC(tpieRlhdbYY^x{jb{DeGedI(^f8#B z$eyQOl-|MKV}tmPvKJq?kajQo505^RptYi3q4i%YS;WU=e`lLYL;Jtv;_T1uUoi}w zZcslbUF*ab5sST#EMHDfoVeDkK26B}G}qdT{Wolz5cB#2`mX<)ajIAs@;}W9n#p6X zMzvjLEve1HBQmFl$&4X;aaJ)C|5GUa57n8m#U66CX#0=<3(rEe$-fal-T%qgYX{~OTn>VG8{><|7f z@PDem42J(j2al;Q5S70Ce1 z%n`^xl0LK0_3E#~JM=qJmiw#@_2UzntK1*QV*kNCHPR<$Z|VDeT((y;bfbHuPw$d> zx)bH^JKcbO*@_24Yu0`;HxazI^B6_{g6rr%^SG75RLpO4p1FwjtS#(HVD4=d5n>MZ@q><{!UB#+$T-e9eiS@-{qO$SslSf z%*}MZugkTV&JB=0K8_d=6RnAx9O-nfOkYZ&x}&m+}j+h(0hbtk@7rdYrzninz;bCWK6%Y$LHan{F_-I@G-yD z;I~Z73mw+{H}fU*?g|$6y#8Eac;=OnPlaL|bL;%RBSkode3RKS=DjmC_udo#o@*)= zLJygVEGH~P>=h5Vg7K{xhRap42VZh@j6q>C1w1{r&1?S8RAvI;r{MNZso}e?rfk fj|u22ziEj)-}$`<`kmJT9q;X^=ev7^{+;=M-FiAl literal 0 HcmV?d00001 From 81d6291fc8b8c9dfa9443f27495ba16d10b023aa Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sun, 20 Oct 2024 11:34:07 +0200 Subject: [PATCH 108/148] not only perform integration tests for plugins but also unit tests --- .gitlab-ci.yml | 36 ++++++++++++------------ docs/source/user-guide/PluginTemplate.md | 4 +-- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 18996ceec5..5fb91a2dfd 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,6 @@ stages: - Test Base - - Test Integration + - Test Plugin - Test Regression - doc - code_quality @@ -281,7 +281,7 @@ build:main:py3.11: .test_template_plugin_integration: &test_template_plugin_integration - stage: Test Integration + stage: Test Plugin before_script: - eval "$(micromamba shell hook --shell bash)" - micromamba activate base @@ -295,7 +295,7 @@ build:main:py3.11: - export BIM2SIM_LOG_LEVEL=ERROR - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - - coverage run -m unittest discover ~/bim2sim-coding/bim2sim/plugins/${plugin}/test/integration + - coverage run -m unittest discover ~/bim2sim-coding/bim2sim/plugins/${plugin}/test .test_template_plugin_regression: &test_template_plugin_regression stage: Test Regression @@ -365,91 +365,91 @@ py3.11: COVERAGE: "true" # Integration tests -PluginTEASER_int:py3.9: +PluginTEASER:py3.9: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.9 variables: plugin: "PluginTEASER" -PluginTEASER_int:py3.10: +PluginTEASER:py3.10: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.10 variables: plugin: "PluginTEASER" -PluginTEASER_int:py3.11: +PluginTEASER:py3.11: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.11 variables: plugin: "PluginTEASER" -PluginAixLib_int:py3.9: +PluginAixLib:py3.9: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.9 variables: plugin: "PluginAixLib" -PluginAixLib_int:py3.10: +PluginAixLib:py3.10: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.10 variables: plugin: "PluginAixLib" -PluginAixLib_int:py3.11: +PluginAixLib:py3.11: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.11 variables: plugin: "PluginAixLib" -PluginEnergyPlus_int:py3.9: +PluginEnergyPlus:py3.9: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-energyplus-py3.9 variables: plugin: "PluginEnergyPlus" -PluginEnergyPlus_int:py3.10: +PluginEnergyPlus:py3.10: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-energyplus-py3.10 variables: plugin: "PluginEnergyPlus" -PluginEnergyPlus_int:py3.11: +PluginEnergyPlus:py3.11: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-energyplus-py3.11 variables: plugin: "PluginEnergyPlus" -PluginHKESim_int:py3.9: +PluginHKESim:py3.9: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.9 variables: plugin: "PluginHKESim" -PluginHKESim_int:py3.10: +PluginHKESim:py3.10: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.10 variables: plugin: "PluginHKESim" -PluginHKESim_int:py3.11: +PluginHKESim:py3.11: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.11 variables: plugin: "PluginHKESim" -PluginLCA_int:py3.9: +PluginLCA:py3.9: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.9 variables: plugin: "PluginLCA" -PluginLCA_int:py3.10: +PluginLCA:py3.10: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.10 variables: plugin: "PluginLCA" -PluginLCA_int:py3.11: +PluginLCA:py3.11: <<: *test_template_plugin_integration image: $CI_REGISTRY/bim2sim:dev-py3.11 variables: diff --git a/docs/source/user-guide/PluginTemplate.md b/docs/source/user-guide/PluginTemplate.md index a2b35453a8..cc03a79bba 100644 --- a/docs/source/user-guide/PluginTemplate.md +++ b/docs/source/user-guide/PluginTemplate.md @@ -35,8 +35,8 @@ version of [mamba](https://github.com/mamba-org/mamba)) is used. We will guide you through the process now. ```shell -# create fresh python environment with conda -micromamba create -n bim2sim python=3.10 -c conda-forge +# create fresh python environment with conda (python 3.9 to 3.11 are supported currently) +micromamba create -n bim2sim python=3.11 -c conda-forge # activate your environment micromamba activate bim2sim From 2405d8ce2627bb0cfa0693f7fdf9d9e9b8e08d67 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sun, 20 Oct 2024 11:42:36 +0200 Subject: [PATCH 109/148] update docs --- docs/source/user-guide/PluginTemplate.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/source/user-guide/PluginTemplate.md b/docs/source/user-guide/PluginTemplate.md index cc03a79bba..edb5417dd9 100644 --- a/docs/source/user-guide/PluginTemplate.md +++ b/docs/source/user-guide/PluginTemplate.md @@ -56,11 +56,13 @@ pip install -e '.' ``` Now the base library installation is done. First check is to call the help -method of bim2sim. When an overview of arguments are returned, the bim2sim base -libraray is functional. +method of bim2sim. When the version of bim2sim is returned, the bim2sim base +libraray is functional. You can either run of these commands: ```shell -python -m bim2sim -h +python -m bim2sim -v + +bim2sim -v ``` To use one of the bim2sim plugins, please follow their additional install steps. From ffe31f4939786543de16e4813614dce0ceeeab6c Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sun, 20 Oct 2024 11:48:48 +0200 Subject: [PATCH 110/148] update docs and weather unittest resource path --- .../plugins/PluginEnergyPlus/test/unit/task/test_weather.py | 4 +++- bim2sim/plugins/PluginTEASER/test/unit/task/test_weather.py | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/bim2sim/plugins/PluginEnergyPlus/test/unit/task/test_weather.py b/bim2sim/plugins/PluginEnergyPlus/test/unit/task/test_weather.py index 35cda25041..5fb3cee14e 100644 --- a/bim2sim/plugins/PluginEnergyPlus/test/unit/task/test_weather.py +++ b/bim2sim/plugins/PluginEnergyPlus/test/unit/task/test_weather.py @@ -22,7 +22,9 @@ class PluginWeatherDummyEP(Plugin): ] -test_rsrc_path = Path(__file__).parent.parent.parent.parent / 'resources' +test_rsrc_path = (Path( + __file__).parent.parent.parent.parent.parent.parent.parent + / 'test/resources') class TestWeather(unittest.TestCase): diff --git a/bim2sim/plugins/PluginTEASER/test/unit/task/test_weather.py b/bim2sim/plugins/PluginTEASER/test/unit/task/test_weather.py index 403dff38c3..e418f4130e 100644 --- a/bim2sim/plugins/PluginTEASER/test/unit/task/test_weather.py +++ b/bim2sim/plugins/PluginTEASER/test/unit/task/test_weather.py @@ -22,7 +22,9 @@ class PluginWeatherDummyTEASER(Plugin): ] -test_rsrc_path = Path(__file__).parent.parent.parent.parent / 'resources' +test_rsrc_path = (Path( + __file__).parent.parent.parent.parent.parent.parent.parent + / 'test/resources') class TestWeather(unittest.TestCase): From 79f783166476175f6fb300caee75e96a4a781c9a Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sun, 20 Oct 2024 12:08:12 +0200 Subject: [PATCH 111/148] adjust syntax for plugin testing --- .gitlab-ci.yml | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5fb91a2dfd..8698716b6c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -295,8 +295,16 @@ build:main:py3.11: - export BIM2SIM_LOG_LEVEL=ERROR - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new - - coverage run -m unittest discover ~/bim2sim-coding/bim2sim/plugins/${plugin}/test - + # run coverage for unit and integration tests if they exist + - | + plugin_test_dir=~/bim2sim-coding/bim2sim/plugins/${plugin}/test + if [ -d "${plugin_test_dir}/unit" ] || [ -d "${plugin_test_dir}/integration" ]; then + test_dirs=$(find ${plugin_test_dir} -maxdepth 1 -type d \( -name "unit" -o -name "integration" \) | tr '\n' ' ') + coverage run --source=~/bim2sim-coding/bim2sim/plugins/${plugin} -m unittest discover -v ${test_dirs} + else + echo "No unit or integration test directories found." + exit 1 + fi .test_template_plugin_regression: &test_template_plugin_regression stage: Test Regression before_script: From 69101b70dadefb08387c3445801747e0cb2e1c04 Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sun, 20 Oct 2024 12:45:14 +0200 Subject: [PATCH 112/148] update pyproject.toml and delete requirements.txt files --- bim2sim/plugins/PluginAixLib/requirements.txt | 2 -- bim2sim/plugins/PluginCFD/requirements.txt | 2 -- bim2sim/plugins/PluginComfort/requirements.txt | 7 ------- .../plugins/PluginEnergyPlus/requirements.txt | 7 ------- bim2sim/plugins/PluginHKESim/requirements.txt | 1 - bim2sim/plugins/PluginTEASER/requirements.txt | 11 ----------- docs/requirements.txt | 7 ------- pyproject.toml | 17 +++++++++++++++-- requirements.txt | 18 ------------------ 9 files changed, 15 insertions(+), 57 deletions(-) delete mode 100644 bim2sim/plugins/PluginAixLib/requirements.txt delete mode 100644 bim2sim/plugins/PluginCFD/requirements.txt delete mode 100644 bim2sim/plugins/PluginComfort/requirements.txt delete mode 100644 bim2sim/plugins/PluginEnergyPlus/requirements.txt delete mode 100644 bim2sim/plugins/PluginHKESim/requirements.txt delete mode 100644 bim2sim/plugins/PluginTEASER/requirements.txt delete mode 100644 docs/requirements.txt delete mode 100644 requirements.txt diff --git a/bim2sim/plugins/PluginAixLib/requirements.txt b/bim2sim/plugins/PluginAixLib/requirements.txt deleted file mode 100644 index b76ddfa43e..0000000000 --- a/bim2sim/plugins/PluginAixLib/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -# bim2sim add after release of bim2sim on pypi -git+https://github.com/squidKid-deluxe/pyvis.git@fix-show diff --git a/bim2sim/plugins/PluginCFD/requirements.txt b/bim2sim/plugins/PluginCFD/requirements.txt deleted file mode 100644 index 492d2520e6..0000000000 --- a/bim2sim/plugins/PluginCFD/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -python>=3.6 -bim2sim diff --git a/bim2sim/plugins/PluginComfort/requirements.txt b/bim2sim/plugins/PluginComfort/requirements.txt deleted file mode 100644 index 674ca0f83d..0000000000 --- a/bim2sim/plugins/PluginComfort/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -git+https://github.com/BIM2SIM/eppy -git+https://github.com/BIM2SIM/geomeppy@fix_dependencies -pyqt5 -shapely -numpy-stl -energyplus-regressions - diff --git a/bim2sim/plugins/PluginEnergyPlus/requirements.txt b/bim2sim/plugins/PluginEnergyPlus/requirements.txt deleted file mode 100644 index eac8ad769b..0000000000 --- a/bim2sim/plugins/PluginEnergyPlus/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -git+https://github.com/BIM2SIM/eppy -git+https://github.com/BIM2SIM/geomeppy@fix_dependencies -shapely -numpy-stl -energyplus-regressions -reportlab -svglib diff --git a/bim2sim/plugins/PluginHKESim/requirements.txt b/bim2sim/plugins/PluginHKESim/requirements.txt deleted file mode 100644 index 90ba251271..0000000000 --- a/bim2sim/plugins/PluginHKESim/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -git+https://github.com/squidKid-deluxe/pyvis.git@fix-show diff --git a/bim2sim/plugins/PluginTEASER/requirements.txt b/bim2sim/plugins/PluginTEASER/requirements.txt deleted file mode 100644 index c65c52481d..0000000000 --- a/bim2sim/plugins/PluginTEASER/requirements.txt +++ /dev/null @@ -1,11 +0,0 @@ -# bim2sim add after release of bim2sim on pypi -pyqt5 -pillow -RWTHColors -scienceplots -#git+https://github.com/RWTH-EBC/TEASER@issue694_simulationPostProcessing -git+https://github.com/RWTH-EBC/TEASER@development#egg=TEASER[report] -git+https://github.com/DaJansenGit/BuildingsPy.git -ebcpy -reportlab -svglib diff --git a/docs/requirements.txt b/docs/requirements.txt deleted file mode 100644 index f9154399fe..0000000000 --- a/docs/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -sphinx<=8.0.2 -sphinx-rtd-theme -livereload -myst-parser -sphinx-autodoc-typehints<=1.20.1 -anybadge -sphinxcontrib-mermaid diff --git a/pyproject.toml b/pyproject.toml index 521aa3dbba..dea4005776 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,7 +48,7 @@ dependencies = [ "rwthcolors==0.2.4", "SciencePlots==2.1.0", "pillow==10.1.0", - "gitpython==3.1.40", + "Gitpython==3.1.40", "svglib==1.5.1", "reportlab==4.2.2", "scipy==1.11.3", # is a dependency from networkx, should installed automatically @@ -74,6 +74,8 @@ PluginTEASER = [ "RWTHColors", "scienceplots", "ebcpy", + "reportlab", + "svglib", "TEASER[report] @ git+https://github.com/RWTH-EBC/TEASER@development", "BuildingsPy@git+https://github.com/DaJansenGit/BuildingsPy.git", ] @@ -82,8 +84,10 @@ PluginEnergyPlus = [ "numpy-stl", "energyplus-regressions", "eppy@git+https://github.com/BIM2SIM/eppy", - "geomeppy@git+https://github.com/BIM2SIM/geomeppy@fix_dependencies#egg=geomeppy", + "geomeppy@git+https://github.com/BIM2SIM/geomeppy@fix_dependencies", "OCCUtils@git+https://github.com/tpaviot/pythonocc-utils", # from base requiremts.txt + "reportlab", + "svglib", ] PluginAixLib = [ "pyvis@git+https://github.com/squidKid-deluxe/pyvis@fix-show#egg=pyvis", @@ -95,6 +99,14 @@ PluginHKESim = [ ] PluginLCA = [ # prepared to add dependencies, same installtion routine like other plugins ] +PluginComfort = [ + "pyqt5", + "shapely", + "numpy-stl", + "energyplus-regressions", + "eppy@git+https://github.com/BIM2SIM/eppy", + "geomeppy@git+https://github.com/BIM2SIM/geomeppy@fix_dependencies", +] docu = [ "sphinx==6.2.1", "myst-parser", @@ -106,6 +118,7 @@ docu = [ # "sphinx_autodoc_typehints", "sphinxcontrib-mermaid", "pylint", + "livereload", ] test = [ "coverage", # [toml] not needed using micromanba, maybe also new python version diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 2cefe6d109..0000000000 --- a/requirements.txt +++ /dev/null @@ -1,18 +0,0 @@ -ifcopenshell==0.7.0.240627 -docopt==0.6.2 -numpy==1.26.0 -pandas==2.1.3 -matplotlib==3.9.0 -networkx==3.3 -python-dateutil==2.8.2 -mako==1.3.0 -pint==0.22 -deep-translator==1.11.4 -pint-pandas==0.5 -git+https://github.com/squidKid-deluxe/pyvis.git@fix-show -git+https://github.com/tpaviot/pythonocc-utils -rwthcolors==0.2.4 -SciencePlots==2.1.0 -pillow==10.1.0 -scipy==1.11.3 -GitPython==3.1.40 From f0d86322fb457136734f668240586f0af2ce63ef Mon Sep 17 00:00:00 2001 From: David Paul Jansen Date: Sun, 20 Oct 2024 12:59:50 +0200 Subject: [PATCH 113/148] remove CFD plugin as its not maintained anymore and OpenFoam plugin is coming --- .gitlab-ci.yml | 503 ------------------ Base.Dockerfile | 90 ---- Dockerfile | 13 - README.md | 3 +- bim2sim/__init__.py | 15 - bim2sim/plugins/PluginCFD/__init__.py | 0 .../plugins/PluginCFD/bim2sim_cfd/__init__.py | 16 - .../PluginCFD/bim2sim_cfd/ifc2sb/IFC2SB | Bin 4360376 -> 0 bytes .../PluginCFD/bim2sim_cfd/task/__init__.py | 0 .../PluginCFD/bim2sim_cfd/task/ifc2cfd.py | 79 --- bim2sim/plugins/PluginCFD/cfd.Dockerfile | 13 - bim2sim/plugins/PluginCFD/envCFD.Dockerfile | 67 --- bim2sim/plugins/PluginCFD/test/__init__.py | 0 .../PluginCFD/test/integration/__init__.py | 0 .../PluginCFD/test/integration/test_cfd.py | 34 -- .../PluginCFD/test/integration/test_useage.py | 18 - .../plugins/PluginEnergyPlus/envEP.Dockerfile | 49 -- .../PluginTEASER/envTEASER-dymola.Dockerfile | 8 - .../plugins/PluginTEASER/envTEASER.Dockerfile | 7 - .../plugins/PluginTEASER/teaser.Dockerfile | 5 - .../developer-guide/docker-structure.md | 2 + docs/source/user-guide.md | 1 - docs/source/user-guide/PluginCFD.md | 36 -- docs/source/user-guide/PluginTemplate.md | 2 +- envBaseDymola.Dockerfile | 73 --- new.Dockerfile | 49 -- total.Dockerfile | 31 -- 27 files changed, 4 insertions(+), 1110 deletions(-) delete mode 100644 Base.Dockerfile delete mode 100644 Dockerfile delete mode 100644 bim2sim/plugins/PluginCFD/__init__.py delete mode 100644 bim2sim/plugins/PluginCFD/bim2sim_cfd/__init__.py delete mode 100644 bim2sim/plugins/PluginCFD/bim2sim_cfd/ifc2sb/IFC2SB delete mode 100644 bim2sim/plugins/PluginCFD/bim2sim_cfd/task/__init__.py delete mode 100644 bim2sim/plugins/PluginCFD/bim2sim_cfd/task/ifc2cfd.py delete mode 100644 bim2sim/plugins/PluginCFD/cfd.Dockerfile delete mode 100644 bim2sim/plugins/PluginCFD/envCFD.Dockerfile delete mode 100644 bim2sim/plugins/PluginCFD/test/__init__.py delete mode 100644 bim2sim/plugins/PluginCFD/test/integration/__init__.py delete mode 100644 bim2sim/plugins/PluginCFD/test/integration/test_cfd.py delete mode 100644 bim2sim/plugins/PluginCFD/test/integration/test_useage.py delete mode 100644 bim2sim/plugins/PluginEnergyPlus/envEP.Dockerfile delete mode 100644 bim2sim/plugins/PluginTEASER/envTEASER-dymola.Dockerfile delete mode 100644 bim2sim/plugins/PluginTEASER/envTEASER.Dockerfile delete mode 100644 bim2sim/plugins/PluginTEASER/teaser.Dockerfile delete mode 100644 docs/source/user-guide/PluginCFD.md delete mode 100644 envBaseDymola.Dockerfile delete mode 100644 new.Dockerfile delete mode 100644 total.Dockerfile diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8698716b6c..116915dfed 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -499,506 +499,3 @@ PluginEnergyPlus_reg:py3.11: image: $CI_REGISTRY/bim2sim:dev-energyplus-py3.11 variables: plugin: "PluginEnergyPlus" - -# -#Test Base_new: -# image: $CI_REGISTRY/base:development -# stage: test -# before_script: -# - eval "$(micromamba shell hook --shell bash)" -# - micromamba activate base -# script: -# - mkdir -p ~/bim2sim-coding/ -# - mv ./* ~/bim2sim-coding/ -# - cd ~/bim2sim-coding -# - pip uninstall -y bim2sim -# - pip install -e .[test] -# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new -# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new -# - coverage run -m unittest discover ~/bim2sim-coding/test -# - coverage report -i - -#build:development: -# image: docker:24.0.5 -# stage: build-env -# services: -# - name: docker:24.0.5-dind -# variables: -# HEALTHCHECK_TCP_PORT: "2376" -# before_script: -# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN -# script: -# - docker build -t $CI_REGISTRY/bim2sim: -f micromamba.Dockerfile . -# - docker push $CI_REGISTRY/bim2sim: -# rules: -# - if: '$CI_COMMIT_REF_NAME == "development"' -# changes: -# - envBase.Dockerfile -# - pyproject.toml -# - .gitlab-ci.yml - -#build_new:development: -# image: docker:24.0.5 -# stage: build-env -# services: -# - name: docker:24.0.5-dind -# variables: -# HEALTHCHECK_TCP_PORT: "2376" -# before_script: -# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN -# script: -# - docker build -t $CI_REGISTRY/new:development -f new.Dockerfile . -# - docker push $CI_REGISTRY/new:development -# rules: -# - if: '$CI_COMMIT_REF_NAME == "development"' -# changes: -# - envBase.Dockerfile -# - requirements.txt -# - .gitlab-ci.yml -# -#build_env:main: -# image: docker:24.0.5 -# stage: build-env -# services: -# - name: docker:24.0.5-dind -# variables: -# HEALTHCHECK_TCP_PORT: "2376" -# before_script: -# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN -# script: -# - docker build -t $CI_REGISTRY/environment:main -f envBase.Dockerfile . -# - docker push $CI_REGISTRY/environment:main -# rules: -# - if: '$CI_COMMIT_REF_NAME == "main"' -# changes: -# - envBase.Dockerfile -# - requirements.txt -# -#build_env:development: -# image: docker:24.0.5 -# stage: build-env -# services: -# - name: docker:24.0.5-dind -# variables: -# HEALTHCHECK_TCP_PORT: "2376" -# before_script: -# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN -# script: -# - docker build -t $CI_REGISTRY/environment:development -f envBase.Dockerfile . -# - docker push $CI_REGISTRY/environment:development -# rules: -# - if: '$CI_COMMIT_REF_NAME == "development"' -# changes: -# - envBase.Dockerfile -# - requirements.txt -# - .gitlab-ci.yml -# -#build_env:dymola: -# image: docker:24.0.5 -# stage: build-env -# services: -# - name: docker:24.0.5-dind -# variables: -# HEALTHCHECK_TCP_PORT: "2376" -# before_script: -# - docker login -u $CI_DEPLOY_TOKEN_USERNAME_DYMOLA -p $CI_DEPLOY_TOKEN_PASSWORD_DYMOLA $CI_REGISTRY_LOGIN_DYMOLA # login dymola docker reg -# script: -# - docker build -t $CI_REGISTRY/environment:dymola -f envBaseDymola.Dockerfile . -# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN # login bim2sim reg -# - docker push $CI_REGISTRY/environment:dymola -# rules: -# - if: '$CI_COMMIT_REF_NAME == "development"' -# changes: -# - envBaseDymola.Dockerfile -# - requirements.txt -# - .gitlab-ci.yml -# -# -#build_env:energyplus: -# image: docker:24.0.5 -# stage: build-env-plugins -# services: -# - name: docker:24.0.5-dind -# variables: -# HEALTHCHECK_TCP_PORT: "2376" -# before_script: -# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN -# script: -# - docker build -t $CI_REGISTRY/environment:energyplus -f bim2sim/plugins/PluginEnergyPlus/envEP.Dockerfile . -# - docker push $CI_REGISTRY/environment:energyplus -# rules: -# - if: '$CI_COMMIT_REF_NAME == "development"' -# changes: -# - envBase.Dockerfile -# - bim2sim/plugins/PluginEnergyPlus/envEP.Dockerfile -# - bim2sim/plugins/PluginEnergyPlus/requirements.txt -# - requirements.txt -# - .gitlab-ci.yml -# -# -#build_env:cfd: -# image: docker:24.0.5 -# stage: build-env-plugins -# services: -# - name: docker:24.0.5-dind -# variables: -# HEALTHCHECK_TCP_PORT: "2376" -# before_script: -# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN -# script: -# - docker build -t $CI_REGISTRY/environment:cfd -f bim2sim/plugins/PluginCFD/envCFD.Dockerfile . -# - docker push $CI_REGISTRY/environment:cfd -# timeout: 6 hours -# rules: -# - if: '$CI_COMMIT_REF_NAME == "development"' -# changes: -# - envBase.Dockerfile -# - bim2sim/plugins/PluginCFD/envCFD.Dockerfile -# - requirements.txt -# - .gitlab-ci.yml -# -#build_env:teaser: -# image: docker:24.0.5 -# stage: build-env-plugins -# services: -# - name: docker:24.0.5-dind -# variables: -# HEALTHCHECK_TCP_PORT: "2376" -# before_script: -# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN -# script: -# - docker build -t $CI_REGISTRY/environment:teaser -f bim2sim/plugins/PluginTEASER/envTEASER.Dockerfile . -# - docker push $CI_REGISTRY/environment:teaser -# rules: -# - if: '$CI_COMMIT_REF_NAME == "development"' -# changes: -# - envBase.Dockerfile -# - bim2sim/plugins/PluginTEASER/requirements.txt -# - bim2sim/plugins/PluginTEASER/envTEASER.Dockerfile -# - requirements.txt -# - .gitlab-ci.yml -# -#build_env:teaser-dymola: -# image: docker:24.0.5 -# stage: build-env-plugins -# services: -# - name: docker:24.0.5-dind -# variables: -# HEALTHCHECK_TCP_PORT: "2376" -# before_script: -# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN -# script: -# - docker build -t $CI_REGISTRY/environment:teaser-dymola -f bim2sim/plugins/PluginTEASER/envTEASER-dymola.Dockerfile . -# - docker push $CI_REGISTRY/environment:teaser-dymola -# rules: -# - if: '$CI_COMMIT_REF_NAME == "development"' -# changes: -# - envBase.Dockerfile -# - bim2sim/plugins/PluginTEASER/requirements.txt -# - bim2sim/plugins/PluginTEASER/envTEASER.Dockerfile -# - requirements.txt -# - .gitlab-ci.yml -# -#build_env:aixlib: -# image: docker:24.0.5 -# stage: build-env-plugins -# services: -# - name: docker:24.0.5-dind -# variables: -# HEALTHCHECK_TCP_PORT: "2376" -# before_script: -# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN -# script: -# - docker build -t $CI_REGISTRY/environment:aixlib -f bim2sim/plugins/PluginAixLib/envAixLib.Dockerfile . -# - docker push $CI_REGISTRY/environment:aixlib -# rules: -# - if: '$CI_COMMIT_REF_NAME == "development"' -# changes: -# - envBase.Dockerfile -# - bim2sim/plugins/PluginAixLib/requirements.txt -# - bim2sim/plugins/PluginAixLib/envAixLib.Dockerfile -# - requirements.txt -# - .gitlab-ci.yml -# -#build_tool:release: -# image: docker:24.0.5 -# stage: build-tool -# services: -# - name: docker:24.0.5-dind -# variables: -# HEALTHCHECK_TCP_PORT: "2376" -# before_script: -# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN -# script: -# - docker build -t $CI_REGISTRY/tool:latest . -# - docker push $CI_REGISTRY/tool:latest -# rules: -# - if: '$CI_COMMIT_REF_NAME == "main"' -# -#build_tool:development: -# image: docker:24.0.5 -# stage: build-tool -# services: -# - name: docker:24.0.5-dind -# variables: -# HEALTHCHECK_TCP_PORT: "2376" -# before_script: -# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN -# script: -# - docker build -t $CI_REGISTRY/tool:development . -# - docker push $CI_REGISTRY/tool:development -# rules: -# - if: '$CI_COMMIT_REF_NAME == "development"' -# -#build_tool:webdevelop: -# image: docker:24.0.5 -# stage: build-tool -# services: -# - name: docker:24.0.5-dind -# variables: -# HEALTHCHECK_TCP_PORT: "2376" -# before_script: -# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN -# script: -# - docker build -t $CI_REGISTRY/tool:web_develop -f total.Dockerfile . -# - docker push $CI_REGISTRY/tool:web_develop -# rules: -# - if: '$CI_COMMIT_REF_NAME == "development"' -# -#build_tool:cfd: -# image: docker:24.0.5 -# stage: build-tool -# services: -# - name: docker:24.0.5-dind -# variables: -# HEALTHCHECK_TCP_PORT: "2376" -# before_script: -# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN -# script: -# - docker build -t $CI_REGISTRY/tool:cfd -f bim2sim/plugins/PluginCFD/cfd.Dockerfile . -# - docker push $CI_REGISTRY/tool:cfd -# rules: -# - if: '$CI_COMMIT_REF_NAME == "development"' -# changes: -# - bim2sim/plugins/PluginCFD/* -# -#build_tool:teaser: -# image: docker:24.0.5 -# stage: build-tool -# services: -# - name: docker:24.0.5-dind -# variables: -# HEALTHCHECK_TCP_PORT: "2376" -# before_script: -# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN -# script: -# - docker build -t $CI_REGISTRY/tool:teaser -f bim2sim/plugins/PluginTEASER/teaser.Dockerfile . -# - docker push $CI_REGISTRY/tool:teaser -# rules: -# - if: '$CI_COMMIT_REF_NAME == "development"' -# changes: -# - bim2sim/plugins/PluginTEASER/* -# -#build_tool:aixlib: -# image: docker:24.0.5 -# stage: build-tool -# services: -# - name: docker:24.0.5-dind -# variables: -# HEALTHCHECK_TCP_PORT: "2376" -# before_script: -# - docker login -u $CI_DEPLOY_TOKEN_USERNAME -p $CI_DEPLOY_TOKEN_PASSWORD $CI_REGISTRY_LOGIN -# script: -# - docker build -t $CI_REGISTRY/tool:aixlib -f bim2sim/plugins/PluginAixLib/aixlib.Dockerfile . -# - docker push $CI_REGISTRY/tool:aixlib -# rules: -# - if: '$CI_COMMIT_REF_NAME == "development"' -# changes: -# - bim2sim/plugins/PluginAixLib/* -# -#Test Base_new: -# image: $CI_REGISTRY/base:development -# stage: test -# before_script: -# - eval "$(micromamba shell hook --shell bash)" -# - micromamba activate base -# script: -# - mkdir -p ~/bim2sim-coding/ -# - mv ./* ~/bim2sim-coding/ -# - cd ~/bim2sim-coding -# - pip uninstall -y bim2sim -# - pip install -e .[test] -# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new -# - python ~/bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new -# - coverage run -m unittest discover ~/bim2sim-coding/test -# - coverage report -i -### -#test_EP: -# image: $CI_REGISTRY/environment:energyplus -# stage: test -# before_script: -# - pip install coverage -# - pip install coverage-badge -# # reinstall requirements to test current branch status -# - pip install -r bim2sim/plugins/PluginEnergyPlus/requirements.txt -# script: -# - mv ./* /bim2sim-coding/ -# - cd /bim2sim-coding -# - cat /bim2sim-coding/bim2sim/plugins/PluginEnergyPlus/data/Minimal.idf -# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new -# - coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginEnergyPlus/test/integration -# - coverage report -i -# -#test_EP_regression: -# image: $CI_REGISTRY/environment:energyplus -# stage: test -# before_script: -# - pip install coverage -# - pip install coverage-badge -# # reinstall requirements to test current branch status -# - pip install -r bim2sim/plugins/PluginEnergyPlus/requirements.txt -# script: -# - mv ./* /bim2sim-coding/ -# - cd /bim2sim-coding -# - cat /bim2sim-coding/bim2sim/plugins/PluginEnergyPlus/data/Minimal.idf -# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new --with_regression -# - coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginEnergyPlus/test/regression -# - coverage report -i -# -#test_Comfort: -# # EnergyPlus environment is currently used for comfort test, same requirements -# image: $CI_REGISTRY/environment:energyplus -# stage: test -# before_script: -# - pip install coverage -# - pip install coverage-badge -# # reinstall requirements to test current branch status -# - pip install -r bim2sim/plugins/PluginEnergyPlus/requirements.txt -# script: -# - mv ./* /bim2sim-coding/ -# - cd /bim2sim-coding -# - cat /bim2sim-coding/bim2sim/plugins/PluginEnergyPlus/data/Minimal.idf -# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new -# - coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginComfort/test/integration -# - coverage report -i -# -#test_Comfort_regression: -# # EnergyPlus environment is currently used for comfort test, same requirements -# image: $CI_REGISTRY/environment:energyplus -# stage: test -# before_script: -# - pip install coverage -# - pip install coverage-badge -# # reinstall requirements to test current branch status -# - pip install -r bim2sim/plugins/PluginEnergyPlus/requirements.txt -# script: -# - mv ./* /bim2sim-coding/ -# - cd /bim2sim-coding -# - cat /bim2sim-coding/bim2sim/plugins/PluginEnergyPlus/data/Minimal.idf -# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new --with_regression -# - coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginComfort/test/regression -# - coverage report -i -# -# -#test_TEASER: -# image: $CI_REGISTRY/environment:teaser -# stage: test -# before_script: -# - pip install coverage -# - pip install coverage-badge -# # reinstall requirements to test current branch status -# - pip install -r bim2sim/plugins/PluginTEASER/requirements.txt -# # TODO temp workaround as CI does not seem to take current image -# - pip install scipy==1.11.3 -# script: -# - mv ./* /bim2sim-coding/ -# - cd /bim2sim-coding -# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new -# - coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginTEASER/test/integration -# - coverage report -i -# -#test_TEASER_regression: -# image: $CI_REGISTRY/environment:teaser-dymola -# stage: test -# before_script: -# - pip install coverage -# - pip install coverage-badge -# # reinstall requirements to test current branch status -# - pip install -r requirements.txt -# - pip install -r bim2sim/plugins/PluginTEASER/requirements.txt -# # TODO temp workaround as CI does not seem to take current image -# - pip install scipy==1.11.3 -# script: -# - mv ./* /bim2sim-coding/ -# - cd /bim2sim-coding -# - python /bim2sim-coding/bim2sim/plugins/PluginTEASER/test/regression/prepare_regression_tests.py -# - xvfb-run -n 77 coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginTEASER/test/regression -# - coverage report -i -# - mkdir /builds/EBC/EBC_all/github_ci/bim2sim/logs/ -# - cp *.log /builds/EBC/EBC_all/github_ci/bim2sim/logs/ -# - ls -la /builds/EBC/EBC_all/github_ci/bim2sim -# - ls -la /builds/EBC/EBC_all/github_ci/bim2sim/logs -# artifacts: -# paths: -## - logs/* -## - logs/failed-simulator-dymola.log -# - /builds/EBC/EBC_all/github_ci/bim2sim/logs/* -## - bim2sim-coding/simulator-dymola.log -## - bim2sim-coding/comparison-dymola.log -## - bim2sim-coding/unitTests-dymola.log -# -#test_CFD: -# image: $CI_REGISTRY/environment:cfd -# stage: test -# before_script: -# - pip install coverage -# - pip install coverage-badge -# script: -# - mv ./* /bim2sim-coding/ -# - cd /bim2sim-coding -# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new -# - coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginCFD/test/integration -# - coverage report -i -# -#test_AixLib: -# image: $CI_REGISTRY/environment:aixlib -# stage: test -# before_script: -# - pip install coverage -# - pip install coverage-badge -# # reinstall requirements to test current branch status -# - pip install -r bim2sim/plugins/PluginAixLib/requirements.txt -# script: -# - mv ./* /bim2sim-coding/ -# - cd /bim2sim-coding -# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new -# - coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginAixLib/test/integration -# - coverage report -i -# -#test_HKESim: -# image: $CI_REGISTRY/environment:aixlib -# stage: test -# before_script: -# - pip install coverage -# - pip install coverage-badge -# # reinstall requirements to test current branch status -# - pip install -r bim2sim/plugins/PluginHKESim/requirements.txt -# script: -# - mv ./* /bim2sim-coding/ -# - cd /bim2sim-coding -# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=hydraulic --force_new -# - coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginHKESim/test/integration -# - coverage report -i -# -#test_LCA: -# image: $CI_REGISTRY/environment:development -# stage: test -# before_script: -# - pip install coverage -# - pip install coverage-badge -# script: -# - mv ./* /bim2sim-coding/ -# - cd /bim2sim-coding -# - python /bim2sim-coding/test/resources/dl_test_resources.py --domain=arch --force_new -# - coverage run -m unittest discover /bim2sim-coding/bim2sim/plugins/PluginLCA/test/integration -# - coverage report -i diff --git a/Base.Dockerfile b/Base.Dockerfile deleted file mode 100644 index bd08478e12..0000000000 --- a/Base.Dockerfile +++ /dev/null @@ -1,90 +0,0 @@ -######################################################## -# OS -FROM ubuntu:20.04 - -# $ docker build . -t continuumio/miniconda3:latest -t continuumio/miniconda3:4.5.11 -# $ docker run --rm -it continuumio/miniconda3:latest /bin/bash -# $ docker push continuumio/miniconda3:latest -# $ docker push continuumio/miniconda3:4.5.11 - -ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 -ENV PATH="/root/miniconda3/bin:${PATH}" -ARG PATH="/root/miniconda3/bin:${PATH}" - -RUN apt-get update --fix-missing && \ - apt-get install -y wget bzip2 ca-certificates curl git && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* - -# Install Miniconda on x86 or ARM platforms -RUN arch=$(uname -m) && \ - if [ "$arch" = "x86_64" ]; then \ - MINICONDA_URL="https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh"; \ - elif [ "$arch" = "aarch64" ]; then \ - MINICONDA_URL="https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh"; \ - else \ - echo "Unsupported architecture: $arch"; \ - exit 1; \ - fi && \ - wget $MINICONDA_URL -O miniconda.sh && \ - mkdir -p /root/.conda && \ - bash miniconda.sh -b -p /root/miniconda3 && \ - rm -f miniconda.sh - -RUN conda --version - -ENV TINI_VERSION v0.16.1 -ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /usr/bin/tini -RUN chmod +x /usr/bin/tini - -ENTRYPOINT [ "/usr/bin/tini", "--" ] -CMD [ "/bin/bash" ] -######################################################## - - -######################################################## -WORKDIR /bim2sim-coding - -RUN apt-get --allow-releaseinfo-change update -RUN apt-get -y install unzip -RUN apt-get -y install libgl-dev -RUN apt-get -y install gcc -RUN apt-get -y install g++ - -# Copy files -COPY . . - -# Turn off SSL as it leads to errors in current runner systems -RUN conda config --set ssl_verify False - -RUN conda create -n env python=3.11 -RUN conda update -n base -c defaults conda -RUN echo "source activate env" > ~/.bashrc -ENV PATH /opt/conda/envs/env/bin:$PATH -SHELL ["conda", "run", "-n", "env", "/bin/bash", "-c"] - -# install needed packages -## install pythonocc via conda -RUN conda install --yes --freeze-installed \ - -c conda-forge pythonocc-core=7.7.0 \ - nomkl \ - && conda clean -afy \ - && find /opt/conda/ -follow -type f -name '*.a' -delete \ - && find /opt/conda/ -follow -type f -name '*.pyc' -delete \ - && find /opt/conda/ -follow -type f -name '*.js.map' -delete - - -RUN pip install --no-cache-dir -e '.' - - - -# Set Pythonpath -#ENV PYTHONPATH "${PYTHONPATH}:/bim2sim-coding/bim2sim" -#ENV PYTHONPATH "${PYTHONPATH}:/bim2sim-coding/bim2sim/plugins/PluginEnergyPlus" -#ENV PYTHONPATH "${PYTHONPATH}:/bim2sim-coding/bim2sim/plugins/PluginCFD" -#ENV PYTHONPATH "${PYTHONPATH}:/bim2sim-coding/bim2sim/plugins/PluginAixLib" -#ENV PYTHONPATH "${PYTHONPATH}:/bim2sim-coding/bim2sim/plugins/PluginHKESim" -#ENV PYTHONPATH "${PYTHONPATH}:/bim2sim-coding/bim2sim/plugins/PluginTEASER" -#ENV PYTHONPATH "${PYTHONPATH}:/bim2sim-coding/bim2sim/plugins/PluginLCA" - -######################################################## diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 85e945c663..0000000000 --- a/Dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM registry.git.rwth-aachen.de/ebc/ebc_all/github_ci/bim2sim/environment:development - -WORKDIR /bim2sim-coding - -# Make RUN commands use `bash --login`: -# SHELL ["/bin/sh", "--login", "-c"] - -# Copy files -COPY . . - -# The code to run when container is started: -# RUN /bin/sh -c "source activate base" -# CMD ["/bin/sh"] diff --git a/README.md b/README.md index c734cb355f..dcd4f2a888 100644 --- a/README.md +++ b/README.md @@ -8,10 +8,9 @@ bim2sim is a library to create simulation models for different purposes based on * Building Performance Simulation (BPS) * Heating, Ventilation, Air Conditioning (HVAC) -* Computational Fluid Dynamics (CFD) * Life Cycle Assessment (LCA) -The focus of the currently released tool is on BPS and HVAC but we already provide basic methods for CFD and LCA as well. The base structure is shown below: +The focus of the currently released tool is on BPS and HVAC but we already provide basic methods for LCA as well. The base structure is shown below: ![Toolchain](docs/source/img/static/bim2sim_project_workflow_eng.png) ## Installation and Usage diff --git a/bim2sim/__init__.py b/bim2sim/__init__.py index 1461a9433c..0fcdfd1e1e 100644 --- a/bim2sim/__init__.py +++ b/bim2sim/__init__.py @@ -154,18 +154,3 @@ def _debug_run_hvac_aixlib(): project.run() - -def _debug_run_cfd(): - """Create example project and copy ifc if necessary""" - path_base = os.path.abspath(os.path.join(os.path.dirname(__file__), "../..")) - - rel_example = 'ExampleFiles/AC20-FZK-Haus.ifc' - path_ifc = os.path.normpath(os.path.join(path_base, rel_example)) - path_example = _get_debug_project_path('cfd') - - if Project.is_project_folder(path_example): - project = Project(path_example) - else: - project = Project.create(path_example, path_ifc, 'cfd') - - run_project(project, ConsoleDecisionHandler()) diff --git a/bim2sim/plugins/PluginCFD/__init__.py b/bim2sim/plugins/PluginCFD/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/bim2sim/plugins/PluginCFD/bim2sim_cfd/__init__.py b/bim2sim/plugins/PluginCFD/bim2sim_cfd/__init__.py deleted file mode 100644 index 678f5ca5a8..0000000000 --- a/bim2sim/plugins/PluginCFD/bim2sim_cfd/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -"""CFD plugin for bim2sim - -Prepares ifc files for CFD simulation -""" -from bim2sim.plugins import Plugin -from bim2sim.plugins.PluginCFD.bim2sim_cfd.task.ifc2cfd import RunIFC2CFD -from bim2sim.sim_settings import BaseSimSettings - - -class PluginCFD(Plugin): - name = 'CFD' - - sim_settings = BaseSimSettings - default_tasks = [ - RunIFC2CFD, - ] diff --git a/bim2sim/plugins/PluginCFD/bim2sim_cfd/ifc2sb/IFC2SB b/bim2sim/plugins/PluginCFD/bim2sim_cfd/ifc2sb/IFC2SB deleted file mode 100644 index 67a6d5917604d5662e9ac3ce6b675236e2383d04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4360376 zcmaHU30RHa^Z46FCEQZ9SZ+xY5-PiHB-vVIscc0mLfKLxl}grJsou)Z+=FFLyGw0mQ>DAv=T}@3x;E#sTT~LE}#V{Qu zM#1sl=k(xj@H3&KPzU~PDp&|L0ILb0;6IhNGR|4mYI8afE&iS-|GBhn$mvwAD3kbz zt@wM?6PYebBnYZjkTFW}_q4><9QJc*+iQALC84VQ_xF_j+1V(6E=bzU0X3C)Rr~Mn zi9O}cZ>#)y?waatjv5=0n+_itms1_6#ox2;*G~C+*2Ai|c6{)vR;5o7EkZcgr?izT zxe0=*mHu8T|2=8z!hcWIihYQWIBM~o8lOlbJ__Z(f}rZp`}wp$@%N=o zc5dIS>Gv<@`sth)m4Q<4hzhl)v?pA*EYP^Fnx4R{0&cMS#oTh9P*hu=$?5rn>NU>?--?5NGFvNV$djqOJbP zgorUegt>x_^8!KBPEZ$ZR#BknBgAeYNsn#8fwa|1gls{YE8>k6f}zF8NIgq6 zJqu?CA@KA%H8r)I)2WrahYN8QH*RTK-!pfup{A)R46oE4UQa#4y~KaRV!`^XaS!=* zH9=jjD_0YeOiWX^t69olY)$~j>856zW7t7(*(#G8oK@(zm}?=^R_Heq{Pcuy?KnLl zO}Jp3&{R#PFq4lqjMq-Dp{Y>s)zEW@m0`M%5L9EMB3`cOC6jk77KFqzP4zzr+OY!@ zjQtmZ_o(3}vs_gYpRA*8>heINj=kd4GR#eD_BE}gF04?O3+jeCGDTD8X*IOv>YB~84Z~&naoU~=ZCP=E zi%x-$kf2wqV7aD?Lftt>FdWqSk(xn&>l$ivYv{+d)vw`F+fCo)bAXxL*g{u5d)M53 zqYVe;$+xM?bBufG8Cxw<_zUr81Z(Zo#0x!YXs(a9(2Mj8PpB`mvv&h&)dU%+Q*E$Z zaIs8~St?fz*tB4$CQncHln1(N&reR9*{O%ATC5`3U1k9G9U}M4HW%cYJ1lE2*Nrzw zn5wo$FdyC9`J!Hn9KUp#5NI!#>-L?yxgbzxe_uZ?Q_!uStk!FJpuC{-+_a8$bcJ)? z>ViT`XcScAp7x@yx*hvpDDzq)IQI3^j=Sh0(-vyFSe~*-Zln@f?`oY}})dXMu&9@M=*j z3zM23pJg@m$%&I`3ge8eU}_2!+Ma@-ACR1^rU@(zlRVdIPXNt!JgDz4%T(wrEgh(5 zEo-(|FqoXVQSR1yk*>@%E!IR`Fx{@{Bh=n5sL6Bs!W_%ZwFNaBwN&uWGIPy#7G8z+ zYOx8TFA$$B-m*{Z-yML<=J?&v?g7}xKOf-jL1+*0_grX?0ptOk05}Pd4{!?LEWiZ- z)l&rTR{@FvZUNi@xC?L};32>x0M+xDzdzw^32&c6`vTx4|18qKg7??|e0~S-?*S?~ z?(;uC`^MjYK>Pb2yvU~tKK}&}or4B|rsyQ#(So)nfDZqx2W@Qt8Gr#mJpe-h@iBt7 zK0pHiV~#U{))c^ue{KY=oWGkxYXQ&{zzU!RfDM57w1T!ZfE_?vj#5CSkBAQWH%fa;mZ-zWWp3xoG?fN1~`05brh0K{h&w6pnp z479QQUHn-byvGB~1xNLMY@SOBmPAO%46q{4gJKc82?`)Yvo02=`|0f^5QXfpw} z0%QSf1K19*3m_XH2jBp}A%I)}@i_|ZF@QY&S;U=y_kw>ui#YK)1Gw`57x>RE^7bmU z*ZKPmXm0}C2Dl4wAK(GNLx9HsPXI~)N&&>DjJM+ZGk7ltc+PPzpnV1KhJSv`+jr2u z2dDt}$Z?-|`vux>{QU=Se?t2Upo)L~!`r{ms_{fkj3=r`1Kw)_)Z#cj-hw9;^!d9H zw8s2h{5?~6Hv?$MagBH@=Pfulp(%fF25oZyYyMf)ZwvU`isM>C+eY$pJNVoVpgqSs z@U{cA9RWH4bmcgarxUy@0Gt7O0rUn?J#O&c2cRFo004IY4*>BQ2<;F69{^vD6Y+lV zJ`7+az^H%l;?Km#A8-KxqyPEY7^JsXV1rP%;2Ot(84j=&_5nvv`d;sxT$XoG!5xl1Wqyj7jNCQ{_uo7Smz*>L} z0IDY)-nRg31K19*6F_`+L7NS*2VgHi4uJUV=j{P#5AyfJ(B=Xh2gn1+2PgnI1#kx7 zEWkMc@wou)MgA^+zRcgR{)4*)@7Dota@-x>-sA0k-adr(5x^6G5`a>GX8_LuUIB>D z8))D0ck%Okc(34}Km3FL1n-~!`TP~$zXAN@xZluL0sQ5k)!Fu2(12DGKntKIfHr^* zKrH~(qX+M`0qOwM1<(hm2VewX3}6P(7@!G&_%wyK89;LYYk(F2Edj)*HMDjB?EoA& z&Jo%U{JkS@J3-r-zl*=u1>U;?IB}c;T4w+kfL;K-0r~>;2XF`Q0uY};&<^JBLwGCV zec;^>KrBOy0PqJ001%%s(2nKrLC^*RgaC{K7!NQ3Kzt@aI~8CW|2zZQNPsASXpR%< zV&HuaKrBE!KqA0AfMkFL0OGR{+C>110a5^#1FQlNpEb~~2iO3x5nvO5_@qOd0k9ch z3qU477J%y62Jbrnb^+`L*b5*&`=LDma0uWqz!89>0C@oU0OC^s?HT@l7TO|!i~RFt z-imZr|9QUw?>7PN0Nnite;?i-{`2_}ygvqb3h)e|9N;CuD**9%4ec9%|M+JS_m00; zK>GpU6aV}f+Ajd#0KNnK0Qe1{daC|;7jb{!^Irf>U9foo)l>7IcO7`w<)3Tuwl=ho z!3%W(WE`gtts#IBKz)vD0IdmtDS#P3Lx4sA;?o$~CIIFD7645F#K#iaW&qawGs8m8 z2A^93wBq>IyluH zKlkVD0BGGMG$Nh%Ke$2gJ`})@<3{}Rvyt%b4={$~f_XcRx8tD=*@t%&~!@1Fs_0(=Mf z1@IR@s0I5Z04;zT0OC^H*XSka3(yYY6W~{BwP18~pP#6L>cTXb8{< zpb3CEfa+-q@0I|~InEl|763K?tpHjBv;hzwJ80VhIPlLMpzQ?E8K4V5HvrYs9o`iH z&K%bh+Fk&z0B#(oqE)qh0Y3o11Hco&8(=Vi_zZ>C7r>8y9uDnDfKdSc9LFdjrorbx z2`&ge2Lp`f_)usk0fYgB155^(4j?`e&_)780Yr10h@bt>dklY{18wX-c#&={e74*7 z$*Wcq;}g2wyQUYM*62Cc(ixvP2E*TY zuKVHiD(rHX7crq4gU9{Yn|N@DPF>46lkQDE(%;TDzp6pt?-M7Ddx!q&&{l0!{sN=_ zGAEq!xplt$PP-BhgR9v~FMADhim{9bl^th7R@gA`iYe$~e|6J!x%t6!m`t=qL zurKP?zF&8Tl}{9No{q>r@zJd2^KQ42Y8;p_=4+{o?8?^J_I}5-!+wrUZ!qo6M4N(= z7wP#indh`VmZ?o}s`%u3t<$=*D>`{UF_AAgThXe&kISt(&OHJXd+rx@xYyot^76T; zeRo`6k67Mx>*&EYpT0a_Z+tx<{Lm+_VEKvXztwIUr|VSdsugPVbgA{W@v~{~(%RLS z-1T6VW>_2B`IjdTa^F@~uU%Q;tgXw8S6rE3H7(p~@j=7MZM(KUdaYuLW6IiH!dper zqr1^nZD*ct*XO3@{A)2UF3mPxCF@i8^^(csDyLVP6+T8bH>~R3jK5JNpY*5m5$zbo zwX2WS9C|!F7w6@)xb=roBh5ZIdG(w4ve3hK;OG2#&EA@i&Ob5QV|9i@^Qu|e6Mw5) zoxkJ7iecp$?_S-B?3^{M)?v$au?Ir8K5nJRbiRCOXuz*c9W$fimVdDN zoW}@-8lWW`5D!;qKJNMSpCT z?WZGa>$LA)9k%K+$v~yFq;*U9G~9h#pTWN?7yZ>4TsL1|uW$L5nnxanH|#TW^R4Z(!mUz{oHgB6y5;?T z`NwykD+gJ4exKra;?;zj`Y{nhzdnurm=V(Fx=?Xx_N>)O1ELi2knABQ54$(KRJHqo zRb9s|A!QfiL!6crCE6JM>9OqUlGV%dD?R5wP5d?{$FTQbbw8)Y<>rl_+iJU>BX{&3d9U@*QJx+P^;QLKZ0uBj%ZH4y@3N{o?K@z*Bzs-vdqwxOq-)N(N7_`) zI#!Zb`nyq!ITgmMes3=b*2@^7-)YE&9WORdnWG=qyZ4uR`{hXDdG+V7 zNvGvm6HL5IyVe=z*D|wy?L@uU*&nF zO*XzPU-qZDe_%}a4t*^D{5}zO_Qtx-Q>Xkcu+a0^`u4%(&z6fvSY1Ew=jpWY$-!~k z9&A|I_Jppph0X1+`Rz`Qv?~AmcX@5M)V!^W1~+VYv1_=yPs-ijj_&G5o_}pN|IeNq zsbLG3)baZ>E3@;ek`s5%3-aXG5!+YUK3iixWn}jH&fl9mw=w(MaqsJ?c{Mtl?d+;| zF@E!{hIXC2uLVv^?_DzNk8$CaDT~+Tg}$|!8|1M0)I|4Pr4R2KyCpx>&@t}yyu>A; zO@8IE?+vc8J3Q<@b;@L|_KB%G z-ahDl&O&eexjfBDy>T%JF}G!A@63snKAA3NUI;KcfPB= zqpXI$i~5)0SG$InDBjmO(zCv{vG8ib*R@f{E~xLl5q(hegZs!ov#waLta7-$qWiOR z-hFGf{B%#zZSU*6T}5Y)p6@%rcpV-al_iM_e`7IiqYoA{^c=E*WFWp>^=K0pX^Jv_VdJ(VfxB1Sw)kSyI z>L=rG+&ov}S6V_zTWbhqEMFYk{%OPeJ-bfEPai@?R&2iuovPg&&iVTo~UV10|G3+~^s zJf|3Pqb$DA^5e!KUxKa_ReW$MRvenp>GjUY)ibm@nb}4i(046#Yv9$)q9mzC3I2q-v8byo|%Ye!e+?=te}R>rj4!xBJZe+dQt_Vy4fR zH$`if_U*R6{lN0Rsm{?|0-M?7cDidczJIe>P2M;9{`peQ+!w#jbPc=uBlPXCN2wDo zxnybdZ*pM7j;>u48zR1icY1Bu`OuByo8Eo;yya`1irWh-nw#xT3ZHrG%1dickFkb* zE??;Xy*RVM=dR8VzH9dXx##+`GP7U3J%4N7Q}-M6VQGs-?=MDXZU6pidCg;WwR8r( z+ZVjGkx5FSfm`nAjLGY!t{5HQx@}Hy$W*f$(L>u*B!4acGGkh2^HOvDQ!A39d$-Xo zeGnF~&d4mV^`d&y&K9|?+U4gpsDJY#-`12|8}{l!P-XsqCLZ0E1YhbM_{cMQ;-A_^ zQ|7)(k6p6l$p^cF2j=}Oo*9n{AJEmg!?0It?|eMhcZILz!4B!0b|t^Jd2p{sK=b-z z%;LW^k6s*b`kqCY_RDFVkA7b=`RDV<2(?*<+YhYYbKUVP68X@WPOoeBZ_=`#*2gZEZ;o&2+Q>2Vr(Zo+x9mL~y>HsTzMpR6 zvCG-j;oXl8?{6J)$okl`>hb-{9!>OT4ei>a*%2MD@5M`AJj+eK^=VDi?Z*SMK93GP zl6G*7$>U>u-6re?oG5 z-BRa|VZR$q3t0ClV)2^v9xXhm)1N;xv|Tataz&xW-zqf0Gqm$A3?|RI>m1mFr7AE@&ib zE^F8S+wMVwOtP)t&2E)YJFY=YgX}+k^;R`4yft&^P5T!H#_oISd+fA%l5P_myke4T zK}+@cRKso!26z0Fl$AR6rR(6o4WC^080hUb|I+h`6E{4rRnl+p_u@(BmqxJK)Y1uyqhRvv6N?S^wz^evyjJ0rAKJvewR=!+-7(SCJcdXCwI3g377!s6C#g|`>ZCU2^0*42GP z%=H5){d#zfDT0dyyFzyQWRL6Pdb*t~CE(E7ITxR-Ta&D3+xm=`_3FIx$$O(VUViyi zYrw*&+m2orub8!89}?#=Hn`zqlepkISFTt%kLGdmE8FEpO@4N;o@;yE znzesCFJC-Av{6Ra$5W#1%O-Yvy7A4Y;Dn`jE7}LY&d@S2-kxDo=XTAqj5lL{H0=Aw zVB-1z&gVF99-G&8p=nZBLbndtGtzBxr{_G1Ke7Kr`d*9rvmY(>==igI*TlTdAKEsWKESKiXASIidlxxS*fXs_?G zqvPv0ZX6eUe$fN#g6W^)ARZji+wj!f`exyyiFT@NdKoLb_ZjK_kS^q^#+&gw$xIEd&KdMdOGR^kO79Mq4Io)H`q;93J>Wq^g?L4*fWvlZC znwFdj-_YCps#}M7wYn^KSTH=}_&mpl4igfVntW~_+#*ZMprK~P__Ft7e|X-nS>~6W zVRPiUPMzb2YeenY{UeF==7XJs#Pop4!y- z$ZwBY?d%`yuCiY6G*V{C8*d#O^$xbG z9NOso%}0;U-@I|fY~P|R;oQ5VZ8uJguV3%#Uf+$YxBorx&8*+)pk6z-rB-!#n7giR zvwB&ZwLfc&4q6#7ceTrl6P>M|E-vy(Gc0PXU1z+_fgMx=SwCFH1<>UJy3S zy#Lc?&prQpms(i(z(6rQK;POav%A*Yo98w)?%I06)A_%T%~CW zUbyX@KKIMLUhORIx^CL!5o~qbTfO({yu?9UA|~D2QxG`1m$~}rdx`7%MNgV`<#thr z|E6{S`Xw`Ql3C)-=yCh{e<=wax~Iear=dBHu3aX4y7>LkIGyE5StE9=UHDsLbj!YR zK^D{P{qDxb7@XYNe1uz?(|eOA#<$8=HJH{(2>ZGH{pu5&3@Z2aIpKRzYgpWd>|HsZ zjILib>vU%8k&8oI&+Uj0?R~A_*cHpo26mg?4Lj-5Ai{6NXWs=TN&f}B&;H~!U)|lX zhH&`fw()hB*cBufw%e!~7Ph9aFn#F5ff~n$)P8yW%OlMfTKCILtey6K*c>~d!SZ_B zYJ6N|+ruY7CsaFrb<8=vb2G0DXkl`4r@@TB!*;~Yo#JDnFhW$*Fsi%xt<1+O_XQPq5gsE27H|L!F+JEeW_vPjdrvBdU?!4spe6bEk zJ=sm*z6tWfMy=FPyf0iV#OPNL_y=+7D7~$px}cBrn>-8W|H1~BXX#X&&$iV#eVce( zo&|Gp{N($%JR26^^ka)~dgo6#zA4<-!t`1H2u|;|2B-gX7MG{aS{%QY;1eH%)9(+) z^?c<9F6Yb*IDW}|T>f)LIQ^$sT%OBiIDHb_P{Z`8>x}o?tpMjgc@U28Ga2W9e?CsX z6zm+6M+TQ>F?>%G9PdHQiCIc**RRE?wfJE$$DJ>>m6`>mkBtZr_Q+i^D=R~dIPw}gT&wd5jcOZaX6nj zo;bb7K^*_PCqAxgqjCNt3H{tM#p#z2^d|_sJCRoyZ%{+^(_$4quKuR@xOyev^gmN@ zdS5ksT)&#(^qMwh&(5+9zHJP zjkx@W0FT+jJ|Yh(^uYP-ACBwoD$(!u54fDRn{at*03Or-QDVNX6aK2jNxa|Xggr0m zhtqfci{oz-deA5QK>2B0Z^7_Y5p2A-2|XARajgf~55}i#29Dpj2ggs#!0|8AaD3}@ ze7=n8;(D8T1;<;Z;(T0k@qRTH;rO|yaQ-SK`~ z72|wnkHG0;2IBY&)_A`)h7D|}q_&f)kvuwTIRT&n`7 zxAwvNEhY5kNYpEaZ^p;9n^<3EAP**I&?#J=gM^=1xDX$g9^r>qAI9nPKz>Y~Q)h7c zdgpO`NLySF+lYPKg}wNAQ`_PEU!>yn$t&@GZxHhmO8B>mO*sGf`nWvJCgS~CX5;kr zq3(qF)w9$-dJ8@;wPxV`E?$H4_iv2L^Ocw{Lt?-1gjg>liT$s^LR_97CvbU&!+0_M zeC~?l7rNs3vBY}$PQ=aoaNiK?H<0jqk%XLYi2TZ89xi7pk zpP;rl{k;aboElzu{2D$4pWh;)-qJ7=w`a#uxI8b3dA!{p@AtrVoKGE?Tx@=a5^>NT zO@E3W@kBA#y8i}T6K$NSBngyZ{d$MK1TJi7^eDY3tz12Q}A_{ zaTLdA6Xz6lvhi`*K`lp))N|U$;rbV{aQuJyxcnW6`h2_fxIC5qIR8K*E@w^0`}HQy zg9Kuo)*6P(<3o&hVQ*YcgD1E=Nx%oouY}!rzgH}9{OMyj{skeY);e6C@rQ9f3gUc0 zXB$4=VxnGJ6YLiApT)%fYbwEi4S_EpYz#{vaIh z9f;41Bk;lOL~AC_=j&CRPhUbFV6 zdL40|{&fznpNqt}=IP^lsDk<`W)CF>|qC?|0%!+v%`@?@bShH_mN@= ze|wgwyB;U{bq~YsWPcDY&kmxl_>j=gdmVhdw?c9L9|<|z5%u%5@i_mBgK+-Gp-zk0 zx#@14kIqP({x(sMa#@P&a}>e;xjxMwwr*r!|p@D1 za6KIL!1>4tyG^T$^ZD2q$8Q^gk83oM|2*1-(~kxDG5_-)Q7^UofRD?Cs7Eb;b%*g+ z5OwTTL|raoFRlldY52IxX5sYN1RrA}kG)9Hzar|`Mme}XI}&+Rc{g02Swud3RSh54 zHKO0=1il$zZ;gm`w2jy|b=!x_Q$+Zm9;@*2I!wd)q!INEH{x8r7jduP6_KAe4#4}3 zAnZ1Qs0W_!j`OjHb&A=43b7yjHX7GY5%?vHkLMzs{?0)h?@#1uNl^d9{AB!U9AEky z=Rcb`Z5=kpGne<{J|3{gL9GzA~m2I5>v^Ds`|#T&=pA@WRLf{*Dyd|W2UIDUE! zyx-noIQ=oA-)nieJ->sCs+ivnAnJabp#Fo|r`HjjkAk?LmPO?4_mglw@x*-<_%q|E z{L=|}y4&LP-6!Ju@g(>s6Lq1yUpW6lLY^qNZ-eP`9dS-K8R8d4|8)kgH}fofTVo%s=sr%boq*$w?QlMi0&qEhc;NUQ#Qypzp@+F?xIB|1asI~>alCH^&Sx!=-)@C- z0nGpOBhGQ$iT!o6CAi+!6Lx!>$RFfTAH(FS4S5%ak0ACt;@^D3=nIeH`@0E5J{-~y z=hJ}DTWjK6skk%FXH`3VT+503ikXXW`Z5?7Hr}%uI6n6WF3+46IR2#`j)!j1ep{`? z@g{_STYLq`&AJAZX@Kk(Z&1S9Ek5Y&*LA0&m#h#JPPO2_#{4F_31dh z3qfB(*k=o3-#79QK9A>XW8Kyar$k<{cvw0kJ9(S{t_&euK={2vX)`PdD^@fJk=ux$aJ zPu2lEre~W0IR8UL+zcl893}4Kg%SBie@9%N;{^X94RHE5d+>QlF2Kj71NTfYJvg1h z`7b5D7yOVo2ka%s`<-_k$Im*1d;1*uTuy#N~XKhVyw? zgwtOo>H|)&f5+yD&FCFC4I^gEjPezc`F z&R_PPz@NqS^M+WDyHara=)E|9SnjBuM-%(^v5B~SHYfHkWpIxg+ea)Q&Skm~>#GZq z@6{vnifv7BJ!~QD!MrK1hwlAxe2;TD|6A#}enN;k&$zibz3eOA??mFt64avm6j>rLGZ=Ra;MJ}$fSIGJlgNV#|6s>wUZi`aJ+vYF8>4~A8ytZ zmouI4hYDgn7JxpnaYYmL8E4|Y&_JRtH-We(JZK$0-tR;{aJmhyw>^ZtrHAAEFT%MA zwthoQaea#a_XtL>MfmM$g*cykl-&~X=sDrv3JCtW#6IZLB3vF<*q34BG9c`24N=du zBPWIA5+H=GT%qPpnJadp{J4+tp8E|FvN(F6R^C zd`f#dKJN~F@qQzg;`qUHas2WXxIFENIBP)ojfcd%KbVZ$)kht?-%GGAFgvfv!TCHQ z;*M1-oc_)1$6soI_nS%lJ*AgK9ovPdd-o;w$c{r}06v98eCiF0xsOO&| z#(TI2E{{L#v#`8WAoz?S_BF#d<9t^A#`_(49mi`E`^Q!raC zuYMbGIpcs2=1*!9_hcpzbm7;Hr_90egNQgg>^v^#enM|va8DAGNBsZbvGF!pjqCF=kyrHHgv;NC*smQT=qC_( z^}V<}4-Vn@GNK-yGXtl$4#xEmK-_cNNqn#8UKFl}c`10m^$Ga{hZ8C5*M%w1pg1)aQZbskInlVZG5~*M7$nMoR_U2>XW~TeN%83T+Z5?ae1@| zyJ|+9Uw0znW(R_Qv+KA#r`&P;T_XMl5$8eEiGEiTc=7*i#{6oG7LNZ!)c^fP;q;co zd9E5!m-tM?<>}9G{wwF<_}Gc~dRhAer`Mf><7X23k09=GeJApEjV-vn1?|NBKd@y-3i0^&;Ao`s-2AA_^5^g`o5^#C;5Z`Y#a>e;qEW`P4 zF~jkXh&sktA}_Tf_IF`KeYim)E@w<5T%M`K-wE7B;O`UoO~iS@oC&x*GUD&!)mntp z>k@hF;GX!ne2H_|y>Kvw`R)D0J%mYxxIDhZ{=FR$*Ip6zoP`T;{(p%3AuWdC^3Nvf zLiZsaVe4xpC;`LYAm-%}5$~=Na#|93#k7I=d_{%g=(8X_qD2sd$wzD z;`%Sl!u`^L2weWhggsnaijV6VaSqsu_&aq22z(RbUTYT(T+X({IjI4W$I1zR6_$#R zt5|{Svn5e4YDnnkk`2!1%T#<^Z-?OWye0H@g~-Q(O>q7RpK*ES6Ze7RvvK;CD{%gc zho4O!&7}9dJHr#Cg^x!k-T#^lw4L(`cv@Vs_pm5|`&Vq0hI!aC&{he%y)pRZiS< zJMtRmuN8yie{{g-@wYmTA5GjVp6ZFy+YBCX3yOT{?3G- z{}_YwId>Yz=Mnqv)`b0RAmmw2*r9I>t{)%B8?o_rI)dY05a&=|iG5;^U3ea10(h)n zS6dvvg|N@WSvdV&;vDBXac{OSanH(+s1J81{6l|YA6k$2p7<+5501p&yPHbnKd+N< zd#;^~&tpmuPM=2f+a(g`v;GavXMzt-zvU`U-+MQ1Cw|1as7IXtIuLcm zo#Sx%$H6`Y^V<*hjVo}6X4JU&ETw;~JI z|4|~ooG0qKRd9}j>9d$P$8;h5RRV#ZN#y?p>bU%#a1M*f^Na9%dc^nd+V8>bc@0q) zsvzR&iEMmcG*;pG7Q}dyhVE}_s8j5?8W8jO!&{saIS>erz>%uqDI6cb;4gg zB6Z4+f9v|<2#CW5Lyt)NppJ8Wl{%eWz$}-}d`ldI|XG9J@-dW{1{a2#j zHN<}BFTwwd56=H-0>0kOh`;*>*AG!U9|QA_+0Ren-a;_Jza$supFz}h7ZY}JlGvwv z5Oq#BUA*58MBe)X{=OeJ-fqPD-9wD`1%W?Ltd|&KpI*EcmtSu`Zg0_{IKC&5Cwy#= z(>I!q+s~o(xIFENbMtA0oL}JF3iGS>1pP_^A4SxMH$k3&@mIIU{ z+pWWRzgvm=?c`gyJoOIX{Edlwo|VIJ`WRyWcmRwX(@!^|PTLja!PZ3*A!mJpk1cUd zcZXPyFNyhGX@QS-0ukTa67}8$V*kFG$UhaS`21QEb%|}n-!1Il4%h!f;(HlE<~Y4E zaZhh1k%!kH_B-!DPHcWt3HmW(a6POfxneze&h*mxxD6U2r}= zMEo1XRFCL|Gq15y)`865mi8^n4I$of4&~Zi|N67 zAU-Zx8O}eF*k9xl{Erd$SUMARl@Gn}ezz{eip>#dlW-~H2YKDI<${zUAvIuQBu zMk4R}K*-}l+)G(R>_fweJo(lHd|WOsaD8eRXc|dW7qFF%j2_ z2zhq?#Q7M4=Lc8(KhHekTwv=yTt6|#aXri=>I_R7;`A+Nw(aQPql;_-3Lbezw3 zBH!~S?uk{p;Qg+X;ruuF;do!-K7$9L&lO8?J+C74>^TUhe@D>!6ZT`b6qjEh{_cVI zA6!57c{raE;+|e>;(HTAfe*G`mU`g)e-h`Le#AcaE##lrdXFIFpS}d|H;wS0YA0~| z<-|R-Nd*1XJ-D1vQMmq_G{^Do(YQQXM7`a3DBka9!hg;o{O5>Xc)uYhalG$x93S5p zAJ=B0PNJEJ%Wt+5=VM0Hjdv6ErMkrTP5Kb)`Z7_6Urp$t1(C1bCg{5pdDL?vpRXkN z+#vD_!vVOzwIJ?))*5rU%%hfa6V?IaXtgb;P@U>a6UtU4;FVqi1U;PqF-m?p2kqZJ{J=Eg%J+89zMF` z@-HFs&zLHlepxdd-)I%Cw{~_o{sZCnuCK)9p9JShm_6hW^=bnnT+Ui)xI7g^oU&Ys z^Vv((2^SD`>``a%ey0%r!D%2q-nIU?JaGj7wuIiE5cK=J@O~YLy5g+~IQK^QiEd-fRoC6LJ9w?tGpM>jbf;nhZ?q#F=49A7aCrrlZ<;GBWfu|wlN#gUc zQccMxeFh|W@a$FoD+rr`kI3KdDZ{hh5`Hf7FEcsWZwW$}A=AUF#!PSEewELUc}#xAawaFZ zN9EJ77NbwU!t|!1KQool3nSQgRnpdjI)*qef(GMn&G~piJx!FqaueeZ$GggBMMplr z{)|r@j{gPU-xuk_hgIi)bOf7sK{D?{?8SZ!1cgmYB?m~)lu!5H%s#`XR=3af!x;bK z!HmDkuFT|2{*b%X$9wb=mwzN1=_t-WJcrS1AFgg!8r>Ov>UhSVX+scxRxtU)%^60{ z`F!Jgu#=28W;OFCl{HlwX1|brh3U<1b#;3vzr*_V*JFCl=lmUtn7yUX5i6~N@R;ML zykhcL->WYFfA1L|p%&w#TBo`Cj89HYhWF-t-0Cv@%LXt#tL$xF73Xu8*kb2!vXMf)jyIgtHErF-9 z7S^dKe}TkbnF4)=&{zoH!1!x3F@;v(&&72eYui$ZfvDW6mAn0~bN7`;D33yl`C@ydLvkN4dGQ9lNP zV94b3;q=QsGdU|CFgdbxuIiDZ@F?swY@;KJx zdY)Nb505U0{0#(|JF{@+4Fq9$CpO+3?zdI;Q#gt7mrtwiXD0SycxhaY0s|B0{er{} zFL?2J31E6t`FZ`uJLeidG(^3U3kXu$*51(i?2N5;qh zkFN6bWQG<}qS$zaCTxCHrMQFjqr@-_Aq=jAFsqOeE>N{eWurB^RD8b*p2Jc zp7EC}xe3Cf9*j@%$m;e}md5bX_-h}*i*QGU}j=1G=vd?RbtZ;3XMvRZABrlx<_v=JCD<$z_FDOK` z2Y(}G4}P3~KWht0n#Puej|IeM_<&u1U5$Hkm zOU2v|%lWvr&SCw^W-|{^pUcznk~++8BOzp+%EH+%oP>N{x!!r6)0FeE=XqcV&jVvQ z{+bi#FYy}z+#c*cvy5F87rwc$b0mofWM=rR2d=Xh&vCZ|GT zpIgD;mGhogU7mDH#z&~l_>AOy>_89Vy526)^BQ}`r&6K^2gnaadTs9aRQkVL&hR03 zs?W=qsf>>xi94=4xSSF{)BY#76JFn7t6LBz!1@*Yy~p!9RlKXZ!1+k_FMkG!TY{rp(U@ag+memjffe_rJF#^aGHk4o@m@)S$P z+s&Bq5jwN=rHV(k512eY5_`UG%jip-8T~Q1MqGy(htbMD!aa zo-EH~yDdS`oyF%@vJd?U`(h~h0dY=DaxO^m+8M9U#C+YnLWIc*sa-YhW{?9 zw_NMV@SYaT9^`ynPwg20%C$_ND*w>;C!5DuNqyrC*Mp)io0kZlC%5oo^qwIsj<8+? z;m0F}PnFn19N3{aE`N!CuA9T?3wl*wzfY_gzF3mydtc*rIGyRAjY1Gi6@1>y*gUH8 zPjy|U2L<1^s^-1x4o08u$>Lfu*N<5!<1dXPNx)y}2P&EUsPy^z3ZpOP>q4c^`Lh{b zkoc3YJkOB@RoB}Vm7J1w(PbQyv*0t!98~;!@I2FB5?}Ty?Hu;MTFmdkHbnV+lSGTu73qCLPnf)Ykd5ruSzEX$b z-8ud`q~D^QwO6G4_)|p_i8YCa<9t{Mfh^*G6&r3P?!A^;P_at*`AI zUo(i+VeU!lFr{*4Zv~S5cqSC+ME>a#e|wMD%~B{I{HqOD>6Nc8gs&K*SgWm;@qsQg$V?0?02mye|0 zRfp$w(m4Cuk=w)R`bznjw1RMv`zvXjo!O1cBeAPnaLy&lQ!=!Xl23a!Tph^2>h|2_3$r&niTxaE&iLE?W%^g;19$kjQprpvp&y_3nyZ<9{KbQQcx*Uc zFP4p~pgr?Hs(h)D8N&-T7+$sS_>af6ob@cCsr+F-@SnSE0@NRpp=IS`06L zTYX)}^6`3VR=4wleoP+Eqt*2s3UzhS4uvZ$zAKd4hV!YLjQ?s$9r70UKc14h)42JJ zK9!#%sN%xUP}XnGlIr~y@Vv`Sl6Rf{%GRT&WPiHwJm(|X?+oDn%1#nzpFmwj9G5hI z&|1jHE18$S`x*b@-ONs$xgPp}!H9fvBz4{8P{$VWv0qsJpt7sX)r?*yiBspcuyySw z*+)F<#qCED#|yc?lE(2;fv*cmT)qwk1W_KDWL?kc!0?_D`47VaRE|p$mrsBJi+E}L zjXTTMJ6Fs9HCJHWDe3use+vJ}GuXF^c)OP@pH%rg-Fh=UVx0(HPlH8>;_l&!_gm@ z9tyZ!P2~Ku<5<74|CpZPxKR11!TwRyTe`&mr15zPFReZ=ea#u463PBfzZH|;U$RcS z@Ox+_e%0mN^_TUlkmL_-Ll}RBF4Ipwm;X5t7t*1=Eyi(wiQg!@#Nu1Wxkk>iW%?*{G+3X9#WL^iB#*yKznf&3B_0_N&!^={u`@M=)T>sfDUYPQD zar`@%Q)1_*cd>Ps?pj@M^Pzq##`oBvEbmqABWiFtQ+fWcva69Etl#u1wjPi1en<9T z_#8>R_!-CK&pB3I{wEL@L_LQ{^qhT-%U@od-bRb@m&TWhA&kH0M3$ec^c~;)B;2zChx~^z&GJ4?n`BRa?9b3KM@gtd>Qhz>Ld7f@6 zR7&z06UaYB{gPAbnf-W5{6katK9nfWcZokSR-Qk?xOm>E;Qg+B%f=<+ z^%<329g1dh8cW92&57yLE{&~UAI_(5J+3zsw(eARo1Vz+LE=AWa{mx6$v^LRVEh%5 zyd_A3@hO(fZ>}q&_gur`JDVLrXu<2HsXR`p_K)MknLcwQ`Z-*O>8)ek>Uvg(d`3Ah z68`Jpyhg-J{d^{`Yx%cidg#jabMigcgTxQF&SLZK8Cu z!stJ8{)hO!L+bw*B(r|)B=w~fUWb>)k>d`Gf2>6RiTwOAoXfAx`*i{XR_Z~rPJ8hD zM;b>a-QnYv#F6=z#Cd^zjRDi!V9tN4@*K@T$l-MW7Oe!qg`d;e@%07UQswiA*M%Y_ zb~{6j>tDxMNyoeg?C2@k-;!JV!RJ;uh8Y!*TG#;(E;G z^+r|xYzFmP5ih%5-H%=2aZo0SBgvmwzr~XKatV-+Dc3vC=T-bO!(K$e_#wulSV=r8c*^)orDUIb&Wh11BULCcOdkGpab%0P+D*&#C-A#t=3vA%@py(%CgMMeaYmPbNdPA z_zbAaiTb&~&kf<2PxGEG}T&jNK;+P&vB=$D8ob~&P^H=$?wJwZ4ToPaE zJ>z4!xtxHkp$6Hy)?S@n5e4Rr}+T-Ijm zMaADohw+j6e>d1~ihNS}J@EgV$CZp;{*3i2{{Nlga~bkvk=|NzZ~V*|b{hu&Tbq^KjLCnfB!49nA9o zK+eC(4aPt91(UxS=iig>_hWxn&p#XR^XOv9dfb%4=0%Xyi+;9a{KF;r|7!3*qJ9J( zr>wa==^NBw)&;@8Q+0p4jQf+=jm%)DbNVMmY+hpdeK0qUU-6sae2#1C7Z68S@1sLSkJ6|WD#Iu-3o)|}062%mQsK3|>^|FiA_ zqfhr{=TOr){R~H@2Tw^J-k}+@H#@$5Rd(3-8K+;z`c>(_WgOFkT#_#hf%|Eq{Hgtz z-7;+p!Yd+fc5!BM#!BL^^G>GESV{iltnxpS?|r;5Ve_6W$-5r-F+QmhKmUv8MgCu_ z$J22a8NFQ6uPKa6)W0;&rf_?fOYWJ(!}=BT#z;xt7|7$e|6A5CT(43-tvBP}_t~vr z{YvBVv04mY`HRg9q@Bv=w6dN6bsIOPf0bYTZd6e+TUQlPH zcGh5g3MBcJn}YH2T*ds)WKKUyo%yj;iGQ%a%joS2s>^xcF|+ezNglW-mC?s;mn%8@ z@%8oj0+UnV-;*-q{qCR2=GVV_bw6og#`Kda*{Ae??@1}g%j-YgIiD`g*?4olGymU~ z$FE9$o}Ma+%SPabMSmDBxt}nW@9z{3s>i{Wuul=^J$)O?)6VdIZQ(p!G!vw@-x--X)==Ot#Sa%OJO-EpW=rMFE}!P1!_?~%{5uS=@R`%y=C;N8Ek%i z8M!cV0@Is6zdtsH;~RsWi1H^(_E~Ru9Vuru;}gQ^^S?0u((}ZYHq5{I`?B?A%jxHQ zW%RNM%;TxDg=cS>9{eTyHS69?p4F0g_a6MADCc*M@5uS9wPo`njYnbMdAx{Y@~GzJ z7Q|C=9!thBc`P{}4`n_E_m<-sJ(Ts7&kR1UVu|0b=gs(6PGR&ad%mm2^dN7=;#30X zlfRGY!E;=7J*0JE>!_n74}9&!?L@NP*Sc`MN&J%IA~wIVyguW@`#r?-K!3?O?6`EM zPiskCqUTk{zgQASEWu!u_AimA4&3_^@zQwFXaO6SqKxfFRP!~9uhRm3W>-Pn&Z9~h z|I`gkKV!N4yScxWOU^0Umva5AV0={bc#_92yU#3+SaAL^yuRTX$?%=|IvTNu$yq5m zZ_511_=ijGEj;_dy*!O z3novjPxR z1|7izWhM6XWAr&2*u1Oq|I!&uZ^aUSSjoSqCXItfVBW=k{U!HrJzSam1u<;CRO8Zb z%urr^zB#j`TERuaBS5G z!gt8SMZZ_f_d%+4eK>;2uXt{*d}qt- zp;D81Y-28G>`&zI0~t#7fS=)0BP*_K%YMQys3;h~vuP{z1k63w$3(iI@2Q zh_y^kXonSHT?LoUfN0$@%*l*uaYY z#!CE5DnAEImE_Ozi`;%B=OBlZSii-y**bz1t9)KT*b?~*oWE*4M(}$Y#Vgr(BRTyl zTShOFoC7Y7XZ=<#G*ME*HGbvOnES&59%q?VgFO#s^X@O%U%zY3^~~>e4B`DwaAx+P zEwP6u<5<6*lKTTg7jSug=qfp|RVE1b{9Io8eUr;>Y~B^7EtT}D_1-m@*?%Ozzo*I{ zg36d4JSG0hR-N^$m{mQmEB9o0e@VRV2?0*jzrSR^S;pg|G+t+!GCn1eeME!xOrMdG zdf;&gG$Q|WNxVL6&iLe9X7l@(>-o1TZrQ>jTpG zn+*$1vvfam!ol6>2>596O2#Vo;w+vk7g z%&yXT-oBmd!GYhWwUeCVPYf36;e3|YTbgrv9dHQZxa=f)ULL^u_2=;pmX-3E)0ff5 zO5)BNxJRM%d*;mF$~pf^UMH8v(*Vw2{$4KQF7=Dp68&|=7=5J>)v=9OM7x^f79g_W25Z*)GNz_k49GhQn zPCpUq(&BhaBzaC16mXPwBDptG&gaGRHJisw&L`~+JBPX;IS1^^_XX*RtY1~U-lwd? zm12)ER0}Pkf8UhU9;7th00x=l#$Pg}I4BQMj7(yHv2qxyo z4;XGB7%=#LuR5oyPSw$A9jWo!=^w18)kk%zzWN^j?@?dflyj6y@BP&HsUuux2!{@JCdErRp@rHHI>+*kQ z`I>#fb7=&H-+o|+KR;>VqHmlPI$L_UCG8 zexoP+c~!>wW&o&2x7(H-|I`1EKfi0q>33h{`J9wE53m{i)I|T-cKMdj|I|O_dH%dS z|LX7H@gK9|)qnqDws*HJKKX|)V|#H!>WD7MI4^^MEw1;}>r6fW?|zA&zx`a+dkSBD z66kGw-nPrNzh=3+=pYK}o_#1$uaKGMYo%{O}sn5Un z$vi`FTj=M<%RK*kmOi{faeF{^B9C7z>nh(9`LfPCzf6Y|E%==Q0sb2gV%N2(gU9WI0T=6;>-(ZgszP9&0mG{hkAq0;_*+( z=kGql>pCfU8TI*B3m$$#&Z~aDJpY_q{N58*eE6>*-+}Kv@fMc5zmey^?|<>2}JB+q~zeWPFQ0KPqvI8(+>l z_)RkY^FUGH{+<&5LgB_of!}alSD(W2r9OYkGk9NaJeB!b;lsCY^XD^iZdC2p_dl2E zzii?8KmQjz|F?aLx$kf5@O$qHzP%vx{HvdP3e0k5=I%>BMn2*H`5@$ZF<<#cE8g-< zh_BMR*4eHt$hQW+fb&fM{E+aEZ6CkpRYD)BcT)EBjbF!fzG1}&eyz^)ziHWvzZLs? zL;A}>xR`$4_Xv-FTl!ZhzhEdh|Mo4WKZrB^ECTMrb={Wyg^I(!6zG6_e$%Qi`h#EQ zeYw~9Z2CTsg?>J@%JV$+OvW3E54XU874BXm&u z>T$s#cdUBm^3O0|RbOoKRYmGKZwvoFEbIEZ|IKv1YT>Jw5-2{QQaM@qQ_}`zFcn+_3iL{Xfifd*WA^f8HkGJX`XEw!VFi;E;P3-G1*Y_`P?n@tbeweZTQJ=Dz=h z_zOLYp3gte^SSwXpF=bGe`P-RzmdnkBl-H*$mh?v#pB<3mO1|Ge~0DbaVwwouO!ZJ z>eJ2Vf8*&)|F>Cw_jmp#kMlN5{|~_Kpnj;z`Rh-T`Mm0%^EmIb#`!N0=RtWtWy#|o zgB?dXdcw*#{o+-o!#%4W@(;u=%t#&AIeG6dg52SJZoTq;`lKSC|K|mM@69)va`Bu$ zll}U8=FjW${AYiz=p`#I_gg3V^PAS^rEinZEx+=k?h`(@`kMZX_>WIm^+JcA$hn){2ixVV(l2pK#(&zQJkH(wd7j|r(9heSDfG1RO&|AC{`}U9`1viN^CLgT z>$+p!tFkYj_g(z?+pKfz0mN-^-%mH|PV5eI={!L5&|Lhh1{Ki{YKmV!(4nAJ+$vtbm-vPK9 z=lMI2vRwxCOFv)tBTqrDojG;VwAX+0eCCrUtUTB6$iB}?TvYA*C%%m5bI;cP%=+`@8w`n-=}w3VI2jpS8|;-2-5QpZBcsKNk!x^2rmw z#ru1br$6%zFXVA8G zou4)3^rHdj(mXAH>RaB*>%A)HE*0+jpseev#Hkc+{}jPXwq3aX6+BM$g(aGyn&(#o zZo&87`F3+Y9g;^lPiM)?g@4a>>h23ZMpnxI^Q=R*7f)=MpTGRINFRusJ?AC#Ah0F< zyuU7Ty2GEB<@0a;HKym=Udr=S_Iml_|+ZFjyE@|C!c_e6fxE)2k*!q08{^(&tz{A`^c{MNht-Wyi_ z>nEhnu=*cfK$Izoy?DRiWZN$M%kSa$&RF{7OTk}5eyCdKhMsnhpFiCYUH?2JW?0`SNVZFEZ0MqlN^xvD8aT;J}(Ox`e*^3{LI;&Hs6({o-zNRem zk@$~_=l_d$sCBVjQ~Ol|gN5_2zKZefTc6J3{BQ7g&_3RLp{WnwBXvPli?5#ZfAcsu zEPvsnq#wwQA&>t7S=WmIxZ-)n)oRW!Nc&#~>=XS|-Dx9!(AiyYmt`o?_X+xflEwd(et2Yx!z?Uv=A z{-xl7-j6VUDtr115NAXFylwI48=fZnd%r1ndv&IRZC~C2_=NV$I;ZxBFXQKLS$Opy zlwV`nk!Sr1k8|ROP7)NH*~<3ILgyslevUPHxiKd#H~y(e*uzC3@k%Aen{;#z_vvYrhWO%b(l! z=qn+=MtZ}tFRzAt5Pp8gibLLcH;;3|qT84M89#5|ANT8muWUQ=_CMlrdOu^z_3!Pl zKEGqdonHSu)+di!_qF}-&pn0cf5)nC`Gh$h|CB}ly}#%2AGi9YTzE|6&ayj?fy0Y* zxN7O=fBOvPlP9e6vp@62{QO-D|GyIa3!-P0@vZW|egW$D@beotSZ_l*o_>A;`j(&_ zUlu(1O4;{!{vJPX-z&EbaWfppwny84z|YTGcIOYpAM9E8&He5-^89aDa{B6@;?Gb1 z2Xnvf7k~eK*1mijI952Hs>O#t`WpWHriC|tMDo19Eqy{Bm-T+qTlo1I>-p6e@jgD+ zst4Ex{6=(^I46{8(a!^r=f%%&Tl+H8Zf#u}EPI`R z!7%D?UO3zCcB0MtRy&#r!=1fuCmamx{b3mLqwWV^wZ3xcJPdH96elsIy-_h&sb^HCVcI*7^{?5(Jmdwc3$< z4~NHJ9;xawHbcx9k1ig9- z=Fr(`b)xbC&s6?2*X-AKE_4szbDrk>rB(eCbD)L2R;RVMzgKHL8a;?Z(qL=xi{=Kq z^?uZ>;_F}*=Bt9nZoRXkUbJ|L-iYG|bC+tv!*+D8-WYcKhl>qZ;V>$1z__(xzt!2n zhn6qZdacfx?)9@lxvE}hEM?*0=x`%yNA-bv$I7L(=rDeb`cg2z-)q7P9*DYo(XbB> z@c6h{XX^c6w$&L#ecn5G)9J>r)$LRlF5%y4y1}I@Fpu-~!|wjjo{h#Ui@;pNR^vi6 ztY6%EP1G3DuB-qX>}_?k76Mf4Ub|4g-r55)H%%%oG}>KUpRw|w9}VD9wS}ci8_DnZ zAP|yQF^^2iUrsh{7Iv)Fhxx&~s*9JZUD!PM)@H@vO5 z02`&(O4|4hBpgk1y?TBz;T zdr>k!eEn`GSPYSXA}=0dX-@G4nZ?Ia9F$ngTd|;S&DC@xn!9(N?3p z9+Y^b)##wrh=L^=mVW^b!$r3ck- z`ZKE~MHg9{drE62WoL0aL=h0>QB{CGZnjcN1m=axCV;PW_E~b(8)bWEMGdgd4laRZ z6RoFDG+5q7@mL3;2hty$-EFm-js7_iX9HUOlE>G?pvyWc~lB;<`1y-uAKRKy80)YNbKGrN4e01Qy-+tF|st(@()yM6kQzr_2OHL#|yf>L9@--kV}behq1UMTE| zVSPl17cQON8Vvg&duR5C!)`~@^vp~#xvMqS&OnJ?5A-J3sBR~i1)abY6u~w2eg)Pj zn+SSR?Wb@OFKIry9yP4JDD|T~fEF$iqi`f@eF+&IjR>tKm<79EAMOv(8V6(yL2uLn zIwXunI>#8}2%t;x80s@(ezbe^4}Fu)mJ(ACb2FN$SytVfhhQvxS{FcBb*+KJ!D?c( z5X|Bmd-Vo@nzC9#tj?6Um&>7$r82!_ZX0Ox4hpxMZ?;oq5$ z)$-uIyTNCq`YY*dN1UQm8Kz z)3JIZ(LTEyH6B(}R@6ZQaSmKRVEBbg_z!b)VjDClFOZ{IiER-{;tGHtuvP3ZWXeoX zg0X5*uimeNAH{oQ;n$^RbU=EG6>SMf4)#eT3G6%l3KL!AKg5EWyf@xPa5Z<{t= zd^Hr#4RZPzBpO?mf>8^5-TgtNgG78DKO-JTvc>zk*e3Uj#SlK_O;~9S)E3YJ)fUXN zA;%G7Ka%*o28y^H)rL_oR>ujq(G!St;3L!z2@#B`m^4+d4CZ0&VklZe(BtN})r^U4 zP+4xadRdPc@@tSWST_8yGoW!Fwp4B$mk3Bj$#P(G8IFSSiwT@OI>M)fIV6V52HlDX zxc}sj>Au+pc<6uzSqhl-hzeI)gH~+tVk;4|AU`iEZJt;~k6YNB5<3Je70R(lRBp`3 zPLmGHOBi9k32`H45K)r)g0lw#t%gbg#Mk4w7;g%K*l$Y^#L^}4p@Ew0cJW*kl?~md z%)!znO|xm+t84<8*Er~-?LW-s!5FUStJKNAD7=9R4MRcrH{LKtfv7(yj1X%wd?J?J zAOJfKp{q@j3qw%dHZ<7@jXv3aEgC20Eq&sMW0{u72mCMoJ3k8xqd<)@r`+!p8pKFD z4bJ#otgCDb&$38_3T!l=)@vd+bD3UsYMh`11R#DiprtUVJtJlnoDp!v1%}|r$6yV& zyZt?K91?j-^cy>Y{9o4lO54#JIM$Io9_t~djxgvPxvm%YV|)VwiOy`y%IU=+xK`?) zd=pc&@Xv;hiRC9ia0e(@vAIP9<&ujFmA(8t|4H(NZmxb2YYTI~riHwLDGR8F;h$Ei7TQl=sY6ik2Qu3v2bp?K!Y#q{wz26K( zfO!IlM)ZdbkPld82?O1==#l-X(;#gOvq+TYQ5;#3zWfOc(~(~pD92rp8B8RJ-7WXK z*Uly(*f?P9@)vNYj8)ih5m%Mp!vlgDvL73xF$1jgU5JG78ex`fNzf%H4I78CO)uN! z^eAy3A+qxvmL#GWfg9AQ5XxrPg&NGah?AHEAWEdrE3uZf^|>JdmW_)4=GWo#n8-S>ff}$6n8`{$(q+FCknFE^ z_W^O9g(%p=N*~(tkE8){9{`=l3IxMvh`KYA6BfXsVkrsc zcg>(H@mn0rb$FhH8DeXZTLqOkBDlQTm5>jOshQA&zwyJmta1|jf&G>wurb+HZC&51_Xs(u zd?-W~4X0zJvIo&o$jlr>{Q&@(IC}<&6!S{(WkIyeB{CR~ES~woC3vl-B}$l7gfK#M z5e9`cUL?Fm1DOWLm>Z^|=angf7(Kv5a`ia$k<5f&uC#3=i<4=<1jDT@+Xbye}W~05{@Gu1yYW&9+>)I%?XjmGq@8ankoVS+XM1H=pc&miAVNNxefc8sb}4{Q zLG8htDjh&-02a}ZFAuwnrq3)iu7i6=k#u=I$7|8lUannm9EbP_`d+bSEELE z55y-LP(lqp!6Es}gR)Eo!bDVG6847ujF*E3%6juemQ~$796;`@eQ6&OEx2>#au7fO z73z&3CQre_+HhqEDWVX)Wms`Bf+Csbua`=*M6Mp_=BR@K?{4Qpy(csUZsWB9%IMd7 z(RGZKS5P4@Zq=J%JGzcD4jXl_Xy+Rlv)zKh1c{$e64t##|;! zx36?t%|W>xL56Zz3KU-g_{S6;f6Q8scPJ<=!1t>CZgameOt_v5%);4r9qS(y`vYZ& zQHlLQKBB>yLk!MOLIM&25ay7*DB08ii!6j*?oyh*-UgN#E`=fKf}jLSw$*?_IV{Ag zG-^XaT>TKTSgqlp(kR#J@E`oCt%UG@)%7JHz~v!m4Ac&1Kt=PitH_A>(MGflHF=)2RK%Za(L00+59Bb&mEJ7b>|q-QU?q0V?lRm({;DK2aZ0W~!j%k5ZHwqHpYl!KsrL zl65GMsnmvx2T*;~?N?eLLoF1cYHgN^Ge`-6dO)VGRW1WGn5T*xQXK_YS#+CMX=e~e zsW()t0Gbb?Gg$5dwVv&ICj$DQc%#as-{artNu^-&neW;ME{K-^nnZ9nse=;E3G_DBaxf+8{lj1| zJRcoIZCxsaYzpR_-T}8^2d6v0eX} zszq4}P;D#!xs;d@%KkC{CA~C`QJjD-0|D@g>r%5dK+MdLg6$M8z-COHAq#E_$|JtQ zfqxYxZ3G2@==MM%s1nQ#k^Px{a0L@X!Yf!K1%h5nfV=cSySoKwq`AV`Cj6E-DEahY zfUq<1O3Eg=3~i4umMJPkk2-%097He&G2q2(ov8mHctcRqt~6i*v1*H;Q934wMA9l3&6B2-3Fg9H64*lE3Xr!4Rr9TAa6E)N64er^#%16Zl~7t_ z&X76LpgOHm8DR2UV43KpKrl0ERyv^ahj7XRJZ3=n`+Y#`#L~da@kb`aM~f-Er3vB$ zH_Os!lTwsU9vI=|uCK8cLTw6U(ahaEQ7LihNrVj=W8Ork z3g@6Xe3M3R$LQiPHLdjk3#%YsL2aHDQ5dz;%ATg#MC0=P{)nN%3n7$hVQ3U0M0nt+@(OUg@NeaV^%Xdu*4ZZ) z96a$3hSA$$3*t&x*;m2(ddSNG8}u%2lEc8O59S+OfGDn9#kPRugDO8yd_@=*g1*55 zgr5y_3xG~P=zQcU&CzSp{5FpNvurI>-?b5)`q>d zKPKsi@0;P~Y`7VK2EABY#;9ei+K}GqMFk}|b_5vifNS0+LHR64N^}S5EDEcMRf5R4 zI=rTlSy>r!4FF}ukQ}*0du}4zL5`UgKb(Z>1X5@sof(}M!ORT59FPBz4FWaH&%hOh zEWL|(>XbbZNhe+GUupG+`*512v%j}+rH)Bxddr^y=M+4adR7IIkEW+$SUJvq~kSdu4pBySAx_wIY!GExV7(g02 z>#n?897t4Kg{+};s3xvTtYeghMSm(JGFE5;m0STs?W3xsSc(Pwc<@9Gr12S&3pB+X z{;wyO2&c2qQHLUkiMo6!IXP08uqP1JhuAX;tT9XQYLO{0v6+aqSRGlG!|3R|P;}e8 zRy4z-;w?e;GlTCy+XR$p;dUJuJh{R{-Z;8f$)hOMh6_zBxdi}1DNx;|gAiv3Ra@mf zDrYXRd&nMkB0`Rz%b#$A9s)mdLhQn$vNP=RIwt4WSh!PVYL#Umc2e;mh#nciAVOe1 z2GuE{Gv$*v3FC;i=dxu*)V)$nsFNM9Iz-wh6?dAFXInrO8KPthuOvqc46kp7DeYY0G{P^nVOx$8C>3HT zIBASHJ6YHa92R(sPI)~XYP`TEz~phOsD5Q3aLwnja0F8R4XTgQg;J@HG-Z7F!6h2$ zZ%;GigFZPLm8m;UMfI|mktou81x8yEz}Q&y|dpaBO32&sUqoA&xPtNs zmn{|ZqlK1UkEUP@z~DGkm1cm&Fi1s}9B5OP#4{it6h^{m;^}4+ioOT*1O;7}T8JDdg%}Z6U-wGKg_(amOlBK~rL(o=N0a!CTa|sv@~ET&Q*-`i1q4?l|(& z0rwL`EV8f#_5Kf+U$KrOKGcVjBto_HFLjJ#X*KFY4~}NJwbdL)9l~pZ`Q~A#z6S@7 zw&0XeG_34_o!KLBG#8d;5nf|06l7GA(?s52{W=^e2$uK+ZCw@MheIukAqOyOuSm=q z{1ae1TDQ|+-S989Rr+-me#IH;XAy0#h6m=tIXSeOyb_L@CcnV@anSQL=y~;yb^3Lk z-T_9I0!v8=Gd24LDg^VgB_SLrgOckx?YL%o5X8mg!2Sk5yYX1 zFi!*p!GrYyR(ylnnG`p&2#W*q{+qSE+@)jK<+f28@axoJsJ+1d)BGR&Y9&mD4%jE+EYupLAA7XtIVF9^TwsPcr{PM>Pf}=XJXntHGQLz#UZ$?#@s<=<4orq>In;fez z4F4D|m`K9P2%x!HrK<#hyFv64#jBMG6d+|5=Zp#u>ECshkCi&j)agCrOQ=KyTEg;F zAs#GKOGcv}P&sSX+(z0O!vX5#iRTQ%q{!p;-bO^A3%p#RN!u}y#2|EH1JcNe{6s(N z#pBA%5Q|Aj^~rk}D_%_oyw+(#Yymf*L>O9V*7p0@@C5IHX`>C}jX9ddcep`h@kNm7 z<-)7Fu`kF2mj7bL^9qcu)5;e-9Hj#kkD~ALq-U_=t|lS|m)QWjmq0@@ToBuWI|5Ll zRhn>&zqKvb27sS)^iB~jH+ey8E&~lGB8^cwCiEell1)s!17&BJ_yXb}tgQR>xtyWc z?Hdca;akz~Bc@1qz@c4}P+iGU6A=XZnSC;wN+dM^tt%sWp{EF5+1>uEu8Tmy&92JTta*rrCZ}iSTEQx@>%5>Ve!-S>9sgy0z zdD0T=2I4saQ|QdBq$Am_1l&)v5C$v*;zv6iD7=Gz!jciR2h^5iOeGxH$a z30x)vbh^{LsAX?CxrRHX83zTG^n@PP#d!o`UWy zeC87SUKYzZ@t(5fb$EoRLno)CM_@o)IEOWCrHdznk+fA8C>s+Cq3^*))!3ELld} zt|?4(!l#Rh+Z_igm}Hm*S=KB`8RZicToTAhDu!i7MG_e!)|qB7QfKZDQR$Vi7FWzd zUJ_erh$}{&!p?U)J4I|t9@S~1Dw6%Q*$vE%of2$J-uoJO!)v^G2KdY9EW>NK6vONa zFc#8J0Fc8*O&}`jf}tZsb#i7m+bWiF6&V2bNs0_eD;v>I;;90Ey+b+k0LOV|72wW^3s<2-l_g;w7&T=AwH1|9>l<8Ul0aYepSU#0JPL0zGw z(L87iOUeiyS}0~=3$D4B8%b0sDu*GPLS-+KJ+%-OVzSE|OIYUEiLQkapX(ch^+F4PnR1YQ7D}wgIVmhJAf`tdvZ6Dik6PCRrFPe#vc8v#gUX0SuiL8 zKGp2bSa4J9nh${}%T<6KNWpoTVFE8uOK`IP#F&kiL1c2_aw8Xw6H)ooE7tqt*VmYK!Nd=zF7@GNU$|au zLS-&SFE_stE{-}!Wz&q^(?GZmK3KKke?Ro1wc^zIi(Y~S^RTxnnKKrSs?2;WeE`Ve z?}$1?SW9=I;4pYCUI3Rt^Ytg;)?v7_-)a`9!z*Buj5X?71{8*$=~QLOhiZhc06~;z z>U12FYCMH+oq-WJ!99q}-kN6)Nh8FF$Dw(S)V+z~6#Bj;Rz_>luRlP%iwCSH(!a@Y z>GH3?NH9ZRjP4Rj>Mb%k%isveA==Ip==NvV^gT7h+=Ate2awhZH5@OJEXXLHn&?E6DA4Zp%N#+n zDK>+2?6q>73s8db0m_1DL%FZYq+Z~4N?0ai4Lr7g2nt14Ka+4dQAc@fP2Qk4sdxM2 zom>P$6?1?*pk$72OMyE=;wxSfA1N#EGfvh=cp7O%@hV;MGAp1LpjRkCU{`wgPyJRB zngG#Up8)nln8d4bFDDw4uy}41Q>2mRl0upTgqlNGXJM%60J&NS)L-z zCgjQy+|%V-5!o-{`qKq$idwHndn%)Xk0Dya^HYhyPe;^EXpH7AE-ZjEiROtcp%d-a z5j)@)CYrbO%MYlF@vnj95*6uVVy=6rcH4(=h?8Q5yyX0+50I=WY(5!#?P;~9_^t5f z`0+r-m5~O4b;g^eyN~z^$tgDt_cM)SD%$;(NL)Ch}1nq9Qjmw8SUUyM0i5| z5}?Y08YUFB_+C6Qv3d)1A}v@!{HRNPW^n+SJC7SMau9Vav4s8k&UX9I1gh8V;MHjv zE`@mvBJrB0lyPC!k7I-YtfdI_)?d1sU?JHpCX5~pGwiib&2+6yUa zhm5?{O&Cimpe@|E*2wgwq8Fn1aGK--j+y46wdOBchT@D2>Zn>|z8cvCzIYQJLSlTE zfHrqCJ@ruLT?o`Wt@s_Fx@h{M1ZJwOz%DDj?ZeYz6DITqhZi#vKk&`g>goxzboa@@ zU)+U}JSz7xQf(Pgbk)viv1AP8>rQ#q`m)OMU ziHANt(J_@kc5-S89T~DyA#6UdHW@wO+HN$ln*w-bk3TsoQdV#`GT?KrW3WXGvKUul zV+VY1grL{`65%6QznYoe1z9E&YLV|^OBBu$;T`ip&vLKSPNjX<3Ch)|%jgsVE*AuQ3ErHq-oPf)8RlVq8g zQm+tUdEwZR%15Uw-V4Y}q6-}wVd_F7>R=4Q3tR-?|D(FM zB-e#~lHsVuGWJX>V?(`FeqvHhlgm&delDYF@*1g3Zm3t08lctsuukSm^)KYoW5tuC zg_79ynL|oexpMy8xA!B4mW9Q|3aY5yU+K7)I(V{R``o0lrdCt9K=-_H{m_*nh(R}M zx;53pngz1r{*;=^eih0KD&^t5EBFkbC%13&(?>}O(*zu(WOk@o&~HnWPL&1I z4B|~G6c!sKoKR|^jyoKLFl70J&l8iJ>aCb8YMerDT(h^8CH-ae5mR`~Y-AZ@n1V-b z3aAssTxsB8f^mEfJqItY)&+H9u<s^!a$vu!I6@!{u;eD;)NtsN#)9ViSwu3Us-} zE>6QkY7JQ%&bQ%a0sgmii(H0NInZDi8ZlL&<@lT$7;YkOM)crBf|^L;RGv^r_gJ5U zn+Ae(S~cz+Od@+s#B@Z#3~lCkwbSeu*kIvELwlJ#s}zc2NB8l)f>Tg+P!5XZ1Fs^1 z&NN8=9Kb|s#C&p+Y%Qt)Jxhx%i_P)?UG54WYtEvL>MD|zB4XbnEh}_mlipA(F%DY0 zO?f+={J8j}Xs=_PJWgaIv5V=(ro7DHAM1ci5p*b1_a`z%!K)=AC#VST@mAyF3_y64 zDw@=lVd}(|yVq^t08NQVc)j__=@N%WPr9Ul&NcK4svod<4YlV&$E#bv9re(u3m-#u48FjGpL3hnVJL^JECy|JU=zh39BR&vMNzF6tXA z+>|WLK^xi^fhakOmM0o#Zc&sODn7h^FV&@_8#IZuGw`r&ne!lFTn>PxDhh=i<4Niw zKr`7t2c(&D!WQyEet;|1kLLHJ;T@(X@)VU=p#{_BTSrW~3MUhqqW_d&lQP?A4xrhlCfTSk@a{)JX%MUKe40+fEM2T67 zZ^oM_)=KB}s_2O2TkrWW4WC=-xJ@)(^=6IGW2%w*x z+-PEM@}(;Xa~h7*(#CF#3yo}cavjs zS`~cYF2~VXYMPh9u{isHvV=T&);WZu6g<@Jx0^{it#&woE9Q+ub>zT;?l_3(=vCB& zMly6j7NZLUC-8T|yorGqw2<%cEHpwEQ)l@)b5W-*;H z-&-6&CTq5{2f~_j_`lK*x@Dz2YWrIt`*=ovf?~QY98sJD3^AOs5pv(^s2=q}tkx%}jrh^8k{Gjom@ktKw_k#nbW8N6;y_3ciK z!;~)VD@I6xraFEnK8#%rUDr6B2lZq|fOe`U&oWs-h12!j5fMw4JRO8n%pN4G^5ok$ zHs)&kiVX~xMkqVh*VS#oD`!dwS=3+&BrI|zNeE7|Huaj zV@10XU2jA^iVI+7!r(O|1|S_OSB?g9U~npDoQR{cBYu-oK@J`u9Z^6Ygvq^`5xp#g z5Q=usE3jG8okk1cf`vc&VO3-*?nWh3B7HZpBiVQ+8cnDQ(`9BxSV=e_({wCU5fzbQ zdfNd87&a=gme>xJ2ymtjKJ*rkoC1!&7s=;K>rOy=kYV)fS)!W@4(^YNjkwKQS#U>8 z&2a;~aom>zi=aEvE~^H2d`W0c^|=d{R3IV#C>=_$9hym7rO}0karRwz>3CXDNh2pc zOPB&QffdyL57ZI-d`Sb0S)+PMjRWFWR7L9|?tRH98866(-fW^uoljtVG}#UdcN8IZ zq<@ccvxHiVAr533Q&7TjASO|xW7$7B7pz()PT;(_r%!89eq_Mo<8~86vn92Q&jdL5 zFHd1yfnV0(hLT9VDaNF)l{e456>_B+#*{wH5^exx(e-<%579X~n@j(SyLJE$FW#K= zA^^dv)HoJ{&Lhxm$}Hq4N+F&Y-6TLoV+_za;*cwf)G?*D6=Bjrh2wY0MNqt{IB`LA zGk8p%NCBh9iqB`#{DFGe7-!sB1sxDbjp1P>zM6IfIjvObVnJ#nip+6&*lJT{(iy0q zI@_)f2CSPkUy45PIKY(5M_Q=p*~Px<5|*U$5j>%Z$ZRNzvv*QOMdMZJqbgL*ksqHZ zA|3w#4D*Uc(Tsz0aqwfT>=wVt;n*4|wIGT*Tfz!;zD}H8NOt~ME?X`ju!ef^$gPQO z3cQTSk_5i9Zkn5f0W5jl2DE^acmo#!IM6%2U;*Grns$E7(k4d zvT-PS>crad_6>*w_LO^5M}|NH@`+!4f+`ct-TCa|_5y65N5+&7R^T=ITFmlcP;)A1 z&Z-d2j@pmoJV8irXYiGrd*&q<zJDxAjAe(0m#>3?afIs?$gu+{BAdV@aZFmxD-u|**40L~3)l`$HWO(Ao zgNBdZUE2|e2c(R=>cG^Pzhc%3{815DDWYKHJO!+#I3nbp#Q#(pCEbR1syUP+Udw}; z!b#cqgotiP&C3SpBHi=d&JMN^8Os|*mP%8sWG4-#RjgB}mnbob4&My{$>Dg?^`)Er z{b;@0AMR=pOqt(oJzrR$tinOluQ8(ENA1Cqs0lpIMd zzvea^x~B?}aUy2GOA}#Lon)G?>A<*0%2tVQc?6_iya|=ToDOlajvd7wx>c)FK!fQs z@WwTiPgCGMDJ5@eNu`AdeQ5zz0cm~|$Dj>IKknR?5+)Rs)7M*rQe3G%w<^F%{Jbzs69c(Ej^LSAZmC0eb6)S%Hd@2RcG7oSPIWwxd1h zx<8rdMY3m85Rl@Q2*W$b>z<@sk)mVPZ0?SYh@eIU$_l9RJl0Kj3qdg-U-nsV%h!w= z?K&J^1T$G`4KN{2eVM3u%Fz8miJQKS>UyPAz1mj0B2m}*DFd@S?AH&VXDv3yKqcdV zM|50AOcv>(Nu_j(Fq*#IeqT?#T9*zt0$tP5-NhvpnG};!rlRHs4t>qB)KPn?UsT%VPe+b~sI58jcfNZBeol;R% zQbq4u9`8O}BSf138vBr*($l&WAX!)e>vgn&nIEz`-you;_P$#bL@X8)(`A|rlq*rD zX**PAB30N3X3qg22EB}P9Ljy$fwfmc`Ln}F!}kCcq6xMm*-2O|~qC1204 zpbK!nOQ9g(^VhQ)3g6Rr3J@wboyu(gr8N-)Nyl#-^=J}FF6v6wH^E%ou!Al>7{^wi zmeLhbqKS1~6{9hu@=Dd|q*05e6sMH^OqxZ`vE~#6;J)8gU!k)C_y5!-GcdCvWrN}Q z=pbsxb;Cn`EWg+VSKO}dQF0$ zwF9ZWYVGyfP)0Tz21iL$mCM>Ko^ZkjnU39^^R2;fe$aX};?;|3A~~Tt%8l-|3E&l# zlQvHPrw?NkP>hC*_^`b0n8F@^q+(aao2ZZ_3T}En!Gig__#g$gN7*e@(2jVB5e=4z zX^HBf(2CY}qjp;tmqIOwa4LXF9PwC0*c^xMn)gj21c0 zK`Uje*I9Gtm0mv@K=_>taxl>1uP)PHti_Uo%)T9(3S#9qors^2Q&Y#;gyK(vpc8KC zgtU*tmX7iTA%2~KN=J7n^LSI%IUAJUKNvx1C*EArrmjF*ZW z;}tmAi(2p{$D$QguX7(v7`~g+XzRKpk%|j};)3-(i{yI%G@zXt>+&UgOe@ z37pUK-z-K8G3}|goys?JClk|m42vy7hg;R}@G&(isfPN81GX-d)i21rD%IxDaw>X5 z>vG&tK7meSS{R5-E}L=o5yT`X0%Ax03#^=%L<$tIu{zsr@9%ZswHflN0R$V5LOuUr zHEIwLfgZDm#BlAwMy(4KFR?Di?S%6r5%Efax#xi2)`3Tg+>ESg^9x{ntw@1ciz;yY z3;BZj1>SDZ3^~eG6X_4|%H(qdtXy}W6qq;jsh-+GCLK|FKwtVu4!kIXoJ&rP13Ctu z7-XLk$~Inza%yJWbR$xLjRb3?&K)Ip035y5Mz8{nuKQ81U2jBTvo(P3X^mZMZoLq$ zM$q;;j9XhbHX79i@a+avRIjgu;ZA2iY+Sz%U9iJWx4#GX1;&q7*BbB;^vXULZicl7 zLKvA8_i zX$8WwEbPd!{Fg!b?70~xD)0iGBzlZRMY^OIv2@hyj*9zJ*tO1M(FkdX>}MvmbTy-| zG{IgJ9hzcG^Q6Ocj>G)4E`6T9Qg{fv{u&P2jI$SPOU*Ti`%a8}5-2g_D zv(GlsMkmM*_9%{FLjI`-*HN^hfiCB2M-g;9DdT&^ghwskvk^qj0=sPRej3*S8d9vp z{9qhC17(}YQF3UZcq~Ra`zb+$`5?5a4Hue--6{=$y8ziBUw$F%MAyQIBfo>NJ`A_} zP?%EQ!{>#FnYQJ4@(SLPUn+Ifg6niL@k6MQTPi#-7pOZ126)K;qTUcn724roe+z%X zI_q)kc+`Fof*JpOS+U#~F}#kUi1m!q9A?yOg3Xzf)Elmyb(~jmHBOQ2Tv}^#k%cVQ3Jr`B%KB9RD@AtZu&T!(J zNg^n30?F@MDJ?$g#_1v_d3A{#!Qrtdsuc|Ab|p4{+TT6*9v6^OQLbKcDm!B43GrLt zPn_P_=|?+oYG&Xpp`8di_0EjANv6;G<+z(M2(!ni;COKDWRBiUp5>>d3aIB5q3QiNfnmcZY-g)zVHh4BOoX zME;xLS;7^VSXMV&Az!D}+3uomnPRZ>_=UKei^gC|x8}e>_P1a|$V@_V6jA(y8oi0j z4has-kks3-RJjtg@`{Z$C^#!0jLL&FYXPJ|R(pIQ=sHV*W*hW{6xbvhS2tq{SQZ#l z6s3dFRmel%+8mokIn|NiRlPP1Mm*t^BDF@mABmG<#Cw$$Rptt3 z0IJn#EO7L`t~%ZSQH`iGV5G3=gjky?=Iyp)Mp_H7yG~R?lB{YyjPS*GH6eK5cj^aJ zkA9&XWJ*`U^yP&uFb6GAGx4z;ofZ9hRDsYOGMRNSrt-=S6hAbL zB196rFjuKxMTA^oVO81YFW?#XNK;WCPAwy?lYuvD3z)SU@v(Ys> zDUMET%e1m&y5h=I$j9U9e5gh6rI(4Ya1NC?QJp^aMJu|<`Hx2{Zbkj#JpQG0%2?qM zR>@Y39d*g%EQ2F=T2xu3v9MThWfpT4OivG0N*I132lKLwtKy(kOE+C%&;ZbEr`!1u z>qG0j)fKD_a$ljUdVTc{--ftPiB;O(1@quup6zz~%~l6PXwC$$>GL9q?JPg&7)ofS zU%;OmctLeAWvjMyQ17?uogvU*t5xYZiM`YU^Y$o60})}c>jX|@b!u_A6C6$4{`?rQmg%n3}7#t6T0};vrB-;nWe)lkJU~>pas#8Hf>7h)6OdP<*_3wkIK& z7yH5H5Q%3-0geY(6^kHaB(5+jcAt9z2~Zq1n&pp&Rv(%ew0LGk2~{>~TB)~px^U;| z?w+8&Qn20XG{bEy(jJBo#|+VtEP(|%dZc0<0-C|xcB?;t3L+Ra>YuAXwKw+JSZ)nM zs5+{*$ui($pbzmedha2scaNCSTxJkimhvsNT3-0p4?5zNR;dkdaW(QB1}WRXql0Bm;B!L7AZ;1;GlM zrhHi6Ht4xFrWi_8;5lt7kpm~9P5m*3TzM5`&2#Le>jsyCvVs+emSdP}SBe`U|KZJv z1)>!EM{{P@P#y6VDaIXfFh#fynGSo`le4iJ4I2GcugJY1s)ho?+WF920q$Uwlqgao ze5W!;u`7;Kf|`W<_jAcNx#<*q6HMWeyQ}HS(*=fe`FMP+HQOp}otfBZli9TZe2ziI98L^k4(5*ulv<3PmMg%a`g$ES zi5Zl15-I?0C$w1YN87FIM$^%0IS3i1>UbdEG2C2iY=f@(-3)f5X7j2DEO2z$8F^K~ zhuhsYIxt{6i~rUA>FFSXboNa@M7s&~=9*u|6`48IkE%BjA$HE<8*0lcXxK8{?dhLFsSb!b_|zm(B~VH1BYCy z9XHReuK6z8Nq~ndC$EvwbWHPjk&}Ua0MqsDR<(D9H(3ngi=IQew52@OyO{77M` zG>ooo2H+jYW5zQ^EDGqB7?b22eUVtQ@iH9+z+}uIFPkoWq}pvCwp)}7mscBQ2bpwt z#N2q!$(fD*gs86e79LF3kf?~tzuJ}BLzi?g8;JD&G)@{W^=`4r$4V=I07W|pHz1zw{xngx||ZAL1J zxG?BJspLM?N;bo|C#}8^-1rnP;uOG8``hqO>naxK*;jv)*)^O!U0RCp>O52lQ*kHP zjRt{s+3Li0Wqd&?BCE0?hVP{vmV>==?4#)Fk!ewih2q zVWn5IjT#Sw_rh&&GC&y{E+@I;-s=R!>it0^4*T|lQ60`z1dH2n%Lu$8ssF_a zlxYKK$;lXXGO8PT?lRpxQe_uMPjZ)ak<5&iv|C#sq&Hi8;|GpNioPk?EPdDp5h#`k!?v~EfdYB$yGq)Bj;i&2v>T9(K z8NODxsUBF-ACN(yOmA>`gRTXFb2L|9-jz-Fo94{#W3T`$x7MULOzgMCLd?o%r z{BCIhsX+)b>YuJw!VC3>qbtyR`juFev9n7mk*W4h0M%bN3eb4|o0l?8|wxdcgiwg+(E~`CO z@F8$sVwSo9j73x4yb>&zuMhjtUOhaw-)U59>mVgayI^GED9aOX25oZypa zD2eXcu;1$Jl;K<&4!Nuzoj=!)qH>jp9xUS`Ps2$$++w(Va8;43CnGf>c8SUfhP%&7P8}#nXd9Yo`;7Q!tBb zJ=1A|EX+Y-7n$Br3mZ%D$M8(|`WDa&HkZV&+HZk40mW%soJy#)x(*E3!Xi{uiYR~< zYn6be&5dPNASM16sE`stuPc5UX(KApi8bV9;3cTCA(xuu&`G&iU5NTo{N<2Yw>;YK zoxNOvh-Dx0VxTpGWu1pl_xtt3pwcV{bEHL;g2h$1*Vt{hnxxFMjewh*;R~BryvxDA zR)UzF!5)EqYQgDo|9epBFJI_3TidK(wb#L4@O!}`917hfF-D4l5C!uOL_?67VYI%# zwKgUj{s65t>Dp32`e(n@2E2mmwiaCj{p?glFp`o0R6w!) z?L-*)(f(>_R%N{1x;rSrZf4TO&B8$mcDkhk8oV09e#FV(%|&%ovks|R5cM(FWJsdo ziEcHyxEeuI-VErt@*vbL_P4t2I!yx9fc*m80;lFc6Rt?D>mBw zAV2M-PGD3Zha|Q5EzcUxw)zbyDq{1BI1gbbmK4+hCC{%zQ6T?q&1Jkn<(S4>hennv zUP(f#_!JOhNuDSPwZ*-&}fbFT_#|q;J1OOXI;L%W6_*L5c5I>#+ z4*|D+P8Q057oTy=CfR)lCY^tb7e4G5~~RI^O+NY&ty@|8qrj$-p@ zl?H+77qmkCC0HwVOJQaZhh%93%Mu4sIamgIqK9&^kCu&m1SG1P=a!*+NnSR~u=@ zeyc_}YluaDhZ4xNdbcR+;tj(?2^P*=tRkEaFH#t55X=FTIJf`kqlbKMNjxT(=WNNd z+G}gdLBLKJ52rJ_{h&i>ueo3o1VfbxgmCa#%1A4Jnp7Y`;EQZ}M1&C?i^Oln3Ng_N z@JH;AL?bTSTVQj3*dd#Og>bl$>0XOO-}<%gM_6R;>;R#B9HG z9_GFWfS$I>e9Rph!G#v@CKqzBbq;l*o}My9`h^)&qBhHkNN@?;)oDo zbV@C}oQI%Ry}uD5Q}^l9SQZ%B=^F(99#AB}1NvZc%`N!hUDOfd*?l}T zpl0qMAt6o!a=O*yN@Z}ximy0E3udp3W!sSar>~bt6x3EwhzmdoEDF@IMm^HRtO{_! z^nAPH`>s-asU1V49sAHY&{`_qwTmI(+ni3V2(ceLNMA zL4Sap*Q1NuV5yb&jSnlRWauWIqf6HtM#H^-IUWJ$>`FS!rlufX67a!goeyX_BqG5g zAJa+F7by_G5g0PX9E(U3S;>eg;#$*)HW3lqI%9N{FsBg7;d=(bWvr<-wnT+!Ai@B+ zvkCo{^#AjZm6jT(mw+h8_7W6Oa@!PVq|@303};{AsCTOo^Ol1LDbk$qIQ@&_L~-CU z4N)liB(bOTUk#V4v`n`8a&M;(A>;6J2i=+aUbNcXgR;j3a&<&<7)|LaO-0)MG^S;y zqV`Uuqj{l60Mu?lSrXDJnJ0^cGY?|~3DOzc&@ho)H_x6esgS9I&6n4sYse%6u}>cT z9?XJsA2o^GSsQM}Y#c&>GOh<;GPjUas_BM{kx8NBSpF8+^HUnn!IifogfI}q$neJNAl&n1Cu&e^Peix#A2f00hHD&V*#N*d15=LTFyQiOyqE%_b$pj& z$}%`ela&T?acv5DgCb0Y4YkQzT3|%rr#HKCHu_70{-E@pp{x;iu&i0)CDJ(5vBT#A>kV zxMYfYhlr6f0)8OB4!Y(`uhBOt%}ML|RKzg!kVrSXc9gjHUI7K7!OIqbdy z+$j+1r4nqH7`gOo9VX6pYxVE?pw!{vyQKbsu;B z0t9ab_mn8TX&^SqT9%9??-_{NLcAV|XhE_dIHSS7^-@;E(m?>fm@iy5wWljj90XTv zeDB;mRPXais4$6hC)!FT;;=4Og@{`Y#wa0h&J=~wNYK0D7mKM3fgTA{T&f%$^}E{= z%wuL+v9*iFn7=b!L|ZJujt9XR0B}&J%EbvAtqpH^!n|H5W1%y>uxGR4=W*ODFZt$? zhPQZnEi&@UR*oq)J9NclMq2tj2` zCSG+h#8SE4ZuKDQpP`;?L0Mx0#>s^wv9N#^Bx5YIK#QY+nu1N4QkSxHEZ-q|rVj9A zdsirseR2Ep70{FtN#gXBH0}#&>(vS^Ra_+VIL~6=0U_BmhDbKb_E+e zzFb`Hw6O-jn|nxv5Ho>P1;IIN#4T}aO+}#1P>{?eo{$dLqMzw90l*)b?lv#mrCw~2j@{IxS|wOn zjT&5e;7+@!pgPtNBv{@>o~6sIWRwDN&d8|C^eg8D(tkWs>Zv%T2Kv$F>ZCXnNe-kV zPs>$5h-C9+A+!W}3eoC+<9&&%aB!!U&UTs>c>pG@@>a|)0^u^yYOum(aVCV-!zGrV zzjQ^*OJXqFB~Uu>cDMrb6k|Hq??NJK2ZBu&QxgT95mmHgI-;YOlh?j{`3jxDGzP=h zkmsDFJ=_l8Vil`AAiy(OKL8h!RwpsHD-g6$8C=}QIs>jRqD65CTOos^#IW(Dq9`p? zVAYqbuldZQ0rJ>x=*S!XJ=k-~2&!#}=t?fmm5zmoEnXt4WI3%=Idvtb(yT`2m8HLu zj+>=~OG%I0f*3e6JwC^+(^KN@CH|KZQ&eiYiqW=mkuz*Z+)3pJQovV_QTtP|%f!ln z7Kodj7-B4^mZ_hr0GM6f-|Ln8eTvZ4=r&*v_l=c_6C|iXIE+l8V3QIN&|`Sx80a%` zg+I8bjuIcthMhSmNn9&_{A&r1^}wac5C)Kb0}5sqUt&OO+=ilXbg@IY>KU&CQLUY!HVS3J2wjNI1HZ|r3y-H3 zET~fR>ctMaLo`#*!%g)jt=~?3v`U>Z_g$W(Z4Yv^_Z3TU><967*$uB8wvEU<^XS{oTkVR?Y+F-XM}#RX8v^7tR-BW2{2B$d1|$*n;E8(z zo;UHa96lJ4ol1d2V`E%ML}Yds7%Likwc2P!pg05yDs;t#*fc|A(<)0%#SMys`SW#f zT@)q2wRENx0MHBS(Zf(D@D>oO-p@lgp2eb7~MV_U( z<~K1Ox%D%NCzWubty_>%L34_Av(&aGjZg{N^P8A(Y##714 zUc}Zs?uFv$j5J!bP=R{!h&t@ya_ECOlopGbM8>VIquP`u2jXCDQ;(LFKOk`?D2m|l z+$+EMRXF1b!a)yKGLfO70%G{fRpbZ6T2_Kf2Zy;fX~X9iHc*vJeDVlpU4p zzDI7+m(3c*J1a5zq#!sku!nsh8ko)XUJck{{pewv0MI`ib~)1m&$(5a<=+55(+660 zN^!96H%!nKz$l?XmndiU+kUhm*=N#i9B+|9K3dK;U8F!%~;ig7i89^cU2o*-D| zOUh%v8Ej8Xjzm!_m%y%vQ|mJ)n|LKT6fR7GiwUQw2@QZ=fZ+_B$NfR`#Tgs`8U#AS z2V=(4;|HeMumZB4@khsu6k5&Ytcjjv$5Kik0B(RjRwvH0SA?{3Bvx^)ZU!R2NEPi_ zI0gZuY(_!aZ_-5WUG9U`&K0#$fbureB(mc zhhAJzzbs={UIAvXd@$-N=qBJjAXQIBc9YzMj~>WLVI4k^230@+-OJ_NtmfJ3xG-`O z5sc%|DOncAtoG3~Dx@XhED#ofD2*z)9ozTt1b?VBPepe*C9PC24CGMUT6h;LG4ya8 z5}MSEJM^tIL#{aLB>9BqMCFuLlFC>wLJM6z#x}<+xy(xY`1Ot{1Rmw;$M}kLS3G8) z<20T>wv;lxe`?XR@rsbHMNK^-?!9ho1H(I$`xJ$mHJrl~i8gELGljrc2grw4$PveV+w zUq;&;cnoT05~~yUxN}55bBEhJgh10ink$mXf>fjVSi%E|a$^#h4d70I01A_&fu}Ft z>s+9+82(Cy7zH^vltcB{i!kIOD=M7DIbx3@bv#S=4Ui}D=-5K2P*auhBy2A%DB|1a z!{>$8z(jQC;W;2x$>m5oePxY6x`K*bNU1?EHwuf-K(ottC!u?E&&LY2y9(9>l#EkP z;N*Q2Z5zKxI&qXqO5{BiKley}F0S`jZ_}p5nTPy|D@8egH?cq@1|4P6SsLrg?zjUR z@`4d$bH3e2FJE=0;@wji@dlW8fPlE}pH0ZuXra)gDV46?%a|+8Lw%kdUc% zThQ8QO5qz*y4|P*ENuoNmCH;5!vjDGQj3|!$U_*eUY^^`4Cx&6ud|B*k3B1 zrgfVZm9Yi2?+8xCyyvLF6N-6ft+>uRb07XotSw~*<*0H3&;?O0tI&7l+?Lk7e-6?< zhycnIoWf)tBKbu`;hfYP36itYZyqC%Ro0MO{*!gXq*3KC<oU&iz6k zN2qXOVVi=B7*Qe^CtB^`j9RX`+ES+;&#Mf(2kPYZagIa7C7eYB zP(067vZPIvgJlJM-J46_;0h@-ke2Y9!#5o*sqt<(VLZOo1A~rQJAm^9JBHk1MGdV6 zKQ1rOFzRKk=W#&H<2HFmo#C-?1ynxA0NL^weMQmajEz)&u2U91rKc_*2`tu&MU~Xp z$X99}c%Hb~5lp^=2QYGzffSWG$`M`l7{0$#!aw7!A0o zGtnwc*$5Aju?kb+54&DEK6j@ALe>EWBoEe>pi)9xTAH8uL5+n*TR&>IE!$^NR4zP z|KFixEVu#npm>HNHsy2m&S4Nx+IY8%4X#N>H8rRQB9+id2wkmn{@QL`nlD3RXWjQd zVp0PtIATkZiV>-o=c_1HK9rG6pq@xJLGVN@1U+5el?}`if=U zAkl90=_YxQtBg+>Ah*krZ`(%4%&<z6Caf^e9g8uY8;KsYh1D+i}EQbz-Uz~tyF zWKGr}VTq9=q11XZ=0`=*$ZDqXS9V*?C$6EhEP>NFve%e&JAB}wC<*`h=A3T}C!|o2 zb{-$edP5<8^J8C}fG5h8OCHiY7N=?Q1dl~-M?~h`ZjZ-7$-(=J>M{=1D?~H>iQZE| zK>egkI-i+4?xJis2B#ESDel#bu0cA^LfPY3kJ1Dlu03|~g~EMZ*N#)Om?@snVj)RZ z>#j0@k#r%eJ{6TT$sO8KZ0WY5qwhxX*i|C{y&SBE@_iIwgFHEA)PfUg*ZjXPd1xCh7D|o}cCvi6zN#`lpq)r+vu0{P$)Lv?I z`I;9k!j5<0qA{j6TDI$=v!%$V+-K$LZlm6shg}>%W<)S28=yg{nFJXmFJ>`K0Jji8 zrzG>xpiwWPuN5iot9Z*}{%FTE@zz~H_?su@30=RT1XcA`R~@JHP`YH7oOyHe$hZ%D z=UQHx=}qo;xU*ocseCTu!=@mM)^ zsJB;|Yz4Y{o}iK&>ex3zxSujK=>%$VR3t5{mqSLTCe4rv0GjG0yCg!aqX{FBVH8`N zf1#2Xfng)GZEjD=seTiu$-NnlR=MLxNHxBR!=#C0n3vEVsGGCVNvzQ98}iiT0QJU` zOTaCPQ=Fnpo4nkcU~6V@Lo!0fX)Fwu&H+)yh{m?V85GBcW%_q1AcgCiKue))S8JNC z9MmgNPbH74gN9ThMiBTzW#v2xf~+@znizT0^ovT=nlqb(D$U}o@^s;G4~ili3AZhl znr7(K4DcsM=MY{yz=EmPJ?8j`6<|u3Ek`R*o>rI~C-nMU8~W`Z4!_9M^6E$pdW3pV zz!eKdu9_z6E6%p~El&tn5$?$KWKJWZFuZ$HV|+9TH(fDx3b7`cYH=5Q4y4C?*mc#Y z7=2!x5qWX&LAEQ6BO5k7*M=zokzFoO9D*i$sXP?z-XcYPknq?>CI;MPt2Vl>^^9#+mehhEr4n=jgodXLy#8?jx2=bKz`v~F z5UaYHyO*2P8N<~SwHDJP(a$LGdZ-3|Sqj6(_3J?pl(w*yX$W1xV6GK^*Uh~B3NoWS z*yI2w!}lmr17*n}E3AI>I^5zwYjn;JN$aZ!HAP*5ZU#ggCxw-3PQH*)o-mIxrIzMP ztMIWr+*o?meij(li9ETuAAp*podL7^;sNzitHf=eN{f(k0Y?xn(EyR8n~3P<0XU?x zN5>newS~Yfx2kqstEuEam^a6!ipn6U4?^m;x*nc+gN#EWI z>^~2NsoOgY_qqpBSTB(P;2odCU;zXJ+TSEiZWwP~CEf|ILN+I5G z7WTUBR^zZ-0>^xox{AT2J?dgPzamz8z;!K!(6O|lP7g!)5H1@&tnBr;Dwm)emgcTN zT@AN09=j=Nj1GfE^}1R#gd5;@2H>$R17d{Il|h6c4{D^T?dC8>maI#2Loqx;yADTa z>FRWkigZg{`qBwe_&fupCzTcR>iE&&n6p&IO!pf5Mb+SCcIXVz!g#Nmi)Wpd*Q7N6 zmBQf-@a7;Iw300T1+WX8ybU3#CuZ{K_#F1HO<(u>)qTA zSHd3}hZvKu*W!NQii=mEV{8kq0|zWNnTG9jt*Kk#HU#wb@b~V`LAf(&7^Z2{8>&_j^b<$7qR>}oQ z3R=`;-Fy+3*A%b)prtqttuh?h#3tiMB+LYQ)y8`RxgH%2Or07kIAK~TrRZeelF(E- zwdHfOoh(TiLu9?9##?yPbhN3TG+x)T1$wQCN(xwNJaM8--Gnd6%CpOGm|u3DO@S`= z;jjg_;w^;nQI+ZD1hY$9#3lFekg@h7TkvBszuBi}eVmublG3NCY8j>s1brrml(O}G zdQwMtw`X@o=gpP;`cA$lv*O5>!4pa~N`;g*RJnCEyjR?7z=0HT}d0bE3BQdQleQ# zjTZj>ia!g1^GR~pd0N&(ClzdGKTgy7Bj~nK9;hz>nkN;i6oaLj)51AkctV6Qp=z99 z$ya_Ofiic*=P1`H+8$4Vgqu>nrtHUvsWq*jh0m8$Ipzsz12d@?4!hxXsRkUUP7n(+ z!s@wJ72@H0)wSAkScS8m;XyrwSkw?PV0o{0CVUh{(^pbws;4+)ZTa{NoV93ZQu%^{ z?L3PjTRB1jx^mYZ?dLI(PNc7(S0Ws~vKf&A6J?+Sf*tu)jM!BdE3a_tWCO`CxN*C$ z#)BTN&$&nbP_m+iucRe*ep9JM+}(^y7a^WI2dD^?6h7F!o_rycql955aClX7y~lD4 z4XV+3Q^hyNU+BE4yh{Z|T+GX+5+wNymsN6r1TxxNkocd2#D9~o6RQs+&VnUOzNI}S z7nwn2BODLM(OSc}o{Iv^-pb@_7=vg)&jYw}t=<|AD%Y@P^BTOp1aFTE0V-Aa2rC|; z9Bf#c-R}0U)%(r(9prLW=f@;I7K-Bk&cXjGHrAgGf{Xo@sxigLd{Qz{3)4fvtKo>LKERT^nT1rF$NXuy zwk_9)#&~dP4<2lY*y>TU0AKQ2iOZPwOqVl2$wq#|BHXbmC#B# z?csYv>6eJ!Zy#dh{OMqS zE9|IWu+kG~#DCEqsyCbJp+~}I3sR2w$Rl9`m<+Bg=U-r?_@5EvALNm}p8Dqi4q^;s z_(wwg4OoqzYIR!iHwM@0@mJu*Gq9Gu-gX}svp9qQ3gJziZhsH5X^%$o2@DqPwL1J8 zp7=<9!xuf0{DB6%G+a2_?MFD~0&1F-OXwzHgg*$RkxOU4-6pw8{uN3BqZ3qXE0?gy2|L$*oj}$ASANp*Xs`hW;TCAm z3|hyNq^-K%(l%=45|RwLt5oVo|37zc0v<_rm1&3F-FA9uoZjUH2rt;e9-EYE%YvUF zy4%%O(ObBx+)fNep;DnJj{>`Td)|!ViPu- zFkk}Ak}Lzso-DTK+*wjwE zuX#M>gXM^DMRzxOW&2U;+;|YooxHrUe(jFU<<(Ue$>KrlzLMQ_x!2Ns znOfQ$mq*jOtcKwuo_OOC`B;%yjir34tQul-Cn&^*)npj7!`^V*OVTwC+bI{-L*Jg1 z$8^kVo$U=LXPq@BQ{z$PS^>$;xCiFu#M)~TpvzLoXJoQ67Es6UGR$Uain6k*lhO>M zsl9)FO9oMrJ1CTxY_8h@%&66N7TLE`h}h&YnD9xd6I-jxqnd_+-l!7K&EdPjwl{j~Ft(*gMxDz^++{A2 zG9KkFT25`o^0497Ws^0t4sicH!zhtBl9BeA(2lxBf$kjV+^$i6dim^5re(Qx~Bo{>K~gVfY_x9FD~s>&vn-X}gfkQ3aMvT6FLFdOUYZ)-Ojw+H#d5 zu(q{&&4jP?dfK)O4@GR{;Ze<%ep@e8Q^#)RIauh&H&?D+F83eDuB~1=v#KrO$YpcK z&0}X*SGHEpU%z~LwS}I1JRFZ-U0*UUhj!&6x9jQujWwefotwL4>QQs?%EtPmXF^SB zbo!*8bz|MJFer~~WLS0Kp7R&Zgk}(Q$|Ql0+KgVJXdZ33uzpo;!(3Zlkp{!od|6&L zx5SZXc806vX4Y%dIdtNH`y zU$KYrJPOIKYJ zGu3Pqg?Vbn6w#U1mbA=^cIiOIq}FLeryF|FR$qDj%=nYrc5|BE1#{4zv*Y%Ro_9O5 zv9Z3fu(Wnbf}?Jl?~6;z56#uzxaLM4jv>tL8-K>!sy2>%B%ZdBG5yUz?kje-6+g@~ zXrJ$yGw+p>MV)+eGIab6*Jb1;`F)>~-O#)(zS*2{8ml43$#`;xx*~pUg_UerK@aZt?LbH}~^6ch4GISC( z(wVQvD{C^$Tb3(^tHZ}e*GP_aTy=A6mlINznXsGU&zthqCw3Ox+W!NWZG~_mbH|4^ z*t>{M%9wv^<1sWdvJ*93g>lD}`@hOnd(vjxSOaOQ_4Um|KF(wP{^9V8Q6!&(AHQQw zxBd=VV?__o{KVHu9Mt4m?5X$k9=v39M`=0N#@G+xmQuOtZF*@+mvppONq>0D)_Lb( zwHlt`#>btQKd>!(UKVFoa9ZB-a=gAMyYJJh05<+)>qNTva-Eje#rEXW9{rnAp(j^I ziKQEUdFBv1r)}euW5d;NSp=Tg)=V~S=*t_r3I4pv5Sl;1TjyujE}04K`o`%u%I)5F z%Fz5F^cSUKc+-Y?wgts-|Fl-ht)?ESN)K;{DDP33S;4_i=Nzq-kWSV$u(nkdJqt^l zO&LPlHtT3gL{#o+8IM8Dd|mruyMR-!bn_?1rO$7z#P`XK=60F;;yHO^6Z_oWu3(cn znxmXskFeEtv@A~dlPi?-hg1NyoV(r8rs8;e{*ft7^p-c+gFPe*)9Ubn!L;+oP3|*K zuHD9QAC6XH)E||rjRzHuWaHuJB+lIVCJKcx9kg zs#2q&+Ci5i+z-|p?N3~7n4oV?9_Tr@zP`12_xi@Lw(26vzd_ykx43zeS|)X)v_>-D z-MqZAVKRSa_0Trw!x4b4t{+mvoJhIYwIw}ae__rjk@0U(HfBra!aZkSf9AZd9h}$o zBNMZy&^*tb#51JkcxCMh)(z#=@8$;Sdu6RAUOaDqZQ9Asl#YGgNH5~4y)$PnU0St^ zd-Es9mjrbFyKtPMeoOm|8bU!|{=Zd(FDyOV0<9g9TI6+%MowL_W$Aqv)gv%y6g_g zLbjCS>Z&d3NoQpvqbag0rU%DL=mZ_IEo-Gzu@s0cvBM0q(K9t@v`WmmHgIv+_8pgn z2eVW%^~$;7RO0m;vQfG9nC<^%3FYb?;n~Gu!=Z&y#*e2W*)nvbEevdd>{ z`Kdc)nfK21)@j*2mG$-eR@Y!CpICC+3v9sQ@oN&9uW2UA$=mBD_tEpmk&V~M%@J3Z z9+PeicRHN0FW578l}=J=5*vRB<_*7BA`fKUCtKw*vEEv|zP2i_9y4DtIlpy0URvES zkHnoCe!|4PIzj|4o_XNHB1-4-Ww}vetaR>tAiU%1mGwouivCn6Yw@x=jGp(zfzul+ zv3%oa%4ykv(#zkpy494XP5N=E@$wKn5($?cSy60qE(7&);&Q{i+)HD1i^uGQVEhgF z>z8Do)3(U=>eKFO^L~_#2jyEy*H&Em&~YFITe@}&z<%ROBJ8}pE9jCvSiQWuvN2R} z?jGEGZwFhlLJd>L5<6|XCcEiq>k9Ta%m%W1TgREXx^&iN(_`%JyNP+P+nh=&#$gj? z@uPi$C0R+f%LR5XMb=hV|u*oIA?sU4|~xmmH=> z$J|MTr`>Xrdxy-u3P+Ak*Cfu(yI3$4M{e$Gt}H(!AM3h)72{Ru;_Lu__2S~$&G72d z+R_F_?{#-PrT*OIT4OFAc@x@oxnT&YOxa00aM8SM`@DX97xF-9Ottio#%_)$B$JEv z1o`@ATs=1@mdpIZRLRLBAgoPb8|AAxMSmrG%m7d&O>#Rbs6=U zJ;kw>>io*1avRzW%;C~H9jGfJO6q+MYR8J%CyXE+{m`seR6}rl=zW~ zYQn_c?qxQ#hQo7e1mt}%TX#s~EY)rDsEdu8n?EmCzzb%id*dcbTr>4;UGm(`+Li?K z{G~-(6*qMsT<>N!7fxFpyU~TyR>KaxZa6lY)X2M&97o(J zNDj5h^%xUl_d|*wHzY6*P97ZmSSQ-|Nl*IxXSs1Td+l>4?OOq4B=o84tM&$9GgFlP z=gDtSeZ0OLA3~bf^iMIo=1!p1wxh~J8|>+p9#%Xii{`_06U?yl&pRI&4#nO4MKcEZ=+Y%M>5XLJW^o8hX=mTY;rhe_w{tzC09+iR_v+x1RL zANRnWcOK~8&RL`6%thQjqg|aHE-&6a8a1CVTl|<5=u=P-kv?c7B}VAvoqD6OGL!qT zF~2)?c2mAgBeOf>2U%U@9?8a^?RXDZ<3^|R6H9qKwenC7*O^|+71(%q*c69n?vmSe zHgS4PrA%o{!$WhC+=k=y>8*#-nZNG(wfId-8*BEZp6AZ58@ck8Ji8bfHJ-E`o?KYR z!0;&jvP>3q&1ka1VXYsXKAIC;>5i@|*?C$g1+ryyx7_pydrdfumo405=}6Ck^rsZN z2`^i#Oz;ou6<+5$zS>@11Gm$`gRAjckLaDf!^QV`u4Lz9*%dYmM&*g4)`s!gc-LcB zWv#<*eXHmlt$BIELpz5+iA+!W|pSa`)Bh zhCI45wi+{OUt;dW*-hOrkgbf>H5rWC8a#h|v_x~C)O_<+H(db{2aKQ8+rONM$>ixf z&dSQOxn^^y{)8@&bEx8@de7|9NV>LF<8CbUsvwZx`>++Dxs{9<5tCRQ1%BSpZtjhM_Q+&w=sCK3Y)nlyX6mw{u852tQ5(()%?!#s+GgIa;QEwdmQHJE-YuI{&QZg2 zCnS2`PMV@b0*sK4$ZMeD?3_~&j3seR1+rhExUhP83l-di-w|uzg|nlE;IOJacS15?H@D1U@0z?z zeOdxj0z$T_?MBe3tWUVIc5UJOX{?!RsJYX!3L;OWt*;$yVK2=e8%5@WtDD!&vyXNk z%w*-BVN$2wER|Bm8QRKEtA4I|yb143ZQtkS#9gkFyLng1p4im>)OxYh0hsv#`ZL=P zV2x*(eRYPo;TI~zNOZxJV1I^bA98Ibl|UBd1O^Dv7?Nk z!sBMFYWBgz&f2KGxlzRd?V)c-vu_tplwZ z_g&do)W4Q4UR}{X)fhX>+OcrSI>;&>MUafwslT7R(RS{VtV3fLeW-J8u58iao#@;# z+xDrI(hrogc+y338QU?<(M*(0!cvZH&6eTUC7F2W4IcCLQJHF096xO?E{BeEv9_T$ zAC9ym4CCc9_BntD9+ioyJa%HSaXF1EBs8U2kpYoxt;&wz^qMjjW@F-ZBXsEJ6SA_t zEZfx@-a~9Nh&xy=*~XU&_r&?-r304L$EwR=;e5#WV!V=KlchX5ojY}QO&*b0y(B%F z9T?j6t=E4zYRJ)-X2@oU_k6O0dZ0%+fWqHB%Ly zeq(HNcYQ;8jV;q{yL+B)G`w<411HV+!uI8IFVnPHf}PsPwpP>4ZOq+AR(kl{mRWML zu{(jgCEZEaxV5;6=ge}NP5XRvL0&B)UU3G<+{w(zbR+DX-Zml+qUgN=^dQtUv*zdR zPSR*WT%Kf?TX{Am#BGtED(6tWV>pfFn&3m(jxgI^_ewh{ZqRx@$!FLe!xLmW&7Gu9?m`iD*f*DUP$egs>)Ia~ zVVd|DmblG;8>Y*ZOg_GSm@cHDWg0IMnne zCV%pr@Thr{v8m4ZD5vHEIOKs1^RWGNy~8>-UC{}fvhkjMbkWp$+k~6jGGzOHtN}l8 zQ?4DZ*nUr*Sl-x_8?J0SY&SiyCh3;g?Oi0U@fqJ~HkmmX(OOvi+>?AIdGn3(QWyK0 zrs3#G*CEH!yGveBp5-`^U{jD?~NV=si}G z5>!_jAzjKF7V7%&iJs}(0K-Bf?X+-u%yg(@88bT>2fb+ucJzSw{E4!0V|Jaw7fcaz zW8N_;T*V&ufk|u{m-i#BZ?0ULFIB^-o*V{--I^K8lPyYD@y1LtNtd3wzLD2&kUR8O z2Xd!eMo(jDn_O@J8D@r-a_52Ef@Q4R)R~Hw@>q^cDQRVJuXdZ1=kXAj(1aXz>(`;1 zbaI=di5iW1Yjk}q>L0i~X8FWw<@(8SH6}dfPg#|CmDmGovRE;?3wOM`GQwK9*^ry4 z+pe?@v=5~!Jh9G>+J&+7O|FemhZGiK@R0gbZp4glFWGk4yqb_|s)_2OG!@6~J=xrg zXd`<_MRs>6YI||7>=4*X#>>nWy*xo+nr&GFA20SXzu1cJ!gP!qapy?0d0TFWj+(o< z<1qAoxu;RSlq_LlHeiSL%1z&-+1|eNnC}0D)PPoSqZnn`<>u3o?_Dmfoi%Tfl9!d3M5o`Fe1v@Rjnl(!teg|G z#CKtJOV(5lxw(IW2kh`_w2Eb7{NSG24WFx~JIE(KhiQvn)@O(71*6*xba4}7!WFrr ze0b-&e24bf*2RnURnv;dy`rbq*6mlI&q!9}LmNjvcUrD9{pOW5dnIWtpS4=&YAe@b zd8x+M(&j_X<>k9%+~WszdHle<{mQJfNgm^^rfiqkkT)+pT-n%=q_5)5AKtp$mw)oO z2O)X=q3leWvk!@=gAc7dwzzD!TuAQvnw2!_O-h?vmzH1sYSUDlGzBa7ou9b4w7I&x zxG8riE?v8L{qkA!b?mw2v3H}&OPK4jVYqSms=Tqs&V-D_)%7cKnV2dgNAsCa(RE6` zw%uyY&CSgZb;=UMB!#j$Ct9sr&AUqNbxRjlADNqEqQoBvUO=?`H`)& zk1orneHO1tm`Qqza?AR;doC=BHO}q!QmK#D=`{Q|Ho zId900{MoDK)ap5$bLvjnFj-x;#DXD7a=W7zpm*myGE9TX{%XW=Z zcE+rb*k;T4xQ*mt3ERZ4>9+;$JYl1HV(35q;^H?AOMSS(n}&^7*3EnDMsI;Ras@uw z+LR|l*G&1@cNHDA;ve69Y)#!ONuAbey}G_RsZN{EDw&5sM76wbc74+%AAl!We$(YWRqKPncX^ z_UMPwU5GU&m!-L0Ter1#e)BQ&qBQ9)q&qyeCjFDG)RXJ9tE;2tNDAqMX?}3$kW7DN z%^rECc3DPU+9_PPaP-)FTxBzF%SQUYab@aTl-jp*eZ{ZNyB_~V)&mk zzSn9Zb-&J}r?9B4?bj?#Mi>t=mQ)`?|v2&`nQ|4x$4SDd?)D0P_ zjt_q33J(pgXBdwpB|?9ByiyjH6DEo?q0b9OeCbi}LoqC3%cW)+s|NkNQw# zO~wnhDV1Ba^u57ojLptvxiMC2F3Z!_(*~#JbAI^R&*Q0ZCpJulJ7dQ+(!q|6M=p&V zyY}ccGmMczzYZ2Lk~&f+q)ms3N82r$$4ReA{?%>A-SCsEwzf9nSo5trJ3uwvNa>qf z+SaWeHv_ygp?2(IBsI6kA8ooPlcrXysRLHGG$Cs1wojB%gl%e0qd}2E8Ga98VjFbk zm|Sv3-q9?L(Xby|4)2-Yk`KBp%g0-&9*yQB5`I&PTx0K)G~IT15-!`GOIrP9d5OAq zS=8kWTW`~hj*>WJ%0p%yaY}PKzP{O%$X>ht-mi^suHMF;8|Zys@Hh`MzdK&9+@*W3crbjKNH+J8g=9URfk$geW`n zGI$cN(F9Zre5^Z@CsxP1GkJJ=ddsd4+1gISPK)Hm^>N`*G~6iQY)^1u{8~367Hf{s zSRTCorrKI_dAWfyuRR}4nWT>1Y|$PcHGOMKZnSnF0JQ-#shieie$lktG8;D0CL`Tb ztDB2viNbUQwzrb`^;PM>R$Au$0NC`sdDG^Ojg3*q#;4-`QD<*kKrsqrAu|Q^+NO`ZzSdk{w=W2^ z&b}z`Zk4ZeENv|}ZM!#GSHTe7&alkjdVBzVqlUwd3d&8n(NHSTo2^6RBdUw?T)j2- z__Ek1e~lH~QCG1}%81T9nsCj&=Y49RPwiq4G_Q~9&`>l@YcthQd3*Y3xP)Revo3^x zEc3)gd3nc{+-__0c)Gc?i6xt{Y}T>LA#-|(PkBkeySn~4q2hionS1DX8b;2&2X=`3yNFDhW4chSS?KWs_(_j|X z#upu?wmYSAJ=pGuJx3Wf9Jfuo8L1r{zb;;BwH9Mp#$K0IcJnsrM`ZO{%4TvyDA9aX z-hO1dj7jaFwWqxDqH_zGBu$>rPx7E$Td)&AyGDe`?_uL2Yq5!@bsbW;#mEVTDqZc+ zXOJGvr{%*I#}-XRyR@XwGKuUc>JJ%c%F>*Sd}L`3D|731z-${6sX@b~7@0lXxA^Gl zCHZcM`QDI=0~Q&5jr5j*Af(3ND)Ou3fw4n!N+#0tB;d!Ve57 zBzc|jjcp?slf=N%*1~A=qHBKT#d2IRtjp5rmin(Jaec7hOnc;qr*#eB!#@Co;`!sU;9MKF$f` zgh7*R4;+(9V?4HqPcFF?Rud;~j5lSWS_}UMLdR__GgGw*wOAIQ5J7HD*v`m?t0D6B zdJO5tmX}QncS4V48^Ub$Zf(kzq1i#RJ6*0lJ3^y{ghb=iF@m&&Za_aiPOuH6xz3D{ zZ*s5haa?9bin=d(=A5Z@wjbM&@7&0an|RQ)m98#M9c`Lxio%I%PJ_bk*xX=Qiq1ZdQ3+3e1**l$Xh@M8nOhkOo1wyrr`@o4|)m zX{Js|xYimSrPv?Ur=fYSIX&7^h$^u0B)b=5^Tx5@mo4QRt(TqO+L*W(`QchG(uf{5 z=3|2u1klZwPk9H$&Kj*7F3ZymV*`7+SHr#u;iP9DUiUU1mYJ%gKkvoTa+=Y`(q-B1 zHurQ~kpee&bj*3Lf8f4Q?hKK)6C0<>c9?wI)|0b~X7g3*t+^4ve7$ERw8jiwA`k4{=(;f>x#>b0x|OTL)FoM1ut}=LRGW)sxd}zH zvG_*2`yn53*_2%_b8;DXtSrX%TVIRI&4;{LZVQrr^s=|L{;1rUBEB%&&5vB(lzU|! zy|!{~S?*=DI|G+i&8dww17t0FQ+gqhTz<%Ck@@iIRZnh`SzUX`yY`R~6?NCmhbiR` zRlD4j<$7;*b2BzK*ovktIoy2gn!RRArYz>R5J^5`NsOv zmY85BYbK3F^VM}rq~urD9ud){OV(aFUVikFcllBC6$inx>}T_&!w`ulb9;;#sG01@ zPOEp_9+>Mzu_U2gxU9{|l+S#?bmf{g!bsbXrJB;xa9O;zB+K!eTd{Gx32*VCT?zB9 zUV4ofbG`MNR{i8_P98UfJ1>f5ylNv=lEPYy`-1W{snD{`HRU6-a^}XLn7t;Cd&=7Y z><4CbQNZm+nfc|g89QPxFnn|8Ju+-IpU{;CQWgsA^OJL%TW4i&(uiD@J4oyocEx^! z&d4^|eKwDH6{x%?$Gs0!W-FU=&AjZCT$J?(X$|ZsakRT)6r7V!QEQt%?8N^~%{QON zmYdwn1DuOvwx9h}Gqs$bi&s~ccR$iffV(YqmJWhnfdU@&Tr!JoT zR4Fp^`qN3TJyqWw?uY-|39X z=dEZm4@$1c)4og6lJTD)h z9{zpWd&Ab^iPz4}+uz<@jm8~!o?V=K?XlO^#}8zfVyG8Z&5s^E)&6bdM`?OP zZ^yy|jYMQd;j# z?p->qk&q}xEF!R5)EDW6pd=Mm$7BkQcyYc+O_V(eoTrVTNn!k)N!R4S$++Ln>n`pzPwq)-mX+F^2e ztNc&XGSYh1<7>b($usZZR$qu=JVdP><-J=eEA zNxX8Kw8#46d}pjQf4l#1+7iP|9-MaLX}!+0NX|k-UL^lb`f+76IyWBwhML|=bvhXn z$Li-Ycjw*j(OK20b;6u=f892;US*#+EGgCDqPF6_*aD53@;N=4#!O8c*)c9_=FKRGu}rzsmF|1t94(`;Vc8O@V9a&^S~UDh_T-N~4U)EG18^t{#+bEWA`ZYJu)o{$GMSqRw`GWBcHmnCPl4-&OW`?{A;A0Et-!}8meiO zyU|tVnp==RBW23mU1#$8QndU=PHUH@Qt@6Uk|PUE%C|{r>$OisEE!o%)mi5HB-P^n zm5XtuJ3q43XneV7HX2@P1nrO0YtEKa7}p75`K4{3o-+}y5j-kaqveTX`O&;-Y#aTf z_ET$#YI=fq*#Epk&+3)8LFOp3ho$wAI#)SD9uB7Ma&_>`|10D}DX$OZ+G+l~vCeWy zPM4p4rmVqPGF{$Dd?>#Ui=>10d}M8zoR1Grng{dpkxXr}?*BLFr1BU=kvTgqG5+^a z^MBN`I;y^pyqxCp)|+U{kM0*IX@0xEKk_*;DU3>0)4Tmh`7<__CC9D)(98CgBUw@Q z(0Hoi#K)nbtZ(|!&FOY_x!=?Ej-Pov9vHuV`rkLwd~>;T@%qDWf1+Ix^u_bfUR{+b z%gelbeo1Fd#+JRG8J!Pb@t6#eeeaFK^Rj}8^Pyayzw8wQf*Eppz>>4TS>-n1K|FWpR&-A_u@*nr*W(@x%?;D2tpXI&w+aNCvYQ5_RCBHBC zz8Ufl+vAsb-;Lu(2Hzl#`dIIO;&{WJf3f#=9AB~LU*x?T$FV)0@qQo2m+bL#y*`ew z+v}g>eGtcw+T&+?Pyc1L=`nl!Ebj$4Zrbas-YamtYL7q4JAvb0{lSMMgSUIH!|{qe z|1|Fb9Dmv8eZ1KJRPQr!y!G*4BmSv)S8=>#<)7@eaQv`6zRmkmIW|8}keSXOjg|j% zZ2Y{y`+CTKoh_f|c`1&!USP`e>E8F^Sj+3yvGOtzrz_OH{MPchWvqOj;QgE|7MR#F zKYIR&!}Hz$G-tV)7nvXbGjx3_Bks*A-yBe%E1pwcA)d`EuM)2wS3W~LI-%Sr-Z`m!mbh0}ULzi!R$eEbexmY# zc>j}>FA&epD-Vf#7nC=M2jCI$1iVQ+1CNP&Z&dv);sJOfbE!1iVf>c)!{g5O05r?&~cO&%RZ8gLnse zBI41PsC<)n0v;2uJxzDwTEzV)=$g+q@dD|#iTA%$)7>Fn-Bz9w&vumW5-%<)?-H+m zK>d~x?;u}$#B=bRc!B)xGk?0~w?{lcx_#mv@;e~zgL~gharkugbA@>JR84n=c#L#? z;sN|QOFROv5l@0=+WxIhym+trd4YI}bVK58=x-43fJek@cWAmz;{I=Ix-H^4(oL9u znaXby?}N9Qe}>BM5Dzz$?-KVusO8il?ti(;cZmn!8Sy^S-6LL2RnI>08qzI@7w~6~ zxQG1qi5KwmfOz!Bnr`J=%5fMW-74`AaXUji2KR{vw`)Al68E2}@mwd~M!Es<8uGP3 zJOmGkx9`-rY7oy*E=}f0HzuAye~Wkuo)8c2(sZ|pr+=V+-XY#cx+(D#{@f*=fp>`a z;pZ-K?-}anJ>tGMZ|i$bJcfVviMPQE=9%WJM?8L5x%aK*xcY{rSKD-}#Cw;N`^4Y( zfbtsgxwpN_>IsOS0uPCQGI&J%F7TLm6Feb)7Q9XT0q~Ug8^JroKOHrA_n*uDPjAy*rwZ}vla*JA2j`T}5HGNMa))0r4I11>(UctNxI92HqfE`}Zmz5$}UHi8sMx;$83-@#s@je?q(uzD+z1RK86- zxI_64@mdS7@#Kv1gt+%}>d$TB1$diy48B9W_$R%S zASK?0{4VhnyhFSLo)O=H{d>gwZ&&+s;yLu}6R*8f&lzN zy}4Id`Iz|Zy@*@lyWk1&)_p3!O}v17n|J{E9pVG$Pc>irGUl4D=o*wb+<(h7vc>mSP2gIE{-nUbH!k!9oXU`1rZP?=z zk6)(g&JvGask}zq*;6O({1Xs&_JqU>*wY~1hyNqyU!s0)PT?`}^qk7Khe%m1)zD9XU+}X2B zJjOV%Lp=C7^;<@~_JFp-d(3}Z<#XcIk5+s3i934=;?6%k;?6$<;?5rLJIZmGz@7^6 z_KVb>D)BmwXNY%kTqE9uAKZ0rKP$gY^#>&1{yX*00&(Yukht?hgShiUL_GQTnr@T$ z-5*fPTEw0G3GwWSs%M*c^w(;Chq%+@{N(%)f3oVyNdE1xXODPrtIFrZ`+uY9_K3T5 zz3(iSyYpv-xbtU~xbx=>apzB;xbx=%ac56R-1(tF-1#9UzKi1)@jmjO5O?Wq6QBJq z^-D@TMcle{TzS?09OX;$`Af81y2PEIGvdzAd&HfebK=g=`^24}d&Hgned3)zRr?3T z(~nX6efY!W*XeP7a@>_yjpSW<)rtE(O*bH3^EKU&co+U}5Rd;=^+d$|XQ`ehap(V- zxbuIDxby!uac57Pxc4t=&kpgls`jMB_i(&ReBr-p9A?D(t{)*@eTM4KiAVpW_UsdP zekh1LKlF$@KlF*Gfu=hke(wi0GAhW2ixX#mm3aGh)iXmp|3}0Lai_=m$?0!@is}hT z{+D1+gShu}m5+$m{z21i5qIgfi93Jp5O@Aei93Jp5_kUW5O@CEC+_Sih&w;@h&w-c zyXE%3?vCAWJ3I8e1lL!IyYyy=cX3=JJ{#)zXP6H3XTOi~CHdr!l`jx?eh!H{KR1Xw zKS#u!pPR&;pIgM8{R#2Td)3Zu;^F(0cZfSZ&QBb-8Ogiy+9O^oRDVvq_(SCd@c{ns z5wBtV-zOemJ~AL4L*D!Da{N>wUnSl^x--Q4zoT~g#B0yh`Z!D6m3xi2EB88aSMCeM zojoD(;CI!Y2Jz0b(LNC0#&MH)<$KgG3Gp`k;I4D!p8u7m+a~$`3pCvw;?55#ap#9! z;?55p;>De+zf1fao_pLQ?(ENrXMdsg?-P$^RKEv*xcoXj&QFea?ojzE$-fKs%n%R$ z67fSkd!Fj46L;x`#GOAI#GOAQ;?AE<;?AEjap%t+;?ACwxbwpIb> z5|7YsXT-C2X}US_0n*(k9zwn#o`Cm=hpvAi?*E#m>wRCjA1U6TCUcmX{D@%)m?FA%RnPe|MckBAT8hbHknSN$>ZDtL={ z^xG<*Fu$OF-X@-dw~4pksPa3+E8r>d2KX*>S>jDfOLK0)ql`*YsC9~4wBRkdKJhPN@Evc>5*F6XNkn~syrm# z29Jn`|Dy6S@eay8nZi@zKH9?$@&1pi{)~7PJSSfKn93K#(;rpdXAV2Px0U^wy0~Tj zU3%Z?Eb;FIuT9}~;@<=LUMu8 z3COpJ|2X&#aVMWn;k(3t5_&qsot`f7pMiWfh3^sHgM2=P?-PFqmZn_$$9h+n-(Hp8(z= zUI*_IzW|;Q?||5qp|G&yS`z%d&mU#N8@;dQd*dGv2pnrjQ8$2YQ zf;WhFz$4;q*wZAQfXBpR@D}k1JS852?-CEdJH%_?UE)4?M!X8XN8AJVezaUJ{YTXQ z72*YWm3Rif1;lg6FA&ebL*gCq2JsX;BHjjX5>LQm;xTxOcm&=h-hNE|kP#1C%5&nb z{_YbG@ScQ%xc89i=@Iv@D(@4oedbGTJsl9QM#}epjLPwslo!OKSb6f}W%=-7<=e!I zwN4F|Zna?QSC7!=h zd53uV9OYf&oo6Y}h^Nn2o)hn*|Jo;>y7qxN{L>>|eHiTn@#wgwJ0PBb*MF*9Ud}%O zbNFY0xbsg)-1(&9Ew2u9v;$q@KJt|jPrpy|wMRVse&v;)E9a}-S6(Ha z|F!ZN;wkjZ5^o}3HR3+cKL;bKoy!e3H6A}+TsNCBt=gZksAzp=im3Ram z5>Jq?2Jry-iij7mzezmU)O^Ln(efo`+@rxymcQQ1(yz z*~+WTKSuci@$^>Z4dNZ}0r3L%d%svtH-Vok#5*4adx(d(E1w}=`wz-};{NlM&k~QJ zr$)R3J$2&gGgZ$5aTgCEaUc0@5YNDy%u$ZJ#G~Vw*Ap-1ly`~ek;YYzxK~&CKJoOF z@&WM#dS-vATwVqA)QG3xb>cDfG>NCDHQkuF58fi~LC-Gn=#x}WhxsQe?-KV`)ISAr z|CcqNJ>tP9tDZh_4}3tphW=<4`YLwxD*t?n>ZuV=pr_9KirN_wPjTEN?%k>SW9D}# zZxQb-s{UQ#{u!0;5RdLs-X)$csh*s8@lN$;L45XCln;n|_p1KNJIe9qgI9_7alKDG zg8VFTCtoL?LOvv(gExuy!4u-u`_%q6@f!FJ@d(Ge#6!q;h&%a=cntZRcnZExyo=)= z@!%e{zfZh{V-Mx&;yH)@8RBi|sS)phFA&ecBjSDNZxOHF4?h!k<(m@k{2}6;c=o%> zJH)H+Rh|(~eqZ?>@euO+#69?}Af6)K9&u-9pSZJgK-}5sp+32Csr`Z4Ss|Vm%B#ek z{XX#-*zfAA)8B#pHIk3uhdOa*e?Z*Xzd$^ApV}D`@4)^Bac6&%cn$W)%u$Xl;vslK zJVUI)b>ai)35XZ3QvWOvPiB>e#H+7VUNA?y z*&|;2JGHY=XA9 zhXwH(c;i>g`3k@@;vVv~M?6Qo?Guk-PeD9{{vPoNJo>e=Ju&zm@$gUK2ja;eD=&y= z;j3)>(jHULf89ZxHXn{)l+= z&8nwKJp3l*E#e-I6XG4{*(TnHJv+o_aGVmaLeDPo4(#a?&(5p=_lWx!lsTq#GQPDc!2yy#GQOhJc0feaVNh` zJca%?aVMV=_ur`Y?-Ff{TKh5e1h}WK^JS1Ls{wH3osC-1cbF1>0 zcnCc$=CCIr-oHilw23#NXNPzn_NT=2+f+}7cmh3L;-L??KND@jmSFiPxT^`K=Kzpr=kehCKoCD*O`?AJ$*u zDdILF-bT5%h&w$A@jmoy6Zc*G5bxr6hxqJ!)W03#uHA6gx%qqa1jGr+7a!1iniJ2S zsq*{8=QnkJ)FbZF?Gx|gyM_be#rri~ANg>0Iz29bjt9>`xs&|cU{9TRf^-Ao5%Sw0 z?$T`$cYa8SJ3s6acX~R+o&8o&6@&n=pc;$D>?QpQ9@-xI! z@LA&CMU}4;&%gubup=ZMEvude@f`9^;@%~dkBJwMPl&f6-zJ`cr^J&L)!!i=TvnbD z_pT_Wkn$Sw0z4p|URC)8;(hqDLEO8h z@)2|7Cng?2zD2wW`EBAECzI+br=uctE_m zsqxt$UIUMa*Kr&Z4jbL?jG?L zj`xYrpnmm<7muo*0dc3Ng7(|RbJ0@y8RE|VS>n$AfOzqk>IsQ^IF5+V!u}TV=(AN% zLfq+T6Hh)z_%8G; z5Kli}^)!h4h_@zjS6>q1-WRBzHt_(*DREa{y2K;s$%waboD)wWUl4bG=o9b350&?o z{po#?+CM|w>6s-yfS!PO^u?+tB<|uQBJSd(MLhZv)w509*|S5ug81(c54KfLM!b&W zocK2K)g$hIx#}4ZclD_9hh=|up~olg{YTYPBkuAQ5Z{BI2Jzx6R8K_QlO2e2;h?`uoIl*fStr{SJ%||F~SfA@s};kG@{zed2BCsS|hc z84yptTJdgd$`%hCn zUE<->mG2RErVzA@2N>5_kUT5O?WziFXkH8Sxs@?Gbl+T>hN>&d&pq zcYgN%v|L^u@>?OEBR*${563OUJMiZM@&5lnJ!1YN${WNxf26!gya)X;@dWx?%%MLa zp0`zho46a-b&1z8Kgo!Cu2Js5!ArbN7$JEXy^RDukc=F@Q6XI^3 zwN1Q@@kyKcx2c{T;%?lsOWf)25HFy=OWcS4jCc>nd&C=muH{q^ck@1XovYXWx2pYp zlFz?E`GB~~mxpwmp3X0+e1&+9eq@HYv&SbMe2eOtC7xqE77}-QT)v0){IcqaNIq<9 zzt$w)LAo*V5PsMu?$S+(JOAtwcmC-RcmCNY?(`SLJIGg$xXYLK7v*|dcgOCxUA^|a zHm;M?-Fl+zw!?8^e>cW#AmRcutz*Vzm^kE;h%lt!2|f- zH1QDn`@~c1?+l0+@Q?SG8Nq-Y1@c&l2~rzf&XL$9Od$o*>-? z;_a{0bVK3^^f#Dez8n#E@8fL}&!ImiUVyiV_rbS`yY;9x@f_;|JIudX^OX{J>joX- zPJfqp4gSxFhtR)AypQ9Yc=T5qA3fr3eav0w+Rp^-?SSMx?AvgahI;?8dk;?8doap$*~xU;84JlN54Oo)51XP3Cs1>zy}gv3+GH;9K=2WS#cZhf^K8Mlc0KaTwo;@(dv-z8pvXT-CgRQY}4 zX{NkSJozc*mA|2K`Dx`o@!)5a*NOW-t2`v`yh@5*O)_p zojLRe%zq2(C&atZ9}#auf0K9){W0nk9yH7lV{sD97_x`RN58li(Z2Zg+pMid#cnJNo#M{tcBOZNF z?Oz~XgZ_|s0R0W(8T3cQ3;3r+d;$6s;x*{sCfp?xME{Ic>r;{H377sR7?DjyK{e?@uq zAIg6Aa^+14dp%J(QhjE z{;{0jU|;zRasRiJ*N8{&QNBPt_-*A8asPLew}^YctGrFT0N*8^y;tQk;_2@x-zT0F z%KOBl-&bB4l>HDPKB~mipVIiBA)fuba-Vp$g8D_g1^of>_OGCR5f9&`JS5(B^@}<5 z$HenjJX6Pq#QWe0@$^aB{_GInh5nRy0zJFLQ}7ORw4Zy#Gw9EW$GQ4ppSb^P$_wHt z+W!IZedzc8sa)()W=)Y!(_o2T=-1{uV192ZbARgSJ{%;Vkpgu>$JCCXU zCh;6RCZ4`P^=}jRp}$SM_&AN99pWDRlM+whpDyt_^k>A|(7#8#1D+F)zfQ}&M?8f7 zKJor9tNeg??N^n1|6Gm-?>6<%4DlxP`^58isGeEk)n8X$BObj+`2z6-`a|Lc`riie z2;=97cpKyY7V#bEPl$KksrGCW58kc3P2Bq~jfY+09q8{6&tZR;c;?1e#G}vEboYtx zL4QF!gZ>`zwi{m&kN$(|ul!57+zaTh67N9&4DrZ~ub6+K>aPac^2gIX9^*4xb zLw`g(fc_@&D)h(1qt8?Q+r(4oZxgRU{|@m2?N3TP`fSzTCEkVpjJOZ|d&E1?pA(Nh zOZE4N=g{9LUWNVv@dWz4_ftHyRR0X|9`yUfJ?Nh$9zcJMc=VX+Umza*fsRWX#Qpav zZxTrJ3o)GUMUv1*iU#k2r zasRKBcZfSZ8F8<#^83UK@Paw)=@ZZXTJ=;uSoVMVH_EHT3+VBQCx5H*b>h+ADG!Ld ze1*h=zgPJtaql0L$HZNECB%b&RQVm^$v}BZ+}YD19{rQb?-39FS$R&}=_!c&|Dy5( z;@-b1_dKmnZokImt4h3p{4DYG{i>%%Jb$w44TvWnQ27S&J=D*Lc<~w9jx~vgX!l~` z@v_Qq6CXf-n|KcWJH*@2pAwIos=rHo7V(`C&!B&gIrQhm<4dZ)N4x?3ec~PH9}w?D zzxRZ4`Nk`%e}?!r^!vn9=$|F-qu;L)k5^Uy0`V^Nhs4{^-yj}Be?&ZftLkqN??Hb; zJc0gg=Fs0J9Tcm?$*CGJE2F7XulJH+EFs(+7o9r|~7rp1?o*#GQPPxCcMc^+r*uGO5A@Y%8R&@?-Gw7pAmQRIq?kg z`^24mkGTIVwWm+q$$OY*xO$gBzCzr|&k!#l?-O_OHR8du)t)+WC%-^Eg?vcd$w$P! z=cxWBaVOs*9zi}K?&RCV3&`&fck;W$qvxtU9pX+tBc4HikGPZHC+!_zb@eJ~_#G8<>6AwN{^R+-c1#b}dK33(M#3S$) z@eF*MxbLf;9pVZ2F7X1qOFVc9%7u6ezE9kHsmk|=N8khE8F=Ms<#O>~rg~Ki{UE}Jc8OP;8Ydm%?m4(F z^Up+F5$}WV5%(5VexG;+^Us2K0{eT!W7yv(o?lV@1LDqp@1x4`)`6WB;u(0Acny~9fo!~TT0vwxeo2YcGYtKd7teehl4 zJFve)yny{(;yLWkh=;I$kGQixC!T+X`e&bb0bUUAgZGJdVE=%44*R`lmg6&n{T1R> z*k2{??4Kc?!XBS^2Yi-z23{w=2m1r!8SGym-hurg@%)ndvq9Y19}$mXPm_289usea zC&UZbzfHUY``g4**uO)(4f|8#&i-BE0qp4z55c>{Bk(=q1K6JvPhtN)@iy!)h=;Jh zN8H)pCtig;1L8io_pEZ<*1)U8t62Y?A>M}lKJf(h&l0b~{u*&-f1UZKYrF--```=2 zJ=otMJ`4LJ;tA|;5|3ejOgvvzds@Vu{R#07?A#`vfwzh0;3@F{_U{spVSk5s1pB+h z+ps?)?(E+qp1_`*cpH45cnaPl-hlmm;t}j05D#I$_v~_fhOoav+}U3x9>Sg(;t{w{ zJO-~Zhy8WpA?y!`2e5yEcop`C#GU;O;y&z&h}XcI!~^ga@om_j5D#GgHt`zlZxhck zf8QbQ>`#gJ->mgzm$(NzJH)Ht8SxbM?-8%T{+zfE`}c{rVSho~+213c!Tvt+9DG2$ z0Ixi!9JgKAUnTCt{u$y`*zXe$VgD>~XMc@&8}`(Rr{Dqc4tPksiv6AjbJ!md_h5gM zc>a*aLrmP+-y$Bto`iS|zD+y<-yuE=`%~f`?B6Bc$2wAncpLV2i97o<;x*W_M?3(} ziHG0?@c{Psi1**9{_GPkVE=%42>ZR~mgCdeUm@>~9cn!~TeP74|oYJNskeRoK%a z?t>@9Yv66-Iqcsd-iG}t@dWno5^rDA`0o&R_IH^#R6Zl#2j3&^!Tx>XJ=k9mPhfwK zcntgd#6#FWAnxq|Y>WgZ&|KANDthS7Cod+}YnGp27Z@cn;noUVv{CclYzOiFYn) zJnsUJb|7);(Z+F#G@BzeDsLB`-t3i?tV`Hv((N3$yXm!UV%O* zpZ!PWRpQ_EN|o@5yL4xX=g?mx-f5}+26M!Z%b&9+{R)+DlKd-XRU#%HBi$D90O_`g zJNrAtogccyogWI~PEU`xv%gQ=*cnvIUrs`94-(q z9z}T(cm9cpJO9MQUAise#dX!65KoZqE^(*F<&Wc}OY+Xo8SysK-6QTJ-F@OSxIe5Q z-a&iPBc5V^txvr6h8cTb(13Uq?V%86Hgvg|D?o=H!ANC55Y6yoeL_T6OUm} zK|BTT6R*BT?etz;E|=^xRDYGY|Jj;fpLh=aHR9e&;eX=ME0u@D`=0~<6OY#6f8u@T zf8x;#;eX=cbCsvW{bwuh5bsx&XT)RlcRBNUl`n`V(9~gX+nN z`}Zj?i02P0?-TEAD)&By{QnljKk)?ZgHPOlROM^LJ8yfQZI=S#)t6{_g~V&mSNVu| zhIC`%ebkE<@f!TUP278}-rw6MzW;0bo`sZng5zD{?RUS}=Bq=z_It`R;{K~N-F@N# zc%OI#UisK^xdgDkO5EA+6Hg#NOWeuVi6=-mAnu+A42c(zZxDC#P2&Em)ekXoC!Y|H zAiquA$?p(PA)gX=@*U#-zf*g<#GU*e@eJ}gaVK984_>4Cd&Il%(0CgV&rn{TUoLl7 zURB}=^v@E{z-z>vo`854@wY%cc#p<&NZfy)@*Uzi^rXbI-%|Nq;_W|B-Xq?Fo<8x~ zzRC}X_rdEgDf`WXe*@zFuc)2{;+@}B-XJ~$JrVKRyHvhOy!u|{E#fukNr(sUQ2A}* zVWE77_yY8##1rV*B_992>gf`XpeG}qLC+rX9D4SNx1gsW?!8mf?Gdj+&wzLvdc2pG z%Q1kS3h_SL+Zp1!(Bl(Npl6nN2Y#*-&!8tD?!i9`#A}G>2JwC9iHIk;`lm@ecJV{J z4?PL-0&%!aJcphg;uX}N9&sPMPdrC`84z#7|CN`O%Pai^ZTEcQ9*$>;ryu-3?A>SF zBURb>@mXrk4SK{TR|W)(H| zU=4_pwMG$`rD#?x*`);(`Li?UOn$jOIWPb3;Kk!}eK}lnooh~JCg;BIBs>c@IQ=S(dDR+f;)N#wg3o5P( zk4{p37H%D$)ZY|7*fp6?Tl(*l`)p6Rr}9L?0~HU2>%aTU>@eB4Nae{2@2daa7VaLA z)b9xIsrp^v`tKIY!b6p(B0Q(!ns8lzAlyDOsiz^lq~fMGfj*Y!ZSyJg}-;nvMN#^XoATRSJ?tsN)N*YNAf_^fbUPfoa}>am6Qwn*~lg_l(9 z2=A%5C|s`-{om>RE_=fye_4z#spERWbss9ibswt2bsuWNTZbmc^@Z>C;iR%axURn; zJe-;235C0xC*BpV^XNY5J`4{_#`nee@2Pqs;f^})KzL6b*V<`vJ?P`+gzJ9V!gW9M z!gW6#;kus%;kuuma9vMDxb8z$xb8z;ct^#7@QjKZ!u9b&;ci}CSA|>Z^`?)b&sS?x zb$-S8PB!tLaNXy=aNXxfxbE{nxbE{%xbCy1=ArA<^=E{;s{X9-j=ByMgzG%IPddLo zUqvxqpRbbe-rJJ?l!d#hZx!J=)&HvS;d)7)ns7gtxG!Ayzb;(&KM=0_9}3s?G=-Pe zPmbFXo>ld#P~(3o~rOjotK($TlFmv zu8-RkuKU>%uKU>*uKU>$uKU>)uKPI@uIm{I*L|>dN!F3>kM2WGcuB>!@P^8p7p{-z z2=A%5D7>y-zxp`39&3~2e3iv`PhB58;kwTi;kwUN;kwT?;kwVhaNXxXxURn;JlHs? zKNKFRd3A;BJi1T15Bhxd#dv+bBH^|=?m)Pwjyn?GR{gisbGJTj^{?AlEC0y|50vMG zdr>mp7Vaz03wM_$<7>jRM&|{}GCn8VQ=S*zQu8VZw^Upb9;!T^aGj?rT<57vKU%#%60Y+! zh3h;W;jYTl6YeYTOMfbP-#QQ;s_{eNz8Y`sKH2Av8lM$jRp-eTuHSDKgxkj?eJBba zsXEHi)%)(Ma9`!A33pUn7q06Jr2j2>9W{gp%0uDalgap&@Ve?lTez+AbcDOg`@;1) zkA#Qnd2ArOqkJe_U(ZLv_4VA^WAgm!>v>lAK+P*ByrrJUY~elSdEvSqN4T!1AY9i| z6rNSw9Ip)0)gV&XmF)zgwZec@SE=Rmmb+fcZz#*c*i&n3sToXK_D zQ?K8w@UA*9IpMzQr!Cx5&y9KEp&IW9@2K&v@JJoED7>ojl!TX5p0e;jjrW8P)%dD# zeSfbB@2LBrFTC}yq@Q)+`u^JxuJeb&?Lm^KDcn){Tf+M)ZVNBYPR?sjxPIQy|6Th0 z|BvLjkr*E=OMD<)&ub{$e<>M168_)ok|SkQUHZ7Xo~&^H`6N$Hy6TTBT<6jA*7^OH zlRPCc{w6;eQ5J5gK6t{jst+~c`nZ8`-JgbV-Jejn?oU^^&fgQR=hYXk=QR|b-z!-U zBjLV^E%onp-_qj=Z>ZQ7UQy3&`ZzjI=buUc9Wg$u&Tm1u?wc!I_pK;g_pK~k*W(E< zsd_5Hvwu(O420`Edfs|oy8odVulwH=9;tQJ5+11Ic7(Uo`Z}N_Dz6F;Z%fAe z!ku%}`&QvK6^Fu0U);`G`A<`LRe4*urMx5D`+Sn8E8JJ!6CNt>3wKohNVtE0l7ApP zxG(Xc@S*aN@Q!k8pULxXt9mlR9pzc!uBtO9JgeLmZY$3V_f;;nsOc{y@0S9||w3@onKce@A%lCAA)e+sgaGiz<$UM=R8M7aqQ#&b#p8 ze-pR%ojkufe@3{k@@IuRD!(mV<#&Yps*ZwmHD6bF=f$MXlJJJgQx)E8CgW?uoi8OG zzI}4O-Z1g}ev_{AJHo3fe?fRj<*y0%FG<#qFI?}d1j0LNd_%Y%-xO|Ln&fW@*ZYti z;jS9r6&|X%FWgt-2g2(r9tqd`W7)!FKdsA>I&I-S_1`*dw%$kHf3nZIep`5` z@;JgHmDd%n>n{tpuT1Lkgy&RT74E6=zVNo{e;{1f-xMCHJZ<3>6?cW}`Xk|9EvbJX zJXG;Wct?%T95C5uy?(O7OMluveon{(^01xTVIs!foYc;h|a&p77rGJH+)= zggd(=UKOtQGi$=D{bXLgaJ`=y2-oYgA>7$EIc_MtmruMYT-VbQuIp(F*Y$LT>+4%j zxW8R;+`jPYPKigtbv*;&dcSulT-P%a-uZLV&&+|7>q@^avcl~hlX`N(gIyE1h3h)= z!gZaFa9w9XxURD(Twk|K!b812gGQKH2 zO1v$+^L*kR;h&9?_dz}3`nY}J-d~bDk?@l0L*}5#^RDw`g?r1AJUQVTFHP#Pg?H3( z^U~FEUE%t;o^aiVig4YBK)BA+5U%SFh3ope!d-Pg>PcUk^r0_Zt%redUH?$HuHSmc zWdHSXGs1nfPO`##YF!nC>pZS--G`!Z-G`F!NFBEu>elh>mwyr=RPg@;ckc|76zxW4eJ>O)<)?n6ts&eImI>+cBH z^$&!1)$4I6yrk+M32!}@%qw&7WS@2YS>d{VTev=MUieU52OQz9I&N9G&f^K!eW(c6 zeW(f#)NyOVBekyT(pBFA;VnD4UpJ(0m3Syz-^ZK6_47|lxW12fgzM-0u5fpok4f^|!vFP5@_KZH>-r1A zTN@;KT;ZjS6R!x@d8)#LBa-no;TJ!f)Z+_xW+vn7!lO+R4~6UFwuS3{c7*GGc7^MH z_Jr$x_J!+yT5~4Pqpl|-T=yX>T=$_MyrkZDxx(#Hay=;ukN%r@Nx1GqS-9?lCtUZT zB3$>ODqQ!$7q08C3lCpT>I{UpUQN6$T<7Ts*Zu4Y*Zu4X&%Tu8?+bVTllVZmejhy) zK71n?KN22po~%#nkjeF+`=1f6-*;q%>;C72>-Qab;kr&oxc|ST&Vq1zv!u?FaQ%M2 zEZlz~$>RwRS4;9#gzNcMh3om&gzNeG!u5RX!h;i&;|9WSQqLQqa6PZ4@aiy`S4((y z)g*skxXu#^&mNnM9|&JvU2liNhs)La5ni2<cyHQ~BWU%2j1UAXQ~OL$*h_u9fsYbE{Z2+yvccvraYPfxh+PhYt1Pb6IT zXCPenXDD3v$2xTKJnDI6g!k4|=UuqJZsG;uI*%({_qixs_qin8T_ed~79Opgct!eE z$v$CCxc$Mz>%yx?C-ZLz*ZY|*;l9e#5nfesPq^OC90<3rPU;y7Z>rcjZ1TLgYJ66> z{`rC}T-RR^9;!S=;Ujh2vUL6XuEMPksXhyLR9qMCs_}tv{e73A@KB9!3fJS?!mVqP zdOE`O_?~cmzWTz0edhcljG)u z2QMY=2-oYUAUs@_jCX~5Pb6LxuIE(}uIE)2uIJ?m@8pvCR)jzB@8r3#8 zGbdd4(-yA#Sro48DGAqoC=1tp@P$X}`cN0{zmW7H5FR{}ctg1ELnvJLp($MVp(R}R zp)FkZp(|Y1-xD7EJE^lTeQDxWaq>LsJQ?A-pIPC$pE=?F@+7}4{i(zq;rjYq5I+2Q zGTs#){UY(QaGl2!?x^t<;l6TTczT@|ZatD5HxOQWH1SY)XG!8s;otgK@_K9w*T?M$ z4SYF*h!Or95= zCof$0!4abMo**0t*SM|h~*7p{M=BM=^`@u6`0x+H%~cwNOE;hu{7 z(p8>;@T!VO!u4}w_Q=UTcT^r*cu)QJj&S|lTNLj4$-GL!Gb;9k>pCmK-HVd@cvX0C zapE=M`o7}}*YC6H!u9*ChVZoi!gU|I!rjx8dV0cJ7bM;nuIr41>pBO*b)6&Ox*qGO z$@ADdEjeyRxO0Buw(yL~n-?CQmyCCW56?`zAY9MO6|U!16t3r05?;C{$zK+J(TmCb zq9R<^Ulnejo8+kp@0^i%C|u`h3iq!}# z`)R#*^1SPQW`yg0W`*m17KH11T;aM8Md7*+RpG8$S2gLUCVlXQ2PY<87q0sd2-kgR z2-kfGh3h^vh3h`Fh3on|!aFA?b#{eYCnP=;uJeq9>wa2le3%_>ypazw?CKHzvoe2-o9l!aX(K7p{MADv++mH-ziI zV{HnL)cCe=`=+GMj_^>$J>i}j-xsdO52UN{L*XqITgObkej_zLD_oDagW_r$`bWY$ zDo>^~+2^(zmlLk*cZ9niN$M{MAF4b>;l3JQlCJ(9#1kH>@m1kkB}(-$77cp$u^#t((3f7d^Evj6t2Nu3$tdVEf}UjIem`tLe@;a%0Y zmhkM|$#rrdJW};o$4=Ji1*%TrMfLf&IpO}j$#_S2M|nxOK93dQ_I*j7n((}e>%#SU z42AnDPgA(3;KA+Ut7p}(-ghy(8=D5i|>ps}R-TPHPg-0r{D_r-X zEId?sJmEPNSA|Dvd`-BXS6z5k)e{K!cFM=U-`fyARNfTsZ-s(6y8gQGhF<5wvwJ3eXb88|yqdyw{Vn0T{*G{c+^+DBT0cGE zEmhA*xXxppIN4|2hm3IDhph0bI&MyQNgX#YJW_pggxl(MR1hAj^xn|UfL}=k9FbRuIl^>w+~4?6#lGQ|1IJAxNYHQh7Y#dcGCm)eVw7RpCK4 zabLK%QQ~#s2keks9~#2-aYNx*b=;=#j`E&xou@B+sOpS_w^Tg?>8d|N;f~6aIc4%Z z>f`2x>pnQbbsx&YbskT+uD>E&*B=P)s`b|p-dZm?FQM>Y-NakMb^UGOy8fcXw{H%s1k2=6_beEwle_)z8P3J=xy zTlIze?@P{C{`SfFR#ly@bd{$leE4e8XHU4N@>hgg>T^gM!Xq`lBiuSYsk1M9I5X+b zP`Ll`b>hC|J~}xs>$Ayu$qNrv-yGrkdshp>d+NNq!acQ4s=`C%zVP4)bzcx(Rr75M zchzxQ!rQwg^Xv*Qsr4TT4^*Ck@RI67_KwNEwbb`H7KK}CJ(PsE)b{{Zg*)3P&n-3K zEp=R9cxk<4UDbsxbx_?@%qUGlYP*!E!;gJS#OT; zjM|TNh5zwu$$h6N{Bh+a;ZG?q3x7trC;V^9E5e^wUKPH>Me4i=|F;_N3x7#@U3j*Y z%qtN7h8o`xzNQ)<3g1|HQ~1`(Tf+BH-WEPvc}Ms@%Dch~%6q~OQr;KtDvyL8s(c{4 zsC+2=DCHyJCFRz_$#rtFb#YJ5rf4a&>H?^5mw|D5uQ@GmQ`3U4c~3IDNjU-++-*M&c+JPAkaAb}Ey|0+=U0;cmxOP$ zO5$bVkDZ;kC;YV26R!yWpL)Mv6@JeJ$@rS^GcQcs7rxp9iPweirPsgk9n|=S@FVp4 z7yixD)cO~`v6mdTC46{l;%(vkotAh<_zCKM*A;%88s8Issq((?N0djxFIN2=2ydwK zJ`{eB@{#b(RetNP$@PEvs>!@E!dIP_cvkq9s{c9RpH|1Ug}0RFg@0GMBm6Pt1>t{I z?h1cSc~N-zJIQ%32|q!3S@?PHN#^Sb|Agv8Mfe_Sd{y|>_a(=z2|ri8?tJ0(cPGcK z3tyq;6$t;K8s89p#Q8~{Q23had^Lq%@x`Rhmhctoy3rPX`SnTuj_|MDo8;*Ve^J%n z6aMsbAWQA|0 z*T3+WRh_o*wZ5L@&kNsFxg&g6Vz_Xq02 zt%b>P1K~C04dLf}L9IjK)o&#G3{Bzo*Awpu-~YIzZ(ZS;FD2d+{z-M+?h9Y>-DG?u zysPeC1K|hUmDE2Je&_d-JR{+cs65ukC)d>-YJ5ic1M0abE4-=xPB16@Nmais{C1T; zFMNCTdUS-}uksg!KdS0?h5uT4QFu>zNqBl)6|SE*JmHV4JQd;lss2}m>-A7GxG($( zmA@`LQXU9DdY|OHH-tZ<#)rc7{iP{fU;kUe)9b2meLd_5*VnzSaD9F23D?)LzHohC zi-bS$K(d|(!XGTE^)FoC??%G)d9m)ET>siL2G1HiXK>r#d4oF!F9_Gqv956a{8kjM zpO;F)_49LCxPD&pgzM+wittaLobY__{8M;UssLK2;V??R``a>bHX=KZVS&T&kNr|xg&gQ+ zy$@LtuJ<9U!u396O}O5N^o8qv$hvU74;cv8`;ZOcdLJ?ruJ<9E!u396OSs;LYzx=> zkR9QAAF?Z4??d*4>wU<+aJ>&13D^6O1L1lfawuHyLym;&eMqY@xt{etWJb8&hs+As z`;a-|dLPmjuJwU)N6R!6m`@;1;WF%bgLk@)NeaNA3y$?AOuJ<9WPfo6Xy$_iYuJ<9c!u396PPpEO zw1w+^$h>g959tWk`;Z0UdLPmiuJ<8}!u396Nx0sJEDP8Bke+b84_Ohe_aUpo_4|UF zaQz(R3)lOQb>aH?EfB8vAsfQ=b5|%_??X0)>wU)N7OtP8I>PlnWLLP}hwKU0 z&u@LtF9fW`yf~$gFU^51A9L_aSZJ`nftU zT<=3V!u4}?LAc(BbcO4E$f9t)4_Okf_aV!|^**F0T<=3xgzNW-RpI*ma!t5?zvc_q z`;c|v`h8g-T)z)(2-o|Np>Vwq*%Yq#AzQ-rK4e?C-iPc6*ZYuN;d&pkCtSZ@?hDuZ zkdbix{%9av??VoS>-XIw;d&p^`qbq5*YC$O!u396R=9qjo)fP3A#LIM{d-=x-iLIA z>wU)d3fKFPMd5lMvLsyZLzac>eMnEZeqS(BzX!F(o4@tYT|55Ohxq@L)ZgXL zcr!XHV_8}CuX5`5h*pkY>H43Djyy%=slE9tFRuCzh8Vxn^*=fF`#dZ2|7_*|QU5q_ zANkA3@2oklvy1U7UH?;5`>8AEwedPyEh|_nSwGSnyH59x`n{2rC7ysj^x#{-gKsDM zrYrNWy6U*jrolS~?;Ct*@JxI9aczSa3|=yL#o)fdE%o@AXmHQqg(s%xDH*(CaNpn!gZB+SG2>Pg zkCW?A|GZ0j0oQF_KT8I$7`$chuED)%di?`~SC>v7-+Fqwm!6&O6@&W*&pbChPto9> z!D|MuE}x#iZt&3HZG-m=J}|hoVtPF}gF6N<8r(B@&ESE-n+Eq@nqGg+;DN!L2JaZW zZ}6ePGcQlC(>8d);3b1s4DK7eVepp0y9SR8J~DXrmFa!R8{9Q`+2B=!*9{&TylwEF z!3PF!y*_=uU4usk9~nIRzv=n&26qi!Hh9(Gb%TcnZyUU4@PWatH>S@wXK=^hMT2_= zuNgcrc+=n=gZB+SGYw*b6nboG(ZyUU9 z@T$S<1`iG1Hu%usnbi&T8@yoflEE`;81fsuVDOT`D+c!s-Y|H};9Y}91|JzbyXN#h zBxZy8*FuCUCnKaW$o{{3$0 z`f~@R>(5h^URA#*E?s|~pLG5CcGC6d*h!BJ`NLzT_bp$V?ykYR29FFrGI%t1`f*1F z*Po*%=c_-rNqXzp>G`_`*Pk~d^Hh$To=1P4iX5*$2SR%I?eY7^r&k~U+^TKx9(?0f z#^W9QT!uct_`k0_xcVoD@pKRVbv^ja|E(E3fPWPAbm2e3&*^&b9r5$NKKw@f+%STF z13xz$zvi&jEArnV6RizX(5<%)@_;@eceV zbpMV>kwZLk7( z9p}9P-wEqEgntZuXu@B|0b1}KQGXjg1Kxq}hCE&PF7O`wT6iD+Fy&(C*9g8J@>|~>uX7i9GVq;{Ckx*Tea^uhxDVeA{jb9x$8iJrS8?11d^WrX z|0BE)Ux0cd_+8_+Sp)cb$TNf&Fn$Ez3gdI%8~5|?SkE^6ujoS_ek<}g@BsZOz&)Ht zAO0!Kw+^3&dII<-Funob6CT3PgE!%upw1Tj6wKH9{&Hc%^eXD4XHgHmW$^Y-#`SP~g!<`~pHCkj zU|t*_>^pwWq31B)7ct)==1Z?(zVsaCMQ<~!k-FFlX>UXANd8S|yrF<*Kf^P+bR-ot!3 zeuVkbeax5M#C#_l^QAkO?@w^u^Dtj}fcerL%!}SLcpvlScnkBQ*A3pnd^x^_`O*uR z@3naSRxn?BANA8C)K3pkC%uh2CmeOsUDWw^+()XYlOCZ?dI!g)7mDG_O_0Th@lio(1^ayoMIO?QVQ0Gf{y*E%NJ%c*wS=34IpicS#_0X%RXARt6LexXg zq8@q<_0YShhdx9-^cw1U4fQlp4?Tx^=r-!1_fQXggnH;c>iHn{fBX2kh+apX_u+cgMxFFL>ZCiUlOCZ?dIt5-1JtuW`qn``bO-g&3#f-a zKt1#<>Y+DK587jOQ4hUbw%y z$v*0&7f~m@ggWWgFUISZo=2S%jymZr)VU?@YZ2vS5YV3MxFE`>Y?{g&kt}vvVJsP=kzM-q1R9kJ&$_mCG>5=Q73(XIzNr` zn?s%SI_jhkk>_&E*G3+CfIRdD=1VVPzVs^QJK>lweS|tISSNYZNpGM|dWbsdCDci; zq0R|MopkF5<8|^;oEHam(nHiqZ=z0m8FkWq)H&g(lb%7HAHemtfI8_-)JbolPP&IW z>2=gO;i!|IMV%I&pIy{RZ=p_l8+FnvsFNO`&Iw1I^c?E^9PSH6)JbonPI?D*(yOSG z-awrbjymZ!>ijy^X9;!EJE)T$;<)rY@}Gg%X&L$HUF4_t&3!5mucJZBJ?=S5im71T-ZqfUB+I_UxGq_ZCVOC%uO{CmeOs%c%1W)LBQJ^bzW$Ti9Qvw@@d&k2)tDb<#c5c?jN@1*ns5 zVPBD+L7ntA>ZC`gbHY(4y@EPFhWl>=b<#7alb%JL^bYEz4^ZcXqfUAib)JIjWQaQH zS=33-p-y@ib<&5ZbHY(4y@onRxUV%)Cq0Kc>0RXc6wb>CdFU?k&?}fPJ%{~6y7$QV zxsmSfH{SoD_fY2|T;DAGyntRro%AZ|q}!;IUPL|gKI(Z5>m-AE=q1!cuc01#9`(?x z=o`I+I_VMW{65x67Io6gsFUuaPP&6S={3|zFQZQS0CmnpKXa&)?x9Y49d*(RsFUua zPP&IW=|j}{OT1oe)JdbV@xr51jELGPg+dJXrrJ=Yme zxQTgPH)gAheLT94c}+O>rRgo?zZCgBhdw}_)6s_p^3aDE{{h@jLyV_)aa{Tc zdG^Njs);=G9`ev#Jm)-!*Y6N{=sDak=sxn?g+4gAAJNOmL$4!G4X@Jz^3Xlxp$Et_ z6a8_Khh9M*dKY=Vir)vTArIZgI-h}l_As74!g1+&pVgp zdI96tLH`FBPj@jshxraMo}NRUbPvxb-@@~71-=vN4{^P6aelM-oEdtA@mFDedcPb$ zC(v#9tC*LqzVB;giS(@c{-%{LX?ln}J0eerJoF)a-#6>jpYv10=b6yk2JhqZMmWCp z`|*6~9fRxdy<9n8j@RE~DZTUf^!z=8M+P4n-1^J({8@wB2Co^sZt#Y|n+9(iyle2j z!3PE(89ejE^#0@wo;SGv)bu?1d(q{24-MlZgV&c%&+p;$CAi+)*Qbv!8Qe2?)!@Ft z1A~VKAFeWff5H0mt4{Zk!3+31U*;(qyl3#p;12$-kojGMmkjP1ylQaY;DNzIgSQOc zF?i45k->)sx7L|{9I2JacXZ}8go(~s-m_0IZR zM@}Dajn=D-Y|G*@TS4r2JaZWZ}9qK<8^rQ%8P{h zX9UmVb?5cQI;>x!Pk{s29LdY0-*z4^aYgSQP{NBztb zpnm!Q_0zM+{~pv+GkC|~0qS9%2I`>?Q4hVmWPDzpz~7yD@K59ZQh|RM*X=s41N17! zUx&ZTtHB?`zJw3I2FI<#YgmT?{7&4b8t_@j6TV5R1MxScpv$hXMpi{V%-km zC*Zt~;B#@ltly5;+s83J1K$JQ=fqHj&O zi{rN7d*b}I;m_l^L--fqBlrx|Z()D049~!S2+zVlgnDxDo6t`iejetVhyMfaz*om{ z3-B)7h3|?JaK0+=eUPULzaD+A!Pm!lAHEIhufummJpueT@CN)V zIBp2v1?Qy+zaR5z!LLF+ZTJJo-+})bKEnI!;7!;2%nshK(OXZ9uVeHf_V?)dX!`h? z!CMBmuusVR1%o#X-ZOaS>FIU42Co^sYjEqC>G=x=uNu5*@W|k~XQv;xVep>8?dPWF zv9NE+^HN!T{Jw)87`$!p$lyJEejW4I@VRRAmcau&Z*zRt;JF>9&#PqcEcW-9zi4pZ z;3I=O_}r?A{QFF=vxlF%aeSsQeSF#Afx#n#=deG?<5mnF8oYYw^g5dc9~s;^YUj|`r}=P5Byxjenk zfx+$m_&W32n&TT`Hr<;BFKs@3d>7Yk=C==+KE7yh@4)HfTLv#5G<|$z zaQ_|C$M+0gd*}4=*1^-gSe)(+gS&@MAKx{&ef;$CRfFeFm_9xO!AAzqu9#j=-r%mm%LcC+yl(K&;BA9f@qGvEXWihT!P^G!8GK-H3*S4ydU6JL z3|=(2XYiWA1A{jW-Z6OJ;6sCFUYWkGY=ajJUNU&a;J(2d25%X>Yw*b6BZK$x`yN~m zng31iPr=|7gEtJ`HTcNj`8TH5Q#N?r;BA8s44$*b*H8ARXz&2~7Y$xBc+=p0gJ)ixe%yk=D+X^Eyle20!SlEtvJYj0=SS1) zFB`mW@V3DR2G6}Z{kTPg*9_h?c;Dce*QOu0VDO5;8wT$hd}Q$af2P+{HhA6OZG#UC zp8N0g;}#8GGkDYBeS>Fk9p?Hh7`%q-563qR-Zyw=#`wC#JOzVS4Bjw!*We?A=U16t zPubvggSQPnFnAe1A7>w2T!-nQ!FvXGaNTAeXSMNsSHt_t5r01lo?mx7{$~7qylhW* zYu0pkkY_FYoWesMdIovu1>_mw=lB)mp=XhY?jq0icwbya9(oRW=tbnYalGAP*%(hR zVf-I(Tp!1!=aGlr#rZ-TtQ_)q$X|p126fiqAIA9hw&U|y$M_=F)wMW}KKy*-X<=XY z0F1Y>4@S>oALB#VX9%%BMt3m&Fx1(>czOZje~5az7*BUG{uGSwVLZKv@q42FKE~5a z7(Wa7BaEk)F@A{snE}SrJ&gYl&dU(v=@pD$hWbYsPp|JiUMGLUb71eb#8+NQ=vC~i zFTnXK-#Q*oZ({rm)L+K$S&eX95B>!DS%KezJRSJ8=w};$PqZKMWU&ALGV0I5cSPTY z_&v81QKyUbKNCK>W!wi`hAj*I$>F$p_=#`_ekR<7UkES3uYr5;o8cAseQ+QCfA9eQ z9e4x&U3e4TgSX)WcnAJGybJ#qya&&s|9$wz@Cd#gd;Yw)`<-iJ5f4fxODA^Z_|6aG7R8~!JF2mWXH z0B+&+ID&5oxA6Pw4m<;YC)|b~2`|7a@Dlt6co}{dybAvjyaxXX>Egc7f}e%^ zj`Pj&_)SoM0e%+p1n?UAocY!`&(APl2ks+}3;!JQRNxNk8NfG2|E+J2k9#5V+wc=G z-zt0y`WZ?8R~{0l#j3&4X3K};@@CcHSe{k@$F!^l9OYOcoZrLJgtHAT__}zGYQxuq zci`*8yYLO*J-GfIx|RRB51)zg5qv}V0KO4?2;Ue!f^P!1yz%*Z8$1Kw6rP1|2G7Aa zhuiQi;Cc8~a0k9Mya3+@?!s+&5k3oEf^Q2i!?%Nb@a^Fh_zv(Yd`EZhaU^C!;gap@Z;eP_zCb3eiFP1FT-2#li_XnDew;b zRCpJD8oUR8AG{Ag9Uj5YfDhmvdi{2X`|el9!*ufT2i`S3ja z0=NUe2ws3+40qx0hZo^hcnLlqUWQ)+_u!YoEAY$VRrnR~8vIJQ53j-N@T=ef{DbfY z{Azdz|1i7>zaHL#-vDpJZ-RH=AAxt_x4?VwTj729ZSV+wJA45DD0~RN13rQWaOybaI6zX!MB--qYnKY%;%AHoap z4%~%51TVsW3@^cd0x!dV3iseYgIC}`hgadhfY;z%xDS6AUWY#d58#i&8}MJjL-=Fx zCVUCJ1^+F)4gVdy1OGj|3;!d$2k*oC@IS#L_@Che_~Y;){4ekk{0X>q&UpPl3D3Zv zf@k3oJO_UoZo{8}=i$%79r$zb0{pLV7ydVR5xxvwg8v;}hW`WZ!T$-b!2b=e!iVr0 zd^y~QuYlL#FTex%OYjE#6?h0A!JF_`;Vt-U@HYHE@DBXH@Gksycn|(Rcpv@-Jc7@d zG5!|=_$u%rd{y`ezB=4Gcf9`BfM?)q!n5!UJO^J3Zo}7x=i%$X9r$|i0(^bA3*P`< zgl`Bh!8d}J;hVrc_}kzW_@?kGJO{7AH-r0devft?zB$GR@GamC_?GYxz7@O)-x}V6 zZv$_`ZFmPh3*Loq3-7_Vhxg$-z$5sM@BuszAHsKrkKnt&t@Fm~e|LBWz6U%DpAFB! z_kr8+ec^fd+u;s;KX?INfV=Sh;YIj?@DltWcp3f;1|Lh@QdLg{QdAI`~&b7yb5o_=fgYjOW`o9LAfnNvD!hLuS{$aQczX6_y-w1c$ zH^B?=o8d0J4llw#0x!XDftTU8!aewH@Cy8PcoqIpcnu!FefUCn9ex))fPW0$fPWkw z!aoUb!ta5%;Gc%K;h%wb;Gcze;h%%|;32#ZUj&cf_reG8``|3;6wN?;3Ie!Ze2KD{}016@L$5S@JHb}_^+|vY&yp0;g7)`_!4*l z{#&>U|2@12UxZ(jDZ&4M@n!fQ;U2sXufQLNSK)tw*WgdUefX2`I{Ybk0FU4e_)>TX ze;VF|KLc;UpM|&K&%rzJzrwrlYq1`B@Bzm6;mhC={CW5Q{tx&N{xA3l{%^Q-(Rlq2 z;TiaHcox0_o`b&tx8X0s^YEA94*V5(0sbo7g}(+b!v6y=!T$>{!(WGc@c+Rp@ENO& z?=MyOD)1V7Rk#md9bSj82@l{Icmuu`JcO?eZ^GAsx8Uo-+wk?_9ry}aH-lRjkJta^@Cg`Wto!B2ww z@G`s(KN%jtPlY$&r@=$```}IZ>F^f(40s#v!8`DI@GksJcn^LSybnJc9>LFn58&s* zhw$^@Bl!7n>jUHUe*ruLzYv~m(;djDE@Q=Z*>UjNs9G-#S4bQ?q0nfo3a2x(f zcpiQa+<|`zUVwiF?!rF{FT(GGm*6w8Zp-k`W4s6F_l;KI_hWn&{zZ5V-h}(`FTv~Z zFT(>kzelnG|38cm;VpO*z8Kzue;wY2e*@luKM3!_zX|WbzXk8ZzYUMzZTJBG9rzIb zUHAz8J-9W0y#Bur&%l2O&%!(K9Q+};4gU!|5C19Lf&UC%fd3rs!n^Py{9$+r{s_Db z|0UdmKMJqFAA?unJ$Mbi1n$Fs1Fyq>3lHGGgE!#6hllV!yb1pkyaj(8-iH4L-hn>> z@4}yi_ux;#`|zdk2>vvD0Dl%fg#Q&jg8vO}T{2$(19%4hcX$?l5&m#42j}O{*zkWK zPaghHxC8$eyZ|4AG`^F1KxsLtB&`z+VEB29r$YSE_`)(555Mx56{3O_}cIRd>!}@zAk(O zUk`3wI$r@IHJtJc929AHes958?a3NAP{&)@9@M|8{r=UVvxe`@?ha1K~FOAb1}B4!8q< zC%gbZ81BMdco9AaUVu4i{3v(` ze=ocVKN{YG9|Ld0OYjc-Sa=tH9J~iV9^Qwa0FU4&!Uyn^;6r#BK7yYNw=N&A|I^?Z z`1{~l`04N*{0z7a_uzT>nQ#Yw7Q6sI8}7o-ffwQD!b|W9ybM1d?!hmBSKt@ItMH59 zHTcDFAO3!L9sU7$0I$Lu@cHl%ehIt@zZBkrUj}c(FNb&FSHipStKdEO2jPAA)$j=Z zA@~4(4SWc{4nBhWaO;Zk`dJ&9{3f^qzZqVDe+2HrZ-E!# zx57*C+u&vR?Qjo%2fP9g;8plScny9h+=qV*UWb1i9>DL0H{hRuhwuix3I8O#1-}R0 zhJOm)fqxd>g?|p-gNN`wd=Wf?-v=MSKMxbTXcn2QBAA&dGKZdv9KY_R5KZSSTKZAGSKZp0=zkv7QU3dh47(ReM0w2PE z2_L~9gSl4H{pMSx8MVK8@>$Q zfjFTky<#_Rt@cn1CwJPUsro`b&zx8eVR z=i&c_JMh=x1^EBqF8mF65pJzEUe6`?D)2IVRk#OV4PJq-0k6W>gxBC1xDQ_oUWcy@ z58&&<8}RkuA$$XP6P|^);2Xl*@QvUd_{Q)q{KmD${qMowhVgy)rtk=!gAd@F!H4k8 z;UoAKaO;EP^}i)N1K$dsh1>8Pd=}h>Zwt@Ew}U(I?coLZ4saK~BfJRT30{Kd;br*F za1Xu+13PKLnnE9}3UH4}<66?}pp(_rUY; zBHV!=4llrufV=P`;YIjS@DlvJ@G|^pxCcK5UV)e3Rrp+Z4Sp=#haV5G!%u_<@RQ&T z_{s1Pek!~PKMmf3zYpGqp8@Z{J$M&B58i{H3Gc(tf=BSP;REV^Wg>fC2$vhDZB`O9lz&Of?tmDW%w0v4}K-Q z0{@za;XXWoFMv1T*TX~j4e%!XMtBQ;6TA(-8Qy`{;a&Jg;63;) z@IL%jcm%%K@CtkpybAw3yavA??!&(Tufx9x58zFB1O5O!gnt>{ zgntFzf`1j>hJOv-fiH%4;a`XM;NO7v;Sa(i_&4DL__yFg__yIBcpGkAJ6`|afoI^~ zg=gX4gXiGihuiQU!1M4Q!5w%9UVuLYci}&V7vVpFm*78zm*GEyd+?vbEAU^ytMG^6 zHTWZNAO1^t9sVdhfd2~Kfd3jE!h7&0dk2EAW58tMKLU8hi!Zhra-?!(W64@R#5X_{;DR{tCPaAHiGj zSK)2=f8ibYHQ49r!e7Vu9{hjsKKu=M1h-Zn?;{Q1tH6iwRpBG}>Tt^+um3gR8Tgv; zEIb3x!PkP@@U`K2_&RV0zAn4~Uk~oW*M}G38^BBOEW8Y#3HRU|!YlBN;8pmK@OSq$ z_{JFT!#9D~;ctTn@Ep7W-wYnYH-|UjTf$rLt>JC>Ht-JIhIirH!h7)T;C=Y^@Cd#G zd;s4GK7{AtBlym6Yr%N^?*h-jcZFx+yTfzvJ>WL{BHVZK@I5i!fjjU5d^X&L?*%Wy z_kow-Z-R8KNDVsp9QbM&xZT(bKrIO zx$ppf9=rj+03O0Ggg4!t3x7{8o4w zejD6_e-vJU-vO_}19%O-5bnc24zI)Sh6nIZz#H&S!bA8y@Fx6I@D}{j@HYIj@DBWQ z@Gd-r_uz}*efWLw2>u250RBbz5dJ0j2>t-vx?#NjzYNd7zXH#~{|}yne-&=STkt%5 zG2DTF9bSMx2zTM%gcsr8f|uamhL_=OxCj3ZyaN9&ybAvwyaxY1+=u@FUWfk>9>6>B z2K>kH5dIT*6aG_p3;r{B8~$^62mT9q7v6>U;19$5@JHYg{Fm?n{89K2{ww$h{%g2( z<9Pi)hMyB<=op`c_ux7B61WZj4LlG3E!=_s4qkx&9`3^b2rt6>@Dlt_@G|_*a1Z`C zyaN9Vyb6B;UV}dg_u)^$>+lF3z?Z@s@Mqv5{8@Mt{v5mo{~NpwUk2~M{|@iMpNIG0 z|A6=5|Aa^If58Xvf5V6HCx6y#8N+XW%cwv+$STIrz(P8~zGB4& z{57~s$9_u@{vV7l!FR;_@iP3s81KPfhgabLgID2iz-w@8jqyI74_^gdhp!3`;H$$M z@HOBed`);0o`JXEYr)&_wc#E3I`A%hU3d?^9=s3V03N}!@Bw@#dA*i2`|F8f|uZ1!^`k(;2zwDSKzbY zRrt2>8hksr58obMhwlIn;5)(_@SWfxJP&WecZRp%yTaS>-QXSg?(i;r4|os0C%g}L z;1PT_d;s4IK7{WLAHny9TlMk!e>*$_FTk_#1K>IMfp8oC4R{{@4!8qUV^va zbK!0HvG5N3ICvL+JiG@#0p5q72#??=!3Xd%d~mn|EIz;@YCQ~`1{~F z_zXN(*znUaJ`XA);Z67@@D}`1cpH8hyaT@+-i2QQ@4;*EKKv?p1pg3x0KW!4 zgx`$!vm^Mm7;oJ&UjNs@GjJcCg)e~T;2(zD@ay4u_ziFeelxrP{|MZL-vTefZ-tlO zx53Ns+uQ~Z@@nR58(}X6aGnf3w{s04gVCp z1OGI<3;ztf2mdU*5C0rIf`{+{d=Y#IzYjis$Mx3#_f`kq>cCqac&h_%b>OWIyw!oX zI`CEp-s-?x9eAq)Z*}0U4*dV_zzZ8}{aW$*e`JccuKw`jyIRE?JD08UMz47NPcuJ> z5B&5ZRG+sZBXQc54alHJ0dcN5>UYf=; z<9JCLZy3i9rSV2_yf}?Fj^jmXyh$7{Oyjr3@q#qoG>+$|aW0PMrSWEQJU5LukK;LM zyhR+(PU9`(cvc#36~{Bvc8^;f&@pf^%IE}ZD z<3(w_LmV$m;~nF8K^pHA$Me%TAIJ03c;`5to5s7u@tic?HI8Se@osTED~)%L1&r0L>#_`NFK01zPr13Fvy!7ttTkK^)IX;|t?>b{bz4$FtJ-;y9j}#_x~g8EO21I9@)| z^RLG7(lnkQ$4k=qk~n@SjW3Pk#c6z594|`a%j0-q8eb8|3)1+?IG&%zwK$%a##hDh z+%*1R9M4JPtK)cf8hge&Ja@f~rz{AE4=AdZ)&@xnM>lE!z&@k42RR~#=+&b`HOn~tvFtq#*5>4Ng97W zjvq?nZ^ZH9G=4CS7p3tx<9J~je=Cj`r17`oczznU<9J>ge+pmy-h4zNDhnTx>?9|ESAeP%Ve(d-a)S3vSqU8k!+dkNx#SA{(8P1ogT~g{rSEB zc<led2!DEB+o%7Z1Q5@egpU zcs)G0!R`MBxK}&~hs8g_9pa5}tN16lN&GWhFa8Ct7XJ!Yh<}5F;@{zb_z&18-UNHa zf5PeFA=o4S3yu{J!-MPH{>Q}f{a3Fz77mNY!5!i);8yW?xJeub*NeA=tHoQv72=Ew)$BOra2M65#r@_7AbT};D3+@pA z6K)k}z)j*zxL&+BTrJ)Qt`JXvgW`SRfOtRHC*B|SiVuL(#aXaNJQ0o+9|#YA@Af|% z?iG9Cu=pUjLwqpYDn0~m66e76;zQwT@nLX6NA!XEKa zaIE-fc(C8?e;(W`_Q7HCF>r_YSh!U@1#S}O!}a3h;A-*laD~_p2gL<&Kzsu16Q2ls z#f5OXxCr)$Pl98`C&Po^x&1GOd&L1bEItM95T6RSicf=^#3gXO_;k2hJQc1Gp8*HO zXTkyTS+GxhHtZFj1E-5iVUPG+I97ZfJQ#8NKMn2`2jQ^ze7Hk=0o*FS5N;Be!S&*c z;A-*3aE161I4Hgp4u~&t`@I@E5rs4iX(79{2lBQ_rqTC z_i(y+0QQJ~fMdn$;lVX-|2M$B;z2kp{t@mFZ-iULKfz7npW%A(FL1T^SGYp_8ypn> z4hO`4z&`ON*em`MP8Scs9`Rprtaun6T=SPbd&S$q>EZ;~Bi(r5Cp_5W_CF2o z6{o{t@m_F;_@8jAI0J4HXTtU3z2R!{K5&J20vr_Y3kSse!9MZ+uvdHloG#9SJ>rRQ ztoT59@JqM<*>JDe3x~xA!5!j*;a2e>aFaL(t`{E)SBnpWE5wuFpm;JI5FZZv#7Dqh z@sV)4I2ZPakAh>xN5g~vb^D(O_lkXRSbPlJAwCvv6;FYi#QAW&_&B&)d^}ts_QOGO z0UQvY0Qrw#SnkVe$EJhxh`x zReT}bBrb#N#TUWV;)~%5@g;Cjd?_3dUk3Zcm&0E16>z$^9QKH(!?EHk;la<`{?CAW z#T9T^d==awz8Y>7&xD)Am2kcI8n{~gFStTH3l56^4F|;6!anhA*ekvcP8V0f9`W^X ztoR0a@Kd+{bKqWaH5?Y-2zQ9*!mZ+YaFe(Ot{2|~SBr0kE5x_JL2)e{5Z?;>#C5P& zd>foD4#6Jr?QpF44tVerxBv6uUU5Af7T*bXi0^`1#S7pjaRXd0z8kI<-vd{O?}dZn z`{021e%L2|0QQO>gww^1ut&TQjuk%y4|co#Uj+Axo8YkcVYoy52;3@u6mAkX!}a3F z;A-*XaE15@I4FJ+4v3$Eed4EKulN}_UEBhD#LvR9;^*MOkKO(+hI_@Wa9I32+#!Ae zZWS+qo5XE!z4%4ATKp1RA$}PSieG^P;#Xmx_%+xoUJ9p++hLD*85}Eq9UlD1?f-JP zSKI-I#c#kJ;uUbK_)WM;+zHo<--4^fE8z<9+i+0)4jd4_3;V?H!CvwEaJsk)_J}`# zW5xf02S0TCzY6XZhvBgJL%2iy5!@>N7;X}G!}a1%;A-)waE16YI4J%c4v4>ied7PZ zUh$W3y0{1Sh`)kk#jD}Lu-pGNaId%*4vW8rJH%_@R`EA*leiDA7k>*^i`T&wVgm=o z5jY_J4)%%rVXydmI9)sdd&ED$vEudc;3~KO8{l5?ARHF|2zQ7#!mZ+;;3o0UaJ~2! zxLW)xTp|7q4vK$=1L8kmpLi4O75@pRi-%y3_%AqCJPZ&1$L)X27I^*_$HHOpIJiT+ z1>7ng4>yV9;Ck_vaJ6_VxI!Ec2gO^%0r57lPrNPc6>kTpixXgvczZZjoCpto;PyWW z?iG9Buy_Z!L%bv0D&7fh5+}p;;+^4Y@h)(MI0X)hcZCDu-C&>iAFx-vJDe^~g+1au z;8^jV@L-qQ|1`K)oDPS@d%+#zf5NTe47f?03D=AFhO5QmD8d^qeA9|3#CN5bjiT-YN%3XT;Y4G+HO_CF8q75m_@_!ziDd@S55o&qgRQaB*K4EBjHhrQw};B;|0>=93g zW5rj(gKxY2p8@xZE8wvBD!4;@HQXwm2{(x=;d=2kaJBefaD{jl92EZ>4v4RXed5`$ zS9~3uF0O(-;_Km9@eT0cO1J-W;9hYx92VaQcZlc0t>Srbleh-17vBU|i*JT2#J9jf zaV;DW-wON0b+A`_8=NivPM?tsJMH{cHO3b)1;{U*dZ@B$m1^0@>a9I2y+#&u5ZWVtFH;KF9dhsW4wfIxGLi`yV z6n_o}#9zQZ@qb~j_)9ol+yi^WU%|2B)$m}4+y6CiuecWui@%0D#B1SJ@i%ajxDT!u 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 z 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

0i7`b~ayjKv;J(NC=`VSq$suZ@d*EW< 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

o~kW)%V>V}!br6h-_lB>~jd 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�ygmH920&R>*B18z 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%0D$e7ji`~`*B*@sF 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

5U3bhFTJ6WL5%bUyaP1oW)RWq>;JH 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