From 1168db11214ce5a7ad05f20e8c47b341515fe930 Mon Sep 17 00:00:00 2001 From: Hannah Yan Date: Tue, 11 Jun 2024 11:43:32 +0100 Subject: [PATCH 01/12] Added files for validating finn-examples builds --- build/bnn-pynq/build.py | 24 ++++ build/bnn-pynq/cifar10_expected_output.npy | Bin 0 -> 136 bytes build/bnn-pynq/cifar10_input.npy | Bin 0 -> 12416 bytes build/bnn-pynq/mnist_expected_output.npy | Bin 0 -> 136 bytes build/bnn-pynq/mnist_input.npy | Bin 0 -> 3264 bytes build/bnn-pynq/verification_funcs.py | 83 +++++++++++ build/cybersecurity-mlp/build.py | 17 +++ .../cybersecurity_expected_output.npy | Bin 0 -> 136 bytes .../cybersecurity-mlp/cybersecurity_input.npy | Bin 0 -> 2528 bytes build/cybersecurity-mlp/verification_funcs.py | 82 +++++++++++ build/gtsrb/build.py | 136 ++++++++++++------ build/gtsrb/gtsrb_expected_output.npy | Bin 0 -> 136 bytes build/gtsrb/gtsrb_input.npy | Bin 0 -> 12416 bytes build/gtsrb/verification_funcs.py | 77 ++++++++++ build/kws/build.py | 17 ++- build/kws/verification_funcs.py | 83 +++++++++++ build/mobilenet-v1/build.py | 35 ++++- build/mobilenet-v1/custom_steps.py | 6 + .../mobilenet_expected_output.npy | Bin 0 -> 148 bytes build/mobilenet-v1/mobilenet_input.npy | Bin 0 -> 602240 bytes build/mobilenet-v1/verification_funcs.py | 77 ++++++++++ build/vgg10-radioml/build.py | 34 ++++- .../vgg10-radioml/radioml_expected_output.npy | Bin 0 -> 132 bytes build/vgg10-radioml/radioml_input.npy | Bin 0 -> 8320 bytes build/vgg10-radioml/verification_funcs.py | 78 ++++++++++ 25 files changed, 698 insertions(+), 51 deletions(-) create mode 100644 build/bnn-pynq/cifar10_expected_output.npy create mode 100644 build/bnn-pynq/cifar10_input.npy create mode 100644 build/bnn-pynq/mnist_expected_output.npy create mode 100644 build/bnn-pynq/mnist_input.npy create mode 100644 build/bnn-pynq/verification_funcs.py create mode 100644 build/cybersecurity-mlp/cybersecurity_expected_output.npy create mode 100644 build/cybersecurity-mlp/cybersecurity_input.npy create mode 100644 build/cybersecurity-mlp/verification_funcs.py create mode 100644 build/gtsrb/gtsrb_expected_output.npy create mode 100644 build/gtsrb/gtsrb_input.npy create mode 100644 build/gtsrb/verification_funcs.py create mode 100644 build/kws/verification_funcs.py create mode 100644 build/mobilenet-v1/mobilenet_expected_output.npy create mode 100644 build/mobilenet-v1/mobilenet_input.npy create mode 100644 build/mobilenet-v1/verification_funcs.py create mode 100644 build/vgg10-radioml/radioml_expected_output.npy create mode 100644 build/vgg10-radioml/radioml_input.npy create mode 100644 build/vgg10-radioml/verification_funcs.py diff --git a/build/bnn-pynq/build.py b/build/bnn-pynq/build.py index 867410c..19fd22a 100644 --- a/build/bnn-pynq/build.py +++ b/build/bnn-pynq/build.py @@ -32,6 +32,10 @@ import os import shutil +import logging +import sys +from verification_funcs import create_logger, set_verif_steps, verify_build_output + # the BNN-PYNQ models -- these all come as exported .onnx models # see models/download_bnn_pynq_models.sh @@ -63,6 +67,12 @@ def platform_to_shell(platform): # create a release dir, used for finn-examples release packaging os.makedirs("release", exist_ok=True) +# Create logger for capturing output on both console and log file +create_logger() +# Set verification steps depending on environment variable VERIFICATION_EN +verification_steps = set_verif_steps() + + for platform_name in platforms_to_build: shell_flow_type = platform_to_shell(platform_name) if shell_flow_type == build_cfg.ShellFlowType.VITIS_ALVEO: @@ -78,6 +88,12 @@ def platform_to_shell(platform): platform_dir = "release/%s" % release_platform_name os.makedirs(platform_dir, exist_ok=True) for model_name in models: + if "tfc" in model_name: + input_npy = "mnist_input.npy" + output_npy = "mnist_expected_output.npy" + elif "cnv" in model_name: + input_npy = "cifar10_input.npy" + output_npy = "cifar10_expected_output.npy" # set up the build configuration for this model cfg = build_cfg.DataflowBuildConfig( output_dir="output_%s_%s" % (model_name, release_platform_name), @@ -86,6 +102,10 @@ def platform_to_shell(platform): board=platform_name, shell_flow_type=shell_flow_type, vitis_platform=vitis_platform, + verify_steps=verification_steps, + verify_input_npy=input_npy, + verify_expected_output_npy=output_npy, + verify_save_full_context=True, generate_outputs=[build_cfg.DataflowOutputType.BITFILE], save_intermediate_models=True, default_swg_exception=True, @@ -93,6 +113,10 @@ def platform_to_shell(platform): model_file = "models/%s.onnx" % model_name # launch FINN compiler to build build.build_dataflow_cfg(model_file, cfg) + + # Verify build using verification output + verify_build_output(cfg, model_name) + # copy bitfiles into release dir if found bitfile_gen_dir = cfg.output_dir + "/bitfile" files_to_check_and_copy = [ diff --git a/build/bnn-pynq/cifar10_expected_output.npy b/build/bnn-pynq/cifar10_expected_output.npy new file mode 100644 index 0000000000000000000000000000000000000000..f5b61aff333ebbde5b814829d1fe351eb83e54a1 GIT binary patch literal 136 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlWC!@qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= bXCxM+0{I$-ItqrGItsN4WCJc{1_%HEG&dV_ literal 0 HcmV?d00001 diff --git a/build/bnn-pynq/cifar10_input.npy b/build/bnn-pynq/cifar10_input.npy new file mode 100644 index 0000000000000000000000000000000000000000..4b97d0298dc5dcd129828db1002523c0e5016cdd GIT binary patch literal 12416 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 literal 0 HcmV?d00001 diff --git a/build/bnn-pynq/mnist_expected_output.npy b/build/bnn-pynq/mnist_expected_output.npy new file mode 100644 index 0000000000000000000000000000000000000000..854ad26dc9807e7d69154a77b5d60dbe3dfc82e6 GIT binary patch literal 136 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlWC!@qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= bXCxM+0{I$-ItqrGItsN4WCJdC1_%HEG*=sU literal 0 HcmV?d00001 diff --git a/build/bnn-pynq/mnist_input.npy b/build/bnn-pynq/mnist_input.npy new file mode 100644 index 0000000000000000000000000000000000000000..c512bc8dc0b16d60376f8816961a00f556c262ae GIT binary patch literal 3264 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+l>qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I$-ItoB!WC6mOItsN4Bm*vnQ7{?;qai><2&`~oV6b#%V2}r5aUd=L@&$mH zRv->&M;#h21oGVoU@f4002%IT1L}DK#1o*jGSHl4AO^W15lX|{Qw8LwB8l+;+0+0X zjtmSfK>HJbG{`+LoC9R90E*>6?Ysiy(;6%T+EEL%FA#_)0PUtF*Z?#?6KGF85QFTc zHDCnV1B%N$AU2?}eW19jgxXg@W4l1%#tOB|8b~j2plwJB0OQRUXio(YXVAfKe}Hy? z;>`?*X$__U?WzXaQvk#%H1^vJU^vDC?E(2s4Txz892^)JyrFhQ18E)_`%MC9KCIlF zMPs{u0K+i>>bGY=yBh3i8Ip*+2J#;{bq*=6D*^ha2YU6vpG~Q)G)mhYI2#LN+(W#lcB}O>q!gQgIQ%ckqGoYW9Qv;PY~BnuucI z@cljKrk~fhS2uSD#cT0aE!xdPSDlyD#qzY8mDO_9y>!j<{i<8E@-LgGO}q6skIlN> z>Z6lcc{ZOP&&v1mhrh$3_~I4I!gl z=hAp^bZy;;)Avl?kXELS_na&DQ8tvP-BjoHx#_v{I(U~IW&1{5AN5^3ACsjWG}tHi u@r4YXRO35(M_d^w?t?Fcd;Z^?Zvyo_&ZU{(^mDg(YaePqx{>q0-TMOlucg!g literal 0 HcmV?d00001 diff --git a/build/cybersecurity-mlp/verification_funcs.py b/build/cybersecurity-mlp/verification_funcs.py new file mode 100644 index 0000000..537993a --- /dev/null +++ b/build/cybersecurity-mlp/verification_funcs.py @@ -0,0 +1,82 @@ +#import finn.builder.build_dataflow as build +import finn.builder.build_dataflow_config as build_cfg +import os +#import shutil +import sys +import logging + +#from finn.builder.build_dataflow_config import DataflowBuildConfig +#from finn.builder.build_dataflow_steps import build_dataflow_step_lookup + + +def create_logger(): + # Create a logger to capture output in both console and log file + logger = logging.getLogger("verif_logger") + out_handler = logging.StreamHandler(sys.stdout) + file_handler = logging.FileHandler('all_verification_output.log', mode='w') + out_handler.setLevel(logging.INFO) + file_handler.setLevel(logging.INFO) + out_format = logging.Formatter('%(message)s') + file_format = logging.Formatter('%(message)s') + out_handler.setFormatter(out_format) + file_handler.setFormatter(file_format) + logger.addHandler(out_handler) + logger.addHandler(file_handler) + + +def set_verif_steps(): + # Check if verification is enabled or not (using environment variable) + if (os.getenv("VERIFICATION_EN")) == "1": + print("Verification is enabled") + # Set verification steps + verif_steps = [ + "finn_onnx_python", + "initial_python", + "streamlined_python", + "folded_hls_cppsim", + "stitched_ip_rtlsim", + ] + elif (os.getenv("VERIFICATION_EN", "0")) == "0": + print("Verification is disabled") + # Don't use any verification steps + verif_steps = [] + return verif_steps + + +def verify_build_output(cfg, model_name): + logger = logging.getLogger("verif_logger") + if (os.getenv("VERIFICATION_EN")) == "1": + verif_output_dir = cfg.output_dir + "/verification_output" + if os.path.isdir(verif_output_dir) == False: + logger.info("Verification is enabled, but verification output for %s on %s has not been generated. Please run full build with verification enabled.\n" % (model_name, cfg.board)) + return + logger.info("\n*****************************************************") + logger.info("Verification Results for %s on %s" % (model_name, cfg.board)) + logger.info("*****************************************************") + # Verification step QONNX_TO_FINN_PYTHON uses step name different to build_cfg list, + # so it produces an output .npy/.npz file with different name + # Change the step name to what is used by the verify_step function, + # so the produced output file matches the build_cfg list + if "finn_onnx_python" in cfg.verify_steps: + cfg.verify_steps = [step.replace("finn_onnx_python", "qonnx_to_finn_python") for step in cfg.verify_steps] + + # Using output verification files, print whether verification was + # success or failure, by iterating through the step names and + # the output file names and comparing them + out_files = os.listdir(verif_output_dir) + for step_name in cfg.verify_steps: + for file_name in out_files: + if step_name in file_name: + # Output file will always end in _SUCCESS.npy or _FAIL.npy + # (or .npz if verify_save_full_context is enabled), + # so check if it is SUCCESS or FAIL + if file_name[-8:-4] == "FAIL": + logger.info("Verification for step %-22s: FAIL" % step_name) + elif file_name[-11:-4] == "SUCCESS": + logger.info("Verification for step %-22s: SUCCESS" % step_name) + break + else: + # File for the step was not found, so assume the step was skipped + logger.info("Verification for step %-22s: SKIPPED" % step_name) + logger.info(" ") + diff --git a/build/gtsrb/build.py b/build/gtsrb/build.py index 83fceaf..793b07d 100644 --- a/build/gtsrb/build.py +++ b/build/gtsrb/build.py @@ -28,21 +28,40 @@ import finn.builder.build_dataflow as build import finn.builder.build_dataflow_config as build_cfg +from finn.util.basic import alveo_default_platform from finn.builder.build_dataflow_config import default_build_dataflow_steps +from qonnx.transformation.insert_topk import InsertTopK +from finn.builder.build_dataflow_steps import build_dataflow_step_lookup from qonnx.core.datatype import DataType +from qonnx.core.modelwrapper import ModelWrapper import os import shutil import numpy as np +import onnx from onnx import helper as oh -models = [ - "cnv_1w1a_gtsrb", -] +import logging +import sys +from verification_funcs import create_logger, set_verif_steps, verify_build_output + +model_name = "cnv_1w1a_gtsrb" # which platforms to build the networks for zynq_platforms = ["Pynq-Z1"] platforms_to_build = zynq_platforms +model_file = "models/%s.onnx" % model_name + +def custom_step_update_model(model, cfg): + op = onnx.OperatorSetIdProto() + op.version = 11 + load_model = onnx.load(model_file) + update_model = onnx.helper.make_model(load_model.graph, opset_imports=[op]) + model_ref = ModelWrapper(update_model) + #onnx.save(update_model, "models/%s_updated.onnx" % model_name) + + return model_ref + def custom_step_add_preproc(model, cfg): # GTSRB data with raw uint8 pixels is divided by 255 prior to training @@ -63,16 +82,26 @@ def custom_step_add_preproc(model, cfg): model.graph.node[1].input[0] = new_in_name # set input dtype to uint8 model.set_tensor_datatype(in_name, DataType["UINT8"]) + + return model + + +# Inject the preprocessing step into FINN to enable json serialization later on +def step_preprocess(model, cfg): + model = model.transform(InsertTopK(k=1)) return model +build_dataflow_step_lookup["step_preprocess_InsertTopK"] = step_preprocess -custom_build_steps = [custom_step_add_preproc] + default_build_dataflow_steps +custom_build_steps = [custom_step_update_model] + [custom_step_add_preproc] + ["step_preprocess_InsertTopK"] + default_build_dataflow_steps # determine which shell flow to use for a given platform def platform_to_shell(platform): if platform in zynq_platforms: return build_cfg.ShellFlowType.VIVADO_ZYNQ + elif platform in alveo_platforms: + return build_cfg.ShellFlowType.VITIS_ALVEO else: raise Exception("Unknown platform, can't determine ShellFlowType") @@ -80,47 +109,70 @@ def platform_to_shell(platform): # create a release dir, used for finn-examples release packaging os.makedirs("release", exist_ok=True) +# Create logger for capturing output on both console and log +create_logger() +# Set verification steps depending on environment variable VERIFICATION_EN +verification_steps = set_verif_steps() + for platform_name in platforms_to_build: shell_flow_type = platform_to_shell(platform_name) - vitis_platform = None + if shell_flow_type == build_cfg.ShellFlowType.VITIS_ALVEO: + vitis_platform = alveo_default_platform[platform_name] + # for Alveo, use the Vitis platform name as the release name + # e.g. xilinx_u250_xdma_201830_2 + release_platform_name = vitis_platform + else: + vitis_platform = None + # for Zynq, use the board name as the release name + # e.g. ZCU104 + release_platform_name = platform_name # for Zynq, use the board name as the release name # e.g. ZCU104 - release_platform_name = platform_name + #release_platform_name = platform_name platform_dir = "release/%s" % release_platform_name os.makedirs(platform_dir, exist_ok=True) - for model_name in models: - # set up the build configuration for this model - cfg = build_cfg.DataflowBuildConfig( - output_dir="output_%s_%s" % (model_name, release_platform_name), - target_fps=3000, - synth_clk_period_ns=10.0, - board=platform_name, - steps=custom_build_steps, - folding_config_file="folding_config/cnv_gtsrb_folding_config.json", - shell_flow_type=shell_flow_type, - vitis_platform=vitis_platform, - generate_outputs=[ - build_cfg.DataflowOutputType.ESTIMATE_REPORTS, - build_cfg.DataflowOutputType.STITCHED_IP, - build_cfg.DataflowOutputType.RTLSIM_PERFORMANCE, - build_cfg.DataflowOutputType.BITFILE, - build_cfg.DataflowOutputType.DEPLOYMENT_PACKAGE, - build_cfg.DataflowOutputType.PYNQ_DRIVER, - ], - save_intermediate_models=True, - ) - model_file = "models/%s.onnx" % model_name - # launch FINN compiler to build - build.build_dataflow_cfg(model_file, cfg) - # copy bitfiles into release dir if found - bitfile_gen_dir = cfg.output_dir + "/bitfile" - files_to_check_and_copy = [ - "finn-accel.bit", - "finn-accel.hwh", - "finn-accel.xclbin", - ] - for f in files_to_check_and_copy: - src_file = bitfile_gen_dir + "/" + f - dst_file = platform_dir + "/" + f.replace("finn-accel", model_name) - if os.path.isfile(src_file): - shutil.copy(src_file, dst_file) + # set up the build configuration for this model + cfg = build_cfg.DataflowBuildConfig( + output_dir="output_%s_%s" % (model_name, release_platform_name), + target_fps=3000, + synth_clk_period_ns=10.0, + board=platform_name, + steps=custom_build_steps, + folding_config_file="folding_config/cnv_gtsrb_folding_config.json", + shell_flow_type=shell_flow_type, + vitis_platform=vitis_platform, + verify_steps=verification_steps, + verify_input_npy="gtsrb_input.npy", + verify_expected_output_npy="gtsrb_expected_output.npy", + verify_save_full_context=True, + generate_outputs=[ + build_cfg.DataflowOutputType.ESTIMATE_REPORTS, + build_cfg.DataflowOutputType.STITCHED_IP, + build_cfg.DataflowOutputType.RTLSIM_PERFORMANCE, + build_cfg.DataflowOutputType.BITFILE, + build_cfg.DataflowOutputType.DEPLOYMENT_PACKAGE, + build_cfg.DataflowOutputType.PYNQ_DRIVER, + ], + save_intermediate_models=True, + ) + # launch FINN compiler to build + build.build_dataflow_cfg(model_file, cfg) + + # Verify build using verification output + verify_build_output(cfg, model_name) + + + # copy bitfiles into release dir if found + bitfile_gen_dir = cfg.output_dir + "/bitfile" + files_to_check_and_copy = [ + "finn-accel.bit", + "finn-accel.hwh", + "finn-accel.xclbin", + ] + for f in files_to_check_and_copy: + src_file = bitfile_gen_dir + "/" + f + dst_file = platform_dir + "/" + f.replace("finn-accel", model_name) + if os.path.isfile(src_file): + shutil.copy(src_file, dst_file) + + diff --git a/build/gtsrb/gtsrb_expected_output.npy b/build/gtsrb/gtsrb_expected_output.npy new file mode 100644 index 0000000000000000000000000000000000000000..0e412cc6a02c66ab40877505477eba3103820060 GIT binary patch literal 136 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlWC!@qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= ZXCxM+0{I$-I+{8PwF(pfE&&Dz001z%8*cyr literal 0 HcmV?d00001 diff --git a/build/gtsrb/gtsrb_input.npy b/build/gtsrb/gtsrb_input.npy new file mode 100644 index 0000000000000000000000000000000000000000..9a97d183d531645c49e09cf5b718ef31031e62ac GIT binary patch literal 12416 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 a?&sGzo$47^%b1V7#_BfLJ8SsS&;A>Q5v|hz literal 0 HcmV?d00001 diff --git a/build/gtsrb/verification_funcs.py b/build/gtsrb/verification_funcs.py new file mode 100644 index 0000000..b54b060 --- /dev/null +++ b/build/gtsrb/verification_funcs.py @@ -0,0 +1,77 @@ +import finn.builder.build_dataflow_config as build_cfg +import os +import sys +import logging + + +def create_logger(): + # Create a logger to capture output in both console and log file + logger = logging.getLogger("verif_logger") + out_handler = logging.StreamHandler(sys.stdout) + file_handler = logging.FileHandler('all_verification_output.log', mode='w') + out_handler.setLevel(logging.INFO) + file_handler.setLevel(logging.INFO) + out_format = logging.Formatter('%(message)s') + file_format = logging.Formatter('%(message)s') + out_handler.setFormatter(out_format) + file_handler.setFormatter(file_format) + logger.addHandler(out_handler) + logger.addHandler(file_handler) + + +def set_verif_steps(): + # Check if verification is enabled or not (using environment variable) + if (os.getenv("VERIFICATION_EN")) == "1": + print("Verification is enabled") + # Set verification steps + verif_steps = [ + "finn_onnx_python", + "initial_python", + "streamlined_python", + "folded_hls_cppsim", + "stitched_ip_rtlsim", + ] + elif (os.getenv("VERIFICATION_EN", "0")) == "0": + print("Verification is disabled") + # Don't use any verification steps + verif_steps = [] + return verif_steps + + +def verify_build_output(cfg, model_name): + logger = logging.getLogger("verif_logger") + if (os.getenv("VERIFICATION_EN")) == "1": + verif_output_dir = cfg.output_dir + "/verification_output" + if os.path.isdir(verif_output_dir) == False: + logger.info("Verification is enabled, but verification output for %s on %s has not been generated. Please run full build with verification enabled.\n" % (model_name, cfg.board)) + return + logger.info("\n*****************************************************") + logger.info("Verification Results for %s on %s" % (model_name, cfg.board)) + logger.info("*****************************************************") + # Verification step QONNX_TO_FINN_PYTHON uses step name different to build_cfg list, + # so it produces an output .npy/.npz file with different name + # Change the step name to what is used by the verify_step function, + # so the produced output file matches the build_cfg list + if "finn_onnx_python" in cfg.verify_steps: + cfg.verify_steps = [step.replace("finn_onnx_python", "qonnx_to_finn_python") for step in cfg.verify_steps] + + # Using output verification files, print whether verification was + # success or failure, by iterating through the step names and + # the output file names and comparing them + out_files = os.listdir(verif_output_dir) + for step_name in cfg.verify_steps: + for file_name in out_files: + if step_name in file_name: + # Output file will always end in _SUCCESS.npy or _FAIL.npy + # (or .npz if verify_save_full_context is enabled), + # so check if it is SUCCESS or FAIL + if file_name[-8:-4] == "FAIL": + logger.info("Verification for step %-22s: FAIL" % step_name) + elif file_name[-11:-4] == "SUCCESS": + logger.info("Verification for step %-22s: SUCCESS" % step_name) + break + else: + # File for the step was not found, so assume the step was skipped + logger.info("Verification for step %-22s: SKIPPED" % step_name) + logger.info(" ") + diff --git a/build/kws/build.py b/build/kws/build.py index 3a967e3..28beb11 100644 --- a/build/kws/build.py +++ b/build/kws/build.py @@ -41,6 +41,9 @@ import os import shutil +import logging +import sys +from verification_funcs import create_logger, set_verif_steps, verify_build_output # Inject the preprocessing step into FINN to enable json serialization later on def step_preprocess(model: ModelWrapper, cfg: DataflowBuildConfig): @@ -60,12 +63,11 @@ def step_preprocess(model: ModelWrapper, cfg: DataflowBuildConfig): build_cfg.DataflowOutputType.BITFILE, build_cfg.DataflowOutputType.DEPLOYMENT_PACKAGE, ] -verification_steps = [ - build_cfg.VerificationStepType.QONNX_TO_FINN_PYTHON, - build_cfg.VerificationStepType.TIDY_UP_PYTHON, - build_cfg.VerificationStepType.STREAMLINED_PYTHON, - build_cfg.VerificationStepType.FOLDED_HLS_CPPSIM, -] + +# Create logger for capturing output on both console and log +create_logger() +# Set verification steps depending on environment veriable VERIFICATION_EN +verification_steps = set_verif_steps() model_name = "MLP_W3A3_python_speech_features_pre-processing_QONNX" model_file = "models/" + model_name + ".onnx" @@ -104,6 +106,9 @@ def step_preprocess(model: ModelWrapper, cfg: DataflowBuildConfig): # Build the model build.build_dataflow_cfg(model_file, cfg) + # Verify build using verification output + verify_build_output(cfg, model_name) + # copy bitfiles and runtime weights into release dir if found bitfile_gen_dir = cfg.output_dir + "/bitfile" files_to_check_and_copy = [ diff --git a/build/kws/verification_funcs.py b/build/kws/verification_funcs.py new file mode 100644 index 0000000..5c5d27c --- /dev/null +++ b/build/kws/verification_funcs.py @@ -0,0 +1,83 @@ +import finn.builder.build_dataflow_config as build_cfg +import os +import sys +import logging + + +def create_logger(): + # Create a logger to capture output in both console and log file + logger = logging.getLogger("verif_logger") + out_handler = logging.StreamHandler(sys.stdout) + file_handler = logging.FileHandler('all_verification_output.log', mode='w') + out_handler.setLevel(logging.INFO) + file_handler.setLevel(logging.INFO) + out_format = logging.Formatter('%(message)s') + file_format = logging.Formatter('%(message)s') + out_handler.setFormatter(out_format) + file_handler.setFormatter(file_format) + logger.addHandler(out_handler) + logger.addHandler(file_handler) + + +def set_verif_steps(): + # Check if verification is enabled or not (using environment variable) + if (os.getenv("VERIFICATION_EN")) == "1": + print("Verification is enabled") + # Set verification steps + verif_steps = [ + "finn_onnx_python", + "initial_python", + "streamlined_python", + "folded_hls_cppsim", + "stitched_ip_rtlsim", + ] + elif (os.getenv("VERIFICATION_EN", "0")) == "0": + print("Verification is disabled") + # Don't use any verification steps + verif_steps = [] + return verif_steps + + +def verify_build_output(cfg, model_name): + logger = logging.getLogger("verif_logger") + if (os.getenv("VERIFICATION_EN")) == "1": + verif_output_dir = cfg.output_dir + "/verification_output" + if os.path.isdir(verif_output_dir) == False: + logger.info("Verification is enabled, but verification output for %s on %s has not been generated. Please run full build with verification enabled.\n" % (model_name, cfg.board)) + return + logger.info("\n*****************************************************") + logger.info("Verification Results for %-10s on %-10s" % (model_name, cfg.board)) + logger.info("*****************************************************") + # Verification step QONNX_TO_FINN_PYTHON uses step name different to build_cfg list, + # so it produces an output .npy/.npz file with different name + # Change the step name to what is used by the verify_step function, + # so the produced output file matches the build_cfg list + if "finn_onnx_python" in cfg.verify_steps: + cfg.verify_steps = [step.replace("finn_onnx_python", "qonnx_to_finn_python") for step in cfg.verify_steps] + + # Using output verification files, print whether verification was + # success or failure, by iterating through the step names and + # the output file names and comparing them + out_files = os.listdir(verif_output_dir) + for step_name in cfg.verify_steps: + for file_name in out_files: + if step_name in file_name: + # Output file will always end in _SUCCESS.npy or _FAIL.npy + # (or .npz if verify_save_full_context is enabled), + # so check if it is SUCCESS or FAIL + if file_name[-8:-4] == "FAIL": + logger.info("Verification for step %-22s: FAIL" % step_name) + elif file_name[-11:-4] == "SUCCESS": + logger.info("Verification for step %-22s: SUCCESS" % step_name) + break + else: + # File for the step was not found, so assume the step was skipped + logger.info("Verification for step %-22s: SKIPPED" % step_name) + logger.info(" ") + #elif (os.getenv("VERIFICATION_EN", "0")) == "0": + # continue + + # Change step name back for next build + if "qonnx_to_finn_python" in cfg.verify_steps: + cfg.verify_steps = [step.replace("qonnx_to_finn_python", "finn_onnx_python") for step in cfg.verify_steps] + diff --git a/build/mobilenet-v1/build.py b/build/mobilenet-v1/build.py index 8feca4e..3d5daab 100644 --- a/build/mobilenet-v1/build.py +++ b/build/mobilenet-v1/build.py @@ -42,7 +42,25 @@ step_mobilenet_slr_floorplan, ) +import logging +import sys +from verification_funcs import create_logger, set_verif_steps, verify_build_output + +import onnx +from qonnx.core.modelwrapper import ModelWrapper + model_name = "mobilenetv1-w4a4" +model_file = "models/%s_pre_post_tidy.onnx" % model_name + +def custom_step_update_model(model, cfg): + op = onnx.OperatorSetIdProto() + op.version = 11 + load_model = onnx.load(model_file) + update_model = onnx.helper.make_model(load_model.graph, opset_imports=[op]) + model_ref = ModelWrapper(update_model) + + return model_ref + # which platforms to build the networks for zynq_platforms = ["ZCU104", "ZCU102"] @@ -72,6 +90,7 @@ def select_clk_period(platform): def select_build_steps(platform): if platform in zynq_platforms: return [ + custom_step_update_model, step_mobilenet_streamline, step_mobilenet_lower_convs, step_mobilenet_convert_to_hw_layers_separate_th, @@ -90,6 +109,7 @@ def select_build_steps(platform): ] elif platform in alveo_platforms: return [ + custom_step_update_model, step_mobilenet_streamline, step_mobilenet_lower_convs, step_mobilenet_convert_to_hw_layers, @@ -111,6 +131,10 @@ def select_build_steps(platform): # create a release dir, used for finn-examples release packaging os.makedirs("release", exist_ok=True) +# Create logger for capturing output on both console and log +create_logger() +# Set verification steps depending on environment variable VERIFICATION_EN +verification_steps = set_verif_steps() for platform_name in platforms_to_build: shell_flow_type = platform_to_shell(platform_name) @@ -135,6 +159,11 @@ def select_build_steps(platform): board=platform_name, shell_flow_type=shell_flow_type, vitis_platform=vitis_platform, + verify_steps=verification_steps, + verify_input_npy="mobilenet_input.npy", + verify_expected_output_npy="mobilenet_expected_output.npy", + verify_save_full_context=True, + save_intermediate_models=True, # folding config comes with FIFO depths already auto_fifo_depths=False, # enable extra performance optimizations (physopt) @@ -144,11 +173,15 @@ def select_build_steps(platform): build_cfg.DataflowOutputType.ESTIMATE_REPORTS, build_cfg.DataflowOutputType.BITFILE, build_cfg.DataflowOutputType.DEPLOYMENT_PACKAGE, + build_cfg.DataflowOutputType.STITCHED_IP, ], ) - model_file = "models/%s_pre_post_tidy.onnx" % model_name + build.build_dataflow_cfg(model_file, cfg) + # Verify build using verification output + verify_build_output(cfg, model_name) + # copy bitfiles and runtime weights into release dir if found bitfile_gen_dir = cfg.output_dir + "/bitfile" files_to_check_and_copy = [ diff --git a/build/mobilenet-v1/custom_steps.py b/build/mobilenet-v1/custom_steps.py index 6cd54af..618809c 100644 --- a/build/mobilenet-v1/custom_steps.py +++ b/build/mobilenet-v1/custom_steps.py @@ -29,7 +29,9 @@ from finn.builder.build_dataflow_config import ( DataflowBuildConfig, ShellFlowType, + VerificationStepType, ) +from finn.builder.build_dataflow_steps import verify_step from finn.transformation.streamline import Streamline from qonnx.transformation.double_to_single_float import DoubleToSingleFloat import finn.transformation.streamline.absorb as absorb @@ -72,6 +74,10 @@ def step_mobilenet_streamline(model: ModelWrapper, cfg: DataflowBuildConfig): model = model.transform(GiveUniqueNodeNames()) model = model.transform(GiveReadableTensorNames()) model = model.transform(InferDataTypes()) + + if VerificationStepType.STREAMLINED_PYTHON in cfg._resolve_verification_steps(): + verify_step(model, cfg, "streamlined_python", need_parent=False) + return model diff --git a/build/mobilenet-v1/mobilenet_expected_output.npy b/build/mobilenet-v1/mobilenet_expected_output.npy new file mode 100644 index 0000000000000000000000000000000000000000..86ad4e0495e5f7d426feabd0c521d9a6f71f8f6a GIT binary patch literal 148 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+l>qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= oXCxM+0{I$-ItmbEs;Q$;t3U?eVrV$*%m4xnM}agDHym;X0KX|ALI3~& literal 0 HcmV?d00001 diff --git a/build/mobilenet-v1/mobilenet_input.npy b/build/mobilenet-v1/mobilenet_input.npy new file mode 100644 index 0000000000000000000000000000000000000000..61cc17c25be54df19c2592299469acac46b5ab4f GIT binary patch literal 602240 zcmb5zd+6WymEU>!lF1~U?zY`+_r5Dj*8OftmL=cscRP+_$BA=sF3!wk+(|ca(z4x! zWhrGSLkMXw#uyWfF-8a@gb+dqA%rkO2w{W}LI^R0A(X*{V2m+Fh&~_Xd*Da^+rTUD z+qs|D`Fwx2|Kn57J^7VyT(|5O%l_?}AHMvvAN+L9p5<%q_|c9v8<(&7(NBK*>QBG- z*WdlgPk;Eb`-i^w%FkZz{%3#jy?^y`=e655F5kX!`7O8X_%HvrZsYR*XZion|9yGc zvZMDcTXs5p5IzgP3-5+shQAGOhquC+a3Y)v=K@(+d;hX!4~84Uv*DGnK5SpC*SB6t z?&EMW91HaRQ#c;niQ!-n!`UDnXMXktzRBCuJs;?O9zG0g{(aaVysgOR%|Wd0*}o9} zu-IR2<%5lhL*AbTFtxj{-pJP57*lN z7iae9TK~K5{@3tN0$bw!-@3^yHy6}bYKZG^mpM}jqUVqy9 z--KmB4fI7^D_eJj|0D3bDX1U)KeqBok9}b8p9k@Y75-7+Q(XMq64;WzdvWQz^|tU> z*d6#_lRiDR#iJi$-xYoy=!kh+xIJtQ>T+kmGk0vM$$jCO@Plx7ke8hF1=z(ywbcWC zvELBn=?tp^UGf_PfAsC;^u^#^{%ZL@2EAdEoj(h7)M51am7}=$yD8w$%!In}=l=a_ zVBYZP_u){$eO$*~zW!+tgL;aC?R$fs-P5Wr`XoNRFau@=U)VJVWX%AZxN)V`TpSMe z7XyyrpL??SVZKfTHrNv1*rqF1kb_y`N3YbCO)-!&%bx@`@RWW2#N*wp;h}HBr;9T` z>ddFR&%)b*A3QRvY<;=CKAAT?Q7?7CFFkhVhn)VAm8aaU27J;(_v)>0`lUa(jJx`~ zCa@aDK!>Ox;m;vqv;F6@B1j2;;|(95IE9LH_c6Hhd?@pB@gF1v%;~{v8cw`1Qr={YW?v4hQy~@gBeN z9K=PR4F2G_nP-pg-oP%dvuPIa`C<_7?}Ax@(UsqgLCy68N5M?e!y$3Zyz^l``8gdv zTAayV4&=pTPWXE*i2XwNZ4ft3dY7kIaanE1d=~Tw*u!1D&>Jz$_f=i>l&vSjV*z*g z|2)V+KUN2FeCVNm`=+q#PF`frw~B#ZGPs5x?CURCz0h-gAWMd<+KJDbxZL9y;D8+U zAD_$=zM28DV*OIUBFZM;~iPC(iN9H*!=3^j%~T#5q1Rj%>r9$Ax?4J z8_Xyf-vslnHuSFx=EZ!ORk1lw9CIEWcKHyOy!oOhW_g+`H5H3`TKOOc`kyUtq!|M!JQ!=|7Xa=A5-y|$>eew=NOW4{Xf7kIPvm*K7O>wuH+UN{%<8<&Uk z{Nb@P&U$|*uz}}?16v0c=dr`q(STp}xQpBNW|Q8LAaAvn<5R(ROKtV_Qt#>`9uS8a z;lpfS4s4iTvGHXd-F+H959F*ks0L*9lPq6qja$AeUtFB=iaj}dS64D>Dpp`uOlH9u zcW~gd?$nGQ{MREhiv#*AuleTUfjIfK%15l?V+&VtM(@oQE{Xf&KnHhc{+zwzoH)fG zF5hQ9HwJl;!%f_}w(!M=87Jc&&&;i!&=-e3&=r?=b)ly=j|bn*Z-}=ht~o-;C;A@^QXeGAV$Ei&%*V^YM$^^{){&wPWKC!Q7f>JiQRy$@kJ?75|k$m#menxx!uf91FOK3v$FMb#^BvGosJF73!|v zbj5Ny=&|18sC)f*FyOlWu_Yh8#S{G&qj>dFj_&xtHG1yl>6@cA_~v^~4oBRxC1&+e zGpkyvAzgmuN>?t!e49Kii8L45i@vbZ4@HU49DgDF9y^PVPkqN1F<WO$=<}CH|Q!_4z`$)Lzc!%WRRuO?%%3KFF9kJUki1_;Db^7QbrG z7awY@Cv?q-p5mwY^_8r9b%%$7Ug6{4CG%+zznwUmPy_MW^Utmx!up`Lxch@}S1_aOv%MvVO<&1B6`l<2m~$(?Vw#zemzsO?J-{LM z#pK(hR^Iubr+?n3U+&a}p4`MfI()JzU;UD=o{LkB)tVhOAZNcV=rMcFZ1ADaN5Y|S zIJ_3#T)<43k+;IT;qBlz(z}`b_uM zNA7U^K*0C?L2u2-`(bbRbugd*X0bPiX77e<9r~4+n`^3vVA;U2KR z#lz164$%8ztK6=(XCL>(B6juF6Tbf#_`@}}<)Gd;2w1}pT5=01K;%B^DRcXECru(VUG{-sDU0ji)(Gb4SHq-m&HuS z+pU2gzRd(*^wpg$I%>8(h>M&&@SlBL-5t!BH#%x*mTnL1JQVH{lGv}E@92ARO#J5iaKk5&9hNpOM2Hy<-KA5$4!mq-A2s1nK6bDczQ?re&;!z`tLb$cHXjtJ-Y}WbMVsmzt5+PrYGBKjq4&7};W* zoq>A%S+L4eZZ8KMU`vg_Zxo)XF_8Cd_q(t+_^o(9ycS*$?*2Bs7xYd)@OyLn+k^P@ z<5GAl912GQJ7A`qy}cXE;Qqj$9(~k`|M-JDQ%`5T#94h`AJkiq#r#CT3pV70Lwfjk zt?Y;gu7xu}-10ZG>dC%*_@?7soc89tiP)UI%T*7DXLQvV#3W90=pEFZy!wII~Z6An7Zlbw*rppfqdk;Dd38@&jtQ|A5I4PIQkDk zd}O?lJ0J9gfA@GR4*K@KYh1Nat+kIa?UW5KF!H-;07y?Uq%Is8}|_!Gy~pda|F zxAG*b{%VL5dh0AUGUh_B&8fQMyIjQfdDzmK4gBF-{cwW3nWwKl>ggSaaFaYcpgw$V z3~Y%Jf6jKV-`;%l>9MExVq#BBY_sF{08gi8_H5#vczmzrrI&n&k3Tu>3hb#T?(@km ze`<*1=3IX4uLxoQzNcqu{ow+7qQCsm`9cuGms<6Lj(L8Q zUJvgrVAj-t{=sl~u{U=YgIPEg)K8qaccwktV#5*NKe^)BzYO;W@yiXb*bu9_1KYUH zj$Ya0k=fA;GAF~1^y%_V|HjUEAU`z{3!bSruCQY-He6!c8UNHnea)xpX|hoOKO0pI7Dvd0q@lYFRb2X7R4eacX)>5 z@@30hu!a8@x>q+j;SyW8t}b{dcl_jEKj^8ST9J2euaD}b_xr-klswo|hquD%fD^cM zDBz5Hde(Oq>zl3b2lu}TM*}_bR_F799eq_#x#+tX&43uliUGu_wrXS*vm9nF)kjU$ z#q8Rv9WIz_cVyYY1GVu!b1(lZLBI7CpK;;VfY*G9S+B^-Z|Wg-F?wTL4!ClA>kC0H zzYOZ~dU!3oy8t^M2EK7!4b;SH9^B#Y)z&?&n}dAt@s_Y5JP^csclbpR^R?vFK+Jdv zeCQ?n>`we6Gkqeb@4mNU8Z1M3~XEVm9-1LMEe(>AsPCn%DfgSTjmk)YCep?WSUWi$L2<^_qux{><#Y(HS{fF2k$Nf^;8=<>er_9^iYgX2mLn>4+or}%LlppgPGeH zz8=J`hU%&AYAHTFF?V9u7e3YdXdq+e#Up>SBiA#XanZdqyC;HLu*2Tfz}D>5qW`97Ktditn$&Nv_+xw|)`e2QDI=bNWyViV`OR{d3v`vRLd zqi^2jGj`d;MgGJoXT4Krw$}$78XYn5BPR1l7mvu8VL6IV-3|x+zOsP&sTod)UtjhG zw$(#V*jGn&!+m{Ziw(7+FD~;h2f#Pqw9ng%;dCnb9?V%JR0@~GA9Eccxo>nv9QCR8S{-;9{4eDa`C%{KP$si0pIu)*NUL# zWY>nN@wwjlRLiqL&(*`d{_45CnCA`GVwbvfg|dGQ@FG$Og#LNQyX;<3!D0`KHklj zUh&D6nDtW~#A#M>$BHZRa2BU}`8Kj=*3_PTdU~yX?}y)pV}XBp*wZJc?()%#!$D5? zD{r;Ys{?_~nIKO5^v0*2@I#(0-xPl{hz+OZ26Ez$4}Ft|9QD(Rzv7!7+lxuO=7KN1 zb;qte$+DwvIKhsUt{&)z-1ui-4}d-WQh)iXt=~%bHwCd?NC)ssyf~mPR`0&6>Mh^t zk=}!xio4nXo7rw=CCCCdeUf>|R4+XJr3TEu(uru)c^`IY5hd&SM zwJLbKlr6pBM@-J<&z-u9SI#)0t`}R?3cvAC%-(U03{HxVuK6W{C)U-$o%+f}p19*% zVWsak#@Sx&*9CRrTYh}e!$UJoUOwU_r%(F6BJjhmnZOM>vuj?=ELr#RR(JEaCdgTB z_^{VkIf+Z%^=y4$OApKrZs{X#yb+Fscfzso@50|K_U!R%=Gf#z-0ty7A8Cf_@ z*5*qsU}~ff;<38dCwo1UgIL5dHRhB2bwMoZWG`=L@$#+4@>kn^L9KC&Z8pf$wV&7@ z==?(16Z}T%AAX!pMt?5^y};+a;bdSN?D>Q+RaA|i~ z6ZFU4z3+?~t!Om^>ha~Eo_w>dCT#tt_t%1Nj2L}C)kB@s0oR<>My}@XXuxIi&T=+K zIK+><>FWW=6Zp`3v8lJ%a6nxA$XhPsSN`7A7f;FRH{a}&H}`6X18h2z2l=V37}P{u z>d2;hwGz8;6x(#!)-Uy;CkDE7CRXy|6@#4gOmA?){$fxI{UN8XYRH}%;?ad59{!KF zmjfOC`C?10aA|8$-}QkFFwbf)Z!3 z*xw$W2v3FkgWPuo922`f%T2CosrHwGp6az+e22(A8qD{p?!<65sIgk9AE*I{^+XV_ z`dn_W&-$TmR()ba9xH-ciSL%+O)qdvfAQv%_Ugor{;QMT4ZnQr)rqc}HU`M`cEdI4iR(91$Pv+b4W_!8r4RV*Ox~YfSk#(n5R&j~ResXZPD%>3S zSRKS`&aJ)+Y9@E_UJb)Tak8Uc_(yKyuI$l*Ji7m}JvzmEd9@LP$-p<}?Cg|$7oW!AyAbv66o!Xd%BLQEWaZ)YG;GY>g)9Sm3 zvwA2Gck*P1F1unA&!(^=&@ls(uQ&WU7ET7faY?P&B+suptPg7NaQI5t9=;#`ZMZMI z9KI98_gHu$m>spDe{0Y?G2){b***|(M!a$mkG`%*_L-m$cqOK5;ZPtecQ(Y!4x8+& zsa}dhkM&60>{{L1%iUaCw}jgRUv#YIOHJ5zr|(o)MviDyH`K;Co4bv zaK>R=Afpy{wwJ5i+{r`y>dn^9pkHe6MtC>88Px4`Fst;`3@7nHjl_LZXYpMKWXZww zmaclJ8~50wWJAYMRyj4&1>SCa0)iX2iyXtLYvg&zjcrf6QobM0r zzaCxHG#dU6Tj-n4u9e?NAC4O z-u5#~H?{ZfEEjt*(PNWO@j2tRJ7>17VstMCd-;kB_`)Z3m^Z6huxk(cr$@7@`Pp!6 zvEq^Wo0+l4#bxP;l?~sj{oU!MxjhnaU!R7%V%FQk!8;#E!`lJhE(gBYWShT-Tg}|= zuroXpz8&EJ;zIN z40qI;oH|_}^o|WR)MLCm9`*;{1@Y(^J{%1v0$v^tIC(6*6X&z}+?C2+sE)O>ZGQgKQfqGcQARqGhFfo(g8Q36W zRZ}aynLDw{Sx(|(2Y<{VS-mzhbb+3CI(o^s*xl2gZvcDrwNPE`|5PsbK#02XaTl#egSx=j?Yyjh_s6 zg-zj=a7VzIyTjwb?0qMQX=T6#9N7`{RzKIY{y2D(qrR%g&jK6xEN(H_n=KrXpV;MX z^E+fSKRn@YZxFwj$?Mzi0$X?@266L;2lVt?eB#m%T;g|E z&?}sBk8k9}!nfI$2dEo4Hr0SlwbDmDQxCj1Kk6esJ@n2dd1rG#mX3RIdb9Gw_xuKl zcXQwu=$TD>EAEI>zGje5Ie2%+zM7EnMqd2(YT(SLm~qTKpJJfr&8o+vr+@77kH>mq z?$ljB)LU=mr0-_tblBMWr(x#;>TPb01ha+%dTAcP*_+v8mn?4J*Qeow;5UK{j?3qT zaC?x$kAwc|;rGLxK}=hMTI-9NeI@A2j__P~ID9SOwE5cIO6HqEzI@`Z_~c4X?&idA zgxNDY;`J^zs~V}DZw9;cd}lrn-sJ4<%iXINJL+e3M;-^|k7xQK4!zbpwc+0!=(qgH z)72|8qek}nBNqA46^H(+KO5pFColHdBnxUrRvh{Q&T1+iaoV#XZ*O{VeZVg>;|;gA z2b?C4A7a5R`PrKzT+}x+G2b1$wHFUNWN{St!Jbchw&gAkHt1LEe7W;(uMcXh<{%z6_#S;Vlc&7sS=l7xo}87O7}QX_?!-EBR`K$yFZ|#aK3(75 zDp%hp@gD7rLvsE>_->fG;egpa7~T*20(m^tQ~W&^a1rPA(mhV#i@E-7Sl0c$K@N9> zwLzbM9PSRg!m~lI)eXnQYESl+@O&^|F9x;OJ2N4_Uj(}D@XPGm;~zVEjZeNI>Mvih zUTIYaXEJA6)yIsPxkCZ3*^;N2>8pb~x@J%9^mz33MI0XmF?!P%XMF+o{U-6Jr}Ds^ z%bmq3NBz?)KCWw3+dl;LBr88>Z)*K)>(k+hfFJBw3}W`K_w4b# zF5n`*xhF#(m+kS+Dt7gg6F>H3MwSnE-q@w1{;PsnAgdHHH`;@chM z^26|GxG%`(gLLHmSomuAm*Lxi{-)kd+5p`r%HT&T^dEstYdRHedR)CYS}QZ^pIun_Kb1J>PgOFFA@`EbN$7^Cn*3 ze0-;`HaNr|j)>FwRIB*u==I*t>aBltwgkQTIOwCk@TIqGu`xd6c~f8qPsC1E9^#*x zZ*0#tPT?;bctpqD7sBuuSLs{bjeRT7QL~!^TfSdx&v$?fj_~209B$L$OHI82IX=`> zfB2M}Iy>9TkuI6BAz!xCU(K!TxaZ58J$?5;#=Sk8-j?=~Z81$>^w@VtKI_6=K^=Dn zIpONvtzQpna=P>JfP-w4+1LKq0&leHGdbME>#fP?1AZO|7Xo>9_|;E#?hoXA6Y=c1 z)~AE`o(bmf)}Xd{vMc-~JQB!l3VN&`HwLvK|3WY~ep{|Fer|x{2 z75aR;!=uZc#V0Ru_*Te&YA+{qb|{Ejo@`ou8`xl%UmR0=`fQC&JQWjL_{EO8(E;~n zaD9*iPRnulZqD$LO>wiquiqAP%pb5THhVtRa`xBq=WGu3fE*d|4$sw;JYQC^cyqrx zh{K(;ILLrAIq|72+hbFVBS!~c{v_jqBYgO6KV@#|bT8{S*2_@q{3)lS~*9trqBR-Asb_!g@<^9|S;@a%`J zPle6l@!&fk=jX#Mflad~zTJU8wZO@3t@Q5+YRTuN;M;CiNUY+-BQcUu2Qe(` z&YZ}>I&(`7{0`&)Tfw~G|Am0N2Wp`{WaK0cT=iRE z7RiFR)D9=*&nG>((UF^2*aLMS>mD!gfWA0zgsyut#NUd5Bls{grB17ZSoqh!Re^tU z;r*A@g*L%oavh<_GXs7nLW0|r)S>9=FBb|?!`xr5Bi`c&J!m;Y|@{8`qt~2nu_)N z;g+Cp_@f?bNbYFxJyHXlGfx-8i9la%L2meL#ZT|Pw{o0(%`uMpEqS2(9|w8Z-xbI{ z6K)IYxGUho9pT>ao$zqL3v=b|K&Qk3I2!;KZl2SdbvA!u!9$T zi$UGQCvUOyi~C~HAF=Y|Uhl}LoBqg&AAQktvEdGz_Uej1_=4wVP~2MrzR1~~c&TiCM)03XNw=UaGMUUcsC1tif``Oa!-dpHM3VwP;+N- zc;|QK%9$-T$*6-mxto~Hp?iM#r0+~d-1O|piCrw}>OA~ZcX|3Vk1Z^wd}pf3-y_$gkwsfn}u8v`BnBd_+j?M)rcEk3Kg zJ2j9yJI?gj(EBYx4dt>b&|!Oet+ryIuU2Z~PHoMOKCwrCUGQ!WeBY=IEq**^+r9dmRdK6V(_I%PKgHO25hCG~c5XkaPR~^J454vh@<=37pU0`11AVomF9v$f;;^Sb_QVR_-F;AA^u7{y1hVoaqnCP)%YH*HgahGtI3M)bJAT`% zu{!DZ^7eeo+a5n|3pl|q*@Nxb_V<}Nf22G0(tCNCxrf5=#jLF8{FCtWa95C{oSzG8 zgLwE5hyB@rcc+8j0DF1hjF{OZZ#Lb@%U(|B0)EO}&&jHd{Pp2*t2_1QhpbxKnZg~byH(C6FYz2$>AD)i&-z+ku}@; z%eOwbV|!-D-tQtAe6V_RKO8et^w`HGx#*J`$_4lnmz5v7eB-`&<{Q9{eA&={{>087 z|MabLCL=#@?1+mFzNnXXvCCQQe5=e0-mpQ(N{;-*PTw2bWZ9p(j6Az+O+7|eZ`{+N zKQk*wXSUf|`di5V=)ctd@gTn~!ThMl%m==KIoTJE1bxOM^ZQ}&?foQt94-bnaLwEB zQap0r5%BY9z*X{c^2YBSt=q!a!_IK1JKR!hzjv>OmxG+y6#IRF9sb45j`$uZ*Sz>JF_vhpzGT)aq&T3ZRT#`)(>{ohMf55x@V7X z_iS4A6ZD5IJ<;34;bb@x4u$=TJ-Ozm{0SD<9ZJ`fg2YC+v5k{KMGc{ zZ4LT|8{cSsDBKqw3^i=l?tFR+H67C6K4eG%^Iq{pV*$+R@b%%pu`orR#9C>kF zZoRQpj(Cc@zR_ZolY75SWaK12JfrueR(bG&2hQ@-OMS(6J+fE#T|vzJ%0)lO%b!oY z)w`(|J-);x7JK>WDcgEtmc$~4PlLH;1H{J0vc<|Dz2UQad-2MTAGWRXloKA2lbc+` z0P?^ceukH9&2J6gBSYRj-~)faF1eWvT(D<{Z=AMQ4}QciPJ8-dqN8?VULDMU9L6`F zYQPp9Gv;j1w!S#?%f7w5=1x!8B<~*Rk!MqV*!0ftd{62Jc8*0Esr z;6T7Vv&EObdw*lG;{AKUEaDKn9rg!vH}j15_>Mnnq<-szoNf;M>(9Rq<`I4r_|%_` z;iuup;m+`Ccs8iHdBQuf;i7o;moIZ!;Hzxd3=jaoa#)* zS-tq9tFF^?x_pRL-EcttaeVk?Klg0l&Wb>OI4Zx<5wHE^D(-8=ATM!{6@xqaVwySR zo4h-}i{ez@K>Kw!R+@gyZ4e zV8%`?R(EH@$w2R&fN$R2;l5troV^;o6!cHddLXX92zszBh)-WOg!{u!!~Yo`3f~TT zV*c6m4e?tgelz6$YA_$-(tq*bJzkSlCo%Eoj*L~#YQe7g!*9OKj=Lk_v%tPunH@Ub zr+#dD7YBZ-&-JZ(rXKe0=Nzg`D-#uraX1C;Q?Ri?iO~zZp~`KE}V;CO5XlD-WQ&i8}|f_&vJu5Dp!_(L*}w0(yb^vEeB0zm?tH*GG5Y-h zar0%B58w9W{f5}P<5Qii>LAYHFxh3D)k?lNswM}*xj^<%D{h-Le)X9xvCy+uTRpzq zs?V!~nD9#9#3_Dpm@V;{`RTuS*kBJA_~75X>6iM_VMl-T&RO5}Snt`k$6Kq~@on#o zFMW_Nc|0+P&V2et`QF&;m3#6yC`Yjk57)Lg6W-Kld0<~oWazo~j(>7ylZuRU8hVf|__W2dVx`2GVQID>n~7AwBJ8%_rE>U=Ql3*?;bal#p2*}|2- z3ueX4eJ6(d!h9Q;pXs{!Ts056T$Z#_i!H9anEXI+~J4c2EK7! zEI2G5F_;cyr#d0?NOJM#Rn zr^n9Xu&xd6^xAyjh5E=B$IgT!;b<^ZW^P|Fr#OE;&^s9LUhfYC_w3Nc33~b>hNr@g zp!VXn>W}(bV^iE>C6DK3PA&Ml+G-y0o9%P0`0e|F|7`rORZaLe@AT(eK#x9Ke9#kKEJU^u@*5yT0rVYOc=o^l!MQx1-N5;Dz}3_ofeOq>gHWALNF6=0eTA z$&qdGx>v^)i@kUEdc=n}v&kME@J4=R7=66JdvfM)b>MG%*b>CS7QW(x`m73M#BS9G zzUWSDGYfo*O-wTze2!gy$%tWQ#$K)6lXY*;CVA(v;Y^+nGV&UEJYh%w#OOTx>A6}1 z+xVvs`ob=*;v!%2(_gZ_yJ~Vr;LkTmUA>XN63p|ZfWK;~X2S~{8h(rY*6>)^6!84M zR^PgN!rkG;@M^d#JRTknauM_OL9AN?yUT)al^k$Z+5VKk3o-T&eTZF*mmzMFENwl5BJ#=w|UVgKK0PMdZ?xObO-jn zkB0+azK7;dTyipBc*&>!^D8H3wc^8`eH=Ek_~=eN-r2F&Q#F+1$T_=L&*g!vJ)W?k zFZ}C~c=etA(Q&7ieB&&Ayd+~)cRJ$M8+&!L@?%cr!M<3?%aeca?6N5q_T)LU`hKqci!wrPQ3K_^KKn~;ueE@a^A!tMt5@4Z{H$!_Ber4dd`PF%r}*e znABU(;kx#?L!KS|F?)D%IpDCFRxk1JK?Xm(T?{+g-xbz`Tf*w_U|{p<)*pt)!*_%D zanCH6Cozc6-)a1^X^*csjF;ryiBrFZ+w0nkUyam8Y+Hj^eQT$7Y?5PNylNshdhAi`yN4I45VoJ+V(5xF>%0$cx#T4RT`V-(IbT=i(a<(jh;* zCua{hLuW-0tNz~>)R1qS;g{TwaDP}C%<0&~V|rFL*rQ_=gM0Fm|E%6;{zl)~J=^A0 zPxu~tR+w2P%N{-Vp|2j=S8R`Vwxap)tv_O`Tb!V?8{Nj^&X2(3claG3-1HbwqrauOJ@>|3QS@-nL1@i2Y z!?T+LE~ck>mS~-Vbveizdw*MlQ`$M0awj49*Xhk z;>)>4?Sk% zYAgQzX?tfJ)Ms3=9}ewpe=*>d-rLi|b9#DUo^b=$CLgmV|9iuR@L~{;+Uc_x9}a5u zV8B(JS8KNMojrc}!*zG_yKtrbAA@|(1ssx-_;5;1+~GJmesNC!<;<5E=1;DCf;hwX@j8BzOMgBR2J7+jm4R;-uq!z6)aU zJ7|7S2H#5jToG`DO)-I-=;H&v;EA~1*~Dv!yJGoa9Ir`XL@Q@g@fPYN5Ys&9^xsCkFo5!|(Sy9|&R*8-EiI`)qoX ztNx15?8u8_qBY>;!7 zH<>x(vv1jkfD?~|`vR`w%ASD3AU1gq$DGA6wcyL%9Ut-&8_;*2c@&da*c$zj^=8k8 zy%pG3V|RS0?R*2=+us%F-XCrca?=xh^S#Cmy~fv--R}x)naAS+zu{oOdA!4gi>@32xs|=S3R6@Q_gr#X6j%b_z{Cz;yB)z19|e#AN%~_{^?e+vU_K%eu_<9 z&Hr_aGh0*V;R(CbJNCq}EO~Lg)BdG!IJ_Oc67C86!trn-d=S)8UHP@jbvTVja^=IF zIL#d1%=gHw;RC<=PS#o8?0L81s^6Yj@znRs%BNb;6NmWKkUj5gh{e2#*O?tYW`_9C zAMu$*9HPG|;EZ{}-L1j<M7I0MW%;AB>9ljk6`au8r@KE?_ z*cR4@I|4m(fIDQxac_7q;QiWGeZz6_;W>X++y!%hD`N9q5dXw^wY|AB6MWf&-kAsW zB9Av<&!71Hy~L;A6svdk#b`$P7NdTNK~2?I?bO!aN{Rj=$?#ryCA<-S8(s_K_lMU5SuzKM7|a+RtO&!Y;hCP|4!^iBCTHIlaXFhE9P=*D znNhWIHZR`!A>&qdO1-pJL);WbEmR+uOvv)Ry@MHmytbou{^Rys;(b$$L+G@rqkc;-H7) zczPx1zx?ERzP<0OSk%Yf{JA%C#{!<<>7jrFIHYFs@_qVwcsB6+K#-$2>EkdyG69LVX%)RwNg^X(mn`BJ+V!oLasZ+JDl7G4Qr zSAVwN3BL~C3cm^F^8XHcfdA|d$L#gNJ%4hUnUTLZ$e2G|Q5$&-2fYm^^+j%a#opTB zTSM0zc~cK>ILF5D-G1KH$~%x}ANXe5_i?FT-w}K_e{^w^&xwm2?*qBBD{nU0nt7X; z*zvw}wnm4{*z(TC)YG0WkcY7~`gHjdr}XYi(%;$Sk48rhJ)sT+^4~t*}*ljdUuDC;g|I=)A8yslMV zWYmf+^%a*lu}$ok+nZswyp0Zyi-m7*zYK2$b%fL5{Xj>I2g8Bj-uK0P?`?l1(0etg zx$lOa;vCz!q?h`lmbfAx?{cupn>`#;Cwc0fJ2u#(Gc#%qFpjPG&KlE(4$*(%# zt~_v03?~;lVp1^2Js}R;Fk~g@)Lvkl@A#`CTE`6U~BB-vc3E#Hahk&oV}^N z7}@pidxPWb0XyX7MMv!9@pk6NO2$1IdTfZ@9UIn(h3?#wcTbj$k@4=#_Qmhyp z!V`03C1wibZVV*Pp}TXb>~r;|5-k7sK#`O|jyE`SI?J4mq~1^u_CJFIF+z%hB(h zp4#IVd-KMg_~>{ihnvGmXL*fH@^cp3*yL~OBo=zUVd}{reRk>Ci*wfIh69XNW z9mZe%AK(g~YHE)MW(X&60T0~axR})U#qe18Nl-_6xHY`}R{K{2?)pZ4);sR=X?4bX zvts{Ypv#x}Fb`%2$gtu5zn(w8YhuNFcIE5LCRx11Q~8766f?sYd+JC>E!EJQ+SAn| zd5cBvm%<0ZjNmxC^P5LU>_@}JU>4Y*Zxs_A_HoQ_%179H|yWa*3#_qe0(V)Dj@{d_n0vKI$=_UQ9z5BBcnjgB*0^uV4zj4gYz{D~LTaPB7` z_hewHz0td^`yD}TR)m#db+{#n33vPk=%+cs2^_&E>)~)M&^HsGEzWpG-fZ9s{<567=M!aO*vq5*hEquA3x#w$qKimGXVD8B1lkbYT^tXjR z%TsT00}tK_c&*R-7AuY%4`lGj9N>bUtP1Sj93Bq;S9mgrQBHizWpns`crdIFWrC?7iWMH+%9U#~#khZ zjnSja=5QImM~_W;(D66i_@y(p#L1VHuKmmiJF}m+iEm=G(q)hCNeC*92d@Fn>>#aBMOnJs&7Gk<>D?8WRIKgqD`cW36v zH(C5R@b|61U%Z(botajXFNBPbo7G$#O$6QHQ`I#`@-Lb*Mo09 zKB*IKiCOIY@ng2lq`6Qtb#`W7fAz;qtG!ssxn~piy<45x7oWS~6#vfN&FJ)8PVx~m z%pUJ>iQMo}?6}1?-{kGpXWoXJ;`3%+_$6Z=@tj@vz@EE#6CXW%;oFaL<<2}fySEpQ-wHPH_e87t$8)yKr~Gi89uCr-c{XSA)DJPy z6+7Q*ieGHtD_`;!pLaeEhb!S%;q72X%%l}}K4|qV!zn&NAFcG*wAW{T%_V<8U#;aS zMl~Sgo)0Syh|%8sv4bOc0W&w`W;V#E$MDBDfSj{cuDE2b)r);Ly~#se>}O`3$vRu< ziifT@`Lf}iZ|{7LtQ?)m($hz)T=^N^)0?@l%Fis!Y|I^bZ}I_loyYgo#oNs7*pjDv zzR1(H&VJ5Q>J^Qurq87cZO9#U*+hVjSFxz;1z!1`-fqF@P<>q z&1V9hnB!gHF9UyKz>BRxEPOo}o)5kUxK58vzgKKJn;Cq=e{*y#csD=Z@y@-oK3!`4 zG>G3lpW?O0XEJzi)yq@u_1>(wqszWr#y&acsfir%)vSq&j{d3*zBrp3e$Dk80jK?q z!43|qEje7e)OsP%r)R}2ePqLY@j2Ybb2X8>7`@BWyA_}5Tgi?;v8g@2h#&aCb$i@! z9zSG<zU-19a5H71Pv%K0W!3485^CJ|@@ydL6&)(SJ5P7q*1Q z!;9heur}Zbp5ENLE8wTuz%%));XCckpT3(<9Pnla-I`|&Kp~F#y=T$_#x}8UiLUNK8CMsxW_BDz#E>DmA5lH zzH#C*OYGBG9^8>PJLZuMch2se@nh`LA077T%pA-cS@vfo=S+{hGo7*TtPajr-$pr4 z4ZM#IJ7bGIKIe@;XYVs}R=&sr`!9sAg$Kgs#ooF-h~Zd0#}^#&yMlxE<`c&bwZ|iT zxfIN&?=u-(+?34A!K~dE@KxUWwJkgqeh?lHj|TO{Yg_|1@yh)97VwXkY~wRO<_pK! zwx>@{-1JTdJQcrpdTgjI`|hs=Ia~;A;Tr$AWB$yiS+XaCM}C{k4;e99@rm#GPQ2g# zH{rd&pB~U*57dhtF^EfD*buLtTPH5xjNygY+z`3wL;12$q2fsyTkgZ)|Pq;P6)BD!Nd1vdU z@M0hW;qCBRFiUF7r&{m_Z2DH|I@^fZy z?yY2(%FyQz#9$qr@w3#Yy?1Z3XK#IYAv_&+hv&n(pl5gl_PDQi`gwc6cYMHAvxaN? z0&ZOhc=^5L?hii9+Iagm$5Gnv9lvDd?!QR9OI(Ay^-||VBZ|zxV>5SE`PI0Zg1=H@J=vu?*%^D z<==eCg%5R7PrB^jm08kD@sJ@)#+?}4lNTROh{FttiGBC;+o9%oGF-9ZJf7hK9tu6o8Jg*>ErTnZ`c?f3y+31VP#kw z@Q6Ncvt{ma%hsn1WI^sAMtqo= zCC`>z)XUi{h!6D18Th9se!U00z-Oy7j^GhldmIuA$kQ7eqigjx{8GoIZ_dNNiDmq- zBSsu#L*3mu(-SjUvDl9vXE{vFbi_svW=~hV>SZRu+xQ>-@nWP6s)BFZ^{d zgXRm@#JwT>Wq2e^efh;7aqJ9y;1s@@Cmb^mAGSAVeBq9xt6n>W){T89zMw5S?uBzpL)C--VVPCzYJ`s8DF?V z->SY~ufCrKa|rUB`jD5KTqlm1Zq_-CeY z3m^1u;JP5FE0 zXLPMM}Aj@<%{>>kb64L=F1Gx$0;$gfs^i> z$<0|U&4u&Wz*#ogkq0|$&>jAI8$TmU#(re^;nUeVn0x;CxAH&tGZTEd8#n`rDrRGo?YsU?>LFm9|U)}<2!9NH-IB#aE`5) zdjEO2HRz{r+V{eP!94l4vZ2N}gL~#2w{V3W_Hi30@n~c4-y-R&1)pFJ@$gh&(_G1g zt@Ewyvn?0#n1DpqqZ2J`oN-~<1}Vo#QT zdhEDolW+Fr!IzlvO77yY_fFq@;RqY%VfJdN9_*?i4$z(7B=Tg{Zsv$xTq7qAvEqq( zlam)2w(QByo}9O(9QB4z?2t7R_GZqWjx!xx#0zg^*$4WgN0v>p za3Gkgi@~=OAIu>xnKN&=Miyt?ZAr$g{V>RVZP*b0Dm)v^#^-^bqpfW7$JTJg9N;p} z;UoLxanCmzmvHw&=Z_aMr(1{T`0M^^pmQvE!|&nvq4r{7|BtOl0w2zD!BzEOL+a><*8F zO#!diGb8l*vd2LjHWN4qa^=@=i*GV+(-jBqUT!644)|y1L@*z8_`=)$tz__-Px0dL zsm1EeJzsR$#od`RwejuYcfLdJ*kIqA`O;f8n{NlMis5P)S#Lo8C9brd!C2R_Mf&={EC_S@gCh&%R^K(AnC3}3}6aSwEGB{~&`1DR*tY(*t zIpW8hdS~msV5Yp`=FwJp(Y+G>GadID+V`F1d4AaoEbI*XXxRrlv*cc>u1ZyIl}dHj z%%m!*TTg1MdMn)>X0ko$-Ynbf)Ic>8mORLV5KJ(}7-NhvLI`7wF-8bsgb+d)V~jCI z2qAo^!sbadP~> zo{`;08TrI-cGQJEHLthn_dYq`zx(9c&&K_%^{st#_wNO@!UlVM^*yG;+r-CRHDqK@ z{nDfV=y9*TVsuW{=w3(pSC7`@)K2SDy*O_#s2g|HT}QTCm+q0F17y6N9x`fDt+n?0 z-RpT}=^$TOb28-VZT&iD(`dhU%l?_~XTS5>uvb5vRmMoBBmH#P zGfw(qO-FV0-IIIfzYDJfy`g^Qg1S^+d{(!MLH((7^`yq-TaC!C8dh`9W&WG+AH$Er z&w{@loI?%iExLRg=%HWDJJ(zMz-~~VYRky3dh|D(dgKcq+&AhO{`1Lq(7v~*ZRb~m zy3rqO=^^%xk2#y(souSvef8;{H?pTk^@um9PdeyigHL*gPQB#!g1>Ch<=m)Wo@V4H zI}i)|#`YPX^%Kaj$3DG$m0$kx&AGAPA~i?ey7i_uCTpd#_SGd_-qyKw=j}zh_~VR? z>QIN(W3M$@+iKX}x6iCw-*k{ylVsVRJZlel1G(yS&l!0>fq!JY$GNd@uYB)UuhARq zlZ8E_{m$LzU-!-30U3Q}?0)t1ym4|4{o%h^{voKNwV)0l*Lrb%jQ;KWO896c>-w%HbF9tQF&h(k@3EjRiYFw?VU+YUjO{%M{puXvYcsk>Qdgc!qy40PTR^x1` zeSHFbv7M0)_fCzG4E>vdZ;KiEQ+a!8Ss!>Kd;D^T&)zI9M!w4}8GCPJ?%nixFP-l2 zfllw}eRFr5>pd~DN6ve|F8TWBz3ShZ9KF`=+0!T1?F(~0$a!nXo79B3s#*JL%GzAr zPTrxjHAL>)J>;Hqy4th!*av&o?b+(!ThD8s9(BqGcRIJ^XRrhR*C*fa9QzOhuMYdXlZ|9X!c|DDx_JLYo7_kS1s4JqepS^ufq7Xtt7 zzn1Z>@cZCz%{PL-HQD)2`1|n6KuzuB&PLGJ>Z9KVcGb5YQiEjFnR>F;YkW|HYMYOG z$r)W;t6kqbwceiPx4vjUS^M77NoFg^{bEKnd?q7b)W2_?8uz=vcXQufHu+B8w~e2C z=G$(V4dmz*3wOOu%;=_1{aMo~HooiLOt(0Dlin96`sKu#IeDWya_nttxT7;WK)_ zvgDl`(R)T~x_ggb*40PmUj}(?9{)OX{r8jL?@Rx?+dIKG@Au)g@XH|n&VCidRDG#8 zHF-Jck=>vUXsgF)gRu( z$E9(mwpRj~TY)`##jFAv!`yo(;l7P z!7X+hg|0b?uxTYx~vTd-b7y^_?F_RuAD1;pOn#@E^l_;m^Z6;fKNgn?Vgc z7yf1Vhv4s4e}kz{wV^M3Bj9)6dNZg&e)#=X)8eak^h*0nKdD2q?$JknJ*Zi7d%>Ri z_RZqY^^DHwrPG=oxt`BRo=$sf!FNxM>m~g`o-T8~(xoSi-oOv{__Pw(A-52`lP~t# zukLLGeZoIy^4}h^*L||!51W1m`Qev4$6obY^TWtiVWalxq0gSVkzDtB$4GZ|xo=LsckH=W*~+;0zlG<+Z^JLb z_XAn~u6rr?{{3Z88*hZ)1af~JUJi1rE|-Gu+FVe}+rjt2J#Y10&_n$jqSyp;?pZ_Xy2{H`wb&M)tLHsrnA9zV&ed+)O6cg38a za;HDM)tUG6lTGJf2hM9#yq&qHj|*SuQyXg5T)o0vP4&z<`$qTlYU|lZuCng8?s`vM zy6I-#y5C+iqPobMvu)ltlBwU$ zs?T}lE9<>*NByaPIfT0QyC`R`27Rc`-VJ{nJ_>&q)W}?9)!|ZD59(Td`c9~Qb*IMZ zRflSdK7Hs+|FH8gBR|xi9w5gDJ=E`@@00HqU)fTR>Xu&m)fM~n=^Ztum*}MHd`2>A zkWP1;tp+;Ol0Ck-JD-uPJND`2Gu`??t@+I`=a<^I=RV)q^geSkY&g>==H#J2+F!4nx-e`D>@K~}A`290{QXYEV-Y*idK z-!=7V&R=!MCp|%zJNEe9ZvlDd`jTJH*(a}e*mq8+-ym`ufvjHPw~>su zl2PCKpx-=a^tj^G! zvC9V3h}vOKjj6fTkF_&0YS5W_Yu#JBXKanS)B1JSzB}qb4;pLFx_;2(p8Ks^d*tbd zeY*JP%$&TnI_}(vo_9@0ZRk7o4fFOP+4|qPHJ|CDqxvT0CUrX}>wWfL3I4|PZ#m=l z!%N|J;opTHgntUZ2!9j&{VDJ2wY7dd^D{v|s6%--s(1BDPEG1Z^(N0^^723(su8tH zUahN(^*|Q-tF=PT9kplAUE};1)e@WR=?(SBN23~cX5{bXz#jd4V^gjAt+1ya>1WTG zTBU~%-l<>sp;q*xwI1^hddR8u_JTg*D_OeP*7x4%?vtGHP5<)WIXU;-Axj^d{O6Ot z6Ys6iJ#+8$2KlPLMtAM;k1qbe+t}{!3Y+Z>_3e$VoA!qhYTmcnsOHtAJFP?e_SBsE zqswT&HS646GH}Lzd#m@`W3_E`*1C4yIybie=+yJD_igw}-q^W2eFMGy&8V-nT{$|* zd|QWe{(%kmJJQ>{`rRb+_u-$ycf)VP3&D3$KIK^M^8OiEDvTH%Dsf#Na`KrF? z=kvATz22kt=``0r?2xC|o7hs%2Ld18$iBW{kA3mut2f9AAK0SHU2DB%{wUDRrnsNH+bxHSD(8K&<#~pP6`qYVg zYTq3`sTuycr_R)F>rH)41$WgVzxc8e)HK`lsWrCQRhv739zMD2U2J)e-w{1`J)`>P z2iyA0zItyR^OtTlYR)F;^(J@R^&aO&clp6Sd$8sQAFhU_ApUx=d*Z(qyix4<3GWkU zHu+{wUwx#XEo;8%A3odXWBW-xwkG@SvNl&w>ac60wc2&o+EjaburaYuPK`R7Tvwkn zdgyd+Y)!YH$+ClEH6Ow$F|^yK1)b^^Z*Ln1k-xs-Kf*jQZp*E+Q} zH~O8DS97#)x)y77*}M9n^-I(|x>%TScE-F_$^!58@k9_xfw{JFrj>?hk z+&{zxURAVLmK`vq25Wx7r}n|2=`+ z)gXUrS8viIziL2@`b{=>PhQl6IwB*t^r~_9#k>9B&UPS6kMA`5{I5LQYEOSGXQUJA zmCROXPq9mm&w7JhdizcDH_HDSc7`1LYLY%O`iyVvtLtakw?~I~f(>VSz}xf~)P2YH zfZFF9#7KNDhWRiT7K7guv0o43VD4?!yFtH!JvzKuJosdk7xQoTYJ1Zg_{s z-tOJ%(3{o2{8+0qdq(wczqP0SoK4mw8TASKWLwXZ^PZD&hn~t+U++8b9+@)P8~txA zdXHah@xQ(0+*$R|*?wo+okFI#U;A_xdvN!o@Ok)McrSb$UJLT32Iqr%HupD(x>L_; zKu#BeeA`nC_T*8n)rEW)wQ6o8Z!WiTe?7>t-mHu|k#l*rcO&?{AkR+gh(7l0sSWnm zgTB&B{BT$8TnlPWebU1w+uo)(_~Xvzn0q%n^wUef`+Au%^?Q zelxnmANKh{)>|v554%Uk8+QW#SHeP=4|>r1`0LI3&wI?#JT@on^0~3|7H=cxP2%(* z@Qpuw<&)nO^N!BQ_}$^FH>$hVcSm*EdX+nMtM*%q?l@Pgll^F)3_X*zPaipYoVRD} zo0F&C+PM+-J65K9Q6mF z&iSF<^(FiFgC4jZ=;O1wH#t{xd?Q1LTBe&Hi$M*sLxz2Rse5+lP!LXKj~vJu>9Bt((CZGr_+VtuoSZsRduohN_RZj?+vJbtFJe-SJW56H2`b|=Y>PhYSE%6@s zy-{ENZyA%dsxRGBqiWZjth$BXGSW%LUFUj}teDz!w>{##derdbdU8(Y+c-yiy*AmX z?fO$6$@2sB)ep8SV~>xMZ=AGcpS*miJ28Des8yT^a;K-Q3jIQ5eMfuG+8t+P*qyXPC&*n*EY-nwxD@08a?`!$Pd@I2 z=G6IGI2q*he2^n~ls`FYeY&HjXa@rM)&zcmR)rx7TX#9cF@a~TA9m8$DMF4sOM8b?OLh5f9CG5FPlC62gW6MLdPHs6gBt69*Y|gqepHj>Teq!od#z{R zP|&H*)UdI9yRNO#zA$f{)6w(Ey~)0_-yW$BHqH4|``t4_Ui%JmVPa6`8BuiTz#kodyqf<>i+%kFgyy^g1pJ6JgQ-5`i(t) zsX6s;e?QP8-(=LSbF$9Z-3@A+E_T(kbF$v0X1s?zHK7jqt=7r$NnQRac*8Amp2Y2YBhfY1C|NR}R7Ww4&f{*+b3-|RaId{d8ymjyP?>2g!u|pRdWQ>i$a^~|v zAK^j}XZy3^Y?up6VI_E*czP>&XGZdugERN_<5t)Ud>2dp^SLp&pSj%e#lDe$YOFP{ z9-%f{pL$Sl>Omvf)~1nsYg#VlPA%B0USq#&_T6iZTeqgaeaAjo`+C4woUz^BC&!L+ zwopI%J3vS2?+8ESz5dW+-E-eV^WLjnqd1GVJV1Rs39G@GT*-+VBBze!wE2`{xo8b+ zW-gC%MMhuH`8aF@y405%m0vv~kMyE*y`=};x6i)2_UW=`t{&7U=%?E|-Mtk04cg6I zo%8EfAj>{I(}CYu3G2bz$%sQ``Ql7`+*Nygq1RlU_FLv1>Imdv&QCJlv!A)xh=nsf ztpD1tbc0?azZb)7m>=_t8JELCI2XSN(9OdzB~ax7cq7|NZV*_dDJ>JKj!44akXjZw2wU zR&VmM6V#x%uLrr4A9XA@&gIU&oXD9xUk>_Me$4`}D{G+}B_FjX(6LYwzfp(VLx#75(gp`${-Jn9VpB^c>EGnK73K zvKN9k%87R#4F|*Vv374ETn%K5TcI{@W$rCvS|9oAz5MY8?^AoebLw23wKt5`?FBI) zFQ#IpM%BK$C+A#^wqGXuj1DzlUG7ZwS@+4bH|j@wRR5@dqx+RJZx7N_z0S>jx9!(g zd+jB6<(l69wpg2^cg)4fo1M$ua!`lzES_R7uj*LN)qp)ROF=&PAwO#JY|x9Bf_}Ik z$Qk8Je)ItuHOD?XYFIs!qZ_SRb*u*6V_&_JC#w$Va(6E{C$DGq)#^Ail4bu|;EVfe zOl_;vx#0chLf@rk)h>N~BfV_6_ay9x)}k|elR@`8^vJ!7tK)}Mr-}u-gDPp`>%6rda9Ego7L4Gwby=ghi+#b+kZW)ZM~-loQt#Es6BPC zlTnV!Oh)u2&q`Db2zbn$_Gy;?uWc&|5rZ$^9M#fo0@?x|UR@O?hah120=mVSR5PCf?pUQ=8tS$MoE! zytvZmOfRW*^$q>&J7K@ytj;IL_K!VtcJ;3wP}}U=GdIc&?6;4N?&y*BA6@mu`Q$#i z$-7+}+i!elM}FCYTCivAoV>Vhh20>hYeBsCg1kGEhsIyMIg=MT(tqT|5-Z_R(4Xqg zJ;;Op)+hQ!U4hJcptrw^^vJ2vH=mrEQ@d)^oDJtjI@N=@d>X4)k2vQKpDzYFyz_YQ zd-8dpOT63@izj1LPq#AXk9&NjuXsP-t=m7=d=+QD^Fd8{pBiO@k7DvPqqy+f+&wly z9^N)t@BHzOxo|F=3De=^1m0$SDmd>*?m+k|d=rig4rV+S&W8DLVT>youY}ETBkTol z^=|JF7j>eyyxV)ti#M5*-43k>dc09hs(*RbgZ_V+=pV6b546VHW6spByJ}r;P1dxz zcsnQ89x#VHbke7nI%m(CzV;Yj^q)2P${MSO|FzS8=YzZMIVWqhH|bC7PHfcV(uk4o zju_itAM9sTm-28c%!b{u7GLq73G$^j?g#too?Z1uhCVfCtqwPW(Z3z!b2Z4L{K%Ku zs~zWRL7mzs%P;w)!@vFMuU>xgr*)uq=)M?Ehcn@L@NV|}2C>O+quvn*_not)PpzHt zLk#tg*pT&ZvgG)ohrHFAjM^ZtZt19R&h)T%8O6w5``#^f?(l6T%!c#9J7$6&n;M)P zYk6>H|J>O7I^%(0JRA-Uj%A!4(A8eNoVhr!g`FV(y94p%TYJ*``6&iB!(NaNIe`6V z!Q0fM`cxZg|E2Ik@ZW7F>z$nQ_KRBATjHpe)wZ=cU1*<~w@>tp^<+P_Kj^LvGL>b! zeMgV}>Y6=s^6Zm!&uEXVH5=ykoSB1<>Ph@IgIHY%+d=Ha+$i2;%$I^#w?54mLi5mb zBYC+XEACgr{y?6t2lYw6H5=CaP=E47zjN=SPyX$12fE0UC1<3AohN~9`()KQJ(q)e zP`_uw(Sg0C;J*1r*bMGm3l9QY{G`i!^^iJxnz`RAJ;tuzK7HxU?mO3e{G-R5tR7WE z^m&Ur-bP-ZH3sHv+ozuo-Z2+u2i|gea4O?;mKj*`h;EifdtYBW$vRd`~`AYb+;9J;lnRAGjyXrw4 zjj(SdL#H!i_K9JWV=FZgd&5TcidR@z?Hd^=9qjtTOot2<2)hYPv+&$kLZ??9-8R!)ow&`Qv zJIIKaJ^9u@*5>NQ8}%sv`6>={iX}UJ8~yHii;X;@V=fc@= zCd`Br;dq!DbL*4gSnzH#N5bK7bd2VQ#+p2t^MS49AkWvrTG$GWwH!1*8<}4mT*|l@ z_Ja6`hxd91#L73s-=FORz4x!ePr`SCdeukbBd+S%UTeFtSMzGA=n3-n&0F`AJ=brU zQ7^Th*w8Ee_oklHFYfl6N2YT&osluGt)A0m4l>mxe)GX7e$Rrq-U#;P-n$=XR6q9B zgj(DUYRo84bSwpObX^JJE?4xZE69&~e`x)J3N56@U+Oa3E-egWzFM>_J+4CO#)Tr9-YX{JCm!%StKMG>F9kKOcJ<_~W7sOT0otvvS?-ob$YCzqPUk~?#-$t_TI~RAk zaOUo_jLy`QxO<}~{SWcle`t3e&9DZY9G{d|8A*yo#ldu;OCp1QI}pZBocd*Y@C?N!!0x_0hP^|C{+ zwYf7n-~&H*gEx!Ua##rS!P{^;oEqa)Mw|@C!d!5Ed~h_Qo)a5b9|_LgnHkW}4truJ zPR2`NEy#!Wh@rS%3}W{vc!T$ff!`i-dZ*v3*1G==;2ZdA(2M>i)q_y)`pNGT+Q)S2 zMQ7c!R&!A6lRc;pCVQ&3^-KSjw8tLIof+M8zw62K$$n#xoc9?geITa?^=XMZZ zbMaDF;;WXf2leq*a93Z5t+>nOPIwU1@M0jZHpGZNXYyopmo9UCVsxKPbMkWI-{I;{ zUdh|r%)IybE4O-8ja~^)f;ZWd@1*YBLY$v$${ zJNl%3*8X$W@0`27e@1&`+n@H_ul(e?{cf-J)VkjbwY3+nhK)dneQ^`dognAVjGb?0 z4)?^Ao?Agp$cy-@K{|E=8|qXZ)Qr1gsm9olKlLS^&eX0r(@iJce3m=<%-!XuT2KSd z_~8zJ**O)|f;-MGgv((u@QseOz!x^z;UoP|g8uM3R`C zI24WytdECd!9F?i=K~vTt&GvWwOY6o#CJW&`MtnjJjz_myiHv6jQ;R{8>;_a46g?L z_nq)U@OPzNG*`!dtJFxpDfaY=v3+FSxt`QB`otYQFxeaJA)}ru>`v~ruiA^XN7v+> zT-WS%PL3b;jCV#Xb~38V-LM(tayi@`s2eqZ!Hku!DRP3n3pBfr>T+dG|`)5)eY zI@E|gJ;5hFn~MeLw=Wjzh<^IK!=90k-s}y|`J*pEh7OSR*6QLv8%Ed{H~RQhS^MVB z*b#?|VLr@-*`Uv6!t~%|M!j-&jAWf33x~szf%&0e9|yyUa5@|h^wD!ZxNo0MEQTv# zEo=q8d81LyJPUFuE@Egc4t}H5ZhO%;@w?%z@LJG+`bzy9^_AXL*X=)NdZu#b>fP_Y zvHd{KJ?GGC?wGgFj9u%Y(sO6_^b&pDXT#daM(5v_+sL~w2ESKw*BFVDx>S$iBj?V< zNljW`3+nA&kb}KImpwhFA0Gy_PrfxpC*5@Un_)NO)j&TPw&_yq^1;W}o_+aaQ|;03 z+?qXi>9al+=7M*5gZQ)UY%S;oHu%S1b2^NCA;&J8bXYe&yY4yp_MBdt?3MNoS^LI*$9m?zdHaf7=k>+t zE^6N%^orkgIWTuFkM_{t?A6R$6Grh{3wzw%1Qb1d(WOEvCYYNGI;AAMVWV@GZC-TV2kfAka^ zdW9_C$??~o(V8vj6?e?tC*wWF_LI3cyXQ?{Uo4z~A9S;A1bt-8`Jr~%BP%}3VLqH4 zoX&`uFf}pPFK2>2wSVke93AW984rg;ft>ws#`?(Ev(Mf_xEL;nrNNbq>p>2l1U_F2 zWH!Tt(0BT6^1JNsOTU@^+voSfJK=-yR`7jPA9_&DlZRfkZZE0%&U@C{*EiQBZ5`m(|SGiM5*317y^o(YcWf-}IZcT65;kPT(^i?Ws4uw{O@M zH}-q(E#$m|UjDBHvTSSw=e1`}pZ>X>`LnUEulCguzxx~I%$_sw)hK4}lT%wDXWd@& zUNZbNH+r*kYtRRM2s-SGgWNbX_Xcmj5YC6$a3-7%)8XV8r!vAGxtXA^^waUdv5c?> zb9c=39}a{Q!F{^eS_~J*xHRU?1s^wqnvpmD8gB*l<4xWs9^&hF`}y$W@P2qN_}>S= z6Z|(i-$}Jh&ZsxqbL|WD;0)$^!RUOl&+NC)^oVu)jjTEJKA-%}YM(B8s<$@S>-V|( z$X8A*)R#Pa`@a@ELHt3#JQ?ZT3HJSaoelcjmsjU{X)e&iPxsi?>qcw$+#yS!Gy8jE&R@`Hqz7Un z2KL?YKEBYa$MlQes;>Fg*tsJ{{L+iwFW!|krxSFkJMo1%Jx2G7Gyc%aH~ZG+-r}9h zK|Ice)8W(@r!(SYI1%iVF+Vamn(=rzHrA7Kdt|>3Uybo#M*Hs3I}>KZLg2?@SP60k z^R=M&e;?qNoI zWG@H%&dKj&+#QIkc+zDQZ)3j=*7WuFUT);0dgR0J1f6v8&zj8jz$P8)&EC~OA6a$% zDC4!@J?`{FePi=(-&@$%6ZF`lvu`k3+jnlxmcBCAXXau`hk1KU%Q5u$+13`5l6%MVBh*g zuxIY>f$(McW^gFukpWruX2W8*5cpx_lYGg+Uf2!mVQau|v40r6&ztvy-?!(&55oK5 z=i%MK_cQvNR8O?0TI=mI{iIj)fjw(7?LT*We{xQK^6y6Xd;{8RbWZA^vwCX7UUk&A zd*0{$*Mm1(yCb)1Z#AQQ`ri8eut(-`5IZq@I_7H`#Y`WPBQI`bovBALRA*v;KX`{a zV|%i;)bnz1`YxjyahpfgbyG zuvy!B$eG{e&iN`{@P@AYJ@f|izTI8euPyqkqk6=JpJ0=W*qgT|y+ItDRTul@oO$gaB`8OZDe`4Ahm_`~qC@aN&Z;G6i}@Ivr!LNb$m(0*v|>6i9pd(GIt zFZ-P{l5MZ4X*E09OZ~3W*WM!Ep3_g({yl5%t~>fq4S4Hn@OHWOcc)ycJ7;7d4tl3L zoQtFU>nE{NGuJY11hVv~Q?|+98f*J>lT#68j7*CA(R~f$!2gBh3Irr(A3HpxhrEoo53H&m`-bUCC{JtOLV>8(E4&&V*Mru%x z`QInr3I4mNUi9z6ABUHNe;4X0eW3o^gZ)++J8z#&_M$U)^_2V8?JKt1ulCv#`pUnp z)SdqF%~5~m#_F;r=PmnrlYFTcd0ZcJb)nbEvf=kfj_IJ+-;R4(>s|2?FY;R%>9f8w z_Q=vL#%hRv*7`?`)h7Gmz8l!)m;2Ua#h$!+rMie)!kn#h?fE zjT$z#PbPb-^Y&PK&VKvFSh>#I+jQ%@$=`c2Y&p|+?LGUj)IYqt5|oNQxZ^iFX!7ne(6KFkLFFdb%sek;~+ zZX|Oe93C9Ycr+Xu$(0wi}4X$Lo9yWqr!`4{$_tQCf z`*(xf__yD$!e58q26^{Qd@1;Elsb1ww&Fo~9S9;u0D|%8a(xq4%Zj^3feJ+McgdXu}=AWmX0KaaA09Oz@ioo9pgmOXYrrgpte zUy#>7?LEF&+qc)>D&H`7>EIXr&LO7l&-SJJWZW~-YmZ%X_vo=_?JY*{5v#t<+Ow= zn%4t8vsSA{wQuY0Gg#{bddY2#wUJ)&rq8*45_>i4Epno6{dUL` zTk6Uk`JltS`tHA1^MhTw)S-9Emv?xNdHq!X_W0*5`@#DPMel(DQUOX7|pAq&d)BV%g1A8z(A7;by7*{g#RX*2({PX#2SPF~bYH((s zeRsW4oxT@748DWE9_!aL`YlF#tYiB~54f*~)J)f%lWXs^-|U$e>*_VqSN(DfI_Sjx z_Iz37g!NhbHq<=5}DoZpP^a>k~*)=TP7&CubuLq6$O zYkiA&sI#4n^yn3_Q3GP8PSo_H%=L;hvTUgh^5)lq+TsVqc0Z8S$70T3{?NnLlZ=;x zxVyU*`0l<)yx%?Zr?Fvl&*&}mkl~k@^^MJov9j*-lRQ~(wl=zN^d|4|uDu{XE1^B3 zNA$vp!A!>XfDtFd(J(#M_Q;(bYjaGE(fs(pJ@@JFp1D5Jqo+gdxW@*0d$VCa%!Tt~ zzL;@2tcCS(C8(9hK@QpYD100a25)^3)SP_08Qu-er##AG`%P_|tLyeh`_ozb$-L)A z=(pZ=UR_3KmFYdY=r*dw?*z5b`qW?EwHh7;`@VDXuco|9j<1K-%-)dO$*AtF>1j=v zlW$DuC&LCE>^Rd$;;DA5-66Lf$ZQUtWz-L3)aKKS%|-ndU+;S}@Qa?^ASbsn@=ZVX z4Sr{y3*zzJ@Y>+5jB@v0kiS>L3&C%ZxQjD8ev5t>{LX$D^rADq@=yG*KjwN)@A1d{ z$?(P89ddjlV-0V$N0zR>-JbW8@hA z31>q4&-!F=2V~C$_w9pDy4^4A9S-E_Gt%i^M|#c=$iSNKi$QL$grzZhv)@+l{xW5^}CsRz`%JYUP`9p-eZ8E0EzBkTn=AU=@q-Qa!v*w37fM?rnDcPFp` zdf40v>SiU771xJ>zI(wvu+4YB2lUfPjvv)Wo((=b+YavXmp*GUZ1B_np7VT=Cpq#R zd?Dyx|EB+W_}8KR=)ZUSHu`<7tToy9!q3Lsxw!H}jA~Du?fLC%&+$WSosqRRmm4vB zI>!EPkg+E>WX$dL?cOcFOW|CY3CF|1aA3?&W}FUspnX7YYT&FrQW`&gcN57{h)r-w7ki& z-0}TJxEXvS=puV(u$S?2Py_23ZwJ4-;^pq{7}dUen}JR9+7Z{sL9Mweag--o9hLaq^_Ee8=7lzKO37-pKgV z;BVCL1aW&ebWabGA@3d;HNqC3VXh{i&&0zh{`!*4W$o!x_6~=h(>WhhPw#NK&M*7%t-x)jZ-W|}r7naAGO?uoV4?bKA`iAZGjPBeBmjZj{^MT*KPw#}6 z!fN*Db64+~^MPM}1Ngx=_3nSK6;JUo%E!y$g`ki0<7?r^;jh9!g#Qr!E_@jDA-m+{ z*thh>;0`^$cTZzW--)?zqh7=0_l}Hr>Mdu@hq-;DnDE=^P4Z&yjp8F$Vmcengz2FE zPXv9T@1_RMX2PklCevQ&zB8N-^vwmjt;v+?pu2jE){`>kwOhZ8o%7Khw$2BA$X0!} zw;9yOt-u#|^xok>UOl+u4B{f^VlN-^B(HCbwclR7rEl6>`mnvIKK!QphCUb61>CdO zzEnH?e)gN^+r_Sa^gXnHGrl|y_k#J=peOC|b3dp7JjUlS~ zyBE~M&KT)+SG?F_<7uFaZnoW_V>_^A|3R=<8NN7M9-}+gL+^W^-!;EA>|6}=xz9)b zSo7Jt)wKF=eEdzwPcfrQKl<(aQTSo-UHgmhS@=)kPvLLF2jT7DoA^?Y8~sQA&ET%z zz``C|dS5S!GhghPiw*4Qx%MAl?US)5*5*d^PNxiB40 zgsCwnZ_j;m{m`Dckono*yn3zar{m-p>2ik+w#bk#&dK*q?-?uOK0Efv^QS&9WWF5u zPu>|B@_LfqqrpBoHK6w7!QVNPJ>@sI{|3=VzI*8R&7MB9r$_Z>d$r#`>-M5^-yg_# zYfN3;jt^?|Rz`iY71ZNixD=iQ=WOn0emC3*yJ0)n>u>SB%*DgG{Hqx?@p$afS6OeT z<3ZR6^qTWwWvu-^*jo=qci7-7+w@)!?mNF4#Fbum_&^^Y?Rl$lCpc&4%2+?j*l&{G zC;cE!`c5qM(sMz4#ob(w{W5$M{(bmE_*cPi>hqz$tACcc`+jeK99|D%D))NMw~cN6 zE@o_-_nT+5|13Thag-Z~vC)}#h=;g{w>K_?`EYJv-dGtSRz^Kb{#a16C&Sdlcq;R= z19SO4AI!VfCo{plq95HO-|r?lccue5_KuHn(k36sxL^7DMIV3puoUDI-tD~y!+}7r zH@Qy_+u}e@y^Ecg%ZcAUJ@ZbGOTV4+Dd%#pkL1s&K0sb=nA`7K?buh#`i*{=(;<)G z!`-kK?gZZ>@8Or+KN_R8d_T>ohIhlI;O>*K6X@H_s8`G%W~9#%-=PJ^knn=FZ!LWI7i^ zF|Xg&-YWL1LA)-9X`c<;}@Vhp8ZjFt>L)oFAy+b73y1=~H9ud?su6 zP6qev&rV=%-#xm?Reo};ZTcp0j}P)l&wP;2tHE38I~Ia+Hr{?cdG_VwLA8*?Mu>P<{;1hwvtz578P?*)1F zCb{PepZM3an>pJK>cYKep?e#d(?f?|@xJR}H_*YRJLXq1(nF5C`R%|SpY}rgncmf~ z6zI4-=Hf{IV(_LrVL8YP8F%a%<$=wez(;;O2yF33-5bFNG4nTtzLOi{OF>`hJKs6| zCQo|K@27q<_qVDw*|&rLmP%F*CE&lSh6~wnAS%`(0&Vk zb4Is2U=t^UeIp&_ba!-@jSHcE$frCn250u^JTf?(@vBfh^_xG}g8JDFVkG|ZV#F&! z@5#O2U%B^N?B9e?8~OuejQXkl`Oh;i>Pg;j#Lh}s4RXr%-Ecq1yS(}>-pl%N*bjVj zU;VLbU(VDnUG6>!z8N<&UJR|7JDKkUcGbjMp#SOEqvLiUXCzCGPPOMAeUAbeIdBed zV1Fyv-yYC;D^xF?3qh?chwDM@Jqu!je((IfsGt0MKpf?vanL)@2YKj!XOSblhM$C= z2L1NK;JZg3d@J>!-%vSWQ@q7hti08_eWo|<$%heQ)}C$uiIe<@yZ6eawHT1+zq7KN zxp;_`9E;(6P`ePLli_%n4yVHDa4uA4E^~K`;_mE3aL*lM_sQv(r7_k9oil;F5!KO= zZTnN9zOco|*{~R{hD$+y`D34LIu3=e!{_1P;2+0GFJIcr^j-<#sTTB^80#zfHv0Cd zf4PPJBWu)q&f1ImP`&sb%C(%E%Y*o{1O8jflfPxzbni*_ zF{hUtop-{+upDlUIa&Mbfz0jjD6qSmaXYa0G~-@y?{T;r+~Fhr?1}%W;2!_QQ9Su1 z-(=XMiyesbk+2Z12flcxx@OnAyx(t(82XOAAN(C@-?=#Z9du6&^ouk7_M268$Bz zoBrxHg5Mq8ITXGKUl0D2@#FAGI1uRa7Jksl4|=Z!xzJB~MsD<(Ua+?RMtDA`6=(gs zRG+F7BUyc@_xwF-yc69IgM7)!-Ecjyv7WJK^fjmQMDAAD3j2W`_tmy{?}e4%jPK5N zf?n7Skayoc8TPM*m9Q4r#%lPp=zEsY`9`=B_~4$r zOo!RPjyiP5oc+f^FRFQn*LTCe3GEx-vk$`0fLI1@8JLHar!{Jak5WWtdh2Mvd!=D0M^nwjO^NXJwLCpQeKFR!H*bn;Z zmGDx~dvZ@k&zN`ZZzM9lrOx%@?c7&ees}5mZ!^lBT+x3eJPq=AFC)7~_wEO|x)H?G z-p#NX-1UC)cfwwv1Gh527FrARu=gNb3hsbD_sq%AL*{DG|7@%V`}B#qGcx@0Mta%f zBblu+itW)Lw(DUnTpuHy?$G1y{1g+vcYep73;rFTA72mp@!y7z!mom!Bj@)`j9(1C zgYb8!{`0rz&%-Z*p4NkSEx5y;UXl+vH|jzA{1HccdJkmPfsuUg@?V@DjkoA&?-JXM z;H?lZvGeZjAntOB-9TnO%!ac;+^ow==FTnzXPxT>d%ZiCxqgtV<>1U5)jgg0=^#g# z3ikA%`N^?%M(#{t^IWLD%bCmfr9dya-ZLHzhr{RLlkjQyIQ%g zcsGcZoai(C2esE;lux;7Px^g^{inIxoX{bc@~3XiH!`aI*5|#<)xd*{wJn$H!F%oT zkKB!LC&;Tk_4qI&oXNE~(Z!}3A!qF#9ekiy-}rrJYj&*pNY83GH^$|RWZZFAZ0KQY zH(2ikc20()VLmJk__Gq$gSYVMNf4X`|KBQk>*sN_af;e~^%=Mbz2J+7BS5B-S2YD7R`WpX@teaP( z*g##0AfDolqHV>Gv4 z`{d-2Znjp!#b8fuRNwi`XU6(?#)ILD@M-uk{62gVz6poJk#IU(4%dVGCj)zI?S%ax z-r}#Xt2x0rx~9F`*#AF+u>@kzY*l=R`Bm1^=Q5v>hbw`&zH@>m$|^_rEns!sqePJTA=0!F!QZZ|B+!6?7K$?ef)EuKlYt>Z4R=>!x!PB@NxKX%=M(TGcx?X7TBE*CjxzI z;a=$9B#$zeBi}c9_w6fkC8yT<@Ns0teJkvSr$N2S51nN0W>nkvgZXy28uY5#a9^!D zbH^E7{OaDb%zI|s3%3LN^s*0U_UQAD_0U?np82If&iVPU8dd^-A?|#oL;V@8cY^y% z!9BGw7Y>APg7{7cxmpb3ycxWMf8Ka!j88M_2Y=uD{qc7O{QJ+}r7s8l<2$DheG7jQ z$od;apE<*?!}~#>>Pz@GlJR$}?;u-pCZEllxjp^ocNgU3-JX6l7dt)4XLI{<;Vp6? zHh07Rz+3el8L{iz<$NuOi8x*f3qd?DhWRiT#7+)YCgyTxP1YIQf&Iz3wR3vph+g?R z8_tB8!BoamW6!?%=`qe`ggf$SpAI^$`2lZx6i$Y(!{_0X!3PkI3DPC zmrnLtt9ndKAt%jMd#`J`+#hncGvdiuibi3k6E3-z8}c_n-|yb<)$>p^e*GWf3f-*5FT z8GWV)+n@UF`vZ4>5WW}a)Yt6zJ=Mq7{_c>=?(?NI*ZR`j?sM|WbOnq*TP=#zKw7@@WW`I935oU z%%hCn?c50Yrqdq%#+$+2tss_stUoK6&xWf(p1hshnJ^#N<(IYCJLlU@(C>UvQ`6y_ za3mZa>vI|DU}H7V%SZmW+j!|gvDACd1^tH?!fQbfy%l^5^^$+z`3~wQ-$-jch@TJq z9qR8+efPuQZ(E~pq@LEF&gpnQyf{Wa=u5rWzO;7!onWpH{k@{sgc}eR5)dDO?HSyD%{qJ7-00kgKe7d&T|AR;M#{L-sLdTGIDu6YzKDCz2jzB4eP=F(eTIcX?QPu5Z(^&hF8Of;iK@Af7t^FT_Bq<#bRoZi!ua?C$} zE6bDIJqYq?6en04)qznyywAG%Hp0Fbh&j29Ag5xv7UWFKte1kEh@<@4H^Lqn?U*6f@3hSXhuyrDQ6}}E1hY!PhgV!^D z6b=M(2g4`f*Wn+-p)eKr^Is+2{_ar+|6RC~y$3sylQ(+-EzZUrCU2M|Dj^7ux zt^d@&p3p0L;{EVZ`1fP{FypU+9{NM@J^M+}D|$>X={?Y4&-d}YAeX*#WPC^UqJK~7 zSEKK#exAJV_rTvdzR`RYXK`)58{;S0do*}DWUTFz6|0`BAvv?(z2;j@i>Vlim0Vm3 z7s67I6Z=Mxy%NYd7iT#$y4Stg%+H1SKz0)Hr27?t#B)-S^C{)Q@_#67vp-k7p?{8 z^q(1PvOB>W&WCehDclbi!~YQ7{A1TX*r^RZ@a<-(KgN^cqafa&g)hTYpno>dL%%oe z1~C#h{;?;{dZynre?R^#{5I&p|2^nG>)(g}BmCW%`^M=Z-$CEK_L{#Vearm&&o_?@ z8~RV*+5c(KqutZ@WcZ`^#KZ5em_LoL{CyVo$7s*mKD)qwCPY&*qHmJ=#!i~^6+02}Nw)yURq_=#V z?qz*HJP77@f_IwlkGY!t?<4E)D|+`r$LpEXDc(kBw}U%Ide#FU*s*_i%=vjMkOSLT z4UfaxSd*8B-QfP!;GOhs1$kF*&oZ)a?JnrzBmdZgTvSGmz6_rXKF%nnN5WJ%7Z!rI zvF|;Pg1;5~Eg>fU_Ve#PJ)~FuB76|^pT9Z(CVU+J!{F~T{-5E~VE^9+J*%Jeh*nUtq< zHp~s^us#!<(c#QmUY*Z`(}5nonX^IeX!tUG5k3oVhv&ji!#6>F90_Fp6b^)AflWSc z1ogTX#AGd82@k`w;QVfI?wfc&Sl zU%@xg-=@BmdQ7kBspmuc+g|%nuRRxhGwr_+{Jp~;zm;OF2Or1R@+fmTc{=v2&HYXr ztLY1$i)+ zclybh!@hI!lXqvcJ{R04b3U97-8-52nTfU90A2Qv2Qml47vcBerNO5e?UOkaz6#%j zslcAMd)r>v3|qk)*TUoQ|Iuy#pwbR>IX?PVljcqaU2&IRZ;d{AHrQa# zcVFDkg!-`Ve6YQ5^u^>#yc6c$-5NI7C;1>pE+*MwZ`z^DuKn2Ir~c7668zg5kB|PI zr1c9S-qxH5`=^Puy+P|w~szisb|-w$>6$?!Ml@5V>N{_4@+ zefr|+{>15esHa=Wo1?8S#`>f_=+8NASO@tsZ5S78W2Ae2JLHBK$-9#wAKab(#2p%k zJ8~beRt}1<+@OCr_Jv&D8SZvZ7$Xl1W`F;fJCvMlYpt_>`)HHXp7ylGcYE_)&d3d8 z);}N5#Z&QcY>4HtA|8xqW9yLG^ml|aI4e8zJg?Ng5|_idFT|N}9&vOB=H(ggtbZ{{ z2gc~W74GlE7~}8NAjQP|>0sY^ti3k+M;47O)V7W3A)Z@ z&RN*dhH>jiHryxsZw8-8_V`NfjbF!_SRLZKDYnGcuqPe1thFB>Z|nSi^L;vI-F>09 zy74#KH{<)^{Znt7Mq4fFKeR~xXYKzQJeX9w*8BTV&3W5C6dw$A@3*hLz5QzNv*EWV zpZF#|?&m#0Uax;^jFIBCxbJS|9ZzIA-F-@IQj zkni?*e(-ei@z@;eVpXh;N8{ySb6fDyUe>aGBo2=D)#Qxb#oF)0YeU-mbcm<9`FG!` z+Bbu)IEgV`XVj)|-T8PU-VS5t>}^~gSbrhroZm~v?8PVdaw+UVTKh`S(HEargFk$x zcVIe;f$*4+gt@+!?PAHYUY$O{|am#Q$Ez!?o3-xA4cYCg%I5zCIlG{8V^ny_0J1 zt3lVhcrD)`-nT~kM$-M^`jF=I>1x9qX|40=lg7y3)RhD7MNYX_ci|4)jkuE&cXup~ zhWL}>X?!u(xf7BtI)`I_><)KE?ikYef!G&n74C{OMjzY5n%O3&KDjH{c`eSxJ45pI zh1fdeb4ffI_s9B>Gh4zQ^2@&bvWGp{bq43U7MH?zlvEqywh*U7ejN{gL!3&=HDm7o z?a_8`#@MrmI61TVi(!qnbI`duq&4Qjw*Ab@Vf*vtwXpxR;~aU+xcc{B{oh9vYGz$j6)U;bQuB@||!`;{H~0?rr~tP$QSaoET}#t#e8K zIro_m=L2yvj9&|PW_e)!-Xn*th;yu_o5X+Sm}A=^A=lG_K{k}x(UJ?o}j>koy!&9Oy) zF)!DDG9HWvVpBX7_TlUKxDprQY_O;A{Kvw$@1;99U7L=ax|lo{^xVUn@#<*PrT11? zBZti&32TnV5?xp;oamy+zg9nPZuyyM=%B_aRS#@FKq z@x$;A{$%ja$)ASbn%+FMsXgm%Q*E_5=k(Xdw?loYbN}x7>G+fIK6)F~pm$R3`wsZ` z8ozban|Qg~_l0`9QU7Lm3$G{XXuGdDKG)GTjycAjJ}Cy5f}Lqs4!sfXa^3|g-eTw8 z;V#_=U3W>sI9+)KxqEmK`g>!~V0Usc=61%8*fr38^j3lO1`*e?Dlx z6PLrh+;}`5j?M8zuAZ+YhJZ_XNeQ)k`*pX{|iUJLm{-(F(+Y&;#eLN2_RG-n?+?V`TT0VauU)14}P!oP9z<;mv zcHI}=H1C`G+Z5hHZFPsgiGPY;g!k}2<9~-b^tYqA?}xwrX3c$}wtuVn^1xf@9aNv{ z^i%PBA&%Zee%>BxP(6Ah)scJFHZHa##Q0kM8E<;>z?rQhZw}~~gL`%l#|GlA{pyg% zlN0wKSLMKBjKey2IP+lMp&Ws{PzRGeV{B(~w$1GdW7`MXuf(jYhm9R z4}QEJXU4dDWz+r8XVboXxAt_<6-U15+e55B-Wqy`gS-_7gFkGok6(q{V4n}{*qB0U4dd<=*3r2bV(o6+ zkyvSqx!6P8-T9RCXPbmE%r)XY?H#DSKlX(>+r0?=IYwvinA?@y5o&L;t@h-l+Aqd) z@%$Lyo_sU>c92i}ITOw<2F_}pAJ)7OTZ0{Y@Y7j*pRKX>e0-?>+evvT*TwWya-P>c zIIH|}Prjk{vCh8i*i#PAxL&CJT3E|pcIlbdX2;&w;&j;WQn)ws+PlIz^%r8^p%^_G zbo|~sm*k)GiM@F9)qa@m6SdiLR{QbsJP>Q+(ReoO zeK`2*`w0JSKwYQ-?~>o5-ax+})!;wG58@l)jr5z+Z`7ZK+Vk$IMfLW-LJg`*Fx-F5e&S!#%-wQw|t|8dY1`=G3Qom~)3W zV{zM@arY+H$HE^VwJ0IS&H%DI_ z#rISaAFXWHYL}etDqIy|twAzZ!k@__^SZzYEo=HA{o9zNa6ES#xS}w%=3RT|s`_>Wnu-`+5@Y z&$u!AS8FeXc(`A&6?+^Ra^8>oFt0zy=q(;IKJVIkcYY|`;eo;aB;3Vh&!Vog&Ooese^U#jqnc2edFFDwej8fVW_7cg})Jh8uRZ&Z{Pol{~U7G=g;bU zOTBgKPMxcFusv(ho2cfN#iwJ=sZoDB{$Z#=zN@=gd+vGGoja00?gHlA<3h+KV|3j0 zh1z1_F6D!`PQ+P^^-1xE_OT(gr{2_=WA0x*9nxpS-e{-F?+d0^t z#I}%M(5AzlTmier*wttA^>{0s!yFy{o{d`}uHtbmZm)eR>0B4W{K;VBbbPdVdUO`T zJ!oGE`gGn5YwTrT`;c$P)eyro!8iTOp&s0gb)@evzouRLXq&qjY}tp6xvy{dr{d+t z?Ct)X%U*n-Z{0g#4Lion8*@hXG0#As@9u|h&bliejR)fX*br;u!FXu!Nb=XQC*+j4 z*wZ=Yf16hi>WutMsLM}=y7^9gFE+*lasQD2l>AAku?Is9{-1%i_fbuHGp$ia-aWOw zBGlHJ@aEd*^Wm-an^oI;s4jgE{vyor*L{32iv!QZbf-}HU^{9Uf?To>X-II}Tr zG1n&b#a527YftOso|v4C%R%4X?3|0&;!>O+Sm#d9B;BuhYp(=*?wYQ9cq8~tN3MM~ z#7dp)5BoYdA4s~|_GMFS*^mPVgKzfLXVZD;>eGKKUJX7z8yjNdU{mtpcyP!klI~}B zxHrB#!*A!~@5U#>?+M?uJL1mp{(U3-9#wnZJoN|f-ao{qfjZn0{}FzFK0MmLOnMX5 zryBfbc=OaC)S%zG_VMpO>P(HQPt4z`U$5xsX6k^xE{WH+G3zB2kDBFx_v9@ z+`fnIfnD(zb9TkWdhm%K#@&OlOK~{ZFs^prNiGCGE{9q>7j*3Bw+t!9d;~jk#N11@ z`RA_KH%s zTY1W!ytv|CP8D_F+TY{Dq)no*p~ax_@>^{_)G%?Wcb2 zL*H3R{_&N4ZMEQ>=18`j$DZb4Uv`Wg4)H$}&gLw?inW6+$?dT<_QebFSUeuj#Nw7IIFE^`SkP`o`(eKRTrNx)=9m?8uPr4hO@$J2Y?XK)5e*w)Zb;@2$Nj$jPqS z*ctBp<-xW^ZR4-Rj*vHV4}0<(&f?s1@51Qw@0~F2j1XfrA$H!n--$D|FNU{JY}mLJ z)24ZGI2W%6d+Zux#~SOcBi{}_*w0{RbQ;Fb@w-u)~Y{qY(E`GV&2vH+Rk|; zE)8kT^qqt`y5{H`lOOzc9&LWOGq&wlu_3%)-n}2h`uI_(J^$TLZEX(qruInh-~SVSlN#F;-b?kSw%J!# zYTMY?!?-=wy?QriUwyTz_V`0reJ+o?!*}?@L(X?m?P1=Fe32tJJF7U0r8``lUt%g2 zr2KOS6Zs-$#_?LXmx+1tBr)}Va~&J7p8iBVxJ$K39$17i_q1<}Y0v(i+HCBIZLvLG z8Ew+|WLNFoG1s#zhs0pU;X-Y>_GXBkdf@AsxE|(=sf|0rx`puFvqpU75A(sN7cv-lcV+4sm~|$A6BW#n0oRf%^NGFsFXilRdr?et)Vn`#@cK z>*jk$el_S?qyDU!HL3lj_@lThCte9@<-o2 zK>Qa=_htHnsjy2k0TuRYOc19H|KAN>Epz3&Tmzaw^rd)D4Qq`q-u?s@jL zt%clj4zX~4@sZDBbSut={J0wCoZs2ZX`hVi;TveZZ=QIcsm-SK;KR0XF6VnYE(IOu zrcaM_mlu;CNWPQ26859-p6HW&H~0HP&%X8%Gj`mu_1c%i8Q5jV{-EP7UJGZzzF@;S z4}}=JquJkEd)^h@!{Kae)m&DTeYNBnEd-=S(veY55LQ{(Kj>0MN7YSFu= z=J}x3=zKT4#pb+|YT7s9^WiQ&9%|89FyBVC2|3~|yw;iB&-s{nA{HmYeL&3JkDMXh z!^~H62Vzf{cPE&7*0V*QE{QpA4El3?+L(6S|8L^HVQxhNO-g5AH-HfIcUr@nFf z<8sK&(;+X<4aCIUyNj9gh?Q^I8_Cz>O3X9dsx7u`7{3r=%%_>l_Bp0+(NhPcp~{#~z4#~$wbxuiQX&mLRT=0a`fV8F~bzn@nA( z6?LFqhhIepFs6q0Vg9no^{^MZ7yQkjRQe)a`Xz9s)H?hg0kJAHe+Ki(U1>SpJ@9#=#D&75&Z?m?a%3GqG@;xAtA z#(kJOHrmFG&HK^D9G`vi_?Xjnzf;e+^`u<*O%69U*Ii zZF8I46c`)1wKTd~ztam=}pI`3;{||@r(%}o=oW)u;#K{;P z_s_m@W4ptceIFYtyJ8xMx@jX`H?>R5j&I^Tw%dHO{`8QpakMU3&1onPYGE z)hJ)QrRo>f(4FtAdi2}XKIG@Zcg6R`yZF9v$54yp)sPpL2HN7{KHL%cR>%wE?&`HT zG1|u5jd()aJmjByq&xMeG!A)2*SceiSlnk#SOFGp}-QTsRhi|1yWdEw5JR@CzZurD!AECe!@PCZ!WwJ!#a65@hq|&49ec6` zw(NU4)VF$if6`rglhuKk%ss@GU41o2|5C8cj+okC|DE86JL0Qx{vQeF!NHhkp|?He z9X(O|vG`Ry8u|~!%2*OBVs&hc2jijG9Gl|Fcrn}uU*6kUJ`&yxx%!Flo_Jfn5NhW0 zu_Dxw-1nxb3Hk4R@>Y7YeiYuk&GEC?5^B(zFNRuXW7=6?Tb;21Z>)OO_Wr3)wzcWn z7i!k`fL-4PettUmeQzucKHF0r8uK=~$J@jG-R$hw<7!-7gnM^yq`QRsnan$rE5_X4 ztKn|Qsb_xbESBze+SHzU>`oTjn|5b@xVQbWZ%F;c9I7vOuy|ZwP2hBh!#l~h;!NBK zb02Hmm|QeAbDGpQcO|UnKO48gIRE*}zk^}SUN_9Zm3#wKcty=$>2_~88RU?FzJ z<#2v|cl@Dvag3cE@nKttE#G#= zBk@o?7>~wdu_acCCxJwb#Yt@j@I8{)vz8oLGpH8vKL!Y{+9ZD961m-wF9Y z-z4pC#CPNG;veIG#Lwg3<3GZ0RkdP`y787lUtOu&#q0IeA$#i69;ABo?y7Nf^kCjQ z$WL|1cPv?i`un}XtV6lr`%AiicjtcK&d-GVaVK)iU5LN9X&WaebZ{=%nCsmwP7bO5 z7GsVL^X_~y?b+|};7}3=;^6;Bd(N4cU+PpF{I%EBkbm|u=Ij^3oR}>nFNGMMPV(!w zYKsLwtfwPyozr?})tB45gU|MM2626N>&^Z4kXLG3L$WXb_`)Y=pnpAS?X4mCY+R1+ ztWDn-yKM36a?gaU`5jWmcji)s@WI9KK$bM&F~(|Pr3S;@Rs~>_}wVK<+-}??s&(%Rr3Gap*GZs zw~+kj_(g0EbwYndSg&T;@`hTkuGN$}WM|fw@oxq>?V9^>cw6b(n+{*p`Cr86V_C?j zd%}5sC*1!B!yQiESKA%Cvoj$N-GjT6Q|{ncxNrF(r{=x56Iesiqa$w?;#`RDoIhEc zp7j%R+N3?qvjOAwlN&f3hX(F$wn=lw=J)(Ec~Eqb5DKo zV2dB**`N!)@{#Yx?afCv>Dtpe<6^LPwCRZd_OJ&XbKAnX4#z7)?o2)&TjKs$H`tVX zAXde)SRQM`*h8^7)`xXl!#;duoyXFjyyExNT`81W*@#@jH_WU{=4@}qwoB3^H^LD z=YX2Kk`xR1a5l+Dapa@@7lIG$(j%SUZ&fiD2k#f#_G4p7eg4Qf>-h(M*w4OOlfRBX ztgZGw8e(EkYx&3C+oNwS+s>wKjz4^x=h5cBKK~DfbMsle_QZ^raq;Gtd)hhr*6oN# zVpFV*m9aV=j5V<&mW45M>w^B~pil4FI287~6yk6*#7w^45pvgWICbN2c8v`HVeCj~H@||zD!nqcL&wP~s z&SIRtKHa-&)3N>|wT-dK#_re?;&L>^z*_aCE%w%34Yr+oU-;g;2Y$1uu5N_nueiCX)Z5i`6&H7U()~YQvt#-YAYSmh6)SP;JAk?FA^TyOHn`+UUsO@{eH-3IC zz8GJK&%_^w@8<`?`{(;D7u<{7lxx}x1NSK&7ebzii!pa4ciokB#^KK0=dm~y?9sQ@ z+{wX-Bt2tn(3`fVo}8gGb=?h&xqIl#5&3gCjLBgfSkyMh&ZTf(KC{EeE8#qRyFA*? z>$e`CtP!v2*Uh2hOuo(5UJQ2a!x#ID0oY`N{;d!XQe4g1mrd{F+ezbW^2_&;xIuWg-khyi`;&IDiPdF;h6u{1Z&%}+WI`<-zx*xC_dCpPxj6Jlqr{=T3me%5V` zSK^6SAFE^4Kwo=lEQ{r%y(USYTp63<>999{oY^_#r|-@OL;ZRGJ{6yg6(P^nlJS+{ zJ@o$E7k(G2iCG)!M_*l7i)CS*I;5`#)$_MPU6ShUr$e%(p8cDSarV4{Ka3xR`nQG+ zzNy7Ojjsehy@&rTW)1qj$c0Pcj^)_A!<)6Qg;*@ag^({KefKS2taH!eWvzR2->-&o z>#qj=xz>96?w?Ke&C{2s>`Z@7)P60FhqfHh#<4gukW)wFP{vB|7JKd9l6GiF>~I* zj|cm5=C=5q_(V82`~2X$^tofB8%O)@A=f3B#hReEB9;feCt`1ik8|7z@lb=#?fvkb@@@1@ zyf?fr{*6Wr$$9mpj=W{+!+ZGS_?J*O-mI^MnwY2?Yy4(3XN_88!??9Si_M`H=ewvD z?J@UL!|HL?pKpQsQ+xbU^L+hW+!M~=jA~%!fta5SF}NBt2J%r%jH?~YzBSgvTK920 zjI+%SNuM2k&^IpcNH!Nn+gkY~57;^y?)un}?*72Qo$Xr0jz#S~waxPj&T}d3eJbR* zGrbkJ*M4=3^GB}IyA^!lyO{AwPS80R*78pcI6L3%buQirHtgX$ZtZ)LuP2?CzB7r( z^pOvLkd8arUHel>-}v7RHTZmE^9&?EtetK9@m;*_b0YXchp+6LcP8y4VO*at;zu5e zZE-yK>5Mx^-6@dHb?K8e>bJZSj}S?4FF{aWMA9p4b&~0^8!{ z!S>{i*d6q&=ihI24(D;kH%Ffjr$cSolW$^jXtecTi?eYf=)Nai{u;C9SnzFcydH;x z{ZqkjXR`0Pq}nxS{edv%y`yU%{k!Vl8)C(0zgr-F&L}?4AU4|02EOvin6`5t4Zg8| zVnCM<&bV`o(GfR#Y?$8{#;xP)i*Y2J_l02F`3?pQ^!KUQ8xI2~%dCwTz zkfgsR9*C{Mt~fg1LR<|o)Rv34#jV=#d+tji&p#jD8gH07`_YhU@LZ^ge2^{a-|owx7b;wPbo)!x5{aW$$Y>04({^=ChL3*p~pynXibZCw(d3x0n( zyy?y)M{af|_bxx2Rj$baXq$I#xkyJ`&V<10E!(g^UF+4KHDc&&)}4*%4?TYVe)vAqcMrayzL$LA8=KPy z>zzrw_##%uoasW6qIB<3Ol4?dON2ziYJLN>1JFwb|jvD`Bm9?RBvx zRu8!`xhn38rE&K_+Z;V>HpPpvFT{@h^C2#$M_aDmsO`LB^Shz`#7my9h;N5l_-@SF zApPEy_w>FJ@?V>t8dZa{p46JL&GF0lMf`kG+xw@_u6NLTt8VAM->H3HsO`Uq`HlEw zZ8i9*F~(ng_wJ70A9Bn&<)7M9o7%HZom(D>&8ZM~cYHbIk{poBVx%p8R|nd3&1uu0 zy0gtT%v(S0%>7<#%zb13BHY`akXzUre6=4t^73TJeP=qFJREe~wK|(^vG5id=exYq z76*IK&-=NYsFChh^@TRW>4Ld*W*+;pKqk~UrYL}!mjnc)9ll+_l%A8 z_GiQ1bnt2%3%cx)Y|$tAzCZY*{c?!c@i-8Nf*!vP$1`EfoVJ=YZr$@?T+E-1r(@&9#lF}UJK{+2(|%{dd2fb1{YZRu;BE7_;F?eeYQXP8 zZ`lvR+qgD96TWHwMpLWi)ZPz6EvZ3k)`z#u8~D>ui~ku9$G^tE$Ah63y@l{js>vUP z_56TZ^jq1TszH1@)Zrh;=i(C~@8lTdi@SGD`HEYeTaMmH$_00HIrOi`!jM;!a$cT@ z*Oid>Ghe4Jee<(VM{HqSpPcsO7*2%yI2eZp+OzM@jNA8P`KxyLcqYz?H|&d{4jnj^x0sG-{NRr@uTNV>O))ZpALTe+eWq+~;x%Y%Uwe7Jx*r99e`IxbMv9|U0cSdXJ@x%D> zcq{B@PRw@3rdS&*V@<3d?Ip>3;_g@)`YVF&mUuQ^81nJtbHRs0VGn1$5qA`yKMM7y z_Wpawb9t|pz8h-6JND=C^-!PQ9KUathPUaPp$5&*+TF0I|E=2WfjzaVPJbHSJ#VGA zP(A)j{9~w9&}YjSzu33GZ@|6rhXcOAd;Y$`?aA9>*5Iwqd_ArV7Lt%p;$i-3(78Dz zU48SUyq;rp#d6xyJ{y+Z$}cZz$&w zZ@)ng*5;S>>}rb(8~he`KJr7~xc&HZW=QdLX6yHbJ=xKozR}$k2ZA1-_J?^G;}`pM ztu=37@uzQ&E*skR*c121s#pk7b_Bbp!oF8R zzJ4;~?x(_=;%}~5Q$MS%=KP*eYcv1vsqGu54%DqTYF(&7@1*)tZ{HYw@2L7wi==sY zAHA1q%$uhcH^;xld=rgNo8DD5X`e5LcMr~>9{Hmt?}`tFZ?L!U-Ep(?x^vtLIde5B zpTq(SaV>6)_Us#5Jg?7=_1A+9IYh^pbr%Napf8`~fcU>2a?QHaqd&*xjQTTfjXIHs z#^@N6FLFq}lg?;g_p83%NV4<3+6R*M;VYYT+2fP5u&2)XV+~z4j|V&Uw2!uNXJAMF zN;sc8IF$5z#CQEzZ9Y2Z!6E1Q?JIuj&zQbF=U(>Uhdr!69CIxn`DL#Yu|IYMeP!!#?aD3I002{PbHzEvhRytZr6^x6gO&PeP4-J-!%A!kSNonp7X^=v%Qi)RyTq{!VxY&8yRI$3G9OSBK_}t7(0EsmuFfWvIc=hwsN{M_Uf4Lp6A- zbKZz+aW&+ce1bZJx$7Y}L0{jT_1afPf9kVkPXF?lr#IKiF?L~Ij-8E@A$Q#K#hCd= zUtOFIc_x?W@b}bc)3=|TlPhe~XTu(EhTq|5lI(eljwKhu{>Gh;AN2WZ{mn3E|0(&% z54yf*#_8$v&Ajg&|K1nJ>)(;I|DM`>;TK)8ww6!w&OUF2d43sVUmI*44d*`+{Lr@N ztTiz?7Uu0Gu7~24Fou_dp1sWP4f}{4AI-7(LeMw9J)R2tAB+cMbu1sONv@4$aZlVG zw*{S5qrWowP&^S25BY5Jx!4&8!a2m@1I6af5KF)B{wn0Pw@vM>2{oW@z7%rZn<>}5 zi+?%LHoq#=>Ks=)YD>Mb1$C-#+}o)R)ug_*wQ5YgseS!9XI{2!YIz|?)Qf!arpUwV^^M((Yoo1yB^JWG_N9=obmo}0b>`It{i~zDSl_%nlS6OD z=^@`3W7f()>v3-M*{APr+|}85S8dw`k5|K- zbJ>ec~4-#u_Bg^ z_UzwT|MqxS+#UDC9kDVV9BfIl@o+pDFUG#G->vX{^4(HfUyb>${8{b4i}@DaS6f}G zQ+Q{-5Z*=k{)fNOH}_kOA`^V;_I7OQ{tW^C5)?6apv zR|mhmg;*MVSQ2-KJd#82i5uhG+ShC2W?YRcAuei^)R+5oNjlnd{#t!{U}IsRZ6E#f z@%E6XlP5=;E!f{aYE`X!zvZLcVdr9;iH|gXDM?2yv7?rbBoBu4gPBL z?|0gZo*c6e*rVfo;4Ayq&^r|NVUv6#>|u>IUGVW(IHP@c$BSY7XgnA8Vv}UcI(B!& ziP#%YhqVWTJ$<#wkC$S9ydDq5>R1^oVrgs~?c0*~#GP^bXy3I+-d%fbJQ$C~v}+GO z@$puCuz2|{%2hQahvl<+@q2Jh7*|&_$JL!0gBnsJvmVrv8ZxHd)T%mBJL-`=HR)ZP z_4nD@^z5kye;jJ``vW!W_o*87_F1P6>9a%Xn^Vu;U-%w;D*U~x_T;!TUyt7!eeD|| zr{|p7(3ZE_H{(6E>0GTXzl>R@Eyw6#_RrTo7jK8QytkM2n0wLJXX{j0;~U}r-wJEx znmglzz0Sl!yczV3(fwHS`p&6+v^HBa=f%LiUkNt0f)lb`DiT;1|9qDj5%%}<1Y_s z{P|FK+J{3tw4H+w$AixP;D^5RI2+r}_d=|X<*_uD40(6*_E_j0ylu4a7;~$V%SL-e z()y?3rQpAP<{kQ7;f=UAz7%R<>1ca%)REtMYERv%6ZNC^jHxF&elw~QZR;lL)?4Te zwN_nxChX<+quMd%9iwB+TJ`34={G|yvaiPMr;e>>PmPh@V|A|nt!IZGyWT|K7da_6 z)zSMyKFS?+W?W6)DmKuUyXHvH#kJ;1`ipDydgE&0e8?qv{B{^KXJ59hC#@xKhHr#E zeSWG9`J`6B79ZT*>0smVXkSUb8JA)q=zk(zdBm1Ic*s-U)WLIwTTbpEO zu02+JfADWlnA;bR2VV{ZTc3@O1U-Ab6KvVv82?EA+Q;5%&EEFVmYaNgJ=6g`u{adY z1ncGU-e4PQ@5Nw;Ki0B)B%Y0J@md&Xj~{f|pL_18ZJu55;rUQQYhpz#8QhsvfA30a zV`*#*`t+8?>d}8N`BF@~*K2>cSp8Al8{QImEr$3?sGT2%8gYN}dgiuoojRO#^Yz+l z&|65y9GkQLNOhwA)H411LVZsg>Ji@#HTbQd=S_Ve{vnK6!@l|gzkLsk(Vg!hJ^MP# zr$b)Kz2A-xhVPHMklX5U*5Ir^b8?uj{L)`2Zelmvr++oB#LciqUwigR zIm)l|qy2lejopYNAy?iAV{(uE({VD)k@nC&6V{y#HR){Dekkc2=C#>!Hfv7AYrzit z_T-CPm*+E2#X!C~uiV@kx58fhaXxmn`N+0-knD*E_yBr`WA4ufcKKlpeCN~t(dH9Q z#m?X>8{2|CbM*HGd-~>&#-ZTz-ms2*Db%C>i(zljV`Eo56&qqzsHvrcJCk?By9W0p z*T$MyGN7xyA~wdOu_La9`okx~JM#IEr+$OVX}SB|P!rw}HK<YJpmPDy*IL+9bYZ_6LW z$K%dWi+(dLu0QV^ZjLzJNaE_~o4YmoSCTM?OCiUMStHK!)*AhHjrOedxsRH#?yWcz zbU)IVd^dhJQCls! z6Z>6G!hY@ucMlyo`A*2i*W$wHUrEYIwX6`nK?c?{b%4>_MB(p*R`r&wa>a;k@>A4m#``Qy+VVr1xsD$%gs; zVN8AKTe~aRIT$a6aXQ-DVvZZL55KI}c7~l{?&Ywj@g4EX=s%EL9cu>bk}E>3-5qzv z?Qz>+{yv@Zj>hRO59=O@J;CQQAqVCBX9ns+P0aU5Zp&5ghul|N_*QHPx$gbCFO2D1 zvoz$tHKdxcZr0rVJJEjL)4BhrYO5Lb?XCN6s445LH?H>76uauydXk=bzG$mg`#K+= z=y(hDN#7DVD#z8rtW9I;(p#i1?ud_tvELo-+mo}VZWc#%YYdBPcyWKut6??Eo_#OY zz9(s)leOQMWK%7wFZJ?H^8Dz_6MeZts+;R^F4(;*eR-%(_-Nf9B-x|K4{O+F%bxO7 zP8<#SNza(O=O3SsBp;8rVqdVwHXr1Yb$pt2X&s-S_UOoYYYzqcuZA_|**_6#lTQc2 z9A8QHjU5iYYSU$xPwcTvcb>_b=VMpcV`o@zoxNTNw)nL**nBCbU*^}v##kHcV|gr% zm9cEJ?@6k&+e7WmH}JOlcg3AShmB3ak7IE?{4P^3-a5Z8)r5S<%vtk(&&hT5VNMNc zTSre_7^g#DKFf8rrB+CFphmwD-cEG_bz+X5`d8D&zZGgq9o`pg)0@7qzbw?FG4O*8 zzfrOH&EzW^_Hou(gP*9a2GpWl^&Mc_oB4;~`(vDhvzfErS+yZwKRQqc>Xl?)U0X}< zYH>dw=AmZosn+DWoNzY_aa(@r~jWee2WP`h6>Pi}=Ix;l zobzZL3v2Z0>F*2Yr@t+p3FkNzPsQP2-=1`z4)exejN@S+ycBN)-L1jK3$YZQ=UXz@xtGz0g#O>iX=xxb6;$1_UTN;l9AH?T!e7G3OUA3n^h8{b8?A< zHSStl{mq<~?`lGwSjUdMpElL#y7;S5EBf}dzcp&n*w+TuX@5Jck@IRp?W<|IEr->h zF_I3+7VN_Y-)5c8x^X7oAoWMy8Qv!6qQiH#>@{o7nba?P(^t}7=J+ws&sTM~B*eqq z`{G7%w}+Uko$K+z+R(lg7lzbdi1Xpj-k**>JL-Y0Q*k!bh4$6amao_1X1pD0eA>6i zTOkMbgq)LS2SaV02)S<`Hr>VPr1@i^#-?AFYTN%z@Nup`S=%0@HP%C(+s~Z5-x>CD z9yYAkwl59@J?OJxjE`)+5XP<98~eljj@TF0>Dy0Cj)(pE^-5U7rn=Y_Z1MNycs3r5 zhhk-{j#WdhNn-gx+x$IoSKJZriaTRTEQ<$%UwpFvg^s+5- zblEem250SSvnkiTr)ov*uy2mO+Opmork+V>5(9Q-4bOUX#`*4x7aQu!8SV4Ua8^3% zc-En_oG;#2LoJeWNDZnhIiQBrA-$XN?%MM4Owf^U3!`nlu^UNw|DoD)P@VanxMSaw z4}{#)W`|AncQoXge3g5{?HsO?~rQV`s4GjC^2^Ur&ubd(O>= z=fhrNMCb8%CFtHCD~4Q~Tp6ol-H^+YOXKdCwWfVX+!^NRSi>*=@XeVQLjI{AH7G~t zH(d_N(~l0^gB+Eg>Q?T`CAq3r_0^9Ym7CVfU;SA#^yI&MW?PP`F?FGa=38Y>&U!!C z`g*WE$JK^)Y}uckX_th$;GezJ$9>@~WzRmw_~o5acj{Rz^qocR&{J1*t>eSA$tN-6 zH|U6?nzyI@*%L4Fbg{-q#+W?27WO@yJRkD^YS6npkXyce<}L(zJ*<6Cx~StkqZ7?3;f*%pY0QHqPJO!Ja)H4QD$PZ10LE!=7|siXFigw#WXk zhP3}P!6qNrcxtdd`FJdkRRcApy&{$l)Y?69cib_gIpZ6GeSZEr#N(}yYwP1XA+OfN ztVKDm-hMYe7XBtu7w%Rrssp(OH6y3lQzI}gr|%3l%o|rD*2-OdQjX7howX*H|1#vZ zdQb!Q!L+0Pte-Wn7W9qVpRe|{r}nH@eZD&1heK{^LtQwh{j612eB-k*@MnHw?5Dof zB)`PQ8Jyi7=ZmvDzYzSpnG}0E?;g;RS9Ijz#dtd|1v~EzV{-FKT#JRc6>3Ai-jVd) zv1RH5w2%}_J?a$AnidL};^a(U*v zHENU{Iba_(wD>)>X70=Ge1p`hy+PkPdb3XG`913lU|%l#-aFs??$B31^ZfkxMmpo4 z#y3JN_0`?1*POs=8g0BR9JH;_J#fFyb-6vJghNi+&XK_JG*`4?zCl&Eq0!XU2!t@gni75=PSVv z=k@+sZ;bC}V`nUhZmb#j&WpX=mH&{N^1_><7Ub3YM_V1p+4%;kBlhK_T9BhZh(C`ng*k7P znjz;~WgT1W+f&}FA^UzHS6B zQZH=Uhd!UJXOk`81-=?rkNli9&DYDtS8l5d@iKS4F?ViWzN?+z4s|2noJGFLwfEP) znAEpME|CktNB*gCXHbjo(-~lmyHG!3bu(#iJ{<`;`$Wj~tMS~B)_o}b14%W&DnQ8FJoUbhWLYHk?~~j`Pi0>)4s&b072c?Y%8_gqmlE zd@}aOp&_428n-lvlkOm?3?p_P@}$8+Rkxi#FuUBye;SBJ+=98vbMTd z7-ROeMy}Iyb~VL6G3JwZ;c^(KPnRA))jE6g3|EKF#iY1gNIIjuV}EzZ<-PH6u+2xc zd?>DmJ?zVdHTLx#VB=_Vn>c9$R$5zA?3;&p$PCBCN6B zv9QPS*cN+Z?s2B}p0Jh;YY)d<`*LkIUx-z4dz`MO?nvT+P;(E)-LWBl9n0gcm^J8q zwD!(e6YGXtnWVcc)Zwhf^|dz!J!5Rq*%Hp#P+z{W7wehE+e%z;e zQAcu3&TFeZeLC_`-T8j{t{Yzw^49M!c`g6tEqmI=Nw(*^rcSJp=W59O9Rurp2S|Hc zr|*5SFZ9^}AM8ty&+N%v^(;5v7wX&lr%p(F(O(*Tu#P`!o_#jFiRRRm_MgSOL$1o( zm9_07Z{##x`FJzv$+>H>5OVCokoM)X^IU4oyFl+?$hFIHC1yP4w~3vzVK2EyUQgmw z*zZ8_PY%n2J@InzNsg*JwZWHjVIBXCk#zP4pGbMG7R=d`wB|(c74|$7*0AGDbl(j6 z=J=*h|8%f@Jd9goOq*>nr1wm`5Jv{PlYFMTC)i_K+nHYswWN;J-|h9+#Z#dk*uFnj z#;@bySQdAM`q>!f*tk21Rk1eK#ELLRt`7Q}Vsoqyw(c3yzV?)-KZ^efHTdKB`}iM2 z{%!Ja;+yf6kn{3TKB_ZygPufFM>u6;Jd=SGrU`^YQ)EhOdE`H&}a=$)X$H|xcbO@3ZZsyXM8 z%cMBbzg3^F#+}vLlVOjYu{Yd19uM^+*Trz|!#;nfR4dMed6qM^cZD=}}c7vkY~F7}T8{mDn;k+>sni+2rfPcDg-u{zY&s@M=)25ZOI^5k7XpYFDB zUmM~V@vouw{vjR+wYV|$i#d5W$L;s&kl*s~Jt5cB;;d(T$;n$|AGt3t*;Hq2STBF4ZEL{4Ypt{P z>hMv2^6uvC>wQ<(>d=|lV_!b8ONamGTl;p%17|pslvn)blbmBqU0e@mkV|55DrtVM zQ8zb2j0;hIpBu`yZ+;UT+Qf%nn`q^LbCOw>#+B z*E+f{#tT88j@-X3yj$e$@n}32kHo=nw!Ojr*4Q7%2HTU*4YZ$#`{T*j68FTN!S)@o zF3fL^P4VF9uS#NRSi=wc>R)dBdHi$yTd2d$p$`8s{x*IX-;F;B^#^%mop-?ZePwtL zyo-MvzW-|BN_$)y`xuiO>OelbWBDtW)t&Amq*_k+SFCZ-;%=!QtQ&yJBH2+b{+>4SM!-&guL4+F~sZux`#_nx&&8%#605@=8-lO*$C|J=R>aDnyDT1zLm_9?*)QTh<3D1)hw4y0 zs>M~I4*zt>|DIHL>hI4&{i(;Vg*x>{%r{A%xL3dNpfBg;qi?z#xsfmCZYK5Vo7b0b z3vo5nni})&kn&7T$Qk?jEo%&N-y3tixeIY6=;^a*j9uews3-O>)qiKqP5*p9ynpog zss7aFr$U~w=j`@8TiZU?`o`FY4*$%#d-`XBEjdT$TsW7u`L~0e*MdLvrayePzc^j4 z&3F3N(LE7#oMnIPj9dwFyCK@Z-(6*1R(Q>;1D9Dl^Zp4QuE=B@9IT;SKKxE9XK zZ~lRfwdz@4yx8P3eYK;8=Gl)l=IrdU^cEvsm+HI@kSgQ?HMcn zx-@Q$#pCfvEE{rda!qWA$AZ7xf*yVq>hI~;94q6F zxIONQJ45}!I2(NA-|pBEN8@0KpV;tAEW`^hg*ARV`Mz8CavTrweJ!~wQSQ8uLp`d4eeK_aM@cs6C^rxZbyn8>4zmI>2zl-mMdQ)rjz5A2V z{$f(yeIeANH}bRLEu8hR&_3tGJzp4Yad0=MN8dQ;&^;UO?ZiOrF2}VneN*TT`Dc`uwt|alZ1&8h0cP=H=0Y@o2~y`&x4-`2Fd) zHrfZ1d|;p6>tX$?!LGUEVIKV6A9B;&(J;?9n77uL_3ZOyQ)~`CJsf-E#nI;Duj7f> z6kjR(K!mbv8(QLG0xXn>Za}3c15Bd+y?Du)~J6m*U>~e4dDh{n+8Ncf~tw zPj4eT{PlLK6MJ3@=Th6|U=O~TmO!ItE%*c-3KzToq#!3ID1<2>SZAkK!pwue~AQQsqN z>&3)(Z6V3O%dxb+n2M3#cIT7c!!t=|IvCFWSgeXAu{Jiu=D0sLhOsrVGU#D_@KHT^ z|Ga%_aBXM19}T`aqdC6OznWC1?)qG9_sgG~!4~^$@ZY@q zHZE>-%~>lJV$6TOI`@Uq=KuD1DxL`Ov5ur;?XJ-_X1#dWlOBH#FKUZ3o93O#dFfdv zKKf6`##kM{3VZL1-9t`&`@9(J&pTm5pHJ@HxUrXGN3iu+tcgeBQ1FG`&e$9Lvd6T+ z-kU*(9rG81&yNQiH^bi&my`T-4)GRuHm#TU^z63~a=|y1+!kVE?zvbSt76G$i^t}; zKOTs6u{u^PYClu^BiZ|Q{5aH{+EZiRv~}Szq-HHUU*mSuMN-&)w5&nI&}nC3WX z+GN_yw9`pvI@9h@x*fJV|FUHG&yC&)A(T);2qAYI^AgF==2JH9Gypr*| z>8;XJe_MjS`c34U&GW5nebMUQpqE<79dGsbgc`|7UDfQW*0ZhV{Igc~VmuM(i2v>I zPLT8ZpdRdh9q7nQj&c`=T1Z-qaG$?KE$VrGYq*u*L>>%_jU{ky^2=3V@< zJsafI)4QfNTLT^cZ4G>X9`sZ!=Y#&JA3N@j26j#bar{2K6#jd-IXo0z48IG`UkGc% zbKlxK6Fc7c4SaTi{{~~;9t=MVKM7{?>fpDI{1d?}`o<+(`yWAkRcCxd*? zg)>3y?)C>WwJB^2`k^n*?DcJDP#1k72ljgOVIWUN-`)y%sP^l^2Z3FnL-ufB*Bu)l z1$LaNiIuDwQ+v61Tg=wE&c&~aVOQ~%x%Y-|f;#^=uV2LriJf_{;4 z&(DeAetY0+Y>I!~a;`>SwihqI-Z}O1zKM&yuY8}v$C>%(i|cj3kG-^0~mZBVb5mi4*TXTnc|yH^7)`Fr#E@Lcd4=fA7?8_L;> z;pyOg@He#Ig~t|{J#mr6L4PNGlTG}=zccOiNWBgRd7Tc&0v^a+9nFARsSVj#XYXE) zYNM|D_ik7h)SivE!yC(L|5kV>kS9xbb5OVG7yYrv7m)cdTnJ}_KA1Hffm+m%SRQ zuiCw`0Ke6k9sD4(e_8F>q3>)@I2HI(-(5is@ZG)d--VaL3qcLp=TDCg2R57!C)olr z^!J7L1GyuCp7T$ZZ}(dRpF0A-OTzFZe@n{PRM5ybLd_)}1?--p}7+HiMxD7+AU8{9t^ zo(ay}tq(V5^QmCA{LXm`aLc#3G^6+>7X0$N=(o`9;nH8UnnA0WZA3(N|<8RY+Zcx~Cg(Mpb<859GbY6a?UT^IQ0 z#~FL(MgIQA^xLO@-d1z>%iwPXZ>X6h_fYURyji*}%h zOAf#npX%csB>zERTyHHG6m2zp{L9 zXnjAt71R)34X=kkEpW$%IOxB(d^;PT{Nn1da6G8Bzg^6L|9385Juqv37ak3GtoLwj z@ZYi2?r)d9zZsqhX44Gb5xiY&%x|D`zjNw#Ci`ZK|IdOttLuRvF5FO4eHY(X0ng06 zewo`-0Y@GW=JIgg>}(Cw2b}S}FYvW9sMl|U`oP+tj_UhqAggEkplR}IPj~lVsXABxFg4o9NBP3hJAXUEZ_P?_Ol>fG00P|_P2jMh|!)LT{3Tn zE#YWji(UJ#!^N;SkoThxN8Is7{OF1!-n z_}2GN+y5$9?+$A3?e@Fp_sk56&s^#;4*7lO)A{YonRot+zSYHlvyg*t@oWg}>d*S{ zeo&7$zqQVtSrngpdTK!aon>9u>W++aGIV{v9{w0!TlQApe+p#PgS}1RNcb#>@n|?0 zz6{Pj3I6`@dvEs4h#6CNZ;kxa1^3O8bDZ}kx_>eJRdD9F(7yrMu-7v-&CHy6)5x&v z{`$b?n!vtqedd!*zqw}CJ50_S;cp``?=E)v$?HrokH-RTe;iJR!$H2z)I%TCXzHkz zF9)1D5!l!f$Zrm6Y0sB_x!V@r3WpY`p&ElTKF5}Lb_Mp?8QaI(9|+zkdefgNWX zgTE#8V{dzL?+p6`J-NRf)(1Ysemdy=_V88kZv?$#`^%s&en-@dygpoPWyAORpicH@ z!nt4`%!gj6gSgdHocxImul9uZ0{^ds*Tb*EufuN_*uNNl8eRy02xr6X*?uJGF&>yb zKFuNSsLzFfbMDBA`_q6g_`r_1H-tY1^#XCcw!rxt0S{pI?=0W$few&iL!I9Z%ubyHe%P(7B1@WB>>gY|ks--y0tlwe(2Jr@p#T$VyA1Ajt;0&nEM?rk- zeOZ#`itIPUk>nq{q@cZyg zcqzz9o_hU25SzcZ@CA3woZm?~f*5XE&T)j#FM>Lq3){mR;ZMu@`m(ozySIXPeA@$g z-_F%~-GaAU-OF=h*cs%zEgT7_0`AG%xfsPCU zuFGkD@6NVAAI!$goW7V3J(}4x%WUeqx60q2X58Ge>rFS)?1FE1;^IRM@dbQe2;T%T ze;vLEp9it{ZQ$P>KTicb#L3OUEWHtSgiS$Rw*+-wAJpVv*d3g|8PwRhGxbqJx@Lkb zINKB4e-_l8kB@`?(04br*N+pydOWaUJsj|bJ@V{)wd}?6T95-7F}%O5?3$Hxt$ZB{ z{!Z{)g_8%CGyT&Sz2s92-Z;NEdVmAu?+$wEet1uwUA2_s$eCAqXT#(2@ z@KunD-yC~6=#?I*H$Alg^P~=DOD)Wdb8i#b`@{ExzOt#G?)`Ro!<@0ph8ejx=)0Nm z_B|fV>BHgr;GHISN4PWG8ra~EZ{K)?gByYx>b1GCpStR+Z@GawtqW>MW=p{FcLQ1V zR(EyY7IrNwyZZutHN>~03)powKEz?K4?ssRJ`HT>1sVP0%ig*vxH}$R4ZjL+1vb76 zdMegaK^^ps{Ek4!Z1~O4Up`Lz^;LWQINzCfP@TPSUw0^tL@pKuIhhof!QGcc{m^N(fy}k zdcm&mjp3~z)^$PLn}Qg>2y*_qm5q;sI;x>O=S&UFnm3M5`P1=tsrS$T@WNVSnmquihU8eI?J98FKC$pM38O?1VXJ`RKEHi0hMZGRQ@Kbk7I2 z%sTFfL%#dN`$1pG(v$b0uxo*O>y0yYvy!0?zOCe}djokr(hu>7#hreriT6j`M}s@| zto-YdeB5sh--HjsGvT*Eo@Ryp9pTHso>>vg?x2=>rtWMzQ#W(vP1K{wS53*OIlp4E zzd76(-1EU6U7R+L*V6<`<{r$G*J8x;?0a_|60| zsi9h!nUBKz%eR{9liIUQmLK06g1aw**wkQsV2hq_t8YEq67XUAyKOo5O-8NNd}P`7 z&6n87xnox>bmZgwMA#SH>F=o^XZP|}H!>h5=O@FFpto{3AJp~kVAUgUpMI$Mqru$W z6a2lX{&xm4^PZYJGkizzKB~Vt_12nmw(0B5GYkB^!`4H=46h0Nv(2yA@JSB7*}2r- zyFdBUgETz`4Rv4H#7WB9^N}==9i2+ zG1K+-vHMwj_ROTe_x0**XLzmt{>>t^VmPn0;K)XEylreJ=PLYU1Zh3|9B* zDF*e@f4|psjs>e2#HLp2uTJu^-yL>_O+kOi?FpO1hM?Cwf-^l(yW>Hx=+W_QRd4s8 zp5(zDdEn1Cd*T6obuO-tgS(?ad{(yjn10}mGk3s;T%ECP^?fOP8BPb>S8H`rOK+r} zsJY)jGhv3jZ+iSxAg`8sqpx(x`FrvDU^eIPRrbvbd+vV}eilZ?TdVIlVIIx)yuae$ zhi$zlhbw-6%_W}wF1#Av3TojEIMuo>_-#~kz0xS)P<}*0~u$)u9{p3>Zz}KN6)`4)R}EMYW$yr*v;aD!5i$YJKdQ%^6wCO zWd5FR0lS^Yv%7_-{xN(@WX!ck*8kjnfD3QUu~ST1^oI} zKOj%$bRe&0`@@Mq&bb)L+PfpC4!*_fTaVO7Z0<(h8U2sK)}Uwd1^Rd}Z;Uw9QhhG9 zx0=1%gZ`OCy-_QDQB!Z>wSk^GsgZZ{-k=9&P@SFmeY-#CpL?rw^J?z+FoSaN=H9h@ z^KrH_x$w)sI(`_|2VB|_5kwYR!whs=pU*V&n%#@oZ5KwiDq1w9k*%i*o?L6FNI1DkT(9rR2b@=>FY+sj=H zVwLay!2ZPLH%w32-xu`XOsWAMvrTunJ-^-JSAVl+uDqe%Rl4e^|9%I_IOhjP)Rzrs zYR``R?aiXN&9M0tqnOoFTzHE=r&=!te-|BWRXg#D)yf7LwKXH+6Q|!^h!0DPj0 zEBrWDcYY=|cWUYkP6Ye{F}RZhJM_gMCU%_Ti#X)2&TOn{Wyd$(kr&(ER<*F-xZIQ3 z(ViZ;UBT?oH!uFpAoj0G?awjQN(&lkN4+ z-#+G$-ors1uMW=D{0D)rhr%PvdP}Q*nSHiC3Fchg$cj-P*zj)PhI_ew5MB@O2emcd z&c%g~YO7wyf-|<&23O>@KkN>8a3~xPYNlUwyqC`O=0Gre^bQAle42+%fzGz@`|x%! zS09CS!JT-lTLZh|(Qo~7#y)%M#Lu1}UOiI_^1#0s<)E)>Bxmumr;d83PQxX2AZupk zP1Q%Tc*F+|>MOn5!n4aBKlIQWqCe)34qIkRE+>P3&xk`^oLvZJOsst3!r}IK=1#n9 z@hwhuAS*8R=-`q(aX{YQ4Zo9T+v9>aLQQXMWseWvIEAxplTk-LwzQrLQ+GY#m&~D7 z-|D2FR_~dZ&4qrLSN7erp~u^UJcnyyr$bi``e`=gp|6*U>?;8GaXD2wQ_1>(AzZm+Hvw`rzEX_{Fq490*?pJ>d7?0`W}V@*_`A9|52BLa+5h zU)feaZ>e+NGCEYK5|9OR-8;xLEmsHWGoHv{{Z zZ?VYT-Nm4vZ<4jNgpI~Oi!7mQTSFYkz4}0&29_hV0I@4o0v1gv} zMPBMH7CG4Kjd+0%HI<9}_60ee4R|-U@b&fZhoH{lp!Z22FK>0Q=hyk(peAa)JE-qx z%gTmci*IX~dosTDi{6Lf)$sf9^71WKIg@)Y91b{trgckTiws}xwg-0k!a==o&c7OX zL)BTXY|zIU+`2xf^|{W}%3L|qH~kdHaMl?c>ZU%pVz#}D^!f1C-5&G{XZ6Y7G7p8j zf_WC3Il%>e(09JRZZ(_cj9)#uwmpC9MGya-kyn2<_?8!aGVa8(r#;&Tf_&9QE_k#$ z99#A{VgBTAWq(I2Jv~xadAV25qk*ov@gWzz*cEV=4?5yfYupi^Ueh-V7h2UCkMvGG z@m8K>&6U3K&zF^5v6?@5)4$k${tc{V>aBiLPh7om`SvE_5ntXKwU#5!xZ~ga=#v_$ zg`PW;i@p5Z-4M(sJ9;P|{n{S3h5bQota_jZ{Fr-vP-C&mQ*QDC{gbCUy%N?1z0zB? zaVIXa>ZTTS__osHckG>RzdmdTYE5QK_$cfSzX-ny;@%Xt1~%1ZZ|nPkUpeag#-L_u zjo+tQ*^{$AnT7MMa+dq9AZM~Tsg`u;Ukvg$8|ooP`Qf1MW<(A+V@^-DS4XzYu(WuD~uHlX*6%5gX=;e>Uz6~a8<9^)MIZO z9^i+*%2U1d09WaPdg>j!boh2Z{^&m)_|_-yz;i*J`SHf6iJ0{3#-NTk!k0MJULWz# z{QD*&K6U$|y&Tn=KX&y4*rszs__Y1k!M(kh*gqJ&8S16iD}!E$;XlqSKk`;9Jd+2% zXTtpMvL!~nA*Xh1>8Ue$c$fJ3xV`$aBc4AC>pSDen})mO>6-zy^%j{Q`RkXsPY3BPVm?Zg=2kXV@M# z2j_nZuLO185!m=9u(2WNk=(W|-|X=z?tSg)d>+(N9ewkS1A2->dZ8~k=-XW2ogS+P zKFjl(;5~XEm_huMqxVmrp9)U|yI&V=)jkO9$zQgPkq(EnK@Tu^~3XX0k52i zhd;bfPkz2=y`$CKu`g$L7lYcUHFFb|5iH&VNqDzh* zdvtLX*b}RItE<|}LF{DD2R)V}`{c#r?c?99>AAULNA2Vz2lco=m@m5DZPh<9+TRw` zUJrmzJiX9ru5j2YHg?Unn(*aZ9%c#Di=J5S3UZM|ZyMkJ54sV3@fzQ{%ec=z`t?;L?d%?O^I_%Q>Ae;>9NQPgr$nDFpBk+4L$PHK3 zK~8vP{%}P-@#;iiU!LlRUuwpdI-3i905#Afz0?1xGj8Y&8MXah;6vT?i(UQ2dAjOD z_R;WCcqr(jH_lv|ZL|27fj|7i0Wsm2y2(jxcZPl8VvvXZ*Fk)8RU2?-2CoZvygjI& z-kTe9#J1X=31qz$Y`DWwKIBSA?tI7-|Ky}@`tnGtJKUx#Zg0I=B(LV;|1`+!M?u}q z2k4txu%qw#={Ml|U_QhrhfkIjzvzkoK+t>lV&wm;_TmD*)#AIIv-#%%7t~oFGce<$eshT!bo1;1#0IlLVZvAr62N7R|VKKSjC7r%O=FKU5Pc)~8=GLAeG zyvcqi&8S&cAG7F{nY~XGp}NEej(tCT6=@k zK`i9O&6eEN^hkU2N#3~_o(;~#Y!?0P=Dosc@$U=z<9%RHyn6e2pr;06cW$qKboEy~ z$eNjpt@_QUb8mrOsWlGp&8BbsAkUUw>$AOg(;I7E&UcRs?$kiP^poAGgMQ)+8|o@9 z@rX@6*M}PeKJbfgYEDLN^+Swos@LwI-}vZE3?GH}gE>%l`&Yx8fxPwYux0t)**Y9h zGjGJ1)(^tgpl|BQ&bA;H{`mE_s}aBI=xjsS5!6ec#4IL$ye-~1wZ$X-IvMcCoS6-^ zWS@*$sIk3X{cZ3jkx@TAaEBlB+ord;sQzYDP3f|uH}h{3{&5o**(Bqw9S->W_UYjF zR2+K8hn~?F6a$jlVz7Ld}52dn8}!5d^CeN;eK@V0mLT{Igjp<_8SAgI6+5` z_4?iL$FOMuUt$Ax&Ig>oBm8B+xu1o94Y;rNYl0qso~#(;uqVh*9qh#~Hhc90wa3$A zfnVR}f;jcuUhMW_VM8sqw#ow!@Jk)&%4zJ1flawOBST+r#HAN!0=szLtky&oelHmcvt*Qqi1Hv+o4t$7a8C3&~LdM>ipAyySO}acvE|v zz9yJ+_RNI)8-lloPcw91nD^|q_WZFW=1b|y(cdB7A@kw4gueLLH}}??gZZ2{k&fAP zuJ>$vBmX+A4d&R)vTtRZU$yZ~_FuzO!5n)>z#C4^{MxgHZ*u<2@RRWKK%X34_0p$n zgZR|Io*(bA`0TwCz!n*GQ6IW&u%!oTONI@7P)9W&<6hqG*it7p=$gkLE~`0EgU5rv z4IT^piEndt|1jVctPjq%2mQnW{Sd>C1HXKHKbXH~!!tn-aPZ22%Xo~p8-uwqOE`qH z7nX0c!KWF(&*K5F@fKITD+gP}@oCr+%*D(Gdu+qjK%eia+q^;BIuj4yX3kuVF5k}B z_f9w$1E1nBOJej*-+Lq%eEs%Yv~tN?zx2sBohw@L+#Z+zTTrJ9eSaD3XV%=SwSK9) zb9^A9zWVzYL9M_%m=X6lV4lq$8GG|!UftP?O)T`-5~trYFARcpDayV&IKY~CcYMVAe2_b`tn8SV(ILM%=)JjMPyNUr2=e30YIf|c=GGbe zW=(9q#qdR-ONJfi@}lQlZ1T7mjt6IF!^-@6gUp*1U%nH}?w_?z?aueDAI|Vlug%B9 z0cUVXKC1$|IEDjqbEePwXHU-@@Qq(*k~drWjH9;#sk*=G6S+gE(->YTn5E z7MpnZ^yUu7#ba*<$clw6-2QP`8`zzhv!^5H%L9A(Ke}r3RNxcG#cT%I$7Ay$fA@Uw z{aE0K9W|1_J2Rj@&iIixKa&$V_i}SjM|^Cur3dQAH(BT8)WP}Kn>vdR^ny=%BV%Qs z9p~`9AeZOE-v%@JVECILXY(iDc^mNWP%vY-{%&}0SwC!jKWqr*%{{(t3+CiRpf6Tj z9GzMK8Y-#cP9^z^@kuiE34*%cce zu}4>4Z0-+c^I%{boZ&Nn+NtGQVf=vw8BSGb1HW|4pU^U0W5eG!Lv-TQWr zAL69T-?f2n+%UuB%@$tq%^y2!0{*gfXD|!HXZf=ySG>G0Ouqa*8y*fn4bKEz#ZCFM z#kZKqnuSLK9d%I$zWC?ctXt*cj=oiG<>Fgye5U~o6h)} zdfeMyENUcH(0{cudp`{PKN;BgZun1Ob)duMYxU=YfUg?@&dsd7*Z!^WdT_TXm=%0J z8fMPe#9thn-;O=)VN2K%)-S8yA@+BL-GN;;?eWP>k}(73`igApIgXnzv8xM?sIOTt zH}1~{9FYr~X3yLl4(3CAX8A?xO1t0W@4ZkUDio*=h#T9<_);&9TqQC5l zlO6ua@X4OKxo6L}IK^&{ll;jIf9S|xPAl5q8stvLY>}B6pof1C1+&MVGjaJAm-xl) zcMZflwOQMqJ@VqyYxekZ_h?uX=({uX;&IQHJMn{<#AmM6TdwB7?7MSLj(vN!_yjiD zV^?h60djI6t0wv-H@UjA7rWlr(-RNg9$IQg2j{H#_hy*cSl50__#nLVE#R^l`Z$;u zz|;4`=78h)iZ>qxyv1kpqwnrFhCK_+n0VMV7yFl$tXT1RSI}c`=-2J>NWAK3-u->z zZvgI zxB0<)y<8jgmMp(3mc94)+MuWMr^BwEoBioMd+e&qyrX!6)8=*NZdH4=@K%{A+#v6s z4Sw~1c!Z1m@vo+G6r)(xnSD0J;$A##dH?AGzPY1=cQ}cQW(0@X!F{&q%Gs*6eEl@w zsxvzG2lna7&HCf;Opvo0u;*=Y=M3a9{@773GbSds@kid{pRD?@<6JI!p$E?7rDk#y z2izU*3f=(n;&e7O76-rd9}VhxMR0z3Q2S%$jf>kCn8EkMy6|Dx6wH}f!QG7kpUJ!% z-VS7N+qqf$Ea1K#h{e2sxiqiVBY_+a%h8-V(|^B7Y?)uNZ3|{V%^ePCWdGW8yYrX6NH@BK%ppW>pNh#2;Voa9b~}&eU7K z{eIzqzBv<@dh3&z#7+kAf((#nOP}RoUge_S_RevRj=0259#{02ZTw=F4|i(zomM%L z!3VLCWphO!Z%S1?>1fT^ZH--&i-2!`HQxD1i z*VgX^xp>>x2RzlcBS8#o$vuWQ#@ym~UdEyDKvZ-Et`PN^v!H>Q=Ume);?VfLQc6s2_y_uoM zo_pM3&+nKT^6OsAzWF30FEzL#cpuH3c=1xN%?#hZ`Ipa{@aKUZUpOlc{@9?eH{dsk zyqx(^dv6O{dj3@4=jkwV;$jcTS?^x<;=U`WJAdZT+=)?s?tM>h#*Vnjn^n4Ebf&%| zYsQ?Zv3S*jUvarpb9*s~QT+U}_fU`veRaVhJiyP(`^H@yGY@_P&V@bUqp)#-xqLUg z8O(=S@xJ2Cs`S=|CxUqKdib=ty%{_lwuP<1?132*i~if253pxL{_Nn7oYn5>phx=W ztx;Eb=pQ*ca<)2`+p(ax_PB56obhokut(OnSj-TPv(5kcfQxD+=kZHM-}Hj4T=3T( z_vq-k+UTu1iBWuJ!I@r*ot)mXZNECOZBJJIzHysh+_7gvzr7947nnz&9Iu&nGUavz1MEIDKW1*PX$=*;Nm@n?tdyEq^$8U*JpJ^5siB{HOuFN5X>v zPs!26PcmYBD*QOel`XY+KG35hK0Loakm2{{fE!ld&h6*h9pB>TLq1{^KUzqvCHICvE8nN{hD3xDb3fgW8I@JLP6O3l?%4diLo zp9nZa?o_(w!?zgOGjqWH{@_fGCjvh>OV^yyHK*jn@lDtlSy=N`8%CU4%j2ljo_XIpLN>?iHzsHXn5nztUuy=iJDZd^MUb_VmeBdiN%&`hll_=}Iz zH@?(nMfjxi-C;{0zd5kw+Z?*H`rZ@p8TT&>_-&r?<%;FZJm>?+?R$YQ^R9+!rdDPR zXAcLzon}icR(IkxH}>X=?5Th|e3(t~i^JO^4jleCh)X<&+RI(uW|a*#-CZ7zx5qdA zFgI$guHqy2O^}B>y>v$x2jn3?x#6)I=)ZpRPnHk%_0?WH^l=Xl$>7|TL0;<07w(Ih zF8lb6L*$*aHE)17pDi-tmZMyUv-HHHR_^rxZ>EQI`DWX>Z|}35#KoW4;78u_yCLAX z`E!Spau+)tzj5Louq_^Skej_#%=U7b{^>0n>g}E`d-i`8)SW-JZwh>h#rt5zZLvDP zG29d6Bu;yJYH(K&5Bubt>nEFX;Y&>7F}G~c1Kco==5Ao_)ZX{DU{>tU1zg2Zc7GF| z2<|rrv$Y{?S@s{b?hEG5Jj|-6Uj=>RM@{roE!^RXKH{Mm)z$aUgL`w;g?90vE$W#7i(i@~U=F*vOeG|v{XJ3qZD;{?2)zU1PRrS6qct`Y^4t~-jGaOsd z*}Rv0&>@SXxB={u;~y{e6F)$|%?bX`ys(28-cR=I&AxB7ln-w6qkbSpdgRQ6b-r;8 zCN4b&`KrA>u*(nr$juqM-T=LFCQmZ#%Y%$Q=*z*tKFEW-nD%!rZyd!JoX`_*soK&d zgJ*c;&iSrDPj9ShuczKVGW@cyuIeEs^>pTa6^Gi*{7s&>bY_084)*#ZXZ4)?os-8! zXEz3N&h*Z`{MAPt#l5<{US1pcG`DK17V?p|8f^)3KMf+n}-u8O;O?!UiAWnJE#f|?NoSPXjt1;X7E=Kid)84!} zXP=B7nn`=Sm%BXlT<_??=k3iIKJlYpdc>CgiH&`{G=KQ6&-1?0$1A;XhYxZZ&a%zV zyutb<&&z_iX6Br+>t3(u+!W-coyd;Rep=hd9_)XZ5G2)_Seas6W3-hUl{IiR1;uIg-&aMme*v2_`>WmZiYEN%+ z^(Hx|!zUa1?OQHlB8&Ip1a)*~&+jM8w;lld{E<^@GeOQC$K>Qr9^#)E+<`oCz+R2j zoiBPPTg4?lHC8X*N|K#E6bIj9%bdwo|Gb0p74P&={AAUFEj=`U;?Og*}N}ryX^+sLDsw+Qa=;@an_%es?)kNLMfVlCMJ*z&7fy^!8y5Jml zeeWt(byGi_F*jnzP4lEzY|s${yW$n=$kA6j_QZp;II7n2+1H*OygwWcgxx{>@*t;g zYIJXSDDbg1+!Od^hws}0?l@B?HdX|E6NBE!1Dx@rx4!YgnH8tRh#O~Hy^ms?-%aOu zf(v3JFTPoaJNls(?(}8)i3946$7;*2o|5AiZ{z`d&F_^Q#o}IV%)`8WAJwS9_twyz0fn?cqT^ty}p%wZ#AyaH_PHuC%(k3-s&M=d5KvLeDb9(dWi$xHZ@eI zi$UCCaDE~1&6b{ufgN$_8;DbG{EAH+c;rky#pGMB)yFx0TKU&c@$gHAPv>How}KzG z`BEpjtE2j}ss7HdU%u4^FN2z>tsL3MlLJA2#N~{SZ}S45A(| z_|;S0ZV1lRS?|2%zUko+&ar)apkr^Yubz7T&Ra$@uLsysRM|C9G?1Sn=i9?U62QTIZYqcOi!Ha7u#|bi#y!nUp>{! z4BZrlckXWv>c)rt-20w4fDJPA)gJf|pT6k7IONT?8qd60#VZdwa@<{PYP%z>59)1J z)NJx$cerM~rSFG>{_->L!O8A$fQvXW&Ec4hA*GWj)gaaf+8uHTpq#KFIg) z!n0v`$LBwV{}uFJ&FQMUnen@&Z(>nhns@> zUlY^|#7D+n9MdncvoUW2T{7|*U7V5wziMTjchZb@z(6fPdvNZdq<|8 zbWioI?tF_;J;=_xXQuF5&+zi-vhHc!70jPIHBle)#=m;W>%nDxqV<>I_V8@@VUWv> z!EC-5oU6UMJ7-5N+w-Lk^0eZQJKX1A zTx`sI;fB5V$jM7SI5IP-Ms&q27CzKO{m6*LxifRYxB0tcfph)8E{N3~`_9;6!`&@m z`0iW$be)kC-^lQdlk<*Po#C9C`JGp1v56gDjs$bVzq*T4t)1z!H~(0`Nj-q5G@JvuAJ#(%G zVi&V{^N#pUlCSyj4u~Jr_y<8P@k^}gak#y2I`riM>|W75yJ~B1p65MQS2e~VGmbZE zIdSQi99J#p=1H7tMGrsqi9LNKYfoOC;!a-<+^DHIbJyGviGB>cFPG_kfJJ$f%WX zb&~_`>yvYO^IqKE9zXO>4Epc=<;$6T>CSJVnB=UkW<;&z&yI68*i%b>%#=Ga;_!WI zpf4UAXM?VL@$zTYNAa*@6|-F3$x(cAR1bYrS9a7-J@9B(*d5FZ-s13%UXUeCAxMR+0nB&f-E z!kVCu;t~fRVm15XFjIKq-Q$P;V?hnnM(-xhnNf46KBod3W^PtF%Y~l2$lyO6=k{_D zlltO<7@YAZKeMHu;!$Vu>XEvDc+}NBIlabrGvJ(W_V~v+=eTAi@Ba3nzVgNg9K$EP z;EOEZ#~1(luBV{C?DHvKwUr+`&e@QkT*Zh#;*hH|zQhTWlRa5|6W`52URJYVkE6E* zeV>`Z3I62bP7TR{Sj+<-@-|Q6um|xtBg4+U0iWoa4fP@kn?qybyj6)aL(&e+$0~{~T@);&vx4e8MI1v&W~L z9}l>>COi<>)_=ZnO|0gYj+vu}|6p#_N6p5rJm>CM`<30%VZ&^hYq_#TkE|NaTkL*% zfY0>xAOG})Pr3NkPqF$Y=j__x_j2AfeUu9>s)KuV!2|m0q|Z-<`vZBo>IHdm%1un> z$ciskvd+XTH}T@4z5BZZ4&y(b;VVAt$;_I5njJD^&6Ygu+1I1FCnNsxW6vI6Hby#Xf= zgpJ|j;EsPjXSU_|{qQeAy?zuP3g+hJ@KR87XL@u+kemJG0oUaObH1`w&h|Lson95>Zto1Y$>=Bjt6J4k>}-kK zeCVC{S1;eZ19UWR|#wZ)G1Bt!(1DmCYN2IK*U6jt{=fw{vG| z;GE3NlQ{98J@>0nr|F7 zZ{7j1f&9dHW$=5?2U#^ygB5{)d-a;ykY63H3NssKOi$Hx_@!3nQy=uqY>Gjj^^~27 zgN~eW+qoF{)(3gq)H-j5n91RWI*5g=9QFslAMEk}Nf4vjiGwYAYG%gehKDm_c#muN zbI-DhOB`Yz&X0e0pf+-J&%b!t!OPnNANJzae>Gs!nf%Lu`DI$3OL8b7CXIuT>qVfAs0G?Ty6$;|or- z>V-4D{C(pNFUbF6PzQe4GgszLUvbrM+~F`Yw`ch_i)M^HvN*^W{^A3UdHeKpBsam+~YD%vhSSi)xkMmzMYGg92@@Tkf%M+rNcHIF^JjTIX%3=b@JjA-`H?I zzRe-|(c@P=_=K?~E;CM#9kWE&YW9GP@7tDDoZ=84|L!JscE#atY9iKCOAl~kb>DiA zFKXxa>PXN#oPIpump2l>@b5s_5yMg9LP(*{w+Ki^hzGMBS*RNW6z$Lu4r%W=!@C6 zm8^F|4l9EE#qXX!If|b>?-4&_*-|fD5f2+=)YlyIt3UeA2QKIvUGdQM?Hs4nir(;! z9X80(7mqpRZ@$%u@2TaZebY00R`p<8t$gDMZi>ka;gcHS3cm40_WHn&*qoE$+d6PJ zGvmF|Ke6MpK9l2%9VGvA4D`$`{+T&^x-vM!TO2(ayw~!5I>`OrfRF0@SdjB?!e56cgZ`QC z6|H#mV))naPeFax1oLoN@Mb?7$l#z@#UUQRV`uiOI~R+*%m{re8S~EHs$lML9CyyN z#~ZfIs9u{vvd(dlJf5gEKWeM~Y^k}vtqgpK7iZL)E+4-6b4Sj(Gdde2h(|xmN-sH@#JzMMppEHAe;Tb>j#K~KO_;K|1AV)ov7k$3)M!ss~ z&R%|aCJr|3osCW3X2G|0cx^8Ze!s0xj&1k+$fWTzjGY^8p8+3u}Yfl#96+)6c>W!cT%b z{1HDLc|IQgKH!&G@!KJe%lbBJ?3fR6UcQ`>6}xk*T*;e5GUi4;_~iEkH~bB7EQo() z;K#X|@uSYZ+0aYzkrToxn#-MoCeGapuV+~Fh+k>#Hr zeYVNii-%9Kkr`gAm2WFs=7BA%c=*9l^3KFDd-q~-&LvRziNFv$l;M-j^+An5I4I|FW+lh^@0s^c6aM< z0$G0Kb}HbcnK5_dz`!_kDMuLq?wLToKfatbFX* zVuOr(d=R&J&@bQWE)RTnhl^JQ{F}V>(@d`pI7ZjXraLPea;M9uT-9B^&e(O&jvmnS zjT^rCzxG@E>)P|LPI{sj{9Lm@+~T0iww27x0X_Hfu;K?_?0N^xpgno|HwAw9bnc#< zbH9J~;xh;C#c@l(WxQl#YC!JJz{ZVX{D_a7l?-2OkG+Y3ZRhODYwqc)n{PSMANyh- zeR=vOM@FC7q$>}-Ge0WLhtCucQrH#0V|Iu{pRw#kb@{QUB1FOKmeS9j{7_EuanL*8Ni zdMt?HvY=*{FDtp@VQ28Wr=RA|ZvdX?vp1F;e(056s)cX&=IHUjx3m3W<`4IN6x0BZ z*97tTJ(JgugFNK$!|-zWX^4HG^d2CTITj&7GAT9r4@aBQCNj9&<9W zi&NixlUD!ll^hh7)?Z7X4Z>^cKn!Q6|Ti6qvp9pw+ zGEDEyF?l`0Uopu4uJCZc55EKEabGZhemnUzYjVJI>;2)$zz&|69liTM;r|P3177I= z&jTO)`(Cx|@sI6Ofj<9YUeUdn#RBB;()^7KdFRf|l(?>H6*Ep8Y2^nu*u-;rdk^f{ zoBu~ak3DakH;bMe^_;AF>kWNz$rtza*SR{9cQ(AECl9=5mwox`y|)j4$>5_Ns0$n7 z;t$uz4Ogw=!43Cx?B!}c*mZ6;#pRqn9kS}+dwTBMUd%vV4D8U+OZM3kqk9||2S0dj z4#?rK-y8Bb1aj=i$GN?H#le<(kfBe_=|wnl<$hFMamx_3w@#9zDltHB|49>m}?D{(iLI9?T04;jNi;Z`T7pHHhhwoioP0gvXLk+&IlW-kwXGn0BRfBvV3>hgS$C!3eI z;;EkN5$@d?)QL^~z=`{Vp7Cq0<*R3_gBaPt5q9~fO9mJ1$=Z`+Q=Dpp-{hUM55C#K zPaM-fb8c@w@Jf6$5B73!hhK7Lha8<7g8bOCx6-{e=rvy>!xp{Ug1qTl^`0F2bi|{k z^zcB;!y~@kgL}UCoHI7<#YA`RCVu*4obxgHi%Sgj#4vi|bEkLWcRsx!FE+Ntp-#@+ z>j$psr}I_8oZOy4esC7#$JXVoV#Ggk&S&1_ zs4i^b?8PKhZ0ew(6JQFWY*o#R|=vvvg=YQT7{B&j&8;FHI z9?p70dw%5ze1CgS4=3e1a=z)S0sCT~-yHFX!#)3E9vO93d$lnebjYbSKm1zF#`v|L zZ?Y4c7)D+kYajcvO2R(EotD}Ql#zwy{ynJ4RxFx=zQ-fWsV zvw0xw3iNQ?{pPSII0H5g2lJ&yc!?i+rYAUu|EpU6cTlqj!f%3HoZl1vE&QMG__F?W zE54YA;{kth5l7k93v*yD%*kcT_wbdjnbJGD^t=uH$%PylIStR%N*!b283Ow2DD&Ea<>Gl9BvKd*fSrvEcV+18{(ty+=};f`Iv9|_F@+g?)j$Amz7Ot?1TYpz!ZdvTbV746L( z->cfo#W~)Z34Xl;?Bj}9t_V0x7q8hA@64#Pqk*55fqybH18h6Pb+-A&UF+qo@|pS7 zbG;nD_WG+%_BhP1d(a0lPk!pE#%d~F_RSA}YJ=NWHsnQDuI{a5=L|>q;~OXN#GMty zZN(w?*982+qv0bNaEFibBSXhIp5i+lD-Jj(>u&hz_scx7Yyaf3vg@0?T9Bb9PPsUj z13Bkx^W%+S%PI%=&Ijg9OcTq9am|waZf_t{Se|V4cW|-ecgZY~Gl8<|W zJN$pT^&bMRc+Y+o{xSS^`IZ+sTvU5Gh#ky=xK?&{-?6RC~Pio25o{&6Zr9({rcy=9phO<2X6o=2y%(vN{YG#KH!y(vg!{p#$p1h91)w z4_n|)zI3emB7QO80AA|%%o@Jnz{DY5wG#_p{Q4Hlyhmcv16;6o=WSsN=bTxGcV@~S z_{UTCYUGR_9eaMsI8zrf%*@JHt}|ouV2j@HSRQiFKki^#0 zjK00|JppI+#{7vHx76;+fInBXJ`!$SzJJmBkIVN@TVD*n2~$%!&)kZgzJ8hy9LC$3 z9US*<_Haw>B$&5{LkYU#ySuu?M#KR`Jxw9w3FB{Iqrv~iXs}sBG zes9nZ=PLtytAido$KMrU<_QOJ=(1M7Ib?1O&e_mkJ&-%Sd6WGX4d2Cv4|LoEf8xDA z=!qC!2=@f}JQjW){@-wSxHG7g-yeR=0X^~K?fgcW1#$9)pSUVEaq7R`>KS`}tK_0) zxafCAp6=C#-I)Xa%!0YPymRl6nGg#dH4p5F$b@u-O^rN)ka=&9B$a_iF0SZ?b+8?zF_KwH`8Bwbo6|9CJ%Ap zpffSpkBr_pXU9rkj`r6q-+bdK`{JPw;VqN8IeOG4Zm=9(i|cu!%pu zfeicXssY)F$(}47GWO2+kdt%v!M&9|=jsk@{YQKJ;IjDd3F5LhYx?SMHr&D^yfqVQ zjDzxZPtFV+47ko08#r+&_`Nh=xUV*PY1I>)A?J71_pJ-$rmp7CT*~*Qur|CH%m%KB z%WuhLee0unuy-adF^i4=70bOC$&wMLn&38nY9>CMRa+Roi9;x94wk#Kk5(`KzD3d%mr{ zM`rwpmv8#&DUW-?Q^9Y6x|u)kxql1l@rusGzAE6jH`edjWqqG$HD~@##RD}Ub2#h^ z!v(ygKRjS_br3hM+}q0c(_wN|NA_=S{rezZIpGce=8sRDGh_D00v?*rnNjCvZqCF_ zhJQBI99PwBcwnza^UbICLLPqm^m}FSJB3GTh9}-6c}^Y8haBfk5I3$m6F;sr69p{WI(sl~*?zWwNoyl=JhO^+?{_@0@4r2P}&pTkeW zok8q)e=x{P-EIpwx`UPq=R4fM}wM~1F`Y@e7Ga% zn{TuEQ0x6cp122M!8N=$S8S2RZ+vABH*slI5Sw>nMSHP}i5;a&pm-pqFvbkVrEQY5}(slW7Jlw^{KVCYwdG;+QmMd zJ%`i7o?Q;h{!ofY5fKR?gb;#=NRSXh2tydc5JCtcgb;>d7=~deMWhrd5=10O*!K(W zH++zD_J=q3bzk@ObYJ)T`g|v<51mKx_1m0@tFF7UdT%xBi5%kk&dD#HIA+wF^>@*I z*n)WC>XEysM<4Y1(pcSfD~54E*Gh+uaJib*3(Bd&yTkzH+OFO}{^M?(kgjli;U;ntVU-yBzig?&EGa zWVW^p+3Fns0S6Ywicfws)TbtXW)nyC7`_sC=Z6CKc_MH}+!a?}9|_dW*4&t-t&zlarv`Xi&fw0?bRcf)fun{b&G4pIycSNIP7{yIyH(%=N?uz z;yAYlHsX_=*?%i|DEP^M``j0}&%FUoc}x8E7JXy9)%z_09-AxQVefx2@S7lyz28Bc zS~22}o(I}!( zt3$s2-jL0kcNf!q;)a-dDVEuD=AL4?xBcyb`o*MEi<)swonqRXd-?Q|ow#E0tv}x2 zkNo)0Mttue4m&x;V@H-(f6N%Y{(2{Ult(YhZT_7DwqlCI&g{w~uN81ZY@Ed*^^~`2 z^&a%(a?hR*-g-}OXf-QhJ9mZ`a^nHHbAhw!?EG|ZWh;)nI|Fy7e=K-75ZgJum}Irk zt3mx_cMyY4O=`FD5w9~Rhdm$bv`#VX#jx7*t9@nn(4XejkLGlL^7jIM|1J1#uqRNf zH`x;449;B(@JeiNieLWbac*4g$_#>7aI47UIe7H_;cGTIstVaG){Mb4(pHQy)wuph-TLW__mVEr^ z_?cHdaHh9r$s9YsJ7YyNBFlP!B(PGG8)?v2Dn5fxPlLGmmN`chF1t<@@roI3(G{MqsCIXydf z5KDY=bLm_6?DW*?+!@fRPb~TDr@eAVKFOX!{3~Egva7-4K}l1 z3(Op@uLgc!*x<8SyEyb@GpMfngC7Sk1m6qfbw_${E|0w48)toob_KX-4&ABzW@|R& z-4eZ;ov9D^tY(1T%vnLb_-vNw)hm~r;^3WgbAu=DZ^jzm%-GAVuY8&lSH;w8wcZ|h zD|jUE)@-f#WZu~7n>^&sHedC#znn9_1a2 zOeeOu^88!yy@2i;fw=0H$8Q;bZ~DN1Iy;Mcji=t0ojK#@{I=-m&5qj4m$R+etC0=a z-KI9)P)u*^UB!{d`lX=uWV2;fHnXZxJh5Kzjs<274g~sXh-4PN&nSjPQ8P3`*O%R ze&L+6u41?kzSY;BEUx>yk3R8nCT2N`hxYV4#@aJF^_KhO`2qRdNnPgd_CPP>;?Jk^ z)BA|WpN%uCJ=@L_Sv~Y}up_r_`}*={YjqCJde83p)2jo&^iSP-M}8sL7wiq53w8xx z5AYbr@Yfrf%W`-yFzKN+%zJqFbC3rU26MQ=`XIletaQmEyqRy` zmfIsYj(dxvFV4*vzM6O3V{5Mt@%ZUy=Uh%Ua*CrCe(s@1?9CbIBYSUgKH%q$mm~Z3 zxr;dT3z64`{&-gRmDAgI#&Bjfz+buWhivtx-bAbsdR`1xm*tZULW?WA3tzwhs$KJ}m zXX23cPcG-;(38O#8?u`1oy!emzV6MAja3}?xIfq#JQ;j1Fc(h*4+Y-g&R|R6Ew>K& zTHY47a0)-*dSFIy)%j|`M_qVn9?blgf~Ny{p9%b}fFok#nbjMAGk7WRUGO`+65uM1 z`X=BT9Upu1q6T%blaEer@1s_8g0FOJ)NS^}bVo5~0`rA;xFMc7HNR#_zH(1ocVwei z;<}%_{O$F+9P>78t?n!@9*MIte6D8wW8jRRnwKN1RUP80(Vf*q=T7ER-_7KOz&A_3 zeM?%edwGvtL+8Bw&~x0z3-U4)$gv>odG|wr?WyfgL06qe98Q*W`qrYdokHq+0(Nnn>T0d z>8yI%n#8j2IsI1xzTXIb7W^={Kls5|w`TR$xQ+w!@<7skQZ*}sw_hz_-kNPZ^Gms1CKn^jN zvigqbg*)h{I^Wto8xuY2Fq#kF}d1Kca`S-Vv9q{GH-`&(||4`t2$RF>Y3H&DQ57^>M z-xW7D1MhG3&VU2Hhn)$1?l;+rOJex;$@zmouHOdw;F~{_RWAMfdGNmib@*MuKY!=p z6#nBX9-4i6@oR&N@^1<7-?}w0o41V>cb%zCP4b$5vb$L2C0oU0?>9vrI`@%BZ2ZMr zcfbwt-9t<<*r;9K)T>u~?B&8kchOUI%E3ntca>XC_45^9ALIjd$fr)1c#ZnJHAhV;F)5=yYY9iCi0nX(Rmp@r8g;@0b8;?xKhpxW#wRcVyM^C)Rv@SC6 zQIp!(z7TvnpnEjfA3PX*Be*ZX7aZ`WW^HS9_MJcfCcy>VSRUs%hpXnwoZt~ZZ}@QV zZ^27}`Pvbv)$fO1s^#V2mB4%91b=)oFMdz)nvBz1ay}EtiMRI7%#=FG_}dzBRIYNJ z%+~LmI5?+P_H?*}qvEn-kCSZF_NBl)s8z1++2fG9tnMbax4|d2{M^moj3)wjYz{TE z6Sv`?VW3oGu)#46#L3V~;I6`m56Sb=acRP>l==4i0 zF}$z2B8Hf3*{IQ(daUI*nLmy@n+xUxemG~( zmag}A#-1-Y>)z~|Rept9-BS(iPveQj2b!C|y?UDaSCRiAxHq^zaK1NqCb%c?J;nuG z_r|zyuGRvxa3(OD?C5X|x2<^K-FF50sKzIQ{}X&CP``TBheLAzAYij6z)gIX&pdn- z_^rDwI;L++pkdcDwl=km*=es@!o zw~#~MaoAcut4!SsZo90djONCx3f(+s2+e?Vmff zhrf&bKZ36ZKMwr<+!eeWd^Ok-cndx9ZT7yt*VhAcw-Vrz-@El8v!TNq?>iHiuNQ-t zf`19*bB-r!*4GDvp9Jc~DKT+WE<98V{^Kf+;hQkqwrV)NzVq@Dw*E9s8{Wa!BQZX9_fjAYErv< zt3_Nn#37q$xGnHDAdkMt)45WUIn-YeyF7Ad^JW#-8JVwm`e5}&R_Eqe9Ne?A#U*<& z+)w<*#ZTw_#ItA1Zf>A6Z||I)76HWN>>Rj<~pwr(2`L zFMKo$^mOvmk=28b&g8d>g^y~Wjl5T+6y1$jgt9cT>N6xP$m+$vns_k8^u|>QX0NXUI(R z!FM`*^6p}n3;4hWpYYgyaGnkS&X;~Ur)Ted>(d!^Hl0g3^oA`NrZZbxesZ>MIoZnJ zGdc8?ojSQf7UwvE}jvdYPq3}o?oCQkk7 zrnz6p{s+N>!LNhg1dj##gBJsHbN%$4?oSI_~L+^Hv=3K7k}{@-^9c9+Tt{S9EF*{TZ-3NRAc9W z%%07)to>~f8-K)To}SV3!EOGv^⁡#i}-|nlF#o-c?OF&DTBHsb78WX%4O8;IEl; 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 diff --git a/ci/verification_io/mobilenetv1-w4a4_output.npy b/ci/verification_io/mobilenetv1-w4a4_output.npy deleted file mode 100644 index 86ad4e0495e5f7d426feabd0c521d9a6f71f8f6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+l>qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= oXCxM+0{I$-ItmbEs;Q$;t3U?eVrV$*%m4xnM}agDHym;X0KX|ALI3~& diff --git a/ci/verification_io/radioml_w4a4_small_tidy_input.npy b/ci/verification_io/radioml_w4a4_small_tidy_input.npy deleted file mode 100644 index aca21bf06e2292ae4a7e1001231eb1917717994c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8320 zcmbW5F=!*%8OJA}LIf8oT&Pengp#&8o2r?EfTsT360}cqHBi_S>$%%~<3~^vE zW-*Id#Kj!uFw3wki&&OJEX!ezVC0q#R{IfDg! z1ux+nXq?wDqNcCma4m|S!CN?ieaDc!>Y^8@iM~ZK`myA{VH^Dm>9<6#{ifuX(0s;d z71hy4_L#a4@|XT9)G=Iyx~-wP4E^iD7)i%`t|RMG6O^GO;cVf2Ej*j+kY{Vj;8)Q8 z%;6Qxp}zlwC(!&8Xk9t6zSoBONAM*~q4m`8JA$s;f!32i>x+@~-!e9W=Wq`etTh+! z&@MFRA*?P#-}DfG@5Gl7@T^*3<32!fVzlO$`K))Xi z=sCF7Z(nUKs5%H|XdkS{_oss1p;hz`R7bu)_qJ=^BlGo}lEZyCh1Qxt&n}~X5pqB8 zt@+oM)XMV^&fqcp2ru9YdW%}Z&Y#*zC-q6hW61{Xczh3Y@%)CdSyTC#RT2g zosfgQj*<1w(dvNr3w2QkC1|VUemV9O>NiE+*E4ty?U%7UU*DZm=ouct+9G@tI?#Bs z2O}6mbMfq>B=o$1k>hJ2pA@>M`?N}$oA0dghHww&tUG|lOQHQef}Z~&tS^J#1{`7A zw+;9ln$HC^{%dGnvy$45XVAXb>ppx2U4ICNaJS?ZbliQqa2=Yzye3!2$8Zz+8)}oI zETH2t>LYzyXpE|859Rpm!Xb1o?^PFe*225&o%60&2B8-%Xph$6E!=|EyN&jdxlfTb zy+jT47J0tX{`=lX32|Yv2z~Xwy0*Ct^=-op-xMbJehJO-0$SHg7$a#f93LV5tmg=g z(GIc)32LJ{`owzg@ClkBYo5T#8ZlvIKz?u?7Wx0~-37Ke%;6M%4|BML#`^$Qmf<_> zK4;k0vsZLg|4#>Y3`1DH(Z~gKDt07bc#}Boz~kz`k2cMn)ChN6US%l z=e_j2TvHi@UdU_K6pYuPerZCD&^wj!?0a$7A8q0mj2S;i+Ve$p_p_cn3HiDHDYo&> zpx=aZ=ziwD0?nfaV_1dWu}}DA#JGYtu0fm3CGZrc%)Qah*$c*t@NbV4{s-H$yoT1~ zxAhi!Hq~YL8)8r2V!P){*oJ;0iJ; zw4d(d8JkDSxHYCp@UcfZ&%R$%6b%@MP3T@dVdsE+o~HR}?Xz!jJhJL7q_7S6mrAV;3<(Hx#Y&+Y=Q zBF{)4|2?u&+8>#J!Se*3Lci;~+KbR*-$`S578x|(7#_fs{Zkmh2~6N!uc0}Q@$>A> z&%1g9&rx*{zCY&TUgma&95**}@*SSSD_9WEdz0niZ?t{9#J+;BVYCe2wi=vZH(;-1 z1)7WduEK&?`WfrapBT>PFoxFKhWhrA&+Fy0+$^6*u!Z(e71@tV*4mF4dY&13N$YUl zK8|5L2(i1+9L#mjnl{YIYXv6w=I9proG|7+N}*?S0lg3J;mR`f#r*$;-Gu*!4R{63 z&wlFv7TUja=w3%KOTyoabS>QNYv{f;=b-s@;0UJp9!k#hIkb=7A7gpH3TRH+m*xCD z=h!LZFU#>$sQ(V^EJ9!I&X&FA*jd6nbk08Iunj9{9eGA0DnTknQNM?nZO<#!y!!I zE{vf4Hs(~)!%XtddGF;1=qi1PPjA89_ z)@a+SZPZ0Qlpx1^&he>3_q#?(5}u7!@O%xgP<0T#eRa5l8t4SM_Zjk@pTkS&zZECY zx(i}#L4T_-%fowFK!16Ty=y>8U(Ju7ufDUg%x-RJ+~or zT~nKQw~MgP-FJy+&#J~;2X2&fZGwFUQ|Mm$e*^8yJLq>pdj&afzW&XR(Lu>|*g*QM zB4hX*!3s>t$2i_8^P0mO_z@P+yY-OwK0v&MvZbFCqL+{^nLvA21di|66lZ$WE&3JZ7+tLP=FqYSl> zccp{&Q4e)X=B(-S91&aEN9WB~+kVT7lAe$D_b@4`J;!$4*U)_?un8M*722Z;%-P3Y zE58}$VI8~Bx>AXcwC*vC7oi6GXucWL=L(wdE%H6BBKLLADY6Fh=_CJLxrvU^R{6XQ zqtbQ{&t$k3-rto$xOXFX!<^sabNCuY@LQOWgWrrXYjS9A+SYlA8t5IeA8(O;nxO=} zD)|!jkkrrd7Shl4e)sL4->@1oo_zm+&TH3^^RClBM#hm@$up?m39`n0bW7e_@DiGX z=TU{ZJ?1&f!%Ufh_-Vx(x$anJuIhHR?ly@&k?n%C-pwXg}Tw*~c=b?CXcmwk_5!MYgv9{B9t^Dd;+bs(wd z943o!p4RaJ`x-9cC+K~%pK};P{~x6TUEhNpXbzsOy^4sv0ga{IK+cbm{`R|tE|9%^ zjUx04**C}S;VCT0&-xQ$_M!Q&K>KoE=MdlCAl#P`^sElGS@R6$a0(0fWobVzc?2`Y zcS`n4+P|FfyS~8!)!5T~>}STF9cbPOY?mBD$9JKADU9G#m=VL85_os_n372zn3Z&o zyZJ?+cjTd+m-DVOp7q|};S=Mr-!VLghwvlZgVwYS+t6Na!Uo)fp7Rl$L3F-W7Y{8R%mzu4zN#SYv$(_6D?E4`yw)+^@9yX9?;W?W333NV! z6Una!?a>Wm_9=$;%06k|po00{GWhMo1p7IR;MXNDN}j=#@ndb)Zo?sLK;P?2bl?99 zW9}Ej9J)ts5WdkJIKp0sI}g~!Hm3dBfcDh$@ce2pWA9=S&LV?##>Q|6tt*8EKGTxt zFlJnur{mre{bta0IW&%(mvSHd?)HWD*t--D!kA|;V{8lyxC<*tTdpH}-hldDBYTmc zh}bDIpA6Zv>N1=~AKqe*;Wa#jQ+Nz>*2rirjL+d7c6AVX)`SUm3$|b#u0nG+zO_U! zS_Br*@gCA|f|}?AbKq=Zr_G*l3B~#Wro+ja4x+K2q-Pd;}f!>KBEb{PO$?)xB zPw-uV_QrKNGCynbm%`eD{v`N9bG8rm%9!wg zE!M(4SRaJ``(3gZGuVM2;3oVLTDzP;$K6Xm={vd)$Ix6Fa0^U;%T~ z=GmN#ZT=_FykAJ}+c%Q6-@zQ_uz0}Ba{LWU89##&+>`u_@4q43E6KzABgbpOjs}6A zRmAu{)c;hQ-~G2f(=Q3%{PY3+{%Px%K)*}oeI|*co#mVvwC@*i42_q;SMVCXhLvTo z8_@Y4bo~%Mh4yt99>6|4hAZ$H^d6nUsHA&3Zg2G~;32Fdd(%bsd=nXegc7uaoRcl& mc#QNhuRdBuO;khGQq~ah?0)WLtvRv>-q$<{_tZO{=l=yaAEWaC diff --git a/ci/verification_io/radioml_w4a4_small_tidy_output.npy b/ci/verification_io/radioml_w4a4_small_tidy_output.npy deleted file mode 100644 index 0b7628e8945e58499b2f01c17525e48971f6e956..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+l>qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= bXCxM+0{I$-ItqrGItsN4WCJb+1_ws~#1k9p diff --git a/ci/verification_io/tfc_mnist_input.npy b/ci/verification_io/tfc_mnist_input.npy deleted file mode 100644 index c512bc8dc0b16d60376f8816961a00f556c262ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3264 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+l>qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I$-ItoB!WC6mOItsN4Bm*vnQ7{?;qai><2&`~oV6b#%V2}r5aUd=L@&$mH zRv->&M;#h21oGVoU@f4002%IT1L}DK#1o*jGSHl4AO^W15lX|{Qw8LwB8l+;+0+0X zjtmSfK>HJbG{`+LoC9R90E*>6?Ysiy(;6%T+EEL%FA#_)0PUtF*Z?#?6KGF85QFTc zHDCnV1B%N$AU2?}eW19jgxXg@W4l1%#tOB|8b~j2plwJB0OQRUXio(YXVAfKe}Hy? z;>`?*X$__U?WzXaQvk#%H1^vJU^vDC?E(2s4Txz892^)JyrFhQ18E)_`%MC9KCIlF zMPs{u0K+i>>bGY=yBh3i8Ip*+2J#;{bq*=6D*^ha2YU6vpG~Q)G)mhYI2#LN+(W#lcB}O>q!gQgIQ%ckqGoYW9Qv;PY~BnuucI z@cljKrk~fhS2uSD#cT0aE!xdPSDlyD#qzY8mDO_9y>!j<{i<8E@-LgGO}q6skIlN> z>Z6lcc{ZOP&&v1mhrh$3_~I4I!gl z=hAp^bZy;;)Avl?kXELS_na&DQ8tvP-BjoHx#_v{I(U~IW&1{5AN5^3ACsjWG}tHi u@r4YXRO35(M_d^w?t?Fcd;Z^?Zvyo_&ZU{(^mDg(YaePqx{>q0-TMOlucg!g diff --git a/ci/verification_io/unsw_nb15-mlp-w2a2_output.npy b/ci/verification_io/unsw_nb15-mlp-w2a2_output.npy deleted file mode 100644 index c98724f36c2d757f9d9fc3daa4498f49e38b8899..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 136 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlWC!@qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= aXCxM+0{I$-ItqrGItsN4WCO1MPyhf|`y*%o From 6548d668d12a5b9e29dd7ee2dee2972fb210eb2b Mon Sep 17 00:00:00 2001 From: Hannah Yan Date: Mon, 22 Jul 2024 17:40:53 +0100 Subject: [PATCH 05/12] Updated verification to use Python sys.path --- build/bnn-pynq/build.py | 45 +++++++------------- build/cybersecurity-mlp/build.py | 39 +++++++---------- build/gtsrb/build.py | 43 ++++++++----------- build/kws/build.py | 41 +++++++----------- build/mobilenet-v1/build.py | 46 ++++++++------------ build/resnet50/build.py | 72 +++++++++++++++++++++++--------- build/resnet50/custom_steps.py | 7 ++++ build/vgg10-radioml/build.py | 44 ++++++++----------- ci/verification_funcs.py | 67 +++++++++++++---------------- 9 files changed, 185 insertions(+), 219 deletions(-) diff --git a/build/bnn-pynq/build.py b/build/bnn-pynq/build.py index 6106596..43d3bd4 100644 --- a/build/bnn-pynq/build.py +++ b/build/bnn-pynq/build.py @@ -32,20 +32,6 @@ import os import shutil -# Set up variables needed for verifying build -ci_folder = "../../ci" -io_folder = ci_folder + "/verification_io" -if os.getenv("VERIFICATION_EN", "0") in {"0", "1"}: - shutil.copy(ci_folder + "/verification_funcs.py", ".") - from verification_funcs import ( - create_logger, - set_verif_steps, - set_verif_io, - verify_build_output, - ) - - create_logger() - verif_steps = set_verif_steps() # the BNN-PYNQ models -- these all come as exported .onnx models # see models/download_bnn_pynq_models.sh @@ -58,6 +44,8 @@ "cnv-w2a2", ] +verif_en = os.getenv("VERIFICATION_EN", "0") + # which platforms to build the networks for zynq_platforms = ["Pynq-Z1", "Ultra96", "ZCU104"] alveo_platforms = ["U250"] @@ -77,7 +65,6 @@ def platform_to_shell(platform): # create a release dir, used for finn-examples release packaging os.makedirs("release", exist_ok=True) - for platform_name in platforms_to_build: shell_flow_type = platform_to_shell(platform_name) if shell_flow_type == build_cfg.ShellFlowType.VITIS_ALVEO: @@ -93,10 +80,6 @@ def platform_to_shell(platform): platform_dir = "release/%s" % release_platform_name os.makedirs(platform_dir, exist_ok=True) for model_name in models: - if "tfc" in model_name: - verif_input, verif_output = set_verif_io(io_folder, "tfc_mnist") - elif "cnv" in model_name: - verif_input, verif_output = set_verif_io(io_folder, "cnv_cifar10") # set up the build configuration for this model cfg = build_cfg.DataflowBuildConfig( output_dir="output_%s_%s" % (model_name, release_platform_name), @@ -105,10 +88,6 @@ def platform_to_shell(platform): board=platform_name, shell_flow_type=shell_flow_type, vitis_platform=vitis_platform, - verify_steps=verif_steps, - verify_input_npy=verif_input, - verify_expected_output_npy=verif_output, - verify_save_full_context=True, generate_outputs=[build_cfg.DataflowOutputType.BITFILE], save_intermediate_models=True, default_swg_exception=True, @@ -116,12 +95,22 @@ def platform_to_shell(platform): % model_name, ) model_file = "models/%s.onnx" % model_name - # launch FINN compiler to build - build.build_dataflow_cfg(model_file, cfg) - if os.getenv("VERIFICATION_EN") == "1": - # Verify build using verification output + if verif_en == "1": + # Build the model with verification + import sys + + sys.path.append(os.path.abspath(os.getenv("FINN_EXAMPLES_ROOT") + "/ci/")) + from verification_funcs import init_verif, verify_build_output + + cfg.verify_steps, cfg.verify_input_npy, cfg.verify_expected_output_npy = init_verif( + model_name + ) + build.build_dataflow_cfg(model_file, cfg) verify_build_output(cfg, model_name) + else: + # Build the model without verification + build.build_dataflow_cfg(model_file, cfg) # copy bitfiles into release dir if found bitfile_gen_dir = cfg.output_dir + "/bitfile" @@ -135,5 +124,3 @@ def platform_to_shell(platform): dst_file = platform_dir + "/" + f.replace("finn-accel", model_name) if os.path.isfile(src_file): shutil.copy(src_file, dst_file) - -os.remove("verification_funcs.py") diff --git a/build/cybersecurity-mlp/build.py b/build/cybersecurity-mlp/build.py index 3b5a39d..7c329cd 100644 --- a/build/cybersecurity-mlp/build.py +++ b/build/cybersecurity-mlp/build.py @@ -36,21 +36,7 @@ # Define model name model_name = "unsw_nb15-mlp-w2a2" -# Set up variables needed for verifying build -ci_folder = "../../ci" -io_folder = ci_folder + "/verification_io" -if os.getenv("VERIFICATION_EN", "0") in {"0", "1"}: - shutil.copy(ci_folder + "/verification_funcs.py", ".") - from verification_funcs import ( - create_logger, - set_verif_steps, - set_verif_io, - verify_build_output, - ) - - create_logger() - verif_steps = set_verif_steps() - verif_input, verif_output = set_verif_io(io_folder, model_name) +verif_en = os.getenv("VERIFICATION_EN", "0") # Which platforms to build the networks for zynq_platforms = ["Pynq-Z1", "Ultra96", "ZCU104"] @@ -96,10 +82,6 @@ def platform_to_shell(platform): board=platform_name, shell_flow_type=shell_flow_type, vitis_platform=vitis_platform, - verify_steps=verif_steps, - verify_input_npy=verif_input, - verify_expected_output_npy=verif_output, - verify_save_full_context=True, vitis_opt_strategy=build_cfg.VitisOptStrategyCfg.PERFORMANCE_BEST, generate_outputs=[ build_cfg.DataflowOutputType.PYNQ_DRIVER, @@ -108,17 +90,26 @@ def platform_to_shell(platform): build_cfg.DataflowOutputType.DEPLOYMENT_PACKAGE, build_cfg.DataflowOutputType.STITCHED_IP, ], - save_intermediate_models=True, ) # Export MLP model to FINN-ONNX model = custom_step_mlp_export(model_name) # Launch FINN compiler to generate bitfile - build.build_dataflow_cfg(model, cfg) + if verif_en == "1": + # Build the model with verification + import sys + + sys.path.append(os.path.abspath(os.getenv("FINN_EXAMPLES_ROOT") + "/ci/")) + from verification_funcs import init_verif, verify_build_output - if os.getenv("VERIFICATION_EN") == "1": - # Verify build using verification output + cfg.verify_steps, cfg.verify_input_npy, cfg.verify_expected_output_npy = init_verif( + model_name + ) + build.build_dataflow_cfg(model, cfg) verify_build_output(cfg, model_name) + else: + # Build the model without verification + build.build_dataflow_cfg(model, cfg) # Copy bitfiles into release dir if found bitfile_gen_dir = cfg.output_dir + "/bitfile" @@ -128,5 +119,3 @@ def platform_to_shell(platform): dst_file = platform_dir + "/" + f.replace("finn-accel", model_name) if os.path.isfile(src_file): shutil.copy(src_file, dst_file) - -os.remove("verification_funcs.py") diff --git a/build/gtsrb/build.py b/build/gtsrb/build.py index 02343b9..6f5eacb 100644 --- a/build/gtsrb/build.py +++ b/build/gtsrb/build.py @@ -40,24 +40,11 @@ import onnx from onnx import helper as oh + model_name = "cnv_1w1a_gtsrb" model_file = "models/%s.onnx" % model_name -# Set up variables needed for verifying build -ci_folder = "../../ci" -io_folder = ci_folder + "/verification_io" -if os.getenv("VERIFICATION_EN", "0") in {"0", "1"}: - shutil.copy(ci_folder + "/verification_funcs.py", ".") - from verification_funcs import ( - create_logger, - set_verif_steps, - set_verif_io, - verify_build_output, - ) - - create_logger() - verif_steps = set_verif_steps() - verif_input, verif_output = set_verif_io(io_folder, model_name) +verif_en = os.getenv("VERIFICATION_EN", "0") # which platforms to build the networks for zynq_platforms = ["Pynq-Z1"] @@ -152,13 +139,10 @@ def platform_to_shell(platform): synth_clk_period_ns=10.0, board=platform_name, steps=custom_build_steps, - folding_config_file="folding_config/cnv_gtsrb_folding_config.json", + # folding_config_file="folding_config/cnv_gtsrb_folding_config.json", + specialize_layers_config_file="specialize_layers_config/gtsrb_specialize_layers.json", shell_flow_type=shell_flow_type, vitis_platform=vitis_platform, - verify_steps=verif_steps, - verify_input_npy=verif_input, - verify_expected_output_npy=verif_output, - verify_save_full_context=True, generate_outputs=[ build_cfg.DataflowOutputType.ESTIMATE_REPORTS, build_cfg.DataflowOutputType.STITCHED_IP, @@ -167,14 +151,23 @@ def platform_to_shell(platform): build_cfg.DataflowOutputType.DEPLOYMENT_PACKAGE, build_cfg.DataflowOutputType.PYNQ_DRIVER, ], - save_intermediate_models=True, ) # launch FINN compiler to build - build.build_dataflow_cfg(model_file, cfg) + if verif_en == "1": + # Build the model with verification + import sys - if os.getenv("VERIFICATION_EN") == "1": - # Verify build using verification output + sys.path.append(os.path.abspath(os.getenv("FINN_EXAMPLES_ROOT") + "/ci/")) + from verification_funcs import init_verif, verify_build_output + + cfg.verify_steps, cfg.verify_input_npy, cfg.verify_expected_output_npy = init_verif( + model_name + ) + build.build_dataflow_cfg(model_file, cfg) verify_build_output(cfg, model_name) + else: + # Build the model without verification + build.build_dataflow_cfg(model_file, cfg) # copy bitfiles into release dir if found bitfile_gen_dir = cfg.output_dir + "/bitfile" @@ -188,5 +181,3 @@ def platform_to_shell(platform): dst_file = platform_dir + "/" + f.replace("finn-accel", model_name) if os.path.isfile(src_file): shutil.copy(src_file, dst_file) - -os.remove("verification_funcs.py") diff --git a/build/kws/build.py b/build/kws/build.py index fff2d71..9bd47d6 100644 --- a/build/kws/build.py +++ b/build/kws/build.py @@ -44,21 +44,7 @@ model_name = "MLP_W3A3_python_speech_features_pre-processing_QONNX" model_file = "models/" + model_name + ".onnx" -# Set up variables needed for verifying build -ci_folder = "../../ci" -io_folder = ci_folder + "/verification_io" -if os.getenv("VERIFICATION_EN", "0") in {"0", "1"}: - shutil.copy(ci_folder + "/verification_funcs.py", ".") - from verification_funcs import ( - create_logger, - set_verif_steps, - set_verif_io, - verify_build_output, - ) - - create_logger() - verif_steps = set_verif_steps() - verif_input, verif_output = set_verif_io(io_folder, model_name) +verif_en = os.getenv("VERIFICATION_EN", "0") # Inject the preprocessing step into FINN to enable json serialization later on @@ -99,10 +85,6 @@ def step_preprocess(model: ModelWrapper, cfg: DataflowBuildConfig): # Configure build cfg = build_cfg.DataflowBuildConfig( # steps=estimate_steps, generate_outputs=estimate_outputs, - verify_steps=verif_steps, - verify_input_npy=verif_input, - verify_expected_output_npy=verif_output, - verify_save_full_context=True, steps=build_steps, generate_outputs=build_outputs, output_dir=last_output_dir, @@ -111,15 +93,24 @@ def step_preprocess(model: ModelWrapper, cfg: DataflowBuildConfig): board=platform_name, shell_flow_type=build_cfg.ShellFlowType.VIVADO_ZYNQ, stitched_ip_gen_dcp=True, - verify_save_full_context=True, specialize_layers_config_file="specialize_layers_config/kws_specialize_layers.json", ) - # Build the model - build.build_dataflow_cfg(model_file, cfg) - if os.getenv("VERIFICATION_EN") == "1": - # Verify build using verification output + if verif_en == "1": + # Build the model with verification + import sys + + sys.path.append(os.path.abspath(os.getenv("FINN_EXAMPLES_ROOT") + "/ci/")) + from verification_funcs import init_verif, verify_build_output + + cfg.verify_steps, cfg.verify_input_npy, cfg.verify_expected_output_npy = init_verif( + model_name + ) + build.build_dataflow_cfg(model_file, cfg) verify_build_output(cfg, model_name) + else: + # Build the model without verification + build.build_dataflow_cfg(model_file, cfg) # copy bitfiles and runtime weights into release dir if found bitfile_gen_dir = cfg.output_dir + "/bitfile" @@ -134,8 +125,6 @@ def step_preprocess(model: ModelWrapper, cfg: DataflowBuildConfig): if os.path.isfile(src_file): shutil.copy(src_file, dst_file) -os.remove("verification_funcs.py") - # Export quantized inputs print("Quantizing validation dataset.") parent_model = ModelWrapper(last_output_dir + "/intermediate_models/dataflow_parent.onnx") diff --git a/build/mobilenet-v1/build.py b/build/mobilenet-v1/build.py index bb87ccc..5811cac 100644 --- a/build/mobilenet-v1/build.py +++ b/build/mobilenet-v1/build.py @@ -48,23 +48,7 @@ model_name = "mobilenetv1-w4a4" model_file = "models/%s_pre_post_tidy.onnx" % model_name -# Set up variables needed for verifying build -ci_folder = "../../ci" -io_folder = ci_folder + "/verification_io" -if os.getenv("VERIFICATION_EN", "0") in {"0", "1"}: - shutil.copy(ci_folder + "/verification_funcs.py", ".") - from verification_funcs import ( - create_logger, - set_verif_steps, - set_verif_io, - verify_build_output, - ) - - create_logger() - verif_steps = set_verif_steps() - verif_input, verif_output = set_verif_io(io_folder, model_name) - if "stitched_ip_rtlsim" in verif_steps: - verif_steps.remove("stitched_ip_rtlsim") +verif_en = os.getenv("VERIFICATION_EN", "0") def custom_step_update_model(model, cfg): @@ -169,11 +153,6 @@ def select_build_steps(platform): board=platform_name, shell_flow_type=shell_flow_type, vitis_platform=vitis_platform, - verify_steps=verif_steps, - verify_input_npy=verif_input, - verify_expected_output_npy=verif_output, - verify_save_full_context=True, - save_intermediate_models=True, # folding config comes with FIFO depths already auto_fifo_depths=False, # enable extra performance optimizations (physopt) @@ -188,12 +167,23 @@ def select_build_steps(platform): specialize_layers_config_file="specialize_layers_config/%s_specialize_layers.json" % platform_name, ) - - build.build_dataflow_cfg(model_file, cfg) - - if os.getenv("VERIFICATION_EN") == "1": - # Verify build using verification output + if verif_en == "1": + # Build the model with verification + import sys + + sys.path.append(os.path.abspath(os.getenv("FINN_EXAMPLES_ROOT") + "/ci/")) + from verification_funcs import init_verif, verify_build_output + + cfg.verify_steps, cfg.verify_input_npy, cfg.verify_expected_output_npy = init_verif( + model_name + ) + if "stitched_ip_rtlsim" in cfg.verify_steps: + cfg.verify_steps.remove("stitched_ip_rtlsim") + build.build_dataflow_cfg(model_file, cfg) verify_build_output(cfg, model_name) + else: + # Build the model without verification + build.build_dataflow_cfg(model_file, cfg) # copy bitfiles and runtime weights into release dir if found bitfile_gen_dir = cfg.output_dir + "/bitfile" @@ -214,5 +204,3 @@ def select_build_steps(platform): weight_files = os.listdir(weight_gen_dir) if weight_files: shutil.copytree(weight_gen_dir, weight_dst_dir) - -os.remove("verification_funcs.py") diff --git a/build/resnet50/build.py b/build/resnet50/build.py index ccde8dc..66a105b 100644 --- a/build/resnet50/build.py +++ b/build/resnet50/build.py @@ -33,12 +33,15 @@ import os import shutil +import onnx +from qonnx.core.modelwrapper import ModelWrapper + # custom steps for resnet50v1.5 from custom_steps import ( step_resnet50_tidy, step_resnet50_streamline, - step_resnet50_convert_to_hw, - step_resnet50_slr_floorplan, + # step_resnet50_convert_to_hw, + # step_resnet50_slr_floorplan, ) model_name = "resnet50_w1a2" @@ -47,23 +50,7 @@ synth_clk_period_ns = 4.0 target_fps = 300 -resnet50_build_steps = [ - step_resnet50_tidy, - step_resnet50_streamline, - step_resnet50_convert_to_hw, - "step_create_dataflow_partition", - "step_specialize_layers", - "step_apply_folding_config", - "step_minimize_bit_width", - "step_generate_estimate_reports", - "step_hw_codegen", - "step_hw_ipgen", - "step_set_fifo_depths", - step_resnet50_slr_floorplan, - "step_synthesize_bitfile", - "step_make_pynq_driver", - "step_deployment_package", -] +verif_en = os.getenv("VERIFICATION_EN", "0") # which platforms to build the networks for zynq_platforms = [] @@ -75,6 +62,37 @@ os.makedirs("release", exist_ok=True) +def custom_step_update_model(model, cfg): + op = onnx.OperatorSetIdProto() + op.version = 11 + load_model = onnx.load(model_file) + update_model = onnx.helper.make_model(load_model.graph, opset_imports=[op]) + model_ref = ModelWrapper(update_model) + # onnx.save(update_model, "models/%s_updated.onnx" % model_name) + + return model_ref + + +resnet50_build_steps = [ + custom_step_update_model, + step_resnet50_tidy, + step_resnet50_streamline, + # step_resnet50_convert_to_hw, + # "step_create_dataflow_partition", + # "step_specialize_layers", + # "step_apply_folding_config", + # "step_minimize_bit_width", + # "step_generate_estimate_reports", + # "step_hw_codegen", + # "step_hw_ipgen", + # "step_set_fifo_depths", + # step_resnet50_slr_floorplan, + # "step_synthesize_bitfile", + # "step_make_pynq_driver", + # "step_deployment_package", +] + + # determine which shell flow to use for a given platform def platform_to_shell(platform): if platform in zynq_platforms: @@ -123,7 +141,21 @@ def platform_to_shell(platform): build_cfg.DataflowOutputType.DEPLOYMENT_PACKAGE, ], ) - build.build_dataflow_cfg(model_file, cfg) + if verif_en == "1": + # Build the model with verification + import sys + + sys.path.append(os.path.abspath(os.getenv("FINN_EXAMPLES_ROOT") + "/ci/")) + from verification_funcs import init_verif, verify_build_output + + cfg.verify_steps, cfg.verify_input_npy, cfg.verify_expected_output_npy = init_verif( + model_name + ) + build.build_dataflow_cfg(model_file, cfg) + verify_build_output(cfg, model_name) + else: + # Build the model without verification + build.build_dataflow_cfg(model_file, cfg) # copy bitfiles and runtime weights into release dir if found bitfile_gen_dir = cfg.output_dir + "/bitfile" diff --git a/build/resnet50/custom_steps.py b/build/resnet50/custom_steps.py index 6679be6..f0f3f93 100644 --- a/build/resnet50/custom_steps.py +++ b/build/resnet50/custom_steps.py @@ -90,9 +90,11 @@ import finn.transformation.fpgadataflow.convert_to_hw_layers as to_hw from qonnx.transformation.lower_convs_to_matmul import LowerConvsToMatMul +from finn.builder.build_dataflow_steps import verify_step from finn.builder.build_dataflow_config import ( DataflowBuildConfig, ShellFlowType, + VerificationStepType, ) from finn.transformation.move_reshape import RemoveCNVtoFCFlatten @@ -111,6 +113,9 @@ def step_resnet50_tidy(model: ModelWrapper, cfg: DataflowBuildConfig): model = model.transform(GiveUniqueNodeNames()) model = model.transform(GiveReadableTensorNames()) model = model.transform(InferDataTypes()) + + if VerificationStepType.TIDY_UP_PYTHON in cfg._resolve_verification_steps(): + verify_step(model, cfg, "initial_python", need_parent=False) return model @@ -169,6 +174,8 @@ def step_resnet50_streamline(model: ModelWrapper, cfg: DataflowBuildConfig): model = model.transform(SortGraph()) model = model.transform(DoubleToSingleFloat()) + if VerificationStepType.STREAMLINED_PYTHON in cfg._resolve_verification_steps(): + verify_step(model, cfg, "streamlined_python", need_parent=False) return model diff --git a/build/vgg10-radioml/build.py b/build/vgg10-radioml/build.py index f8b14bc..7bde15e 100755 --- a/build/vgg10-radioml/build.py +++ b/build/vgg10-radioml/build.py @@ -41,23 +41,7 @@ model_name = "radioml_w4a4_small_tidy" model_file = "models/%s.onnx" % model_name -# Set up variables needed for verifying build -ci_folder = "../../ci" -io_folder = ci_folder + "/verification_io" -if os.getenv("VERIFICATION_EN", "0") in {"0", "1"}: - shutil.copy(ci_folder + "/verification_funcs.py", ".") - from verification_funcs import ( - create_logger, - set_verif_steps, - set_verif_io, - verify_build_output, - ) - - create_logger() - verif_steps = set_verif_steps() - verif_input, verif_output = set_verif_io(io_folder, model_name) - if "folded_hls_cppsim" in verif_steps: - verif_steps.remove("folded_hls_cppsim") +verif_en = os.getenv("VERIFICATION_EN", "0") # which platforms to build the networks for zynq_platforms = ["ZCU104"] @@ -147,11 +131,6 @@ def select_build_steps(platform): folding_config_file="folding_config/%s_folding_config.json" % platform_name, split_large_fifos=True, standalone_thresholds=True, - verify_steps=verif_steps, - verify_input_npy=verif_input, - verify_expected_output_npy=verif_output, - verify_save_full_context=True, - save_intermediate_models=True, # enable extra performance optimizations (physopt) vitis_opt_strategy=build_cfg.VitisOptStrategyCfg.PERFORMANCE_BEST, generate_outputs=[ @@ -162,12 +141,25 @@ def select_build_steps(platform): build_cfg.DataflowOutputType.DEPLOYMENT_PACKAGE, build_cfg.DataflowOutputType.PYNQ_DRIVER, ], + stop_step="step_apply_folding_config", ) - build.build_dataflow_cfg(model_file, cfg) - - if os.getenv("VERIFICATION_EN") == "1": - # Verify build using verification output + if verif_en == "1": + # Build the model with verification + import sys + + sys.path.append(os.path.abspath(os.getenv("FINN_EXAMPLES_ROOT") + "/ci/")) + from verification_funcs import init_verif, verify_build_output + + cfg.verify_steps, cfg.verify_input_npy, cfg.verify_expected_output_npy = init_verif( + model_name + ) + if "folded_hls_cppsim" in cfg.verify_steps: + cfg.verify_steps.remove("folded_hls_cppsim") + build.build_dataflow_cfg(model_file, cfg) verify_build_output(cfg, model_name) + else: + # Build the model without verification + build.build_dataflow_cfg(model_file, cfg) # copy bitfiles and runtime weights into release dir if found bitfile_gen_dir = cfg.output_dir + "/bitfile" diff --git a/ci/verification_funcs.py b/ci/verification_funcs.py index 1d4b0bd..44fe670 100644 --- a/ci/verification_funcs.py +++ b/ci/verification_funcs.py @@ -19,38 +19,43 @@ def create_logger(): def set_verif_steps(): - # Check if verification is enabled or not (using environment variable) - if os.getenv("VERIFICATION_EN") == "1": - print("Verification is enabled") - # Set verification steps - verif_steps = [ - "finn_onnx_python", - "initial_python", - "streamlined_python", - "folded_hls_cppsim", - # "node_by_node_rtlsim", - "stitched_ip_rtlsim", - ] - elif os.getenv("VERIFICATION_EN", "0") == "0": - print("Verification is disabled") - # Don't use any verification steps - verif_steps = [] + # Set verification steps + verif_steps = [ + "finn_onnx_python", + "initial_python", + "streamlined_python", + "folded_hls_cppsim", + "node_by_node_rtlsim", + "stitched_ip_rtlsim", + ] return verif_steps -def set_verif_io(io_folder, model_name): - if os.getenv("VERIFICATION_EN") == "1": - # Set the paths of input/expected output files for verification, - # using the model name +def set_verif_io(model_name): + io_folder = os.getenv("VERIFICATION_IO") + # Set the paths of input/expected output files for verification, + # using the model name + if "tfc" in model_name: + # All mnist and cifar10 models use the same i/o + verif_input = "%s/tfc_mnist_input.npy" % io_folder + verif_output = "%s/tfc_mnist_output.npy" % io_folder + elif "cnv" in model_name: + verif_input = "%s/cnv_cifar10_input.npy" % io_folder + verif_output = "%s/cnv_cifar10_output.npy" % io_folder + else: verif_input = "%s/%s_input.npy" % (io_folder, model_name) verif_output = "%s/%s_output.npy" % (io_folder, model_name) - elif os.getenv("VERIFICATION_EN", "0") == "0": - # Don't use any input/expected output files for verification - verif_input = "" - verif_output = "" return verif_input, verif_output +def init_verif(model_name): + if not logging.getLogger("verif_logger").hasHandlers(): + create_logger() + verif_steps = set_verif_steps() + verif_input, verif_output = set_verif_io(model_name) + return verif_steps, verif_input, verif_output + + def verify_build_output(cfg, model_name): logger = logging.getLogger("verif_logger") verif_output_dir = cfg.output_dir + "/verification_output" @@ -64,14 +69,6 @@ def verify_build_output(cfg, model_name): logger.info("\n*****************************************************") logger.info("Verification Results for %s on %s" % (model_name, cfg.board)) logger.info("*****************************************************") - # Verification step QONNX_TO_FINN_PYTHON uses step name different to build_cfg list, - # so it produces an output .npy/.npz file with different name - # Change the step name to what is used by the verify_step function, - # so the produced output file matches the build_cfg list - if "finn_onnx_python" in cfg.verify_steps: - cfg.verify_steps = [ - step.replace("finn_onnx_python", "qonnx_to_finn_python") for step in cfg.verify_steps - ] # Using output verification files, print whether verification was # success or failure, by iterating through the step names and @@ -93,9 +90,3 @@ def verify_build_output(cfg, model_name): # File for the step was not found, so assume the step was skipped logger.info("Verification for step %-22s: SKIPPED" % step_name) logger.info(" ") - - # Change step name back for next build - if "qonnx_to_finn_python" in cfg.verify_steps: - cfg.verify_steps = [ - step.replace("qonnx_to_finn_python", "finn_onnx_python") for step in cfg.verify_steps - ] From 4d018a0e4a5626a2b3c48466da1a0d8e7a5d8e29 Mon Sep 17 00:00:00 2001 From: Hannah Yan Date: Thu, 25 Jul 2024 09:58:42 +0100 Subject: [PATCH 06/12] Cleaned up build files --- build/bnn-pynq/build.py | 5 ++++- build/gtsrb/build.py | 6 +----- build/kws/build.py | 1 - build/resnet50/build.py | 31 +++++++++++++++---------------- build/vgg10-radioml/build.py | 1 - ci/verification_funcs.py | 4 ++-- 6 files changed, 22 insertions(+), 26 deletions(-) diff --git a/build/bnn-pynq/build.py b/build/bnn-pynq/build.py index 43d3bd4..b6001cf 100644 --- a/build/bnn-pynq/build.py +++ b/build/bnn-pynq/build.py @@ -88,7 +88,10 @@ def platform_to_shell(platform): board=platform_name, shell_flow_type=shell_flow_type, vitis_platform=vitis_platform, - generate_outputs=[build_cfg.DataflowOutputType.BITFILE], + generate_outputs=[ + build_cfg.DataflowOutputType.BITFILE, + build_cfg.DataflowOutputType.STITCHED_IP, + ], save_intermediate_models=True, default_swg_exception=True, specialize_layers_config_file="specialize_layers_config/%s_specialize_layers.json" diff --git a/build/gtsrb/build.py b/build/gtsrb/build.py index 6f5eacb..8a88a8c 100644 --- a/build/gtsrb/build.py +++ b/build/gtsrb/build.py @@ -58,7 +58,6 @@ def custom_step_update_model(model, cfg): load_model = onnx.load(model_file) update_model = onnx.helper.make_model(load_model.graph, opset_imports=[op]) model_ref = ModelWrapper(update_model) - # onnx.save(update_model, "models/%s_updated.onnx" % model_name) return model_ref @@ -127,9 +126,6 @@ def platform_to_shell(platform): # for Zynq, use the board name as the release name # e.g. ZCU104 release_platform_name = platform_name - # for Zynq, use the board name as the release name - # e.g. ZCU104 - # release_platform_name = platform_name platform_dir = "release/%s" % release_platform_name os.makedirs(platform_dir, exist_ok=True) # set up the build configuration for this model @@ -139,7 +135,7 @@ def platform_to_shell(platform): synth_clk_period_ns=10.0, board=platform_name, steps=custom_build_steps, - # folding_config_file="folding_config/cnv_gtsrb_folding_config.json", + folding_config_file="folding_config/gtsrb_folding_config.json", specialize_layers_config_file="specialize_layers_config/gtsrb_specialize_layers.json", shell_flow_type=shell_flow_type, vitis_platform=vitis_platform, diff --git a/build/kws/build.py b/build/kws/build.py index 9bd47d6..d3c120e 100644 --- a/build/kws/build.py +++ b/build/kws/build.py @@ -84,7 +84,6 @@ def step_preprocess(model: ModelWrapper, cfg: DataflowBuildConfig): last_output_dir = "output_%s_%s" % (model_name, release_platform_name) # Configure build cfg = build_cfg.DataflowBuildConfig( - # steps=estimate_steps, generate_outputs=estimate_outputs, steps=build_steps, generate_outputs=build_outputs, output_dir=last_output_dir, diff --git a/build/resnet50/build.py b/build/resnet50/build.py index 66a105b..1697ace 100644 --- a/build/resnet50/build.py +++ b/build/resnet50/build.py @@ -40,8 +40,8 @@ from custom_steps import ( step_resnet50_tidy, step_resnet50_streamline, - # step_resnet50_convert_to_hw, - # step_resnet50_slr_floorplan, + step_resnet50_convert_to_hw, + step_resnet50_slr_floorplan, ) model_name = "resnet50_w1a2" @@ -68,7 +68,6 @@ def custom_step_update_model(model, cfg): load_model = onnx.load(model_file) update_model = onnx.helper.make_model(load_model.graph, opset_imports=[op]) model_ref = ModelWrapper(update_model) - # onnx.save(update_model, "models/%s_updated.onnx" % model_name) return model_ref @@ -77,19 +76,19 @@ def custom_step_update_model(model, cfg): custom_step_update_model, step_resnet50_tidy, step_resnet50_streamline, - # step_resnet50_convert_to_hw, - # "step_create_dataflow_partition", - # "step_specialize_layers", - # "step_apply_folding_config", - # "step_minimize_bit_width", - # "step_generate_estimate_reports", - # "step_hw_codegen", - # "step_hw_ipgen", - # "step_set_fifo_depths", - # step_resnet50_slr_floorplan, - # "step_synthesize_bitfile", - # "step_make_pynq_driver", - # "step_deployment_package", + step_resnet50_convert_to_hw, + "step_create_dataflow_partition", + "step_specialize_layers", + "step_apply_folding_config", + "step_minimize_bit_width", + "step_generate_estimate_reports", + "step_hw_codegen", + "step_hw_ipgen", + "step_set_fifo_depths", + step_resnet50_slr_floorplan, + "step_synthesize_bitfile", + "step_make_pynq_driver", + "step_deployment_package", ] diff --git a/build/vgg10-radioml/build.py b/build/vgg10-radioml/build.py index 7bde15e..4483323 100755 --- a/build/vgg10-radioml/build.py +++ b/build/vgg10-radioml/build.py @@ -141,7 +141,6 @@ def select_build_steps(platform): build_cfg.DataflowOutputType.DEPLOYMENT_PACKAGE, build_cfg.DataflowOutputType.PYNQ_DRIVER, ], - stop_step="step_apply_folding_config", ) if verif_en == "1": # Build the model with verification diff --git a/ci/verification_funcs.py b/ci/verification_funcs.py index 44fe670..a526951 100644 --- a/ci/verification_funcs.py +++ b/ci/verification_funcs.py @@ -35,11 +35,11 @@ def set_verif_io(model_name): io_folder = os.getenv("VERIFICATION_IO") # Set the paths of input/expected output files for verification, # using the model name - if "tfc" in model_name: + if "tfc-w" in model_name: # All mnist and cifar10 models use the same i/o verif_input = "%s/tfc_mnist_input.npy" % io_folder verif_output = "%s/tfc_mnist_output.npy" % io_folder - elif "cnv" in model_name: + elif "cnv-w" in model_name: verif_input = "%s/cnv_cifar10_input.npy" % io_folder verif_output = "%s/cnv_cifar10_output.npy" % io_folder else: From c3023fbd27e2710e9d3c4367d92c75653a04ee30 Mon Sep 17 00:00:00 2001 From: Daniel Penrose Date: Mon, 18 Nov 2024 15:07:54 +0000 Subject: [PATCH 07/12] Removed "update model" step, renamed preprocess, added "Stitched IP" step - Removed "custom_step_update_model" from the GTSRB, MobileNet-v1, ResNet50, and RadioML build scripts. Also removed equivalent code from the KWS build script. - In GTSRB build script, renamed "step_preprocess" to "custom_step_add_postproc", and updated how it gets called in the script's custom_build_steps. - In the MobileNet-v1 build script, "step_create_stitched_ip" was added to the build steps, so that the build script can use the step's stitched IP RTL simulation. Co-Authored-By: auphelia <56755897+auphelia@users.noreply.github.com> --- build/gtsrb/build.py | 19 +++---------------- build/kws/build.py | 6 ------ build/mobilenet-v1/build.py | 13 +------------ build/resnet50/build.py | 11 ----------- build/vgg10-radioml/build.py | 11 ----------- 5 files changed, 4 insertions(+), 56 deletions(-) diff --git a/build/gtsrb/build.py b/build/gtsrb/build.py index 8a88a8c..453fbb1 100644 --- a/build/gtsrb/build.py +++ b/build/gtsrb/build.py @@ -52,16 +52,6 @@ platforms_to_build = zynq_platforms + alveo_platforms -def custom_step_update_model(model, cfg): - op = onnx.OperatorSetIdProto() - op.version = 11 - load_model = onnx.load(model_file) - update_model = onnx.helper.make_model(load_model.graph, opset_imports=[op]) - model_ref = ModelWrapper(update_model) - - return model_ref - - def custom_step_add_preproc(model, cfg): # GTSRB data with raw uint8 pixels is divided by 255 prior to training # reflect this in the inference graph so we can perform inference directly @@ -86,17 +76,14 @@ def custom_step_add_preproc(model, cfg): # Insert TopK node to get predicted Top-1 class -def step_preprocess(model, cfg): +def custom_step_add_postproc(model, cfg): model = model.transform(InsertTopK(k=1)) return model -build_dataflow_step_lookup["step_preprocess_InsertTopK"] = step_preprocess - custom_build_steps = ( - [custom_step_update_model] - + [custom_step_add_preproc] - + ["step_preprocess_InsertTopK"] + [custom_step_add_preproc] + + [custom_step_add_postproc] + default_build_dataflow_steps ) diff --git a/build/kws/build.py b/build/kws/build.py index 1181e61..4ea2f6d 100644 --- a/build/kws/build.py +++ b/build/kws/build.py @@ -66,12 +66,6 @@ def step_preprocess(model: ModelWrapper, cfg: DataflowBuildConfig): build_cfg.DataflowOutputType.DEPLOYMENT_PACKAGE, ] -# Change the ONNX opset from version 9 to 11, which adds support for the TopK node -model = ModelWrapper(model_file) -model.model.opset_import[0].version = 11 -model_file = model_file.replace(".onnx", "_opset-11.onnx") -model.save(model_file) - # create a release dir, used for finn-examples release packaging os.makedirs("release", exist_ok=True) diff --git a/build/mobilenet-v1/build.py b/build/mobilenet-v1/build.py index 5811cac..d50ff07 100644 --- a/build/mobilenet-v1/build.py +++ b/build/mobilenet-v1/build.py @@ -51,16 +51,6 @@ verif_en = os.getenv("VERIFICATION_EN", "0") -def custom_step_update_model(model, cfg): - op = onnx.OperatorSetIdProto() - op.version = 11 - load_model = onnx.load(model_file) - update_model = onnx.helper.make_model(load_model.graph, opset_imports=[op]) - model_ref = ModelWrapper(update_model) - - return model_ref - - # which platforms to build the networks for zynq_platforms = ["ZCU104", "ZCU102"] alveo_platforms = ["U250"] @@ -89,7 +79,6 @@ def select_clk_period(platform): def select_build_steps(platform): if platform in zynq_platforms: return [ - custom_step_update_model, step_mobilenet_streamline, step_mobilenet_lower_convs, step_mobilenet_convert_to_hw_layers_separate_th, @@ -108,7 +97,6 @@ def select_build_steps(platform): ] elif platform in alveo_platforms: return [ - custom_step_update_model, step_mobilenet_streamline, step_mobilenet_lower_convs, step_mobilenet_convert_to_hw_layers, @@ -120,6 +108,7 @@ def select_build_steps(platform): "step_hw_codegen", "step_hw_ipgen", "step_set_fifo_depths", + "step_create_stitched_ip", step_mobilenet_slr_floorplan, "step_synthesize_bitfile", "step_make_pynq_driver", diff --git a/build/resnet50/build.py b/build/resnet50/build.py index 1697ace..7b9e641 100644 --- a/build/resnet50/build.py +++ b/build/resnet50/build.py @@ -62,18 +62,7 @@ os.makedirs("release", exist_ok=True) -def custom_step_update_model(model, cfg): - op = onnx.OperatorSetIdProto() - op.version = 11 - load_model = onnx.load(model_file) - update_model = onnx.helper.make_model(load_model.graph, opset_imports=[op]) - model_ref = ModelWrapper(update_model) - - return model_ref - - resnet50_build_steps = [ - custom_step_update_model, step_resnet50_tidy, step_resnet50_streamline, step_resnet50_convert_to_hw, diff --git a/build/vgg10-radioml/build.py b/build/vgg10-radioml/build.py index 4483323..ba4746b 100755 --- a/build/vgg10-radioml/build.py +++ b/build/vgg10-radioml/build.py @@ -49,16 +49,6 @@ platforms_to_build = zynq_platforms + alveo_platforms -def custom_step_update_model(model, cfg): - op = onnx.OperatorSetIdProto() - op.version = 11 - load_model = onnx.load(model_file) - update_model = onnx.helper.make_model(load_model.graph, opset_imports=[op]) - model_ref = ModelWrapper(update_model) - - return model_ref - - # determine which shell flow to use for a given platform def platform_to_shell(platform): if platform in zynq_platforms: @@ -77,7 +67,6 @@ def select_clk_period(platform): # assemble build flow from custom and pre-existing steps def select_build_steps(platform): return [ - custom_step_update_model, "step_tidy_up", step_pre_streamline, "step_streamline", From 67c1c14859af7c5820887d0434b676d54a8a0884 Mon Sep 17 00:00:00 2001 From: Daniel Penrose Date: Mon, 18 Nov 2024 15:12:50 +0000 Subject: [PATCH 08/12] Updated "SKIPPED" verification message "SKIPPED" implies a verification step was intentionally skipped, rather than the input-output .npy file not being found. The console output now reads "IO FILLE NOT FOUND - SKIPPED" instead. --- ci/verification_funcs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/verification_funcs.py b/ci/verification_funcs.py index a526951..ad0896e 100644 --- a/ci/verification_funcs.py +++ b/ci/verification_funcs.py @@ -88,5 +88,5 @@ def verify_build_output(cfg, model_name): break else: # File for the step was not found, so assume the step was skipped - logger.info("Verification for step %-22s: SKIPPED" % step_name) + logger.info("Verification for step %-22s: IO FILE NOT FOUND - SKIPPED" % step_name) logger.info(" ") From cb3d41e701a08060d304958b895458f1535d89d8 Mon Sep 17 00:00:00 2001 From: Daniel Penrose Date: Mon, 18 Nov 2024 16:25:06 +0000 Subject: [PATCH 09/12] Updated MobileNet expected accuracy Source: https://amdcloud-my.sharepoint.com/:x:/r/personal/mblott_amd_com/_layouts/15/doc2.aspx?sourcedoc=%7BA3D0091C-A4E1-4B6D-9615-B2ADDCEA7C29%7D&file=Release%20v0.0.7.xlsx&action=default&mobileredirect=true&wdOrigin=TEAMS-MAGLEV.p2p_ns.rwc&wdExp=TEAMS-TREATMENT&wdhostclicktime=1731946804836&web=1 --- tests/test_jupyter_notebooks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_jupyter_notebooks.py b/tests/test_jupyter_notebooks.py index 6dbc64e..3058e68 100644 --- a/tests/test_jupyter_notebooks.py +++ b/tests/test_jupyter_notebooks.py @@ -58,7 +58,7 @@ notebook_dir + "/2_imagenet_with_cnns.ipynb", "mobilenetv1_w4a4_imagenet", " ", - " ", + 70.406, ), ( notebook_dir + "/3_binarycop_mask_detection.ipynb", From e3771ff94489f684ade4909dc61fca4261fbd497 Mon Sep 17 00:00:00 2001 From: Daniel Penrose Date: Wed, 27 Nov 2024 09:20:24 +0000 Subject: [PATCH 10/12] Updated model names: MobileNet build.py, RadioML README - in `build/mobilenet-v1/build.py`, the model name it was trying to fetch was outdated, and didn't reflect the most recent model released (opset-11). - In the README of `build/vgg10-radioml`, the path provided to run the build script was incorrect. --- build/mobilenet-v1/build.py | 2 +- build/vgg10-radioml/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/mobilenet-v1/build.py b/build/mobilenet-v1/build.py index d50ff07..bd07571 100644 --- a/build/mobilenet-v1/build.py +++ b/build/mobilenet-v1/build.py @@ -46,7 +46,7 @@ ) model_name = "mobilenetv1-w4a4" -model_file = "models/%s_pre_post_tidy.onnx" % model_name +model_file = "models/%s_pre_post_tidy_opset-11.onnx" % model_name verif_en = os.getenv("VERIFICATION_EN", "0") diff --git a/build/vgg10-radioml/README.md b/build/vgg10-radioml/README.md index 18df19d..36cdf95 100755 --- a/build/vgg10-radioml/README.md +++ b/build/vgg10-radioml/README.md @@ -21,7 +21,7 @@ FINN_EXAMPLES=/path/to/finn-examples # cd into finn submodule cd $FINN_EXAMPLES/build/finn # launch the build on the vgg10 folder -./run-docker.sh build_custom $FINN_EXAMPLES/build/vgg10 +./run-docker.sh build_custom $FINN_EXAMPLES/build/vgg10-radioml ``` 3. The generated outputs will be under `vgg10-radioml/output__`. You can find a description of the generated files [here](https://finn-dev.readthedocs.io/en/latest/command_line.html#simple-dataflow-build-mode). From c2232cc345dec137aa8f2ee61a4265a03f0c73e7 Mon Sep 17 00:00:00 2001 From: Daniel Penrose Date: Wed, 27 Nov 2024 12:00:52 +0000 Subject: [PATCH 11/12] Removed unused imports `ModelWrapper`, `onnx`, and (in gtsrb's case) `build_dataflow_step_lookup` are not called now that the update step has been removed. --- build/gtsrb/build.py | 3 --- build/mobilenet-v1/build.py | 3 --- build/resnet50/build.py | 3 --- build/vgg10-radioml/build.py | 3 --- 4 files changed, 12 deletions(-) diff --git a/build/gtsrb/build.py b/build/gtsrb/build.py index 453fbb1..5f39e7a 100644 --- a/build/gtsrb/build.py +++ b/build/gtsrb/build.py @@ -31,13 +31,10 @@ from finn.util.basic import alveo_default_platform from finn.builder.build_dataflow_config import default_build_dataflow_steps from qonnx.transformation.insert_topk import InsertTopK -from finn.builder.build_dataflow_steps import build_dataflow_step_lookup from qonnx.core.datatype import DataType -from qonnx.core.modelwrapper import ModelWrapper import os import shutil import numpy as np -import onnx from onnx import helper as oh diff --git a/build/mobilenet-v1/build.py b/build/mobilenet-v1/build.py index bd07571..3d909af 100644 --- a/build/mobilenet-v1/build.py +++ b/build/mobilenet-v1/build.py @@ -33,9 +33,6 @@ import os import shutil -import onnx -from qonnx.core.modelwrapper import ModelWrapper - # custom steps for mobilenetv1 from custom_steps import ( step_mobilenet_streamline, diff --git a/build/resnet50/build.py b/build/resnet50/build.py index 7b9e641..5c953e6 100644 --- a/build/resnet50/build.py +++ b/build/resnet50/build.py @@ -33,9 +33,6 @@ import os import shutil -import onnx -from qonnx.core.modelwrapper import ModelWrapper - # custom steps for resnet50v1.5 from custom_steps import ( step_resnet50_tidy, diff --git a/build/vgg10-radioml/build.py b/build/vgg10-radioml/build.py index ba4746b..38d0992 100755 --- a/build/vgg10-radioml/build.py +++ b/build/vgg10-radioml/build.py @@ -32,9 +32,6 @@ import os import shutil -import onnx -from qonnx.core.modelwrapper import ModelWrapper - # custom steps from custom_steps import step_pre_streamline, step_convert_final_layers From 67173d1d8f0ca8c4343c8a0eee463adc967633b3 Mon Sep 17 00:00:00 2001 From: Daniel Penrose Date: Wed, 27 Nov 2024 12:25:33 +0000 Subject: [PATCH 12/12] Resolved linting errors The linting Action in the repo flagged this section of code as failing its lint check. Resolved. --- build/gtsrb/build.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/build/gtsrb/build.py b/build/gtsrb/build.py index 5f39e7a..668c266 100644 --- a/build/gtsrb/build.py +++ b/build/gtsrb/build.py @@ -79,9 +79,7 @@ def custom_step_add_postproc(model, cfg): custom_build_steps = ( - [custom_step_add_preproc] - + [custom_step_add_postproc] - + default_build_dataflow_steps + [custom_step_add_preproc] + [custom_step_add_postproc] + default_build_dataflow_steps )

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 literal 0 HcmV?d00001 diff --git a/build/mobilenet-v1/verification_funcs.py b/build/mobilenet-v1/verification_funcs.py new file mode 100644 index 0000000..b54b060 --- /dev/null +++ b/build/mobilenet-v1/verification_funcs.py @@ -0,0 +1,77 @@ +import finn.builder.build_dataflow_config as build_cfg +import os +import sys +import logging + + +def create_logger(): + # Create a logger to capture output in both console and log file + logger = logging.getLogger("verif_logger") + out_handler = logging.StreamHandler(sys.stdout) + file_handler = logging.FileHandler('all_verification_output.log', mode='w') + out_handler.setLevel(logging.INFO) + file_handler.setLevel(logging.INFO) + out_format = logging.Formatter('%(message)s') + file_format = logging.Formatter('%(message)s') + out_handler.setFormatter(out_format) + file_handler.setFormatter(file_format) + logger.addHandler(out_handler) + logger.addHandler(file_handler) + + +def set_verif_steps(): + # Check if verification is enabled or not (using environment variable) + if (os.getenv("VERIFICATION_EN")) == "1": + print("Verification is enabled") + # Set verification steps + verif_steps = [ + "finn_onnx_python", + "initial_python", + "streamlined_python", + "folded_hls_cppsim", + "stitched_ip_rtlsim", + ] + elif (os.getenv("VERIFICATION_EN", "0")) == "0": + print("Verification is disabled") + # Don't use any verification steps + verif_steps = [] + return verif_steps + + +def verify_build_output(cfg, model_name): + logger = logging.getLogger("verif_logger") + if (os.getenv("VERIFICATION_EN")) == "1": + verif_output_dir = cfg.output_dir + "/verification_output" + if os.path.isdir(verif_output_dir) == False: + logger.info("Verification is enabled, but verification output for %s on %s has not been generated. Please run full build with verification enabled.\n" % (model_name, cfg.board)) + return + logger.info("\n*****************************************************") + logger.info("Verification Results for %s on %s" % (model_name, cfg.board)) + logger.info("*****************************************************") + # Verification step QONNX_TO_FINN_PYTHON uses step name different to build_cfg list, + # so it produces an output .npy/.npz file with different name + # Change the step name to what is used by the verify_step function, + # so the produced output file matches the build_cfg list + if "finn_onnx_python" in cfg.verify_steps: + cfg.verify_steps = [step.replace("finn_onnx_python", "qonnx_to_finn_python") for step in cfg.verify_steps] + + # Using output verification files, print whether verification was + # success or failure, by iterating through the step names and + # the output file names and comparing them + out_files = os.listdir(verif_output_dir) + for step_name in cfg.verify_steps: + for file_name in out_files: + if step_name in file_name: + # Output file will always end in _SUCCESS.npy or _FAIL.npy + # (or .npz if verify_save_full_context is enabled), + # so check if it is SUCCESS or FAIL + if file_name[-8:-4] == "FAIL": + logger.info("Verification for step %-22s: FAIL" % step_name) + elif file_name[-11:-4] == "SUCCESS": + logger.info("Verification for step %-22s: SUCCESS" % step_name) + break + else: + # File for the step was not found, so assume the step was skipped + logger.info("Verification for step %-22s: SKIPPED" % step_name) + logger.info(" ") + diff --git a/build/vgg10-radioml/build.py b/build/vgg10-radioml/build.py index 0567763..b6bbfc1 100755 --- a/build/vgg10-radioml/build.py +++ b/build/vgg10-radioml/build.py @@ -35,13 +35,30 @@ # custom steps from custom_steps import step_pre_streamline, step_convert_final_layers +import sys +import logging +from verification_funcs import create_logger, set_verif_steps, verify_build_output + +import onnx +from qonnx.core.modelwrapper import ModelWrapper + model_name = "radioml_w4a4_small_tidy" +model_file = "models/%s.onnx" % model_name # which platforms to build the networks for zynq_platforms = ["ZCU104"] alveo_platforms = [] platforms_to_build = zynq_platforms + alveo_platforms +def custom_step_update_model(model, cfg): + op = onnx.OperatorSetIdProto() + op.version = 11 + load_model = onnx.load(model_file) + update_model = onnx.helper.make_model(load_model.graph, opset_imports=[op]) + model_ref = ModelWrapper(update_model) + + return model_ref + # determine which shell flow to use for a given platform def platform_to_shell(platform): @@ -61,6 +78,7 @@ def select_clk_period(platform): # assemble build flow from custom and pre-existing steps def select_build_steps(platform): return [ + custom_step_update_model, "step_tidy_up", step_pre_streamline, "step_streamline", @@ -87,6 +105,11 @@ def select_build_steps(platform): # create a release dir, used for finn-examples release packaging os.makedirs("release", exist_ok=True) +# Create logger for capturing output on both console and log +create_logger() +# Set verification steps depending on environment variable VERIFICATION_EN +verification_steps = set_verif_steps() + for platform_name in platforms_to_build: shell_flow_type = platform_to_shell(platform_name) if shell_flow_type == build_cfg.ShellFlowType.VITIS_ALVEO: @@ -112,20 +135,27 @@ def select_build_steps(platform): folding_config_file="folding_config/%s_folding_config.json" % platform_name, split_large_fifos=True, standalone_thresholds=True, + verify_steps=verification_steps, + verify_input_npy="radioml_input.npy", + verify_expected_output_npy="radioml_expected_output.npy", + verify_save_full_context=True, + save_intermediate_models=True, # enable extra performance optimizations (physopt) vitis_opt_strategy=build_cfg.VitisOptStrategyCfg.PERFORMANCE_BEST, generate_outputs=[ build_cfg.DataflowOutputType.ESTIMATE_REPORTS, build_cfg.DataflowOutputType.STITCHED_IP, - # build_cfg.DataflowOutputType.RTLSIM_PERFORMANCE, + build_cfg.DataflowOutputType.RTLSIM_PERFORMANCE, build_cfg.DataflowOutputType.BITFILE, build_cfg.DataflowOutputType.DEPLOYMENT_PACKAGE, build_cfg.DataflowOutputType.PYNQ_DRIVER, ], ) - model_file = "models/%s.onnx" % model_name build.build_dataflow_cfg(model_file, cfg) + # Verify build using verification output + verify_build_output(cfg, model_name) + # copy bitfiles and runtime weights into release dir if found bitfile_gen_dir = cfg.output_dir + "/bitfile" files_to_check_and_copy = [ diff --git a/build/vgg10-radioml/radioml_expected_output.npy b/build/vgg10-radioml/radioml_expected_output.npy new file mode 100644 index 0000000000000000000000000000000000000000..0b7628e8945e58499b2f01c17525e48971f6e956 GIT binary patch literal 132 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+l>qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= bXCxM+0{I$-ItqrGItsN4WCJb+1_ws~#1k9p literal 0 HcmV?d00001 diff --git a/build/vgg10-radioml/radioml_input.npy b/build/vgg10-radioml/radioml_input.npy new file mode 100644 index 0000000000000000000000000000000000000000..aca21bf06e2292ae4a7e1001231eb1917717994c GIT binary patch literal 8320 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 literal 0 HcmV?d00001 diff --git a/build/vgg10-radioml/verification_funcs.py b/build/vgg10-radioml/verification_funcs.py new file mode 100644 index 0000000..1721e01 --- /dev/null +++ b/build/vgg10-radioml/verification_funcs.py @@ -0,0 +1,78 @@ +import finn.builder.build_dataflow_config as build_cfg +import os +import sys +import logging + + +def create_logger(): + # Create a logger to capture output in both console and log file + logger = logging.getLogger("verif_logger") + out_handler = logging.StreamHandler(sys.stdout) + file_handler = logging.FileHandler('all_verification_output.log', mode='w') + out_handler.setLevel(logging.INFO) + file_handler.setLevel(logging.INFO) + out_format = logging.Formatter('%(message)s') + file_format = logging.Formatter('%(message)s') + out_handler.setFormatter(out_format) + file_handler.setFormatter(file_format) + logger.addHandler(out_handler) + logger.addHandler(file_handler) + + +def set_verif_steps(): + # Check if verification is enabled or not (using environment variable) + if (os.getenv("VERIFICATION_EN")) == "1": + print("Verification is enabled") + # Set verification steps + verif_steps = [ + "finn_onnx_python", + "initial_python", + "streamlined_python", + #"folded_hls_cppsim", + "stitched_ip_rtlsim", + ] + elif (os.getenv("VERIFICATION_EN", "0")) == "0": + print("Verification is disabled") + # Don't use any verification steps + verif_steps = [] + return verif_steps + + +def verify_build_output(cfg, model_name): + logger = logging.getLogger("verif_logger") + if (os.getenv("VERIFICATION_EN")) == "1": + verif_output_dir = cfg.output_dir + "/verification_output" + if os.path.isdir(verif_output_dir) == False: + logger.info("Verification is enabled, but verification output for %s on %s has not been generated. Please run full build with verification enabled.\n" % (model_name, cfg.board)) + return + logger.info("\n*****************************************************") + logger.info("Verification Results for %s on %s" % (model_name, cfg.board)) + logger.info("*****************************************************") + # Verification step QONNX_TO_FINN_PYTHON uses step name different to build_cfg list, + # so it produces an output .npy/.npz file with different name + # Change the step name to what is used by the verify_step function, + # so the produced output file matches the build_cfg list + if "finn_onnx_python" in cfg.verify_steps: + cfg.verify_steps = [step.replace("finn_onnx_python", "qonnx_to_finn_python") for step in cfg.verify_steps] + + # Using output verification files, print whether verification was + # success or failure, by iterating through the step names and + # the output file names and comparing them + out_files = os.listdir(verif_output_dir) + for step_name in cfg.verify_steps: + for file_name in out_files: + if step_name in file_name: + # Output file will always end in _SUCCESS.npy or _FAIL.npy + # (or .npz if verify_save_full_context is enabled), + # so check if it is SUCCESS or FAIL + if file_name[-8:-4] == "FAIL": + logger.info("Verification for step %-22s: FAIL" % step_name) + elif file_name[-11:-4] == "SUCCESS": + logger.info("Verification for step %-22s: SUCCESS" % step_name) + break + else: + # File for the step was not found, so assume the step was skipped + logger.info("Verification for step %-22s: SKIPPED" % step_name) + logger.info(" ") + + From cefe817e12c8c79173f27f67ccd7ad502fb35730 Mon Sep 17 00:00:00 2001 From: Hannah Yan Date: Tue, 25 Jun 2024 14:30:01 +0100 Subject: [PATCH 02/12] Moved verification_funcs and input/output files to ci folder --- build/bnn-pynq/build.py | 40 ++++--- build/bnn-pynq/verification_funcs.py | 83 -------------- build/cybersecurity-mlp/build.py | 41 ++++--- build/cybersecurity-mlp/verification_funcs.py | 82 -------------- build/gtsrb/build.py | 58 ++++++---- build/gtsrb/verification_funcs.py | 77 ------------- build/kws/build.py | 41 ++++--- build/kws/verification_funcs.py | 83 -------------- build/mobilenet-v1/build.py | 47 +++++--- build/mobilenet-v1/verification_funcs.py | 77 ------------- build/vgg10-radioml/build.py | 45 +++++--- build/vgg10-radioml/verification_funcs.py | 78 -------------- ci/verification_funcs.py | 101 ++++++++++++++++++ ...ch_features_pre-processing_QONNX_input.npy | Bin ...h_features_pre-processing_QONNX_output.npy | Bin .../verification_io/cnv_1w1a_gtsrb_input.npy | Bin .../verification_io/cnv_1w1a_gtsrb_output.npy | Bin .../verification_io/cnv_cifar10_input.npy | Bin .../verification_io/cnv_cifar10_output.npy | Bin .../mobilenetv1-w4a4_input.npy | Bin .../mobilenetv1-w4a4_output.npy | Bin .../radioml_w4a4_small_tidy_input.npy | Bin .../radioml_w4a4_small_tidy_output.npy | Bin .../verification_io/tfc_mnist_input.npy | Bin .../verification_io/tfc_mnist_output.npy | Bin .../unsw_nb15-mlp-w2a2_input.npy | Bin .../unsw_nb15-mlp-w2a2_output.npy | Bin finn_examples/models.py | 24 ++--- 28 files changed, 283 insertions(+), 594 deletions(-) delete mode 100644 build/bnn-pynq/verification_funcs.py delete mode 100644 build/cybersecurity-mlp/verification_funcs.py delete mode 100644 build/gtsrb/verification_funcs.py delete mode 100644 build/kws/verification_funcs.py delete mode 100644 build/mobilenet-v1/verification_funcs.py delete mode 100644 build/vgg10-radioml/verification_funcs.py create mode 100644 ci/verification_funcs.py rename build/kws/input.npy => ci/verification_io/MLP_W3A3_python_speech_features_pre-processing_QONNX_input.npy (100%) rename build/kws/expected_output.npy => ci/verification_io/MLP_W3A3_python_speech_features_pre-processing_QONNX_output.npy (100%) rename build/gtsrb/gtsrb_input.npy => ci/verification_io/cnv_1w1a_gtsrb_input.npy (100%) rename build/gtsrb/gtsrb_expected_output.npy => ci/verification_io/cnv_1w1a_gtsrb_output.npy (100%) rename build/bnn-pynq/cifar10_input.npy => ci/verification_io/cnv_cifar10_input.npy (100%) rename build/bnn-pynq/cifar10_expected_output.npy => ci/verification_io/cnv_cifar10_output.npy (100%) rename build/mobilenet-v1/mobilenet_input.npy => ci/verification_io/mobilenetv1-w4a4_input.npy (100%) rename build/mobilenet-v1/mobilenet_expected_output.npy => ci/verification_io/mobilenetv1-w4a4_output.npy (100%) rename build/vgg10-radioml/radioml_input.npy => ci/verification_io/radioml_w4a4_small_tidy_input.npy (100%) rename build/vgg10-radioml/radioml_expected_output.npy => ci/verification_io/radioml_w4a4_small_tidy_output.npy (100%) rename build/bnn-pynq/mnist_input.npy => ci/verification_io/tfc_mnist_input.npy (100%) rename build/bnn-pynq/mnist_expected_output.npy => ci/verification_io/tfc_mnist_output.npy (100%) rename build/cybersecurity-mlp/cybersecurity_input.npy => ci/verification_io/unsw_nb15-mlp-w2a2_input.npy (100%) rename build/cybersecurity-mlp/cybersecurity_expected_output.npy => ci/verification_io/unsw_nb15-mlp-w2a2_output.npy (100%) diff --git a/build/bnn-pynq/build.py b/build/bnn-pynq/build.py index 19fd22a..0d0fb31 100644 --- a/build/bnn-pynq/build.py +++ b/build/bnn-pynq/build.py @@ -32,10 +32,20 @@ import os import shutil -import logging -import sys -from verification_funcs import create_logger, set_verif_steps, verify_build_output +# Set up variables needed for verifying build +ci_folder = "../../ci" +io_folder = ci_folder + "/verification_io" +if os.getenv("VERIFICATION_EN", "0") in {"0", "1"}: + shutil.copy(ci_folder + "/verification_funcs.py", ".") + from verification_funcs import ( + create_logger, + set_verif_steps, + set_verif_io, + verify_build_output, + ) + create_logger() + verif_steps = set_verif_steps() # the BNN-PYNQ models -- these all come as exported .onnx models # see models/download_bnn_pynq_models.sh @@ -67,11 +77,6 @@ def platform_to_shell(platform): # create a release dir, used for finn-examples release packaging os.makedirs("release", exist_ok=True) -# Create logger for capturing output on both console and log file -create_logger() -# Set verification steps depending on environment variable VERIFICATION_EN -verification_steps = set_verif_steps() - for platform_name in platforms_to_build: shell_flow_type = platform_to_shell(platform_name) @@ -89,11 +94,9 @@ def platform_to_shell(platform): os.makedirs(platform_dir, exist_ok=True) for model_name in models: if "tfc" in model_name: - input_npy = "mnist_input.npy" - output_npy = "mnist_expected_output.npy" + verif_input, verif_output = set_verif_io(io_folder, "tfc_mnist") elif "cnv" in model_name: - input_npy = "cifar10_input.npy" - output_npy = "cifar10_expected_output.npy" + verif_input, verif_output = set_verif_io(io_folder, "cnv_cifar10") # set up the build configuration for this model cfg = build_cfg.DataflowBuildConfig( output_dir="output_%s_%s" % (model_name, release_platform_name), @@ -102,9 +105,9 @@ def platform_to_shell(platform): board=platform_name, shell_flow_type=shell_flow_type, vitis_platform=vitis_platform, - verify_steps=verification_steps, - verify_input_npy=input_npy, - verify_expected_output_npy=output_npy, + verify_steps=verif_steps, + verify_input_npy=verif_input, + verify_expected_output_npy=verif_output, verify_save_full_context=True, generate_outputs=[build_cfg.DataflowOutputType.BITFILE], save_intermediate_models=True, @@ -114,8 +117,9 @@ def platform_to_shell(platform): # launch FINN compiler to build build.build_dataflow_cfg(model_file, cfg) - # Verify build using verification output - verify_build_output(cfg, model_name) + if os.getenv("VERIFICATION_EN") == "1": + # Verify build using verification output + verify_build_output(cfg, model_name) # copy bitfiles into release dir if found bitfile_gen_dir = cfg.output_dir + "/bitfile" @@ -129,3 +133,5 @@ def platform_to_shell(platform): dst_file = platform_dir + "/" + f.replace("finn-accel", model_name) if os.path.isfile(src_file): shutil.copy(src_file, dst_file) + +os.remove("verification_funcs.py") diff --git a/build/bnn-pynq/verification_funcs.py b/build/bnn-pynq/verification_funcs.py deleted file mode 100644 index 5c5d27c..0000000 --- a/build/bnn-pynq/verification_funcs.py +++ /dev/null @@ -1,83 +0,0 @@ -import finn.builder.build_dataflow_config as build_cfg -import os -import sys -import logging - - -def create_logger(): - # Create a logger to capture output in both console and log file - logger = logging.getLogger("verif_logger") - out_handler = logging.StreamHandler(sys.stdout) - file_handler = logging.FileHandler('all_verification_output.log', mode='w') - out_handler.setLevel(logging.INFO) - file_handler.setLevel(logging.INFO) - out_format = logging.Formatter('%(message)s') - file_format = logging.Formatter('%(message)s') - out_handler.setFormatter(out_format) - file_handler.setFormatter(file_format) - logger.addHandler(out_handler) - logger.addHandler(file_handler) - - -def set_verif_steps(): - # Check if verification is enabled or not (using environment variable) - if (os.getenv("VERIFICATION_EN")) == "1": - print("Verification is enabled") - # Set verification steps - verif_steps = [ - "finn_onnx_python", - "initial_python", - "streamlined_python", - "folded_hls_cppsim", - "stitched_ip_rtlsim", - ] - elif (os.getenv("VERIFICATION_EN", "0")) == "0": - print("Verification is disabled") - # Don't use any verification steps - verif_steps = [] - return verif_steps - - -def verify_build_output(cfg, model_name): - logger = logging.getLogger("verif_logger") - if (os.getenv("VERIFICATION_EN")) == "1": - verif_output_dir = cfg.output_dir + "/verification_output" - if os.path.isdir(verif_output_dir) == False: - logger.info("Verification is enabled, but verification output for %s on %s has not been generated. Please run full build with verification enabled.\n" % (model_name, cfg.board)) - return - logger.info("\n*****************************************************") - logger.info("Verification Results for %-10s on %-10s" % (model_name, cfg.board)) - logger.info("*****************************************************") - # Verification step QONNX_TO_FINN_PYTHON uses step name different to build_cfg list, - # so it produces an output .npy/.npz file with different name - # Change the step name to what is used by the verify_step function, - # so the produced output file matches the build_cfg list - if "finn_onnx_python" in cfg.verify_steps: - cfg.verify_steps = [step.replace("finn_onnx_python", "qonnx_to_finn_python") for step in cfg.verify_steps] - - # Using output verification files, print whether verification was - # success or failure, by iterating through the step names and - # the output file names and comparing them - out_files = os.listdir(verif_output_dir) - for step_name in cfg.verify_steps: - for file_name in out_files: - if step_name in file_name: - # Output file will always end in _SUCCESS.npy or _FAIL.npy - # (or .npz if verify_save_full_context is enabled), - # so check if it is SUCCESS or FAIL - if file_name[-8:-4] == "FAIL": - logger.info("Verification for step %-22s: FAIL" % step_name) - elif file_name[-11:-4] == "SUCCESS": - logger.info("Verification for step %-22s: SUCCESS" % step_name) - break - else: - # File for the step was not found, so assume the step was skipped - logger.info("Verification for step %-22s: SKIPPED" % step_name) - logger.info(" ") - #elif (os.getenv("VERIFICATION_EN", "0")) == "0": - # continue - - # Change step name back for next build - if "qonnx_to_finn_python" in cfg.verify_steps: - cfg.verify_steps = [step.replace("qonnx_to_finn_python", "finn_onnx_python") for step in cfg.verify_steps] - diff --git a/build/cybersecurity-mlp/build.py b/build/cybersecurity-mlp/build.py index 325d56a..3b5a39d 100644 --- a/build/cybersecurity-mlp/build.py +++ b/build/cybersecurity-mlp/build.py @@ -33,7 +33,24 @@ import shutil from custom_steps import custom_step_mlp_export -from verification_funcs import create_logger, set_verif_steps, verify_build_output +# Define model name +model_name = "unsw_nb15-mlp-w2a2" + +# Set up variables needed for verifying build +ci_folder = "../../ci" +io_folder = ci_folder + "/verification_io" +if os.getenv("VERIFICATION_EN", "0") in {"0", "1"}: + shutil.copy(ci_folder + "/verification_funcs.py", ".") + from verification_funcs import ( + create_logger, + set_verif_steps, + set_verif_io, + verify_build_output, + ) + + create_logger() + verif_steps = set_verif_steps() + verif_input, verif_output = set_verif_io(io_folder, model_name) # Which platforms to build the networks for zynq_platforms = ["Pynq-Z1", "Ultra96", "ZCU104"] @@ -53,18 +70,9 @@ def platform_to_shell(platform): raise Exception("Unknown platform, can't determine ShellFlowType") -# Define model name -model_name = "unsw_nb15-mlp-w2a2" - # Create a release dir, used for finn-examples release packaging os.makedirs("release", exist_ok=True) -# Create logger for capturing output on both console and log -create_logger() -# Set verification steps depending on environment variable VERIFICATION_EN -verification_steps = set_verif_steps() - - for platform_name in platforms_to_build: shell_flow_type = platform_to_shell(platform_name) if shell_flow_type == build_cfg.ShellFlowType.VITIS_ALVEO: @@ -88,9 +96,9 @@ def platform_to_shell(platform): board=platform_name, shell_flow_type=shell_flow_type, vitis_platform=vitis_platform, - verify_steps=verification_steps, - verify_input_npy="cybersecurity_input.npy", - verify_expected_output_npy="cybersecurity_expected_output.npy", + verify_steps=verif_steps, + verify_input_npy=verif_input, + verify_expected_output_npy=verif_output, verify_save_full_context=True, vitis_opt_strategy=build_cfg.VitisOptStrategyCfg.PERFORMANCE_BEST, generate_outputs=[ @@ -108,8 +116,9 @@ def platform_to_shell(platform): # Launch FINN compiler to generate bitfile build.build_dataflow_cfg(model, cfg) - # Verify build using verification output - verify_build_output(cfg, model_name) + if os.getenv("VERIFICATION_EN") == "1": + # Verify build using verification output + verify_build_output(cfg, model_name) # Copy bitfiles into release dir if found bitfile_gen_dir = cfg.output_dir + "/bitfile" @@ -119,3 +128,5 @@ def platform_to_shell(platform): dst_file = platform_dir + "/" + f.replace("finn-accel", model_name) if os.path.isfile(src_file): shutil.copy(src_file, dst_file) + +os.remove("verification_funcs.py") diff --git a/build/cybersecurity-mlp/verification_funcs.py b/build/cybersecurity-mlp/verification_funcs.py deleted file mode 100644 index 537993a..0000000 --- a/build/cybersecurity-mlp/verification_funcs.py +++ /dev/null @@ -1,82 +0,0 @@ -#import finn.builder.build_dataflow as build -import finn.builder.build_dataflow_config as build_cfg -import os -#import shutil -import sys -import logging - -#from finn.builder.build_dataflow_config import DataflowBuildConfig -#from finn.builder.build_dataflow_steps import build_dataflow_step_lookup - - -def create_logger(): - # Create a logger to capture output in both console and log file - logger = logging.getLogger("verif_logger") - out_handler = logging.StreamHandler(sys.stdout) - file_handler = logging.FileHandler('all_verification_output.log', mode='w') - out_handler.setLevel(logging.INFO) - file_handler.setLevel(logging.INFO) - out_format = logging.Formatter('%(message)s') - file_format = logging.Formatter('%(message)s') - out_handler.setFormatter(out_format) - file_handler.setFormatter(file_format) - logger.addHandler(out_handler) - logger.addHandler(file_handler) - - -def set_verif_steps(): - # Check if verification is enabled or not (using environment variable) - if (os.getenv("VERIFICATION_EN")) == "1": - print("Verification is enabled") - # Set verification steps - verif_steps = [ - "finn_onnx_python", - "initial_python", - "streamlined_python", - "folded_hls_cppsim", - "stitched_ip_rtlsim", - ] - elif (os.getenv("VERIFICATION_EN", "0")) == "0": - print("Verification is disabled") - # Don't use any verification steps - verif_steps = [] - return verif_steps - - -def verify_build_output(cfg, model_name): - logger = logging.getLogger("verif_logger") - if (os.getenv("VERIFICATION_EN")) == "1": - verif_output_dir = cfg.output_dir + "/verification_output" - if os.path.isdir(verif_output_dir) == False: - logger.info("Verification is enabled, but verification output for %s on %s has not been generated. Please run full build with verification enabled.\n" % (model_name, cfg.board)) - return - logger.info("\n*****************************************************") - logger.info("Verification Results for %s on %s" % (model_name, cfg.board)) - logger.info("*****************************************************") - # Verification step QONNX_TO_FINN_PYTHON uses step name different to build_cfg list, - # so it produces an output .npy/.npz file with different name - # Change the step name to what is used by the verify_step function, - # so the produced output file matches the build_cfg list - if "finn_onnx_python" in cfg.verify_steps: - cfg.verify_steps = [step.replace("finn_onnx_python", "qonnx_to_finn_python") for step in cfg.verify_steps] - - # Using output verification files, print whether verification was - # success or failure, by iterating through the step names and - # the output file names and comparing them - out_files = os.listdir(verif_output_dir) - for step_name in cfg.verify_steps: - for file_name in out_files: - if step_name in file_name: - # Output file will always end in _SUCCESS.npy or _FAIL.npy - # (or .npz if verify_save_full_context is enabled), - # so check if it is SUCCESS or FAIL - if file_name[-8:-4] == "FAIL": - logger.info("Verification for step %-22s: FAIL" % step_name) - elif file_name[-11:-4] == "SUCCESS": - logger.info("Verification for step %-22s: SUCCESS" % step_name) - break - else: - # File for the step was not found, so assume the step was skipped - logger.info("Verification for step %-22s: SKIPPED" % step_name) - logger.info(" ") - diff --git a/build/gtsrb/build.py b/build/gtsrb/build.py index 793b07d..02343b9 100644 --- a/build/gtsrb/build.py +++ b/build/gtsrb/build.py @@ -40,17 +40,30 @@ import onnx from onnx import helper as oh -import logging -import sys -from verification_funcs import create_logger, set_verif_steps, verify_build_output - model_name = "cnv_1w1a_gtsrb" +model_file = "models/%s.onnx" % model_name + +# Set up variables needed for verifying build +ci_folder = "../../ci" +io_folder = ci_folder + "/verification_io" +if os.getenv("VERIFICATION_EN", "0") in {"0", "1"}: + shutil.copy(ci_folder + "/verification_funcs.py", ".") + from verification_funcs import ( + create_logger, + set_verif_steps, + set_verif_io, + verify_build_output, + ) + + create_logger() + verif_steps = set_verif_steps() + verif_input, verif_output = set_verif_io(io_folder, model_name) # which platforms to build the networks for zynq_platforms = ["Pynq-Z1"] -platforms_to_build = zynq_platforms +alveo_platforms = [] +platforms_to_build = zynq_platforms + alveo_platforms -model_file = "models/%s.onnx" % model_name def custom_step_update_model(model, cfg): op = onnx.OperatorSetIdProto() @@ -58,7 +71,7 @@ def custom_step_update_model(model, cfg): load_model = onnx.load(model_file) update_model = onnx.helper.make_model(load_model.graph, opset_imports=[op]) model_ref = ModelWrapper(update_model) - #onnx.save(update_model, "models/%s_updated.onnx" % model_name) + # onnx.save(update_model, "models/%s_updated.onnx" % model_name) return model_ref @@ -86,14 +99,20 @@ def custom_step_add_preproc(model, cfg): return model -# Inject the preprocessing step into FINN to enable json serialization later on +# Insert TopK node to get predicted Top-1 class def step_preprocess(model, cfg): model = model.transform(InsertTopK(k=1)) return model + build_dataflow_step_lookup["step_preprocess_InsertTopK"] = step_preprocess -custom_build_steps = [custom_step_update_model] + [custom_step_add_preproc] + ["step_preprocess_InsertTopK"] + default_build_dataflow_steps +custom_build_steps = ( + [custom_step_update_model] + + [custom_step_add_preproc] + + ["step_preprocess_InsertTopK"] + + default_build_dataflow_steps +) # determine which shell flow to use for a given platform @@ -109,11 +128,6 @@ def platform_to_shell(platform): # create a release dir, used for finn-examples release packaging os.makedirs("release", exist_ok=True) -# Create logger for capturing output on both console and log -create_logger() -# Set verification steps depending on environment variable VERIFICATION_EN -verification_steps = set_verif_steps() - for platform_name in platforms_to_build: shell_flow_type = platform_to_shell(platform_name) if shell_flow_type == build_cfg.ShellFlowType.VITIS_ALVEO: @@ -128,7 +142,7 @@ def platform_to_shell(platform): release_platform_name = platform_name # for Zynq, use the board name as the release name # e.g. ZCU104 - #release_platform_name = platform_name + # release_platform_name = platform_name platform_dir = "release/%s" % release_platform_name os.makedirs(platform_dir, exist_ok=True) # set up the build configuration for this model @@ -141,9 +155,9 @@ def platform_to_shell(platform): folding_config_file="folding_config/cnv_gtsrb_folding_config.json", shell_flow_type=shell_flow_type, vitis_platform=vitis_platform, - verify_steps=verification_steps, - verify_input_npy="gtsrb_input.npy", - verify_expected_output_npy="gtsrb_expected_output.npy", + verify_steps=verif_steps, + verify_input_npy=verif_input, + verify_expected_output_npy=verif_output, verify_save_full_context=True, generate_outputs=[ build_cfg.DataflowOutputType.ESTIMATE_REPORTS, @@ -158,9 +172,9 @@ def platform_to_shell(platform): # launch FINN compiler to build build.build_dataflow_cfg(model_file, cfg) - # Verify build using verification output - verify_build_output(cfg, model_name) - + if os.getenv("VERIFICATION_EN") == "1": + # Verify build using verification output + verify_build_output(cfg, model_name) # copy bitfiles into release dir if found bitfile_gen_dir = cfg.output_dir + "/bitfile" @@ -175,4 +189,4 @@ def platform_to_shell(platform): if os.path.isfile(src_file): shutil.copy(src_file, dst_file) - +os.remove("verification_funcs.py") diff --git a/build/gtsrb/verification_funcs.py b/build/gtsrb/verification_funcs.py deleted file mode 100644 index b54b060..0000000 --- a/build/gtsrb/verification_funcs.py +++ /dev/null @@ -1,77 +0,0 @@ -import finn.builder.build_dataflow_config as build_cfg -import os -import sys -import logging - - -def create_logger(): - # Create a logger to capture output in both console and log file - logger = logging.getLogger("verif_logger") - out_handler = logging.StreamHandler(sys.stdout) - file_handler = logging.FileHandler('all_verification_output.log', mode='w') - out_handler.setLevel(logging.INFO) - file_handler.setLevel(logging.INFO) - out_format = logging.Formatter('%(message)s') - file_format = logging.Formatter('%(message)s') - out_handler.setFormatter(out_format) - file_handler.setFormatter(file_format) - logger.addHandler(out_handler) - logger.addHandler(file_handler) - - -def set_verif_steps(): - # Check if verification is enabled or not (using environment variable) - if (os.getenv("VERIFICATION_EN")) == "1": - print("Verification is enabled") - # Set verification steps - verif_steps = [ - "finn_onnx_python", - "initial_python", - "streamlined_python", - "folded_hls_cppsim", - "stitched_ip_rtlsim", - ] - elif (os.getenv("VERIFICATION_EN", "0")) == "0": - print("Verification is disabled") - # Don't use any verification steps - verif_steps = [] - return verif_steps - - -def verify_build_output(cfg, model_name): - logger = logging.getLogger("verif_logger") - if (os.getenv("VERIFICATION_EN")) == "1": - verif_output_dir = cfg.output_dir + "/verification_output" - if os.path.isdir(verif_output_dir) == False: - logger.info("Verification is enabled, but verification output for %s on %s has not been generated. Please run full build with verification enabled.\n" % (model_name, cfg.board)) - return - logger.info("\n*****************************************************") - logger.info("Verification Results for %s on %s" % (model_name, cfg.board)) - logger.info("*****************************************************") - # Verification step QONNX_TO_FINN_PYTHON uses step name different to build_cfg list, - # so it produces an output .npy/.npz file with different name - # Change the step name to what is used by the verify_step function, - # so the produced output file matches the build_cfg list - if "finn_onnx_python" in cfg.verify_steps: - cfg.verify_steps = [step.replace("finn_onnx_python", "qonnx_to_finn_python") for step in cfg.verify_steps] - - # Using output verification files, print whether verification was - # success or failure, by iterating through the step names and - # the output file names and comparing them - out_files = os.listdir(verif_output_dir) - for step_name in cfg.verify_steps: - for file_name in out_files: - if step_name in file_name: - # Output file will always end in _SUCCESS.npy or _FAIL.npy - # (or .npz if verify_save_full_context is enabled), - # so check if it is SUCCESS or FAIL - if file_name[-8:-4] == "FAIL": - logger.info("Verification for step %-22s: FAIL" % step_name) - elif file_name[-11:-4] == "SUCCESS": - logger.info("Verification for step %-22s: SUCCESS" % step_name) - break - else: - # File for the step was not found, so assume the step was skipped - logger.info("Verification for step %-22s: SKIPPED" % step_name) - logger.info(" ") - diff --git a/build/kws/build.py b/build/kws/build.py index 28beb11..eda196c 100644 --- a/build/kws/build.py +++ b/build/kws/build.py @@ -41,9 +41,25 @@ import os import shutil -import logging -import sys -from verification_funcs import create_logger, set_verif_steps, verify_build_output +model_name = "MLP_W3A3_python_speech_features_pre-processing_QONNX" +model_file = "models/" + model_name + ".onnx" + +# Set up variables needed for verifying build +ci_folder = "../../ci" +io_folder = ci_folder + "/verification_io" +if os.getenv("VERIFICATION_EN", "0") in {"0", "1"}: + shutil.copy(ci_folder + "/verification_funcs.py", ".") + from verification_funcs import ( + create_logger, + set_verif_steps, + set_verif_io, + verify_build_output, + ) + + create_logger() + verif_steps = set_verif_steps() + verif_input, verif_output = set_verif_io(io_folder, model_name) + # Inject the preprocessing step into FINN to enable json serialization later on def step_preprocess(model: ModelWrapper, cfg: DataflowBuildConfig): @@ -64,14 +80,6 @@ def step_preprocess(model: ModelWrapper, cfg: DataflowBuildConfig): build_cfg.DataflowOutputType.DEPLOYMENT_PACKAGE, ] -# Create logger for capturing output on both console and log -create_logger() -# Set verification steps depending on environment veriable VERIFICATION_EN -verification_steps = set_verif_steps() - -model_name = "MLP_W3A3_python_speech_features_pre-processing_QONNX" -model_file = "models/" + model_name + ".onnx" - # Change the ONNX opset from version 9 to 11, which adds support for the TopK node model = ModelWrapper(model_file) model.model.opset_import[0].version = 11 @@ -91,7 +99,10 @@ def step_preprocess(model: ModelWrapper, cfg: DataflowBuildConfig): # Configure build cfg = build_cfg.DataflowBuildConfig( # steps=estimate_steps, generate_outputs=estimate_outputs, - verify_steps=verification_steps, + verify_steps=verif_steps, + verify_input_npy=verif_input, + verify_expected_output_npy=verif_output, + verify_save_full_context=True, steps=build_steps, generate_outputs=build_outputs, output_dir=last_output_dir, @@ -106,8 +117,9 @@ def step_preprocess(model: ModelWrapper, cfg: DataflowBuildConfig): # Build the model build.build_dataflow_cfg(model_file, cfg) - # Verify build using verification output - verify_build_output(cfg, model_name) + if os.getenv("VERIFICATION_EN") == "1": + # Verify build using verification output + verify_build_output(cfg, model_name) # copy bitfiles and runtime weights into release dir if found bitfile_gen_dir = cfg.output_dir + "/bitfile" @@ -122,6 +134,7 @@ def step_preprocess(model: ModelWrapper, cfg: DataflowBuildConfig): if os.path.isfile(src_file): shutil.copy(src_file, dst_file) +os.remove("verification_funcs.py") # Export quantized inputs print("Quantizing validation dataset.") diff --git a/build/kws/verification_funcs.py b/build/kws/verification_funcs.py deleted file mode 100644 index 5c5d27c..0000000 --- a/build/kws/verification_funcs.py +++ /dev/null @@ -1,83 +0,0 @@ -import finn.builder.build_dataflow_config as build_cfg -import os -import sys -import logging - - -def create_logger(): - # Create a logger to capture output in both console and log file - logger = logging.getLogger("verif_logger") - out_handler = logging.StreamHandler(sys.stdout) - file_handler = logging.FileHandler('all_verification_output.log', mode='w') - out_handler.setLevel(logging.INFO) - file_handler.setLevel(logging.INFO) - out_format = logging.Formatter('%(message)s') - file_format = logging.Formatter('%(message)s') - out_handler.setFormatter(out_format) - file_handler.setFormatter(file_format) - logger.addHandler(out_handler) - logger.addHandler(file_handler) - - -def set_verif_steps(): - # Check if verification is enabled or not (using environment variable) - if (os.getenv("VERIFICATION_EN")) == "1": - print("Verification is enabled") - # Set verification steps - verif_steps = [ - "finn_onnx_python", - "initial_python", - "streamlined_python", - "folded_hls_cppsim", - "stitched_ip_rtlsim", - ] - elif (os.getenv("VERIFICATION_EN", "0")) == "0": - print("Verification is disabled") - # Don't use any verification steps - verif_steps = [] - return verif_steps - - -def verify_build_output(cfg, model_name): - logger = logging.getLogger("verif_logger") - if (os.getenv("VERIFICATION_EN")) == "1": - verif_output_dir = cfg.output_dir + "/verification_output" - if os.path.isdir(verif_output_dir) == False: - logger.info("Verification is enabled, but verification output for %s on %s has not been generated. Please run full build with verification enabled.\n" % (model_name, cfg.board)) - return - logger.info("\n*****************************************************") - logger.info("Verification Results for %-10s on %-10s" % (model_name, cfg.board)) - logger.info("*****************************************************") - # Verification step QONNX_TO_FINN_PYTHON uses step name different to build_cfg list, - # so it produces an output .npy/.npz file with different name - # Change the step name to what is used by the verify_step function, - # so the produced output file matches the build_cfg list - if "finn_onnx_python" in cfg.verify_steps: - cfg.verify_steps = [step.replace("finn_onnx_python", "qonnx_to_finn_python") for step in cfg.verify_steps] - - # Using output verification files, print whether verification was - # success or failure, by iterating through the step names and - # the output file names and comparing them - out_files = os.listdir(verif_output_dir) - for step_name in cfg.verify_steps: - for file_name in out_files: - if step_name in file_name: - # Output file will always end in _SUCCESS.npy or _FAIL.npy - # (or .npz if verify_save_full_context is enabled), - # so check if it is SUCCESS or FAIL - if file_name[-8:-4] == "FAIL": - logger.info("Verification for step %-22s: FAIL" % step_name) - elif file_name[-11:-4] == "SUCCESS": - logger.info("Verification for step %-22s: SUCCESS" % step_name) - break - else: - # File for the step was not found, so assume the step was skipped - logger.info("Verification for step %-22s: SKIPPED" % step_name) - logger.info(" ") - #elif (os.getenv("VERIFICATION_EN", "0")) == "0": - # continue - - # Change step name back for next build - if "qonnx_to_finn_python" in cfg.verify_steps: - cfg.verify_steps = [step.replace("qonnx_to_finn_python", "finn_onnx_python") for step in cfg.verify_steps] - diff --git a/build/mobilenet-v1/build.py b/build/mobilenet-v1/build.py index 3d5daab..2355954 100644 --- a/build/mobilenet-v1/build.py +++ b/build/mobilenet-v1/build.py @@ -33,6 +33,9 @@ import os import shutil +import onnx +from qonnx.core.modelwrapper import ModelWrapper + # custom steps for mobilenetv1 from custom_steps import ( step_mobilenet_streamline, @@ -42,16 +45,28 @@ step_mobilenet_slr_floorplan, ) -import logging -import sys -from verification_funcs import create_logger, set_verif_steps, verify_build_output - -import onnx -from qonnx.core.modelwrapper import ModelWrapper - model_name = "mobilenetv1-w4a4" model_file = "models/%s_pre_post_tidy.onnx" % model_name +# Set up variables needed for verifying build +ci_folder = "../../ci" +io_folder = ci_folder + "/verification_io" +if os.getenv("VERIFICATION_EN", "0") in {"0", "1"}: + shutil.copy(ci_folder + "/verification_funcs.py", ".") + from verification_funcs import ( + create_logger, + set_verif_steps, + set_verif_io, + verify_build_output, + ) + + create_logger() + verif_steps = set_verif_steps() + verif_input, verif_output = set_verif_io(io_folder, model_name) + if "stitched_ip_rtlsim" in verif_steps: + verif_steps.remove("stitched_ip_rtlsim") + + def custom_step_update_model(model, cfg): op = onnx.OperatorSetIdProto() op.version = 11 @@ -131,11 +146,6 @@ def select_build_steps(platform): # create a release dir, used for finn-examples release packaging os.makedirs("release", exist_ok=True) -# Create logger for capturing output on both console and log -create_logger() -# Set verification steps depending on environment variable VERIFICATION_EN -verification_steps = set_verif_steps() - for platform_name in platforms_to_build: shell_flow_type = platform_to_shell(platform_name) if shell_flow_type == build_cfg.ShellFlowType.VITIS_ALVEO: @@ -159,9 +169,9 @@ def select_build_steps(platform): board=platform_name, shell_flow_type=shell_flow_type, vitis_platform=vitis_platform, - verify_steps=verification_steps, - verify_input_npy="mobilenet_input.npy", - verify_expected_output_npy="mobilenet_expected_output.npy", + verify_steps=verif_steps, + verify_input_npy=verif_input, + verify_expected_output_npy=verif_output, verify_save_full_context=True, save_intermediate_models=True, # folding config comes with FIFO depths already @@ -179,8 +189,9 @@ def select_build_steps(platform): build.build_dataflow_cfg(model_file, cfg) - # Verify build using verification output - verify_build_output(cfg, model_name) + if os.getenv("VERIFICATION_EN") == "1": + # Verify build using verification output + verify_build_output(cfg, model_name) # copy bitfiles and runtime weights into release dir if found bitfile_gen_dir = cfg.output_dir + "/bitfile" @@ -201,3 +212,5 @@ def select_build_steps(platform): weight_files = os.listdir(weight_gen_dir) if weight_files: shutil.copytree(weight_gen_dir, weight_dst_dir) + +os.remove("verification_funcs.py") diff --git a/build/mobilenet-v1/verification_funcs.py b/build/mobilenet-v1/verification_funcs.py deleted file mode 100644 index b54b060..0000000 --- a/build/mobilenet-v1/verification_funcs.py +++ /dev/null @@ -1,77 +0,0 @@ -import finn.builder.build_dataflow_config as build_cfg -import os -import sys -import logging - - -def create_logger(): - # Create a logger to capture output in both console and log file - logger = logging.getLogger("verif_logger") - out_handler = logging.StreamHandler(sys.stdout) - file_handler = logging.FileHandler('all_verification_output.log', mode='w') - out_handler.setLevel(logging.INFO) - file_handler.setLevel(logging.INFO) - out_format = logging.Formatter('%(message)s') - file_format = logging.Formatter('%(message)s') - out_handler.setFormatter(out_format) - file_handler.setFormatter(file_format) - logger.addHandler(out_handler) - logger.addHandler(file_handler) - - -def set_verif_steps(): - # Check if verification is enabled or not (using environment variable) - if (os.getenv("VERIFICATION_EN")) == "1": - print("Verification is enabled") - # Set verification steps - verif_steps = [ - "finn_onnx_python", - "initial_python", - "streamlined_python", - "folded_hls_cppsim", - "stitched_ip_rtlsim", - ] - elif (os.getenv("VERIFICATION_EN", "0")) == "0": - print("Verification is disabled") - # Don't use any verification steps - verif_steps = [] - return verif_steps - - -def verify_build_output(cfg, model_name): - logger = logging.getLogger("verif_logger") - if (os.getenv("VERIFICATION_EN")) == "1": - verif_output_dir = cfg.output_dir + "/verification_output" - if os.path.isdir(verif_output_dir) == False: - logger.info("Verification is enabled, but verification output for %s on %s has not been generated. Please run full build with verification enabled.\n" % (model_name, cfg.board)) - return - logger.info("\n*****************************************************") - logger.info("Verification Results for %s on %s" % (model_name, cfg.board)) - logger.info("*****************************************************") - # Verification step QONNX_TO_FINN_PYTHON uses step name different to build_cfg list, - # so it produces an output .npy/.npz file with different name - # Change the step name to what is used by the verify_step function, - # so the produced output file matches the build_cfg list - if "finn_onnx_python" in cfg.verify_steps: - cfg.verify_steps = [step.replace("finn_onnx_python", "qonnx_to_finn_python") for step in cfg.verify_steps] - - # Using output verification files, print whether verification was - # success or failure, by iterating through the step names and - # the output file names and comparing them - out_files = os.listdir(verif_output_dir) - for step_name in cfg.verify_steps: - for file_name in out_files: - if step_name in file_name: - # Output file will always end in _SUCCESS.npy or _FAIL.npy - # (or .npz if verify_save_full_context is enabled), - # so check if it is SUCCESS or FAIL - if file_name[-8:-4] == "FAIL": - logger.info("Verification for step %-22s: FAIL" % step_name) - elif file_name[-11:-4] == "SUCCESS": - logger.info("Verification for step %-22s: SUCCESS" % step_name) - break - else: - # File for the step was not found, so assume the step was skipped - logger.info("Verification for step %-22s: SKIPPED" % step_name) - logger.info(" ") - diff --git a/build/vgg10-radioml/build.py b/build/vgg10-radioml/build.py index b6bbfc1..d47a3c7 100755 --- a/build/vgg10-radioml/build.py +++ b/build/vgg10-radioml/build.py @@ -32,24 +32,39 @@ import os import shutil -# custom steps -from custom_steps import step_pre_streamline, step_convert_final_layers - -import sys -import logging -from verification_funcs import create_logger, set_verif_steps, verify_build_output - import onnx from qonnx.core.modelwrapper import ModelWrapper +# custom steps +from custom_steps import step_pre_streamline, step_convert_final_layers + model_name = "radioml_w4a4_small_tidy" model_file = "models/%s.onnx" % model_name +# Set up variables needed for verifying build +ci_folder = "../../ci" +io_folder = ci_folder + "/verification_io" +if os.getenv("VERIFICATION_EN", "0") in {"0", "1"}: + shutil.copy(ci_folder + "/verification_funcs.py", ".") + from verification_funcs import ( + create_logger, + set_verif_steps, + set_verif_io, + verify_build_output, + ) + + create_logger() + verif_steps = set_verif_steps() + verif_input, verif_output = set_verif_io(io_folder, model_name) + if "folded_hls_cppsim" in verif_steps: + verif_steps.remove("folded_hls_cppsim") + # which platforms to build the networks for zynq_platforms = ["ZCU104"] alveo_platforms = [] platforms_to_build = zynq_platforms + alveo_platforms + def custom_step_update_model(model, cfg): op = onnx.OperatorSetIdProto() op.version = 11 @@ -105,11 +120,6 @@ def select_build_steps(platform): # create a release dir, used for finn-examples release packaging os.makedirs("release", exist_ok=True) -# Create logger for capturing output on both console and log -create_logger() -# Set verification steps depending on environment variable VERIFICATION_EN -verification_steps = set_verif_steps() - for platform_name in platforms_to_build: shell_flow_type = platform_to_shell(platform_name) if shell_flow_type == build_cfg.ShellFlowType.VITIS_ALVEO: @@ -135,9 +145,9 @@ def select_build_steps(platform): folding_config_file="folding_config/%s_folding_config.json" % platform_name, split_large_fifos=True, standalone_thresholds=True, - verify_steps=verification_steps, - verify_input_npy="radioml_input.npy", - verify_expected_output_npy="radioml_expected_output.npy", + verify_steps=verif_steps, + verify_input_npy=verif_input, + verify_expected_output_npy=verif_output, verify_save_full_context=True, save_intermediate_models=True, # enable extra performance optimizations (physopt) @@ -153,8 +163,9 @@ def select_build_steps(platform): ) build.build_dataflow_cfg(model_file, cfg) - # Verify build using verification output - verify_build_output(cfg, model_name) + if os.getenv("VERIFICATION_EN") == "1": + # Verify build using verification output + verify_build_output(cfg, model_name) # copy bitfiles and runtime weights into release dir if found bitfile_gen_dir = cfg.output_dir + "/bitfile" diff --git a/build/vgg10-radioml/verification_funcs.py b/build/vgg10-radioml/verification_funcs.py deleted file mode 100644 index 1721e01..0000000 --- a/build/vgg10-radioml/verification_funcs.py +++ /dev/null @@ -1,78 +0,0 @@ -import finn.builder.build_dataflow_config as build_cfg -import os -import sys -import logging - - -def create_logger(): - # Create a logger to capture output in both console and log file - logger = logging.getLogger("verif_logger") - out_handler = logging.StreamHandler(sys.stdout) - file_handler = logging.FileHandler('all_verification_output.log', mode='w') - out_handler.setLevel(logging.INFO) - file_handler.setLevel(logging.INFO) - out_format = logging.Formatter('%(message)s') - file_format = logging.Formatter('%(message)s') - out_handler.setFormatter(out_format) - file_handler.setFormatter(file_format) - logger.addHandler(out_handler) - logger.addHandler(file_handler) - - -def set_verif_steps(): - # Check if verification is enabled or not (using environment variable) - if (os.getenv("VERIFICATION_EN")) == "1": - print("Verification is enabled") - # Set verification steps - verif_steps = [ - "finn_onnx_python", - "initial_python", - "streamlined_python", - #"folded_hls_cppsim", - "stitched_ip_rtlsim", - ] - elif (os.getenv("VERIFICATION_EN", "0")) == "0": - print("Verification is disabled") - # Don't use any verification steps - verif_steps = [] - return verif_steps - - -def verify_build_output(cfg, model_name): - logger = logging.getLogger("verif_logger") - if (os.getenv("VERIFICATION_EN")) == "1": - verif_output_dir = cfg.output_dir + "/verification_output" - if os.path.isdir(verif_output_dir) == False: - logger.info("Verification is enabled, but verification output for %s on %s has not been generated. Please run full build with verification enabled.\n" % (model_name, cfg.board)) - return - logger.info("\n*****************************************************") - logger.info("Verification Results for %s on %s" % (model_name, cfg.board)) - logger.info("*****************************************************") - # Verification step QONNX_TO_FINN_PYTHON uses step name different to build_cfg list, - # so it produces an output .npy/.npz file with different name - # Change the step name to what is used by the verify_step function, - # so the produced output file matches the build_cfg list - if "finn_onnx_python" in cfg.verify_steps: - cfg.verify_steps = [step.replace("finn_onnx_python", "qonnx_to_finn_python") for step in cfg.verify_steps] - - # Using output verification files, print whether verification was - # success or failure, by iterating through the step names and - # the output file names and comparing them - out_files = os.listdir(verif_output_dir) - for step_name in cfg.verify_steps: - for file_name in out_files: - if step_name in file_name: - # Output file will always end in _SUCCESS.npy or _FAIL.npy - # (or .npz if verify_save_full_context is enabled), - # so check if it is SUCCESS or FAIL - if file_name[-8:-4] == "FAIL": - logger.info("Verification for step %-22s: FAIL" % step_name) - elif file_name[-11:-4] == "SUCCESS": - logger.info("Verification for step %-22s: SUCCESS" % step_name) - break - else: - # File for the step was not found, so assume the step was skipped - logger.info("Verification for step %-22s: SKIPPED" % step_name) - logger.info(" ") - - diff --git a/ci/verification_funcs.py b/ci/verification_funcs.py new file mode 100644 index 0000000..1d4b0bd --- /dev/null +++ b/ci/verification_funcs.py @@ -0,0 +1,101 @@ +import logging +import os +import sys + + +def create_logger(): + # Create a logger to capture output in both console and log file + logger = logging.getLogger("verif_logger") + out_handler = logging.StreamHandler(sys.stdout) + file_handler = logging.FileHandler("all_verification_output.log", mode="w") + out_handler.setLevel(logging.INFO) + file_handler.setLevel(logging.INFO) + out_format = logging.Formatter("%(message)s") + file_format = logging.Formatter("%(message)s") + out_handler.setFormatter(out_format) + file_handler.setFormatter(file_format) + logger.addHandler(out_handler) + logger.addHandler(file_handler) + + +def set_verif_steps(): + # Check if verification is enabled or not (using environment variable) + if os.getenv("VERIFICATION_EN") == "1": + print("Verification is enabled") + # Set verification steps + verif_steps = [ + "finn_onnx_python", + "initial_python", + "streamlined_python", + "folded_hls_cppsim", + # "node_by_node_rtlsim", + "stitched_ip_rtlsim", + ] + elif os.getenv("VERIFICATION_EN", "0") == "0": + print("Verification is disabled") + # Don't use any verification steps + verif_steps = [] + return verif_steps + + +def set_verif_io(io_folder, model_name): + if os.getenv("VERIFICATION_EN") == "1": + # Set the paths of input/expected output files for verification, + # using the model name + verif_input = "%s/%s_input.npy" % (io_folder, model_name) + verif_output = "%s/%s_output.npy" % (io_folder, model_name) + elif os.getenv("VERIFICATION_EN", "0") == "0": + # Don't use any input/expected output files for verification + verif_input = "" + verif_output = "" + return verif_input, verif_output + + +def verify_build_output(cfg, model_name): + logger = logging.getLogger("verif_logger") + verif_output_dir = cfg.output_dir + "/verification_output" + if os.path.isdir(verif_output_dir) is False: + logger.info( + "Verification is enabled, " + "but verification output for %s on %s has not been generated. " + "Please run full build with verification enabled.\n" % (model_name, cfg.board) + ) + return + logger.info("\n*****************************************************") + logger.info("Verification Results for %s on %s" % (model_name, cfg.board)) + logger.info("*****************************************************") + # Verification step QONNX_TO_FINN_PYTHON uses step name different to build_cfg list, + # so it produces an output .npy/.npz file with different name + # Change the step name to what is used by the verify_step function, + # so the produced output file matches the build_cfg list + if "finn_onnx_python" in cfg.verify_steps: + cfg.verify_steps = [ + step.replace("finn_onnx_python", "qonnx_to_finn_python") for step in cfg.verify_steps + ] + + # Using output verification files, print whether verification was + # success or failure, by iterating through the step names and + # the output file names and comparing them + out_files = os.listdir(verif_output_dir) + for step_name in cfg.verify_steps: + for file_name in out_files: + if step_name in file_name: + # Output file will always end in _SUCCESS.npy or _FAIL.npy + # (or .npz if verify_save_full_context is enabled), + # so check the last few characters of the filename + # to see if it is SUCCESS or FAIL + if file_name[-8:-4] == "FAIL": + logger.info("Verification for step %-22s: FAIL" % step_name) + elif file_name[-11:-4] == "SUCCESS": + logger.info("Verification for step %-22s: SUCCESS" % step_name) + break + else: + # File for the step was not found, so assume the step was skipped + logger.info("Verification for step %-22s: SKIPPED" % step_name) + logger.info(" ") + + # Change step name back for next build + if "qonnx_to_finn_python" in cfg.verify_steps: + cfg.verify_steps = [ + step.replace("qonnx_to_finn_python", "finn_onnx_python") for step in cfg.verify_steps + ] diff --git a/build/kws/input.npy b/ci/verification_io/MLP_W3A3_python_speech_features_pre-processing_QONNX_input.npy similarity index 100% rename from build/kws/input.npy rename to ci/verification_io/MLP_W3A3_python_speech_features_pre-processing_QONNX_input.npy diff --git a/build/kws/expected_output.npy b/ci/verification_io/MLP_W3A3_python_speech_features_pre-processing_QONNX_output.npy similarity index 100% rename from build/kws/expected_output.npy rename to ci/verification_io/MLP_W3A3_python_speech_features_pre-processing_QONNX_output.npy diff --git a/build/gtsrb/gtsrb_input.npy b/ci/verification_io/cnv_1w1a_gtsrb_input.npy similarity index 100% rename from build/gtsrb/gtsrb_input.npy rename to ci/verification_io/cnv_1w1a_gtsrb_input.npy diff --git a/build/gtsrb/gtsrb_expected_output.npy b/ci/verification_io/cnv_1w1a_gtsrb_output.npy similarity index 100% rename from build/gtsrb/gtsrb_expected_output.npy rename to ci/verification_io/cnv_1w1a_gtsrb_output.npy diff --git a/build/bnn-pynq/cifar10_input.npy b/ci/verification_io/cnv_cifar10_input.npy similarity index 100% rename from build/bnn-pynq/cifar10_input.npy rename to ci/verification_io/cnv_cifar10_input.npy diff --git a/build/bnn-pynq/cifar10_expected_output.npy b/ci/verification_io/cnv_cifar10_output.npy similarity index 100% rename from build/bnn-pynq/cifar10_expected_output.npy rename to ci/verification_io/cnv_cifar10_output.npy diff --git a/build/mobilenet-v1/mobilenet_input.npy b/ci/verification_io/mobilenetv1-w4a4_input.npy similarity index 100% rename from build/mobilenet-v1/mobilenet_input.npy rename to ci/verification_io/mobilenetv1-w4a4_input.npy diff --git a/build/mobilenet-v1/mobilenet_expected_output.npy b/ci/verification_io/mobilenetv1-w4a4_output.npy similarity index 100% rename from build/mobilenet-v1/mobilenet_expected_output.npy rename to ci/verification_io/mobilenetv1-w4a4_output.npy diff --git a/build/vgg10-radioml/radioml_input.npy b/ci/verification_io/radioml_w4a4_small_tidy_input.npy similarity index 100% rename from build/vgg10-radioml/radioml_input.npy rename to ci/verification_io/radioml_w4a4_small_tidy_input.npy diff --git a/build/vgg10-radioml/radioml_expected_output.npy b/ci/verification_io/radioml_w4a4_small_tidy_output.npy similarity index 100% rename from build/vgg10-radioml/radioml_expected_output.npy rename to ci/verification_io/radioml_w4a4_small_tidy_output.npy diff --git a/build/bnn-pynq/mnist_input.npy b/ci/verification_io/tfc_mnist_input.npy similarity index 100% rename from build/bnn-pynq/mnist_input.npy rename to ci/verification_io/tfc_mnist_input.npy diff --git a/build/bnn-pynq/mnist_expected_output.npy b/ci/verification_io/tfc_mnist_output.npy similarity index 100% rename from build/bnn-pynq/mnist_expected_output.npy rename to ci/verification_io/tfc_mnist_output.npy diff --git a/build/cybersecurity-mlp/cybersecurity_input.npy b/ci/verification_io/unsw_nb15-mlp-w2a2_input.npy similarity index 100% rename from build/cybersecurity-mlp/cybersecurity_input.npy rename to ci/verification_io/unsw_nb15-mlp-w2a2_input.npy diff --git a/build/cybersecurity-mlp/cybersecurity_expected_output.npy b/ci/verification_io/unsw_nb15-mlp-w2a2_output.npy similarity index 100% rename from build/cybersecurity-mlp/cybersecurity_expected_output.npy rename to ci/verification_io/unsw_nb15-mlp-w2a2_output.npy diff --git a/finn_examples/models.py b/finn_examples/models.py index 6ef861e..9ef3f89 100644 --- a/finn_examples/models.py +++ b/finn_examples/models.py @@ -68,19 +68,19 @@ } _gtsrb_cnv_io_shape_dict = { - "idt" : [DataType['UINT8']], - "odt" : [DataType['INT16']], - "ishape_normal" : [(1, 32, 32, 3)], - "oshape_normal" : [(1, 44)], - "ishape_folded" : [(1, 32, 32, 3, 1)], - "oshape_folded" : [(1, 11, 4)], - "ishape_packed" : [(1, 32, 32, 3, 1)], - "oshape_packed" : [(1, 11, 8)], - "input_dma_name" : ['idma0'], - "output_dma_name" : ['odma0'], + "idt": [DataType["UINT8"]], + "odt": [DataType["INT16"]], + "ishape_normal": [(1, 32, 32, 3)], + "oshape_normal": [(1, 44)], + "ishape_folded": [(1, 32, 32, 3, 1)], + "oshape_folded": [(1, 11, 4)], + "ishape_packed": [(1, 32, 32, 3, 1)], + "oshape_packed": [(1, 11, 8)], + "input_dma_name": ["idma0"], + "output_dma_name": ["odma0"], "number_of_external_weights": 0, - "num_inputs" : 1, - "num_outputs" : 1, + "num_inputs": 1, + "num_outputs": 1, } _bincop_cnv_io_shape_dict = { From e408fdd84ef2dd531fb750323fbbb4cb3786dc06 Mon Sep 17 00:00:00 2001 From: Hannah Yan Date: Tue, 9 Jul 2024 10:33:24 +0100 Subject: [PATCH 03/12] Updated notebook testing --- tests/test_jupyter_notebooks.py | 251 ++++++++++++++++++++++++++++---- 1 file changed, 222 insertions(+), 29 deletions(-) diff --git a/tests/test_jupyter_notebooks.py b/tests/test_jupyter_notebooks.py index e0e86c0..6dbc64e 100644 --- a/tests/test_jupyter_notebooks.py +++ b/tests/test_jupyter_notebooks.py @@ -1,98 +1,291 @@ import pytest +import json import nbformat +import os +import re from nbconvert.preprocessors import ExecutePreprocessor notebook_timeout_seconds = 3600 notebook_dir = "./finn_examples/notebooks/" + +# Needed for iterating through each mnist and cifar10 model +# within their respective notebooks, formatted as: +# models = [ +# (model_name, expected_accuracy), +# ... +# ] +mnist_models = [ + ("tfc_w1a1_mnist", 92.96), + ("tfc_w1a2_mnist", 94.74), + ("tfc_w2a2_mnist", 96.6), +] + +cifar10_models = [ + ("cnv_w1a1_cifar10", 84.19), + ("cnv_w1a2_cifar10", 87.76), + ("cnv_w2a2_cifar10", 88.63), +] + +# List of all notebooks to be tested, formatted as: +# all_notebooks = [ +# ( +# notebook_name, +# model_name, +# expected_returned_label, +# expected_accuracy, +# ) +# ... +# ] + +all_notebooks = [ + ( + # model name and accuracy will be assigned using mnist_models during test + notebook_dir + "/0_mnist_with_fc_networks.ipynb", + " ", + "Returned class is 7", + " ", + ), + ( + # model name and accuracy will be assigned using cifar10_models during test + notebook_dir + "/1_cifar10_with_cnv_networks.ipynb", + " ", + "Returned class is 3", + " ", + ), + ( + notebook_dir + "/2_imagenet_with_cnns.ipynb", + "mobilenetv1_w4a4_imagenet", + " ", + " ", + ), + ( + notebook_dir + "/3_binarycop_mask_detection.ipynb", + "bincop_cnv", + " ", + " ", + ), + ( + notebook_dir + "/4_keyword_spotting.ipynb", + "kws_mlp", + "The audio file was classified as: yes", + 88.7646, + ), + ( + notebook_dir + "/5_radioml_with_cnns.ipynb", + "vgg_w4a4_radioml", + "Top-1 class predicted by the accelerator: 16QAM", + 87.886, + ), + ( + notebook_dir + "/6_cybersecurity_with_mlp.ipynb", + "mlp_w2a2_unsw_nb15", + "Returned label is: 0 (normal data)", + 91.90, + ), + ( + notebook_dir + "/7_traffic_sign_recognition_gtsrb.ipynb", + "cnv_w1a1_gtsrb", + "Accelerator result is:\nProhibited for vehicles with a " + "permitted gross weight over 3.5t including their trailers, " + "and for tractors except passenger cars and buses", + 94.9485, + ), +] + +# List of notebooks for each platform pynq_notebooks = [ + # 0_mnist_with_fc_networks.ipynb pytest.param( - notebook_dir + "0_mnist_with_fc_networks.ipynb", + all_notebooks[0][0], + all_notebooks[0][1], + all_notebooks[0][2], + all_notebooks[0][3], marks=pytest.mark.pynq_notebooks, ), + # 1_cifar10_with_cnv_networks.ipynb pytest.param( - notebook_dir + "1_cifar10_with_cnv_networks.ipynb", + all_notebooks[1][0], + all_notebooks[1][1], + all_notebooks[1][2], + all_notebooks[1][3], marks=pytest.mark.pynq_notebooks, ), + # 3_binarycop_mask_detection.ipynb pytest.param( - notebook_dir + "3_binarycop_mask_detection.ipynb", + all_notebooks[3][0], + all_notebooks[3][1], + all_notebooks[3][2], + all_notebooks[3][3], marks=[pytest.mark.pynq_notebooks, pytest.mark.xfail], ), + # 4_keyword_spotting.ipynb + pytest.param( + all_notebooks[4][0], + all_notebooks[4][1], + all_notebooks[4][2], + all_notebooks[4][3], + marks=pytest.mark.pynq_notebooks, + ), + # 6_cybersecurity_with_mlp.ipynb pytest.param( - notebook_dir + "4_keyword_spotting.ipynb", + all_notebooks[6][0], + all_notebooks[6][1], + all_notebooks[6][2], + all_notebooks[6][3], marks=pytest.mark.pynq_notebooks, ), + # 7_traffic_sign_recognition_gtsrb.ipynb pytest.param( - notebook_dir + "6_cybersecurity_with_mlp.ipynb", + all_notebooks[7][0], + all_notebooks[7][1], + all_notebooks[7][2], + all_notebooks[7][3], marks=pytest.mark.pynq_notebooks, ), ] zcu_notebooks = [ + # 0_mnist_with_fc_networks.ipynb pytest.param( - notebook_dir + "0_mnist_with_fc_networks.ipynb", + all_notebooks[0][0], + all_notebooks[0][1], + all_notebooks[0][2], + all_notebooks[0][3], marks=pytest.mark.zcu_notebooks, ), + # 1_cifar10_with_cnv_networks.ipynb pytest.param( - notebook_dir + "1_cifar10_with_cnv_networks.ipynb", + all_notebooks[1][0], + all_notebooks[1][1], + all_notebooks[1][2], + all_notebooks[1][3], marks=pytest.mark.zcu_notebooks, ), + # 5_radioml_with_cnns.ipynb pytest.param( - notebook_dir + "5_radioml_with_cnns.ipynb", + all_notebooks[5][0], + all_notebooks[5][1], + all_notebooks[5][2], + all_notebooks[5][3], marks=pytest.mark.zcu_notebooks, ), + # 6_cybersecurity_with_mlp.ipynb pytest.param( - notebook_dir + "6_cybersecurity_with_mlp.ipynb", + all_notebooks[6][0], + all_notebooks[6][1], + all_notebooks[6][2], + all_notebooks[6][3], marks=pytest.mark.zcu_notebooks, ), ] ultra96_notebooks = [ + # 0_mnist_with_fc_networks.ipynb pytest.param( - notebook_dir + "0_mnist_with_fc_networks.ipynb", + all_notebooks[0][0], + all_notebooks[0][1], + all_notebooks[0][2], + all_notebooks[0][3], marks=pytest.mark.ultra96_notebooks, ), + # 1_cifar10_with_cnv_networks.ipynb pytest.param( - notebook_dir + "1_cifar10_with_cnv_networks.ipynb", + all_notebooks[1][0], + all_notebooks[1][1], + all_notebooks[1][2], + all_notebooks[1][3], marks=pytest.mark.ultra96_notebooks, ), + # 6_cybersecurity_with_mlp.ipynb pytest.param( - notebook_dir + "6_cybersecurity_with_mlp.ipynb", + all_notebooks[6][0], + all_notebooks[6][1], + all_notebooks[6][2], + all_notebooks[6][3], marks=pytest.mark.ultra96_notebooks, ), ] alveo_notebooks = [ + # 0_mnist_with_fc_networks.ipynb pytest.param( - notebook_dir + "0_mnist_with_fc_networks.ipynb", + all_notebooks[0][0], + all_notebooks[0][1], + all_notebooks[0][2], + all_notebooks[0][3], marks=pytest.mark.alveo_notebooks, ), + # 1_cifar10_with_cnv_networks.ipynb pytest.param( - notebook_dir + "1_cifar10_with_cnv_networks.ipynb", + all_notebooks[1][0], + all_notebooks[1][1], + all_notebooks[1][2], + all_notebooks[1][3], marks=pytest.mark.alveo_notebooks, ), + # 2_imagenet_with_cnns.ipynb pytest.param( - notebook_dir + "2_imagenet_with_cnns.ipynb", - marks=pytest.mark.alveo_notebooks, + all_notebooks[2][0], + all_notebooks[2][1], + all_notebooks[2][2], + all_notebooks[2][3], + marks=[pytest.mark.alveo_notebooks, pytest.mark.xfail], ), ] -@pytest.mark.parametrize( - "notebook", pynq_notebooks + zcu_notebooks + ultra96_notebooks + alveo_notebooks -) -def test_notebook_exec(notebook): +def get_notebook_exec_result(notebook, model_name, exp_label, exp_acc): + # Read and execute the notebook with open(notebook) as f: nb = nbformat.read(f, as_version=4) - ep = ExecutePreprocessor(timeout=notebook_timeout_seconds, kernel_name="python3") + ep = ExecutePreprocessor(timeout=notebook_timeout_seconds, kernel_name="python3") + ep.preprocess(nb) - # debug only for now... - notebook_dump = notebook.replace(".ipynb", ".dump") - with open(notebook_dump, "w") as f: - f.write(str(ep.preprocess(nb))) + # Read in the executed notebook as a json + exec_notebook = notebook.replace(".ipynb", "_exec.ipynb") + with open(exec_notebook, "w", encoding="utf-8") as f: + nbformat.write(nb, f) + with open(exec_notebook) as f: + test_json_exec = json.load(f) + + # For checking if the correct class was predicted + res = False + + # Get outputs of notebook json + for cell in test_json_exec["cells"]: + if "outputs" in cell: + for output in cell["outputs"]: + if "text" in output: + out_text = "".join(output["text"]) + if exp_label in out_text: + # Expected class was predicted + res = True + if "accuracy" in out_text.casefold(): + # Parse the accuracy value and check if it is as expected + nb_acc = float(re.findall("\\d+\\.\\d+", out_text)[-1]) + assert nb_acc >= exp_acc, f"Accuracy test for {model_name} FAILED" + + assert res is True, f"Classification test for {model_name} FAILED" + + +@pytest.mark.parametrize( + "notebook,model_name,exp_label,exp_acc", + pynq_notebooks + zcu_notebooks + ultra96_notebooks + alveo_notebooks, +) +def test_notebook_exec(notebook, model_name, exp_label, exp_acc): + if "mnist" in notebook: + for mnist_model_name, mnist_exp_acc in mnist_models: + os.system("sed -i '27s/.*/\"accel = models.%s()\"/' %s" % (mnist_model_name, notebook)) + get_notebook_exec_result(notebook, mnist_model_name, exp_label, mnist_exp_acc) + elif "cifar10" in notebook: + for cifar10_model_name, cifar10_exp_acc in cifar10_models: + os.system( + "sed -i '26s/.*/\"accel = models.%s()\"/' %s" % (cifar10_model_name, notebook) + ) + get_notebook_exec_result(notebook, cifar10_model_name, exp_label, cifar10_exp_acc) + else: + get_notebook_exec_result(notebook, model_name, exp_label, exp_acc) - try: - assert ep.preprocess(nb) is not None, f"Got empty notebook for {notebook}" - except Exception: - assert False, f"Failed executing {notebook}" + os.system("rm -rf %s/*_exec*" % notebook_dir) From 7efaf212b0eb13deb5cce070256078eb6c595ee0 Mon Sep 17 00:00:00 2001 From: Hannah Yan Date: Fri, 12 Jul 2024 10:34:19 +0100 Subject: [PATCH 04/12] Removed input and expected output npy files --- ...ech_features_pre-processing_QONNX_input.npy | Bin 2088 -> 0 bytes ...ch_features_pre-processing_QONNX_output.npy | Bin 136 -> 0 bytes ci/verification_io/cnv_1w1a_gtsrb_input.npy | Bin 12416 -> 0 bytes ci/verification_io/cnv_1w1a_gtsrb_output.npy | Bin 136 -> 0 bytes ci/verification_io/cnv_cifar10_input.npy | Bin 12416 -> 0 bytes ci/verification_io/cnv_cifar10_output.npy | Bin 136 -> 0 bytes ci/verification_io/mobilenetv1-w4a4_input.npy | Bin 602240 -> 0 bytes ci/verification_io/mobilenetv1-w4a4_output.npy | Bin 148 -> 0 bytes .../radioml_w4a4_small_tidy_input.npy | Bin 8320 -> 0 bytes .../radioml_w4a4_small_tidy_output.npy | Bin 132 -> 0 bytes ci/verification_io/tfc_mnist_input.npy | Bin 3264 -> 0 bytes ci/verification_io/tfc_mnist_output.npy | Bin 136 -> 0 bytes .../unsw_nb15-mlp-w2a2_input.npy | Bin 2528 -> 0 bytes .../unsw_nb15-mlp-w2a2_output.npy | Bin 136 -> 0 bytes 14 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 ci/verification_io/MLP_W3A3_python_speech_features_pre-processing_QONNX_input.npy delete mode 100644 ci/verification_io/MLP_W3A3_python_speech_features_pre-processing_QONNX_output.npy delete mode 100644 ci/verification_io/cnv_1w1a_gtsrb_input.npy delete mode 100644 ci/verification_io/cnv_1w1a_gtsrb_output.npy delete mode 100644 ci/verification_io/cnv_cifar10_input.npy delete mode 100644 ci/verification_io/cnv_cifar10_output.npy delete mode 100644 ci/verification_io/mobilenetv1-w4a4_input.npy delete mode 100644 ci/verification_io/mobilenetv1-w4a4_output.npy delete mode 100644 ci/verification_io/radioml_w4a4_small_tidy_input.npy delete mode 100644 ci/verification_io/radioml_w4a4_small_tidy_output.npy delete mode 100644 ci/verification_io/tfc_mnist_input.npy delete mode 100644 ci/verification_io/tfc_mnist_output.npy delete mode 100644 ci/verification_io/unsw_nb15-mlp-w2a2_input.npy delete mode 100644 ci/verification_io/unsw_nb15-mlp-w2a2_output.npy diff --git a/ci/verification_io/MLP_W3A3_python_speech_features_pre-processing_QONNX_input.npy b/ci/verification_io/MLP_W3A3_python_speech_features_pre-processing_QONNX_input.npy deleted file mode 100644 index d25736222759ec8da885e3793d0d11054c4a2049..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2088 zcmb7F`!|(&A3bpla!J%tBXY{?I71B~iF3Z+r<7tyS4xv{ry(4n3ok>85@iY{x1{9O zW!$o+=kqyFBe!ZK^A@?K(9JZ3bQ!&``4ir~_Ah&{z1Ci9|FVB}-Rk1DeFiU@cTnW# zAL%O-tuz$b2Uv;B3`GH9vb{3zJzillKmULHEwU*8X*)8=JKTR-npl__{zG#!Ln~Xc znPHsa|Bsn7-d*HQ9oAqDji=Jnr~PTBhc-Q)u7yUX_V_kL84lOXz?GWmY~RTe?(`~s z#-J#M8g1A{#d>1+x0W4FRZAsK;>b3=`JTDBA(7lmVOQP zmwVxsh8JmY-$WEAJ3-B(l6!Tcj{c&ZNVD0yWY)~gn>!z7vjW>%n8=oaTJ2(Nb(x6| zysNk^p&WHe@ukM`?Zm|CB^%>rhjTL9AT{r-l<#p$YF?NmZ7rzcG{$(0!ut~17uZb7 zReAJ*UNhnKrGctvGVF?&kTkfbL(5mCoVtM$)3q{^R;LdVov$uS6+&D{SydY--t$B6 zjzM(v6CTM?TEbXsOxT!LE2}<;>(fzzB4p=I(d6uT^{@w~MD(Dq$ z`@D{RPEe++hL4km`_EWGv_zU8t4$2Ow86~h1ThHD;6jErbH3$`r14{lu;G2j*BHVG7&U(RmZiki*}BX~G*A7^jZhffx|3=F|K$ zG2GO9U|Pgtrq14xWTfig(!@M0f6n3ye{I}291aIWZPHfND9&~SnP$*tbcJ%VZ|EoZ ze9IkwMp!VJ3@%5K7+^x8pUNhsIN)Y{j0lZ{^F086#d6%3AjhlL<`?>UL!| zN=hG-?y2vo-EC8pX%TdtQs$J+U75|HDP-G>QF2GefmnYrg&n&csCirvo&1!EH%8ph zH%P$A_60KKzFB0^WG>sd-kyFOa3pc^_4J5!B|Z1d0nf!;MdQ&$oVU{t%pKQ{_;fuG3mSG&-_%RJMlrLd%unFf79M8O$Cy?b+0;1_zO0V~}5O24y;VGj{ zJ5LS4xTq2Zqbs!EwK6&28AO}z9)S=~id_~>M5|^2_De4M`)lgVJND9WkPDAHBj{(5ayjHTjs7dKB6>rI8fgHzXlp84ByB z;8j5|@vuqc0_LVL#?Hai%)%UfN2;Ye2b#d|FCl(Wc?&`4Oz>kW?aU41GFNyqrEwK# z^MT+jO%>YMJRjRXoP?|;%c$@E3*h(1Bs;%+2dBQdjB2Im$}5Zc^wj z8dxr)lk+=R@uFb}IUT{NUAaZ?y7Zx$z?=Sg=qSzXYR9Lg8}Y-MWXYJ1K7^m>2EI!Y z=N_uTIPP1I+sApdGB<}HW@KgTJQ#aut7=+6j`V=!F}deJho`dHkB)8T<|Axc$ohsd1V;-_*wb4;h8! AUjP6A diff --git a/ci/verification_io/MLP_W3A3_python_speech_features_pre-processing_QONNX_output.npy b/ci/verification_io/MLP_W3A3_python_speech_features_pre-processing_QONNX_output.npy deleted file mode 100644 index 0058afee01414e4a4c55b803e2cde6e6e722c00c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 136 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlWC!@qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= ZXCxM+0{I$-I+{8PwF(pfE@lP@001yk8)5(e diff --git a/ci/verification_io/cnv_1w1a_gtsrb_input.npy b/ci/verification_io/cnv_1w1a_gtsrb_input.npy deleted file mode 100644 index 9a97d183d531645c49e09cf5b718ef31031e62ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12416 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 a?&sGzo$47^%b1V7#_BfLJ8SsS&;A>Q5v|hz diff --git a/ci/verification_io/cnv_1w1a_gtsrb_output.npy b/ci/verification_io/cnv_1w1a_gtsrb_output.npy deleted file mode 100644 index 0e412cc6a02c66ab40877505477eba3103820060..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 136 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlWC!@qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= ZXCxM+0{I$-I+{8PwF(pfE&&Dz001z%8*cyr diff --git a/ci/verification_io/cnv_cifar10_input.npy b/ci/verification_io/cnv_cifar10_input.npy deleted file mode 100644 index 4b97d0298dc5dcd129828db1002523c0e5016cdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12416 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 diff --git a/ci/verification_io/cnv_cifar10_output.npy b/ci/verification_io/cnv_cifar10_output.npy deleted file mode 100644 index f5b61aff333ebbde5b814829d1fe351eb83e54a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 136 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlWC!@qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= bXCxM+0{I$-ItqrGItsN4WCJc{1_%HEG&dV_ diff --git a/ci/verification_io/mobilenetv1-w4a4_input.npy b/ci/verification_io/mobilenetv1-w4a4_input.npy deleted file mode 100644 index 61cc17c25be54df19c2592299469acac46b5ab4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 602240 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⁡#i}-|nlF#o-c?OF&DTBHsb78WX%4O8;IEl; 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