From 1b2194cdceab686a28323b207f19fa25a17bc2df Mon Sep 17 00:00:00 2001 From: Megvii Engine Team Date: Sat, 5 Sep 2020 06:55:00 +0800 Subject: [PATCH] feat(whl/internal): put imperative rt to megbrain GitOrigin-RevId: f3b6e492d751ccef48fa4bf02be90dd1506faeb2 --- CMakeLists.txt | 42 +- .../core/tensor/multipledispatch/utils.py | 25 +- imperative/python/setup.py | 7 +- imperative/python/test/run.sh | 21 + python_module/.gitignore | 8 - python_module/CMakeLists.txt | 113 -- python_module/megengine/__init__.py | 11 - python_module/megengine/_internal/__init__.py | 729 ---------- .../_internal/_timed_func_fork_exec_entry.py | 37 - .../megengine/_internal/comp_graph_tools.py | 274 ---- python_module/megengine/_internal/config.py | 439 ------ .../megengine/_internal/craniotome.py | 432 ------ python_module/megengine/_internal/dtype.py | 286 ---- python_module/megengine/_internal/enum36.py | 947 ------------- python_module/megengine/_internal/exc.py | 58 - .../megengine/_internal/global_init.py | 41 - python_module/megengine/_internal/helper.py | 316 ----- python_module/megengine/_internal/logconf.py | 54 - .../megengine/_internal/mgb_helper.py | 87 -- .../megengine/_internal/opr_extra.py | 3 - .../megengine/_internal/persistent_cache.py | 90 -- python_module/megengine/_internal/plugin.py | 261 ---- python_module/megengine/_internal/version.py | 57 - python_module/megengine/core/__init__.py | 20 - python_module/megengine/core/device.py | 60 - python_module/megengine/core/function.py | 176 --- python_module/megengine/core/graph.py | 158 --- python_module/megengine/core/serialization.py | 128 -- python_module/megengine/core/tensor.py | 771 ---------- .../megengine/core/tensor_factory.py | 109 -- python_module/megengine/core/tensor_nn.py | 45 - python_module/megengine/data/__init__.py | 17 - python_module/megengine/data/_queue.py | 144 -- python_module/megengine/data/collator.py | 76 - python_module/megengine/data/dataloader.py | 500 ------- .../megengine/data/dataset/__init__.py | 10 - .../megengine/data/dataset/meta_dataset.py | 73 - .../megengine/data/dataset/vision/__init__.py | 17 - .../megengine/data/dataset/vision/cifar.py | 171 --- .../data/dataset/vision/cityscapes.py | 151 -- .../megengine/data/dataset/vision/coco.py | 366 ----- .../megengine/data/dataset/vision/folder.py | 90 -- .../megengine/data/dataset/vision/imagenet.py | 248 ---- .../data/dataset/vision/meta_vision.py | 41 - .../megengine/data/dataset/vision/mnist.py | 197 --- .../data/dataset/vision/objects365.py | 498 ------- .../megengine/data/dataset/vision/utils.py | 89 -- .../megengine/data/dataset/vision/voc.py | 185 --- python_module/megengine/data/sampler.py | 274 ---- .../megengine/data/transform/__init__.py | 10 - .../data/transform/meta_transform.py | 31 - .../data/transform/vision/__init__.py | 9 - .../data/transform/vision/functional.py | 111 -- .../data/transform/vision/transform.py | 1025 -------------- .../megengine/distributed/__init__.py | 33 - .../megengine/distributed/functional.py | 302 ---- python_module/megengine/distributed/helper.py | 63 - python_module/megengine/distributed/util.py | 146 -- .../megengine/functional/__init__.py | 118 -- .../megengine/functional/debug_param.py | 49 - .../megengine/functional/elemwise.py | 299 ---- .../megengine/functional/external.py | 65 - python_module/megengine/functional/graph.py | 125 -- python_module/megengine/functional/loss.py | 391 ------ python_module/megengine/functional/math.py | 333 ----- python_module/megengine/functional/nn.py | 1234 ----------------- .../megengine/functional/quantized.py | 80 -- python_module/megengine/functional/sort.py | 123 -- python_module/megengine/functional/tensor.py | 667 --------- python_module/megengine/functional/utils.py | 81 -- python_module/megengine/hub/__init__.py | 16 - python_module/megengine/hub/const.py | 17 - python_module/megengine/hub/exceptions.py | 30 - python_module/megengine/hub/fetcher.py | 300 ---- python_module/megengine/hub/hub.py | 333 ----- python_module/megengine/hub/tools.py | 48 - python_module/megengine/jit/__init__.py | 570 -------- .../megengine/jit/sublinear_memory_config.py | 56 - python_module/megengine/logger.py | 231 --- python_module/megengine/module/__init__.py | 23 - python_module/megengine/module/activation.py | 231 --- python_module/megengine/module/batchnorm.py | 257 ---- python_module/megengine/module/concat.py | 22 - python_module/megengine/module/conv.py | 392 ------ python_module/megengine/module/conv_bn.py | 69 - python_module/megengine/module/dropout.py | 29 - python_module/megengine/module/elemwise.py | 90 -- python_module/megengine/module/embedding.py | 171 --- python_module/megengine/module/external.py | 83 -- python_module/megengine/module/identity.py | 17 - python_module/megengine/module/init.py | 264 ---- python_module/megengine/module/linear.py | 61 - python_module/megengine/module/module.py | 507 ------- python_module/megengine/module/parampack.py | 157 --- python_module/megengine/module/pooling.py | 80 -- .../megengine/module/pytorch/__init__.py | 9 - .../megengine/module/pytorch/pytorch.py | 451 ------ .../module/pytorch/torch_mem_fwd.cpp | 148 -- .../megengine/module/pytorch/utils.py | 67 - .../megengine/module/qat/__init__.py | 14 - python_module/megengine/module/qat/concat.py | 30 - python_module/megengine/module/qat/conv.py | 59 - python_module/megengine/module/qat/conv_bn.py | 196 --- .../megengine/module/qat/elemwise.py | 31 - python_module/megengine/module/qat/linear.py | 39 - python_module/megengine/module/qat/module.py | 154 -- .../megengine/module/qat/quant_dequant.py | 50 - .../megengine/module/quant_dequant.py | 28 - .../megengine/module/quantized/__init__.py | 14 - .../megengine/module/quantized/concat.py | 35 - .../megengine/module/quantized/conv.py | 108 -- .../megengine/module/quantized/conv_bn.py | 56 - .../megengine/module/quantized/elemwise.py | 47 - .../megengine/module/quantized/linear.py | 55 - .../megengine/module/quantized/module.py | 31 - .../module/quantized/quant_dequant.py | 49 - python_module/megengine/module/sequential.py | 97 -- python_module/megengine/optimizer/__init__.py | 15 - python_module/megengine/optimizer/adadelta.py | 78 -- python_module/megengine/optimizer/adagrad.py | 75 - python_module/megengine/optimizer/adam.py | 86 -- python_module/megengine/optimizer/internal.py | 51 - .../megengine/optimizer/lr_scheduler.py | 65 - .../megengine/optimizer/multi_step_lr.py | 67 - .../megengine/optimizer/optimizer.py | 307 ---- python_module/megengine/optimizer/sgd.py | 73 - .../megengine/quantization/__init__.py | 20 - .../megengine/quantization/fake_quant.py | 145 -- .../quantization/internal_fake_quant.py | 19 - .../megengine/quantization/observer.py | 422 ------ .../megengine/quantization/qconfig.py | 109 -- .../megengine/quantization/quantize.py | 191 --- python_module/megengine/quantization/utils.py | 116 -- python_module/megengine/random/__init__.py | 13 - .../megengine/random/distribution.py | 102 -- python_module/megengine/random/rng.py | 27 - python_module/megengine/test/__init__.py | 67 - python_module/megengine/utils/__init__.py | 17 - python_module/megengine/utils/hook.py | 23 - .../megengine/utils/http_download.py | 66 - .../megengine/utils/max_recursion_limit.py | 78 -- python_module/megengine/utils/net_stats.py | 279 ---- .../megengine/utils/profile_analyze.py | 424 ------ .../megengine/utils/profile_analyzer.py | 401 ------ python_module/megengine/utils/types.py | 37 - python_module/megengine/version.py | 1 - python_module/requires-style.txt | 4 - python_module/requires-test.txt | 3 - python_module/requires.txt | 7 - python_module/setup.py | 118 -- python_module/src/cpp/bfloat16.cpp | 296 ---- python_module/src/cpp/craniotome.cpp | 435 ------ python_module/src/cpp/craniotome.h | 193 --- python_module/src/cpp/function_replace.cpp | 174 --- python_module/src/cpp/intbx.cpp | 364 ----- python_module/src/cpp/megbrain_config.cpp | 517 ------- python_module/src/cpp/megbrain_config.h | 78 -- python_module/src/cpp/megbrain_pubapi.cpp | 334 ----- python_module/src/cpp/megbrain_pubapi.h | 185 --- .../src/cpp/megbrain_pubapi_internal.h | 31 - python_module/src/cpp/megbrain_serialize.cpp | 180 --- python_module/src/cpp/megbrain_serialize.h | 159 --- ...rain_serialize_TensorValueDumperContext.py | 44 - ...rain_serialize_TensorValueLoaderContext.py | 19 - python_module/src/cpp/megbrain_wrap.cpp | 1055 -------------- python_module/src/cpp/megbrain_wrap.h | 491 ------- python_module/src/cpp/numpy_incl.h | 37 - python_module/src/cpp/opr_defs.cpp | 313 ----- python_module/src/cpp/opr_defs.h | 170 --- python_module/src/cpp/opr_helper.cpp | 192 --- python_module/src/cpp/opr_helper.h | 71 - python_module/src/cpp/plugin.cpp | 243 ---- python_module/src/cpp/plugin.h | 135 -- python_module/src/cpp/python_helper.cpp | 911 ------------ python_module/src/cpp/python_helper.h | 229 --- python_module/src/python/genopr.py | 293 ---- python_module/src/python/opr_template.py | 425 ------ python_module/src/swig/callback.i | 215 --- python_module/src/swig/comp_graph.i | 87 -- .../src/swig/comp_graph_impl_AsyncExec.py | 229 --- .../src/swig/comp_graph_impl_CompGraph.py | 191 --- python_module/src/swig/comp_graph_tools.i | 55 - python_module/src/swig/comp_node.i | 165 --- python_module/src/swig/craniotome.i | 88 -- python_module/src/swig/loop.i | 134 -- python_module/src/swig/mgb.i | 71 - python_module/src/swig/mgb_exception.i | 40 - python_module/src/swig/misc.i | 151 -- python_module/src/swig/operator.i | 148 -- python_module/src/swig/operator.py | 37 - python_module/src/swig/shared_nd.i | 125 -- .../src/swig/shared_nd_HostSharedND.py | 67 - python_module/src/swig/shared_nd_SharedND.py | 196 --- python_module/src/swig/symbol_var.i | 113 -- .../src/swig/symbol_var_SymbolVar.py | 216 --- python_module/src/swig/symbol_var_array.i | 46 - python_module/src/version.ld | 17 - python_module/test/.gitignore | 3 - python_module/test/README.md | 18 - python_module/test/__init__.py | 0 python_module/test/conftest.py | 34 - python_module/test/helpers/__init__.py | 172 --- python_module/test/helpers/env.py | 56 - python_module/test/helpers/torch_util.py | 33 - .../test/integration/manual/README.md | 178 --- .../test/integration/manual/resnet50_perf.py | 210 --- .../integration/manual/run_resnet50_perf.py | 162 --- .../integration/mnist_model_with_test.mge | Bin 1568739 -> 0 bytes .../integration/mnist_model_with_test_cpu.mge | Bin 1568745 -> 0 bytes .../test/integration/test_converge.py | 114 -- .../test/integration/test_correctness.py | 199 --- .../test/integration/test_distributed.py | 97 -- .../test/integration/test_equivalence.py | 184 --- .../test/integration/test_fastrun.py | 12 - .../test/integration/test_parampack.py | 274 ---- python_module/test/regression/.gitignore | 2 - python_module/test/regression/__init__.py | 0 python_module/test/regression/test_MGE-103.py | 34 - python_module/test/regression/test_MGE-22.py | 39 - python_module/test/regression/test_MGE-323.py | 21 - python_module/test/regression/test_MGE-81.py | 36 - python_module/test/run.sh | 19 - python_module/test/unit/__init__.py | 0 python_module/test/unit/core/__init__.py | 0 .../test/unit/core/test_dynamic_profiling.py | 56 - python_module/test/unit/core/test_function.py | 169 --- python_module/test/unit/core/test_graph.py | 74 - python_module/test/unit/core/test_index.py | 311 ----- .../test/unit/core/test_recoverable.py | 40 - .../test/unit/core/test_release_memory.py | 56 - .../test/unit/core/test_reshape_broadcast.py | 108 -- .../test/unit/core/test_serialization.py | 47 - python_module/test/unit/core/test_tensor.py | 91 -- .../test/unit/core/test_zeros_ones.py | 35 - python_module/test/unit/data/__init__.py | 0 .../test/unit/data/test_dataloader.py | 183 --- python_module/test/unit/data/test_dataset.py | 43 - python_module/test/unit/data/test_sampler.py | 81 -- .../test/unit/data/test_transform.py | 108 -- .../test/unit/distributed/test_functional.py | 467 ------- .../test/unit/distributed/test_util.py | 187 --- .../test/unit/functional/__init__.py | 0 .../test/unit/functional/test_elemwise.py | 65 - .../test/unit/functional/test_functional.py | 496 ------- .../test/unit/functional/test_interpolate.py | 60 - .../test/unit/functional/test_math.py | 168 --- .../test/unit/functional/test_onehot.py | 26 - python_module/test/unit/hub/__init__.py | 0 python_module/test/unit/hub/test_hub.py | 38 - python_module/test/unit/jit/__init__.py | 0 python_module/test/unit/jit/test_jit.py | 257 ---- python_module/test/unit/module/.gitattributes | 1 - .../unit/module/AtlasRuntimeOprTest.basic.om | Bin 32916 -> 0 bytes python_module/test/unit/module/__init__.py | 0 .../test/unit/module/test_activation.py | 24 - .../test/unit/module/test_batchnorm.py | 406 ------ python_module/test/unit/module/test_conv.py | 110 -- .../test/unit/module/test_external.py | 70 - python_module/test/unit/module/test_init.py | 27 - python_module/test/unit/module/test_module.py | 464 ------- .../test/unit/module/test_pytorch.py | 140 -- python_module/test/unit/module/test_qat.py | 85 -- python_module/test/unit/module/test_tensor.py | 87 -- python_module/test/unit/optimizer/__init__.py | 0 .../test/unit/optimizer/test_lr_scheduler.py | 23 - .../test/unit/optimizer/test_optimizer.py | 258 ---- .../test/unit/quantization/quantize.py | 80 -- .../test/unit/quantization/test_fake_quant.py | 80 -- python_module/test/unit/random/test_random.py | 162 --- scripts/cmake-build/host_build.sh | 16 +- scripts/whl/BUILD_PYTHON_WHL_README.md | 34 +- scripts/whl/macos/macos_build_whl.sh | 76 +- scripts/whl/manylinux2010/build_wheel.sh | 164 +-- scripts/whl/manylinux2010/do_build.sh | 122 +- scripts/whl/windows/windows_build_whl.sh | 76 +- 275 files changed, 244 insertions(+), 40864 deletions(-) create mode 100755 imperative/python/test/run.sh delete mode 100644 python_module/.gitignore delete mode 100644 python_module/CMakeLists.txt delete mode 100644 python_module/megengine/__init__.py delete mode 100644 python_module/megengine/_internal/__init__.py delete mode 100644 python_module/megengine/_internal/_timed_func_fork_exec_entry.py delete mode 100644 python_module/megengine/_internal/comp_graph_tools.py delete mode 100644 python_module/megengine/_internal/config.py delete mode 100644 python_module/megengine/_internal/craniotome.py delete mode 100644 python_module/megengine/_internal/dtype.py delete mode 100644 python_module/megengine/_internal/enum36.py delete mode 100644 python_module/megengine/_internal/exc.py delete mode 100644 python_module/megengine/_internal/global_init.py delete mode 100644 python_module/megengine/_internal/helper.py delete mode 100644 python_module/megengine/_internal/logconf.py delete mode 100644 python_module/megengine/_internal/mgb_helper.py delete mode 100644 python_module/megengine/_internal/opr_extra.py delete mode 100644 python_module/megengine/_internal/persistent_cache.py delete mode 100644 python_module/megengine/_internal/plugin.py delete mode 100644 python_module/megengine/_internal/version.py delete mode 100644 python_module/megengine/core/__init__.py delete mode 100644 python_module/megengine/core/device.py delete mode 100644 python_module/megengine/core/function.py delete mode 100644 python_module/megengine/core/graph.py delete mode 100644 python_module/megengine/core/serialization.py delete mode 100644 python_module/megengine/core/tensor.py delete mode 100644 python_module/megengine/core/tensor_factory.py delete mode 100644 python_module/megengine/core/tensor_nn.py delete mode 100644 python_module/megengine/data/__init__.py delete mode 100644 python_module/megengine/data/_queue.py delete mode 100644 python_module/megengine/data/collator.py delete mode 100644 python_module/megengine/data/dataloader.py delete mode 100644 python_module/megengine/data/dataset/__init__.py delete mode 100644 python_module/megengine/data/dataset/meta_dataset.py delete mode 100644 python_module/megengine/data/dataset/vision/__init__.py delete mode 100644 python_module/megengine/data/dataset/vision/cifar.py delete mode 100644 python_module/megengine/data/dataset/vision/cityscapes.py delete mode 100644 python_module/megengine/data/dataset/vision/coco.py delete mode 100644 python_module/megengine/data/dataset/vision/folder.py delete mode 100644 python_module/megengine/data/dataset/vision/imagenet.py delete mode 100644 python_module/megengine/data/dataset/vision/meta_vision.py delete mode 100644 python_module/megengine/data/dataset/vision/mnist.py delete mode 100644 python_module/megengine/data/dataset/vision/objects365.py delete mode 100644 python_module/megengine/data/dataset/vision/utils.py delete mode 100644 python_module/megengine/data/dataset/vision/voc.py delete mode 100644 python_module/megengine/data/sampler.py delete mode 100644 python_module/megengine/data/transform/__init__.py delete mode 100644 python_module/megengine/data/transform/meta_transform.py delete mode 100644 python_module/megengine/data/transform/vision/__init__.py delete mode 100644 python_module/megengine/data/transform/vision/functional.py delete mode 100644 python_module/megengine/data/transform/vision/transform.py delete mode 100644 python_module/megengine/distributed/__init__.py delete mode 100644 python_module/megengine/distributed/functional.py delete mode 100644 python_module/megengine/distributed/helper.py delete mode 100644 python_module/megengine/distributed/util.py delete mode 100644 python_module/megengine/functional/__init__.py delete mode 100644 python_module/megengine/functional/debug_param.py delete mode 100644 python_module/megengine/functional/elemwise.py delete mode 100644 python_module/megengine/functional/external.py delete mode 100644 python_module/megengine/functional/graph.py delete mode 100644 python_module/megengine/functional/loss.py delete mode 100644 python_module/megengine/functional/math.py delete mode 100644 python_module/megengine/functional/nn.py delete mode 100644 python_module/megengine/functional/quantized.py delete mode 100644 python_module/megengine/functional/sort.py delete mode 100644 python_module/megengine/functional/tensor.py delete mode 100644 python_module/megengine/functional/utils.py delete mode 100644 python_module/megengine/hub/__init__.py delete mode 100644 python_module/megengine/hub/const.py delete mode 100644 python_module/megengine/hub/exceptions.py delete mode 100644 python_module/megengine/hub/fetcher.py delete mode 100644 python_module/megengine/hub/hub.py delete mode 100644 python_module/megengine/hub/tools.py delete mode 100644 python_module/megengine/jit/__init__.py delete mode 100644 python_module/megengine/jit/sublinear_memory_config.py delete mode 100644 python_module/megengine/logger.py delete mode 100644 python_module/megengine/module/__init__.py delete mode 100644 python_module/megengine/module/activation.py delete mode 100644 python_module/megengine/module/batchnorm.py delete mode 100644 python_module/megengine/module/concat.py delete mode 100644 python_module/megengine/module/conv.py delete mode 100644 python_module/megengine/module/conv_bn.py delete mode 100644 python_module/megengine/module/dropout.py delete mode 100644 python_module/megengine/module/elemwise.py delete mode 100644 python_module/megengine/module/embedding.py delete mode 100644 python_module/megengine/module/external.py delete mode 100644 python_module/megengine/module/identity.py delete mode 100644 python_module/megengine/module/init.py delete mode 100644 python_module/megengine/module/linear.py delete mode 100644 python_module/megengine/module/module.py delete mode 100644 python_module/megengine/module/parampack.py delete mode 100644 python_module/megengine/module/pooling.py delete mode 100644 python_module/megengine/module/pytorch/__init__.py delete mode 100644 python_module/megengine/module/pytorch/pytorch.py delete mode 100644 python_module/megengine/module/pytorch/torch_mem_fwd.cpp delete mode 100644 python_module/megengine/module/pytorch/utils.py delete mode 100644 python_module/megengine/module/qat/__init__.py delete mode 100644 python_module/megengine/module/qat/concat.py delete mode 100644 python_module/megengine/module/qat/conv.py delete mode 100644 python_module/megengine/module/qat/conv_bn.py delete mode 100644 python_module/megengine/module/qat/elemwise.py delete mode 100644 python_module/megengine/module/qat/linear.py delete mode 100644 python_module/megengine/module/qat/module.py delete mode 100644 python_module/megengine/module/qat/quant_dequant.py delete mode 100644 python_module/megengine/module/quant_dequant.py delete mode 100644 python_module/megengine/module/quantized/__init__.py delete mode 100644 python_module/megengine/module/quantized/concat.py delete mode 100644 python_module/megengine/module/quantized/conv.py delete mode 100644 python_module/megengine/module/quantized/conv_bn.py delete mode 100644 python_module/megengine/module/quantized/elemwise.py delete mode 100644 python_module/megengine/module/quantized/linear.py delete mode 100644 python_module/megengine/module/quantized/module.py delete mode 100644 python_module/megengine/module/quantized/quant_dequant.py delete mode 100644 python_module/megengine/module/sequential.py delete mode 100644 python_module/megengine/optimizer/__init__.py delete mode 100644 python_module/megengine/optimizer/adadelta.py delete mode 100644 python_module/megengine/optimizer/adagrad.py delete mode 100644 python_module/megengine/optimizer/adam.py delete mode 100644 python_module/megengine/optimizer/internal.py delete mode 100644 python_module/megengine/optimizer/lr_scheduler.py delete mode 100644 python_module/megengine/optimizer/multi_step_lr.py delete mode 100644 python_module/megengine/optimizer/optimizer.py delete mode 100644 python_module/megengine/optimizer/sgd.py delete mode 100644 python_module/megengine/quantization/__init__.py delete mode 100644 python_module/megengine/quantization/fake_quant.py delete mode 100644 python_module/megengine/quantization/internal_fake_quant.py delete mode 100644 python_module/megengine/quantization/observer.py delete mode 100644 python_module/megengine/quantization/qconfig.py delete mode 100644 python_module/megengine/quantization/quantize.py delete mode 100644 python_module/megengine/quantization/utils.py delete mode 100644 python_module/megengine/random/__init__.py delete mode 100644 python_module/megengine/random/distribution.py delete mode 100644 python_module/megengine/random/rng.py delete mode 100644 python_module/megengine/test/__init__.py delete mode 100644 python_module/megengine/utils/__init__.py delete mode 100644 python_module/megengine/utils/hook.py delete mode 100644 python_module/megengine/utils/http_download.py delete mode 100644 python_module/megengine/utils/max_recursion_limit.py delete mode 100644 python_module/megengine/utils/net_stats.py delete mode 100755 python_module/megengine/utils/profile_analyze.py delete mode 100644 python_module/megengine/utils/profile_analyzer.py delete mode 100644 python_module/megengine/utils/types.py delete mode 100644 python_module/megengine/version.py delete mode 100644 python_module/requires-style.txt delete mode 100644 python_module/requires-test.txt delete mode 100644 python_module/requires.txt delete mode 100644 python_module/setup.py delete mode 100644 python_module/src/cpp/bfloat16.cpp delete mode 100644 python_module/src/cpp/craniotome.cpp delete mode 100644 python_module/src/cpp/craniotome.h delete mode 100644 python_module/src/cpp/function_replace.cpp delete mode 100644 python_module/src/cpp/intbx.cpp delete mode 100644 python_module/src/cpp/megbrain_config.cpp delete mode 100644 python_module/src/cpp/megbrain_config.h delete mode 100644 python_module/src/cpp/megbrain_pubapi.cpp delete mode 100644 python_module/src/cpp/megbrain_pubapi.h delete mode 100644 python_module/src/cpp/megbrain_pubapi_internal.h delete mode 100644 python_module/src/cpp/megbrain_serialize.cpp delete mode 100644 python_module/src/cpp/megbrain_serialize.h delete mode 100644 python_module/src/cpp/megbrain_serialize_TensorValueDumperContext.py delete mode 100644 python_module/src/cpp/megbrain_serialize_TensorValueLoaderContext.py delete mode 100644 python_module/src/cpp/megbrain_wrap.cpp delete mode 100644 python_module/src/cpp/megbrain_wrap.h delete mode 100644 python_module/src/cpp/numpy_incl.h delete mode 100644 python_module/src/cpp/opr_defs.cpp delete mode 100644 python_module/src/cpp/opr_defs.h delete mode 100644 python_module/src/cpp/opr_helper.cpp delete mode 100644 python_module/src/cpp/opr_helper.h delete mode 100644 python_module/src/cpp/plugin.cpp delete mode 100644 python_module/src/cpp/plugin.h delete mode 100644 python_module/src/cpp/python_helper.cpp delete mode 100644 python_module/src/cpp/python_helper.h delete mode 100755 python_module/src/python/genopr.py delete mode 100644 python_module/src/python/opr_template.py delete mode 100644 python_module/src/swig/callback.i delete mode 100644 python_module/src/swig/comp_graph.i delete mode 100644 python_module/src/swig/comp_graph_impl_AsyncExec.py delete mode 100644 python_module/src/swig/comp_graph_impl_CompGraph.py delete mode 100644 python_module/src/swig/comp_graph_tools.i delete mode 100644 python_module/src/swig/comp_node.i delete mode 100644 python_module/src/swig/craniotome.i delete mode 100644 python_module/src/swig/loop.i delete mode 100644 python_module/src/swig/mgb.i delete mode 100644 python_module/src/swig/mgb_exception.i delete mode 100644 python_module/src/swig/misc.i delete mode 100644 python_module/src/swig/operator.i delete mode 100644 python_module/src/swig/operator.py delete mode 100644 python_module/src/swig/shared_nd.i delete mode 100644 python_module/src/swig/shared_nd_HostSharedND.py delete mode 100644 python_module/src/swig/shared_nd_SharedND.py delete mode 100644 python_module/src/swig/symbol_var.i delete mode 100644 python_module/src/swig/symbol_var_SymbolVar.py delete mode 100644 python_module/src/swig/symbol_var_array.i delete mode 100644 python_module/src/version.ld delete mode 100644 python_module/test/.gitignore delete mode 100644 python_module/test/README.md delete mode 100644 python_module/test/__init__.py delete mode 100644 python_module/test/conftest.py delete mode 100644 python_module/test/helpers/__init__.py delete mode 100644 python_module/test/helpers/env.py delete mode 100644 python_module/test/helpers/torch_util.py delete mode 100644 python_module/test/integration/manual/README.md delete mode 100644 python_module/test/integration/manual/resnet50_perf.py delete mode 100644 python_module/test/integration/manual/run_resnet50_perf.py delete mode 100644 python_module/test/integration/mnist_model_with_test.mge delete mode 100644 python_module/test/integration/mnist_model_with_test_cpu.mge delete mode 100644 python_module/test/integration/test_converge.py delete mode 100644 python_module/test/integration/test_correctness.py delete mode 100644 python_module/test/integration/test_distributed.py delete mode 100644 python_module/test/integration/test_equivalence.py delete mode 100644 python_module/test/integration/test_fastrun.py delete mode 100644 python_module/test/integration/test_parampack.py delete mode 100644 python_module/test/regression/.gitignore delete mode 100644 python_module/test/regression/__init__.py delete mode 100644 python_module/test/regression/test_MGE-103.py delete mode 100644 python_module/test/regression/test_MGE-22.py delete mode 100644 python_module/test/regression/test_MGE-323.py delete mode 100644 python_module/test/regression/test_MGE-81.py delete mode 100755 python_module/test/run.sh delete mode 100644 python_module/test/unit/__init__.py delete mode 100644 python_module/test/unit/core/__init__.py delete mode 100644 python_module/test/unit/core/test_dynamic_profiling.py delete mode 100644 python_module/test/unit/core/test_function.py delete mode 100644 python_module/test/unit/core/test_graph.py delete mode 100644 python_module/test/unit/core/test_index.py delete mode 100644 python_module/test/unit/core/test_recoverable.py delete mode 100644 python_module/test/unit/core/test_release_memory.py delete mode 100644 python_module/test/unit/core/test_reshape_broadcast.py delete mode 100644 python_module/test/unit/core/test_serialization.py delete mode 100644 python_module/test/unit/core/test_tensor.py delete mode 100644 python_module/test/unit/core/test_zeros_ones.py delete mode 100644 python_module/test/unit/data/__init__.py delete mode 100644 python_module/test/unit/data/test_dataloader.py delete mode 100644 python_module/test/unit/data/test_dataset.py delete mode 100644 python_module/test/unit/data/test_sampler.py delete mode 100644 python_module/test/unit/data/test_transform.py delete mode 100644 python_module/test/unit/distributed/test_functional.py delete mode 100644 python_module/test/unit/distributed/test_util.py delete mode 100644 python_module/test/unit/functional/__init__.py delete mode 100644 python_module/test/unit/functional/test_elemwise.py delete mode 100644 python_module/test/unit/functional/test_functional.py delete mode 100644 python_module/test/unit/functional/test_interpolate.py delete mode 100644 python_module/test/unit/functional/test_math.py delete mode 100644 python_module/test/unit/functional/test_onehot.py delete mode 100644 python_module/test/unit/hub/__init__.py delete mode 100644 python_module/test/unit/hub/test_hub.py delete mode 100644 python_module/test/unit/jit/__init__.py delete mode 100644 python_module/test/unit/jit/test_jit.py delete mode 100644 python_module/test/unit/module/.gitattributes delete mode 100644 python_module/test/unit/module/AtlasRuntimeOprTest.basic.om delete mode 100644 python_module/test/unit/module/__init__.py delete mode 100644 python_module/test/unit/module/test_activation.py delete mode 100644 python_module/test/unit/module/test_batchnorm.py delete mode 100644 python_module/test/unit/module/test_conv.py delete mode 100644 python_module/test/unit/module/test_external.py delete mode 100644 python_module/test/unit/module/test_init.py delete mode 100644 python_module/test/unit/module/test_module.py delete mode 100644 python_module/test/unit/module/test_pytorch.py delete mode 100644 python_module/test/unit/module/test_qat.py delete mode 100644 python_module/test/unit/module/test_tensor.py delete mode 100644 python_module/test/unit/optimizer/__init__.py delete mode 100644 python_module/test/unit/optimizer/test_lr_scheduler.py delete mode 100644 python_module/test/unit/optimizer/test_optimizer.py delete mode 100644 python_module/test/unit/quantization/quantize.py delete mode 100644 python_module/test/unit/quantization/test_fake_quant.py delete mode 100644 python_module/test/unit/random/test_random.py diff --git a/CMakeLists.txt b/CMakeLists.txt index 347da9f9..a4329709 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,10 +47,9 @@ option(MGE_DEBUG_UTIL "Enable debug utility" ON) option(MGE_ENABLE_EXCEPTIONS "Build with exceptions" ON) option(MGE_WITH_TEST "Enable test for MegEngine." OFF) option(MGE_WITH_DISTRIBUTED "Build with distributed support" ON) -option(MGE_BUILD_IMPERATIVE_RT "Build _imperative_rt.so instead of _mgb.so " OFF) +option(MGE_BUILD_IMPERATIVE_RT "Build _imperative_rt Python Module " ON) option(MGE_BUILD_SDK "Build load_and_run" ON) option(MGE_INFERENCE_ONLY "Build inference only library." OFF) -option(MGE_WITH_PYTHON_MODULE "Build MegEngine Python Module." ON) option(MGE_WITH_MKLDNN "Enable Intel MKL_DNN support," ON) option(MGE_WITH_ROCM "Enable ROCM support" OFF) @@ -256,8 +255,8 @@ endif() if(MGE_INFERENCE_ONLY) message("-- Disable distributed support for inference only build.") set(MGE_WITH_DISTRIBUTED OFF) - message("-- Disable python module for inference only build.") - set(MGE_WITH_PYTHON_MODULE OFF) + message("-- Disable imperative_rt python module for inference only build.") + set(MGE_BUILD_IMPERATIVE_RT OFF) endif() if(MGE_WITH_DISTRIBUTED) @@ -694,43 +693,18 @@ if(MGE_BUILD_SDK) add_subdirectory(sdk/load-and-run) endif() -if(MGE_WITH_PYTHON_MODULE) - if(MGE_BUILD_IMPERATIVE_RT) - add_subdirectory(imperative) - message("-- Enable imperative python wrapper runtime") - else() - add_subdirectory(python_module) - message("-- Enable legacy python wrapper runtime") - endif() + +if(MGE_BUILD_IMPERATIVE_RT) + add_subdirectory(imperative) + message("-- Enable imperative python wrapper runtime") endif() if(MGE_WITH_TEST AND MGE_ENABLE_RTTI) add_subdirectory(test) endif() -if(TARGET mgb) - add_custom_target( - develop - COMMAND ${CMAKE_COMMAND} -E create_symlink - ${CMAKE_CURRENT_BINARY_DIR}/python_module/megengine/_internal/$ - ${CMAKE_CURRENT_SOURCE_DIR}/python_module/megengine/_internal/$ - COMMAND ${CMAKE_COMMAND} -E create_symlink - ${CMAKE_CURRENT_BINARY_DIR}/python_module/megengine/_internal/mgb.py - ${CMAKE_CURRENT_SOURCE_DIR}/python_module/megengine/_internal/mgb.py - COMMAND ${CMAKE_COMMAND} -E create_symlink - ${CMAKE_CURRENT_BINARY_DIR}/python_module/megengine/_internal/opr.py - ${CMAKE_CURRENT_SOURCE_DIR}/python_module/megengine/_internal/opr.py - COMMAND ${CMAKE_COMMAND} -E create_symlink - ${CMAKE_CURRENT_BINARY_DIR}/python_module/megengine/_internal/opr_param_defs.py - ${CMAKE_CURRENT_SOURCE_DIR}/python_module/megengine/_internal/opr_param_defs.py - COMMAND ${CMAKE_COMMAND} -E create_symlink - ${CMAKE_CURRENT_BINARY_DIR}/python_module/megengine/_internal/include - ${CMAKE_CURRENT_SOURCE_DIR}/python_module/megengine/_internal/include - DEPENDS mgb - VERBATIM - ) -elseif(TARGET _imperative_rt) +if(TARGET _imperative_rt) add_custom_target( develop COMMAND ${CMAKE_COMMAND} -E create_symlink diff --git a/imperative/python/megengine/core/tensor/multipledispatch/utils.py b/imperative/python/megengine/core/tensor/multipledispatch/utils.py index 4dcd0dc4..968430f3 100644 --- a/imperative/python/megengine/core/tensor/multipledispatch/utils.py +++ b/imperative/python/megengine/core/tensor/multipledispatch/utils.py @@ -183,25 +183,16 @@ def typename(type): # parse typing.Union -if sys.version_info < (3, 6): - - def parse_union(ann): +def parse_union(ann): + if hasattr(typing, "UnionMeta"): if type(ann) is not typing.UnionMeta: return return ann.__union_params__ - - -elif sys.version_info < (3, 7): - - def parse_union(ann): + elif hasattr(typing, "_Union"): if type(ann) is not typing._Union: return return ann.__args__ - - -elif sys.version_info < (3, 8): - - def parse_union(ann): + elif hasattr(typing, "_GenericAlias"): if type(ann) is not typing._GenericAlias: if type(ann) is not typing.Union: return @@ -209,11 +200,9 @@ elif sys.version_info < (3, 8): if ann.__origin__ is not typing.Union: return return ann.__args__ - - -else: - - def parse_union(ann): + elif hasattr(typing, "Union"): if typing.get_origin(ann) is not typing.Union: return return typing.get_args(ann) + else: + raise NotImplementedError("unsupported Python version") diff --git a/imperative/python/setup.py b/imperative/python/setup.py index c788b75c..19c6123c 100644 --- a/imperative/python/setup.py +++ b/imperative/python/setup.py @@ -6,6 +6,7 @@ # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + import os import re import pathlib @@ -55,11 +56,13 @@ package_data = [ str(f.relative_to('megengine')) for f in pathlib.Path('megengine', 'core', 'include').glob('**/*') ] + package_data += [ str(f.relative_to('megengine')) for f in pathlib.Path('megengine', 'core', 'lib').glob('**/*') ] + with open('requires.txt') as f: requires = f.read().splitlines() with open('requires-style.txt') as f: @@ -67,6 +70,7 @@ with open('requires-style.txt') as f: with open('requires-test.txt') as f: requires_test = f.read().splitlines() +prebuild_modules=[PrecompiledExtesion('megengine.core._imperative_rt')] setup_kwargs = dict( name=package_name, version=__version__, @@ -78,7 +82,7 @@ setup_kwargs = dict( package_data={ 'megengine': package_data, }, - ext_modules=[PrecompiledExtesion('megengine.core._imperative_rt')], + ext_modules=prebuild_modules, install_requires=requires, extras_require={ 'dev': requires_style + requires_test, @@ -87,6 +91,7 @@ setup_kwargs = dict( cmdclass={'build_ext': build_ext}, ) + setup_kwargs.update(dict( classifiers=[ 'Development Status :: 3 - Alpha', diff --git a/imperative/python/test/run.sh b/imperative/python/test/run.sh new file mode 100755 index 00000000..1e9676fb --- /dev/null +++ b/imperative/python/test/run.sh @@ -0,0 +1,21 @@ +#!/bin/bash -e + +test_dirs="test" +TEST_PLAT=$1 + +if [[ "$TEST_PLAT" == cpu ]]; then + echo "only test cpu pytest" +elif [[ "$TEST_PLAT" == cuda ]]; then + echo "test both cpu and gpu pytest" +else + log "Argument must cpu or cuda" + exit 1 +fi + +pushd $(dirname "${BASH_SOURCE[0]}")/.. >/dev/null + PYTHONPATH="." PY_IGNORE_IMPORTMISMATCH=1 python3 -m pytest $test_dirs -m 'not isolated_distributed' + if [[ "$TEST_PLAT" == cuda ]]; then + echo "test GPU pytest now" + PYTHONPATH="." PY_IGNORE_IMPORTMISMATCH=1 python3 -m pytest $test_dirs -m 'isolated_distributed' + fi +popd >/dev/null diff --git a/python_module/.gitignore b/python_module/.gitignore deleted file mode 100644 index f31367f5..00000000 --- a/python_module/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -/megbrain/_mgb.so -/megbrain/_mgb.*.so -/MegBrain.egg-info/ -/dist -/dist_cuda -/dist_nocuda -/wheel_dist -.cache diff --git a/python_module/CMakeLists.txt b/python_module/CMakeLists.txt deleted file mode 100644 index e23c2488..00000000 --- a/python_module/CMakeLists.txt +++ /dev/null @@ -1,113 +0,0 @@ -cmake_policy(SET CMP0086 NEW) - -find_package(PythonLibs ${PYTHON_VERSION_STRING} EXACT REQUIRED) - -find_package(Git) -if(GIT_FOUND) - message("git found: ${GIT_EXECUTABLE}") -endif() - -find_package(NumPy REQUIRED) - -find_package(SWIG REQUIRED) -set(SWIG_SRC src/swig/mgb.i) -if(MSVC OR WIN32) - set(CMAKE_SWIG_FLAGS -Wall -threads -py3 -DSWIGWORDSIZE64) - message("WARN: swig have some define issue at windows(64) env") - message("Please refs scripts/whl/BUILD_PYTHON_WHL_README.md to init windows build env") -else() - set(CMAKE_SWIG_FLAGS -Wall -threads -py3 -modern -DSWIGWORDSIZE64) -endif() -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-parameter") - -file(GLOB_RECURSE OPR_DECL_SRCS "${PROJECT_SOURCE_DIR}/src/**/*.oprdecl") -file(GLOB_RECURSE PYTHON_SRCS setup.py - src/python/*.py - test/*.py - megengine/*.py) -list(REMOVE_ITEM PYTHON_SRCS - ${CMAKE_CURRENT_SOURCE_DIR}/megengine/_internal/mgb.py - ${CMAKE_CURRENT_SOURCE_DIR}/megengine/_internal/opr.py - ${CMAKE_CURRENT_SOURCE_DIR}/megengine/_internal/opr_param_defs.py -) -list(APPEND PYTHON_SRCS ${MGB_SRCS}) - -file(GLOB_RECURSE ALL_HEADERS src/cpp/megbrain_pubapi.h - ${PROJECT_SOURCE_DIR}/src/core/include/* - ${PROJECT_SOURCE_DIR}/src/opr/include/* - ${PROJECT_SOURCE_DIR}/src/serialization/include/* - ${PROJECT_SOURCE_DIR}/src/plugin/include/* - ${PROJECT_SOURCE_DIR}/dnn/include/*) - -file(COPY ${PROJECT_SOURCE_DIR}/dnn/scripts/opr_param_defs.py DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) -file(READ ${PROJECT_SOURCE_DIR}/tools/param_defs/mgb_opr_param_defs.py CONTENTS) -file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/opr_param_defs.py ${CONTENTS}) - -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/megengine/_internal/opr.py ${CMAKE_CURRENT_BINARY_DIR}/megengine/_internal/opr_param_defs.py - COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/src/python ${CMAKE_CURRENT_BINARY_DIR}/src/python - COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/megengine/_internal - COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/src/python/genopr.py ${OPR_DECL_SRCS} - COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/dnn/scripts/gen_param_defs.py -t py ${CMAKE_CURRENT_BINARY_DIR}/opr_param_defs.py ${CMAKE_CURRENT_BINARY_DIR}/megengine/_internal/opr_param_defs.py - DEPENDS ${OPR_DECL_SRCS} - VERBATIM -) - -add_custom_target(mgb_opr_py DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/megengine/_internal/opr.py) - -set(SRCS src/cpp/craniotome.cpp src/cpp/function_replace.cpp src/cpp/intbx.cpp src/cpp/bfloat16.cpp src/cpp/megbrain_config.cpp src/cpp/megbrain_pubapi.cpp src/cpp/megbrain_serialize.cpp src/cpp/megbrain_wrap.cpp src/cpp/opr_defs.cpp src/cpp/opr_helper.cpp src/cpp/plugin.cpp src/cpp/python_helper.cpp) - -include(UseSWIG) -set_property(SOURCE ${SWIG_SRC} PROPERTY CPLUSPLUS ON) - -# cmake < 3.12 do not honor INCLUDE_DIRECTORIES property, just add include directory into SWIG_FLAGS -# Add -I${PROJECT_BINARY_DIR}/genfiles in order to include megbrain_build_config.h so that we don't need to pass cmake flags by -D. -set_property(SOURCE ${SWIG_SRC} PROPERTY SWIG_FLAGS -I${PROJECT_SOURCE_DIR}/src/serialization/include -I${PROJECT_BINARY_DIR}/genfiles) - -set(SWIG_OUTFILE_DIR ${CMAKE_CURRENT_BINARY_DIR}) -set(CMAKE_SWIG_OUTDIR ${CMAKE_CURRENT_BINARY_DIR}/megengine/_internal) -swig_add_library(mgb LANGUAGE python SOURCES ${SWIG_SRC} ${SRCS}) - -set(VERSION_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/src/version.ld) -add_custom_target(version_ld SOURCES ${VERSION_SCRIPT}) - -set_target_properties(mgb PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/megengine/_internal) -if (APPLE) - target_link_libraries(mgb megbrain megdnn) - set_target_properties(mgb PROPERTIES LINK_FLAGS "-undefined dynamic_lookup") -elseif (MSVC OR WIN32) - target_link_libraries(mgb megbrain megdnn) -else() - target_link_libraries(mgb megbrain megdnn -Wl,--version-script=${VERSION_SCRIPT}) -endif() -target_include_directories(mgb PRIVATE ${PYTHON_INCLUDE_DIRS} src/cpp ${CMAKE_CURRENT_BINARY_DIR} ${NUMPY_INCLUDE_DIR}) -# only windows need link PYTHON_LIBRARIES -if(MSVC OR WIN32) - target_link_libraries(mgb ${PYTHON_LIBRARIES}) -endif() - -if (MGE_WITH_DISTRIBUTED) - target_link_libraries(mgb megray) -endif() - -add_dependencies(mgb mgb_opr_py version_ld) - -add_custom_command( - TARGET mgb POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/LICENSE ${PROJECT_SOURCE_DIR}/ACKNOWLEDGMENTS ${PROJECT_BINARY_DIR} - COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/megengine ${CMAKE_CURRENT_BINARY_DIR}/megengine - COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/test ${CMAKE_CURRENT_BINARY_DIR}/test - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/setup.py ${CMAKE_CURRENT_BINARY_DIR}/setup.py - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/requires.txt ${CMAKE_CURRENT_BINARY_DIR}/requires.txt - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/requires-style.txt ${CMAKE_CURRENT_BINARY_DIR}/requires-style.txt - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/requires-test.txt ${CMAKE_CURRENT_BINARY_DIR}/requires-test.txt - COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_CURRENT_BINARY_DIR}/megengine/_internal/include - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/src/cpp/megbrain_pubapi.h ${CMAKE_CURRENT_BINARY_DIR}/megengine/_internal/include/megbrain_pubapi.h - COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/src/core/include ${CMAKE_CURRENT_BINARY_DIR}/megengine/_internal/include - COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/src/opr/include ${CMAKE_CURRENT_BINARY_DIR}/megengine/_internal/include - COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/src/serialization/include ${CMAKE_CURRENT_BINARY_DIR}/megengine/_internal/include - COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/src/plugin/include ${CMAKE_CURRENT_BINARY_DIR}/megengine/_internal/include - COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/dnn/include ${CMAKE_CURRENT_BINARY_DIR}/megengine/_internal/include - COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/genfiles/megbrain_build_config.h ${CMAKE_CURRENT_BINARY_DIR}/megengine/_internal/include/megbrain_build_config.h -) - diff --git a/python_module/megengine/__init__.py b/python_module/megengine/__init__.py deleted file mode 100644 index 81c59cd0..00000000 --- a/python_module/megengine/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from .core import * -from .logger import enable_debug_log, get_logger, set_log_file, set_log_level -from .version import __version__ diff --git a/python_module/megengine/_internal/__init__.py b/python_module/megengine/_internal/__init__.py deleted file mode 100644 index bac0e791..00000000 --- a/python_module/megengine/_internal/__init__.py +++ /dev/null @@ -1,729 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -"""the megbrain python package - -Note that all the submodules are automatically imported, so you usually only -need to ``import megengine._internal as mgb``. -""" - -import collections -import json -import os -import sys -import platform -import ctypes - -if sys.platform == "win32": - lib_path = os.path.join(os.path.dirname(__file__), "lib") - Lib_path = os.path.join(os.path.dirname(__file__), "Lib") - dll_paths = list(filter(os.path.exists, [lib_path, Lib_path])) - assert len(dll_paths) > 0 - - kernel32 = ctypes.WinDLL("kernel32.dll", use_last_error=True) - has_load_library_attr = hasattr(kernel32, "AddDllDirectory") - old_error_mode = kernel32.SetErrorMode(0x0001) - - kernel32.LoadLibraryW.restype = ctypes.c_void_p - if has_load_library_attr: - kernel32.AddDllDirectory.restype = ctypes.c_void_p - kernel32.LoadLibraryExW.restype = ctypes.c_void_p - - for dll_path in dll_paths: - if sys.version_info >= (3, 8): - os.add_dll_directory(dll_path) - elif has_load_library_attr: - res = kernel32.AddDllDirectory(dll_path) - if res is None: - err = ctypes.WinError(ctypes.get_last_error()) - err.strerror += ' Error adding "{}" to the DLL search PATH.'.format( - dll_path - ) - raise err - else: - print("WARN: python or OS env have some issue, may load DLL failed!!!") - - import glob - - dlls = glob.glob(os.path.join(lib_path, "*.dll")) - path_patched = False - for dll in dlls: - is_loaded = False - if has_load_library_attr: - res = kernel32.LoadLibraryExW(dll, None, 0x00001100) - last_error = ctypes.get_last_error() - if res is None and last_error != 126: - err = ctypes.WinError(last_error) - err.strerror += ' Error loading "{}" or one of its dependencies.'.format( - dll - ) - raise err - elif res is not None: - is_loaded = True - if not is_loaded: - if not path_patched: - os.environ["PATH"] = ";".join(dll_paths + [os.environ["PATH"]]) - path_patched = True - res = kernel32.LoadLibraryW(dll) - if res is None: - err = ctypes.WinError(ctypes.get_last_error()) - err.strerror += ' Error loading "{}" or one of its dependencies.'.format( - dll - ) - raise err - - kernel32.SetErrorMode(old_error_mode) - -import numpy as np - -from . import comp_graph_tools as cgtools -from . import config, craniotome, dtype -from . import global_init as _global_init -from . import helper as _helper -from . import mgb as _detail -from . import opr, opr_extra, opr_param_defs, plugin -from .exc import MegBrainError -from .logconf import get_logger -from .mgb import ( - CompGraph, - CompNode, - SharedND, - SharedScalar, - SymbolVar, - TensorValueDumperContext, - TensorValueLoaderContext, -) -from .mgb import as_comp_node as comp_node -from .mgb_helper import SharedNDLazyInitializer, callback_lazycopy, copy_output -from .plugin import CompGraphProfiler -from .plugin import GlobalInfkernFinder as _GlobalInfkernFinder -from .plugin import NumRangeChecker -from .version import __version__, version_info - -if sys.version_info.major < 3: - raise ImportError("megbrain requires python 3") - - -class ProxySharedNDAndSymbolVar(_detail.SymbolVar): - """this is a :class:`.SymbolVar` with a corresponding :class:`.SharedND`. - It can participate in graph computating and also provides :meth:`set_value` - and :meth:`get_value`. It should be constructed by :func:`make_shared`. - """ - - __shared_nd = None - __kwargs = None - - def __init__(self, snd, comp_graph, name, **kwargs): - self.__shared_nd = snd - self.__kwargs = kwargs - self.this = snd.symvar(comp_graph=comp_graph, name=name, **kwargs).this - - def set_value(self, v, **kwargs): - ret = self.__shared_nd.set_value(v, **kwargs) - self._reeval_if_eager_eval() - return ret - - def get_value(self): - return self.__shared_nd.get_value() - - def reset_zero(self): - self.__shared_nd.reset_zero() - - -def make_shared( - comp_node, - *, - dtype=None, - shape=None, - value=None, - comp_graph=None, - name=None, - volatile=None -): - """make a shared tensor which is stored on device and could be modified - later, either as a :class:`.SymbolVar` or a :class:`.SharedND` object - - :param comp_node: computing node - :type comp_node: :class:`.CompNode` - :param dtype: data type; if it is None, then dtype of value would be used - if value is not None, and float32 would be used as default dtype if - value is None - :type dtype: :class:`numpy.dtype` compatible - :param value: initializing value - :type value: None or :class:`numpy.ndarray` - :param comp_graph: the computing graph to which this shared value should - belong; if provided, the retuned object could be used as a - :class:`.SymbolVar` - :type comp_graph: None or :class:`.CompGraph` - :param name: node name to be used in computing graph; only meaningful if - *comp_graph* is provided - :param volatile: if *comp_graph* is given then *volatile* indicates whether - shape or mem ptr of this SharedND can be changed - :rtype: :class:`.SharedND` if *comp_graph* is not given; or - :class:`ProxySharedNDAndSymbolVar` otherwise - """ - if dtype is None: - if value is not None: - value = np.ascontiguousarray(value) - dtype = to_mgb_supported_dtype(value.dtype) - else: - dtype = np.float32 - comp_node = _detail.as_comp_node(comp_node) - rst = _detail.SharedND(comp_node, dtype) - if value is not None: - assert shape is None, "could not provide both value and shape" - rst.set_value(value) - elif shape is not None: - rst._set_init_shape(shape) - if comp_graph is None: - assert name is None and volatile is None - return rst - assert isinstance(comp_graph, CompGraph), "expect CompGraph but got {}".format( - comp_graph - ) - if volatile is None: - volatile = False - else: - assert isinstance(volatile, bool) - return ProxySharedNDAndSymbolVar(rst, comp_graph, name, volatile=volatile) - - -def make_immutable(comp_node, comp_graph, value, *, dtype=None, name=None): - """make a graph node containing an immutable tensor from host tensor value - - :param dtype: required data type; if not None, the data would be converted - to that type; otherwise - """ - - comp_node = _detail.as_comp_node(comp_node) - assert isinstance( - comp_graph, _detail.CompGraph - ), "expect CompGraph but got {!r}".format(comp_graph) - - config = _detail.make_opr_config(name, comp_node) - return _helper.cvt_opr_result( - _detail._make_immutable(comp_graph, value, dtype, config) - ) - - -def make_arg( - comp_node, - comp_graph, - *, - dtype=np.float32, - shape=None, - name=None, - value=None, - enable_static_infer=True -): - """make an argument to be passed to compiled function during runtime; - - :type shape: None or tuple of int - :param shape: expected tensor shape to be used for shape inferring; actual - tesor shape could be different - :type name: str - :param name: name of the generated var node - :type value: None or ndarray-compatible - :param value: initial value used for static inference; if not given, static - infer would be deferred to first graph execution - :param enable_static_infer: whether to enable static inference for this var - """ - comp_node = _detail.as_comp_node(comp_node) - host_val = mgb._HostSharedND(comp_node, dtype) - - if value is not None: - value = np.ascontiguousarray(value, dtype=dtype) - if shape is None: - shape = value.shape - else: - assert shape == value.shape - if shape is not None: - host_val._resize(shape) - - if value is not None: - host_val.set_value(value) - - return _helper.cvt_opr_result( - ProxySharedNDAndSymbolVar( - host_val, comp_graph, name, enable_static_infer=enable_static_infer - ) - ) - - -def comp_graph(*, extra_opts=None, check_env_var=True): - """allocate a new computing graph - - :param extra_opts: extra options to be set; would be updated (modified - inplace) from ``MGB_COMP_GRAPH_OPT`` environment var. See - :func:`.set_comp_graph_option` for list of supported options. - :type extra_opts: dict - :param check_env_var: whether to check environment vars - :type check_env_var: bool - - :return: the comp graph object - :rtype: :class:`.CompGraph` - """ - cg = _detail.CompGraph() - if extra_opts is None: - extra_opts = {} - if check_env_var: - setting = os.getenv("MGB_COMP_GRAPH_OPT") - if setting: - for item in setting.split(";"): - k, v = item.split("=", 1) - extra_opts.setdefault(k, v) - get_logger().warning( - "set comp graph option from env: {}".format(extra_opts) - ) - user_data = os.getenv("MGB_COMP_GRAPH_USER_DATA") - if user_data: - storage = cg.user_data - for ud in user_data.split(";"): - k, v = ud.split("=", 1) - storage[k] = eval(v) - _GlobalInfkernFinder.add_graph(cg) - for k, v in extra_opts.items(): - cg.set_option(k, v) - return cg - - -def grad( - target, wrt, warn_mid_wrt=True, use_virtual_grad=None, return_zero_for_nodep=True -): - r"""compute symbolic grad - - :param target: grad target var - :type target: :class:`.SymbolVar` - :param wrt: with respect to which to compute the grad - :type wrt: :class:`.SymbolVar` or Iterable[SymbolVar] - :param warn_mid_wrt: whether to give warning if *wrt* is not endpoint - :type warn_mid_wrt: bool - :param use_virtual_grad: whether to use virtual grad opr, so fwd graph can - be optimized before applying grad; if ``None`` is given, then virtual - grad would be used if ``graph_opt_level >= 2`` - :type use_virtual_grad: :class:`bool` or ``None`` - :param return_zero_for_nodep: if *target* does not depend on *wrt*, set to True to return - a zero-valued `.SymbolVar` rather than ``None``; can't be set to False when using - virtual grad opr. - :type return_zero_for_nodep: bool - :rtype: :class:`.SymbolVar` or None - :return: :math:`\frac{\partial\text{target}}{\partial\text{wrt}}` - """ - if use_virtual_grad is None: - use_virtual_grad = -1 - else: - use_virtual_grad = 1 if use_virtual_grad else 0 - - if isinstance(wrt, SymbolVar): - wrts = [ - wrt, - ] - else: - wrts = wrt - - assert isinstance(wrts, collections.Iterable) - # return a invalid SymbolVar (with nullptr VarNode*) when return_zero_for_nodep is False - # and target doesn't depend on wrt - grads = _detail._grad( - target, wrts, bool(warn_mid_wrt), use_virtual_grad, return_zero_for_nodep - ) - grads = list(grads) - - for i in range(len(grads)): - if not grads[i].valid: - assert ( - not return_zero_for_nodep - ), "invalid grad SymbolVar: target={}, wrt={}".format(target, wrts[i]) - grads[i] = None - - if len(grads) == 1: - grads = grads[0] - - return grads - - -def current_grad_target(comp_graph): - """get current target var to compute grad, used for implementing custom - gradient""" - return _detail._current_grad_target(comp_graph) - - -def add_device_map(map_location): - """add map location while loading models""" - _detail.CompNode.cn_thread_local.__setattr__("map_location", map_location) - - -def del_device_map(): - """delete map location""" - _detail.CompNode.cn_thread_local.__delattr__("map_location") - - -def inter_graph_trans_var(dest_graph, src): - """get the corresponding var of *src* in *dest_graph*; assuming - *dest_graph* is a copy of owner graph of *src*; usually used in callback of - set_grad to get grad of vars in loop - - :param dest_graph: target computing graph - :type dest_graph: :class:`.CompGraph` - :param src: source var node - :type src: :class:`.SymbolVar` - :return: corresponding var in *dest_graph* - :rtype: :class:`.SymbolVar` - """ - return _detail._inter_graph_trans_var(dest_graph, src) - - -def get_graph_optimizer_replaced_var(src): - """get optimized var corresponding to given var; usually used in callback - of set_grad to get grad w.r.t. some var - - :param src: source var node - :type src: :class:`.SymbolVar` - :rtype: :class:`.SymbolVar` - """ - return _detail._get_graph_optimizer_replaced_var(src) - - -CompGraphSerializationResult = collections.namedtuple( - "CompGraphSerializationResult", - [ - "nr_opr", - "tot_bytes", - "tensor_value_bytes", - "content_hash", - "inputs", - "outputs", - "params", - ], -) - - -def serialize_comp_graph_to_file( - fpath, - output_vars, - *, - keep_var_name=1, - keep_param_name=False, - keep_opr_priority=False, - tensor_value_dumper=None, - output_strip_info=False, - append=False, - format=None, - **kwargs -): - """serialize this computing graph and write result to a file. Note: - ``kwargs`` exists for backward compatibility; there is no additional - arguments. - - :parma fpath: path for the output file - :type fpath: ``str`` - :param output_vars: output variables that need to be retrieved when - deserializing - - .. note:: - - The underlying C++ API only accepts a var list. If a dict is given, - the vars would be renamed to given names. - - :type output_vars: dict(name => :class:`.SymbolVar`), or a list of vars - :param keep_var_name: level for keeping variable names: - - * 0: none of the names are kept - * 1: keep names of output vars - * 2: keep names of all (output and internal) vars - :param keep_param_name: whether to keep param names, so param values can be - easily manipulated after loading model - :param keep_opr_priority: whether to keep priority setting for operators - :param tensor_value_dumper: a callable to dump tensor values; it should - only write the tensor value without layout information. It would be - given a :class:`.TensorValueDumperContext` object as its sole argument. - :param output_strip_info: if set to True, then a json file containing - information for code strip would be written to ``fpath+'.json'`` - :param append: whether to open output file in append mode - :return: an instance of namedtuple :class:`CompGraphSerializationResult`, - whose fields are: - - * ``nr_opr`` number of operators dumped - * ``tot_bytes`` total bytes for the whole graph - * ``tensor_value_bytes`` bytes consumed for dumping tensor values - * ``inputs`` names of input tensors - * ``params`` list of names of dumped params - * ``outputs`` names of output vars - :param format: serialization format of the resulting model, should be either - "mdl" or "fbs"; none means default. - :type format: ``str`` - """ - - assert isinstance(fpath, str), "bad file path: {!r}".format(fpath) - ov = _detail._VectorSymbolVar() - SUPPORTED_FORMATS = { - # default - None: _detail.GraphDumpFormat_FLATBUFFERS, - "fbs": _detail.GraphDumpFormat_FLATBUFFERS, - } - resolved_fmt = SUPPORTED_FORMATS.get(format, None) - if resolved_fmt is None: - raise ValueError( - "unknown format {} requested, supported ones are {}".format( - format, list(filter(None, SUPPORTED_FORMATS.keys())) - ) - ) - if isinstance(output_vars, dict): - used_vars = set() - for name, var in output_vars.items(): - assert isinstance(var, _detail.SymbolVar), "bad output var: {!r}".format( - var - ) - assert var.id not in used_vars, ( - "var name is associated with a var object, so we can not have " - "two names given to the same var: {}".format(var) - ) - used_vars.add(var.id) - var.rename(name) - ov.push_back(var) - else: - for i in output_vars: - assert isinstance(i, _detail.SymbolVar), "bad output var: {!r}".format(i) - ov.push_back(i) - - if tensor_value_dumper is not None: - assert isinstance(tensor_value_dumper, collections.Callable) - - class Callback(_detail._TensorValueDumperCallback): - def call(self, ctx, *, _f=tensor_value_dumper): - _f(ctx) - - tensor_value_dumper = Callback() - - # for backward compatibility - mangle_opr_name = kwargs.pop("mangle_opr_name", ov) - if mangle_opr_name is not ov: - get_logger().warning("mangle_opr_name is deprecated; use keep_var_name instead") - keep_var_name = 1 if mangle_opr_name else 2 - mangle_param_name = kwargs.pop("mangle_param_name", ov) - assert ( - not kwargs - ), "extra kwargs provided to serialize_comp_graph_to_file: {}".format(kwargs) - - if mangle_param_name is not ov: - get_logger().warning( - "mangle_param_name is deprecated; use keep_param_name instead" - ) - keep_param_name = not mangle_param_name - - inputs = _detail._VectorString() - outputs = _detail._VectorString() - params = _detail._VectorString() - stat = _detail._VectorSizeT() - - _detail._serialize_comp_graph_to_file( - fpath, - append, - resolved_fmt, - ov, - keep_var_name, - keep_param_name, - keep_opr_priority, - tensor_value_dumper, - stat, - inputs, - outputs, - params, - ) - - dump_ret = CompGraphSerializationResult( - *stat, list(inputs), list(outputs), list(params) - ) - - if output_strip_info: - with open(fpath + ".json", "w") as fout: - strip_info = _detail._get_info_for_strip(ov) - strip_info_dict = json.loads(strip_info) - strip_info_dict["hash"] = dump_ret.content_hash - json.dump(strip_info_dict, fout) - - return dump_ret - - -CompGraphLoadResult = collections.namedtuple( - "CompGraphLoadResult", ["graph", "output_vars_dict", "output_vars_list"] -) - - -def load_comp_graph_from_file( - fpath, *, comp_node_mapper=None, tensor_value_loader=None -): - """Load a serialized computing graph from file. - - :parma fpath: Path for the output file - :type fpath: ``str`` - :param comp_node_mapper: A callable to modify comp node locator, takes old - locator as argument and returns new locator. - :type comp_node_mapper: Callable[[str], str] - :param tensor_value_loader: A callable to load tensor values. It should - read the tensor value with the given shape and dtype and return it as - NumPy ndarray. It would be given a :class:`.TensorValueLoaderContext` - object as its sole argument. - :type tensor_value_loader: Callable[[TensorValueLoaderContext], numpy.ndarray] - :return: An instance of namedtuple :class:`CompGraphLoadResult`, - whose fields are: - - * ``graph`` loaded CompGraph - * ``output_vars_dict`` A Python dict, mapping name to output SymbolVar - * ``output_vars_list`` A Python list, containing output vars in the - order passed to serialize_comp_graph_to_file - """ - assert isinstance(fpath, str), "bad file path: {!r}".format(fpath) - - if comp_node_mapper is not None: - assert isinstance(comp_node_mapper, collections.Callable) - - class Callback(_detail._CompNodeMapperCallback): - def call(self, desc, *, _f=comp_node_mapper): - return _f(desc) - - comp_node_mapper = Callback() - if tensor_value_loader is not None: - assert isinstance(tensor_value_loader, collections.Callable) - - class Callback(_detail._TensorValueLoaderCallback): - def call(self, ctx, *, _f=tensor_value_loader): - return _f(ctx) - - tensor_value_loader = Callback() - output_vars_map = _detail._VectorPairStringSymbolVar() - output_vars_list = _detail._VectorSymbolVar() - cg = _detail._load_comp_graph_from_file( - fpath, comp_node_mapper, tensor_value_loader, output_vars_map, output_vars_list - ) - return CompGraphLoadResult(cg, dict(list(output_vars_map)), list(output_vars_list)) - - -def optimize_for_inference( - output_vars, - *, - f16_io_f32_comp=False, - f16_io_comp=False, - use_nhwcd4=False, - fuse_conv_bias_nonlinearity=False, - use_nchw32=False, - fuse_conv_bias_with_z=False, - use_nchw4=False, - use_nchw88=False, - use_nchw44=False, - use_nchw44_dot=False, - use_chwn4=False -): - """optimize computing graph for inference - - This applies a predefined set of optimization passes. Refer to the mnist - sdk example and C++ code for fine-grained control. - - :param output_vars: output symvars - :type output_vars: list of :class:`.SymbolVar` - :param f16_io_f32_comp: whether to use float16 for I/O between oprs and use - float32 as internal computation precision. Note the output var would be - changed to float16 - :param f16_io_comp: whether to use float16 for both I/O and computation - precision - :param use_nhwcd4: whether to use NHWCD4 data format. This is faster on some - OpenCL devices - :param fuse_conv_bias_nonlinearity: whether to fuse conv+bias+nonlinearty - into one opr. This is supported only in NHWCD4 format. - :param use_nchw4: whether to use NCHW4 tensor format. - :param use_nchw88: whether to use NCHW88 tensor format. This maybe faster some - times. - :param use_nchw44: whether to use NCHW44 tensor format. This maybe faster some - times. - :param use_nchw44_dot: whether to use NCHW44_DOT tensor format. This format is - optimized for inference in armv8.2 - :param use_nchw32: whether to use NCHW32 tensor format. Mainly used for - nvidia tensorcore. - :param use_chwn4: whether to use CHWN4 tensor format. Mainly used for - nvidia tensorcore. - - - :return: list of transformed vars corresponding to given output vars - """ - - assert isinstance(output_vars, (list, tuple)) - opt = _detail._OptimizeForInferenceOptions() - settings = locals() - for i in [ - "f16_io_f32_comp", - "f16_io_comp", - "fuse_conv_bias_nonlinearity", - "fuse_conv_bias_with_z", - ]: - if settings[i]: - getattr(opt, "enable_{}".format(i))() - - layout_tranform = None - for k, v in { - "use_nchw4": "nchw4", - "use_nhwcd4": "nhwcd4", - "use_nchw32": "nchw32", - "use_nchw88": "nchw88", - "use_nchw44": "nchw44", - "use_nchw44_dot": "nchw44_dot", - "use_chwn4": "chwn4", - }.items(): - if settings[k]: - assert ( - not layout_tranform - ), "Only one layout transform supported, both {} and {}".format( - layout_tranform, k - ) - getattr(opt, "enable_{}".format(v))() - layout_tranform = k - - vec = _detail._VectorSymbolVar() - for i in output_vars: - assert isinstance(i, _detail.SymbolVar), "bad var: {}".format(i) - vec.push_back(i) - return list(_detail._optimize_for_inference(vec, opt)) - - -def get_opr_fp_graph_exec(comp_graph, output_vars): - """get opr footprint and graph exec info - - This function will recompile the compute graph, the AsyncExecutable compiled - before will be invalid. - - :param comp_graph: ComputingGraph - :param output_vars: list of :class:'.SymbolVar' - """ - assert isinstance(output_vars, (list, tuple)) - vec = _detail._VectorSymbolVar() - for i in output_vars: - assert isinstance(i, _detail.SymbolVar), "bad var: {}".format(i) - vec.push_back(i) - return json.loads(_detail._get_opr_fp_graph_exec(comp_graph, output_vars)) - - -def to_mgb_supported_dtype(dtype_): - """get the dtype supported by megbrain nearest to given dtype""" - if ( - dtype.is_lowbit(dtype_) - or dtype.is_quantize(dtype_) - or dtype.is_bfloat16(dtype_) - ): - return dtype_ - return _detail._to_mgb_supported_dtype(dtype_) - - -def return_free_memory(): - """return free memory chunks on all devices. - - This function will try it best to free all consecutive free chunks back to - operating system, small pieces may not be returned. - - Please notice that this function will not move any memory in-use. - """ - _detail.CompNode._try_coalesce_all_free_memory() diff --git a/python_module/megengine/_internal/_timed_func_fork_exec_entry.py b/python_module/megengine/_internal/_timed_func_fork_exec_entry.py deleted file mode 100644 index 50492ec1..00000000 --- a/python_module/megengine/_internal/_timed_func_fork_exec_entry.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -import argparse -import os -import sys - -import megengine._internal.mgb as _mgb - -try: - from setproctitle import setproctitle -except ImportError: - setproctitle = None - - -def main(): - parser = argparse.ArgumentParser( - description="entry point for fork-exec callback in TimedFuncInvoker;" - " this file should not be used directly by normal user." - ) - parser.add_argument("user_data") - args = parser.parse_args() - - if setproctitle: - setproctitle("megbrain:timed_func_exec:ppid={}".format(os.getppid())) - _mgb._timed_func_exec_cb(args.user_data) - raise SystemError("_timed_func_exec_cb returned") - - -if __name__ == "__main__": - main() diff --git a/python_module/megengine/_internal/comp_graph_tools.py b/python_module/megengine/_internal/comp_graph_tools.py deleted file mode 100644 index 5777d7d0..00000000 --- a/python_module/megengine/_internal/comp_graph_tools.py +++ /dev/null @@ -1,274 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -"""tools for graph manipulation""" - -import collections - -from . import mgb as _mgb - - -def get_dep_vars(var, var_type=None): - """return :class:`.SymbolVar` of type ``var_type`` that input ``var`` - depands on. If ``var_type`` is None, return all types. - - :type var: an instance or iterable of :class:`.SymbolVar` - :type var_type: ``str`` or an iterable of ``str`` - "rtype: list of :class:`.SymbolVar` - """ - outputs = [] - memo = set() - - if isinstance(var, _mgb.SymbolVar): - var = [var] - - if isinstance(var_type, str): - var_type = [var_type] - - q = list(var) - while q: - v = q.pop() - if v in memo: - continue - memo.add(v) - q.extend(get_inputs(v)) - if var_type is not None: - if get_type(v) in var_type: - outputs.append(v) - else: - outputs.append(v) - - return outputs - - -def get_inputs(var): - """get the inputs of owner opr of a variable - - :type var: :class:`.SymbolVar` - :rtype: list of :class:`.SymbolVar` - """ - assert isinstance(var, _mgb.SymbolVar) - return _mgb._get_owner_opr_inputs(var) - - -def get_type(var): - """get the type of owner opr of a variable - - :type var: :class:`.SymbolVar` - :rtype: ``str`` - """ - assert isinstance(var, _mgb.SymbolVar) - return _mgb._get_owner_opr_type(var) - - -def get_opr_type(opr): - """get the type of a opr - - :type var: :class:`.Operator` - :rtype: ``str`` - """ - assert isinstance(opr, _mgb.Operator) - return _mgb._get_opr_type(opr) - - -def graph_traversal(outputs): - """helper function to traverse the computing graph and reeturn enough useful information - - :param outputs: model outputs - :type outputs: :class:`.Symbolvar` - :return: tuple (map_oprs, map_vars, var2oprs, opr2receivers, indegree2opr, opr2indegree) - WHERE - map_oprs is dict from opr_id to actual opr - map_vars is dict from var_id to actual var - var2oprs is dict from var to dest oprs along with index - opr2receivers is dict from current opr to next opr - indegree2opr is dict from in_degree to opr in computing graph - opr2indegree is dict from opr in computing graph to in_degree - - (indegree2opr, opr2indegree) are only used in topological sort in get_oprs_seq function - """ - # meta information for comp graph - map_oprs = collections.defaultdict(set) - map_vars = collections.defaultdict(set) - - var2oprs = collections.defaultdict(list) - opr2receivers = collections.defaultdict(list) - - queue = list(map(lambda x: x.owner_opr, outputs)) - visited = set(map(lambda x: x.id, queue)) - - # iterate through whole comp_graph, fill in meta information - indegree2opr = collections.defaultdict(set) - opr2indegree = {} - - idx = 0 - while idx < len(queue): - cur_opr = queue[idx] - map_oprs[cur_opr.id] = cur_opr - - idx += 1 - - indegree = 0 - for var_idx, var in enumerate(cur_opr.inputs): - map_vars[var.id] = var - var2oprs[var.id].append((cur_opr.id, var_idx)) - - pre_opr = var.owner_opr - - if pre_opr.id not in visited: - visited.add(pre_opr.id) - queue.append(pre_opr) - - indegree += 1 - opr2receivers[pre_opr.id].append(cur_opr.id) - - indegree2opr[indegree].add(cur_opr.id) - opr2indegree[cur_opr.id] = indegree - - return map_oprs, map_vars, var2oprs, opr2receivers, indegree2opr, opr2indegree - - -def get_oprs_seq(outputs, prune_reshape=False): - """get oprs in some topological order for a dumped model - - :param outputs: model outputs - :param prune_reshape: whether to prune the operators useless during inference - :return: opr list with some correct execution order - """ - - def topological_sort(map_oprs, opr2receivers, indegree2opr, opr2indegree): - # generate an execution order with topological sort algorithm - oprs_seq = [] - nr_remain = len(map_oprs) - while indegree2opr[0]: - opr_id = indegree2opr[0].pop() - opr = map_oprs[opr_id] - nr_remain -= 1 - - # skip const value generation operator - if get_opr_type(opr) != "ImmutableTensor": - oprs_seq.append(opr) - - for post_id in opr2receivers[opr_id]: - indegree = opr2indegree[post_id] - indegree2opr[indegree].remove(post_id) - - indegree -= 1 - indegree2opr[indegree].add(post_id) - opr2indegree[post_id] = indegree - - assert nr_remain == 0, "there are {} remaining nodes; cyclic graph?".format( - nr_remain - ) - return oprs_seq - - # reshape op definition: reshape(input_tensor, dest_shape) -> output_tensor - # when inferencing, shape of output_tensor is already known, so one can prune some operators related to dest_shape in the loaded graph - def prune_reshape_oprs(outputs, oprs_seq, var2oprs): - def iterative_pruning(cur_opr, post_opr, marked_opr_ids): - useless = True - for oup in cur_opr.outputs: - if "workspace" not in oup.name: - var_idx = post_opr.inputs.index(oup) - var2oprs[oup.id].remove((post_opr.id, var_idx)) - useless = useless and (len(var2oprs[oup.id]) == 0) - - if useless: - marked_opr_ids.append(cur_opr.id) - - for inp in cur_opr.inputs: - iterative_pruning(inp.owner_opr, cur_opr, marked_opr_ids) - - reshape_vars = get_dep_vars(outputs, "Reshape") - reshape_oprs = [var.owner_opr for var in reshape_vars] - - marked_opr_ids = [] - for reshape_opr in reshape_oprs: - iterative_pruning( - reshape_opr.inputs[1].owner_opr, reshape_opr, marked_opr_ids - ) - - # filter out all marked oprs - return list(filter(lambda x: x.id not in marked_opr_ids, oprs_seq)) - - map_oprs, _, var2oprs, opr2receivers, indegree2opr, opr2indegree = graph_traversal( - outputs - ) - oprs_seq = topological_sort(map_oprs, opr2receivers, indegree2opr, opr2indegree) - if prune_reshape is True: - oprs_seq = prune_reshape_oprs(outputs, oprs_seq, var2oprs.copy()) - return oprs_seq - - -def replace_vars(dst, varmap): - """replace vars in the graph - - :param dst: target vars representing the graph - :type dst: list of :class:`.SymbolVar` - :param varmap: the map that specifies how to replace the vars - :type varmap: dict that maps from src var to dst var - - :return: new vars that correspond to ``dst`` with all the dependencies - replaced - :rtype: list of :class:`.SymbolVar` - """ - dst_vec = _mgb._VectorSymbolVar() - repl_src_vec = _mgb._VectorSymbolVar() - repl_dst_vec = _mgb._VectorSymbolVar() - for i in dst: - assert isinstance(i, _mgb.SymbolVar) - dst_vec.push_back(i) - - for i, j in getattr(varmap, "items", lambda: varmap)(): - assert isinstance(i, _mgb.SymbolVar) - assert isinstance(j, _mgb.SymbolVar) - repl_src_vec.push_back(i) - repl_dst_vec.push_back(j) - - return _mgb._replace_vars(repl_src_vec, repl_dst_vec, dst_vec) - - -def replace_oprs(dst, oprmap): - """Replace operators in the graph. Roughly equivalent to - - :param dst: target vars representing the graph - :type dst: list of :class:`.SymbolVar` - :param oprmap: the map that specifies how to replace the operators - :type oprmap: dict that maps from src operator to dst operator - - :return: new vars that correspond to ``dst`` with all the dependencies - replaced - :rtype: list of :class:`.SymbolVar` - """ - dst_vec = _mgb._VectorSymbolVar() - repl_src_vec = _mgb._VectorOperator() - repl_dst_vec = _mgb._VectorOperator() - for i in dst: - assert isinstance(i, _mgb.SymbolVar) - dst_vec.push_back(i) - - for i, j in getattr(oprmap, "items", lambda: oprmap)(): - assert isinstance(i, _mgb.Operator) - assert isinstance(j, _mgb.Operator) - repl_src_vec.push_back(i) - repl_dst_vec.push_back(j) - - return _mgb._replace_oprs(repl_src_vec, repl_dst_vec, dst_vec) - - -def set_priority_to_id(dest_vars): - """For all oprs in the subgraph constructed by dest_vars - set its priority to id if its original priority is zero - :param dest_vars: target vars representing the graph - """ - dest_vec = _mgb._VectorSymbolVar() - for i in dest_vars: - assert isinstance(i, _mgb.SymbolVar) - dest_vec.push_back(i) - _mgb._set_priority_to_id(dest_vec) diff --git a/python_module/megengine/_internal/config.py b/python_module/megengine/_internal/config.py deleted file mode 100644 index 3bac8ab5..00000000 --- a/python_module/megengine/_internal/config.py +++ /dev/null @@ -1,439 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -import collections -import os - -from . import mgb as _mgb - -_default_device_type = "CUDA" - - -def set_device_map(logical_dev, physical_dev, device_type=None): - """map from *logical_dev* to *physical_dev* for furture comp node - loading - - example:: - - set_device_map(0, 2, 'CPU') # cpu0 -> cpu2 - set_device_map('gpu3', 'gpu0') # gpu0 -> gpu0 - - :param device_type: specify the device type if devices are given by - integers; if devices are given by integers and ``device_type`` is not - given, the default value ``'CUDA'`` would be used. Possible values are - ``'CUDA'`` and ``'CPU'``. - """ - - if device_type is None: - device_type = _default_device_type - - if device_type == "CUDA": - xpu = "gpu" - else: - assert device_type == "CPU" - xpu = "cpu" - - def rmxpu(v): - if isinstance(v, str): - assert v.startswith(xpu) or v.startswith("xpu"), ( - "bad comp node in set_device_map: " - "device_type={} comp_node={}".format(device_type, v) - ) - return v[3:] - return v - - logical_dev, physical_dev = map(rmxpu, [logical_dev, physical_dev]) - _mgb.CompNode._set_device_map(device_type, int(logical_dev), int(physical_dev)) - - -def set_default_device(physical_dev, device_type=None): - """set physcal device for xpux - - when *device_type* is None and *physical_dev* starts with *gpu* or *cpu*, - the default device type would be modified accordingly for future calls to - :func:`set_device_map` when remapping device number. - """ - global _default_device_type - if ( - device_type is None - and isinstance(physical_dev, str) - and not physical_dev.isdigit() - and not physical_dev.startswith("xpu") - ): - t = physical_dev[:3] - if t == "gpu": - _default_device_type = "CUDA" - else: - assert t == "cpu", "bad physical_dev: {}".format(physical_dev) - _default_device_type = "CPU" - set_default_device_type(_default_device_type) - device_type = _default_device_type - set_device_map(-1, physical_dev, device_type) - - -def set_default_device_type(device_type): - """set device type for xpu""" - global _default_device_type - device_type = device_type.upper() - _mgb.CompNode._set_unspec_device_type(device_type) - _default_device_type = device_type - - -def set_fork_cuda_warning_flag(flag): - """set warning to be printed at fork if cuda has been initialized - - :type flag: int - :param flag: controls how the warning should be printed: - - * 0: disable warning - * 1: print warning to log - * 2: print warning to log and raise exception - """ - _mgb._config.set_fork_cuda_warning_flag(int(flag)) - - -def get_device_count(device_type="xpu", warn=True): - """get number of devices installed on this system - - :param device_type: device type, one of 'xpu', 'gpu' or 'cpu' - :type device_type: str - """ - return _mgb.CompNode._get_device_count(device_type.upper(), warn) - - -def parse_locator(device_name: str) -> tuple: - """get the tensor locator expression by device name. - - :param device_name: device name, like 'cpu0', 'gpu1' and 'xpux' - :type device_name: str - - :return: (device_type, dev_num, stream_num) - """ - return _mgb.CompNode._parse_locator(device_name) - - -def set_mem_reserve_size(size): - """set memory reserve size: - - * If *size* is greater than 1, it is the absolute amount of memory to - be reserved in MB; - * If *size* is in the range (0, 1), it is the ratio of total memory; - * If *size* is 0, memory reservation and pre-allocation would be - disabled; - * If *size* is -1, disable custom memory allocator and use cuda APIs - directly. - """ - _mgb._config.set_mem_reserve_size(float(size)) - - -def set_comp_graph_option(comp_graph, name, val): - """set computing graph option and return its old value - :type comp_graph: :class:`.CompGraph` - :param comp_graph: the computing graph whose option should be modified - :type name: str - :param name: option name - Currently supported options are: - - * "no_profiling_on_shape_change": bool; - When execution strategy is set to profiling, always use the - initial profile result and do not re-run profiling even if input - shape changes. - * "seq_opt.enable_mem_plan_opt": bool - * "seq_opt.enable_mem_reuse_alloc": bool - * "seq_opt.enable_seq_comp_node_opt": bool - * "force_dynamic_alloc": bool - * "var_sanity_check_first_run": bool - * "enable_sublinear_memory_opt": bool - * "enable_memory_swap": bool; whether to enable memory swap; it - usually performs worse than sublinear memory - * "enable_var_mem_defragment": bool - * "allocate_static_mem_after_graph_compile": bool - * "enable_grad_var_static_reshape": bool: - If set to ``True``, dynamically-shaped gradients whose original - shape is statically inferrable would be reshaped, so static - shape inference can continue - * "async_exec_level": int - - * ``0``: do not dispatch asynchronously - * ``1``: async dispatch if there are more than 1 cuda comp - nodes - * mask ``0b10``: async for comp nodes with unlimited queue - (e.g. CPU comp nodes) - * mask ``0b100``: async for even one comp node - * "log_level": int - - * ``0``: no log info for graph construction/compiling - * ``1``: static memory allocation status, - WorkspaceLimitGetter summary, and optimizer summary - * ``2``: optimizer details and duplicated operators tha are - removed - * "graph_opt.jit": whether to enable JIT - * "graph_opt.tensorrt": whether to enable fine-grained automatic - replacement for TensorRT operators - * "graph_opt.android_nn": whether to enable fine-grained automatic - replacement for Android NN operators - * "graph_opt_level": int - - * ``0``: disable - * ``1``: level-1: inplace arith transformations during graph - construction - * ``2``: (default) level-2: level-1, plus global optimization - before graph compiling - * ``3``: also enable JIT - :param val: new option value - :return: old option value - """ - if name == "log_static_mem_alloc": - name = "log_level" - if name == "enable_async_exec": - name = "async_exec_level" - return _mgb._config.set_comp_graph_option(comp_graph, name, int(val)) - - -def comp_graph_is_eager(comp_graph): - return _mgb._config.comp_graph_is_eager(comp_graph) - - -def add_extra_vardep(var, dep): - """add *dep* as an extra dependency of *var*, so if *var* is required to - compute the final output when compiling a comp graph, *dep* would also be - included in the computing sequence. Note that the order computing of these - two vars is not guaranteed. - """ - assert isinstance(var, _mgb.SymbolVar) and isinstance(dep, _mgb.SymbolVar) - assert var.owner_graph == dep.owner_graph - return _mgb._config.add_extra_vardep(var, dep) - - -class _GraphPropertyBase: - """helper class for implementing operator property setter context managers""" - - _cur_graph = None - - _graph2stack = None - """class attribute that maintains mapping from graph to property stack; - should be defined by child classes""" - - __prop_setup__ = None - """overwritten by subclass to setup property""" - - __prop_clear__ = None - """overwritten by subclass to clear property""" - - def __init__(self, comp_graph, prop): - """:param comp_graph: computing graph, or None to not set this - property""" - if comp_graph is not None: - assert isinstance( - comp_graph, _mgb.CompGraph - ), "invalid comp graph: {!r}".format(comp_graph) - self._cur_graph = comp_graph - self._graph2stack.setdefault(comp_graph, []).append(prop) - - def __setup(self, prop): - self.__prop_setup__(self._cur_graph, prop) - - def __clear(self): - self.__prop_clear__(self._cur_graph) - - def __enter__(self): - if self._cur_graph is None: - return - - stack = self._graph2stack[self._cur_graph] - if len(stack) > 1: - # clear nested property - self.__clear() - self.__setup(stack[-1]) - - def __exit__(self, exc_type, exc_value, exc_traceback): - if self._cur_graph is None: - return - - stack = self._graph2stack[self._cur_graph] - self.__clear() - stack.pop() - if stack: - # restore nested property - self.__setup(stack[-1]) - else: - del self._graph2stack[self._cur_graph] - - -class exc_opr_tracker_scope(_GraphPropertyBase): - """context manager for associating an object with all operators created - within this context; so when an exception is raised, information about the - corresponding operator could be retrieved from - :attr:`.MegBrainError.tracker` - - :param comp_graph: the computing graph where the operators should be tracked - :type comp_graph: :class:`.CompGraph` - :param tracker: an arbitrary python object to track the operators - """ - - _graph2stack = {} - - def __init__(self, comp_graph, tracker): - assert ( - tracker is not None - ), "bad args for exc_opr_tracker_scope: {!r} {!r}".format(comp_graph, tracker) - super().__init__(comp_graph, tracker) - - __prop_setup__ = staticmethod(_mgb._config.begin_set_exc_opr_tracker) - __prop_clear__ = staticmethod(_mgb._config.end_set_exc_opr_tracker) - - -class opr_priority_scope(_GraphPropertyBase): - """context manager for setting priority for all operators created in this - context - - :param comp_graph: the computing graph for which operator priority should - be set - :type comp_graph: :class:`.CompGraph` - :param priority: operator priority. Smaller number means higher priority. - Default value is 0. Grad operator would use negative priority by - default. - """ - - _graph2stack = {} - - LOWEST_PRIORITY = 2 ** 31 - 1 - """lowest prority (i.e. max possible value)""" - - HIGHEST_PRIORITY = -LOWEST_PRIORITY - """highest prority (i.e. min possible value)""" - - def __init__(self, comp_graph, priority): - super().__init__(comp_graph, int(priority)) - - __prop_setup__ = staticmethod(_mgb._config.begin_set_opr_priority) - __prop_clear__ = staticmethod(_mgb._config.end_set_opr_priority) - - -OprTrackerResult = collections.namedtuple( - "OprTrackerResult", ["msg", "tracker", "grad_tracker"] -) - - -def get_opr_tracker(cg, var_id): - """get the tracking object associated with the owner operator of a var - - :param cg: the computing graph - :param var_id: id of the var whose owner opr tracker should be found - - :return: if no var is found, ``None`` is returned; otherwise return an - :class:`OprTrackerResult` object - """ - assert isinstance(cg, _mgb.CompGraph) - ret = _mgb._config.get_opr_tracker(cg, int(var_id)) - if ret is None: - return - return OprTrackerResult(*ret) - - -def set_opr_sublinear_memory_endpoint(var): - """set the owner operator of a symvar to be endpoint of sublinear memory - optimizer - - - :type var: :class:`.SymbolVar` - """ - _mgb._config.set_opr_sublinear_memory_endpoint(var) - - -def max_size_t(): - """get max value of size_t type on local architecture""" - return _mgb.max_size_t() - - -def is_cuda_ctx_set(): - """return whether current thread has an active cuda driver context""" - return _mgb._config.is_cuda_ctx_set() - - -def get_include_path(): - """get include path for building megbrain extensions""" - return os.path.join(os.path.realpath(os.path.dirname(__file__)), "include") - - -def get_cuda_gencode(only_cap=False): - """get -gencode options to be passed to nvcc for compiling on local - machine - - :param only_cap: if True, return only a list of cuda compute capability - strings (like ``['35', '52']`` ) - """ - ret = _mgb._config.get_cuda_gencode().split() - if not only_cap: - ret = " ".join(map("-gencode arch=compute_{0},code=sm_{0}".format, ret)) - return ret - - -def get_cuda_lib_path(): - """get the cuda lib64 path by locating nvcc - """ - return _mgb._config.get_cuda_lib_path() - - -def get_cuda_include_path(): - """get the cuda include path by locating nvcc, including - parent path and `parent path`/include - """ - return _mgb._config.get_cuda_include_path() - - -def get_cuda_version(): - """get runtime cuda version - """ - return _mgb._config.get_cuda_version() - - -def is_local_cuda_env_ok(): - """check whether local cuda environment ok by locating nvcc - """ - return _mgb._config.is_local_cuda_env_ok() - - -def is_compiled_with_cuda(): - """whether cuda is enabled at compile time""" - return _mgb._config.is_compiled_with_cuda() - - -def load_opr_library(path): - """Load an external operator library. This essentially sets megbrain - symbols as public and load the library. - - :param path: path to the shared object; if it is None, then only megbrain - symbols are made public. - """ - _mgb._config.load_opr_library( - os.path.realpath(os.path.join(os.path.dirname(__file__), "_mgb.so")), path - ) - - -def dump_registered_oprs(): - """ - get all registered oprs, return dict(id, name) - """ - return dict(_mgb._config.dump_registered_oprs()) - - -def create_mm_server(server_addr, port): - """ - create mm server with server address - throw exception if server_addr is already used - """ - return _mgb._config.create_mm_server(server_addr, port) - - -def group_barrier(server_addr, port, size, rank): - """ - block until all ranks reach this barrier - """ - return _mgb._config.group_barrier(server_addr, port, size, rank) diff --git a/python_module/megengine/_internal/craniotome.py b/python_module/megengine/_internal/craniotome.py deleted file mode 100644 index 3a1e6d50..00000000 --- a/python_module/megengine/_internal/craniotome.py +++ /dev/null @@ -1,432 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -"""used for creating a megbrain operator from python""" - -import copy -import itertools -from abc import ABCMeta, abstractmethod, abstractproperty - -from . import helper as _helper -from . import mgb as _mgb - - -class _CraniotomeBaseMeta(ABCMeta): - _base_created = False - - def __init__(cls, name, bases, member_dict): - if _CraniotomeBaseMeta._base_created: - assert "__init__" not in member_dict, ( - "Craniotome operators should not overwrite __init__ method; " - "use setup() instead." - ) - forbidden = set( - k for k in dir(CraniotomeBase) if k[0] == "_" and k[1] != "_" - ) - forbidden.add("get_io_vars") - check_key = member_dict.get("__check_key__", True) - whitelist = ["__classcell__"] - for k in member_dict.keys(): - assert k not in forbidden, "{} could not be overwritten".format(k) - if ( - check_key - and k.startswith("__") - and k.endswith("__") - and k not in whitelist - and not hasattr(CraniotomeBase, k) - ): - raise KeyError( - "name {} in class {} does not exist in the baseclass".format( - k, name - ) - ) - else: - _CraniotomeBaseMeta._base_created = True - super().__init__(name, bases, member_dict) - - -class CraniotomeBase(_mgb.CraniotomeDesc, metaclass=_CraniotomeBaseMeta): - """base class used for extending megbrain core operators in python - - Note: all names starting and ending with two underscores in the subclasses - would be checked and KeyError would be raised if the name does not exist in - the base class. This behavor can be disabled by setting ``__check_key__`` - to ``False`` (see the testcase for more details) - """ - - # methods and attributes to be overwritten by subclasses - - __expand_single_outputs__ = True - """if :attr:`__nr_outputs__` is 1, whether to return a single - :class:`.SymbolVar` instead of a tuple in :meth:`make`""" - - __is_dynamic_output_shape__ = False - """whether output shape could not be inferred from input shape. If value of - this attribute is ``False``, :meth:`infer_shape` must be implemented. If - this attribute is ``True`` but the operator has no inputs, then - :meth:`infer_shape` would also be called to infer output shape before - operator execution. - """ - - __disable_sys_mem_alloc__ = False - """whether to disable system memory allocator. This is used when - :attr:`__is_dynamic_output_shape__` is ``False`` but the output memory - should not be managed by megbrain system (so it can be forwarded from - external buffer)""" - - __allow_duplicate__ = True - """whether this operator can be duplicated (e.g. used in sublinear - memory)""" - - __allow_empty_out__ = False - """whether empty output shape is allowed; if it is set as ``False``, then - an exception would be raised if output var is empty to prevent erroneously - forgetting initializing output vars""" - - @abstractproperty - def __nr_inputs__(self): - """number of input vars""" - - @abstractproperty - def __nr_outputs__(self): - """number of output vars""" - - @abstractmethod - def execute(self, inputs, outputs): - """execute the operator, read values from *inputs* by calling - :meth:`.CompGraphCallbackValueProxy.get_value` and write results into - *outputs* by calling :meth:`.SharedND.set_value` - - :param inputs: values for each input var - :type inputs: tuple of :class:`.CompGraphCallbackValueProxy` - :param outputs: values for each output var - :type outputs: tuple of :class:`.SharedND` - """ - - def setup(self): - """overwritten by subclass to accept kwargs passed to :meth:`make` to - setup the operator""" - - def infer_shape(self, inp_shapes): - """infer output shape from input shapes - - :type inp_shapes: tuple of tuple of ints - :param inp_shapes: input shapes for each input var - :rtype: tuple of tuple of ints - :return: output shapes for each output var - """ - raise NotImplementedError( - "{}: infer_shape() not implemented; for operators with dynamic " - "output shape, __is_dynamic_output_shape__ should be set to True".format( - self - ) - ) - - def grad(self, wrt_idx, inputs, outputs, out_grad): - """compute symbolic gradient; should be overwritten by differentiable - subclasses - - :type wrt_idx: int - :param wrt_idx: the input var with respect to which the gradient should - be computed; please also see the notes below - :type inputs: tuple of :class:`.SymbolVar` - :param inputs: input symbol vars - :type outputs: tuple of :class:`.SymbolVar` - :param outputs: output symbol vars - :type out_grad: tuple of (:class:`.SymbolVar` or None) - :param out_grad: gradients of loss with respect to each output var - - .. note:: - - In case when loss does not depend on some var (i.e. zero grad), - the corresponding value in *out_grad* would be ``None``. It is - guaranteed that at least one element in *out_grad* is not - ``None``. - - .. note:: - - This function can return either of the following: - - 1. Gradient of the input specified by ``wrt_idx`` - 2. A list containing gradients of all inputs. In this case, - ``wrt_idx`` can be ignored. - - And the so called gradient can be either one of: - - 1. A :class:`.SymbolVar` representing the symbolic gradient - value - 2. ``0`` representing zero gradient - """ - raise NotImplementedError("grad for {} not implemented".format(self)) - - def init_output_dtype(self, input_dtypes): - """infer output dtypes from input dtypes; return None to use default - infer function in megbrain. - - .. note:: - This method must be implemented if there is no input var - - :param input_dtypes: input dtypes - :type input_dtypes: list of :class:`numpy.dtype` - :rtype: None or list of :class:`numpy.dtype`-compatible - """ - - def get_serialize_params(self): - """get params for megbrain graph serialization. This function should - return a list or tuple, containing one or two elements: the first - element must be a string, representing the name passed to - ``opr_loader_maker`` during deserializing; the second element, if - exists, must be convertible to ``bytes`` and is used for dumping any - extra opr params, which can be retrieved by ``load_buf_with_len`` - during deserializing. - """ - raise NotImplementedError( - "get_serialize_params() for {} not implemented".format(self) - ) - - def copy(self): - """copy this craniotome descriptor; the default implementation creates - a new object, and copies object ``__dict__``""" - ret = type(self)() - d0 = self.__dict__.copy() - d0.pop("this") - ret.__dict__.update(copy.deepcopy(d0)) - return ret - - def on_graph_compiled(self, used_outputs): - """a callback that would be invoked when the graph is compiled; it - would always have a matching :meth:`on_compiled_func_deleted` call - - :param used_outputs: indices of outputs that are needed for the - computation - :type used_outputs: ``tuple of int`` - """ - - def on_compiled_func_deleted(self): - """a callback that would be invoked when the compiled function is - destructed; it would always have a matching :meth:`on_graph_compiled` - call""" - - def get_io_vars(self): - """get input vars, comp order dep vars and output vars - - :return: a dict with keys ``'input'``, ``'output'`` and - ``'comp_order'`` that maps to corresponding list of vars - """ - all_vars = list(self._get_all_io_vars()) - nr_inp = self.__nr_inputs__ - nr_out = self.__nr_outputs__ - nr_comp_order = self._get_nr_dev_comp_order_deps() - s0 = nr_inp + nr_comp_order - return dict( - input=all_vars[:nr_inp], - comp_order=all_vars[nr_inp:s0], - output=all_vars[s0:], - ) - - @property - def owner_opr_id(self): - """ID of the operator that owns this descriptor""" - return self._get_opr_id() - - @property - def comp_node(self): - """comp node on which this operator runs""" - return self._get_comp_node() - - # below are methods that should not be changed - - def _hash(self): - return int(hash(self)) % (1 << 64) - - def _setup_self(self, dst): - dst.append(self) - - def _is_same(self, rhs): - return bool(self == rhs) - - def _node_flag(self): - return ( - (int(bool(self.__is_dynamic_output_shape__)) << 0) - | (int(not self.__allow_duplicate__) << 1) - | (int(bool(self.__allow_empty_out__)) << 2) - | (int(bool(self.__disable_sys_mem_alloc__)) << 3) - ) - - def _get_opr_type_name(self): - return str(self.__class__.__name__) - - def _get_nr_outputs(self): - return int(self.__nr_outputs__) - - def _execute(self, inputs, outputs): - inputs = tuple(inputs) - outputs = tuple(outputs) - if not self.__is_dynamic_output_shape__: - out_shapes = [i.shape for i in outputs] - self.execute(inputs, outputs) - if not self.__is_dynamic_output_shape__: - new_shapes = [i.shape for i in outputs] - assert ( - out_shapes == new_shapes - ), "output shape changed after executing {}: before={} after={}".format( - self, out_shapes, new_shapes - ) - - def _infer_shape(self, inp_shapes): - inp_shapes = tuple(tuple(map(int, i)) for i in inp_shapes) - oshp_get = self.infer_shape(inp_shapes) - assert ( - len(oshp_get) == self.__nr_outputs__ - ), "{}: expect {} outputs; got {}(val: {}) from infer_shape".format( - self, self.__nr_outputs__, len(oshp_get), oshp_get - ) - return _helper.cvt_to_vector_of_shape(oshp_get) - - def _grad(self, wrt_idx, inputs, outputs, out_grad): - og = [] - for i in out_grad: - if i.valid: - og.append(i) - else: - og.append(None) - rst = self.grad(int(wrt_idx), tuple(inputs), tuple(outputs), tuple(og)) - if not isinstance(rst, (list, tuple)): - rst = [rst] - else: - assert len(rst) == len( - inputs - ), "{}: opr has {} inputs but {} grads are returned".format( - self, len(inputs), len(rst) - ) - - for i in range(len(rst)): - cur = rst[i] - if cur is 0: - rst[i] = _mgb.SymbolVar() - else: - assert isinstance(cur, _mgb.SymbolVar), ( - "{}: invalid grad result; it should be either " - "0 or a SymbolVar, got {!r} instead".format(self, cur) - ) - return rst - - def _get_nr_dev_comp_order_deps(self): - return 0 - - def _init_output_dtype(self, input_dtypes, ret): - get = self.init_output_dtype(input_dtypes) - if get is not None: - assert isinstance(ret, (list, tuple)) and len(get) == len(ret) - ret[:] = get - return True - assert self.__nr_inputs__, ( - "{}: init_output_dtype must be implemented " - "if there is no input var".format(self) - ) - return False - - def _setup_serialize_params(self, output): - val = list(self.get_serialize_params()) - assert len(val) in [1, 2] - name = val[0] - assert isinstance(name, str) - output.append(name) - if len(val) == 2: - output.append(bytes(val[1])) - - def _copy(self): - ret = self.copy() - assert type(ret) is type( - self - ), "copy() returned different type: src={} copied={}".format( - type(self), type(ret) - ) - assert ret is not self - ret.__disown__() - self._set_copy_result(ret) - - def _on_graph_compile_or_func_del(self, used_outputs): - if used_outputs: - self.on_graph_compiled(used_outputs) - else: - self.on_compiled_func_deleted() - - def __repr__(self): - return "cranoiotome:{}".format(self.__class__.__name__) - - @classmethod - def make( - cls, - *inputs, - comp_graph=None, - name=None, - comp_node=None, - config=None, - dev_comp_order_deps=[], - **kwargs - ): - """apply this operator on some input vars and return corresponding - output vars - - :type inputs: tuple of :class:`.SymbolVar` - :param inputs: input symvars; immediate values could also be accepted, - as long as there is symvar to infer comp node and comp graph - :param comp_graph: if there is no input vars, *comp_graph* must be - provided to specify which computing graph to insert this operator - :param dev_comp_order_deps: vars that must have been computed - before executing this operator - :param kwargs: extra keyword arguments to be passed to :meth:`setup` of - this class - :param name: name of the resulting operator - :rtype: tuple of :class:`.SymbolVar` - :return: output symvars - """ - - if not inputs and not dev_comp_order_deps: - assert isinstance( - comp_graph, _mgb.CompGraph - ), "{}: comp_graph must be given if no inputs provided".format(self) - - desc = cls() - desc.setup(**kwargs) - assert ( - len(inputs) == desc.__nr_inputs__ - ), "{}: expected {} inputs, got {}".format( - desc, desc.__nr_inputs__, len(inputs) - ) - - config = _helper.gen_config(name, comp_node, config) - - # get inp_vec - inp_vec = _mgb._VectorSymbolVar() - for i in _helper.canonize_input_vars( - itertools.chain(inputs, dev_comp_order_deps), - comp_graph=comp_graph, - config=config, - ): - inp_vec.push_back(i) - desc._get_nr_dev_comp_order_deps = lambda *, val=len(dev_comp_order_deps): val - - if comp_graph is not None: - desc._get_comp_graph = lambda: comp_graph - expand_single_outputs = desc.__expand_single_outputs__ - desc.__disown__() - rst = _mgb.make_opr_from_craniotome_desc(desc, inp_vec, config) - if expand_single_outputs and len(rst) == 1: - return rst[0] - return tuple(rst) - - -def make_opr(cls): - """decorator used to wrap a :class:`.CraniotomeBase` subclass and return - its :meth:`~.CraniotomeBase.make` method - """ - assert issubclass(cls, CraniotomeBase) - return cls.make diff --git a/python_module/megengine/_internal/dtype.py b/python_module/megengine/_internal/dtype.py deleted file mode 100644 index 6bb32f86..00000000 --- a/python_module/megengine/_internal/dtype.py +++ /dev/null @@ -1,286 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -import collections -from typing import Union - -import numpy as np - -from .mgb import bfloat16, intb1, intb2, intb4 - -_QuantDtypeMetadata = collections.namedtuple( - "QuantDtypeMetadata", ["name", "np_dtype_str", "is_unsigned", "qmin", "qmax",] -) - -_metadata_dict = { - "quint8": _QuantDtypeMetadata("Quantized8Asymm", "uint8", True, 0, 255), - "qint8": _QuantDtypeMetadata("QuantizedS8", "int8", False, -128, 127), - "quint4": _QuantDtypeMetadata("Quantized4Asymm", "uint8", True, 0, 15), - "qint4": _QuantDtypeMetadata("QuantizedS4", "int8", False, -8, 7), - "qint32": _QuantDtypeMetadata( - "QuantizedS32", "int32", False, -(2 ** 31), 2 ** 31 - 1, - ), - # NOTE: int2 is not supported for model dump yet - "quint2": _QuantDtypeMetadata(None, "uint8", True, 0, 3), - "qint2": _QuantDtypeMetadata(None, "int8", False, -2, 1), -} - - -def is_quantize(dtype): - return ( - hasattr(dtype, "metadata") - and dtype.metadata is not None - and "mgb_dtype" in dtype.metadata - ) - - -def is_lowbit(dtype): - return (dtype is intb1) or (dtype is intb2) or (dtype is intb4) - - -def is_bfloat16(dtype): - return dtype is bfloat16 - - -def get_scale(dtype): - assert is_quantize(dtype) - return dtype.metadata["mgb_dtype"]["scale"] - - -def get_zero_point(dtype): - assert is_quantize(dtype) - metadata = dtype.metadata["mgb_dtype"] - assert metadata["name"] in ("Quantized8Asymm", "Quantized4Asymm") - return metadata["zero_point"] - - -def _check_zero_point(zp: int, dtype_str: str): - qmin = _metadata_dict[dtype_str].qmin - qmax = _metadata_dict[dtype_str].qmax - if zp < qmin or zp > qmax: - raise ValueError( - "zero_point should be within [{}, {}] for {}".format(qmin, qmax, dtype_str) - ) - - -def get_quantized_dtype(dtype_str: str, scale: float, zp: Union[int, None]): - r""" - Get quantized dtype with metadata attribute according to _metadata_dict. - - Note that unsigned dtype must have ``zero_point`` and signed dtype must - not have ``zero_point``, to be consitent with tensor generated by calling - compiled function from `CompGraph.compile(inputs, outspec)`. - - :param dtype: a string indicating which dtype to return - :param scale: a number for scale to store in dtype's metadata - :param zp: a number for zero_point to store in dtype's metadata - """ - metadata = _metadata_dict[dtype_str] - np_dtype_str = metadata.np_dtype_str - is_unsigned = metadata.is_unsigned - if is_unsigned: - if zp is None or int(zp) != zp: - raise ValueError("zero_point should be an integer") - zp = int(zp) - _check_zero_point(zp, dtype_str) - return np.dtype( - np_dtype_str, - metadata={ - "mgb_dtype": { - "name": metadata.name, - "scale": float(scale), - "zero_point": zp, - } - }, - ) - else: - return np.dtype( - np_dtype_str, - metadata={"mgb_dtype": {"name": metadata.name, "scale": float(scale)}}, - ) - - -def quint8(scale, zero_point): - """ - Consturct a quantized unsigned int8 data type with ``scale`` (float) and - ``zero_point`` (uint8). The real value represented by a quint8 data type is - float_val = scale * (uint8_val - zero_point) - """ - return get_quantized_dtype("quint8", scale, zero_point) - - -def qint8(scale): - """ - Construct a quantized int8 data type with ``scale`` (float). The real value - represented by a qint8 data type is float_val = scale * int8_val - """ - return get_quantized_dtype("qint8", scale, None) - - -def qint32(scale): - """ - Construct a quantized int32 data type with ``scale`` (float). The real value - represented by a qint32 data type is float_val = scale * int32_val - """ - return get_quantized_dtype("qint32", scale, None) - - -def quint4(scale, zero_point): - """ - Consturct a quantized unsigned int4 data type with ``scale`` (float) and - ``zero_point`` (uint8). The real value represented by a quint4 data type is - float_val = scale * (uint4_val - zero_point) - """ - return get_quantized_dtype("quint4", scale, zero_point) - - -def qint4(scale): - """ - Construct a quantized int4 data type with ``scale`` (float). The real value - represented by a qint4 data type is float_val = scale * int4_val - """ - return get_quantized_dtype("qint4", scale, None) - - -def _convert_to_quantized_dtype(arr: np.ndarray, dtype: np.dtype, dtype_str: str): - metadata = _metadata_dict[dtype_str] - arr_metadata = dtype.metadata["mgb_dtype"] - if not isinstance(arr, np.ndarray): - raise ValueError("arr parameter should be instance of np.ndarray") - if not is_quantize(dtype) or arr_metadata["name"] != metadata.name: - raise ValueError("dtype parameter should be a {} dtype".format(dtype_str)) - is_unsigned = metadata.is_unsigned - if is_unsigned: - scale, zp = ( - arr_metadata["scale"], - arr_metadata["zero_point"], - ) - return ( - (np.round(arr / scale) + zp) - .clip(metadata.qmin, metadata.qmax) - .astype(dtype) - ) - else: - # don't trick to combine with is_unsigned, seeing ``get_quantized_dtype`` - scale = arr_metadata["scale"] - return np.round(arr / scale).clip(metadata.qmin, metadata.qmax).astype(dtype) - - -def _convert_from_quantized_dtype(arr: np.ndarray, dtype_str: str): - metadata = _metadata_dict[dtype_str] - arr_metadata = arr.dtype.metadata["mgb_dtype"] - if not isinstance(arr, np.ndarray): - raise ValueError("arr parameter should be instance of np.ndarray") - if not is_quantize(arr.dtype) or arr_metadata["name"] != metadata.name: - raise ValueError("arr's dtype should be a {} dtype".format(dtype_str)) - is_unsigned = metadata.is_unsigned - if is_unsigned: - scale, zp = ( - arr_metadata["scale"], - arr_metadata["zero_point"], - ) - return (arr.astype(np.float32) - zp) * scale - else: - # don't trick to combine with is_unsigned, seeing ``get_quantized_dtype`` - scale = arr_metadata["scale"] - return (arr.astype(np.float32)) * scale - - -def convert_to_quint8(arr: np.ndarray, q: np.dtype): - """ - Quantize a float NumPy ndarray into a quint8 one with specified params. - - :param arr: Input ndarray. - :param q: Target data type, should be a quint8. - """ - return _convert_to_quantized_dtype(arr, q, "quint8") - - -def convert_from_quint8(arr: np.ndarray): - """ - Dequantize a quint8 NumPy ndarray into a float one. - - :param arr: Input ndarray. - """ - return _convert_from_quantized_dtype(arr, "quint8") - - -def convert_to_qint8(arr: np.ndarray, q: np.dtype): - """ - Quantize a float NumPy ndarray into a qint8 one with specified params. - - :param arr: Input ndarray. - :param q: Target data type, should be a qint8. - """ - return _convert_to_quantized_dtype(arr, q, "qint8") - - -def convert_from_qint8(arr: np.ndarray): - """ - Dequantize a qint8 NumPy ndarray into a float one. - - :param arr: Input ndarray. - """ - return _convert_from_quantized_dtype(arr, "qint8") - - -def convert_to_qint32(arr: np.ndarray, q: np.dtype): - """ - Quantize a float NumPy ndarray into a qint32 one with specified params. - - :param arr: Input ndarray. - :param q: Target data type, should be a qint8. - """ - return _convert_to_quantized_dtype(arr, q, "qint32") - - -def convert_from_qint32(arr): - """ - Dequantize a qint32 NumPy ndarray into a float one. - - :param arr: Input ndarray. - """ - return _convert_from_quantized_dtype(arr, "qint32") - - -def convert_to_quint4(arr: np.ndarray, q: np.dtype): - """ - Quantize a float NumPy ndarray into a quint4 one with specified params. - - :param arr: Input ndarray. - :param q: Target data type, should be a quint4. - """ - return _convert_to_quantized_dtype(arr, q, "quint4") - - -def convert_from_quint4(arr: np.ndarray): - """ - Dequantize a quint4 NumPy ndarray into a float one. - - :param arr: Input ndarray. - """ - return _convert_from_quantized_dtype(arr, "quint4") - - -def convert_to_qint4(arr: np.ndarray, q: np.dtype): - """ - Quantize a float NumPy ndarray into a qint4 one with specified params. - - :param arr: Input ndarray. - :param q: Target data type, should be a qint4. - """ - return _convert_to_quantized_dtype(arr, q, "qint4") - - -def convert_from_qint4(arr: np.ndarray): - """ - Dequantize a qint4 NumPy ndarray into a float one. - - :param arr: Input ndarray. - """ - return _convert_from_quantized_dtype(arr, "qint4") diff --git a/python_module/megengine/_internal/enum36.py b/python_module/megengine/_internal/enum36.py deleted file mode 100644 index 929eecf7..00000000 --- a/python_module/megengine/_internal/enum36.py +++ /dev/null @@ -1,947 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright [2001] [Cython] -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# --------------------------------------------------------------------- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# -# This file has been modified by Megvii ("Megvii Modifications"). -# All Megvii Modifications are Copyright (C) 2014-2020 Megvii Inc. All rights reserved. -# ---------------------------------------------------------------------- - -import sys -from functools import reduce -from operator import or_ as _or_ -from types import DynamicClassAttribute, MappingProxyType - -# try _collections first to reduce startup cost -try: - from _collections import OrderedDict -except ImportError: - from collections import OrderedDict - - -__all__ = [ - "EnumMeta", - "Enum", - "IntEnum", - "Flag", - "IntFlag", - "auto", - "unique", -] - - -def _is_descriptor(obj): - """Returns True if obj is a descriptor, False otherwise.""" - return ( - hasattr(obj, "__get__") or hasattr(obj, "__set__") or hasattr(obj, "__delete__") - ) - - -def _is_dunder(name): - """Returns True if a __dunder__ name, False otherwise.""" - return ( - name[:2] == name[-2:] == "__" - and name[2:3] != "_" - and name[-3:-2] != "_" - and len(name) > 4 - ) - - -def _is_sunder(name): - """Returns True if a _sunder_ name, False otherwise.""" - return ( - name[0] == name[-1] == "_" - and name[1:2] != "_" - and name[-2:-1] != "_" - and len(name) > 2 - ) - - -def _make_class_unpicklable(cls): - """Make the given class un-picklable.""" - - def _break_on_call_reduce(self, proto): - raise TypeError("%r cannot be pickled" % self) - - cls.__reduce_ex__ = _break_on_call_reduce - cls.__module__ = "" - - -_auto_null = object() - - -class auto: - """ - Instances are replaced with an appropriate value in Enum class suites. - """ - - value = _auto_null - - -class _EnumDict(dict): - """Track enum member order and ensure member names are not reused. - - EnumMeta will use the names found in self._member_names as the - enumeration member names. - - """ - - def __init__(self): - super().__init__() - self._member_names = [] - self._last_values = [] - - def __setitem__(self, key, value): - """Changes anything not dundered or not a descriptor. - - If an enum member name is used twice, an error is raised; duplicate - values are not checked for. - - Single underscore (sunder) names are reserved. - - """ - if _is_sunder(key): - if key not in ( - "_order_", - "_create_pseudo_member_", - "_generate_next_value_", - "_missing_", - ): - raise ValueError("_names_ are reserved for future Enum use") - if key == "_generate_next_value_": - setattr(self, "_generate_next_value", value) - elif _is_dunder(key): - if key == "__order__": - key = "_order_" - elif key in self._member_names: - # descriptor overwriting an enum? - raise TypeError("Attempted to reuse key: %r" % key) - elif not _is_descriptor(value): - if key in self: - # enum overwriting a descriptor? - raise TypeError("%r already defined as: %r" % (key, self[key])) - if isinstance(value, auto): - if value.value == _auto_null: - value.value = self._generate_next_value( - key, 1, len(self._member_names), self._last_values[:] - ) - value = value.value - self._member_names.append(key) - self._last_values.append(value) - super().__setitem__(key, value) - - -# Dummy value for Enum as EnumMeta explicitly checks for it, but of course -# until EnumMeta finishes running the first time the Enum class doesn't exist. -# This is also why there are checks in EnumMeta like `if Enum is not None` -Enum = None - - -class EnumMeta(type): - """Metaclass for Enum""" - - @classmethod - def __prepare__(metacls, cls, bases): - # create the namespace dict - enum_dict = _EnumDict() - # inherit previous flags and _generate_next_value_ function - member_type, first_enum = metacls._get_mixins_(bases) - if first_enum is not None: - enum_dict["_generate_next_value_"] = getattr( - first_enum, "_generate_next_value_", None - ) - return enum_dict - - def __new__(metacls, cls, bases, classdict): - # an Enum class is final once enumeration items have been defined; it - # cannot be mixed with other types (int, float, etc.) if it has an - # inherited __new__ unless a new __new__ is defined (or the resulting - # class will fail). - member_type, first_enum = metacls._get_mixins_(bases) - __new__, save_new, use_args = metacls._find_new_( - classdict, member_type, first_enum - ) - - # save enum items into separate mapping so they don't get baked into - # the new class - enum_members = {k: classdict[k] for k in classdict._member_names} - for name in classdict._member_names: - del classdict[name] - - # adjust the sunders - _order_ = classdict.pop("_order_", None) - - # check for illegal enum names (any others?) - invalid_names = set(enum_members) & { - "mro", - } - if invalid_names: - raise ValueError( - "Invalid enum member name: {0}".format(",".join(invalid_names)) - ) - - # create a default docstring if one has not been provided - if "__doc__" not in classdict: - classdict["__doc__"] = "An enumeration." - - # create our new Enum type - enum_class = super().__new__(metacls, cls, bases, classdict) - enum_class._member_names_ = [] # names in definition order - enum_class._member_map_ = OrderedDict() # name->value map - enum_class._member_type_ = member_type - - # save attributes from super classes so we know if we can take - # the shortcut of storing members in the class dict - base_attributes = {a for b in enum_class.mro() for a in b.__dict__} - - # Reverse value->name map for hashable values. - enum_class._value2member_map_ = {} - - # If a custom type is mixed into the Enum, and it does not know how - # to pickle itself, pickle.dumps will succeed but pickle.loads will - # fail. Rather than have the error show up later and possibly far - # from the source, sabotage the pickle protocol for this class so - # that pickle.dumps also fails. - # - # However, if the new class implements its own __reduce_ex__, do not - # sabotage -- it's on them to make sure it works correctly. We use - # __reduce_ex__ instead of any of the others as it is preferred by - # pickle over __reduce__, and it handles all pickle protocols. - if "__reduce_ex__" not in classdict: - if member_type is not object: - methods = ( - "__getnewargs_ex__", - "__getnewargs__", - "__reduce_ex__", - "__reduce__", - ) - if not any(m in member_type.__dict__ for m in methods): - _make_class_unpicklable(enum_class) - - # instantiate them, checking for duplicates as we go - # we instantiate first instead of checking for duplicates first in case - # a custom __new__ is doing something funky with the values -- such as - # auto-numbering ;) - for member_name in classdict._member_names: - value = enum_members[member_name] - if not isinstance(value, tuple): - args = (value,) - else: - args = value - if member_type is tuple: # special case for tuple enums - args = (args,) # wrap it one more time - if not use_args: - enum_member = __new__(enum_class) - if not hasattr(enum_member, "_value_"): - enum_member._value_ = value - else: - enum_member = __new__(enum_class, *args) - if not hasattr(enum_member, "_value_"): - if member_type is object: - enum_member._value_ = value - else: - enum_member._value_ = member_type(*args) - value = enum_member._value_ - enum_member._name_ = member_name - enum_member.__objclass__ = enum_class - enum_member.__init__(*args) - # If another member with the same value was already defined, the - # new member becomes an alias to the existing one. - for name, canonical_member in enum_class._member_map_.items(): - if canonical_member._value_ == enum_member._value_: - enum_member = canonical_member - break - else: - # Aliases don't appear in member names (only in __members__). - enum_class._member_names_.append(member_name) - # performance boost for any member that would not shadow - # a DynamicClassAttribute - if member_name not in base_attributes: - setattr(enum_class, member_name, enum_member) - # now add to _member_map_ - enum_class._member_map_[member_name] = enum_member - try: - # This may fail if value is not hashable. We can't add the value - # to the map, and by-value lookups for this value will be - # linear. - enum_class._value2member_map_[value] = enum_member - except TypeError: - pass - - # double check that repr and friends are not the mixin's or various - # things break (such as pickle) - for name in ("__repr__", "__str__", "__format__", "__reduce_ex__"): - class_method = getattr(enum_class, name) - obj_method = getattr(member_type, name, None) - enum_method = getattr(first_enum, name, None) - if obj_method is not None and obj_method is class_method: - setattr(enum_class, name, enum_method) - - # replace any other __new__ with our own (as long as Enum is not None, - # anyway) -- again, this is to support pickle - if Enum is not None: - # if the user defined their own __new__, save it before it gets - # clobbered in case they subclass later - if save_new: - enum_class.__new_member__ = __new__ - enum_class.__new__ = Enum.__new__ - - # py3 support for definition order (helps keep py2/py3 code in sync) - if _order_ is not None: - if isinstance(_order_, str): - _order_ = _order_.replace(",", " ").split() - if _order_ != enum_class._member_names_: - raise TypeError("member order does not match _order_") - - return enum_class - - def __bool__(self): - """ - classes/types should always be True. - """ - return True - - def __call__( - cls, value, names=None, *, module=None, qualname=None, type=None, start=1 - ): - """Either returns an existing member, or creates a new enum class. - - This method is used both when an enum class is given a value to match - to an enumeration member (i.e. Color(3)) and for the functional API - (i.e. Color = Enum('Color', names='RED GREEN BLUE')). - - When used for the functional API: - - `value` will be the name of the new class. - - `names` should be either a string of white-space/comma delimited names - (values will start at `start`), or an iterator/mapping of name, value pairs. - - `module` should be set to the module this class is being created in; - if it is not set, an attempt to find that module will be made, but if - it fails the class will not be picklable. - - `qualname` should be set to the actual location this class can be found - at in its module; by default it is set to the global scope. If this is - not correct, unpickling will fail in some circumstances. - - `type`, if set, will be mixed in as the first base class. - - """ - if names is None: # simple value lookup - return cls.__new__(cls, value) - # otherwise, functional API: we're creating a new Enum type - return cls._create_( - value, names, module=module, qualname=qualname, type=type, start=start - ) - - def __contains__(cls, member): - return isinstance(member, cls) and member._name_ in cls._member_map_ - - def __delattr__(cls, attr): - # nicer error message when someone tries to delete an attribute - # (see issue19025). - if attr in cls._member_map_: - raise AttributeError("%s: cannot delete Enum member." % cls.__name__) - super().__delattr__(attr) - - def __dir__(self): - return [ - "__class__", - "__doc__", - "__members__", - "__module__", - ] + self._member_names_ - - def __getattr__(cls, name): - """Return the enum member matching `name` - - We use __getattr__ instead of descriptors or inserting into the enum - class' __dict__ in order to support `name` and `value` being both - properties for enum members (which live in the class' __dict__) and - enum members themselves. - - """ - if _is_dunder(name): - raise AttributeError(name) - try: - return cls._member_map_[name] - except KeyError: - raise AttributeError(name) from None - - def __getitem__(cls, name): - return cls._member_map_[name] - - def __iter__(cls): - return (cls._member_map_[name] for name in cls._member_names_) - - def __len__(cls): - return len(cls._member_names_) - - @property - def __members__(cls): - """Returns a mapping of member name->value. - - This mapping lists all enum members, including aliases. Note that this - is a read-only view of the internal mapping. - - """ - return MappingProxyType(cls._member_map_) - - def __repr__(cls): - return "" % cls.__name__ - - def __reversed__(cls): - return (cls._member_map_[name] for name in reversed(cls._member_names_)) - - def __setattr__(cls, name, value): - """Block attempts to reassign Enum members. - - A simple assignment to the class namespace only changes one of the - several possible ways to get an Enum member from the Enum class, - resulting in an inconsistent Enumeration. - - """ - member_map = cls.__dict__.get("_member_map_", {}) - if name in member_map: - raise AttributeError("Cannot reassign members.") - super().__setattr__(name, value) - - def _create_( - cls, class_name, names=None, *, module=None, qualname=None, type=None, start=1 - ): - """Convenience method to create a new Enum class. - - `names` can be: - - * A string containing member names, separated either with spaces or - commas. Values are incremented by 1 from `start`. - * An iterable of member names. Values are incremented by 1 from `start`. - * An iterable of (member name, value) pairs. - * A mapping of member name -> value pairs. - - """ - metacls = cls.__class__ - bases = (cls,) if type is None else (type, cls) - _, first_enum = cls._get_mixins_(bases) - classdict = metacls.__prepare__(class_name, bases) - - # special processing needed for names? - if isinstance(names, str): - names = names.replace(",", " ").split() - if isinstance(names, (tuple, list)) and names and isinstance(names[0], str): - original_names, names = names, [] - last_values = [] - for count, name in enumerate(original_names): - value = first_enum._generate_next_value_( - name, start, count, last_values[:] - ) - last_values.append(value) - names.append((name, value)) - - # Here, names is either an iterable of (name, value) or a mapping. - for item in names: - if isinstance(item, str): - member_name, member_value = item, names[item] - else: - member_name, member_value = item - classdict[member_name] = member_value - enum_class = metacls.__new__(metacls, class_name, bases, classdict) - - # TODO: replace the frame hack if a blessed way to know the calling - # module is ever developed - if module is None: - try: - module = sys._getframe(2).f_globals["__name__"] - except (AttributeError, ValueError) as exc: - pass - if module is None: - _make_class_unpicklable(enum_class) - else: - enum_class.__module__ = module - if qualname is not None: - enum_class.__qualname__ = qualname - - return enum_class - - @staticmethod - def _get_mixins_(bases): - """Returns the type for creating enum members, and the first inherited - enum class. - - bases: the tuple of bases that was given to __new__ - - """ - if not bases: - return object, Enum - - # double check that we are not subclassing a class with existing - # enumeration members; while we're at it, see if any other data - # type has been mixed in so we can use the correct __new__ - member_type = first_enum = None - for base in bases: - if base is not Enum and issubclass(base, Enum) and base._member_names_: - raise TypeError("Cannot extend enumerations") - # base is now the last base in bases - if not issubclass(base, Enum): - raise TypeError( - "new enumerations must be created as " - "`ClassName([mixin_type,] enum_type)`" - ) - - # get correct mix-in type (either mix-in type of Enum subclass, or - # first base if last base is Enum) - if not issubclass(bases[0], Enum): - member_type = bases[0] # first data type - first_enum = bases[-1] # enum type - else: - for base in bases[0].__mro__: - # most common: (IntEnum, int, Enum, object) - # possible: (, , - # , , - # ) - if issubclass(base, Enum): - if first_enum is None: - first_enum = base - else: - if member_type is None: - member_type = base - - return member_type, first_enum - - @staticmethod - def _find_new_(classdict, member_type, first_enum): - """Returns the __new__ to be used for creating the enum members. - - classdict: the class dictionary given to __new__ - member_type: the data type whose __new__ will be used by default - first_enum: enumeration to check for an overriding __new__ - - """ - # now find the correct __new__, checking to see of one was defined - # by the user; also check earlier enum classes in case a __new__ was - # saved as __new_member__ - __new__ = classdict.get("__new__", None) - - # should __new__ be saved as __new_member__ later? - save_new = __new__ is not None - - if __new__ is None: - # check all possibles for __new_member__ before falling back to - # __new__ - for method in ("__new_member__", "__new__"): - for possible in (member_type, first_enum): - target = getattr(possible, method, None) - if target not in { - None, - None.__new__, - object.__new__, - Enum.__new__, - }: - __new__ = target - break - if __new__ is not None: - break - else: - __new__ = object.__new__ - - # if a non-object.__new__ is used then whatever value/tuple was - # assigned to the enum member name will be passed to __new__ and to the - # new enum member's __init__ - if __new__ is object.__new__: - use_args = False - else: - use_args = True - - return __new__, save_new, use_args - - -class Enum(metaclass=EnumMeta): - """Generic enumeration. - - Derive from this class to define new enumerations. - - """ - - def __new__(cls, value): - # all enum instances are actually created during class construction - # without calling this method; this method is called by the metaclass' - # __call__ (i.e. Color(3) ), and by pickle - if type(value) is cls: - # For lookups like Color(Color.RED) - return value - # by-value search for a matching enum member - # see if it's in the reverse mapping (for hashable values) - try: - if value in cls._value2member_map_: - return cls._value2member_map_[value] - except TypeError: - # not there, now do long search -- O(n) behavior - for member in cls._member_map_.values(): - if member._value_ == value: - return member - # still not found -- try _missing_ hook - return cls._missing_(value) - - def _generate_next_value_(name, start, count, last_values): - for last_value in reversed(last_values): - try: - return last_value + 1 - except TypeError: - pass - else: - return start - - @classmethod - def _missing_(cls, value): - raise ValueError("%r is not a valid %s" % (value, cls.__name__)) - - def __repr__(self): - return "<%s.%s: %r>" % (self.__class__.__name__, self._name_, self._value_) - - def __str__(self): - return "%s.%s" % (self.__class__.__name__, self._name_) - - def __dir__(self): - added_behavior = [ - m - for cls in self.__class__.mro() - for m in cls.__dict__ - if m[0] != "_" and m not in self._member_map_ - ] - return ["__class__", "__doc__", "__module__"] + added_behavior - - def __format__(self, format_spec): - # mixed-in Enums should use the mixed-in type's __format__, otherwise - # we can get strange results with the Enum name showing up instead of - # the value - - # pure Enum branch - if self._member_type_ is object: - cls = str - val = str(self) - # mix-in branch - else: - cls = self._member_type_ - val = self._value_ - return cls.__format__(val, format_spec) - - def __hash__(self): - return hash(self._name_) - - def __reduce_ex__(self, proto): - return self.__class__, (self._value_,) - - # DynamicClassAttribute is used to provide access to the `name` and - # `value` properties of enum members while keeping some measure of - # protection from modification, while still allowing for an enumeration - # to have members named `name` and `value`. This works because enumeration - # members are not set directly on the enum class -- __getattr__ is - # used to look them up. - - @DynamicClassAttribute - def name(self): - """The name of the Enum member.""" - return self._name_ - - @DynamicClassAttribute - def value(self): - """The value of the Enum member.""" - return self._value_ - - @classmethod - def _convert(cls, name, module, filter, source=None): - """ - Create a new Enum subclass that replaces a collection of global constants - """ - # convert all constants from source (or module) that pass filter() to - # a new Enum called name, and export the enum and its members back to - # module; - # also, replace the __reduce_ex__ method so unpickling works in - # previous Python versions - module_globals = vars(sys.modules[module]) - if source: - source = vars(source) - else: - source = module_globals - # We use an OrderedDict of sorted source keys so that the - # _value2member_map is populated in the same order every time - # for a consistent reverse mapping of number to name when there - # are multiple names for the same number rather than varying - # between runs due to hash randomization of the module dictionary. - members = [(name, source[name]) for name in source.keys() if filter(name)] - try: - # sort by value - members.sort(key=lambda t: (t[1], t[0])) - except TypeError: - # unless some values aren't comparable, in which case sort by name - members.sort(key=lambda t: t[0]) - cls = cls(name, members, module=module) - cls.__reduce_ex__ = _reduce_ex_by_name - module_globals.update(cls.__members__) - module_globals[name] = cls - return cls - - -class IntEnum(int, Enum): - """Enum where members are also (and must be) ints""" - - -def _reduce_ex_by_name(self, proto): - return self.name - - -class Flag(Enum): - """Support for flags""" - - def _generate_next_value_(name, start, count, last_values): - """ - Generate the next value when not given. - - name: the name of the member - start: the initital start value or None - count: the number of existing members - last_value: the last value assigned or None - """ - if not count: - return start if start is not None else 1 - for last_value in reversed(last_values): - try: - high_bit = _high_bit(last_value) - break - except Exception: - raise TypeError("Invalid Flag value: %r" % last_value) from None - return 2 ** (high_bit + 1) - - @classmethod - def _missing_(cls, value): - original_value = value - if value < 0: - value = ~value - possible_member = cls._create_pseudo_member_(value) - if original_value < 0: - possible_member = ~possible_member - return possible_member - - @classmethod - def _create_pseudo_member_(cls, value): - """ - Create a composite member iff value contains only members. - """ - pseudo_member = cls._value2member_map_.get(value, None) - if pseudo_member is None: - # verify all bits are accounted for - _, extra_flags = _decompose(cls, value) - if extra_flags: - raise ValueError("%r is not a valid %s" % (value, cls.__name__)) - # construct a singleton enum pseudo-member - pseudo_member = object.__new__(cls) - pseudo_member._name_ = None - pseudo_member._value_ = value - # use setdefault in case another thread already created a composite - # with this value - pseudo_member = cls._value2member_map_.setdefault(value, pseudo_member) - return pseudo_member - - def __contains__(self, other): - if not isinstance(other, self.__class__): - return NotImplemented - return other._value_ & self._value_ == other._value_ - - def __repr__(self): - cls = self.__class__ - if self._name_ is not None: - return "<%s.%s: %r>" % (cls.__name__, self._name_, self._value_) - members, uncovered = _decompose(cls, self._value_) - return "<%s.%s: %r>" % ( - cls.__name__, - "|".join([str(m._name_ or m._value_) for m in members]), - self._value_, - ) - - def __str__(self): - cls = self.__class__ - if self._name_ is not None: - return "%s.%s" % (cls.__name__, self._name_) - members, uncovered = _decompose(cls, self._value_) - if len(members) == 1 and members[0]._name_ is None: - return "%s.%r" % (cls.__name__, members[0]._value_) - else: - return "%s.%s" % ( - cls.__name__, - "|".join([str(m._name_ or m._value_) for m in members]), - ) - - def __bool__(self): - return bool(self._value_) - - def __or__(self, other): - if not isinstance(other, self.__class__): - return NotImplemented - return self.__class__(self._value_ | other._value_) - - def __and__(self, other): - if not isinstance(other, self.__class__): - return NotImplemented - return self.__class__(self._value_ & other._value_) - - def __xor__(self, other): - if not isinstance(other, self.__class__): - return NotImplemented - return self.__class__(self._value_ ^ other._value_) - - def __invert__(self): - members, uncovered = _decompose(self.__class__, self._value_) - inverted_members = [ - m - for m in self.__class__ - if m not in members and not m._value_ & self._value_ - ] - inverted = reduce(_or_, inverted_members, self.__class__(0)) - return self.__class__(inverted) - - -class IntFlag(int, Flag): - """Support for integer-based Flags""" - - @classmethod - def _missing_(cls, value): - if not isinstance(value, int): - raise ValueError("%r is not a valid %s" % (value, cls.__name__)) - new_member = cls._create_pseudo_member_(value) - return new_member - - @classmethod - def _create_pseudo_member_(cls, value): - pseudo_member = cls._value2member_map_.get(value, None) - if pseudo_member is None: - need_to_create = [value] - # get unaccounted for bits - _, extra_flags = _decompose(cls, value) - # timer = 10 - while extra_flags: - # timer -= 1 - bit = _high_bit(extra_flags) - flag_value = 2 ** bit - if ( - flag_value not in cls._value2member_map_ - and flag_value not in need_to_create - ): - need_to_create.append(flag_value) - if extra_flags == -flag_value: - extra_flags = 0 - else: - extra_flags ^= flag_value - for value in reversed(need_to_create): - # construct singleton pseudo-members - pseudo_member = int.__new__(cls, value) - pseudo_member._name_ = None - pseudo_member._value_ = value - # use setdefault in case another thread already created a composite - # with this value - pseudo_member = cls._value2member_map_.setdefault(value, pseudo_member) - return pseudo_member - - def __or__(self, other): - if not isinstance(other, (self.__class__, int)): - return NotImplemented - result = self.__class__(self._value_ | self.__class__(other)._value_) - return result - - def __and__(self, other): - if not isinstance(other, (self.__class__, int)): - return NotImplemented - return self.__class__(self._value_ & self.__class__(other)._value_) - - def __xor__(self, other): - if not isinstance(other, (self.__class__, int)): - return NotImplemented - return self.__class__(self._value_ ^ self.__class__(other)._value_) - - __ror__ = __or__ - __rand__ = __and__ - __rxor__ = __xor__ - - def __invert__(self): - result = self.__class__(~self._value_) - return result - - -def _high_bit(value): - """returns index of highest bit, or -1 if value is zero or negative""" - return value.bit_length() - 1 - - -def unique(enumeration): - """Class decorator for enumerations ensuring unique member values.""" - duplicates = [] - for name, member in enumeration.__members__.items(): - if name != member.name: - duplicates.append((name, member.name)) - if duplicates: - alias_details = ", ".join( - ["%s -> %s" % (alias, name) for (alias, name) in duplicates] - ) - raise ValueError( - "duplicate values found in %r: %s" % (enumeration, alias_details) - ) - return enumeration - - -def _decompose(flag, value): - """Extract all members from the value.""" - # _decompose is only called if the value is not named - not_covered = value - negative = value < 0 - # issue29167: wrap accesses to _value2member_map_ in a list to avoid race - # conditions between iterating over it and having more psuedo- - # members added to it - if negative: - # only check for named flags - flags_to_check = [ - (m, v) - for v, m in list(flag._value2member_map_.items()) - if m.name is not None - ] - else: - # check for named flags and powers-of-two flags - flags_to_check = [ - (m, v) - for v, m in list(flag._value2member_map_.items()) - if m.name is not None or _power_of_two(v) - ] - members = [] - for member, member_value in flags_to_check: - if member_value and member_value & value == member_value: - members.append(member) - not_covered &= ~member_value - if not members and value in flag._value2member_map_: - members.append(flag._value2member_map_[value]) - members.sort(key=lambda m: m._value_, reverse=True) - if len(members) > 1 and members[0].value == value: - # we have the breakdown, don't need the value member itself - members.pop(0) - return members, not_covered - - -def _power_of_two(value): - if value < 1: - return False - return value == 2 ** _high_bit(value) diff --git a/python_module/megengine/_internal/exc.py b/python_module/megengine/_internal/exc.py deleted file mode 100644 index 954756b1..00000000 --- a/python_module/megengine/_internal/exc.py +++ /dev/null @@ -1,58 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -"""exception handling""" - -from . import mgb as _mgb - - -class MegBrainError(Exception): - """exception class used by megbrain library""" - - tracker = None - """the tracker setup by :func:`.set_exc_opr_tracker` when the related - operator is created""" - - tracker_grad_orig = None - """if this operator is created by taking gradient, this var would be the - tracker of the operator that causes the grad.""" - - def __init__(self, msg, tracker, tracker_grad_orig): - assert isinstance(msg, str) - super().__init__(msg, tracker, tracker_grad_orig) - self.tracker = tracker - self.tracker_grad_orig = tracker_grad_orig - - @classmethod - def _format_tracker(cls, tracker): - return ("| " + i for i in str(tracker).split("\n")) - - def __str__(self): - lines = [] - lines.extend(self.args[0].split("\n")) - if self.tracker is not None: - lines.append("Exception tracker:") - lines.extend(self._format_tracker(self.tracker)) - if self.tracker_grad_orig is not None: - lines.append( - "Exception caused by taking grad of another operator with tracker:" - ) - lines.extend(self._format_tracker(self.tracker_grad_orig)) - while not lines[-1].strip(): - lines.pop() - for idx, ct in enumerate(lines): - if ct.startswith("bt:"): - lines[idx] = "+ " + lines[idx] - for t in range(idx + 1, len(lines)): - lines[t] = "| " + lines[t] - break - return "\n".join(lines) - - -_mgb._reg_exception_class(MegBrainError) diff --git a/python_module/megengine/_internal/global_init.py b/python_module/megengine/_internal/global_init.py deleted file mode 100644 index 1b4fff87..00000000 --- a/python_module/megengine/_internal/global_init.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -"""global initialization work; classes/functions defined in this module should -not be used by user code""" - -import atexit -import os -import sys -import traceback - -from . import mgb -from .logconf import get_logger -from .persistent_cache import PersistentCacheOnServer - - -class PyStackExtracterImpl(mgb._PyStackExtracter): - def extract(self): - return "".join(traceback.format_stack()[:-1]) - - -mgb._register_logger(get_logger()) -assert sys.executable -mgb._timed_func_set_fork_exec_path( - sys.executable, - os.path.join(os.path.dirname(__file__), "_timed_func_fork_exec_entry.py"), -) - -persistent_cache_impl_ins = PersistentCacheOnServer() -mgb._PersistentCache.reg(persistent_cache_impl_ins) - -PyStackExtracterImplIns = PyStackExtracterImpl() -PyStackExtracterImpl.reg(PyStackExtracterImplIns) - -atexit.register(mgb._mgb_global_finalize) diff --git a/python_module/megengine/_internal/helper.py b/python_module/megengine/_internal/helper.py deleted file mode 100644 index 8fbb974f..00000000 --- a/python_module/megengine/_internal/helper.py +++ /dev/null @@ -1,316 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -import collections - -import numpy as np - -from . import mgb -from .exc import MegBrainError -from .mgb import SharedND, SymbolVar -from .opr_param_defs import OptionalAxisV1 - - -def canonize_reshape(inputs, *, comp_graph, config): - src, tshape = inputs - tshape = cvt_to_shape_desc(tshape, src, comp_graph, config) - return src, tshape - - -def canonize_shape_input(inputs, *, comp_graph, config): - assert isinstance(inputs, (list, tuple)) and len(inputs) == 1 - return [cvt_to_shape_desc(inputs[0], None, comp_graph, config)] - - -def cvt_to_shape_desc(val, inpvar, graph, config): - """convert some python object to a :class:`SymbolVar` that describes tensor - shape - - :param val: the python object to be converted from - :param inpvar, graph, config: provide graph and comp node information; can - be None if not known. Either input or (graph, config) must be provided. - :return: a new var corresponding to *val* - :rtype: :class:`.SymbolVar` - """ - if hasattr(val, "__mgb_symvar__"): - val = val.__mgb_symvar__() - elif hasattr(val, "symvar"): - val = val.symvar - if isinstance(val, SymbolVar): - return val - if not isinstance(val, collections.Iterable): - val = [val] - components = [] - has_sym = False - for i in val: - if hasattr(i, "__mgb_symvar__"): - i = i.__mgb_symvar__() - elif hasattr(i, "symvar"): - i = i.symvar - if isinstance(i, SymbolVar): - has_sym = True - components.append(i) - else: - assert isinstance(i, int), ( - "shape desc could contain either int or SymbolVar, got {}" - " actually".format(repr(i)) - ) - components.append(i) - assert components, "shape desc could not be empty" - - if inpvar is not None: - assert isinstance(inpvar, SymbolVar) - if graph is None: - graph = inpvar.owner_graph - else: - assert graph == inpvar.owner_graph - config = mgb.make_opr_config(comp_node=inpvar.comp_node) - else: - assert isinstance(graph, mgb.CompGraph), "graph must be provided" - assert isinstance(config, mgb.OperatorNodeConfig) - - if not has_sym: - shape = np.ascontiguousarray(components, dtype=np.int32) - assert np.all(shape == components), "failed to convert to shape: {}".format( - components - ) - return mgb._make_immutable(graph, shape, None, config) - - for idx, v in enumerate(components): - if not isinstance(v, SymbolVar): - vi = int(v) - assert vi == v, "could not convert {} to int".format(v) - components[idx] = mgb._make_immutable(graph, vi, None, config) - from . import opr as O - - return O.concat(components, axis=0, config=config) - - -def canonize_input_vars(inputs, *, comp_graph, config): - """convert immediate numbers and SharedND to SymbolVar in inputs; at least - one of the inputs must be SymbolVar, so comp node and comp graph can - beinferred - - :return: list of converted vars - """ - from . import make_immutable - - if ( - isinstance(inputs, (list, tuple)) - and len(inputs) == 1 - and isinstance(inputs[0], (list, tuple)) - ): - # handle the case when a list is passed to a function with - # variable-length argument (e.g. concat has signature concat(*inputs) - # and is called with concat([a, b])) - inputs = inputs[0] - - if isinstance(inputs, SymbolVar): - return [inputs] - - old_inputs = inputs - inputs = [] - get_comp_node = None - need_cvt = False - for i in old_inputs: - if isinstance(i, SymbolVar): - get_comp_node = lambda cn=i.comp_node: cn - if comp_graph is not None: - assert comp_graph == i.owner_graph - else: - comp_graph = i.owner_graph - else: - need_cvt = True - inputs.append(i) - if not need_cvt: - return inputs - - if get_comp_node is None: - - def get_comp_node(): - nonlocal get_comp_node - cn = config.require_comp_node() - get_comp_node = lambda: cn - return cn - - for idx, var in enumerate(inputs): - if not isinstance(var, SymbolVar): - if isinstance(var, SharedND): - var = var.symvar(comp_graph) - elif isinstance(var, mgb.SharedScalar): - var = var._as_sym_var(comp_graph, get_comp_node()) - elif hasattr(var, "__mgb_symvar__"): - try: - cn = get_comp_node() - except MegBrainError: - cn = None - var = var.__mgb_symvar__(comp_graph=comp_graph, comp_node=cn) - elif hasattr(var, "symvar"): - var = var.symvar - else: - var = make_immutable(get_comp_node(), comp_graph, var) - inputs[idx] = var - return inputs - - -def cvt_to_vector_of_shape(shapes): - """convert ``[[int]]`` to nested ``std::vector`` of ``size_t``""" - ret = mgb._VectorTensorShape() - for i in shapes: - val = tuple(i) - assert val and all( - j > 0 and isinstance(j, int) for j in val - ), "something returns bad shape in infer_shape(): {}".format(val) - ret.push_back(val) - return ret - - -def cvt_to_opr_param_def(param, ptype, kwargs): - if param is not None: - if isinstance(param, ptype): - return param - - param = [param] - assert len(param) == len( - ptype.__slots__ - ), "{} needs {} params, but {} are provided".format( - ptype, len(ptype.__slots__), len(param) - ) - return ptype(*param) - - ckw = {} - for i in ptype.__slots__: - val = kwargs.pop(i, ckw) - if val is not ckw: - ckw[i] = val - return ptype(**ckw) - - -def cvt_getitem_to_idx_desc(inpvar, tuple_val, *, allow_newaxis=True): - """convert ``__getitem__`` args to index desc - - :return: ``(new_var, index_desc)`` where new_var is inpvar with - ``np.newaxis`` applied; note that ``index_desc`` can be ``None``. - """ - assert isinstance(inpvar, SymbolVar), "bad input: {!r}".format(inpvar) - if not isinstance(tuple_val, tuple): - tuple_val = (tuple_val,) - - axis_indexer = mgb._VectorAxisIndexer() - - config = mgb.make_opr_config(comp_node=inpvar.comp_node) - graph = inpvar.owner_graph - - def as_symvar(v, *, allow_list=True): - if isinstance(v, SymbolVar): - return v - vi = np.ascontiguousarray(v, dtype=np.int32) - assert np.abs(vi - v).max() == 0, "bad index: {!r}".format(v) - return mgb._make_immutable(graph, vi, None, config) - - def _s(v): # convert slice item - if v is None: - return SymbolVar() - return as_symvar(v, allow_list=False) - - new_axes = [] - cur_axis = -1 - for i_idx, i in enumerate(tuple_val): - cur_axis += 1 - if i is np.newaxis: - if cur_axis >= 0: - new_axes.append(cur_axis) - continue - - if i is Ellipsis: - cur_axis = -1 - for j in tuple_val[:i_idx:-1]: - if j is Ellipsis: - raise IndexError("only one ellipsis is allowed") - if j is np.newaxis: - new_axes.append(cur_axis) - cur_axis -= 1 - continue - - if isinstance(i, slice): - if i.start is None and i.stop is None and i.step is None: - continue - cur = mgb._AxisIndexer.make_interval( - cur_axis, _s(i.start), _s(i.stop), _s(i.step) - ) - else: - cur = mgb._AxisIndexer.make_index(cur_axis, as_symvar(i)) - axis_indexer.push_back(cur) - if new_axes: - if not allow_newaxis: - raise IndexError("newaxis is not allowed here") - inpvar = mgb._Opr.add_axis(inpvar, new_axes, mgb.make_opr_config()) - if axis_indexer.empty(): - axis_indexer = None - return inpvar, axis_indexer - - -def cvt_to_reshape_unspec_axis(unspec_axis, tshape): - assert isinstance(unspec_axis, OptionalAxisV1), repr(unspec_axis) - unspec_axis = unspec_axis.axis - assert abs(unspec_axis) <= OptionalAxisV1.MAX_NDIM - if not isinstance(tshape, SymbolVar): - for idx, val in enumerate(tshape): - if val == -1: - assert ( - unspec_axis == OptionalAxisV1.INVALID_AXIS - ), "multiple unknown dimensions for reshape" - unspec_axis = idx - return OptionalAxisV1(unspec_axis) - - -def gen_config(name, comp_node, config, output_dtype=None): - if config is None: - config = mgb.make_opr_config(name, comp_node, output_dtype) - else: - assert isinstance(config, mgb.OperatorNodeConfig) - assert name is None and comp_node is None - return config - - -def cvt_opr_result(rst, *, explode_single=True): - """:param explode_single: whether to return the content of a single-item - list rather thatn the list itself""" - if not isinstance(rst, mgb.SymbolVar): - assert isinstance(rst, (list, tuple)) - if len(rst) == 1 and explode_single: - return cvt_opr_result(rst[0]) - return tuple(map(cvt_opr_result, rst)) - if not rst.valid: - return None - # TODO Because the __init__ of SwigObject can not be modified to keep the - # reference of graph, we get owner graph explicitly here. The correct - # handling is moving the reference to SwigWrapper, but it is unsupported to - # add a member variable to SwigWrapper, so we should wrap the SymbolVar - # manually in megbrain_wrap.h - rst.owner_graph - - f32 = np.float32 - if not hasattr(cvt_opr_result, "_cvt_to_float32"): - import os - from .logconf import get_logger - - cvt_opr_result._cvt_to_float32 = os.getenv("MGB_ALL_FLOAT32") - if cvt_opr_result._cvt_to_float32: - get_logger().warn( - "\n" - "+=====================================================+\n" - "| MGB_ALL_FLOAT32 is set, so all megbrain opr result |\n" - "| would to converted to float32; this should only be |\n" - "| used for loading old models. |\n" - "+=====================================================+" - ) - if cvt_opr_result._cvt_to_float32 and rst.dtype != f32: - rst = rst.astype(f32) - return rst diff --git a/python_module/megengine/_internal/logconf.py b/python_module/megengine/_internal/logconf.py deleted file mode 100644 index f88c8c08..00000000 --- a/python_module/megengine/_internal/logconf.py +++ /dev/null @@ -1,54 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -import logging -import os - -_replaced_logger = None - - -def get_logger(): - global _replaced_logger - if _replaced_logger is not None: - return _replaced_logger - logger = logging.getLogger("megbrain") - logger.propagate = False - logger.setLevel(logging.INFO) - handler = logging.StreamHandler() - handler.setFormatter(MgbLogFormatter(datefmt="%d %H:%M:%S")) - handler.setLevel(0) - del logger.handlers[:] - logger.addHandler(handler) - _replaced_logger = logger - return logger - - -class MgbLogFormatter(logging.Formatter): - def format(self, record): - date = "\x1b[32m[%(asctime)s %(lineno)d@%(filename)s:%(name)s]\x1b[0m" - msg = "%(message)s" - if record.levelno == logging.DEBUG: - fmt = "{} \x1b[32mDBG\x1b[0m {}".format(date, msg) - elif record.levelno == logging.WARNING: - fmt = "{} \x1b[1;31mWRN\x1b[0m {}".format(date, msg) - elif record.levelno == logging.ERROR: - fmt = "{} \x1b[1;4;31mERR\x1b[0m {}".format(date, msg) - else: - fmt = date + " " + msg - self._style._fmt = fmt - return super().format(record) - - -def set_logger(logger): - """replace the logger""" - global _replaced_logger - _replaced_logger = logger - from .mgb import _register_logger - - _register_logger(logger) diff --git a/python_module/megengine/_internal/mgb_helper.py b/python_module/megengine/_internal/mgb_helper.py deleted file mode 100644 index 955d5c88..00000000 --- a/python_module/megengine/_internal/mgb_helper.py +++ /dev/null @@ -1,87 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -"""helper utils for the core mgb module""" - -import collections -import inspect -import json -import threading -from abc import ABCMeta, abstractmethod - - -class callback_lazycopy: - """wraps around a callable to be passed to :meth:`.CompGraph.compile`. - - This is used to disable eager copy, so we could get rid of an h2d copy and - a d2h if values are to be passed from one callback to another - :class:`.SharedND`. - """ - - def __init__(self, func): - assert isinstance(func, collections.Callable) - self.__func = func - - @property - def func(self): - return self.__func - - -class SharedNDLazyInitializer(metaclass=ABCMeta): - """lazy initialization policy for :class:`.SharedND`""" - - @abstractmethod - def get_shape(self): - """get shape, without loading value""" - - @abstractmethod - def get_value(self): - """get value as numpy ndarray""" - - -class copy_output: - """wraps a :class:`.SymbolVar` in outspec for :meth:`.CompGraph.compile`, - to copy the output to function return value""" - - symvar = None - borrow_mem = None - - def __init__(self, symvar, *, borrow_mem=False): - """ - - :param borrow_mem: see :meth:`.CompGraphCallbackValueProxy.get_value` - """ - from .mgb import SymbolVar - - assert isinstance( - symvar, SymbolVar - ), "copy_output expects an SymbolVar, got {} instead".format(symvar) - self.symvar = symvar - self.borrow_mem = borrow_mem - - -class FuncOutputSaver: - """instance could be used as callbacks for :meth:`.CompGraph.compile` to - copy output to host buffer - """ - - _value = None - _borrow_mem = None - - def __init__(self, borrow_mem=False): - self._borrow_mem = borrow_mem - - def __call__(self, v): - self._value = v.get_value(borrow_mem=self._borrow_mem) - - def get(self): - assert ( - self._value is not None - ), "{} not called; maybe due to unwaited async func".format(self) - return self._value diff --git a/python_module/megengine/_internal/opr_extra.py b/python_module/megengine/_internal/opr_extra.py deleted file mode 100644 index 7a59a2cf..00000000 --- a/python_module/megengine/_internal/opr_extra.py +++ /dev/null @@ -1,3 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2015-2019 Megvii Inc. All rights reserved. - diff --git a/python_module/megengine/_internal/persistent_cache.py b/python_module/megengine/_internal/persistent_cache.py deleted file mode 100644 index 47da6637..00000000 --- a/python_module/megengine/_internal/persistent_cache.py +++ /dev/null @@ -1,90 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -import argparse -import getpass -import json -import os -import shelve - -from .logconf import get_logger -from .mgb import _PersistentCache -from .version import __version__ - - -class _FakeRedisConn: - def __init__(self): - try: - from ..hub.hub import _get_megengine_home - - cache_dir = os.path.expanduser( - os.path.join(_get_megengine_home(), "persistent_cache") - ) - os.makedirs(cache_dir, exist_ok=True) - cache_file = os.path.join(cache_dir, "cache") - self._dict = shelve.open(cache_file) - self._is_shelve = True - except: - self._dict = {} - self._is_shelve = False - - def get(self, key): - if self._is_shelve and isinstance(key, bytes): - key = key.decode("utf-8") - - return self._dict.get(key) - - def set(self, key, val): - if self._is_shelve and isinstance(key, bytes): - key = key.decode("utf-8") - - self._dict[key] = val - - def __del__(self): - if self._is_shelve: - self._dict.close() - - -class PersistentCacheOnServer(_PersistentCache): - _cached_conn = None - _prefix = None - _prev_get_refkeep = None - - @property - def _conn(self): - """get redis connection""" - if self._cached_conn is None: - self._cached_conn = _FakeRedisConn() - self._prefix = self.make_user_prefix() - - return self._cached_conn - - @classmethod - def make_user_prefix(cls): - return "mgbcache:{}".format(getpass.getuser()) - - - def _make_key(self, category, key): - prefix_with_version = "{}:MGB{}".format(self._prefix, __version__) - return b"@".join( - (prefix_with_version.encode("ascii"), category.encode("ascii"), key) - ) - - def put(self, category, key, value): - conn = self._conn - key = self._make_key(category, key) - conn.set(key, value) - - def get(self, category, key): - conn = self._conn - key = self._make_key(category, key) - self._prev_get_refkeep = conn.get(key) - return self._prev_get_refkeep - - diff --git a/python_module/megengine/_internal/plugin.py b/python_module/megengine/_internal/plugin.py deleted file mode 100644 index 4290bc1b..00000000 --- a/python_module/megengine/_internal/plugin.py +++ /dev/null @@ -1,261 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -"""plugins associated with computing graph""" - -import atexit -import collections -import json -import os -import platform -import signal -import struct - -import numpy as np - -from . import mgb as _mgb -from .logconf import get_logger - -InfkernFinderInputValueRec = collections.namedtuple( - "InfkernFinderInputValueRec", ["var_name", "var_id", "run_id", "value"] -) - - -class CompGraphProfiler(_mgb._CompGraphProfilerImpl): - """a plugin to profile computing graphs""" - - def __init__(self, comp_graph): - super().__init__(comp_graph) - - def get(self): - """get visualizable profiling result on a function""" - return json.loads(self._get_result()) - - def write_json(self, fobj): - """write the result to a json file - - :param fobj: a file-like object, or a string - """ - if isinstance(fobj, str): - with open(fobj, "w") as fout: - return self.write_json(fout) - fobj.write(self._get_result()) - - -class NumRangeChecker(_mgb._NumRangeCheckerImpl): - """check that all numberical float values of variables in a computing graph - are within given range""" - - def __init__(self, comp_graph, max_abs_val): - """:param max_abs_val: max absolute value""" - super().__init__(comp_graph, float(max_abs_val)) - - -class TextOprIODump(_mgb._TextOprIODumpImpl): - """dump all internal results as text to a file""" - - def __init__(self, comp_graph, fpath, *, print_addr=None, max_size=None): - super().__init__(comp_graph, fpath) - if print_addr is not None: - self.print_addr(print_addr) - if max_size is not None: - self.max_size(max_size) - - def print_addr(self, flag): - """set whether to print var address - - :return: self - """ - self._print_addr(flag) - return self - - def max_size(self, size): - """set the number of elements to be printed for each var - - :return: self - """ - self._max_size(size) - return self - - -class BinaryOprIODump(_mgb._BinaryOprIODumpImpl): - """dump all internal results binary files to a directory; the values can be - loaded by :func:`load_tensor_binary` - """ - - def __init__(self, comp_graph, dir_path): - super().__init__(comp_graph, dir_path) - - -class InfkernFinder(_mgb._InfkernFinderImpl): - """a plugin to find kernels that cause infinite loops""" - - def __init__(self, comp_graph, record_input_value): - """ - :param record_input_value: whether need to record input var values of - all operators - :type record_input_value: bool - """ - super().__init__(comp_graph, record_input_value) - - def write_to_file(self, fpath): - """write current execution status to a text file - - :return: ID of the first operator that is still not finished, - or None if all oprs are finished - :rtype: int or None - """ - v = self._write_to_file(fpath) - if v == 0: - return - return v - 1 - - def get_input_values(self, opr_id): - """get recorded input values of a given operator. Return a list - of :class:`InfkernFinderInputValueRec`. Note that the value in - each item is either None (if it is not recorded) or a numpy - array - """ - ret = [] - for idx in range(self._get_input_values_prepare(opr_id)): - vn = self._get_input_values_var_name(idx) - vi = self._get_input_values_var_idx(idx) - ri = self._get_input_values_run_id(idx) - val = self._get_input_values_val(idx) - if not val.shape: - val = None - else: - val = val.get_value() - ret.append(InfkernFinderInputValueRec(vn, vi, ri, val)) - return ret - - -def fast_signal_hander(signum, callback): - """bypass python's signal handling system and registera handler that is - called ASAP in a dedicated thread (in contrary, python calls handlers in - the main thread) - - :param callback: signal callback, taking the signal number as its sole - argument - """ - - def cb_wrapped(): - try: - callback(signum) - except: - get_logger().exception("error calling signal handler for {}".format(signum)) - - _mgb._FastSignal.register_handler(signum, cb_wrapped) - - -atexit.register(_mgb._FastSignal.shutdown) - - -class GlobalInfkernFinder: - """ - manage a list of :class:`InfkernFinder` objects; when this process is - signaled with SIGUSR1, an interactive IPython shell would be presented for - further investigation - """ - - _signal = None - if platform.system() != "Windows": - _signal = signal.SIGUSR1 - else: - _signal = signal.CTRL_C_EVENT - _registry = [] - _shell_maker = None - - @classmethod - def add_graph(cls, comp_graph): - """register a graph so it can be tracked by :class:`InfkernFinder`""" - enabled = os.getenv("MGB_DBG_INFKERN_FINDER") - if not enabled: - return - - if enabled == "1": - record_input_value = False - else: - assert enabled == "2", ( - "MGB_DBG_INFKERN_FINDER must be either 1 or 2, indicating " - "whether to record input values" - ) - record_input_value = True - - finder = InfkernFinder(comp_graph, record_input_value) - get_logger().warning( - "interactive InfkernFinder {} registered to graph {}; all input " - "var values would be recorded and the graph would never be " - "reclaimed. You can enter the interactive debug session by " - 'executing "kill -{} {}". record_input_value={}'.format( - finder, comp_graph, cls._signal, os.getpid(), record_input_value - ) - ) - - if not cls._registry: - from IPython.terminal.embed import InteractiveShellEmbed - - cls._shell_maker = InteractiveShellEmbed - fast_signal_hander(cls._signal, cls._on_signal) - - cls._registry.append(finder) - - @classmethod - def _on_signal(cls, signum): - shell = cls._shell_maker() - shell( - header="Enter interactive InfkernFinder session; the registered " - "finder objects can be found in variable f", - local_ns={"f": cls._registry}, - ) - - -def load_tensor_binary(fobj): - """load a tensor dumped by the :class:`BinaryOprIODump` plugin; the actual - tensor value dump is implemented by ``mgb::debug::dump_tensor``. - - Multiple values can be compared by ``tools/compare_binary_iodump.py``. - - :param fobj: file object, or a string that contains the file name - :return: tuple ``(tensor_value, tensor_name)`` - """ - if isinstance(fobj, str): - with open(fobj, "rb") as fin: - return load_tensor_binary(fin) - - DTYPE_LIST = { - 0: np.float32, - 1: np.uint8, - 2: np.int8, - 3: np.int16, - 4: np.int32, - 5: _mgb.intb1, - 6: _mgb.intb2, - 7: _mgb.intb4, - 8: None, - 9: np.float16, - # quantized dtype start from 100000 - # see MEGDNN_PARAMETERIZED_DTYPE_ENUM_BASE in - # dnn/include/megdnn/dtype.h - 100000: np.uint8, - 100001: np.int32, - 100002: np.int8, - } - - header_fmt = struct.Struct("III") - name_len, dtype, max_ndim = header_fmt.unpack(fobj.read(header_fmt.size)) - assert ( - DTYPE_LIST[dtype] is not None - ), "Cannot load this tensor: dtype Byte is unsupported." - - shape = list(struct.unpack("I" * max_ndim, fobj.read(max_ndim * 4))) - while shape[-1] == 0: - shape.pop(-1) - name = fobj.read(name_len).decode("ascii") - return np.fromfile(fobj, dtype=DTYPE_LIST[dtype]).reshape(shape), name diff --git a/python_module/megengine/_internal/version.py b/python_module/megengine/_internal/version.py deleted file mode 100644 index 57803f31..00000000 --- a/python_module/megengine/_internal/version.py +++ /dev/null @@ -1,57 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -"""version information for MegBrain package""" - -import collections - -from . import mgb as _mgb - - -class Version( - collections.namedtuple("VersionBase", ["major", "minor", "patch", "dev"]) -): - """simple sematic version object""" - - @classmethod - def __normalize(cls, v): - if isinstance(v, str): - v = v.split(".") - a, b, c = map(int, v) - return cls(a, b, c) - - def __eq__(self, rhs): - return super().__eq__(self.__normalize(rhs)) - - def __ne__(self, rhs): - return super().__ne__(self.__normalize(rhs)) - - def __lt__(self, rhs): - return super().__lt__(self.__normalize(rhs)) - - def __le__(self, rhs): - return super().__le__(self.__normalize(rhs)) - - def __gt__(self, rhs): - return super().__gt__(self.__normalize(rhs)) - - def __ge__(self, rhs): - return super().__ge__(self.__normalize(rhs)) - - def __str__(self): - rst = "{}.{}.{}".format(self.major, self.minor, self.patch) - if self.dev: - rst += "-dev{}".format(self.dev) - return rst - - -Version.__new__.__defaults__ = (0,) # dev defaults to 0 - -version_info = Version(*_mgb._get_mgb_version()) -__version__ = str(version_info) diff --git a/python_module/megengine/core/__init__.py b/python_module/megengine/core/__init__.py deleted file mode 100644 index ab452954..00000000 --- a/python_module/megengine/core/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from .device import ( - get_default_device, - get_device_count, - is_cuda_available, - set_default_device, -) -from .function import Function -from .graph import Graph, dump -from .serialization import load, save -from .tensor import Tensor, TensorDict, tensor, wrap_io_tensor -from .tensor_factory import ones, zeros -from .tensor_nn import Buffer, Parameter diff --git a/python_module/megengine/core/device.py b/python_module/megengine/core/device.py deleted file mode 100644 index cb3999db..00000000 --- a/python_module/megengine/core/device.py +++ /dev/null @@ -1,60 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import os - -import megengine._internal as mgb - -_default_device = os.getenv("MGE_DEFAULT_DEVICE", "xpux") - - -def get_device_count(device_type: str) -> int: - """Gets number of devices installed on this system. - - :param device_type: device type, one of 'gpu' or 'cpu' - """ - - device_type_set = ("cpu", "gpu") - assert device_type in device_type_set, "device must be one of {}".format( - device_type_set - ) - return mgb.config.get_device_count(device_type) - - -def is_cuda_available() -> bool: - """Returns whether cuda device is available on this system. - - """ - return mgb.config.get_device_count("gpu", warn=False) > 0 - - -def set_default_device(device: str = "xpux"): - r"""Sets default computing node. - - :param device: default device type. The type can be 'cpu0', 'cpu1', etc., - or 'gpu0', 'gpu1', etc., to specify the particular cpu or gpu to use. - 'cpux' and 'gupx' can also be used to specify any number of cpu or gpu devices. - - 'multithread' device type is avaliable when inference, which implements - multi-threading parallelism at the operator level. For example, - 'multithread4' will compute with 4 threads. which implements - - The default value is 'xpux' to specify any device available. - - It can also be set by environmental variable `MGE_DEFAULT_DEVICE`. - """ - global _default_device # pylint: disable=global-statement - _default_device = device - - -def get_default_device() -> str: - r"""Gets default computing node. - - It returns the value set by :func:`~.set_default_device`. - """ - return _default_device diff --git a/python_module/megengine/core/function.py b/python_module/megengine/core/function.py deleted file mode 100644 index c6fb7d43..00000000 --- a/python_module/megengine/core/function.py +++ /dev/null @@ -1,176 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import copy -from abc import ABCMeta, abstractmethod -from typing import Iterable, Tuple, Union - -import megengine._internal as mgb - -from .tensor import Tensor - - -class _OverrideGradientCraniotome(mgb.craniotome.CraniotomeBase): - __nr_inputs__ = None - __nr_outputs__ = None - __expand_single_outputs__ = False - __allow_duplicate__ = False - - grad_func = None - - def setup(self, nr_inputs, nr_outputs, grad_func): - self.__nr_inputs__ = nr_inputs + nr_outputs - self.__nr_outputs__ = nr_outputs - self.grad_func = grad_func - - def infer_shape(self, inp_shapes): - return inp_shapes[-self.__nr_outputs__ :] - - def init_output_dtype(self, input_dtypes): - return input_dtypes[-self.__nr_outputs__ :] - - def execute(self, inputs, outputs): - for ivar, ovar in zip(inputs[-self.__nr_outputs__ :], outputs): - ovar.set_value(ivar) - - def grad(self, wrt_idx, inputs, outputs, out_grad): - # TODO: Make sure grad_values really have values in eager mode. - # Porting to the new imperative engine would solve this, but if it - # don't happen, EagerEvalManager should be changed. - grads = self.grad_func( - *(Tensor(x) if x is not None else None for x in out_grad) - ) - # pylint: disable=literal-comparison - if isinstance(grads, Tensor) or grads is None or grads is 0: - grads = (grads,) - assert ( - len(grads) == self.__nr_inputs__ - self.__nr_outputs__ - ), "Function.backward should return a tuple with len = {}, got {}".format( - self.__nr_inputs__ - self.__nr_outputs__, len(grads) - ) - # pylint: disable=literal-comparison - return ( - list(x._symvar if x is not None and x is not 0 else 0 for x in grads) - + [0] * self.__nr_outputs__ - ) - - def get_serialize_params(self): - raise NotImplementedError("Serialization of Function is not implemented") - - -class Function(metaclass=ABCMeta): - """ - Defines a block of operations with customizable differentiation. - - The computation should be defined in ``forward`` method, with gradient - computation defined in ``backward`` method. - - Each instance of ``Function`` should be used only once during forwardding. - - Examples: - - .. testcode:: - - class Sigmoid(Function): - def forward(self, x): - y = 1 / (1 + F.exp(-x)) - self.save_for_backward(y) - return y - - def backward(self, output_grads): - (y, ) = self.saved_tensors - return output_grads * y * (1-y) - - """ - - _has_saved_state = False - saved_tensors = None - - def __init__(self): - self.saved_tensors = () - - @abstractmethod - def forward(self, *inputs: Iterable[Tensor]) -> Union[Tuple[Tensor], Tensor]: - """ - Applies operations to ``inputs`` and returns results. It must be overriden by all subclasses. - Users can call :meth:`~.function.Function.save_for_backward` in this method to save tensors. - - :param input: Input tensors. - :return: A tuple of Tensor or a single Tensor. - - .. note:: - - This method should return a tuple of Tensor or a single Tensor representing the output - of the function. - """ - raise NotImplementedError - - @abstractmethod - def backward( - self, *output_grads: Iterable[Union[Tensor, None]] - ) -> Union[Tuple[Tensor], Tensor]: - """ - Compute the gradient of the forward function. It must be overriden by all subclasses. - - :param output_grads: gradients of outputs that are returned by :meth:`~.function.Function.forward` - - .. note:: - - In case when some tensors of outputs are not related to loss function, the corresponding - values in ``output_grads`` would be ``None``. - - .. note:: - - This method should return a tuple which containing the gradients of all inputs, in the same order - as the ``inputs`` argument of :meth:`~.function.Function.forward` . A ``Tensor`` could be returned - instead if there is only one input. If users want to stop the propagation of some gradients, - the corresponding returned values should be set ``None`` . - - """ - raise NotImplementedError - - def save_for_backward(self, *tensors: Iterable[Tensor]): - """ - Saves tensors needed for gradient computation. This method should be called only - once in :meth:`~.function.Function.forward`, additional calls will replace values saved previously. - - The saved tensors can be accessed through the ``saved_tensors`` attribute. - """ - self.saved_tensors = tensors - - def __deepcopy__(self, memo): - """ - Defines how the operator is deeply copied - """ - cls = self.__class__ - result = cls.__new__(cls) - tmp = self.saved_tensors - self.saved_tensors = None - memo[id(self)] = result - for k, v in self.__dict__.items(): - setattr(result, k, copy.deepcopy(v, memo)) - setattr(result, "saved_tensors", tmp) - self.saved_tensors = tmp - return result - - def __call__(self, *inputs): - assert ( - not self._has_saved_state - ), "A Function instance should not be called multiple times" - outputs = self.forward(*inputs) - if isinstance(outputs, Tensor): - outputs = (outputs,) - self._has_saved_state = True - sv = (x._symvar for x in inputs + outputs) - outputs = _OverrideGradientCraniotome.make( - *sv, nr_inputs=len(inputs), nr_outputs=len(outputs), grad_func=self.backward - ) - outputs = tuple(map(Tensor, outputs)) - if len(outputs) == 1: - outputs = outputs[0] - return outputs diff --git a/python_module/megengine/core/graph.py b/python_module/megengine/core/graph.py deleted file mode 100644 index 332f198d..00000000 --- a/python_module/megengine/core/graph.py +++ /dev/null @@ -1,158 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import collections -import threading - -import megengine._internal as mgb - -from .device import get_default_device - - -class _DefaultGraph(threading.local): - r""" - An implicit thread-local graph - """ - - def __init__(self): - super(_DefaultGraph, self).__init__() - self._default_graph = None - - def get_default(self): - r"""Returns a default Graph object for eager evaluation. - """ - if self._default_graph is None: - self._default_graph = Graph() - return self._default_graph - - -_default_graph = _DefaultGraph() - - -class Graph(mgb.CompGraph): - r""" - A computing graph that supporting context management. - - :param check_env_var: whether to check environment vars including ``MGB_COMP_GRAPH_OPT``. - :param eager_evaluation: use dynamic graph(``True``) or static graph(``False``). - - Examples: - - .. testcode:: - - import numpy as np - from megengine import tensor - from megengine.core import Graph - - with Graph(eager_evaluation=True): - x = tensor([1, 2]) - print(x) - - Outputs: - - .. testoutput:: - - Tensor([1 2], dtype=int32) - - """ - - __saved_graph = None - - def __new__( - cls, *, check_env_var: bool = True, eager_evaluation: bool = True, **kwargs - ): - kwargs.update(eager_evaluation=eager_evaluation) - self = mgb.comp_graph(extra_opts=kwargs, check_env_var=check_env_var) - self.__class__ = cls - return self - - def __init__( - self, *, check_env_var: bool = True, eager_evaluation: bool = True, **kwargs - ): - # pylint: disable=super-init-not-called - pass - - def __enter__(self): - self.__saved_graph = _default_graph._default_graph - _default_graph._default_graph = self - return self - - def __exit__(self, type, value, traceback): - _default_graph._default_graph = self.__saved_graph - del self.__saved_graph - - -def _use_default_if_none(device, comp_graph): - if device is None: - device = get_default_device() - if comp_graph is None: - comp_graph = get_default_graph() - return device, comp_graph - - -def dump(outputs, fpath, optimize_options=None, **kwargs): - r""" - Serializes this computing graph and writes it to a file. - - :type outputs: ``Tensor`` or a collection of ``Tensor`` - :param outputs: output variables that need to be retrieved when - deserializing - :type fpath: ``str`` - :param fpath: path for the output file - :type optimize_options: ``list`` - :param optimize_options: ``['f16_io_f32_comp', 'f16_io_comp', 'use_nhwcd4', 'fuse_conv_bias_nonlinearity']`` , four elements are optional, it can be an empty list, None or a list containing any of them. - - .. note:: - - ``f16_io_f32_comp`` – whether to use float16 for I/O between oprs and use float32 as internal computation precision. Note the output var would be changed to float16; - - ``f16_io_comp`` – whether to use float16 for both I/O and computation precision; - - ``use_nhwcd4`` – whether to use NHWCD4 data format. This is faster on some OpenCL devices; - - ``fuse_conv_bias_nonlinearity`` – whether to fuse conv+bias+nonlinearty into one opr. This is supported only when ``use_nhwcd4`` is set. - - """ - from .tensor import Tensor - - assert optimize_options is None or isinstance( - optimize_options, list - ), "optimize_options must be a list" - - if isinstance(outputs, Tensor): - outputs = [outputs] - else: - assert isinstance(outputs, collections.Iterable), "{} not iterable".format( - outputs - ) - outputs = list(outputs) - - for output in outputs: - assert isinstance(output, Tensor), "All outputs must be Tensors." - - outputs = [o._symvar for o in outputs] - - if optimize_options: - opt_dict = dict.fromkeys(optimize_options, True) - mgb.optimize_for_inference(outputs, **opt_dict) - mgb.serialize_comp_graph_to_file(fpath, outputs, **kwargs) - - -def set_default_graph(default_graph): - r""" - Sets a global default Graph object. - """ - global _default_graph # pylint: disable=global-statement - _default_graph._default_graph = default_graph - - -def get_default_graph(): - r""" - Returns a default Graph object, most probably for eager evaluation. - """ - return _default_graph.get_default() diff --git a/python_module/megengine/core/serialization.py b/python_module/megengine/core/serialization.py deleted file mode 100644 index 8c18a534..00000000 --- a/python_module/megengine/core/serialization.py +++ /dev/null @@ -1,128 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import pickle - -import megengine._internal as mgb - -from ..utils.max_recursion_limit import max_recursion_limit -from .device import get_default_device - - -def save(obj, f, pickle_module=pickle, pickle_protocol=pickle.HIGHEST_PROTOCOL): - r"""Save an object to disk file. - - :type obj: object - :param obj: object to save. Only ``module`` or ``state_dict`` are allowed. - :type f: text file object - :param f: a string of file name or a text file object to which ``obj`` is saved to. - :type pickle_module: - :param pickle_module: Default: ``pickle``. - :type pickle_protocol: - :param pickle_protocol: Default: ``pickle.HIGHEST_PROTOCOL``. - - """ - if isinstance(f, str): - with open(f, "wb") as fout: - save( - obj, fout, pickle_module=pickle_module, pickle_protocol=pickle_protocol - ) - return - - with max_recursion_limit(): - assert hasattr(f, "write"), "{} does not support write".format(f) - pickle_module.dump(obj, f, pickle_protocol) - - -class dmap: - def __init__(self, map_location): - self.map_location = map_location - - def __enter__(self): - mgb.add_device_map(self.map_location) - return self - - def __exit__(self, type, value, traceback): - mgb.del_device_map() - - -def _get_callable_map_location(map_location): - if map_location is None: - - def callable_map_location(state): - return str(get_default_device()) - - elif isinstance(map_location, str): - - def callable_map_location(state): - return map_location - - elif isinstance(map_location, dict): - locator_map = {} - for key, value in map_location.items(): - locator_key = mgb.config.parse_locator(key)[:2] - locator_map[locator_key] = value - - def callable_map_location(state): - orig = mgb.config.parse_locator(state)[:2] - if orig in locator_map.keys(): - state = locator_map[orig] - return state - - else: - assert callable(map_location), "map_location should be str, dict or function" - callable_map_location = map_location - return callable_map_location - - -def load(f, map_location=None, pickle_module=pickle): - r"""Load an object saved with save() from a file. - - :type f: text file object - :param f: a string of file name or a text file object from which to load. - :type map_location: str, dict or a function specifying the map rules - :param map_location: Default: ``None``. - - .. note:: - - map_location will change the logical locator when loading models, - avoiding tensors be loading on non-existent device. If you want to - add the mapping relationship between logical locator and physical - locator in runtime, please call :func:`mge.set_device_map()` - - :type pickle_module: - :param pickle_module: Default: ``pickle``. - - .. note:: - - If you will call :func:`mge.set_default_device()`, please do it - before :func:`mge.load()`. - - Examples: - - .. testcode: - - import megengine as mge - mge.load('model.mge') - # Load all tensors based on logical location. - mge.load('model.mge', map_location='gpu0') - # Load all tensors onto the device: GPU0 - mge.load('model.mge', map_location={'gpu0':'cpu0'}) - # Load all tensors based on logical location, but 'GPU0' will be renamed to 'CPU0' - mge.load('model.mge', map_location=lambda dev: 'cpu0') - # Load all tensors onto the device" CPU0 - - """ - if isinstance(f, str): - with open(f, "rb") as fin: - return load(fin, map_location=map_location, pickle_module=pickle_module) - - map_location = _get_callable_map_location(map_location) # callable map_location - - with dmap(map_location): - return pickle_module.load(f) diff --git a/python_module/megengine/core/tensor.py b/python_module/megengine/core/tensor.py deleted file mode 100644 index f96f90f2..00000000 --- a/python_module/megengine/core/tensor.py +++ /dev/null @@ -1,771 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import collections -import copy -import functools -import itertools -import weakref -from typing import Callable, Tuple, Union - -import numpy as np - -import megengine._internal as mgb - -from .graph import _use_default_if_none, get_default_graph - - -def wrap_io_tensor(func): - r"""A wrapper to make ``func`` compatible with functions in ``_internal.opr``. - """ - - @functools.wraps(func) - def wrapper(*args, **kwargs): - comp_graph = None - for i in itertools.chain(args, kwargs.values()): - if isinstance(i, Tensor) and i._comp_graph: - comp_graph = i._comp_graph - break - else: - - comp_graph = get_default_graph() - new_args = ( - arg._attach(comp_graph) if isinstance(arg, Tensor) else arg for arg in args - ) - new_kwargs = { - k: v._attach(comp_graph) if isinstance(v, Tensor) else v - for k, v in kwargs.items() - } - ret = func(*new_args, **new_kwargs) - if isinstance(ret, mgb.SymbolVar): - ret = Tensor(ret) - elif isinstance(ret, list): - ret = [Tensor(t) if isinstance(t, mgb.SymbolVar) else t for t in ret] - elif isinstance(ret, tuple): - ret = tuple(Tensor(t) if isinstance(t, mgb.SymbolVar) else t for t in ret) - return ret - - return wrapper - - -def _wrap_symbolvar_binary_op(f): - @functools.wraps(f) - def wrapped(self, other): - comp_graph = ( - isinstance(other, Tensor) - and other._comp_graph - or self._comp_graph - or get_default_graph() - ) - if isinstance(other, Tensor): - other = other._attach(comp_graph) - return Tensor(f(self._attach(comp_graph), other)) - - return wrapped - - -def _wrap_slice(inp: slice): - r""" - A wrapper to handle Tensor values in ``inp`` slice. - """ - start = inp.start._symvar if isinstance(inp.start, Tensor) else inp.start - stop = inp.stop._symvar if isinstance(inp.stop, Tensor) else inp.stop - step = inp.step._symvar if isinstance(inp.step, Tensor) else inp.step - return slice(start, stop, step) - - -def _wrap_idx(idx: Tuple[Union[int, "Tensor"]]): - r""" - A wrapper to handle Tensor values in ``idx``. - """ - if not isinstance(idx, tuple): - idx = (idx,) - - idx = tuple(i._symvar if isinstance(i, Tensor) else i for i in idx) - idx = tuple(_wrap_slice(i) if isinstance(i, slice) else i for i in idx) - return idx - - -class _MGBIndexWrapper: - r""" - A wrapper class to handle ``__getitem__`` for index containing Tensor values. - - :param dest: a destination Tensor to do indexing on. - :param mgb_index: an ``_internal`` helper function indicating how to index. - :param val: a optional Tensor parameter used for ``mgb_index``. - """ - - def __init__(self, dest: "Tensor", mgb_index: Callable, val=None): - self.dest = dest - self.val = val - self.mgb_index = mgb_index - - def __getitem__(self, idx): - if self.val is None: - return wrap_io_tensor(self.mgb_index(self.dest._symvar).__getitem__)( - _wrap_idx(idx) - ) - else: - return wrap_io_tensor( - self.mgb_index(self.dest._symvar, self.val._symvar).__getitem__ - )(_wrap_idx(idx)) - - -class _Guard: - r""" - A wrapper class with custom ``__del__`` method calling ``deleter``. - - :param deleter: a function to be called in ``__del__``. - """ - - def __init__(self, deleter: Callable): - self.deleter = deleter - - def __del__(self): - self.deleter() - - -class Tensor: - r"""The main data container in MegEngine. - Use :func:`~.tensor` to create a Tensor with existed data. - """ - requires_grad = False - grad = None - - def __init__(self, val=None, *, requires_grad=None): - self._reset(val, requires_grad=requires_grad) - self.q_dict = {"mode": None, "scale": None, "zero_point": None} - - def _reset(self, val=None, *, requires_grad=None): - self.__sym_override = None - if val is None: - self.__val = None - self.__sym = None - elif isinstance(val, mgb.SharedND): - self.__val = val - self.__sym = None - elif isinstance(val, mgb.SymbolVar): - self.__val = None - self.__sym = val - else: - raise TypeError("must be initialized with SymbolVar or SharedND") - self.requires_grad = requires_grad - - def _as_tensor(self, obj): - r"""Convert the data into a ``Tensor``. If the data is already a Tensor - with the same dtype and device, no copy will be performed. Otherwise a - new Tensor will be returned with computational graph retained. - - """ - if isinstance(obj, Tensor): - return obj - if isinstance(obj, mgb.SymbolVar): - return Tensor(obj) - if isinstance(obj, mgb.SharedScalar): - return Tensor(obj._as_sym_var(self._comp_graph, self._comp_node)) - return tensor(data=obj, device=self.device) - - def numpy(self): - r"""Return the tensor value in numpy.ndarray format. - """ - if self.__val is not None: - assert self.__sym is None - return self.__val.get_value() - if self.__sym is None: - raise ValueError("uninitialized") - if self.__sym.eager_val is not None: - return self.__sym.eager_val.get_value() - return self.__sym.inferred_value - - def item(self): - r"""If tensor only has only one value, return it.""" - return self.numpy().item() - - def _attach(self, comp_graph, *, volatile=True): - sym = self.__sym_override or self.__sym - if sym: - if sym.owner_graph != comp_graph: - raise RuntimeError("internal error") - return sym - if self.__val: - return self.__val.symvar(comp_graph, volatile=volatile) - else: - raise ValueError("uninitialized") - - @property - def _symvar(self): - if self.__sym_override: - return self.__sym_override - if self.__sym: - assert not self.__val - return self.__sym - if not self.__val: - raise ValueError("uninitialized") - - return self._attach(get_default_graph()) - - def __mgb_symvar__(self, comp_graph=None, **_): - if self.__sym_override: - return self.__sym_override - if self.__val and comp_graph: - return self._attach(comp_graph) - return self._symvar # read by mgb.opr - - def _override_symvar_during_trace(self, trace, symvar): - assert self.__val and not self.__sym - assert trace is type(trace)._active_instance - deleters = trace._user_cache.setdefault(Tensor, set()) - self_ref = weakref.ref(self) - - def restore(): - self = self_ref() - if self is not None: - self.__sym_override = None - - deleters.add(_Guard(restore)) - self.__sym_override = symvar - - @property - def dtype(self): - r"""Return the data type of the tensor. - """ - if self.__val is not None: - return self.__val.dtype - return self._symvar.dtype - - @dtype.setter - def dtype(self, dtype: str = None): - r"""Set the data type of the tensor. - """ - if self.__val is not None: - self.__val = mgb.make_shared(self.device, value=self.astype(dtype).numpy()) - elif self.__sym_override is not None: - self.__sym_override = self.__sym_override.astype(dtype) - elif self.__sym is not None: - self.__sym = self.__sym.astype(dtype) - - @property - def name(self): - r"""Get the tensor name, does not support Parameter and Buffer. - """ - return self._symvar.name - - @name.setter - def name(self, name: str = None): - r"""Set the tensor name, does not support Parameter and Buffer. - """ - if self.__val is not None: - raise ValueError("name setting is not available for Parameter or Buffer.") - if self.__sym_override is not None: - self.__sym_override = self.__sym_override.rename(name) - if self.__sym is not None: - assert not self.__val - self.__sym = self.__sym.rename(name) - - @property - def _comp_node(self): - if self.__val is not None: - return self.__val.comp_node - return self._symvar.comp_node - - device = _comp_node - - @property - def _comp_graph(self): - if self.__sym is not None: - return self.__sym.owner_graph - return None - - @property - def shape(self): - r"""Return an int tuple that is the shape/layout of the tensor. - Could be invalid in static graph mode. - """ - from ..jit import trace - - if trace._active_instance: # pylint: disable=protected-access - # NOTE: this is an hack - shape = mgb.opr.get_var_shape(self._symvar) - return tuple(Tensor(shape[i]) for i in range(self.ndim)) - return self._symvar.imm_shape - - def set_value(self, value, *, sync=True, inplace=False, share=False): - r"""Set value to the tensor. - """ - if not self.__val: - raise ValueError("not detached") - if isinstance(value, Tensor): - value = value.__val or value.__sym.eager_val - self.__val.set_value(value, sync=sync, inplace=inplace, share=share) - - def fill(self, value): - r"""Fills the tensor with the specified value. - """ - self.set_value(np.full(self.shape, value, dtype=self.dtype)) - - def reset_zero(self): - r"""Reset the tensor and fills with zeros. - """ - if not self.__val: - raise ValueError("not detached") - self.__val.reset_zero() - - def to(self, device): - r"""Performs Tensor device conversion, returns Tensor with the specified device. - """ - return wrap_io_tensor(mgb.opr.copy)(self, comp_node=device) - - # https://docs.python.org/3/reference/datamodel.html#object.__hash__ - # > If a class does not define an __eq__() method it should not define a - # > __hash__() operation either - __hash__ = None # type: ignore[assignment] - - def __eq__(self, rhs): - rhs = self._as_tensor(rhs) - return Tensor(self._symvar._binary_opr("EQ", rhs._symvar)) - - def __ne__(self, rhs): - return 1 - self.__eq__(rhs) - - def __len__(self): - if self._symvar.eager_val is not None: - return self._symvar.eager_val.shape[0] - raise TypeError( - "__len__ and __iter__ is not available for tensors on non eager graph." - ) - - __add__ = _wrap_symbolvar_binary_op(mgb.SymbolVar.__add__) - __radd__ = _wrap_symbolvar_binary_op(mgb.SymbolVar.__radd__) - __sub__ = _wrap_symbolvar_binary_op(mgb.SymbolVar.__sub__) - __rsub__ = _wrap_symbolvar_binary_op(mgb.SymbolVar.__rsub__) - __mul__ = _wrap_symbolvar_binary_op(mgb.SymbolVar.__mul__) - __rmul__ = _wrap_symbolvar_binary_op(mgb.SymbolVar.__rmul__) - __matmul__ = _wrap_symbolvar_binary_op(mgb.SymbolVar.__matmul__) - __rmatmul__ = _wrap_symbolvar_binary_op(mgb.SymbolVar.__rmatmul__) - __lshift__ = _wrap_symbolvar_binary_op(mgb.SymbolVar.__lshift__) - __rshift__ = _wrap_symbolvar_binary_op(mgb.SymbolVar.__rshift__) - __truediv__ = _wrap_symbolvar_binary_op(mgb.SymbolVar.__truediv__) - __rtruediv__ = _wrap_symbolvar_binary_op(mgb.SymbolVar.__rtruediv__) - __floordiv__ = _wrap_symbolvar_binary_op(mgb.SymbolVar.__floordiv__) - __rfloordiv__ = _wrap_symbolvar_binary_op(mgb.SymbolVar.__rfloordiv__) - __mod__ = _wrap_symbolvar_binary_op(mgb.SymbolVar.__mod__) - __rmod__ = _wrap_symbolvar_binary_op(mgb.SymbolVar.__rmod__) - __pow__ = _wrap_symbolvar_binary_op(mgb.SymbolVar.__pow__) - __rpow__ = _wrap_symbolvar_binary_op(mgb.SymbolVar.__rpow__) - __lt__ = _wrap_symbolvar_binary_op(mgb.SymbolVar.__lt__) - __gt__ = _wrap_symbolvar_binary_op(mgb.SymbolVar.__gt__) - __le__ = _wrap_symbolvar_binary_op(mgb.SymbolVar.__le__) - __ge__ = _wrap_symbolvar_binary_op(mgb.SymbolVar.__ge__) - __neg__ = wrap_io_tensor(mgb.SymbolVar.__neg__) - sum = wrap_io_tensor(mgb.SymbolVar.sum) - """ - Sum up the given tensors. - """ - max = wrap_io_tensor(mgb.SymbolVar.max) - """ - Return the maximum value of given tensor. - """ - min = wrap_io_tensor(mgb.SymbolVar.min) - """ - Return the minimum value of given tensor. - """ - prod = wrap_io_tensor(mgb.SymbolVar.prod) - """ - Return the product value of the given tensor. - """ - mean = wrap_io_tensor(mgb.SymbolVar.mean) - """ - Return the mean value of the given tensor. - """ - dimshuffle = wrap_io_tensor(mgb.SymbolVar.dimshuffle) - """ - See more details in :func:`~.functional.tensor.dimshuffle`. - """ - astype = wrap_io_tensor(mgb.SymbolVar.astype) - """ - Cast the tensor to a specified type. - """ - - def reshape(self, *target_shape): - r"""Return a tensor which has given target shape - - Examples: - - .. testcode:: - - import numpy as np - from megengine import tensor - - inp = tensor(np.arange(1, 17, dtype=np.int32).reshape(4,4)) - out = tensor(np.arange(100, 116, dtype=np.int32).reshape(1,16)) - out = out.reshape(inp.shape) - print(out.numpy()) - - .. testoutput:: - - [[100 101 102 103] - [104 105 106 107] - [108 109 110 111] - [112 113 114 115]] - """ - - if isinstance(target_shape[0], tuple): - if len(target_shape) > 1: - raise ValueError("Only single tuple is accepted in reshape") - target_shape = target_shape[0] - target_shape = (t._symvar if isinstance(t, Tensor) else t for t in target_shape) - return Tensor(mgb.SymbolVar.reshape(self._symvar, *target_shape)) - - def broadcast(self, *target_shape): - r"""Return a tesnor broadcasted by current tensor to given target shape - - Examples: - - .. testcode:: - - import numpy as np - from megengine import tensor - - data = tensor(np.arange(100, 104, dtype=np.int32).reshape(1,4)) - data = data.broadcast((4,4)) - print(data.numpy()) - - .. testoutput:: - - [[100 101 102 103] - [100 101 102 103] - [100 101 102 103] - [100 101 102 103]] - """ - - if isinstance(target_shape[0], tuple): - if len(target_shape) > 1: - raise ValueError("Only single tuple is accepted in broadcast") - target_shape = target_shape[0] - target_shape = (t._symvar if isinstance(t, Tensor) else t for t in target_shape) - return Tensor(mgb.SymbolVar.broadcast(self._symvar, *target_shape)) - - # Prefer operators on Tensor instead of convert to numpy - __array_priority__ = 1000 - - # mgb indexing family - def __getitem__(self, idx): - return wrap_io_tensor(self._symvar.__getitem__)(_wrap_idx(idx)) - - def set_subtensor(self, val: "Tensor") -> _MGBIndexWrapper: - r""" - Return a object which supports using ``__getitem__`` to set subtensor. - - ``c = a.set_subtensor(b)[idx]`` is equivalent to ``c = a.copy()`` and ``c[idx] = b``. - """ - return _MGBIndexWrapper(self, mgb.opr.set_subtensor, val) - - def incr_subtensor(self, val: "Tensor") -> _MGBIndexWrapper: - r""" - Return a object which supports using ``__getitem__`` to increase subtensor. - - ``c = a.incr_subtensor(b)[idx]`` is equivalent to ``c = a.copy()`` and ``c[idx] += b``. - """ - return _MGBIndexWrapper(self, mgb.opr.incr_subtensor, val) - - @property - def ai(self) -> _MGBIndexWrapper: - r""" - Return a object which supports complex index method to get subtensor. - - Examples: - - .. testcode:: - - from megengine import tensor - a = tensor(np.arange(16, dtype=np.float32).reshape((4, 4))) - print(a.ai[:, [2, 3]]) - - Outputs: - - .. testoutput:: - - Tensor([[ 2. 3.] - [ 6. 7.] - [10. 11.] - [14. 15.]]) - """ - return _MGBIndexWrapper(self, mgb.opr.advanced_indexing) - - def set_ai(self, val: "Tensor") -> _MGBIndexWrapper: - r""" - Equal to :meth:`~.Tensor.set_subtensor` which supports advanced indexing. - """ - return _MGBIndexWrapper(self, mgb.opr.set_advanced_indexing, val) - - def incr_ai(self, val: "Tensor") -> _MGBIndexWrapper: - r""" - Equal to :meth:`~.Tensor.incr_subtensor` which supports advanced indexing. - """ - return _MGBIndexWrapper(self, mgb.opr.incr_advanced_indexing, val) - - @property - def mi(self) -> _MGBIndexWrapper: - r""" - Return a object which supports getting subtensor by - the coordinates which is Cartesian product of given index. - - Examples: - - .. testcode:: - - from megengine import tensor - a = tensor(np.arange(16, dtype=np.float32).reshape((4, 4))) - print(a.mi[[1, 2], [2, 3]]) - # is equal to elements on [1, 2] * [2, 3] = [[(1,2), (1, 3)], [(2, 2), (2, 3)]] - # a[1,2] = 6, a[1,3] = 7, a[2,2] = 10, a[2,3] = 11 - - Outputs: - - .. testoutput:: - - Tensor([[ 6. 7.] - [10. 11.]]) - """ - return _MGBIndexWrapper(self, mgb.opr.mesh_indexing) - - def set_mi(self, val: "Tensor") -> _MGBIndexWrapper: - r""" - Equal to :meth:`~.Tensor.set_subtensor` which using mesh indexing. - """ - return _MGBIndexWrapper(self, mgb.opr.set_mesh_indexing, val) - - def incr_mi(self, val: "Tensor") -> _MGBIndexWrapper: - r""" - Equal to :meth:`~.Tensor.incr_subtensor` which using mesh indexing. - """ - return _MGBIndexWrapper(self, mgb.opr.incr_mesh_indexing, val) - - @property - def batched_mi(self) -> _MGBIndexWrapper: - r""" - Return a object which supports getting subtensor by - batched mesh indexing. - - For Tensor ``a`` and index ``idx``, each value of the ``idx`` need to be a 2-dim matrix or slice. - Cartesian product ``... * idx[k-1][i] * idx[k][i] * idx[k+1][i] * ...`` will be a subtensor from ``a[i]``. - Each matrix ``idx[k]`` should have the size of ``batched_dim`` rows as ``idx[0]`` indicated. - And for slice value, it will apply same slice for each ``batched_dim``. For more details see the example below. - - Examples: - - .. testcode:: - - from megengine import tensor - a = tensor(np.arange(144, dtype=np.float32).reshape((3, 3, 4, 4))) - - print(a.batched_mi[:2, [[0],[1]],[[0,1],[2,3]],[[0],[1]]]) - # is equal to elements from a[0] with ``[0] * [0,1] * [0] = [[[(0,0,0)], [(0,1,0)]]]``(shape is [1,2,1]) - # and from a[1] with ``[1] * [2,3] * [1] = [[[(1,2,1)], [(1,3,1)]]]``(shape is also [1,2,1]) - # a[0,0,0,0] = 0, a[0,0,1,0] = 4, a[1,1,2,1] = 73, a[1,1,3,1] = 77 - - print(a.batched_mi[:2, [[0],[1]], :2, :1]) - # is equal to ``a.batched_mi[:2, [[0],[1]], [[0,1],[0,1]],[[0],[0]]]`` - - Outputs: - - .. testoutput:: - - Tensor([[[[ 0.] - [ 4.]]] - [[[73.] - [77.]]]]) - Tensor([[[[ 0.] - [ 4.]]] - [[[64.] - [68.]]]]) - """ - return _MGBIndexWrapper(self, mgb.opr.batched_mesh_indexing) - - def batched_set_mi(self, val: "Tensor") -> _MGBIndexWrapper: - r""" - Equal to :meth:`~.Tensor.incr_subtensor` which using batched mesh indexing. - """ - return _MGBIndexWrapper(self, mgb.opr.batched_set_mesh_indexing, val) - - def batched_incr_mi(self, val: "Tensor") -> _MGBIndexWrapper: - r""" - Equal to :meth:`~.Tensor.incr_subtensor` which using batched mesh indexing. - """ - return _MGBIndexWrapper(self, mgb.opr.batched_incr_mesh_indexing, val) - - def __array__(self, dtype=None): - if dtype is None: - return self.numpy() - else: - return self.numpy().astype(dtype, copy=False) - - def __int__(self): - return int(self.item()) - - def __index__(self): - return int(self.item()) - - def __round__(self, ndigits=0): - if ndigits != 0: - raise ValueError("ndigits must be 0 for Tensor.round") - return Tensor(mgb.opr.elemwise([self._symvar], mode="ROUND")) - - round = __round__ - - def sqrt(self): - r"""Return a tensor that each element is the square root of its - original value. - - """ - return Tensor(mgb.opr.sqrt(self._symvar)) - - def shapeof(self, axis=None): - r"""Return a Tensor that represent the shape of the tensor. - """ - return Tensor(mgb.opr.get_var_shape(self._symvar, axis=axis)) - - @property - def ndim(self): - r"""Return the number of dimensions of the tensor. - """ - return len(self._symvar.imm_shape) - - def __repr__(self): - piece = "Tensor(" - with np.printoptions(precision=4, suppress=True): - piece += "{}".format(str(self.numpy())) - if self.dtype != np.float32: - piece += ", dtype={}".format(np.dtype(self.dtype).name) - if self._comp_node.locator_logical != ("XPU", -1, 0): - piece += ", device={}".format(self.device) - piece += ")" - return piece - - def __bool__(self): - raise RuntimeError( - "Tensor object should not be converted to bool or used in a if statement. Use .numpy(), int() or float() if you want to use its value in if statement, be aware that this may lead to incorrect result in non-eager mode." - ) - - def __getstate__(self): - r""" __getstate__ will be called for pickle serialization or deep copy - """ - - assert (self.__val is not None) and ( - self.__sym is None - ), "Only SharedND initialized Tensor can be serialized or deep copied" - metadata = {"requires_grad": self.requires_grad} - state = { - "data": self.numpy(), - "device": self.device, - "dtype": self.dtype, - "metadata": metadata, - } - return state - - def __setstate__(self, state): - data = state.pop("data") - device = state.pop("device") - dtype = state.pop("dtype") - metadata = state.pop("metadata", {}) - requires_grad = metadata.pop("requires_grad", None) - snd = mgb.make_shared(device, value=data, dtype=dtype) - self._reset(snd, requires_grad=requires_grad) - - def __deepcopy__(self, memo): - """ - The default deepcopy will ignore other attributes except those defined at - __getstate__ and __setstate__ method. - So we need to add __deepcopy__ method to deepcopy correct attributes. - """ - assert (self.__val is not None) and ( - self.__sym is None - ), "Only SharedND initialized Tensor can be serialized or deep copied" - cls = self.__class__ - result = cls.__new__(cls) - memo[id(self)] = result - for k, v in self.__dict__.items(): - setattr(result, k, copy.deepcopy(v, memo)) - return result - - -def tensor( - data: Union[list, np.ndarray] = None, - *, - dtype: str = None, - device: mgb.CompNode = None, - requires_grad: bool = None -): - r"""A helper function to create a :class:`~.Tensor` using existing data. - - :param data: an existing data array, must be Python list, NumPy array or None. - :param dtype: target Tensor data type, one of ``("uint8", "int8", "int16", "int32", "float32", "float16")``. - :param device: target device for Tensor storing. - :param requires_grad: whether its gradiant will be calculated during :meth:`~.Optimizer.backward` - """ - supported_dtypes = ("uint8", "int8", "int16", "int32", "float32", "float16") - if isinstance(data, Tensor): - raise NotImplementedError - if dtype is not None and np.dtype(dtype).name not in supported_dtypes: - raise TypeError("unsupported dtype {}".format(dtype)) - if data is not None: - if not isinstance(data, np.ndarray): - data = np.array(data, dtype=dtype) - # In order to accept tensor([1]), - # Automaticlly convert to 32-bit number instead of numpy's default 64-bit when input data is not nparray. - dtype = mgb.to_mgb_supported_dtype(data.dtype) - if dtype is None: - if data.dtype.name not in supported_dtypes: - raise TypeError("unsupported dtype {}".format(data.dtype)) - - device, _ = _use_default_if_none(device, None) - shared_nd = mgb.make_shared(device, value=data, dtype=dtype) - return Tensor(shared_nd, requires_grad=requires_grad) - - -class TensorDict(collections.MutableMapping): - r""" - A helper class to maintain dict with Tensor key. - """ - - def __init__(self, *args, **kwargs): - self.data = {} - for i in args: - self.update(i) - self.update(**kwargs) - - class keyfn: - def __new__(cls, x: Tensor): - if not isinstance(x, Tensor): - return x - return super().__new__(cls) - - def __init__(self, x: Tensor): - self._data = x # do not save id directly to make pickle work - - def __hash__(self): - return id(self._data) - - def __eq__(self, other): - return isinstance(other, type(self)) and id(self._data) == id(other._data) - - def __getitem__(self, key): - _, v = self.data[self.keyfn(key)] - return v - - def __setitem__(self, key, value): - self.data[self.keyfn(key)] = key, value - - def __delitem__(self, key): - del self.data[self.keyfn(key)] - - def __iter__(self): - for _, (k, _) in self.data.items(): - yield k - - def __len__(self): - return len(self.data) diff --git a/python_module/megengine/core/tensor_factory.py b/python_module/megengine/core/tensor_factory.py deleted file mode 100644 index 4e83bdba..00000000 --- a/python_module/megengine/core/tensor_factory.py +++ /dev/null @@ -1,109 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from typing import Iterable, Optional, Union - -import megengine._internal as mgb - -from .graph import _use_default_if_none -from .tensor import Tensor - -__all__ = ["zeros", "ones"] - - -def scalar( - value, - dtype: type = None, - device: Optional[mgb.CompNode] = None, - comp_graph: Optional[mgb.CompGraph] = None, -) -> Tensor: - """ - convert ``value`` to the type of :class:`~.Tensor`. - """ - device, comp_graph = _use_default_if_none(device, comp_graph) - return Tensor(mgb.make_immutable(device, comp_graph, value, dtype=dtype, name=None)) - - -def zeros( - shape: Union[int, Iterable[int], Tensor], - dtype: type = None, - device: Optional[mgb.CompNode] = None, - comp_graph: Optional[mgb.CompGraph] = None, -) -> Tensor: - """ - Create a tensor filled with 0. - - :param shape: tensor shape - :param dtype: data type, Default: "int32" - :param device: Compute node of the matrix, Default: None - :param comp_graph: Compute graph of the matrix, Default: None - :return: tensor of zeros - - Examples: - - .. testcode:: - - import megengine as mge - - t = mge.zeros((2, 2), dtype="int32") - print(t.numpy()) - - Outputs: - - .. testoutput:: - - [[0 0] - [0 0]] - - """ - device, comp_graph = _use_default_if_none(device, comp_graph) - if isinstance(shape, (int, Tensor)): - shape = (shape,) - tensor = scalar(0, dtype=dtype, device=device, comp_graph=comp_graph) - tensor = tensor.broadcast(*shape) - return tensor - - -def ones( - shape: Union[int, Iterable[int], Tensor], - dtype: type = None, - device: Optional[mgb.CompNode] = None, - comp_graph: Optional[mgb.CompGraph] = None, -) -> Tensor: - """ - Create a tensor filled with 1. - - :param shape: tensor shape - :param dtype: data type, Default: "int32" - :param device: Compute node of the matrix, Default: None - :param comp_graph: Compute graph of the matrix, Default: None - :return: tensor of ones - - Examples: - - .. testcode:: - - import megengine as mge - - t = mge.ones((2, 2), dtype="float32") - print(t.numpy()) - - Outputs: - - .. testoutput:: - - [[1. 1.] - [1. 1.]] - - """ - device, comp_graph = _use_default_if_none(device, comp_graph) - if isinstance(shape, (int, Tensor)): - shape = (shape,) - tensor = scalar(1, dtype=dtype, device=device, comp_graph=comp_graph) - tensor = tensor.broadcast(*shape) - return tensor diff --git a/python_module/megengine/core/tensor_nn.py b/python_module/megengine/core/tensor_nn.py deleted file mode 100644 index e2bbc927..00000000 --- a/python_module/megengine/core/tensor_nn.py +++ /dev/null @@ -1,45 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from .tensor import Tensor, tensor - - -class Buffer(Tensor): - r"""A kind of Tensor with ``requires_grad=False``. - """ - - def __init__(self, value, *, dtype=None, device=None, requires_grad=False): - # pylint: disable=super-init-not-called - t = tensor(value, dtype=dtype, device=device, requires_grad=requires_grad) - self.__dict__.update(t.__dict__) - - -class Parameter(Tensor): - r"""A kind of Tensor that is to be considered a module parameter. - """ - - def __init__(self, value, *, dtype=None, device=None, requires_grad=True): - # pylint: disable=super-init-not-called - if isinstance(value, Tensor): - t = value - else: - t = tensor(value, dtype=dtype, device=device, requires_grad=requires_grad) - self.__dict__.update(t.__dict__) - - # broadcast and allreduce will not be performed in optimizer if replica_mode is False - self.replica_mode = True - - @property - def shape(self): - r"""Return shape of parameter. - """ - if self._Tensor__val is not None: - return self._Tensor__val.shape - elif self._Tensor__sym is not None: - return self._Tensor__sym.imm_shape - return None diff --git a/python_module/megengine/data/__init__.py b/python_module/megengine/data/__init__.py deleted file mode 100644 index 3b1e0d55..00000000 --- a/python_module/megengine/data/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from .collator import Collator -from .dataloader import DataLoader -from .sampler import ( - Infinite, - RandomSampler, - ReplacementSampler, - Sampler, - SequentialSampler, -) diff --git a/python_module/megengine/data/_queue.py b/python_module/megengine/data/_queue.py deleted file mode 100644 index 8e359ae0..00000000 --- a/python_module/megengine/data/_queue.py +++ /dev/null @@ -1,144 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import binascii -import os -import queue -import subprocess -from multiprocessing import Queue - -import pyarrow -import pyarrow.plasma as plasma - -MGE_PLASMA_MEMORY = int(os.environ.get("MGE_PLASMA_MEMORY", 4000000000)) # 4GB - -# Each process only need to start one plasma store, so we set it as a global variable. -# TODO: how to share between different processes? -MGE_PLASMA_STORE_MANAGER = None - - -def _clear_plasma_store(): - # `_PlasmaStoreManager.__del__` will not be called automaticly in subprocess, - # so this function should be called explicitly - global MGE_PLASMA_STORE_MANAGER - if MGE_PLASMA_STORE_MANAGER is not None and MGE_PLASMA_STORE_MANAGER.refcount == 0: - del MGE_PLASMA_STORE_MANAGER - MGE_PLASMA_STORE_MANAGER = None - - -class _PlasmaStoreManager: - __initialized = False - - def __init__(self): - self.socket_name = "/tmp/mge_plasma_{}".format( - binascii.hexlify(os.urandom(8)).decode() - ) - debug_flag = bool(os.environ.get("MGE_DATALOADER_PLASMA_DEBUG", 0)) - # NOTE: this is a hack. Directly use `plasma_store` may make subprocess - # difficult to handle the exception happened in `plasma-store-server`. - # For `plasma_store` is just a wrapper of `plasma-store-server`, which use - # `os.execv` to call the executable `plasma-store-server`. - cmd_path = os.path.join(pyarrow.__path__[0], "plasma-store-server") - self.plasma_store = subprocess.Popen( - [cmd_path, "-s", self.socket_name, "-m", str(MGE_PLASMA_MEMORY),], - stdout=None if debug_flag else subprocess.DEVNULL, - stderr=None if debug_flag else subprocess.DEVNULL, - ) - self.__initialized = True - self.refcount = 1 - - def __del__(self): - if self.__initialized and self.plasma_store.returncode is None: - self.plasma_store.kill() - - -class PlasmaShmQueue: - def __init__(self, maxsize: int = 0): - r"""Use pyarrow in-memory plasma store to implement shared memory queue. - - Compared to native `multiprocess.Queue`, `PlasmaShmQueue` avoid pickle/unpickle - and communication overhead, leading to better performance in multi-process - application. - - :type maxsize: int - :param maxsize: maximum size of the queue, `None` means no limit. (default: ``None``) - """ - - # Lazy start the plasma store manager - global MGE_PLASMA_STORE_MANAGER - if MGE_PLASMA_STORE_MANAGER is None: - try: - MGE_PLASMA_STORE_MANAGER = _PlasmaStoreManager() - except Exception as e: - err_info = ( - "Please make sure pyarrow installed correctly!\n" - "You can try reinstall pyarrow and see if you can run " - "`plasma_store -s /tmp/mge_plasma_xxx -m 1000` normally." - ) - raise RuntimeError( - "Exception happened in starting plasma_store: {}\n" - "Tips: {}".format(str(e), err_info) - ) - else: - MGE_PLASMA_STORE_MANAGER.refcount += 1 - - self.socket_name = MGE_PLASMA_STORE_MANAGER.socket_name - - # TODO: how to catch the exception happened in `plasma.connect`? - self.client = None - - # Used to store the header for the data.(ObjectIDs) - self.queue = Queue(maxsize) # type: Queue - - def put(self, data, block=True, timeout=None): - if self.client is None: - self.client = plasma.connect(self.socket_name) - try: - object_id = self.client.put(data) - except plasma.PlasmaStoreFull: - raise RuntimeError("plasma store out of memory!") - try: - self.queue.put(object_id, block, timeout) - except queue.Full: - self.client.delete([object_id]) - raise queue.Full - - def get(self, block=True, timeout=None): - if self.client is None: - self.client = plasma.connect(self.socket_name) - object_id = self.queue.get(block, timeout) - if not self.client.contains(object_id): - raise RuntimeError( - "ObjectID: {} not found in plasma store".format(object_id) - ) - data = self.client.get(object_id) - self.client.delete([object_id]) - return data - - def qsize(self): - return self.queue.qsize() - - def empty(self): - return self.queue.empty() - - def join(self): - self.queue.join() - - def disconnect_client(self): - if self.client is not None: - self.client.disconnect() - - def close(self): - self.queue.close() - self.disconnect_client() - global MGE_PLASMA_STORE_MANAGER - MGE_PLASMA_STORE_MANAGER.refcount -= 1 - _clear_plasma_store() - - def cancel_join_thread(self): - self.queue.cancel_join_thread() diff --git a/python_module/megengine/data/collator.py b/python_module/megengine/data/collator.py deleted file mode 100644 index 952fc398..00000000 --- a/python_module/megengine/data/collator.py +++ /dev/null @@ -1,76 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2016- Facebook, Inc (Adam Paszke) -# Copyright (c) 2014- Facebook, Inc (Soumith Chintala) -# Copyright (c) 2011-2014 Idiap Research Institute (Ronan Collobert) -# Copyright (c) 2012-2014 Deepmind Technologies (Koray Kavukcuoglu) -# Copyright (c) 2011-2012 NEC Laboratories America (Koray Kavukcuoglu) -# Copyright (c) 2011-2013 NYU (Clement Farabet) -# Copyright (c) 2006-2010 NEC Laboratories America (Ronan Collobert, Leon Bottou, Iain Melvin, Jason Weston) -# Copyright (c) 2006 Idiap Research Institute (Samy Bengio) -# Copyright (c) 2001-2004 Idiap Research Institute (Ronan Collobert, Samy Bengio, Johnny Mariethoz) -# --------------------------------------------------------------------- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# -# This file has been modified by Megvii ("Megvii Modifications"). -# All Megvii Modifications are Copyright (C) 2014-2020 Megvii Inc. All rights reserved. -# ---------------------------------------------------------------------- -import collections.abc -import re - -import numpy as np - -np_str_obj_array_pattern = re.compile(r"[aO]") -default_collate_err_msg_format = ( - "default_collator: inputs must contain numpy arrays, numbers, " - "Unicode strings, bytes, dicts or lists; found {}" -) - - -class Collator: - r""" - Used for merge a list of samples to form a mini-batch of Tenor(s). Used when using batched loading from a dataset. - modified from https://github.com/pytorch/pytorch/blob/master/torch/utils/data/_utils/collate.py - """ - - def apply(self, inputs): - """ - input : sequence_N(tuple(CHW, C, CK)) - output : tuple(NCHW, NC, NCK) - """ - elem = inputs[0] - elem_type = type(elem) - if ( - elem_type.__module__ == "numpy" - and elem_type.__name__ != "str_" - and elem_type.__name__ != "string_" - ): - elem = inputs[0] - if elem_type.__name__ == "ndarray": - # array of string classes and object - if np_str_obj_array_pattern.search(elem.dtype.str) is not None: - raise TypeError(default_collate_err_msg_format.format(elem.dtype)) - - return np.ascontiguousarray(np.stack(inputs)) - elif elem.shape == (): # scalars - return np.array(inputs) - elif isinstance(elem, float): - return np.array(inputs, dtype=np.float64) - elif isinstance(elem, int): - return np.array(inputs) - elif isinstance(elem, (str, bytes)): - return inputs - elif isinstance(elem, collections.abc.Mapping): - return {key: self.apply([d[key] for d in inputs]) for key in elem} - elif isinstance(elem, tuple) and hasattr(elem, "_fields"): # namedtuple - return elem_type(*(self.apply(samples) for samples in zip(*inputs))) - elif isinstance(elem, collections.abc.Sequence): - transposed = zip(*inputs) - return [self.apply(samples) for samples in transposed] - - raise TypeError(default_collate_err_msg_format.format(elem_type)) diff --git a/python_module/megengine/data/dataloader.py b/python_module/megengine/data/dataloader.py deleted file mode 100644 index 1fd3482d..00000000 --- a/python_module/megengine/data/dataloader.py +++ /dev/null @@ -1,500 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import collections -import math -import multiprocessing -import queue -import random -import time - -import numpy as np - -from ..logger import get_logger -from ..random.rng import _random_seed_generator -from .collator import Collator -from .dataset import Dataset -from .sampler import Sampler, SequentialSampler -from .transform import PseudoTransform, Transform - -logger = get_logger(__name__) - - -MP_QUEUE_GET_TIMEOUT = 5 - - -class DataLoader: - __initialized = False - - def __init__( - self, - dataset: Dataset, - sampler: Sampler = None, - transform: Transform = None, - collator: Collator = None, - num_workers: int = 0, - timeout: int = 0, - divide: bool = False, - ): - r"""Provides a convenient way to iterate on a given dataset. - - `DataLoader` combines a dataset with sampler, transform and collator, - make it flexible to get minibatch continually from a dataset. - - :type dataset: Dataset - :param dataset: dataset from which to load the minibatch. - :type sampler: Sampler - :param sampler: defines the strategy to sample data from the dataset. - If specified, :attr:`shuffle` must be ``False``. - :type transform: Transform - :param transform: defined the transforming strategy for a sampled batch. - (default: ``None``) - :type collator: Collator - :param collator: defined the merging strategy for a transformed batch. - (default: ``None``) - :type num_workers: int - :param num_workers: the number of sub-process to load, transform and collate - the batch. ``0`` means using single-process. (default: ``0``) - :type timeout: int - :param timeout: if positive, means the timeout value(second) for collecting a - batch from workers. (default: 0) - :type divide: bool - :param divide: define the paralleling strategy in multi-processing mode. - ``True`` means one batch is divided into :attr:`num_workers` pieces, and - the workers will process these pieces parallelly. ``False`` means - different sub-process will process different batch. (default: ``False``) - - """ - - if num_workers < 0: - raise ValueError("num_workers should not be negative") - - if timeout < 0: - raise ValueError("timeout should not be negative") - - if divide and num_workers <= 1: - raise ValueError("divide should not be set to True when num_workers <= 1") - - self.dataset = dataset - self.num_workers = num_workers - self.timeout = timeout - - self.divide = divide - - if sampler is None: - self.sampler = SequentialSampler(dataset, batch_size=1, drop_last=False) - else: - self.sampler = sampler - - if divide: - if self.sampler.batch_size <= self.num_workers: - raise ValueError( - "batch size must not smaller than num_workers in divide mode." - ) - elif self.sampler.batch_size % self.num_workers: - logger.warning( - "batch size is not divisible by num_workers, may lose performance in divide mode." - ) - - if transform is None: - self.transform = PseudoTransform() - else: - self.transform = transform - - if collator is None: - self.collator = Collator() - else: - self.collator = collator - - self.__initialized = True - - def __iter__(self): - if self.num_workers == 0: - return _SerialDataLoaderIter(self) - else: - return _ParallelDataLoaderIter(self) - - def __len__(self): - return len(self.sampler) - - -class _BaseDataLoaderIter: - def __init__(self, loader): - self.dataset = loader.dataset - self.sampler = loader.sampler - self.seed = _random_seed_generator().__next__() - self.transform = loader.transform - self.collator = loader.collator - self.num_workers = loader.num_workers - self.timeout = loader.timeout - self.divide = loader.divide - self.num_processed = 0 - - def _get_next_batch(self): - raise NotImplementedError - - def __len__(self): - return len(self.sampler) - - def __iter__(self): - return self - - def __next__(self): - if self.num_processed >= len(self): - raise StopIteration - minibatch = self._get_next_batch() - self.num_processed += 1 - return minibatch - - -class _SerialDataLoaderIter(_BaseDataLoaderIter): - def __init__(self, loader): - super(_SerialDataLoaderIter, self).__init__(loader) - self.indices_iter = iter(self.sampler) - - def _get_next_batch(self): - indices = next(self.indices_iter) - items = [self.dataset[idx] for idx in indices] - trans_items = self.transform.apply_batch(items) - return self.collator.apply(trans_items) - - -class _ParallelDataLoaderIter(_BaseDataLoaderIter): - __initialized = False - - def __init__(self, loader): - super(_ParallelDataLoaderIter, self).__init__(loader) - - self.task_queues = [ - multiprocessing.Queue(maxsize=2) for _ in range(self.num_workers) - ] - - self.feed_batch_idx = multiprocessing.Value("i", 0) - self.target_batch_idx = multiprocessing.Value("i", 0) - self.shutdown_flag = multiprocessing.Value("i", 0) - - self.trans_data_queues = [ - multiprocessing.Queue(maxsize=1) for _ in range(self.num_workers) - ] - - # use shared-memory queue implemented by pyarrow plasma store. - from ._queue import PlasmaShmQueue - - self.batch_queue = PlasmaShmQueue(maxsize=2) - - self.task_feeding_worker = multiprocessing.Process( - target=_task_feeding_loop, - args=( - iter(self.sampler), - self.task_queues, - self.num_workers, - self.divide, - self.shutdown_flag, - self.feed_batch_idx, - ), - daemon=True, - ) - self.task_feeding_worker.start() - - self.workers = [] - for worker_id in range(self.num_workers): - worker = multiprocessing.Process( - target=_worker_loop, - args=( - self.dataset, - self.task_queues[worker_id], - self.trans_data_queues[worker_id], - self.transform, - self.seed + worker_id + 1, - self.shutdown_flag, - ), - daemon=True, - ) - worker.start() - self.workers.append(worker) - - if self.divide: - self.data_collecting_worker = multiprocessing.Process( - target=_data_gathering_loop, - args=( - self.trans_data_queues, - self.batch_queue, - self.collator, - len(self), - self.num_workers, - self.shutdown_flag, - self.target_batch_idx, - ), - daemon=True, - ) - else: - self.data_collecting_worker = multiprocessing.Process( - target=_data_selecting_loop, - args=( - self.trans_data_queues, - self.batch_queue, - self.collator, - len(self), - self.num_workers, - self.shutdown_flag, - self.target_batch_idx, - ), - daemon=True, - ) - self.data_collecting_worker.start() - - self.__initialized = True - - def _check_workers(self): - # Check the status of each worker. - if not self.data_collecting_worker.is_alive(): - exitcode = self.task_feeding_worker.exitcode - if exitcode != 0: - raise RuntimeError("data collecting worker died. {}".format(exitcode)) - - if not self.task_feeding_worker.is_alive(): - exitcode = self.task_feeding_worker.exitcode - if exitcode != 0: - raise RuntimeError("task feeding worker died. {}".format(exitcode)) - - for worker_id, worker in enumerate(self.workers): - if not worker.is_alive(): - exitcode = worker.exitcode - if exitcode != 0: - raise RuntimeError("worker:{} died. {}".format(worker_id, exitcode)) - - logger.debug("all workers are alive.") - - def _try_get_next_batch(self): - start_time = time.time() - while True: - self._check_workers() - try: - return self.batch_queue.get(timeout=1) - except queue.Empty: - logger.debug("batch queue empty!") - waited_time = time.time() - start_time - if self.timeout > 0: - if waited_time > self.timeout: - raise RuntimeError("get_next_batch timeout!") - - def _get_next_batch(self): - batch_data = self._try_get_next_batch() - return batch_data - - def _shutdown(self): - with self.shutdown_flag.get_lock(): - self.shutdown_flag.value = 1 - - if self.task_feeding_worker.is_alive(): - self.task_feeding_worker.terminate() - self.task_feeding_worker.join() - - if self.data_collecting_worker.is_alive(): - self.data_collecting_worker.terminate() - self.data_collecting_worker.join() - - for worker in self.workers: - if worker.is_alive(): - worker.terminate() - worker.join() - - for q in self.trans_data_queues: - q.cancel_join_thread() - q.close() - - for q in self.task_queues: - q.cancel_join_thread() - q.close() - - self.batch_queue.cancel_join_thread() - self.batch_queue.close() - - def __del__(self): - if self.__initialized: - self._shutdown() - - -def _task_feeding_loop( - indices_iter, task_queues, num_workers, divide, shutdown_flag, feed_batch_idx -): - # Feed the indices into the task queues - while True: - if shutdown_flag.value == 1: - break - batch_idx = feed_batch_idx.value - try: - indices = next(indices_iter) - except StopIteration: - break - if divide: - # make sure all task_queues is ready for put - while any([q.full() for q in task_queues]): - if shutdown_flag.value == 1: - return - # divide into small pieces, feed to different workers. - sub_num = math.ceil(len(indices) / num_workers) - for worker_id in range(num_workers): - sub_indices = indices[worker_id * sub_num : (worker_id + 1) * sub_num] - task_queues[worker_id].put((batch_idx, sub_indices)) - else: - # distribute tasks to different workers uniformly. - target_id = batch_idx % num_workers - while task_queues[target_id].full(): - if shutdown_flag.value == 1: - return - task_queues[target_id].put((batch_idx, indices)) - with feed_batch_idx.get_lock(): - feed_batch_idx.value += 1 - - -def _worker_loop(dataset, task_queue, trans_data_queue, transform, seed, shutdown_flag): - # Get dataset items and do the transform - random.seed(seed) - np.random.seed(seed) - while True: - if shutdown_flag.value == 1: - break - try: - batch_idx, indices = task_queue.get(timeout=MP_QUEUE_GET_TIMEOUT) - except queue.Empty: - continue - if len(indices) > 0: - items = [dataset[idx] for idx in indices] - trans_items = transform.apply_batch(items) - else: - # in case of incomplete last batch - trans_items = () - while True: - try: - trans_data_queue.put((batch_idx, trans_items), timeout=1) - break - except queue.Full: - if shutdown_flag.value == 1: - break - logger.debug("batch part queue is full!") - - -def _data_gathering_loop( - trans_data_queues, - batch_queue, - collator, - length, - num_workers, - shutdown_flag, - target_idx, -): - # Gathering the small pieces of batch data into full batch data - while True: - if shutdown_flag.value == 1: - break - - target_batch_idx = target_idx.value - - if target_batch_idx >= length: - break - - full_trans_items = [] - for worker_id in range(num_workers): - while True: - try: - batch_idx, trans_items = trans_data_queues[worker_id].get( - timeout=MP_QUEUE_GET_TIMEOUT - ) - break - except queue.Empty: - if shutdown_flag.value == 1: - break - logger.debug( - "worker:{} data queue get timeout! target batch idx:{}".format( - worker_id, target_batch_idx - ) - ) - if batch_idx != target_batch_idx: - raise RuntimeError( - "Unexperted batch_idx in data gathering loop. worker_id:{}.".format( - worker_id - ) - ) - else: - full_trans_items.extend(trans_items) - - # Merge different parts into a batch. - full_batch = collator.apply(full_trans_items) - - while True: - try: - batch_queue.put(full_batch, timeout=1) - break - except queue.Full: - if shutdown_flag.value == 1: - break - logger.debug("batch queue is full!") - - with target_idx.get_lock(): - target_idx.value += 1 - - batch_queue.disconnect_client() - - -def _data_selecting_loop( - trans_data_queues, - batch_queue, - collator, - length, - num_workers, - shutdown_flag, - target_idx, -): - # Make sure that batch is generated exactly with the same order as generated indices - while True: - if shutdown_flag.value == 1: - break - - target_batch_idx = target_idx.value - - if target_batch_idx >= length: - break - - target_worker_id = target_batch_idx % num_workers - while True: - try: - batch_idx, trans_items = trans_data_queues[target_worker_id].get( - timeout=MP_QUEUE_GET_TIMEOUT - ) - batch_data = collator.apply(trans_items) - break - except queue.Empty: - if shutdown_flag.value == 1: - break - logger.debug( - "worker:{} data queue get timeout! target batch idx:{}".format( - target_worker_id, target_batch_idx - ) - ) - - if batch_idx != target_batch_idx: - raise RuntimeError( - "batch_idx {} mismatch the target_batch_idx {}".format( - batch_idx, target_batch_idx - ) - ) - - while True: - try: - batch_queue.put(batch_data, timeout=1) - break - except queue.Full: - if shutdown_flag.value == 1: - break - logger.debug("batch queue is full!") - - with target_idx.get_lock(): - target_idx.value += 1 - - batch_queue.disconnect_client() diff --git a/python_module/megengine/data/dataset/__init__.py b/python_module/megengine/data/dataset/__init__.py deleted file mode 100644 index 8b70d221..00000000 --- a/python_module/megengine/data/dataset/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from .meta_dataset import ArrayDataset, Dataset, MapDataset, StreamDataset -from .vision import * diff --git a/python_module/megengine/data/dataset/meta_dataset.py b/python_module/megengine/data/dataset/meta_dataset.py deleted file mode 100644 index 4415a427..00000000 --- a/python_module/megengine/data/dataset/meta_dataset.py +++ /dev/null @@ -1,73 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from abc import ABC, abstractmethod -from typing import Tuple - - -class Dataset(ABC): - r""" - An abstract class for all Datasets - """ - - @abstractmethod - def __init__(self): - pass - - -class MapDataset(Dataset): - r""" - An abstract class for map data - __getitem__ and __len__ method are aditionally needed - """ - - @abstractmethod - def __init__(self): - pass - - @abstractmethod - def __getitem__(self, index): - pass - - @abstractmethod - def __len__(self): - pass - - -class StreamDataset(Dataset): - r""" - An abstract class for stream data - __iter__ method is aditionally needed - """ - - @abstractmethod - def __init__(self): - pass - - @abstractmethod - def __iter__(self): - pass - - -class ArrayDataset(MapDataset): - def __init__(self, *arrays): - r""" - ArrayDataset is a dataset for numpy array data, one or more numpy arrays - are needed to initiate the dataset. And the dimensions represented sample number - are expected to be the same. - """ - super().__init__() - if not all(len(arrays[0]) == len(array) for array in arrays): - raise ValueError("lengths of input arrays are inconsistent") - self.arrays = arrays - - def __getitem__(self, index: int) -> Tuple: - return tuple(array[index] for array in self.arrays) - - def __len__(self) -> int: - return len(self.arrays[0]) diff --git a/python_module/megengine/data/dataset/vision/__init__.py b/python_module/megengine/data/dataset/vision/__init__.py deleted file mode 100644 index dd2b0fc3..00000000 --- a/python_module/megengine/data/dataset/vision/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from .cifar import CIFAR10, CIFAR100 -from .cityscapes import Cityscapes -from .coco import COCO -from .folder import ImageFolder -from .imagenet import ImageNet -from .meta_vision import VisionDataset -from .mnist import MNIST -from .objects365 import Objects365 -from .voc import PascalVOC diff --git a/python_module/megengine/data/dataset/vision/cifar.py b/python_module/megengine/data/dataset/vision/cifar.py deleted file mode 100644 index 9ce73688..00000000 --- a/python_module/megengine/data/dataset/vision/cifar.py +++ /dev/null @@ -1,171 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import os -import pickle -import tarfile -from typing import Tuple - -import numpy as np - -from ....logger import get_logger -from .meta_vision import VisionDataset -from .utils import _default_dataset_root, load_raw_data_from_url - -logger = get_logger(__name__) - - -class CIFAR10(VisionDataset): - r""" ``Dataset`` for CIFAR10 meta data - """ - - url_path = "http://www.cs.utoronto.ca/~kriz/" - raw_file_name = "cifar-10-python.tar.gz" - raw_file_md5 = "c58f30108f718f92721af3b95e74349a" - raw_file_dir = "cifar-10-batches-py" - train_batch = [ - "data_batch_1", - "data_batch_2", - "data_batch_3", - "data_batch_4", - "data_batch_5", - ] - test_batch = ["test_batch"] - meta_info = {"name": "batches.meta"} - - def __init__( - self, - root: str = None, - train: bool = True, - download: bool = True, - timeout: int = 500, - ): - super().__init__(root, order=("image", "image_category")) - - self.timeout = timeout - - # process the root path - if root is None: - self.root = self._default_root - if not os.path.exists(self.root): - os.makedirs(self.root) - else: - self.root = root - if not os.path.exists(self.root): - if download: - logger.debug( - "dir %s does not exist, will be automatically created", - self.root, - ) - os.makedirs(self.root) - else: - raise ValueError("dir %s does not exist" % self.root) - - self.target_file = os.path.join(self.root, self.raw_file_dir) - - # check existence of target pickle dir, if exists load the - # pickle file no matter what download is set - if os.path.exists(self.target_file): - if train: - self.arrays = self.bytes2array(self.train_batch) - else: - self.arrays = self.bytes2array(self.test_batch) - else: - if download: - self.download() - if train: - self.arrays = self.bytes2array(self.train_batch) - else: - self.arrays = self.bytes2array(self.test_batch) - else: - raise ValueError( - "dir does not contain target file %s, please set download=True" - % (self.target_file) - ) - - def __getitem__(self, index: int) -> Tuple: - return tuple(array[index] for array in self.arrays) - - def __len__(self) -> int: - return len(self.arrays[0]) - - @property - def _default_root(self): - return os.path.join(_default_dataset_root(), self.__class__.__name__) - - @property - def meta(self): - meta_path = os.path.join(self.root, self.raw_file_dir, self.meta_info["name"]) - with open(meta_path, "rb") as f: - meta = pickle.load(f, encoding="bytes") - return meta - - def download(self): - url = self.url_path + self.raw_file_name - load_raw_data_from_url( - url, self.raw_file_name, self.raw_file_md5, self.root, self.timeout - ) - self.process() - - def untar(self, file_path, dirs): - assert file_path.endswith(".tar.gz") - logger.debug("untar file %s to %s", file_path, dirs) - t = tarfile.open(file_path) - t.extractall(path=dirs) - - def bytes2array(self, filenames): - data = [] - label = [] - for filename in filenames: - path = os.path.join(self.root, self.raw_file_dir, filename) - logger.debug("unpickle file %s", path) - with open(path, "rb") as fo: - dic = pickle.load(fo, encoding="bytes") - batch_data = dic[b"data"].reshape(-1, 3, 32, 32).transpose((0, 2, 3, 1)) - data.extend(list(batch_data[..., [2, 1, 0]])) - label.extend(dic[b"labels"]) - label = np.array(label, dtype=np.int32) - return (data, label) - - def process(self): - logger.info("process raw data ...") - self.untar(os.path.join(self.root, self.raw_file_name), self.root) - - -class CIFAR100(CIFAR10): - url_path = "http://www.cs.utoronto.ca/~kriz/" - raw_file_name = "cifar-100-python.tar.gz" - raw_file_md5 = "eb9058c3a382ffc7106e4002c42a8d85" - raw_file_dir = "cifar-100-python" - train_batch = ["train"] - test_batch = ["test"] - meta_info = {"name": "meta"} - - @property - def meta(self): - meta_path = os.path.join(self.root, self.raw_file_dir, self.meta_info["name"]) - with open(meta_path, "rb") as f: - meta = pickle.load(f, encoding="bytes") - return meta - - def bytes2array(self, filenames): - data = [] - fine_label = [] - coarse_label = [] - for filename in filenames: - path = os.path.join(self.root, self.raw_file_dir, filename) - logger.debug("unpickle file %s", path) - with open(path, "rb") as fo: - dic = pickle.load(fo, encoding="bytes") - batch_data = dic[b"data"].reshape(-1, 3, 32, 32).transpose((0, 2, 3, 1)) - data.extend(list(batch_data[..., [2, 1, 0]])) - fine_label.extend(dic[b"fine_labels"]) - coarse_label.extend(dic[b"coarse_labels"]) - fine_label = np.array(fine_label, dtype=np.int32) - coarse_label = np.array(coarse_label, dtype=np.int32) - return data, fine_label, coarse_label diff --git a/python_module/megengine/data/dataset/vision/cityscapes.py b/python_module/megengine/data/dataset/vision/cityscapes.py deleted file mode 100644 index aa05ac92..00000000 --- a/python_module/megengine/data/dataset/vision/cityscapes.py +++ /dev/null @@ -1,151 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# --------------------------------------------------------------------- -# Part of the following code in this file refs to torchvision -# BSD 3-Clause License -# -# Copyright (c) Soumith Chintala 2016, -# All rights reserved. -# --------------------------------------------------------------------- -import json -import os - -import cv2 -import numpy as np - -from .meta_vision import VisionDataset - - -class Cityscapes(VisionDataset): - r"""`Cityscapes `_ Dataset. - """ - - supported_order = ( - "image", - "mask", - "info", - ) - - def __init__(self, root, image_set, mode, *, order=None): - super().__init__(root, order=order, supported_order=self.supported_order) - - city_root = self.root - if not os.path.isdir(city_root): - raise RuntimeError("Dataset not found or corrupted.") - - self.mode = mode - self.images_dir = os.path.join(city_root, "leftImg8bit", image_set) - self.masks_dir = os.path.join(city_root, self.mode, image_set) - self.images, self.masks = [], [] - # self.target_type = ["instance", "semantic", "polygon", "color"] - - # for semantic segmentation - if mode == "gtFine": - valid_modes = ("train", "test", "val") - else: - valid_modes = ("train", "train_extra", "val") - - for city in os.listdir(self.images_dir): - img_dir = os.path.join(self.images_dir, city) - mask_dir = os.path.join(self.masks_dir, city) - for file_name in os.listdir(img_dir): - mask_name = "{}_{}".format( - file_name.split("_leftImg8bit")[0], - self._get_target_suffix(self.mode, "semantic"), - ) - self.images.append(os.path.join(img_dir, file_name)) - self.masks.append(os.path.join(mask_dir, mask_name)) - - def __getitem__(self, index): - target = [] - for k in self.order: - if k == "image": - image = cv2.imread(self.images[index], cv2.IMREAD_COLOR) - target.append(image) - elif k == "mask": - mask = cv2.imread(self.masks[index], cv2.IMREAD_GRAYSCALE) - mask = self._trans_mask(mask) - mask = mask[:, :, np.newaxis] - target.append(mask) - elif k == "info": - if image is None: - image = cv2.imread(self.images[index], cv2.IMREAD_COLOR) - info = [image.shape[0], image.shape[1], self.images[index]] - target.append(info) - else: - raise NotImplementedError - - return tuple(target) - - def __len__(self): - return len(self.images) - - def _trans_mask(self, mask): - trans_labels = [ - 7, - 8, - 11, - 12, - 13, - 17, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 27, - 28, - 31, - 32, - 33, - ] - label = np.ones(mask.shape) * 255 - for i, tl in enumerate(trans_labels): - label[mask == tl] = i - return label.astype(np.uint8) - - def _get_target_suffix(self, mode, target_type): - if target_type == "instance": - return "{}_instanceIds.png".format(mode) - elif target_type == "semantic": - return "{}_labelIds.png".format(mode) - elif target_type == "color": - return "{}_color.png".format(mode) - else: - return "{}_polygons.json".format(mode) - - def _load_json(self, path): - with open(path, "r") as file: - data = json.load(file) - return data - - class_names = ( - "road", - "sidewalk", - "building", - "wall", - "fence", - "pole", - "traffic light", - "traffic sign", - "vegetation", - "terrain", - "sky", - "person", - "rider", - "car", - "truck", - "bus", - "train", - "motorcycle", - "bicycle", - ) diff --git a/python_module/megengine/data/dataset/vision/coco.py b/python_module/megengine/data/dataset/vision/coco.py deleted file mode 100644 index 11366de0..00000000 --- a/python_module/megengine/data/dataset/vision/coco.py +++ /dev/null @@ -1,366 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# --------------------------------------------------------------------- -# Part of the following code in this file refs to maskrcnn-benchmark -# MIT License -# -# Copyright (c) 2018 Facebook -# --------------------------------------------------------------------- -import json -import os -from collections import defaultdict - -import cv2 -import numpy as np - -from .meta_vision import VisionDataset - -min_keypoints_per_image = 10 - - -def _count_visible_keypoints(anno): - return sum(sum(1 for v in ann["keypoints"][2::3] if v > 0) for ann in anno) - - -def has_valid_annotation(anno, order): - # if it"s empty, there is no annotation - if len(anno) == 0: - return False - if "boxes" in order or "boxes_category" in order: - if "bbox" not in anno[0]: - return False - if "keypoints" in order: - if "keypoints" not in anno[0]: - return False - # for keypoint detection tasks, only consider valid images those - # containing at least min_keypoints_per_image - if _count_visible_keypoints(anno) < min_keypoints_per_image: - return False - return True - - -class COCO(VisionDataset): - r"""`MS COCO `_ Dataset. - """ - - supported_order = ( - "image", - "boxes", - "boxes_category", - "keypoints", - # TODO: need to check - # "polygons", - "info", - ) - - def __init__( - self, root, ann_file, remove_images_without_annotations=False, *, order=None - ): - super().__init__(root, order=order, supported_order=self.supported_order) - - with open(ann_file, "r") as f: - dataset = json.load(f) - - self.imgs = dict() - for img in dataset["images"]: - # for saving memory - if "license" in img: - del img["license"] - if "coco_url" in img: - del img["coco_url"] - if "date_captured" in img: - del img["date_captured"] - if "flickr_url" in img: - del img["flickr_url"] - self.imgs[img["id"]] = img - - self.img_to_anns = defaultdict(list) - for ann in dataset["annotations"]: - # for saving memory - if ( - "boxes" not in self.order - and "boxes_category" not in self.order - and "bbox" in ann - ): - del ann["bbox"] - if "polygons" not in self.order and "segmentation" in ann: - del ann["segmentation"] - self.img_to_anns[ann["image_id"]].append(ann) - - self.cats = dict() - for cat in dataset["categories"]: - self.cats[cat["id"]] = cat - - self.ids = list(sorted(self.imgs.keys())) - - # filter images without detection annotations - if remove_images_without_annotations: - ids = [] - for img_id in self.ids: - anno = self.img_to_anns[img_id] - # filter crowd annotations - anno = [obj for obj in anno if obj["iscrowd"] == 0] - anno = [ - obj for obj in anno if obj["bbox"][2] > 0 and obj["bbox"][3] > 0 - ] - if has_valid_annotation(anno, order): - ids.append(img_id) - self.img_to_anns[img_id] = anno - else: - del self.imgs[img_id] - del self.img_to_anns[img_id] - self.ids = ids - - self.json_category_id_to_contiguous_id = { - v: i + 1 for i, v in enumerate(sorted(self.cats.keys())) - } - - self.contiguous_category_id_to_json_id = { - v: k for k, v in self.json_category_id_to_contiguous_id.items() - } - - def __getitem__(self, index): - img_id = self.ids[index] - anno = self.img_to_anns[img_id] - - target = [] - for k in self.order: - if k == "image": - file_name = self.imgs[img_id]["file_name"] - path = os.path.join(self.root, file_name) - image = cv2.imread(path, cv2.IMREAD_COLOR) - target.append(image) - elif k == "boxes": - boxes = [obj["bbox"] for obj in anno] - boxes = np.array(boxes, dtype=np.float32).reshape(-1, 4) - # transfer boxes from xywh to xyxy - boxes[:, 2:] += boxes[:, :2] - target.append(boxes) - elif k == "boxes_category": - boxes_category = [obj["category_id"] for obj in anno] - boxes_category = [ - self.json_category_id_to_contiguous_id[c] for c in boxes_category - ] - boxes_category = np.array(boxes_category, dtype=np.int32) - target.append(boxes_category) - elif k == "keypoints": - keypoints = [obj["keypoints"] for obj in anno] - keypoints = np.array(keypoints, dtype=np.float32).reshape( - -1, len(self.keypoint_names), 3 - ) - target.append(keypoints) - elif k == "polygons": - polygons = [obj["segmentation"] for obj in anno] - polygons = [ - [np.array(p, dtype=np.float32).reshape(-1, 2) for p in ps] - for ps in polygons - ] - target.append(polygons) - elif k == "info": - info = self.imgs[img_id] - info = [info["height"], info["width"], info["file_name"]] - target.append(info) - else: - raise NotImplementedError - - return tuple(target) - - def __len__(self): - return len(self.ids) - - def get_img_info(self, index): - img_id = self.ids[index] - img_info = self.imgs[img_id] - return img_info - - class_names = ( - "person", - "bicycle", - "car", - "motorcycle", - "airplane", - "bus", - "train", - "truck", - "boat", - "traffic light", - "fire hydrant", - "stop sign", - "parking meter", - "bench", - "bird", - "cat", - "dog", - "horse", - "sheep", - "cow", - "elephant", - "bear", - "zebra", - "giraffe", - "backpack", - "umbrella", - "handbag", - "tie", - "suitcase", - "frisbee", - "skis", - "snowboard", - "sports ball", - "kite", - "baseball bat", - "baseball glove", - "skateboard", - "surfboard", - "tennis racket", - "bottle", - "wine glass", - "cup", - "fork", - "knife", - "spoon", - "bowl", - "banana", - "apple", - "sandwich", - "orange", - "broccoli", - "carrot", - "hot dog", - "pizza", - "donut", - "cake", - "chair", - "couch", - "potted plant", - "bed", - "dining table", - "toilet", - "tv", - "laptop", - "mouse", - "remote", - "keyboard", - "cell phone", - "microwave", - "oven", - "toaster", - "sink", - "refrigerator", - "book", - "clock", - "vase", - "scissors", - "teddy bear", - "hair drier", - "toothbrush", - ) - - classes_originID = { - "person": 1, - "bicycle": 2, - "car": 3, - "motorcycle": 4, - "airplane": 5, - "bus": 6, - "train": 7, - "truck": 8, - "boat": 9, - "traffic light": 10, - "fire hydrant": 11, - "stop sign": 13, - "parking meter": 14, - "bench": 15, - "bird": 16, - "cat": 17, - "dog": 18, - "horse": 19, - "sheep": 20, - "cow": 21, - "elephant": 22, - "bear": 23, - "zebra": 24, - "giraffe": 25, - "backpack": 27, - "umbrella": 28, - "handbag": 31, - "tie": 32, - "suitcase": 33, - "frisbee": 34, - "skis": 35, - "snowboard": 36, - "sports ball": 37, - "kite": 38, - "baseball bat": 39, - "baseball glove": 40, - "skateboard": 41, - "surfboard": 42, - "tennis racket": 43, - "bottle": 44, - "wine glass": 46, - "cup": 47, - "fork": 48, - "knife": 49, - "spoon": 50, - "bowl": 51, - "banana": 52, - "apple": 53, - "sandwich": 54, - "orange": 55, - "broccoli": 56, - "carrot": 57, - "hot dog": 58, - "pizza": 59, - "donut": 60, - "cake": 61, - "chair": 62, - "couch": 63, - "potted plant": 64, - "bed": 65, - "dining table": 67, - "toilet": 70, - "tv": 72, - "laptop": 73, - "mouse": 74, - "remote": 75, - "keyboard": 76, - "cell phone": 77, - "microwave": 78, - "oven": 79, - "toaster": 80, - "sink": 81, - "refrigerator": 82, - "book": 84, - "clock": 85, - "vase": 86, - "scissors": 87, - "teddy bear": 88, - "hair drier": 89, - "toothbrush": 90, - } - - keypoint_names = ( - "nose", - "left_eye", - "right_eye", - "left_ear", - "right_ear", - "left_shoulder", - "right_shoulder", - "left_elbow", - "right_elbow", - "left_wrist", - "right_wrist", - "left_hip", - "right_hip", - "left_knee", - "right_knee", - "left_ankle", - "right_ankle", - ) diff --git a/python_module/megengine/data/dataset/vision/folder.py b/python_module/megengine/data/dataset/vision/folder.py deleted file mode 100644 index 7124ef56..00000000 --- a/python_module/megengine/data/dataset/vision/folder.py +++ /dev/null @@ -1,90 +0,0 @@ -# -*- coding: utf-8 -*- -# BSD 3-Clause License - -# Copyright (c) Soumith Chintala 2016, -# All rights reserved. -# --------------------------------------------------------------------- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# -# This file has been modified by Megvii ("Megvii Modifications"). -# All Megvii Modifications are Copyright (C) 2014-2020 Megvii Inc. All rights reserved. -# --------------------------------------------------------------------- -import os -from typing import Dict, List, Tuple - -import cv2 -import numpy as np - -from .meta_vision import VisionDataset -from .utils import is_img - - -class ImageFolder(VisionDataset): - def __init__(self, root: str, check_valid_func=None, class_name: bool = False): - r""" - ImageFolder is a class for loading image data and labels from a organized folder. - - the folder is expected to be organized as followed - root/cls/xxx.img_ext - - labels are indices of sorted classes in the root directory - - :param root: root directory of an image folder - :param loader: a function used to load image from path, - if ``None``, default function that loads - images with PILwill be called - :param check_valid_func: a function used to check if files in folder are - expected image files, if ``None``, default function - that checks file extensions will be called - :param class_name: if ``True``, return class name instead of class index - - """ - super().__init__(root, order=("image", "image_category")) - - self.root = root - - if check_valid_func is not None: - self.check_valid = check_valid_func - else: - self.check_valid = is_img - - self.class_name = class_name - - self.class_dict = self.collect_class() - self.samples = self.collect_samples() - - def collect_samples(self) -> List: - samples = [] - directory = os.path.expanduser(self.root) - for key in sorted(self.class_dict.keys()): - d = os.path.join(directory, key) - if not os.path.isdir(d): - continue - for r, _, filename in sorted(os.walk(d, followlinks=True)): - for name in sorted(filename): - path = os.path.join(r, name) - if self.check_valid(path): - if self.class_name: - samples.append((path, key)) - else: - samples.append((path, self.class_dict[key])) - return samples - - def collect_class(self) -> Dict: - classes = [d.name for d in os.scandir(self.root) if d.is_dir()] - classes.sort() - return {classes[i]: np.int32(i) for i in range(len(classes))} - - def __getitem__(self, index: int) -> Tuple: - path, label = self.samples[index] - img = cv2.imread(path, cv2.IMREAD_COLOR) - return img, label - - def __len__(self): - return len(self.samples) diff --git a/python_module/megengine/data/dataset/vision/imagenet.py b/python_module/megengine/data/dataset/vision/imagenet.py deleted file mode 100644 index 449401bf..00000000 --- a/python_module/megengine/data/dataset/vision/imagenet.py +++ /dev/null @@ -1,248 +0,0 @@ -# -*- coding: utf-8 -*- -# BSD 3-Clause License -# -# Copyright (c) Soumith Chintala 2016, -# All rights reserved. -# --------------------------------------------------------------------- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# -# This file has been modified by Megvii ("Megvii Modifications"). -# All Megvii Modifications are Copyright (C) 2014-2020 Megvii Inc. All rights reserved. -# --------------------------------------------------------------------- -import os -import shutil - -from tqdm import tqdm - -from ....core.serialization import load, save -from ....distributed.util import is_distributed -from ....logger import get_logger -from .folder import ImageFolder -from .utils import _default_dataset_root, calculate_md5, untar, untargz - -logger = get_logger(__name__) - - -class ImageNet(ImageFolder): - r""" - Load ImageNet from raw files or folder, expected folder looks like - - .. code-block:: bash - - ${root}/ - | [REQUIRED TAR FILES] - |- ILSVRC2012_img_train.tar - |- ILSVRC2012_img_val.tar - |- ILSVRC2012_devkit_t12.tar.gz - | [OPTIONAL IMAGE FOLDERS] - |- train/cls/xxx.${img_ext} - |- val/cls/xxx.${img_ext} - |- ILSVRC2012_devkit_t12/data/meta.mat - |- ILSVRC2012_devkit_t12/data/ILSVRC2012_validation_ground_truth.txt - - If the image folders don't exist, raw tar files are required to get extracted and processed. - """ - - raw_file_meta = { - "train": ("ILSVRC2012_img_train.tar", "1d675b47d978889d74fa0da5fadfb00e"), - "val": ("ILSVRC2012_img_val.tar", "29b22e2961454d5413ddabcf34fc5622"), - "devkit": ("ILSVRC2012_devkit_t12.tar.gz", "fa75699e90414af021442c21a62c3abf"), - } # ImageNet raw files - default_train_dir = "train" - default_val_dir = "val" - default_devkit_dir = "ILSVRC2012_devkit_t12" - - def __init__(self, root: str = None, train: bool = True, **kwargs): - r""" - initialization: - - * if ``root`` contains ``self.target_folder`` depent on ``train``: - - * initialize ImageFolder with target_folder - - * else: - - * if all raw files are in ``root``: - - * parse ``self.target_folder`` from raw files - * initialize ImageFolder with ``self.target_folder`` - - * else: - - * raise error - - :param root: root directory of imagenet data, if root is ``None``, used default_dataset_root - :param train: if ``True``, load the train split, otherwise load the validation split - """ - - # process the root path - if root is None: - self.root = self._default_root - else: - self.root = root - - if not os.path.exists(self.root): - raise FileNotFoundError("dir %s does not exist" % self.root) - - self.devkit_dir = os.path.join(self.root, self.default_devkit_dir) - - if not os.path.exists(self.devkit_dir): - logger.warning("devkit directory %s does not exists", self.devkit_dir) - self._prepare_devkit() - - self.train = train - - if train: - self.target_folder = os.path.join(self.root, self.default_train_dir) - else: - self.target_folder = os.path.join(self.root, self.default_val_dir) - - if not os.path.exists(self.target_folder): - logger.warning( - "expected image folder %s does not exist, try to load from raw file", - self.target_folder, - ) - if not self.check_raw_file(): - raise FileNotFoundError( - "expected image folder %s does not exist, and raw files do not exist in %s" - % (self.target_folder, self.root) - ) - elif is_distributed(): - raise RuntimeError( - "extracting raw file shouldn't be done in distributed mode, use single process instead" - ) - elif train: - self._prepare_train() - else: - self._prepare_val() - - super().__init__(self.target_folder, **kwargs) - - @property - def _default_root(self): - return os.path.join(_default_dataset_root(), self.__class__.__name__) - - @property - def valid_ground_truth(self): - groud_truth_path = os.path.join( - self.devkit_dir, "data", "ILSVRC2012_validation_ground_truth.txt" - ) - if os.path.exists(groud_truth_path): - with open(groud_truth_path, "r") as f: - val_labels = f.readlines() - return [int(val_label) for val_label in val_labels] - else: - raise FileNotFoundError( - "valid ground truth file %s does not exist" % groud_truth_path - ) - - @property - def meta(self): - try: - return load(os.path.join(self.devkit_dir, "meta.pkl")) - except FileNotFoundError: - import scipy.io - - meta_path = os.path.join(self.devkit_dir, "data", "meta.mat") - if not os.path.exists(meta_path): - raise FileNotFoundError("meta file %s does not exist" % meta_path) - meta = scipy.io.loadmat(meta_path, squeeze_me=True)["synsets"] - nums_children = list(zip(*meta))[4] - meta = [ - meta[idx] - for idx, num_children in enumerate(nums_children) - if num_children == 0 - ] - idcs, wnids, classes = list(zip(*meta))[:3] - classes = [tuple(clss.split(", ")) for clss in classes] - idx_to_wnid = dict(zip(idcs, wnids)) - wnid_to_classes = dict(zip(wnids, classes)) - logger.info( - "saving cached meta file to %s", - os.path.join(self.devkit_dir, "meta.pkl"), - ) - save( - (idx_to_wnid, wnid_to_classes), - os.path.join(self.devkit_dir, "meta.pkl"), - ) - return idx_to_wnid, wnid_to_classes - - def check_raw_file(self) -> bool: - return all( - [ - os.path.exists(os.path.join(self.root, value[0])) - for _, value in self.raw_file_meta.items() - ] - ) - - def _organize_val_data(self): - id2wnid = self.meta[0] - val_idcs = self.valid_ground_truth - val_wnids = [id2wnid[idx] for idx in val_idcs] - - val_images = sorted( - [ - os.path.join(self.target_folder, image) - for image in os.listdir(self.target_folder) - ] - ) - - logger.debug("mkdir for val set wnids") - for wnid in set(val_wnids): - os.makedirs(os.path.join(self.root, self.default_val_dir, wnid)) - - logger.debug("mv val images into wnids dir") - for wnid, img_file in tqdm(zip(val_wnids, val_images)): - shutil.move( - img_file, - os.path.join( - self.root, self.default_val_dir, wnid, os.path.basename(img_file) - ), - ) - - def _prepare_val(self): - assert not self.train - raw_filename, checksum = self.raw_file_meta["val"] - raw_file = os.path.join(self.root, raw_filename) - logger.info("checksum valid tar file %s ...", raw_file) - assert ( - calculate_md5(raw_file) == checksum - ), "checksum mismatch, {} may be damaged".format(raw_file) - logger.info("extract valid tar file... this may take 10-20 minutes") - untar(os.path.join(self.root, raw_file), self.target_folder) - self._organize_val_data() - - def _prepare_train(self): - assert self.train - raw_filename, checksum = self.raw_file_meta["train"] - raw_file = os.path.join(self.root, raw_filename) - logger.info("checksum train tar file %s ...", raw_file) - assert ( - calculate_md5(raw_file) == checksum - ), "checksum mismatch, {} may be damaged".format(raw_file) - logger.info("extract train tar file.. this may take several hours") - untar( - os.path.join(self.root, raw_file), self.target_folder, - ) - paths = [ - os.path.join(self.target_folder, child_dir) - for child_dir in os.listdir(self.target_folder) - ] - for path in tqdm(paths): - untar(path, os.path.splitext(path)[0], remove=True) - - def _prepare_devkit(self): - raw_filename, checksum = self.raw_file_meta["devkit"] - raw_file = os.path.join(self.root, raw_filename) - logger.info("checksum devkit tar file %s ...", raw_file) - assert ( - calculate_md5(raw_file) == checksum - ), "checksum mismatch, {} may be damaged".format(raw_file) - logger.info("extract devkit file..") - untargz(os.path.join(self.root, self.raw_file_meta["devkit"][0])) diff --git a/python_module/megengine/data/dataset/vision/meta_vision.py b/python_module/megengine/data/dataset/vision/meta_vision.py deleted file mode 100644 index 6d03d3ed..00000000 --- a/python_module/megengine/data/dataset/vision/meta_vision.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import collections.abc -import os - -from ..meta_dataset import MapDataset - - -class VisionDataset(MapDataset): - _repr_indent = 4 - - def __init__(self, root, *, order=None, supported_order=None): - if isinstance(root, (str, bytes)): - root = os.path.expanduser(root) - self.root = root - - if order is None: - order = ("image",) - if not isinstance(order, collections.abc.Sequence): - raise ValueError( - "order should be a sequence, but got order={}".format(order) - ) - - if supported_order is not None: - assert isinstance(supported_order, collections.abc.Sequence) - for k in order: - if k not in supported_order: - raise NotImplementedError("{} is unsupported data type".format(k)) - self.order = order - - def __getitem__(self, index): - raise NotImplementedError - - def __len__(self): - raise NotImplementedError diff --git a/python_module/megengine/data/dataset/vision/mnist.py b/python_module/megengine/data/dataset/vision/mnist.py deleted file mode 100644 index 5e89a314..00000000 --- a/python_module/megengine/data/dataset/vision/mnist.py +++ /dev/null @@ -1,197 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import gzip -import os -import struct -from typing import Tuple - -import numpy as np -from tqdm import tqdm - -from ....logger import get_logger -from .meta_vision import VisionDataset -from .utils import _default_dataset_root, load_raw_data_from_url - -logger = get_logger(__name__) - - -class MNIST(VisionDataset): - r""" ``Dataset`` for MNIST meta data - """ - - url_path = "http://yann.lecun.com/exdb/mnist/" - """ - url prefix for downloading raw file - """ - raw_file_name = [ - "train-images-idx3-ubyte.gz", - "train-labels-idx1-ubyte.gz", - "t10k-images-idx3-ubyte.gz", - "t10k-labels-idx1-ubyte.gz", - ] - """ - raw file names of both training set and test set (10k) - """ - raw_file_md5 = [ - "f68b3c2dcbeaaa9fbdd348bbdeb94873", - "d53e105ee54ea40749a09fcbcd1e9432", - "9fb629c4189551a2d022fa330f9573f3", - "ec29112dd5afa0611ce80d1b7f02629c", - ] - """ - md5 for checking raw files - """ - - def __init__( - self, - root: str = None, - train: bool = True, - download: bool = True, - timeout: int = 500, - ): - r""" - :param root: path for mnist dataset downloading or loading, if ``None``, - set ``root`` to the ``_default_root`` - :param train: if ``True``, loading trainingset, else loading test set - :param download: if raw files do not exists and download sets to ``True``, - download raw files and process, otherwise raise ValueError, default is True - - """ - super().__init__(root, order=("image", "image_category")) - - self.timeout = timeout - - # process the root path - if root is None: - self.root = self._default_root - if not os.path.exists(self.root): - os.makedirs(self.root) - else: - self.root = root - if not os.path.exists(self.root): - if download: - logger.debug( - "dir %s does not exist, will be automatically created", - self.root, - ) - os.makedirs(self.root) - else: - raise ValueError("dir %s does not exist" % self.root) - - if self._check_raw_files(): - self.process(train) - elif download: - self.download() - self.process(train) - else: - raise ValueError( - "root does not contain valid raw files, please set download=True" - ) - - def __getitem__(self, index: int) -> Tuple: - return tuple(array[index] for array in self.arrays) - - def __len__(self) -> int: - return len(self.arrays[0]) - - @property - def _default_root(self): - return os.path.join(_default_dataset_root(), self.__class__.__name__) - - @property - def meta(self): - return self._meta_data - - def _check_raw_files(self): - return all( - [ - os.path.exists(os.path.join(self.root, path)) - for path in self.raw_file_name - ] - ) - - def download(self): - for file_name, md5 in zip(self.raw_file_name, self.raw_file_md5): - url = self.url_path + file_name - load_raw_data_from_url(url, file_name, md5, self.root, self.timeout) - - def process(self, train): - # load raw files and transform them into meta data and datasets Tuple(np.array) - logger.info("process the raw files of %s set...", "train" if train else "test") - if train: - meta_data_images, images = parse_idx3( - os.path.join(self.root, self.raw_file_name[0]) - ) - meta_data_labels, labels = parse_idx1( - os.path.join(self.root, self.raw_file_name[1]) - ) - else: - meta_data_images, images = parse_idx3( - os.path.join(self.root, self.raw_file_name[2]) - ) - meta_data_labels, labels = parse_idx1( - os.path.join(self.root, self.raw_file_name[3]) - ) - - self._meta_data = { - "images": meta_data_images, - "labels": meta_data_labels, - } - self.arrays = (images, labels.astype(np.int32)) - - -def parse_idx3(idx3_file): - # parse idx3 file to meta data and data in numpy array (images) - logger.debug("parse idx3 file %s ...", idx3_file) - assert idx3_file.endswith(".gz") - with gzip.open(idx3_file, "rb") as f: - bin_data = f.read() - - # parse meta data - offset = 0 - fmt_header = ">iiii" - magic, imgs, height, width = struct.unpack_from(fmt_header, bin_data, offset) - meta_data = {"magic": magic, "imgs": imgs, "height": height, "width": width} - - # parse images - image_size = height * width - offset += struct.calcsize(fmt_header) - fmt_image = ">" + str(image_size) + "B" - images = [] - bar = tqdm(total=meta_data["imgs"], ncols=80) - for image in struct.iter_unpack(fmt_image, bin_data[offset:]): - images.append(np.array(image, dtype=np.uint8).reshape((height, width, 1))) - bar.update() - bar.close() - return meta_data, images - - -def parse_idx1(idx1_file): - # parse idx1 file to meta data and data in numpy array (labels) - logger.debug("parse idx1 file %s ...", idx1_file) - assert idx1_file.endswith(".gz") - with gzip.open(idx1_file, "rb") as f: - bin_data = f.read() - - # parse meta data - offset = 0 - fmt_header = ">ii" - magic, imgs = struct.unpack_from(fmt_header, bin_data, offset) - meta_data = {"magic": magic, "imgs": imgs} - - # parse labels - offset += struct.calcsize(fmt_header) - fmt_image = ">B" - labels = np.empty(imgs, dtype=int) - bar = tqdm(total=meta_data["imgs"], ncols=80) - for i, label in enumerate(struct.iter_unpack(fmt_image, bin_data[offset:])): - labels[i] = label[0] - bar.update() - bar.close() - return meta_data, labels diff --git a/python_module/megengine/data/dataset/vision/objects365.py b/python_module/megengine/data/dataset/vision/objects365.py deleted file mode 100644 index e56e6462..00000000 --- a/python_module/megengine/data/dataset/vision/objects365.py +++ /dev/null @@ -1,498 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# --------------------------------------------------------------------- -# Part of the following code in this file refs to maskrcnn-benchmark -# MIT License -# -# Copyright (c) 2018 Facebook -# --------------------------------------------------------------------- -import json -import os -from collections import defaultdict - -import cv2 -import numpy as np - -from .meta_vision import VisionDataset - - -class Objects365(VisionDataset): - r"""`Objects365 `_ Dataset. - """ - - supported_order = ( - "image", - "boxes", - "boxes_category", - "info", - ) - - def __init__( - self, root, ann_file, remove_images_without_annotations=False, *, order=None - ): - super().__init__(root, order=order, supported_order=self.supported_order) - - with open(ann_file, "r") as f: - dataset = json.load(f) - - self.imgs = dict() - for img in dataset["images"]: - self.imgs[img["id"]] = img - - self.img_to_anns = defaultdict(list) - for ann in dataset["annotations"]: - # for saving memory - if ( - "boxes" not in self.order - and "boxes_category" not in self.order - and "bbox" in ann - ): - del ann["bbox"] - self.img_to_anns[ann["image_id"]].append(ann) - - self.cats = dict() - for cat in dataset["categories"]: - self.cats[cat["id"]] = cat - - self.ids = list(sorted(self.imgs.keys())) - - # filter images without detection annotations - if remove_images_without_annotations: - ids = [] - for img_id in self.ids: - anno = self.img_to_anns[img_id] - # filter crowd annotations - anno = [obj for obj in anno if obj["iscrowd"] == 0] - anno = [ - obj for obj in anno if obj["bbox"][2] > 0 and obj["bbox"][3] > 0 - ] - if len(anno) > 0: - ids.append(img_id) - self.img_to_anns[img_id] = anno - else: - del self.imgs[img_id] - del self.img_to_anns[img_id] - self.ids = ids - - self.json_category_id_to_contiguous_id = { - v: i + 1 for i, v in enumerate(sorted(self.cats.keys())) - } - - self.contiguous_category_id_to_json_id = { - v: k for k, v in self.json_category_id_to_contiguous_id.items() - } - - def __getitem__(self, index): - img_id = self.ids[index] - anno = self.img_to_anns[img_id] - - target = [] - for k in self.order: - if k == "image": - file_name = self.imgs[img_id]["file_name"] - path = os.path.join(self.root, file_name) - image = cv2.imread(path, cv2.IMREAD_COLOR) - target.append(image) - elif k == "boxes": - boxes = [obj["bbox"] for obj in anno] - boxes = np.array(boxes, dtype=np.float32).reshape(-1, 4) - # transfer boxes from xywh to xyxy - boxes[:, 2:] += boxes[:, :2] - target.append(boxes) - elif k == "boxes_category": - boxes_category = [obj["category_id"] for obj in anno] - boxes_category = [ - self.json_category_id_to_contiguous_id[c] for c in boxes_category - ] - boxes_category = np.array(boxes_category, dtype=np.int32) - target.append(boxes_category) - elif k == "info": - info = self.imgs[img_id] - info = [info["height"], info["width"], info["file_name"]] - target.append(info) - else: - raise NotImplementedError - - return tuple(target) - - def __len__(self): - return len(self.ids) - - def get_img_info(self, index): - img_id = self.ids[index] - img_info = self.imgs[img_id] - return img_info - - class_names = ( - "person", - "sneakers", - "chair", - "hat", - "lamp", - "bottle", - "cabinet/shelf", - "cup", - "car", - "glasses", - "picture/frame", - "desk", - "handbag", - "street lights", - "book", - "plate", - "helmet", - "leather shoes", - "pillow", - "glove", - "potted plant", - "bracelet", - "flower", - "tv", - "storage box", - "vase", - "bench", - "wine glass", - "boots", - "bowl", - "dining table", - "umbrella", - "boat", - "flag", - "speaker", - "trash bin/can", - "stool", - "backpack", - "couch", - "belt", - "carpet", - "basket", - "towel/napkin", - "slippers", - "barrel/bucket", - "coffee table", - "suv", - "toy", - "tie", - "bed", - "traffic light", - "pen/pencil", - "microphone", - "sandals", - "canned", - "necklace", - "mirror", - "faucet", - "bicycle", - "bread", - "high heels", - "ring", - "van", - "watch", - "sink", - "horse", - "fish", - "apple", - "camera", - "candle", - "teddy bear", - "cake", - "motorcycle", - "wild bird", - "laptop", - "knife", - "traffic sign", - "cell phone", - "paddle", - "truck", - "cow", - "power outlet", - "clock", - "drum", - "fork", - "bus", - "hanger", - "nightstand", - "pot/pan", - "sheep", - "guitar", - "traffic cone", - "tea pot", - "keyboard", - "tripod", - "hockey", - "fan", - "dog", - "spoon", - "blackboard/whiteboard", - "balloon", - "air conditioner", - "cymbal", - "mouse", - "telephone", - "pickup truck", - "orange", - "banana", - "airplane", - "luggage", - "skis", - "soccer", - "trolley", - "oven", - "remote", - "baseball glove", - "paper towel", - "refrigerator", - "train", - "tomato", - "machinery vehicle", - "tent", - "shampoo/shower gel", - "head phone", - "lantern", - "donut", - "cleaning products", - "sailboat", - "tangerine", - "pizza", - "kite", - "computer box", - "elephant", - "toiletries", - "gas stove", - "broccoli", - "toilet", - "stroller", - "shovel", - "baseball bat", - "microwave", - "skateboard", - "surfboard", - "surveillance camera", - "gun", - "life saver", - "cat", - "lemon", - "liquid soap", - "zebra", - "duck", - "sports car", - "giraffe", - "pumpkin", - "piano", - "stop sign", - "radiator", - "converter", - "tissue ", - "carrot", - "washing machine", - "vent", - "cookies", - "cutting/chopping board", - "tennis racket", - "candy", - "skating and skiing shoes", - "scissors", - "folder", - "baseball", - "strawberry", - "bow tie", - "pigeon", - "pepper", - "coffee machine", - "bathtub", - "snowboard", - "suitcase", - "grapes", - "ladder", - "pear", - "american football", - "basketball", - "potato", - "paint brush", - "printer", - "billiards", - "fire hydrant", - "goose", - "projector", - "sausage", - "fire extinguisher", - "extension cord", - "facial mask", - "tennis ball", - "chopsticks", - "electronic stove and gas stove", - "pie", - "frisbee", - "kettle", - "hamburger", - "golf club", - "cucumber", - "clutch", - "blender", - "tong", - "slide", - "hot dog", - "toothbrush", - "facial cleanser", - "mango", - "deer", - "egg", - "violin", - "marker", - "ship", - "chicken", - "onion", - "ice cream", - "tape", - "wheelchair", - "plum", - "bar soap", - "scale", - "watermelon", - "cabbage", - "router/modem", - "golf ball", - "pine apple", - "crane", - "fire truck", - "peach", - "cello", - "notepaper", - "tricycle", - "toaster", - "helicopter", - "green beans", - "brush", - "carriage", - "cigar", - "earphone", - "penguin", - "hurdle", - "swing", - "radio", - "CD", - "parking meter", - "swan", - "garlic", - "french fries", - "horn", - "avocado", - "saxophone", - "trumpet", - "sandwich", - "cue", - "kiwi fruit", - "bear", - "fishing rod", - "cherry", - "tablet", - "green vegetables", - "nuts", - "corn", - "key", - "screwdriver", - "globe", - "broom", - "pliers", - "volleyball", - "hammer", - "eggplant", - "trophy", - "dates", - "board eraser", - "rice", - "tape measure/ruler", - "dumbbell", - "hamimelon", - "stapler", - "camel", - "lettuce", - "goldfish", - "meat balls", - "medal", - "toothpaste", - "antelope", - "shrimp", - "rickshaw", - "trombone", - "pomegranate", - "coconut", - "jellyfish", - "mushroom", - "calculator", - "treadmill", - "butterfly", - "egg tart", - "cheese", - "pig", - "pomelo", - "race car", - "rice cooker", - "tuba", - "crosswalk sign", - "papaya", - "hair drier", - "green onion", - "chips", - "dolphin", - "sushi", - "urinal", - "donkey", - "electric drill", - "spring rolls", - "tortoise/turtle", - "parrot", - "flute", - "measuring cup", - "shark", - "steak", - "poker card", - "binoculars", - "llama", - "radish", - "noodles", - "yak", - "mop", - "crab", - "microscope", - "barbell", - "bread/bun", - "baozi", - "lion", - "red cabbage", - "polar bear", - "lighter", - "seal", - "mangosteen", - "comb", - "eraser", - "pitaya", - "scallop", - "pencil case", - "saw", - "table tennis paddle", - "okra", - "starfish", - "eagle", - "monkey", - "durian", - "game board", - "rabbit", - "french horn", - "ambulance", - "asparagus", - "hoverboard", - "pasta", - "target", - "hotair balloon", - "chainsaw", - "lobster", - "iron", - "flashlight", - ) diff --git a/python_module/megengine/data/dataset/vision/utils.py b/python_module/megengine/data/dataset/vision/utils.py deleted file mode 100644 index de6657d7..00000000 --- a/python_module/megengine/data/dataset/vision/utils.py +++ /dev/null @@ -1,89 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import hashlib -import os -import tarfile - -from ....distributed.util import is_distributed -from ....logger import get_logger -from ....utils.http_download import download_from_url - -IMG_EXT = (".jpg", ".png", ".jpeg", ".ppm", ".bmp", ".pgm", ".tif", ".tiff", ".webp") - -logger = get_logger(__name__) - - -def _default_dataset_root(): - default_dataset_root = os.path.expanduser( - os.path.join(os.getenv("XDG_CACHE_HOME", "~/.cache"), "megengine") - ) - - return default_dataset_root - - -def load_raw_data_from_url( - url: str, filename: str, target_md5: str, raw_data_dir: str, timeout: int -): - cached_file = os.path.join(raw_data_dir, filename) - logger.debug( - "load_raw_data_from_url: downloading to or using cached %s ...", cached_file - ) - if not os.path.exists(cached_file): - if is_distributed(): - logger.warning( - "Downloading raw data in DISTRIBUTED mode\n" - " File may be downloaded multiple times. We recommend\n" - " users to download in single process first." - ) - md5 = download_from_url(url, cached_file, http_read_timeout=timeout) - else: - md5 = calculate_md5(cached_file) - if target_md5 == md5: - logger.debug("%s exists with correct md5: %s", filename, target_md5) - else: - os.remove(cached_file) - raise RuntimeError("{} exists but fail to match md5".format(filename)) - - -def calculate_md5(filename): - m = hashlib.md5() - with open(filename, "rb") as f: - while True: - data = f.read(4096) - if not data: - break - m.update(data) - return m.hexdigest() - - -def is_img(filename): - return filename.lower().endswith(IMG_EXT) - - -def untar(path, to=None, remove=False): - if to is None: - to = os.path.dirname(path) - with tarfile.open(path, "r") as tar: - tar.extractall(path=to) - - if remove: - os.remove(path) - - -def untargz(path, to=None, remove=False): - if path.endswith(".tar.gz"): - if to is None: - to = os.path.dirname(path) - with tarfile.open(path, "r:gz") as tar: - tar.extractall(path=to) - else: - raise ValueError("path %s does not end with .tar" % path) - - if remove: - os.remove(path) diff --git a/python_module/megengine/data/dataset/vision/voc.py b/python_module/megengine/data/dataset/vision/voc.py deleted file mode 100644 index b22fd2fa..00000000 --- a/python_module/megengine/data/dataset/vision/voc.py +++ /dev/null @@ -1,185 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# --------------------------------------------------------------------- -# Part of the following code in this file refs to torchvision -# BSD 3-Clause License -# -# Copyright (c) Soumith Chintala 2016, -# All rights reserved. -# --------------------------------------------------------------------- -import collections.abc -import os -import xml.etree.ElementTree as ET - -import cv2 -import numpy as np - -from .meta_vision import VisionDataset - - -class PascalVOC(VisionDataset): - r"""`Pascal VOC `_ Dataset. - """ - - supported_order = ( - "image", - "boxes", - "boxes_category", - "mask", - "info", - ) - - def __init__(self, root, image_set, *, order=None): - if ("boxes" in order or "boxes_category" in order) and "mask" in order: - raise ValueError( - "PascalVOC only supports boxes & boxes_category or mask, not both." - ) - - super().__init__(root, order=order, supported_order=self.supported_order) - - if not os.path.isdir(self.root): - raise RuntimeError("Dataset not found or corrupted.") - - self.image_set = image_set - image_dir = os.path.join(self.root, "JPEGImages") - - if "boxes" in order or "boxes_category" in order: - annotation_dir = os.path.join(self.root, "Annotations") - splitdet_dir = os.path.join(self.root, "ImageSets/Main") - split_f = os.path.join(splitdet_dir, image_set.rstrip("\n") + ".txt") - with open(os.path.join(split_f), "r") as f: - self.file_names = [x.strip() for x in f.readlines()] - self.images = [os.path.join(image_dir, x + ".jpg") for x in self.file_names] - self.annotations = [ - os.path.join(annotation_dir, x + ".xml") for x in self.file_names - ] - assert len(self.images) == len(self.annotations) - elif "mask" in order: - if "aug" in image_set: - mask_dir = os.path.join(self.root, "SegmentationClass_aug") - else: - mask_dir = os.path.join(self.root, "SegmentationClass") - splitmask_dir = os.path.join(self.root, "ImageSets/Segmentation") - split_f = os.path.join(splitmask_dir, image_set.rstrip("\n") + ".txt") - with open(os.path.join(split_f), "r") as f: - self.file_names = [x.strip() for x in f.readlines()] - self.images = [os.path.join(image_dir, x + ".jpg") for x in self.file_names] - self.masks = [os.path.join(mask_dir, x + ".png") for x in self.file_names] - assert len(self.images) == len(self.masks) - else: - raise NotImplementedError - - self.img_infos = dict() - - def __getitem__(self, index): - target = [] - for k in self.order: - if k == "image": - image = cv2.imread(self.images[index], cv2.IMREAD_COLOR) - target.append(image) - elif k == "boxes": - anno = self.parse_voc_xml(ET.parse(self.annotations[index]).getroot()) - boxes = [obj["bndbox"] for obj in anno["annotation"]["object"]] - # boxes type xyxy - boxes = [ - (bb["xmin"], bb["ymin"], bb["xmax"], bb["ymax"]) for bb in boxes - ] - boxes = np.array(boxes, dtype=np.float32).reshape(-1, 4) - target.append(boxes) - elif k == "boxes_category": - anno = self.parse_voc_xml(ET.parse(self.annotations[index]).getroot()) - boxes_category = [obj["name"] for obj in anno["annotation"]["object"]] - boxes_category = [ - self.class_names.index(bc) + 1 for bc in boxes_category - ] - boxes_category = np.array(boxes_category, dtype=np.int32) - target.append(boxes_category) - elif k == "mask": - if "aug" in self.image_set: - mask = cv2.imread(self.masks[index], cv2.IMREAD_GRAYSCALE) - else: - mask = cv2.imread(self.masks[index], cv2.IMREAD_COLOR) - mask = self._trans_mask(mask) - mask = mask[:, :, np.newaxis] - target.append(mask) - elif k == "info": - info = self.get_img_info(index, image) - info = [info["height"], info["width"], info["file_name"]] - target.append(info) - else: - raise NotImplementedError - - return tuple(target) - - def __len__(self): - return len(self.images) - - def get_img_info(self, index, image=None): - if index not in self.img_infos: - if image is None: - image = cv2.imread(self.images[index], cv2.IMREAD_COLOR) - self.img_infos[index] = dict( - height=image.shape[0], - width=image.shape[1], - file_name=self.file_names[index], - ) - return self.img_infos[index] - - def _trans_mask(self, mask): - label = np.ones(mask.shape[:2]) * 255 - for i in range(len(self.class_colors)): - b, g, r = self.class_colors[i] - label[ - (mask[:, :, 0] == b) & (mask[:, :, 1] == g) & (mask[:, :, 2] == r) - ] = i - return label.astype(np.uint8) - - def parse_voc_xml(self, node): - voc_dict = {} - children = list(node) - if children: - def_dic = collections.defaultdict(list) - for dc in map(self.parse_voc_xml, children): - for ind, v in dc.items(): - def_dic[ind].append(v) - if node.tag == "annotation": - def_dic["object"] = [def_dic["object"]] - voc_dict = { - node.tag: { - ind: v[0] if len(v) == 1 else v for ind, v in def_dic.items() - } - } - if node.text: - text = node.text.strip() - if not children: - voc_dict[node.tag] = text - return voc_dict - - class_names = ( - "aeroplane", - "bicycle", - "bird", - "boat", - "bottle", - "bus", - "car", - "cat", - "chair", - "cow", - "diningtable", - "dog", - "horse", - "motorbike", - "person", - "pottedplant", - "sheep", - "sofa", - "train", - "tvmonitor", - ) diff --git a/python_module/megengine/data/sampler.py b/python_module/megengine/data/sampler.py deleted file mode 100644 index dbd5d3a3..00000000 --- a/python_module/megengine/data/sampler.py +++ /dev/null @@ -1,274 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import collections.abc -import math -from abc import ABC -from typing import Any, Generator, Iterator, List, Union - -import numpy as np - -import megengine.distributed as dist - - -class Sampler(ABC): - def __init__( - self, - dataset, - batch_size=1, - drop_last=False, - num_samples=None, - world_size=None, - rank=None, - seed=None, - ): - r""" - An abstract class for all sampler - - :type dataset: `dataset` - :param dataset: dataset to sample from - :type batch_size: positive integer - :param batch_size: batch size for batch method - :type drop_last: bool - :param drop_last: set ``True`` to drop the last incomplete batch, - if the dataset size is not divisible by the batch size. If ``False`` and - the size of dataset is not divisible by the batch_size, then the last batch will - be smaller. (default: ``False``) - :type num_samples: positive integer - :param num_samples: number of samples assigned to one rank - :type world_size: positive integer - :param world_size: number of ranks - :type rank: non-negative integer within 0 and world_size - :param rank: rank id, non-negative interger within 0 and ``world_size`` - :type seed: non-negative integer - :param seed: seed for random operators - """ - if ( - not isinstance(batch_size, int) - or isinstance(batch_size, bool) - or batch_size <= 0 - ): - raise ValueError( - "batch_size should be a positive integer value, " - "but got batch_size={}".format(batch_size) - ) - if not isinstance(drop_last, bool): - raise ValueError( - "drop_last should be a boolean value, but got " - "drop_last={}".format(drop_last) - ) - if num_samples is not None and ( - not isinstance(num_samples, int) - or isinstance(num_samples, bool) - or num_samples <= 0 - ): - raise ValueError( - "num_samples should be a positive integer " - "value, but got num_samples={}".format(num_samples) - ) - - self.batch_size = batch_size - self.dataset = dataset - self.drop_last = drop_last - - if world_size is None: - world_size = dist.get_world_size() if dist.is_distributed() else 1 - self.world_size = world_size - if rank is None: - rank = dist.get_rank() if dist.is_distributed() else 0 - self.rank = rank - - if num_samples is None: - num_samples = len(self.dataset) - self.num_samples = int(math.ceil(num_samples / self.world_size)) - - # Make sure seeds are the same at each rank - if seed is None and self.world_size > 1: - seed = 0 - self.rng = np.random.RandomState(seed) - - def __iter__(self) -> Union[Generator, Iterator]: - return self.batch() - - def __len__(self) -> int: - if self.drop_last: - return self.num_samples // self.batch_size - else: - return int(math.ceil(self.num_samples / self.batch_size)) - - def sample(self): - """ - return a list contains all sample indices - """ - raise NotImplementedError - - def scatter(self, indices) -> List: - r""" - scatter method is used for splitting indices into subset, each subset - will be assigned to a rank. Indices are evenly splitted by default. - If customized indices assignment method is needed, please rewrite this method - """ - total_size = self.num_samples * self.world_size - - # add extra indices to make it evenly divisible - indices += indices[: (total_size - len(indices))] - assert len(indices) == total_size - - # subsample - indices = indices[self.rank : total_size : self.world_size] - assert len(indices) == self.num_samples - - return indices - - def batch(self) -> Iterator[List[Any]]: - r""" - batch method provides a batch indices generator - """ - indices = list(self.sample()) - - # user might pass the world_size parameter without dist, - # so dist.is_distributed() should not be used - if self.world_size > 1: - indices = self.scatter(indices) - - step, length = self.batch_size, len(indices) - batch_index = [indices[i : i + step] for i in range(0, length, step)] - - if self.drop_last and len(batch_index[-1]) < self.batch_size: - batch_index.pop() - - return iter(batch_index) - - -class SequentialSampler(Sampler): - def __init__( - self, - dataset, - batch_size=1, - drop_last=False, - indices=None, - world_size=None, - rank=None, - ): - r""" - Sample elements sequentially - """ - super().__init__(dataset, batch_size, drop_last, None, world_size, rank) - if indices is not None and not isinstance(indices, collections.abc.Sequence): - raise ValueError( - "indices should be None or a sequence, " - "but got indices={}".format(indices) - ) - self.indices = indices - - def sample(self) -> Iterator[Any]: - r""" - return a generator - """ - if self.indices is None: - return iter(range(len(self.dataset))) - else: - return self.indices - - -class RandomSampler(Sampler): - def __init__( - self, - dataset, - batch_size=1, - drop_last=False, - indices=None, - world_size=None, - rank=None, - seed=None, - ): - r""" - Sample elements randomly without replacement - """ - super().__init__(dataset, batch_size, drop_last, None, world_size, rank, seed) - if indices is not None and not isinstance(indices, collections.abc.Sequence): - raise ValueError( - "indices should be None or a sequence, " - "but got indices={}".format(indices) - ) - self.indices = indices - - def sample(self) -> List: - if self.indices is None: - return self.rng.permutation(len(self.dataset)).tolist() - else: - return self.rng.permutation(self.indices).tolist() - - -class ReplacementSampler(Sampler): - def __init__( - self, - dataset, - batch_size=1, - drop_last=False, - num_samples=None, - weights=None, - world_size=None, - rank=None, - seed=None, - ): - r""" - Sample elements randomly with replacement - - :type weights: List - :param weights: weights for sampling indices, it could be unnormalized weights - """ - super().__init__( - dataset, batch_size, drop_last, num_samples, world_size, rank, seed - ) - if weights is not None: - if not isinstance(weights, collections.abc.Sequence): - raise ValueError( - "weights should be None or a sequence, " - "but got weights={}".format(weights) - ) - if len(weights) != len(dataset): - raise ValueError( - "len(dataset)={} should be equal to" - "len(weights)={}".format(len(dataset), len(weights)) - ) - self.weights = weights - if self.weights is not None: - self.weights = np.array(weights) / sum(weights) - - def sample(self) -> List: - n = len(self.dataset) - if self.weights is None: - return self.rng.randint(n, size=self.num_samples).tolist() - else: - return self.rng.multinomial(n, self.weights, self.num_samples).tolist() - - -class Infinite(Sampler): - r"""Infinite Sampler warper for basic sampler""" - - def sample(self): - raise NotImplementedError("sample method not supported in Infinite") - - def __init__(self, sampler): - self.sampler = sampler - self.sampler_iter = iter(self.sampler) - - def __iter__(self): - return self - - def __next__(self): - try: - index = next(self.sampler_iter) - except StopIteration: - self.sampler_iter = iter(self.sampler) - index = next(self.sampler_iter) - return index - - def __len__(self): - return np.iinfo(np.int64).max diff --git a/python_module/megengine/data/transform/__init__.py b/python_module/megengine/data/transform/__init__.py deleted file mode 100644 index 30424cbc..00000000 --- a/python_module/megengine/data/transform/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from .meta_transform import PseudoTransform, Transform -from .vision import * diff --git a/python_module/megengine/data/transform/meta_transform.py b/python_module/megengine/data/transform/meta_transform.py deleted file mode 100644 index d7fd4f47..00000000 --- a/python_module/megengine/data/transform/meta_transform.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from abc import ABC, abstractmethod -from typing import Sequence, Tuple - - -class Transform(ABC): - """ - rewrite apply method in subclass - """ - - def apply_batch(self, inputs: Sequence[Tuple]): - return tuple(self.apply(input) for input in inputs) - - @abstractmethod - def apply(self, input: Tuple): - pass - - def __repr__(self): - return self.__class__.__name__ - - -class PseudoTransform(Transform): - def apply(self, input: Tuple): - return input diff --git a/python_module/megengine/data/transform/vision/__init__.py b/python_module/megengine/data/transform/vision/__init__.py deleted file mode 100644 index d90c9e98..00000000 --- a/python_module/megengine/data/transform/vision/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from .transform import * diff --git a/python_module/megengine/data/transform/vision/functional.py b/python_module/megengine/data/transform/vision/functional.py deleted file mode 100644 index e2f4e512..00000000 --- a/python_module/megengine/data/transform/vision/functional.py +++ /dev/null @@ -1,111 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import collections.abc -import functools -import random - -import cv2 -import numpy as np - - -def wrap_keepdims(func): - """Wraper to keep the dimension of input images unchanged""" - - @functools.wraps(func) - def wrapper(image, *args, **kwargs): - if len(image.shape) != 3: - raise ValueError( - "image must have 3 dims, but got {} dims".format(len(image.shape)) - ) - ret = func(image, *args, **kwargs) - if len(ret.shape) == 2: - ret = ret[:, :, np.newaxis] - return ret - - return wrapper - - -@wrap_keepdims -def to_gray(image): - r""" - Change BGR format image's color space to gray - - :param image: Input BGR format image, with (H, W, C) shape - :return: Gray format image, with (H, W, C) shape - """ - return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) - - -@wrap_keepdims -def to_bgr(image): - r""" - Change gray format image's color space to BGR - - :param image: input Gray format image, with (H, W, C) shape - :return: BGR format image, with (H, W, C) shape - """ - return cv2.cvtColor(image, cv2.COLOR_GRAY2BGR) - - -@wrap_keepdims -def pad(input, size, value): - r""" - Pad input data with *value* and given *size* - - :param input: Input data, with (H, W, C) shape - :param size: Padding size of input data, it could be integer or sequence. - If it's an integer, the input data will be padded in four directions. - If it's a sequence contains two integer, the bottom and right side - of input data will be padded. - If it's a sequence contains four integer, the top, bottom, left, right - side of input data will be padded with given size. - :param value: Padding value of data, could be a sequence of int or float. - if it's float value, the dtype of image will be casted to float32 also. - :return: Padded image - """ - if isinstance(size, int): - size = (size, size, size, size) - elif isinstance(size, collections.abc.Sequence) and len(size) == 2: - size = (0, size[0], 0, size[1]) - if np.array(value).dtype == float: - input = input.astype(np.float32) - return cv2.copyMakeBorder(input, *size, cv2.BORDER_CONSTANT, value=value) - - -@wrap_keepdims -def flip(image, flipCode): - r""" - Accordding to the flipCode (the type of flip), flip the input image - - :param image: Input image, with (H, W, C) shape - :param flipCode: code that indicates the type of flip. - 1 : Flip horizontally - 0 : Flip vertically - -1 : Flip horizontally and vertically - :return: BGR format image, with (H, W, C) shape - """ - return cv2.flip(image, flipCode=flipCode) - - -@wrap_keepdims -def resize(input, size, interpolation=cv2.INTER_LINEAR): - r""" - resize the input data to given size - - :param input: Input data, could be image or masks, with (H, W, C) shape - :param size: Target size of input data, with (height, width) shape. - :param interpolation: Interpolation method. - :return: Resized data, with (H, W, C) shape - """ - if len(size) != 2: - raise ValueError("resize needs (h, w), but got {}".format(size)) - - if isinstance(interpolation, collections.abc.Sequence): - interpolation = random.choice(interpolation) - return cv2.resize(input, size[::-1], interpolation=interpolation) diff --git a/python_module/megengine/data/transform/vision/transform.py b/python_module/megengine/data/transform/vision/transform.py deleted file mode 100644 index bf3834a9..00000000 --- a/python_module/megengine/data/transform/vision/transform.py +++ /dev/null @@ -1,1025 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import collections.abc -import math -from typing import Sequence, Tuple - -import cv2 -import numpy as np - -from megengine.data.transform import Transform -from megengine.data.transform.vision import functional as F - -__all__ = [ - "VisionTransform", - "ToMode", - "Compose", - "TorchTransformCompose", - "Pad", - "Resize", - "ShortestEdgeResize", - "RandomResize", - "RandomCrop", - "RandomResizedCrop", - "CenterCrop", - "RandomHorizontalFlip", - "RandomVerticalFlip", - "Normalize", - "GaussianNoise", - "BrightnessTransform", - "SaturationTransform", - "ContrastTransform", - "HueTransform", - "ColorJitter", - "Lighting", -] - - -class VisionTransform(Transform): - r""" - Base class of all transforms used in computer vision. - calling logic: apply_batch() -> apply() -> _apply_image() and other _apply_*() - method. If you want to implement a self-defined transform method for image, - rewrite _apply_image method in subclass. - - :param order: Input type order. Input is a tuple contains different structures, - order is used to specify the order of structures. For example, if your input - is (image, boxes) type, then the order should be ("image", "boxes"). - Current available strings & data type are describe below: - - * "image": input image, with shape of (H, W, C) - * "coords": coordinates, with shape of (N, 2) - * "boxes": bounding boxes, with shape of (N, 4), "xyxy" format, - the 1st "xy" represents top left point of a box, - the 2nd "xy" represents right bottom point. - * "mask": map used for segmentation, with shape of (H, W, 1) - * "keypoints": keypoints with shape of (N, K, 3), N for number of instances, - and K for number of keypoints in one instance. The first two dimensions - of last axis is coordinate of keypoints and the the 3rd dimension is - the label of keypoints. - * "polygons": A sequence contains numpy array, its length is number of instances. - Each numpy array represents polygon coordinate of one instance. - * "category": categories for some data type. For example, "image_category" - means category of the input image and "boxes_category" means categories of - bounding boxes. - * "info": information for images such as image shapes and image path. - - You can also customize your data types only if you implement the corresponding - _apply_*() methods, otherwise ``NotImplementedError`` will be raised. - """ - - def __init__(self, order=None): - super().__init__() - if order is None: - order = ("image",) - elif not isinstance(order, collections.abc.Sequence): - raise ValueError( - "order should be a sequence, but got order={}".format(order) - ) - for k in order: - if k in ("batch",): - raise ValueError("{} is invalid data type".format(k)) - elif k.endswith("category") or k.endswith("info"): - # when the key is *category or info, we should do nothing - # if the corresponding apply methods are not implemented. - continue - elif self._get_apply(k) is None: - raise NotImplementedError("{} is unsupported data type".format(k)) - self.order = order - - def apply_batch(self, inputs: Sequence[Tuple]): - r"""Apply transform on batch input data""" - return tuple(self.apply(input) for input in inputs) - - def apply(self, input: Tuple): - r"""Apply transform on single input data""" - if not isinstance(input, tuple): - input = (input,) - - output = [] - for i in range(min(len(input), len(self.order))): - apply_func = self._get_apply(self.order[i]) - if apply_func is None: - output.append(input[i]) - else: - output.append(apply_func(input[i])) - if len(input) > len(self.order): - output.extend(input[len(self.order) :]) - - if len(output) == 1: - output = output[0] - else: - output = tuple(output) - return output - - def _get_apply(self, key): - return getattr(self, "_apply_{}".format(key), None) - - def _get_image(self, input: Tuple): - if not isinstance(input, tuple): - input = (input,) - return input[self.order.index("image")] - - def _apply_image(self, image): - raise NotImplementedError - - def _apply_coords(self, coords): - raise NotImplementedError - - def _apply_boxes(self, boxes): - idxs = np.array([(0, 1), (2, 1), (0, 3), (2, 3)]).flatten() - coords = np.asarray(boxes).reshape(-1, 4)[:, idxs].reshape(-1, 2) - coords = self._apply_coords(coords).reshape((-1, 4, 2)) - minxy = coords.min(axis=1) - maxxy = coords.max(axis=1) - trans_boxes = np.concatenate((minxy, maxxy), axis=1) - return trans_boxes - - def _apply_mask(self, mask): - raise NotImplementedError - - def _apply_keypoints(self, keypoints): - coords, visibility = keypoints[..., :2], keypoints[..., 2:] - trans_coords = [self._apply_coords(p) for p in coords] - return np.concatenate((trans_coords, visibility), axis=-1) - - def _apply_polygons(self, polygons): - return [[self._apply_coords(p) for p in instance] for instance in polygons] - - -class ToMode(VisionTransform): - r"""Change input data to a target mode. - For example, most transforms use HWC mode image, - while the Neural Network might use CHW mode input tensor - - :param mode: Output mode of input. Use "CHW" mode by default. - :param order: The same with :class:`VisionTransform` - """ - - def __init__(self, mode="CHW", *, order=None): - super().__init__(order) - assert mode in ["CHW"], "unsupported mode: {}".format(mode) - self.mode = mode - - def _apply_image(self, image): - if self.mode == "CHW": - return np.ascontiguousarray(np.rollaxis(image, 2)) - return image - - def _apply_coords(self, coords): - return coords - - def _apply_mask(self, mask): - if self.mode == "CHW": - return np.ascontiguousarray(np.rollaxis(mask, 2)) - return mask - - -class Compose(VisionTransform): - r""" - Composes several transforms together. - - :param transforms: List of :class:`VisionTransform` to compose. - :param batch_compose: Whether use shuffle_indices for batch data or not. - If True, use original input sequence. - Otherwise, the shuffle_indices will be used for transforms. - :param shuffle_indices: Indices used for random shuffle, start at 1. - For example, if shuffle_indices is [(1, 3), (2, 4)], then the 1st and 3rd transform - will be random shuffled, the 2nd and 4th transform will also be shuffled. - :param order: The same with :class:`VisionTransform` - - Example: - - ..testcode:: - - from megengine.data.transform import RandomHorizontalFlip, RandomVerticalFlip, CenterCrop, ToMode, Compose - - transform_func = Compose([ - RandomHorizontalFlip(), - RandomVerticalFlip(), - CenterCrop(100), - ToMode("CHW"), - ], - shuffle_indices=[(1, 2, 3)] - ) - """ - - def __init__( - self, transforms=[], batch_compose=False, shuffle_indices=None, *, order=None - ): - super().__init__(order) - self.transforms = transforms - self._set_order() - - if batch_compose and shuffle_indices is not None: - raise ValueError( - "Do not support shuffle when apply transforms along the whole batch" - ) - self.batch_compose = batch_compose - - if shuffle_indices is not None: - shuffle_indices = [tuple(x - 1 for x in idx) for idx in shuffle_indices] - self.shuffle_indices = shuffle_indices - - def _set_order(self): - for t in self.transforms: - t.order = self.order - if isinstance(t, Compose): - t._set_order() - - def apply_batch(self, inputs: Sequence[Tuple]): - if self.batch_compose: - for t in self.transforms: - inputs = t.apply_batch(inputs) - return inputs - else: - return super().apply_batch(inputs) - - def apply(self, input: Tuple): - for t in self._shuffle(): - input = t.apply(input) - return input - - def _shuffle(self): - if self.shuffle_indices is not None: - source_idx = list(range(len(self.transforms))) - for idx in self.shuffle_indices: - shuffled = np.random.permutation(idx).tolist() - for src, dst in zip(idx, shuffled): - source_idx[src] = dst - return [self.transforms[i] for i in source_idx] - else: - return self.transforms - - -class TorchTransformCompose(VisionTransform): - r""" - Compose class used for transforms in torchvision, only support PIL image, - some transforms with tensor in torchvision are not supported, - such as Normalize and ToTensor in torchvision. - - :param transforms: The same with ``Compose`` - :param order: The same with :class:`VisionTransform` - """ - - def __init__(self, transforms, *, order=None): - super().__init__(order) - self.transforms = transforms - - def _apply_image(self, image): - from PIL import Image - - try: - import accimage - except ImportError: - accimage = None - - if image.shape[0] == 3: # CHW - image = np.ascontiguousarray(image[[2, 1, 0]]) - elif image.shape[2] == 3: # HWC - image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) - image = Image.fromarray(image.astype(np.uint8)) - - for t in self.transforms: - image = t(image) - - if isinstance(image, Image.Image) or ( - accimage is not None and isinstance(image, accimage.Image) - ): - image = np.array(image, dtype=np.uint8) - if image.shape[0] == 3: # CHW - image = np.ascontiguousarray(image[[2, 1, 0]]) - elif image.shape[2] == 3: # HWC - image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) - return image - - -class Pad(VisionTransform): - r"""Pad the input data. - - :param size: Padding size of input image, it could be integer or sequence. - If it's an integer, the input image will be padded in four directions. - If it's a sequence contains two integer, the bottom and right side - of image will be padded. - If it's a sequence contains four integer, the top, bottom, left, right - side of image will be padded with given size. - :param value: Padding value of image, could be a sequence of int or float. - if it's float value, the dtype of image will be casted to float32 also. - :param mask_value: Padding value of segmentation map. - :param order: The same with :class:`VisionTransform` - """ - - def __init__(self, size=0, value=0, mask_value=0, *, order=None): - super().__init__(order) - if isinstance(size, int): - size = (size, size, size, size) - elif isinstance(size, collections.abc.Sequence) and len(size) == 2: - size = (0, size[0], 0, size[1]) - elif not (isinstance(size, collections.abc.Sequence) and len(size) == 4): - raise ValueError( - "size should be a list/tuple which contains " - "(top, down, left, right) four pad sizes." - ) - self.size = size - self.value = value - if not isinstance(mask_value, int): - raise ValueError( - "mask_value should be a positive integer, " - "but got mask_value={}".format(mask_value) - ) - self.mask_value = mask_value - - def _apply_image(self, image): - return F.pad(image, self.size, self.value) - - def _apply_coords(self, coords): - coords[:, 0] += self.size[2] - coords[:, 1] += self.size[0] - return coords - - def _apply_mask(self, mask): - return F.pad(mask, self.size, self.mask_value) - - -class Resize(VisionTransform): - r"""Resize the input data. - - :param output_size: Target size of image, with (height, width) shape. - :param interpolation: Interpolation method. All methods are listed below: - - * cv2.INTER_NEAREST – a nearest-neighbor interpolation. - * cv2.INTER_LINEAR – a bilinear interpolation (used by default). - * cv2.INTER_AREA – resampling using pixel area relation. - * cv2.INTER_CUBIC – a bicubic interpolation over 4×4 pixel neighborhood. - * cv2.INTER_LANCZOS4 – a Lanczos interpolation over 8×8 pixel neighborhood. - :param order: The same with :class:`VisionTransform` - """ - - def __init__(self, output_size, interpolation=cv2.INTER_LINEAR, *, order=None): - super().__init__(order) - self.output_size = output_size - self.interpolation = interpolation - - def apply(self, input: Tuple): - self._shape_info = self._get_shape(self._get_image(input)) - return super().apply(input) - - def _apply_image(self, image): - h, w, th, tw = self._shape_info - if h == th and w == tw: - return image - return F.resize(image, (th, tw), self.interpolation) - - def _apply_coords(self, coords): - h, w, th, tw = self._shape_info - if h == th and w == tw: - return coords - coords[:, 0] = coords[:, 0] * (tw / w) - coords[:, 1] = coords[:, 1] * (th / h) - return coords - - def _apply_mask(self, mask): - h, w, th, tw = self._shape_info - if h == th and w == tw: - return mask - return F.resize(mask, (th, tw), cv2.INTER_NEAREST) - - def _get_shape(self, image): - h, w, _ = image.shape - if isinstance(self.output_size, int): - if min(h, w) == self.output_size: - return h, w, h, w - if h < w: - th = self.output_size - tw = int(self.output_size * w / h) - else: - tw = self.output_size - th = int(self.output_size * h / w) - return h, w, th, tw - else: - return (h, w, *self.output_size) - - -class ShortestEdgeResize(VisionTransform): - def __init__( - self, - min_size, - max_size, - sample_style="range", - interpolation=cv2.INTER_LINEAR, - *, - order=None - ): - super().__init__(order) - if sample_style not in ("range", "choice"): - raise NotImplementedError( - "{} is unsupported sample style".format(sample_style) - ) - self.sample_style = sample_style - if isinstance(min_size, int): - min_size = (min_size, min_size) - self.min_size = min_size - self.max_size = max_size - self.interpolation = interpolation - - def apply(self, input: Tuple): - self._shape_info = self._get_shape(self._get_image(input)) - return super().apply(input) - - def _apply_image(self, image): - h, w, th, tw = self._shape_info - if h == th and w == tw: - return image - return F.resize(image, (th, tw), self.interpolation) - - def _apply_coords(self, coords): - h, w, th, tw = self._shape_info - if h == th and w == tw: - return coords - coords[:, 0] = coords[:, 0] * (tw / w) - coords[:, 1] = coords[:, 1] * (th / h) - return coords - - def _apply_mask(self, mask): - h, w, th, tw = self._shape_info - if h == th and w == tw: - return mask - return F.resize(mask, (th, tw), cv2.INTER_NEAREST) - - def _get_shape(self, image): - h, w, _ = image.shape - if self.sample_style == "range": - size = np.random.randint(self.min_size[0], self.min_size[1] + 1) - else: - size = np.random.choice(self.min_size) - - scale = size / min(h, w) - if h < w: - th, tw = size, scale * w - else: - th, tw = scale * h, size - if max(th, tw) > self.max_size: - scale = self.max_size / max(th, tw) - th = th * scale - tw = tw * scale - th = int(round(th)) - tw = int(round(tw)) - return h, w, th, tw - - -class RandomResize(VisionTransform): - r"""Resize the input data randomly. - - :param scale_range: . - :param order: The same with :class:`VisionTransform` - """ - - def __init__(self, scale_range, interpolation=cv2.INTER_LINEAR, *, order=None): - super().__init__(order) - self.scale_range = scale_range - self.interpolation = interpolation - - def apply(self, input: Tuple): - self._shape_info = self._get_shape(self._get_image(input)) - return super().apply(input) - - def _apply_image(self, image): - h, w, th, tw = self._shape_info - if h == th and w == tw: - return image - return F.resize(image, (th, tw), self.interpolation) - - def _apply_coords(self, coords): - h, w, th, tw = self._shape_info - if h == th and w == tw: - return coords - coords[:, 0] = coords[:, 0] * (tw / w) - coords[:, 1] = coords[:, 1] * (th / h) - return coords - - def _apply_mask(self, mask): - h, w, th, tw = self._shape_info - if h == th and w == tw: - return mask - return F.resize(mask, (th, tw), cv2.INTER_NEAREST) - - def _get_shape(self, image): - h, w, _ = image.shape - scale = np.random.uniform(*self.scale_range) - th = int(round(h * scale)) - tw = int(round(w * scale)) - return h, w, th, tw - - -class RandomCrop(VisionTransform): - r"""Crop the input data randomly. Before applying the crop transform, - pad the image first. And if target size is still bigger than the size of - padded image, pad the image size to target size. - - :param output_size: Target size of output image, with (height, width) shape. - :param padding_size: The same with `size` in ``Pad`` - :param padding_value: The same with `value` in ``Pad`` - :param order: The same with :class:`VisionTransform` - """ - - def __init__( - self, - output_size, - padding_size=0, - padding_value=[0, 0, 0], - padding_maskvalue=0, - *, - order=None - ): - super().__init__(order) - if isinstance(output_size, int): - self.output_size = (output_size, output_size) - else: - self.output_size = output_size - self.pad = Pad(padding_size, padding_value, order=self.order) - self.padding_value = padding_value - self.padding_maskvalue = padding_maskvalue - - def apply(self, input): - input = self.pad.apply(input) - self._h, self._w, _ = self._get_image(input).shape - self._th, self._tw = self.output_size - self._x = np.random.randint(0, max(0, self._w - self._tw) + 1) - self._y = np.random.randint(0, max(0, self._h - self._th) + 1) - return super().apply(input) - - def _apply_image(self, image): - if self._th > self._h: - image = F.pad(image, (self._th - self._h, 0), self.padding_value) - if self._tw > self._w: - image = F.pad(image, (0, self._tw - self._w), self.padding_value) - return image[self._y : self._y + self._th, self._x : self._x + self._tw] - - def _apply_coords(self, coords): - coords[:, 0] -= self._x - coords[:, 1] -= self._y - return coords - - def _apply_mask(self, mask): - if self._th > self._h: - mask = F.pad(mask, (self._th - self._h, 0), self.padding_maskvalue) - if self._tw > self._w: - mask = F.pad(mask, (0, self._tw - self._w), self.padding_maskvalue) - return mask[self._y : self._y + self._th, self._x : self._x + self._tw] - - -class RandomResizedCrop(VisionTransform): - r"""Crop the input data to random size and aspect ratio. - A crop of random size (default: of 0.08 to 1.0) of the original size and a random - aspect ratio (default: of 3/4 to 1.33) of the original aspect ratio is made. - After applying crop transfrom, the input data will be resized to given size. - - :param output_size: Target size of output image, with (height, width) shape. - :param scale_range: Range of size of the origin size cropped. Default: (0.08, 1.0) - :param ratio_range: Range of aspect ratio of the origin aspect ratio cropped. Default: (0.75, 1.33) - :param order: The same with :class:`VisionTransform` - """ - - def __init__( - self, - output_size, - scale_range=(0.08, 1.0), - ratio_range=(3.0 / 4, 4.0 / 3), - interpolation=cv2.INTER_LINEAR, - *, - order=None - ): - super().__init__(order) - if isinstance(output_size, int): - self.output_size = (output_size, output_size) - else: - self.output_size = output_size - assert ( - scale_range[0] <= scale_range[1] - ), "scale_range should be of kind (min, max)" - assert ( - ratio_range[0] <= ratio_range[1] - ), "ratio_range should be of kind (min, max)" - self.scale_range = scale_range - self.ratio_range = ratio_range - self.interpolation = interpolation - - def apply(self, input: Tuple): - self._coord_info = self._get_coord(self._get_image(input)) - return super().apply(input) - - def _apply_image(self, image): - x, y, w, h = self._coord_info - cropped_img = image[y : y + h, x : x + w] - return F.resize(cropped_img, self.output_size, self.interpolation) - - def _apply_coords(self, coords): - x, y, w, h = self._coord_info - coords[:, 0] = (coords[:, 0] - x) * self.output_size[1] / w - coords[:, 1] = (coords[:, 1] - y) * self.output_size[0] / h - return coords - - def _apply_mask(self, mask): - x, y, w, h = self._coord_info - cropped_mask = mask[y : y + h, x : x + w] - return F.resize(cropped_mask, self.output_size, cv2.INTER_NEAREST) - - def _get_coord(self, image, attempts=10): - height, width, _ = image.shape - area = height * width - - for _ in range(attempts): - target_area = np.random.uniform(*self.scale_range) * area - log_ratio = tuple(math.log(x) for x in self.ratio_range) - aspect_ratio = math.exp(np.random.uniform(*log_ratio)) - - w = int(round(math.sqrt(target_area * aspect_ratio))) - h = int(round(math.sqrt(target_area / aspect_ratio))) - - if 0 < w <= width and 0 < h <= height: - x = np.random.randint(0, width - w + 1) - y = np.random.randint(0, height - h + 1) - return x, y, w, h - - # Fallback to central crop - in_ratio = float(width) / float(height) - if in_ratio < min(self.ratio_range): - w = width - h = int(round(w / min(self.ratio_range))) - elif in_ratio > max(self.ratio_range): - h = height - w = int(round(h * max(self.ratio_range))) - else: # whole image - w = width - h = height - x = (width - w) // 2 - y = (height - h) // 2 - return x, y, w, h - - -class CenterCrop(VisionTransform): - r"""Crops the given the input data at the center. - - :param output_size: Target size of output image, with (height, width) shape. - :param order: The same with :class:`VisionTransform` - """ - - def __init__(self, output_size, *, order=None): - super().__init__(order) - if isinstance(output_size, int): - self.output_size = (output_size, output_size) - else: - self.output_size = output_size - - def apply(self, input: Tuple): - self._coord_info = self._get_coord(self._get_image(input)) - return super().apply(input) - - def _apply_image(self, image): - x, y = self._coord_info - th, tw = self.output_size - return image[y : y + th, x : x + tw] - - def _apply_coords(self, coords): - x, y = self._coord_info - coords[:, 0] -= x - coords[:, 1] -= y - return coords - - def _apply_mask(self, mask): - x, y = self._coord_info - th, tw = self.output_size - return mask[y : y + th, x : x + tw] - - def _get_coord(self, image): - th, tw = self.output_size - h, w, _ = image.shape - assert th <= h and tw <= w, "output size is bigger than image size" - x = int(round((w - tw) / 2.0)) - y = int(round((h - th) / 2.0)) - return x, y - - -class RandomHorizontalFlip(VisionTransform): - r"""Horizontally flip the input data randomly with a given probability. - - :param p: probability of the input data being flipped. Default: 0.5 - :param order: The same with :class:`VisionTransform` - """ - - def __init__(self, prob: float = 0.5, *, order=None): - super().__init__(order) - self.prob = prob - - def apply(self, input: Tuple): - self._flipped = np.random.random() < self.prob - self._w = self._get_image(input).shape[1] - return super().apply(input) - - def _apply_image(self, image): - if self._flipped: - return F.flip(image, flipCode=1) - return image - - def _apply_coords(self, coords): - if self._flipped: - coords[:, 0] = self._w - coords[:, 0] - return coords - - def _apply_mask(self, mask): - if self._flipped: - return F.flip(mask, flipCode=1) - return mask - - -class RandomVerticalFlip(VisionTransform): - r"""Vertically flip the input data randomly with a given probability. - - :param p: probability of the input data being flipped. Default: 0.5 - :param order: The same with :class:`VisionTransform` - """ - - def __init__(self, prob: float = 0.5, *, order=None): - super().__init__(order) - self.prob = prob - - def apply(self, input: Tuple): - self._flipped = np.random.random() < self.prob - self._h = self._get_image(input).shape[0] - return super().apply(input) - - def _apply_image(self, image): - if self._flipped: - return F.flip(image, flipCode=0) - return image - - def _apply_coords(self, coords): - if self._flipped: - coords[:, 1] = self._h - coords[:, 1] - return coords - - def _apply_mask(self, mask): - if self._flipped: - return F.flip(mask, flipCode=0) - return mask - - -class Normalize(VisionTransform): - r"""Normalize the input data with mean and standard deviation. - Given mean: ``(M1,...,Mn)`` and std: ``(S1,..,Sn)`` for ``n`` channels, - this transform will normalize each channel of the input data. - ``output[channel] = (input[channel] - mean[channel]) / std[channel]`` - - :param mean: Sequence of means for each channel. - :param std: Sequence of standard deviations for each channel. - :param order: The same with :class:`VisionTransform` - """ - - def __init__(self, mean=0.0, std=1.0, *, order=None): - super().__init__(order) - self.mean = np.array(mean, dtype=np.float32) - self.std = np.array(std, dtype=np.float32) - - def _apply_image(self, image): - return (image - self.mean) / self.std - - def _apply_coords(self, coords): - return coords - - def _apply_mask(self, mask): - return mask - - -class GaussianNoise(VisionTransform): - r"""Add random gaussian noise to the input data. - Gaussian noise is generated with given mean and std. - - :param mean: Gaussian mean used to generate noise. - :param std: Gaussian standard deviation used to generate noise. - :param order: The same with :class:`VisionTransform` - """ - - def __init__(self, mean=0.0, std=1.0, *, order=None): - super().__init__(order) - self.mean = np.array(mean, dtype=np.float32) - self.std = np.array(std, dtype=np.float32) - - def _apply_image(self, image): - dtype = image.dtype - noise = np.random.normal(self.mean, self.std, image.shape) * 255 - image = image + noise.astype(np.float32) - return np.clip(image, 0, 255).astype(dtype) - - def _apply_coords(self, coords): - return coords - - def _apply_mask(self, mask): - return mask - - -class BrightnessTransform(VisionTransform): - r"""Adjust brightness of the input data. - - :param value: How much to adjust the brightness. Can be any - non negative number. 0 gives the original image - :param order: The same with :class:`VisionTransform` - """ - - def __init__(self, value, *, order=None): - super().__init__(order) - if value < 0: - raise ValueError("brightness value should be non-negative") - self.value = value - - def _apply_image(self, image): - if self.value == 0: - return image - - dtype = image.dtype - image = image.astype(np.float32) - alpha = np.random.uniform(max(0, 1 - self.value), 1 + self.value) - image = image * alpha - return image.clip(0, 255).astype(dtype) - - def _apply_coords(self, coords): - return coords - - def _apply_mask(self, mask): - return mask - - -class ContrastTransform(VisionTransform): - r"""Adjust contrast of the input data. - - :param value: How much to adjust the contrast. Can be any - non negative number. 0 gives the original image - :param order: The same with :class:`VisionTransform` - """ - - def __init__(self, value, *, order=None): - super().__init__(order) - if value < 0: - raise ValueError("contrast value should be non-negative") - self.value = value - - def _apply_image(self, image): - if self.value == 0: - return image - - dtype = image.dtype - image = image.astype(np.float32) - alpha = np.random.uniform(max(0, 1 - self.value), 1 + self.value) - image = image * alpha + F.to_gray(image).mean() * (1 - alpha) - return image.clip(0, 255).astype(dtype) - - def _apply_coords(self, coords): - return coords - - def _apply_mask(self, mask): - return mask - - -class SaturationTransform(VisionTransform): - r"""Adjust saturation of the input data. - - :param value: How much to adjust the saturation. Can be any - non negative number. 0 gives the original image - :param order: The same with :class:`VisionTransform` - """ - - def __init__(self, value, *, order=None): - super().__init__(order) - if value < 0: - raise ValueError("saturation value should be non-negative") - self.value = value - - def _apply_image(self, image): - if self.value == 0: - return image - - dtype = image.dtype - image = image.astype(np.float32) - alpha = np.random.uniform(max(0, 1 - self.value), 1 + self.value) - image = image * alpha + F.to_gray(image) * (1 - alpha) - return image.clip(0, 255).astype(dtype) - - def _apply_coords(self, coords): - return coords - - def _apply_mask(self, mask): - return mask - - -class HueTransform(VisionTransform): - r"""Adjust hue of the input data. - - :param value: How much to adjust the hue. Can be any number - between 0 and 0.5, 0 gives the original image - :param order: The same with :class:`VisionTransform` - """ - - def __init__(self, value, *, order=None): - super().__init__(order) - if value < 0 or value > 0.5: - raise ValueError("hue value should be in [0.0, 0.5]") - self.value = value - - def _apply_image(self, image): - if self.value == 0: - return image - - dtype = image.dtype - image = image.astype(np.uint8) - hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV_FULL) - h, s, v = cv2.split(hsv_image) - - alpha = np.random.uniform(-self.value, self.value) - h = h.astype(np.uint8) - # uint8 addition take cares of rotation across boundaries - with np.errstate(over="ignore"): - h += np.uint8(alpha * 255) - hsv_image = cv2.merge([h, s, v]) - return cv2.cvtColor(hsv_image, cv2.COLOR_HSV2BGR_FULL).astype(dtype) - - def _apply_coords(self, coords): - return coords - - def _apply_mask(self, mask): - return mask - - -class ColorJitter(VisionTransform): - r"""Randomly change the brightness, contrast, saturation and hue of an image. - - :param brightness: How much to jitter brightness. - Chosen uniformly from [max(0, 1 - brightness), 1 + brightness] - or the given [min, max]. Should be non negative numbers. - :param contrast: How much to jitter contrast. - Chosen uniformly from [max(0, 1 - contrast), 1 + contrast] - or the given [min, max]. Should be non negative numbers. - :param saturation: How much to jitter saturation. - Chosen uniformly from [max(0, 1 - saturation), 1 + saturation] - or the given [min, max]. Should be non negative numbers. - :param hue: How much to jitter hue. - Chosen uniformly from [-hue, hue] or the given [min, max]. - Should have 0<= hue <= 0.5 or -0.5 <= min <= max <= 0.5. - :param order: The same with :class:`VisionTransform` - """ - - def __init__(self, brightness=0, contrast=0, saturation=0, hue=0, *, order=None): - super().__init__(order) - transforms = [] - if brightness != 0: - transforms.append(BrightnessTransform(brightness)) - if contrast != 0: - transforms.append(ContrastTransform(contrast)) - if saturation != 0: - transforms.append(SaturationTransform(saturation)) - if hue != 0: - transforms.append(HueTransform(hue)) - self.transforms = Compose( - transforms, - shuffle_indices=[tuple(range(1, len(transforms) + 1))], - order=order, - ) - - def apply(self, input): - return self.transforms.apply(input) - - -class Lighting(VisionTransform): - def __init__(self, scale, *, order=None): - super().__init__(order) - if scale < 0: - raise ValueError("lighting scale should be non-negative") - self.scale = scale - self.eigvec = np.array( - [ - [-0.5836, -0.6948, 0.4203], - [-0.5808, -0.0045, -0.8140], - [-0.5675, 0.7192, 0.4009], - ] - ) # reverse the first dimension for BGR - self.eigval = np.array([0.2175, 0.0188, 0.0045]) - - def _apply_image(self, image): - if self.scale == 0: - return image - - dtype = image.dtype - image = image.astype(np.float32) - alpha = np.random.normal(scale=self.scale, size=3) - image = image + self.eigvec.dot(alpha * self.eigval) - return image.clip(0, 255).astype(dtype) - - def _apply_coords(self, coords): - return coords - - def _apply_mask(self, mask): - return mask diff --git a/python_module/megengine/distributed/__init__.py b/python_module/megengine/distributed/__init__.py deleted file mode 100644 index 1416e82c..00000000 --- a/python_module/megengine/distributed/__init__.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from .functional import ( - all_gather, - all_reduce_max, - all_reduce_min, - all_reduce_sum, - all_to_all, - bcast_param, - broadcast, - gather, - reduce_scatter_sum, - reduce_sum, - scatter, -) -from .util import ( - get_backend, - get_free_ports, - get_master_ip, - get_master_port, - get_rank, - get_world_size, - group_barrier, - init_process_group, - is_distributed, - synchronized, -) diff --git a/python_module/megengine/distributed/functional.py b/python_module/megengine/distributed/functional.py deleted file mode 100644 index 56ad089f..00000000 --- a/python_module/megengine/distributed/functional.py +++ /dev/null @@ -1,302 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from typing import Optional, Union - -import megengine._internal as mgb -from megengine._internal.opr_param_defs import CollectiveComm as Param - -from ..core import Buffer, Parameter, Tensor, wrap_io_tensor -from ..functional import add_update -from .helper import collective_comm_symvar -from .util import get_rank, is_distributed - - -@wrap_io_tensor -def _collective_comm(*args, **kargs): - return collective_comm_symvar(*args, **kargs) - - -def _group_check(*args): - """Return True when arguments are all None or all not None - """ - l = [val is None for val in args] - return len(set(l)) <= 1 - - -def reduce_sum( - tensor: Tensor, - key: Optional[str] = None, - nr_ranks: Optional[int] = None, - is_root: Optional[bool] = None, -) -> Tensor: - """Create reduce_sum operator for collective communication - - :param tensor: input tensor - :param key: unique identifier for collective communication - :param nr_ranks: number of ranks, use util.get_world_size() as default - :param is_root: whether this is a root node - """ - assert _group_check( - key, nr_ranks, is_root - ), "key, nr_ranks, is_root should be set at the same time" - return _collective_comm( - tensor, key, Param.Mode.REDUCE_SUM, nr_ranks, is_root, device=tensor.device, - ) - - -def gather( - tensor: Tensor, - key: Optional[str] = None, - nr_ranks: Optional[int] = None, - is_root: Optional[bool] = None, - rank: Optional[int] = None, -) -> Tensor: - """Create gather operator for collective communication - - :param tensor: input tensor - :param key: unique identifier for collective communication - :param nr_ranks: number of ranks, use util.get_world_size() as default - :param is_root: whether this is a root node - :param rank: rank of this node - """ - assert _group_check( - key, nr_ranks, is_root, rank - ), "key, nr_ranks, is_root, rank should be set at the same time" - return _collective_comm( - tensor, key, Param.Mode.GATHER, nr_ranks, is_root, rank, device=tensor.device, - ) - - -def broadcast( - tensor: Tensor, - key: Optional[str] = None, - nr_ranks: Optional[int] = None, - is_root: Optional[bool] = None, -) -> Tensor: - """Create broadcast operator for collective communication - - :param tensor: input tensor - :param key: unique identifier for collective communication - :param nr_ranks: number of ranks, use util.get_world_size() as default - :param is_root: whether this is a root node - """ - assert _group_check( - key, nr_ranks, is_root - ), "key, nr_ranks, is_root should be set at the same time" - - if is_root is None: - is_root = get_rank() == 0 - if is_root: - inp = tensor - else: - inp = tensor._symvar.owner_graph - - return _collective_comm( - inp, - key, - Param.Mode.BROADCAST, - nr_ranks, - is_root, - dtype=tensor.dtype, - device=tensor.device, - ) - - -def scatter( - tensor: Tensor, - key: Optional[str] = None, - nr_ranks: Optional[int] = None, - is_root: Optional[bool] = None, - rank: Optional[int] = None, -) -> Tensor: - """Create scatter operator for collective communication - - :param tensor: input tensor - :param key: unique identifier for collective communication - :param nr_ranks: number of ranks, use util.get_world_size() as default - :param is_root: whether this is a root node - :param rank: rank of this node - """ - assert _group_check( - key, nr_ranks, is_root, rank - ), "key, nr_ranks, is_root, rank should be set at the same time" - if key is None: - key = tensor._symvar.name - if is_root is None: - is_root = get_rank() == 0 - - if is_root: - inp = tensor - else: - inp = tensor._symvar.owner_graph - - return _collective_comm( - inp, - key, - Param.Mode.SCATTER, - nr_ranks, - is_root, - rank, - dtype=tensor.dtype, - device=tensor.device, - ) - - -def all_to_all( - tensor: Tensor, - key: Optional[str] = None, - nr_ranks: Optional[int] = None, - rank: Optional[int] = None, - local_grad: Optional[bool] = False, -) -> Tensor: - """Create all_to_all operator for collective communication - - :param tensor: input tensor - :param key: unique identifier for collective communication - :param nr_ranks: number of ranks, use util.get_world_size() as default - :param rank: rank of this node - :param local_grad: whether use local grad - """ - assert _group_check( - key, nr_ranks, rank - ), "key, nr_ranks, rank should be set at the same time" - return _collective_comm( - tensor, key, Param.Mode.ALL_TO_ALL, nr_ranks, rank=rank, local_grad=local_grad, - ) - - -def all_gather( - tensor: Tensor, - key: Optional[str] = None, - nr_ranks: Optional[int] = None, - rank: Optional[int] = None, - local_grad: Optional[bool] = False, -) -> Tensor: - """Create all_gather operator for collective communication - - :param tensor: input tensor - :param key: unique identifier for collective communication - :param nr_ranks: number of ranks, use util.get_world_size() as default - :param rank: rank of this node - :param local_grad: whether use local grad - """ - assert _group_check( - key, nr_ranks, rank - ), "key, nr_ranks, rank should be set at the same time" - return _collective_comm( - tensor, key, Param.Mode.ALL_GATHER, nr_ranks, rank=rank, local_grad=local_grad - ) - - -def reduce_scatter_sum( - tensor: Tensor, - key: Optional[str] = None, - nr_ranks: Optional[int] = None, - rank: Optional[int] = None, - local_grad: Optional[bool] = False, -) -> Tensor: - """Create reduce_scatter_sum operator for collective communication - - :param tensor: input tensor - :param key: unique identifier for collective communication - :param nr_ranks: number of ranks, use util.get_world_size() as default - :param rank: rank of this node - :param local_grad: whether use local grad - """ - assert _group_check( - key, nr_ranks, rank - ), "key, nr_ranks, rank should be set at the same time" - return _collective_comm( - tensor, - key, - Param.Mode.REDUCE_SCATTER_SUM, - nr_ranks, - rank=rank, - local_grad=local_grad, - ) - - -def all_reduce_sum( - tensor: Tensor, - key: Optional[str] = None, - nr_ranks: Optional[int] = None, - local_grad: Optional[bool] = False, -) -> Tensor: - """Create all_reduce_sum operator for collective communication - - :param tensor: input tensor - :param key: unique identifier for collective communication - :param nr_ranks: number of ranks, use util.get_world_size() as default - :param local_grad: whether use local grad - """ - assert _group_check(key, nr_ranks), "key, nr_ranks should be set at the same time" - return _collective_comm( - tensor, key, Param.Mode.ALL_REDUCE_SUM, nr_ranks, local_grad=local_grad - ) - - -def all_reduce_max( - tensor: Tensor, - key: Optional[str] = None, - nr_ranks: Optional[int] = None, - local_grad: Optional[bool] = False, -) -> Tensor: - """Create all_reduce_max operator for collective communication - - :param tensor: input tensor - :param key: unique identifier for collective communication - :param nr_ranks: number of ranks, use util.get_world_size() as default - :param local_grad: whether use local grad - """ - assert _group_check(key, nr_ranks), "key, nr_ranks should be set at the same time" - return _collective_comm( - tensor, key, Param.Mode.ALL_REDUCE_MAX, nr_ranks, local_grad=local_grad - ) - - -def all_reduce_min( - tensor: Tensor, - key: Optional[str] = None, - nr_ranks: Optional[int] = None, - local_grad: Optional[bool] = False, -) -> Tensor: - """Create all_reduce_min operator for collective communication - - :param tensor: input tensor - :param key: unique identifier for collective communication - :param nr_ranks: number of ranks, use util.get_world_size() as default - :param local_grad: whether use local grad - """ - assert _group_check(key, nr_ranks), "key, nr_ranks should be set at the same time" - return _collective_comm( - tensor, key, Param.Mode.ALL_REDUCE_MIN, nr_ranks, local_grad=local_grad - ) - - -def bcast_param( - inp: Union[Buffer, Parameter], - key: Optional[str] = None, - nr_ranks: Optional[int] = None, - is_root: Optional[bool] = None, -) -> None: - """Broadcast parameters among devices - - :param inp: input Buffer or Parameter to be synchronized - :param key: unique identifier for collective communication - :param nr_ranks: number of ranks, use util.get_world_size() as default - :param is_root: whether this is a root node - """ - if not is_distributed(): - return - assert _group_check( - key, nr_ranks, is_root - ), "key, nr_ranks, is_root should be set at the same time" - assert isinstance(inp, (Buffer, Parameter)) - bcast_res = broadcast(inp, key, nr_ranks, is_root) - add_update(inp, bcast_res, alpha=0) diff --git a/python_module/megengine/distributed/helper.py b/python_module/megengine/distributed/helper.py deleted file mode 100644 index 7d2d84bd..00000000 --- a/python_module/megengine/distributed/helper.py +++ /dev/null @@ -1,63 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from typing import Optional, Union - -import megengine._internal as mgb -from megengine._internal.opr_param_defs import CollectiveComm as CollParam - -from .util import ( - get_backend, - get_group_id, - get_master_ip, - get_master_port, - get_rank, - get_world_size, -) - - -def collective_comm_symvar( - inp: Union[mgb.SymbolVar, mgb.CompGraph], - key: Optional[str] = None, - op: CollParam.Mode = None, - nr_ranks: Optional[int] = None, - is_root: Optional[bool] = None, - rank: Optional[int] = None, - local_grad: Optional[bool] = False, - dtype: Optional[type] = None, - device: Optional[mgb.CompNode] = None, - comp_graph: Optional[mgb.CompGraph] = None, -) -> mgb.SymbolVar: - """Helper function for creating collective_comm operators - - :param inp: tensor or comp_graph - :param key: unique identifier for collective communication - :param op: mode of collective communication - :param nr_ranks: number of ranks, use util.get_world_size() as default - :param is_root: whether this node is root node - :param rank: rank of this node - :param local_grad: whether use local grad - :param dtype: output data type, use dtype of inp as default - :param device: output comp node, use comp node of inp as default - :param comp_graph: output comp graph, use comp graph of inp as default - """ - return mgb.opr.collective_comm( - inp, - key=key if key is not None else ("collective_comm_" + str(get_group_id())), - nr_devices=nr_ranks if nr_ranks is not None else get_world_size(), - is_root=is_root if is_root is not None else (get_rank() == 0), - rank=rank if rank is not None else get_rank(), - local_grad=local_grad, - server_addr=get_master_ip(), - port=get_master_port(), - param=CollParam(mode=op), - dtype=dtype, - backend=get_backend(), - comp_node=device, - comp_graph=comp_graph, - ) diff --git a/python_module/megengine/distributed/util.py b/python_module/megengine/distributed/util.py deleted file mode 100644 index 5166a9fc..00000000 --- a/python_module/megengine/distributed/util.py +++ /dev/null @@ -1,146 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import functools -import socket -from typing import Callable, List, Optional - -import megengine._internal as mgb - -from ..core import set_default_device - -_master_ip = None -_master_port = 0 -_world_size = 0 -_rank = 0 -_backend = None -_group_id = 0 - - -def init_process_group( - master_ip: str, - master_port: int, - world_size: int, - rank: int, - dev: int, - backend: Optional[str] = "nccl", -) -> None: - """Initialize the distributed process group, and also specify the device used in the current process. - - :param master_ip: IP address of the master node. - :param master_port: Port available for all processes to communicate. - :param world_size: Total number of processes participating in the job. - :param rank: Rank of the current process. - :param dev: The GPU device id to bind this process to. - :param backend: Communicator backend, currently support 'nccl' and 'ucx' - """ - global _master_ip # pylint: disable=global-statement - global _master_port # pylint: disable=global-statement - global _world_size # pylint: disable=global-statement - global _rank # pylint: disable=global-statement - global _backend # pylint: disable=global-statement - global _group_id # pylint: disable=global-statement - - if not isinstance(master_ip, str): - raise TypeError("Expect type str but got {}".format(type(master_ip))) - if not isinstance(master_port, int): - raise TypeError("Expect type int but got {}".format(type(master_port))) - if not isinstance(world_size, int): - raise TypeError("Expect type int but got {}".format(type(world_size))) - if not isinstance(rank, int): - raise TypeError("Expect type int but got {}".format(type(rank))) - if not isinstance(backend, str): - raise TypeError("Expect type str but got {}".format(type(backend))) - - _master_ip = master_ip - _master_port = master_port - _world_size = world_size - _rank = rank - _backend = backend - _group_id = 0 - - set_default_device(mgb.comp_node("gpu" + str(dev))) - - if rank == 0: - _master_port = mgb.config.create_mm_server("0.0.0.0", master_port) - if _master_port == -1: - raise Exception("Failed to start server on port {}".format(master_port)) - else: - assert master_port > 0, "master_port must be specified for non-zero rank" - - -def is_distributed() -> bool: - """Return True if the distributed process group has been initialized""" - return _world_size is not None and _world_size > 1 - - -def get_master_ip() -> str: - """Get the IP address of the master node""" - return str(_master_ip) - - -def get_master_port() -> int: - """Get the port of the rpc server on the master node""" - return _master_port - - -def get_world_size() -> int: - """Get the total number of processes participating in the job""" - return _world_size - - -def get_rank() -> int: - """Get the rank of the current process""" - return _rank - - -def get_backend() -> str: - """Get the backend str""" - return str(_backend) - - -def get_group_id() -> int: - """Get group id for collective communication""" - global _group_id - _group_id += 1 - return _group_id - - -def group_barrier() -> None: - """Block until all ranks in the group reach this barrier""" - mgb.config.group_barrier(_master_ip, _master_port, _world_size, _rank) - - -def synchronized(func: Callable): - """Decorator. Decorated function will synchronize when finished. - Specifically, we use this to prevent data race during hub.load""" - - @functools.wraps(func) - def wrapper(*args, **kwargs): - if not is_distributed(): - return func(*args, **kwargs) - - ret = func(*args, **kwargs) - group_barrier() - return ret - - return wrapper - - -def get_free_ports(num: int) -> List[int]: - """Get one or more free ports. - """ - socks, ports = [], [] - for i in range(num): - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - sock.bind(("", 0)) - socks.append(sock) - ports.append(sock.getsockname()[1]) - for sock in socks: - sock.close() - return ports diff --git a/python_module/megengine/functional/__init__.py b/python_module/megengine/functional/__init__.py deleted file mode 100644 index 6220c599..00000000 --- a/python_module/megengine/functional/__init__.py +++ /dev/null @@ -1,118 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# pylint: disable=redefined-builtin -from .elemwise import ( - abs, - add, - arccos, - arcsin, - ceil, - clamp, - cos, - divide, - equal, - exp, - floor, - greater, - greater_equal, - isinf, - isnan, - less, - less_equal, - log, - maximum, - minimum, - mod, - multiply, - power, - relu, - round, - sigmoid, - sin, - subtract, - tanh, -) -from .graph import add_extra_vardep, add_update, grad -from .loss import ( - binary_cross_entropy, - cross_entropy, - cross_entropy_with_softmax, - hinge_loss, - l1_loss, - nll_loss, - smooth_l1_loss, - square_loss, - triplet_margin_loss, -) -from .math import ( - argmax, - argmin, - logsumexp, - max, - mean, - min, - norm, - normalize, - prod, - sqrt, - sum, -) -from .nn import ( - assert_equal, - avg_pool2d, - batch_norm2d, - batched_matrix_mul, - conv2d, - conv_transpose2d, - dropout, - embedding, - eye, - flatten, - identity, - indexing_one_hot, - interpolate, - leaky_relu, - linear, - local_conv2d, - matrix_mul, - max_pool2d, - one_hot, - prelu, - remap, - roi_align, - roi_pooling, - softmax, - softplus, - sync_batch_norm, - warp_perspective, -) -from .quantized import conv_bias_activation -from .sort import argsort, sort, top_k -from .tensor import ( - add_axis, - arange, - broadcast_to, - concat, - cond_take, - dimshuffle, - gather, - linspace, - remove_axis, - reshape, - scatter, - shapeof, - transpose, - where, - zeros_like, -) -from .utils import accuracy, zero_grad - -# delete namespace -# pylint: disable=undefined-variable -del elemwise, graph, loss, math, nn, tensor # type: ignore[name-defined] diff --git a/python_module/megengine/functional/debug_param.py b/python_module/megengine/functional/debug_param.py deleted file mode 100644 index b27f4b4b..00000000 --- a/python_module/megengine/functional/debug_param.py +++ /dev/null @@ -1,49 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import os - -_conv_execution_strategy = os.getenv("MEGENGINE_CONV_EXECUTION_STRATEGY", "HEURISTIC") - - -def get_conv_execution_strategy() -> str: - """Returns the execuation strategy of :class:`~.Conv2d`. - - See :func:`~.set_conv_execution_strategy` for possible return values - """ - return _conv_execution_strategy - - -def set_conv_execution_strategy(option: str): - """Sets the execuation strategy of :class:`~.Conv2d`. - - :param option: Decides how :class:`~.Conv2d` algorithm is chosen. - Available values: - - * 'HEURISTIC' uses heuristic to choose the fastest algorithm. - * 'PROFILE' runs possible algorithms on real device to find the best. - * 'PROFILE_HEURISTIC' uses profile result and heuristic to choose the fastest algorithm. - * 'PROFILE_REPRODUCIBLE' uses the fastest of profile result that is also reproducible. - * 'HEURISTIC_REPRODUCIBLE' uses heuristic to choose the fastest algorithm that is also reproducible. - - The default strategy is 'HEURISTIC'. - - It can also be set through the environmental variable 'MEGENGINE_CONV_EXECUTION_STRATEGY'. - """ - valid_option = ( - "HEURISTIC", - "PROFILE", - "PROFILE_HEURISTIC", - "PROFILE_REPRODUCIBLE", - "HEURISTIC_REPRODUCIBLE", - ) - if not option in valid_option: - raise ValueError("Valid option can only be one of {}".format(valid_option)) - - global _conv_execution_strategy # pylint: disable=global-statement - _conv_execution_strategy = option diff --git a/python_module/megengine/functional/elemwise.py b/python_module/megengine/functional/elemwise.py deleted file mode 100644 index 16889652..00000000 --- a/python_module/megengine/functional/elemwise.py +++ /dev/null @@ -1,299 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# pylint: disable=unused-argument,invalid-name,redefined-builtin,arguments-out-of-order -import functools - -import megengine._internal as mgb - -from ..core.graph import _use_default_if_none -from ..core.tensor import Tensor, wrap_io_tensor - -__all__ = [ - "abs", - "arccos", - "add", - "arcsin", - "clamp", - "ceil", - "cos", - "divide", - "equal", - "exp", - "greater", - "greater_equal", - "floor", - "isinf", - "isnan", - "less", - "less_equal", - "log", - "maximum", - "minimum", - "mod", - "multiply", - "power", - "relu", - "round", - "sigmoid", - "sin", - "subtract", - "tanh", -] - - -def _elemwise(mode): # DONT export - """Decorator helps to wrap megbrain element-wise oprs""" - - def elemwise_decorator(func): - @functools.wraps(func) - @wrap_io_tensor - def elemwise_func(*inputs) -> Tensor: - if all(isinstance(i, (int, float)) for i in inputs): - device, comp_graph = _use_default_if_none(None, None) - ret = mgb.opr.elemwise( - *inputs, mode=mode, comp_node=device, comp_graph=comp_graph - ) - return ret.inferred_value[0] - return mgb.opr.elemwise(*inputs, mode=mode) - - return elemwise_func - - return elemwise_decorator - - -@_elemwise("ABS") -def abs(x): - """Calculate the absolute value element-wise.""" - - -@_elemwise("ACOS") -def arccos(x): - """Inverse cosine, element-wise.""" - - -@_elemwise("ADD") -def add(x, y): - """Element-wise addition.""" - - -@_elemwise("ASIN") -def arcsin(x): - """Inverse sine, element-wise.""" - - -@_elemwise("CEIL") -def ceil(x): - """Return the ceil of the input, element-wise.""" - - -@_elemwise("COS") -def cos(x): - """Cosine, element-wise.""" - - -@_elemwise("TRUE_DIV") -def divide(x, y): - """Return (x / y) element-wise.""" - - -@_elemwise("EQ") -def equal(x, y): - """Return (x == y) element-wise.""" - - -@_elemwise("EXP") -def exp(x): - """Calculate the exponential element-wise""" - - -@_elemwise("FLOOR") -def floor(x): - """Return the floor of the input, element-wise""" - - -def greater(x, y): - """Return (x > y) element-wise.""" - return less(y, x) - - -def greater_equal(x, y): - """Return (x >= y) element-wise""" - return less_equal(y, x) - - -@_elemwise("LT") -def less(x, y): - """Return (x < y) element-wise.""" - - -@_elemwise("LEQ") -def less_equal(x, y): - """Return (x =< y) element-wise.""" - - -@_elemwise("LOG") -def log(x): - """Natural logarithm (base `e`), element-wise.""" - - -@_elemwise("MAX") -def maximum(x, y): - """Element-wise maximum of array elements.""" - - -@_elemwise("MIN") -def minimum(x, y): - """Element-wise minimum of array elements.""" - - -@_elemwise("MOD") -def mod(x, y): - """Return element-wise remainder of division.""" - - -@_elemwise("MUL") -def multiply(x, y): - """Element-wise multiplication.""" - - -@_elemwise("POW") -def power(x, y): - """First tensor elements raised to powers from second tensor (x ** y), element-wise.""" - - -@_elemwise("RELU") -def relu(x): - """Return `max(x, 0)` element-wise.""" - - -@_elemwise("ROUND") -def round(x): - """Round tensor to int element-wise.""" - - -@_elemwise("SIGMOID") -def sigmoid(x): - """Return 1 / ( 1 + exp( -x ) ) element-wise.""" - - -@_elemwise("SIN") -def sin(x): - """Sine, element-wise.""" - - -@_elemwise("SUB") -def subtract(x, y): - """Subtract arguments element-wise""" - - -@_elemwise("TANH") -def tanh(x): - """Compute hyperbolic tangent element-wise.""" - - -@wrap_io_tensor -def clamp(inp: Tensor, lower=None, upper=None) -> Tensor: - r""" - Clamp all elements in :attr:`inp` into the range `[` :attr:`lower`, :attr:`upper` `]` and return - a resulting tensor: - - .. math:: - y_i = \begin{cases} - \text{lower} & \text{if } x_i < \text{lower} \\ - x_i & \text{if } \text{lower} \leq x_i \leq \text{upper} \\ - \text{upper} & \text{if } x_i > \text{upper} - \end{cases} - - :param inp: the input tensor. - :param lower: lower-bound of the range to be clamped to - :param upper: upper-bound of the range to be clamped to - - Example: - - .. testcode:: - - import numpy as np - from megengine import tensor - import megengine.functional as F - a = tensor(np.arange(5).astype(np.int32)) - - print(F.clamp(a, 2, 4).numpy()) - - print(F.clamp(a, lower=3).numpy()) - - print(F.clamp(a, upper=3).numpy()) - - .. testoutput:: - - [2 2 2 3 4] - [3 3 3 3 4] - [0 1 2 3 3] - - """ - assert ( - lower is not None or upper is not None - ), "At least one of 'lower' or 'upper' must not be None" - if lower is not None: - if upper is not None: - assert lower <= upper, "clamp lower bound is bigger that upper bound" - return minimum(maximum(inp, lower), upper) - else: - return maximum(inp, lower) - else: - return minimum(inp, upper) - - -def isnan(inp: Tensor) -> Tensor: - r"""Returns a new tensor representing if each element is NaN or not. - - :param: inp - :return: a new tensor representing if each element in :attr:`inp` is NaN or not. - - Examples: - - .. testcode:: - - from megengine import tensor - import megengine.functional as F - - x = tensor([1, float("nan"), 0]) - - print(F.isnan(x)) - - .. testoutput:: - - Tensor([0 1 0], dtype=uint8) - - """ - return (inp != inp).astype("uint8") - - -def isinf(inp: Tensor) -> Tensor: - r"""Returns a new tensor representing if each element is Inf or not. - - :param: inp - :return: a new tensor representing if each element in :attr:`inp` is Inf or not. - - Examples: - - .. testcode:: - - from megengine import tensor - import megengine.functional as F - - x = tensor([1, float("inf"), 0]) - - print(F.isinf(x)) - - .. testoutput:: - - Tensor([0 1 0], dtype=uint8) - - """ - return (abs(inp) == float("inf")).astype("uint8") diff --git a/python_module/megengine/functional/external.py b/python_module/megengine/functional/external.py deleted file mode 100644 index 6c93d217..00000000 --- a/python_module/megengine/functional/external.py +++ /dev/null @@ -1,65 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# pylint: disable=too-many-lines -from typing import List - -import megengine._internal as mgb - -from ..core import Tensor, wrap_io_tensor - - -@wrap_io_tensor -def cambricon_subgraph( - inputs: List[Tensor], data: bytes, symbol: str, tensor_dim_mutable: bool, -) -> List[Tensor]: - """Load a serialized Cambricon subgraph (i.e. cnrtModel_t) and - execute the operations defined in the subgraph. - - :param inputs: List of input tensors of the subgraph. - :param data: The serialized subgraph. - :param symbol: The name of the function in the subgraph. - The function is corresponding to a cnmlFusionOp - which is added to the cnmlModel_t/cnrtModel_t. - :param tensor_dim_mutable: Whether the input tensors' shapes are mutalbe - in cnrtModel_t - """ - return mgb.opr.cambricon_runtime( - data, symbol, tuple(map(lambda x: x._symvar, inputs)), tensor_dim_mutable - ) - - -@wrap_io_tensor -def atlas_subgraph(inputs: List[Tensor], data: bytes) -> List[Tensor]: - """Load a serialized Atlas subgraph (i.e. om model) and - execute the operations defined in the subgraph. - - :param inputs: List of input tensors of the subgraph. - :param data: The serialized subgraph. - """ - return mgb.opr.atlas_runtime(tuple(map(lambda x: x._symvar, inputs)), data) - - -@wrap_io_tensor -def extern_opr_subgraph( - inputs, output_shapes: List[tuple], dump_name: str, dump_data: bytes, -) -> List[Tensor]: - """Load a serialized extern opr subgraph and fake execute the operator - - :param inputs: Tensor or list of input tensors. - :param output_shapes: The output shapes. - :param dump_name: The serialized subgraph name. - :param dump_data: The serialized subgraph. - - :return: List of tensors - """ - if not isinstance(inputs, list): - inputs = [inputs] - return mgb.opr.extern_c_opr_placeholder( - inputs, output_shapes, dump_name=dump_name, dump_data=dump_data, - ) diff --git a/python_module/megengine/functional/graph.py b/python_module/megengine/functional/graph.py deleted file mode 100644 index 5dbdadb6..00000000 --- a/python_module/megengine/functional/graph.py +++ /dev/null @@ -1,125 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import collections -from typing import Iterable, Optional, Union - -import megengine._internal as mgb - -from ..core.graph import get_default_graph -from ..core.tensor import Tensor, wrap_io_tensor -from ..jit import barrier, mark_impure, trace - - -@wrap_io_tensor -def grad( - target: Tensor, - wrt: Union[Tensor, Iterable[Tensor]], - warn_mid_wrt: bool = True, - use_virtual_grad: bool = None, - return_zero_for_nodep: bool = True, -) -> Union[Tensor, Iterable[Optional[Tensor]], None]: - r"""Compute the symbolic gradient of ``target`` with repect to ``wrt``. - - ``wrt`` can either be a single tensor or a sequence of tensors. - - :param target: ``grad`` target tensor - :param wrt: with respect to which to compute the gradient - :param warn_mid_wrt: whether to give warning if ``wrt`` is not endpoint - :param use_virtual_grad: whether to use virtual ``grad`` opr, so fwd graph can - be optimized before applying ``grad``; if ``None`` is given, then virtual - ``grad`` would be used if ``graph_opt_level >= 2`` - :param return_zero_for_nodep: if ``target`` does not depend on ``wrt``, set to True to return - a zero-valued :class:`~.Tensor` rather than ``None``; can't be set to False when using - virtual ``grad`` opr. - :return: :math:`\partial\text{target} / \partial\text{wrt}` - """ - if not isinstance(wrt, mgb.SymbolVar): - assert isinstance(wrt, collections.Iterable) - wrt = [w._symvar for w in wrt] - - return mgb.grad(target, wrt, warn_mid_wrt, use_virtual_grad, return_zero_for_nodep) - - -_add_update_cache = {} # type: dict - -_dummy = mgb.SharedScalar(0) - - -def add_update( - dest: Tensor, - delta: Tensor, - *, - alpha: Union[Tensor, float, int] = 1.0, - beta: Union[Tensor, float, int] = 1.0, - bias: Union[Tensor, float, int] = 0.0 -): - r"""Inplace modify ``dest`` as follows: - - .. math:: - dest = alpha * dest + beta * delta + bias - - :param dest: input data that will be inplace modified. - :param delta: update value that will be added to ``dest``. - :param alpha: weight ratio of ``dest``. Default: 1.0 - :param beta: weight ratio of ``delta``. Default: 1.0 - :param bias: bias value appended to the result. Default: 0.0 - """ - - if isinstance(beta, Tensor) or isinstance(alpha, Tensor): - delta *= beta - beta = 1.0 - if isinstance(alpha, Tensor): - delta += (alpha - 1.0) * dest - alpha = 1.0 - if isinstance(bias, Tensor): - delta += bias - bias = 0.0 - - comp_graph = dest._comp_graph or get_default_graph() - comp_node = dest._comp_node - - if not isinstance(delta, Tensor): - _delta = mgb.make_immutable( - value=delta, comp_node=comp_node, comp_graph=comp_graph - ) - else: - _delta = delta._attach(comp_graph) - - _dest = dest._attach(comp_graph) - - # use (dest, delta) as the key, so we could not add the same delta to dest in static graph - key = (comp_graph._id(), _dest.id, _delta.id) - if key in _add_update_cache: - _alpha, _beta, _bias, config = _add_update_cache[key] - mgb.mgb._mgb.SharedScalar__set(_alpha, alpha) - mgb.mgb._mgb.SharedScalar__set(_beta, beta) - mgb.mgb._mgb.SharedScalar__set(_bias, bias) - else: - _alpha = mgb.SharedScalar(alpha) - _beta = mgb.SharedScalar(beta) - _bias = mgb.SharedScalar(bias) - config = mgb.helper.gen_config(None, comp_node, None) - _add_update_cache[key] = (_alpha, _beta, _bias, config) - - u = mgb.mgb._Opr.add_update( - _dest, barrier(_delta), _alpha, _beta, _bias, _dummy, config - ) - mark_impure(u) - - if trace._active_instance: - dest._override_symvar_during_trace(trace._active_instance, u) - - return Tensor(u) - - -@wrap_io_tensor -def add_extra_vardep(oup: Tensor, dep: Tensor): - r"""Explicitly set the dependency that tensor ``oup`` depends on tensor ``dep``. - """ - return mgb.config.add_extra_vardep(oup, dep) diff --git a/python_module/megengine/functional/loss.py b/python_module/megengine/functional/loss.py deleted file mode 100644 index 0755825d..00000000 --- a/python_module/megengine/functional/loss.py +++ /dev/null @@ -1,391 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import megengine._internal as mgb - -from ..core.tensor import Tensor -from .elemwise import abs, equal, log, maximum, power, relu -from .nn import assert_equal, indexing_one_hot -from .tensor import where -from .utils import zero_grad - - -def l1_loss(pred: Tensor, label: Tensor) -> Tensor: - r""" - Calculates the mean absolute error (MAE) between - each element in the pred :math:`x` and label :math:`y`. - - The mean absolute error can be described as: - - .. math:: \ell(x,y) = mean\left(L \right) - - where - - .. math:: - - L = \{l_1,\dots,l_N\}, \quad - l_n = \left| x_n - y_n \right|, - - :math:`x` and :math:`y` are tensors of arbitrary shapes with a total - of :math:`N` elements each. :math:`N` is the batch size. - - :param pred: The predicted result from model. - :param label: The ground truth to compare. - - Examples: - - .. testcode:: - - import numpy as np - import megengine as mge - import megengine.functional as F - ipt = mge.tensor(np.array([3, 3, 3, 3]).astype(np.float32)) - tgt = mge.tensor(np.array([2, 8, 6, 1]).astype(np.float32)) - loss = F.l1_loss(ipt,tgt) - print(loss.numpy()) - - Outputs: - - .. testoutput:: - - [2.75] - - """ - - diff = pred - label - return abs(diff).mean() - - -def square_loss(pred: Tensor, label: Tensor) -> Tensor: - r""" - Calculates the mean squared error (squared L2 norm) between - each element in the pred :math:`x` and label :math:`y`. - - The mean squared error can be described as: - - .. math:: \ell(x, y) = mean\left( L \right) - - where - - .. math:: - - L = \{l_1,\dots,l_N\}, \quad - l_n = \left( x_n - y_n \right)^2, - - :math:`x` and :math:`y` are tensors of arbitrary shapes with a total - of :math:`N` elements each. :math:`N` is the batch size. - - :param pred: The predicted result from model. - :param label: The ground truth to compare. - - Shape: - - pred: :math:`(N, *)` where :math:`*` means any number of additional - dimensions - - label: :math:`(N, *)`. Same shape as ``pred`` - - """ - diff = pred - label - return (diff ** 2).mean() - - -def cross_entropy( - inp: Tensor, target: Tensor, axis: int = 1, ignore_index: int = -1 -) -> Tensor: - r""" - Returns the cross entropy loss in a classification problem. - - .. math:: \textrm{CrossEntropy}(x, y) = - \sum_{i} y_i\log(x_i) - - :param inp: The input tensor representing the predicted probability. - :param label: The input tensor representing the classification label. - :param axis: An axis along which cross_entropy will be applied. Default: 1 - :param ignore_index: Specifies a target value that is ignored and does not contribute to the input gradient. Default: -1 - - Examples: - - .. testcode:: - - import numpy as np - from megengine import tensor - import megengine.functional as F - - data_shape = (1, 2) - label_shape = (1, ) - - pred = tensor(np.array([0.5, 0.5], dtype=np.float32).reshape(data_shape)) - label = tensor(np.ones(label_shape, dtype=np.int32)) - loss = F.cross_entropy(pred, label) - print(loss.numpy()) - - Outputs: - - .. testoutput:: - - [0.69] - - """ - n0 = inp.ndim - n1 = target.ndim - assert n0 == n1 + 1, ( - "target ndim must be one less than input ndim; input_ndim={} " - "target_ndim={}".format(n0, n1) - ) - - if ignore_index != -1: - mask = 1 - equal(target, ignore_index) - target = target * mask - loss = -log(indexing_one_hot(inp, target, axis)) * mask - return loss.sum() / maximum(mask.sum(), 1.0) - else: - return -log(indexing_one_hot(inp, target, axis)).mean() - - -def cross_entropy_with_softmax( - pred: Tensor, label: Tensor, axis: int = 1, label_smooth: float = 0 -) -> Tensor: - r""" - Returns loss after applying :func:`~.softmax` + :func:`~.cross_entropy`. - - It has better numerical stability compared with sequential calls to :func:`~.softmax` and :func:`~.cross_entropy`. - - When using label smoothing, the label distribution is as follows: - - .. math:: y^{LS}_{k}=y_{k}\left(1-\alpha\right)+\alpha/K - - where :math:`y^{LS}` and :math:`y` are new label distribution and origin label distribution respectively. - k is the index of label distribution. :math:`\alpha` is label_smooth and :math:`K` is the number of classes. - - :param pred: The input tensor representing the predicted probability. - :param label: The input tensor representing the classification label. - :param axis: An axis along which softmax will be applied. Default: 1. - :param label_smooth: A label smoothing of parameter that can re-distribute target distribution. Default: 0. - """ - - n0 = pred.ndim - n1 = label.ndim - assert n0 == n1 + 1, ( - "target ndim must be one less than input ndim; input_ndim={} " - "target_ndim={}".format(n0, n1) - ) - - num_classes = pred.shapeof(axis) - - # Denominator of the softmax - offset = zero_grad(pred.max(axis=axis, keepdims=True)) - pred = pred - offset - down = mgb.opr.elem.exp(pred).sum(axis=axis, keepdims=True) - - up = indexing_one_hot(pred, label, axis) - - if label_smooth != 0: - factor = label_smooth / num_classes - up = up * (1 - label_smooth) + pred.sum(axis=axis, keepdims=True) * factor - - return (log(down) - up).mean() - - -def triplet_margin_loss( - anchor: Tensor, positive: Tensor, negative: Tensor, margin: float = 1.0, p: int = 2 -) -> Tensor: - r""" - Creates a criterion that measures the triplet loss given an input tensors. - - .. math:: - - L(a, p, n) = max\left\{d\left(a_{i},p_{i}\right)-d\left(a_{i}, n_{i}\right)+margin, 0\right\},\ - d\left(x_{i},y_{i}\right)=\left\|x_{i}-y_{i}\right\|_{p} - - :param anchor: The input tensor representing the anchor samples. - :param positive: The input tensor representing the positive samples. - :param negative: The input tensor representing the negative samples. - :param margin: Default: 1.0 - :param p: The norm degree for pairwise distance. Default: 2.0 - """ - - s0 = anchor.shapeof() - s1 = positive.shapeof() - s2 = negative.shapeof() - assert_equal(s0, s1) - assert_equal(s1, s2) - - n0 = anchor.ndim - n1 = positive.ndim - n2 = negative.ndim - assert n0 == 2 and n1 == 2 and n2 == 2, ( - "anchor ndim, positive ndim, and negative ndim must be 2; " - "anchor_ndim={} positive_ndim={} negative_ndim={}".format(n0, n1, n2) - ) - assert p > 0, "a margin with a value greater than 0; p={}".format(p) - - diff0 = abs(anchor - positive) - diff1 = abs(anchor - negative) - - d1 = power(power(diff0, p).sum(axis=1, keepdims=True), 1 / p) - d2 = power(power(diff1, p).sum(axis=1, keepdims=True), 1 / p) - - loss = maximum(d1 - d2 + margin, 0) - - return loss.mean() - - -def binary_cross_entropy(pred: Tensor, label: Tensor) -> Tensor: - r"""Function that measures the Binary Cross Entropy between the target and the prediction. - - :param pred: (N,*) where * means, any number of additional dimensions. - :param label: (N,*), same shape as the input. - - """ - s0 = pred.shapeof() - s1 = label.shapeof() - - assert_equal(s0, s1) - - return -1.0 * (label * log(pred) + (1.0 - label) * log(1 - pred)).mean() - - -def nll_loss( - pred: Tensor, label: Tensor, axis: int = 1, ignore_index: int = -1 -) -> Tensor: - r""" - The negative log likelihood loss. - - :param pred: The predicted result from model. - :param label: The ground truth to compare. - - Examples: - - .. testcode:: - - import numpy as np - from megengine import tensor - import megengine.functional as F - data_shape = (2, 2) - label_shape = (2, ) - - data = tensor( - np.array([[1, 0.5], [0.3, 1.2]], dtype=np.float32).reshape(data_shape), - ) - label = tensor( - np.ones(label_shape, dtype=np.int32) - ) - pred = F.log(F.softmax(data)) - loss1 = F.nll_loss(pred, label) - loss2 = F.cross_entropy_with_softmax(data, label) - print(loss1.numpy(), loss2.numpy()) - - Outputs: - - .. testoutput:: - - [0.6576154] [0.6576154] - - """ - n0 = pred.ndim - n1 = label.ndim - assert n0 == n1 + 1, ( - "target ndim must be one less than input ndim; input_ndim={} " - "target_ndim={}".format(n0, n1) - ) - - mask = 1.0 - equal(label, ignore_index) - label = label * mask - - loss = indexing_one_hot(pred, label, axis) * mask - - return -1.0 * loss.sum() / maximum(mask.sum(), 1.0) - - -def hinge_loss(pred: Tensor, label: Tensor, norm: str = "L1") -> Tensor: - r""" - Caculate the hinge loss which is often used in SVMs. - - The hinge loss can be described as: - - .. math:: loss(x, y) = \frac{1}{N}\sum_i\sum_j(max(0, 1 - x_{ij}*y_{ij})) - - :param pred: The input tensor representing the predicted probability, shape is (N, C). - :param label: The input tensor representing the binary classification label, shape is (N, C). - :param norm: Specify the norm to caculate the loss, should be "L1" or "L2". - - Examples: - - .. testcode:: - - from megengine import tensor - import megengine.functional as F - - pred = tensor([[0.5, -0.5, 0.1], [-0.6, 0.7, 0.8]]) - label = tensor([[1, -1, -1], [-1, 1, 1]]) - - loss = F.hinge_loss(pred, label) - - print(loss.numpy()) - - Outputs: - - .. testoutput:: - - [1.5] - - """ - assert norm in ["L1", "L2"], "norm must be L1 or L2" - # Converts binary labels to -1/1 labels. - loss = relu(1.0 - pred * label) - if norm == "L1": - return loss.sum(axis=1).mean() - else: - return (loss ** 2).sum(axis=1).mean() - - -def smooth_l1_loss(pred: Tensor, label: Tensor) -> Tensor: - r""" - Caculate the smooth l1 loss proposed in `Fast R-CNN paper by Ross Girshick`. - - The smooth l1 loss can be described as: - - .. math:: - \text{loss}(x, y) = \frac{1}{n} \sum_{i} l_{i} - - where :math:`l_{i}` is given by: - - .. math:: - l_{i} = - \begin{cases} - 0.5 (x_i - y_i)^2, & \text{if } |x_i - y_i| < 1 \\ - |x_i - y_i| - 0.5, & \text{otherwise } - \end{cases} - - :param pred: The predicted result from model. - :param label: The ground truth to compare. - - Examples: - - .. testcode:: - - from megengine import tensor - import megengine.functional as F - - pred = tensor([[0.5, -0.5, 0.1], [-0.6, 0.7, 0.8]]) - label = tensor([[0.4, 1.5, 1.2], [0., 0.1, 2.2]]) - - loss = F.smooth_l1_loss(pred, label) - - print(loss.numpy()) - - Outputs: - - .. testoutput:: - - [0.5608334] - """ - diff = abs(pred - label) - l2_loss = 0.5 * (diff ** 2) - l1_loss = diff - 0.5 - mask = diff < 1 - loss = where(mask, l2_loss, l1_loss) - return loss.mean() diff --git a/python_module/megengine/functional/math.py b/python_module/megengine/functional/math.py deleted file mode 100644 index 06f9cebe..00000000 --- a/python_module/megengine/functional/math.py +++ /dev/null @@ -1,333 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import math -import numbers -from typing import Optional, Sequence, Union - -import megengine._internal as mgb - -from ..core import Tensor, wrap_io_tensor -from .elemwise import clamp, exp, isinf, log -from .tensor import remove_axis, where, zeros_like - - -@wrap_io_tensor -def sum(inp: Tensor, axis: Optional[int] = None, keepdims: bool = False) -> Tensor: - r"""Returns the sum of each row of the ``inp`` tensor in the given ``axis``. - - :param inp: The input tensor. - :param axis: The dimension to reduce. If None, all the dimensions will be reduced. - Default: None - :param keepdims: Whether the output tensor has ``axis`` retained or not. - Default: False - :return: The output tensor - - Examples: - - .. testcode:: - - import numpy as np - from megengine import tensor - import megengine.functional as F - - data = tensor(np.arange(1, 7, dtype=np.int32).reshape(2, 3)) - out = F.sum(data) - print(out.numpy()) - - .. testoutput:: - - [21] - - """ - return mgb.opr.reduce_(inp, "SUM", axis, keepdims) - - -@wrap_io_tensor -def prod(inp: Tensor, axis: Optional[int] = None, keepdims=False) -> Tensor: - r""" - Returns the element product of input tensor along given *axis*. - - :param inp: The input tensor - :param axis: The dimension to reduce. If None, all the dimensions will be reduced. Default: ``None`` - :param keepdims: Whether the output tensor has *axis* retained or not. Default: ``False`` - :return: The output tensor - - Examples: - - .. testcode:: - - import numpy as np - from megengine import tensor - import megengine.functional as F - - data = tensor(np.arange(1, 7, dtype=np.int32).reshape(2, 3)) - out = F.prod(data) - print(out.numpy()) - - Outputs: - - .. testoutput:: - - [720] - - """ - return mgb.opr.reduce_(inp, "PRODUCT", axis, keepdims) - - -@wrap_io_tensor -def mean(inp: Tensor, axis: Optional[int] = None, keepdims: bool = False) -> Tensor: - """Returns the mean value of each row of the ``inp`` tensor in - the given ``axis``. If axis is a list of dimensions, - reduce over all of them. - - :param inp: The input tensor - :param axis: The dimension to reduce. If None, all the dimensions will be reduced. Default: None - :param keepdims: Whether the output tensor has ``axis`` retained or not. Default: False - - Examples: - - .. testcode:: - - import numpy as np - from megengine import tensor - import megengine.functional as F - - data = tensor(np.arange(1, 7, dtype=np.int32).reshape(2, 3)) - out = F.mean(data) - print(out.numpy()) - - .. testoutput:: - - [3.5] - - """ - return mgb.opr.mean(inp, axis, keepdims) - - -@wrap_io_tensor -def min(inp: Tensor, axis: Optional[int] = None, keepdims: bool = False) -> Tensor: - r""" - Returns the min value of input tensor along given *axis*. - - :param inp: The input tensor - :param axis: The dimension to reduce. If None, all the dimensions will be reduced. Default: None - :param keepdims: Whether the output tensor has *axis* retained or not. Default: False - :return: The output tensor - - Examples: - - .. testcode:: - - import numpy as np - from megengine import tensor - import megengine.functional as F - - x = tensor(np.arange(1, 7, dtype=np.int32).reshape(2,3)) - y = F.min(x) - print(y.numpy()) - - Outputs: - - .. testoutput:: - - [1] - - """ - return mgb.opr.reduce_(inp, "MIN", axis, keepdims) - - -@wrap_io_tensor -def max(inp: Tensor, axis: Optional[int] = None, keepdims: bool = False) -> Tensor: - r"""Returns the max value of the input tensor along given *axis*. - - :param inp: The input tensor - :param axis: The dimension to reduce. If None, all the dimensions will be reduced. Default: None - :param keepdims: Whether the output tensor has *axis* retained or not. Default: False - :return: The output tensor - - Examples: - - .. testcode:: - - import numpy as np - from megengine import tensor - import megengine.functional as F - - x = tensor(np.arange(1, 7, dtype=np.int32).reshape(2,3)) - y = F.max(x) - print(y.numpy()) - - .. testoutput:: - - [6] - - """ - return mgb.opr.reduce_(inp, "MAX", axis, keepdims) - - -@wrap_io_tensor -def sqrt(inp: Tensor) -> Tensor: - """ - Return a new tensor with the square-root of the elements of ``inp`` - - :param inp: The input tensor - :return: The computed tensor - - Examples: - - .. testcode:: - - import numpy as np - import megengine as mge - import megengine.functional as F - - data = mge.tensor(np.arange(0, 6, dtype=np.float32).reshape(2, 3)) - out = F.sqrt(data) - print(out.numpy()) - - Outputs: - - .. testoutput:: - - [[0. 1. 1.4142] - [1.7321 2. 2.2361 ]] - - """ - - return mgb.opr.sqrt(inp) - - -def norm(inp: Tensor, p: int = 2, axis: Optional[int] = None, keepdims=False): - """Calculate ``p``-norm of input tensor along certain axis. - - :param inp: The input tensor - :param p: power of value ``p`` applied to ``inp``. Default: 2 - :param axis: The dimension to reduce. If None, all the dimensions will be reduced. Default: None - :param keepdims: Whether the output tensor has ``axis`` retained or not. Default: False - :return: The output tensor - - """ - if axis is None: - inp = inp.reshape(-1) - return (inp ** p).sum(axis=axis, keepdims=keepdims) ** (1.0 / p) - - -@wrap_io_tensor -def argmin(inp: Tensor, axis: Optional[int] = None, keepdims: bool = False) -> Tensor: - r"""Returns the indices of the minimum values along an axis - - :param inp: The input tensor - :param axis: The dimension to reduce. If None, all the dimensions will be reduced. Default: None - :param keepdims: Whether the output tensor has *axis* retained or not. Default: False - :return: The output tensor - - Examples: - - .. testcode:: - - import numpy as np - from megengine import tensor - import megengine.functional as F - - x = tensor(np.arange(1, 7, dtype=np.int32).reshape(2,3)) - y = F.argmin(x) - print(y.numpy()) - - .. testoutput:: - - [0] - - """ - return mgb.opr.argmin(inp, axis, keepdims) - - -@wrap_io_tensor -def argmax(inp: Tensor, axis: Optional[int] = None, keepdims: bool = False) -> Tensor: - r"""Returns the indices of the maximum values along an axis - - :param inp: The input tensor - :param axis: The dimension to reduce. If None, all the dimensions will be reduced. Default: None - :param keepdims: Whether the output tensor has *axis* retained or not. Default: False - :return: The output tensor - - Examples: - - .. testcode:: - - import numpy as np - from megengine import tensor - import megengine.functional as F - - x = tensor(np.arange(1, 7, dtype=np.int32).reshape(2,3)) - y = F.argmax(x) - print(y.numpy()) - - .. testoutput:: - - [5] - - """ - return mgb.opr.argmax(inp, axis, keepdims) - - -def normalize( - inp: Tensor, p: int = 2, axis: Optional[int] = None, eps: float = 1e-12 -) -> Tensor: - r"""Perform :math:`L_p` normalization of input tensor along certain axis. - - For a tensor :attr:`inp` of shape :math:`(n_0, ..., n_{dim}, ..., n_k)`, each - :math:`n_{dim}` -element vector :math:`v` along dimension :attr:`axis` is transformed as: - - .. math:: - v = \frac{v}{\max(\lVert v \rVert_p, \epsilon)}. - - :param inp: the input tensor - :param p: power of value ``p`` applied to ``inp``. Default: 2 - :param axis: The dimension to reduce. If None, all the dimensions will be reduced - to calculate the norm. Default: None - :param eps: a small value to avoid division by zero. Default: 1e-12 - :return: the normalized output tensor - - """ - if axis is None: - return inp / clamp(norm(inp, p), lower=eps) - else: - return inp / clamp(norm(inp, p, axis, keepdims=True), lower=eps) - - -def logsumexp(inp: Tensor, axis: Union[int, Sequence[int]], keepdims: bool = False): - r""" - Compute the log of the sum of exponentials of inputs along the given :attr:`axis`. The computation is numerically stabilized. - - .. math:: - - \mathsf{logsumexp}(x_1, \dots, x_n) = \log(\exp(x_1) + \cdots + \exp(x_n)) - - :param inp: The input tensor. - :param axis: Axis over which the sum is taken. It can be a single axis or a list of axes. - :param keepdims: whether to retain :attr:`axis` or not for the output tensor. - - """ - if isinstance(axis, numbers.Integral): - axis = (axis,) - max_value = inp - for dim in axis: - max_value = max_value.max(axis=dim, keepdims=True) - max_value = where( - isinf(max_value).astype("int32"), zeros_like(max_value), max_value - ) - x = exp(inp - max_value) - for dim in axis: - x = x.sum(axis=dim, keepdims=True) - x = max_value + log(x) - if not keepdims: - axis = sorted(axis, reverse=True) - for i in axis: - x = remove_axis(x, axis=i) - return x diff --git a/python_module/megengine/functional/nn.py b/python_module/megengine/functional/nn.py deleted file mode 100644 index 44438d83..00000000 --- a/python_module/megengine/functional/nn.py +++ /dev/null @@ -1,1234 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# pylint: disable=too-many-lines -from typing import Optional, Tuple, Union - -import megengine._internal as mgb -from megengine._internal import CompGraph, CompNode -from megengine._internal.config import add_extra_vardep -from megengine._internal.opr import add_update -from megengine._internal.opr_param_defs import CollectiveComm as CollParam - -from .. import distributed as dist -from ..core import Tensor, wrap_io_tensor -from ..core.graph import _use_default_if_none -from ..distributed.util import get_group_id -from ..jit import barrier, mark_impure -from ..random import uniform -from ..utils.types import _pair, _pair_nonzero -from .debug_param import get_conv_execution_strategy -from .elemwise import exp, log -from .tensor import where -from .utils import _decide_comp_node_and_comp_graph - - -@wrap_io_tensor -def linear(inp: Tensor, weight: Tensor, bias: Optional[Tensor] = None) -> Tensor: - """Applies a linear transformation to the input. - - Refer to :class:`~.module.linear.Linear` for more information. - - :param inp: the input tensor with shape `(N, in_features)`. - :param weight: the weight with shape `(out_features, in_features)`. - :param bias: the bias with shape `(out_features,)`. - Default: ``None`` - """ - orig_shape = inp.shape - inp = inp.reshape(-1, orig_shape[-1]) - ret = mgb.opr.matrix_mul(inp, weight, transposeB=True) - ret = ret.reshape(orig_shape[:-1], weight.shape[0]) - if bias is not None: - ret += bias.reshape(1, bias.shape[0]) - return ret - - -@wrap_io_tensor -def conv2d( - inp: Tensor, - weight: Tensor, - bias: Optional[Tensor] = None, - stride: Union[int, Tuple[int, int]] = 1, - padding: Union[int, Tuple[int, int]] = 0, - dilation: Union[int, Tuple[int, int]] = 1, - groups: int = 1, - conv_mode="CROSS_CORRELATION", - compute_mode="DEFAULT", -) -> Tensor: - """2D convolution operation. - - Refer to :class:`~.Conv2d` for more information. - - :param inp: The feature map of the convolution operation - :param weight: The convolution kernel - :param bias: The bias added to the result of convolution (if given) - :param stride: Stride of the 2D convolution operation. Default: 1 - :param padding: Size of the paddings added to the input on both sides of its - spatial dimensions. Only zero-padding is supported. Default: 0 - :param dilation: Dilation of the 2D convolution operation. Default: 1 - :param groups: number of groups to divide input and output channels into, - so as to perform a "grouped convolution". When ``groups`` is not 1, - ``in_channels`` and ``out_channels`` must be divisible by ``groups``, - and the shape of weight should be ``(groups, out_channel // groups, - in_channels // groups, height, width)``. - :type conv_mode: string or :class:`mgb.opr_param_defs.Convolution.Mode` - :param conv_mode: Supports 'CROSS_CORRELATION' or 'CONVOLUTION'. Default: - 'CROSS_CORRELATION'. - :type compute_mode: string or - :class:`mgb.opr_param_defs.Convolution.ComputeMode` - :param compute_mode: When set to 'DEFAULT', no special requirements will be - placed on the precision of intermediate results. When set to 'FLOAT32', - Float32 would be used for accumulator and intermediate result, but only - effective when input and output are of Float16 dtype. - - """ - ph, pw = _pair(padding) - sh, sw = _pair_nonzero(stride) - dh, dw = _pair_nonzero(dilation) - Sparse = mgb.opr_param_defs.Convolution.Sparse - sparse_type = Sparse.DENSE if groups == 1 else Sparse.GROUP - res = mgb.opr.convolution( - inp, - weight, - pad_h=ph, - pad_w=pw, - stride_h=sh, - stride_w=sw, - dilate_h=dh, - dilate_w=dw, - format="NCHW", - strategy=get_conv_execution_strategy(), - mode=conv_mode, - compute_mode=compute_mode, - sparse=sparse_type, - ) - if bias is not None: - res += bias - return res - - -@wrap_io_tensor -def conv_transpose2d( - inp: Tensor, - weight: Tensor, - bias: Optional[Tensor] = None, - stride: Union[int, Tuple[int, int]] = 1, - padding: Union[int, Tuple[int, int]] = 0, - dilation: Union[int, Tuple[int, int]] = 1, - groups: int = 1, - conv_mode="CROSS_CORRELATION", - compute_mode="DEFAULT", -) -> Tensor: - """2D transposed convolution operation. - - Refer to :class:`~.ConvTranspose2d` for more information. - - :param inp: The feature map of the convolution operation - :param weight: The convolution kernel - :param bias: The bias added to the result of convolution (if given) - :param stride: Stride of the 2D convolution operation. Default: 1 - :param padding: Size of the paddings added to the input on both sides of its - spatial dimensions. Only zero-padding is supported. Default: 0 - :param dilation: Dilation of the 2D convolution operation. Default: 1 - :param groups: number of groups to divide input and output channels into, - so as to perform a "grouped convolution". When ``groups`` is not 1, - ``in_channels`` and ``out_channels`` must be divisible by ``groups``, - and the shape of weight should be ``(groups, out_channel // groups, - in_channels // groups, height, width)``. Default: 1 - :type conv_mode: string or :class:`mgb.opr_param_defs.Convolution.Mode` - :param conv_mode: Supports 'CROSS_CORRELATION' or 'CONVOLUTION'. Default: - 'CROSS_CORRELATION'. - :type compute_mode: string or - :class:`mgb.opr_param_defs.Convolution.ComputeMode` - :param compute_mode: When set to 'DEFAULT', no special requirements will be - placed on the precision of intermediate results. When set to 'FLOAT32', - Float32 would be used for accumulator and intermediate result, but only - effective when input and output are of Float16 dtype. - - """ - ph, pw = _pair(padding) - sh, sw = _pair_nonzero(stride) - dh, dw = _pair_nonzero(dilation) - Sparse = mgb.opr_param_defs.Convolution.Sparse - sparse_type = Sparse.DENSE if groups == 1 else Sparse.GROUP - res = mgb.opr.deconvolution( - inp, - weight, - pad_h=ph, - pad_w=pw, - stride_h=sh, - stride_w=sw, - dilate_h=dh, - dilate_w=dw, - format="NCHW", - strategy=get_conv_execution_strategy(), - mode=conv_mode, - compute_mode=compute_mode, - sparse=sparse_type, - ) - if bias is not None: - res += bias - return res - - -@wrap_io_tensor -def local_conv2d( - inp: Tensor, - weight: Tensor, - stride: Union[int, Tuple[int, int]] = 1, - padding: Union[int, Tuple[int, int]] = 0, - dilation: Union[int, Tuple[int, int]] = 1, - conv_mode="CROSS_CORRELATION", -) -> Tensor: - """Applies spatial 2D convolution over an image with untied kernels. - - Refer to :class:`~.LocalConv2d` for more information. - """ - ret = mgb.opr.group_local( - inp, - weight, - pad_h=padding[0], - pad_w=padding[1], - stride_h=stride[0], - stride_w=stride[1], - dilate_h=dilation[0], - dilate_w=dilation[1], - format="NCHW", - mode=conv_mode, - ) - return ret - - -@wrap_io_tensor -def max_pool2d( - inp: Tensor, - kernel_size: Union[int, Tuple[int, int]], - stride: Optional[Union[int, Tuple[int, int]]] = None, - padding: Union[int, Tuple[int, int]] = 0, -) -> Tensor: - """Applies a 2D max pooling over an input. - - Refer to :class:`~.MaxPool2d` for more information. - - :param inp: The input tensor. - :param kernel_size: The size of the window. - :param stride: The stride of the window. If not provided, its value is set to ``kernel_size``. - Default: None - :param padding: Implicit zero padding to be added on both sides. Default: 0 - - """ - - kh, kw = _pair_nonzero(kernel_size) - sh, sw = _pair_nonzero(stride or kernel_size) - ph, pw = _pair(padding) - mode = mgb.opr_param_defs.Pooling.Mode.MAX - return mgb.opr.pooling( - inp, - mode=mode, - format="NCHW", - stride_h=sh, - stride_w=sw, - pad_h=ph, - pad_w=pw, - window_h=kh, - window_w=kw, - ) - - -@wrap_io_tensor -def avg_pool2d( - inp: Tensor, - kernel_size: Union[int, Tuple[int, int]], - stride: Optional[Union[int, Tuple[int, int]]] = None, - padding: Union[int, Tuple[int, int]] = 0, -) -> Tensor: - """ Applies a 2D average pooling over an input. - - Refer to :class:`~.AvgPool2d` for more information. - - :param inp: The input tensor. - :param kernel_size: The size of the window. - :param stride: The stride of the window. If not provided, its value is set to ``kernel_size``. - Default: None - :param padding: Implicit zero padding to be added on both sides. Default: 0 - - """ - kh, kw = _pair_nonzero(kernel_size) - sh, sw = _pair_nonzero(stride or kernel_size) - ph, pw = _pair(padding) - mode = mgb.opr_param_defs.Pooling.Mode.AVERAGE - return mgb.opr.pooling( - inp, - mode=mode, - format="NCHW", - stride_h=sh, - stride_w=sw, - pad_h=ph, - pad_w=pw, - window_h=kh, - window_w=kw, - ) - - -@wrap_io_tensor -def prelu(inp: Tensor, weight: Tensor) -> Tensor: - r""" - Applies the element-wise PReLU function. - - Refer to :class:`~.PReLU` for more information. - """ - - return mgb.opr.elemwise(inp, 0, mode="MAX") + weight * mgb.opr.elemwise( - inp, 0, mode="MIN" - ) - - -@wrap_io_tensor -def leaky_relu(inp: Tensor, negative_slope: float = 0.01) -> Tensor: - r""" - Applies the element-wise leaky_relu function - - Refer to :class:`~.LeakyReLU` for more information. - """ - - return mgb.opr.elemwise(inp, 0, mode="MAX") + negative_slope * mgb.opr.elemwise( - inp, 0, mode="MIN" - ) - - -@wrap_io_tensor -def softplus(inp: Tensor, beta: float = 1, threshold: float = 20) -> Tensor: - r""" - Performs the elementwise function: - - .. math:: - - \mathsf{softplus}(x) = \log(1+\exp(\beta x)) / \beta. - - For numerical stability the identity function is used when :math:`\beta x > \textrm{threshold}`. - - """ - mask = beta * inp <= threshold - out = log(1 + exp(beta * inp)) / beta - out = where(mask, out, inp) - return out - - -@wrap_io_tensor -def flatten(inp: Tensor, start_axis: int = 0, end_axis: int = -1) -> Tensor: - r""" - Reshapes the tensor by flattening the sub-tensor from dimension ``start_axis`` to dimension ``end_axis``. - - :param inp: The input tensor. - :param start_axis: The start dimension that the sub-tensor to be flattened. Default: 0 - :param end_axis: The end dimension that the sub-tensor to be flattened. Default: -1 - - Examples: - - .. testcode:: - - import numpy as np - from megengine import tensor - import megengine.functional as F - - inp_shape = (2, 2, 3, 3) - inp = tensor( - np.arange(36, dtype=np.int32).reshape(inp_shape), - ) - oup = F.flatten(inp, 2) - print(inp.numpy().shape) - print(oup.numpy().shape) - - Outputs: - - .. testoutput:: - - (2, 2, 3, 3) - (2, 2, 9) - - """ - - target_shape = tuple(inp.shape[i] for i in range(start_axis)) + (-1,) - if end_axis != -1: - target_shape += (inp.shape[end_axis + 1 :],) - return inp.reshape(*target_shape) - - -def _get_softmax_axis(ndim: int) -> int: - if ndim in (0, 1, 3): - return 0 - return 1 - - -@wrap_io_tensor -def softmax(inp: Tensor, axis: Optional[int] = None) -> Tensor: - r""" - Applies a softmax function. Softmax is defined as: - - .. math:: - \text{Softmax}(x_{i}) = \frac{\exp(x_i)}{\sum_j \exp(x_j)} - - It is applied to all elements along axis, and will re-scale them so that - the elements lie in the range `[0, 1]` and sum to 1. - - See :class:`~megengine.module.activation.Softmax` for more details. - - :param inp: The input tensor. - :param axis: An axis along which softmax will be applied. By default, - softmax will apply along the highest ranked axis. - - """ - if axis is None: - axis = _get_softmax_axis(len(inp.imm_shape)) - offset = mgb.opr.zero_grad(inp.max(axis=axis, keepdims=True)) - inp = inp - offset - down = mgb.opr.elem.exp(inp).sum(axis=axis, keepdims=True) - return mgb.opr.elem.exp(inp) / down - - -@wrap_io_tensor -def batch_norm2d( - inp: Tensor, - running_mean: Tensor, - running_var: Tensor, - weight: Optional[Tensor] = None, - bias: Optional[Tensor] = None, - training: bool = False, - momentum: float = 0.9, - eps: float = 1e-5, -) -> Tensor: - """Applies batch normalization to the input. - - Refer to :class:`~.BatchNorm2d` and :class:`~.BatchNorm1d` for more information. - - :param inp: input tensor. - :param running_mean: tensor to store running mean. - :param running_var: tensor to store running variance. - :param weight: scaling tensor in the learnable affine parameters. - See :math:`\gamma` in :class:`~.BatchNorm2d` - :param bias: bias tensor in the learnable affine parameters. - See :math:`\beta` in :class:`~.BatchNorm2d` - :param training: a boolean value to indicate whether batch norm is performed - in traning mode. Default: ``False`` - :param momentum: the value used for the ``running_mean`` and ``running_var`` - computation. - Default: 0.9 - :param eps: a value added to the denominator for numerical stability. - Default: 1e-5. - - """ - - inp = mgb.opr.mark_no_broadcast_elemwise(inp) - _channels = inp.imm_shape[1] - _ndim = len(inp.imm_shape) - _param_shape = (1, _channels) + (1,) * (_ndim - 2) - - assert _ndim == 4, "only 4D tensor supported" - - if weight is not None: - weight = weight.reshape(*_param_shape) - else: - weight = mgb.make_immutable(*_use_default_if_none(None, None), 1.0).broadcast( - *_param_shape - ) - - if bias is not None: - bias = bias.reshape(*_param_shape) - else: - bias = mgb.make_immutable(*_use_default_if_none(None, None), 0.0).broadcast( - *_param_shape - ) - - FwdMode = mgb.opr_param_defs.BN.FwdMode - fwdmode = FwdMode.TRAINING if training else FwdMode.INFERENCE - avg_factor = 1 - momentum - - if running_mean is not None and running_var is not None: - if training: - inp = barrier(inp) - - output = mgb.opr.batch_norm( - inp, - weight, - bias, - running_mean, - running_var, - param_dim="DIM_1C11", - fwd_mode=fwdmode, - epsilon=eps, - avg_factor=avg_factor, - )[-1] - if training: - mark_impure(output) - else: - output = mgb.opr.batch_norm_no_statistic( - inp, - weight, - bias, - param_dim="DIM_1C11", - fwd_mode=fwdmode, - epsilon=eps, - avg_factor=avg_factor, - )[-1] - - return output - - -@wrap_io_tensor -def sync_batch_norm( - input: Tensor, - running_mean: Tensor, - running_var: Tensor, - weight: Optional[Tensor] = None, - bias: Optional[Tensor] = None, - training: bool = False, - momentum: Union[float, Tensor] = 0.9, - eps: float = 1e-5, - eps_mode="ADDITIVE", -) -> Tensor: - """ Applies synchronized batch normalization to the input. - - Refer to :class:`~.BatchNorm2d` and :class:`~.BatchNorm1d` for more information. - - :param inp: input tensor. - :param running_mean: tensor to store running mean. - :param running_var: tensor to store running variance. - :param weight: scaling tensor in the learnable affine parameters. - See :math:`\gamma` in :class:`~.BatchNorm2d` - :param bias: bias tensor in the learnable affine parameters. - See :math:`\beta` in :class:`~.BatchNorm2d` - :param training: a boolean value to indicate whether batch norm is performed - in traning mode. Default: ``False`` - :param momentum: the value used for the ``running_mean`` and ``running_var`` - computation. - Default: 0.9 - :param eps: a value added to the denominator for numerical stability. - Default: 1e-5. - """ - - assert eps_mode in {"MAX", "ADDITIVE"}, "unknown eps_mode: {}".format(eps_mode) - input = mgb.opr.mark_no_broadcast_elemwise(input) - _channels = input.imm_shape[1] - _ndim = len(input.imm_shape) - _param_shape = (1, _channels) + (1,) * (_ndim - 2) - - if training: - - def _sum_on_channel(input): - return mgb.opr.reduce_general([input, _param_shape], mode="sum") - - def _allreduce(stat, key): - return dist.helper.collective_comm_symvar( - stat, key, CollParam.Mode.ALL_REDUCE_SUM - ) - - reduce_size = input.shape[0] - for i in range(2, _ndim): - reduce_size = reduce_size * input.shape[i] - channel_x1s = _sum_on_channel(input) - channel_x2s = _sum_on_channel(input ** 2) - - if dist.is_distributed(): - # reduce all nodes' data to calculate mean and variance - reduce_size = reduce_size.reshape(*(1,) * _ndim) - stat = mgb.opr.concat([reduce_size, channel_x1s, channel_x2s], axis=1) - stat = _allreduce(stat, key="sync_bn_" + str(get_group_id())) - reduce_size = stat[:, :1].reshape(1) - channel_x1s = stat[:, 1 : 1 + _channels] - channel_x2s = stat[:, 1 + _channels :] - - channel_mean = channel_x1s / reduce_size - channel_variance = ( - channel_x1s ** 2 / (-reduce_size * reduce_size) + channel_x2s / reduce_size - ) - else: - assert running_var is not None and running_mean is not None - channel_variance = running_var.reshape(*_param_shape) - channel_mean = running_mean.reshape(*_param_shape) - - invsqrt_channel_variance = ( - mgb.opr.elem.max(channel_variance, eps) - if eps_mode == "MAX" - else mgb.opr.elem.add(channel_variance, eps) - ) ** -0.5 - - if weight is not None: - weight = weight.reshape(*_param_shape) - if bias is not None: - bias = bias.reshape(*_param_shape) - - # outvar = output * weight + bias - # where output = input * invsqrt_channel_variance + ( - # -channel_mean * invsqrt_channel_variance - # ) - # Manually expand output for gopt - - if weight is not None: - inv_var_wt = invsqrt_channel_variance * weight - neg_channel_mean = -channel_mean - if bias is not None: - outvar = input * inv_var_wt + (neg_channel_mean * inv_var_wt + bias) - else: - outvar = input * inv_var_wt + neg_channel_mean * inv_var_wt - else: - outvar = input * invsqrt_channel_variance + ( - -channel_mean * invsqrt_channel_variance - ) - if bias is not None: - outvar = outvar + bias - - if training and running_var is not None and running_mean is not None: - _mean_update = add_update( - running_mean, channel_mean, alpha=momentum, beta=1 - momentum, - ) - channel_variance_unbiased = channel_x1s ** 2 / ( - -reduce_size * (reduce_size - 1) - ) + channel_x2s / (reduce_size - 1) - _variance_update = add_update( - running_var, channel_variance_unbiased, alpha=momentum, beta=1 - momentum - ) - for dep in (_mean_update, _variance_update): - add_extra_vardep(outvar, dep) - - return outvar - - -def one_hot(inp: Tensor, num_classes: int) -> Tensor: - r""" - Perform one-hot encoding for the input tensor. - - :param inp: input tensor - :param num_classes: number of classes denotes the last dimension of the output tensor - - Examples: - - .. testcode:: - - import numpy as np - from megengine import tensor - import megengine.functional as F - - inp = tensor(np.arange(1, 4, dtype=np.int32)) - out = F.one_hot(inp, num_classes=4) - print(out.numpy()) - - Outputs: - - .. testoutput:: - - [[0 1 0 0] - [0 0 1 0] - [0 0 0 1]] - - """ - comp_node, comp_graph = _decide_comp_node_and_comp_graph(inp) - - zeros = mgb.make_immutable(value=0, comp_node=comp_node, comp_graph=comp_graph) - zeros_symvar = zeros.broadcast(inp.shapeof(), num_classes) - - ones = mgb.make_immutable(value=1, comp_node=comp_node, comp_graph=comp_graph) - ones_symvar = ones.broadcast(inp.shapeof(), 1) - - return Tensor( - mgb.opr.indexing_set_one_hot( - zeros_symvar, axis=len(inp.shapeof()), index=inp, value=ones_symvar - ) - ) - - -@wrap_io_tensor -def warp_perspective( - inp: Tensor, - M: Tensor, - dsize: Union[Tuple[int, int], int, Tensor], - border_mode: str = "REPLICATE", - border_val: float = 0.0, - interp_mode: str = "LINEAR", -): - r""" - Applies perspective transformation to batched 2D images. - - The input images are transformed to the output images by the transformation matrix: - - .. math:: - \text{output}(n, c, h, w) = \text{input} \left( n, c, - \frac{M_{00}h + M_{01}w + M_{02}}{M_{20}h + M_{21}w + M_{22}}, - \frac{M_{10}h + M_{11}w + M_{12}}{M_{20}h + M_{21}w + M_{22}} - \right) - - :param inp: input image - :param M: (batch, 3, 3) transformation matrix - :param dsize: (h, w) size of the output image - :param border_mode: pixel extrapolation method. Default: ``"REPLICATE"`` - :param border_val: value used in case of a constant border. Default: ``0`` - :param interp_mode: interpolation methods. Default: ``"LINEAR"`` - - Examples: - - .. testcode:: - - import numpy as np - from megengine import tensor - import megengine.functional as F - inp_shape = (1, 1, 4, 4) - inp = tensor(np.arange(16, dtype=np.float32).reshape(inp_shape)) - M_shape = (1, 3, 3) - # M defines a translation: dst(1, 1, h, w) = rst(1, 1, h+1, w+1) - M = tensor(np.array([[1., 0., 1.], - [0., 1., 1.], - [0., 0., 1.]], dtype=np.float32).reshape(M_shape)) - out = F.warp_perspective(inp, M, (2, 2)) - print(out.numpy()) - - Outputs: - - .. testoutput:: - - [[[[ 5. 6.] - [ 9. 10.]]]] - - """ - - return mgb.opr.warp_perspective( - inp, - M, - dsize, - bmode=border_mode, - border_val=border_val, - imode=interp_mode, - format="NCHW", - ) - - -@wrap_io_tensor -def remap( - inp: Tensor, - map_xy: Tensor, - border_mode: str = "REPLICATE", - scalar: float = 0.0, - interp_mode: str = "LINEAR", -) -> Tensor: - r""" - Applies remap transformation to batched 2D images. - - The input images are transformed to the output images by the tensor map_xy. - The output's H and W are same as map_xy's H and W. - - :param inp: input image - :param map_xy: (batch, oh, ow, 2) transformation matrix - :param border_mode: pixel extrapolation method. Default: ``"REPLICATE"`` - :param scalar: value used in case of a constant border. Default: ``0`` - :param interp_mode: interpolation methods. Default: ``"LINEAR"`` - - Examples: - - .. testcode:: - - import numpy as np - from megengine import tensor - import megengine.functional as F - inp_shape = (1, 1, 4, 4) - inp = tensor(np.arange(16, dtype=np.float32).reshape(inp_shape)) - map_xy_shape = (1, 2, 2, 2) - map_xy = tensor(np.array([[[1., 0.],[0., 1.]], - [[0., 1.],[0., 1.]]], - dtype=np.float32).reshape(map_xy_shape)) - out = F.remap(inp, map_xy) - print(out.numpy()) - - Outputs: - - .. testoutput:: - - [[[[1. 4.] - [4. 4.]]]] - - """ - - return mgb.opr.remap( - inp, - map_xy, - border_type=border_mode, - scalar=scalar, - imode=interp_mode, - format="NCHW", - ) - - -@wrap_io_tensor -def eye( - n: int, - m: Optional[int] = None, - *, - dtype=None, - device: Optional[CompNode] = None, - comp_graph: Optional[CompGraph] = None -) -> Tensor: - """ - Returns a 2D tensor with ones on the diagonal and zeros elsewhere. - - :param n: The number of rows - :param m: The number of columns. Default: None - :param dtype: The data type. Default: None - :param device: Compute node of the matrix. Default: None - :param comp_graph: Compute graph of the matrix. Default: None - :return: The eye matrix - - Examples: - - .. testcode:: - - import numpy as np - import megengine.functional as F - - data_shape = (4, 6) - n, m = data_shape - out = F.eye(n, m, dtype=np.float32) - print(out.numpy()) - - Outputs: - - .. testoutput:: - - [[1. 0. 0. 0. 0. 0.] - [0. 1. 0. 0. 0. 0.] - [0. 0. 1. 0. 0. 0.] - [0. 0. 0. 1. 0. 0.]] - - """ - - device, comp_graph = _use_default_if_none(device, comp_graph) - if m is None: - m = n - return mgb.opr.eye((n, m), dtype=dtype, comp_node=device, comp_graph=comp_graph) - - -@wrap_io_tensor -def matrix_mul(inp1: Tensor, inp2: Tensor) -> Tensor: - """ - Performs a matrix multiplication of the matrices ``inp1`` and ``inp2`` - - :param inp1: The first matrix to be multiplied (a, b) - :param inp2: The second matrix to be multiplied (b, c) - :return: The output tensor (a, c) - - Examples: - - .. testcode:: - - import numpy as np - from megengine import tensor - import megengine.functional as F - - shape_1 = (2, 3) - shape_2 = (3, 4) - data1 = tensor(np.arange(0, 6, dtype=np.float32).reshape(2, 3)) - data2 = tensor(np.arange(0, 6, dtype=np.float32).reshape(3, 2)) - out = F.matrix_mul(data1, data2) - print(out.numpy()) - - Outputs: - - .. testoutput:: - - [[10. 13.] - [28. 40.]] - - """ - return mgb.opr.matrix_mul(inp1, inp2) - - -@wrap_io_tensor -def batched_matrix_mul(inp1: Tensor, inp2: Tensor) -> Tensor: - """ - Performs a batched multiplication of th batched matrices ``inp1`` and ``inp2`` - - :param inp1: The first batch matrix to be multiplied (n, a, b) - :param inp2: The second batch matrix to be multiplied (n, b, c) - :return: The output batch (n, a, c) - - Examples: - - .. testcode:: - - import numpy as np - from megengine import tensor - import megengine.functional as F - - batch_size = 3 - shape_1 = (batch_size, 2, 3) - shape_2 = (batch_size, 3, 4) - data1 = tensor( - np.arange(0, batch_size * 6, dtype=np.float32).reshape(batch_size, 2, 3)) - data2 = tensor( - np.arange(0, batch_size * 12, dtype=np.float32).reshape(batch_size, 3, 4)) - out = F.batched_matrix_mul(data1, data2) - print(out.numpy()) - - Outputs: - - .. testoutput:: - - [[[ 20. 23. 26. 29.] - [ 56. 68. 80. 92.]] - - [[ 344. 365. 386. 407.] - [ 488. 518. 548. 578.]] - - [[1100. 1139. 1178. 1217.] - [1352. 1400. 1448. 1496.]]] - - """ - return mgb.opr.batched_matrix_mul(inp1, inp2) - - -@wrap_io_tensor -def interpolate( - inp: Tensor, - size: Optional[Union[int, Tuple[int, int]]] = None, - scale_factor: Optional[Union[float, Tuple[float, float]]] = None, - mode: str = "BILINEAR", - align_corners: bool = None, -) -> Tensor: - r""" - Down/up samples the input tensor to either the given :attr:`size` or the given - :attr:`scale_factor` - - :param inp: input tensor - :param size: size of the output tensor. Default: ``None`` - :param scale_factor: scaling factor of the output tensor. Default: ``None`` - :param mode: interpolation methods, acceptable values are: - 'BILINEAR', 'LINEAR'. Default: ``BILINEAR`` - - Examples: - - .. testcode:: - - import numpy as np - from megengine import tensor - import megengine.functional as F - from megengine.test import assertTensorClose - - inp = tensor(np.arange(1, 5, dtype=np.float32).reshape(1, 1, 2, 2)) - out = F.interpolate(inp, [4, 4], align_corners=False) - print(out.numpy()) - - out2 = F.interpolate(inp, scale_factor=2.) - assertTensorClose(out.numpy(), out2.numpy()) - - Outputs: - - .. testoutput:: - - [[[[1. 1.25 1.75 2. ] - [1.5 1.75 2.25 2.5 ] - [2.5 2.75 3.25 3.5 ] - [3. 3.25 3.75 4. ]]]] - - """ - mode = mode.upper() - if mode not in ["BILINEAR", "LINEAR"]: - raise ValueError("interpolate only support linear or bilinear mode") - if mode not in ["BILINEAR", "LINEAR"]: - if align_corners is not None: - raise ValueError( - "align_corners option can only be set in the bilinear/linear interpolating mode" - ) - else: - if align_corners is None: - align_corners = False - - if mode == "LINEAR": - inp = mgb.opr.add_axis(inp, 3) - - if len(inp.imm_shape) != 4: - raise ValueError("shape of input tensor must correspond to the operartion mode") - - if size is None: - if scale_factor is None: - raise ValueError("scale_factor must not be None when size is None") - - if isinstance(scale_factor, (float, int)): - scale_factor = float(scale_factor) - if mode == "LINEAR": - scale_factor = (scale_factor, float(1)) - else: - scale_factor = (scale_factor, scale_factor) - else: - if mode == "LINEAR": - raise ValueError( - "under LINEAR mode, scale_factor can only be single value" - ) - - assert len(scale_factor) == 2, "shape of scale_factor must be equal to (2, )" - assert isinstance(scale_factor[0], float) and isinstance( - scale_factor[1], float - ), "scale_factor must be float type" - dsize = tuple( - mgb.opr.elemwise(inp.shape[i + 2] * scale_factor[i], mode="FLOOR") - for i in range(2) - ) - dsize = mgb.opr.concat([dsize[0], dsize[1]], axis=0) - else: - if scale_factor is not None: - raise ValueError("scale_factor must be None when size is provided") - - if isinstance(size, int): - size = (size, 1) - else: - if mode == "LINEAR": - raise ValueError("under LINEAR mode, size can only be single value") - dsize = size - - oh, ow = dsize[0], dsize[1] - ih, iw = inp.shape[2], inp.shape[3] - - if align_corners: - hscale = (ih - 1.0) / (oh - 1.0) - wscale = 1.0 * iw / ow - if mode != "LINEAR": - wscale = (iw - 1.0) / (ow - 1.0) - row0 = mgb.opr.concat([wscale, [0, 0]], axis=0).reshape(1, 3) - row1 = mgb.opr.concat([[0], hscale, [0]], axis=0).reshape(1, 3) - weight = mgb.opr.concat([row0, row1, [[0, 0, 1]]], axis=0).reshape(1, 3, 3) - weight = mgb.opr.broadcast(weight, (inp.shape[0], 3, 3)) - else: - hscale = 1.0 * ih / oh - wscale = 1.0 * iw / ow - row0 = mgb.opr.concat([wscale, [0], 0.5 * wscale - 0.5], axis=0).reshape(1, 3) - row1 = mgb.opr.concat([[0], hscale, 0.5 * hscale - 0.5], axis=0).reshape(1, 3) - weight = mgb.opr.concat([row0, row1, [[0, 0, 1]]], axis=0).reshape(1, 3, 3) - weight = mgb.opr.broadcast(weight, (inp.shape[0], 3, 3)) - - ret = mgb.opr.warp_perspective(inp, weight, dsize, imode="LINEAR", format="NCHW") - if mode == "LINEAR": - ret = mgb.opr.reshape(ret, ret.shape[0:3]) - return ret - - -@wrap_io_tensor -def dropout(inp: Tensor, drop_prob: float, rescale: bool = True) -> Tensor: - """ - Returns a new tensor where each of the elements are randomly set to zero - with probability P = ``drop_prob``. Optionally rescale the output tensor. - - :param inp: The input tensor - :param drop_prob: The probability to drop (set to zero) a single element - :param rescale: The default behavior of ``dropout`` during training is to rescale the output, - then it can be replaced by an :class:`~.Identity` during inference, default to True. - :return: The output tensor - - Examples: - - .. testcode:: - - import numpy as np - import megengine as mge - - import megengine.functional as F - from megengine import tensor - - data = tensor(np.ones(10, dtype=np.float32)) - out = F.dropout(data, 1./3.) - print(out.numpy()) - - Outputs: - - .. testoutput:: - :options: +SKIP - - [1.5 1.5 0. 1.5 1.5 1.5 1.5 1.5 1.5 1.5] - - """ - assert 0 <= drop_prob < 1 - rv = uniform(inp.shape) - mask = rv > drop_prob - inp *= mask.astype(inp.dtype) - if rescale: - inp *= 1 / (1 - drop_prob) - return inp - - -@wrap_io_tensor -def identity(inp: Tensor) -> Tensor: - """applies an identity transform to the input tensor. - - :param inp: The input tensor - """ - return mgb.opr.identity(inp) - - -@wrap_io_tensor -def embedding( - input: Tensor, - weight: Tensor, - padding_idx: Optional[int] = None, - max_norm: Optional[float] = None, - norm_type: Optional[float] = None, -): - """ - Applies lookup table for embedding. - - :param input: the tensor with indices. - :param weight: the learnable weights which embedding from. - :param padding_idx: should be set to None, not support now. - :param max_norm: should be set to None, not support now. - :param norm_type: should be set to None, not support now. - - - Refer to :class:`~.Embedding` for more information. - """ - if padding_idx is not None: - raise ValueError("Not support padding_idx Now!") - if max_norm is not None or norm_type is not None: - raise ValueError("Not support weight normlization Now!") - - return mgb.opr.advanced_indexing(weight)[input.reshape(-1), :].reshape( - input.shape, weight.shape[-1] - ) - - -@wrap_io_tensor -def roi_pooling( - input: Tensor, - rois: Tensor, - output_shape: Union[int, tuple, list], - mode: str = "max", - scale: float = 1.0, -) -> Tensor: - """ - Apply roi pooling on input feature - - :param input: tensor that represents the input feature, (N, C, H, W) images - :param rois: (K, 5) boxes. First column is the index into N. The other 4 columns are xyxy - :param output_shape: (height, width) of output rois feature - :param mode: "max" or "average", use max/average align just like max/average pooling. Default: ``"max"`` - :param scale: scale the input boxes by this number. Default: 1.0 - :return: (K, C, output_shape[0], output_shape[1]) feature of rois - """ - assert mode in ["max", "average"], "only max/average mode is supported" - if isinstance(output_shape, int): - output_shape = (output_shape, output_shape) - - return mgb.opr.roi_pooling( - input, rois, output_shape, mode=mode.upper(), scale=scale - ) - - -@wrap_io_tensor -def roi_align( - input: Tensor, - rois: Tensor, - output_shape: Union[int, tuple, list], - mode: str = "average", - spatial_scale: float = 1.0, - sample_points: Union[int, tuple, list] = 2, - aligned: bool = True, -) -> Tensor: - """ - Apply roi align on input feature - - :param input: tensor that represents the input feature, (N, C, H, W) images - :param rois: (N, 5) boxes. First column is the index into N. The other 4 columns are xyxy - :param output_shape: (height, width) shape of output rois feature. - :param mode: "max" or "average", use max/average align just like max/average pooling. Default: ``"average"`` - :param spatial_scale: scale the input boxes by this number. Default: 1.0 - :param sample_points: number of inputs samples to take for each output sample. - 0 to take samples densely. Default: 2 - :param aligned: wheather align the input feature, with `aligned=True`, - we first appropriately scale the ROI and then shift it by -0.5. Default: True - """ - assert mode in ["max", "average"], "only max/average mode is supported" - if isinstance(output_shape, int): - output_shape = (output_shape, output_shape) - pooled_height, pooled_width = output_shape - if isinstance(sample_points, int): - sample_points = (sample_points, sample_points) - sample_height, sample_width = sample_points - offset = 0.5 if aligned else 0.0 - - return mgb.opr.roi_align( - input, - rois, - mode=mode.upper(), - spatial_scale=spatial_scale, - offset=offset, - pooled_height=pooled_height, - pooled_width=pooled_width, - sample_height=sample_height, - sample_width=sample_width, - ) - - -@wrap_io_tensor -def assert_equal( - get: Tensor, expect: Tensor, max_err: float = 1e-4, verbose: bool = False -) -> Tensor: - r""" - Asserts that ``get`` equals to ``expect``, and returns value of ``expect``. - - :param get: tensor to be checked. - :param expect: tensor with expected values. - :param max_err: tolerance that two float values are asserted equal. Default: 1e-4 - :param verbose: whether to print details if two tensors are not equal. Default: False - - Examples: - - .. testcode:: - - import megengine.functional as F - from megengine import tensor - - get = tensor([1.0, 2.0]) - max_err = 0.1 - expect = get + max_err / 2.0 - val = F.assert_equal(expect, get, max_err=max_err) - print(val.numpy()) - - Outputs: - - .. testoutput:: - - [1.05 2.05] - - """ - - return mgb.opr.assert_equal(get, expect, maxerr=max_err, verbose=verbose) - - -@wrap_io_tensor -def indexing_one_hot( - src: Tensor, index: Tensor, axis: int = 1, keepdims=False -) -> Tensor: - r""" - One-hot indexing for some axis. - - :param src: input data tensor. - :param index: index tensor. - :param axis: the axis on src for which values in index index. Default: 1 - :param keepdims: whether not to remove the axis in result. Default: ``False`` - - Examples: - - .. testcode:: - - import megengine.functional as F - from megengine import tensor - - src = tensor([[1.0, 2.0]]) - index = tensor([0]) - val = F.indexing_one_hot(src, index) - print(val.numpy()) - - .. testoutput:: - - [1.] - - """ - - return mgb.opr.indexing_one_hot(src, axis, index, keepdims=keepdims) diff --git a/python_module/megengine/functional/quantized.py b/python_module/megengine/functional/quantized.py deleted file mode 100644 index 8cfb4a5b..00000000 --- a/python_module/megengine/functional/quantized.py +++ /dev/null @@ -1,80 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# pylint: disable=too-many-lines -from typing import Tuple, Union - -from .. import _internal as mgb -from ..core import Tensor, wrap_io_tensor -from ..utils.types import _pair, _pair_nonzero -from .debug_param import get_conv_execution_strategy - - -@wrap_io_tensor -def conv_bias_activation( - inp: Tensor, - weight: Tensor, - bias: Tensor, - dtype=None, - stride: Union[int, Tuple[int, int]] = 1, - padding: Union[int, Tuple[int, int]] = 0, - dilation: Union[int, Tuple[int, int]] = 1, - groups: int = 1, - nonlinear_mode="IDENTITY", - conv_mode="CROSS_CORRELATION", - compute_mode="DEFAULT", -) -> Tensor: - """ convolution bias with activation operation, only for inference. - - :param inp: The feature map of the convolution operation - :param weight: The convolution kernel - :param bias: The bias added to the result of convolution - :param stride: Stride of the 2D convolution operation. Default: 1 - :param padding: Size of the paddings added to the input on both sides of its - spatial dimensions. Only zero-padding is supported. Default: 0 - :param dilation: Dilation of the 2D convolution operation. Default: 1 - :param groups: number of groups to divide input and output channels into, - so as to perform a "grouped convolution". When ``groups`` is not 1, - ``in_channels`` and ``out_channels`` must be divisible by ``groups``, - and the shape of weight should be ``(groups, out_channel // groups, - in_channels // groups, height, width)``. - :type conv_mode: string or :class:`mgb.opr_param_defs.Convolution.Mode` - :param conv_mode: Supports 'CROSS_CORRELATION' or 'CONVOLUTION'. Default: - 'CROSS_CORRELATION'. - :param dtype: Support for np.dtype, Default: - np.int8. - :type compute_mode: string or - :class:`mgb.opr_param_defs.Convolution.ComputeMode` - :param compute_mode: When set to 'DEFAULT', no special requirements will be - placed on the precision of intermediate results. When set to 'FLOAT32', - Float32 would be used for accumulator and intermediate result, but only - effective when input and output are of Float16 dtype. - - """ - ph, pw = _pair(padding) - sh, sw = _pair_nonzero(stride) - dh, dw = _pair_nonzero(dilation) - sparse_type = "DENSE" if groups == 1 else "GROUP" - res = mgb.opr.conv_bias_activation( - inp, - weight, - bias, - compute_mode=compute_mode, - dtype=dtype, - strategy=get_conv_execution_strategy(), - nonlineMode=nonlinear_mode, - sparse=sparse_type, - format="NCHW", - pad_h=ph, - pad_w=pw, - stride_h=sh, - stride_w=sw, - dilate_h=dh, - dilate_w=dw, - mode=conv_mode, - ) - return res diff --git a/python_module/megengine/functional/sort.py b/python_module/megengine/functional/sort.py deleted file mode 100644 index 70597d52..00000000 --- a/python_module/megengine/functional/sort.py +++ /dev/null @@ -1,123 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import functools -from typing import Optional, Tuple, Union - -import megengine._internal as mgb - -from ..core.tensor import Tensor, wrap_io_tensor - -__all__ = ["argsort", "sort", "top_k"] - - -@wrap_io_tensor -def argsort(inp: Tensor, descending: bool = False) -> Tuple[Tensor, Tensor]: - r""" - Sort the target 2d matrix by row, return both the sorted tensor and indices. - - :param inp: The input tensor, if 2d, each row will be sorted - :param descending: Sort in descending order, where the largest comes first. Default: ``False`` - :return: Tuple of two tensors (sorted_tensor, indices_of_int32) - - Examples: - - .. testcode:: - - import numpy as np - from megengine import tensor - import megengine.functional as F - data = tensor(np.array([1,2], dtype=np.float32)) - sorted, indices = F.argsort(data) - print(sorted.numpy(), indices.numpy()) - - Outputs: - - .. testoutput:: - - [1. 2.] [0 1] - - """ - assert len(inp.imm_shape) <= 2, "Input should be 1d or 2d" - if descending: - order = mgb.opr_param_defs.Argsort.Order.DESCENDING - else: - order = mgb.opr_param_defs.Argsort.Order.ASCENDING - if len(inp.imm_shape) == 1: - inp = inp.reshape(1, -1) - tns, ind = mgb.opr.argsort(inp, order=order) - return tns[0], ind[0] - return mgb.opr.argsort(inp, order=order) - - -@functools.wraps(argsort) -def sort(*args, **kwargs): - return argsort(*args, **kwargs) - - -@wrap_io_tensor -def top_k( - inp: Tensor, - k: int, - descending: bool = False, - kth_only: bool = False, - no_sort: bool = False, -) -> Tuple[Tensor, Tensor]: - r""" - Selected the Top-K (by default) smallest elements of 2d matrix by row. - - :param inp: The input tensor, if 2d, each row will be sorted - :param k: The number of elements needed - :param descending: If true, return the largest elements instead. Default: ``False`` - :param kth_only: If true, only the k-th element will be returned. Default: ``False`` - :param no_sort: If true, the returned elements can be unordered. Default: ``False`` - :return: Tuple of two tensors (topk_tensor, indices_of_int32) - - Examples: - - .. testcode:: - - import numpy as np - from megengine import tensor - import megengine.functional as F - data = tensor(np.array([2, 4, 6, 8, 7, 5, 3, 1], dtype=np.float32)) - top, indices = F.top_k(data, 5) - print(top.numpy(), indices.numpy()) - - Outputs: - - .. testoutput:: - - [1. 2. 3. 4. 5.] [7 0 6 1 5] - - """ - assert len(inp.imm_shape) <= 2, "Input should be 1d or 2d" - if kth_only: - raise NotImplementedError( - "TODO: would enconter:" - "NotImplementedError: SymbolVar var could not be itered" - ) - if descending: - inp = -inp - Mode = mgb.opr_param_defs.TopK.Mode - if kth_only: - mode = Mode.KTH_ONLY - elif no_sort: - mode = Mode.VALUE_IDX_NOSORT - else: - mode = Mode.VALUE_IDX_SORTED - if len(inp.imm_shape) == 1: - inp = inp.reshape(1, -1) - tns, ind = mgb.opr.top_k(inp, k, mode=mode) - tns = tns[0] - ind = ind[0] - else: - tns, ind = mgb.opr.top_k(inp, k, mode=mode) - if descending: - tns = -tns - return tns, ind diff --git a/python_module/megengine/functional/tensor.py b/python_module/megengine/functional/tensor.py deleted file mode 100644 index b9a14ee2..00000000 --- a/python_module/megengine/functional/tensor.py +++ /dev/null @@ -1,667 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import functools -from typing import Iterable, List, Optional, Union - -import numpy as np - -import megengine._internal as mgb -from megengine._internal import CompGraph, CompNode - -from ..core import zeros -from ..core.graph import _use_default_if_none -from ..core.tensor import Tensor, wrap_io_tensor -from .elemwise import ceil -from .utils import _decide_comp_node_and_comp_graph - - -@wrap_io_tensor -def broadcast_to(inp: Tensor, shape: Union[int, Iterable[int]]) -> Tensor: - """ - Broadcast a tensor to ``shape`` - - :param inp: The input tensor - :param shape: The target shape - :return: The output tensor - - Examples: - - .. testcode:: - - import numpy as np - from megengine import tensor - import megengine.functional as F - - data = tensor(np.arange(0, 6, dtype=np.float32).reshape(2, 3)) - out = F.broadcast_to(data, (4, 2, 3)) - print(out.numpy()) - - Outputs: - - .. testoutput:: - - [[[0. 1. 2.] - [3. 4. 5.]] - - [[0. 1. 2.] - [3. 4. 5.]] - - [[0. 1. 2.] - [3. 4. 5.]] - - [[0. 1. 2.] - [3. 4. 5.]]] - - """ - - if isinstance(shape, int): - shape = (shape,) - return mgb.opr.broadcast(inp, shape) - - -def _get_idx(index, axis): - index_dims = len(index.imm_shape) - idx = [] - comp_node, comp_graph = _decide_comp_node_and_comp_graph(index) - for i in range(index_dims): - if i != axis: - shape = [1] * index_dims - shape[i] = index.axis_shape(i) - arange = mgb.opr.linspace( - 0, - index.axis_shape(i) - 1, - index.axis_shape(i), - comp_node=comp_node, - comp_graph=comp_graph, - ) - arange = ( - arange.reshape(*shape) - .broadcast(index.shape) - .reshape(-1) - .astype(np.int32) - ) - idx.append(arange) - else: - idx.append(index.reshape(-1)) - return tuple(idx) - - -@wrap_io_tensor -def gather(inp: Tensor, axis: int, index: Tensor) -> Tensor: - r""" - Gather data from :attr:`inp` on :attr:`axis` using :attr:`index`. - - For a 3-D tensor, the output is specified by:: - - out[i][j][k] = inp[index[i][j][k]][j][k] # if axis == 0 - out[i][j][k] = inp[i][index[i][j][k]][k] # if axis == 1 - out[i][j][k] = inp[i][j][index[i][j][k]] # if axis == 2 - - if :attr:`inp` is an n-dimensional tensor with size - :math:`(x_0,x_1,...,x_{i-1},x_i,x_{i+1},...,x_{n-1})` and axis=i, - then :attr:`index` must be an n-dimensional tensor with size - :math:`(x_0,x_1,...,x_{i-1},y,x_{i+1},...,x_{n-1})` where :math:`y\ge 1` and - output will have the same size as :attr:`index`. - - - :param inp: the source tensor - :param axis: the axis along which to index - :param index: the indices of elements to gather - - Examples: - - .. testcode:: - - import megengine.functional as F - from megengine.core import tensor - - inp = tensor([ - [1,2], [3,4], [5,6], - ]) - index = tensor([[0,2], [1,0]]) - oup = F.gather(inp, 0, index) - print(oup.numpy()) - - Outputs: - - .. testoutput:: - - [[1 6] - [3 2]] - - """ - - input_shape = inp.imm_shape - index_shape = index.imm_shape - input_dims = len(input_shape) - index_dims = len(index_shape) - if input_dims != index_dims: - raise ValueError( - "The index tensor must have same dimensions as input tensor, " - "But the input dims:{}, the index dims:{}".format(input_dims, index_dims) - ) - - if axis < 0 or axis >= input_dims: - raise ValueError( - "Index axis {} is output of bounds, should in range [0 {})".format( - axis, input_dims - ) - ) - - for i in range(input_dims): - if i != axis and input_shape[i] != index_shape[i]: - raise ValueError( - "The input {} and index {} must have the same size apart from axis {}".format( - input_shape, index_shape, axis - ) - ) - - idx = _get_idx(index, axis) - return mgb.opr.advanced_indexing(inp)[idx].reshape( - index.shape - ) # pylint: disable=no-member - - -@wrap_io_tensor -def concat( - inps: Iterable[Tensor], - axis: int = 0, - device: Optional[CompNode] = None, - comp_graph: Optional[CompGraph] = None, -) -> Tensor: - r""" - Concat some tensors - - :param inps: Input tensors to concat - :param axis: the dimension over which the tensors are concatenated. Default: 0 - :param device: The comp node output on. Default: None - :param comp_graph: The graph in which output is. Default: None - :return: The output tensor - - Examples: - - .. testcode:: - - import numpy as np - from megengine import tensor - import megengine.functional as F - - data1 = tensor(np.arange(0, 6, dtype=np.float32).reshape((2, 3))) - data2 = tensor(np.arange(6, 12, dtype=np.float32).reshape((2, 3))) - out = F.concat([data1, data2]) - print(out.numpy()) - - Outputs: - - .. testoutput:: - - [[ 0. 1. 2.] - [ 3. 4. 5.] - [ 6. 7. 8.] - [ 9. 10. 11.]] - - """ - - # Output buffer not supported - return mgb.opr.concat( - *list(inps), axis=axis, comp_node=device, comp_graph=comp_graph - ) - - -@wrap_io_tensor -def scatter(inp: Tensor, axis: int, index: Tensor, source: Tensor) -> Tensor: - r""" - Writes all values from the tensor :attr:`source` into :attr:`inp` at the indices specified in the :attr:`index` tensor. - - For each value in :attr:`source`, its output index is specified by its index - in :attr:`source` for ``axis != dimension`` and by the corresponding value in - :attr:`index` for ``axis = dimension``. - - For a 3-D tensor, :attr:`inp` is updated as:: - - inp[index[i][j][k]][j][k] = source[i][j][k] # if axis == 0 - inp[i][index[i][j][k]][k] = source[i][j][k] # if axis == 1 - inp[i][j][index[i][j][k]] = source[i][j][k] # if axis == 2 - - :attr:`inp`, :attr:`index` and :attr:`source` should have same number of dimensions. - - It is also required that ``source.shape(d) <= inp.shape(d)`` and ``index.shape(d) == source.shape(d)`` - for all dimensions ``d``. - - Moreover, the values of :attr:`index` must be between ``0`` and ``inp.shape(axis) - 1`` inclusive. - - .. note:: - Please notice that, due to performance issues, the result is uncertain on the GPU device - if scatter difference positions from source to the same destination position - regard to index tensor. - - Show the case using the following examples, the oup[0][2] is maybe - from source[0][2] which value is 0.2256 or source[1][2] which value is 0.5339 - if set the index[1][2] from 1 to 0. - - :param inp: the inp tensor which to be scattered - :param axis: the axis along which to index - :param index: the indices of elements to scatter - :param source: the source element(s) to scatter - - Examples: - - .. testcode:: - - import numpy as np - import megengine.functional as F - from megengine.core import tensor - - inp = tensor(np.zeros(shape=(3,5),dtype=np.float32)) - source = tensor([[0.9935,0.9465,0.2256,0.8926,0.4396],[0.7723,0.0718,0.5939,0.357,0.4576]]) - index = tensor([[0,2,0,2,1],[2,0,1,1,2]]) - oup = F.scatter(inp, 0, index,source) - print(oup.numpy()) - - Outputs: - - .. testoutput:: - - [[0.9935 0.0718 0.2256 0. 0. ] - [0. 0. 0.5939 0.357 0.4396] - [0.7723 0.9465 0. 0.8926 0.4576]] - - """ - - input_shape = inp.imm_shape - index_shape = index.imm_shape - source_shape = source.imm_shape - input_dims = len(input_shape) - index_dims = len(index_shape) - source_dims = len(source_shape) - - if input_dims != index_dims or input_dims != source_dims: - raise ValueError("The input, source and index tensor must have same dimensions") - - if axis < 0 or axis >= input_dims: - raise ValueError( - "Index axis {} is output of bounds, should in range [0 {})".format( - axis, input_dims - ) - ) - - for i in range(source_dims): - if source_shape[i] > input_shape[i]: - raise ValueError( - "The each shape size for source {} must be less than or equal to input {} ".format( - source_shape, input_shape - ) - ) - - for i in range(index_dims): - if index_shape[i] != source_shape[i]: - raise ValueError( - "The each shape size for index {} must be equal to source {} ".format( - index_shape, source_shape - ) - ) - - for i in range(index_dims): - if i != axis and index_shape[i] > input_shape[i]: - raise ValueError( - "The index {} must be less than or equal to input {} size apart from axis {}".format( - index_shape, input_shape, axis - ) - ) - - idx = _get_idx(index, axis) - return mgb.opr.set_advanced_indexing(inp, source.flatten())[idx] - - -@wrap_io_tensor -def where(mask: Tensor, x: Tensor, y: Tensor) -> Tensor: - r""" - Select elements either from Tensor x or Tensor y, according to mask. - - .. math:: - - \textrm{out}_i = x_i \textrm{ if } \textrm{mask}_i \textrm{ is True else } y_i - - :param mask: a mask used for choosing x or y - :param x: the first choice - :param y: the second choice - - Examples: - - .. testcode:: - - from megengine import tensor - import megengine.functional as F - mask = tensor(np.array([[1, 0], [0, 1]], dtype=np.int32)) - x = tensor(np.array([[1, np.inf], [np.nan, 4]], - dtype=np.float32)) - y = tensor(np.array([[5, 6], [7, 8]], dtype=np.float32)) - out = F.where(mask, x, y) - print(out.numpy()) - - Outputs: - - .. testoutput:: - - [[1. 6.] - [7. 4.]] - """ - v0, index0 = mgb.opr.cond_take( - x, mask, mode=mgb.opr_param_defs.CondTake.Mode.EQ, val=1 - ) - v1, index1 = mgb.opr.cond_take( - y, mask, mode=mgb.opr_param_defs.CondTake.Mode.EQ, val=0 - ) - out = x.flatten() - index = mgb.opr.concat(index0, index1, axis=0) - v = mgb.opr.concat(v0, v1, axis=0) - out = mgb.opr.set_advanced_indexing(out, v)[index] - out = out.reshape(x.shape) - return out - - -@wrap_io_tensor -def cond_take(mask: Tensor, x: Tensor, val=1) -> Tensor: - r""" - Take elements from data if specific condition is satisfied on mask. This operator has two outputs: the first is the elements taken, and the second is the indices corresponding to those elements; they are both 1-dimensional. High-dimension input would first be flattened. - - :param mask: condition param; must be the same shape with data - :param x: input tensor from which to take elements - :param val: value to be compared to by mode - - Examples: - - .. testcode:: - - from megengine import tensor - import megengine.functional as F - mask = tensor(np.array([[1, 0], [0, 1]], dtype=np.int32)) - x = tensor(np.array([[1, np.inf], [np.nan, 4]], - dtype=np.float32)) - v, index = F.cond_take(mask, x, 1) - print(v, index) - - Outputs: - - .. testoutput:: - - Tensor([1. 4.]) Tensor([0 3], dtype=int32) - - """ - - v, index = mgb.opr.cond_take( - x, mask, mode=mgb.opr_param_defs.CondTake.Mode.EQ, val=val - ) - return v, index - - -def shapeof(x: Tensor, axis=None): - r""" - The shape of input tensor. - """ - return x.shapeof(axis=axis) - - -@wrap_io_tensor -def dimshuffle(inp: Tensor, pattern: Iterable[int]) -> Tensor: - r""" - Swap shapes and strides according to given pattern - - :param inp: Input tensor - :param pattern: a list of integers including 0, 1, ... , ``ndim``-1, and any number of ``'x'`` char in dimensions where this tensor should be broadcasted. For examples: - - * (``'x'``) -> make a 0d (scalar) into a 1d vector - * (0, 1) -> identity for 2d vectors - * (1, 0) -> inverts the first and second dimensions - * (``'x'``, 0) -> make a row out of a 1d vector (N to 1xN) - * (0, ``'x'``) -> make a column out of a 1d vector (N to Nx1) - * (2, 0, 1) -> AxBxC to CxAxB - * (0, ``'x'``, 1) -> AxB to Ax1xB - * (1, ``'x'``, 0) -> AxB to Bx1xA - * (1,) -> This remove dimensions 0. It must be a broadcastable dimension (1xA to A) - - :return: The output tensor - - Examples: - - .. testcode:: - - import numpy as np - from megengine import tensor - import megengine.functional as F - x = tensor(np.array([[1, 1], [0, 0]], dtype=np.int32)) - out = F.dimshuffle(x, (1, 0)) - print(out.numpy()) - - Outputs: - - .. testoutput:: - - [[1 0] - [1 0]] - - """ - return mgb.opr.dimshuffle(inp, pattern) - - -@wrap_io_tensor -def reshape(inp: Tensor, target_shape: Iterable[int]) -> Tensor: - r""" - Reshape a tensor to given target shape; total number of logical elements must - remain unchanged - - :param inp: Input tensor - :param target_shape: target shape, the components would be concatenated to form the - target shape, and it can contain an element of -1 representing unspec_axis. - - Examples: - - .. testcode:: - - import numpy as np - from megengine import tensor - import megengine.functional as F - x = tensor(np.arange(12, dtype=np.int32)) - out = F.reshape(x, (3, 2, 2)) - print(out.numpy()) - - Outputs: - - .. testoutput:: - - [[[ 0 1] - [ 2 3]] - - [[ 4 5] - [ 6 7]] - - [[ 8 9] - [10 11]]] - - """ - return mgb.opr.reshape(inp, target_shape) - - -def transpose(inp: Tensor, pattern: Iterable[int]) -> Tensor: - r"""Equivalent to :func:`dimshuffle` - """ - return dimshuffle(inp, pattern) - - -@wrap_io_tensor -def add_axis(inp: Tensor, axis: int) -> Tensor: - r""" - Add dimension before given axis. - - :param inp: Input tensor - :param axis: Place of new axes - :return: The output tensor - - Examples: - - .. testcode:: - - import numpy as np - from megengine import tensor - import megengine.functional as F - x = tensor([1, 2]) - out = F.add_axis(x, 0) - print(out.shape) - - Outputs: - - .. testoutput:: - - (1, 2) - - """ - if not isinstance(axis, int): - raise ValueError("axis must be int, but got type:{}".format(type(axis))) - return mgb.opr.add_axis(inp, axis) - - -@wrap_io_tensor -def remove_axis(inp: Tensor, axis: int) -> Tensor: - r""" - Remove dimension of shape 1. - - :param inp: Input tensor - :param axis: Place of axis to be removed - :return: The output tensor - - Examples: - - .. testcode:: - - import numpy as np - from megengine import tensor - import megengine.functional as F - x = tensor(np.array([1, 2], dtype=np.int32).reshape(1, 1, 2, 1)) - out = F.remove_axis(x, 3) - print(out.shape) - - Outputs: - - .. testoutput:: - - (1, 1, 2) - - """ - if not isinstance(axis, int): - raise ValueError("axis must be int, but got type:{}".format(type(axis))) - return mgb.opr.remove_axis(inp, axis) - - -def linspace( - start: Union[int, float, Tensor], - stop: Union[int, float, Tensor], - num: Union[int, Tensor], - dtype=np.float32, - device: Optional[CompNode] = None, - comp_graph: Optional[CompGraph] = None, -) -> Tensor: - r""" - Return equally spaced numbers over a specified interval - - :param start: Starting value of the squence, shoule be scalar - :param stop: The last value of the squence, shoule be scalar - :param num: number of values to generate - :param dtype: result data type - :return: The generated tensor - - Examples: - - .. testcode:: - - import numpy as np - import megengine.functional as F - - a = F.linspace(3,10,5) - print(a.numpy()) - - .. testoutput:: - - [ 3. 4.75 6.5 8.25 10. ] - - """ - if dtype is not np.float32: - raise ValueError("linspace is only implemented for float32") - - device, comp_graph = _use_default_if_none(device, comp_graph) - ret = Tensor( - mgb.opr.linspace(start, stop, num, comp_node=device, comp_graph=comp_graph) - ) - return ret.astype(dtype) - - -def arange( - start: Union[int, float, Tensor], - end: Union[int, float, Tensor], - step: Union[int, float, Tensor] = 1, - dtype=np.float32, - device: Optional[CompNode] = None, - comp_graph: Optional[CompGraph] = None, -) -> Tensor: - r""" - Returns a Tensor with values from `start` to `end` with adjacent interval `step` - - :param start: starting value of the squence, shoule be scalar - :param end: ending value of the squence, shoule be scalar - :param step: the gap between each pair of adjacent values. Default 1 - :param dtype: result data type - :return: The generated tensor - - Examples: - - .. testcode:: - - import numpy as np - import megengine.functional as F - - a = F.arange(1, 5, 1) - print(a.numpy()) - - .. testoutput:: - - [1. 2. 3. 4.] - - """ - if dtype is not np.float32: - raise ValueError("arange is only implemented for float32") - num = ceil((end - start) / step) - stop = start + step * (num - 1) - ret = linspace(start, stop, num, device=device, comp_graph=comp_graph) - return ret - - -def zeros_like(inp: Tensor) -> Tensor: - r""" - Returns a zero tensor with the same shape as input tensor - - :param inp: input tensor - - Examples: - - .. testcode:: - - import numpy as np - from megengine import tensor - import megengine.functional as F - - inp = tensor(np.arange(1, 7, dtype=np.int32).reshape(2,3)) - out = F.zeros_like(inp) - print(out.numpy()) - - .. testoutput:: - - [[0 0 0] - [0 0 0]] - - """ - return zeros(inp.shapeof()).astype(inp.dtype) diff --git a/python_module/megengine/functional/utils.py b/python_module/megengine/functional/utils.py deleted file mode 100644 index 0ad969ca..00000000 --- a/python_module/megengine/functional/utils.py +++ /dev/null @@ -1,81 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from typing import Iterable, Union - -import megengine._internal as mgb - -from ..core.graph import _use_default_if_none -from ..core.tensor import Tensor, wrap_io_tensor -from .elemwise import equal -from .sort import top_k - - -def _decide_comp_node_and_comp_graph(*args: mgb.SymbolVar): - for i in args: - if isinstance(i, mgb.SymbolVar): - return i.comp_node, i.owner_graph - return _use_default_if_none(None, None) - - -def accuracy( - logits: Tensor, target: Tensor, topk: Union[int, Iterable[int]] = 1 -) -> Union[Tensor, Iterable[Tensor]]: - r""" - Calculate the classification accuracy given predicted logits and ground-truth labels. - - :param logits: Model predictions of shape [batch_size, num_classes], - representing the probability (likelyhood) of each class. - :param target: Ground-truth labels, 1d tensor of int32 - :param topk: Specifies the topk values, could be an int or tuple of ints. Default: 1 - :return: Tensor(s) of classification accuracy between 0.0 and 1.0 - - Examples: - - .. testcode:: - - import numpy as np - from megengine import tensor - import megengine.functional as F - - logits = tensor(np.arange(80, dtype=np.int32).reshape(8,10)) - target = tensor(np.arange(8, dtype=np.int32)) - top1, top5 = F.accuracy(logits, target, (1, 5)) - print(top1.numpy(), top5.numpy()) - - Outputs: - - .. testoutput:: - - [0.] [0.375] - """ - if isinstance(topk, int): - topk = (topk,) - _, pred = top_k(logits, k=max(topk), descending=True) - accs = [] - for k in topk: - correct = equal( - pred[:, :k], target.dimshuffle(0, "x").broadcast(target.shapeof(0), k) - ) - accs.append(correct.sum() / target.shapeof(0)) - if len(topk) == 1: # type: ignore[arg-type] - accs = accs[0] - return accs - - -@wrap_io_tensor -def zero_grad(inp: Tensor) -> Tensor: - r""" - Returns a tensor which is treated as constant during backward gradient calcuation, - i.e. its gradient is zero. - - :param inp: Input tensor. - - See implementation of :func:`~.softmax` for example. - """ - return mgb.opr.zero_grad(inp) diff --git a/python_module/megengine/hub/__init__.py b/python_module/megengine/hub/__init__.py deleted file mode 100644 index f07c3979..00000000 --- a/python_module/megengine/hub/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from .hub import ( - help, - import_module, - list, - load, - load_serialized_obj_from_url, - pretrained, -) diff --git a/python_module/megengine/hub/const.py b/python_module/megengine/hub/const.py deleted file mode 100644 index 5f53420b..00000000 --- a/python_module/megengine/hub/const.py +++ /dev/null @@ -1,17 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -DEFAULT_BRANCH_NAME = "master" -HUBCONF = "hubconf.py" -HUBDEPENDENCY = "dependencies" -DEFAULT_GIT_HOST = "github.com" -ENV_MGE_HOME = "MGE_HOME" -ENV_XDG_CACHE_HOME = "XDG_CACHE_HOME" -DEFAULT_CACHE_DIR = "~/.cache" -DEFAULT_PROTOCOL = "HTTPS" -HTTP_READ_TIMEOUT = 120 diff --git a/python_module/megengine/hub/exceptions.py b/python_module/megengine/hub/exceptions.py deleted file mode 100644 index aab0a134..00000000 --- a/python_module/megengine/hub/exceptions.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -class FetcherError(Exception): - """Base class for fetch related error.""" - - -class InvalidRepo(FetcherError): - """The repo provided was somehow invalid.""" - - -class InvalidGitHost(FetcherError): - """The git host provided was somehow invalid.""" - - -class GitPullError(FetcherError): - """A git pull error occurred""" - - -class GitCheckoutError(FetcherError): - """A git checkout error occurred""" - - -class InvalidProtocol(FetcherError): - """The protocol provided was somehow invalid""" diff --git a/python_module/megengine/hub/fetcher.py b/python_module/megengine/hub/fetcher.py deleted file mode 100644 index dfbfb0e7..00000000 --- a/python_module/megengine/hub/fetcher.py +++ /dev/null @@ -1,300 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import hashlib -import os -import re -import shutil -import subprocess -from tempfile import NamedTemporaryFile -from typing import Tuple -from zipfile import ZipFile - -import requests -from tqdm import tqdm - -from megengine.utils.http_download import ( - CHUNK_SIZE, - HTTP_CONNECTION_TIMEOUT, - HTTPDownloadError, -) - -from ..distributed.util import is_distributed, synchronized -from ..logger import get_logger -from .const import DEFAULT_BRANCH_NAME, HTTP_READ_TIMEOUT -from .exceptions import GitCheckoutError, GitPullError, InvalidGitHost, InvalidRepo -from .tools import cd - -logger = get_logger(__name__) - -HTTP_TIMEOUT = (HTTP_CONNECTION_TIMEOUT, HTTP_READ_TIMEOUT) - -pattern = re.compile( - r"^(?:[a-z0-9]" # First character of the domain - r"(?:[a-z0-9-_]{0,61}[a-z0-9])?\.)" # Sub domain + hostname - r"+[a-z0-9][a-z0-9-_]{0,61}" # First 61 characters of the gTLD - r"[a-z]$" # Last character of the gTLD -) - - -class RepoFetcherBase: - @classmethod - def fetch( - cls, - git_host: str, - repo_info: str, - use_cache: bool = False, - commit: str = None, - silent: bool = True, - ) -> str: - raise NotImplementedError() - - @classmethod - def _parse_repo_info(cls, repo_info: str) -> Tuple[str, str, str]: - try: - branch_info = DEFAULT_BRANCH_NAME - if ":" in repo_info: - prefix_info, branch_info = repo_info.split(":") - else: - prefix_info = repo_info - repo_owner, repo_name = prefix_info.split("/") - return repo_owner, repo_name, branch_info - except ValueError: - raise InvalidRepo("repo_info: '{}' is invalid.".format(repo_info)) - - @classmethod - def _check_git_host(cls, git_host): - return cls._is_valid_domain(git_host) or cls._is_valid_host(git_host) - - @classmethod - def _is_valid_domain(cls, s): - try: - return pattern.match(s.encode("idna").decode("ascii")) - except UnicodeError: - return False - - @classmethod - def _is_valid_host(cls, s): - nums = s.split(".") - if len(nums) != 4 or any(not _.isdigit() for _ in nums): - return False - return all(0 <= int(_) < 256 for _ in nums) - - @classmethod - def _gen_repo_dir(cls, repo_dir: str) -> str: - return hashlib.sha1(repo_dir.encode()).hexdigest()[:16] - - -class GitSSHFetcher(RepoFetcherBase): - @classmethod - @synchronized - def fetch( - cls, - git_host: str, - repo_info: str, - use_cache: bool = False, - commit: str = None, - silent: bool = True, - ) -> str: - """ - Fetches git repo by SSH protocol - - :param git_host: - host address of git repo. - example: github.com - :param repo_info: - a string with format ``"repo_owner/repo_name[:tag_name/:branch_name]"`` with an optional - tag/branch. The default branch is ``master`` if not specified. - example: ``"brain_sdk/MegBrain[:hub]"`` - :param use_cache: - whether to use locally fetched code or completely re-fetch - :param commit: - commit id on github or gitlab - :param silent: - whether to accept the stdout and stderr of the subprocess with PIPE, instead of - displaying on the screen - :return: - directory where the repo code is stored - """ - if not cls._check_git_host(git_host): - raise InvalidGitHost("git_host: '{}' is malformed.".format(git_host)) - - repo_owner, repo_name, branch_info = cls._parse_repo_info(repo_info) - normalized_branch_info = branch_info.replace("/", "_") - repo_dir_raw = "{}_{}_{}".format( - repo_owner, repo_name, normalized_branch_info - ) + ("_{}".format(commit) if commit else "") - repo_dir = cls._gen_repo_dir(repo_dir_raw) - git_url = "git@{}:{}/{}.git".format(git_host, repo_owner, repo_name) - - if use_cache and os.path.exists(repo_dir): # use cache - logger.debug("Cache Found in %s", repo_dir) - return repo_dir - - if is_distributed(): - logger.warning( - "When using `hub.load` or `hub.list` to fetch git repositories\n" - " in DISTRIBUTED mode for the first time, processes are synchronized to\n" - " ensure that target repository is ready to use for each process.\n" - " Users are expected to see this warning no more than ONCE, otherwise\n" - " (very little chance) you may need to remove corrupt cache\n" - " `%s` and fetch again.", - repo_dir, - ) - - shutil.rmtree(repo_dir, ignore_errors=True) # ignore and clear cache - - logger.debug( - "Git Clone from Repo:%s Branch: %s to %s", - git_url, - normalized_branch_info, - repo_dir, - ) - - kwargs = ( - {"stderr": subprocess.PIPE, "stdout": subprocess.PIPE} if silent else {} - ) - if commit is None: - # shallow clone repo by branch/tag - p = subprocess.Popen( - [ - "git", - "clone", - "-b", - normalized_branch_info, - git_url, - repo_dir, - "--depth=1", - ], - **kwargs, - ) - cls._check_clone_pipe(p) - else: - # clone repo and checkout to commit_id - p = subprocess.Popen(["git", "clone", git_url, repo_dir], **kwargs) - cls._check_clone_pipe(p) - - with cd(repo_dir): - logger.debug("git checkout to %s", commit) - p = subprocess.Popen(["git", "checkout", commit], **kwargs) - _, err = p.communicate() - if p.returncode: - shutil.rmtree(repo_dir, ignore_errors=True) - raise GitCheckoutError( - "Git checkout error, please check the commit id.\n" - + err.decode() - ) - with cd(repo_dir): - shutil.rmtree(".git") - - return repo_dir - - @classmethod - def _check_clone_pipe(cls, p): - _, err = p.communicate() - if p.returncode: - raise GitPullError( - "Repo pull error, please check repo info.\n" + err.decode() - ) - - -class GitHTTPSFetcher(RepoFetcherBase): - @classmethod - @synchronized - def fetch( - cls, - git_host: str, - repo_info: str, - use_cache: bool = False, - commit: str = None, - silent: bool = True, - ) -> str: - """ - Fetches git repo by HTTPS protocol - - :param git_host: - host address of git repo - example: github.com - :param repo_info: - a string with format ``"repo_owner/repo_name[:tag_name/:branch_name]"`` with an optional - tag/branch. The default branch is ``master`` if not specified. - example: ``"brain_sdk/MegBrain[:hub]"`` - :param use_cache: - whether to use locally cached code or completely re-fetch - :param commit: - commit id on github or gitlab - :param silent: - whether to accept the stdout and stderr of the subprocess with PIPE, instead of - displaying on the screen - :return: - directory where the repo code is stored - """ - if not cls._check_git_host(git_host): - raise InvalidGitHost("git_host: '{}' is malformed.".format(git_host)) - - repo_owner, repo_name, branch_info = cls._parse_repo_info(repo_info) - normalized_branch_info = branch_info.replace("/", "_") - repo_dir_raw = "{}_{}_{}".format( - repo_owner, repo_name, normalized_branch_info - ) + ("_{}".format(commit) if commit else "") - repo_dir = cls._gen_repo_dir(repo_dir_raw) - archive_url = cls._git_archive_link( - git_host, repo_owner, repo_name, branch_info, commit - ) - - if use_cache and os.path.exists(repo_dir): # use cache - logger.debug("Cache Found in %s", repo_dir) - return repo_dir - - if is_distributed(): - logger.warning( - "When using `hub.load` or `hub.list` to fetch git repositories " - "in DISTRIBUTED mode for the first time, processes are synchronized to " - "ensure that target repository is ready to use for each process.\n" - "Users are expected to see this warning no more than ONCE, otherwise" - "(very little chance) you may need to remove corrupt hub cache %s and fetch again." - ) - - shutil.rmtree(repo_dir, ignore_errors=True) # ignore and clear cache - - logger.debug("Downloading from %s to %s", archive_url, repo_dir) - cls._download_zip_and_extract(archive_url, repo_dir) - - return repo_dir - - @classmethod - def _download_zip_and_extract(cls, url, target_dir): - resp = requests.get(url, timeout=HTTP_TIMEOUT, stream=True) - if resp.status_code != 200: - raise HTTPDownloadError( - "An error occured when downloading from {}".format(url) - ) - - total_size = int(resp.headers.get("Content-Length", 0)) - _bar = tqdm(total=total_size, unit="iB", unit_scale=True) - - with NamedTemporaryFile("w+b") as f: - for chunk in resp.iter_content(CHUNK_SIZE): - if not chunk: - break - _bar.update(len(chunk)) - f.write(chunk) - _bar.close() - f.seek(0) - with ZipFile(f) as temp_zip_f: - zip_dir_name = temp_zip_f.namelist()[0].split("/")[0] - temp_zip_f.extractall(".") - shutil.move(zip_dir_name, target_dir) - - @classmethod - def _git_archive_link(cls, git_host, repo_owner, repo_name, branch_info, commit): - archive_link = "https://{}/{}/{}/archive/{}.zip".format( - git_host, repo_owner, repo_name, commit or branch_info - ) - - return archive_link diff --git a/python_module/megengine/hub/hub.py b/python_module/megengine/hub/hub.py deleted file mode 100644 index 5342cd8e..00000000 --- a/python_module/megengine/hub/hub.py +++ /dev/null @@ -1,333 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import functools -import hashlib -import os -import sys -import types -from typing import Any, List -from urllib.parse import urlparse - -from megengine.utils.http_download import download_from_url - -from ..core.serialization import load as _mge_load_serialized -from ..distributed import is_distributed -from ..logger import get_logger -from .const import ( - DEFAULT_CACHE_DIR, - DEFAULT_GIT_HOST, - DEFAULT_PROTOCOL, - ENV_MGE_HOME, - ENV_XDG_CACHE_HOME, - HTTP_READ_TIMEOUT, - HUBCONF, - HUBDEPENDENCY, -) -from .exceptions import InvalidProtocol -from .fetcher import GitHTTPSFetcher, GitSSHFetcher -from .tools import cd, check_module_exists, load_module - -logger = get_logger(__name__) - - -PROTOCOLS = { - "HTTPS": GitHTTPSFetcher, - "SSH": GitSSHFetcher, -} - - -def _get_megengine_home() -> str: - """MGE_HOME setting complies with the XDG Base Directory Specification - """ - megengine_home = os.path.expanduser( - os.getenv( - ENV_MGE_HOME, - os.path.join(os.getenv(ENV_XDG_CACHE_HOME, DEFAULT_CACHE_DIR), "megengine"), - ) - ) - return megengine_home - - -def _get_repo( - git_host: str, - repo_info: str, - use_cache: bool = False, - commit: str = None, - protocol: str = DEFAULT_PROTOCOL, -) -> str: - if protocol not in PROTOCOLS: - raise InvalidProtocol( - "Invalid protocol, the value should be one of {}.".format( - ", ".join(PROTOCOLS.keys()) - ) - ) - cache_dir = os.path.expanduser(os.path.join(_get_megengine_home(), "hub")) - with cd(cache_dir): - fetcher = PROTOCOLS[protocol] - repo_dir = fetcher.fetch(git_host, repo_info, use_cache, commit) - return os.path.join(cache_dir, repo_dir) - - -def _check_dependencies(module: types.ModuleType) -> None: - if not hasattr(module, HUBDEPENDENCY): - return - - dependencies = getattr(module, HUBDEPENDENCY) - if not dependencies: - return - - missing_deps = [m for m in dependencies if not check_module_exists(m)] - if len(missing_deps): - raise RuntimeError("Missing dependencies: {}".format(", ".join(missing_deps))) - - -def _init_hub( - repo_info: str, - git_host: str, - use_cache: bool = True, - commit: str = None, - protocol: str = DEFAULT_PROTOCOL, -): - """Imports hubmodule like python import - - :param repo_info: - a string with format ``"repo_owner/repo_name[:tag_name/:branch_name]"`` with an optional - tag/branch. The default branch is ``master`` if not specified. - Example: ``"brain_sdk/MegBrain[:hub]"`` - :param git_host: - host address of git repo - Example: github.com - :param use_cache: - whether to use locally cached code or completely re-fetch - :param commit: - commit id on github or gitlab - :param protocol: - which protocol to use to get the repo, and HTTPS protocol only supports public repo on github. - The value should be one of HTTPS, SSH. - :return: - hubconf.py as a python module - """ - cache_dir = os.path.expanduser(os.path.join(_get_megengine_home(), "hub")) - os.makedirs(cache_dir, exist_ok=True) - absolute_repo_dir = _get_repo( - git_host, repo_info, use_cache=use_cache, commit=commit, protocol=protocol - ) - sys.path.insert(0, absolute_repo_dir) - hubmodule = load_module(HUBCONF, os.path.join(absolute_repo_dir, HUBCONF)) - sys.path.remove(absolute_repo_dir) - - return hubmodule - - -@functools.wraps(_init_hub) -def import_module(*args, **kwargs): - return _init_hub(*args, **kwargs) - - -def list( - repo_info: str, - git_host: str = DEFAULT_GIT_HOST, - use_cache: bool = True, - commit: str = None, - protocol: str = DEFAULT_PROTOCOL, -) -> List[str]: - """Lists all entrypoints available in repo hubconf - - :param repo_info: - a string with format ``"repo_owner/repo_name[:tag_name/:branch_name]"`` with an optional - tag/branch. The default branch is ``master`` if not specified. - Example: ``"brain_sdk/MegBrain[:hub]"`` - :param git_host: - host address of git repo - Example: github.com - :param use_cache: - whether to use locally cached code or completely re-fetch - :param commit: - commit id on github or gitlab - :param protocol: - which protocol to use to get the repo, and HTTPS protocol only supports public repo on github. - The value should be one of HTTPS, SSH. - :return: - all entrypoint names of the model - """ - hubmodule = _init_hub(repo_info, git_host, use_cache, commit, protocol) - - return [ - _ - for _ in dir(hubmodule) - if not _.startswith("__") and callable(getattr(hubmodule, _)) - ] - - -def load( - repo_info: str, - entry: str, - *args, - git_host: str = DEFAULT_GIT_HOST, - use_cache: bool = True, - commit: str = None, - protocol: str = DEFAULT_PROTOCOL, - **kwargs -) -> Any: - """Loads model from github or gitlab repo, with pretrained weights. - - :param repo_info: - a string with format ``"repo_owner/repo_name[:tag_name/:branch_name]"`` with an optional - tag/branch. The default branch is ``master`` if not specified. - Example: ``"brain_sdk/MegBrain[:hub]"`` - :param entry: - an entrypoint defined in hubconf - :param git_host: - host address of git repo - Example: github.com - :param use_cache: - whether to use locally cached code or completely re-fetch - :param commit: - commit id on github or gitlab - :param protocol: - which protocol to use to get the repo, and HTTPS protocol only supports public repo on github. - The value should be one of HTTPS, SSH. - :return: - a single model with corresponding pretrained weights. - """ - hubmodule = _init_hub(repo_info, git_host, use_cache, commit, protocol) - - if not hasattr(hubmodule, entry) or not callable(getattr(hubmodule, entry)): - raise RuntimeError("Cannot find callable {} in hubconf.py".format(entry)) - - _check_dependencies(hubmodule) - - module = getattr(hubmodule, entry)(*args, **kwargs) - return module - - -def help( - repo_info: str, - entry: str, - git_host: str = DEFAULT_GIT_HOST, - use_cache: bool = True, - commit: str = None, - protocol: str = DEFAULT_PROTOCOL, -) -> str: - """This function returns docstring of entrypoint ``entry`` by following steps: - - 1. Pull the repo code specified by git and repo_info - 2. Load the entry defined in repo's hubconf.py - 3. Return docstring of function entry - - :param repo_info: - a string with format ``"repo_owner/repo_name[:tag_name/:branch_name]"`` with an optional - tag/branch. The default branch is ``master`` if not specified. - Example: ``"brain_sdk/MegBrain[:hub]"`` - :param entry: - an entrypoint defined in hubconf.py - :param git_host: - host address of git repo - Example: github.com - :param use_cache: - whether to use locally cached code or completely re-fetch - :param commit: - commit id on github or gitlab - :param protocol: - which protocol to use to get the repo, and HTTPS protocol only supports public repo on github. - The value should be one of HTTPS, SSH. - :return: - docstring of entrypoint ``entry`` - """ - hubmodule = _init_hub(repo_info, git_host, use_cache, commit, protocol) - - if not hasattr(hubmodule, entry) or not callable(getattr(hubmodule, entry)): - raise RuntimeError("Cannot find callable {} in hubconf.py".format(entry)) - - doc = getattr(hubmodule, entry).__doc__ - return doc - - -def load_serialized_obj_from_url(url: str, model_dir=None) -> Any: - """Loads MegEngine serialized object from the given URL. - - If the object is already present in ``model_dir``, it's deserialized and - returned. If no ``model_dir`` is specified, it will be ``MGE_HOME/serialized``. - - :param url: url to serialized object - :param model_dir: dir to cache target serialized file - - :return: loaded object - """ - if model_dir is None: - model_dir = os.path.join(_get_megengine_home(), "serialized") - os.makedirs(model_dir, exist_ok=True) - - parts = urlparse(url) - filename = os.path.basename(parts.path) - - # use hash as prefix to avoid filename conflict from different urls - sha256 = hashlib.sha256() - sha256.update(url.encode()) - digest = sha256.hexdigest()[:6] - filename = digest + "_" + filename - - cached_file = os.path.join(model_dir, filename) - logger.info( - "load_serialized_obj_from_url: download to or using cached %s", cached_file - ) - if not os.path.exists(cached_file): - if is_distributed(): - logger.warning( - "Downloading serialized object in DISTRIBUTED mode\n" - " File may be downloaded multiple times. We recommend\n" - " users to download in single process first." - ) - download_from_url(url, cached_file, HTTP_READ_TIMEOUT) - - state_dict = _mge_load_serialized(cached_file) - return state_dict - - -class pretrained: - r""" - Decorator which helps to download pretrained weights from the given url. - - For example, we can decorate a resnet18 function as follows - - .. code-block:: - - @hub.pretrained("https://url/to/pretrained_resnet18.pkl") - def resnet18(**kwargs): - return ResNet(BasicBlock, [2, 2, 2, 2], **kwargs) - - When decorated function is called with ``pretrained=True``, MegEngine will automatically - download and fill the returned model with pretrained weights. - """ - - def __init__(self, url): - self.url = url - - def __call__(self, func): - @functools.wraps(func) - def pretrained_model_func( - pretrained=False, **kwargs - ): # pylint: disable=redefined-outer-name - model = func(**kwargs) - if pretrained: - weights = load_serialized_obj_from_url(self.url) - model.load_state_dict(weights) - return model - - return pretrained_model_func - - -__all__ = [ - "list", - "load", - "help", - "load_serialized_obj_from_url", - "pretrained", - "import_module", -] diff --git a/python_module/megengine/hub/tools.py b/python_module/megengine/hub/tools.py deleted file mode 100644 index 0bf9c98c..00000000 --- a/python_module/megengine/hub/tools.py +++ /dev/null @@ -1,48 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import importlib.util -import os -import types -from contextlib import contextmanager -from typing import Iterator - - -def load_module(name: str, path: str) -> types.ModuleType: - """ - Loads module specified by name and path - - :param name: module name - :param path: module path - """ - spec = importlib.util.spec_from_file_location(name, path) - module = importlib.util.module_from_spec(spec) - spec.loader.exec_module(module) - return module - - -def check_module_exists(module: str) -> bool: - """Checks whether python module exists or not - - :param module: name of module - """ - return importlib.util.find_spec(module) is not None - - -@contextmanager -def cd(target: str) -> Iterator[None]: - """Changes current directory to target - - :param target: target directory - """ - prev = os.getcwd() - os.chdir(os.path.expanduser(target)) - try: - yield - finally: - os.chdir(prev) diff --git a/python_module/megengine/jit/__init__.py b/python_module/megengine/jit/__init__.py deleted file mode 100644 index d610388b..00000000 --- a/python_module/megengine/jit/__init__.py +++ /dev/null @@ -1,570 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import contextlib -import functools -import itertools -import os -from typing import Callable, Tuple, Union - -import numpy as np - -import megengine._internal as mgb -from megengine._internal.plugin import CompGraphProfiler - -from ..core import Tensor, graph, tensor -from .sublinear_memory_config import SublinearMemoryConfig - - -def sideeffect(f): - # during eager tracing, wrapped function is called with proxy inputs - # during static tracing, wrapped function will not be called at all - @functools.wraps(f) - def wrapper(*args, **kwargs): # pylint: disable=inconsistent-return-statements - if not trace._active_instance: - return f(*args, **kwargs) - - tensors = {} - for i, x in itertools.chain(enumerate(args), kwargs.items()): - if isinstance(x, Tensor): - tensors[i] = x - if tensors: - _keys, tensors = zip(*tensors.items()) - else: - _keys, tensors = (), () - - def callback(*tensors, f=f, keys=_keys, args=args, kwargs=kwargs): - replace = dict(zip(keys, tensors)) - args = tuple(replace.get(i, x) for i, x in enumerate(args)) - kwargs = {i: replace.get(i, x) for i, x in kwargs.items()} - if f(*args, **kwargs) is not None: - raise TypeError("a sideeffect function should return None") - # TODO: clear memory - - trace._active_instance._register_callback(callback, tensors) - - return wrapper - - -def mark_impure(x): - if not trace._active_instance: - return x - return trace._active_instance._mark_impure(x) - - -def barrier(x): - if not trace._active_instance: - return x - return trace._active_instance._insert_barrier(x) - - -def _dummy(): - return mgb.make_immutable(*graph._use_default_if_none(None, None), 0) - - -class unset: - pass - - -class trace: - """ - Wrap a callable and provide: - - * tracing via :meth:`.trace` and :meth:`.dump` - * accelerated evalutaion via :meth:`.__call__` - - :param func: Positional only argument. - :param symbolic: Whether to use symbolic tensor. Default: False - :param opt_level: Optimization level for compiling trace. - :param log_level: Log level. - :param sublinear_memory_config: Configuration for sublinear memory optimization. - If not None, it enables sublinear memory optimization with given setting. - :param allreduce_pack_max_size: Maximum size of an allreduce pack in MB. - If not None, multiple gradients will be packed and synchronized together - :param profiling: Whether to profile compiled trace. Default: False - """ - - _active_instance = None - enabled = not os.getenv("MGE_DISABLE_TRACE") - - _UNSTARTED = "unstarted" - _STARTED = "started" - _FINISHED = "finished" - - def __new__(cls, *args, **kwargs): - if not args: - return functools.partial(cls, **kwargs) - return super().__new__(cls) - - def __init__( - self, - func: Callable[..., Union[None, Tensor, Tuple[Tensor]]], - *, - symbolic: bool = False, - opt_level: int = None, - log_level: int = None, - sublinear_memory_config: SublinearMemoryConfig = None, - allreduce_pack_max_size: int = None, - profiling: bool = False - ): - self.__wrapped__ = func - self._symbolic = symbolic - self._graph_opt_level = opt_level - self._log_level = log_level - self._sublinear_memory_config = sublinear_memory_config - self._allreduce_pack_max_size = allreduce_pack_max_size - self._status = self._UNSTARTED - self._args = None - self._kwargs = None - self._outputs = unset - self._sym_outputs = unset - self._outspec = None - self._checkpoint = None - self._compiled_func = None - self._profiling = profiling - self._profiler = None - - @property - def _active(self): - c1 = self._status == self._STARTED - c2 = type(self)._active_instance is self - assert c1 == c2 - return c1 - - def _register_callback(self, f, args=()): - assert self._active - assert isinstance(args, (tuple, list)) - proxies = self._make_proxies(args) - self._forward(args, proxies, checkpoint=True) - # NOTE: under eager graph callback will fire immediately - job = mgb.opr.callback_injector( - self._insert_barrier(_dummy()), lambda _: f(*proxies) - ) - self._insert_checkpoint(job) - self._outspec.append(job) - - def _insert_barrier(self, x): - assert self._active - if self._checkpoint is None: - return x - if isinstance(x, Tensor): - x = x._symvar - wrap = True - else: - wrap = False - if not isinstance(x, mgb.SymbolVar): - raise TypeError - x = mgb.opr.virtual_dep([x, self._checkpoint]) - if wrap: - x = Tensor(x) - return x - - def _insert_checkpoint(self, *args, no_barrier=False): - assert self._active - if not args: - return - args = tuple(x._symvar if isinstance(x, Tensor) else x for x in args) - for x in args: - if not isinstance(x, mgb.SymbolVar): - raise TypeError - if not no_barrier and self._checkpoint is not None: - # normally no need to _insert_barrier here, but if - # someone forget to call _insert_barrier beforehand, - # this can make things less broken - args += (self._checkpoint,) - if len(args) == 1: - self._checkpoint = args[0] - else: - self._checkpoint = mgb.opr.virtual_dep(args) - - def _mark_impure(self, x): - assert self._active - ret = x - if isinstance(x, Tensor): - x = x._symvar - if not isinstance(x, mgb.SymbolVar): - raise TypeError - self._outspec.append(x) - self._insert_checkpoint(x) - return ret - - def _make_proxies(self, args): - assert isinstance(args, (tuple, list)) - for x in args: - assert isinstance(x, Tensor) - return tuple(tensor(dtype=x.dtype, device=x.device) for x in args) - - def _forward(self, srcs, dests, checkpoint=True): - # pseudo-op: does not run under static graph; traced - # TODO: use shared memory - assert len(srcs) == len(dests) - if not self._active: - for s, d in zip(srcs, dests): - d.set_value(s, share=False) - return - jobs = [] - for s, d in zip(srcs, dests): - - def callback(value, dest=d): - dest.set_value(value, share=False) - - s = self._insert_barrier(s._symvar) - # NOTE: callback immediately fire in eager graph - jobs.append(mgb.opr.callback_injector(s, callback)) - self._outspec.extend(jobs) - if checkpoint: - self._insert_checkpoint(*jobs, no_barrier=True) - - def _forward_inputs(self, *args, **kwargs): - if self._kwargs is None: - self._kwargs = kwargs - elif self._kwargs != kwargs: - raise ValueError("kwargs must not change between invocations") - - if self._args is None: - self._args = [] - for i in args: - if isinstance(i, Tensor): - self._args.append(tensor(dtype=i.dtype, device=i.device)) - self._args[-1].set_value(i, share=False) - else: - self._args.append(tensor(i)) - else: - if not len(args) == len(self._args): - raise TypeError - for i, proxy in zip(args, self._args): - proxy.set_value(i, share=False) - # XXX: sync? - - def _make_outputs(self, outputs): - if outputs is None: - self._outputs = None - return - if isinstance(outputs, Tensor): - # no one is able to call barrier after this, so no need to checkpoint - # but checkpoint do little harm anyway - (self._outputs,) = self._make_proxies([outputs]) - return - if not isinstance(outputs, (tuple, list)): - raise TypeError("should return (tuple of) tensor") - for i in outputs: - if not isinstance(i, Tensor): - raise TypeError("should return (tuple of) tensor") - self._outputs = self._make_proxies(outputs) - - def _foward_outputs(self, outputs): - # pseudo-op: does not run under static graph; traced - if self._outputs is unset: - self._make_outputs(outputs) - if self._outputs is None: - if outputs is not None: - raise TypeError("should return None") - elif isinstance(self._outputs, Tensor): - if not isinstance(outputs, Tensor): - raise TypeError("should return a tensor") - self._forward([outputs], [self._outputs]) - else: - assert isinstance(self._outputs, tuple) - - def check(): - if not isinstance(outputs, (tuple, list)): - return False - if len(self._outputs) != len(outputs): - return False - for x in outputs: - if not isinstance(x, Tensor): - return False - return True - - if not check(): - raise TypeError( - "should return tuple of %d tensors" % len(self._outputs) - ) - self._forward(outputs, self._outputs) - - def _apply_graph_options(self, cg): - # graph opt level - if self._graph_opt_level is not None: - cg.set_option("graph_opt_level", self._graph_opt_level) - # log level - if self._log_level is not None: - cg.set_option("log_level", self._log_level) - # sublinear - if self._sublinear_memory_config is not None: - cg.set_option("enable_sublinear_memory_opt", True) - cg.set_option( - "sublinear_mem_config.lb_memory", - self._sublinear_memory_config.lb_memory, - ) - cg.set_option( - "sublinear_mem_config.genetic_nr_iter", - self._sublinear_memory_config.genetic_nr_iter, - ) - cg.set_option( - "sublinear_mem_config.genetic_pool_size", - self._sublinear_memory_config.genetic_pool_size, - ) - cg.set_option( - "sublinear_mem_config.thresh_nr_try", - self._sublinear_memory_config.thresh_nr_try, - ) - cg.set_option( - "sublinear_mem_config.num_worker", - self._sublinear_memory_config.num_worker, - ) - # pack allreduce - if self._allreduce_pack_max_size is not None: - cg.set_option("allreduce_pack_max_size", self._allreduce_pack_max_size) - # profile - if self._profiling: - self._profiler = CompGraphProfiler(cg) - - def _get_graph(self, eager): - - if eager: - if not hasattr(self, "_eager_graph"): - # pylint: disable=attribute-defined-outside-init - self._eager_graph = graph.Graph(eager_evaluation=True) - self._apply_graph_options(self._eager_graph) - return self._eager_graph - else: - if not hasattr(self, "_static_graph"): - # pylint: disable=attribute-defined-outside-init - self._static_graph = graph.Graph(eager_evaluation=False) - self._apply_graph_options(self._static_graph) - return self._static_graph - - @contextlib.contextmanager - def _prepare(self, args, kwargs, enable): - # prepare for execution - self._forward_inputs(*args, **kwargs) - if not enable: - # XXX: use our own graph here? - cg = None - elif self._status == self._FINISHED: - cg = None - elif self._symbolic: - cg = self._get_graph(eager=False) - else: - cg = self._get_graph(eager=True) - try: - # NOTE: always trace in a new graph, so capturing an undetached tensor - # will never work (would work if tracing in default graph) - if cg is None: - yield - else: - with cg: - yield - finally: - # XXX: properly release memory - if cg: - cg.clear_device_memory() - - @contextlib.contextmanager - def _activate(self): - # prepare for tracing - if self._status != self._UNSTARTED: - raise RuntimeError("cannot trace a second time") - if type(self)._active_instance is not None: - raise RuntimeError("nested trace is unsupported") - self._status = self._STARTED - type(self)._active_instance = self - self._user_cache = {} - try: - yield - finally: - self._status = self._FINISHED - self._user_cache = None - type(self)._active_instance = None - - def _run_wrapped(self): - outputs = self.__wrapped__(*self._args, **self._kwargs) - self._foward_outputs(outputs) - return outputs - - def _do_trace(self): - with self._activate(): - self._outspec = [] - outputs = self._run_wrapped() - if outputs is None: - self._sym_outputs = None - else: - if isinstance(outputs, Tensor): - outputs = [outputs] - # _run_wrapped has checked validity of outputs - self._sym_outputs = tuple(i._symvar for i in outputs) - mgb.comp_graph_tools.set_priority_to_id(self._outspec) - self._compiled_func = graph.get_default_graph().compile(None, self._outspec) - - def trace(self, *args: Tensor, **kwargs): - """ - Trace wrapped callable with provided arguments. - """ - with self._prepare(args, kwargs, enable=True): - self._do_trace() - return self - - def __call__(self, *args: Tensor, **kwargs): - """ - Evaluate on provided arguments, using compiled trace - instead of the original callable if applicable. - - :return: ``None`` or :class:`~.Tensor` or tuple of :class:`~.Tensor`, depending on the - return value of wrapped callable. - """ - with self._prepare(args, kwargs, enable=self.enabled): - if not self.enabled: - self._run_wrapped() - elif self._status == self._FINISHED: - self._compiled_func() - else: - if self._status == self._UNSTARTED: - self._do_trace() - if self._symbolic: - self._compiled_func() - return self._outputs - - def dump( - self, - fpath, - *, - arg_names=None, - append=False, - optimize_for_inference=False, - output_names=None, - **kwargs - ): - """ - Serialize trace to file system. - - :param fpath: positional only argument. Path of output file. - :param arg_names: names of the input tensors in the traced function. - :param append: whether output is appended to ``fpath``. - :param optimize_for_inference: whether to enable optimize_for_inference - pass before dump. - :param output_names: names of the output tensors in the traced function, - will use the default name if does not specify. - - :param enable_io16xc32: whether to use float16 for I/O between oprs and use - float32 as internal computation precision. Note the output var would be - changed to float16. - :param enable_ioc16: whether to use float16 for both I/O and computation - precision. - - :param enable_hwcd4: whether to use NHWCD4 data layout. This is faster on some - OpenCL backend. - :param enable_nchw88: whether to use NCHW88 data layout. it currently - used in X86 AVX backend. - :param enable_nchw44: whether to use NCHW44 data layout. it currently - used in arm backend. - :param enable_nchw44_dot: whether to use NCHW44_dot data layout. it currently - used in armv8.2+dotprod backend. - :param enable_nchw4: whether to use NCHW4 data layout. it currently - used in nvidia backend(based on cudnn). - :param enable_nchw32: whether to use NCHW32 data layout. it currently - used in nvidia backend with tensorcore(based on cudnn). - :param enable_chwn4: whether to use CHWN4 data layout. it currently - used in nvidia backend with tensorcore. - - :param enable_fuse_conv_bias_nonlinearity: whether to fuse conv+bias+nonlinearty - into one opr. - :param enable_fuse_conv_bias_with_z: whether to fuse conv_bias with z - input for inference on nvidia backend(this optimization pass will - result in mismatch of the precision of output of training and - inference) - """ - if self._status != self._FINISHED: - raise ValueError("not traced") - assert isinstance(self._sym_outputs, (tuple, type(None))) - if not self._sym_outputs: - raise ValueError("not outputs") - if arg_names is None: - arg_names = ["arg_%d" % i for i in range(len(self._args))] - elif len(arg_names) != len(self._args): - raise ValueError( - "len(arg_names) should be {}, got {}".format( - len(self._args), len(arg_names) - ) - ) - if isinstance(output_names, str): - output_names = [output_names] - if output_names is None: - output_names = [var.name for var in self._sym_outputs] - elif len(output_names) != len(self._sym_outputs): - raise ValueError( - "len(output_names) should be {}, got {}".format( - len(self._sym_outputs), len(output_names) - ) - ) - - optimize_for_inference_args_map = { - "enable_io16xc32": "f16_io_f32_comp", - "enable_ioc16": "f16_io_comp", - "enable_hwcd4": "use_nhwcd4", - "enable_nchw4": "use_nchw4", - "enable_nchw88": "use_nchw88", - "enable_nchw32": "use_nchw32", - "enable_nchw44": "use_nchw44", - "enable_nchw44_dot": "use_nchw44_dot", - "enable_chwn4": "use_chwn4", - "enable_fuse_conv_bias_nonlinearity": "fuse_conv_bias_nonlinearity", - "enable_fuse_conv_bias_with_z": "fuse_conv_bias_with_z", - } - if optimize_for_inference: - optimize_for_inference_kwargs = {} - for k, v in optimize_for_inference_args_map.items(): - if kwargs.pop(k, False): - optimize_for_inference_kwargs[v] = True - else: - for k in optimize_for_inference_args_map: - if kwargs.get(k, False): - raise ValueError( - "cannot set %s when optimize_for_inference is not set" % k - ) - if kwargs: - raise ValueError("unknown options: %s" % list(kwargs)) - - cg = self._sym_outputs[0].owner_graph - replace = {} - for t, name in zip(self._args, arg_names): - # relies on symvar dedup - s = t.__mgb_symvar__(comp_graph=cg) - replace[s] = mgb.make_arg( - t.device, cg, dtype=t.dtype, shape=t.shape, name=name - ) - # Convert VolatileSharedDeviceTensor to SharedDeviceTensor, - # otherwise some optimizations would not work. The conversion is - # safe because there simply is no way (using builtin ops) to make - # a VolatileSharedDeviceTensor actually volatile. - for s in mgb.cgtools.get_dep_vars( - self._sym_outputs, "VolatileSharedDeviceTensor" - ): - if s in replace: - continue # is an input - replace[s] = mgb.SharedND._from_symvar(s).symvar( - cg, name=s.name, volatile=False - ) - sym_outputs = mgb.cgtools.replace_vars(self._sym_outputs, replace) - sym_outputs = list(sym_outputs) - if optimize_for_inference: - sym_outputs = mgb.optimize_for_inference( - sym_outputs, **optimize_for_inference_kwargs - ) - for var, name in zip(sym_outputs, output_names): - var.rename(name) - mgb.serialize_comp_graph_to_file(fpath, sym_outputs, append=append) - - def get_profile(self): - """ - Get profiling result for compiled trace. - - :return: a json compatible object. - """ - if not self._profiler: - raise RuntimeError("trace is not set with profiling=True") - return self._profiler.get() diff --git a/python_module/megengine/jit/sublinear_memory_config.py b/python_module/megengine/jit/sublinear_memory_config.py deleted file mode 100644 index fc3e46dd..00000000 --- a/python_module/megengine/jit/sublinear_memory_config.py +++ /dev/null @@ -1,56 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -from ..core.device import get_device_count - - -class SublinearMemoryConfig: - r""" - Configuration for sublinear memory optimization. - - :param thresh_nr_try: number of samples both for searching in linear space - and around current thresh in sublinear memory optimization. Default: 10. - It can also be set through the environmental variable 'MGB_SUBLINEAR_MEMORY_THRESH_NR_TRY'. - :param genetic_nr_iter: number of iterations to find the best checkpoints in genetic algorithm. - Default: 0. - It can also be set through the environmental variable 'MGB_SUBLINEAR_MEMORY_GENETIC_NR_ITER'. - :param genetic_pool_size: number of samples for the crossover random selection - during genetic optimization. Default: 20. - It can also be set through the environmental variable 'MGB_SUBLINEAR_MEMORY_GENETIC_POOL_SIZE'. - :param lb_memory: memory lower bound of bottleneck size in MB for sublinear memory optimization. - It can be used to perform manual tradeoff between memory and speed. Default: 0. - It can also be set through the environmental variable 'MGB_SUBLINEAR_MEMORY_LOWER_BOUND_MB'. - :param num_worker: number of thread workers to search the optimum checkpoints - in sublinear memory optimization. Default: half of cpu number in the system. - Note: the value must be greater or equal to one. - It can also be set through the environmental variable 'MGB_SUBLINEAR_MEMORY_WORKERS'. - - Note that the environmental variable MGB_COMP_GRAPH_OPT must be set to 'enable_sublinear_memory_opt=1' - in order for the above environmental variable to be effective. - """ - - def __init__( - self, - thresh_nr_try: int = 10, - genetic_nr_iter: int = 0, - genetic_pool_size: int = 20, - lb_memory: int = 0, - num_worker: int = max(1, get_device_count("cpu") // 2), - ): - assert thresh_nr_try >= 0, "thresh_nr_try must be greater or equal to zero" - self.thresh_nr_try = thresh_nr_try - assert genetic_nr_iter >= 0, "genetic_nr_iter must be greater or equal to zero" - self.genetic_nr_iter = genetic_nr_iter - assert ( - genetic_pool_size >= 0 - ), "genetic_pool_size must be greater or equal to zero" - self.genetic_pool_size = genetic_pool_size - self.lb_memory = lb_memory - assert num_worker > 0, "num_worker must be greater or equal to one" - self.num_worker = num_worker diff --git a/python_module/megengine/logger.py b/python_module/megengine/logger.py deleted file mode 100644 index 5cca95bd..00000000 --- a/python_module/megengine/logger.py +++ /dev/null @@ -1,231 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import contextlib -import logging -import os -import sys - -_all_loggers = [] -_default_level_name = os.getenv("MEGENGINE_LOGGING_LEVEL", "INFO") -_default_level = logging.getLevelName(_default_level_name.upper()) - - -def set_log_file(fout, mode="a"): - r"""Sets log output file. - - :type fout: str or file-like - :param fout: file-like object that supports write and flush, or string for - the filename - :type mode: str - :param mode: specify the mode to open log file if *fout* is a string - """ - if isinstance(fout, str): - fout = open(fout, mode) - MegEngineLogFormatter.log_fout = fout - - -class MegEngineLogFormatter(logging.Formatter): - log_fout = None - date_full = "[%(asctime)s %(lineno)d@%(filename)s:%(name)s] " - date = "%(asctime)s " - msg = "%(message)s" - max_lines = 256 - - def _color_exc(self, msg): - r"""Sets the color of message as the execution type. - """ - return "\x1b[34m{}\x1b[0m".format(msg) - - def _color_dbg(self, msg): - r"""Sets the color of message as the debugging type. - """ - return "\x1b[36m{}\x1b[0m".format(msg) - - def _color_warn(self, msg): - r"""Sets the color of message as the warning type. - """ - return "\x1b[1;31m{}\x1b[0m".format(msg) - - def _color_err(self, msg): - r"""Sets the color of message as the error type. - """ - return "\x1b[1;4;31m{}\x1b[0m".format(msg) - - def _color_omitted(self, msg): - r"""Sets the color of message as the omitted type. - """ - return "\x1b[35m{}\x1b[0m".format(msg) - - def _color_normal(self, msg): - r"""Sets the color of message as the normal type. - """ - return msg - - def _color_date(self, msg): - r"""Sets the color of message the same as date. - """ - return "\x1b[32m{}\x1b[0m".format(msg) - - def format(self, record): - if record.levelno == logging.DEBUG: - mcl, mtxt = self._color_dbg, "DBG" - elif record.levelno == logging.WARNING: - mcl, mtxt = self._color_warn, "WRN" - elif record.levelno == logging.ERROR: - mcl, mtxt = self._color_err, "ERR" - else: - mcl, mtxt = self._color_normal, "" - - if mtxt: - mtxt += " " - - if self.log_fout: - self.__set_fmt(self.date_full + mtxt + self.msg) - formatted = super(MegEngineLogFormatter, self).format(record) - nr_line = formatted.count("\n") + 1 - if nr_line >= self.max_lines: - head, body = formatted.split("\n", 1) - formatted = "\n".join( - [ - head, - "BEGIN_LONG_LOG_{}_LINES{{".format(nr_line - 1), - body, - "}}END_LONG_LOG_{}_LINES".format(nr_line - 1), - ] - ) - self.log_fout.write(formatted) - self.log_fout.write("\n") - self.log_fout.flush() - - self.__set_fmt(self._color_date(self.date) + mcl(mtxt + self.msg)) - formatted = super(MegEngineLogFormatter, self).format(record) - - if record.exc_text or record.exc_info: - # handle exception format - b = formatted.find("Traceback ") - if b != -1: - s = formatted[b:] - s = self._color_exc(" " + s.replace("\n", "\n ")) - formatted = formatted[:b] + s - - nr_line = formatted.count("\n") + 1 - if nr_line >= self.max_lines: - lines = formatted.split("\n") - remain = self.max_lines // 2 - removed = len(lines) - remain * 2 - if removed > 0: - mid_msg = self._color_omitted( - "[{} log lines omitted (would be written to output file " - "if set_log_file() has been called;\n" - " the threshold can be set at " - "MegEngineLogFormatter.max_lines)]".format(removed) - ) - formatted = "\n".join(lines[:remain] + [mid_msg] + lines[-remain:]) - - return formatted - - if sys.version_info.major < 3: - - def __set_fmt(self, fmt): - self._fmt = fmt - - else: - - def __set_fmt(self, fmt): - self._style._fmt = fmt - - -def get_logger(name=None, formatter=MegEngineLogFormatter): - r"""Gets megengine logger with given name. - """ - - logger = logging.getLogger(name) - if getattr(logger, "_init_done__", None): - return logger - logger._init_done__ = True - logger.propagate = False - logger.setLevel(_default_level) - handler = logging.StreamHandler() - handler.setFormatter(formatter(datefmt="%d %H:%M:%S")) - handler.setLevel(0) - del logger.handlers[:] - logger.addHandler(handler) - _all_loggers.append(logger) - return logger - - -def set_log_level(level, update_existing=True): - """Sets default logging level. - - :type level: int e.g. logging.INFO - :param level: loggin level given by python :mod:`logging` module - :param update_existing: whether to update existing loggers - """ - global _default_level # pylint: disable=global-statement - _default_level = level - if update_existing: - for i in _all_loggers: - i.setLevel(level) - - -_logger = get_logger(__name__) - -try: - if sys.version_info.major < 3: - raise ImportError() - - from megengine._internal.logconf import set_logger as _set_mgb_logger - - class MegBrainLogFormatter(MegEngineLogFormatter): - date = "%(asctime)s[mgb] " - - def _color_date(self, msg): - return "\x1b[33m{}\x1b[0m".format(msg) - - _megbrain_logger = get_logger("megbrain", MegBrainLogFormatter) - _set_mgb_logger(_megbrain_logger) - - def set_mgb_log_level(level): - r"""Sets megbrain log level - - :type level: int e.g. logging.INFO - :param level: new log level - :return: original log level - """ - logger = _megbrain_logger - rst = logger.getEffectiveLevel() - logger.setLevel(level) - return rst - - -except ImportError as exc: - - def set_mgb_log_level(level): - raise NotImplementedError("megbrain has not been imported") - - -@contextlib.contextmanager -def replace_mgb_log_level(level): - r"""Replaces megbrain log level in a block and restore after exiting. - - :type level: int e.g. logging.INFO - :param level: new log level - """ - old = set_mgb_log_level(level) - try: - yield - finally: - set_mgb_log_level(old) - - -def enable_debug_log(): - r"""Sets logging level to debug for all components. - """ - set_log_level(logging.DEBUG) - set_mgb_log_level(logging.DEBUG) diff --git a/python_module/megengine/module/__init__.py b/python_module/megengine/module/__init__.py deleted file mode 100644 index c2b3db8a..00000000 --- a/python_module/megengine/module/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from .activation import LeakyReLU, PReLU, ReLU, Sigmoid, Softmax -from .batchnorm import BatchNorm1d, BatchNorm2d, SyncBatchNorm -from .concat import Concat -from .conv import Conv2d, ConvRelu2d, ConvTranspose2d, LocalConv2d -from .conv_bn import ConvBn2d, ConvBnRelu2d -from .dropout import Dropout -from .elemwise import Elemwise -from .embedding import Embedding -from .identity import Identity -from .linear import Linear -from .module import Module -from .parampack import ParamPack -from .pooling import AvgPool2d, MaxPool2d -from .quant_dequant import DequantStub, QuantStub -from .sequential import Sequential diff --git a/python_module/megengine/module/activation.py b/python_module/megengine/module/activation.py deleted file mode 100644 index b80c10a7..00000000 --- a/python_module/megengine/module/activation.py +++ /dev/null @@ -1,231 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import numpy as np - -from ..core import Parameter -from ..functional import leaky_relu, prelu, relu, sigmoid, softmax -from .module import Module - - -class Softmax(Module): - r""" - Applies a softmax function. Softmax is defined as: - - .. math:: - \text{Softmax}(x_{i}) = \frac{exp(x_i)}{\sum_j exp(x_j)} - - It is applied to an n-dimensional input Tensor and rescaling them so that the elements of the - n-dimensional output Tensor lie in the range of `[0, 1]` and sum to 1. - - :param axis: An axis along which softmax will be applied. By default, - softmax will apply along the highest ranked axis. - - Examples: - - .. testcode:: - - import numpy as np - import megengine as mge - import megengine.module as M - - data = mge.tensor(np.array([-2,-1,0,1,2]).astype(np.float32)) - softmax = M.Softmax() - output = softmax(data) - with np.printoptions(precision=6): - print(output.numpy()) - - Outputs: - - .. testoutput:: - - [0.011656 0.031685 0.086129 0.234122 0.636409] - - """ - - def __init__(self, axis=None): - super().__init__() - self.axis = axis - - def forward(self, inputs): - return softmax(inputs, self.axis) - - -class Sigmoid(Module): - r""" - Applies the element-wise function: - - .. math:: - \text{Sigmoid}(x) = \frac{1}{1 + \exp(-x)} - - Examples: - - .. testcode:: - - import numpy as np - import megengine as mge - import megengine.module as M - - data = mge.tensor(np.array([-2,-1,0,1,2,]).astype(np.float32)) - sigmoid = M.Sigmoid() - output = sigmoid(data) - with np.printoptions(precision=6): - print(output.numpy()) - - Outputs: - - .. testoutput:: - - [0.119203 0.268941 0.5 0.731059 0.880797] - - """ - - def forward(self, inputs): - return sigmoid(inputs) - - -class ReLU(Module): - r""" - Applies the element-wise function: - - .. math:: - \text{ReLU}(x) = \max(x, 0) - - Examples: - - .. testcode:: - - import numpy as np - import megengine as mge - import megengine.module as M - data = mge.tensor(np.array([-2,-1,0,1,2,]).astype(np.float32)) - relu = M.ReLU() - output = relu(data) - with np.printoptions(precision=6): - print(output.numpy()) - - Outputs: - - .. testoutput:: - - [0. 0. 0. 1. 2.] - - """ - - def forward(self, x): - return relu(x) - - -class PReLU(Module): - r""" - Applies the element-wise function: - - .. math:: - \text{PReLU}(x) = \max(0,x) + a * \min(0,x) - - or - - .. math:: - \text{PReLU}(x) = - \begin{cases} - x, & \text{ if } x \geq 0 \\ - ax, & \text{ otherwise } - \end{cases} - - Here :math:`a` is a learnable parameter. When called without arguments, `PReLU()` uses - a single paramter :math:`a` across all input channel. If called with `PReLU(num_of_channels)`, - a seperate :math:`a` is used for each input channle. - - :param num_parameters: number of :math:`a` to learn, there is only two - values are legitimate: 1, or the number of channels at input. Default: 1 - :param init: the initial value of :math:`a`. Default: 0.25 - - Examples: - - .. testcode:: - - import numpy as np - import megengine as mge - import megengine.module as M - data = mge.tensor(np.array([-1.2, -3.7, 2.7]).astype(np.float32)) - prelu = M.PReLU() - output = prelu(data) - print(output.numpy()) - - Outputs: - - .. testoutput:: - - [-0.3 -0.925 2.7 ] - - """ - - def __init__(self, num_parameters: int = 1, init: float = 0.25): - super().__init__() - self.num_parameters = num_parameters - if num_parameters > 1: - # Assume format is NCHW - self.weight = Parameter( - value=np.full((1, num_parameters, 1, 1), init, dtype=np.float32) - ) - else: - self.weight = Parameter(value=[init]) - - def forward(self, inputs): - assert self.weight.shape == (1,) or self.weight.shape == ( - 1, - int(inputs.shape[1]), - 1, - 1, - ), "invalid weight's shape" - return prelu(inputs, self.weight) - - -class LeakyReLU(Module): - r""" - Applies the element-wise function: - - .. math:: - \text{LeakyReLU}(x) = \max(0,x) + negative\_slope \times \min(0,x) - - or - - .. math:: - \text{LeakyReLU}(x) = - \begin{cases} - x, & \text{ if } x \geq 0 \\ - negative\_slope \times x, & \text{ otherwise } - \end{cases} - - Examples: - - .. testcode:: - - import numpy as np - import megengine as mge - import megengine.module as M - data = mge.tensor(np.array([-8, -12, 6, 10]).astype(np.float32)) - - leakyrelu = M.LeakyReLU(0.01) - output = leakyrelu(data) - print(output.numpy()) - - Outputs: - - .. testoutput:: - - [-0.08 -0.12 6. 10. ] - - """ - - def __init__(self, negative_slope: float = 0.01): - super().__init__() - self.negative_slope = negative_slope - - def forward(self, inputs): - return leaky_relu(inputs, self.negative_slope) diff --git a/python_module/megengine/module/batchnorm.py b/python_module/megengine/module/batchnorm.py deleted file mode 100644 index ba755616..00000000 --- a/python_module/megengine/module/batchnorm.py +++ /dev/null @@ -1,257 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import numpy as np - -from ..core import Buffer, Parameter -from ..core.device import get_default_device -from ..functional import batch_norm2d, sync_batch_norm -from . import init -from .module import Module - - -class _BatchNorm(Module): - def __init__( - self, - num_features, - eps=1e-5, - momentum=0.9, - affine=True, - track_running_stats=True, - ): - super(_BatchNorm, self).__init__() - self.num_features = num_features - self.eps = eps - self.momentum = momentum - self.affine = affine - self.track_running_stats = track_running_stats - if self.affine: - self.weight = Parameter(np.ones(num_features, dtype=np.float32)) - self.bias = Parameter(np.zeros(num_features, dtype=np.float32)) - else: - self.weight = None - self.bias = None - - tshape = (1, self.num_features, 1, 1) - - if self.track_running_stats: - self.running_mean = Buffer(np.zeros(tshape, dtype=np.float32)) - self.running_var = Buffer(np.ones(tshape, dtype=np.float32)) - else: - self.running_mean = None - self.running_var = None - - def reset_running_stats(self) -> None: - if self.track_running_stats: - init.zeros_(self.running_mean) - init.ones_(self.running_var) - - def reset_parameters(self) -> None: - self.reset_running_stats() - if self.affine: - init.ones_(self.weight) - init.zeros_(self.bias) - - def _check_input_ndim(self, inp): - raise NotImplementedError - - def forward(self, inp): - self._check_input_ndim(inp) - - _ndims = len(inp.shape) - if _ndims != 4: - origin_shape = inp.shapeof() - if _ndims == 2: - n, c = inp.shapeof(0), inp.shapeof(1) - new_shape = (n, c, 1, 1) - elif _ndims == 3: - n, c, h = inp.shapeof(0), inp.shapeof(1), inp.shapeof(2) - new_shape = (n, c, h, 1) - - inp = inp.reshape(new_shape) - - if self.training and self.track_running_stats: - exponential_average_factor = self.momentum - else: - exponential_average_factor = 0.0 # useless - - # FIXME currently rocm does not support real bn opr so we just use - # sync_batch_norm(as implemented by elemwise) here, - # we will fix it in the next version - if get_default_device() == "rocmx": - output = sync_batch_norm( - inp, - self.running_mean, - self.running_var, - self.weight, - self.bias, - self.training or not self.track_running_stats, - exponential_average_factor, - self.eps, - ) - else: - output = batch_norm2d( - inp, - self.running_mean, - self.running_var, - self.weight, - self.bias, - self.training or not self.track_running_stats, - exponential_average_factor, - self.eps, - ) - - if _ndims != 4: - output = output.reshape(origin_shape) - - return output - - -class SyncBatchNorm(_BatchNorm): - r""" - Applies Synchronization Batch Normalization. - """ - - def _check_input_ndim(self, inp): - if len(inp.shape) not in {2, 3, 4}: - raise ValueError( - "expected 2D, 3D or 4D input (got {}D input)".format(len(inp.shape)) - ) - - def forward(self, inp): - self._check_input_ndim(inp) - - _ndims = len(inp.shape) - if _ndims != 4: - origin_shape = inp.shapeof() - if _ndims == 2: - n, c = inp.shapeof(0), inp.shapeof(1) - new_shape = (n, c, 1, 1) - elif _ndims == 3: - n, c, h = inp.shapeof(0), inp.shapeof(1), inp.shapeof(2) - new_shape = (n, c, h, 1) - - inp = inp.reshape(new_shape) - - if self.training and self.track_running_stats: - exponential_average_factor = self.momentum - else: - exponential_average_factor = 0.0 # useless - - output = sync_batch_norm( - inp, - self.running_mean, - self.running_var, - self.weight, - self.bias, - self.training or not self.track_running_stats, - exponential_average_factor, - self.eps, - ) - - if _ndims != 4: - output = output.reshape(origin_shape) - - return output - - -class BatchNorm1d(_BatchNorm): - r""" - Applies Batch Normalization over a 2D/3D tensor. - - Refer to :class:`~.BatchNorm2d` for more information. - """ - - def _check_input_ndim(self, inp): - if len(inp.shape) not in {2, 3}: - raise ValueError( - "expected 2D or 3D input (got {}D input)".format(len(inp.shape)) - ) - - -class BatchNorm2d(_BatchNorm): - r""" - Applies Batch Normalization over a 4D tensor. - - .. math:: - - y = \frac{x - \mathrm{E}[x]}{ \sqrt{\mathrm{Var}[x] + \epsilon}} * \gamma + \beta - - The mean and standard-deviation are calculated per-dimension over - the mini-batches and :math:`\gamma` and :math:`\beta` are learnable - parameter vectors. - - By default, during training this layer keeps running estimates of its - computed mean and variance, which are then used for normalization during - evaluation. The running estimates are kept with a default :attr:`momentum` - of 0.9. - - If :attr:`track_running_stats` is set to ``False``, this layer will not - keep running estimates, and batch statistics are instead used during - evaluation time. - - .. note:: - This :attr:`momentum` argument is different from one used in optimizer - classes and the conventional notion of momentum. Mathematically, the - update rule for running statistics here is - :math:`\hat{x}_\text{new} = \text{momentum} \times \hat{x} + (1 - \text{momentum}) \times x_t`, - where :math:`\hat{x}` is the estimated statistic and :math:`x_t` is the - new observed value. - - Because the Batch Normalization is done over the `C` dimension, computing - statistics on `(N, H, W)` slices, it's common terminology to call this - Spatial Batch Normalization. - - :type num_features: int - :param num_features: usually the :math:`C` from an input of size - :math:`(N, C, H, W)` or the highest ranked dimension of an input with - less than 4D. - :type eps: float - :param eps: a value added to the denominator for numerical stability. - Default: 1e-5. - :type momentum: float - :param momentum: the value used for the `running_mean` and `running_var` - computation. - Default: 0.9 - :type affine: bool - :param affine: a boolean value that when set to ``True``, this module has - learnable affine parameters. Default: ``True`` - :type track_running_stats: bool - :param track_running_stats: when set to ``True``, this module tracks the - running mean and variance. When set to ``False``, this module does not - track such statistics and always uses batch statistics in both training - and eval modes. Default: ``True``. - - - Examples: - - .. testcode:: - - import numpy as np - import megengine as mge - import megengine.module as M - - # With Learnable Parameters - m = M.BatchNorm2d(4) - inp = mge.tensor(np.random.rand(1, 4, 3, 3).astype("float32")) - oup = m(inp) - print(m.weight, m.bias) - # Without Learnable Parameters - m = M.BatchNorm2d(4, affine=False) - oup = m(inp) - print(m.weight, m.bias) - - .. testoutput:: - - Tensor([1. 1. 1. 1.]) Tensor([0. 0. 0. 0.]) - None None - """ - - def _check_input_ndim(self, inp): - if len(inp.shape) != 4: - raise ValueError("expected 4D input (got {}D input)".format(len(inp.shape))) diff --git a/python_module/megengine/module/concat.py b/python_module/megengine/module/concat.py deleted file mode 100644 index 453f951b..00000000 --- a/python_module/megengine/module/concat.py +++ /dev/null @@ -1,22 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from typing import Iterable - -from .. import functional as F -from ..core.tensor import Tensor -from .module import Module - - -class Concat(Module): - r""" - A :class:`~.Module` to do functional concat. Could be replaced with :class:`~.QATModule` - version :class:`~.qat.concat.Concat` using :func:`~.quantize.quantize_qat`. - """ - - def forward(self, inps: Iterable[Tensor], axis: int = 0): - return F.concat(inps, axis) diff --git a/python_module/megengine/module/conv.py b/python_module/megengine/module/conv.py deleted file mode 100644 index 02165b89..00000000 --- a/python_module/megengine/module/conv.py +++ /dev/null @@ -1,392 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from abc import abstractmethod -from typing import Tuple, Union - -import numpy as np - -import megengine._internal as mgb - -from .. import functional as F -from ..core import Parameter -from ..utils.types import _pair, _pair_nonzero -from . import init -from .module import Module - - -class _ConvNd(Module): - """base class for convolution modules, including transposed conv""" - - def __init__( - self, - in_channels: int, - out_channels: int, - kernel_size: Union[int, Tuple[int, int]], - stride: Union[int, Tuple[int, int]], - padding: Union[int, Tuple[int, int]], - dilation: Union[int, Tuple[int, int]], - groups: int, - bias: bool = True, - ): - super().__init__() - if in_channels % groups != 0: - raise ValueError("in_channels must be divisible by groups") - if out_channels % groups != 0: - raise ValueError("out_channels must be divisible by groups") - self.in_channels = in_channels - self.out_channels = out_channels - self.kernel_size = kernel_size - self.stride = stride - self.padding = padding - self.dilation = dilation - self.groups = groups - - self.weight = Parameter(np.zeros(self._infer_weight_shape(), dtype=np.float32)) - self.bias = None - if bias: - self.bias = Parameter(np.zeros(self._infer_bias_shape(), dtype=np.float32)) - self.reset_parameters() - - @abstractmethod - def _get_fanin(self): - pass - - def reset_parameters(self) -> None: - fanin = self._get_fanin() - std = np.sqrt(1 / fanin) - init.normal_(self.weight, 0.0, std) - if self.bias is not None: - init.zeros_(self.bias) - - @abstractmethod - def _infer_weight_shape(self): - pass - - @abstractmethod - def _infer_bias_shape(self): - pass - - -class Conv2d(_ConvNd): - r"""Applies a 2D convolution over an input tensor. - - For instance, given an input of the size :math:`(N, C_{\text{in}}, H, W)`, - this layer generates an output of the size - :math:`(N, C_{\text{out}}, H_{\text{out}}, W_{\text{out}})` through the - process described as below: - - .. math:: - \text{out}(N_i, C_{\text{out}_j}) = \text{bias}(C_{\text{out}_j}) + - \sum_{k = 0}^{C_{\text{in}} - 1} \text{weight}(C_{\text{out}_j}, k) \star \text{input}(N_i, k) - - where :math:`\star` is the valid 2D cross-correlation operator, - :math:`N` is a batch size, :math:`C` denotes a number of channels, - :math:`H` is a height of input planes in pixels, and :math:`W` is - width in pixels. - - When ``groups == in_channels`` and ``out_channels == K * in_channels``, - where `K` is a positive integer, this operation is also known as depthwise - convolution. - - In other words, for an input of size :math:`(N, C_{in}, H_{in}, W_{in})`, - a depthwise convolution with a depthwise multiplier `K`, can be constructed - by arguments :math:`(in\_channels=C_{in}, out\_channels=C_{in} \times K, ..., groups=C_{in})`. - - :param in_channels: number of input channels. - :param out_channels: number of output channels. - :param kernel_size: size of weight on spatial dimensions. If ``kernel_size`` is - an :class:`int`, the actual kernel size would be - ``(kernel_size, kernel_size)``. Default: 1 - :param stride: stride of the 2D convolution operation. Default: 1 - :param padding: size of the paddings added to the input on both sides of its - spatial dimensions. Only zero-padding is supported. Default: 0 - :param dilation: dilation of the 2D convolution operation. Default: 1 - :param groups: number of groups to divide input and output channels into, - so as to perform a "grouped convolution". When ``groups`` is not 1, - ``in_channels`` and ``out_channels`` must be divisible by ``groups``, - and there would be an extra dimension at the beginning of the weight's - shape. Specifically, the shape of weight would be ``(groups, - out_channel // groups, in_channels // groups, *kernel_size)``. - :param bias: whether to add a bias onto the result of convolution. Default: - True - :param conv_mode: Supports `CROSS_CORRELATION` or `CONVOLUTION`. Default: - `CROSS_CORRELATION`. - :param compute_mode: When set to `DEFAULT`, no special requirements will be - placed on the precision of intermediate results. When set to `FLOAT32`, - float32 would be used for accumulator and intermediate result, but only - effective when input and output are of float16 dtype. - """ - - _conv_mode_type = mgb.opr_param_defs.Convolution.Mode - _compute_mode_type = mgb.opr_param_defs.Convolution.ComputeMode - - def __init__( - self, - in_channels: int, - out_channels: int, - kernel_size: Union[int, Tuple[int, int]], - stride: Union[int, Tuple[int, int]] = 1, - padding: Union[int, Tuple[int, int]] = 0, - dilation: Union[int, Tuple[int, int]] = 1, - groups: int = 1, - bias: bool = True, - conv_mode: str = "CROSS_CORRELATION", - compute_mode: str = "DEFAULT", - ): - kernel_size = _pair_nonzero(kernel_size) - stride = _pair_nonzero(stride) - padding = _pair(padding) - dilation = _pair_nonzero(dilation) - self.conv_mode = self._conv_mode_type.convert(conv_mode) - self.compute_mode = self._compute_mode_type.convert(compute_mode) - super().__init__( - in_channels, - out_channels, - kernel_size, - stride, - padding, - dilation, - groups, - bias, - ) - - def _get_fanin(self): - kh, kw = self.kernel_size - ic = self.in_channels - return kh * kw * ic - - def _infer_weight_shape(self): - group = self.groups - ichl = self.in_channels - ochl = self.out_channels - kh, kw = self.kernel_size - if group == 1: - # Assume format is NCHW - return (ochl, ichl, kh, kw) - - assert ( - ichl % group == 0 and ochl % group == 0 - ), "invalid config: input_channels={} output_channels={} group={}".format( - ichl, ochl, group - ) - # Assume format is NCHW - return (group, ochl // group, ichl // group, kh, kw) - - def _infer_bias_shape(self): - # Assume format is NCHW - return (1, self.out_channels, 1, 1) - - def calc_conv(self, inp, weight, bias): - return F.conv2d( - inp, - weight, - bias, - self.stride, - self.padding, - self.dilation, - self.groups, - self.conv_mode, - self.compute_mode, - ) - - def forward(self, inp): - return self.calc_conv(inp, self.weight, self.bias) - - -class ConvTranspose2d(_ConvNd): - r"""Applies a 2D transposed convolution over an input tensor. - - This module is also known as a deconvolution or a fractionally-strided convolution. - :class:`ConvTranspose2d` can ben seen as the gradient of :class:`Conv2d` operation - with respect to its input. - - Convolution usually reduces the size of input, while transposed convolution works - the opposite way, transforming a smaller input to a larger output while preserving the - connectivity pattern. - - :param in_channels: number of input channels. - :param out_channels: number of output channels. - :param kernel_size: size of weight on spatial dimensions. If ``kernel_size`` is - an :class:`int`, the actual kernel size would be - ``(kernel_size, kernel_size)``. Default: 1 - :param stride: stride of the 2D convolution operation. Default: 1 - :param padding: size of the paddings added to the input on both sides of its - spatial dimensions. Only zero-padding is supported. Default: 0 - :param dilation: dilation of the 2D convolution operation. Default: 1 - :param groups: number of groups to divide input and output channels into, - so as to perform a "grouped convolution". When ``groups`` is not 1, - ``in_channels`` and ``out_channels`` must be divisible by ``groups``, - and there would be an extra dimension at the beginning of the weight's - shape. Specifically, the shape of weight would be ``(groups, - out_channels // groups, in_channels // groups, *kernel_size)``. Default: 1 - :param bias: wether to add a bias onto the result of convolution. Default: - True - :param conv_mode: Supports `CROSS_CORRELATION` or `CONVOLUTION`. Default: - `CROSS_CORRELATION`. - :param compute_mode: When set to `DEFAULT`, no special requirements will be - placed on the precision of intermediate results. When set to `FLOAT32`, - float32 would be used for accumulator and intermediate result, but only - effective when input and output are of float16 dtype. - """ - - _conv_mode_type = mgb.opr_param_defs.Convolution.Mode - _compute_mode_type = mgb.opr_param_defs.Convolution.ComputeMode - - def __init__( - self, - in_channels: int, - out_channels: int, - kernel_size: Union[int, Tuple[int, int]], - stride: Union[int, Tuple[int, int]] = 1, - padding: Union[int, Tuple[int, int]] = 0, - dilation: Union[int, Tuple[int, int]] = 1, - groups: int = 1, - bias: bool = True, - conv_mode: str = "CROSS_CORRELATION", - compute_mode: str = "DEFAULT", - ): - kernel_size = _pair_nonzero(kernel_size) - stride = _pair_nonzero(stride) - padding = _pair(padding) - dilation = _pair_nonzero(dilation) - self.conv_mode = self._conv_mode_type.convert(conv_mode) - self.compute_mode = self._compute_mode_type.convert(compute_mode) - super().__init__( - in_channels, - out_channels, - kernel_size, - stride, - padding, - dilation, - groups, - bias, - ) - - def _get_fanin(self): - kh, kw = self.kernel_size - oc = self.out_channels - return kh * kw * oc - - def _infer_weight_shape(self): - group = self.groups - ichl = self.in_channels - ochl = self.out_channels - kh, kw = self.kernel_size - if group == 1: - # Assume format is NCHW - return (ichl, ochl, kh, kw) - - assert ( - ichl % group == 0 and ochl % group == 0 - ), "invalid config: input_channels={} output_channels={} group={}".format( - ichl, ochl, group - ) - # Assume format is NCHW - return (group, ichl // group, ochl // group, kh, kw) - - def _infer_bias_shape(self): - # Assume format is NCHW - return (1, self.out_channels, 1, 1) - - def forward(self, inp): - return F.conv_transpose2d( - inp, - self.weight, - self.bias, - self.stride, - self.padding, - self.dilation, - self.groups, - self.conv_mode, - self.compute_mode, - ) - - -class LocalConv2d(Conv2d): - r"""Applies a spatial convolution with untied kernels over an input 4D tensor. - It is also known as the locally connected layer. - - :param in_channels: number of input channels. - :param out_channels: number of output channels. - :param input_height: the height of the input images. - :param input_width: the width of the input images. - :param kernel_size: size of weight on spatial dimensions. If ``kernel_size`` is - an :class:`int`, the actual kernel size would be - ``(kernel_size, kernel_size)``. Default: 1 - :param stride: stride of the 2D convolution operation. Default: 1 - :param padding: size of the paddings added to the input on both sides of its - spatial dimensions. Only zero-padding is supported. Default: 0 - :param groups: number of groups to divide input and output channels into, - so as to perform a "grouped convolution". When ``groups`` is not 1, - ``in_channels`` and ``out_channels`` must be divisible by ``groups``. - The shape of weight is ``(groups, output_height, output_width, - in_channels // groups, *kernel_size, out_channels // groups)``. - """ - - _conv_mode_type = mgb.opr_param_defs.Convolution.Mode - - def __init__( - self, - in_channels: int, - out_channels: int, - input_height: int, - input_width: int, - kernel_size: Union[int, Tuple[int, int]], - stride: Union[int, Tuple[int, int]] = 1, - padding: Union[int, Tuple[int, int]] = 0, - dilation: Union[int, Tuple[int, int]] = 1, - groups: int = 1, - conv_mode: str = "CROSS_CORRELATION", - ): - self.input_height = input_height - self.input_width = input_width - super().__init__( - in_channels, - out_channels, - kernel_size, - stride, - padding, - dilation, - groups, - bias=False, - ) - - def _infer_weight_shape(self): - group = self.groups - output_height = ( - self.input_height + self.padding[0] * 2 - self.kernel_size[0] - ) // self.stride[0] + 1 - output_width = ( - self.input_width + self.padding[1] * 2 - self.kernel_size[1] - ) // self.stride[1] + 1 - # Assume format is NCHW - return ( - group, - output_height, - output_width, - self.in_channels // group, - self.kernel_size[0], - self.kernel_size[1], - self.out_channels // group, - ) - - def forward(self, inp): - return F.local_conv2d( - inp, self.weight, self.stride, self.padding, self.dilation, self.conv_mode - ) - - -class ConvRelu2d(Conv2d): - r""" - A fused :class:`~.Module` including Conv2d and relu. Could be replaced - with :class:`~.QATModule` version :class:`~.qat.conv.ConvRelu2d` using - :func:`~.quantize.quantize_qat`. - """ - - def forward(self, inp): - return F.relu(self.calc_conv(inp, self.weight, self.bias)) diff --git a/python_module/megengine/module/conv_bn.py b/python_module/megengine/module/conv_bn.py deleted file mode 100644 index 76713b0f..00000000 --- a/python_module/megengine/module/conv_bn.py +++ /dev/null @@ -1,69 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from typing import Tuple, Union - -from ..functional import relu -from .batchnorm import BatchNorm2d -from .conv import Conv2d -from .module import Module - - -class _ConvBnActivation2d(Module): - def __init__( - self, - in_channels: int, - out_channels: int, - kernel_size: Union[int, Tuple[int, int]], - stride: Union[int, Tuple[int, int]] = 1, - padding: Union[int, Tuple[int, int]] = 0, - dilation: Union[int, Tuple[int, int]] = 1, - groups: int = 1, - bias: bool = True, - conv_mode: str = "CROSS_CORRELATION", - compute_mode: str = "DEFAULT", - eps=1e-5, - momentum=0.9, - affine=True, - track_running_stats=True, - ): - super().__init__() - self.conv = Conv2d( - in_channels, - out_channels, - kernel_size, - stride, - padding, - dilation, - groups, - bias, - conv_mode, - compute_mode, - ) - self.bn = BatchNorm2d(out_channels, eps, momentum, affine, track_running_stats) - - -class ConvBn2d(_ConvBnActivation2d): - r""" - A fused :class:`~.Module` including Conv2d, BatchNorm2d. Could be replaced - with :class:`~.QATModule` version :class:`~.qat.conv_bn.ConvBn2d` using - :func:`~.quantize.quantize_qat`. - """ - - def forward(self, inp): - return self.bn(self.conv(inp)) - - -class ConvBnRelu2d(_ConvBnActivation2d): - r""" - A fused :class:`~.Module` including Conv2d, BatchNorm2d and relu. Could be replaced - with :class:`~.QATModule` version :class:`~.qat.conv_bn.ConvBnRelu2d` using - :func:`~.quantize.quantize_qat`. - """ - - def forward(self, inp): - return relu(self.bn(self.conv(inp))) diff --git a/python_module/megengine/module/dropout.py b/python_module/megengine/module/dropout.py deleted file mode 100644 index 146eba24..00000000 --- a/python_module/megengine/module/dropout.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from ..functional import dropout -from .module import Module - - -class Dropout(Module): - r"""Randomly set input elements to zeros with the probability :math:`drop\_prob` during training. Commonly used in large networks to prevent overfitting. - Note that we perform dropout only during training, we also rescale(multiply) the output tensor - by :math:`\frac{1}{1 - drop\_prob}`. During inference :class:`~.Dropout` is equal to :class:`~.Identity`. - - :param drop_prob: The probability to drop (set to zero) each single element - """ - - def __init__(self, drop_prob=0.0): - super().__init__() - self.drop_prob = drop_prob - - def forward(self, inputs): - if self.training: - return dropout(inputs, self.drop_prob, rescale=True) - else: - return inputs diff --git a/python_module/megengine/module/elemwise.py b/python_module/megengine/module/elemwise.py deleted file mode 100644 index d1947b5e..00000000 --- a/python_module/megengine/module/elemwise.py +++ /dev/null @@ -1,90 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from .. import _internal as mgb -from ..core import Tensor, wrap_io_tensor -from ..core.graph import _use_default_if_none -from .module import Module - - -@wrap_io_tensor -def _elemwise_func(mode, *inputs, **kwargs) -> Tensor: - if all(isinstance(i, (int, float)) for i in inputs): - device, comp_graph = _use_default_if_none(None, None) - ret = mgb.opr.elemwise( - *inputs, mode=mode, comp_node=device, comp_graph=comp_graph, **kwargs - ) - return ret.inferred_value[0] - return mgb.opr.elemwise(*inputs, mode=mode, **kwargs) - - -class Elemwise(Module): - r""" - A :class:`~.Module` to do elemwise operator. Could be replaced with :class:`~.QATModule` - version :class:`~.qat.elemwise.Elemwise` using :func:`~.quantize.quantize_qat`. - - :param method: the elemwise method, support the following string. - It will do the normal elemwise operator for float. - - * "ADD": a + b - * "FUSE_ADD_RELU": max(x+y, 0) - * "MUL": x * y - * "MIN": min(x, y) - * "MAX": max(x, y) - * "SUB": x - y - * "TRUE_DIV": x / y - * "FUSE_ADD_SIGMOID": sigmoid(x + y) - * "FUSE_ADD_TANH": tanh(x + y) - * "RELU": x > 0 ? x : 0 - * "ABS": x > 0 ? x : -x - * "SIGMOID": sigmoid(x) - * "EXP": exp(x) - * "TANH": tanh(x) - * "FUSE_MUL_ADD3": x * y + z - * "FAST_TANH": fast_tanh(x) - * "NEGATE": -x - * "ACOS": acos(x) - * "ASIN": asin(x) - * "CEIL": ceil(x) - * "COS": cos(x) - * "EXPM1": expm1(x) - * "FLOOR": floor(x) - * "LOG": log(x) - * "LOG1P": log1p(x) - * "SIN": sin(x) - * "ROUND": round(x) - * "ERF": erf(x) - * "ERFINV": erfinv(x) - * "ERFC": erfc(x) - * "ERFCINV": erfcinv(x) - * "ABS_GRAD": abs_grad - * "FLOOR_DIV": floor_div - * "MOD": mod - * "SIGMOID_GRAD": sigmoid_grad - * "SWITCH_GT0": switch_gt0 - * "TANH_GRAD": tanh_grad - * "LT": lt - * "LEQ": leq - * "EQ": eq - * "POW": pow - * "LOG_SUM_EXP": log_sum_exp - * "FAST_TANH_GRAD": fast_tanh_grad - * "ATAN2": atan2 - * "COND_LEQ_MOV": cond_leq_mov - * "H_SWISH": h_swish - * "FUSE_ADD_H_SWISH": h_swish(x+y) - * "H_SWISH_GRAD": h_swish_grad - """ - - _elemwise_mode_type = mgb.opr_param_defs.Elemwise.Mode - - def __init__(self, method): - super().__init__() - self.method = self._elemwise_mode_type.convert(method) - - def forward(self, *inps): - return _elemwise_func(self.method, *inps) diff --git a/python_module/megengine/module/embedding.py b/python_module/megengine/module/embedding.py deleted file mode 100644 index 976ac125..00000000 --- a/python_module/megengine/module/embedding.py +++ /dev/null @@ -1,171 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from typing import Optional - -import numpy as np - -from ..core import Parameter -from ..functional import embedding as embedding_func -from . import init -from .module import Module - - -class Embedding(Module): - r""" - A simple lookup table that stores embeddings of a fixed dictionary and size. - - This module is often used to store word embeddings and retrieve them using indices. - The input to the module is a list of indices, and the output is the corresponding word embeddings. - The indices should less than num_embeddings. - - :param num_embeddings: size of embedding dictionary. - :param embedding_dim: size of each embedding vector. - :param padding_idx: should be set to None, not support now. - :param max_norm: should be set to None, not support now. - :param norm_type: should be set to None, not support now. - :param initial_weight: the learnable weights of the module of shape (num_embeddings, embedding_dim). - - Examples: - - .. testcode:: - - import numpy as np - import megengine as mge - import megengine.module as M - weight = mge.tensor(np.array([(1.2,2.3,3.4,4.5,5.6),(0.1,1.1,2.1,3.1,4.1)], dtype=np.float32)) - data = mge.tensor(np.array([(0,1,1),(1,0,1),(0,0,1)], dtype=np.int32)) - - embedding = M.Embedding(2, 5, initial_weight=weight) - output = embedding(data) - with np.printoptions(precision=6): - print(output.numpy()) - - Outputs: - - .. testoutput:: - - [[[1.2 2.3 3.4 4.5 5.6] - [0.1 1.1 2.1 3.1 4.1] - [0.1 1.1 2.1 3.1 4.1]] - - [[0.1 1.1 2.1 3.1 4.1] - [1.2 2.3 3.4 4.5 5.6] - [0.1 1.1 2.1 3.1 4.1]] - - [[1.2 2.3 3.4 4.5 5.6] - [1.2 2.3 3.4 4.5 5.6] - [0.1 1.1 2.1 3.1 4.1]]] - - """ - - def __init__( - self, - num_embeddings: int, - embedding_dim: int, - padding_idx: Optional[int] = None, - max_norm: Optional[float] = None, - norm_type: Optional[float] = None, - initial_weight: Parameter = None, - ): - super().__init__() - if padding_idx is not None: - raise ValueError("Not support padding index now.") - if max_norm is not None or norm_type is not None: - raise ValueError("Not support weight normalize now.") - self.padding_idx = padding_idx - self.max_norm = max_norm - self.norm_type = norm_type - self.num_embeddings = num_embeddings - self.embedding_dim = embedding_dim - if initial_weight is None: - self.weight = Parameter( - np.random.uniform( - size=(self.num_embeddings, self.embedding_dim) - ).astype(np.float32) - ) - self.reset_parameters() - else: - if initial_weight.shape != (num_embeddings, embedding_dim): - raise ValueError( - "The weight shape should match num_embeddings and embedding_dim" - ) - self.weight = Parameter(initial_weight.numpy()) - - def reset_parameters(self) -> None: - init.normal_(self.weight) - - def forward(self, inputs): - return embedding_func(inputs, self.weight) - - @classmethod - def from_pretrained( - cls, - embeddings: Parameter, - freeze: Optional[bool] = True, - padding_idx: Optional[int] = None, - max_norm: Optional[float] = None, - norm_type: Optional[float] = None, - ): - r""" - Creates Embedding instance from given 2-dimensional FloatTensor. - - :param embeddings: Tensor contained weight for the embedding. - :param freeze: If ``True``, the weight does not get updated during the learning process. Default: ``True``. - :param padding_idx: should be set to None, not support Now. - :param max_norm: should be set to None, not support Now. - :param norm_type: should be set to None, not support Now. - - Examples: - - .. testcode:: - - import numpy as np - import megengine as mge - import megengine.module as M - weight = mge.tensor(np.array([(1.2,2.3,3.4,4.5,5.6),(0.1,1.1,2.1,3.1,4.1)], dtype=np.float32)) - data = mge.tensor(np.array([(0,1,1),(1,0,1),(0,0,1)], dtype=np.int32)) - - embedding = M.Embedding.from_pretrained(weight, freeze=False) - output = embedding(data) - print(output.numpy()) - - Outputs: - - .. testoutput:: - - [[[1.2 2.3 3.4 4.5 5.6] - [0.1 1.1 2.1 3.1 4.1] - [0.1 1.1 2.1 3.1 4.1]] - - [[0.1 1.1 2.1 3.1 4.1] - [1.2 2.3 3.4 4.5 5.6] - [0.1 1.1 2.1 3.1 4.1]] - - [[1.2 2.3 3.4 4.5 5.6] - [1.2 2.3 3.4 4.5 5.6] - [0.1 1.1 2.1 3.1 4.1]]] - - - """ - embeddings_shape = embeddings.shape - embeddings_dim = len(embeddings_shape) - if embeddings_dim != 2: - raise ValueError("Embeddings parameter is expected to be 2-dimensional") - rows = embeddings_shape[0] - cols = embeddings_shape[1] - embedding = cls( - num_embeddings=rows, - embedding_dim=cols, - initial_weight=embeddings, - padding_idx=padding_idx, - max_norm=max_norm, - norm_type=norm_type, - ) - embedding.weight.requires_grad = not freeze - return embedding diff --git a/python_module/megengine/module/external.py b/python_module/megengine/module/external.py deleted file mode 100644 index 962754e8..00000000 --- a/python_module/megengine/module/external.py +++ /dev/null @@ -1,83 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import numpy as np - -from ..functional.external import ( - atlas_subgraph, - cambricon_subgraph, - extern_opr_subgraph, -) -from .module import Module - - -class CambriconSubgraph(Module): - r"""Load a serialized Cambricon subgraph. - - See :func:`~.cambricon_subgraph` for more details. - """ - - def __init__( - self, data, symbol, tensor_dim_mutable, - ): - super(CambriconSubgraph, self).__init__() - self._data = data - self.symbol = symbol - self.tensor_dim_mutable = tensor_dim_mutable - - @property - def data(self): - return self._data.tobytes() - - @data.setter - def data(self, val): - self._data = np.frombuffer(val, dtype=np.uint8) - - def forward(self, inputs): - outputs = cambricon_subgraph( - inputs, self._data, self.symbol, self.tensor_dim_mutable, - ) - return outputs - - -class AtlasSubgraph(Module): - r"""Load a serialized Atlas subgraph. - - See :func:`~.atlas_subgraph` for more details. - """ - - def __init__(self, data): - super(AtlasSubgraph, self).__init__() - self._data = data - - @property - def data(self): - return self._data.tobytes() - - @data.setter - def data(self, val): - self._data = np.frombuffer(val, dtype=np.uint8) - - def forward(self, inputs): - outputs = atlas_subgraph(inputs, self._data) - return outputs - - -class ExternOprSubgraph(Module): - r"""Load a serialized extern opr subgraph. - """ - - def __init__(self, data, name, output_shapes): - super(ExternOprSubgraph, self).__init__() - self.data = data - self.name = name - self.output_shapes = output_shapes - - def forward(self, inputs): - outputs = extern_opr_subgraph(inputs, self.output_shapes, self.name, self.data,) - return outputs diff --git a/python_module/megengine/module/identity.py b/python_module/megengine/module/identity.py deleted file mode 100644 index 51b31e50..00000000 --- a/python_module/megengine/module/identity.py +++ /dev/null @@ -1,17 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from ..functional import identity -from .module import Module - - -class Identity(Module): - r"""A placeholder identity operator that will ignore any argument.""" - - def forward(self, x): - return identity(x) diff --git a/python_module/megengine/module/init.py b/python_module/megengine/module/init.py deleted file mode 100644 index 8c39443e..00000000 --- a/python_module/megengine/module/init.py +++ /dev/null @@ -1,264 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import math -from functools import reduce -from typing import Optional, Tuple, Union - -import numpy as np - -from ..core import Graph, Tensor -from ..random import gaussian, uniform - - -def fill_(tensor: Tensor, val: Union[float, int]) -> None: - """Fill the given ``tensor`` with value ``val``. - - :param tensor: An n-dimentional tensor to be initialized - :param val: The value to be filled throughout the tensor - """ - tensor.set_value(np.full(tensor.shape, val, tensor.dtype)) - - -def zeros_(tensor: Tensor) -> None: - """Fill the given ``tensor`` with scalar value `0`. - - :param tensor: An n-dimentional tensor to be initialized - """ - fill_(tensor, 0) - - -def ones_(tensor: Tensor) -> None: - """Fill the given ``tensor`` with the scalar value `1`. - - :param tensor: An n-dimentional tensor to be initialized - """ - fill_(tensor, 1) - - -def uniform_(tensor: Tensor, a: float = 0.0, b: float = 1.0) -> None: - r"""Fill the given ``tensor`` with random value sampled from uniform distribution - :math:`\mathcal{U}(\text{a}, \text{b})`. - - :param tensor: An n-dimentional tensor to be initialized - :param a: Lower bound of the sampling interval - :param b: Upper bound of the sampling interval - """ - with Graph(eager_evaluation=True): - tensor.set_value((b - a) * uniform(tensor.shape) + a) - - -def normal_(tensor: Tensor, mean: float = 0.0, std: float = 1.0) -> None: - r"""Fill the given ``tensor`` with random value sampled from normal distribution - :math:`\mathcal{N}(\text{mean}, \text{std}^2)`. - - :param tensor: An n-dimentional tensor to be initialized - :param mean: The mean of the normal distribution - :param std: The standard deviation of the normal distribution - """ - with Graph(eager_evaluation=True): - tensor.set_value(gaussian(tensor.shape, mean=mean, std=std)) - - -def calculate_gain( - nonlinearity: str, param: Optional[Union[int, float]] = None -) -> float: - r"""Return a recommended gain value (see the table below) for the given nonlinearity - function. - - ================= ==================================================== - nonlinearity gain - ================= ==================================================== - Linear / Identity :math:`1` - Conv{1,2,3}D :math:`1` - Sigmoid :math:`1` - Tanh :math:`\frac{5}{3}` - ReLU :math:`\sqrt{2}` - Leaky Relu :math:`\sqrt{\frac{2}{1 + \text{negative_{slope}}^2}}` - ================= ==================================================== - - :param nonlinearity: Name of the non-linear function - :param param: Optional parameter for leaky_relu. Only effective when - ``nonlinearity`` is "leaky_relu". - - """ - linear_fns = [ - "linear", - "conv1d", - "conv2d", - "conv3d", - "conv_transpose1d", - "conv_transpose2d", - "conv_transpose3d", - ] - if nonlinearity in linear_fns or nonlinearity == "sigmoid": - return 1 - if nonlinearity == "tanh": - return 5.0 / 3 - if nonlinearity == "relu": - return math.sqrt(2.0) - if nonlinearity == "leaky_relu": - if param is None: - negative_slope = 0.01 - elif ( - not isinstance(param, bool) - and isinstance(param, int) - or isinstance(param, float) - ): - # True/False are instances of int, hence check above - negative_slope = param - else: - raise ValueError("negative_slope {} not a valid number".format(param)) - return math.sqrt(2.0 / (1 + negative_slope ** 2)) - raise ValueError("Unsupported nonlinearity {}".format(nonlinearity)) - - -def calculate_fan_in_and_fan_out(tensor: Tensor) -> Tuple[float, float]: - """ - Calculate fan_in / fan_out value for given weight tensor. This function assumes - input tensor is stored in NCHW format. - - :param tensor: Weight tensor in NCHW format - """ - shape = tensor.shape - ndim = len(shape) - if ndim < 2: - raise ValueError( - "fan_in and fan_out can not be computed for tensor with fewer than 2 " - "dimensions" - ) - - if ndim == 2: # Linear - fan_in = shape[1] - fan_out = shape[0] - else: - num_input_fmaps = shape[1] - num_output_fmaps = shape[0] - receptive_field_size = 1 - if ndim > 2: - receptive_field_size = reduce(lambda x, y: x * y, shape[2:], 1) - fan_in = num_input_fmaps * receptive_field_size - fan_out = num_output_fmaps * receptive_field_size - return fan_in, fan_out - - -def calculate_correct_fan(tensor: Tensor, mode: str) -> float: - """ - Calculate fan_in or fan_out value for given weight tensor, depending on given - ``mode``. - - See :func:`calculate_fan_in_and_fan_out` for details. - - :param tensor: Weight tensor in NCHW format - :param mode: ``'fan_in'`` or ``'fan_out'`` - """ - mode = mode.lower() - valid_modes = ["fan_in", "fan_out"] - if mode not in valid_modes: - raise ValueError( - "Mode {} not supported, please use one of {}".format(mode, valid_modes) - ) - - fan_in, fan_out = calculate_fan_in_and_fan_out(tensor) - return fan_in if mode == "fan_in" else fan_out - - -def xavier_uniform_(tensor: Tensor, gain: float = 1.0) -> None: - r"""Fill ``tensor`` with random values sampled from :math:`\mathcal{U}(-a, a)` - where - - .. math:: - a = \text{gain} \times \sqrt{\frac{6}{\text{fan_in} + \text{fan_out}}} - - Also known as Glorot initialization. Detailed information can be retrieved from - `"Understanding the difficulty of training deep feedforward neural networks" `_. - - - :param tensor: An n-dimentional tensor to be initialized - :param gain: Scaling factor for :math:`a`. - """ - fan_in, fan_out = calculate_fan_in_and_fan_out(tensor) - std = gain * math.sqrt(2.0 / float(fan_in + fan_out)) - a = math.sqrt(3.0) * std - uniform_(tensor, -a, a) - - -def xavier_normal_(tensor: Tensor, gain: float = 1.0) -> None: - r"""Fill ``tensor`` with random values sampled from - :math:`\mathcal{N}(0, \text{std}^2)` where - - .. math:: - \text{std} = \text{gain} \times \sqrt{\frac{2}{\text{fan_in} + \text{fan_out}}} - - Also known as Glorot initialization. Detailed information can be retrieved from - `"Understanding the difficulty of training deep feedforward neural networks" `_. - - :param tensor: An n-dimentional tensor to be initialized - :param gain: Scaling factor for :math:`std`. - """ - fan_in, fan_out = calculate_fan_in_and_fan_out(tensor) - std = gain * math.sqrt(2.0 / float(fan_in + fan_out)) - normal_(tensor, 0.0, std) - - -def msra_uniform_( - tensor: Tensor, a: float = 0, mode: str = "fan_in", nonlinearity: str = "leaky_relu" -) -> None: - r"""Fill ``tensor`` wilth random values sampled from - :math:`\mathcal{U}(-\text{bound}, \text{bound})` where - - .. math:: - \text{bound} = \sqrt{\frac{6}{(1 + a^2) \times \text{fan_in}}} - - Detailed information can be retrieved from - `"Delving deep into rectifiers: Surpassing human-level performance on ImageNet - classification" `_. - - - :param tensor: An n-dimentional tensor to be initialized - :param a: Optional parameter for calculating gain for leaky_relu. See - :func:`calculate_gain` for details. - :param mode: ``'fan_in'`` or ``'fan_out'``, used to calculate :math:`gain`, the - scaling factor for :math:`bound`. See :func:`calculate_fan_in_and_fan_out` for - details. - :param nonlinearity: Name of the non-linear function used to calculate :math:`gain`. - See :func:`calculate_gain` for details. - """ - fan = calculate_correct_fan(tensor, mode) - gain = calculate_gain(nonlinearity, a) - std = gain / math.sqrt(fan) - bound = math.sqrt(3.0) * std - uniform_(tensor, -bound, bound) - - -def msra_normal_( - tensor: Tensor, a: float = 0, mode: str = "fan_in", nonlinearity: str = "leaky_relu" -) -> None: - r"""Fill ``tensor`` wilth random values sampled from - :math:`\mathcal{N}(0, \text{std}^2)` where - - .. math:: - \text{std} = \sqrt{\frac{2}{(1 + a^2) \times \text{fan_in}}} - - Detailed information can be retrieved from - `"Delving deep into rectifiers: Surpassing human-level performance on ImageNet - classification" `_. - - :param tensor: An n-dimentional tensor to be initialized - :param a: Optional parameter for calculating gain for leaky_relu. See - :func:`calculate_gain` for details. - :param mode: ``'fan_in'`` or ``'fan_out'``, used to calculate :math:`gain`, the - scaling factor for :math:`gain`. See :func:`calculate_fan_in_and_fan_out` for - details. - :param nonlinearity: Name of the non-linear function used to calculate :math:`gain`. - See :func:`calculate_gain` for details. - """ - fan = calculate_correct_fan(tensor, mode) - gain = calculate_gain(nonlinearity, a) - std = gain / math.sqrt(fan) - normal_(tensor, 0, std) diff --git a/python_module/megengine/module/linear.py b/python_module/megengine/module/linear.py deleted file mode 100644 index 30f8ea82..00000000 --- a/python_module/megengine/module/linear.py +++ /dev/null @@ -1,61 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import numpy as np - -from .. import functional as F -from ..core import Parameter -from . import init -from .module import Module - - -class Linear(Module): - r"""Applies a linear transformation to the input. For instance, if input - is x, then output y is: - - .. math:: - - y = xW^T + b - - where :math:`y_i= \sum_j W_{ij} x_j + b_i` - - :param in_features: size of each input sample. - :param out_features: size of each output sample. - :param bias: If set to ``False``, the layer will not learn an additive bias. - Default: ``True`` - - """ - - def __init__( - self, in_features: int, out_features: int, bias: bool = True, **kwargs - ): - super().__init__(**kwargs) - self.out_features = out_features - self.in_features = in_features - w_shape = (out_features, in_features) - self.weight = Parameter(np.zeros(w_shape, dtype=np.float32)) - self.bias = None - if bias: - b_shape = (out_features,) - self.bias = Parameter(np.zeros(b_shape, dtype=np.float32)) - self.reset_parameters() - - def _get_fanin(self): - return self.in_features - - def reset_parameters(self) -> None: - fanin = self._get_fanin() - std = np.sqrt(1 / fanin) - init.normal_(self.weight, 0.0, std) - if self.bias is not None: - init.zeros_(self.bias) - - def _calc_linear(self, x, weight, bias): - return F.linear(x, weight, bias) - - def forward(self, x): - return self._calc_linear(x, self.weight, self.bias) diff --git a/python_module/megengine/module/module.py b/python_module/megengine/module/module.py deleted file mode 100644 index b999fb12..00000000 --- a/python_module/megengine/module/module.py +++ /dev/null @@ -1,507 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from abc import ABCMeta, abstractmethod -from collections import OrderedDict -from typing import Any, Callable, Iterable, Optional, Set, Tuple, Union - -import numpy as np - -from .._internal.dtype import is_quantize -from ..core import Buffer, Parameter, Tensor -from ..logger import get_logger -from ..utils.hook import HookHandler - -logger = get_logger(__name__) - - -def _expand_structure(key, obj): - if isinstance(obj, (Tensor, Module)): - return [(key, obj)] - elif isinstance(obj, (list, tuple, dict)): - ret = [] - if isinstance(obj, dict): - targets = ((k, obj[k]) for k in sorted(obj)) - else: - targets = ((str(k), v) for k, v in enumerate(obj)) - for k, o in targets: - sub_ret = _expand_structure(k, o) - if sub_ret and not isinstance(k, str): - raise AssertionError( - "keys for Tensor and Module must be str, error key: {}".format(k) - ) - for kt, vt in sub_ret: - ret.extend([(key + "." + kt, vt)]) - return ret - else: - return [] - - -def _is_parameter(obj): - return isinstance(obj, Parameter) - - -def _is_buffer(obj): - return isinstance(obj, Buffer) - - -def _is_module(obj): - return isinstance(obj, Module) - - -class Module(metaclass=ABCMeta): - """Base Module class. - """ - - def __init__(self): - # runtime attributes - self.training = True - self.quantize_disabled = False - - # hooks - self._forward_pre_hooks = OrderedDict() - self._forward_hooks = OrderedDict() - - @abstractmethod - def forward(self, inputs): - pass - - def register_forward_pre_hook(self, hook: Callable) -> HookHandler: - """Register a hook to handle forward inputs. `hook` should be a function - - Note that `inputs` keyword inputs - - :param hook: a function that receive `module` and `inputs`, then return - a modified `inputs` or `None`. - :return: a handler with :meth:`~.HookHandler.remove` interface to delete the hook. - """ - return HookHandler(self._forward_pre_hooks, hook) - - def register_forward_hook(self, hook: Callable) -> HookHandler: - """Register a hook to handle forward results. `hook` should be a function that - receive `module`, `inputs` and `outputs`, then return a modified `outputs` or `None`. - - This method return a handler with :meth:`~.HookHandler.remove` interface to delete the hook. - """ - return HookHandler(self._forward_hooks, hook) - - def __call__(self, *inputs, **kwargs): - for hook in self._forward_pre_hooks.values(): - modified_inputs = hook(self, inputs) - if modified_inputs is not None: - if not isinstance(modified_inputs, tuple): - modified_inputs = (modified_inputs,) - inputs = modified_inputs - - outputs = self.forward(*inputs, **kwargs) - - for hook in self._forward_hooks.values(): - modified_outputs = hook(self, inputs, outputs) - if modified_outputs is not None: - outputs = modified_outputs - return outputs - - def _flatten( - self, - *, - recursive: bool = True, - with_key: bool = False, - with_parent: bool = False, - prefix: Optional[str] = None, - predicate: Callable[[Any], bool] = lambda _: True, - seen: Optional[Set[int]] = None - ) -> Union[Iterable[Any], Iterable[Tuple[str, Any]]]: - """Scans the module object and returns an iterable for the :class:`~.Tensor` - and :class:`~.Module` attributes that agree with the ``predicate``. For multiple - calls of this function with same arguments, the order of objects within the - returned iterable is guaranteed to be identical, as long as all the involved - module objects' ``__dict__`` does not change thoughout those calls. - - :param recursive: Whether to recursively scan all the submodules. - :param with_key: Whether to yield keys along with yielded objects. - :param with_parent: Whether to yield ``self`` along with yielded objects. - :param prefix: The prefix appended to the yielded keys. - :param predicate: The predicate function applied to scanned objects. - :param seen: A dict that records whether a module has been traversed yet. - """ - if seen is None: - seen = set([id(self)]) - - module_dict = vars(self) - _prefix = "" if prefix is None else prefix + "." - - for key in sorted(module_dict): - for expanded_key, leaf in _expand_structure(key, module_dict[key]): - leaf_id = id(leaf) - if leaf_id in seen: - continue - seen.add(leaf_id) - - if predicate(leaf): - if with_key and with_parent: - yield _prefix + expanded_key, leaf, self - elif with_key: - yield _prefix + expanded_key, leaf - elif with_parent: - yield leaf, self - else: - yield leaf - - if recursive and isinstance(leaf, Module): - yield from leaf._flatten( - recursive=recursive, - with_key=with_key, - with_parent=with_parent, - prefix=_prefix + expanded_key if with_key else None, - predicate=predicate, - seen=seen, - ) - - def parameters( - self, requires_grad: Optional[bool] = None, recursive: bool = True, **kwargs - ) -> Iterable[Parameter]: - r"""Returns an iterable for the :class:`~.Parameter` of the module. - - :param requires_grad: Limitation over the :attr:`~.Parameter.requires_grad` - attribute of returned :class:`.Parameter`. ``None`` for no limitation. - :param recursive: If ``True``, returns all :class:`~.Parameter` within this - module, else only returns :class:`~.Parameter` that are direct attributes - of this module. - """ - - def predicate(obj) -> bool: - return _is_parameter(obj) and ( - requires_grad is None or obj.requires_grad == requires_grad - ) - - yield from self._flatten( - with_key=False, predicate=predicate, recursive=recursive, **kwargs - ) - - def named_parameters( - self, - requires_grad: Optional[bool] = None, - prefix: Optional[str] = None, - recursive: bool = True, - **kwargs - ) -> Iterable[Tuple[str, Parameter]]: - """Returns an iterable for key :class:`~.Parameter` pairs of the module, where - ``key`` is the dotted path from this module to the :class:`~.Parameter` . - - :param requires_grad: Limitation over the :attr:`~.Parameter.requires_grad` - attribute of returned :class:`~.Parameter` . ``None`` for no limitation. - :param prefix: The prefix prepended to the keys. - :param recursive: If ``True``, returns all :class:`~.Parameter` within this - module, else only returns :class:`~.Parameter` that are direct attributes - of this module. - """ - - def predicate(obj) -> bool: - return _is_parameter(obj) and ( - requires_grad is None or obj.requires_grad == requires_grad - ) - - yield from self._flatten( - with_key=True, - prefix=prefix, - predicate=predicate, - recursive=recursive, - **kwargs, - ) - - def buffers(self, recursive: bool = True, **kwargs) -> Iterable[Buffer]: - """Returns an iterable for the :class:`~.Buffer` of the module. - - :param recursive: If ``True``, returns all :class:`~.Buffer` within this - module, else only returns :class:`~.Buffer` that are direct attributes - of this module. - """ - yield from self._flatten( - with_key=False, predicate=_is_buffer, recursive=recursive, **kwargs - ) - - def named_buffers( - self, prefix: Optional[str] = None, recursive: bool = True, **kwargs - ) -> Iterable[Tuple[str, Buffer]]: - """Returns an iterable for key :class:`~.Buffer` pairs of the module, where - ``key`` is the dotted path from this module to the :class:`~.Buffer` . - - :param prefix: The prefix prepended to the keys. - :param recursive: If ``True``, returns all :class:`~.Buffer` within this - module, else only returns :class:`~.Buffer` that are direct attributes - of this module. - """ - yield from self._flatten( - with_key=True, - prefix=prefix, - predicate=_is_buffer, - recursive=recursive, - **kwargs, - ) - - def children(self, **kwargs) -> "Iterable[Module]": - """Returns an iterable for all the submodules that are direct attributes of this - module. - """ - yield from self._flatten( - with_key=False, predicate=_is_module, recursive=False, **kwargs - ) - - def named_children(self, **kwargs) -> "Iterable[Tuple[str, Module]]": - """Returns an iterable of key-submodule pairs for all the submodules that are - direct attributes of this module, where 'key' is the attribute name of - submodules. - """ - yield from self._flatten( - with_key=True, predicate=_is_module, recursive=False, **kwargs - ) - - def modules(self, **kwargs) -> "Iterable[Module]": - """Returns an iterable for all the modules within this module, including itself. - """ - if "with_parent" in kwargs and kwargs["with_parent"]: - yield self, None - else: - yield self - yield from self._flatten(with_key=False, predicate=_is_module, **kwargs) - - def named_modules( - self, prefix: Optional[str] = None, **kwargs - ) -> "Iterable[Tuple[str, Module]]": - """Returns an iterable of key-module pairs for all the modules within this - module, including itself, where 'key' is the dotted path from this module to the - submodules. - - :param prefix: The prefix prepended to the path. - """ - if "with_parent" in kwargs and kwargs["with_parent"]: - yield ("" if prefix is None else prefix), self, None - else: - yield ("" if prefix is None else prefix), self - yield from self._flatten( - with_key=True, prefix=prefix, predicate=_is_module, **kwargs - ) - - def apply(self, fn: "Callable[[Module], Any]") -> None: - """Apply function ``fn`` to all the modules within this module, including - itself. - - :param fn: The function to be applied on modules. - """ - for it in self.modules(): - fn(it) - - def zero_grad(self) -> None: - """Set all parameters' grads to zero - """ - for param in self.parameters(): - if param.grad is not None: - param.grad.reset_zero() - - def train(self, mode: bool = True, recursive: bool = True) -> None: - """Set training mode of all the modules within this module (including itself) to - ``mode``. This effectively sets the ``training`` attributes of those modules - to ``mode``, but only has effect on certain modules (e.g. - :class:`~.BatchNorm2d`, :class:`~.Dropout`, :class:`~.Observer`) - - :param mode: the training mode to be set on modules. - :param recursive: whether to recursively call submodules' ``train()``. - """ - if not recursive: - self.training = mode - return - - def fn(module: Module) -> None: - module.train(mode, recursive=False) - - self.apply(fn) - - def eval(self) -> None: - """Set training mode of all the modules within this module (including itself) to - ``False``. See :meth:`~.Module.train` for details. - """ - self.train(False) - - def disable_quantize(self, value=True): - r""" - Set ``module``'s ``quantize_disabled`` attribute and return ``module``. - Could be used as a decorator. - """ - - def fn(module: Module) -> None: - module.quantize_disabled = value - - self.apply(fn) - - def replace_param( - self, params: dict, start_pos: int, seen: Optional[Set[int]] = None - ): - """Replace module's parameters with `params`, used by :class:`~.ParamPack` to - speedup multimachine training. - """ - offset = 0 - if seen is None: - seen = set([id(self)]) - module_dict = vars(self) - for key in sorted(module_dict): - hash_id = id(module_dict[key]) - if hash_id in seen: - continue - seen.add(hash_id) - if isinstance(module_dict[key], Parameter): - if start_pos + offset in params: - assert module_dict[key].shape == params[start_pos + offset].shape - module_dict[key] = params[start_pos + offset] - offset += 1 - if isinstance(module_dict[key], Module): - offset += module_dict[key].replace_param( - params, start_pos + offset, seen - ) - return offset - - def state_dict(self, rst=None, prefix="", keep_var=False): - r"""Returns a dictionary containing whole states of the module. - """ - - def is_state(obj): - return _is_parameter(obj) or _is_buffer(obj) - - if rst is None: - rst = OrderedDict() - - for k, v in self._flatten(recursive=False, with_key=True, predicate=is_state): - assert prefix + k not in rst, "duplicated state: {}".format(k) - if keep_var: - rst[prefix + k] = v - else: - rst[prefix + k] = v.numpy() - - for k, submodule in self._flatten( - recursive=False, - with_key=True, - predicate=lambda obj: isinstance(obj, Module), - ): - submodule.state_dict(rst, prefix + k + ".", keep_var) - - return rst - - def load_state_dict( - self, - state_dict: Union[dict, Callable[[str, Tensor], Optional[np.ndarray]]], - strict=True, - ): - r"""Load a given dictionary created by :func:`state_dict` into this module. - If ``strict`` is ``True``, the keys of :func:`state_dict` must exactly match the keys - returned by :func:`state_dict`. - - Users can also pass a closure: `Function[key: str, var: Tensor] -> Optional[np.ndarray]` - as a `state_dict`, in order to handle complex situations. For example, load everything - except for the final linear classifier: - - .. code-block:: - - state_dict = {...} # Dict[str, np.ndarray] - model.load_state_dict({ - k: None if k.startswith('fc') else v - for k, v in state_dict.items() - }, strict=False) - - Here returning `None` means skipping parameter `k`. - - To prevent shape mismatch (e.g. load PyTorch weights), we can reshape before loading: - - .. code-block:: - - state_dict = {...} - def reshape_accordingly(k, v): - return state_dict[k].reshape(v.shape) - model.load_state_dict(reshape_accordingly) - - We can also perform inplace re-initialization or pruning: - - .. code-block:: - - def reinit_and_pruning(k, v): - if 'bias' in k: - M.init.zero_(v) - if 'conv' in k: - return v.numpy() * (np.abs(v.numpy()) > 1e-3).astype("float32) - model.load_state_dict(reinit_and_pruning, strict=False) - """ - unused = [] - if isinstance(state_dict, dict): - unused = state_dict.keys() - - def closure(k, _): # var unused - return state_dict[k] if k in state_dict else None - - elif callable(state_dict): - closure = state_dict - else: - raise ValueError( - "`state_dict` must load a dict or callable, got {}".format( - type(state_dict) - ) - ) - - loaded, skipped = self._load_state_dict_with_closure(closure) - unused = set(unused) - loaded - - if len(unused) != 0: - if strict: - raise KeyError( - "Unused params violate `strict=True`, unused={}".format(unused) - ) - else: - logger.warning( - "Unused params in `strict=False` mode, unused={}".format(unused) - ) - - if len(skipped) != 0: - if strict: - raise KeyError( - "Missing params violate `strict=True`, missing={}".format(skipped) - ) - else: - logger.warning( - "Missing params in `strict=False` mode, missing={}".format(skipped) - ) - - def _load_state_dict_with_closure(self, closure): - """Advance state_dict load through callable `closure` whose signature is - - `closure(key: str, var: Tensor) -> Union[np.ndarry, None]` - """ - assert callable(closure), "closure must be a function" - - loaded = [] - skipped = [] - - local_state_dict = self.state_dict(keep_var=True) - for k, var in local_state_dict.items(): - to_be_load = closure(k, var) - if to_be_load is None: - skipped.append(k) - continue - assert isinstance( - to_be_load, np.ndarray - ), "closure should return a `np.ndarray`, now `{}` get {}".format( - k, to_be_load - ) - assert ( - var.shape == to_be_load.shape - ), "param `{}` shape mismatch, should be {}, get {}".format( - k, var.shape, to_be_load.shape - ) - # For quantized dtype, the initialized dtype - # scale/zero_points maybe invalid, use pretrained dtype instead. - if is_quantize(to_be_load.dtype) and is_quantize(var.dtype): - var.dtype = to_be_load.dtype - var.set_value(to_be_load) - loaded.append(k) - - return set(loaded), set(skipped) diff --git a/python_module/megengine/module/parampack.py b/python_module/megengine/module/parampack.py deleted file mode 100644 index c020a41d..00000000 --- a/python_module/megengine/module/parampack.py +++ /dev/null @@ -1,157 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import collections -from typing import Callable, Iterable, Optional, Tuple - -import numpy as np - -from .._internal.opr import param_pack_split -from ..core import Parameter, Tensor -from .module import Module - - -class ParamPack(Module): - r"""Pack module's parameters by gathering their memory to continuous address. - Using (device, dtype, requires_grad) as key, for example ('gpu0', float32, True), - parameters with same key will be packed togather. - It helps a lot for multimachine training by speeding up allreduce gradients. - - :param model: the module you want to pack parameters. - :param nr_ignore_first: how many parameters will be unpacked at first. - :param max_size_per_group: upper bound of packed parameters' size in MB. - :param max_nr_params_per_group: upper bound of the number of parameters of each group. - - """ - - def __init__( - self, - model: Module, - nr_ignore_first: int = 8, - max_size_per_group: int = 10, - max_nr_params_per_group: int = 100, - group_func: Callable = lambda name, param: 0, - ): - super().__init__() - self._model = model - self._nr_ignore_first = nr_ignore_first - self._max_size_per_group = max_size_per_group - self._max_nr_params_per_group = max_nr_params_per_group - self._group_func = group_func - self._grouped_params = [] - self._packed_params = [] - - params = model.named_parameters() - self._pack_params(params) - - def parameters(self, requires_grad: Optional[bool] = None) -> Iterable[Parameter]: - for param in self._packed_params: - if requires_grad is None or param.requires_grad == requires_grad: - yield param - - def named_parameters( - self, requires_grad: Optional[bool] = None - ) -> Iterable[Tuple[str, Parameter]]: - for idx, param in enumerate(self._packed_params): - if requires_grad is None or param.requires_grad == requires_grad: - yield "packed_param_" + str(idx), param - - def _pack_params(self, params: Iterable[Tuple[str, Parameter]]): - groups = collections.defaultdict(list) - ignored = 0 - param_id = 0 - for name, param in params: - if self._nr_ignore_first > ignored: - ignored += 1 - self._grouped_params.append([{"shape": param.shape, "id": param_id}]) - param.pack_group_key = self._group_func(name, param) - self._packed_params.append(param) - else: - key = ( - param.dtype, - param.device, - param.requires_grad, - self._group_func(name, param), - ) - groups[key].append({"tensor": param, "id": param_id}) - param_id += 1 - for (dtype, device, requires_grad, group_key) in groups.keys(): - dtype_sz = np.dtype(dtype).itemsize - align = device.mem_align - if align < dtype_sz: - align = 1 - else: - assert align % dtype_sz == 0 - align //= dtype_sz - - group = groups[(dtype, device, requires_grad, group_key)] - while group: - aligned_pos = [] - offset = 0 - params = [] - idx = 0 - while idx < len(group): - param = group[idx] - assert param["tensor"].device == device - padding = (align - (offset & (align - 1))) & (align - 1) - offset += padding - aligned_pos.append(offset) - params.append(param) - offset += int(np.prod(param["tensor"].shape)) - idx += 1 - - if ( - offset * dtype_sz >= self._max_size_per_group * 1024 * 1024 - or idx >= self._max_nr_params_per_group - ): - break - group = group[idx:] - if idx == 1: - # ignore param packs with only one item - params[0]["tensor"].pack_group_key = group_key - self._packed_params.append(params[0]["tensor"]) - self._grouped_params.append( - [{"shape": params[0]["tensor"].shape, "id": params[0]["id"]}] - ) - continue - - packed_value = np.zeros((offset,), dtype=dtype) - for param, pos in zip(params, aligned_pos): - val = param["tensor"].numpy() - packed_value[pos : pos + val.size] = val.flatten() - new_param = Parameter( - value=packed_value, - device=device, - dtype=dtype, - requires_grad=requires_grad, - ) - new_param.pack_group_key = group_key - self._packed_params.append(new_param) - self._grouped_params.append( - [{"shape": i["tensor"].shape, "id": i["id"]} for i in params] - ) - - def forward(self, *args, **kwargs): - replace_param = dict() - for i in range(len(self._packed_params)): - packed_param = self._packed_params[i] - grouped_params = self._grouped_params[i] - if len(grouped_params) == 1: - continue - split = param_pack_split( - packed_param._symvar, [i["shape"] for i in grouped_params] - ) - split = [ - Parameter(Tensor(i, requires_grad=packed_param.requires_grad)) - for i in split - ] - for j in range(len(split)): - replace_param[grouped_params[j]["id"]] = split[j] - self._model.replace_param(replace_param, 0) - - return self._model.forward(*args, **kwargs) diff --git a/python_module/megengine/module/pooling.py b/python_module/megengine/module/pooling.py deleted file mode 100644 index 8126ddc1..00000000 --- a/python_module/megengine/module/pooling.py +++ /dev/null @@ -1,80 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from abc import abstractmethod -from typing import Tuple, Union - -from ..functional import avg_pool2d, max_pool2d -from .module import Module - - -class _PoolNd(Module): - def __init__( - self, - kernel_size: Union[int, Tuple[int, int]], - stride: Union[int, Tuple[int, int]] = None, - padding: Union[int, Tuple[int, int]] = 0, - ): - super(_PoolNd, self).__init__() - self.kernel_size = kernel_size - self.stride = stride or kernel_size - self.padding = padding - - @abstractmethod - def forward(self, inp): - pass - - -class MaxPool2d(_PoolNd): - r"""Applies a 2D max pooling over an input. - - For instance, given an input of the size :math:`(N, C, H, W)` and - :attr:`kernel_size` :math:`(kH, kW)`, this layer generates the output of - the size :math:`(N, C, H_{out}, W_{out})` through a process described as: - - .. math:: - \begin{aligned} - out(N_i, C_j, h, w) ={} & \max_{m=0, \ldots, kH-1} \max_{n=0, \ldots, kW-1} - \text{input}(N_i, C_j, \text{stride[0]} \times h + m, - \text{stride[1]} \times w + n) - \end{aligned} - - If :attr:`padding` is non-zero, then the input is implicitly zero-padded on - both sides for :attr:`padding` number of points. - - :param kernel_size: the size of the window to take a max over. - :param stride: the stride of the window. Default value is ``kernel_size``. - :param padding: implicit zero padding to be added on both sides. - """ - - def forward(self, inp): - return max_pool2d(inp, self.kernel_size, self.stride, self.padding) - - -class AvgPool2d(_PoolNd): - r"""Applies a 2D average pooling over an input. - - For instance, given an input of the size :math:`(N, C, H, W)` and - :attr:`kernel_size` :math:`(kH, kW)`, this layer generates the output of - the size :math:`(N, C, H_{out}, W_{out})` through a process described as: - - .. math:: - - out(N_i, C_j, h, w) = \frac{1}{kH * kW} \sum_{m=0}^{kH-1} \sum_{n=0}^{kW-1} - input(N_i, C_j, stride[0] \times h + m, stride[1] \times w + n) - - If :attr:`padding` is non-zero, then the input is implicitly zero-padded on - both sides for :attr:`padding` number of points. - - :param kernel_size: the size of the window. - :param stride: the stride of the window. Default value is ``kernel_size``. - :param padding: implicit zero padding to be added on both sides. - """ - - def forward(self, inp): - return avg_pool2d(inp, self.kernel_size, self.stride, self.padding) diff --git a/python_module/megengine/module/pytorch/__init__.py b/python_module/megengine/module/pytorch/__init__.py deleted file mode 100644 index 5902d9c3..00000000 --- a/python_module/megengine/module/pytorch/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from .pytorch import PyTorchModule diff --git a/python_module/megengine/module/pytorch/pytorch.py b/python_module/megengine/module/pytorch/pytorch.py deleted file mode 100644 index 81548a50..00000000 --- a/python_module/megengine/module/pytorch/pytorch.py +++ /dev/null @@ -1,451 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import collections -import copy -import functools -import os -from typing import Any, Callable, List, Optional, Tuple - -import torch -from torch.utils.cpp_extension import load as load_torch_extension - -import megengine._internal as mgb -from megengine._internal import CompGraph -from megengine._internal.mgb import CompGraphCallbackValueProxy - -from ...core import Parameter, Tensor, get_default_device -from ..module import Module -from .utils import device_to_torch_device, torch_dtype_to_numpy_dtype - -# A global dict to map opr during graph copy -_copy_dict = {} - - -@functools.lru_cache(None) -def _get_torch_mem_fwd_lib(): - source_file = os.path.join(os.path.dirname(__file__), "torch_mem_fwd.cpp") - return load_torch_extension( - "torch_mem_fwd", - [source_file], - extra_include_paths=[mgb.config.get_include_path()], - ) - - -def inp_mem_fwd(pubapi_dev_tensor_ptr: int) -> torch.Tensor: - """Forward a MegBrain tensor to torch tensor - - :param pubapi_dev_tensor_ptr: pointer to MegBrain tensor - """ - return _get_torch_mem_fwd_lib().inp_mem_fwd(pubapi_dev_tensor_ptr) - - -def oup_mem_fwd( - pubapi_dev_tensor_ptr: int, tensor: torch.Tensor, keep_data_ptr: bool = True -) -> None: - """Forward a torch tensor to a contiguous MegBrain tensor - - :param pubapi_dev_tensor_ptr: Pointer to the MegBrain tensor - :param tensor: The input torch tensor - :param keep_data_ptr: if True, memory copy is not allowed here, - thus the input torch tensor must be contiguous also. - defaults to True - """ - _get_torch_mem_fwd_lib().oup_mem_fwd(pubapi_dev_tensor_ptr, tensor, keep_data_ptr) - - -def torch_param_to_mge( - name: str, param: torch.nn.Parameter, device, comp_graph: CompGraph -) -> Parameter: - """Convert a torch parameter to a megengine parameter - - :param name: parametr name - :param param: torch parameter - :param device: the device on which the megengine parameter is, - should be physically the same as the one on torch parameter - :param comp_graph: the owner graph of megengine parameter - :return: megengine parameter - """ - assert isinstance(param, torch.nn.Parameter) - dtype = torch_dtype_to_numpy_dtype(param.dtype) - mge_param = Parameter(None, dtype=dtype) - shared_nd = mge_param._Tensor__val - oup_mem_fwd(shared_nd.pubapi_dev_tensor_ptr, param.data, True) - return mge_param - - -class _PyTorchSubgraphGradOpr(mgb.craniotome.CraniotomeBase): - __nr_inputs__ = None - __nr_outputs__ = None - __allow_duplicate__ = False - __disable_sys_mem_alloc__ = True - __is_dynamic_output_shape__ = True - _forward_opr = None # type: PyTorchSubgraphImplOpr - _shape_infer_func = None - _condensed_out_grad_idx = None # type: List[Optional[int]] - - _forward_input_cnt = None - _forward_output_cnt = None - _output_grad_cnt = None - _param_cnt = None - - def setup( - self, forward_opr, condensed_out_grad_idx: List[Optional[int]], infer_shape=None - ): - self._forward_opr = forward_opr - self._forward_input_cnt = forward_opr.input_cnt - self._forward_output_cnt = forward_opr.output_cnt - self._param_cnt = forward_opr.param_cnt - self._output_grad_cnt = sum([idx is not None for idx in condensed_out_grad_idx]) - self.__nr_inputs__ = ( - self._forward_input_cnt - + self._param_cnt - + self._forward_output_cnt - + self._output_grad_cnt - ) - self.__nr_outputs__ = self._forward_input_cnt + self._param_cnt - self._forward_opr = forward_opr - self._condensed_out_grad_idx = condensed_out_grad_idx - self._shape_infer_func = infer_shape - if infer_shape is not None: - type(self).__is_dynamic_output_shape__ = False - - def execute( - self, - inputs: Tuple[CompGraphCallbackValueProxy, ...], - outputs: Tuple[mgb.SharedND, ...], - ): - assert self._forward_opr._last_forward_inputs is not None - assert self._forward_opr._last_forward_outputs is not None - if self._forward_opr._last_forward_outputs is None: - self._forward_opr.execute(inputs[: self.__nr_outputs__], None) - - out_grads = [ - inp_mem_fwd(inputs[idx].pubapi_dev_tensor_ptr) if idx else None - for idx in self._condensed_out_grad_idx - ] - - grads = torch.autograd.grad( - self._forward_opr._last_forward_outputs, - self._forward_opr._last_forward_inputs - + self._forward_opr._last_forward_params, - out_grads, # type: ignore - only_inputs=True, - allow_unused=True, - ) - for ovar, oten in zip(outputs, grads): - oup_mem_fwd(ovar.pubapi_dev_tensor_ptr, oten) - - def grad(self, wrt_idx, inputs, outputs, out_grad): - raise NotImplementedError("Apply grad to a grad opr is not supported") - - def infer_shape(self, inp_shapes): - if callable(self._shape_infer_func): - return self._shape_infer_func(inp_shapes) - raise NotImplementedError( - "No shape inference function specified on PyTorchSubgraphImplOpr" - ) - - def copy(self): - - ret = type(self)() - d0 = self.__dict__.copy() - d0.pop("this") - d0.pop("_forward_opr") - - later_copy = self._forward_opr in _copy_dict - if later_copy: - assert len(_copy_dict) == 1 - forward_opr_copy = _copy_dict[self._forward_opr] - else: - forward_opr_copy = self._forward_opr - ret.__dict__["_forward_opr"] = forward_opr_copy - - ret.__dict__.update(copy.deepcopy(d0)) - _copy_dict[self] = ret - if later_copy: - forward_opr_copy._grad_opr = ret - _copy_dict.clear() - - return ret - - -class PyTorchSubgraphImplOpr(mgb.craniotome.CraniotomeBase): - # pylint: disable=abstract-method - """This is a pytorch module wrapper to operator""" - - __nr_inputs__ = None # type: int - __nr_outputs__ = None # type: int - __allow_duplicate__ = False - __disable_sys_mem_alloc__ = True - __is_dynamic_output_shape__ = True - - _grad_opr = None - _func = None # type: Callable[[Any], Any] - input_cnt = None # type: int - output_cnt = None # type: int - param_cnt = None # type: int - _shape_infer_func = None - - _last_forward_inputs = None - _last_forward_outputs = None # type: List[torch.Tensor] - _last_forward_params = None # type: List[torch.Tensor] - - def setup(self, *, input_cnt, output_cnt, func, params, infer_shape=None): - """Setup the operator by accepted kwargs - - :param input_cnt: input count of torch module - :param output_cnt: output count of torch module - :param func: a callable object accept inputs and returns outputs - usually a torch module itself - :param params: parameters of the torch module - :param infer_shape: a callable infers output shapes from input shapes, - defaults to None - """ - param_cnt = len(params) - self.input_cnt = input_cnt - self.output_cnt = output_cnt - self.param_cnt = param_cnt - self.__nr_inputs__ = input_cnt + param_cnt - self.__nr_outputs__ = output_cnt - self._func = func - self._shape_infer_func = infer_shape - if infer_shape is not None: - type(self).__is_dynamic_output_shape__ = False - self._last_forward_params = params - - def execute( - self, - inputs: Tuple[CompGraphCallbackValueProxy, ...], - outputs: Optional[Tuple[mgb.SharedND, ...]], - ): - """execute the operator, read values from *inputs*, - forward them to torch tensor and do execution by self.func - and forward results to outputs - - :param inputs: values for each input var - :param outputs: values for each output var - """ - input_value_proxys = inputs[: self.input_cnt] - - input_torch_tensors = [ - inp_mem_fwd(ivar.pubapi_dev_tensor_ptr).requires_grad_() - for ivar in input_value_proxys - ] - - output_torch_tensors = self._func(*input_torch_tensors) - - if isinstance(output_torch_tensors, torch.Tensor): - output_torch_tensors = [output_torch_tensors] - - # `execute` may be called in _PyTorchSubgraphGradOp with None as outputs - if outputs: - for ovar, oten in zip(outputs, output_torch_tensors): - oup_mem_fwd(ovar.pubapi_dev_tensor_ptr, oten) - - # Retain input / output tensors for backward - self._last_forward_inputs = input_torch_tensors - self._last_forward_outputs = output_torch_tensors - - def grad( - self, - wrt_idx, - inputs: Tuple[mgb.SymbolVar, ...], - outputs: Tuple[mgb.SymbolVar, ...], - out_grads: Tuple[mgb.SymbolVar, ...], - ): - """generate a grad opr which calculates grad by torch.autograd.grad and cache it - - :param wrt_idx: the input var with respect to which the gradient should - be computed - :param inputs: operator inputs - :param outputs: operator outputs - :param out_grads: gradients of each output var - :return: an initialized grad opr - """ - if self._grad_opr is None: - condensed_out_grad = [] - condensed_out_grad_idx = [] # type: List[Optional[int]] - idx = self.__nr_inputs__ + len(outputs) - for out_grad in out_grads: - if out_grad is None: - condensed_out_grad_idx.append(None) - else: - condensed_out_grad.append(out_grad) - condensed_out_grad_idx.append(idx) - idx += 1 - self._grad_opr = _PyTorchSubgraphGradOpr.make( - *(inputs + outputs + tuple(condensed_out_grad)), - forward_opr=self, - condensed_out_grad_idx=condensed_out_grad_idx, - ) - return self._grad_opr - - def infer_shape(self, inp_shapes): - """infer output shape from input shapes - - :param inp_shapes: input shapes as tuple - :return: output shapes - """ - if callable(self._shape_infer_func): - return self._shape_infer_func(inp_shapes) - raise NotImplementedError( - "No shape inference function specified on PyTorchSubgraphImplOpr" - ) - - def copy(self): - ret = type(self)() - d0 = self.__dict__.copy() - d0.pop("this") - - ret.__dict__["_last_forward_inputs"] = d0.pop("_last_forward_inputs") - ret.__dict__["_last_forward_outputs"] = d0.pop("_last_forward_outputs") - ret.__dict__["_last_forward_params"] = d0.pop("_last_forward_params") - ret.__dict__["_func"] = d0.pop("_func") - - d0.pop("_grad_opr") - later_copy = self._grad_opr in _copy_dict - if later_copy: - assert len(_copy_dict) == 1 - grad_opr_copy = _copy_dict[self._grad_opr] - else: - grad_opr_copy = self._grad_opr - ret.__dict__["_grad_opr"] = grad_opr_copy - - ret.__dict__.update(copy.deepcopy(d0)) - _copy_dict[self] = ret - if later_copy: - grad_opr_copy._forward_opr = ret - _copy_dict.clear() - - return ret - - -class PyTorchModule(Module): - """Wrap a pytorch module as megengine module - - :param torch_module: torch module to be wrapped - :param device: target device this module would be in - :param output_cnt: output count of this module - :param input_shape: input shape inferrer - :param comp_graph: target comp_graph on which this module would be in - """ - - __torch_module = None # type: torch.nn.Module - __output_cnt = None - __infer_shape = None - __comp_graph = None - __device = None - _torch_params = None - _param_inputs = None - _name_param_list = None # type: List[Tuple[str, Parameter]] - - def __init__( - self, - torch_module, - device=None, - output_cnt=1, - *, - infer_shape=None, - comp_graph=None - ): - super().__init__() - if not isinstance(torch_module, torch.nn.Module): - raise TypeError( - "torch_module should either be an instance of torch.nn.Module " - "or its subclass" - ) - self.__torch_module = torch_module - - if not isinstance(output_cnt, int): - raise TypeError("output_cnt must be int") - if output_cnt <= 0: - raise ValueError("output_cnt must be greater than zero") - self.__output_cnt = output_cnt - - if infer_shape and not callable(infer_shape): - raise TypeError("infer_shape should either be None or a callable object") - self.__infer_shape = infer_shape - - if comp_graph and not isinstance(comp_graph, mgb.CompGraph): - raise TypeError("comp_graph shoud eighter be None or a mgb.CompGraph") - self.__comp_graph = comp_graph - - self._torch_params = [] - self._param_inputs = [] - self._name_param_list = [] - - if device is None: - device = get_default_device() - - if isinstance(device, str): - device = mgb.comp_node(device) - self.device = device - - def init_params(self): - """forward torch parameters to megengine parameters and store, - would be called in constructor and setter of device - """ - self._torch_params = [] - self._param_inputs = [] - self._name_param_list = [] - - for name, torch_param in self.__torch_module.named_parameters(recurse=True): - formated_name = "_torch_{}_{}".format(id(self.__torch_module), name) - mge_param = torch_param_to_mge( - formated_name, torch_param, self.device, self.__comp_graph - ) - self._param_inputs.append(mge_param) - self._torch_params.append(torch_param) - self._name_param_list.append((name, mge_param)) - - def get_param_by_name(self, param_name: str) -> Parameter: - """find parameter by its name - - :param param_name: name of parameter - :return: the parameter - """ - for name, param in self._name_param_list: - if param_name == name: - return param - raise KeyError("Cannot find param: {}".format(param_name)) - - def forward(self, *inputs): - """apply the module on given inputs - - :return: output vars - """ - param_inputs = [param._symvar for param in self._param_inputs] - - inputs = [tensor._symvar for tensor in list(inputs)] + param_inputs - - out = PyTorchSubgraphImplOpr.make( - *inputs, - input_cnt=len(inputs) - len(param_inputs), - output_cnt=self.__output_cnt, - func=self.__torch_module.forward, - params=self._torch_params, - infer_shape=self.__infer_shape, - ) - if isinstance(out, mgb.SymbolVar): - return Tensor(out) - assert isinstance(out, collections.Iterable) - return [Tensor(sym) for sym in out] - - def get_device(self): - """get the device this module belongs to""" - return self.__device - - def set_device(self, device: mgb.CompNode): - """set the device and move torch module to corresponding device""" - touch_device = device_to_torch_device(device) - self.__torch_module.to(device=touch_device) - self.__device = device - self.init_params() - - device = property(get_device, set_device) diff --git a/python_module/megengine/module/pytorch/torch_mem_fwd.cpp b/python_module/megengine/module/pytorch/torch_mem_fwd.cpp deleted file mode 100644 index dfcbe8f3..00000000 --- a/python_module/megengine/module/pytorch/torch_mem_fwd.cpp +++ /dev/null @@ -1,148 +0,0 @@ -/** - * \file python_module/megengine/module/pytorch/torch_mem_fwd.cpp - * MegEngine is Licensed under the Apache License, Version 2.0 (the "License") - * - * Copyright (c) 2014-2020 Megvii Inc. All rights reserved. - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - */ -#include "torch/extension.h" -#include "megbrain_pubapi.h" - -using MGBTensor = mgb::pubapi::DeviceTensor; - -torch::Tensor mgb_to_torch(const MGBTensor *src) { - - mgb::pubapi::CallbackOnce deleter; - void* tensor_raw_ptr; - src->forward_to(&tensor_raw_ptr, &deleter); - auto deleter_wrap = [deleter](void*) mutable { - deleter.consume(); - }; - - // TODO: support non-contiguous layout - std::vector sizes; - for (size_t i = 0; i < src->desc.ndim; ++ i) { - sizes.push_back(src->desc.shape[i]); - } - - torch::TensorOptions options; - switch (src->desc.dtype) { -#define map_dtype(mgb_dtype, torch_dtype) \ - case MGBTensor::DataType::mgb_dtype: \ - options = options.dtype(caffe2::TypeMeta::Make()); \ - break; - map_dtype(FLOAT32, float); - map_dtype(FLOAT16, torch::Half); - map_dtype(INT32, int); - map_dtype(INT16, int16_t); - map_dtype(INT8, int8_t); - map_dtype(UINT8, uint8_t); -#undef map_dtype - default: - throw std::runtime_error("bad case for data type."); - } - - // TODO: Maybe we should impl copy on different devices? - switch (src->desc.type) { - case MGBTensor::Type::CUDA: { - int device_id = src->desc.cuda_ctx.device; - if (device_id >= 0) { - options = options.device(torch::DeviceType::CUDA, device_id); - } else { - throw std::runtime_error("bad case for device(cuda) id."); - } - // TODO: consider cuda synchronization here - // Maybe all tasks issued on cuda_ctx(device, stream) should be done? - break; - } - case MGBTensor::Type::CPU: - options = options.device(torch::DeviceType::CPU); - // Torch's API are all synchronous. - src->sync(); - break; - default: - throw std::runtime_error("bad case for device type."); - } - - auto tensor = torch::from_blob(tensor_raw_ptr, sizes, deleter_wrap, options); - return tensor; -} - -void torch_to_mgb(MGBTensor* dst, torch::Tensor src) { - MGBTensor::Desc desc; - - desc.dev_ptr = src.data_ptr(); - - // src is contiguous torch tensor here, so no strides needed - std::vector shape; - // desc.shape is the pointer to a size array used to construct - // an inner-mgb tensor, which should be valid until calling of - // forward_other_memory return - for (auto &&i : src.sizes()) { - shape.push_back(i); - } - desc.shape = shape.data(); - desc.ndim = shape.size(); - - switch (src.scalar_type()) { -#define map_dtype(mgb_dtype, torch_dtype) \ - case torch::ScalarType::torch_dtype: \ - desc.dtype = MGBTensor::DataType::mgb_dtype; \ - break; - map_dtype(FLOAT32, Float); - map_dtype(FLOAT16, Half); - map_dtype(INT32, Int); - map_dtype(INT16, Short); - map_dtype(INT8, Char); - map_dtype(UINT8, Byte); -#undef map_dtype - default: - throw std::runtime_error("bad case for data type."); - } - - // TODO: cuda setting and synchronization like mgb_to_torch - if (src.device().type() == torch::DeviceType::CUDA) { - desc.type = MGBTensor::Type::CUDA; - desc.cuda_ctx.device = src.get_device(); - desc.cuda_ctx.stream = nullptr; - } else { - assert(src.device().type() == torch::DeviceType::CPU); - desc.type = MGBTensor::Type::CUDA; - } - - mgb::pubapi::CallbackOnce deleter; - deleter.user_data = new torch::Tensor(src); - deleter.fptr = [](void* ptr) { - delete static_cast(ptr); - }; - dst->forward_other_memory(desc, deleter); -} - -torch::Tensor inp_mem_fwd(uintptr_t dv_ptr) { - // construct torch Tensor from mgb DeviceTensor stored in dv_ptr. - return mgb_to_torch(reinterpret_cast(dv_ptr)); -} - -void oup_mem_fwd(uintptr_t dv_ptr, torch::Tensor src, - bool keep_data_ptr=false) { - // forward storage in torch Tensor to mgb DeviceTensor - // keep_data_ptr: set to True to ensure forwarding data_ptr under \p src - // to megbrain, or it maybe copy src to a new contiguous tensor storage. - - // which would return src itself if tensor is contiguous - auto src_contig = src.contiguous(); - - if (keep_data_ptr && src_contig.data_ptr() != src.data_ptr()) { - throw std::runtime_error("should keep tensor data ptr, but it changed"); - } - torch_to_mgb(reinterpret_cast(dv_ptr), src_contig); -} - -PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { - m.def("inp_mem_fwd", &inp_mem_fwd, "Forward mgb DeviceTensor ptr into torch Tensor as network input."); - m.def("oup_mem_fwd", &oup_mem_fwd, "Forward torch network Tensor to corresponding mgb VarNode.", - py::arg("dv_ptr"), py::arg("src"), py::arg("keep_data_ptr") = false); -} diff --git a/python_module/megengine/module/pytorch/utils.py b/python_module/megengine/module/pytorch/utils.py deleted file mode 100644 index fea87bfb..00000000 --- a/python_module/megengine/module/pytorch/utils.py +++ /dev/null @@ -1,67 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import numpy as np -import torch - -import megengine._internal as mgb - -_TORCH_NUMPY_MAPPING = { - torch.float16: np.float16, - torch.float32: np.float32, - torch.float64: np.float64, - torch.int8: np.int8, - torch.int16: np.int16, - torch.int32: np.int32, -} - - -def torch_dtype_to_numpy_dtype(torch_dtype: torch.dtype): - """map torch dtype to numpy dtype - - :param torch_dtype: torch dtype - :return: numpy dtype - """ - if not isinstance(torch_dtype, torch.dtype): - raise TypeError("Argument `torch_dtype` should be an instance of torch.dtype") - if torch_dtype not in _TORCH_NUMPY_MAPPING: - raise ValueError("Unknown PyTorch dtype: {}".format(torch_dtype)) - return _TORCH_NUMPY_MAPPING[torch_dtype] - - -def torch_device_to_device(device: torch.device): - """map torch device to device - - :param device: torch device - :return: device - """ - if not isinstance(device, torch.device): - raise TypeError("Argument `device` should be an instance of torch.device") - index = device.index - if index is None: - index = "x" - if device.type == "cpu": - return "cpu{}".format(index) - elif device.type == "cuda": - return "gpu{}".format(index) - raise ValueError("Unknown PyTorch device: {}".format(device)) - - -def device_to_torch_device(device: mgb.CompNode): - """map device to torch device - - :param device: megbrain compute node - :return: corresponding torch device - """ - t, d, _ = device.locator_physical - if t == "CUDA": - return torch.device("cuda", d) - elif t == "CPU": - return torch.device("cpu", d) - else: - raise Exception("Unsupported device type: {}".format(t)) diff --git a/python_module/megengine/module/qat/__init__.py b/python_module/megengine/module/qat/__init__.py deleted file mode 100644 index b6adab4d..00000000 --- a/python_module/megengine/module/qat/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from .concat import Concat -from .conv import Conv2d, ConvRelu2d -from .conv_bn import ConvBn2d, ConvBnRelu2d -from .elemwise import Elemwise -from .linear import Linear -from .module import QATModule -from .quant_dequant import DequantStub, QuantStub diff --git a/python_module/megengine/module/qat/concat.py b/python_module/megengine/module/qat/concat.py deleted file mode 100644 index 893b1ad0..00000000 --- a/python_module/megengine/module/qat/concat.py +++ /dev/null @@ -1,30 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from typing import Iterable - -from ...core.tensor import Tensor -from .. import concat as Float -from .module import QATModule - - -class Concat(Float.Concat, QATModule): - r""" - A :class:`~.QATModule` to do functional concat with QAT support. - Could be applied with :class:`~.Observer` and :class:`~.FakeQuantize`. - """ - - def forward(self, inps: Iterable[Tensor], axis: int = 0): - return self.apply_quant_activation(super().forward(inps, axis)) - - @classmethod - def from_float_module(cls, float_module): - r""" - Return a :class:`~.QATModule` instance converted from - a float :class:`~.Module` instance. - """ - return cls() diff --git a/python_module/megengine/module/qat/conv.py b/python_module/megengine/module/qat/conv.py deleted file mode 100644 index 315da839..00000000 --- a/python_module/megengine/module/qat/conv.py +++ /dev/null @@ -1,59 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from ... import functional as F -from ...quantization.utils import fake_quant_bias -from .. import conv as Float -from .module import QATModule - - -class Conv2d(Float.Conv2d, QATModule): - r""" - A :class:`~.QATModule` Conv2d with QAT support. - Could be applied with :class:`~.Observer` and :class:`~.FakeQuantize`. - """ - - def calc_conv_qat(self, inp): - w_qat = self.apply_quant_weight(self.weight) - b_qat = fake_quant_bias(self.bias, inp, w_qat) - conv = self.calc_conv(inp, w_qat, b_qat) - return conv - - @classmethod - def from_float_module(cls, float_module: Float.Conv2d): - r""" - Return a :class:`~.QATModule` instance converted from - a float :class:`~.Module` instance. - """ - qat_module = cls( - float_module.in_channels, - float_module.out_channels, - float_module.kernel_size, - float_module.stride, - float_module.padding, - float_module.dilation, - float_module.groups, - float_module.bias is not None, - float_module.conv_mode.name, - float_module.compute_mode.name, - ) - qat_module.weight = float_module.weight - qat_module.bias = float_module.bias - return qat_module - - def forward(self, inp): - return self.apply_quant_activation(self.calc_conv_qat(inp)) - - -class ConvRelu2d(Conv2d): - r""" - A :class:`~.QATModule` include Conv2d and Relu with QAT support. - Could be applied with :class:`~.Observer` and :class:`~.FakeQuantize`. - """ - - def forward(self, inp): - return self.apply_quant_activation(F.relu(self.calc_conv_qat(inp))) diff --git a/python_module/megengine/module/qat/conv_bn.py b/python_module/megengine/module/qat/conv_bn.py deleted file mode 100644 index 9ed6ebab..00000000 --- a/python_module/megengine/module/qat/conv_bn.py +++ /dev/null @@ -1,196 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from ...core import ones, zeros -from ...functional import add_update, relu, sqrt, sum, zero_grad -from ...quantization.utils import fake_quant_bias -from .. import conv_bn as Float -from .module import QATModule - - -class _ConvBnActivation2d(Float._ConvBnActivation2d, QATModule): - def get_batch_mean_var(self, inp): - def _sum_channel(inp, axis=0, keepdims=True): - if isinstance(axis, int): - out = sum(inp, axis=axis, keepdims=keepdims) - elif isinstance(axis, tuple): - for idx, elem in enumerate(axis): - out = sum(inp if idx == 0 else out, axis=elem, keepdims=keepdims) - return out - - sum1 = _sum_channel(inp, (0, 2, 3)) - sum2 = _sum_channel(inp ** 2, (0, 2, 3)) - reduce_size = inp.shapeof().prod() / inp.shapeof(1) - batch_mean = sum1 / reduce_size - batch_var = (sum2 - sum1 ** 2 / reduce_size) / reduce_size - return batch_mean, batch_var - - def fold_weight_bias(self, bn_mean, bn_var): - # get fold bn conv param - # bn_istd = 1 / bn_std - # w_fold = gamma / bn_std * W - # b_fold = gamma * (b - bn_mean) / bn_std + beta - gamma = self.bn.weight - if gamma is None: - gamma = ones((self.bn.num_features), dtype="float32") - gamma = gamma.reshape(1, -1, 1, 1) - beta = self.bn.bias - if beta is None: - beta = zeros((self.bn.num_features), dtype="float32") - beta = beta.reshape(1, -1, 1, 1) - - if bn_mean is None: - bn_mean = zeros((1, self.bn.num_features, 1, 1), dtype="float32") - if bn_var is None: - bn_var = ones((1, self.bn.num_features, 1, 1), dtype="float32") - - conv_bias = self.conv.bias - if conv_bias is None: - conv_bias = zeros(self.conv._infer_bias_shape(), dtype="float32") - - bn_istd = 1.0 / sqrt(bn_var + self.bn.eps) - # bn_istd = 1 / bn_std - # w_fold = gamma / bn_std * W - scale_factor = gamma * bn_istd - if self.conv.groups == 1: - w_fold = self.conv.weight * scale_factor.reshape(-1, 1, 1, 1) - else: - w_fold = self.conv.weight * scale_factor.reshape( - self.conv.groups, -1, 1, 1, 1 - ) - - w_fold = self.apply_quant_weight(w_fold) - # b_fold = gamma * (b - bn_mean) / bn_std + beta - b_fold = beta + gamma * (conv_bias - bn_mean) * bn_istd - return w_fold, b_fold - - def update_running_mean_and_running_var( - self, bn_mean, bn_var, num_elements_per_channel - ): - # update running mean and running var. no grad, use unbiased bn var - bn_mean = zero_grad(bn_mean) - bn_var = ( - zero_grad(bn_var) - * num_elements_per_channel - / (num_elements_per_channel - 1) - ) - exponential_average_factor = 1 - self.bn.momentum - add_update( - self.bn.running_mean, - delta=bn_mean, - alpha=1 - exponential_average_factor, - beta=exponential_average_factor, - ) - add_update( - self.bn.running_var, - delta=bn_var, - alpha=1 - exponential_average_factor, - beta=exponential_average_factor, - ) - - def calc_conv_bn_qat(self, inp, approx=True): - if self.training and not approx: - conv = self.conv(inp) - bn_mean, bn_var = self.get_batch_mean_var(conv) - num_elements_per_channel = conv.shapeof().prod() / conv.shapeof(1) - self.update_running_mean_and_running_var( - bn_mean, bn_var, num_elements_per_channel - ) - else: - bn_mean, bn_var = self.bn.running_mean, self.bn.running_var - - # get gamma and beta in BatchNorm - gamma = self.bn.weight - if gamma is None: - gamma = ones((self.bn.num_features), dtype="float32") - gamma = gamma.reshape(1, -1, 1, 1) - beta = self.bn.bias - if beta is None: - beta = zeros((self.bn.num_features), dtype="float32") - beta = beta.reshape(1, -1, 1, 1) - # conv_bias - conv_bias = self.conv.bias - if conv_bias is None: - conv_bias = zeros(self.conv._infer_bias_shape(), dtype="float32") - - bn_istd = 1.0 / sqrt(bn_var + self.bn.eps) - # bn_istd = 1 / bn_std - # w_fold = gamma / bn_std * W - scale_factor = gamma * bn_istd - if self.conv.groups == 1: - w_fold = self.conv.weight * scale_factor.reshape(-1, 1, 1, 1) - else: - w_fold = self.conv.weight * scale_factor.reshape( - self.conv.groups, -1, 1, 1, 1 - ) - b_fold = None - if not (self.training and approx): - # b_fold = gamma * (conv_bias - bn_mean) / bn_std + beta - b_fold = beta + gamma * (conv_bias - bn_mean) * bn_istd - - w_qat = self.apply_quant_weight(w_fold) - b_qat = fake_quant_bias(b_fold, inp, w_qat) - conv = self.conv.calc_conv(inp, w_qat, b_qat) - if not (self.training and approx): - return conv - - # rescale conv to get original conv output - orig_conv = conv / scale_factor.reshape(1, -1, 1, 1) - if self.conv.bias is not None: - orig_conv = orig_conv + self.conv.bias - # calculate batch norm - bn_mean, bn_var = self.get_batch_mean_var(orig_conv) - bn_istd = 1.0 / sqrt(bn_var + self.bn.eps) - conv = gamma * bn_istd * (orig_conv - bn_mean) + beta - num_elements_per_channel = conv.shapeof().prod() / conv.shapeof(1) - self.update_running_mean_and_running_var( - bn_mean, bn_var, num_elements_per_channel - ) - return conv - - @classmethod - def from_float_module(cls, float_module: Float._ConvBnActivation2d): - r""" - Return a :class:`~.QATModule` instance converted from - a float :class:`~.Module` instance. - """ - qat_module = cls( - float_module.conv.in_channels, - float_module.conv.out_channels, - float_module.conv.kernel_size, - float_module.conv.stride, - float_module.conv.padding, - float_module.conv.dilation, - float_module.conv.groups, - float_module.conv.bias is not None, - float_module.conv.conv_mode.name, - float_module.conv.compute_mode.name, - ) - qat_module.conv.weight = float_module.conv.weight - qat_module.conv.bias = float_module.conv.bias - qat_module.bn = float_module.bn - return qat_module - - -class ConvBn2d(_ConvBnActivation2d): - r""" - A fused :class:`~.QATModule` including Conv2d, BatchNorm2d with QAT support. - Could be applied with :class:`~.Observer` and :class:`~.FakeQuantize`. - """ - - def forward(self, inp): - return self.apply_quant_activation(self.calc_conv_bn_qat(inp)) - - -class ConvBnRelu2d(_ConvBnActivation2d): - r""" - A fused :class:`~.QATModule` including Conv2d, BatchNorm2d and relu with QAT support. - Could be applied with :class:`~.Observer` and :class:`~.FakeQuantize`. - """ - - def forward(self, inp): - return self.apply_quant_activation(relu(self.calc_conv_bn_qat(inp))) diff --git a/python_module/megengine/module/qat/elemwise.py b/python_module/megengine/module/qat/elemwise.py deleted file mode 100644 index f99583bd..00000000 --- a/python_module/megengine/module/qat/elemwise.py +++ /dev/null @@ -1,31 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from .. import elemwise as Float -from .module import QATModule - - -class Elemwise(Float.Elemwise, QATModule): - r""" - A :class:`~.QATModule` to do elemwise operator with QAT support. - Could be applied with :class:`~.Observer` and :class:`~.FakeQuantize`. - - :param method: the elemwise method, see :class:`~.module.elemwise.Elemwise` for detail. - """ - - with_weight = False - - def forward(self, *inps): - return self.apply_quant_activation(super().forward(*inps)) - - @classmethod - def from_float_module(cls, float_module: Float.Elemwise): - r""" - Return a :class:`~.QATModule` instance converted from - a float :class:`~.Module` instance. - """ - return cls(float_module.method.name) diff --git a/python_module/megengine/module/qat/linear.py b/python_module/megengine/module/qat/linear.py deleted file mode 100644 index 4067d51c..00000000 --- a/python_module/megengine/module/qat/linear.py +++ /dev/null @@ -1,39 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from ...quantization.utils import fake_quant_bias -from .. import linear as Float -from .module import QATModule - - -class Linear(Float.Linear, QATModule): - r""" - A :class:`~.QATModule` version of :class:`~.module.linear.Linear`. - Could be applied with :class:`~.Observer` and :class:`~.FakeQuantize`. - - :param in_features: size of each input sample. - :param out_features: size of each output sample. - :param bias: If set to ``False``, the layer will not learn an additive bias. - Default: ``True`` - - """ - - def forward(self, x): - w_qat = self.apply_quant_weight(self.weight) - b_qat = fake_quant_bias(self.bias, x, w_qat) - return self.apply_quant_activation(self._calc_linear(x, w_qat, b_qat)) - - @classmethod - def from_float_module(cls, float_module: Float.Linear): - r""" - Return a :class:`~.QATModule` instance converted from - a float :class:`~.Module` instance. - """ - qmod = cls(float_module.in_features, float_module.out_features) - qmod.weight = float_module.weight - qmod.bias = float_module.bias - return qmod diff --git a/python_module/megengine/module/qat/module.py b/python_module/megengine/module/qat/module.py deleted file mode 100644 index c7cb80cb..00000000 --- a/python_module/megengine/module/qat/module.py +++ /dev/null @@ -1,154 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from abc import abstractmethod - -from ...core import Tensor -from ...quantization import FakeQuantize, Observer, QConfig -from ..module import Module - - -class QATModule(Module): - r""" - Base class of quantized-float related Module, basically for QAT and Calibration. - - Use :meth:`~.QATModule.from_float_module` to generate a instance from float :class:`~.Module`. - Or use :func:`~.quantize.quantize_qat` to do it recursively and automatically. - - Can also be converted to :class:`~.QuantizedModule` for deployment using - :func:`~.quantize.quantize` further. - """ - - with_weight = True - with_act = True - - def __init__(self): - super().__init__() - - self.weight_observer = None # type: Observer - self.act_observer = None # type: Observer - - self.weight_fake_quant = None # type: FakeQuantize - self.act_fake_quant = None # type: FakeQuantize - - def set_qconfig(self, qconfig: QConfig): - r""" - Set quantization related configs with ``qconfig``, including - observer and fake_quant for weight and activation. - """ - - def safe_call(func): - return func() if func is not None else None - - if self.with_act: - self.act_observer = safe_call(qconfig.act_observer) - self.act_fake_quant = safe_call(qconfig.act_fake_quant) - if self.with_weight: - self.weight_observer = safe_call(qconfig.weight_observer) - self.weight_fake_quant = safe_call(qconfig.weight_fake_quant) - - def _enable_exec(self, with_module, func, enable): - if not with_module or not func: - return - if enable: - func.enable() - else: - func.disable() - - def set_fake_quant(self, enable): - self._enable_exec(self.with_act, self.act_fake_quant, enable) - self._enable_exec(self.with_weight, self.weight_fake_quant, enable) - - def set_observer(self, enable): - self._enable_exec(self.with_act, self.act_observer, enable) - self._enable_exec(self.with_weight, self.weight_observer, enable) - - def _apply_fakequant_with_observer( - self, target: Tensor, fake_quant: FakeQuantize, observer: Observer - ): - # do observer - if observer is None: - oup = target - q_dict = None - else: - oup = observer(target) - q_dict = observer.get_qparams() - # do fake quant - if fake_quant is not None: - oup = fake_quant(oup, q_dict) - # use qparams of fake_quant if have. - if hasattr(fake_quant, "get_qparams"): - q_dict = fake_quant.get_qparams() - # set to tensor qparams. - if q_dict is not None: - oup.q_dict.update(q_dict) - return oup - - def apply_quant_weight(self, target: Tensor): - r""" - Apply weight's observer and fake_quant from ``qconfig`` on ``target``. - """ - return self._apply_fakequant_with_observer( - target, self.weight_fake_quant, self.weight_observer - ) - - def apply_quant_activation(self, target: Tensor): - r""" - Apply weight's observer and fake_quant from ``qconfig`` on ``target``. - """ - return self._apply_fakequant_with_observer( - target, self.act_fake_quant, self.act_observer - ) - - def _get_method_result( - self, method: str, fake_quant: FakeQuantize, observer: Observer - ): - if hasattr(fake_quant, method): - return getattr(fake_quant, method)() - elif hasattr(observer, method): - return getattr(observer, method)() - return None - - def get_weight_dtype(self): - r""" - Get weight's quantization dtype as the method from ``qconfig``. - """ - return self._get_method_result( - "get_dtype", self.weight_fake_quant, self.weight_observer - ) - - def get_activation_dtype(self): - r""" - Get activation's quantization dtype as the method from ``qconfig``. - """ - return self._get_method_result( - "get_dtype", self.act_fake_quant, self.act_observer - ) - - def get_weight_qparams(self): - r""" - Get weight's quantization parameters. - """ - return self._get_method_result( - "get_qparams", self.weight_fake_quant, self.weight_observer - ) - - def get_activation_qparams(self): - r""" - Get activation's quantization parameters. - """ - return self._get_method_result( - "get_qparams", self.act_fake_quant, self.act_observer - ) - - @classmethod - @abstractmethod - def from_float_module(cls, float_module: Module): - r""" - Return a :class:`~.QATModule` instance converted from - a float :class:`~.Module` instance. - """ diff --git a/python_module/megengine/module/qat/quant_dequant.py b/python_module/megengine/module/qat/quant_dequant.py deleted file mode 100644 index 0baa3e1c..00000000 --- a/python_module/megengine/module/qat/quant_dequant.py +++ /dev/null @@ -1,50 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from .. import quant_dequant as Float -from .module import QATModule - - -class QuantStub(Float.QuantStub, QATModule): - r""" - A helper QATModule simply return input, but will quantize - input after converted to :class:`~.QuantizedModule`. - """ - - with_weight = False - - def forward(self, inp): - return self.apply_quant_activation(inp) - - @classmethod - def from_float_module(cls, float_module: Float.QuantStub): - r""" - Return a :class:`~.QATModule` instance converted from - a float :class:`~.Module` instance. - """ - return cls() - - -class DequantStub(Float.DequantStub, QATModule): - r""" - A helper QATModule simply return input, but will de-quantize - input after converted to :class:`~.QuantizedModule`. - """ - - with_weight = False - with_act = False - - def forward(self, inp): - return inp - - @classmethod - def from_float_module(cls, float_module: Float.DequantStub): - r""" - Return a :class:`~.QATModule` instance converted from - a float :class:`~.Module` instance. - """ - return cls() diff --git a/python_module/megengine/module/quant_dequant.py b/python_module/megengine/module/quant_dequant.py deleted file mode 100644 index aaf2b0cc..00000000 --- a/python_module/megengine/module/quant_dequant.py +++ /dev/null @@ -1,28 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from .module import Module - - -class QuantStub(Module): - r""" - A helper :class:`~.Module` simply returning input. Could be replaced with :class:`~.QATModule` - version :class:`~.qat.QuantStub` using :func:`~.quantize.quantize_qat`. - """ - - def forward(self, inp): - return inp - - -class DequantStub(Module): - r""" - A helper :class:`~.Module` simply returning input. Could be replaced with :class:`~.QATModule` - version :class:`~.qat.DequantStub` using :func:`~.quantize.quantize_qat`. - """ - - def forward(self, inp): - return inp diff --git a/python_module/megengine/module/quantized/__init__.py b/python_module/megengine/module/quantized/__init__.py deleted file mode 100644 index e641476d..00000000 --- a/python_module/megengine/module/quantized/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from .concat import Concat -from .conv import Conv2d, ConvRelu2d -from .conv_bn import ConvBn2d, ConvBnRelu2d -from .elemwise import Elemwise -from .linear import Linear -from .module import QuantizedModule -from .quant_dequant import DequantStub, QuantStub diff --git a/python_module/megengine/module/quantized/concat.py b/python_module/megengine/module/quantized/concat.py deleted file mode 100644 index f9ef05d9..00000000 --- a/python_module/megengine/module/quantized/concat.py +++ /dev/null @@ -1,35 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from typing import Iterable - -from ... import functional as F -from ...core.tensor import Tensor -from ..qat import concat as QAT -from .module import QuantizedModule - - -class Concat(QuantizedModule): - r""" - A :class:`~.QuantizedModule` to do quantized concat, inference only. - """ - - def __init__(self, dtype=None): - super().__init__() - self.output_dtype = dtype - - def forward(self, inps: Iterable[Tensor], axis: int = 0): - new_inps = (x.astype(self.output_dtype) for x in inps) - return F.concat(new_inps, axis) - - @classmethod - def from_qat_module(cls, qat_module: QAT.Concat): - r""" - return a :class:`~.QuantizedModule` instance converted from a - :class:`~.QATModule` instance. - """ - return cls(qat_module.get_activation_dtype()) diff --git a/python_module/megengine/module/quantized/conv.py b/python_module/megengine/module/quantized/conv.py deleted file mode 100644 index 3118451d..00000000 --- a/python_module/megengine/module/quantized/conv.py +++ /dev/null @@ -1,108 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from typing import Tuple, Union - -import numpy as np - -import megengine._internal as mgb - -from ... import module as Float -from ...core import Parameter -from ...functional import conv_bias_activation -from ..qat import conv as QAT -from .module import QuantizedModule - - -class Conv2d(Float.Conv2d, QuantizedModule): - r"""quantized version of :class:`~.qat.conv.Conv2d`.""" - r"""Applies a 2D convolution over an quantized input tensor, inference only. - - The parameter is same with :class: `~.Conv2d` - """ - - def __init__( - self, - in_channels: int, - out_channels: int, - kernel_size: Union[int, Tuple[int, int]], - stride: Union[int, Tuple[int, int]] = 1, - padding: Union[int, Tuple[int, int]] = 0, - dilation: Union[int, Tuple[int, int]] = 1, - groups: int = 1, - conv_mode: str = "CROSS_CORRELATION", - compute_mode: str = "DEFAULT", - dtype=None, - ): - super().__init__( - in_channels, - out_channels, - kernel_size, - stride, - padding, - dilation, - groups, - True, - conv_mode, - compute_mode, - ) - self.output_dtype = dtype - - def calc_conv_quantized(self, inp, nonlinear_mode="IDENTITY"): - inp_scale = mgb.dtype.get_scale(inp.dtype) - w_scale = mgb.dtype.get_scale(self.weight.dtype) - bias_scale = inp_scale * w_scale - return conv_bias_activation( - inp, - self.weight, - self.bias.astype(mgb.dtype.qint32(bias_scale)), - self.output_dtype, - self.stride, - self.padding, - self.dilation, - self.groups, - conv_mode=self.conv_mode, - compute_mode=self.compute_mode, - nonlinear_mode=nonlinear_mode, - ) - - @classmethod - def from_qat_module(cls, qat_module: QAT.Conv2d): - r""" - return a :class:`~.QuantizedModule` instance converted from a - :class:`~.QATModule` instance. - """ - output_dtype = qat_module.get_activation_dtype() - qconv = cls( - qat_module.in_channels, - qat_module.out_channels, - qat_module.kernel_size, - qat_module.stride, - qat_module.padding, - qat_module.dilation, - qat_module.groups, - dtype=output_dtype, - ) - weight = qat_module.weight.astype(qat_module.get_weight_dtype()) - qconv.weight = Parameter(weight.numpy()) - if qat_module.bias is not None: - qconv.bias = Parameter(qat_module.bias.numpy()) - else: - qconv.bias = Parameter( - np.zeros(qat_module._infer_bias_shape(), dtype=np.float32) - ) - return qconv - - def forward(self, inp): - return self.calc_conv_quantized(inp, nonlinear_mode="IDENTITY") - - -class ConvRelu2d(Conv2d): - r"""quantized version of :class:`~.qat.conv.ConvRelu2d`.""" - - def forward(self, inp): - return self.calc_conv_quantized(inp, nonlinear_mode="RELU") diff --git a/python_module/megengine/module/quantized/conv_bn.py b/python_module/megengine/module/quantized/conv_bn.py deleted file mode 100644 index ceb36d13..00000000 --- a/python_module/megengine/module/quantized/conv_bn.py +++ /dev/null @@ -1,56 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from ...core import Parameter -from ..qat import conv_bn as QAT -from .conv import Conv2d - - -class _ConvBnActivation2d(Conv2d): - r"""Applies a 2D convolution over an quantized input tensor, inference only. - - The parameter is same with :class: `~.Conv2d` - """ - - @classmethod - def from_qat_module(cls, qat_module: QAT._ConvBnActivation2d): - r""" - return a :class:`~.QuantizedModule` instance converted from a - :class:`~.QATModule` instance. - """ - output_dtype = qat_module.get_activation_dtype() - qconv = cls( - qat_module.conv.in_channels, - qat_module.conv.out_channels, - qat_module.conv.kernel_size, - qat_module.conv.stride, - qat_module.conv.padding, - qat_module.conv.dilation, - qat_module.conv.groups, - dtype=output_dtype, - ) - w_fold, b_fold = qat_module.fold_weight_bias( - qat_module.bn.running_mean, qat_module.bn.running_var - ) - weight = w_fold.astype(qat_module.get_weight_dtype()) - qconv.weight = Parameter(weight.numpy()) - qconv.bias = Parameter(b_fold.numpy()) - return qconv - - -class ConvBn2d(_ConvBnActivation2d): - r"""quantized version of :class:`~.qat.conv_bn.ConvBn2d`.""" - - def forward(self, inp): - return self.calc_conv_quantized(inp, nonlinear_mode="IDENTITY") - - -class ConvBnRelu2d(_ConvBnActivation2d): - r"""quantized version of :class:`~.qat.conv_bn.ConvBnRelu2d`.""" - - def forward(self, inp): - return self.calc_conv_quantized(inp, nonlinear_mode="RELU") diff --git a/python_module/megengine/module/quantized/elemwise.py b/python_module/megengine/module/quantized/elemwise.py deleted file mode 100644 index db04ed65..00000000 --- a/python_module/megengine/module/quantized/elemwise.py +++ /dev/null @@ -1,47 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from ... import _internal as mgb -from ...core import Tensor, wrap_io_tensor -from ...core.graph import _use_default_if_none -from ..qat import elemwise as QAT -from .module import QuantizedModule - - -@wrap_io_tensor -def _elemwise_multi_type(mode, *inputs, **kwargs) -> Tensor: - if all(isinstance(i, (int, float)) for i in inputs): - device, comp_graph = _use_default_if_none(None, None) - ret = mgb.opr.elemwise_multi_type( - *inputs, mode=mode, comp_node=device, comp_graph=comp_graph, **kwargs, - ) - return ret.inferred_value[0] - return mgb.opr.elemwise_multi_type(*inputs, mode=mode, **kwargs) - - -class Elemwise(QuantizedModule): - r"""quantized version of :class:`~.qat.elemwise.Elemwise`.""" - - _elemwise_multi_type_mode = mgb.opr_param_defs.ElemwiseMultiType.Mode - - def __init__(self, method, dtype=None): - super().__init__() - self.method = self._elemwise_multi_type_mode.convert("Q" + method) - self.output_dtype = dtype - - def forward(self, *inps): - if self.training: - raise ValueError("quantized module only support inference.") - return _elemwise_multi_type(self.method, *inps, dtype=self.output_dtype) - - @classmethod - def from_qat_module(cls, qat_module: QAT.Elemwise): - r""" - return a :class:`~.QuantizedModule` instance converted from a - :class:`~.QATModule` instance. - """ - return cls(qat_module.method.name, qat_module.get_activation_dtype()) diff --git a/python_module/megengine/module/quantized/linear.py b/python_module/megengine/module/quantized/linear.py deleted file mode 100644 index a6e61a6e..00000000 --- a/python_module/megengine/module/quantized/linear.py +++ /dev/null @@ -1,55 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import numpy as np - -import megengine._internal as mgb - -from ... import functional as F -from ...core import Parameter -from ..qat import linear as QAT -from .module import QuantizedModule - - -class Linear(QuantizedModule): - r"""quantized version of :class:`~.qat.linear.Linear`.""" - - def __init__( - self, dtype: np.dtype = None, - ): - super().__init__() - self.weight = None - self.bias = None - self.output_dtype = dtype - - def forward(self, inp): - if self.training: - raise ValueError("quantized module only support inference.") - inp_scale = mgb.dtype.get_scale(inp.dtype) - w_scale = mgb.dtype.get_scale(self.weight.dtype) - bias_dtype = mgb.dtype.qint32(inp_scale * w_scale) - ret = F.linear( - inp, - self.weight, - None if self.bias is None else self.bias.astype(bias_dtype), - ) - ret = ret if self.output_dtype is None else ret.astype(self.output_dtype) - return ret - - @classmethod - def from_qat_module(cls, qat_module: QAT.Linear): - r""" - return a :class:`~.QuantizedModule` instance converted from a - :class:`~.QATModule` instance. - """ - output_dtype = qat_module.get_activation_dtype() - qmod = cls(dtype=output_dtype) - weight = qat_module.weight.astype(qat_module.get_weight_dtype()) - qmod.weight = Parameter(weight.numpy()) - if qat_module.bias is not None: - qmod.bias = Parameter(qat_module.bias.numpy()) - return qmod diff --git a/python_module/megengine/module/quantized/module.py b/python_module/megengine/module/quantized/module.py deleted file mode 100644 index 4fccdbfa..00000000 --- a/python_module/megengine/module/quantized/module.py +++ /dev/null @@ -1,31 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from abc import abstractmethod - -from ..module import Module -from ..qat import QATModule - - -class QuantizedModule(Module): - r""" - Base class of quantized Module, which should be converted from QATModule - and not support traning. - """ - - def __call__(self, *inputs, **kwargs): - if self.training: - raise ValueError("quantized module only support inference.") - return super().__call__(*inputs, **kwargs) - - @classmethod - @abstractmethod - def from_qat_module(cls, qat_module: QATModule): - r""" - return a :class:`~.QuantizedModule` instance converted from a - :class:`~.QATModule` instance. - """ diff --git a/python_module/megengine/module/quantized/quant_dequant.py b/python_module/megengine/module/quantized/quant_dequant.py deleted file mode 100644 index 0c245011..00000000 --- a/python_module/megengine/module/quantized/quant_dequant.py +++ /dev/null @@ -1,49 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from ..qat import quant_dequant as QAT -from .module import QuantizedModule - - -class QuantStub(QuantizedModule): - r""" - quantized version of :class:`~.qat.quant_dequant.QuantStub`, - will convert input to quantized dtype. - """ - - def __init__(self, dtype=None): - super().__init__() - self.output_dtype = dtype - - def forward(self, inp): - return inp.astype(self.output_dtype) - - @classmethod - def from_qat_module(cls, qat_module: QAT.QuantStub): - r""" - return a :class:`~.QuantizedModule` instance converted from a - :class:`~.QATModule` instance. - """ - return cls(qat_module.get_activation_dtype()) - - -class DequantStub(QuantizedModule): - r""" - quantized version of :class:`~.qat.quant_dequant.DequantStub`, - will restore quantized input to float32 dtype. - """ - - def forward(self, inp): - return inp.astype("float32") - - @classmethod - def from_qat_module(cls, qat_module: QAT.DequantStub): - r""" - return a :class:`~.QuantizedModule` instance converted from a - :class:`~.QATModule` instance. - """ - return cls() diff --git a/python_module/megengine/module/sequential.py b/python_module/megengine/module/sequential.py deleted file mode 100644 index 01291e98..00000000 --- a/python_module/megengine/module/sequential.py +++ /dev/null @@ -1,97 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from collections import OrderedDict - -from .module import Module - - -class Sequential(Module): - r"""A sequential container. - Modules will be added to it in the order they are passed in the constructor. - Alternatively, an ordered dict of modules can also be passed in. - - To make it easier to understand, here is a small example: - - .. testcode:: - from collections import OrderedDict - import numpy as np - import megengine.functional as F - from megengine.module import Sequential, Linear - from megengine import tensor - - batch_size = 64 - data = tensor(np.zeros((batch_size, 1, 28, 28)), dtype=np.float32) - label = tensor(np.zeros(batch_size,), dtype=np.int32) - - data = data.reshape(batch_size, -1) - - net0 = Sequential( - Linear(28 * 28, 320), - Linear(320, 10) - ) - - pred0 = net0(data) - - modules = OrderedDict() - modules["fc0"] = Linear(28 * 28, 320) - modules["fc1"] = Linear(320, 10) - net1 = Sequential(modules) - - pred1 = net1(data) - """ - - def __init__(self, *args): - super().__init__() - self.layer_keys = [] - if len(args) == 1 and isinstance(args[0], OrderedDict): - for key, module in args[0].items(): - # self.add_module(key, module) - setattr(self, key, module) - self.layer_keys.append(key) - else: - for idx, module in enumerate(args): - # self.add_module(str(idx), module) - setattr(self, str(idx), module) - self.layer_keys.append(str(idx)) - - def __getitem__(self, idx): - if isinstance(idx, slice): - return self.__class__( - OrderedDict(zip(self.layer_keys[idx], self.layer_values[idx])) - ) - else: - return getattr(self, self.layer_keys[idx]) - - def __setitem__(self, idx, module): - key = self.layer_keys[idx] - return setattr(self, key, module) - - def __delitem__(self, idx): - if isinstance(idx, slice): - for key in self.layer_keys[idx]: - delattr(self, key) - del self.layer_keys[idx] - else: - delattr(self, self.layer_keys[idx]) - del self.layer_keys[idx] - - def __len__(self): - return len(self.layer_keys) - - def __iter__(self): - return iter(self.layer_values) - - @property - def layer_values(self): - return [getattr(self, key) for key in self.layer_keys] - - def forward(self, inp): - for layer in self.layer_values: - inp = layer(inp) - return inp diff --git a/python_module/megengine/optimizer/__init__.py b/python_module/megengine/optimizer/__init__.py deleted file mode 100644 index ad783e06..00000000 --- a/python_module/megengine/optimizer/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from .adadelta import Adadelta -from .adagrad import Adagrad -from .adam import Adam -from .lr_scheduler import LRScheduler -from .multi_step_lr import MultiStepLR -from .optimizer import Optimizer -from .sgd import SGD diff --git a/python_module/megengine/optimizer/adadelta.py b/python_module/megengine/optimizer/adadelta.py deleted file mode 100644 index 7d793608..00000000 --- a/python_module/megengine/optimizer/adadelta.py +++ /dev/null @@ -1,78 +0,0 @@ -from typing import Iterable, Union - -import numpy as np - -from ..core import Buffer, Parameter -from ..functional import sqrt -from .internal import add_update_fastpath as add_update -from .optimizer import Optimizer - - -class Adadelta(Optimizer): - r"""Implements Adadelta algorithm. - - It has been proposed in `"ADADELTA: An Adaptive Learning Rate Method" `_. - - :param params: iterable of parameters to optimize or dicts defining - parameter groups. - :param lr: coefficient that scale delta before it is applied - to the parameters (default: 1.0). - :param rho: coefficient used for computing a running average - of squared gradients (default: 0.9). - :param eps: term added to the denominator to improve - numerical stability (default: 1e-6). - :param weight_decay: weight decay (L2 penalty) (default: 0). - """ - - def __init__( - self, - params: Union[Iterable[Parameter], dict], - lr: float = 1.0, - rho: float = 0.9, - eps: float = 1e-6, - weight_decay: float = 0.0, - ): - assert lr >= 0.0, "Invalid learning rate: {}".format(lr) - assert rho >= 0.0 and rho <= 1.0, "Invalid rho value: {}".format(rho) - assert eps >= 0.0, "Invalid epsilon value: {}".format(eps) - assert weight_decay >= 0.0, "Invalid weight_decay value: {}".format( - weight_decay - ) - - defaults = dict(lr=lr, rho=rho, eps=eps, weight_decay=weight_decay) - super().__init__(params, defaults) - - def _create_state(self, param_group): - for param in param_group["params"]: - self._add_state(param, "square_avg") - self._add_state(param, "acc_delta") - self._add_state(param, "step", initializer=0.0) - - def _updates(self, param_group): - lr = param_group["lr"] - weight_decay = param_group["weight_decay"] - rho = param_group["rho"] - eps = param_group["eps"] - - for param in param_group["params"]: - if not isinstance(param.grad, Buffer): - raise TypeError( - "grad must be a Buffer, maybe you forget to call backward()?" - ) - - if not param.requires_grad: - continue - - step = self._state[param]["step"] - step = add_update(step, 1) - grad = param.grad - if weight_decay != 0.0: - grad = add_update(grad, param, beta=weight_decay) - - square_avg = self._state[param]["square_avg"] - acc_delta = self._state[param]["acc_delta"] - square_avg = add_update(square_avg, grad ** 2, alpha=rho, beta=1 - rho) - std = sqrt(square_avg + eps) - delta = sqrt(acc_delta + eps) / std * grad - add_update(param, delta, beta=-lr) - acc_delta = add_update(acc_delta, delta ** 2, alpha=rho, beta=1 - rho) diff --git a/python_module/megengine/optimizer/adagrad.py b/python_module/megengine/optimizer/adagrad.py deleted file mode 100644 index 4683fa10..00000000 --- a/python_module/megengine/optimizer/adagrad.py +++ /dev/null @@ -1,75 +0,0 @@ -from typing import Iterable, Union - -import numpy as np - -from ..core import Buffer, Parameter -from ..functional import sqrt -from .internal import add_update_fastpath as add_update -from .optimizer import Optimizer - - -class Adagrad(Optimizer): - r"""Implements Adagrad algorithm. - - It has been proposed in `"Adaptive Subgradient Methods for Online Learning - and Stochastic Optimization" `_. - - :param params: iterable of parameters to optimize or dicts defining - parameter groups. - :param lr: coefficient that scale delta before it is applied - to the parameters (default: 1e-2). - :param lr_decay: learning rate decay (default: 0) - :param eps: term added to the denominator to improve - numerical stability (default: 1e-10). - :param weight_decay: weight decay (L2 penalty) (default: 0). - """ - - def __init__( - self, - params: Union[Iterable[Parameter], dict], - lr: float = 1e-2, - lr_decay: float = 0.0, - eps: float = 1e-10, - weight_decay: float = 0.0, - ): - assert lr >= 0.0, "Invalid learning rate: {}".format(lr) - assert lr_decay >= 0, "Invalid learning rate decay: {}".format(lr_decay) - assert eps >= 0.0, "Invalid epsilon value: {}".format(eps) - assert weight_decay >= 0.0, "Invalid weight_decay value: {}".format( - weight_decay - ) - - defaults = dict(lr=lr, lr_decay=lr_decay, eps=eps, weight_decay=weight_decay) - super().__init__(params, defaults) - - def _create_state(self, param_group): - for param in param_group["params"]: - self._add_state(param, "square_avg") - self._add_state(param, "step", initializer=0.0) - - def _updates(self, param_group): - lr = param_group["lr"] - lr_decay = param_group["lr_decay"] - weight_decay = param_group["weight_decay"] - eps = param_group["eps"] - - for param in param_group["params"]: - if not isinstance(param.grad, Buffer): - raise TypeError( - "grad must be a Buffer, maybe you forget to call backward()?" - ) - - if not param.requires_grad: - continue - - step = self._state[param]["step"] - step = add_update(step, 1) - grad = param.grad - if weight_decay != 0.0: - grad = add_update(grad, param, beta=weight_decay) - - square_avg = self._state[param]["square_avg"] - square_avg = add_update(square_avg, grad ** 2) - delta = grad / sqrt(square_avg + eps) - clr = lr / (1 + (step - 1) * lr_decay) - add_update(param, delta, beta=-clr) diff --git a/python_module/megengine/optimizer/adam.py b/python_module/megengine/optimizer/adam.py deleted file mode 100644 index 6f264d3b..00000000 --- a/python_module/megengine/optimizer/adam.py +++ /dev/null @@ -1,86 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from typing import Iterable, Tuple, Union - -from ..core import Buffer, Parameter -from .internal import add_update_fastpath as add_update -from .optimizer import Optimizer - - -class Adam(Optimizer): - r"""Implements Adam algorithm proposed in `"Adam: A Method for Stochastic Optimization" `_. - - :param params: iterable of parameters to optimize or dicts defining - parameter groups. - :param lr: learning rate. - :param betas: coefficients used for computing running averages of gradient - and its square. Default: (0.9, 0.999) - :param eps: term added to the denominator to improve numerical stability - Default: 1e-8 - :param weight_decay: weight decay (L2 penalty). Default: 0 - """ - - def __init__( - self, - params: Union[Iterable[Parameter], dict], - lr: float, - betas: Tuple[float, float] = (0.9, 0.999), - eps: float = 1e-8, - weight_decay: float = 0.0, - ): - if lr < 0.0: - raise ValueError("Invalid learning rate: {}".format(lr)) - if weight_decay < 0.0: - raise ValueError("Invalid weight_decay value: {}".format(weight_decay)) - if not 0.0 <= betas[0] < 1.0: - raise ValueError("Invalid beta parameter at index 0: {}".format(betas[0])) - if not 0.0 <= betas[1] < 1.0: - raise ValueError("Invalid beta parameter at index 1: {}".format(betas[1])) - - defaults = dict(lr=lr, weight_decay=weight_decay, betas=betas, eps=eps) - super().__init__(params, defaults) - - def _create_state(self, param_group): - for param in param_group["params"]: - self._add_state(param, "exp_avg") - self._add_state(param, "exp_avg_sq") - self._add_state(param, "step", initializer=0.0) - - def _updates(self, param_group): - lr = param_group["lr"] - weight_decay = param_group["weight_decay"] - eps = param_group["eps"] - beta0, beta1 = param_group["betas"] - - for param in param_group["params"]: - if not param.requires_grad: - continue - - step = self._state[param]["step"] - step = add_update(step, 1) - if not isinstance(param.grad, Buffer): - raise TypeError( - "grad must be a Buffer, maybe you forget to call backward()?" - ) - grad = param.grad - if weight_decay != 0.0: - grad = add_update(grad, param, beta=weight_decay) - exp_avg = self._state[param]["exp_avg"] - exp_avg_sq = self._state[param]["exp_avg_sq"] - exp_avg = add_update(exp_avg, grad, alpha=beta0, beta=1 - beta0) - exp_avg_sq = add_update( - exp_avg_sq, grad * grad, alpha=beta1, beta=1 - beta1 - ) - add_update( - param, - exp_avg - / (1 - beta0 ** step) - / (exp_avg_sq.sqrt() / (1 - beta1 ** step).sqrt() + eps), - beta=-lr, - ) diff --git a/python_module/megengine/optimizer/internal.py b/python_module/megengine/optimizer/internal.py deleted file mode 100644 index 0483af9a..00000000 --- a/python_module/megengine/optimizer/internal.py +++ /dev/null @@ -1,51 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from typing import Union - -import megengine._internal as mgb - -from ..core.tensor import Tensor, tensor - - -def add_update_fastpath( - dest: Tensor, - delta: Tensor, - *, - alpha: Union[Tensor, float, int] = 1.0, - beta: Union[Tensor, float, int] = 1.0, - bias: Union[Tensor, float, int] = 0.0 -): - """a fast-path ONLY used to update parameters in optimizer, since it - would bypass computing graph and launch dnn/add_update kernel directly, - it is more efficient than functional/add_update. - """ - - if isinstance(beta, Tensor) or isinstance(alpha, Tensor): - delta *= beta - beta = 1.0 - if isinstance(alpha, Tensor): - delta += (alpha - 1.0) * dest - alpha = 1.0 - if isinstance(bias, Tensor): - delta += bias - bias = 0.0 - - if not isinstance(delta, Tensor): - delta = tensor(delta, device=dest.device, dtype=dest.dtype) - - def get_v(x): - if x._Tensor__val is None: - assert isinstance(x._Tensor__sym, mgb.SymbolVar) - return x._Tensor__sym.eager_val - else: - assert isinstance(x._Tensor__val, mgb.SharedND) - return x._Tensor__val - - mgb.mgb._add_update_fastpath(get_v(dest), get_v(delta), alpha, beta, bias) - return dest diff --git a/python_module/megengine/optimizer/lr_scheduler.py b/python_module/megengine/optimizer/lr_scheduler.py deleted file mode 100644 index 7cdb6d9b..00000000 --- a/python_module/megengine/optimizer/lr_scheduler.py +++ /dev/null @@ -1,65 +0,0 @@ -from abc import ABCMeta - -from .optimizer import Optimizer - - -class LRScheduler(metaclass=ABCMeta): - r"""Base class for all learning rate based schedulers. - - :param optimizer: Wrapped optimizer. - :param current_epoch: The index of current epoch. Default: -1 - """ - - def __init__( # pylint: disable=too-many-branches - self, optimizer: Optimizer, current_epoch: int = -1 - ): - if not isinstance(optimizer, Optimizer): - raise TypeError( - "optimizer argument given to the lr_scheduler should be Optimizer" - ) - self.optimizer = optimizer - self.current_epoch = current_epoch - if current_epoch == -1: - for group in self.optimizer.param_groups: - group.setdefault("initial_lr", group["lr"]) - else: - for i, group in enumerate(optimizer.param_groups): - if "initial_lr" not in group: - raise KeyError( - "param 'initial_lr' is not specified in " - "param_groups[{}] when resuming an optimizer".format(i) - ) - self.base_lrs = list( - map(lambda group: group["initial_lr"], self.optimizer.param_groups) - ) - - self.step() - - def state_dict(self): - r"""Returns the state of the scheduler as a :class:`dict`. - It contains an entry for every variable in self.__dict__ which - is not the optimizer. - """ - raise NotImplementedError - - def load_state_dict(self, state_dict): - r"""Loads the schedulers state. - - :param state_dict (dict): scheduler state. - """ - raise NotImplementedError - - def get_lr(self): - r""" Compute current learning rate for the scheduler. - """ - raise NotImplementedError - - def step(self, epoch=None): - if epoch is None: - self.current_epoch += 1 - else: - self.current_epoch = epoch - - values = self.get_lr() - for param_group, lr in zip(self.optimizer.param_groups, values): - param_group["lr"] = lr diff --git a/python_module/megengine/optimizer/multi_step_lr.py b/python_module/megengine/optimizer/multi_step_lr.py deleted file mode 100644 index e6ac5ca0..00000000 --- a/python_module/megengine/optimizer/multi_step_lr.py +++ /dev/null @@ -1,67 +0,0 @@ -from bisect import bisect_right -from typing import Iterable as Iter - -from .lr_scheduler import LRScheduler -from .optimizer import Optimizer - - -class MultiStepLR(LRScheduler): - r"""Decays the learning rate of each parameter group by gamma once the - number of epoch reaches one of the milestones. - - :param optimizer: Wrapped optimizer. - :param milestones (list): List of epoch indices. Must be increasing. - :param gamma (float): Multiplicative factor of learning rate decay. Default: 0.1. - :param current_epoch: The index of current epoch. Default: -1. - """ - - def __init__( - self, - optimizer: Optimizer, - milestones: Iter[int], - gamma: float = 0.1, - current_epoch: int = -1, - ): - if not list(milestones) == sorted(milestones): - raise ValueError( - "Milestones should be a list of increasing integers. Got {}".format( - milestones - ) - ) - - self.milestones = milestones - self.gamma = gamma - super().__init__(optimizer, current_epoch) - - def state_dict(self): - r"""Returns the state of the scheduler as a :class:`dict`. - It contains an entry for every variable in self.__dict__ which - is not the optimizer. - """ - return { - key: value - for key, value in self.__dict__.items() - if key in ["milestones", "gamma", "current_epoch"] - } - - def load_state_dict(self, state_dict): - r"""Loads the schedulers state. - - :param state_dict (dict): scheduler state. - """ - tmp_dict = {} - for key in ["milestones", "gamma", "current_epoch"]: - if not key in state_dict.keys(): - raise KeyError( - "key '{}'' is not specified in " - "state_dict when loading state dict".format(key) - ) - tmp_dict[key] = state_dict[key] - - self.__dict__.update(tmp_dict) - - def get_lr(self): - return [ - base_lr * self.gamma ** bisect_right(self.milestones, self.current_epoch) - for base_lr in self.base_lrs - ] diff --git a/python_module/megengine/optimizer/optimizer.py b/python_module/megengine/optimizer/optimizer.py deleted file mode 100644 index 2596d26a..00000000 --- a/python_module/megengine/optimizer/optimizer.py +++ /dev/null @@ -1,307 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from abc import ABCMeta, abstractmethod -from collections import Iterable -from typing import Dict -from typing import Iterable as Iter -from typing import Union - -import numpy as np - -from .._internal.config import opr_priority_scope -from ..core import Buffer, Parameter, Tensor, TensorDict -from ..core.graph import get_default_graph -from ..distributed import ( - all_reduce_sum, - bcast_param, - get_rank, - get_world_size, - is_distributed, -) -from ..distributed.util import get_group_id -from ..functional import add_update -from ..functional import grad as grad_func -from ..jit import sideeffect - - -class _RequiredParameter: - def __repr__(self): - return "" - - -required = _RequiredParameter() - - -class Optimizer(metaclass=ABCMeta): - r"""Base class for all optimizers. - - :param params: specifies what Tensors should be optimized. - :param defaults: a dict of default parameters of Optimizer, like learning rate or momentum. - :param bcast_period: interval time between two broadcast of distributed training. Default: 500 - """ - - def __init__( # pylint: disable=too-many-branches - self, - params: Union[Iter[Parameter], dict], - defaults: dict, - bcast_period: int = 500, - ): - self._state = TensorDict() - self._defaults = defaults - self._bcast_iter = 0 - self._bcast_period = bcast_period - - if isinstance(params, (Parameter, dict)): - params = [params] - else: - if not isinstance(params, Iterable): - raise TypeError( - "params argument given to the optimizer should be " - "Parameter or dict, or Iterable of them" - ) - - self.param_groups = [] # type: list - - param_groups = list(params) - if len(param_groups) == 0: - raise ValueError("optimizer got an empty parameter list") - - param_type = type(param_groups[0]) - for param in param_groups: - if not isinstance(param, param_type): - raise TypeError( - "types of params argument given to the optimizer shoud be same" - ) - - if not isinstance(param_groups[0], dict): - param_groups = [{"params": param_groups}] - - for group in param_groups: - self.add_param_group(group) - - for group in self.param_groups: - self._create_state(group) - - if is_distributed() and bcast_period != -1: - self.bcast_param() - - def add_param_group(self, param_group: dict): - r"""Add a param group to ``param_groups`` of the :class:`~megengine.optim.optimizer.Optimizer`. - - This can be useful when fine tuning a pre-trained network as frozen layers can be made - trainable and added to the :class:`~megengine.optim.optimizer.Optimizer` as training progresses. - - :param param_group: specifies what tensors should be optimized along with group. - - """ - assert isinstance(param_group, dict), "param group must be a dict" - - if isinstance(param_group["params"], Parameter): - param_group["params"] = [param_group["params"]] - else: - param_group["params"] = list(param_group["params"]) - - for param in param_group["params"]: - if not isinstance(param, Parameter): - raise TypeError( - "optimizer can only optimize Parameters, but one of the params is " - + type(param) - ) - if not param.requires_grad: - raise ValueError( - "optimizer can only optimize Parameters with requires_grad=True" - ) - - for name, default in self._defaults.items(): - if default is required and name not in param_group: - raise ValueError( - "parameter group didn't specify a value of " - "required optimization parameter " + name - ) - param_group.setdefault(name, default) - - param_set = set() - - for group in self.param_groups: - param_set.update(set(map(id, group["params"]))) - - assert param_set.isdisjoint( - set(map(id, param_group["params"])) - ), "some parameters appear in more than one parameter group" - - self.param_groups.append(param_group) - - def _add_state(self, param, state_name, initializer=None): - if initializer is None: - initializer = np.zeros(param.shape, dtype=np.float32) - state_dict = self._state.setdefault(param, {}) - assert state_name not in state_dict - state = Buffer(value=initializer) - state_dict[state_name] = state - - @abstractmethod - def _create_state(self, param_group): - pass - - @abstractmethod - def _updates(self, param_group): - pass - - def backward(self, loss: Tensor): - """Computes the back-propagation of the network given loss. - - :param loss: The obtained loss tensor - """ - rst = [] - params = [] - for group in self.param_groups: - for param in group["params"]: - if param.grad is None: - param.grad = Buffer( - value=np.zeros(shape=param.shape, dtype=np.float32) - ) - - params.append(param) - assert hasattr(param, "grad"), "param has no grad" - assert isinstance(param.grad, Buffer), "grad must be a buffer" - - cg = get_default_graph() - grads = grad_func(loss, params, use_virtual_grad=not cg.is_eager()) - if not isinstance(grads, list): - grads = [grads] - assert len(grads) == len(params) - - for param, grad in zip(params, grads): - if is_distributed() and param.replica_mode: - with opr_priority_scope(cg, -(2 ** 30)): - # always run all_reduce_mean first except add_update - grad = ( - all_reduce_sum( - grad, "grad_" + str(get_group_id()), get_world_size() - ) - / get_world_size() - ) - with opr_priority_scope(cg, -(2 ** 31)): - # always run add_update first - grad_update = add_update(param.grad, grad) - else: - grad_update = add_update(param.grad, grad) - rst.append(grad_update) - - return rst - - @sideeffect - def step(self): - r"""Performs a single optimization step. - - """ - for group in self.param_groups: - if isinstance(group["params"], set): - raise TypeError( - "optimized parameters need to be organized in ordered collections, " - "but the ordering of parameters in sets will change between runs. " - "Please use a list instead." - ) - self._updates(group) - - if is_distributed() and self._bcast_period != -1: - self._bcast_iter += 1 - if self._bcast_iter == self._bcast_period: - self.bcast_param() - self._bcast_iter = 0 - - @sideeffect - def zero_grad(self): - r"""Reset the grad to zeros. - - """ - for param_group in self.param_groups: - for param in param_group["params"]: - if param.grad is not None: - param.grad.reset_zero() - - def bcast_param(self): - key = 0 - for group in self.param_groups: - for param in group["params"]: - if param.replica_mode: - bcast_param( - param, - "bcast_param_" + str(key), - get_world_size(), - get_rank() == 0, - ) - key += 1 - - def state_dict(self) -> Dict: - r"""Export the optimizer state. - - :return: optimizer state. Can be loaded by :meth:`load_state_dict`. - """ - param_groups = [] - state = dict() - param2id = TensorDict() - - cur_id = 0 - for group in self.param_groups: - for param in group["params"]: - if param not in param2id: - param2id[param] = cur_id - cur_id += 1 - - for param, st in self._state.items(): - state[param2id[param]] = st - - for group in self.param_groups: - param_group = {k: v for k, v in group.items() if k != "params"} - param_group["params"] = [param2id[param] for param in group["params"]] - param_groups.append(param_group) - - return {"param_groups": param_groups, "state": state} - - def load_state_dict(self, state: dict): - r"""Loads the optimizer state. - - :param state: optimizer state. Should be an object returned - from a call to :meth:`state_dict`. - """ - if len(self.param_groups) != len(state["param_groups"]): - raise ValueError( - "loaded state dict has a different number of parameter groups" - ) - parameter_map = dict() # type: Dict - for group_new, group_saved in zip(self.param_groups, state["param_groups"]): - if len(group_new["params"]) != len(group_saved["params"]): - raise ValueError( - "loaded state dict contains a parameter group that " - "doesn't match the size of optimizer's group" - ) - for param_new, param_saved in zip( - group_new["params"], group_saved["params"] - ): - p = param_new - self._state[p] = state["state"][param_saved].copy() - for k, v in self._state[p].items(): - if isinstance(v, Buffer) and v._comp_graph != p._comp_graph: - self._state[p][k] = Buffer(v.numpy()) - - if set(group_new.keys()) != set(group_saved.keys()): - raise ValueError( - "loaded state dict contains a parameter group that " - "doesn't match the keys of optimizer's group" - ) - for key in group_new.keys(): - if key != "params": - group_new[key] = group_saved[key] - - if len(self._state.keys()) != len(state["state"].keys()): - raise ValueError( - "loaded state dict contains a state that doesn't match " - "the size of optimizer's state" - ) diff --git a/python_module/megengine/optimizer/sgd.py b/python_module/megengine/optimizer/sgd.py deleted file mode 100644 index a1f807b3..00000000 --- a/python_module/megengine/optimizer/sgd.py +++ /dev/null @@ -1,73 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from typing import Iterable, Union - -from ..core import Buffer, Parameter -from .internal import add_update_fastpath as add_update -from .optimizer import Optimizer - - -class SGD(Optimizer): - r"""Implements stochastic gradient descent. - - Nesterov momentum is based on the formula from - `"On the importance of initialization and momentum in deep learning" `_ . - - :param params: iterable of parameters to optimize or dicts defining - parameter groups. - :param lr: learning rate. - :param momentum: momentum factor. Default: 0.0 - :param weight_decay: weight decay (L2 penalty). Default: 0.0 - """ - - def __init__( - self, - params: Union[Iterable[Parameter], dict], - lr: float, - momentum: float = 0.0, - weight_decay: float = 0.0, - ): - assert lr >= 0.0, "Invalid learning rate: {}".format(lr) - assert momentum >= 0.0, "Invalid momentum value: {}".format(momentum) - assert weight_decay >= 0.0, "Invalid weight_decay value: {}".format( - weight_decay - ) - - defaults = dict(lr=lr, momentum=momentum, weight_decay=weight_decay) - super().__init__(params, defaults) - - def _create_state(self, param_group): - if param_group["momentum"] != 0.0: - for param in param_group["params"]: - self._add_state(param, "momentum_buffer") - - def _updates(self, param_group): - lr = param_group["lr"] - weight_decay = param_group["weight_decay"] - momentum = param_group["momentum"] - - for param in param_group["params"]: - if not isinstance(param.grad, Buffer): - raise TypeError( - "grad must be a Buffer, maybe you forget to call backward()?" - ) - - if not param.requires_grad: - continue - - grad = param.grad - if weight_decay != 0.0: - grad = add_update(grad, param, beta=weight_decay) - - if momentum: - v = self._state[param]["momentum_buffer"] - update_v = add_update(v, grad, alpha=momentum) - add_update(param, update_v, beta=-lr) - else: - add_update(param, grad, beta=-lr) diff --git a/python_module/megengine/quantization/__init__.py b/python_module/megengine/quantization/__init__.py deleted file mode 100644 index 9c8a0e0d..00000000 --- a/python_module/megengine/quantization/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -from .fake_quant import FakeQuantize -from .internal_fake_quant import * -from .observer import HistogramObserver, Observer -from .qconfig import ( - QConfig, - calibration_qconfig, - ema_fakequant_qconfig, - ema_lowbit_fakequant_qconfig, - min_max_fakequant_qconfig, - tqt_quant_qconfig, -) -from .utils import QuantMode diff --git a/python_module/megengine/quantization/fake_quant.py b/python_module/megengine/quantization/fake_quant.py deleted file mode 100644 index 7260b9db..00000000 --- a/python_module/megengine/quantization/fake_quant.py +++ /dev/null @@ -1,145 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import copy -import math - -import numpy as np - -from .. import functional as F -from .._internal.dtype import _metadata_dict, get_quantized_dtype -from ..core import Buffer, Function, Parameter -from ..jit import sideeffect -from ..module import Module -from .utils import QuantMode, Round, fake_quant_tensor, get_qparam_dict - - -class _FakeQuantize(Module): - r""" - A Basic Fake Quant module. - - :param dtype: A string indicating the target quantization type of input. - :param narrow_range: Whether the absolute value of ``qmin`` is the same as ``qmax``, - instead of 1 greater. Usually True for weight and False for activation. - :param enable: Whether do ``normal_forward`` or ``fake_quant_forward``. - """ - - def __init__(self, dtype: str, narrow_range: bool = False, enable: bool = True): - super().__init__() - if not dtype in _metadata_dict.keys(): - raise ValueError( - "unknown dtype: {}, only support {}".format( - dtype, _metadata_dict.keys() - ) - ) - self.dtype = dtype - self.narrow_range = narrow_range - self.qmin = ( - -_metadata_dict[dtype].qmax if narrow_range else _metadata_dict[dtype].qmin - ) - self.qmax = _metadata_dict[dtype].qmax - self.enabled = enable - - def enable(self): - self.enabled = True - - def disable(self): - self.enabled = False - - def fake_quant_forward(self, inp, q_dict=None): - return inp - - def normal_foward(self, inp, q_dict=None): - return inp - - def forward(self, inp, q_dict=None): - if self.enabled: - return self.fake_quant_forward(inp, q_dict=q_dict) - else: - return self.normal_foward(inp, q_dict=q_dict) - - -class TQT_Function(Function): - def __init__(self, lowerbound, upperbound): - super().__init__() - self.lowerbound = lowerbound - self.upperbound = upperbound - - def forward(self, inp, scale): - t = 2 ** scale - # t = F.maximum(t, 1e-4) - inp_scaled = inp / t - inp_clipped = F.maximum(F.minimum(inp_scaled, self.upperbound), self.lowerbound) - inp_rounded = F.round(inp_clipped) - inp_flq = inp_rounded * t - self.save_for_backward(inp_scaled, inp_rounded, t) - return inp_flq - - def backward(self, grad_inp_flq): - (inp_scaled, inp_rounded, t) = self.saved_tensors - mask_clip = (inp_scaled < -0.5 + self.lowerbound) + ( - inp_scaled > self.upperbound + 0.5 - ) # mask for accumulating the gradients of |data_scaled|>L - mask_quant = F.abs( - mask_clip - 1 - ) # mask for accumulating the gradients with |data_scaled|<=L - grad_quant = ( - grad_inp_flq * mask_quant * (inp_rounded - inp_scaled) - ) # gradient within |data_scaled|<=L - grad_clip = ( - grad_inp_flq * mask_clip * inp_rounded - ) # gradient with | data_scaled|>L - grad_s = grad_clip.sum() + grad_quant.sum() - # dL/ds = dL/dt * t * ln(2) - grad_s = grad_s * t * math.log(2) - grad_inp = grad_inp_flq * mask_quant - return grad_inp, grad_s - - -class TQT(_FakeQuantize): - r""" - TQT: https://arxiv.org/abs/1903.08066 Trained Quantization Thresholds - for Accurate and Efficient Fixed-Point Inference of Deep Neural Networks. - """ - - def __init__(self, dtype: str, narrow_range: bool = False, enable: bool = True): - super().__init__(dtype, narrow_range, enable) - self.scale = Parameter(0.0, dtype=np.float32) - - def fake_quant_forward(self, inp, q_dict=None): - # when enable, TQT will do fakequant forward, finetune the scale - return TQT_Function(self.qmin, self.qmax)(inp, self.scale) - - def normal_foward(self, inp, q_dict=None): - if q_dict["enable_observer"]: - # when disable, TQT will do normal forward, initialize scale weight - tmp_scale = F.maximum(F.abs(q_dict["min_val"]), F.abs(q_dict["max_val"])) - tmp_scale = F.log(tmp_scale / 127) / F.log(2) - F.add_update(self.scale, tmp_scale, alpha=0.0, beta=1.0, bias=0.0) - return inp - - def get_qparams(self): - q_dict = get_qparam_dict(QuantMode.TQT) - q_dict["scale"] = 2 ** self.scale - return q_dict - - def get_dtype(self): - q_dict = self.get_qparams() - scale = None if "scale" not in q_dict else q_dict["scale"].numpy()[0] - zero_point = ( - None if "zero_point" not in q_dict else q_dict["zero_point"].numpy()[0] - ) - return get_quantized_dtype(self.dtype, scale, zero_point) - - -class FakeQuantize(_FakeQuantize): - r""" - A module to do quant and dequant according to observer's scale and zero_point. - """ - - def fake_quant_forward(self, inp, q_dict=None): - return fake_quant_tensor(inp, self.qmin, self.qmax, q_dict) diff --git a/python_module/megengine/quantization/internal_fake_quant.py b/python_module/megengine/quantization/internal_fake_quant.py deleted file mode 100644 index df15a916..00000000 --- a/python_module/megengine/quantization/internal_fake_quant.py +++ /dev/null @@ -1,19 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import copy -import math -from functools import partial - -import numpy as np - -from .. import functional as F -from ..core import Function -from .fake_quant import _FakeQuantize -from .observer import MinMaxObserver -from .qconfig import QConfig - diff --git a/python_module/megengine/quantization/observer.py b/python_module/megengine/quantization/observer.py deleted file mode 100644 index 6aa3a406..00000000 --- a/python_module/megengine/quantization/observer.py +++ /dev/null @@ -1,422 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import math -from abc import abstractmethod -from enum import Enum - -import numpy as np - -from .. import functional as F -from .._internal.dtype import _metadata_dict, get_quantized_dtype -from ..core import Buffer -from ..jit import sideeffect -from ..module import Module -from .utils import QuantMode, Round, get_qparam_dict - - -class Observer(Module): - r""" - A base class for Observer Module. - - :param dtype: a string indicating to collect scale and zero_point of which dtype - :param narrow_range: Whether the absolute value of ``qmin`` is the same as ``qmax``, - instead of 1 greater. Usually True for weight and False for activation. - """ - - def __init__(self, dtype: str, narrow_range: bool = False): - super().__init__() - if dtype not in _metadata_dict.keys(): - raise ValueError( - "unknown dtype: {}, only support {}".format( - dtype, _metadata_dict.keys() - ) - ) - self.dtype = dtype - self.narrow_range = narrow_range - self.qmin = ( - -_metadata_dict[dtype].qmax if narrow_range else _metadata_dict[dtype].qmin - ) - self.qmax = _metadata_dict[dtype].qmax - self.enabled = True - - def get_dtype(self): - q_dict = self.get_qparams() - numpy_scale = None if "scale" not in q_dict else q_dict["scale"].numpy()[0] - numpy_zero_point = ( - None if "zero_point" not in q_dict else q_dict["zero_point"].numpy()[0] - ) - return get_quantized_dtype(self.dtype, numpy_scale, numpy_zero_point) - - def enable(self): - self.enabled = True - - def disable(self): - self.enabled = False - - def train(self, mode: bool = True, recursive: bool = True) -> None: - super().train(mode, recursive) - if mode: - self.enable() - else: - self.disable() - - @abstractmethod - def forward(self, x): - pass - - @abstractmethod - def get_qparams(self, **kwargs): - pass - - -class MinMaxObserver(Observer): - def __init__( - self, - mode=QuantMode.SYMMERTIC, - eps=0.00001, - dtype="qint8", - narrow_range: bool = False, - ): - super().__init__(dtype, narrow_range) - self.mode = mode - self.min_val = Buffer(np.finfo(np.float32).max, dtype=np.float32) - self.max_val = Buffer(np.finfo(np.float32).min, dtype=np.float32) - self.scale_limit = eps - - def _calculate_qparams(self, inp_min_val, inp_max_val): - min_val = F.minimum(0.0, inp_min_val) - max_val = F.maximum(0.0, inp_max_val) - q_dict = get_qparam_dict(self.mode) - q_dict["min_val"] = inp_min_val - q_dict["max_val"] = inp_max_val - q_dict["enable_observer"] = self.enable - if self.mode == QuantMode.SYMMERTIC: - symmetric_max_vals = F.maximum(-min_val, max_val) - # use maximun to avoid scale too small at the begin - q_dict["scale"] = F.maximum( - symmetric_max_vals / ((self.qmax - self.qmin) / 2), self.scale_limit - ) - # zero_point = self.zero_point - else: - # use maximun to avoid scale too small at the begin - q_dict["scale"] = F.maximum( - (max_val - min_val) / (self.qmax - self.qmin), self.scale_limit, - ) - # caculate zero_point - q_dict["zero_point"] = self.qmin - Round()((min_val / q_dict["scale"])) - - return q_dict - - def get_qparams(self): - return self._calculate_qparams(self.min_val, self.max_val) - - def forward(self, x_orig): - if self.enabled: - # stop gradient - x = F.zero_grad(x_orig) - # find max and min - F.add_update( - self.min_val, - F.minimum(self.min_val, x.min()), - alpha=0.0, - beta=1.0, - bias=0.0, - ) - F.add_update( - self.max_val, - F.maximum(self.max_val, x.max()), - alpha=0.0, - beta=1.0, - bias=0.0, - ) - return x_orig - - -class ExponentialMovingAverageObserver(MinMaxObserver): - def __init__( - self, - momentum=0.9, - mode=QuantMode.SYMMERTIC, - eps=0.00001, - dtype="qint8", - narrow_range: bool = False, - ): - super().__init__(mode, eps, dtype, narrow_range) - self.momentum = Buffer(momentum) - self.runtime_momentum = Buffer(0.0) - - def set_momentum(self, momentum): - self.momentum.set_value(momentum) - - def forward(self, x_orig): - if self.enabled: - # stop gradient - x = F.zero_grad(x_orig) - # Exponential Moving Average - tmp_min = ( - self.min_val * self.runtime_momentum - + (1 - self.runtime_momentum) * x.min() - ) - tmp_max = ( - self.max_val * self.runtime_momentum - + (1 - self.runtime_momentum) * x.max() - ) - F.add_update(self.min_val, tmp_min, alpha=0.0, beta=1.0, bias=0.0) - F.add_update(self.max_val, tmp_max, alpha=0.0, beta=1.0, bias=0.0) - F.add_update( - self.runtime_momentum, self.momentum, alpha=0.0, beta=1.0, bias=0.0 - ) - return x_orig - - -class HistogramObserver(MinMaxObserver): - def __init__( - self, - bins=2048, - upsample_rate=128, - mode=QuantMode.SYMMERTIC, - eps=0.00001, - dtype="qint8", - narrow_range: bool = False, - ): - super().__init__(mode, eps, dtype, narrow_range) - self.bins = bins - self.upsample_rate = upsample_rate - self.dst_nbins = _metadata_dict[dtype].qmax - _metadata_dict[dtype].qmin + 1 - self.histogram = Buffer([-1] + [0.0] * (bins - 1)) - - def _non_linear_param_search(self): - r"""Non-linear parameter search. - An approximation for L2 error minimization for selecting min/max. - By selecting new min/max, we filter out outliers in input distribution. - """ - - np_min_val = self.min_val.numpy()[0] - np_max_val = self.max_val.numpy()[0] - np_histogram = self.histogram.numpy() - assert len(np_histogram) == self.bins, "bins mistmatch" - bin_width = (np_max_val - np_min_val) / self.bins - - def _get_norm(delta_begin, delta_end, density, norm_type): - r""" - Compute the norm of the values uniformaly distributed between - delta_begin and delta_end. - norm = density * (integral_{begin, end} x^2) - = density * (end^3 - begin^3) / 3 - """ - assert norm_type == "L2", "Only L2 norms are currently supported" - norm = 0.0 - if norm_type == "L2": - norm = ( - delta_end * delta_end * delta_end - - delta_begin * delta_begin * delta_begin - ) / 3 - return density * norm - - def _compute_quantization_error(next_start_bin, next_end_bin, norm_type): - r""" - Compute the quantization error if we use start_bin to end_bin as the - min and max to do the quantization. - """ - - norm = 0.0 - dst_bin_width = ( - bin_width * (next_end_bin - next_start_bin + 1) / self.dst_nbins - ) - if dst_bin_width == 0.0: - return 0.0 - for src_bin in range(self.bins): - # distances from the beginning of first dst_bin to the beginning and - # end of src_bin - src_bin_begin = (src_bin - next_start_bin) * bin_width - src_bin_end = src_bin_begin + bin_width - - # which dst_bins the beginning and end of src_bin belong to? - dst_bin_of_begin = min( - self.dst_nbins - 1, - max(0.0, math.floor(src_bin_begin / dst_bin_width)), - ) - dst_bin_of_end = min( - self.dst_nbins - 1, - max(0.0, math.floor(src_bin_end / dst_bin_width)), - ) - dst_bin_of_begin_center = ( - dst_bin_of_begin * dst_bin_width + dst_bin_width / 2 - ) - - density = np_histogram[src_bin] / bin_width - if dst_bin_of_begin == dst_bin_of_end: - # if src_bin is entirely within 1 dst_bin - delta_begin = src_bin_begin - dst_bin_of_begin_center - delta_end = src_bin_end - dst_bin_of_begin_center - norm = norm + _get_norm(delta_begin, delta_end, density, norm_type) - else: - delta_begin = src_bin_begin - dst_bin_of_begin_center - delta_end = dst_bin_width / 2 - norm = norm + _get_norm(delta_begin, delta_end, density, norm_type) - - norm = norm + (dst_bin_of_end - dst_bin_of_begin - 1) * _get_norm( - -dst_bin_width / 2, dst_bin_width / 2, density, norm_type - ) - - dst_bin_of_end_center = ( - dst_bin_of_end * dst_bin_width + dst_bin_width / 2 - ) - - delta_begin = -dst_bin_width / 2 - delta_end = src_bin_end - dst_bin_of_end_center - norm = norm + _get_norm(delta_begin, delta_end, density, norm_type) - return norm - - # cumulative sum - total = sum(np_histogram) - cSum = np.cumsum(np_histogram, axis=0) - - stepsize = 1e-5 # granularity - alpha = 0.0 # lower bound - beta = 1.0 # upper bound - start_bin = 0 - end_bin = self.bins - 1 - norm_min = float("inf") - - while alpha < beta: - # Find the next step - next_alpha = alpha + stepsize - next_beta = beta - stepsize - - # find the left and right bins between the quantile bounds - l = start_bin - r = end_bin - while l < end_bin and cSum[l] < next_alpha * total: - l = l + 1 - while r > start_bin and cSum[r] > next_beta * total: - r = r - 1 - - # decide the next move - next_start_bin = start_bin - next_end_bin = end_bin - if (l - start_bin) > (end_bin - r): - # move the start bin - next_start_bin = l - alpha = next_alpha - else: - # move the end bin - next_end_bin = r - beta = next_beta - - if next_start_bin == start_bin and next_end_bin == end_bin: - continue - - # calculate the quantization error using next_start_bin and next_end_bin - norm = _compute_quantization_error(next_start_bin, next_end_bin, "L2") - - if norm > norm_min: - break - norm_min = norm - start_bin = next_start_bin - end_bin = next_end_bin - - new_min = self.min_val + bin_width * start_bin - new_max = self.min_val + bin_width * (end_bin + 1) - return new_min, new_max - - def get_qparams(self): - new_min, new_max = self._non_linear_param_search() - return self._calculate_qparams(new_min, new_max) - - def _combine_histograms( - self, orig_hist, new_hist, upsample_rate, downsample_rate, start_idx, Nbins - ): - # First up-sample the histogram with new data by a factor of L - # This creates an approximate probability density thats piecwise constant - upsampled_histogram = new_hist.repeat(upsample_rate) - # Now insert the upsampled histogram into the output - # histogram, which is initialized with zeros. - # The offset at which the histogram is introduced is determined - # by the start index as the output histogram can cover a wider range - histogram_with_output_range = np.zeros((Nbins * downsample_rate)) - histogram_with_output_range[ - start_idx : Nbins * upsample_rate + start_idx - ] = upsampled_histogram - # Compute integral histogram, double precision is needed to ensure - # that there are no overflows - integral_histogram = np.cumsum(histogram_with_output_range, 0)[ - downsample_rate - 1 :: downsample_rate - ] - # Finally perform interpolation - shifted_integral_histogram = np.zeros((Nbins)) - shifted_integral_histogram[1:Nbins] = integral_histogram[0:-1] - interpolated_histogram = ( - integral_histogram - shifted_integral_histogram - ) / upsample_rate - orig_hist = orig_hist + interpolated_histogram - return orig_hist - - def _adjust_min_max(self, combined_min, combined_max, upsample_rate): - # We ensure that: - # (combined_max - combined_min)/(downsample_rate*Nbins) = (max - min)/(upsample_rate*Nbins) - # This allows us to have a common grid of resolution s, where we can align - # the input histogram - # start_idx maps min_val to the histogram bin index. - np_min_val = self.min_val.numpy()[0] - np_max_val = self.max_val.numpy()[0] - - hist_bin_width = (np_max_val - np_min_val) / (self.bins * upsample_rate) - downsample_rate = int( - np.ceil((combined_max - combined_min) / (self.bins * hist_bin_width)) - ) - e = downsample_rate * (self.bins * hist_bin_width) - ( - combined_max - combined_min - ) - combined_max = combined_max + e / 2 - combined_min = combined_min - e / 2 - start_idx = int(np.round((np_min_val - combined_min) / hist_bin_width)) - - return combined_min, combined_max, downsample_rate, start_idx - - @sideeffect - def sideeffect_forward(self, x_orig): - x = x_orig.numpy() - min_val = self.min_val.numpy()[0] - max_val = self.max_val.numpy()[0] - histogram = self.histogram.numpy() - new_min = x.min() - new_max = x.max() - if histogram[0] == -1: - new_histogram, _ = np.histogram(x, self.bins, (new_min, new_max)) - else: - new_min = min(new_min, min_val) - new_max = max(new_max, max_val) - # combine the existing histogram and new histogram into 1 histogram - # We do this by first upsampling the histogram to a dense grid - # and then downsampling the histogram efficiently - (new_min, new_max, downsample_rate, start_idx,) = self._adjust_min_max( - new_min, new_max, self.upsample_rate - ) - - new_histogram, _ = np.histogram(x, self.bins, (new_min, new_max)) - new_histogram = new_histogram.astype(np.float64) - if new_min == min_val and new_max == max_val: - new_histogram += histogram - else: - new_histogram = self._combine_histograms( - new_histogram, - histogram, - self.upsample_rate, - downsample_rate, - start_idx, - self.bins, - ) - - self.histogram.set_value(new_histogram) - self.min_val.set_value(new_min) - self.max_val.set_value(new_max) - - def forward(self, x_orig): - self.sideeffect_forward(x_orig) - return x_orig diff --git a/python_module/megengine/quantization/qconfig.py b/python_module/megengine/quantization/qconfig.py deleted file mode 100644 index 6606c1a5..00000000 --- a/python_module/megengine/quantization/qconfig.py +++ /dev/null @@ -1,109 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -#' -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from functools import partial - -from ..module import Module -from .fake_quant import TQT, FakeQuantize -from .observer import ( - ExponentialMovingAverageObserver, - HistogramObserver, - MinMaxObserver, -) - - -class QConfig: - r""" - A config class indicating how to do quantize toward :class:`~.QATModule`'s - ``activation`` and ``weight``. See :meth:`~.QATModule.set_qconfig` for detail usage. - - :param weight_observer: interface to instantiate an :class:`~.Observer` indicating - how to collect scales and zero_point of wegiht. - :param act_observer: similar to ``weight_observer`` but toward activation. - :param weight_fake_quant: interface to instantiate a :class:`~.FakeQuantize` indicating - how to do fake_quant calculation. - :param act_observer: similar to ``weight_fake_quant`` but toward activation. - - Examples: - - .. code-block:: - - # Default EMA QConfig for QAT. - ema_fakequant_qconfig = QConfig( - weight_observer=partial(MinMaxObserver, dtype="qint8", narrow_range=True), - act_observer=partial(ExponentialMovingAverageObserver, dtype="qint8", narrow_range=False), - weight_fake_quant=partial(FakeQuantize, dtype="qint8", narrow_range=True), - act_fake_quant=partial(FakeQuantize, dtype="qint8", narrow_range=False), - ) - - Each parameter is a ``class`` rather than an instance. And we recommand using ``functools.partial`` - to add initialization parameters of the ``class``, so that don't need to provide parameters in - :meth:`~.QATModule.set_qconfig`. - - Usually we set ``narrow_range`` of weight related paramters to ``True`` and of activation related - parameters to ``False``. For the result of multiplication and addition as ``a * b + c * d``, if - four variables are all -128 of dtype ``qint8``, then the result will be ``2^15`` and cause overflow. - Weights are commonly calculated in this way, so needed to narrow the range. - """ - - def __init__( - self, weight_observer, act_observer, weight_fake_quant, act_fake_quant - ): - if isinstance(act_observer, Module) or isinstance(weight_observer, Module): - raise ValueError( - "QConfig must not receive observer instance, please pass observer" - " class generator using `partial(Observer, ...)` instead. Use" - " partial(MyObserver, x=1) to override arguments to constructor if needed" - ) - self.weight_observer = weight_observer - self.act_observer = act_observer - self.weight_fake_quant = weight_fake_quant - self.act_fake_quant = act_fake_quant - - -tqt_quant_qconfig = QConfig( - weight_observer=partial( - ExponentialMovingAverageObserver, dtype="qint8", narrow_range=True - ), - act_observer=partial( - ExponentialMovingAverageObserver, dtype="qint8", narrow_range=False - ), - weight_fake_quant=partial(TQT, dtype="qint8", narrow_range=True), - act_fake_quant=partial(TQT, dtype="qint8", narrow_range=False), -) - -min_max_fakequant_qconfig = QConfig( - weight_observer=partial(MinMaxObserver, dtype="qint8", narrow_range=True), - act_observer=partial(MinMaxObserver, dtype="qint8", narrow_range=False), - weight_fake_quant=partial(FakeQuantize, dtype="qint8", narrow_range=True), - act_fake_quant=partial(FakeQuantize, dtype="qint8", narrow_range=False), -) - -ema_fakequant_qconfig = QConfig( - weight_observer=partial(MinMaxObserver, dtype="qint8", narrow_range=True), - act_observer=partial( - ExponentialMovingAverageObserver, dtype="qint8", narrow_range=False - ), - weight_fake_quant=partial(FakeQuantize, dtype="qint8", narrow_range=True), - act_fake_quant=partial(FakeQuantize, dtype="qint8", narrow_range=False), -) - -ema_lowbit_fakequant_qconfig = QConfig( - weight_observer=partial(MinMaxObserver, dtype="qint4", narrow_range=False), - act_observer=partial( - ExponentialMovingAverageObserver, dtype="qint4", narrow_range=False - ), - weight_fake_quant=partial(FakeQuantize, dtype="qint4", narrow_range=False), - act_fake_quant=partial(FakeQuantize, dtype="qint4", narrow_range=False), -) - -calibration_qconfig = QConfig( - weight_observer=partial(MinMaxObserver, dtype="qint8", narrow_range=True), - act_observer=partial(HistogramObserver, dtype="qint8", narrow_range=False), - weight_fake_quant=None, - act_fake_quant=None, -) diff --git a/python_module/megengine/quantization/quantize.py b/python_module/megengine/quantization/quantize.py deleted file mode 100644 index 5dab2ae4..00000000 --- a/python_module/megengine/quantization/quantize.py +++ /dev/null @@ -1,191 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from copy import copy, deepcopy -from typing import Callable, Dict, Tuple - -from .. import module as Float -from ..module import Module -from ..module import qat as QAT -from ..module import quantized as Quantized -from ..module.qat import QATModule -from ..module.quantized import QuantizedModule -from .fake_quant import TQT -from .qconfig import QConfig, ema_fakequant_qconfig - - -def _get_quantable_module_names(): - def is_quantable(key: str): - value = getattr(Quantized, key) - return ( - isinstance(value, type) - and issubclass(value, QuantizedModule) - and value != QuantizedModule - ) - - # source should have all quantable modules' names - quantable_module_names = [key for key in dir(Quantized) if is_quantable(key)] - return quantable_module_names - - -def _get_convert_dict() -> Tuple[ - Dict[Module, QATModule], Dict[QATModule, QuantizedModule] -]: - quantable_module_names = _get_quantable_module_names() - - quantable_modules = [getattr(Float, key) for key in quantable_module_names] - qat_modules = [getattr(QAT, key) for key in quantable_module_names] - quantized_modules = [getattr(Quantized, key) for key in quantable_module_names] - - float2qat_dict = dict(zip(quantable_modules, qat_modules)) - qat2quantized_dict = dict(zip(qat_modules, quantized_modules)) - return float2qat_dict, qat2quantized_dict - - -_float2qat_dict, _qat2quantized_dict = _get_convert_dict() - - -def quantize(module: Module, inplace: bool = True, mapping: dict = None): - r""" - Recursively convert :class:`~.QATModule` to :class:`~.QuantizedModule` - through :meth:`~.Module.apply`. - - :param module: root module to do convert recursively. - :param inplace: whether to convert submodules in-place. - :param mapping: a dict indicating how to convert custom modules from QATModule to - QuantizedModule. Will be combined with internal default convert mapping dict. - """ - - if not inplace: - module = deepcopy(module) - - convert_dict = copy(_qat2quantized_dict) - if mapping is not None: - convert_dict.update(mapping) - qat_modules = tuple(convert_dict.keys()) - - def is_qat(mod: Module): - return isinstance(mod, qat_modules) - - # must use list to avoid replacement influencing successor modules - for key, submodule, parent in list( - module._flatten(with_key=True, with_parent=True, predicate=is_qat) - ): - new_mod = convert_dict[type(submodule)].from_qat_module(submodule) - if isinstance(parent, Float.Sequential): - # cannnot use setattr to be compatible with Sequential's ``__setitem__`` - parent[int(key.split(".")[-1])] = new_mod - else: - setattr(parent, key.split(".")[-1], new_mod) - - return module - - -def quantize_qat( - module: Module, - inplace: bool = True, - qconfig: QConfig = ema_fakequant_qconfig, - mapping: dict = None, -): - r""" - Recursively convert float :class:`~.Module` to :class:`~.QATModule` - through :meth:`~.Module.apply` and set qconfig relatively. - - :param module: root module to do convert recursively. - :param inplace: whether to convert submodules in-place. - :param qconfig: an instance of :class:`~.QConfig` to be set as submodules' qconfig. - default is ``ema_fakequant_qconfig``. - :param mapping: a dict indicating how to convert custom modules from Module to QATModule. - Will be combined with internal default convert mapping dict. - """ - - if not inplace: - module = deepcopy(module) - - convert_dict = copy(_float2qat_dict) - if mapping is not None: - convert_dict.update(mapping) - quantable_modules = tuple(convert_dict.keys()) - - def is_quantable(mod: Module): - return isinstance(mod, quantable_modules) - - # must use list to avoid replacement influencing successor modules - for key, submodule, parent in list( - module._flatten(with_key=True, with_parent=True, predicate=is_quantable) - ): - # only convert top quantable module. - if is_quantable(parent) or submodule.quantize_disabled: - continue - - new_mod = convert_dict[type(submodule)].from_float_module(submodule) - if isinstance(parent, Float.Sequential): - # cannnot use setattr to be compatible with Sequential's ``__setitem__`` - parent[int(key.split(".")[-1])] = new_mod - else: - setattr(parent, key.split(".")[-1], new_mod) - - propagate_qconfig(module, qconfig) - return module - - -def _propagate(module: Module, func_str: str, *args, **kargs): - def fn(mod: Module): - if isinstance(mod, QATModule): - getattr(mod, func_str)(*args, **kargs) - - module.apply(fn) - - -def propagate_qconfig(module: QATModule, qconfig: QConfig): - r""" - Recursively set ``module``'s qconfig through :meth:`~.Module.apply`. - - :param module: root module to traverse recursively. - :param qconfig: a instance of :class:`~.QConfig` to be set as submodules' qconfig. - """ - _propagate(module, "set_qconfig", qconfig) - - -def disable_fake_quant(module: Module): - r""" - Recursively disable ``module`` fake quantization in QATModule through :meth:`~.Module.apply` - - :param module: root module to do disable fake quantization recursively. - """ - - _propagate(module, "set_fake_quant", False) - - -def disable_observer(module: Module): - r""" - Recursively disable ``module`` observer in QATModule through :meth:`~.Module.apply` - - :param module: root module to do disable observer recursively. - """ - - _propagate(module, "set_observer", False) - - -def enable_fake_quant(module: Module): - r""" - Recursively enable ``module`` fake quantization in QATModule through :meth:`~.Module.apply` - - :param module: root module to do enable fake quantization recursively. - """ - - _propagate(module, "set_fake_quant", True) - - -def enable_observer(module: Module): - r""" - Recursively enable ``module`` observer in QATModule through :meth:`~.Module.apply` - - :param module: root module to do enable observer recursively. - """ - - _propagate(module, "set_observer", True) diff --git a/python_module/megengine/quantization/utils.py b/python_module/megengine/quantization/utils.py deleted file mode 100644 index 2b940c9d..00000000 --- a/python_module/megengine/quantization/utils.py +++ /dev/null @@ -1,116 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -from enum import Enum -from functools import partial, update_wrapper, wraps -from typing import Dict - -from .. import functional as F -from .._internal.dtype import _metadata_dict -from ..core import Function, Tensor - - -class Round(Function): - """ - The functional round have no grad and can not use for quantization-aware-training. - We use Function and STE(Straight-Through Estimator) to implement backward propagation. - """ - - def forward(self, x): - return x.round() - - def backward(self, output_grads): - return output_grads - - -def register_method_to_class(cls): - def decorator(func): - @wraps(func) - def wrapper(self, *args, **kwargs): - return func(self, *args, **kwargs) - - if isinstance(func, partial): - update_wrapper(func, func.func) - setattr(cls, func.__name__, wrapper) - return func - - return decorator - - -class QuantMode(Enum): - """Quantization mode enumerate class. - """ - - SYMMERTIC = 1 - ASYMMERTIC = 2 - TQT = 3 - - -qparam_dict = { - QuantMode.SYMMERTIC: {"mode": QuantMode.SYMMERTIC, "scale": None,}, - QuantMode.ASYMMERTIC: { - "mode": QuantMode.ASYMMERTIC, - "scale": None, - "zero_point": None, - }, - QuantMode.TQT: {"mode": QuantMode.TQT, "scale": None,}, -} - - -def get_qparam_dict(mode: QuantMode): - """Return the quantization parameters dictory according to the mode. - """ - return qparam_dict.get(mode, None) - - -def fake_quant_tensor(inp: Tensor, qmin: int, qmax: int, q_dict: Dict) -> Tensor: - """Apply fake quantization to the inp tensor. - - :param inp: the input tensor which need to be faked. - :param qmin: the minimum value which the integer limit to. - :param qmax: the maximum value which the integer limit to. - :param q_dict: the quantization parameter dict. - - """ - scale = q_dict["scale"] - zero_point = 0 - if q_dict["mode"] == QuantMode.ASYMMERTIC: - zero_point = q_dict["zero_point"] - # Quant - oup = Round()(inp / scale) + zero_point - # Clip - oup = F.minimum(F.maximum(oup, qmin), qmax) - # Dequant - oup = (oup - zero_point) * scale - return oup - - -def fake_quant_bias(bias: Tensor, inp: Tensor, w_qat: Tensor) -> Tensor: - """Apply fake quantization to bias, the special scale from input tensor - and weight tensor, the quantized type set to qint32 also. - - :param bias: the bias tensor which need to be faked. - :param inp: the input tensor which contain the quantization parameters. - :param qmax: the weight tensor which contain the quantization parameters. - - .. warning:: - Only work for symmetric quantization method now. - - """ - b_qat = bias - if hasattr(inp, "q_dict") and b_qat is not None: - if inp.q_dict["scale"] is not None and w_qat.q_dict["scale"] is not None: - # use the same mode with weight. - b_dict = get_qparam_dict(w_qat.q_dict["mode"]) - b_dict["scale"] = inp.q_dict["scale"] * w_qat.q_dict["scale"] - # TODO: add zero_point for ASYMMERTIC mode. - qmax = _metadata_dict["qint32"].qmax - qmin = _metadata_dict["qint32"].qmin - b_qat = fake_quant_tensor(b_qat, qmin, qmax, b_dict) - - return b_qat diff --git a/python_module/megengine/random/__init__.py b/python_module/megengine/random/__init__.py deleted file mode 100644 index 86c8d797..00000000 --- a/python_module/megengine/random/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from .distribution import gaussian, uniform -from .rng import manual_seed - -# pylint: disable=undefined-variable -del distribution, rng # type: ignore[name-defined] diff --git a/python_module/megengine/random/distribution.py b/python_module/megengine/random/distribution.py deleted file mode 100644 index 55977f9c..00000000 --- a/python_module/megengine/random/distribution.py +++ /dev/null @@ -1,102 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from typing import Iterable, Optional - -import megengine._internal as mgb -from megengine._internal import CompGraph, CompNode - -from ..core.graph import _use_default_if_none -from ..core.tensor import Tensor, wrap_io_tensor -from .rng import _random_seed_generator - -__all__ = ["gaussian", "uniform"] - - -@wrap_io_tensor -def gaussian( - shape: Iterable[int], - mean: float = 0, - std: float = 1, - comp_node: Optional[CompNode] = None, - comp_graph: Optional[CompGraph] = None, -) -> Tensor: - r"""Random variable with Gaussian distribution $N(\mu, \sigma)$ - - :param shape: Output tensor shape - :param mean: The mean or expectation of the distribution - :param std: The standard deviation of the distribution (variance = $\sigma ^ 2$) - :param comp_node: The comp node output on, default to None - :param comp_graph: The graph in which output is, default to None - :return: The output tensor - - Examples: - - .. testcode:: - - import megengine as mge - import megengine.random as rand - - x = rand.gaussian((2, 2), mean=0, std=1) - print(x.numpy()) - - .. testoutput:: - :options: +SKIP - - [[-0.20235455 -0.6959438 ] - [-1.4939808 -1.5824696 ]] - - """ - comp_node, comp_graph = _use_default_if_none(comp_node, comp_graph) - seed = _random_seed_generator().__next__() - return mgb.opr.gaussian_rng( - shape, seed=seed, mean=mean, std=std, comp_node=comp_node, comp_graph=comp_graph - ) - - -@wrap_io_tensor -def uniform( - shape: Iterable[int], - low: float = 0, - high: float = 1, - comp_node: Optional[CompNode] = None, - comp_graph: Optional[CompGraph] = None, -) -> Tensor: - r"""Random variable with uniform distribution $U(0, 1)$ - - :param shape: Output tensor shape - :param low: Lower range - :param high: Upper range - :param comp_node: The comp node output on, default to None - :param comp_graph: The graph in which output is, default to None - :return: The output tensor - - Examples: - - .. testcode:: - - import megengine as mge - import megengine.random as rand - - x = rand.uniform((2, 2)) - print(x.numpy()) - - .. testoutput:: - :options: +SKIP - - [[0.76901674 0.70496535] - [0.09365904 0.62957656]] - - """ - assert low < high, "Uniform is not defined when low >= high" - - comp_node, comp_graph = _use_default_if_none(comp_node, comp_graph) - seed = _random_seed_generator().__next__() - return low + (high - low) * mgb.opr.uniform_rng( - shape, seed=seed, comp_node=comp_node, comp_graph=comp_graph - ) diff --git a/python_module/megengine/random/rng.py b/python_module/megengine/random/rng.py deleted file mode 100644 index 54da30bd..00000000 --- a/python_module/megengine/random/rng.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import time - -from numpy.random import MT19937 - -_rng = None - - -def _random_seed_generator(): - if _rng is None: - from ..distributed.util import get_rank - - manual_seed(seed=int(time.time()) + get_rank()) - while True: - yield _rng.random_raw() - - -def manual_seed(seed: int): - global _rng # pylint: disable=global-statement - _rng = MT19937(seed=seed) diff --git a/python_module/megengine/test/__init__.py b/python_module/megengine/test/__init__.py deleted file mode 100644 index 44ed54c2..00000000 --- a/python_module/megengine/test/__init__.py +++ /dev/null @@ -1,67 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import numpy as np - - -def assertTensorClose( - v0, v1, *, max_err: float = 1e-6, allow_special_values: bool = False, name=None -): - """ - :param allow_special_values: whether to allow :attr:`v0` and :attr:`v1` to contain inf and nan values. - :param max_err: relative error - """ - __tracebackhide__ = True # pylint: disable=unused-variable - - assert ( - v0.dtype == v1.dtype - ), "Two Tensor must have same dtype, but the inputs are {} and {}".format( - v0.dtype, v1.dtype - ) - v0 = np.ascontiguousarray(v0, dtype=np.float32).copy() - v1 = np.ascontiguousarray(v1, dtype=np.float32).copy() - if allow_special_values: - # check nan and rm it - v0_nan_mask = np.isnan(v0) - if np.any(v0_nan_mask): - assert np.array_equiv(v0_nan_mask, np.isnan(v1)), (v0, v1) - v0[v0_nan_mask] = 0 - v1[v0_nan_mask] = 0 - # check inf and rm it - v0_inf_mask = v0 == float("inf") - if np.any(v0_inf_mask): - assert np.array_equiv(v0_inf_mask, v1 == float("inf")), (v0, v1) - v0[v0_inf_mask] = 0 - v1[v0_inf_mask] = 0 - # check -inf and rm it - v0_inf_mask = v0 == float("-inf") - if np.any(v0_inf_mask): - assert np.array_equiv(v0_inf_mask, v1 == float("-inf")), (v0, v1) - v0[v0_inf_mask] = 0 - v1[v0_inf_mask] = 0 - else: - assert np.isfinite(v0.sum()) and np.isfinite(v1.sum()), (v0, v1) - - assert v0.shape == v1.shape, "Two tensor must have same shape({} v.s. {})".format( - v0.shape, v1.shape - ) - vdiv = np.max([np.abs(v0), np.abs(v1), np.ones_like(v0)], axis=0) - err = np.abs(v0 - v1) / vdiv - check = err > max_err - if check.sum(): - idx = tuple(i[0] for i in np.nonzero(check)) - if name is None: - name = "tensor" - else: - name = "tensor {}".format(name) - raise AssertionError( - "{} not equal: " - "shape={} nonequal_idx={} v0={} v1={} err={}".format( - name, v0.shape, idx, v0[idx], v1[idx], err[idx] - ) - ) diff --git a/python_module/megengine/utils/__init__.py b/python_module/megengine/utils/__init__.py deleted file mode 100644 index 6b7b2d3a..00000000 --- a/python_module/megengine/utils/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -from megengine._internal.plugin import load_tensor_binary - - -def prod(iterable): - result = 1 - for i in iterable: - result *= i - return result diff --git a/python_module/megengine/utils/hook.py b/python_module/megengine/utils/hook.py deleted file mode 100644 index 9864a94a..00000000 --- a/python_module/megengine/utils/hook.py +++ /dev/null @@ -1,23 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import weakref - - -class HookHandler: - hook_num = 0 - - def __init__(self, source_dict, hook): - self.id = HookHandler.hook_num - HookHandler.hook_num += 1 - source_dict[self.id] = hook - self.source_ref = weakref.ref(source_dict) - - def remove(self): - source_dict = self.source_ref() - if source_dict is not None and self.id in source_dict: - del source_dict[self.id] diff --git a/python_module/megengine/utils/http_download.py b/python_module/megengine/utils/http_download.py deleted file mode 100644 index add2a649..00000000 --- a/python_module/megengine/utils/http_download.py +++ /dev/null @@ -1,66 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import hashlib -import os -import shutil -from tempfile import NamedTemporaryFile - -import requests -from tqdm import tqdm - -from ..logger import get_logger - -logger = get_logger(__name__) - -CHUNK_SIZE = 1024 -HTTP_CONNECTION_TIMEOUT = 5 - - -class HTTPDownloadError(BaseException): - """The class that represents http request error""" - - -def download_from_url(url: str, dst: str, http_read_timeout=120): - """ - Downloads file from given url to ``dst`` - - :param url: source URL - :param dst: saving path - :param http_read_timeout: how many seconds to wait for data before giving up - """ - dst = os.path.expanduser(dst) - dst_dir = os.path.dirname(dst) - - resp = requests.get( - url, timeout=(HTTP_CONNECTION_TIMEOUT, http_read_timeout), stream=True - ) - if resp.status_code != 200: - raise HTTPDownloadError("An error occured when downloading from {}".format(url)) - - md5 = hashlib.md5() - total_size = int(resp.headers.get("Content-Length", 0)) - bar = tqdm( - total=total_size, unit="iB", unit_scale=True, ncols=80 - ) # pylint: disable=blacklisted-name - try: - with NamedTemporaryFile("w+b", delete=False, suffix=".tmp", dir=dst_dir) as f: - logger.info("Download file to temp file %s", f.name) - for chunk in resp.iter_content(CHUNK_SIZE): - if not chunk: - break - bar.update(len(chunk)) - f.write(chunk) - md5.update(chunk) - bar.close() - shutil.move(f.name, dst) - finally: - # ensure tmp file is removed - if os.path.exists(f.name): - os.remove(f.name) - return md5.hexdigest() diff --git a/python_module/megengine/utils/max_recursion_limit.py b/python_module/megengine/utils/max_recursion_limit.py deleted file mode 100644 index d7bce6e8..00000000 --- a/python_module/megengine/utils/max_recursion_limit.py +++ /dev/null @@ -1,78 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import platform -import sys -import threading - -# Windows do not imp resource package -if platform.system() != "Windows": - import resource - - -class AlternativeRecursionLimit: - r"""A reentrant context manager for setting global recursion limits. - """ - - def __init__(self, new_py_limit): - self.new_py_limit = new_py_limit - self.count = 0 - self.lock = threading.Lock() - - self.orig_py_limit = 0 - self.orig_rlim_stack_soft = 0 - self.orig_rlim_stack_hard = 0 - - def __enter__(self): - with self.lock: - if self.count == 0: - self.orig_py_limit = sys.getrecursionlimit() - if platform.system() != "Windows": - ( - self.orig_rlim_stack_soft, - self.orig_rlim_stack_hard, - ) = resource.getrlimit(resource.RLIMIT_STACK) - # FIXME: https://bugs.python.org/issue34602, python3 release version - # on Macos always have this issue, not all user install python3 from src - try: - resource.setrlimit( - resource.RLIMIT_STACK, - (self.orig_rlim_stack_hard, self.orig_rlim_stack_hard), - ) - except ValueError as exc: - if platform.system() != "Darwin": - raise exc - - # increase recursion limit - sys.setrecursionlimit(self.new_py_limit) - self.count += 1 - - def __exit__(self, type, value, traceback): - with self.lock: - self.count -= 1 - if self.count == 0: - sys.setrecursionlimit(self.orig_py_limit) - - if platform.system() != "Windows": - try: - resource.setrlimit( - resource.RLIMIT_STACK, - (self.orig_rlim_stack_soft, self.orig_rlim_stack_hard), - ) - except ValueError as exc: - if platform.system() != "Darwin": - raise exc - - -_max_recursion_limit_context_manager = AlternativeRecursionLimit(2 ** 31 - 1) - - -def max_recursion_limit(): - r"""Sets recursion limit to the max possible value - """ - return _max_recursion_limit_context_manager diff --git a/python_module/megengine/utils/net_stats.py b/python_module/megengine/utils/net_stats.py deleted file mode 100644 index fa35d114..00000000 --- a/python_module/megengine/utils/net_stats.py +++ /dev/null @@ -1,279 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from functools import partial - -import numpy as np -import tabulate - -import megengine as mge -import megengine._internal as mgb -import megengine.module as m -import megengine.module.qat as qatm -import megengine.module.quantized as qm - -try: - mge.logger.MegEngineLogFormatter.max_lines = float("inf") -except AttributeError as e: - raise ValueError("set logger max lines failed") - -logger = mge.get_logger(__name__) - - -CALC_FLOPS = {} - - -def _register_modules(*modules): - def callback(impl): - for module in modules: - CALC_FLOPS[module] = impl - return impl - - return callback - - -@_register_modules( - m.Conv2d, - m.ConvTranspose2d, - m.LocalConv2d, - qm.Conv2d, - qm.ConvRelu2d, - qm.ConvBn2d, - qm.ConvBnRelu2d, - qatm.Conv2d, - qatm.ConvRelu2d, - qatm.ConvBn2d, - qatm.ConvBnRelu2d, -) -def count_convNd(module, input, output): - bias = 1 if module.bias is not None else 0 - group = module.groups - ic = input[0].shape[1] - oc = output[0].shape[1] - goc = oc // group - gic = ic // group - N = output[0].shape[0] - HW = np.prod(output[0].shape[2:]) - # N x Cout x H x W x (Cin x Kw x Kh + bias) - return N * HW * goc * (gic * np.prod(module.kernel_size) + bias) - - -@_register_modules(m.ConvTranspose2d) -def count_deconvNd(module, input, output): - return np.prod(input[0].shape) * output[0].shape[1] * np.prod(module.kernel_size) - - -@_register_modules(m.Linear, qatm.Linear, qm.Linear) -def count_linear(module, input, output): - return np.prod(output[0].shape) * module.in_features - - -# does not need import qat and quantized module since they inherit from float module. -hook_modules = ( - m.Conv2d, - m.ConvTranspose2d, - m.LocalConv2d, - m.BatchNorm2d, - m.Linear, -) - - -def net_stats(model, input_size, bar_length_max=20, log_params=True, log_flops=True): - def dict2table(list_of_dict, header): - table_data = [header] - for d in list_of_dict: - row = [] - for h in header: - v = "" - if h in d: - v = d[h] - row.append(v) - table_data.append(row) - return table_data - - def sizeof_fmt(num, suffix="B"): - for unit in ["", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi"]: - if abs(num) < 1024.0: - return "{:3.3f} {}{}".format(num, unit, suffix) - num /= 1024.0 - sign_str = "-" if num < 0 else "" - return "{}{:.1f} {}{}".format(sign_str, num, "Yi", suffix) - - def get_byteswidth(tensor): - dtype = tensor.dtype - if mgb.dtype.is_quantize(dtype): - return 1 - elif mgb.dtype.is_bfloat16(dtype): - return 2 - else: - return 4 - - def print_flops_stats(flops): - flops_list = [i["flops_num"] for i in flops] - max_flops_num = max(flops_list + [0]) - # calc total flops and set flops_cum - total_flops_num = 0 - for d in flops: - total_flops_num += int(d["flops_num"]) - d["flops_cum"] = sizeof_fmt(total_flops_num, suffix="OPs") - - for i in flops: - f = i["flops_num"] - i["flops"] = sizeof_fmt(f, suffix="OPs") - r = i["ratio"] = f / total_flops_num - i["percentage"] = "{:.2f}%".format(r * 100) - bar_length = int(f / max_flops_num * bar_length_max) - i["bar"] = "#" * bar_length - - header = [ - "name", - "class_name", - "input_shapes", - "output_shapes", - "flops", - "flops_cum", - "percentage", - "bar", - ] - - total_flops_str = sizeof_fmt(total_flops_num, suffix="OPs") - total_var_size = sum(sum(s[1] for s in i["output_shapes"]) for i in flops) - flops.append( - dict(name="total", flops=total_flops_str, output_shapes=total_var_size) - ) - - logger.info( - "flops stats: \n" + tabulate.tabulate(dict2table(flops, header=header)) - ) - - return total_flops_num - - def print_params_stats(params): - total_param_dims, total_param_size = 0, 0 - for d in params: - total_param_dims += int(d["param_dim"]) - total_param_size += int(d["size"]) - d["size"] = sizeof_fmt(d["size"]) - d["size_cum"] = sizeof_fmt(total_param_size) - - for d in params: - ratio = d["param_dim"] / total_param_dims - d["ratio"] = ratio - d["percentage"] = "{:.2f}%".format(ratio * 100) - - # construct bar - max_ratio = max([d["ratio"] for d in params]) - for d in params: - bar_length = int(d["ratio"] / max_ratio * bar_length_max) - d["size_bar"] = "#" * bar_length - - param_size = sizeof_fmt(total_param_size) - params.append(dict(name="total", param_dim=total_param_dims, size=param_size,)) - - header = [ - "name", - "shape", - "mean", - "std", - "param_dim", - "bits", - "size", - "size_cum", - "percentage", - "size_bar", - ] - - logger.info( - "param stats: \n" + tabulate.tabulate(dict2table(params, header=header)) - ) - - return total_param_size - - def net_stats_hook(module, input, output, name=""): - class_name = str(module.__class__).split(".")[-1].split("'")[0] - - flops_fun = CALC_FLOPS.get(type(module)) - if callable(flops_fun): - flops_num = flops_fun(module, input, output) - - if not isinstance(output, (list, tuple)): - output = [output] - - flops.append( - dict( - name=name, - class_name=class_name, - input_shapes=[i.shape for i in input], - output_shapes=[o.shape for o in output], - flops_num=flops_num, - flops_cum=0, - ) - ) - - if hasattr(module, "weight") and module.weight is not None: - w = module.weight - value = w.numpy() - param_dim = np.prod(w.shape) - param_bytes = get_byteswidth(w) - params.append( - dict( - name=name + "-w", - shape=w.shape, - param_dim=param_dim, - bits=param_bytes * 8, - size=param_dim * param_bytes, - size_cum=0, - mean="{:.2g}".format(value.mean()), - std="{:.2g}".format(value.std()), - ) - ) - - if hasattr(module, "bias") and module.bias is not None: - b = module.bias - value = b.numpy() - param_dim = np.prod(b.shape) - param_bytes = get_byteswidth(b) - params.append( - dict( - name=name + "-b", - shape=b.shape, - param_dim=param_dim, - bits=param_bytes * 8, - size=param_dim * param_bytes, - size_cum=0, - mean="{:.2g}".format(value.mean()), - std="{:.2g}".format(value.std()), - ) - ) - - # multiple inputs to the network - if not isinstance(input_size[0], tuple): - input_size = [input_size] - - params = [] - flops = [] - hooks = [] - - for (name, module) in model.named_modules(): - if isinstance(module, hook_modules): - hooks.append( - module.register_forward_hook(partial(net_stats_hook, name=name)) - ) - - inputs = [mge.zeros(in_size, dtype=np.float32) for in_size in input_size] - model.eval() - model(*inputs) - for h in hooks: - h.remove() - - total_flops, total_params = 0, 0 - if log_params: - total_params = print_params_stats(params) - if log_flops: - total_flops = print_flops_stats(flops) - - return total_params, total_flops diff --git a/python_module/megengine/utils/profile_analyze.py b/python_module/megengine/utils/profile_analyze.py deleted file mode 100755 index 8041c0d8..00000000 --- a/python_module/megengine/utils/profile_analyze.py +++ /dev/null @@ -1,424 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import argparse -import collections -import json -import re -import textwrap - -import numpy as np -from tabulate import tabulate - -from megengine.utils.profile_analyzer import ( - NonExistNum, - ProfileAnalyzer, - TimeFuncHelper, -) - - -def _tabulate_ml(tab, **kwargs): - """Tabulate profile output with multi-line support.""" - new_tab = [] - new_tab_is_row = [] - for row in tab: - col_lines = [str(i).split("\n") for i in row] - max_nr_line = max(map(len, col_lines)) - new_tab_is_row.append(True) - if max_nr_line > 1: - new_tab_is_row.extend([False] * (max_nr_line - 1)) - for i in col_lines: - if len(i) < max_nr_line: - i.extend([""] * (max_nr_line - len(i))) - new_tab.extend(zip(*col_lines)) - else: - new_tab.append(row) - - assert len(new_tab_is_row) == len(new_tab) - ret = [i + "\n" for i in tabulate(new_tab, **kwargs).split("\n")] - for idx, val in enumerate(new_tab_is_row): - if not val: - ret[idx * 2 + 2] = "" - return "".join(ret)[:-1] - - -def _tabulate_confluence(tab, **kwargs): - """Tabulate profile output.""" - kwargs.pop("tablefmt", None) - s = tabulate(tab, tablefmt="orgtbl", **kwargs) - lines = s.split("\n") - lines[1] = lines[1].replace("+", "|") - return "\n".join(lines) - - -def main(passed_args=None): # pylint: disable=too-many-statements - """Analyses profile info from :mod:`~.utils.profile_analyzer` . - - Run this file with ``--help`` to get more usage. - """ - parser = argparse.ArgumentParser( - description="analyze analyzer result", - formatter_class=argparse.ArgumentDefaultsHelpFormatter, - ) - parser.add_argument("dump") - parser.add_argument( - "-t", - "--top", - type=int, - default=3, - help="number of most time-consuming operators to print", - ) - parser.add_argument( - "--type", action="append", help="filter oprs in the top list by type" - ) - parser.add_argument( - "--aggregate-by", - default=None, - choices=["type"], - help="aggragate profiling result by", - ) - parser.add_argument( - "--opr-name", help="filter oprs in the top list by regex of name" - ) - parser.add_argument( - "--input-dtype", type=str, help="filter oprs in the top list by input dtype" - ) - parser.add_argument( - "--top-end-key", - default="end", - choices=["end", "kern"], - help="how time in top is calculated; end corresponds " - "to total device time, and kern corresponds to only " - "wait time", - ) - parser.add_argument( - "--aggregate", - default=None, - help="aggregate operations", - choices=["max", "min", "sum", "mean"], - ) - parser.add_argument( - "--order-by", - default="time", - help="sort result according to given column; the param can be " - " or +, meaning sorting in descending or " - "ascending order respectively", - ) - parser.add_argument( - "--copy-time", action="store_true", help="show copy time related result" - ) - parser.add_argument( - "--min-time", - type=float, - default=float("-inf"), - help="minimal time of a result to be printed", - ) - parser.add_argument( - "--max-time", - type=float, - default=float("inf"), - help="maximal time of a result to be printed", - ) - parser.add_argument( - "--show-host", action="store_true", help="show host profiling info" - ) - parser.add_argument( - "--dump-only-opr", - action="store_true", - help="only dump operator info as plaintext; useful " - "for diff between two filtered profile results", - ) - parser.add_argument( - "--confluence", - "--wiki", - action="store_true", - help="output confluence-markdown-compatible table", - ) - parser.add_argument( - "--print-only", - choices={"summary", "device", "host"}, - help="print only chosen info", - ) - - args = parser.parse_args(passed_args) - - opr_filters = [] - if args.type: - opr_filters.append(lambda o, a, b: o["type"] in args.type) - if args.opr_name: - opr_filters.append( - lambda o, a, b, r=re.compile(args.opr_name): r.match(o["name"]) - ) - if args.input_dtype: - opr_filters.append( - lambda o, a, b: any( - [i["mem_plan"]["layout"]["dtype"] == args.input_dtype for i in a] - ) - ) - if not opr_filters: - - def opr_filter(o, a, b): # pylint: disable=unused-argument - return True - - else: - - def opr_filter(o, a, b): - return all(i(o, a, b) for i in opr_filters) - - with open(args.dump) as fin: - dump = json.load(fin) - - analyzer = ProfileAnalyzer(dump, opr_filter) - analyzer_tot = ProfileAnalyzer(dump, lambda _, __, ___: True) - - def summary(): - device_end_func = TimeFuncHelper.eval_time_func("device", "end", np.max) - device_kern_func = TimeFuncHelper.eval_time_func("device", "kern", np.max) - host_end_func = TimeFuncHelper.eval_time_func("host", "end", np.max) - - def get_tot_time(func): - rec = analyzer_tot.select(func, aggregate=np.sum) - if not rec: - return "N/A" - rec = rec[0] - return rec.time - - tab = [] - tot_dev_time = get_tot_time(device_end_func) - tot_host_time = get_tot_time(host_end_func) - tab.append(("total device time", tot_dev_time)) - tab.append(("total host time", tot_host_time)) - if args.copy_time: - - def fmt(a, b): - a = a[0] - b = b[0] - return "tot={:.4f} avg={:.4f}".format(a.time, b.time) - - tab.append( - ( - "copy time", - fmt( - analyzer.select( - device_end_func, - lambda opr: opr.opr_info["type"] == "Copy", - aggregate=np.sum, - ), - analyzer.select( - device_end_func, - lambda opr: opr.opr_info["type"] == "Copy", - aggregate=np.mean, - ), - ), - ) - ) - tab.append( - ( - "copy wait time", - fmt( - analyzer.select( - device_kern_func, - lambda opr: opr.opr_info["type"] == "Copy", - aggregate=np.sum, - ), - analyzer.select( - device_kern_func, - lambda opr: opr.opr_info["type"] == "Copy", - aggregate=np.mean, - ), - ), - ) - ) - - if args.confluence: - tab_str = _tabulate_confluence(tab, headers=["name", "value"]) - else: - tab_str = tabulate(tab) - - return tab_str, tot_dev_time, tot_host_time - - def prof_details(prof_type, tot_time): - tab = [] - - def func( - opr, - *, - f0=TimeFuncHelper.eval_time_func(prof_type, args.top_end_key, np.max) - ): - t = f0(opr) - if t is not None and (t < args.min_time or t > args.max_time): - return None - return t - - records = analyzer.select( - func, - aggregate=args.aggregate, - aggregate_by=args.aggregate_by, - top_k=args.top, - sort_by=args.order_by, - ) - - if args.dump_only_opr: - ret = [] - for i in records: - ret.append(" ".join(i.info.values())) - return "\n".join(ret) - - def format_shapes(shapes, layouts=None, sep="\n"): - if isinstance(shapes, NonExistNum) or shapes is None: - return repr(shapes) - if layouts is None: - layouts = [None] * len(shapes) - - comp = [] - for i, j in zip(shapes, layouts): - i = "{" + ",".join(map(str, i)) + "}" - if j: - i += "\n -[" + ",".join(map(str, j)) + "]" - comp.append(i) - return sep.join(comp) - - def fix_num_and_find_unit(x, base): - if isinstance(x, NonExistNum) or ( - isinstance(x, float) and not np.isfinite(x) - ): - return x, "" - unit = iter(["", "K", "M", "G", "T", "P"]) - while x >= base: - x /= base - next(unit) - return x, next(unit) - - def get_number_with_unit(num, unit, base, sep="\n"): - num, unit_prefix = fix_num_and_find_unit(num, base) - if isinstance(unit, list): - unit = unit[int(unit_prefix != "")] - return ("{:.2f}" + sep + "{}{}").format(num, unit_prefix, unit) - - if args.confluence: - rows = [] - cum_time = 0 - - max_time = max([r.time for r in records]) - max_bandwidth = max([r.bandwidth for r in records]) - max_flops = max( - [r.flops for r in records if not isinstance(r.flops, NonExistNum)] - ) - - bar_length = 15 - for idx, record in enumerate(records): - cum_time += record.time - - opr_info = [("opr " + k, v) for k, v in record.info.items()] - - row = collections.OrderedDict( - [ - ("#", idx), - ("time", "{:.3}".format(record.time)), - ("ratio", "{:.1f}%".format(record.time / tot_time * 100)), - ("time bar", "#" * int(record.time / max_time * bar_length)), - ("cum-time", cum_time), - ("cum-time ratio", cum_time / tot_time), - ] - + opr_info - + [ - ( - "computation (MFLO)", - "{:.1f}".format(record.computation / 1000 ** 2), - ), - ("MFLOPS", "{:.1f}".format(record.flops / 1000 ** 2)), - ( - "MFLOPS-bar", - "" - if isinstance(record.flops, NonExistNum) - else ("#" * int(record.flops / max_flops * bar_length)), - ), - ("memory (MB)", "{:.1f}".format(record.memory / 1024 ** 2)), - ( - "bandwidth (MiB/s)", - "{:.1f}".format(record.bandwidth / 1024 ** 2), - ), - ( - "bandwidth bar", - "#" * int(record.bandwidth / max_bandwidth * bar_length), - ), - ( - "in_shapes", - format_shapes( - record.in_shapes, record.in_layouts, sep=", " - ), - ), - ("out_shapes", format_shapes(record.out_shapes, sep=", ")), - ] - ) - rows.append(row) - headers = list(rows[0].keys()) - tab = [[row[i] for i in headers] for row in rows] - - return _tabulate_confluence(tab, headers=headers) - - else: - cum_time = 0 - for idx, record in enumerate(records): - cum_time += record.time - tab.append( - ( - "#{}\n{:.3}\n{:.1f}%".format( - idx, record.time, record.time / tot_time * 100 - ), - "{:.3}\n{:.1f}%".format(cum_time, cum_time / tot_time * 100), - "\n".join( - "\n- ".join(textwrap.wrap(str(i), width=30)) - for i in record.info.values() - ), - get_number_with_unit(record.computation, "FLO", 1000), - get_number_with_unit(record.flops, "FLOPS", 1000), - get_number_with_unit(record.memory, ["byte", "iB"], 1024), - get_number_with_unit( - record.bandwidth, ["byte/s", "iB/s"], 1024 - ), - format_shapes(record.in_shapes, record.in_layouts), - format_shapes(record.out_shapes), - ) - ) - return _tabulate_ml( - tab, - headers=[ - "{} self time".format(prof_type), - "cumulative", - "operator info", - "computation", - "FLOPS", - "memory", - "bandwidth", - "in_shapes", - "out_shapes", - ], - tablefmt="fancy_grid", - ) - - summary_tab, tot_dev_time, tot_host_time = summary() - if args.print_only: - print( - { - "summary": lambda: summary_tab, - "device": lambda: prof_details("device", tot_dev_time), - "host": lambda: prof_details("host", tot_host_time), - }[args.print_only]() - ) - else: - print(summary_tab) - print() - print(prof_details("device", tot_dev_time)) - if args.show_host: - print() - print(prof_details("host", tot_host_time)) - - -if __name__ == "__main__": - main() diff --git a/python_module/megengine/utils/profile_analyzer.py b/python_module/megengine/utils/profile_analyzer.py deleted file mode 100644 index 75cc0c0c..00000000 --- a/python_module/megengine/utils/profile_analyzer.py +++ /dev/null @@ -1,401 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import collections -import copy -import functools -from typing import Callable, List, Optional, Union - -import numpy as np - - -class NonExistNum: - """An object that behaves like a number but means a field does not exist; It is - always greater than any real number - """ - - def __truediv__(self, _): - return self - - def __add__(self, rhs): - return rhs - - def __radd__(self, lhs): - return lhs - - def __neg__(self): - return self - - def __gt__(self, rhs): - if isinstance(rhs) is NonExistNum: - return id(self) > id(rhs) - return True - - def __ge__(self, rhs): - return self > rhs or self == rhs - - def __lt__(self, rhs): - if isinstance(rhs) is NonExistNum: - return id(self) < id(rhs) - return False - - def __le__(self, rhs): - return self < rhs or self == rhs - - def __eq__(self, rhs): - return self is rhs - - def __format__(self, spec): - return "N/A" - - def __repr__(self): - return "N/A" - - -class OprProfRst: - """Opr profiling result dumped from megengine profiler.""" - - opr_info = None - """A dict containing operator info: name, id and type.""" - - time_dict = None - """A mapping from ``"host"`` or ``"device"`` to list of profiling - results.""" - - footprint = None - """A mapping from ``"memory"`` or ``"computation"`` to the actual number - of corresponding operations""" - - def __init__(self, entry: dict): - """Opr profiling initialization, which sets up name, type and id of opr_info. - - :param entry: profiling json exec_graph items - """ - assert isinstance(entry, dict) - self.opr_info = collections.OrderedDict() - for key in ["name", "type", "id"]: - self.opr_info[key] = entry[key] - self.time_dict = collections.defaultdict(list) - self.footprint = collections.defaultdict(NonExistNum) - - def update_device_prof_info(self, dev_time: dict): - """Updates device profiling info - - :param dev_time: device time for single opr, - is an attribute of profiling result. - """ - assert isinstance(dev_time, dict) - self.time_dict["device"].append(copy.deepcopy(dev_time)) - - def update_host_prof_info(self, host_time: dict): - """Updates host profiling info - - :param host_time: host time for single opr, - is an attribute of profiling result. - """ - assert isinstance(host_time, dict) - self.time_dict["host"].append(copy.deepcopy(host_time)) - - def update_footprint(self, footprint: dict): - """Updates opr footprint - - :param footprint: footprint for single opr, - is an attribute of profiling result. - """ - assert isinstance(footprint, dict) - self.footprint.update(footprint) - - -class Record: - """A record of analyzing result""" - - __slot__ = [ - "time", - "info", - "computation", - "memory", - "in_shapes", - "in_layouts", - "out_shapes", - "flops", - "bandwidth", - "opr_id", - ] - - def __init__(self, time: float, info: dict, footprint: dict): - """Initializes single record - - :param time: opr running time, evaluated by applying users providing - function to OprProfRst. - :param info: opr information, could be original opr information or - aggregate infomation if aggregating enabled. - :param footprint: contains footprint information, for now, we have - ``"computation"``, ``"memory"``, ``"in_shapes"``, ``"out_shapes"``. - """ - - assert isinstance(footprint, dict) - self.time = time - self.info = collections.OrderedDict(copy.deepcopy(info)) - self.computation = footprint["computation"] or NonExistNum() - self.memory = footprint["memory"] - self.in_shapes = footprint["in_shapes"] - self.in_layouts = footprint.get("in_layouts") - self.out_shapes = footprint["out_shapes"] - self.flops = self.computation / self.time - self.bandwidth = self.memory / self.time - self.opr_id = info.get("id") - if isinstance(self.opr_id, str) and self.opr_id != "N/A": - self.opr_id = int(self.opr_id) - - def get_column_by_name(self, name: str = None): - """extracts column value by its column name - - :param name: column name, None for time. - """ - - if name is None: - name = "time" - return getattr(self, name) - - -class ProfileAnalyzer: - def __init__(self, obj: dict, opr_filter: Callable = lambda opr, inp, out: True): - """Initializes ProfileAnalyzer - - :param obj: dict dumped from json str. - :param opr_filter: function that filter oprs. - """ - self._opr_set = dict() # type: dict - assert isinstance(obj, dict) - varz = obj["graph_exec"]["var"] - for opr_id, entry in obj["graph_exec"]["operator"].items(): - inp = [varz[i] for i in entry["input"]] - out = [varz[i] for i in entry["output"]] - if opr_filter(entry, inp, out): - self._opr_set[opr_id] = OprProfRst(entry) - - for opr_id, entry in obj["profiler"]["device"].items(): - if opr_id not in self._opr_set: - continue - opr = self._opr_set[opr_id] - for _, time in entry.items(): - opr.update_device_prof_info(time) - - for opr_id, entry in obj["profiler"]["host"].items(): - if opr_id not in self._opr_set: - continue - opr = self._opr_set[opr_id] - for _, time in entry.items(): - opr.update_host_prof_info(time) - - for opr_id, entry in obj["profiler"].get("opr_footprint", {}).items(): - if opr_id not in self._opr_set: - continue - opr = self._opr_set[opr_id] - opr.update_footprint(entry) - - def _aggregate( - self, records: List[Record], aop: Union[str, Callable], atype: Optional[str] - ) -> List[Record]: - """Aggregate operation - - :param records: selected records - :param aop: aggregate operation, if aop is str, we would replace it - with associated numpy function wth aop name" - :param atype: the type aggregated by, None for aggregating all into single - record. - """ - if aop is None: - assert atype is None, "must specify aggregate op" - return records - if isinstance(aop, str): - aop = getattr(np, aop) - type2stat = collections.defaultdict(lambda: [[], [], []]) # type: dict - for item in records: - if atype == "type": - d = type2stat[item.info["type"]] - else: - d = type2stat["all"] - d[0].append(item.time) - d[1].append(item.computation) - d[2].append(item.memory) - - rst = [] - for opr_type in type2stat.keys(): - time, computation, memory = type2stat[opr_type] - nr_oprs = len(time) - time_rst = aop(time) - comp_rst = aop(computation) - mem_rst = aop(memory) - - item = Record( - time_rst, - {"type": opr_type, "count": nr_oprs, "id": "N/A"}, - { - "computation": comp_rst, - "memory": mem_rst, - "in_shapes": None, - "out_shapes": None, - }, - ) - rst.append(item) - return rst - - def _sort(self, records: List[Record], sort_by: str) -> List[Record]: - """sort operation - - :param records: the records after aggregate operation. - :param sort_by: keyword for sorting the list - """ - if sort_by is None: - return records - if sort_by.startswith("+"): - sort_by = sort_by[1:] - key = lambda record: record.get_column_by_name(sort_by) - else: - key = lambda record: -record.get_column_by_name(sort_by) - records.sort(key=key) - return records - - def select( - self, - time_func: Callable, - opr_filter: Callable = lambda opr: True, - aggregate: Callable = None, - aggregate_by: str = None, - sort_by: str = None, - top_k: int = 0, - ) -> List[Record]: - """Select operation - - :param time_func: time_func provided by user, would apply to every - OprProfRst - :param opr_filter: filter satisfied operatiors. - :param aggregate: function that apply to list of records which are - aggregated by atype - :param aggregate_by: the type aggregated by - :param sort_by: keyword for sorting all records. - :param top_k: specify the maximum number of records. - :return: the records that go through select, aggregate, sort. - """ - - records = [] - for opr in self._opr_set.values(): - if opr_filter(opr): - time = time_func(opr) - if time is None: - continue - item = Record(time, opr.opr_info, opr.footprint) - records.append(item) - - records = self._aggregate(records, aggregate, aggregate_by) - if not records: - return records - return self._sort(records, sort_by)[0 : len(records) if top_k == 0 else top_k] - - -class TimeFuncHelper: - """Time Function Helper for users.""" - - @staticmethod - def _eval_time(prof_type, end_key, func, opr_prof): - """Eval time - - :type prof_type: str - :param prof_type: 'host' or 'device' - :type end_key: str - :param end_key: 'kern' or 'end' - :type func: function - :param func: apply to list of all ``thread`` of ``gpu`` time. - :type opr_prof: `class OprProfRst` - :param opr_prof: operator profiling result - :rtype: float - :return: time - """ - - if prof_type not in opr_prof.time_dict: - return None - time = [time[end_key] - time["start"] for time in opr_prof.time_dict[prof_type]] - return func(time) - - @staticmethod - def eval_time_func(prof_type: str, end_key: str, func: Callable) -> float: - """Eval oprerator profile time. - - :param prof_type: 'host' or 'device' - :param end_key: 'kern' or 'end' - :param func: apply to list of all ``thread`` of ``gpu`` time. - :return: Eval time results - """ - return functools.partial(TimeFuncHelper._eval_time, prof_type, end_key, func) - - @staticmethod - def _min_start( - prof_type, end_key, func, opr_prof - ): # pylint: disable=unused-argument - """Eval minimum start time - - :type prof_type: str - :param prof_type: 'host' or 'device' - :type end_key: str - :param end_key: 'kern' or 'end' - :type func: function - :param func: apply to list of all ``thread`` of ``gpu`` time. - :type opr_prof: `class OprProfRst` - :param opr_prof: operator profiling result - :rtype: float - :return: time - """ - if prof_type not in opr_prof.time_dict: - return None - time = [time["start"] for time in opr_prof.time_dict[prof_type]] - return np.min(time) - - @staticmethod - def min_start_func( - prof_type: str, end_key: str, func: Callable - ) -> float: # pylint: disable=unused-argument - """Eval oprerator profile min start time - - :param prof_type: 'host' or 'device' - :param end_key: 'kern' or 'end' - :param func: apply to list of all ``thread`` of ``gpu`` time. - :return: Eval time results - """ - return functools.partial(TimeFuncHelper._min_start, prof_type, end_key, func) - - @staticmethod - def _max_end(prof_type, end_key, func, opr_prof): # pylint: disable=unused-argument - """Eval maximum end time - - :type prof_type: str - :param prof_type: 'host' or 'device' - :type end_key: str - :param end_key: 'kern' or 'end' - :type func: function - :param func: apply to list of all ``thread`` of ``gpu`` time. - :type opr_prof: `class OprProfRst` - :param opr_prof: operator profiling result - :rtype: float - :return: time - """ - if prof_type not in opr_prof.time_dict: - return None - time = [time["end"] for time in opr_prof.time_dict[prof_type]] - return np.max(time) - - @staticmethod - def max_end_func(prof_type: str, end_key: str, func: Callable) -> float: - """Eval oprerator profile max end time - - :param prof_type: 'host' or 'device' - :param end_key: 'kern' or 'end' - :param func: apply to list of all ``thread`` of ``gpu`` time. - :return: Eval time results - """ - return functools.partial(TimeFuncHelper._max_end, prof_type, end_key, func) diff --git a/python_module/megengine/utils/types.py b/python_module/megengine/utils/types.py deleted file mode 100644 index 465ca03c..00000000 --- a/python_module/megengine/utils/types.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import collections -import functools - - -def get_ndtuple(value, *, n, allow_zero=True): - r"""Converts possibly 1D tuple to nd tuple - - :type allow_zero: bool - :param allow_zero: whether to allow zero tuple value""" - if not isinstance(value, collections.Iterable): - value = int(value) - value = tuple([value for i in range(n)]) - else: - assert len(value) == n, "tuple len is not equal to n: {}".format(value) - spatial_axis = map(int, value) - value = tuple(spatial_axis) - if allow_zero: - minv = 0 - else: - minv = 1 - assert min(value) >= minv, "invalid value: {}".format(value) - return value - - -_single = functools.partial(get_ndtuple, n=1, allow_zero=True) -_pair = functools.partial(get_ndtuple, n=2, allow_zero=True) -_pair_nonzero = functools.partial(get_ndtuple, n=2, allow_zero=False) -_triple = functools.partial(get_ndtuple, n=3, allow_zero=True) -_quadruple = functools.partial(get_ndtuple, n=4, allow_zero=True) diff --git a/python_module/megengine/version.py b/python_module/megengine/version.py deleted file mode 100644 index 3d187266..00000000 --- a/python_module/megengine/version.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = "0.5.0" diff --git a/python_module/requires-style.txt b/python_module/requires-style.txt deleted file mode 100644 index 899aac52..00000000 --- a/python_module/requires-style.txt +++ /dev/null @@ -1,4 +0,0 @@ -black==19.10b0 -isort==4.3.21 -pylint==2.4.3 -mypy==0.750 diff --git a/python_module/requires-test.txt b/python_module/requires-test.txt deleted file mode 100644 index 9e732684..00000000 --- a/python_module/requires-test.txt +++ /dev/null @@ -1,3 +0,0 @@ -pytest==5.3.0 -pytest-sphinx>=0.2.2 -pytest-json-report>=1.2.1 diff --git a/python_module/requires.txt b/python_module/requires.txt deleted file mode 100644 index 5ebb52a3..00000000 --- a/python_module/requires.txt +++ /dev/null @@ -1,7 +0,0 @@ -numpy>=1.17 -opencv-python -pyarrow -requests -tabulate -tqdm -redispy diff --git a/python_module/setup.py b/python_module/setup.py deleted file mode 100644 index 414f4fcf..00000000 --- a/python_module/setup.py +++ /dev/null @@ -1,118 +0,0 @@ -# -*- coding: utf-8 -*- -# This file is part of MegBrain. -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. - -import os -import re -import pathlib -import platform -from distutils.file_util import copy_file -from setuptools import setup, find_packages, Extension -from setuptools.command.build_ext import build_ext as _build_ext - -class PrecompiledExtesion(Extension): - def __init__(self, name): - super().__init__(name, sources=[]) - -class build_ext(_build_ext): - - def build_extension(self, ext): - if not isinstance(ext, PrecompiledExtesion): - return super().build_extension(ext) - - if not self.inplace: - fullpath = self.get_ext_fullpath(ext.name) - extdir = pathlib.Path(fullpath) - extdir.parent.mkdir(parents=True, exist_ok=True) - - modpath = self.get_ext_fullname(ext.name).split('.') - if platform.system() == "Windows": - modpath[-1] += '.pyd' - else: - modpath[-1] += '.so' - modpath = str(pathlib.Path(*modpath).resolve()) - - copy_file(modpath, fullpath, verbose=self.verbose, dry_run=self.dry_run) - -package_name = 'MegEngine' - -v = {} -with open("megengine/version.py") as fp: - exec(fp.read(), v) -__version__ = v['__version__'] - -email = 'megengine@megvii.com' -local_version = os.environ.get('LOCAL_VERSION') -if local_version: - __version__ = '{}+{}'.format(__version__, local_version) - -packages = find_packages(exclude=['test']) -package_data = [ - str(f.relative_to('megengine')) - for f in pathlib.Path('megengine', '_internal', 'include').glob('**/*') -] -package_data += [ - str(f.relative_to('megengine')) - for f in pathlib.Path('megengine', '_internal', 'lib').glob('**/*') -] -package_data += [ - os.path.join('module', 'pytorch', 'torch_mem_fwd.cpp') -] - -with open('requires.txt') as f: - requires = f.read().splitlines() -with open('requires-style.txt') as f: - requires_style = f.read().splitlines() -with open('requires-test.txt') as f: - requires_test = f.read().splitlines() - -setup_kwargs = dict( - name=package_name, - version=__version__, - description='Framework for numerical evaluation with ' - 'auto-differentiation', - author='Megvii Engine Team', - author_email=email, - packages=packages, - package_data={ - 'megengine': package_data, - }, - ext_modules=[PrecompiledExtesion('megengine._internal._mgb')], - install_requires=requires, - extras_require={ - 'dev': requires_style + requires_test, - 'ci': requires_test, - }, - cmdclass={'build_ext': build_ext}, -) - - -setup_kwargs.update(dict( - classifiers=[ - 'Development Status :: 3 - Alpha', - 'Intended Audience :: Developers', - 'Intended Audience :: Education', - 'Intended Audience :: Science/Research', - 'License :: OSI Approved :: Apache Software License', - 'Programming Language :: C++', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.5', - 'Programming Language :: Python :: 3.6', - 'Programming Language :: Python :: 3.7', - 'Programming Language :: Python :: 3.8', - 'Topic :: Scientific/Engineering', - 'Topic :: Scientific/Engineering :: Mathematics', - 'Topic :: Scientific/Engineering :: Artificial Intelligence', - 'Topic :: Software Development', - 'Topic :: Software Development :: Libraries', - 'Topic :: Software Development :: Libraries :: Python Modules', - ], - license='Apache 2.0', - keywords='megengine deep learning', - data_files = [("megengine", [ - "../LICENSE", - "../ACKNOWLEDGMENTS", - ])] -)) - -setup(**setup_kwargs) diff --git a/python_module/src/cpp/bfloat16.cpp b/python_module/src/cpp/bfloat16.cpp deleted file mode 100644 index 712e5219..00000000 --- a/python_module/src/cpp/bfloat16.cpp +++ /dev/null @@ -1,296 +0,0 @@ -/** - * \file python_module/src/cpp/bfloat16.cpp - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * \brief numpy dtypes for bfloat16 - * - * \copyright Copyright (c) 2014-2020 Megvii Inc. All rights reserved. - * - */ - -#include "megbrain/common.h" -#include "megbrain/dtype.h" - -#include -#include - -#define NO_IMPORT_ARRAY 1 -#include "./numpy_incl.h" - -#pragma GCC diagnostic ignored "-Wmissing-field-initializers" - -namespace { - -struct BFloat16Type { - static int npy_typenum; - mgb::dt_bfloat16 value; - - struct PyObj; - struct NpyType; - - template - struct NpyCast; -}; - -int BFloat16Type::npy_typenum; - -/* ==================== BFloat16Type::NpyCast ==================== */ - -template -struct BFloat16Type::NpyCast { - static void apply(void* from_, void* to_, npy_intp n, void* /*fromarr*/, - void* /*toarr*/) { - auto from = static_cast(from_); - auto to = static_cast(to_); - for (npy_intp i = 0; i < n; ++i) { - float cur = static_cast(from[i]); - to[i].value = cur; - } - } -}; - -template -struct BFloat16Type::NpyCast { - static void apply(void* from_, void* to_, npy_intp n, void* /*fromarr*/, - void* /*toarr*/) { - auto from = static_cast(from_); - auto to = static_cast(to_); - for (npy_intp i = 0; i < n; ++i) { - to[i] = from[i].value; - } - } -}; - -/* ==================== BFloat16Type::PyObj ==================== */ -struct BFloat16Type::PyObj { - PyObject_HEAD BFloat16Type obj; - - static PyTypeObject py_type; - - static PyObject* from_bfloat16(BFloat16Type val) { - auto p = reinterpret_cast(py_type.tp_alloc(&py_type, 0)); - p->obj.value = val.value; - return reinterpret_cast(p); - } - - static PyObject* py_new(PyTypeObject* type, PyObject* args, PyObject* kwds); - static PyObject* py_repr(PyObject* obj); - static PyObject* py_richcompare(PyObject* a, PyObject* b, int op); -}; -PyTypeObject BFloat16Type::PyObj::py_type; - -PyObject* BFloat16Type::PyObj::py_new(PyTypeObject* type, PyObject* args, - PyObject* kwds) { - PyObj* self; - Py_ssize_t size; - - self = (PyObj*)type->tp_alloc(type, 0); - - size = PyTuple_GET_SIZE(args); - if (size > 1) { - PyErr_SetString(PyExc_TypeError, "BFloat16Type Only has 1 parameter"); - return NULL; - } - PyObject* x = PyTuple_GET_ITEM(args, 0); - if (PyObject_IsInstance(x, (PyObject*)&py_type)) { - Py_INCREF(x); - return x; - } - - if (!PyFloat_Check(x)) { - PyErr_SetString(PyExc_TypeError, - "BFloat16Type must be initialized wit float"); - return NULL; - } - - const float s = PyFloat_AsDouble(x); - - self->obj.value = s; - - return (PyObject*)self; -} - -PyObject* BFloat16Type::PyObj::py_repr(PyObject* obj) { - float fval = static_cast(((PyObj*)obj)->obj.value); - return PyUnicode_FromString(mgb::ssprintf("%f", fval).c_str()); -} - -PyObject* BFloat16Type::PyObj::py_richcompare(PyObject* a, PyObject* b, - int op) { - mgb_assert(PyObject_IsInstance(a, (PyObject*)&py_type)); - auto bval = PyFloat_AsDouble(b); - if (bval == -1 && PyErr_Occurred()) { - return NULL; - } - double aval = ((PyObj*)a)->obj.value; -#define OP(py, op) \ - case py: { \ - if (aval op bval) { \ - Py_RETURN_TRUE; \ - } else { \ - Py_RETURN_FALSE; \ - } \ - } - switch (op) { - OP(Py_LT, <) - OP(Py_LE, <=) - OP(Py_EQ, ==) - OP(Py_NE, !=) - OP(Py_GT, >) - OP(Py_GE, >=) - }; -#undef OP - return Py_NotImplemented; -} - -/* ==================== BFloat16Type::NpyType ==================== */ -struct BFloat16Type::NpyType { - static PyArray_ArrFuncs funcs; - static PyArray_Descr descr; - - static bool init(); - - static void copyswap(void* dst, void* src, int swap, void* /*arr*/) { - if (src) { - mgb_assert(!swap); - memcpy(dst, src, sizeof(BFloat16Type)); - } - } - static PyObject* getitem(void* data, void* ap) { - return BFloat16Type::PyObj::from_bfloat16( - *static_cast(data)); - } - static int setitem(PyObject* op, void* ov, void* ap); -}; - -PyArray_ArrFuncs BFloat16Type::NpyType::funcs; -PyArray_Descr BFloat16Type::NpyType::descr; - -int BFloat16Type::NpyType::setitem(PyObject* op, void* ov, void* ap) { - if (PyLong_Check(op)) { - int a = PyLong_AsLong(op); - static_cast(ov)->value = a; - } else if (PyFloat_Check(op)) { - float a = PyFloat_AsDouble(op); - static_cast(ov)->value = a; - } else if (PyObject_IsInstance( - op, (PyObject*)(&(BFloat16Type::PyObj::py_type)))) { - static_cast(ov)->value = ((PyObj*)op)->obj.value; - } else { - PyErr_SetString(PyExc_ValueError, - "input type must be int/float/bfloat16"); - return -1; - } - return 0; -} - -bool BFloat16Type::NpyType::init() { - descr = {PyObject_HEAD_INIT(0) & BFloat16Type::PyObj::py_type, - 'V', // kind - 'f', // type - '=', // byteorder - NPY_NEEDS_PYAPI | NPY_USE_GETITEM | NPY_USE_SETITEM, - 1, // type num - sizeof(BFloat16Type), - alignof(BFloat16Type), - NULL, - NULL, - NULL, - &funcs}; - Py_TYPE(&descr) = &PyArrayDescr_Type; - PyArray_InitArrFuncs(&funcs); - funcs.copyswap = copyswap; - funcs.getitem = getitem; - funcs.setitem = setitem; - npy_typenum = PyArray_RegisterDataType(&descr); - -#define REGISTER_CAST(From, To, From_descr, To_typenum, safe) \ - { \ - PyArray_Descr* from_descr = (From_descr); \ - if (PyArray_RegisterCastFunc(from_descr, (To_typenum), \ - NpyCast::apply) < 0) { \ - return false; \ - } \ - if (safe && PyArray_RegisterCanCast(from_descr, (To_typenum), \ - NPY_NOSCALAR) < 0) { \ - return false; \ - } \ - } -#define REGISTER_INT_CASTS(bits) \ - REGISTER_CAST(npy_int##bits, BFloat16Type, \ - PyArray_DescrFromType(NPY_INT##bits), \ - BFloat16Type::npy_typenum, 1) \ - REGISTER_CAST(BFloat16Type, npy_int##bits, &descr, NPY_INT##bits, 0) \ - REGISTER_CAST(npy_uint##bits, BFloat16Type, \ - PyArray_DescrFromType(NPY_UINT##bits), \ - BFloat16Type::npy_typenum, 1) \ - REGISTER_CAST(BFloat16Type, npy_uint##bits, &descr, NPY_UINT##bits, 0) - - REGISTER_INT_CASTS(8) - REGISTER_INT_CASTS(16) - REGISTER_INT_CASTS(32) - REGISTER_INT_CASTS(64) - REGISTER_CAST(BFloat16Type, float, &descr, NPY_FLOAT, 0) - REGISTER_CAST(float, BFloat16Type, PyArray_DescrFromType(NPY_FLOAT), - BFloat16Type::npy_typenum, 0) - REGISTER_CAST(BFloat16Type, double, &descr, NPY_DOUBLE, 1) - REGISTER_CAST(double, BFloat16Type, PyArray_DescrFromType(NPY_DOUBLE), - BFloat16Type::npy_typenum, 0) - return true; -} - -} // anonymous namespace - -bool init_pytype_bfloat16() { - auto& py_type = BFloat16Type::PyObj::py_type; - py_type = {PyVarObject_HEAD_INIT(NULL, 0)}; - py_type.tp_name = "megbrain._mgb.pybfloat16"; - py_type.tp_basicsize = sizeof(BFloat16Type::PyObj); - py_type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; - py_type.tp_doc = "bfloat16 type"; - py_type.tp_new = BFloat16Type::PyObj::py_new; - py_type.tp_str = BFloat16Type::PyObj::py_repr; - py_type.tp_repr = BFloat16Type::PyObj::py_repr; - py_type.tp_richcompare = BFloat16Type::PyObj::py_richcompare; - py_type.tp_base = &PyGenericArrType_Type; - return PyType_Ready(&py_type) >= 0; -} - -void register_pytype_bfloat16(PyObject* d, PyObject* m) { - Py_INCREF(&BFloat16Type::PyObj::py_type); - PyDict_SetItemString(d, "bfloat16_pytype", - (PyObject*)&BFloat16Type::PyObj::py_type); - PyModule_AddObject(m, "bfloat16_pytype", - (PyObject*)&BFloat16Type::PyObj::py_type); -} - -//! called from swig init -void _init_bfloat16_types(PyObject* m) { - if (m == NULL) - return; - PyObject* d = PyModule_GetDict(m); - PyArray_Descr* dtype; - if (!init_pytype_bfloat16()) - return; - if (!BFloat16Type::NpyType::init()) - return; - dtype = PyArray_DescrFromType(BFloat16Type::npy_typenum); - if (!dtype) - return; - { - PyObject* pytype = (PyObject*)(&BFloat16Type::PyObj::py_type); - Py_INCREF(pytype); - PyDict_SetItemString(d, "pybfloat16", pytype); - } - Py_INCREF(dtype); - PyDict_SetItemString(d, "bfloat16", (PyObject*)dtype); - register_pytype_bfloat16(d, m); - return; -} - -int mgb::npy_num_bfloat16() { - return BFloat16Type::npy_typenum; -} - -// vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} diff --git a/python_module/src/cpp/craniotome.cpp b/python_module/src/cpp/craniotome.cpp deleted file mode 100644 index af9d17b0..00000000 --- a/python_module/src/cpp/craniotome.cpp +++ /dev/null @@ -1,435 +0,0 @@ -/** - * \file python_module/src/cpp/craniotome.cpp - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * \copyright Copyright (c) 2014-2020 Megvii Inc. All rights reserved. - * - */ - -#include "./craniotome.h" -#include "./python_helper.h" -#include "megbrain/comp_node_env.h" -#include "megbrain/graph/grad_impl.h" -#include "megbrain/serialization/sereg.h" - -using namespace mgb; -using namespace opr; - -MGB_DYN_TYPE_OBJ_FINAL_IMPL(CraniotomeDesc); -MGB_DYN_TYPE_OBJ_FINAL_IMPL(Craniotome); - - -bool CraniotomeDesc::is_same_st(const mgb::Hashable &rhs) const { - auto rp = static_cast(rhs).py_self(); - size_t ref0 = rp->ob_refcnt; - bool ret; - { - PYTHON_GIL; - Py_INCREF(rp); - ret = _is_same(rp); - } - size_t ref1 = rp->ob_refcnt; - mgb_assert(ref0 == ref1, - "reference count changed from %zu to %zu", - ref0, ref1); - return ret; -} - -size_t CraniotomeDesc::hash() const { - return _hash(); -} - - -PyObject* CraniotomeDesc::py_self() const { - if (!m_py_self) { - PYTHON_GIL; - PyObject* dst = PyList_New(0); - mgb_assert(dst); - PyObjRefKeeper dst_ref{dst}; - - Py_INCREF(dst); - _setup_self(dst); - mgb_assert(dst->ob_refcnt == 1); - - mgb_assert(PyList_Size(dst) == 1); - m_py_self = PyList_GetItem(dst, 0); - } - - return m_py_self; -} - -class Craniotome::FuncDelCallbackInvoker final - : public UserDataContainer::UserData { - MGB_TYPEINFO_OBJ_DECL; - SmallVector m_oprs; - -public: - ~FuncDelCallbackInvoker() { - Craniotome* cur_opr = nullptr; - MGB_MARK_USED_VAR(cur_opr); - MGB_TRY { - std::vector arr; - for (auto i : m_oprs) { - cur_opr = i; - mgb_assert(i->m_on_graph_compile_called); - i->m_desc->_on_graph_compile_or_func_del(arr); - i->m_on_graph_compile_called = false; - } - } - MGB_HANDLE_EXCEPTION_DTOR( - ssprintf("craniotome opr %s", cur_opr->cname()).c_str()); - } - void add(Craniotome* opr) { m_oprs.push_back(opr); } -}; -MGB_TYPEINFO_OBJ_IMPL(Craniotome::FuncDelCallbackInvoker); - -Craniotome::Craniotome( - mgb::ComputingGraph *graph, std::unique_ptr desc, - const VarNodeArray &inputs, const OperatorNodeConfig &config): - Super{graph, config, desc->_get_opr_type_name().c_str(), inputs}, - m_node_flag{desc->_node_flag()}, - m_desc{std::move(desc)} -{ - for (auto i: inputs) - add_input({i}); - m_nr_dev_value_inp = input().size() - m_desc->_get_nr_dev_comp_order_deps(); - m_desc->_get_all_io_vars = [this]() { - SymbolVarArray ret; - ret.reserve(input().size() + output().size()); - for (auto i: input()) - ret.push_back(i); - for (auto i: output()) - ret.push_back(i); - return ret; - }; - - auto nr_out = m_desc->_get_nr_outputs(); - if (nr_out > 1) { - for (size_t i = 0, it = nr_out; i < it; ++ i) - add_output(ssprintf("o%zu", i)); - } else { - mgb_assert(nr_out == 1, - "could not create an operator with %zu outputs: %s", - nr_out, cname()); - add_output(None); - } - if (output_no_sys_mem_alloc()) { - for (auto i: output()) - i->add_flag(VarNode::Flag::NO_SYS_MEM_ALLOC); - } - if (m_node_flag & NodeFlag::ALLOW_EMPTY_OUTPUT) { - for (auto i: output()) - i->add_flag(VarNode::Flag::ALLOW_EMPTY_SHAPE); - } - add_equivalence_component(m_desc.get()); - - // init comp node early because desc may access it - this->init_output_comp_node(); - m_desc->owner_opr = this; -} - -Craniotome::~Craniotome() noexcept { - if (m_on_graph_compile_called) { - m_desc->_on_graph_compile_or_func_del({}); - m_on_graph_compile_called = false; - } -} - -Craniotome::NodeProp* Craniotome::do_make_node_prop() const { - auto ret = Super::do_make_node_prop(); - if (m_node_flag & NodeFlag::DISALLOW_DUPLICATE) { - ret->add_flag(NodeProp::Flag::NO_AUTOMATIC_DUP); - } - if (m_nr_dev_value_inp < input().size()) { - using DT = NodeProp::DepType; - SmallVector
dep_types(input().size(), DT::DEV_VALUE); - for (size_t i = m_nr_dev_value_inp; i < dep_types.size(); ++i) { - dep_types[i] = DT::DEV_COMP_ORDER; - } - ret->reset_dep_type(input(), dep_types); - } - return ret; -} - -void Craniotome::scn_do_execute() { - m_prev_inferred_shape.invalidate(); - auto &&env = CompNodeEnv::from_comp_node(comp_node()); - env.activate(); - std::vector inpval(m_nr_dev_value_inp); - std::vector outval(output().size()); - auto dest_cn = comp_node(); - for (size_t i = 0; i < inpval.size(); ++ i) { - auto ivar = input(i); - if (ivar->comp_node() == dest_cn) { - inpval[i].setup(input(i)->dev_tensor(), false); - } else { - auto tensor = input(i)->dev_tensor(); - tensor.comp_node(dest_cn); - inpval[i].setup(tensor, false); - } - } - - TensorShapeArray orig_shape; - std::vector orig_ptr; - if (output_no_sys_mem_alloc()) { - for (size_t i = 0; i < outval.size(); ++ i) - outval[i].assign(output(i)); - } else { - for (size_t i = 0; i < outval.size(); ++ i) { - outval[i].assign(output(i)->dev_tensor()); - orig_shape.push_back(output(i)->shape()); - orig_ptr.push_back(output(i)->dev_tensor().raw_ptr()); - } - } - m_desc->_execute(inpval, outval); - mgb_assert(outval.size() == output().size()); - if (!output_no_sys_mem_alloc()) { - for (size_t i = 0; i < outval.size(); ++ i) { - mgb_assert(output(i)->shape().eq_shape(orig_shape[i]) && - orig_ptr[i] == output(i)->dev_tensor().raw_ptr(), - "%s: shape or ptr of output %zu changed", - cname(), i); - } - } -} - -void Craniotome::get_output_var_shape(const TensorShapeArray &inp_shape, - TensorShapeArray &out_shape) const { - TensorShapeVec cvt_ishp(inp_shape.size()); - for (size_t i = 0; i < cvt_ishp.size(); ++ i) - cvt_ishp[i] = npy::shape2vec(inp_shape[i]); - auto cvt_oshp = m_desc->_infer_shape(cvt_ishp); - mgb_assert(cvt_oshp.size() == output().size()); - out_shape.resize(cvt_oshp.size()); - for (size_t i = 0; i < cvt_oshp.size(); ++ i) - out_shape[i] = npy::vec2shape(cvt_oshp[i]); -} - -MGB_IMPL_OPR_GRAD(Craniotome) { - if (wrt_idx >= opr.nr_dev_value_inp()) { - return nullptr; - } - SymbolVarArray isv(opr.nr_dev_value_inp()), osv(opr.output().size()), - ogsv(out_grad.size()); - for (size_t i = 0; i < isv.size(); ++i) - isv[i] = opr.input(i); - for (size_t i = 0; i < osv.size(); ++i) - osv[i] = opr.output(i); - for (size_t i = 0; i < out_grad.size(); ++i) - ogsv[i] = out_grad[i]; - - auto ret = cg::to_var_node_array(const_cast(opr.desc()) - ._grad(wrt_idx, isv, osv, ogsv)); - - auto update_shape = [&opr](size_t i, VarNode* var) { - auto inp = opr.input(i); - if (var && cg::is_static_var_shape(inp) && - !cg::is_static_var_shape(var)) { - var = SymbolVar{var}.reshape(SymbolVar{inp}.symshape()).node(); - } - return var; - }; - if (ret.size() != 1) { - mgb_assert(ret.size() == opr.input().size()); - for (size_t i = 0; i < ret.size(); ++i) { - ret[i] = update_shape(i, ret[i]); - } - return ret; - } - return update_shape(wrt_idx, ret[0]); -} - -void Craniotome::add_input_layout_constraint() { - for (auto i : input()) - i->add_layout_constraint_contiguous(); - - if (!m_on_graph_compile_called) { - // check used outputs and call _on_graph_compile - auto graph = owner_graph(); - auto&& out = output(); - std::vector used_outputs; - used_outputs.reserve(out.size()); - for (size_t i = 0; i < out.size(); ++i) { - if (!graph->var_receiver_in_current_comp_seq(out[i]).empty()) { - used_outputs.push_back(i); - } - } - mgb_assert(!used_outputs.empty()); - m_desc->_on_graph_compile_or_func_del(used_outputs); - auto seq = graph->current_comp_seq(); - if (seq) { - seq->user_data() - .get_user_data_or_create() - ->add(this); - } else { - mgb_assert(graph->options().eager_evaluation); - } - m_on_graph_compile_called = true; - } -} - -SymbolVarArray Craniotome::make( - std::unique_ptr desc, - const SymbolVarArray &inputs, - const OperatorNodeConfig &config) { - VarNodeArray inp_vn(inputs.size()); - for (size_t i = 0; i < inputs.size(); ++ i) - inp_vn[i] = inputs[i].node(); - ComputingGraph *graph; - if (!inputs.empty()) { - graph = inp_vn[0]->owner_graph(); - } else { - graph = &desc->_get_comp_graph().get(); - mgb_assert(graph); - } - auto opr = graph->insert_opr( - std::make_unique( - graph, std::move(desc), inp_vn, config)); - SymbolVarArray rst; - for (auto i: opr->output()) - rst.push_back(i); - return rst; -} - -void Craniotome::init_output_static_infer_desc() { - if (!(m_node_flag & NodeFlag::DYNAMIC_OUTPUT_SHAPE)) { - Super::init_output_static_infer_desc(); - } else if (input().empty()) { - using namespace cg::static_infer; - auto &&mgr = owner_graph()->static_infer_manager(); - for (size_t idx = 0; idx < output().size(); ++ idx) { - auto infer = [this, idx](TensorShape &dest, const InpVal &) { - if (!m_prev_inferred_shape.valid()) { - auto &&shp = m_prev_inferred_shape.emplace(); - shp.resize(output().size()); - get_output_var_shape({}, shp); - } - dest = m_prev_inferred_shape->at(idx); - return true; - }; - mgr.register_shape_infer(output(idx), - {SourceType::MUTABLE, {}, infer}); - } - } -} - -void Craniotome::init_output_dtype() { - PYTHON_GIL; - - auto input_dtypes = PyList_New(input().size()), - ret = PyList_New(output().size()); - mgb_assert(input_dtypes); - PyObjRefKeeper input_dtypes_ref{input_dtypes}; - - mgb_assert(ret); - PyObjRefKeeper ret_ref{ret}; - - for (size_t i = 0; i < input().size(); ++ i) { - auto err = PyList_SetItem(input_dtypes, i, - npy::dtype_mgb2np(input(i)->dtype())); - mgb_assert(!err); - } - - // it seems that we need to incref before passing it to swig director method - Py_INCREF(input_dtypes); - Py_INCREF(ret); - if (!m_desc->_init_output_dtype(input_dtypes, ret)) { - Super::init_output_dtype(); - return; - } - - mgb_assert(PyList_Check(ret), - "_init_output_dtype should return list"); - mgb_assert(PyList_Size(ret) == static_cast(output().size()), - "_init_output_dtype list size not equal to number of outputs"); - for (size_t i = 0; i < output().size(); ++ i) { - auto cur = PyList_GetItem(ret, i); - mgb_assert(cur, "failed to get dtype for output %zu", i); - output(i)->dtype(npy::dtype_np2mgb(cur)); - } - - mgb_assert(input_dtypes->ob_refcnt == 1); - mgb_assert(ret->ob_refcnt == 1); -} - -// serialization -namespace { - - void craniotome_dumper( - serialization::OprDumpContext &ctx, - const cg::OperatorNodeBase &opr) { - - auto &&desc = opr.cast_final_safe().desc(); - auto result = PyList_New(0); - mgb_assert(result); - PyObjRefKeeper result_ref{result}; - - Py_INCREF(result); - desc._setup_serialize_params(result); - mgb_assert(result->ob_refcnt == 1); - - auto sz = PyList_Size(result); - mgb_assert(sz >= 1 && sz <= 2); - - auto name_obj = PyList_GetItem(result, 0); - mgb_assert(name_obj && PyUnicode_Check(name_obj)); - Py_ssize_t name_size; - const char *name_str = PyUnicode_AsUTF8AndSize(name_obj, &name_size); - mgb_assert(name_str); - - char *param_str = nullptr; - Py_ssize_t param_size = 0; - if (sz == 2) { - auto param_obj = PyList_GetItem(result, 1); - mgb_assert(param_obj && PyBytes_Check(param_obj)); - auto err = PyBytes_AsStringAndSize( - param_obj, ¶m_str, ¶m_size); - mgb_assert(!err); - } - - - ctx.dump_buf_with_len(name_str, name_size); - if (param_str) { - ctx.dump_buf_with_len(param_str, param_size); - } - } - - cg::OperatorNodeBase* craniotome_shallow_copy( - const serialization::OprShallowCopyContext &ctx, - const cg::OperatorNodeBase &opr, const VarNodeArray &inputs, - const OperatorNodeConfig &config) { - - MGB_MARK_USED_VAR(ctx); - auto &&orig_desc = opr.cast_final_safe().desc(); - std::unique_ptr desc; - mgb_assert(!orig_desc._set_copy_result); - orig_desc._set_copy_result = [&desc](CraniotomeDesc *r) { - mgb_assert(!desc); - desc.reset(r); - }; - orig_desc._copy(); - mgb_assert(desc); - orig_desc._set_copy_result = {}; - - mgb_assert(&orig_desc != desc.get()); - return Craniotome::make(std::move(desc), - {inputs.begin(), inputs.end()}, config).at(0).node( - )->owner_opr(); - } - - class _RegDumper { - public: - _RegDumper() { - serialization::OprRegistry::add_using_dynamic_loader( - Craniotome::typeinfo(), "Craniotome", - craniotome_dumper); - MGB_REG_OPR_SHALLOW_COPY_IMPL( - Craniotome, craniotome_shallow_copy); - } - }; - _RegDumper _reg_dumper; - -} // anonymous namespace - -// vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} diff --git a/python_module/src/cpp/craniotome.h b/python_module/src/cpp/craniotome.h deleted file mode 100644 index d4754cb0..00000000 --- a/python_module/src/cpp/craniotome.h +++ /dev/null @@ -1,193 +0,0 @@ -/** - * \file python_module/src/cpp/craniotome.h - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * \brief extend megbrain operators in python - * - * \copyright Copyright (c) 2014-2020 Megvii Inc. All rights reserved. - * - */ - -#pragma once - -#include "megbrain/graph/operator_node.h" -#include "./megbrain_wrap.h" - -using TensorShapeVec = std::vector>; -using SymbolVarArray = mgb::SymbolVarArray; - -namespace mgb { -namespace opr { -class Craniotome; -} // namespace opr -} // namespace mgb - -class CraniotomeDesc: public mgb::Hashable { - MGB_DYN_TYPE_OBJ_FINAL_DECL; - - mutable PyObject *m_py_self = nullptr; - - bool is_same_st(const mgb::Hashable &rhs) const override; - - size_t hash() const override; - - public: - struct NodeFlag { - static constexpr uint32_t - DYNAMIC_OUTPUT_SHAPE = 1 << 0, - DISALLOW_DUPLICATE = 1 << 1, - ALLOW_EMPTY_OUTPUT = 1 << 2, - DISABLE_SYS_MEM_ALLOC = 1 << 3; - }; - virtual ~CraniotomeDesc() = default; - - mgb::opr::Craniotome* owner_opr = nullptr; - - //! get final py object that implements this interface - PyObject* py_self() const ; - - //! store self in \p result which is a list - virtual void _setup_self(PyObject *result) const = 0; - - virtual bool _is_same(PyObject *rhs) const = 0; - - virtual uint32_t _node_flag() const = 0; - - virtual size_t _hash() const = 0; - - virtual std::string _get_opr_type_name() = 0; - - virtual size_t _get_nr_outputs() = 0; - - virtual void _execute( - const std::vector &inputs, - std::vector &outputs) = 0; - - /*! - * \brief infer output shape if DYNAMIC_OUTPUT_SHAPE is not set - */ - virtual TensorShapeVec _infer_shape( - const TensorShapeVec &inp_shape) = 0; - - virtual SymbolVarArray _grad( - size_t wrt_idx, - const SymbolVarArray &inputs, - const SymbolVarArray &outputs, - const SymbolVarArray &out_grad) = 0; - - virtual size_t _get_nr_dev_comp_order_deps() = 0; - - mgb::thin_function _get_all_io_vars; - - /*! - * \brief get output dtypes from input dtypes - * \param[in] input_dtypes python list of input - * \param[out] result initialized as an empty python list, and should - * be filled with output dtypes - * \return whether user has set the dtype - */ - virtual bool _init_output_dtype( - PyObject *input_dtypes, PyObject *result) = 0; - - /*! - * \brief get computing graph when no input var is provided - */ - virtual CompGraph _get_comp_graph() = 0; - - /*! - * \brief copy this CraniotomeDesc - * - * The implementation must call _set_copy_result() to return the result; - * this is used to bypass some swig issues. - */ - virtual void _copy() const = 0; - mutable mgb::thin_function _set_copy_result; - - /*! - * \brief setup params for serialization - * \param output an allocated list. One or two elements should be - * inserted in it after this function returns: the first element - * should be a string, indicating the id to be passed to - * opr_maker_loader; the second element, if exists, must be a byte - * object containing extra param that should be written to file. - */ - virtual void _setup_serialize_params(PyObject *output) const = 0; - - /*! - * \brief callback invoked when the graph is compiled or when func is - * destructed - * - * If the graph is compiled but not executed, this function might not be - * called - * - * \param used_outputs an array indices indicating the used output vars; - * this argument being empty means that the previously compiled - * func is destructed - */ - virtual void _on_graph_compile_or_func_del( - const std::vector& used_outputs) = 0; -}; - - -namespace mgb { -namespace opr { - -MGB_DEFINE_OPR_CLASS(Craniotome, cg::SingleCNOutshapePureByInshapeOprBase) // { - class FuncDelCallbackInvoker; - using NodeFlag = CraniotomeDesc::NodeFlag; - - bool m_on_graph_compile_called = false; - const uint32_t m_node_flag; - - //! DEV_COMP_ORDER inputs are at the tail of input array; this is the - //! number of DEV_VALUE inputs, and also the index of the first - //! DEV_COMP_ORDER input - size_t m_nr_dev_value_inp; - - std::unique_ptr m_desc; - - //! previously inferred shape; used when there is no input and - //! m_is_dynamic_output_shape is set to true - Maybe m_prev_inferred_shape; - - void scn_do_execute() override; - void get_output_var_shape(const TensorShapeArray &inp_shape, - TensorShapeArray &out_shape) const override; - - void add_input_layout_constraint() override; - - void init_output_static_infer_desc() override; - void init_output_dtype() override; - NodeProp* do_make_node_prop() const override; - - bool output_no_sys_mem_alloc() const { - return m_node_flag & (NodeFlag::DYNAMIC_OUTPUT_SHAPE | - NodeFlag::DISABLE_SYS_MEM_ALLOC); - } - - public: - Craniotome(mgb::ComputingGraph *graph, - std::unique_ptr desc, - const VarNodeArray &inputs, const OperatorNodeConfig &config); - - ~Craniotome() noexcept; - - static SymbolVarArray make( - std::unique_ptr desc, - const SymbolVarArray &inputs, - const OperatorNodeConfig &config = {}); - - const CraniotomeDesc& desc() const { - return *m_desc; - } - - size_t nr_dev_value_inp() const { - return m_nr_dev_value_inp; - } -}; - -} // namespace opr -} // namespace mgb - -// vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} diff --git a/python_module/src/cpp/function_replace.cpp b/python_module/src/cpp/function_replace.cpp deleted file mode 100644 index 6fc0fb63..00000000 --- a/python_module/src/cpp/function_replace.cpp +++ /dev/null @@ -1,174 +0,0 @@ -/** - * \file python_module/src/cpp/function_replace.cpp - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * \brief replace functions in megbrain core - * - * \copyright Copyright (c) 2014-2020 Megvii Inc. All rights reserved. - * - */ - -#include "./megbrain_wrap.h" -#include "./python_helper.h" - -#include "megbrain/utils/debug.h" -#include "megbrain/common.h" -#include "megbrain/system.h" - -#include -#include -#include - -#include - -#ifdef WIN32 -#include -#include -#else -#include -#endif - -namespace { - -PyObject *logger = nullptr; - -#if MGB_ENABLE_DEBUG_UTIL -void throw_fork_cuda_exc() { - // set python error state, so when returning to parent process that calls - // fork(), an exception could be raised - // - // call chain: - // python -> fork() -> pthread_atfork -> CudaCheckOnFork -> - // ForkAfterCudaError::throw_ - mgb_log_warn("try to raise python exception for fork after cuda"); - PyErr_SetString(PyExc_SystemError, "fork after cuda has been initialized"); -} -#endif - -class Init { - static Init inst; - Init() { -#if MGB_ENABLE_DEBUG_UTIL - mgb::debug::ForkAfterCudaError::throw_ = throw_fork_cuda_exc; -#endif - } -}; -Init Init::inst; - -int fork_exec_impl(const std::string& arg0, const std::string& arg1, - const std::string& arg2) { -#ifdef WIN32 - STARTUPINFO si; - PROCESS_INFORMATION pi; - ZeroMemory(&si, sizeof(si)); - si.cb = sizeof(si); - ZeroMemory(&pi, sizeof(pi)); - auto args_str = " " + arg1 + " " + arg2; - - // Start the child process. - if (!CreateProcess(arg0.c_str(), // exe name - const_cast(args_str.c_str()), // Command line - NULL, // Process handle not inheritable - NULL, // Thread handle not inheritable - FALSE, // Set handle inheritance to FALSE - 0, // No creation flags - NULL, // Use parent's environment block - NULL, // Use parent's starting directory - &si, // Pointer to STARTUPINFO structure - &pi) // Pointer to PROCESS_INFORMATION structure - ) { - mgb_log_warn("CreateProcess failed (%lu).\n", GetLastError()); - fprintf(stderr, "[megbrain] failed to execl %s [%s, %s]\n", - arg0.c_str(), arg1.c_str(), arg2.c_str()); - __builtin_trap(); - } - return pi.dwProcessId; -#else - auto pid = fork(); - if (!pid) { - execl(arg0.c_str(), arg0.c_str(), arg1.c_str(), arg2.c_str(), nullptr); - fprintf(stderr, "[megbrain] failed to execl %s [%s, %s]: %s\n", - arg0.c_str(), arg1.c_str(), arg2.c_str(), - std::strerror(errno)); - std::terminate(); - } - mgb_assert(pid > 0, "failed to fork: %s", std::strerror(errno)); - return pid; -#endif -} - -} // anonymous namespace - -// called from swig/misc.i -void _timed_func_set_fork_exec_path(const char *arg0, const char *arg1) { - using namespace std::placeholders; - mgb::sys::TimedFuncInvoker::ins().set_fork_exec_impl( - std::bind(fork_exec_impl, std::string{arg0}, std::string{arg1}, - _1)); -} - -void _timed_func_exec_cb(const char *user_data) { - mgb::sys::TimedFuncInvoker::ins().fork_exec_impl_mainloop(user_data); -} - -void _register_logger(PyObject *l) { - logger = l; -} - -namespace { -void py_log_handler(mgb::LogLevel level, - const char *file, const char *func, int line, const char *fmt, - va_list ap) { - if (global_finalized()) { - return; - } - - using mgb::LogLevel; - - MGB_MARK_USED_VAR(file); - MGB_MARK_USED_VAR(func); - MGB_MARK_USED_VAR(line); - - if (!logger) - return; - - PYTHON_GIL; - - const char *py_type; - switch (level) { - case LogLevel::DEBUG: - py_type = "debug"; - break; - case LogLevel::INFO: - py_type = "info"; - break; - case LogLevel::WARN: - py_type = "warning"; - break; - case LogLevel::ERROR: - py_type = "error"; - break; - default: - throw std::runtime_error("bad log level"); - } - - std::string msg = mgb::svsprintf(fmt, ap); - PyObject *py_msg = Py_BuildValue("s", msg.c_str()); - PyObject_CallMethod(logger, - const_cast(py_type), const_cast("O"), - py_msg); - Py_DECREF(py_msg); -} - -class LogHandlerSetter { - static LogHandlerSetter ins; - public: - LogHandlerSetter() { - mgb::set_log_handler(py_log_handler); - } -}; -LogHandlerSetter LogHandlerSetter::ins; -} // anobymous namespace - -// vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} diff --git a/python_module/src/cpp/intbx.cpp b/python_module/src/cpp/intbx.cpp deleted file mode 100644 index 104a2353..00000000 --- a/python_module/src/cpp/intbx.cpp +++ /dev/null @@ -1,364 +0,0 @@ -/** - * \file python_module/src/cpp/intbx.cpp - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * \brief numpy dtypes for low bit - * - * \copyright Copyright (c) 2014-2020 Megvii Inc. All rights reserved. - * - */ - -#include "megbrain/common.h" - -#include -#include - -#define NO_IMPORT_ARRAY 1 -#include "./numpy_incl.h" - -#pragma GCC diagnostic ignored "-Wmissing-field-initializers" - -namespace { - -template -struct LowBitType { - static_assert(N < 8, "low bit only supports less than 8 bits"); - static int npy_typenum; - //! numerical value (-3, -1, 1, 3) - int8_t value; - - struct PyObj; - struct NpyType; - - const static int32_t max_value = (1 << N) - 1; - - //! check whether val is (-3, -1, 1, 3) and set python error - static bool check_value_set_err(int val) { - int t = val + max_value; - if ((t & 1) || t < 0 || t > (max_value << 1)) { - PyErr_SetString(PyExc_ValueError, - mgb::ssprintf("low bit dtype number error: " - "value=%d; allowed {-3, -1, 1, 3}", - val) - .c_str()); - return false; - } - - return true; - } - - template - struct NpyCast; -}; - -template -int LowBitType::npy_typenum; - -/* ==================== LowBitType::NpyCast ==================== */ - -template -template -struct LowBitType::NpyCast> { - static void apply(void* from_, void* to_, npy_intp n, void* /*fromarr*/, - void* /*toarr*/) { - auto from = static_cast(from_); - auto to = static_cast*>(to_); - for (npy_intp i = 0; i < n; ++i) { - int cur = static_cast(from[i]); - if (!LowBitType::check_value_set_err(cur)) - return; - to[i].value = cur; - } - } -}; - -template -template -struct LowBitType::NpyCast, T> { - static void apply(void* from_, void* to_, npy_intp n, void* /*fromarr*/, - void* /*toarr*/) { - auto from = static_cast*>(from_); - auto to = static_cast(to_); - for (npy_intp i = 0; i < n; ++i) { - to[i] = from[i].value; - } - } -}; - -/* ==================== LowBitType::PyObj ==================== */ -template -struct LowBitType::PyObj { - PyObject_HEAD LowBitType obj; - - static PyTypeObject py_type; - - static PyObject* from_lowbit(LowBitType val) { - auto p = reinterpret_cast(py_type.tp_alloc(&py_type, 0)); - p->obj.value = val.value; - return reinterpret_cast(p); - } - - static PyObject* py_new(PyTypeObject* type, PyObject* args, PyObject* kwds); - static PyObject* py_repr(PyObject* obj); - static PyObject* py_richcompare(PyObject* a, PyObject* b, int op); -}; -template -PyTypeObject LowBitType::PyObj::py_type; - -template -PyObject* LowBitType::PyObj::py_new(PyTypeObject* type, PyObject* args, - PyObject* kwds) { - PyObj* self; - Py_ssize_t size; - - self = (PyObj*)type->tp_alloc(type, 0); - - size = PyTuple_GET_SIZE(args); - if (size > 1) { - PyErr_SetString(PyExc_TypeError, "LowBitType Only has 1 parameter"); - return NULL; - } - PyObject* x = PyTuple_GET_ITEM(args, 0); - if (PyObject_IsInstance(x, (PyObject*)&py_type)) { - Py_INCREF(x); - return x; - } - - if (!PyLong_Check(x)) { - PyErr_SetString(PyExc_TypeError, - "LowBitType must be initialized wit int"); - return NULL; - } - - const long s = PyLong_AsLong(x); - - self->obj.value = s; - - return (PyObject*)self; -} - -template -PyObject* LowBitType::PyObj::py_repr(PyObject* obj) { - return PyUnicode_FromFormat("%d", ((PyObj*)obj)->obj.value); -} - -template -PyObject* LowBitType::PyObj::py_richcompare(PyObject* a, PyObject* b, - int op) { - mgb_assert(PyObject_IsInstance(a, (PyObject*)&py_type)); - auto bval = PyFloat_AsDouble(b); - if (bval == -1 && PyErr_Occurred()) { - return NULL; - } - double aval = ((PyObj*)a)->obj.value; -#define OP(py, op) \ - case py: { \ - if (aval op bval) { \ - Py_RETURN_TRUE; \ - } else { \ - Py_RETURN_FALSE; \ - } \ - } - switch (op) { - OP(Py_LT, <) - OP(Py_LE, <=) - OP(Py_EQ, ==) - OP(Py_NE, !=) - OP(Py_GT, >) - OP(Py_GE, >=) - }; -#undef OP - return Py_NotImplemented; -} - -/* ==================== LowBitType::NpyType ==================== */ -template -struct LowBitType::NpyType { - static PyArray_ArrFuncs funcs; - static PyArray_Descr descr; - - static bool init(); - - static void copyswap(void* dst, void* src, int swap, void* /*arr*/) { - if (src) { - mgb_assert(!swap); - memcpy(dst, src, sizeof(LowBitType)); - } - } - static PyObject* getitem(void* data, void* ap) { - return LowBitType::PyObj::from_lowbit( - *static_cast*>(data)); - } - static int setitem(PyObject* op, void* ov, void* ap); - static int fill(void* data_, npy_intp length, void* arr); -}; - -template -PyArray_ArrFuncs LowBitType::NpyType::funcs; -template -PyArray_Descr LowBitType::NpyType::descr; - -template -int LowBitType::NpyType::setitem(PyObject* op, void* ov, void* ap) { - if (!PyLong_Check(op)) { - PyErr_SetString(PyExc_ValueError, "input type must be int"); - return -1; - } - - int a = PyLong_AsLong(op); - if (!check_value_set_err(a)) - return -1; - - static_cast*>(ov)->value = a; - return 0; -} - -template -int LowBitType::NpyType::fill(void* data_, npy_intp length, void* arr) { - auto data = static_cast*>(data_); - int8_t delta = data[1].value - data[0].value, r = data[1].value; - if (!check_value_set_err(data[0].value) || - !check_value_set_err(data[1].value)) - return -1; - for (npy_intp i = 2; i < length; i++) { - r += delta; - if (r > max_value) - r = -max_value; - else if (r < -max_value) - r = max_value; - data[i].value = r; - } - return 0; -} - -template -bool LowBitType::NpyType::init() { - descr = {PyObject_HEAD_INIT(0) & LowBitType::PyObj::py_type, - 'V', // kind - 'r', // type - '=', // byteorder - NPY_NEEDS_PYAPI | NPY_USE_GETITEM | NPY_USE_SETITEM, - 0, // type num - sizeof(LowBitType), - alignof(LowBitType), - NULL, - NULL, - NULL, - &funcs}; - Py_TYPE(&descr) = &PyArrayDescr_Type; - PyArray_InitArrFuncs(&funcs); - funcs.copyswap = copyswap; - funcs.getitem = getitem; - funcs.setitem = setitem; - funcs.fill = fill; - npy_typenum = PyArray_RegisterDataType(&descr); - -#define REGISTER_CAST(From, To, From_descr, To_typenum, safe) \ - { \ - PyArray_Descr* from_descr = (From_descr); \ - if (PyArray_RegisterCastFunc(from_descr, (To_typenum), \ - NpyCast::apply) < 0) { \ - return false; \ - } \ - if (safe && PyArray_RegisterCanCast(from_descr, (To_typenum), \ - NPY_NOSCALAR) < 0) { \ - return false; \ - } \ - } -#define REGISTER_INT_CASTS(bits) \ - REGISTER_CAST(npy_int##bits, LowBitType, \ - PyArray_DescrFromType(NPY_INT##bits), \ - LowBitType::npy_typenum, 1) \ - REGISTER_CAST(LowBitType, npy_int##bits, &descr, NPY_INT##bits, 0) \ - REGISTER_CAST(npy_uint##bits, LowBitType, \ - PyArray_DescrFromType(NPY_UINT##bits), \ - LowBitType::npy_typenum, 1) \ - REGISTER_CAST(LowBitType, npy_uint##bits, &descr, NPY_UINT##bits, 0) - - REGISTER_INT_CASTS(8) - REGISTER_INT_CASTS(16) - REGISTER_INT_CASTS(32) - REGISTER_INT_CASTS(64) - REGISTER_CAST(LowBitType, float, &descr, NPY_FLOAT, 0) - REGISTER_CAST(float, LowBitType, PyArray_DescrFromType(NPY_FLOAT), - LowBitType::npy_typenum, 0) - REGISTER_CAST(LowBitType, double, &descr, NPY_DOUBLE, 1) - REGISTER_CAST(double, LowBitType, PyArray_DescrFromType(NPY_DOUBLE), - LowBitType::npy_typenum, 0) - return true; -} - -} // anonymous namespace - -#define DEFINE_INTBX(n) using IntB##n = LowBitType; -FOREACH_MGB_LOW_BIT(DEFINE_INTBX) -#undef DEFINE_INTBX - -#define MGB_STR_HELPER(n) #n - -#define DEFINE_INIT_PYTYPE(n) \ - bool init_pytype_intb##n() { \ - auto& py_type = IntB##n::PyObj::py_type; \ - py_type = {PyVarObject_HEAD_INIT(NULL, 0)}; \ - py_type.tp_name = "megbrain._mgb.pyintb" MGB_STR_HELPER(n); \ - py_type.tp_basicsize = sizeof(IntB##n::PyObj); \ - py_type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; \ - py_type.tp_doc = "an low bit int type"; \ - py_type.tp_new = IntB##n::PyObj::py_new; \ - py_type.tp_str = IntB##n::PyObj::py_repr; \ - py_type.tp_repr = IntB##n::PyObj::py_repr; \ - py_type.tp_richcompare = IntB##n::PyObj::py_richcompare; \ - py_type.tp_base = &PyGenericArrType_Type; \ - return PyType_Ready(&py_type) >= 0; \ - } -FOREACH_MGB_LOW_BIT(DEFINE_INIT_PYTYPE) -#undef DEFINE_INIT_PYTYPE - -#define DEFINE_REGISTER_FUNC(n) \ - void register_pytype_intb##n(PyObject* d, PyObject* m) { \ - Py_INCREF(&IntB##n::PyObj::py_type); \ - PyDict_SetItemString(d, "intb" MGB_STR_HELPER(n) "_pytype", \ - (PyObject*)&IntB##n::PyObj::py_type); \ - PyModule_AddObject(m, "intb" MGB_STR_HELPER(n) "_pytype", \ - (PyObject*)&IntB##n::PyObj::py_type); \ - } -FOREACH_MGB_LOW_BIT(DEFINE_REGISTER_FUNC) -#undef DEFINE_REGISTER_FUNC - -//! called from swig init -void _init_intbx_types(PyObject* m) { - if (m == NULL) - return; - PyObject* d = PyModule_GetDict(m); - PyArray_Descr* dtype; -#define DEFINE_INIT_INTBX_TYPE(n) \ - if (!init_pytype_intb##n()) \ - return; \ - if (!IntB##n::NpyType::init()) \ - return; \ - dtype = PyArray_DescrFromType(IntB##n::npy_typenum); \ - if (!dtype) \ - return; \ - { \ - PyObject* pytype = (PyObject*)(&IntB##n::PyObj::py_type); \ - Py_INCREF(pytype); \ - PyDict_SetItemString(d, "pyintb" MGB_STR_HELPER(n), pytype); \ - } \ - Py_INCREF(dtype); \ - PyDict_SetItemString(d, "intb" MGB_STR_HELPER(n), (PyObject*)dtype); \ - register_pytype_intb##n(d, m); - FOREACH_MGB_LOW_BIT(DEFINE_INIT_INTBX_TYPE) -#undef DEFINE_INIT_INTBX_TYPE - return; -} - -#define DEFINE_NPY_INTBX(n) \ - int mgb::npy_num_intb##n() { return IntB##n::npy_typenum; } -FOREACH_MGB_LOW_BIT(DEFINE_NPY_INTBX) -#undef DEFINE_NPY_INTBX -/*int mgb::npy_num_intb2() { - return IntB2::npy_typenum; -}*/ - -// vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} diff --git a/python_module/src/cpp/megbrain_config.cpp b/python_module/src/cpp/megbrain_config.cpp deleted file mode 100644 index fa31950e..00000000 --- a/python_module/src/cpp/megbrain_config.cpp +++ /dev/null @@ -1,517 +0,0 @@ -/** - * \file python_module/src/cpp/megbrain_config.cpp - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * \copyright Copyright (c) 2014-2020 Megvii Inc. All rights reserved. - * - */ - -#include "./megbrain_config.h" -#include "./python_helper.h" - -#include "megbrain/graph/event.h" -#include "megbrain/utils/debug.h" -#include "megbrain/comp_node_env.h" -#include "megbrain/serialization/opr_registry.h" - -#include -#include -#include -#include - -#ifdef WIN32 -#include -#include -#else -#include -#endif - -#if MGB_ENABLE_OPR_MM -#include "megbrain/opr/mm_handler.h" -#endif - -#if MGB_CUDA -#include -#endif - -#ifdef WIN32 -#define F_OK 0 -#define RTLD_LAZY 0 -#define RTLD_GLOBAL 0 -#define RTLD_NOLOAD 0 -#define access(a, b) false -#define SPLITER ';' -#define ENV_PATH "Path" -#define NVCC_EXE "nvcc.exe" -static void* dlopen(const char* file, int) { - return static_cast(LoadLibrary(file)); -} - -static void* dlerror() { - const char* errmsg = "dlerror not aviable in windows"; - return const_cast(errmsg); -} - -static void* dlsym(void* handle, const char* name) { - FARPROC symbol = GetProcAddress((HMODULE)handle, name); - return reinterpret_cast(symbol); -} - -static int check_file_exist(const char* path, int mode) { - return _access(path, mode); -} -#else -#define SPLITER ':' -#define ENV_PATH "PATH" -#define NVCC_EXE "nvcc" -static int check_file_exist(const char* path, int mode) { - return access(path, mode); -} -#endif - -using namespace mgb; - -namespace { - std::unordered_map - set_priority_on_opr_inserted_handle; - std::mutex set_priority_on_opr_inserted_handle_mtx; - -} // anonymous namespace - -bool _config::set_comp_graph_option( - CompGraph &cg, const std::string &name, int val_int) { - -#define SET_CG_OPTION(name_chk) \ - do { \ - static_assert( \ - std::is_same::value || \ - std::is_same::value || \ - std::is_same::value || \ - std::is_same::value || \ - std::is_same::value, \ - "not bool/int opt"); \ - if (name == #name_chk) { \ - auto ret = opt.name_chk; \ - opt.name_chk = val_int; \ - return ret; \ - } \ - } while(0) - - auto &&opt = cg.get().options(); - SET_CG_OPTION(seq_opt.enable_mem_plan_opt); - SET_CG_OPTION(seq_opt.enable_mem_reuse_alloc); - SET_CG_OPTION(seq_opt.enable_seq_comp_node_opt); - SET_CG_OPTION(force_dynamic_alloc); - SET_CG_OPTION(enable_grad_var_static_reshape); - SET_CG_OPTION(async_exec_level); - SET_CG_OPTION(graph_opt.jit); - SET_CG_OPTION(graph_opt.tensorrt); - SET_CG_OPTION(graph_opt_level); - SET_CG_OPTION(allreduce_pack_max_size); - SET_CG_OPTION(allreduce_pack_ignore_first); - SET_CG_OPTION(var_sanity_check_first_run); - SET_CG_OPTION(no_profiling_on_shape_change); - SET_CG_OPTION(allocate_static_mem_after_graph_compile); - SET_CG_OPTION(log_level); - SET_CG_OPTION(enable_sublinear_memory_opt); - SET_CG_OPTION(sublinear_mem_config.lb_memory); - SET_CG_OPTION(sublinear_mem_config.genetic_nr_iter); - SET_CG_OPTION(sublinear_mem_config.genetic_pool_size); - SET_CG_OPTION(sublinear_mem_config.thresh_nr_try); - SET_CG_OPTION(sublinear_mem_config.num_worker); - SET_CG_OPTION(enable_var_mem_defragment); - SET_CG_OPTION(eager_evaluation); - SET_CG_OPTION(enable_memory_swap); - throw MegBrainError(ssprintf( - "invalid computing graph option name: %s", name.c_str())); -#undef SET_CG_OPTION -} - -bool _config::comp_graph_is_eager(CompGraph &cg) { - return cg.get().options().eager_evaluation; -} - -void _config::add_extra_vardep(const SymbolVar &var, const SymbolVar &dep) { - auto og = var.node()->owner_graph(); - mgb_assert(og == dep.node()->owner_graph()); - og->options().extra_vardeps[var.node()].push_back(dep.node()); -} - -void _config::begin_set_opr_priority(CompGraph& cg, int priority) { - SyncEventConnecter::ReceiverHandler* handle; - { - MGB_LOCK_GUARD(set_priority_on_opr_inserted_handle_mtx); - handle = &set_priority_on_opr_inserted_handle[&cg.get()]; - } - mgb_assert(!*handle, "multiple calls to _begin_set_opr_priority()"); - - auto on_opr_inserted = [priority](const cg::event::OprInserted& event) { - if (!event.exc && priority) { - int& pri = event.opr->node_prop().attribute().priority; - if (!pri) - pri = priority; - else - pri = std::min(pri, priority); - } - }; - *handle = cg.get().event().register_receiver( - on_opr_inserted); -} - -void _config::end_set_opr_priority(CompGraph &cg) { - MGB_LOCK_GUARD(set_priority_on_opr_inserted_handle_mtx); - auto nr = set_priority_on_opr_inserted_handle.erase(&cg.get()); - mgb_assert(nr, "end_set_opr_priority called " - "before begin_set_opr_priority"); -} - -void _config::begin_set_exc_opr_tracker(CompGraph &cg, PyObject *tracker) { - OprPyTracker::begin_set_tracker(cg.get(), tracker); -} - -void _config::end_set_exc_opr_tracker(CompGraph &cg) { - OprPyTracker::end_set_tracker(cg.get()); -} - -PyObject* _config::get_opr_tracker(CompGraph &cg, size_t var_id) { - auto var = cg.get().find_var_by_id(var_id); - if (!var) - Py_RETURN_NONE; - return OprPyTracker::get_tracker(var->owner_opr()).as_tuple(); -} - -void _config::set_opr_sublinear_memory_endpoint(const SymbolVar &var) { - MGB_MARK_USED_VAR(var); -#if MGB_ENABLE_SUBLINEAR - auto opr = var.node()->owner_opr(); - opr->owner_graph()->options().opr_attribute.sublinear_memory_endpoint. - insert(opr); -#endif -} - -void _config::set_fork_cuda_warning_flag(int flag) { -#if MGB_ENABLE_DEBUG_UTIL - debug::set_fork_cuda_warning_flag(flag); -#else - MGB_MARK_USED_VAR(flag); -#endif -} - -bool _config::is_cuda_ctx_set() { -#if MGB_CUDA - CUcontext ctx; - return cuCtxGetCurrent(&ctx) == CUDA_SUCCESS && ctx; -#else - return false; -#endif -} - -std::string _config::get_cuda_gencode() { -#if MGB_CUDA - std::set used; - int nr_dev; - auto err = cudaGetDeviceCount(&nr_dev); - if (err == cudaErrorNoDevice) { - return {}; - } - MGB_CUDA_CHECK(err); - for (int i = 0; i < nr_dev; ++ i) { - cudaDeviceProp prop; - MGB_CUDA_CHECK(cudaGetDeviceProperties(&prop, i)); - std::string cur{std::to_string(prop.major)}; - cur += std::to_string(prop.minor); - used.insert(cur); - } - - std::string ret; - for (auto &&i: used) { - if (!ret.empty()) - ret.append(" "); - ret.append(i); - } - return ret; -#else - mgb_throw(MegBrainError, "cuda disabled at compile time"); -#endif -} - -namespace { - -std::string find_content_in_file(const std::string& file_name, - const std::string& content) { - std::ifstream fin(file_name.c_str()); - std::string read_str; - while (std::getline(fin, read_str)) { - auto idx = read_str.find(content); - if (idx != std::string::npos) { - fin.close(); - return read_str.substr(idx); - } - } - fin.close(); - return {}; -} - -std::vector split_env(const char* env) { - std::string e(env); - std::istringstream stream(e); - std::vector ret; - std::string path; - while (std::getline(stream, path, SPLITER)) { - ret.emplace_back(path); - } - return ret; -} - -//! this function will find file_name in each path in envs. It accepts add -//! intermediate path between env and file_name -std::string find_file_in_envs_with_intmd( - const std::vector& envs, const std::string& file_name, - const std::vector& itmedias = {}) { - for (auto&& env : envs) { - auto ret = getenv(env.c_str()); - if (ret) { - for (auto&& path : split_env(ret)) { - auto file_path = std::string(path) + "/" + file_name; - if (!check_file_exist(file_path.c_str(), F_OK)) { - return file_path; - } - if (!itmedias.empty()) { - for (auto&& inter_path : itmedias) { - file_path = std::string(path) + "/" + inter_path + "/" + - file_name; - if (!check_file_exist(file_path.c_str(), F_OK)) { - return file_path; - } - } - } - } - } - } - return std::string{}; -} - -std::string get_nvcc_root_path() { - auto nvcc_root_path = find_file_in_envs_with_intmd({ENV_PATH}, NVCC_EXE); - if (nvcc_root_path.empty()) { - mgb_throw(MegBrainError, - "nvcc not found. Add your nvcc to your environment Path"); - } else { - auto idx = nvcc_root_path.rfind('/'); - return nvcc_root_path.substr(0, idx + 1); - } -} - -size_t get_local_cuda_version() { - auto nvcc_root_path = get_nvcc_root_path(); - auto ver_path = nvcc_root_path + "../version.txt"; - if (check_file_exist(ver_path.c_str(), F_OK)) { - mgb_throw(MegBrainError, "No such file : %s\n", ver_path.c_str()); - } - auto str_cuda_version = find_content_in_file(ver_path, "CUDA Version"); - if (str_cuda_version.empty()) { - mgb_throw(MegBrainError, "can not read version information from : %s\n", - ver_path.c_str()); - } - size_t cuda_major = 0; - size_t cuda_minor = 0; - sscanf(str_cuda_version.c_str(), "CUDA Version %zu.%zu,", &cuda_major, - &cuda_minor); - return cuda_major * 1000 + cuda_minor * 10; -} - -void check_cudnn_existence() { - auto cudnn_header_path = find_file_in_envs_with_intmd( - {"PC_CUDNN_INCLUDE_DIRS", "CUDNN_ROOT_DIR", "CUDA_TOOLKIT_INCLUDE", - "CUDNN_LIBRARY", "CUDA_PATH"}, - "cudnn.h", {"../include", "include"}); - if (cudnn_header_path.empty()) { - mgb_log_warn( - "cudnn.h not found. Please make sure cudnn install at " - "${CUDNN_ROOT_DIR}"); - } else { // check cudnn lib exist - auto str_cudnn_major = - find_content_in_file(cudnn_header_path, "#define CUDNN_MAJOR"); - auto str_cudnn_minor = - find_content_in_file(cudnn_header_path, "#define CUDNN_MINOR"); - auto str_cudnn_patch = find_content_in_file(cudnn_header_path, - "#define CUDNN_PATCHLEVEL"); - - if (str_cudnn_major.empty() || str_cudnn_minor.empty() || - str_cudnn_patch.empty()) { - mgb_log_warn( - "can not find cudnn version information in %s.\n You may " - "Update cudnn\n", - cudnn_header_path.c_str()); - return; - } - - size_t cudnn_major = 0, cudnn_minor = 0, cudnn_patch = 0; - sscanf(str_cudnn_major.c_str(), "#define CUDNN_MAJOR %zu", - &cudnn_major); - sscanf(str_cudnn_minor.c_str(), "#define CUDNN_MINOR %zu", - &cudnn_minor); - sscanf(str_cudnn_patch.c_str(), "#define CUDNN_PATCHLEVEL %zu", - &cudnn_patch); - -#ifdef WIN32 - std::string cudnn_lib_name = - "cudnn64_" + std::to_string(cudnn_major) + ".dll"; -#else - std::string cudnn_lib_name = - "libcudnn.so." + std::to_string(cudnn_major) + "." + - std::to_string(cudnn_minor) + "." + std::to_string(cudnn_patch); -#endif - - auto cudnn_lib_path = find_file_in_envs_with_intmd( - {"CUDNN_ROOT_DIR", "CUDNN_LIBRARY", "CUDA_PATH", ENV_PATH}, - cudnn_lib_name, {"lib64", "lib/x64"}); - if (cudnn_lib_path.empty()) { - mgb_log_warn( - "%s not found. Please make sure cudnn install at " - "${CUDNN_LIBRARY}", - cudnn_lib_name.c_str()); - } - } -} -} // namespace - -std::vector _config::get_cuda_include_path() { -#if MGB_CUDA - auto nvcc_path = get_nvcc_root_path(); - auto cudart_header_path = nvcc_path + "../include/cuda_runtime.h"; - //! double check path_to_nvcc/../include/cuda_runtime.h exists - auto ret = check_file_exist(cudart_header_path.c_str(), F_OK); - if (ret) { - mgb_throw(MegBrainError, - "%s not found. Please make sure your cuda toolkit install " - "right", - cudart_header_path.c_str()); - } else { - return {nvcc_path + "..", nvcc_path + "../include"}; - } -#else - mgb_throw(MegBrainError, "cuda disabled at compile time"); -#endif -} - -std::vector _config::get_cuda_lib_path() { -#if MGB_CUDA - auto nvcc_path = get_nvcc_root_path(); -#ifdef WIN32 - auto cuda_version = get_local_cuda_version(); - auto cuda_major = cuda_version / 1000; - auto cuda_minor = cuda_version % 10; - auto cudart_lib_path = nvcc_path + "cudart64_" + - std::to_string(cuda_major * 10 + cuda_minor) + - ".dll"; -#else - auto cudart_lib_path = nvcc_path + "../lib64/libcudart.so"; -#endif - //! double check cudart_lib_path exists - auto ret = check_file_exist(cudart_lib_path.c_str(), F_OK); - if (ret) { - mgb_throw(MegBrainError, - "%s not found. Please make sure your cuda toolkit install " - "right", - cudart_lib_path.c_str()); - } else { -#ifdef WIN32 - //! cudart64_101.dll locates at cuda/bin - return {nvcc_path + "../lib/x64", nvcc_path}; -#else - return {nvcc_path + "../lib64"}; -#endif - } -#else - mgb_throw(MegBrainError, "cuda disabled at compile time"); -#endif -} - -int _config::get_cuda_version() { -#if MGB_CUDA - int version; - MGB_CUDA_CHECK(cudaRuntimeGetVersion(&version)); - return version; -#else - mgb_throw(MegBrainError, "cuda disabled at compile time"); -#endif -} - -bool _config::is_local_cuda_env_ok() { - check_cudnn_existence(); - if (get_nvcc_root_path().empty()) { - return false; - } - return true; -} - -bool _config::is_compiled_with_cuda() { -#if MGB_CUDA - return true; -#else - return false; -#endif -} - -void _config::load_opr_library(const char* self_path, const char* lib_path) { - static bool self_global = false; - static std::mutex self_global_mtx; - { - MGB_LOCK_GUARD(self_global_mtx); - if (!self_global) { - auto hdl = dlopen(self_path, RTLD_LAZY | RTLD_GLOBAL); - mgb_assert(hdl, "failed to set mgb to global: %s", dlerror()); - self_global = true; - } - } - if (lib_path) { - auto hdl = dlopen(lib_path, RTLD_LAZY); - mgb_assert(hdl, "failed to load libray %s: %s", lib_path, dlerror()); - } -} - -std::vector> _config::dump_registered_oprs() { -#if MGB_ENABLE_DEBUG_UTIL - return serialization::OprRegistry::dump_registries(); -#else - return {}; -#endif -} - -#if MGB_ENABLE_OPR_MM -/*! see definition : src/cpp/megbrain_config.h. - * Create mm server. port 0 is permitted, leave zmqrpc to decide which port - * should be used. - */ -int _config::create_mm_server(const std::string& server_addr, int port) { - return create_zmqrpc_server(server_addr, port); -} - -void _config::group_barrier(const std::string& server_addr, - int port, uint32_t size, uint32_t rank) { - mgb_assert(rank < size, "invalid rank %d", rank); - auto group_mgr = std::make_shared( - ssprintf("%s:%d", server_addr.c_str(), port)); - uint32_t rsp = group_mgr->group_barrier(size, rank); - mgb_assert(rsp != 0, "rank already registered: %d", rank); - mgb_assert(size == rsp, "inconsistent size: %d, expect %d", size, rsp); -} - -#else - -int _config::create_mm_server(const std::string& server_addr, int port) { - mgb_throw(mgb::MegBrainError, "OPR_MM suppport disable at compile time"); - return 0; -} - -void _config::group_barrier(const std::string& server_addr, - int port, uint32_t size, uint32_t rank) { - mgb_throw(mgb::MegBrainError, "OPR_MM suppport disable at compile time"); -} - -#endif - -// vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} diff --git a/python_module/src/cpp/megbrain_config.h b/python_module/src/cpp/megbrain_config.h deleted file mode 100644 index ed4f4c9d..00000000 --- a/python_module/src/cpp/megbrain_config.h +++ /dev/null @@ -1,78 +0,0 @@ -/** - * \file python_module/src/cpp/megbrain_config.h - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * \copyright Copyright (c) 2014-2020 Megvii Inc. All rights reserved. - * - */ - -#ifndef SWIG - -#pragma once - -#include "megbrain_build_config.h" -#include "./megbrain_wrap.h" -#include -using mgb::cg::SymbolVar; -#endif - -//! wrap by a class so swig can put the functions in a namespace -class _config { - public: - static bool set_comp_graph_option( - CompGraph &cg, const std::string &name, int val_int); - - static bool comp_graph_is_eager(CompGraph &cg); - - static void add_extra_vardep( - const SymbolVar &var, const SymbolVar &dep); - - static void begin_set_opr_priority( - CompGraph &cg, int priority); - static void end_set_opr_priority(CompGraph &cg); - - static void begin_set_exc_opr_tracker( - CompGraph &cg, PyObject *tracker); - static void end_set_exc_opr_tracker(CompGraph &cg); - - //! return (opr_msg, fwd tracker, grad tracker) or None - static PyObject* get_opr_tracker(CompGraph &cg, size_t var_id); - - static void set_opr_sublinear_memory_endpoint(const SymbolVar &var); - - static void set_fork_cuda_warning_flag(int flag); - - static bool is_cuda_ctx_set(); - - //! get cuda gencode strings for local devices - static std::string get_cuda_gencode(); - - //! get cuda lib paths. - static std::vector get_cuda_lib_path(); - - //! get cuda include paths. - static std::vector get_cuda_include_path(); - - //! get cuda version - static int get_cuda_version(); - - //! check local cuda env. The method returns true if CUDA's nvcc - //! compiler and cudnn installs in PATH. - static bool is_local_cuda_env_ok(); - - static bool is_compiled_with_cuda(); - - static void load_opr_library( - const char* self_path, const char* lib_path); - - static std::vector> - dump_registered_oprs(); - - static int create_mm_server(const std::string& server_addr, int port); - - static void group_barrier(const std::string& server_addr, - int port, uint32_t size, uint32_t rank); -}; - -// vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} diff --git a/python_module/src/cpp/megbrain_pubapi.cpp b/python_module/src/cpp/megbrain_pubapi.cpp deleted file mode 100644 index 6665723c..00000000 --- a/python_module/src/cpp/megbrain_pubapi.cpp +++ /dev/null @@ -1,334 +0,0 @@ -/** - * \file python_module/src/cpp/megbrain_pubapi.cpp - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * \copyright Copyright (c) 2014-2020 Megvii Inc. All rights reserved. - * - */ - -#include "./megbrain_pubapi.h" -#include "./megbrain_pubapi_internal.h" - -#include "megbrain/tensor.h" -#include "megbrain/graph/var_node.h" -#include "megbrain/comp_node_env.h" - -namespace { - -class DeleteDispatcher final : public mgb::CompNodeDepedentObject { - mgb::thin_function m_deleter; - mgb::CompNode m_comp_node; - std::atomic done; - - std::shared_ptr on_comp_node_finalize() override { - bool _ = false; - if (done.compare_exchange_strong(_, true)) { - m_deleter(); - } - return {}; - } -public: - explicit DeleteDispatcher(mgb::thin_function&& deleter, - mgb::CompNode cn) - : m_deleter(std::move(deleter)), m_comp_node(cn) { - done.store(false); - } - - void trigger() { - bool _ = false; - if (done.compare_exchange_strong(_, true)) { - if (!is_finalized()) { - m_comp_node.add_callback(std::move(m_deleter)); - } else { - m_deleter(); - } - } - } -}; - -} // namespace - -using namespace mgb; - -pubapi::DeviceTensor::DataType mgb::dtype_mgb2pubapi(DType dtype) { - using DevDType = pubapi::DeviceTensor::DataType; - switch (dtype.enumv()) { -#define o(s, t) \ - case DTypeEnum::s: \ - return DevDType::t - o(Float32, FLOAT32); - o(Float16, FLOAT16); - o(Int32, INT32); - o(Int16, INT16); - o(Int8, INT8); - o(Uint8, UINT8); -#undef o - default: - mgb_throw(MegBrainError, "dtype %s not implemented for pubapi", - dtype.name()); - } -} - -struct pubapi::DeviceTensor::_Impl { - -static TensorShape desc_shape_to_tensor_shape(const DeviceTensor::Desc &desc) { - TensorShape shape; - mgb_assert(desc.ndim && desc.ndim <= TensorShape::MAX_NDIM, - "invalid ndim: %zu", desc.ndim); - shape.ndim = desc.ndim; - for (size_t i = 0; i < desc.ndim; ++ i) { - shape[i] = desc.shape[i]; - } - return shape; -} - -#if MGB_CUDA -class CudaCurrentDeviceRestore { - int m_orig_dev = -1; - - public: - - CudaCurrentDeviceRestore(CompNode cn) { - if (cn.device_type() == CompNode::DeviceType::CUDA) { - MGB_CUDA_CHECK(cudaGetDevice(&m_orig_dev)); - } - } - - ~CudaCurrentDeviceRestore() { - if (m_orig_dev != -1) { - cudaSetDevice(m_orig_dev); - } - } -}; -#else -class CudaCurrentDeviceRestore { - public: - CudaCurrentDeviceRestore(CompNode) { - } -}; -#endif - -static void sync(const DeviceTensor *self, bool strong) { - CompNode cn; - if (self->m_dev_nd) { - cn = static_cast(self->m_dev_nd)->comp_node(); - } else { - mgb_assert(self->m_varptr); - cn = static_cast(self->m_varptr)->comp_node(); - } - CudaCurrentDeviceRestore cuda_dev_restore{cn}; - cn.sync(); -#if MGB_CUDA - if (strong && cn.device_type() == CompNode::DeviceType::CUDA) { - cn.activate(); - MGB_CUDA_CHECK(cudaDeviceSynchronize()); - } -#endif -} - -static const char* dtype_name(DataType dtype) { - switch (dtype) { -#define on(c) \ - case DataType::c: \ - return #c - on(FLOAT32); - on(FLOAT16); - on(INT32); - on(INT16); - on(INT8); - on(UINT8); -#undef on - default: - mgb_throw(MegBrainError, "invalid pubapi dtype enum: %d", - static_cast(dtype)); - } -} - -static void copy( - DeviceTensor *self, const Desc &other, CopyDirection direction) { - mgb_assert(self->desc.dtype == other.dtype, "dtype mismatch: %s vs %s", - self->dtype_name(), dtype_name(other.dtype)); - mgb_assert(self->m_varptr || self->m_dev_nd); - const DeviceTensorND *dv; - if (direction == CopyDirection::OTHER_TO_SELF) { - mgb_assert(!self->m_readonly, "can not copy into readonly tensor"); - auto shape = desc_shape_to_tensor_shape(other); - if (self->m_varptr) { - auto var = static_cast(self->m_varptr); - dv = &var->shape_alloc(shape).dev_tensor(); - } else { - dv = static_cast(self->m_dev_nd); - mgb_assert(dv->shape().eq_shape(shape), - "copy dest tensor shape is %s, but source shape is %s", - dv->shape().to_string().c_str(), shape.to_string().c_str()); - } - mgb_assert(self->desc.dtype == dtype_mgb2pubapi(dv->dtype())); - self->desc.dev_ptr = dv->raw_ptr(); - self->desc.ndim = dv->shape().ndim; - self->desc.shape = dv->shape().shape; - if (!other.dev_ptr) { - // used in resize() - return; - } - } else { - mgb_assert(direction == CopyDirection::SELF_TO_OTHER); - if (self->m_varptr) { - dv = &static_cast(self->m_varptr)->dev_tensor(); - } else { - dv = static_cast(self->m_dev_nd); - } - } - - mgb_assert(dv->layout().is_contiguous()); - auto size = dv->layout().span().dist_byte(); - auto cn = dv->comp_node(); - CudaCurrentDeviceRestore cuda_dev_restore{cn}; - - void *dst = dv->raw_ptr(), *src = other.dev_ptr; - if (direction == CopyDirection::SELF_TO_OTHER) { - std::swap(dst, src); - } - -#if !MGB_CUDA - mgb_assert(other.type != Type::CUDA, "cuda disabled at compile time"); -#endif - - auto &&desc = self->desc; - if (other.type == desc.type) { -#if MGB_CUDA - if (desc.type == Type::CUDA) { - int dev = desc.cuda_ctx.device; - if (dev == -1) { - MGB_CUDA_CHECK(cudaGetDevice(&dev)); - } - mgb_assert(dev == other.cuda_ctx.device, - "DeviceTensor copy must be on the same device; " - "got %d vs %d", dev, other.cuda_ctx.device); - } -#endif - cn.peer_copy_to(cn, dst, src, size); - } else { - if ((desc.type == Type::CPU && other.type == Type::CUDA && - direction == CopyDirection::SELF_TO_OTHER) || - (other.type == Type::CPU && desc.type == Type::CUDA && - direction == CopyDirection::OTHER_TO_SELF)) { - cn.copy_to_device(dst, src, size); - } else { - mgb_assert((desc.type == Type::CUDA && other.type == Type::CPU && - direction == CopyDirection::SELF_TO_OTHER) || - (other.type == Type::CUDA && desc.type == Type::CPU && - direction == CopyDirection::OTHER_TO_SELF)); - cn.copy_to_host(dst, src, size); - } - } -} - -static void forward_other_memory( - const DeviceTensor *self, - const Desc &other, CallbackOnce deleter) { - mgb_assert(self->desc.dtype == other.dtype, "dtype mismatch: %s vs %s", - self->dtype_name(), dtype_name(other.dtype)); - auto deleter_wrap = [deleter]() mutable { deleter.consume(); }; - thin_function deleter_dispatch; - if (self->desc.type == Type::CPU) { - CompNode cn{}; - if (self->m_varptr) { - cn = static_cast(self->m_varptr)->comp_node(); - } else { - cn = static_cast(self->m_dev_nd)->comp_node(); - } - deleter_dispatch = [d = new DeleteDispatcher(deleter_wrap, cn)](void*) { - d->trigger(); - delete d; - }; - } else { - deleter_dispatch = [deleter_wrap](void*) mutable { deleter_wrap(); }; - } - auto shape = desc_shape_to_tensor_shape(other); - if (self->m_varptr) { - auto var = static_cast(self->m_varptr); - DeviceTensorStorage storage; - storage.reset(var->comp_node(), - shape.total_nr_elems() * var->dtype().size(), - {static_cast(other.dev_ptr), deleter_dispatch}); - DeviceTensorND tensor; - tensor.reset(storage, {shape, var->dtype()}); - var->reset_dev_tensor_from_tensor(tensor); - } else { - DeviceTensorND& tensor = *static_cast(self->m_dev_nd); - DeviceTensorStorage storage; - size_t dtype_size = tensor.layout().dtype.size(); - storage.reset(tensor.comp_node(), - shape.total_nr_elems() * dtype_size, - {static_cast(other.dev_ptr), deleter_dispatch}); - tensor.reset(storage, {shape, tensor.layout().dtype}); - } -} - -static void forward_to( - const DeviceTensor *self, - void **dest, CallbackOnce* deleter) { - auto orig_dv_ptr = static_cast(self->m_dev_nd); - *dest = orig_dv_ptr->ptr(); - mgb_assert(*dest == self->desc.dev_ptr); - deleter->user_data = new DeviceTensorStorage(*orig_dv_ptr); - deleter->fptr = [](void* ptr) { - delete reinterpret_cast(ptr); - }; -} - -static void init_tensor(pubapi::DeviceTensor& dest, DeviceTensorND* tensor, - VarNode* var, bool readonly) { - memset(&dest, 0, sizeof(pubapi::DeviceTensor)); - { - static FuncTable functable{&sync, ©, &forward_other_memory, - &dtype_name, &forward_to}; - dest.m_functable = &functable; - } - dest._version0 = dest._version1 = CURRENT_VERSION; - - mgb_assert((!!tensor) ^ (!!var)); - auto cn = tensor ? tensor->comp_node() : var->comp_node(); - using Type = pubapi::DeviceTensor::Type; - switch (cn.device_type()) { - case CompNode::DeviceType::CPU: - dest.desc.type = Type::CPU; - break; -#if MGB_CUDA - case CompNode::DeviceType::CUDA: - dest.desc.type = Type::CUDA; - break; -#endif - default: - mgb_throw(MegBrainError, "bad comp node type: %d", - static_cast(cn.device_type())); - } - dest.desc.dtype = dtype_mgb2pubapi(tensor ? tensor->dtype() : var->dtype()); - if (tensor) { - dest.desc.dev_ptr = tensor->raw_ptr(); - dest.desc.shape = tensor->shape().shape; - dest.desc.ndim = tensor->shape().ndim; - dest.size_bytes = tensor->layout().span().dist_byte(); - } -#if MGB_CUDA - if (dest.desc.type == Type::CUDA) { - auto&& env = CompNodeEnv::from_comp_node(cn).cuda_env(); - dest.desc.cuda_ctx.device = env.device; - dest.desc.cuda_ctx.stream = env.stream; - } -#endif - dest.m_readonly = readonly; - dest.m_dev_nd = tensor; - dest.m_varptr = var; -} - -}; // pubapi::DeviceTensor::Impl - -void mgb::init_pubapi_dev_tensor(pubapi::DeviceTensor& dest, - DeviceTensorND* tensor, VarNode* var, - bool readonly) { - pubapi::DeviceTensor::_Impl::init_tensor(dest, tensor, var, readonly); -} - -// vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} diff --git a/python_module/src/cpp/megbrain_pubapi.h b/python_module/src/cpp/megbrain_pubapi.h deleted file mode 100644 index fa33f815..00000000 --- a/python_module/src/cpp/megbrain_pubapi.h +++ /dev/null @@ -1,185 +0,0 @@ -/** - * \file python_module/src/cpp/megbrain_pubapi.h - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * \brief public API for exposing megbrain internal data structures - * - * This is a pure header without compile-time dependencies. - * - * \copyright Copyright (c) 2014-2020 Megvii Inc. All rights reserved. - */ - -#pragma once - -#include -#include - -namespace mgb { -namespace pubapi { - - /*! - * \brief a general callback that would be invoked exactly once - * - * During the invoke, the functor shoule release related memory - */ - struct CallbackOnce { - void (*fptr)(void *); - void *user_data; - - //! invoke the callback and clean up the scene - void consume() { - fptr(user_data); - fptr = nullptr; - user_data = nullptr; - } - }; - - //! tensor on a computing device - class DeviceTensor { - public: - static constexpr uint32_t CURRENT_VERSION = 20190725; - - //! device type - enum class Type: uint32_t { - CPU, CUDA - }; - enum class DataType: uint32_t { - FLOAT32, FLOAT16, INT32, INT16, INT8, UINT8 - }; - enum class CopyDirection { - SELF_TO_OTHER, OTHER_TO_SELF - }; - struct CudaContext { - int device; //! set to -1 in copy() to use current device - void *stream; //!< set to nullptr for default stream - }; - - //! tensor descriptor - struct Desc { - Type type; - DataType dtype; - void *dev_ptr; //!< pointer to actual device buffer - const size_t *shape; //!< pointer to shape array - size_t ndim; - //! only valid if type == Type::CUDA - CudaContext cuda_ctx; - }; - - uint32_t _version0; //!< for consistency check - // note: fields starting with underscore are for internal use only - - Desc desc; - size_t size_bytes; - - /*! - * \brief synchonize with the calling thread - * - * This must be called before forwarding memory for direct use - * - * \param strong whether to synchronoze the whole device (true), or - * just the computing node (false). Currently it only affects - * how cuda sync is performed. - */ - void sync(bool strong = false) const { - m_functable->sync(this, strong); - } - - /*! - * \brief copy to/from another buffer - * - * Note: the copy is performed on the comp node on which this tensor - * resides and is always async. - * - * If \p direction is OTHER_TO_SELF and shape of this changes, then - * the corresponding dev_ptr would also be updated. - * - * \param other the other buffer involved in the copy; if - * \p direction is SELF_TO_OTHER, then only its type and - * dev_ptr would be used - * \param direction specify the direction to perform the copy - */ - void copy(const Desc &other, CopyDirection direction) { - m_functable->copy(this, other, direction); - } - - /*! - * \brief resize this tensor to given shape - */ - void resize(size_t ndim, const size_t *shape) { - Desc tmp; - tmp.dev_ptr = nullptr; - tmp.ndim = ndim; - tmp.shape = shape; - copy(tmp, CopyDirection::OTHER_TO_SELF); - } - - //! name of dtype of this tensor - const char* dtype_name() const { return dtype_name(desc.dtype); } - - //! name of given dtype - const char* dtype_name(DataType dtype) const { - return m_functable->dtype_name(dtype); - } - - /*! - * \brief forward memory from \p other directly to the underlying - * storage - * - * This can only be used when there is a corresponding VarNode for - * this DeviceTensor. (e.g. for the outputs of Craniotome oprs) - */ - void forward_other_memory( - const Desc &other, CallbackOnce deleter) const { - m_functable->forward_other_memory(this, other, deleter); - } - - /*! - * \brief forward device buffer to \p dest directly and create a - * tensor storage shared memory with m_dv_nd, it would be deleted - * when calling deleter, so refcnt to data ptr could be managed - * correctly. - */ - void forward_to( - void **dest, CallbackOnce* deleter) const { - m_functable->forward_to(this, dest, deleter); - } - - struct _Impl; - private: - // note: we use a func table to avoid symbol visibility problems and - // linking hazards when built with other code base - struct FuncTable { - void (*sync)(const DeviceTensor*, bool); - void (*copy)(DeviceTensor*, const Desc&, CopyDirection); - void (*forward_other_memory)(const DeviceTensor*, const Desc&, - CallbackOnce); - const char* (*dtype_name)(DataType); - void (*forward_to)(const DeviceTensor*, void**, CallbackOnce*); - }; - bool m_readonly; - void* m_dev_nd; - void* m_varptr; - FuncTable* m_functable; - public: - uint32_t _version1; - }; - - /*! - * \brief reinterpret_cast raw pointer or pointer integer to mgb object and - * check version - * \return object pointer if the version is correct; nullptr if failed - */ - template - T* as_versioned_obj(S &&val) { - T *obj = reinterpret_cast(val); - if (obj->_version0 != T::CURRENT_VERSION || - obj->_version1 != T::CURRENT_VERSION) { - return nullptr; - } - return obj; - } -} // namespace pubapi -} // namespace mgb - -// vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} diff --git a/python_module/src/cpp/megbrain_pubapi_internal.h b/python_module/src/cpp/megbrain_pubapi_internal.h deleted file mode 100644 index 7581d60e..00000000 --- a/python_module/src/cpp/megbrain_pubapi_internal.h +++ /dev/null @@ -1,31 +0,0 @@ -/** - * \file python_module/src/cpp/megbrain_pubapi_internal.h - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * \brief internal helpers related to pubapi. Implemented in pubapi.cpp - * - * \copyright Copyright (c) 2014-2020 Megvii Inc. All rights reserved. - * - */ - -#pragma once - -#include "megbrain_pubapi.h" -#include "megbrain/graph.h" - -namespace mgb { - /*! - * \brief fill fields in \p dest with information from other tensors - * - * Note that exactly one of \p tensor and \p var must be non-null - */ - void init_pubapi_dev_tensor( - pubapi::DeviceTensor &dest, - DeviceTensorND *tensor, VarNode *var, bool readonly); - - //! convert megbrain dtype to pubapi dtype - pubapi::DeviceTensor::DataType dtype_mgb2pubapi(DType dtype); -} - -// vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} diff --git a/python_module/src/cpp/megbrain_serialize.cpp b/python_module/src/cpp/megbrain_serialize.cpp deleted file mode 100644 index d6e371bb..00000000 --- a/python_module/src/cpp/megbrain_serialize.cpp +++ /dev/null @@ -1,180 +0,0 @@ -/** - * \file python_module/src/cpp/megbrain_serialize.cpp - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * \copyright Copyright (c) 2014-2020 Megvii Inc. All rights reserved. - * - */ - -#include "./megbrain_serialize.h" -#include "./python_helper.h" - -#include "megbrain/opr/basic_arith.h" - -using namespace mgb; -using namespace serialization; - -TensorValueDumperContext::~TensorValueDumperContext() noexcept = default; -TensorValueLoaderContext::~TensorValueLoaderContext() noexcept = default; - -PyObject* TensorValueDumperContext::_value() { - return npy::ndarray_from_tensor(m_value, npy::ShareType::TRY_SHARE); -} - -void TensorValueDumperContext::_write(PyObject *bytes) { - mgb_assert(PyBytes_Check(bytes)); - auto arr_len = PyBytes_Size(bytes); - auto arr_buf = PyBytes_AsString(bytes); - m_fout.write(arr_buf, arr_len); -} - -std::vector TensorValueLoaderContext::_get_shape() const { - mgb_assert(m_layout.is_contiguous()); - return npy::shape2vec(m_layout); -} - -PyObject* TensorValueLoaderContext::_get_dtype() const { - return npy::dtype_mgb2np(m_layout.dtype); -} - -PyObject* TensorValueLoaderContext::_read(size_t n) { - // Creates a PyBytes with uninitialized content - PyObject* bytes = PyBytes_FromStringAndSize(nullptr, n); - m_fin.read(PyBytes_AsString(bytes), n); - return bytes; -} - -std::string _get_info_for_strip(const SymbolVarArray &dest_vars) { - std::unordered_set opr_types, dtype_names, elemwise_modes; - - auto on_opr = [&](cg::OperatorNodeBase *opr) { - if (GraphDumper::should_remove_in_dump(opr)) - return; - opr_types.insert(opr->dyn_typeinfo()->name); - for (auto i: opr->output()) - dtype_names.insert(i->dtype().name()); - if (opr->same_type()) { - auto mode = opr->cast_final().param().mode; - elemwise_modes.insert( - megdnn::Elemwise::ModeTrait::from_mode(mode).name); - } - }; - cg::DepOprIter opr_iter{on_opr}; - for (auto i: dest_vars) - opr_iter.add(i.node()->owner_opr()); - - auto to_json = [](const std::unordered_set &v) { - std::vector vs(v.begin(), v.end()); - std::sort(vs.begin(), vs.end()); - auto ret = json::Array::make(); - for (auto &&i: vs) - ret->add(json::String::make(i)); - return ret; - }; - - return json::Object::make({ - {"opr_types", to_json(opr_types)}, - {"dtypes", to_json(dtype_names)}, - {"elemwise_modes", to_json(elemwise_modes)}, - })->to_string(); -} - -void _serialize_comp_graph_to_file( - const char *fpath, bool append, GraphDumpFormat format, - const SymbolVarArray &output_vars, - int keep_var_name, bool keep_param_name, bool keep_opr_priority, - _TensorValueDumperCallback *tensor_value_dumper, - std::vector &stat, - std::vector &inputs, - std::vector &outputs, - std::vector ¶ms) { - - auto dumper = GraphDumper::make( - OutputFile::make_fs(fpath, append ? 'a' : 'w'), format); - GraphDumper::DumpConfig config{keep_var_name, keep_param_name, - keep_opr_priority}; - - if (tensor_value_dumper) { - config.tensor_value_dumper = [f=tensor_value_dumper]( - OutputFile &fout, const cg::OperatorNodeBase &opr, - const HostTensorND &value) { - mgb_assert(value.layout().is_contiguous()); - TensorValueDumperContext ctx{fout, opr, value}; - f->call(ctx); - }; - } - - auto rst = dumper->dump(output_vars, config); - inputs = std::move(rst.inputs); - outputs = std::move(rst.outputs); - params = std::move(rst.params); - stat = {rst.nr_opr, rst.tot_bytes, rst.tensor_value_bytes, - rst.content_hash}; -} - -CompGraph _load_comp_graph_from_file( - const char* fpath, _CompNodeMapperCallback* cn_mapper, - _TensorValueLoaderCallback* tensor_value_loader, - std::vector>& output_var_map, - SymbolVarArray& output_var_list) { - auto file = InputFile::make_fs(fpath); - auto format = GraphLoader::identify_graph_dump_format(*file); - mgb_throw_if(!format.valid(), SerializationError, - "unknown model format (input is likely not a MegBrain model)"); - auto loader = GraphLoader::make(std::move(file), format.val()); - GraphLoader::LoadConfig config; - if (cn_mapper) { - config.comp_node_mapper = [f = cn_mapper](CompNode::Locator& locator) { - locator = CompNode::Locator::parse(f->call(locator.to_string())); - }; - } - if (tensor_value_loader) { - config.tensor_value_loader = [f = tensor_value_loader]( - void* ptr, - const TensorLayout& layout, - InputFile& fin) { - TensorValueLoaderContext ctx{layout, fin}; - PyObjRefKeeper value = f->call(ctx); - mgb_assert(value.get()->ob_refcnt > 0); - if (ptr) { - HostTensorStorage storage; - // Unmanaged shared_ptr - storage.reset(CompNode::default_cpu(), - layout.span().dist_byte(), - {std::shared_ptr(), - reinterpret_cast(ptr)}); - HostTensorND tensor; - tensor.reset(storage, layout); - npy::np2tensor(value.get(), npy::Meth::copy_into(&tensor), - layout.dtype); - } - }; - } - auto rst = loader->load(config); - output_var_map = {rst.output_var_map.begin(), rst.output_var_map.end()}; - output_var_list = std::move(rst.output_var_list); - - std::unordered_map tensor2name; - for (const auto& pair : rst.tensor_map) { - tensor2name[pair.second.get()] = &pair.first; - } - auto cb = [&tensor2name, graph=rst.graph](cg::OperatorNodeBase* opr) { - if (!opr->same_type()) - return; - - auto& h2d = opr->cast_final_safe(); - auto it = tensor2name.find(h2d.host_data().get()); - mgb_throw_if(it == tensor2name.end(), GraphError, - "unbound Host2DeviceCopy in loaded graph"); - h2d.output(0)->name(*it->second); - mark_as_input(graph.get(), h2d.output(0)); - }; - cg::DepOprIter iter{cb}; - for (const auto& var : output_var_list) { - iter.add(var.node()->owner_opr()); - } - return CompGraph::make_from_shared_ptr(rst.graph); -} - -// vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} diff --git a/python_module/src/cpp/megbrain_serialize.h b/python_module/src/cpp/megbrain_serialize.h deleted file mode 100644 index f320c680..00000000 --- a/python_module/src/cpp/megbrain_serialize.h +++ /dev/null @@ -1,159 +0,0 @@ -/** - * \file python_module/src/cpp/megbrain_serialize.h - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * \copyright Copyright (c) 2014-2020 Megvii Inc. All rights reserved. - * - */ - - -#ifndef SWIG - -#pragma once - -#include "megbrain/serialization/serializer.h" -#include "./megbrain_wrap.h" -using mgb::cg::SymbolVar; -using mgb::cg::SymbolVarArray; -#endif - -#ifdef SWIG -%feature("autodoc", -"An object that is passed to the callback in \ -:func:`.serialize_comp_graph_to_file`.") TensorValueDumperContext; -%feature("autodoc", -"An object that is passed to the callback in \ -:func:`.load_comp_graph_from_file`.") TensorValueLoaderContext; -%feature("director") _TensorValueDumperCallback; -%feature("director") _TensorValueLoaderCallback; -%feature("director") _CompNodeMapperCallback; - -%template(_VectorPairStringSymbolVar) std::vector>; -%typemap(directorout) PyObjRefKeeper { - Py_XINCREF($input); - $result = PyObjRefKeeper($input); -} -#endif -class TensorValueDumperContext { -#ifndef SWIG - mgb::serialization::OutputFile &m_fout; - const mgb::cg::OperatorNodeBase &m_opr; - const mgb::HostTensorND &m_value; -#endif - - public: - TensorValueDumperContext() = delete; - TensorValueDumperContext(const TensorValueDumperContext&) = delete; - TensorValueDumperContext& operator = ( - const TensorValueDumperContext&) = delete; - -#ifndef SWIG - TensorValueDumperContext( - mgb::serialization::OutputFile &fout, - const mgb::cg::OperatorNodeBase &opr, - const mgb::HostTensorND &value): - m_fout{fout}, m_opr{opr}, m_value{value} - { - } -#endif - ~TensorValueDumperContext() noexcept; - - const char* _name() const { - return m_opr.cname(); - } - - const char* _type() const { - return m_opr.dyn_typeinfo()->name; - } - - PyObject* _value(); - - void _write(PyObject *bytes); - - void _write_default() { - mgb::serialization::GraphDumpConfig::default_tensor_value_dumper( - m_fout, m_opr, m_value); - } - -#ifdef SWIG -%include "./megbrain_serialize_TensorValueDumperContext.py" -#endif - -}; - -class TensorValueLoaderContext { -#ifndef SWIG - const mgb::TensorLayout &m_layout; - mgb::serialization::InputFile &m_fin; -#endif - - public: - TensorValueLoaderContext() = delete; - TensorValueLoaderContext(const TensorValueLoaderContext&) = delete; - TensorValueLoaderContext& operator=(const TensorValueLoaderContext&) = - delete; - -#ifndef SWIG - TensorValueLoaderContext(const mgb::TensorLayout &layout, - mgb::serialization::InputFile &fin) - : m_layout(layout), m_fin(fin) {} -#endif - ~TensorValueLoaderContext() noexcept; - - std::vector _get_shape() const; - PyObject* _get_dtype() const; - - // Returns bytes - PyObject* _read(size_t n); - -#ifdef SWIG -%include "./megbrain_serialize_TensorValueLoaderContext.py" -#endif -}; - -class _TensorValueDumperCallback { - public: - virtual ~_TensorValueDumperCallback() = default; - virtual void call(TensorValueDumperContext &ctx) = 0; -}; - -class _TensorValueLoaderCallback { - public: - virtual ~_TensorValueLoaderCallback() = default; - virtual PyObjRefKeeper call(TensorValueLoaderContext &ctx) = 0; -}; - -class _CompNodeMapperCallback { - public: - virtual ~_CompNodeMapperCallback() = default; - virtual std::string call(const std::string &desc) = 0; -}; - -#ifdef SWIG -%include "megbrain/serialization/dump_format.h" -#else -#include "megbrain/serialization/dump_format.h" -#endif - -void _serialize_comp_graph_to_file( - const char *fpath, bool append, - mgb::serialization::GraphDumpFormat format, - const SymbolVarArray &output_vars, - int keep_var_name, bool keep_param_name, bool keep_opr_priority, - _TensorValueDumperCallback *tensor_value_dumper, - std::vector &stat, - std::vector &inputs, - std::vector &outputs, - std::vector ¶ms); - -std::string _get_info_for_strip(const SymbolVarArray &dest_vars); - -CompGraph _load_comp_graph_from_file( - const char *fpath, _CompNodeMapperCallback *cn_mapper, - _TensorValueLoaderCallback *tensor_value_loader, - /* Outputs */ - std::vector> &output_var_map, - SymbolVarArray &output_var_list); - -// vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} diff --git a/python_module/src/cpp/megbrain_serialize_TensorValueDumperContext.py b/python_module/src/cpp/megbrain_serialize_TensorValueDumperContext.py deleted file mode 100644 index d8028678..00000000 --- a/python_module/src/cpp/megbrain_serialize_TensorValueDumperContext.py +++ /dev/null @@ -1,44 +0,0 @@ -%pythoncode { - @property - def name(self): - """name of the param - - :type: str - """ - return str(self._name()) - - @property - def type(self): - """operator type - - :type: str - """ - return str(self._type()) - - @property - def value(self): - """numerical value of the param - - :type: :class:`numpy.ndarray` - """ - return self._value() - - def write(self, buf): - """write raw data to the output file - - :param buf: value to be written - :type buf: :class:`bytes` - :return: self - """ - assert type(buf) is bytes, 'bad value: {!r}'.format(type(buf)) - self._write(buf) - - def write_default(self): - """dump the numerical value in default format - - :return: self - """ - self._write_default() - return self - -} diff --git a/python_module/src/cpp/megbrain_serialize_TensorValueLoaderContext.py b/python_module/src/cpp/megbrain_serialize_TensorValueLoaderContext.py deleted file mode 100644 index a2ff798c..00000000 --- a/python_module/src/cpp/megbrain_serialize_TensorValueLoaderContext.py +++ /dev/null @@ -1,19 +0,0 @@ -%pythoncode { - @property - def shape(self): - return self._get_shape() - - @property - def dtype(self): - return self._get_dtype() - - def read(self, size): - """read raw data from the input file - - :param size: number of bytes to be read - :type size: :class:`int` - :return: bytes - """ - return self._read(size) - -} diff --git a/python_module/src/cpp/megbrain_wrap.cpp b/python_module/src/cpp/megbrain_wrap.cpp deleted file mode 100644 index bcb85ae1..00000000 --- a/python_module/src/cpp/megbrain_wrap.cpp +++ /dev/null @@ -1,1055 +0,0 @@ -/** - * \file python_module/src/cpp/megbrain_wrap.cpp - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * \copyright Copyright (c) 2014-2020 Megvii Inc. All rights reserved. - * - */ - -#include "./megbrain_wrap.h" -#include "./python_helper.h" -#include "./megbrain_pubapi_internal.h" - -#include "megbrain/version.h" -#include "megbrain/tensor.h" -#include "megbrain/comp_node_env.h" -#include "megbrain/opr/io.h" -#include "megbrain/opr/utility.h" -#include "megbrain/gopt/inference.h" -#include "megbrain/utils/thread.h" -#include "megbrain/utils/timer.h" - -#include -using namespace mgb; - -namespace { - bool g_global_finalize_called = false; - - /*! - * \brief record the vars produced from user-created Host2DeviceCopy - * - * Note that the vars are mapped by address of underlying HostTensorND, so - * in the case of partial execution, vars in the parent graph can be - * retrieved from oprs in the sub graphs. - */ - class UserInputVars final : public UserDataContainer::UserData { - MGB_TYPEINFO_OBJ_DECL; - - //! we keep this mapping to handle multi-part compiling, where new - //! graphs would be created and the var in the original graph is needed - ThinHashMap m_tensor2var; - - public: - void register_var(SymbolVar x) { - m_tensor2var[x.node()->owner_opr() - ->cast_final_safe() - .host_data() - .get()] = x.node(); - } - - //! get the corresponding var from an opr if it has been registered; - //! return nullptr otherwise - VarNode* check(cg::OperatorNodeBase* opr) const { - if (opr->same_type()) { - auto ptr = opr->cast_final() - .host_data() - .get(); - auto iter = m_tensor2var.find(ptr); - return iter == m_tensor2var.end() ? nullptr : iter->second; - } - return nullptr; - } - - static UserInputVars& get(ComputingGraph* graph) { - return *graph->options() - .user_data.get_user_data_or_create(); - } - }; - - __attribute__((constructor)) - void global_init() { - CompNode::enable_affinity_for_cpu(true); - } -} // anonymous namespace - -MGB_TYPEINFO_OBJ_IMPL(UserInputVars); - -/* ================= SharedND ================= */ - -bool SharedND::sync(mgb::DeviceTensorND &dv) { - if (m_copy_sync) { - dv.sync(); - return true; - } - return false; -} - -void SharedND::_set_init_shape(const std::vector &shape) { - mgb_assert(m_dev_tensor && m_dev_tensor->empty()); - m_dev_tensor->resize(npy::vec2shape(shape)); -} - -void SharedND::_resize(const std::vector &shape) { - auto tshp = npy::vec2shape(shape); - if (m_dev_tensor) { - m_dev_tensor->resize(tshp); - } else { - mgb_assert(m_var); - m_var->shape_alloc(tshp); - } -} - -void SharedND::_reset_zero() { - fill_zero_dev_tensor(*m_dev_tensor); -} - -void SharedND::_copy_from_npyarr(PyObject *npyarr) { - auto do_copy = [&](DeviceTensorND *dest, VarNode *var) { - DType dtype = dest ? dest->dtype() : var->dtype(); - mgb_assert(dtype.valid()); - auto hv = npy::np2tensor(npyarr, npy::Meth::borrow(), dtype); - if (var) { - // only setup by assign(), by craniotome - var->shape_alloc(hv.shape()); - dest = &var->mutable_dev_tensor(); - } - if (!sync(dest->copy_from(hv))) { - m_async_copy_refkeeper = hv; - } else { - m_async_copy_refkeeper = {}; - } - }; - if (m_var) { - mgb_assert(!m_dev_tensor); - do_copy(nullptr, m_var); - } else { - mgb_assert(m_dev_tensor); - do_copy(m_dev_tensor.get(), nullptr); - } -} - -PyObject* SharedND::_get_npyarr() { - mgb_assert(m_dev_tensor); - if (m_dev_tensor->empty()) - Py_RETURN_NONE; - HostTensorND hv; - hv.comp_node(CompNode::default_cpu()) - .copy_from(*m_dev_tensor) - .sync(); - return npy::ndarray_from_tensor(hv, npy::ShareType::TRY_SHARE); -} - -PyObject* SharedND::_get_dtype() { - mgb_assert(m_dev_tensor); - return npy::dtype_mgb2np(m_dev_tensor->dtype()); -} - -void SharedND::_copy_from_value_proxy(CompGraphCallbackValueProxy &value) { - if (value.eager_copy()) { - mgb_log_warn("copy from eager-copied CompGraphCallbackValueProxy into" - " SharedND; consider using callback_lazycopy; traceback:\n%s", - PyStackExtracter::run().c_str()); - } - - if (m_var) { - mgb_assert(!m_dev_tensor); - auto &&src = value.dev_tensor(); - m_var->shape_alloc(src.shape()). - mutable_dev_tensor().copy_from(src); - } else { - mgb_assert(m_dev_tensor); - sync(m_dev_tensor->copy_from(value.dev_tensor())); - } -} - -void SharedND::_share_from_value_proxy(CompGraphCallbackValueProxy& value) { - if (value.eager_copy()) { - mgb_log_warn( - "share value from eager-copied CompGraphCallbackValueProxy into" - " SharedND; consider using callback_lazycopy; traceback:\n%s", - PyStackExtracter::run().c_str()); - } - - if (m_var) { - mgb_assert(!m_dev_tensor); - m_var->reset_dev_tensor_from_tensor(value.dev_tensor()); - } else { - mgb_assert(m_dev_tensor); - *m_dev_tensor = value.dev_tensor(); - } -} - -SharedND SharedND::_from_symvar(SymbolVar symvar) { - auto opr = symvar.node()->owner_opr(); - if (auto vsnd = opr->try_cast_final()) { - return SharedND(vsnd->dev_data()); - } - if (auto snd = opr->try_cast_final()) { - return SharedND(snd->dev_data()); - } - mgb_throw(MegBrainError, "cannot convert from %s", opr->dyn_typeinfo()->name); -} - -uintptr_t SharedND::_pubapi_dev_tensor_ptr(int version) { - DeviceTensorND *dv; - if (m_dev_tensor) { - mgb_assert(!m_var); - dv = m_dev_tensor.get(); - } else { - mgb_assert(m_var); - dv = nullptr; - } - void *ret; - if (version == 0) { - if (dv) { - ret = dv->raw_ptr(); - } else { - ret = m_var->dev_tensor().raw_ptr(); - } - } else { - init_pubapi_dev_tensor(m_pubapi_dev_tensor, dv, m_var, false); - ret = &m_pubapi_dev_tensor; - } - return reinterpret_cast(ret); -} - -SymbolVar SharedND::_as_sym_var(CompGraph &cg, const std::string &name, - bool volatile_) { - mgb_assert(m_dev_tensor); - OperatorNodeConfig config; - if (!name.empty()) - config.name(name); - if (volatile_) { - return opr::VolatileSharedDeviceTensor::make(cg.get(), m_dev_tensor, - config); - } else { - return opr::SharedDeviceTensor::make(cg.get(), m_dev_tensor, config); - } -} - -std::vector SharedND::_get_shape(){ - if (m_var) { - mgb_assert(!m_dev_tensor); - return npy::shape2vec(m_var->shape()); - } - mgb_assert(m_dev_tensor); - return npy::shape2vec(m_dev_tensor->shape()); -} - -void SharedND::copy_to_sub_from_shared( - int axis, ptrdiff_t begin, ptrdiff_t end, ptrdiff_t step, - const SharedND &rhs) { - mgb_assert(m_dev_tensor && rhs.m_dev_tensor); - auto sub = m_dev_tensor->sub( - Slice(begin, end, step).apply(m_dev_tensor->layout(), axis)); - sub.copy_from_fixlayout(*rhs.m_dev_tensor).sync(); - -} - -void SharedND::copy_from_shared_sub(const SharedND &rhs, - int axis, ptrdiff_t begin, ptrdiff_t end, ptrdiff_t step) { - mgb_assert(m_dev_tensor && rhs.m_dev_tensor); - if (axis == -3) { - sync(m_dev_tensor->copy_from_fixlayout(*rhs.m_dev_tensor)); - } else if (axis == -2) { - sync(m_dev_tensor->copy_from(*rhs.m_dev_tensor)); - } else { - auto sub = rhs.m_dev_tensor->sub( - Slice(begin, end, step).apply( - rhs.m_dev_tensor->layout(), axis)); - sync(m_dev_tensor->copy_from(sub)); - } -} - -void SharedND::_check_before_share_memory(const SharedND& rhs) { - mgb_assert(rhs.m_dev_tensor); - mgb_assert(m_dev_tensor); - mgb_assert(rhs.m_dev_tensor->dtype() == m_dev_tensor->dtype()); - mgb_assert(rhs.m_dev_tensor->comp_node() == m_dev_tensor->comp_node()); -} - -void SharedND::_share_memory_from(const SharedND& rhs, size_t begin) { - _check_before_share_memory(rhs); - m_dev_tensor->reset( - rhs.m_dev_tensor->storage().sub(m_dev_tensor->dtype().size() * begin), - m_dev_tensor->layout()); -} - -void SharedND::_reset_dev_tensor(const SharedND &rhs) { - _check_before_share_memory(rhs); - *m_dev_tensor = *(rhs.m_dev_tensor); -} - -/* ================= _HostSharedND ================= */ - -void _HostSharedND::ensure_own_storage() { - if (!m_own_storage) { - mgb_assert(m_tensor); - HostTensorND val{m_tensor->comp_node(), m_tensor->dtype()}; - if (!m_tensor->empty()) { - val.resize(m_tensor->shape()); - } - *m_tensor = std::move(val); - m_own_storage = true; - } -} - -void _HostSharedND::_resize(const std::vector &shape) { - ensure_own_storage(); - m_tensor->resize(npy::vec2shape(shape)); -} - -void _HostSharedND::_copy_from_npyarr(PyObject *npyarr, bool borrow) { - mgb_assert(m_tensor); - mgb_assert(m_tensor->dtype().valid()); - if (!m_borrow_on_cpu && - m_tensor->comp_node().device_type() == CompNode::DeviceType::CPU) { - borrow = false; - } - if (borrow) { - auto val = npy::np2tensor( - npyarr, npy::Meth::borrow(m_tensor->comp_node()), - m_tensor->dtype()); - m_own_storage = false; - *m_tensor = std::move(val); - } else { - ensure_own_storage(); - npy::np2tensor(npyarr, - npy::Meth::copy_into(m_tensor.get()), m_tensor->dtype()); - } -} - -SymbolVar _HostSharedND::_as_sym_var(CompGraph &cg, bool enable_static_infer, - const std::string &name) { - if (m_tensor->empty()) - cg.get().options().allocate_static_mem_after_graph_compile = false; - - OperatorNodeConfig config; - if (!name.empty()) - config.name(name); - - SymbolVar ret; - if (enable_static_infer) { - ret = opr::Host2DeviceCopy::make(cg.get(), m_tensor, config); - } else { - ret = opr::Host2DeviceCopy::make_no_value_infer(cg.get(), m_tensor, - config); - } - UserInputVars::get(&cg.get()).register_var(ret); - return ret; -} - -_HostSharedND _HostSharedND::make_proxy(SymbolVar var) { - auto &&opr = var.node()->owner_opr()-> - cast_final_safe(); - _HostSharedND rst{var.node()->comp_node(), var.dtype()}; - rst.m_tensor = opr.host_data(); - rst.m_proxied_opr = &opr; - return rst; -} - -std::string _HostSharedND::__repr__() const { - if (m_proxied_opr) { - return ssprintf("", - this, m_proxied_opr->cname()); - } - return ssprintf("", this); -} - -PyObject* _HostSharedND::_get_dtype() { - mgb_assert(m_tensor); - return npy::dtype_mgb2np(m_tensor->dtype()); -} - -/* ================= CompGraphCallbackValueProxy ================= */ - -CompGraphCallbackValueProxy -CompGraphCallbackValueProxy::make_raw_host_value_proxy( - const mgb::HostTensorND &hv) { - CompGraphCallbackValueProxy ret; - ret.m_use_raw_hv = true; - ret.m_hv = hv; - ret.m_is_active = true; - return ret; -} - -void CompGraphCallbackValueProxy::setup( - const mgb::DeviceTensorND &val, bool eager_copy) { - - while (__atomic_load_n(&m_is_active, __ATOMIC_SEQ_CST)) { - // wait for previous callback to finish - std::this_thread::yield(); - } - - mgb_assert(!m_use_raw_hv && val.shape_valid()); - m_eager_copy = eager_copy; - m_dev_value = val; - if (eager_copy) { - m_value_used = false; - do_copy(); - } else { - m_value_used = true; - } - - __atomic_store_n(&m_is_active, true, __ATOMIC_SEQ_CST); -} - -void CompGraphCallbackValueProxy::do_copy() { - mgb_assert(!m_use_raw_hv && m_dev_value.shape_valid()); - m_hv.copy_from(m_dev_value); - auto cn = m_hv.comp_node(); - if (!m_copy_event) - m_copy_event = cn.create_event(); - m_copy_event->record(); -} - -#if defined(WIN32) -#include -#include -#undef CONST -#define usleep Sleep -#endif -void CompGraphCallbackValueProxy::sync() const { - mgb_assert(!m_use_raw_hv); - RealTimer t0; - double next_warn_time = 2, warn_time_delta = 1; - while (!m_copy_event->finished()) { - //! sleep 1ms or sleep 1us no difference for performance on win32 - usleep(1); - if (t0.get_secs() >= next_warn_time) { - mgb_log_warn("wait d2h copy for more than %.3f secs", - t0.get_secs()); - next_warn_time += warn_time_delta; - warn_time_delta += 1; - } - } -} - -void CompGraphCallbackValueProxy::on_finished() { - mgb_assert(m_is_active && !m_use_raw_hv); - m_dev_value = {}; - if (m_hv.shape_valid()) { - m_hv.resize({}); // resize to reuse buffer - } - __atomic_store_n(&m_is_active, false, __ATOMIC_SEQ_CST); - if (!m_value_used) { - mgb_log_warn("computing graph callback did not read the value"); - } -} - -PyObject* CompGraphCallbackValueProxy::_get_npyarr() { - mgb_assert(m_is_active); - - if (!m_use_raw_hv) { - mgb_assert(m_dev_value.shape_valid()); - if (!m_hv.shape_valid()) { - do_copy(); - sync(); - } - } - m_value_used = true; - return npy::ndarray_from_tensor(m_hv, npy::ShareType::TRY_SHARE); -} - -PyObject* CompGraphCallbackValueProxy::_get_dtype() { - mgb_assert(m_is_active); - - if (m_use_raw_hv) - return npy::dtype_mgb2np(m_hv.dtype()); - - mgb_assert(m_dev_value.shape_valid()); - return npy::dtype_mgb2np(m_dev_value.dtype()); -} - -std::vector CompGraphCallbackValueProxy::_get_shape() { - mgb_assert(m_is_active); - - if (m_use_raw_hv) - return npy::shape2vec(m_hv.shape()); - - mgb_assert(m_dev_value.shape_valid()); - return npy::shape2vec(m_dev_value.shape()); -} - -uintptr_t CompGraphCallbackValueProxy::_pubapi_dev_tensor_ptr(int version) { - mgb_assert(m_is_active && !m_use_raw_hv); - mgb_assert(m_dev_value.shape_valid()); - void *ret; - if (version == 0) { - ret = m_dev_value.raw_ptr(); - } else { - init_pubapi_dev_tensor( - m_pubapi_dev_tensor, &m_dev_value, nullptr, true); - ret = &m_pubapi_dev_tensor; - } - return reinterpret_cast(ret); -} - -mgb::CompNode CompGraphCallbackValueProxy::_get_comp_node() { - mgb_assert(m_is_active && !m_use_raw_hv); - mgb_assert(m_dev_value.shape_valid()); - return m_dev_value.comp_node(); -} - -/* ================= AsyncExec ================= */ - -class AsyncExec::Core { - public: - Core(std::unique_ptr f): - m_func(std::move(f)) - { - } - - mgb::cg::AsyncExecutable* func() const { - return m_func.get(); - } - - struct CallbackParam { - std::vector value; - _CompGraphCallback *cb; - }; - - void dispatch_callback(const CallbackParam ¶m) { - m_worker.add_task(param); - } - - void wait_callback_finish() { - m_worker.wait_all_task_finish(); - } - - private: - std::unique_ptr m_func; - - class Worker final: public AsyncQueueSC { - public: - void process_one_task(const CallbackParam &task) { - for (auto &tmp_value: task.value) { - tmp_value.sync(); - } - task.cb->call_pycb(); - } - }; - Worker m_worker; -}; - -AsyncExec::AsyncExec(std::unique_ptr f): - m_core(std::make_shared(std::move(f))) -{ -} - -AsyncExec::~AsyncExec() { - if (m_core) - _wait(); -} - -AsyncExec::Core* AsyncExec::core() const { - return m_core.get(); -} - -void AsyncExec::_execute() { - m_core->func()->execute(); -} - -std::string AsyncExec::_to_json_str() { - auto jv = m_core->func()->to_json(); - return jv->to_string(); -} - -void AsyncExec::_wait() { - m_core->wait_callback_finish(); - m_core->func()->wait(); -} - -double AsyncExec::_get_prev_exec_time() { - return m_core->func()->get_prev_exec_time(); -} - -SymbolVarArray AsyncExec::_find_mutable_input() { - ThinHashSet used_set; - UserInputVars* user_vars = nullptr; - auto cb = [&](cg::OperatorNodeBase* opr) { - if (!user_vars) { - ComputingGraph* g; - if (m_multi_part_par_graph) - g = m_multi_part_par_graph.get(); - else - g = opr->owner_graph(); - user_vars = &UserInputVars::get(g); - } - if (auto var = user_vars->check(opr)) { - used_set.insert(var); - } - return true; - }; - m_core->func()->iter_opr_seq(cb); - for (auto i : m_core->func()->get_rt_static_source_deps()) { - cb(i.dest->owner_opr()); - } - SymbolVarArray ret; - ret.reserve(used_set.size()); - ret.insert(ret.begin(), used_set.begin(), used_set.end()); - return ret; -} - -void AsyncExec::clear_device_memory() { - _wait(); - m_core->func()->clear_device_memory(); -} - -std::vector> -AsyncExec::_update_static_alloc_plan_and_get_size() { - std::vector> ret; - for (auto&& i : m_core->func()->update_static_alloc_plan_and_get_size()) { - ret.emplace_back(i.first, i.second); - } - return ret; -} - -/* ================= _CompGraphCallback ================= */ - -void _CompGraphCallback::set_async_exec(const AsyncExec &ae) { - mgb_assert(!m_ae_core); - m_ae_core = ae.core(); -} - -void _CompGraphCallback::set_eager_copy(bool flag) { - mgb_assert(!m_cb_created); - m_eager_copy = flag; -} - -std::function &)> _CompGraphCallback::make_multi_input_callback() { - mgb_assert(!m_cb_created); - m_cb_created = true; - - // shared_ptr would delete this afterwards - std::shared_ptr <_CompGraphCallback> self(this); - - auto cb = [self](SmallVector &data) { - for (size_t i = self->m_value_proxies.size(); i < data.size(); ++i) { - self->m_value_proxies.emplace_back(); - } - if (self->m_eager_copy) { - mgb_assert(self->m_ae_core); - for (size_t i = 0; i < self->m_value_proxies.size(); ++i) { - self->m_value_proxies[i].setup(data[i], true); - } - self->m_ae_core->dispatch_callback( - AsyncExec::Core::CallbackParam{self->m_value_proxies, self.get()} - ); - } else { - for (size_t i = 0; i < self->m_value_proxies.size(); ++i) - self->m_value_proxies[i].setup(data[i], false); - self->call_pycb(); - } - }; - - return cb; -} - -std::function _CompGraphCallback::make_callback() { - this->m_value_proxies.emplace_back(); - mgb_assert(!m_cb_created); - m_cb_created = true; - - // shared_ptr would delete this afterwards - std::shared_ptr <_CompGraphCallback> self(this); - - auto cb = [self](mgb::DeviceTensorND &data) { - if (self->m_eager_copy) { - mgb_assert(self->m_ae_core); - self->m_value_proxies[0].setup(data, true); - self->m_ae_core->dispatch_callback( - AsyncExec::Core::CallbackParam{self->m_value_proxies, self.get()} - ); - } else { - self->m_value_proxies[0].setup(data, false); - self->call_pycb(); - } - }; - - return cb; -} - -void _CompGraphCallback::call_pycb() { - try { - call(m_value_proxies); - } catch (...) { - for(auto &m_value_proxy: m_value_proxies) { - m_value_proxy.on_finished(); - } - throw; - } - for(auto &m_value_proxy: m_value_proxies) { - m_value_proxy.on_finished(); - } -} - -/* ================= CompGraph ================= */ - -class CompGraph::PyUserData final: public UserDataContainer::UserData, - public NonCopyableObj { - MGB_TYPEINFO_OBJ_DECL; - - PyObject *m_obj; - - public: - - PyUserData() { - PYTHON_GIL; - m_obj = PyDict_New(); - mgb_assert(m_obj, "failed to create python object"); - } - - ~PyUserData() { - PYTHON_GIL; - Py_DECREF(m_obj); - } - - PyObject* get() const { - return m_obj; - } -}; -MGB_TYPEINFO_OBJ_IMPL(CompGraph::PyUserData); - -mgb::ComputingGraph& CompGraph::get() const { - if (m_comp_graph_own) - return *m_comp_graph_own; - auto &&val = m_comp_graph_borrow.lock(); - mgb_assert(val, "CompGraph has been destructed"); - return *val; -} - -void CompGraph::clear_device_memory() { - if (!m_comp_graph_own) - return; - m_comp_graph_own->clear_device_memory(); -} - -PyObject* CompGraph::_user_data() { - auto ct = get().options().user_data.get_user_data_or_create(); - auto ret = ct->get(); - PYTHON_GIL; - Py_INCREF(ret); - return ret; -} - -void CompGraph::_add_output_spec( - mgb::cg::SymbolVar &var, _CompGraphCallback *callback) { - - cg::ComputingGraph::Callback cb; - if (callback) { - cb = callback->make_callback(); - m_raw_callbacks.push_back({callback, m_out_specs.size() - 1}); - } - if (m_out_specs.empty()) { - m_out_specs.emplace_back(); - } - m_out_specs.back().push_back({var, cb}); -} - -AsyncExec CompGraph::_do_compile(bool copy, bool optimize_for_inference) { - mgb_assert(m_out_specs.size() == 1, "got %zu output specs for compile", - m_out_specs.size()); - auto&& spec = m_out_specs[0]; - if (optimize_for_inference) { - SymbolVarArray vars; - vars.reserve(spec.size()); - for (auto&& i : spec) { - vars.push_back(i.first); - } - vars = gopt::optimize_for_inference(vars, {}); - mgb_assert(vars.size() == spec.size()); - for (size_t i = 0; i < vars.size(); ++i) { - spec[i].first = vars[i]; - } - } - - std::unique_ptr async_executable; - if (get().options().eager_evaluation || - (copy && get().current_comp_seq())) { - // need to copy a new comp graph - SymbolVarArray vars; - vars.reserve(spec.size()); - for (auto&& i : spec) { - vars.emplace_back(i.first); - } - - // copy graph - auto new_graph = mgb::ComputingGraph::make(); - SymbolVarArray new_vars = - replace_vars_comp_graph(std::move(vars), new_graph.get()); - mgb_assert(new_vars.size() == spec.size()); - - // register input - auto h2d = find_h2d(new_vars); - for (auto&& i : h2d) { - UserInputVars::get(new_graph.get()).register_var(i); - } - - mgb::ComputingGraph::OutputSpec new_spec; - new_spec.reserve(spec.size()); - for (size_t i = 0; i < spec.size(); ++i) { - new_spec.emplace_back(mgb::ComputingGraph::OutputSpecItem{ - new_vars[i], spec[i].second}); - } - async_executable = new_graph->compile(new_spec); - } else { - async_executable = get().compile(spec); - } - - AsyncExec ret{std::move(async_executable)}; - - for (auto&& i : m_raw_callbacks) { - mgb_assert(!i.second); - i.first->set_async_exec(ret); - } - _clear_output_spec(); - return ret; -} - -std::vector CompGraph::_do_compile_multi_part() { - // last spec is empty due to an extra call to _add_multi_part_endpoint() - mgb_assert(m_out_specs.size() > 1 && m_out_specs.back().empty(), - "got %zu output specs for multi-part compile", - m_out_specs.size()); - m_out_specs.pop_back(); - std::vector ret; - ret.reserve(m_out_specs.size()); - auto graph = get().shared_from_this(); - for (auto&& i : graph->compile_multi_part(m_out_specs)) { - ret.emplace_back(std::move(i)); - } - for (auto&& i : ret) { - i.set_multi_part_par_graph(graph); - } - for (auto&& i : m_raw_callbacks) { - i.first->set_async_exec(ret.at(i.second)); - } - _clear_output_spec(); - return ret; -} - -/* ================= SharedScalar ================= */ - -SharedScalar::SharedScalar(PyObject *val): - m_val{std::make_shared()} -{ - _set(val); -} - -HostTensorND& SharedScalar::val_as_host_nd() { - if (m_val_as_host_nd.empty()) { - HostTensorStorage storage; - storage.reset(CompNode::default_cpu(), m_val->dtype().size(), - {m_val, static_cast( - const_cast(m_val->storage()))}); - m_val_as_host_nd.reset(storage, {TensorShape{1}, m_val->dtype()}); - } - return m_val_as_host_nd; -} - -void SharedScalar::_set(PyObject *val) { - auto tensor = npy::np2tensor(val, npy::Meth::borrow(), {}); - mgb_assert(tensor.layout().is_scalar(), - "value given to SharedScalar must be scalar; got shape %s", - tensor.shape().to_string().c_str()); - if (m_dtype_locked) { - mgb_assert(tensor.dtype() == m_val->dtype(), - "dtype for SharedScalar has been locked as %s, " - "but attempt to set it to %s", m_val->dtype().name(), - tensor.dtype().name()); - } - m_val->set_raw(tensor.dtype(), tensor.raw_ptr()); - - if (!m_dev_val.empty()) { - auto &&hv = val_as_host_nd(); - for (auto &&i: m_dev_val) - i.second->copy_from_fixlayout(hv); - } -} - -PyObject* SharedScalar::_get() { - HostTensorND hv{CompNode::default_cpu(), TensorShape{1}, m_val->dtype()}; - memcpy(hv.raw_ptr(), m_val->storage(), m_val->dtype().size(1)); - return npy::ndarray_from_tensor(hv, npy::ShareType::TRY_SHARE); -} - -SymbolVar SharedScalar::_as_sym_var(CompGraph &cg, mgb::CompNode &cn) { - m_dtype_locked = true; - auto &&dv = m_dev_val[cn]; - auto &&hv = val_as_host_nd(); - if (!dv) { - dv = std::make_shared(cn); - dv->copy_from(hv); - } - return opr::SharedDeviceTensor::make(cg.get(), dv, - ssprintf("SharedScalar@%p", m_val.get())); -} - -/* =============== Operator =============== */ - -const std::unique_ptr Operator::sm_opr_footprint_ptr{ - std::make_unique()}; - -/* ================= misc ================= */ - -SymbolVar fill_retain_dtype(SymbolVar var, PyObject *value) { - auto tensor = npy::np2tensor(value, npy::Meth::borrow(), {}); - mgb_assert(tensor.shape().is_scalar(), - "value for fill_retain_dtype must be scalar; got shape %s", - tensor.shape().to_string().c_str()); - switch (tensor.dtype().enumv()) { -#define cb(_dt) case DTypeTrait<_dt>::enumv: \ - static_assert(sizeof(DTypeTrait<_dt>::ctype) <= sizeof(int), \ - "bad dtype size"); \ - return var.fill_retain_dtype(static_cast( \ - *tensor.ptr::ctype>())); - MEGDNN_FOREACH_COMPUTING_DTYPE_INT(cb) -#undef cb - case DTypeEnum::Float32: - return var.fill_retain_dtype(*tensor.ptr()); - case DTypeEnum::Float16: - return var.fill_retain_dtype( - static_cast(*tensor.ptr())); - case DTypeEnum::BFloat16: - return var.fill_retain_dtype( - static_cast(*tensor.ptr())); - // TODO: What does this mean? - case DTypeEnum::Quantized8Asymm: - case DTypeEnum::QuantizedS32: - case DTypeEnum::QuantizedS8: - case DTypeEnum::Quantized4Asymm: - case DTypeEnum::QuantizedS4: - case DTypeEnum::Byte: - case DTypeEnum::QuantizedS16: - case DTypeEnum::Bool: - break; -#define cb(low_bit, size) \ - case DTypeEnum::low_bit##size: \ - break; -MEGDNN_FOREACH_LOWBIT_DTYPE(cb) -#undef cb - - } - throw ConversionError(ssprintf( - "unsupported value dtype: %s", tensor.dtype().name())); -} - -PyObject* get_symvar_inferred_value(mgb::SymbolVar symvar) { - auto var = symvar.node(); - auto&& mgr = var->owner_graph()->static_infer_manager(); - using IT = cg::static_infer::InferType; - auto it = mgr.get_infer_type(var); - if (!(it.value & (IT::CONST | IT::RT_STATIC))) - Py_RETURN_NONE; - - auto val = mgr.infer_value_fallible(var); - if (!val) - Py_RETURN_NONE; - - auto hv = HostTensorND::make_proxy(*val); - return npy::ndarray_from_tensor(hv, npy::ShareType::MUST_UNSHARE); -} - -void _mgb_global_finalize() { - CompNode::finalize(); - g_global_finalize_called = true; -} - -bool global_finalized() { - return g_global_finalize_called; -} - -std::vector _get_mgb_version() { - return {MGB_MAJOR, MGB_MINOR, MGB_PATCH, MGB_IS_DEV}; -} - -SymbolVarArray _grad(SymbolVar target, SymbolVarArray wrts, - bool warn_mid_wrt, int use_virtual_grad, - bool return_zero_for_nodep) { - if (use_virtual_grad == -1) { - use_virtual_grad = std::abs( - target.node()->owner_graph()->options().graph_opt_level) >= 2; - } - - if (use_virtual_grad) { - mgb_assert(return_zero_for_nodep, - "can't return a null var when using virtual grad opr"); - SymbolVarArray ret; - ret.reserve(wrts.size()); - for (auto&& wrt : wrts) { - ret.push_back(opr::VirtualGrad::make(target, wrt)); - } - return ret; - } - return cg::grad(target, wrts, warn_mid_wrt, return_zero_for_nodep); -} - -SymbolVar _inter_graph_trans_var( - CompGraph &dest_graph, SymbolVar src) { - auto &&graph = dest_graph.get(); - auto trans = mgb::cg::InterGraphVarTransformer::get(graph); - mgb_assert(trans, "trans func on graph %p has not been setup", &graph); - return trans->trans(src.node()); -} - -SymbolVar _get_graph_optimizer_replaced_var(SymbolVar src) { - return gopt::GraphOptimizer::var_replace_lookup(src.node()); -} - -void mark_as_input(ComputingGraph* cg, SymbolVar var) { - VarNode* node = var.node(); - mgb_assert(node->owner_graph() == cg); - mgb_assert(node->owner_opr()->same_type()); - UserInputVars::get(cg).register_var(var); -} - -namespace { - -void add_update_impl(const DeviceTensorND& dest, - const DeviceTensorND& delta_nobrd, - float alpha, float beta, float bias) { - auto&& cn = dest.comp_node(); - using DT = CompNode::DeviceType; - mgb_assert(cn == delta_nobrd.comp_node() && - (cn.device_type() == DT::CUDA || cn.device_type() == DT::CPU || - cn.device_type() == DT::ROCM)); - mgb_assert(dest.dtype() == delta_nobrd.dtype()); - auto&& delta = delta_nobrd.sub(SubTensorSpec::make_from_offset_elem( - delta_nobrd.layout().broadcast(dest.shape()), 0)); - cn.activate(); - if (!static_cast(alpha) && beta == 1 && - !static_cast(bias)) { - dest.copy_from_fixlayout(delta); - } else { - auto&& handle = MegDNNHandle::get( - CompNodeEnv::from_comp_node(cn)).handle(); - auto&& op = handle->create_operator(); - op->param() = {alpha, beta, bias}; - op->exec(dest.as_megdnn(), delta.as_megdnn()); - if (cn.device_type() == DT::CPU && cn != CompNode::default_cpu()) { - CompNodeEnv::from_comp_node(cn).cpu_env().dispatch( - [p = op.release()] { delete p; } - ); - } - } -} - -} // anonymous namespace - -void _add_update_fastpath(SharedND& dest_, SharedND& delta_, - float alpha, float beta, float bias) { - auto&& dest = dest_.dev_tensor(); - auto&& delta = delta_.dev_tensor(); - add_update_impl(*dest, *delta, alpha, beta, bias); -} - -void _add_update_fastpath(SharedND& dest_, CompGraphCallbackValueProxy& delta_, - float alpha, float beta, float bias) { - auto&& dest = dest_.dev_tensor(); - auto&& delta = delta_.dev_tensor(); - add_update_impl(*dest, delta, alpha, beta, bias); -} - -// vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} diff --git a/python_module/src/cpp/megbrain_wrap.h b/python_module/src/cpp/megbrain_wrap.h deleted file mode 100644 index 106457ee..00000000 --- a/python_module/src/cpp/megbrain_wrap.h +++ /dev/null @@ -1,491 +0,0 @@ -/** - * \file python_module/src/cpp/megbrain_wrap.h - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * \brief wrappers for basic functionalities - * - * \copyright Copyright (c) 2014-2020 Megvii Inc. All rights reserved. - * - */ - -#pragma once - -#include "./python_helper.h" -#include "./megbrain_pubapi.h" - -#include "megbrain/graph.h" -#include "megbrain/opr/io.h" - -#include "megbrain/plugin/opr_footprint.h" - -#include -#include - -class CompGraph; -class CompGraphCallbackValueProxy; - -/*! - * \brief proxy a mgb::DeviceTensorND or a SymbolVar - */ -class SharedND { - mgb::pubapi::DeviceTensor m_pubapi_dev_tensor; - - std::shared_ptr m_dev_tensor; - mgb::HostTensorND m_async_copy_refkeeper; - mgb::VarNode *m_var = nullptr; - bool m_copy_sync = true; - - bool sync(mgb::DeviceTensorND &dv); - inline void _check_before_share_memory(const SharedND& rhs); - - public: - SharedND() = default; - - SharedND(mgb::CompNode node, PyObject* dtype): - m_dev_tensor(std::make_shared( - node, npy::dtype_np2mgb(dtype))) - { } - - SharedND(const std::shared_ptr& dv) - : m_dev_tensor(dv) {} - - //! set init shape; can be only called once - void _set_init_shape(const std::vector &shape); - - //! resize to given shape - void _resize(const std::vector &shape); - - //! reset dev_tensor to zeros - void _reset_zero(); - - /*! - * \brief assign to proxy given dev tensor; used by craniotome - */ - void assign(const mgb::DeviceTensorND &dv) { - mgb_assert(!m_dev_tensor && !m_var); - m_dev_tensor = std::make_shared(dv); - } - - /*! - * \brief assign to proxy a var node; used by craniotome - */ - void assign(mgb::VarNode *var) { - mgb_assert(!m_dev_tensor && !m_var); - m_var = var; - } - - /*! - * \brief share memory from another SharedND; only used in ParamPack - */ - void _share_memory_from(const SharedND& rhs, size_t begin); - - /*! - * \brief reset dev_tensor to another SharedNd's - */ - void _reset_dev_tensor(const SharedND& rhs); - - uintptr_t _pubapi_dev_tensor_ptr(int version); - - mgb::SymbolVar _as_sym_var(CompGraph &cg, const std::string &name, - bool volatile_); - - mgb::CompNode _get_comp_node() { - return m_dev_tensor->comp_node(); - } - - void _set_copy_sync(bool flag) { - m_copy_sync = flag; - } - - //! get dev buffer from shared nd - const std::shared_ptr& dev_tensor() { - return m_dev_tensor; - } - - void _copy_from_npyarr(PyObject *npyarr); - void _copy_from_value_proxy(CompGraphCallbackValueProxy &value); - void _share_from_value_proxy(CompGraphCallbackValueProxy &value); - static SharedND _from_symvar(mgb::SymbolVar symvar); - - //! get numpy ndarray that contains a copy of the value; return new ref - PyObject* _get_npyarr(); - PyObject* _get_dtype(); - std::vector _get_shape(); - - /*! - * \brief copy to sub of this from another SharedND - * \param axis axis for sub, or -1 to work on flattened array - */ - void copy_to_sub_from_shared( - int axis, ptrdiff_t begin, ptrdiff_t end, ptrdiff_t step, - const SharedND &rhs); - - /*! - * \brief copy from sub of another SharedND to this - * \param axis axis for sub, or -1 to work on flattened array, -2 to - * copy whole tensor, -3 to copy whole tensor fixlayout - */ - void copy_from_shared_sub(const SharedND &rhs, - int axis, ptrdiff_t begin, ptrdiff_t end, ptrdiff_t step); -}; - -/*! - * \brief wraps around shared pointer to mgb::HostTensorND - */ -class _HostSharedND { - bool m_own_storage = false, m_borrow_on_cpu = false; - std::shared_ptr m_tensor; - //! set to non-null if this _HostSharedND is set to proxy a var - mgb::opr::Host2DeviceCopy* m_proxied_opr = nullptr; - - void ensure_own_storage(); - - public: - _HostSharedND() = default; - - _HostSharedND(const _HostSharedND &rhs): - m_own_storage{false}, - m_tensor{rhs.m_tensor}, - m_proxied_opr{rhs.m_proxied_opr} - { - } - - _HostSharedND(mgb::CompNode node, mgb::DType dtype): - m_own_storage{true}, - m_tensor{std::make_shared(node, dtype)} - { - } - - _HostSharedND(mgb::CompNode node, PyObject* dtype): - _HostSharedND(node, npy::dtype_np2mgb(dtype)) - { - } - - _HostSharedND& operator = (const _HostSharedND &) = delete; - - /*! - * \brief make a _HostSharedND by proxing a var produced by - * Host2DeviceCopy - */ - static _HostSharedND make_proxy(mgb::SymbolVar var); - - mgb::SymbolVar _as_sym_var(CompGraph &cg, bool enable_static_infer, - const std::string &name); - - void _resize(const std::vector &shape); - void _copy_from_npyarr(PyObject *npyarr, bool borrow); - - void _enable_borrow_on_cpu(bool flag) { - m_borrow_on_cpu = flag; - } - - std::string __repr__() const; - PyObject* _get_dtype(); -}; - -/*! - * \brief proxy a value to be passed to computing graph callback - */ -class CompGraphCallbackValueProxy { - mgb::pubapi::DeviceTensor m_pubapi_dev_tensor; - bool m_is_active = false; //! setup called but on_finished not called - bool m_use_raw_hv = false; - bool m_value_used, m_eager_copy; - mgb::HostTensorND m_hv; - std::shared_ptr m_copy_event; - - //! original dev value - mgb::DeviceTensorND m_dev_value; - - //! perform D2H copy - void do_copy(); - - public: - static CompGraphCallbackValueProxy make_raw_host_value_proxy( - const mgb::HostTensorND &hv); - - bool eager_copy() const { - return m_eager_copy; - } - - mgb::DeviceTensorND& dev_tensor() { - return m_dev_value; - } - - void setup(const mgb::DeviceTensorND &val, bool eager_copy); - void sync() const; - - /*! - * \brief called after python callback returned - */ - void on_finished(); - - //! get numpy ndarray that contains a copy of the value; return new ref - PyObject* _get_npyarr(); - PyObject* _get_dtype(); - std::vector _get_shape(); - - uintptr_t _pubapi_dev_tensor_ptr(int version); - - mgb::CompNode _get_comp_node(); -}; - -class AsyncExec { - public: - class Core; - - AsyncExec() = default; - - ~AsyncExec(); - - AsyncExec(std::unique_ptr f); - - void _execute(); - void _wait(); - double _get_prev_exec_time(); - - void clear_device_memory(); - - std::vector> - _update_static_alloc_plan_and_get_size(); - - std::string _to_json_str(); - - /*! - * \brief find all Host2DeviceCopy input vars that are mutable (i.e. - * used as func args) - */ - mgb::SymbolVarArray _find_mutable_input(); - - Core* core() const; - - void set_multi_part_par_graph(std::shared_ptr g) { - m_multi_part_par_graph = std::move(g); - } - - private: - std::shared_ptr m_core; - //! parent graph in multi-part compiling - std::shared_ptr m_multi_part_par_graph; -}; - -/*! - * \brief callback wrapper for computing graph - */ -class _CompGraphCallback { - bool m_cb_created = false, m_eager_copy = false; - AsyncExec::Core* m_ae_core = nullptr; - std::vector m_value_proxies; - - public: - /*! - * \brief set AsyncExec associated with this callback; if it is set, - * eager value copy would be enabled - */ - void set_async_exec(const AsyncExec &ae); - - /*! - * \brief set whether enabling eager copy - * - * If eager copy is enabled, host to device copy would start immediately - * and asynchronously when this callback is executed by megbrain - */ - void set_eager_copy(bool flag); - - virtual ~_CompGraphCallback() = default; - - std::function &)> make_multi_input_callback(); - std::function make_callback(); - - /*! - * \brief call python callback - */ - void call_pycb(); - - /*! - * \brief python callback to be overwritten - */ - virtual void call(std::vector&) = 0; -}; - -/*! - * \brief wrap around shared mgb::ComputingGraph - */ -class CompGraph { - class PyUserData; - - mgb::SmallVector m_out_specs; - //! (callback, output spec part) - mgb::SmallVector> m_raw_callbacks; - - std::shared_ptr m_comp_graph_own; - std::weak_ptr m_comp_graph_borrow; - - explicit CompGraph(const std::shared_ptr& cg) - : m_comp_graph_own{cg} {} - - explicit CompGraph(const std::weak_ptr &cg): - m_comp_graph_borrow{cg} - {} - - public: - - CompGraph(): - m_comp_graph_own(mgb::ComputingGraph::make()) - {} - - // A mgb::cg::ComputingGraph may be wrapped in a CompGraph in two ways: - // 1. Borrowing a ComputingGraph. - // 2. Own a shared_ptr of ComputingGraph. - // We make constructors private and use factory function instead to make - // it explicit at the call site. (So-called "Named Constructor") - - /*! - * \brief Wrap a ComputingGraph by borrowing a reference. - */ - static CompGraph make_from_weak_ptr( - const std::weak_ptr& cg) { - return CompGraph{cg}; - } - - /*! - * \brief Wrap a ComputingGraph by owning one of its reference. - */ - static CompGraph make_from_shared_ptr( - const std::shared_ptr& cg) { - return CompGraph{cg}; - } - - CompGraph(const mgb::cg::SymbolVarArray& dest_symbol_vars) { - m_comp_graph_own = mgb::ComputingGraph::make(); - mgb::cg::replace_vars_comp_graph(dest_symbol_vars, - m_comp_graph_own.get()); - } - - void clear_device_memory(); - - //! get underlying ComputingGraph instance - mgb::ComputingGraph& get() const; - - CompGraph& share_device_memory_with(CompGraph &other) { - get().share_device_memory_with(other.get()); - return *this; - } - - //! get a dict to store arbitrary user data - PyObject* _user_data(); - - AsyncExec _do_compile(bool copy, bool optimize_for_inference); - std::vector _do_compile_multi_part(); - - /*! - * \brief add an output spec - * \param callback callback to be invoked; or nullptr for computing - * output var only - */ - void _add_output_spec(mgb::cg::SymbolVar &var, - _CompGraphCallback *callback); - - //! mark currently added output specs as a part in multi-part compile - void _add_multi_part_endpoint() { - m_out_specs.emplace_back(); - } - - void _clear_output_spec() { - m_raw_callbacks.clear(); - m_out_specs.resize(1); - m_out_specs[0].clear(); - } - - size_t _release() { - if (m_comp_graph_own) { - auto ret = m_comp_graph_own.use_count(); - m_comp_graph_own.reset(); - return ret; - } - m_comp_graph_borrow.reset(); - return 0; - } - -}; - -//! wrap shared_ptr -class SharedScalar { - bool m_dtype_locked = false; - std::shared_ptr m_val; - mgb::HostTensorND m_val_as_host_nd; - mgb::CompNode::UnorderedMap> m_dev_val; - - mgb::HostTensorND& val_as_host_nd(); - - public: - SharedScalar(PyObject *val); - void _set(PyObject *val); - PyObject* _get(); - mgb::SymbolVar _as_sym_var(CompGraph &cg, mgb::CompNode &cn); - - void _lock_dtype() { - m_dtype_locked = true; - } - - bool _dtype_locked() { - return m_dtype_locked; - } - - const std::shared_ptr& get_val() const { - return m_val; - } -}; - -/*! - * \brief wrap around shared mgb::cg::OperatorNodeBase - */ -class Operator { - mgb::cg::OperatorNodeBase* m_operator_node; - std::string m_params; - - static const std::unique_ptr sm_opr_footprint_ptr; - -public: - Operator() : m_operator_node(nullptr){}; - Operator(mgb::cg::OperatorNodeBase* operator_node) - : m_operator_node(operator_node), - m_params(std::move( - (sm_opr_footprint_ptr->calc_footprint(m_operator_node)).param->to_string())) - {} - - size_t id() const { return m_operator_node->id(); } - - const std::string& name() const { return m_operator_node->name(); } - - const std::string& params() const { return m_params; } - - const std::shared_ptr get_owner_graph() const { - return m_operator_node->owner_graph()->shared_from_this(); - } - - const mgb::SymbolVarArray inputs() const { - return mgb::cg::to_symbol_var_array(m_operator_node->input()); - } - - const mgb::SymbolVarArray outputs() const { - return mgb::cg::to_symbol_var_array(m_operator_node->output()); - } - - mgb::cg::OperatorNodeBase* node() const { return m_operator_node; } -}; - -//! get inferred value as numpy ndarray or None -PyObject* get_symvar_inferred_value(mgb::SymbolVar var); - -mgb::SymbolVar fill_retain_dtype(mgb::SymbolVar var, PyObject* value); - -//! whether _mgb_global_finalize() has been called -bool global_finalized(); - -#ifndef SWIG -void mark_as_input(mgb::cg::ComputingGraph* cg, mgb::cg::SymbolVar var); -#endif - -// vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} diff --git a/python_module/src/cpp/numpy_incl.h b/python_module/src/cpp/numpy_incl.h deleted file mode 100644 index 02a2b693..00000000 --- a/python_module/src/cpp/numpy_incl.h +++ /dev/null @@ -1,37 +0,0 @@ -/** - * \file python_module/src/cpp/numpy_incl.h - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * \brief import numpy array with proper settings - * - * \copyright Copyright (c) 2014-2020 Megvii Inc. All rights reserved. - * - */ -#pragma once - -#define PY_ARRAY_UNIQUE_SYMBOL mgb_numpy_array_api -#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION -#include - -#define FOREACH_MGB_LOW_BIT(cb) \ - cb(1) \ - cb(2) \ - cb(4) \ - -#define FOREACH_MGB_DTYPE_PAIR(cb) \ - cb(IntB1, npy_num_intb1()) \ - cb(IntB2, npy_num_intb2()) \ - cb(IntB4, npy_num_intb4()) \ - cb(BFloat16, npy_num_bfloat16()) - -namespace mgb { - //! numpy type num for intb2 type -#define DEFINE_NPY_INTBX(n) \ - int npy_num_intb##n(); -FOREACH_MGB_LOW_BIT(DEFINE_NPY_INTBX) -#undef DEFINE_NPY_INTBX - int npy_num_bfloat16(); -} - -// vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} diff --git a/python_module/src/cpp/opr_defs.cpp b/python_module/src/cpp/opr_defs.cpp deleted file mode 100644 index 1fd4dbbb..00000000 --- a/python_module/src/cpp/opr_defs.cpp +++ /dev/null @@ -1,313 +0,0 @@ -/** - * \file python_module/src/cpp/opr_defs.cpp - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * \copyright Copyright (c) 2014-2020 Megvii Inc. All rights reserved. - * - */ - -#include "./opr_defs.h" -#include "./opr_helper.h" -#include "./python_helper.h" - -#if MGB_ENABLE_OPR_MM -#include "megbrain/opr/mm_handler.h" -#endif - -#include "megbrain/opr/io.h" -#include "megbrain/serialization/extern_c_opr_io.h" - -using namespace mgb; -using namespace mgb::opr; - -SymbolVar _Opr::_axis_add_remove(SymbolVar src, - const std::vector& axis, bool is_add, - const OperatorNodeConfig &config) { - using ADR = mgb::opr::AxisAddRemove; - std::vector desc; - mgb_assert(!axis.empty()); - for (auto i: axis) { - if (is_add) { - desc.emplace_back(ADR::AxisDesc::make_add(i)); - } else { - desc.emplace_back(ADR::AxisDesc::make_remove(i)); - } - } - return ADR::make(src, desc, config); -} - -SymbolVarArray _Opr::param_pack_split( - SymbolVar src, const std::vector>& shapes, - const OperatorNodeConfig& config) { - auto size = shapes.size(); - mgb::TensorShapeArray shapearr(size); - for (size_t i = 0; i < size; i++) { - shapearr[i] = npy::vec2shape(shapes[i]); - } - - auto cn = src.node()->comp_node(); - auto offsets = megdnn::ParamPackConcat::gen_offsets( - shapearr, cn.get_mem_addr_alignment(), src.dtype().size()); - - return mgb::opr::ParamPackSplit::make(src, offsets, shapearr, config); -} - -#if MGB_ENABLE_OPR_MM -#include "megbrain/opr/lock.h" -#include "megbrain/opr/io_remote.h" - -SymbolVar _Opr::lock_acquire(SymbolVar var, size_t lock_id, size_t group_id, - const OperatorNodeConfig &config) { - return mgb::opr::LockAcquire::make(var, {lock_id, group_id}, config); -} - -SymbolVar _Opr::lock_release(SymbolVar var, size_t lock_id, size_t group_id, - const OperatorNodeConfig &config) { - return mgb::opr::LockRelease::make(var, {lock_id, group_id}, config); -} - -SymbolVar _Opr::remote_send( - const std::string& server_addr, const int port, - const std::string& key, SymbolVar var, - const bool is_grad, - const OperatorNodeConfig& config) { - return RemoteSend::make(key, var, - std::make_shared(ssprintf( - "%s:%d", server_addr.c_str(), port)), - is_grad, config); -} - -SymbolVar _Opr::remote_recv(const std::string& server_addr, const int port, - const std::string& key, CompGraph& graph, - const std::vector& shape, PyObject* dtype, - const OperatorNodeConfig& config) { - const TensorShape ishape = npy::vec2shape(shape); - const DType idtype = npy::dtype_np2mgb(dtype); - - return RemoteRecv::make(key, graph.get(), - std::make_shared( - ssprintf("%s:%d", server_addr.c_str(), port)), - config, ishape, idtype); -} - -SymbolVar _Opr::collective_comm_with_input( - SymbolVar inpvar, const std::string& key, const size_t nr_devices, - const bool is_root, const int rank, const bool local_grad, - const std::string& server_addr, const int port, PyObject* params, - PyObject* dtype, const std::string& backend, SharedND* output_buf, - const OperatorNodeConfig& config, const SharedScalar& disable) { - SymbolVarArray inputs(1, inpvar); - ComputingGraph* graph = inpvar.node()->owner_graph(); - auto group_mgr = std::make_shared( - ssprintf("%s:%d", server_addr.c_str(), port)); - SmallVector> dev_buffer_arr(1, nullptr); - if (output_buf) - dev_buffer_arr[0] = output_buf->dev_tensor(); - CollectiveComm::Param param = load_collective_comm_params(params, graph); - mgb::DType _dtype = DType(); - if (dtype != Py_None) { - _dtype = npy::dtype_np2mgb(dtype); - } - return CollectiveComm::make(inputs, graph, key, nr_devices, is_root, rank, - local_grad, group_mgr, dev_buffer_arr, param, - _dtype, backend, config, disable.get_val())[0]; -} - -SymbolVar _Opr::collective_comm_without_input( - CompGraph& cg, const std::string& key, const size_t nr_devices, - const bool is_root, const int rank, const bool local_grad, - const std::string& server_addr, const int port, PyObject* params, - PyObject* dtype, const std::string& backend, SharedND* output_buf, - const OperatorNodeConfig& config, const SharedScalar& disable) { - SymbolVarArray inputs; - auto& graph = cg.get(); - auto group_mgr = std::make_shared( - ssprintf("%s:%d", server_addr.c_str(), port)); - SmallVector> dev_buffer_arr(1, nullptr); - if (output_buf) - dev_buffer_arr[0] = output_buf->dev_tensor(); - CollectiveComm::Param param = load_collective_comm_params(params, &graph); - mgb::DType _dtype = DType(); - if (dtype != Py_None) { - _dtype = npy::dtype_np2mgb(dtype); - } - return CollectiveComm::make(inputs, &graph, key, nr_devices, is_root, rank, - local_grad, group_mgr, dev_buffer_arr, param, - _dtype, backend, config, disable.get_val())[0]; -} - -#else -namespace { - [[noreturn]] void on_opr_mm() { - mgb_throw(MegBrainError, "opr-mm disabled at compile time"); - } -} -SymbolVar _Opr::lock_acquire(SymbolVar var, size_t lock_id, size_t group_id, - const OperatorNodeConfig &config) { - on_opr_mm(); -} - -SymbolVar _Opr::lock_release(SymbolVar var, size_t lock_id, size_t group_id, - const OperatorNodeConfig &config) { - on_opr_mm(); -} - - -SymbolVar _Opr::remote_send( - const std::string& server_addr, const int port, - const std::string& key, SymbolVar var, - const bool is_grad, - const OperatorNodeConfig& config) { - on_opr_mm(); -} - -SymbolVar _Opr::remote_recv(const std::string& server_addr, const int port, - const std::string& key, CompGraph& graph, - const std::vector& shape, PyObject* dtype, - const OperatorNodeConfig& config) { - on_opr_mm(); -} - -SymbolVar _Opr::collective_comm_with_input( - SymbolVar inpvar, const std::string& key, const size_t nr_devices, - const bool is_root, const int rank, const bool local_grad, - const std::string& server_addr, const int port, PyObject* params, - PyObject* dtype, const std::string& backend, SharedND* output_buf, - const OperatorNodeConfig& config, const SharedScalar& disable) { - on_opr_mm(); -} - -SymbolVar _Opr::collective_comm_without_input( - CompGraph& cg, const std::string& key, const size_t nr_devices, - const bool is_root, const int rank, const bool local_grad, - const std::string& server_addr, const int port, PyObject* params, - PyObject* dtype, const std::string& backend, SharedND* output_buf, - const OperatorNodeConfig& config, const SharedScalar& disable) { - on_opr_mm(); -} - -#endif // MGB_ENABLE_OPR_MM - -SymbolVarArray _Opr::extern_c_opr_placeholder( - const SymbolVarArray& inputs, - const std::vector>& output_shapes, - PyObject* output_dtypes, const char* dump_name, PyObject* data_bytes, - const OperatorNodeConfig& config) { - mgb_assert(PyBytes_Check(data_bytes)); - if (output_dtypes != Py_None) { - mgb_assert(PyTuple_Check(output_dtypes)); - mgb_assert(output_shapes.size() == - static_cast(PyTuple_Size(output_dtypes))); - } - - TensorShapeArray cpp_output_shapes(output_shapes.size()); - for (size_t i = 0; i < output_shapes.size(); ++i) { - cpp_output_shapes[i] = npy::vec2shape(output_shapes[i]); - } - SmallVector cpp_output_dtypes; - if (output_dtypes != Py_None) { - size_t dtype_size = PyTuple_Size(output_dtypes); - for (size_t i = 0; i < dtype_size; ++i) { - cpp_output_dtypes.push_back( - npy::dtype_np2mgb(PyTuple_GetItem(output_dtypes, i))); - } - } - - auto opr = opr::ExternCOprRunner::make_placeholder( - inputs, cpp_output_shapes, dump_name, PyBytes_AsString(data_bytes), - PyBytes_Size(data_bytes), config, cpp_output_dtypes); - SymbolVarArray ret; - ret.reserve(opr->output().size()); - for (auto i: opr->output()) - ret.emplace_back(i); - return ret; -} - -#if MGB_ENABLE_TENSOR_RT - -#include "megbrain/tensorrt/tensorrt_runtime_opr.h" - -SymbolVarArray _Opr::tensor_rt_runtime(const SymbolVarArray& inputs, - PyObject* data_bytes, - const OperatorNodeConfig& config) { - mgb_assert(PyBytes_Check(data_bytes)); - auto size = PyBytes_Size(data_bytes); - mgb_assert(size, "trt data bytes should not be empty"); - return opr::TensorRTRuntimeOpr::make(PyBytes_AsString(data_bytes), - size, inputs, - config); -} -#else -SymbolVarArray _Opr::tensor_rt_runtime(const SymbolVarArray& inputs, - PyObject* data_bytes, - const OperatorNodeConfig& config) { - mgb_throw(MegBrainError, "TensorRT disabled at compile time"); -} -#endif - -#if MGB_ATLAS - -#include "megbrain/opr/atlas_runtime_op.h" - -SymbolVarArray _Opr::atlas_runtime(const SymbolVarArray& inputs, - PyObject* data_bytes, - const OperatorNodeConfig& config) { - mgb_assert(PyBytes_Check(data_bytes)); - auto size = PyBytes_Size(data_bytes); - mgb_assert(size, "atlas data bytes should not be empty"); - - return opr::AtlasRuntimeOpr::make(PyBytes_AsString(data_bytes), size, - inputs, config); -} -#else -SymbolVarArray _Opr::atlas_runtime(const SymbolVarArray& inputs, - PyObject* data_bytes, - const OperatorNodeConfig& config) { - mgb_throw(MegBrainError, "Atlas disabled at compile time"); -} -#endif - -SymbolVar _Opr::timestamp(SymbolVar input, PyObject* dest, size_t dest_off, - const OperatorNodeConfig& config) { - auto tensor = std::make_shared( - npy::np2tensor(dest, npy::Meth::must_borrow(), dtype::Float32{})); - return opr::Timestamp::make(input, std::move(tensor), dest_off, config); -} - -SymbolVar _Opr::virtual_loss(const SymbolVarArray& ys, - const SymbolVarArray& y_grads, - const OperatorNodeConfig& config) { - return opr::VirtualLoss::make(ys, y_grads, {}, config); -} - -SymbolVar _Opr::virtual_dep(const SymbolVarArray& symvars, - const OperatorNodeConfig& config) { - return opr::VirtualDep::make(symvars, config); -} - - -#if MGB_CAMBRICON -#include "megbrain/cambricon/cambricon_runtime_opr.h" - -SymbolVarArray _Opr::cambricon_runtime(PyObject* data_bytes, const char* symbol, - const SymbolVarArray& inputs, - bool tensor_dim_mutable, - const OperatorNodeConfig& config) { - mgb_assert(PyBytes_Check(data_bytes)); - auto size = PyBytes_Size(data_bytes); - mgb_assert(size, "cambricon data bytes should not be empty"); - return opr::CambriconRuntimeOpr::make(PyBytes_AsString(data_bytes), size, - symbol, inputs, tensor_dim_mutable, - config); -} -#else -SymbolVarArray _Opr::cambricon_runtime(PyObject* data_bytes, const char* symbol, - const SymbolVarArray& inputs, - bool tensor_dim_mutable, - const OperatorNodeConfig& config) { - mgb_throw(MegBrainError, "Cambricon disabled at compile time"); -} -#endif - -// vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} diff --git a/python_module/src/cpp/opr_defs.h b/python_module/src/cpp/opr_defs.h deleted file mode 100644 index 29a70c5f..00000000 --- a/python_module/src/cpp/opr_defs.h +++ /dev/null @@ -1,170 +0,0 @@ -/** - * \file python_module/src/cpp/opr_defs.h - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * \brief extra opr definitions - * - * \copyright Copyright (c) 2014-2020 Megvii Inc. All rights reserved. - * - */ - -#ifndef SWIG -#pragma once - -#include "./megbrain_wrap.h" -#include "./opr_helper.h" - -#if MGB_ENABLE_OPR_MM -#include "megbrain/opr/collective_comm.h" -#endif -#include "megbrain/opr/basic_arith.h" -#include "megbrain/opr/tensor_manip.h" -using mgb::SymbolVar; -using mgb::SymbolVarArray; -using mgb::OperatorNodeConfig; - -#endif - -class _Opr { - -public: - -// basic arith - -static SymbolVar add_update(SymbolVar dest, SymbolVar delta, - const SharedScalar &alpha, const SharedScalar &beta, - const SharedScalar &bias, const SharedScalar &disable, - const OperatorNodeConfig &config) { - return mgb::opr::AddUpdate::make(dest, delta, - {alpha.get_val(), beta.get_val(), bias.get_val(), disable.get_val()}, - config); -} - -// tensor manip - -static SymbolVarArray param_pack_split( - SymbolVar src, const std::vector>& shapes, - const OperatorNodeConfig& config); - -static SymbolVar dimshuffle(SymbolVar src, - const std::vector &pattern, size_t ndim, - const OperatorNodeConfig &config) { - return mgb::opr::Dimshuffle::make(src, pattern, ndim, config); -} - -static SymbolVar _axis_add_remove(SymbolVar src, - const std::vector& axis, bool is_add, - const OperatorNodeConfig &config); - -static SymbolVar callback_injector(SymbolVar src, _CompGraphCallback &callback, - const OperatorNodeConfig &config) { - return mgb::opr::CallbackInjector::make(src, callback.make_callback()); -} - -static SymbolVar callback_injector(SymbolVarArray src, _CompGraphCallback &callback, - const OperatorNodeConfig &config) { - return mgb::opr::CallbackInjector::make(src, callback.make_multi_input_callback()); -} - -static SymbolVar set_grad(SymbolVar src, _SetGradCallback &grad_getter, - const OperatorNodeConfig &config) { - return mgb::opr::SetGrad::make(src, grad_getter.make_callback(), config); -} - -// multi machine - -static SymbolVar lock_acquire(SymbolVar var, size_t lock_id, size_t group_id, - const OperatorNodeConfig &config); - -static SymbolVar lock_release(SymbolVar var, size_t lock_id, size_t group_id, - const OperatorNodeConfig &config); - -static SymbolVar remote_send( - const std::string& server_addr, const int port, - const std::string& key, SymbolVar var, - const bool is_grad, - const OperatorNodeConfig& config); - -static SymbolVar remote_recv(const std::string& server_addr, const int port, - const std::string& key, - CompGraph& graph, - const std::vector& shape, PyObject* dtype, - const OperatorNodeConfig& config); - -static SymbolVar collective_comm_with_input( - SymbolVar inpvar, const std::string& key, const size_t nr_devices, - const bool is_root, const int rank, const bool local_grad, - const std::string& server_addr, const int port, PyObject* params, - PyObject* dtype, const std::string& backend, SharedND* output_buf, - const OperatorNodeConfig& config, const SharedScalar& disable); - -static SymbolVar collective_comm_without_input( - CompGraph& graph, const std::string& key, const size_t nr_devices, - const bool is_root, const int rank, const bool local_grad, - const std::string& server_addr, const int port, PyObject* params, - PyObject* dtype, const std::string& backend, SharedND* output_buf, - const OperatorNodeConfig& config, const SharedScalar& disable); - -// misc -static SymbolVarArray extern_c_opr_placeholder( - const SymbolVarArray& inputs, - const std::vector>& output_shapes, - PyObject* dtypes, - const char* dump_name, PyObject* data_bytes, - const OperatorNodeConfig& config); - -static SymbolVarArray tensor_rt_runtime(const SymbolVarArray& inputs, - PyObject* data_bytes, - const OperatorNodeConfig& config); - - - -static SymbolVar timestamp(SymbolVar input, PyObject* dest, size_t dest_off, - const OperatorNodeConfig& config); - -static SymbolVar virtual_loss(const SymbolVarArray& ys, - const SymbolVarArray& y_grads, - const OperatorNodeConfig& config); - -static SymbolVar virtual_dep(const SymbolVarArray& symvars, - const OperatorNodeConfig& config); - -static SymbolVarArray atlas_runtime(const SymbolVarArray& inputs, - PyObject* data_bytes, - const OperatorNodeConfig& config); - - -static SymbolVarArray cambricon_runtime(PyObject* data_bytes, - const char* symbol, - const SymbolVarArray& inputs, - bool tensor_dim_mutable, - const OperatorNodeConfig& config); - -#ifdef SWIG -%pythoncode { - -@classmethod -def _make_axis_vec(cls, axis): - ret = _VectorInt() - if isinstance(axis, collections.Iterable): - for i in axis: - ret.push_back(i) - else: - ret.push_back(axis) - return ret - -@classmethod -def add_axis(cls, src, axis, config): - return cls._axis_add_remove(src, cls._make_axis_vec(axis), True, config) - -@classmethod -def remove_axis(cls, src, axis, config): - return cls._axis_add_remove(src, cls._make_axis_vec(axis), False, config) - -} // %pythoncode -#endif // SWIG - -}; - -// vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} diff --git a/python_module/src/cpp/opr_helper.cpp b/python_module/src/cpp/opr_helper.cpp deleted file mode 100644 index 0baa47c2..00000000 --- a/python_module/src/cpp/opr_helper.cpp +++ /dev/null @@ -1,192 +0,0 @@ -/** - * \file python_module/src/cpp/opr_helper.cpp - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * \copyright Copyright (c) 2014-2020 Megvii Inc. All rights reserved. - * - */ - -#include "./opr_helper.h" -#include "./megbrain_wrap.h" -#include "megbrain/opr/indexing.h" -#include "megbrain/opr/io.h" -#include "megbrain/serialization/opr_load_dump.h" - -using namespace mgb; - -namespace { - class OprParamsLoadContext final: public serialization::OprLoadContextRawPOD { - PyObject *m_params; - ComputingGraph *m_graph; - size_t m_nr_used_params = 0, m_param_size = 0; - size_t m_item_bytes_consumed = 0; - - void read_raw(void *dest, size_t size) override final { - mgb_assert(m_nr_used_params < m_param_size); - auto item = PyList_GetItem(m_params, m_nr_used_params); - mgb_assert(item, "failed to get item %zu", m_nr_used_params); - mgb_assert(PyBytes_Check(item), "list item must be bytes"); - auto item_size = PyBytes_Size(item); - mgb_assert(size < (SIZE_MAX >> 3)); - mgb_assert(m_item_bytes_consumed + size <= size_t(item_size)); - auto item_buf = PyBytes_AsString(item); - mgb_assert(item_size > 0 && item_buf); - memcpy(dest, item_buf + m_item_bytes_consumed, size); - m_item_bytes_consumed += size; - if (m_item_bytes_consumed == size_t(item_size)) { - ++ m_nr_used_params; - m_item_bytes_consumed = 0; - } - } - - std::shared_ptr load_tensor() override { - mgb_assert(0); - } - - std::shared_ptr load_tensor_shared() override { - mgb_assert(0); - } - - const serialization::GraphLoadConfig& config() const override { - mgb_assert(0); - } - - public: - OprParamsLoadContext(PyObject *params, ComputingGraph *graph): - m_params{params}, m_graph{graph} - { - mgb_assert(PyList_Check(params), "params must be a list"); - m_param_size = PyList_Size(params); - } - - ~OprParamsLoadContext() { - mgb_assert(m_nr_used_params == m_param_size, - "number of params mismatch"); - } - - ComputingGraph& graph() override { - return *m_graph; - } - }; -} // anonymous namespace - -_SplitPartCallback::callback_t _SplitPartCallback::make_callback() { - mgb_assert(!m_cb_created); - m_cb_created = true; - - std::shared_ptr<_SplitPartCallback> cb_ptr(this); - - auto cb = [cb_ptr](size_t sz) { - return cb_ptr->call(sz); - }; - - return cb; -} - -_SetGradCallback::callback_t _SetGradCallback::make_callback() { - mgb_assert(!m_cb_created); - m_cb_created = true; - - if (empty()) { - return {}; - } - - std::shared_ptr<_SetGradCallback> cb_ptr(this); - - auto cb = [cb_ptr](const opr::SetGrad& opr) { - auto graph = CompGraph::make_from_weak_ptr( - opr.owner_graph()->shared_from_this()); - return cb_ptr->call(graph); - }; - - return cb; -} - -_TimeoutCallback::callback_t _TimeoutCallback::make_callback() { - mgb_assert(!m_cb_created); - m_cb_created = true; - - std::shared_ptr<_TimeoutCallback> cb_ptr(this); - auto cb = [cb_ptr]() { - return cb_ptr->call(); - }; - return cb; -} - -mgb::SymbolVar _create_subtensor_like_opr( - const std::string &name, - const SymbolVarArray& inputs, - const std::vector &idx, - const mgb::OperatorNodeConfig &config) { -#define CHK1(_name, _opr) \ - if (name == _name) { \ - mgb_assert(inputs.size() == 1); \ - return opr::_opr::make(inputs[0], idx, config); \ - } -#define CHK2(_name, _opr) \ - if (name == _name) { \ - mgb_assert(inputs.size() == 2); \ - return opr::_opr::make(inputs[0], inputs[1], idx, config); \ - } - - CHK1("subtensor", Subtensor); - CHK2("set_subtensor", SetSubtensor); - CHK2("incr_subtensor", IncrSubtensor); - CHK1("mavi", IndexingMultiAxisVec); - CHK2("set_mavi", IndexingSetMultiAxisVec); - CHK2("incr_mavi", IndexingIncrMultiAxisVec); - CHK1("mesh_indexing", MeshIndexing); - CHK1("batched_mesh_indexing", BatchedMeshIndexing); - CHK2("incr_mesh_indexing", IncrMeshIndexing); - CHK2("set_mesh_indexing", SetMeshIndexing); - CHK2("batched_incr_mesh_indexing", BatchedIncrMeshIndexing); - CHK2("batched_set_mesh_indexing", BatchedSetMeshIndexing); - - mgb_throw(MegBrainError, "bad subtensor opr name: %s", name.c_str()); - -#undef CHK1 -#undef CHK2 -} - -SymbolVar _make_immutable(CompGraph &comp_graph, PyObject *npyarr, - PyObject *dtype, const mgb::cg::OperatorNodeConfig &config) { - - auto cn = config.get_single_comp_node(); - mgb_assert(cn.valid(), "invalid comp node given to make_tensor"); - DType dtype_mgb; - if (dtype && dtype != Py_None) - dtype_mgb = npy::dtype_np2mgb(dtype); - auto hv = npy::np2tensor(npyarr, npy::Meth::borrow(cn), dtype_mgb); - return opr::ImmutableTensor::make(comp_graph.get(), hv, config); -} - -SymbolVarArray _create_opr( - const char *name, const SymbolVarArray &inputs, - PyObject *params, const OperatorNodeConfig &config) { - mgb_assert(!inputs.empty()); - auto registry = serialization::OprRegistry::find_by_name(name); - mgb_assert(registry, "operator %s not found", name); - OprParamsLoadContext ctx{params, inputs[0].node()->owner_graph()}; - VarNodeArray vinputs(inputs.size()); - for (size_t i = 0; i < inputs.size(); ++ i) - vinputs[i] = inputs[i].node(); - auto opr = registry->loader(ctx, vinputs, config); - - SymbolVarArray ret; - for (auto i: opr->output()) { - if (!i->contain_flag(VarNode::Flag::VOLATILE_CONTENT)) - ret.push_back(i); - } - return ret; -} - -#if MGB_ENABLE_OPR_MM -mgb::opr::CollectiveComm::Param load_collective_comm_params( - PyObject* params, mgb::ComputingGraph* graph) { - OprParamsLoadContext ctx{params, graph}; - return ctx.read_param(); -} -#endif - -// vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} diff --git a/python_module/src/cpp/opr_helper.h b/python_module/src/cpp/opr_helper.h deleted file mode 100644 index 15b49d5a..00000000 --- a/python_module/src/cpp/opr_helper.h +++ /dev/null @@ -1,71 +0,0 @@ -/** - * \file python_module/src/cpp/opr_helper.h - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * \brief helper for wrapping special oprs - * - * \copyright Copyright (c) 2014-2020 Megvii Inc. All rights reserved. - * - */ - -#pragma once - -#include "./megbrain_wrap.h" - -#include "megbrain/opr/tensor_manip.h" -#include "megbrain/opr/utility.h" -#if MGB_ENABLE_OPR_MM -#include "megbrain/opr/collective_comm.h" -#endif -using AxisIndexer = mgb::opr::indexing::AxisIndexer; - -/*! - * \brief wrapping callbacks used for opr::Split::Options::make_callback - */ -class _SplitPartCallback { - bool m_cb_created = false; - - public: - virtual ~_SplitPartCallback() = default; - virtual std::vector call(size_t tot_size) = 0; - - using callback_t = mgb::opr::Split::Options::callback_t; - callback_t make_callback(); -}; - -class _SetGradCallback { - bool m_cb_created = false; - - public: - virtual ~_SetGradCallback() = default; - virtual mgb::SymbolVar call(CompGraph &graph) = 0; - virtual bool empty() = 0; - - using callback_t = mgb::opr::SetGrad::GradGetter; - callback_t make_callback(); -}; - -/*! - * \brief wrapping callbacks used for subclasses of opr::RemoteIOBase - */ -class _TimeoutCallback { - bool m_cb_created = false; - - public: - virtual ~_TimeoutCallback() = default; - /*! - * \brief Will be overrided by swig generated code, calls into Python. - */ - virtual bool call() = 0; - - using callback_t = mgb::thin_function; - callback_t make_callback(); -}; - -#if MGB_ENABLE_OPR_MM -mgb::opr::CollectiveComm::Param load_collective_comm_params( - PyObject* params, mgb::ComputingGraph* graph); -#endif - -// vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} diff --git a/python_module/src/cpp/plugin.cpp b/python_module/src/cpp/plugin.cpp deleted file mode 100644 index 5ca4df44..00000000 --- a/python_module/src/cpp/plugin.cpp +++ /dev/null @@ -1,243 +0,0 @@ -/** - * \file python_module/src/cpp/plugin.cpp - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * \brief helpers for debugging - * - * \copyright Copyright (c) 2014-2020 Megvii Inc. All rights reserved. - * - */ - -#include "./plugin.h" -#include "./python_helper.h" - -#include "megbrain/system.h" - -#include -#include -#include - -#ifdef WIN32 -#include -#else -#include -#include -#endif -#include - -/* ================= _InfkernFinderImpl ================= */ -size_t _InfkernFinderImpl::sm_id = 0; - -_InfkernFinderImpl::_InfkernFinderImpl(CompGraph &cg, bool record_input_value): - m_id{sm_id ++}, - m_comp_graph{cg.get().shared_from_this()}, - m_finder{m_comp_graph.get(), record_input_value} -{ -} - -size_t _InfkernFinderImpl::_write_to_file(const char *fpath) { - auto opr = m_finder.write_to_file(fpath); - if (opr) - return opr->id() + 1; - return 0; -} - -size_t _InfkernFinderImpl::_get_input_values_prepare(size_t opr_id) { - m_inp_val = m_finder.get_input_values(opr_id); - return m_inp_val.size(); -} - -const char* _InfkernFinderImpl::_get_input_values_var_name(size_t idx) { - return m_inp_val.at(idx).first->cname(); -} - -size_t _InfkernFinderImpl::_get_input_values_var_idx(size_t idx) { - return m_inp_val.at(idx).first->id(); -} - -size_t _InfkernFinderImpl::_get_input_values_run_id(size_t idx) { - return m_inp_val.at(idx).second.run_id; -} - -CompGraphCallbackValueProxy _InfkernFinderImpl::_get_input_values_val(size_t idx) { - return CompGraphCallbackValueProxy::make_raw_host_value_proxy( - m_inp_val.at(idx).second.val); -} - -std::string _InfkernFinderImpl::__repr__() { - return mgb::ssprintf( - "_InfkernFinderImpl(%zu,graph=%p)", m_id, m_comp_graph.get()); -} - -/* ================= _FastSignal ================= */ - -class _FastSignal::Impl { - using HandlerCallback = std::function; - bool m_worker_started = false; - std::mutex m_mtx; - std::thread m_worker_hdl; -#ifdef WIN32 - SECURITY_ATTRIBUTES win_sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE}; - HANDLE pipe_r, pipe_w; - DWORD bytes_r_w; -#else - int m_pfd[2]; //! pipe fds; write signal handlers, -1 for exit -#endif - std::unordered_map m_handler_callbacks; - - void worker() { - std::ostringstream oss; - oss << std::this_thread::get_id() << std::endl; - mgb_log("fast signal worker started in thread %s", oss.str().c_str()); - mgb::sys::set_thread_name("fastsgl"); - int signum; - for (;;) { -#ifdef WIN32 - if (ReadFile(pipe_r, &signum, sizeof(int), &bytes_r_w, NULL) == - NULL) { -#else - if (read(m_pfd[0], &signum, sizeof(int)) != sizeof(int)) { -#endif - if (errno == EINTR) - continue; - mgb_log_error("fast signal worker: " - "failed to read from self pipe: %s", - strerror(errno)); - return; - } - std::exception_ptr exc_ptr; - if (signum == -1) - return; - try { - HandlerCallback *cb; - { - MGB_LOCK_GUARD(m_mtx); - cb = &m_handler_callbacks.at(signum); - } - (*cb)(); - } MGB_CATCH_ALL_EXCEPTION("fast signal worker", exc_ptr); - } - } - - void setup() { - if (m_worker_started) - return; - -#ifdef WIN32 - if (!CreatePipe(&pipe_r, &pipe_w, &win_sa, 0)) { - throw mgb::MegBrainError(mgb::ssprintf("failed to create pipe: %s", - strerror(errno))); - } -#else - if (pipe(m_pfd)) { - throw mgb::MegBrainError(mgb::ssprintf("failed to create pipe: %s", - strerror(errno))); - } -#endif - std::thread t(std::bind(&Impl::worker, this)); - m_worker_hdl.swap(t); - m_worker_started = true; - } - - void write_pipe(int v) { - mgb_assert(m_worker_started); -#ifdef WIN32 - if (WriteFile(pipe_w, &v, sizeof(int), &bytes_r_w, NULL) == NULL) { -#else - if (write(m_pfd[1], &v, sizeof(int)) != sizeof(int)) { -#endif - mgb_log_error("fast signal: failed to write to self pipe: %s", - strerror(errno)); - } - } - - public: - bool worker_started() const { - return m_worker_started; - } - - void register_handler(int signum, PyObject *func) { - setup(); - - { - PYTHON_GIL; - mgb_assert(PyCallable_Check(func)); - Py_INCREF(func); - } - auto deleter = [](PyObject *f){ - PYTHON_GIL; - Py_DECREF(f); - }; - std::shared_ptr funcptr(func, deleter); - - auto callback = [funcptr]() { - PYTHON_GIL; - auto func = funcptr.get(); - auto ret = PyObject_CallObject(func, nullptr); - mgb_assert(ret, "failed to call pyobj %p; repr=%s", - func, PyUnicode_AsUTF8(PyObject_Repr(func))); - Py_DECREF(ret); - }; - - MGB_LOCK_GUARD(m_mtx); - m_handler_callbacks[signum] = callback; - } - - void shutdown() { - MGB_LOCK_GUARD(m_mtx); - if (!m_worker_started) - return; - write_pipe(-1); - m_worker_hdl.join(); -#ifdef WIN32 - CloseHandle(pipe_r); - CloseHandle(pipe_w); -#else - close(m_pfd[0]); - close(m_pfd[1]); -#endif - m_handler_callbacks.clear(); - m_worker_started = false; - } - - void signal_hander(int signum) { - write_pipe(signum); - } - - ~Impl() { - shutdown(); - } -}; - -_FastSignal::Impl _FastSignal::sm_impl; - -void _FastSignal::signal_hander(int signum) { - if (sm_impl.worker_started()) - sm_impl.signal_hander(signum); -} - -void _FastSignal::register_handler(int signum, PyObject *func) { -#ifdef WIN32 - //! up to now we can only use CTRL_C_EVENT to unix signal.SIGUSR1/2 - //FIXME: how to coherence signal number at python side - // https://docs.microsoft.com/en-gb/cpp/c-runtime-library/reference/signal?view=vs-2017 - mgb_assert(signum == CTRL_C_EVENT, "only allow register CTRL_C_EVENT as unix signal.SIGUSR1/2 now"); - signal(signum, signal_hander); -#else - struct sigaction action; - memset(&action, 0, sizeof(action)); - action.sa_handler = &signal_hander; - int ret = sigaction(signum, &action, nullptr); - mgb_assert(!ret, "sigaction failed: %s", strerror(errno)); -#endif - - sm_impl.register_handler(signum, func); -} - -void _FastSignal::shutdown() { - sm_impl.shutdown(); -} - -// vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} - diff --git a/python_module/src/cpp/plugin.h b/python_module/src/cpp/plugin.h deleted file mode 100644 index 5253a0bb..00000000 --- a/python_module/src/cpp/plugin.h +++ /dev/null @@ -1,135 +0,0 @@ -/** - * \file python_module/src/cpp/plugin.h - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * \brief helpers for debugging - * - * \copyright Copyright (c) 2014-2020 Megvii Inc. All rights reserved. - * - */ - - -#ifndef SWIG - -#pragma once - -#include "./megbrain_wrap.h" - -#include "megbrain/plugin/profiler.h" -#include "megbrain/plugin/infkern_finder.h" -#include "megbrain/plugin/num_range_checker.h" -#include "megbrain/plugin/opr_io_dump.h" - -#endif // SWIG - -#include - -class _CompGraphProfilerImpl { -#ifndef SWIG - std::shared_ptr m_comp_graph; - mgb::GraphProfiler m_profiler; -#endif - - public: - _CompGraphProfilerImpl(CompGraph &cg): - m_comp_graph{cg.get().shared_from_this()}, - m_profiler{m_comp_graph.get()} - { - } - - std::string _get_result() { - auto json = m_profiler.to_json_full( - m_comp_graph->current_comp_seq()); - return json->to_string(); - } -}; - -class _NumRangeCheckerImpl { -#ifndef SWIG - std::shared_ptr m_comp_graph; - mgb::NumRangeChecker m_checker; -#endif - - public: - _NumRangeCheckerImpl(CompGraph &cg, float range): - m_comp_graph{cg.get().shared_from_this()}, - m_checker{m_comp_graph.get(), range} - { - } -}; - -class _TextOprIODumpImpl { -#ifndef SWIG - std::shared_ptr m_comp_graph; - mgb::TextOprIODump m_dump; -#endif - - public: - _TextOprIODumpImpl(CompGraph &cg, const char *fpath): - m_comp_graph{cg.get().shared_from_this()}, - m_dump{m_comp_graph.get(), fpath} - { - } - - void _print_addr(bool flag) { - m_dump.print_addr(flag); - } - - void _max_size(size_t size) { - m_dump.max_size(size); - } -}; - -class _BinaryOprIODumpImpl { -#ifndef SWIG - std::shared_ptr m_comp_graph; - mgb::BinaryOprIODump m_dump; -#endif - - public: - _BinaryOprIODumpImpl(CompGraph &cg, const char *fpath): - m_comp_graph{cg.get().shared_from_this()}, - m_dump{m_comp_graph.get(), fpath} - { - } -}; - -class _InfkernFinderImpl { -#ifndef SWIG - static size_t sm_id; - const size_t m_id; - std::shared_ptr m_comp_graph; - mgb::InfkernFinder m_finder; - mgb::InfkernFinder::InputValueRecord::FullRecord m_inp_val; -#endif - - public: - _InfkernFinderImpl(CompGraph &cg, bool record_input_value); - - size_t _write_to_file(const char *fpath); - - size_t _get_input_values_prepare(size_t opr_id); - const char* _get_input_values_var_name(size_t idx); - size_t _get_input_values_var_idx(size_t idx); - size_t _get_input_values_run_id(size_t idx); - CompGraphCallbackValueProxy _get_input_values_val(size_t idx); - - std::string __repr__(); - -}; - -class _FastSignal { -#ifndef SWIG - class Impl; - static Impl sm_impl; - - static void signal_hander(int signum); -#endif - public: - static void register_handler(int signum, PyObject *func); - static void shutdown(); -}; - -// vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} - diff --git a/python_module/src/cpp/python_helper.cpp b/python_module/src/cpp/python_helper.cpp deleted file mode 100644 index 1cc97d7a..00000000 --- a/python_module/src/cpp/python_helper.cpp +++ /dev/null @@ -1,911 +0,0 @@ -/** - * \file python_module/src/cpp/python_helper.cpp - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * \brief helper utilities for python integration - * - * \copyright Copyright (c) 2014-2020 Megvii Inc. All rights reserved. - * - */ - -#include "./python_helper.h" -#include "megbrain/graph/exc_extra_info.h" -#include "megbrain/graph/event.h" -#include "megbrain/graph/cg.h" -#include "megbrain/utils/mempool.h" - -#include "./numpy_incl.h" - -/* - * demangle typeid, see - * http://stackoverflow.com/questions/281818/unmangling-the-result-of-stdtype-infoname - */ -#ifdef __GNUG__ -#include -#include -#include - -namespace { - -std::string demangle_typeid(const char* name) { - - int status = -4; // some arbitrary value to eliminate the compiler warning - - // enable c++11 by passing the flag -std=c++11 to g++ - std::unique_ptr res { - abi::__cxa_demangle(name, nullptr, nullptr, &status), - std::free - }; - - return (status==0) ? res.get() : name ; -} -} -#else - -namespace { -// does nothing if not g++ -std::string demangle_typeid(const char* name) { - return name; -} -} - -#endif - -using namespace mgb; -using namespace cg; - -PyStackExtracter* PyStackExtracter::ins = nullptr; - -namespace { - - std::string repr_pyobj(PyObject *obj) { - if (!obj) - return ""; - PYTHON_GIL; - auto str = PyObject_Repr(obj); - if (!str) - return ssprintf("", obj); - std::string ret{PyUnicode_AsUTF8(str)}; - Py_DECREF(str); - return ret; - } - - template - std::string typeid_name(const T &t) { - return demangle_typeid(typeid(t).name()); - } - -} // anonymous namespace - -/* ============== OprPyTracker ============== */ - -class OprPyTracker::TrackerStorage final : public UserDataContainer::UserData, - public NonCopyableObj { - MGB_TYPEINFO_OBJ_DECL; - - PyObject* m_cur_tracker = nullptr; - size_t m_refcnt_to_add = 0; - SyncEventConnecter::ReceiverHandler m_opr_insert_handler; - ThinHashMap m_opr2tracker; - -public: - explicit TrackerStorage(ComputingGraph& graph) { - auto on_new_opr = [this](const event::OprInserted& ev) { - if (!ev.is_dedup && !ev.exc) { - if (m_cur_tracker) { - ++m_refcnt_to_add; - m_opr2tracker[ev.opr] = m_cur_tracker; - } - } - }; - m_opr_insert_handler = - graph.event().register_receiver(on_new_opr); - } - - ~TrackerStorage() { - if (m_cur_tracker) { - // manage refcnt of cur tracker - disable(); - } - PYTHON_GIL; - for (auto&& i : m_opr2tracker) { - Py_DecRef(i.second); - } - } - - //! get the instance - static TrackerStorage& inst(ComputingGraph& graph) { - auto make = [&graph]() { - return std::make_shared(graph); - }; - return *graph.options() - .user_data.get_user_data_or_create( - make); - } - - //! get the tracker associated with an opr, or nullptr - PyObject* get(OperatorNodeBase* opr) const { - auto iter = m_opr2tracker.find(opr); - return iter == m_opr2tracker.end() ? nullptr : iter->second; - } - - void enable(PyObject* obj) { - mgb_assert(!m_cur_tracker, - "multiple calls to begin_set_tracker() on the same graph"); - m_cur_tracker = obj; - } - - void disable() { - mgb_assert(m_cur_tracker, - "call end_set_tracker() before begin_set_tracker()"); - if (m_refcnt_to_add) { - PYTHON_GIL; - for (size_t i = 0; i < m_refcnt_to_add; ++i) { - Py_IncRef(m_cur_tracker); - } - } - m_cur_tracker = nullptr; - } -}; -MGB_TYPEINFO_OBJ_IMPL(OprPyTracker::TrackerStorage); - -void OprPyTracker::begin_set_tracker(ComputingGraph& graph, PyObject* obj) { - TrackerStorage::inst(graph).enable(obj); -} - -void OprPyTracker::end_set_tracker(ComputingGraph& graph) { - TrackerStorage::inst(graph).disable(); -} - -OprPyTracker::TrackerResult OprPyTracker::get_tracker(mgb::MegBrainError& exc) { - auto ptr = dynamic_cast(exc.extra_info()); - if (!ptr) - return {}; - return get_tracker(ptr->opr()); -} - -OprPyTracker::TrackerResult OprPyTracker::get_tracker( - mgb::cg::OperatorNodeBase* opr) { - TrackerResult ret; - mgb_assert(opr); - ret.exc_opr = opr; - opr = cg::get_opr_root_source_opr(opr); - ret.unopt_opr = opr; - - auto&& storage = TrackerStorage::inst(*opr->owner_graph()); - ret.tracker = storage.get(opr); - - { - auto&& grad_info = opr->node_prop().attribute().grad_tracker; - if (grad_info.valid()) { - ret.opr_grad_src = cg::get_opr_root_source_opr(grad_info->orig_opr); - ret.tracker_grad_src = storage.get(ret.opr_grad_src); - } - } - - return ret; -} - -PyObject* OprPyTracker::TrackerResult::as_tuple(const char *leading_msg) const { - std::string msg; - if (leading_msg) - msg = leading_msg; - - auto print_opr = [&](const char *otype, cg::OperatorNodeBase *opr) { - if (!opr) - return; - - msg += ssprintf("\n%s: id=%zu name=%s type=%s\n", - otype, opr->id(), opr->cname(), - typeid_name(*opr).c_str()); - msg += " input variables: \n"; - size_t idx = 0; - for (auto i: opr->input()) { - msg += ssprintf(" %zu: ", idx ++); - msg += cg::dump_var_info({i}); - msg += "\n"; - } - - msg += " output variables: \n"; - idx = 0; - for (auto i: opr->output()) { - msg += ssprintf(" %zu: ", idx ++); - msg += cg::dump_var_info({i}); - msg += "\n"; - } - }; - - print_opr("Associated operator", exc_opr); - if (unopt_opr != exc_opr) { - print_opr("Unoptimized equivalent of associated operator", unopt_opr); - } - print_opr("Associated operator created by taking grad of", opr_grad_src); - - PYTHON_GIL; - PyObject *py_msg = PyUnicode_FromString(msg.c_str()), - *py_tuple = PyTuple_Pack(3, py_msg, - tracker ? tracker : Py_None, - tracker_grad_src ? tracker_grad_src : Py_None); - Py_DECREF(py_msg); - return py_tuple; -} - -std::string blame(mgb::cg::OperatorNodeBase* opr) { - mgb_assert(PyMGBExceptionMaker::py_exc_class, - "Python exception class is not set yet"); - PyObject* args = OprPyTracker::get_tracker(opr).as_tuple(); - - PYTHON_GIL; - - PyObject* py_exc = PyObject_CallObject(PyMGBExceptionMaker::py_exc_class, args); - Py_DECREF(args); - mgb_assert(py_exc); - - PyObject* py_str = PyObject_Str(py_exc); - Py_DECREF(py_exc); - mgb_assert(py_str); - - int err = PyUnicode_READY(py_str); - if (err) { - Py_DECREF(py_str); - mgb_assert(!err); - } - - Py_ssize_t c_str_size; - const char* c_str = PyUnicode_AsUTF8AndSize(py_str, &c_str_size); - if (!c_str) { - Py_DECREF(py_str); - mgb_assert(c_str); - } - std::string ret(c_str, c_str_size); - Py_DECREF(py_str); - return ret; -} - -/* ============== PyMGBExceptionMaker ============== */ -PyObject *PyMGBExceptionMaker::py_exc_class = nullptr; - -void PyMGBExceptionMaker::setup_py_exception(std::exception &exc) { - mgb_assert(py_exc_class); - if (auto cbexc = dynamic_cast(&exc)) { - cbexc->restore(); - return; - } - - std::string msg; - try { - msg = ssprintf("MegBrain core throws exception: %s\n%s", - typeid_name(exc).c_str(), exc.what()); - - auto mgbexc = dynamic_cast(&exc); - OprPyTracker::TrackerResult tracker; - if (mgbexc) { - tracker = OprPyTracker::get_tracker(*mgbexc); - } - - PYTHON_GIL; - PyObject *py_exc_arg = tracker.as_tuple(msg.c_str()); - PyErr_SetObject(py_exc_class, py_exc_arg); - Py_DECREF(py_exc_arg); - } catch (std::exception &newexc) { - auto newmsg = ssprintf( - "caught exception during handling exception: %s\n%s\n" - "original message: %s", - typeid_name(newexc).c_str(), newexc.what(), - msg.c_str()); - PyErr_SetString(PyExc_RuntimeError, newmsg.c_str()); - } catch (...) { - auto newmsg = ssprintf( - "caught unknown exception during handling exception\n" - "original message: %s", msg.c_str()); - PyErr_SetString(PyExc_RuntimeError, newmsg.c_str()); - } -} - -/* ============== PyExceptionForward ============== */ - -PyExceptionForward::~PyExceptionForward() { - PYTHON_GIL; - PyObjRefKeeper::deleter(m_type); - PyObjRefKeeper::deleter(m_value); - PyObjRefKeeper::deleter(m_traceback); -} - -void PyExceptionForward::restore() { - PyErr_Restore(m_type, m_value, m_traceback); - m_type = m_value = m_traceback = nullptr; -} - -void PyExceptionForward::throw_() { - PyObject *etype, *obj, *trace; - PyErr_Fetch(&etype, &obj, &trace); - PyErr_NormalizeException(&etype, &obj, &trace); - - std::string msg{"python exception"}; - bool succ = false; - if (etype && obj && trace) { - auto run = [&]() { -#define DEF(name, expr) \ - PyObjRefKeeper name{expr}; \ - if (!name.get()) \ - return - DEF(mod, PyImport_ImportModule("traceback")); - DEF(result, PyObject_CallMethod(mod.get(), "format_exception", - "(OOO)", etype, obj, trace)); - if (!PyList_Check(result.get())) - return; - auto size = PyList_Size(result.get()); - msg.append(":\n"); - for (Py_ssize_t i = 0; i < size; ++i) { - msg.append(" "); - msg.append(PyUnicode_AsUTF8(PyList_GetItem(result.get(), i))); - } - msg.pop_back(); // remove last \n - succ = true; -#undef DEF - }; - run(); - } - if (!succ) { - PyObject* obj_str_py; - if (obj && (obj_str_py = PyObject_Repr(obj))) { - msg.append(" with message "); - msg.append(PyUnicode_AsUTF8(obj_str_py)); - Py_DECREF(obj_str_py); - } else { - msg.append(" with unknown message"); - } - } - // throwing exception may cause abort due to unknown reasons; so we first - // log the message - mgb_log_error("caught exception from python callback: %s", msg.c_str()); - fflush(stdout); - fflush(stderr); - throw PyExceptionForward{etype, obj, trace, msg}; -} - -/* ============== namespace npy ============== */ - -namespace { - -int to_mgb_supported_dtype_raw(int dtype) { - if (dtype == NPY_INT64) - return NPY_INT32; - if (dtype == NPY_FLOAT64) - return NPY_FLOAT32; - return dtype; -} - -#define FOREACH_NPY_DTYPE_PAIR(cb) \ - cb(Uint8, NPY_UINT8) \ - cb(Int8, NPY_INT8) \ - cb(Int16, NPY_INT16) \ - cb(Int32, NPY_INT32) \ - cb(Float16, NPY_FLOAT16) \ - cb(Float32, NPY_FLOAT32) - -#define FOREACH_NPY_MGB_DTYPE_PAIR(cb) \ - FOREACH_NPY_DTYPE_PAIR(cb) \ - FOREACH_MGB_DTYPE_PAIR(cb) - - - -//! convert megbrain dtype to numpy dtype -int dtype_mgb2np_raw(DType dtype) { - mgb_assert(dtype.valid(), "attempt to convert from invalid dtype"); - switch (dtype.enumv()) { -#define cb(_m, _n) \ - case DTypeEnum::_m: \ - return _n; - FOREACH_NPY_MGB_DTYPE_PAIR(cb) -#undef cb - default: - break; - } - throw ConversionError(ssprintf( - "can not convert dtype %s to numpy dtype", dtype.name())); -} - -struct PyArrayDescrDeleter { - void operator()(PyArray_Descr* obj) { - Py_XDECREF(obj); - } -}; - -//! Convert MegBrain DType to NumPy DType descriptor, the caller receives a new -//! reference to the descriptor. -std::unique_ptr dtype_mgb2np_descr( - DType dtype) { - PYTHON_GIL; - mgb_assert(dtype.valid(), "attempt to convert from invalid dtype"); - auto build_mgb_dtype_dict = - [](const char* name, - const std::vector>& data) { - PyObject* metadata = PyDict_New(); - PyObject* mgb_dtype_metadata = PyDict_New(); - PyDict_SetItemString(mgb_dtype_metadata, "name", - PyUnicode_FromString(name)); - for (const auto& d : data) { - PyDict_SetItemString(mgb_dtype_metadata, d.first, d.second); - } - PyDict_SetItemString(metadata, "mgb_dtype", mgb_dtype_metadata); - return metadata; - }; - if (dtype.has_param()) { - PyArray_Descr* type_descr; - switch (dtype.enumv()) { - case DTypeEnum::Quantized8Asymm: { - auto& param = dtype.param(); - type_descr = PyArray_DescrNewFromType(NPY_UINT8); - type_descr->metadata = build_mgb_dtype_dict( - DTypeTrait::name, - {{"scale", PyFloat_FromDouble(param.scale)}, - {"zero_point", PyLong_FromLong(param.zero_point)}}); - break; - } - case DTypeEnum::QuantizedS8: { - auto& param = dtype.param(); - type_descr = PyArray_DescrNewFromType(NPY_INT8); - type_descr->metadata = build_mgb_dtype_dict( - DTypeTrait::name, - {{"scale", PyFloat_FromDouble(param.scale)}}); - break; - } - case DTypeEnum::Quantized4Asymm: { - auto& param = dtype.param(); - type_descr = PyArray_DescrNewFromType(NPY_UINT8); - type_descr->metadata = build_mgb_dtype_dict( - DTypeTrait::name, - {{"scale", PyFloat_FromDouble(param.scale)}, - {"zero_point", PyLong_FromLong(param.zero_point)}}); - break; - } - case DTypeEnum::QuantizedS4: { - auto& param = dtype.param(); - type_descr = PyArray_DescrNewFromType(NPY_INT8); - type_descr->metadata = build_mgb_dtype_dict( - DTypeTrait::name, - {{"scale", PyFloat_FromDouble(param.scale)}}); - break; - } - case DTypeEnum::QuantizedS32: { - auto& param = dtype.param(); - type_descr = PyArray_DescrNewFromType(NPY_INT32); - type_descr->metadata = build_mgb_dtype_dict( - DTypeTrait::name, - {{"scale", PyFloat_FromDouble(param.scale)}}); - break; - } - default: - mgb_throw(ConversionError, "unhandled parameterized DType %s", - dtype.name()); - } - return std::unique_ptr(type_descr); - } - PyArray_Descr* basic_descr = PyArray_DescrFromType(dtype_mgb2np_raw(dtype)); - mgb_assert(basic_descr != nullptr, - "failed to convert expected dtype to numpy type descriptor"); - return std::unique_ptr(basic_descr); -} - -DType dtype_np2mgb_raw(int npt) { - switch (npt) { -#define cb(_m, _n) \ - case _n: \ - return dtype::_m(); - FOREACH_NPY_DTYPE_PAIR(cb) -#undef cb - } -#define cb(_m, _n) \ - if (_n == npt) return dtype::_m(); - FOREACH_MGB_DTYPE_PAIR(cb) -#undef cb - - PYTHON_GIL; - std::string msg; - auto py_obj = PyArray_TypeObjectFromType(npt); - if (!py_obj) { - msg = ssprintf("unknown numpy dtype enum %d", npt); - } else { - msg = ssprintf("unsupported numpy dtype %s", - repr_pyobj(py_obj).c_str()); - } - Py_DECREF(py_obj); - throw ConversionError(msg); -} - -DType dtype_np2mgb_descr(PyArray_Descr* descr) { - PYTHON_GIL; - auto handle_parameterized_dtype = [](PyObject* metadata) -> DType { - mgb_assert(PyDict_Check(metadata), - "Invalid parameterized DType metadata: should be a dict"); - PyObject* dtype_name_py = PyDict_GetItemString(metadata, "name"); - mgb_assert( - PyUnicode_Check(dtype_name_py), - "Invalid parameterized DType metadata: name should be a str"); - std::string dtype_name(PyUnicode_AsUTF8(dtype_name_py)); - if (dtype_name == "Quantized8Asymm") { - PyObject* scale_py = PyDict_GetItemString(metadata, "scale"); - PyObject* zero_point_py = - PyDict_GetItemString(metadata, "zero_point"); - mgb_assert(scale_py && zero_point_py, - "Invalid Quantized8Asymm metadata: missing scale or " - "zero_point."); - mgb_assert( - PyFloat_Check(scale_py), - "Invalid Quantized8Asymm metadata: scale should be float"); - mgb_assert(PyLong_Check(zero_point_py), - "Invalid Quantized8Asymm metadata: zero_point should be " - "integer"); - auto zero_point = PyLong_AS_LONG(zero_point_py); - mgb_assert(zero_point >= 0 && zero_point < 256, - "Invalid Quantized8Asymm metadata: zero_point should be " - "in [0, 256)"); - return dtype::Quantized8Asymm( - static_cast(PyFloat_AS_DOUBLE(scale_py)), - static_cast(zero_point)); - } - if (dtype_name == "Quantized4Asymm") { - PyObject* scale_py = PyDict_GetItemString(metadata, "scale"); - PyObject* zero_point_py = - PyDict_GetItemString(metadata, "zero_point"); - mgb_assert(scale_py && zero_point_py, - "Invalid Quantized4Asymm metadata: missing scale or " - "zero_point."); - mgb_assert( - PyFloat_Check(scale_py), - "Invalid Quantized4Asymm metadata: scale should be float"); - mgb_assert(PyLong_Check(zero_point_py), - "Invalid Quantized4Asymm metadata: zero_point should be " - "integer"); - auto zero_point = PyLong_AS_LONG(zero_point_py); - mgb_assert(zero_point >= 0 && zero_point < 15, - "Invalid Quantized4Asymm metadata: zero_point should be " - "in [0, 15)"); - return dtype::Quantized4Asymm( - static_cast(PyFloat_AS_DOUBLE(scale_py)), - static_cast(zero_point)); - } - if (dtype_name == "QuantizedS32" || dtype_name == "QuantizedS8" || - dtype_name == "QuantizedS4") { - PyObject* scale_py = PyDict_GetItemString(metadata, "scale"); - mgb_assert(scale_py, "Invalid metadata: missing scale"); - mgb_assert(PyFloat_Check(scale_py), - "Invalid metadata: scale should be float"); - float scale = static_cast(PyFloat_AS_DOUBLE(scale_py)); - if (dtype_name == "QuantizedS32") { - return dtype::QuantizedS32(scale); - } else if (dtype_name == "QuantizedS8"){ - return dtype::QuantizedS8(scale); - } else { - return dtype::QuantizedS4(scale); - } - } - throw ConversionError( - ssprintf("Unknown parameterized DType: %s", dtype_name.c_str()) - .c_str()); - }; - PyObject* dtype_metadata; - if (descr->metadata && PyDict_Check(descr->metadata) && - (dtype_metadata = PyDict_GetItemString(descr->metadata, "mgb_dtype"))) { - return handle_parameterized_dtype(dtype_metadata); - } - return dtype_np2mgb_raw(descr->type_num); -} - -HostTensorND lowbit_ndarray_to_host_tensor( - CompNode comp_node, TensorLayout &layout, PyArrayObject *input) { - auto src_ptr = reinterpret_cast(PyArray_DATA(input)); - if (!layout.ndim) { - // numpy scalar - mgb_assert(src_ptr, "can not convert from null numpy array"); - layout.init_contiguous_stride({1}); - } else { - mgb_assert(layout.ndim && layout.ndim <= TensorShape::MAX_NDIM, - "unsupported ndim %zu", layout.ndim); - for (size_t i = 0; i < layout.ndim; ++ i) { - layout.shape[i] = PyArray_SHAPE(input)[i]; - layout.stride[i] = PyArray_STRIDE(input, i); - mgb_assert(layout.shape[i], "zero shape not supported"); - } - mgb_assert(layout.is_contiguous()); - } - HostTensorND ret{comp_node, layout}; - lowbit_memcpy_byte2compact(layout.dtype, ret.raw_ptr(), src_ptr, - layout.total_nr_elems()); - return ret; -} - -/*! - * \brief convert a python object to tensor and try to borrow memory if the - * original object is a contiguous numpy array - * \param dtype see np2tensor - * \return the megbrain tensor, and whether memory is borrowed - */ -std::pair np2tensor_try_borrow( - PyObject *obj, CompNode dest_cn, DType dtype) { - mgb_assert(dest_cn.valid()); - - PYTHON_GIL; - - PyArray_Descr* expected_descr = nullptr; - if (dtype.valid()) { - // The reference to expected_descr will be stealed later. - expected_descr = dtype_mgb2np_descr(dtype).release(); - } - - // make result from PyArrayObject; its reference would be stolen - auto make_from_arr = [&](PyArrayObject *input, bool is_borrow) { - PyObjRefKeeper ref_obj_cvt{reinterpret_cast(input)}; - - TensorLayout layout; - layout.dtype = dtype_np2mgb_descr(PyArray_DESCR(input)); - if (dtype.valid()) - mgb_assert(dtype == layout.dtype); - layout.ndim = PyArray_NDIM(input); - - if (layout.dtype.is_low_bit()) { - auto ret = lowbit_ndarray_to_host_tensor(dest_cn, layout, input); - // decref(input) would be handled by ref_obj_cvt - return std::make_pair(ret, false); - } - - auto data = reinterpret_cast(PyArray_DATA(input)); - if (!layout.ndim) { - // numpy scalar - mgb_assert(data, "can not convert from null numpy array"); - layout.init_contiguous_stride({1}); - } else { - mgb_assert(layout.ndim && layout.ndim <= TensorShape::MAX_NDIM, - "unsupported ndim %zu", layout.ndim); - auto dsize = layout.dtype.size(); - bool is_empty = false; - for (size_t i = 0; i < layout.ndim; ++ i) { - layout.shape[i] = PyArray_SHAPE(input)[i]; - layout.stride[i] = PyArray_STRIDE(input, i); - if (!layout.shape[i]) { - is_empty = true; - } - mgb_assert(layout.stride[i] % dsize == 0, - "bad stride %zd", layout.stride[i]); - layout.stride[i] /= dsize; - } - mgb_assert(is_empty || layout.is_contiguous()); - } - HostTensorStorage storage; - auto input_ptr = ref_obj_cvt.make_shared(data); - storage.reset(dest_cn, layout.span().high_byte, input_ptr); - HostTensorND ret; - ret.reset(storage, layout); - return std::make_pair(ret, is_borrow); - }; - - PyArrayObject *obj_as_arr = nullptr; - do { - // check contiguous and dtype, and borrow mem if ok - if (!PyArray_Check(obj)) - break; - obj_as_arr = reinterpret_cast(obj); - int typenum = PyArray_DTYPE(obj_as_arr)->type_num; - // We have to check dtype.valid() and typenum first to avoid - // accidentally trigger ConversionError on incompatible dtypes which can - // be automatically converted into comptaible ones (e.g. float64). - if (dtype.valid() && - (expected_descr->type_num != typenum || - dtype_np2mgb_descr(PyArray_DTYPE(obj_as_arr)) != dtype)) - break; - if (typenum != to_mgb_supported_dtype_raw(typenum)) { - mgb_assert(!dtype.valid() && expected_descr == nullptr); - expected_descr = - PyArray_DescrFromType(to_mgb_supported_dtype_raw(typenum)); - break; - } - if (PyArray_ISCARRAY_RO(obj_as_arr)) { - Py_INCREF(obj_as_arr); - return make_from_arr(obj_as_arr, true); - } - } while(0); - - constexpr auto NP_FLAGS = NPY_ARRAY_C_CONTIGUOUS | NPY_ARRAY_FORCECAST; - PyObject *obj_cvt; - if (obj_as_arr) { - obj_cvt = PyArray_FromArray(obj_as_arr, expected_descr, NP_FLAGS); - } else { - obj_cvt = PyArray_FromAny(obj, expected_descr, 0, 0, NP_FLAGS, nullptr); - } - - if (obj_cvt) { - // convert to mgb supported dtype - auto arr = reinterpret_cast(obj_cvt); - int dt0 = PyArray_TYPE(arr), dt1 = to_mgb_supported_dtype_raw(dt0); - if (dt0 != dt1) { - mgb_assert(expected_descr == nullptr); - expected_descr = PyArray_DescrFromType(dt1); - mgb_assert(expected_descr); - auto obj_cvt_new = PyArray_FromAny( - obj_cvt, expected_descr, 0, 0, NP_FLAGS, nullptr); - Py_DECREF(obj_cvt); - obj_cvt = obj_cvt_new; - } - } - - if (!obj_cvt) { - if (PyErr_Occurred()) { - PyExceptionForward::throw_(); - } - throw ConversionError(ssprintf("can not convert to numpy array from %s", - repr_pyobj(obj).c_str())); - } - - return make_from_arr(reinterpret_cast(obj_cvt), false); -} - -//! hold a reference to HostTensorND -class HostTensorNDRefHolder final: public NonCopyableObj { - HostTensorND m_val; - static MemPool sm_mem_pool; - - friend class MemPool; - - HostTensorNDRefHolder(const HostTensorND &v): - m_val{v} - { - } - - public: - - static HostTensorNDRefHolder* alloc(const HostTensorND &v) { - return sm_mem_pool.alloc(v); - } - - static void free(HostTensorNDRefHolder *p) { - return sm_mem_pool.free(p); - } -}; -MemPool HostTensorNDRefHolder::sm_mem_pool; - -void ndarray_shared_from_tensor_py_capsule_dtor(PyObject *cap) { - auto ptr = PyCapsule_GetPointer(cap, "HostTensorND"); - mgb_assert(ptr, "not a PyCapsule: %s", repr_pyobj(cap).c_str()); - HostTensorNDRefHolder::free(static_cast(ptr)); -} - -} // anonymous namespace - -PyObject* npy::ndarray_from_tensor( - const HostTensorND &val, ShareType share_type) { - if (!val.layout().is_contiguous() && !val.shape().is_empty()) { - mgb_assert(share_type != ShareType::MUST_SHARE); - HostTensorND contig; - contig.copy_from(val); - return ndarray_from_tensor(contig, ShareType::TRY_SHARE); - } - PYTHON_GIL; - npy_intp dims[TensorLayout::MAX_NDIM]; - for (size_t i = 0; i < val.layout().ndim; ++ i) - dims[i] = val.shape()[i]; - PyObject* ret = nullptr; - - auto alloc_new_ret = [&]() { - mgb_assert(!ret); - ret = PyArray_NewFromDescr( - &PyArray_Type, dtype_mgb2np_descr(val.dtype()).release(), - val.layout().ndim, dims, nullptr, nullptr, 0, nullptr); - mgb_assert(ret, "failed to allocate array"); - mgb_assert(PyArray_Check(ret)); - return PyArray_DATA(reinterpret_cast(ret)); - }; - if (val.dtype().is_low_bit()) { - mgb_assert(share_type != ShareType::MUST_SHARE, - "can not share memory for lowbit dtype"); - lowbit_memcpy_compact2byte(val.dtype(), alloc_new_ret(), val.raw_ptr(), - val.layout().total_nr_elems()); - } else if (share_type == ShareType::MUST_UNSHARE) { - memcpy(alloc_new_ret(), val.raw_ptr(), val.layout().span().dist_byte()); - } else { - // share data - ret = PyArray_NewFromDescr( - &PyArray_Type, dtype_mgb2np_descr(val.dtype()).release(), - val.layout().ndim, dims, nullptr, - const_cast(val.raw_ptr()), 0, nullptr); - mgb_assert(ret, "failed to alloc ndarray"); - auto capsule = PyCapsule_New(HostTensorNDRefHolder::alloc(val), - "HostTensorND", ndarray_shared_from_tensor_py_capsule_dtor); - mgb_assert(capsule, "failed to create PyCapsule"); - auto err = PyArray_SetBaseObject( - reinterpret_cast(ret), capsule); - mgb_assert(!err); - } - return ret; -} - -HostTensorND npy::np2tensor(PyObject* obj, const Meth& meth, DType dtype) { - auto ret_full = np2tensor_try_borrow(obj, meth.dest_cn_, dtype); - if (meth.dest_tensor_) { - meth.dest_tensor_->copy_from(ret_full.first); - return *meth.dest_tensor_; - } - if (meth.must_borrow_) { - mgb_assert(ret_full.second, - "can not borrow from numpy array as contig array with dtype " - "%s; src=%s", - dtype.name(), repr_pyobj(obj).c_str()); - } - return ret_full.first; -} - -PyObject* npy::dtype_mgb2np(mgb::DType dtype) { - PYTHON_GIL; - // According to - // https://docs.scipy.org/doc/numpy/reference/c-api.array.html#c.PyArray_TypeObjectFromType - // the following is equivalent to PyArray_TypeObjectFromType for built-in - // types. - auto descr = dtype_mgb2np_descr(dtype); - if (descr == nullptr) { - return nullptr; - } - if (dtype.has_param()) { - return reinterpret_cast(descr.release()); - } - PyObject* typeobj = reinterpret_cast(descr->typeobj); - Py_XINCREF(typeobj); - return typeobj; -} - -mgb::DType npy::dtype_np2mgb(PyObject *obj) { - mgb_assert(obj && obj != Py_None, - "can not convert null PyObject to numpy dtype"); - // see - // http://stackoverflow.com/questions/8477122/numpy-c-api-convert-type-object-to-type-number - PYTHON_GIL; - - PyArray_Descr* dtype; - if(!PyArray_DescrConverter(obj, &dtype)) { - throw ConversionError(ssprintf("can not convert to np.dtype from %s", - repr_pyobj(obj).c_str())); - } - - mgb::DType result = dtype_np2mgb_descr(dtype); - Py_DECREF(dtype); - return result; -} - -PyObject* npy::to_mgb_supported_dtype(PyObject* dtype) { - PYTHON_GIL; - - PyArray_Descr* descr; - if (!PyArray_DescrConverter(dtype, &descr)) { - throw ConversionError(ssprintf("can not convert to np.dtype from %s", - repr_pyobj(dtype).c_str())); - } - mgb_assert(!descr->metadata, - "unexpected metadata in dtype: " - "dtype_obj=%s metadata=%s", - repr_pyobj(dtype).c_str(), repr_pyobj(descr->metadata).c_str()); - int type_num = to_mgb_supported_dtype_raw(descr->type_num); - return PyArray_TypeObjectFromType(type_num); -} - -TensorShape npy::vec2shape(const std::vector &vec) { - TensorShape shape; - mgb_assert(vec.size() <= TensorShape::MAX_NDIM, - "dim too large: %zd (max %zd)", - vec.size(), TensorShape::MAX_NDIM); - shape.ndim = vec.size(); - for (size_t i = 0; i < vec.size(); i ++) { - if (!vec[i]) { - shape.ndim = 0; - break; - } - shape[i] = vec[i]; - } - mgb_assert(shape.ndim, "shape should not be empty"); - return shape; -} - -void mgb_init_numpy() { - import_array1( ); -} - -// vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} diff --git a/python_module/src/cpp/python_helper.h b/python_module/src/cpp/python_helper.h deleted file mode 100644 index 1d443905..00000000 --- a/python_module/src/cpp/python_helper.h +++ /dev/null @@ -1,229 +0,0 @@ -/** - * \file python_module/src/cpp/python_helper.h - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * \brief helper utilities for python integration - * - * \copyright Copyright (c) 2014-2020 Megvii Inc. All rights reserved. - * - */ - -#pragma once - -#include "megbrain/graph.h" - -#include -#include - -class GILManager { - PyGILState_STATE gstate; - - public: - GILManager(): - gstate(PyGILState_Ensure()) - { - } - - ~GILManager() { - PyGILState_Release(gstate); - } -}; -#define PYTHON_GIL GILManager __gil_manager - -//! wraps a shared_ptr and decr PyObject ref when destructed -class PyObjRefKeeper { - std::shared_ptr m_ptr; - -public: - static void deleter(PyObject* p) { - if (p) { - PYTHON_GIL; - Py_DECREF(p); - } - } - - PyObjRefKeeper() = default; - PyObjRefKeeper(PyObject* p) : m_ptr{p, deleter} {} - - PyObject* get() const { return m_ptr.get(); } - - //! create a shared_ptr as an alias of the underlying ptr - template - std::shared_ptr make_shared(T* ptr) const { - return {m_ptr, ptr}; - } -}; - -class PyStackExtracter { - static PyStackExtracter *ins; - - public: - virtual ~PyStackExtracter() = default; - - virtual std::string extract() = 0; - - static void reg(PyStackExtracter *p) { - ins = p; - } - - static std::string run() { - return ins->extract(); - } -}; - -//! exception to be thrown when python callback fails -class PyExceptionForward : public std::exception { - PyObject *m_type, *m_value, *m_traceback; - std::string m_msg; - - PyExceptionForward(PyObject* type, PyObject* value, PyObject* traceback, - const std::string& msg) - : m_type{type}, - m_value{value}, - m_traceback{traceback}, - m_msg{msg} {} - -public: - PyExceptionForward(const PyExceptionForward&) = delete; - PyExceptionForward& operator=(const PyExceptionForward&) = delete; - ~PyExceptionForward(); - - PyExceptionForward(PyExceptionForward&& rhs) - : m_type{rhs.m_type}, - m_value{rhs.m_value}, - m_traceback{rhs.m_traceback}, - m_msg{std::move(rhs.m_msg)} { - rhs.m_type = rhs.m_value = rhs.m_traceback = nullptr; - } - - //! throw PyExceptionForward from current python error state - static void throw_() __attribute__((noreturn)); - - //! restore python error - void restore(); - - const char* what() const noexcept override { return m_msg.c_str(); } -}; - -/*! - * \brief make python exception - */ -class PyMGBExceptionMaker { - static PyObject *py_exc_class; - friend std::string blame(mgb::cg::OperatorNodeBase* opr); - - public: - static void setup_py_exception(std::exception &exc); - - static void _reg_exception_class(PyObject *cls) { - py_exc_class = cls; - } - -}; - -//! associate a python object with an operator -class OprPyTracker final : public mgb::NonCopyableObj { - class TrackerStorage; - OprPyTracker() = delete; - -public: - /*! - * \brief set current tracker; all operators created later would share - * this tracker - * - * Note that a py reference would be kept - */ - static void begin_set_tracker(mgb::cg::ComputingGraph& graph, - PyObject* obj); - - static void end_set_tracker(mgb::cg::ComputingGraph& graph); - - struct TrackerResult { - mgb::cg::OperatorNodeBase - //! operator that directly causes the exception - *exc_opr = nullptr, - //! operator constructed by user (non-optimized exc_opr) - *unopt_opr = nullptr, - //! the grad source if opr is constructed by taking grad - *opr_grad_src = nullptr; - PyObject *tracker = nullptr, *tracker_grad_src = nullptr; - - //! format as python tuple - PyObject* as_tuple(const char* leading_msg = nullptr) const; - }; - - //! get tracker from exception - static TrackerResult get_tracker(mgb::MegBrainError& exc); - - //! get tracker from operator - static TrackerResult get_tracker(mgb::cg::OperatorNodeBase* opr); -}; - -std::string blame(mgb::cg::OperatorNodeBase* opr); - -//! numpy utils -namespace npy { - //! convert tensor shape to raw vector - static inline std::vector shape2vec(const mgb::TensorShape &shape) { - return {shape.shape, shape.shape + shape.ndim}; - } - - //! change numpy dtype to megbrain supported dtype - PyObject* to_mgb_supported_dtype(PyObject *dtype); - - //! convert raw vector to tensor shape - mgb::TensorShape vec2shape(const std::vector &vec); - - //! convert megbrain dtype to numpy dtype object; return new reference - PyObject* dtype_mgb2np(mgb::DType dtype); - - //! convert numpy dtype object or string to megbrain dtype - mgb::DType dtype_np2mgb(PyObject *obj); - - //! buffer sharing type - enum class ShareType { - MUST_SHARE, //!< must be shared - MUST_UNSHARE, //!< must not be shared - TRY_SHARE //!< share if possible - }; - - //! get ndarray from HostTensorND - PyObject* ndarray_from_tensor(const mgb::HostTensorND &val, - ShareType share_type); - - //! specify how to convert numpy array to tensor - struct Meth { - bool must_borrow_ = false; - mgb::HostTensorND *dest_tensor_ = nullptr; - mgb::CompNode dest_cn_; - - //! make a Meth that allows borrowing numpy array memory - static Meth borrow( - mgb::CompNode dest_cn = mgb::CompNode::default_cpu()) { - return {false, nullptr, dest_cn}; - } - - //! make a Meth that requires the numpy array to be borrowed - static Meth must_borrow( - mgb::CompNode dest_cn = mgb::CompNode::default_cpu()) { - return {true, nullptr, dest_cn}; - } - - //! make a Meth that requires copying the value into another - //! tensor - static Meth copy_into(mgb::HostTensorND *tensor) { - return {false, tensor, tensor->comp_node()}; - } - }; - /*! - * \brief convert an object to megbrain tensor - * \param meth specifies how the conversion should take place - * \param dtype desired dtype; it can be set as invalid to allow arbitrary - * dtype - */ - mgb::HostTensorND np2tensor(PyObject *obj, const Meth &meth, - mgb::DType dtype); -} - -// vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} diff --git a/python_module/src/python/genopr.py b/python_module/src/python/genopr.py deleted file mode 100755 index 28ce7e28..00000000 --- a/python_module/src/python/genopr.py +++ /dev/null @@ -1,293 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# This file is part of MegBrain. -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. - -from io import StringIO -import re -import argparse -import subprocess -import os -import textwrap - -def camel2underscore( - name, *, - first_cap_re=re.compile('([A-Z])([A-Z][a-z]+)'), - all_cap_re = re.compile('([a-z])([A-Z]+)')): - if name.isupper(): - return name.lower() - s1 = first_cap_re.sub(r'\1_\2', name) - return all_cap_re.sub(r'\1_\2', s1).lower() - -class Doc: - """wrap an identifier and doc""" - _id = None - - def __init__(self, id_, doc, typestr=None, default=None): - self._id = id_ - self.doc = doc - self.typestr = typestr - self.default = default - - def __str__(self): - return self._id - - -class OprGenerator: - _fout = None - _cur_indent = '' - - def __init__(self): - self._fout = StringIO() - - def _indent(self): - self._cur_indent += ' ' * 4 - - def _unindent(self): - self._cur_indent = self._cur_indent[:-4] - - def _write(self, content, *fmt, indent=0): - if indent < 0: - self._unindent() - - self._fout.write(self._cur_indent) - if fmt: - content = content % fmt - self._fout.write(content) - self._fout.write('\n') - - if indent > 0: - self._indent() - - def _gen_signature(self, inputs, params, *, have_config=True, - has_out_dtype=False): - assert inputs - sig = [] - for inp in inputs: - name = str(inp) - if name.startswith('*'): - assert name[1:].isidentifier() - assert inp is inputs[-1] - else: - assert name.isidentifier() - if isinstance(inp, Doc) and inp.default is not None: - name += '={}'.format(inp.default) - sig.append(name) - if not str(inputs[-1]).startswith('*'): - sig.append('*') - for i, _ in params: - sig.append('{}=None'.format(i)) - - if have_config: - sig.extend(['name=None', 'comp_node=None', 'config=None']) - if 'comp_graph' not in map(str, inputs): - sig.append('comp_graph=None') - if has_out_dtype: - assert 'dtype' not in map(str, inputs) - sig.append('dtype=None') - - if params: - sig.append('**kwargs') - - if sig[-1] == '*': - sig.pop() - return ', '.join(sig) - - def _write_canonize_inputs(self, inputs, canonize_input_vars, - canonize_input_vars_args=None, - has_out_dtype=False): - self._write_gen_config(has_out_dtype) - inputs = list(map(str, inputs)) - if canonize_input_vars_args is None: - if inputs[0][0] == '*': - arg = inputs[0][1:] - else: - arg = '[{}]'.format(', '.join(inputs)) - else: - arg = canonize_input_vars_args - self._write('all_inputs = _helper.%s(%s, ' - 'comp_graph=comp_graph, config=config)', - canonize_input_vars, arg) - - def _write_gen_config(self, has_out_dtype=False): - if not has_out_dtype: - self._write('config = _helper.gen_config(name, comp_node, config)') - else: - self._write('config = _helper.gen_config(name, comp_node, config, dtype)') - - def _write_make_params(self, params, body): - for pname, ptype in params: - self._write('%s = _helper.cvt_to_opr_param_def(%s, ' - '_opr_param_defs.%s, kwargs)', - pname, pname, ptype) - self._write('assert not kwargs, "extra kwargs: {}".format(kwargs)') - - for i in body: - self._write(i) - - self._write('all_params = []') - for pname, _ in params: - self._write('all_params.append(%s.serialize())', - pname) - - def _write_doc(self, inputs, params, desc): - self._write('"""') - if isinstance(desc, Doc): - assert desc._id is None - self._write(desc.doc) - elif desc: - for i in textwrap.wrap(desc, 75): - self._write(i) - - self._write('') - for i in inputs: - name = str(i) - typestr = ':class:`.SymbolVar`' - if name[0] == '*': - name = name[1:] - typestr = 'list of ' + typestr - if isinstance(i, Doc): - self._write(':param %s: %s', name, i.doc) - if i.typestr is not None: - typestr = i.typestr - if typestr: - if not isinstance(i, Doc): - self._write(':param %s: ', name) - self._write(':type %s: %s', name, typestr) - - for pname, ptype in params: - self._write(':param %s: ', pname) - self._write(':type %s: :class:`~megbrain.opr_param_defs.%s`', - pname, ptype) - - self._write(':param comp_node: see doc for *config*') - self._write(':param name: see doc for *config*') - self._write( - ':param config: give a :class:`.OperatorNodeConfig` object to set ' - 'operator name and comp node. This can also be achieved by passing ' - '*comp_node* and *name* separately.') - - if 'comp_graph' not in map(str, inputs): - self._write( - ':param comp_graph: If all inputs are immediate numbers, ' - '*comp_graph* and *comp_node* must be provided ' - 'so the input values can be put on appropriate ' - 'computing graph and computing node') - self._write('"""') - - def _write_return(self, name, outputs): - self._write('outputs = _mgb._create_opr(' - '"%s", all_inputs, all_params, config)', name) - if outputs: - self._write('outputs = [outputs[i] for i in %s]', - list(map(int, outputs))) - self._write('return _helper.cvt_opr_result(outputs, ' - '**cvt_result_kwargs)') - - def decl_opr(self, name, *, inputs, params, desc=None, pyname=None, - canonize_input_vars='canonize_input_vars', - canonize_input_vars_args=None, body=[], - outputs=None, version=0, has_out_dtype=False): - """ - :param inputs: name of variable inputs; a name starting with `*' means - a list of vars - :type inputs: list of str - :param params: (param name, param type) pairs; it can be a single - string representing the param type, and param name defaults to - 'param' - :type params: list of pair of str, or str - :param pyname: python function name - :param body: extra statements to be placed before calling _create_opr - :param outputs: the indices of output vars to be selected from raw opr - result - """ - if isinstance(params, str): - params = [('param', params)] - assert params - - if pyname is None: - pyname = camel2underscore(name) - - self._write('def %s(%s):', pyname, - self._gen_signature(inputs, params, - has_out_dtype=has_out_dtype), indent=1) - self._write_doc(inputs, params, desc) - self._write_canonize_inputs( - inputs, canonize_input_vars, - canonize_input_vars_args=canonize_input_vars_args, - has_out_dtype=has_out_dtype) - self._write('cvt_result_kwargs = {}') - self._write_make_params(params, body) - if version: - name += 'V{}'.format(version) - self._write_return(name, outputs) - self._write('', indent=-1) - - def decl_raw_opr(self, name, *, inputs, inputs_cvt=[], body=None, - desc=None, local_defs=[], have_config=True): - """declare a raw operator that is forwarded to _mgb._Opr; if *body* is - given, a custom implemented can be provided - - :param inputs_cvt: list of (input name, cvt) pairs, where cvt is name - of the function to convert that input - :param body: list of statements to produce output, or None - :param local_defs: list of statements to be prepended before generated - code - """ - self._write('def %s(%s):', name, - self._gen_signature(inputs, [], have_config=have_config), - indent=1) - self._write_doc(inputs, [], desc) - if have_config: - self._write_gen_config() - for i in local_defs: - self._write(i) - for k, v in inputs_cvt: - self._write('%s = %s(%s)', k, v, k) - self._write('cvt_result_kwargs = {}') - if body is None: - self._write('output = _mgb._Opr.%s(%s, config)', - name, ', '.join(map(str, inputs))) - else: - for i in body: - self._write(i) - self._write( - 'return _helper.cvt_opr_result(output, **cvt_result_kwargs)') - self._write('', indent=-1) - - def get_str(self): - return self._fout.getvalue() - - -def main(): - parser = argparse.ArgumentParser( - description='generate operator function def code from decl file') - parser.add_argument('inputs', nargs='+') - args = parser.parse_args() - - gen = OprGenerator() - exec_globals = { - 'decl_opr': gen.decl_opr, - 'decl_raw_opr': gen.decl_raw_opr, - 'Doc': Doc, - 'camel2underscore': camel2underscore, - } - for i in args.inputs: - print('generate oprs from {}'.format(i)) - with open(i) as fin: - exec(fin.read(), exec_globals) - - git_commit = subprocess.Popen(['git', 'rev-parse', 'HEAD'], - stdout=subprocess.PIPE).communicate()[0].strip() - git_commit = git_commit.decode('utf-8') - - file_rela = lambda *paths: os.path.join(os.path.dirname(__file__), *paths) - outfile = lambda name: file_rela('../../megengine/_internal', name) - with open(file_rela('opr_template.py')) as fin: - with open(outfile('opr.py'), 'w') as fout: - fout.write(fin.read(). - replace('{%body%}', gen.get_str()). - replace('{%git_commit%}', git_commit)) - -if __name__ == '__main__': - main() diff --git a/python_module/src/python/opr_template.py b/python_module/src/python/opr_template.py deleted file mode 100644 index 29ea0a9d..00000000 --- a/python_module/src/python/opr_template.py +++ /dev/null @@ -1,425 +0,0 @@ -# -*- coding: utf-8 -*- -# This file is part of MegBrain. -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. - -"""This python module contains functions to apply the operators defined by -megbrain. - -.. note:: - Most of the functions are automatically generated, and their signature have - the form contain a ``param`` argument (or more than one arguments such as - :func:`convolution` that has ``param`` and ``execution_polity``) and also - accept keyword arguments. In such case, it can be called by either - providing a param object of appropriate type, or by passing the arguments - needed by the constructor of param object to the keyword arguments. - Furthermore, for a param that needs an enumeration member, the enum name - can be used to refer to the enum object. - - For example, the following statements are equivalent:: - - elemwise([a, b], mode='max') - elemwise([a, b], mode=opr_param_defs.Elemwise.Mode.MAX) - elemwise([a, b], param=opr_param_defs.Elemwise('max')) -""" - -from . import mgb as _mgb -from . import helper as _helper -from . import opr_param_defs as _opr_param_defs - -import sys -import enum -import collections -import json - -__git_commit__ = "{%git_commit%}" - -{%body%} - -class _ElemMeta(type): - def __getattr__(self, name): - def run(*inputs, **kwargs): - return elemwise(inputs, mode=name, **kwargs) - if name.startswith('__'): - return - return run - - -class elem(metaclass=_ElemMeta): - """ - Helper class for easily applying element-wise operator. Request for getting - member method would be translated to a call to :func:`elemwise` with mode - set to the method name. Example:: - - elem.exp(a) # elemwise(a, mode='exp') - elem.max(a, b) # elemwise([a, b], mode='max') - - """ - - -def add_update( - dest, delta, - alpha=_mgb.SharedScalar(1), beta=_mgb.SharedScalar(1), - bias=_mgb.SharedScalar(0), disable=_mgb.SharedScalar(0), *, - name=None, comp_node=None, config=None, comp_graph=None): - """update *dest* by `dest := dest*alpha + delta*beta + bias` - - :param dest: target var to be updated; must be created from - :func:`make_shared` - :type dest: :class:`.SymbolVar` - :param disable: AddUpdate will not be executed if disable is set to 1, - this is used for dynamic param-updating. The value of this SharedScalar - can only be set to 0/1 of type `int` - :type disable: :class:`.SharedScalar` - """ - def as_ss(x): - if not isinstance(x, _mgb.SharedScalar): - x = _mgb.SharedScalar(x) - return x - - assert isinstance(dest, _mgb.SymbolVar) - config = _helper.gen_config(name, comp_node, config) - dest, delta = _helper.canonize_input_vars( - [dest, delta], comp_graph=comp_graph, config=config) - - assert isinstance(disable, _mgb.SharedScalar) - - alpha, beta, bias = map(as_ss, [alpha, beta, bias]) - return _mgb._Opr.add_update(dest, delta, alpha, beta, bias, disable, config) - -def reduce_(src, mode, axis=None, keepdims=False, *, - name=None, comp_node=None, config=None, comp_graph=None): - """reduce along given axis; if axis is None, reduce to scalar - - :param mode: reduction mode - :type mode: :class:`~megengine._internal.opr_param_defs.Reduce.Mode` compatible - :param axis: axis along which to reduce input var - :type axis: int - :param keepdims: whether to keep an axis of shape 1 in the result - :type keepdims: False - """ - assert isinstance(src, _mgb.SymbolVar) - config = _helper.gen_config(name, comp_node, config) - inputs = [src] - kwargs = {'mode': mode} - remove_axis = False - if axis is None: - inputs.append(1) - assert not keepdims, 'can not set axis=None and keepdims=True' - else: - remove_axis = not keepdims - kwargs['axis'] = axis - - ret = reduce_general(inputs, config=config, comp_graph=comp_graph, - **kwargs) - if remove_axis: - ret = _mgb._Opr.remove_axis(ret, axis, _mgb.make_opr_config()) - return _helper.cvt_opr_result(ret) - -def _reduce_like(impl, src, axis, keepdims, - name, comp_node, config, comp_graph): - config = _helper.gen_config(name, comp_node, config) - remove_axis = False - if axis is None: - assert not keepdims, 'can not set axis=None and keepdims=True' - src = src.flatten() - axis = 0 - else: - assert isinstance(axis, int) and axis >= 0, ( - 'bad axis: {!r}'.format(axis)) - remove_axis = not keepdims - - ret = impl(src, axis=axis, config=config, comp_graph=comp_graph) - if remove_axis: - ret = _mgb._Opr.remove_axis(ret, axis, _mgb.make_opr_config()) - return _helper.cvt_opr_result(ret) - -def dimshuffle(src, pattern, ndim=0, *, - name=None, comp_node=None, config=None): - """swap shapes and strides according to given pattern - - :param pattern: a list of integers, where each element is the input axis of - that output axis. An element could also be 'x' for creating a new axis - with shape 1 - :param ndim: number of input dimensions; 0 to be inferred from pattern; - this is required only for grad - """ - config = _helper.gen_config(name, comp_node, config) - if not isinstance(pattern, (list, tuple)): - raise TypeError('could not convert {} to dimshuffle pattern'.format( - pattern)) - pattern_mgb = _mgb._VectorInt() - for i in pattern: - if i == 'x': - pattern_mgb.push_back(-1) - else: - i = int(i) - assert i >= 0 - pattern_mgb.push_back(i) - return _mgb._Opr.dimshuffle(src, pattern_mgb, int(ndim), config) - -def param_pack_split(src, shapes, *, - name=None, comp_node=None, config=None): - """ - split param into a list of tensor for given shape - ParamPackSplit operator has a input: ``src`` and would - have a ``output``. output[i] indicates the address of tensor which part of - ``src`` would transfer its elements into. - - Example: a input tensor with size 32, the shapes: ``[(1, 2, 4), (4, 2, 2), - (4, 2, 1)]``, the output tensor would be a list of address with size 3. - output[0] indicates the address of tensor with shapes[0]:(1, 2, 4), - output[1] indicates the address of tensor with shapes[1]:(4, 2, 2), - output[2] indicates the address of tensor with shapes[2]:(4, 2, 1). - - :param src: The concatenated input tensor. - :type src: :class:`SymbolVar` - :param shapes: Shapes of output tensors - :type shapes: list of list of int - """ - config = _helper.gen_config(name, comp_node, config) - - if not isinstance(shapes, (list, tuple)): - raise TypeError('could not convert {} to tensor shapes'.format( - shapes)) - - shapes_mgb = _mgb._VectorTensorShape() - - for s in shapes: - s = tuple(map(int, s)) - assert min(s) > 0 - shapes_mgb.push_back(s) - - return _mgb._Opr.param_pack_split(src, shapes_mgb, config) - -class _modify_subtensor_helper: - def __init__(self, dest, val, *, name=None, comp_node=None, config=None): - self.dest = dest - self.val = val - self.config = _helper.gen_config(name, comp_node, config) - - def __getitem__(self, idx): - inp = _mgb._VectorSymbolVar() - dest, desc = _helper.cvt_getitem_to_idx_desc( - self.dest, idx, allow_newaxis=False) - assert desc is not None, 'no __getitem__ entries given' - inp.push_back(dest) - inp.push_back(self.val) - return _mgb._create_subtensor_like_opr( - self._opr_name, inp, desc, self.config) - -class set_subtensor(_modify_subtensor_helper): - """a proxy object which supports ``__getitem__`` to set subtensor. - ``c = set_subtensor(a, b)[idx]`` is equivalent to the numpy - expression:: - - c = a.copy() - c[idx] = b - - """ - _opr_name = 'set_subtensor' - - -class incr_subtensor(_modify_subtensor_helper): - """a proxy object which supports ``__getitem__`` to increase subtensor. - ``c = incr_subtensor(a, b)[idx]`` is equivalent to the numpy - expression:: - - c = a.copy() - c[idx] += b - """ - _opr_name = 'incr_subtensor' - -class mesh_indexing: - """ Extract elements from given tensor by the coordinates which is - Cartesian product of given index; example:: - - mesh_indexing(x)[:, [2, 3], :, [2, 3, 4]] - """ - - def __init__(self, src, *, name=None, comp_node=None, config=None): - self.src = src - self.config = _helper.gen_config(name, comp_node, config) - - - def __getitem__(self, idx): - inp, desc = _helper.cvt_getitem_to_idx_desc(self.src, idx) - if desc is None: - return inp - return _mgb._create_subtensor_like_opr( - 'mesh_indexing', [inp], desc, self.config) - -class batched_mesh_indexing: - """ Similar to :class:`mesh_indexing`, while the k-th position of - slices is a 2-dim matrix `matrix[k]`. - The `matrix[k] is a list of index. The i-th row `matrix[k][i]` - represents the index of the associated k-th position slice when - `batch_idx == i` ; example:: - - batched_mesh_indexing(x)[:, [[1, 2], [2, 3]], 1:-1:-1] - - .. warning:: - The first dimension of slices must be (start, stop, step) like, - cannot be any of SymbolVar, numpy.array, Python list. - And the shape of other indexs must be (n, x) while n is the length - of first dimension of tensor after applying [start:stop:step] - - """ - - def __init__(self, src, *, name=None, comp_node=None, config=None): - self.src = src - self.config = _helper.gen_config(name, comp_node, config) - - - def __getitem__(self, idx): - inp, desc = _helper.cvt_getitem_to_idx_desc(self.src, idx) - if desc is None: - return inp - return _mgb._create_subtensor_like_opr( - 'batched_mesh_indexing', [inp], desc, self.config) - -class incr_mesh_indexing(_modify_subtensor_helper): - _opr_name = 'incr_mesh_indexing' - -class set_mesh_indexing(_modify_subtensor_helper): - _opr_name = 'set_mesh_indexing' - -class batched_incr_mesh_indexing(_modify_subtensor_helper): - _opr_name = 'batched_incr_mesh_indexing' - -class batched_set_mesh_indexing(_modify_subtensor_helper): - _opr_name = 'batched_set_mesh_indexing' - -class advanced_indexing: - """wrapper for numpy-like advanced indexing, where a non-slice index can be - a vector; example:: - - advanced_indexing(x)[:, [2, 3]] - - """ - def __init__(self, src, *, name=None, comp_node=None, config=None): - self.src = src - self.config = _helper.gen_config(name, comp_node, config) - - def __getitem__(self, idx): - inp, desc = _helper.cvt_getitem_to_idx_desc(self.src, idx) - if desc is None: - return inp - return _mgb._create_subtensor_like_opr( - 'mavi', [inp], desc, self.config) - -class set_advanced_indexing(_modify_subtensor_helper): - """:class:`set_subtensor` equivalent with advanced-indexing support""" - _opr_name = 'set_mavi' - - -class incr_advanced_indexing(_modify_subtensor_helper): - """:class:`incr_subtensor` equivalent with advanced-indexing support""" - _opr_name = 'incr_mavi' - - -def mean(inp, axis, keepdims): - """average value along an axis""" - if hasattr(inp.dtype, 'metadata'): - return reduce_(inp, 'MEAN', axis, keepdims) - else: - s = reduce_(inp, 'SUM', axis, keepdims) - if axis is None: - cnt = inp.shape.prod() - else: - cnt = inp.axis_shape(axis) - return s / cnt - -def square(inp): - """*inp* squared""" - return inp ** 2 - -def sqrt(inp): - """square root""" - return inp ** 0.5 - - -class _LoopDescMakerCallback(_mgb._LoopDescMakerCallback): - def __init__(self, func): - super().__init__() - assert isinstance(func, collections.Callable) - self._func = func - self.__disown__() - - def call(self, desc): - self._func(desc) - - -def make_loop(desc_maker, *, - swap_interval=-5, name=None, comp_node=None, config=None): - """Create a loop operator. The loop operator works in the following way: - - 1. Copy variables specified by :meth:`.LoopDesc.add_input` from the parent - graph into the sub graph. - 2. Evaluates the loop condition. - 3. If the absolute value of the loop condition is no more than 1e-6, go to - 5. - 4. Update variables in the sub graph using rules specified by - :meth:`.LoopDesc.assign` and then go to 2 again. - 5. Copy values of output variables given by :meth:`.LoopDesc.add_output` - into the parent graph and exit. - - The loop operator could be thought of as a digital circuit, where the sub - graph (which must be purely functional) is the combinational logic part and - the :meth:`.LoopDesc.assign` rules serve as the flip-flops. - - :type desc_maker: callable - :param desc_maker: a function to create the loop descriptor; it would - receive a :class:`.LoopDesc` object and should call methods on it to - describe the sub graph. This function may be called multiple times, and - it should behave exactly the same in every call. - - :type swap_interval: int - :param swap_interval: number of loop executions between swapping saved - mutable states to host; larger *swap_interval* requires more memory and - less copy stall. If *swap_interval* is negative, then statically - inferred loop time would be used if possible; otherwise its absolute - value would be used as swap interval. - - :rtype: list of :class:`.SymbolVar` - :return: the output vars, corresponding to each - :meth:`.LoopDesc.add_output` call. - """ - config = _helper.gen_config(name, comp_node, config) - return _mgb._make_loop(_LoopDescMakerCallback(desc_maker), swap_interval, - config) - -def symvar_from_shared_nd(sv, comp_graph, name=None): - """get a symbol var in a computing graph that represents a shared (i.e. - pre-allocated) value on device - - :param sv: the shared value - :type sv: :class:`.SharedND` - :param comp_graph: the computing graph to which this symvar should belong - :type graph: :class:`.CompGraph` - :param name: the name of resulting symvar - :type name: str or None - :rtype: :class:`.SymbolVar` - """ - assert isinstance(sv, _mgb.SharedND) - return sv.symvar(comp_graph, name) - -def zero_grad(sv, **kwargs): - return set_grad(sv, None, **kwargs) - -# for backward pickle compatiblility -def _make_enum_unpickle(new_enum): - """create a class that can be used for unpickling old enum values""" - class OldEnum: - def __new__(cls, value): - return new_enum[value] - return OldEnum - - - -ConvMode = _make_enum_unpickle(_opr_param_defs.Convolution.Mode) -PoolingMode = _make_enum_unpickle(_opr_param_defs.Pooling.Mode) -ROIPoolingMode = _make_enum_unpickle(_opr_param_defs.ROIPooling.Mode) -WarpPerspectiveBorderMode = _make_enum_unpickle( - _opr_param_defs.WarpPerspective.BorderMode) -WarpPerspectiveInterpMode = _make_enum_unpickle( - _opr_param_defs.WarpPerspective.InterpolationMode) diff --git a/python_module/src/swig/callback.i b/python_module/src/swig/callback.i deleted file mode 100644 index d5953a13..00000000 --- a/python_module/src/swig/callback.i +++ /dev/null @@ -1,215 +0,0 @@ -/* - * $File: callback.i - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * $Copyright: Copyright (c) 2014-2017 Megvii Inc. All rights reserved. - */ - -%feature("autodoc", -"""It is used to be passed as arguments to callbacks (used in -:meth:`.CompGraph.compile`, :func:`.callback_injector`, and -:meth:`.CraniotomeBase.execute`). Object of this type could also be directly -passed to :meth:`.SharedND.set_value`, to bypass some host and device -communication. Note that the underlying buffer may be reused after the callback -returns, so reference to this object should not be passed outside of the -callback, and :meth:`get_value` should be called immediately if the numerical -value is needed.""") -CompGraphCallbackValueProxy; - -class CompGraphCallbackValueProxy { - public: - - PyObject* _get_npyarr(); - PyObject* _get_dtype(); - std::vector _get_shape(); - - uintptr_t _pubapi_dev_tensor_ptr(int version); - CompNode _get_comp_node(); - - %pythoncode{ - - @property - def shape(self): - """get shape of the var - - :type: tuple of int - """ - return tuple(map(int, self._get_shape())) - - @property - def comp_node(self): - """get comp node of the var - - :type: :class:`.CompNode` - """ - return self._get_comp_node() - - @property - def dtype(self): - """get data type of the var - - :type: :class:`.numpy.dtype` - """ - return self._get_dtype() - - def get_value(self, *, borrow_mem=False): - """get value as numpy array - - :param borrow_mem: whether to forward internal buffer with - zero-copy; if True, the content in returned buffer would be - modified directly by asynchronous graph execution. - """ - ret = self._get_npyarr() - if not borrow_mem: - ret = ret.copy() - return ret - - @property - def dev_ptr(self): - """this method is DEPRECATED; use :meth:`pubapi_dev_tensor_ptr` - instead""" - return self._pubapi_dev_tensor_ptr(0) - - @property - def pubapi_dev_tensor_ptr(self): - """get a pointer to the corresponding mgb::pubapi::DeviceTensor object - - :rtype: int - :return: the address as an integer - """ - return self._pubapi_dev_tensor_ptr(1) - } -}; -%template(_VectorCompGraphCallbackValueProxy) - std::vector; - -%feature("director") _CompGraphCallback; -class _CompGraphCallback { - public: - _CompGraphCallback(); - - void set_eager_copy(bool flag); - - virtual ~_CompGraphCallback(); - virtual void call(std::vector &value) = 0; -}; - -%feature("director") _SplitPartCallback; -class _SplitPartCallback { - public: - _SplitPartCallback(); - virtual ~_SplitPartCallback(); - - virtual std::vector call(size_t tot_size) = 0; -}; - -%feature("director") _SetGradCallback; -class _SetGradCallback { - public: - _SetGradCallback(); - virtual ~_SetGradCallback(); - - virtual SymbolVar call(CompGraph &graph) = 0; - virtual bool empty() = 0; -}; - -%feature("director") _TimeoutCallback; -class _TimeoutCallback { - public: - _TimeoutCallback(); - virtual ~_TimeoutCallback(); - - virtual bool call() = 0; -}; - -%pythoncode{ -import collections -import inspect -from .mgb_helper import callback_lazycopy - -class _CompGraphCallbackPyWrapper(_CompGraphCallback): - """wraps around a callable to be used as comp graph callback""" - - def __init__(self, f): - super().__init__() - if isinstance(f, callback_lazycopy): - f = f.func - self.set_eager_copy(False) - else: - self.set_eager_copy(True) - assert isinstance(f, collections.Callable) - self._func = f - self.__disown__() - - def call(self, value): - if value.size() == 1: - self._func(value[0]) - else: - self._func(value) - - -_CompGraphCallbackPyWrapperNoEager = lambda f: ( - _CompGraphCallbackPyWrapper(callback_lazycopy(f))) - -class _SplitPartCallbackPyWrapper(_SplitPartCallback): - def __init__(self, f): - super().__init__() - assert isinstance(f, collections.Callable) - self._func = f - self.__disown__() - - def call(self, size): - return tuple(map(int, self._func(size))) - - -class _SetGradCallbackPyWrapper(_SetGradCallback): - def __init__(self, f): - super().__init__() - if f is None: - self._func = None - else: - assert isinstance(f, collections.Callable) - nr_arg = len(list(filter( - lambda x: ( - x.kind == inspect.Parameter.POSITIONAL_OR_KEYWORD and - x.default == inspect.Parameter.empty), - inspect.signature(f).parameters.values()))) - if not nr_arg: - f = lambda graph, f0=f: f0() - else: - assert nr_arg == 1, 'bad callback for SetGrad: {}'.format(f) - self._func = f - - self.__disown__() - - def call(self, graph): - if self._func is None: - return SymbolVar() - - ret = self._func(graph) - if ret is None: - ret = SymbolVar() - else: - assert isinstance(ret, SymbolVar), ( - 'bad return value for var maker: {!r}'.format(ret)) - return ret - - def empty(self): - return self._func is None - - -class _TimeoutCallbackPyWrapper(_TimeoutCallback): - def __init__(self, f): - super().__init__() - assert isinstance(f, collections.Callable) - self._func = f - self.__disown__() - - def call(self): - return bool(self._func()) - - -} // %pythoncode - -// vim: ft=swig diff --git a/python_module/src/swig/comp_graph.i b/python_module/src/swig/comp_graph.i deleted file mode 100644 index 80c05586..00000000 --- a/python_module/src/swig/comp_graph.i +++ /dev/null @@ -1,87 +0,0 @@ -/* - * $File: comp_graph.i - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * $Copyright: Copyright (c) 2014-2017 Megvii Inc. All rights reserved. - */ - - -%pythoncode{ -from .mgb_helper import copy_output, FuncOutputSaver -import json -} // pythoncode - -%feature("autodoc", """a callable object compiled from :class:`CompGraph`. - -.. note:: - - Only the most recently compiled AsyncExec object can be used. -""") AsyncExec; -%feature("autodoc", """explicitly release the underlying staticially allocated -device memory""") AsyncExec::clear_device_memory; -class AsyncExec { - public: - AsyncExec() = delete; - - void _execute(); - void _wait(); - double _get_prev_exec_time(); - std::string _to_json_str(); - SymbolVarArray _find_mutable_input(); - std::vector> - _update_static_alloc_plan_and_get_size(); - - void clear_device_memory(); - - %include "comp_graph_impl_AsyncExec.py" -}; - -%template(_VectorAsyncExec) std::vector; - -%feature("autodoc", """use device memory manager in another computing graph to -manage memory of this graph, so their memories can be shared. This is safe only -when :class:`AsyncExec` compiled from these graphs do not run concurrently.""") -CompGraph::share_device_memory_with; -%feature("valuewrapper") CompGraph; -class CompGraph { - public: - CompGraph(); - - AsyncExec _do_compile(bool copy, bool optimize_for_inference); - std::vector _do_compile_multi_part(); - void _add_output_spec(SymbolVar &var, _CompGraphCallback *callback); - void _add_multi_part_endpoint(); - void _clear_output_spec(); - size_t _release(); - - CompGraph& share_device_memory_with(CompGraph &other); - - PyObject* _user_data(); - void clear_device_memory(); - - %extend { - size_t _id() const { - return $self->get().id(); - } - - size_t _get_ptr_addr() const { - return reinterpret_cast(&$self->get()); - } - - std::string get_mem_allocation_info() const { - return self->get().get_mem_allocation_info(); - } - - std::string __repr__() const { - auto &&graph = $self->get(); - return mgb::ssprintf("", graph.id(), &graph); - } - } - - %include "comp_graph_impl_CompGraph.py" -}; - -%include "comp_graph_tools.i" - -// vim: ft=swig diff --git a/python_module/src/swig/comp_graph_impl_AsyncExec.py b/python_module/src/swig/comp_graph_impl_AsyncExec.py deleted file mode 100644 index 28836c13..00000000 --- a/python_module/src/swig/comp_graph_impl_AsyncExec.py +++ /dev/null @@ -1,229 +0,0 @@ -%pythoncode { - -_var2output_saver = None -"""map from var id to corresponding output saver; setup by -:meth:`.CompGraph.compile`""" - -_expand_single_output = False -"""whether output contains only a single element and it should not be wrapped -by a list; setup by :meth:`.CompGraph.compile`""" - -__output_savers = None -"""list of (symvar, output saver)""" - -__inputs = None -"""list of (symvar, _HostSharedND.make_proxy(symvar)) pairs""" - -__allow_args_input = None - -__warned_unused_keys = None - -__auto_wait_enabled = True - -callbefore_func = None - -callback_func = None - -def __normalize_var_list(self, vlist): - if len(vlist) == 1: - vlist, = vlist - if isinstance(vlist, SymbolVar): - return [vlist] - ret = [] - for i in vlist: - assert isinstance(i, SymbolVar) - ret.append(i) - return ret - -def _setup_args(self, args, kwargs): - if kwargs: - assert not args, 'should not provide both args and kwargs' - for symvar, hsv in self.__inputs: - val = kwargs.pop(symvar.name, None) - assert val is not None, ( - 'missing input at runtime: {}'.format(symvar)) - hsv.set_value(val, borrow=self.__auto_wait_enabled) - - if kwargs: - keys = set(kwargs.keys()) - if keys != self.__warned_unused_keys: - from .logconf import get_logger - logger = get_logger() - logger.warning( - 'extra kwargs provided for megbrain AsyncExec: {}'.format( - keys)) - self.__warned_unused_keys = keys - return - - assert not args or self.__allow_args_input, ( - 'pass non-keyword args to function compiled without' - ' inputs spec') - assert len(args) == len(self.__inputs), ( - 'inputs do not match: args={} needed={}'.format( - args, [i[0] for i in self.__inputs])) - for (symvar, hsv), val in zip(self.__inputs, args): - hsv.set_value(val, borrow=self.__auto_wait_enabled) - -def enable_borrow_on_cpu(self, flag=True): - """whether to allow borrow input tensor memory on CPU; if set to True, then - the user should ensure that memory buffers of input tensors are unchanged. - - This is set to False by default. - """ - for _, i in self.__inputs: - i.enable_borrow_on_cpu(flag) - -def __call__(self, *args, **kwargs): - """Execute the function; either one of positional arguments or keyword - arguments must be given. Set :attr:`inputs` to change the order of - positional arguments. The keys in keyword arguments are the names of input - symvars - - :return: if auto wait is disabled, the return value would be - :class:`FuncOutputSaver` objects corresponding to the vars marked by - :class:`copy_output`; if auto wait is enabled, the numerical values as - :class:`numpy.ndarray` would be returned. - """ - if self.callbefore_func: - if not callable(self.callbefore_func): - raise TypeError( - "callbefore func must be callable: {}".format(self.callbefore_func)) - self.callbefore_func() - self._setup_args(args, kwargs) - self._execute() - if self.callback_func: - if not callable(self.callback_func): - raise TypeError( - "callback func must be callable: {}".format(self.callback_func)) - self.callback_func() - if self.__auto_wait_enabled: - self.wait() - - if not self.__output_savers: - return - ret = [] - if self.__auto_wait_enabled: - for _, i in self.__output_savers: - ret.append(i.get()) - else: - for _, i in self.__output_savers: - ret.append(i) - if self._expand_single_output: - ret, = ret - return ret - -def wait(self): - """wait for previous async exec to finish; wait is needed (i.e. the - function runs in async mode) only when there is no output callback (i.e. - all outputs are given by dest symvar only), or :meth:`disable_auto_wait` is - called explicitly. - - :return: self""" - self._wait() - return self - -@property -def prev_exec_time(self): - """previous execution time in seconds""" - return self._get_prev_exec_time() - -@property -def inputs(self): - """get input vars needed at runtime, in the order as the values that should - be passed to :meth:`__call__` - - :setter: Set the order of input vars, which must be created by - :func:`.make_arg`. None could also given, and in such case only keyword - arguments would be allowed for :meth:`__call__` - - :type: tuple of :class:`.SymbolVar` - """ - return tuple(i[0] for i in self.__inputs) - -@inputs.setter -def inputs(self, *inputs): - if self.__inputs is None: - needed = tuple(self._find_mutable_input()) - used_names = set() - for i in needed: - assert i.name not in used_names, ( - 'duplicated input name: {}'.format(i.name)) - used_names.add(i.name) - self.__inputs = [(i, _HostSharedND.make_proxy(i)) for i in needed] - - if len(inputs) == 1 and inputs[0] is None: - self.__allow_args_input = False - return - - inputs = self.__normalize_var_list(inputs) - inpvar2proxy = dict(self.__inputs) - self.__allow_args_input = True - reordered = [] - for i in inputs: - proxy = inpvar2proxy.pop(i, None) - if proxy is None: - raise TypeError('extra input var provided: {}; needed: {}'.format( - i, self.inputs)) - reordered.append((i, proxy)) - - assert not inpvar2proxy, 'inputs not provided: {}'.format( - list(inpvar2proxy.keys())) - - self.__inputs = reordered - -@property -def available_outputs(self): - """get output vars that could be used to set :attr:`outputs`. The order may - be unstable - - :type: tuple of :class:`.SymbolVar`""" - return tuple(self._var2output_saver.keys()) - -@property -def outputs(self): - """get output vars whose corresponding values would be returned by - :meth:`__call__` - - :setter: set the order of output vars to be returned. Duplicated vars could - be included, but all the vars must have been provided to - :meth`.CompGraph.compile`. - - :type: tuple of :class:`.SymbolVar`""" - if not self.__output_savers: - return - - if self._expand_single_output: - (var, saver), = self.__output_savers - return var - return tuple(var for var, saver in self.__output_savers) - -@outputs.setter -def outputs(self, *outputs): - olist = [] - for var in self.__normalize_var_list(outputs): - saver = self._var2output_saver.get(var) - assert saver is not None, 'var {} is not set to be output var'.format( - var) - olist.append((var, saver)) - self.__output_savers = olist - -def dump(self): - """dump internal graph and execution sequence as - json-serializable object""" - return json.loads(self._to_json_str()) - -def disable_auto_wait(self): - """if there is output callback function, then by default when - :meth:`__call__` is invoked, it would not return until all computation is - finished. This behavior can be changed by disabling auto wait, so the - function returns as early as possible.""" - self.__auto_wait_enabled = False - -def update_static_alloc_plan_and_get_size(self): - """update static memory allocation plan without actual allocation - - :return: a dict that maps from comp node to size of allocation in bytes - """ - return {k: v for k, v in self._update_static_alloc_plan_and_get_size()} - -} diff --git a/python_module/src/swig/comp_graph_impl_CompGraph.py b/python_module/src/swig/comp_graph_impl_CompGraph.py deleted file mode 100644 index 5f87a532..00000000 --- a/python_module/src/swig/comp_graph_impl_CompGraph.py +++ /dev/null @@ -1,191 +0,0 @@ -%pythoncode{ - -@property -def id(self): - """an integer increasing ID""" - return self._id() - -def __eq__(self, rhs): - return isinstance(rhs, CompGraph) and self.id == rhs.id - -def __hash__(self): - return self.id - -@property -def user_data(self): - """get a dict that is associated with this computing graph to store - arbitrary user data""" - return self._user_data() - -def _process_output_spec(self, inputs, outspec): - """process user-provided output spec and add to the output staging list of - this graph - - :return: a callable ``f(func)` to update compiled :class:`.AsyncExec` status - """ - assert outspec - - if isinstance(outspec, copy_output): - outspec = [outspec] - expand_single_output = True - else: - expand_single_output = False - - var2output_saver = {} - output_vars = [] - - for spec in outspec: - if isinstance(spec, copy_output): - var = spec.symvar - output_vars.append(var) - if var in var2output_saver: - continue - - callback = FuncOutputSaver(spec.borrow_mem) - var2output_saver[var] = callback - elif isinstance(spec, SymbolVar): - var = spec - callback = None - else: - var, callback = spec - assert isinstance(var, SymbolVar) - if callback is not None: - callback = _CompGraphCallbackPyWrapper(callback) - self._add_output_spec(var, callback) - - def update(func): - assert isinstance(func, AsyncExec) - func.inputs = inputs - if output_vars: - func._var2output_saver = var2output_saver - func._expand_single_output = expand_single_output - func.outputs = output_vars - - return update - -def compile(self, inputs, outspec, *, copy=False, optimize_for_inference=False): - """Compile the graph to get a callable function for numerical evaluation - - .. warning:: - - If ``compile()`` is called multiple times, only the most recent result - function can be used. - - :type inputs: iterable of :class:`.SymbolVar` or None - :param inputs: specifying the positional parameters to be passed to the - generated function, or use None for keyword params only - :type outspec: iterable of *single_outspec* - :param outspec: specifying how the compiled function should - return outputs. Each *single_outspec* may be one of the - following forms: - - * a pair of (var, callback), the callback would be called during - function execution with a :class:`.CompGraphCallbackValueProxy` - argument corresponding to the given symbolvar. Additionally, - *callback* may be wrapped by :class:`.callback_lazycopy`; see the - its document for details. - * a single :class:`.SymbolVar`, to ensure this var is computed (so - the non-pure operators on its dependency path could take effect) - * a :class:`.copy_output` object, so the var's value would be - copied to the return value of compiled function. If there is one - such spec, the function would be synchronous. - :param copy: whether to copy the graph - :param optimize_for_inference: whether to run - :func:`.optimize_for_inference` on the output vars before compiling - :rtype: :class:`.AsyncExec` - """ - - self._clear_output_spec() - ret_update = self._process_output_spec(inputs, outspec) - ret = self._do_compile(copy, optimize_for_inference) - ret_update(ret) - return ret - -def compile_outonly(self, outputs, *, inputs=None): - """compile for only output; (almost) equavalent to - ``self.compile(inputs, [copy_output(i) for i in outputs])`` - - :type outputs: :class:`.SymbolVar` or list of - :class:`.SymbolVar` - :param outputs: the output symbol vars - """ - if isinstance(outputs, SymbolVar): - outputs = copy_output(outputs) - else: - assert isinstance(outputs, collections.Iterable), ( - '{} not iterable'.format(outputs)) - outputs = [copy_output(i) for i in outputs] - - return self.compile(inputs, outputs) - -def compile_multi_part(self, io_specs): - """Compile multiple functions for partial execution. Each function would - only execute the oprs necessary to compute current outspec, and intermediate - results from previous functions are reused. The functions would share - underlying device storage with this graph. - - .. warning:: - - Each individual partial function would have a newly created computing - graph. Therefore plugins attached on this graph would not be effective - on the partial functions. - - :param io_specs: input/output specifications as a list of - ``(inputs, outspec)`` pairs. Each pair is defined as the params of - :meth:`compile`. - :return: a list of :class:`.AsyncExec` objects as the functions - corresponding to each part - """ - self._clear_output_spec() - updaters = [] - for inputs, outspec in io_specs: - updaters.append(self._process_output_spec(inputs, outspec)) - self._add_multi_part_endpoint() - funcs = self._do_compile_multi_part() - for i, j in zip(funcs, updaters): - j(i) - return funcs - -def make_shared(self, comp_node, *, dtype=None, - shape=None, value=None, name=None, volatile=False): - """make a shared value belonging to this comp graph; see - :func:`.make_shared`""" - from . import make_shared - return make_shared(comp_node, dtype=dtype, shape=shape, value=value, - comp_graph=self, name=name, volatile=volatile) - -def make_immutable(self, comp_node, value, *, dtype=None, name=None): - """make an immutable value belonging to this comp graph; see - :func:`.make_immutable`""" - from . import make_immutable - return make_immutable(comp_node, self, value, dtype=dtype, name=name) - -def make_arg(self, comp_node, *, dtype=np.float32, shape=None, name=None, - value=None): - """make a runtime argument belonging to this comp graph; see - :func:`.make_arg`""" - from . import make_arg - return make_arg(comp_node, self, dtype=dtype, shape=shape, name=name, - value=value) - -def set_option(self, name, val): - """set comp graph option; see :func:`.set_comp_graph_option`""" - from .config import set_comp_graph_option - return set_comp_graph_option(self, name, val) - -def is_eager(self): - """return True if comp_graph is in eager mode""" - from .config import comp_graph_is_eager - return comp_graph_is_eager(self) - -def release(self): - """explicitly release the underlying computing graph storage; this is - mostly useful in eager evaluation mode, since doing so would release the - underlying device storage - - :return: original reference count before release - :rtype: int - """ - return int(self._release()) - -} diff --git a/python_module/src/swig/comp_graph_tools.i b/python_module/src/swig/comp_graph_tools.i deleted file mode 100644 index 7f6262df..00000000 --- a/python_module/src/swig/comp_graph_tools.i +++ /dev/null @@ -1,55 +0,0 @@ -%{ -#include "megbrain/gopt/framework.h" -%} - -%inline { - - SymbolVarArray _get_owner_opr_inputs(SymbolVar var) { - mgb_assert(var.node()); - return mgb::cg::to_symbol_var_array(var.node()->owner_opr()->input()); - } - - std::string _get_owner_opr_type(SymbolVar var) { - mgb_assert(var.node()); - return var.node()->owner_opr()->dyn_typeinfo()->name; - } - - std::string _get_opr_type(Operator opr) { - return opr.node()->dyn_typeinfo()->name; - } - - SymbolVarArray _replace_vars(const SymbolVarArray& repl_src, - const SymbolVarArray& repl_dst, - const SymbolVarArray& vars) { - mgb::ThinHashMap varmap; - for (size_t i = 0; i < repl_src.size(); ++i) { - varmap[repl_src[i]] = repl_dst[i]; - } - return mgb::cg::replace_vars(vars, varmap); - } - - typedef std::vector OperatorArray; - SymbolVarArray _replace_oprs(const OperatorArray& repl_src, - const OperatorArray& repl_dst, - const SymbolVarArray& vars) { - mgb::ThinHashMap - oprmap; - for (size_t i = 0; i < repl_src.size(); ++i) { - oprmap[repl_src[i].node()] = repl_dst[i].node(); - } - return mgb::cg::replace_oprs(vars, oprmap); - } - - void _set_priority_to_id(const SymbolVarArray& dest_vars) { - auto on_opr = [](mgb::cg::OperatorNodeBase* opr) { - if (opr->node_prop().attribute().priority == 0) { - opr->node_prop().attribute().priority = opr->id(); - } - }; - mgb::cg::DepOprIter dep_iter{on_opr}; - for (const SymbolVar& var : dest_vars) { - dep_iter.add(var); - } - } -} -// vim: ft=swig foldmethod=marker foldmarker=f{{{,f}}} diff --git a/python_module/src/swig/comp_node.i b/python_module/src/swig/comp_node.i deleted file mode 100644 index 708cd34f..00000000 --- a/python_module/src/swig/comp_node.i +++ /dev/null @@ -1,165 +0,0 @@ -/* - * $File: comp_node.i - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * $Copyright: Copyright (c) 2014-2017 Megvii Inc. All rights reserved. - */ - -%{ -using mgb::CompNode; -static CompNode::DeviceType str2device_type( - const std::string &str, bool allow_unspec) { - using T = CompNode::DeviceType; - if (str == "CPU") { - return T::CPU; - } else if (str == "CUDA" || str == "GPU") { - return T::CUDA; - } else { - mgb_assert(allow_unspec && str == "XPU", "bad device type: %s; which " - "must be either CPU, GPU or XPU", str.c_str()); - return T::UNSPEC; - } -} -%} - -class CompNode { - public: - static CompNode load(const char* id); - - %extend { - static std::vector _parse_locator(const std::string &id) { - auto logi = CompNode::Locator::parse(id); - return { - static_cast(logi.type), logi.device, logi.stream, - }; - } - static void _set_device_map(const std::string &type, - int from, int to) { - CompNode::Locator::set_device_map( - str2device_type(type, false), from, to); - } - - static size_t _get_device_count(const std::string &type, bool warn) { - return CompNode::get_device_count(str2device_type(type, true), warn); - } - - static void _set_unspec_device_type(const std::string &type) { - CompNode::Locator::set_unspec_device_type( - str2device_type(type, false)); - } - - static void _try_coalesce_all_free_memory() { - CompNode::try_coalesce_all_free_memory(); - } - - bool _check_eq(const CompNode &rhs) const { - return (*$self) == rhs; - } - - std::vector _get_locator() const { - auto logi = $self->locator_logical(), phys = $self->locator(); - return { - static_cast(logi.type), logi.device, logi.stream, - static_cast(phys.type), phys.device, - phys.stream, - }; - } - - std::string __getstate__() { - return $self->to_string_logical(); - } - - std::string __str__() { - return $self->to_string(); - } - - std::string __repr__() { - return mgb::ssprintf("CompNode(\"%s\" from \"%s\")", - $self->to_string().c_str(), - $self->to_string_logical().c_str()); - } - - size_t _get_mem_align_() const { - return $self->get_mem_addr_alignment(); - } - - size_t __hash__() { - return mgb::hash(*$self); - } - - std::pair _get_mem_status_bytes() { - return $self->get_mem_status_bytes(); - } - } - - %pythoncode { - DEVICE_TYPE_MAP = { - 0: 'XPU', - 1: 'CUDA', - 2: 'CPU' - } - - cn_thread_local = threading.local() - """used to save map location when calling :func:`mge.load()`""" - - def __setstate__(self, state): - """:func:`mge.load()` and :func:`deepcopy()` call this function, - The latter will not produce the map_location attribute""" - if "map_location" in CompNode.cn_thread_local.__dict__.keys(): - state = CompNode.cn_thread_local.map_location(state) - self.this = CompNode_load(state).this - - def __eq__(self, rhs): - return isinstance(rhs, CompNode) and self._check_eq(rhs) - - @property - def mem_align(self): - """memory alignment in bytes""" - return self._get_mem_align_() - - @property - def locator_logical(self) -> [str, int, int]: - """logical locator: a tuple containing (type, device, stream)""" - t, d, s = self._get_locator()[:3] - return self.DEVICE_TYPE_MAP[t], d, s - - @property - def locator_physical(self) -> [str, int, int]: - """physical locator: a tuple containing (type, device, stream)""" - t, d, s = self._get_locator()[3:] - return self.DEVICE_TYPE_MAP[t], d, s - - @property - def mem_status_bytes(self) -> [int, int]: - """get (total, free) memory on the computing device in bytes. - - Free memory includes memory chunks that buffered by the memory manager. - - Please note that the results are the same for different CompNode within same device. - """ - return self._get_mem_status_bytes() - } -}; -%template(_VectorCompNode) std::vector; -%template(_VectorCompNodeAndSize) std::vector>; - -%pythoncode { - -def as_comp_node(desc): - """create a :class:`.CompNode` by desc - - :type desc: str or :class:`.CompNode` - :param desc: if str, an id describing the comp node, like 'gpu0', 'gpu1'. A - special id 'gpux' represents the logical default comp node. Otherwise - it should already be a :class:`.CompNode`. - """ - if isinstance(desc, str): - return CompNode_load(desc) - assert isinstance(desc, CompNode), ( - 'could not convert {} to CompNode'.format(desc)) - return desc - -} - -// vim: ft=swig diff --git a/python_module/src/swig/craniotome.i b/python_module/src/swig/craniotome.i deleted file mode 100644 index adff8c4d..00000000 --- a/python_module/src/swig/craniotome.i +++ /dev/null @@ -1,88 +0,0 @@ -/* - * $File: craniotome.i - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * $Copyright: Copyright (c) 2014-2017 Megvii Inc. All rights reserved. - */ - -%{ -#include "craniotome.h" -%} - -typedef std::vector> TensorShapeVec; -%template(_VectorTensorShape) std::vector>; - -%feature("director") CraniotomeDesc; -class CraniotomeDesc { - - public: - virtual ~CraniotomeDesc() = default; - - virtual void _setup_self(PyObject *result) const = 0; - - virtual bool _is_same(PyObject *rhs) const = 0; - - virtual uint32_t _node_flag() const = 0; - - virtual size_t _hash() const = 0; - - virtual std::string _get_opr_type_name() = 0; - - virtual size_t _get_nr_outputs() = 0; - - virtual void _execute( - const std::vector &inputs, - std::vector &outputs) = 0; - - virtual TensorShapeVec _infer_shape( - const TensorShapeVec &inp_shape) = 0; - - virtual SymbolVarArray _grad( - size_t wrt_idx, - const SymbolVarArray &inputs, - const SymbolVarArray &outputs, - const SymbolVarArray &out_grad) = 0; - - virtual size_t _get_nr_dev_comp_order_deps() = 0; - - SymbolVarArray _get_all_io_vars(); - - virtual bool _init_output_dtype( - PyObject *input_dtypes, PyObject *result) = 0; - - virtual CompGraph _get_comp_graph() = 0; - - virtual void _copy() const = 0; - void _set_copy_result(CraniotomeDesc *result); - - virtual void _setup_serialize_params(PyObject *output) const = 0; - - virtual void _on_graph_compile_or_func_del( - const std::vector& used_outputs) = 0; - - %extend { - CompNode _get_comp_node() { - mgb_assert($self->owner_opr); - return $self->owner_opr->comp_node(); - } - - size_t _get_opr_id() { - mgb_assert($self->owner_opr); - return $self->owner_opr->id(); - } - } -}; - -%inline { - static SymbolVarArray make_opr_from_craniotome_desc( - CraniotomeDesc *desc, - const SymbolVarArray inputs, - const OperatorNodeConfig &config) { - - return mgb::opr::Craniotome::make( - std::unique_ptr(desc), inputs, config); - } -} - -// vim: ft=swig diff --git a/python_module/src/swig/loop.i b/python_module/src/swig/loop.i deleted file mode 100644 index 0a094d2d..00000000 --- a/python_module/src/swig/loop.i +++ /dev/null @@ -1,134 +0,0 @@ -/* - * $File: loop.i - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * $Copyright: Copyright (c) 2014-2017 Megvii Inc. All rights reserved. - */ - -%{ -#include "megbrain/opr/loop.h" -#include -using LoopDesc = mgb::opr::Loop::Desc; -%} - -%feature("autodoc", -"""An object used by callbacks for :func:`.make_loop` to describe the sub graph in -loop operator. See docs of :func:`.make_loop` for more explanation. -""") LoopDesc; - -%feature("autodoc", -"""forward a variable belonging to the parent graph into the sub graph - -:type input: :class:`.SymbolVar` -:param input: a variable in the parent graph -:type has_assign: bool -:param has_assign: whether this input var would be assigned later -:rtype: :class:`.SymbolVar` -:return: the corresponding variable in the sub graph -""") LoopDesc::add_input; - -%feature("autodoc", -"""instructs that value of a variable in the sub graph should be replaced by -the new value at the end of each loop. - -:type dest: :class:`.SymbolVar` -:param dest: the variable to be updated. It must be a return value of - :meth:`add_input`. -:type val: :class:`.SymbolVar` -:param val: the new value -:return: self to be chained -""") LoopDesc::assign; - -%feature("autodoc", -"""set a variable to indicate whether the loop should be repeated. - -:type cond: :class:`.SymbolVar` -:param cond: loop would be repeated if the absolute value of *cond* is more - than 1e-6; It must evaluates to a scalar. -:return: self to be chained -""") LoopDesc::set_loop_condition; - -%feature("autodoc", -"""get the loop counter, which would indicate current loop count, starting from zero. - -:rtype: :class:`.SymbolVar` -:return: the loop counter -""") LoopDesc::get_counter_var; - -%feature("autodoc", -"""mark a variable to be copied as output value of the loop operator. - -:type var: :class:`.SymbolVar` -:param var: a variable in sub graph whose value should be copied into the - parent graph -:type mode: str -:param mode: output mode; possible values are: - - * ``'last'``: only the last value would be recorded - * ``'all'``: all the value would be recorded; shape of the variable should - not change during looping, and the output var would be prepended with an - extra leading dimension to index the loop count. - * ``'sum'``: sum of all values of this variable during looping would be - copied to output - * ``'product'``: product of all values of this variable during looping - would be copied to output -:rtype: int -:return: call id, starting at 0 and increasing continuously -""") LoopDesc::add_output; - -class LoopDesc { - public: - LoopDesc() = delete; - ~LoopDesc() = delete; - - SymbolVar add_input(SymbolVar input, bool has_assign = false); - LoopDesc& assign(SymbolVar dest, SymbolVar val); - LoopDesc& set_loop_condition(SymbolVar cond); - SymbolVar get_counter_var(); - - %extend { - size_t add_output(SymbolVar& var, std::string mode) { - using Desc = mgb::opr::Loop::Desc; - auto get_mode = [&]() { - using OM = Desc::OutputMode; - for (char &i: mode) - i = std::tolower(i); - if (mode == "last") - return OM::LAST; - if (mode == "all") - return OM::ALL; - if (mode == "sum") - return OM::SUM; - throw mgb::MegBrainError( - mgb::ssprintf("unrecognized loop mode: %s", - mode.c_str())); - }; - return $self->add_output(var, get_mode()); - } - } - -}; - -%feature("director") _LoopDescMakerCallback; -%inline { - class _LoopDescMakerCallback { - public: - virtual ~_LoopDescMakerCallback() = default; - virtual void call(LoopDesc &desc) = 0; - }; - - static SymbolVarArray _make_loop( - _LoopDescMakerCallback* callback, int swap_interval, - const OperatorNodeConfig &config) { - - std::shared_ptr<_LoopDescMakerCallback> callbackptr{callback}; - - auto desc_maker = [callbackptr](mgb::opr::Loop::Desc &loop_desc) { - callbackptr->call(loop_desc); - }; - return mgb::opr::Loop::make(desc_maker, swap_interval, config); - } -} // %inline - -// vim: ft=swig diff --git a/python_module/src/swig/mgb.i b/python_module/src/swig/mgb.i deleted file mode 100644 index 3a2c871d..00000000 --- a/python_module/src/swig/mgb.i +++ /dev/null @@ -1,71 +0,0 @@ -/* - * $File: mgb.i - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * $Copyright: Copyright (c) 2014-2017 Megvii Inc. All rights reserved. - */ - -%include "symbol_var_array.i" - -%include "mgb_exception.i" -%module(directors="1") mgb -%{ -#define SWIG_FILE_WITH_INIT 1 -void mgb_init_numpy(); // implemented in python_helper.cpp -void _init_intbx_types(PyObject *m); // implemented in intbx.cpp -void _init_bfloat16_types(PyObject *m); // implemented in bfloat16.cpp -%} - -%init %{ - mgb_init_numpy(); - _init_intbx_types(m); - _init_bfloat16_types(m); -%} - -%include "std_vector.i" -%include "std_pair.i" -%include "stdint.i" -%template(_VectorSizeT) std::vector; -%template(_VectorInt) std::vector; -%template(_VectorString) std::vector; -%template(_PairStringSizeT) std::pair; -%template(_PairSizeTSizeT) std::pair; -%template(_VectorPairSizeTString) std::vector>; - -%pythoncode %{ -import numpy as np -import os -import threading -intb1 = _mgb.intb1 -intb2 = _mgb.intb2 -intb4 = _mgb.intb4 -bfloat16 = _mgb.bfloat16 -%} - -%{ -#include "megbrain/comp_node.h" -#include "megbrain/tensor.h" -#include "megbrain/graph.h" - -#include "megbrain_wrap.h" -#include "megbrain_config.h" -#include "megbrain_serialize.h" -#include "plugin.h" -%} - -%include "megbrain_build_config.h" -%include "comp_node.i" -%include "comp_graph.i" -%include "symbol_var.i" -%include "shared_nd.i" -%include "../cpp/megbrain_config.h" -%include "callback.i" -%include "operator.i" -%include "craniotome.i" -%include "misc.i" -%include "loop.i" -%include "../cpp/megbrain_serialize.h" -%include "../cpp/plugin.h" - -// vim: ft=swig diff --git a/python_module/src/swig/mgb_exception.i b/python_module/src/swig/mgb_exception.i deleted file mode 100644 index 8a6ee7c5..00000000 --- a/python_module/src/swig/mgb_exception.i +++ /dev/null @@ -1,40 +0,0 @@ -/* - * $File: mgb_exception.i - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * $Copyright: Copyright (c) 2014-2017 Megvii Inc. All rights reserved. - */ - - -%include "std_string.i" -%include "std_except.i" -%include "pyabc.i" - -%{ -#include "python_helper.h" -%} - -namespace PyMGBExceptionMaker { - void _reg_exception_class(PyObject *cls); -} - -%feature("director:except") { - if ($error) - PyExceptionForward::throw_(); -} - -%include "exception.i" -%allowexception; -%exception { - try { - $action - } catch (std::exception &e) { - PyMGBExceptionMaker::setup_py_exception(e); - SWIG_fail; - } catch(...) { - SWIG_exception(SWIG_UnknownError, "Unknown exception"); - } -} - -// vim: ft=swig diff --git a/python_module/src/swig/misc.i b/python_module/src/swig/misc.i deleted file mode 100644 index d3f18946..00000000 --- a/python_module/src/swig/misc.i +++ /dev/null @@ -1,151 +0,0 @@ -/* - * $File: misc.i - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * $Copyright: Copyright (c) 2014-2017 Megvii Inc. All rights reserved. - */ - - -%{ -#include "megbrain/utils/persistent_cache.h" -#include "megbrain/serialization/helper.h" -#include "megbrain/gopt/inference.h" -#include "megbrain/plugin/opr_footprint.h" -using _PyStackExtracter = PyStackExtracter; -using _PersistentCache = mgb::PersistentCache; -using _PersistentCacheBlob = _PersistentCache::Blob; -using _MaybePersistentCacheBlob = mgb::Maybe<_PersistentCacheBlob>; -using _OptimizeForInferenceOptions = mgb::gopt::OptimizeForInferenceOptions; -%} - -%feature("director") _PyStackExtracter; -class _PyStackExtracter { - public: - virtual ~_PyStackExtracter() = default; - virtual std::string extract() = 0; - static void reg(_PyStackExtracter *p); -}; - -// from Blob to python bytes -%typemap(in) const _PersistentCacheBlob& { - mgb_assert(PyBytes_Check($input)); - $1->ptr = PyBytes_AsString($input); - $1->size = PyBytes_Size($input); -} -%typemap(directorin) const _PersistentCacheBlob& { - $input = PyBytes_FromStringAndSize( - static_cast($1.ptr), $1.size); -} -%typemap(directorout) _MaybePersistentCacheBlob { - mgb_assert($1->ob_refcnt >= 2, "persistent cache result refcnt too small"); - if ($1 == Py_None) { - $result = mgb::None; - } else { - mgb_assert(PyBytes_Check($input)); - _PersistentCacheBlob blob; - blob.ptr = PyBytes_AsString($1); - blob.size = PyBytes_Size($1); - $result = blob; - } -} - -%feature("director") _PersistentCache; -class _PersistentCache { - public: - virtual ~_PersistentCache() = default; - - virtual void put(const std::string &category, - const _PersistentCacheBlob &key, - const _PersistentCacheBlob &value) = 0; - - virtual _MaybePersistentCacheBlob get( - const std::string &category, - const _PersistentCacheBlob &key) = 0; - - %extend { - static void reg(_PersistentCache *p) { - _PersistentCache::set_impl({p, [](_PersistentCache*){}}); - } - } -}; - -struct _OptimizeForInferenceOptions { -#define SET(n) void enable_##n(); - SET(f16_io_f32_comp); - SET(f16_io_comp); - SET(fuse_conv_bias_nonlinearity); - SET(fuse_conv_bias_with_z); -#undef SET -#define SET(_trans, _trans_capital) \ - void enable_##_trans(); \ - - SET(nchw4, NCHW4); - SET(nhwcd4, NHWCD4); - SET(nchw88, NCHW88); - SET(nchw44, NCHW44); - SET(nchw44_dot, NCHW44_DOT); - SET(nchw32, NCHW32); - SET(chwn4, CHWN4); -#undef SET -}; - -%inline { - static SymbolVarArray _optimize_for_inference( - const SymbolVarArray& dest_vars, - const _OptimizeForInferenceOptions& opt) { - return mgb::gopt::optimize_for_inference(dest_vars, opt); - } - - // defined in function_replace.cpp - void _register_logger(PyObject *logger); - void _timed_func_set_fork_exec_path(const char *arg0, const char *arg1); - void _timed_func_exec_cb(const char *user_data); - - // defined in megbrain_wrap.cpp - void _mgb_global_finalize(); - std::vector _get_mgb_version(); - SymbolVarArray _grad(SymbolVar target, SymbolVarArray wrts, - bool warn_mid_wrt, int use_virtual_grad, - bool return_zero_for_nodep); - SymbolVar _inter_graph_trans_var( - CompGraph &dest_graph, SymbolVar src); - SymbolVar _get_graph_optimizer_replaced_var(SymbolVar src); - void _add_update_fastpath(SharedND& dest, SharedND& delta, - float alpha, float beta, float bias); - void _add_update_fastpath(SharedND& dest, - CompGraphCallbackValueProxy& delta, - float alpha, float beta, float bias); - - static SymbolVar _current_grad_target(CompGraph &graph) { - return mgb::cg::current_grad_target(graph.get()); - } - - uint32_t _get_dtype_num(PyObject *dtype) { - return static_cast(npy::dtype_np2mgb(dtype).enumv()); - } - - PyObject* _get_serialized_dtype(PyObject *dtype) { - PYTHON_GIL; - std::string sdtype; - auto write = [&sdtype](const void* data, size_t size) { - auto pos = sdtype.size(); - sdtype.resize(pos + size); - memcpy(&sdtype[pos], data, size); - }; - mgb::serialization::serialize_dtype(npy::dtype_np2mgb(dtype), write); - return PyBytes_FromStringAndSize(sdtype.data(), sdtype.size()); - } - - size_t max_size_t() { - return std::numeric_limits::max(); - } - - std::string _get_opr_fp_graph_exec( - CompGraph& cg, const SymbolVarArray& outputs) { - auto json = mgb::OprFootprint::get_opr_fp_graph_exec(cg.get(), outputs); - return json->to_string(); - } -} - -// vim: ft=swig diff --git a/python_module/src/swig/operator.i b/python_module/src/swig/operator.i deleted file mode 100644 index e7bd0911..00000000 --- a/python_module/src/swig/operator.i +++ /dev/null @@ -1,148 +0,0 @@ -/* - * $File: operator.i - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * $Copyright: Copyright (c) 2014-2017 Megvii Inc. All rights reserved. - */ - -%{ -#include "opr_helper.h" -#include "opr_defs.h" - -using ::mgb::cg::OperatorNodeConfig; - -using _AxisIndexer = AxisIndexer; - -static inline PyObject* _to_mgb_supported_dtype(PyObject* dtype) { - return ::npy::to_mgb_supported_dtype(dtype); -} - -%} - -%feature("autodoc", "Extra configuration for an operator") OperatorNodeConfig; -class OperatorNodeConfig { - public: - OperatorNodeConfig(); - void name(const std::string &name); - void comp_node(const CompNode &node); - - %extend { - void comp_node_arr(const std::vector &arr) { - OperatorNodeConfig::CompNodeArray tarr(arr.begin(), arr.end()); - $self->comp_node_arr(tarr); - } - - CompNode require_comp_node() { - mgb_assert($self->comp_node().size() == 1, - "comp_node is required for the config"); - return $self->comp_node()[0]; - } - - void output_dtype(PyObject* dtype) { - $self->output_dtype(npy::dtype_np2mgb(dtype)); - } - } -}; - -%feature("autodoc", - "representing a operator node in a computing graph") Operator; -class Operator { -public: - %extend { - size_t _get_id() const { - return $self->id(); - } - - const std::string& _get_name() const { - return $self->name(); - } - - const std::string& _get_params() const { - return $self->params(); - } - - SymbolVarArray _get_inputs() { - return $self->inputs(); - } - - SymbolVarArray _get_outputs() { - return $self->outputs(); - } - - CompGraph _get_owner_graph() { - const auto& cg = $self->get_owner_graph(); - return CompGraph::make_from_shared_ptr(cg); - } - - %include "operator.py" - } -}; - -%template(_VectorOperator) std::vector; - -class _AxisIndexer { -public: - static _AxisIndexer make_interval(int axis, SymbolVar begin, SymbolVar end, - SymbolVar step); - - static _AxisIndexer make_index(int axis, SymbolVar idx); -}; -%template(_VectorAxisIndexer) std::vector<_AxisIndexer>; - -%inline { - // all defined in opr_helper.cpp - SymbolVarArray _create_opr( - const char *name, const SymbolVarArray &inputs, PyObject *params, - const OperatorNodeConfig &config); - - SymbolVar _create_subtensor_like_opr( - const std::string &name, - const SymbolVarArray& inputs, - const std::vector<_AxisIndexer> &idx, - const OperatorNodeConfig &config); - - SymbolVar _make_immutable( - CompGraph &comp_graph, PyObject *npyarr, PyObject *dtype, - const OperatorNodeConfig &config); -} - -PyObject* _to_mgb_supported_dtype(PyObject *dtype); - -%include "../cpp/opr_defs.h" - -%pythoncode { - -def make_opr_config(name=None, comp_node=None, output_dtype=None): - """make :class:`.OperatorNodeConfig` from given name or comp_node - - :type name: None or str - :param name: name for the operator - :type comp_node: None or comp_node-compatible or iterable of - comp_node-compatible - :param comp_node: a single comp_node, or iterable of comp_nodes - :type dtype: None or numpy-dtype compatible - :param dtype: the specified dtype the operator. - """ - rst = OperatorNodeConfig() - if comp_node is not None: - if isinstance(comp_node, str): - rst.comp_node(as_comp_node(comp_node)) - elif isinstance(comp_node, collections.Iterable): - vec = _VectorCompNode() - for i in comp_node: - vec.push_back(as_comp_node(i)) - rst.comp_node_arr(vec) - else: - rst.comp_node(as_comp_node(comp_node)) - if name is not None: - assert isinstance(name, str) - rst.name(name) - if output_dtype is not None: - rst.output_dtype(output_dtype) - - return rst - -} // %pythoncode - -// vim: ft=swig foldmethod=marker foldmarker=f{{{,f}}} diff --git a/python_module/src/swig/operator.py b/python_module/src/swig/operator.py deleted file mode 100644 index a1eb095e..00000000 --- a/python_module/src/swig/operator.py +++ /dev/null @@ -1,37 +0,0 @@ -%pythoncode { - -__owner_graph = None - -@property -def owner_graph(self): - """get the owner graph; note that a reference would be kept in this var""" - if self.__owner_graph is None: - self.__owner_graph = self._get_owner_graph() - return self.__owner_graph - -@property -def id(self): - """an integer identifier for this opr that is unique in the computing - graph""" - return int(self._get_id()) - -@property -def name(self): - return self._get_name() - -@property -def params(self): - import json - return json.loads(self._get_params()) - -@property -def inputs(self): - return tuple(self._get_inputs()) - -@property -def outputs(self): - return tuple(self._get_outputs()) - -def __repr__(self): - return 'Operator(id={},name={})'.format(self.id, self.name) -} diff --git a/python_module/src/swig/shared_nd.i b/python_module/src/swig/shared_nd.i deleted file mode 100644 index 03e3dced..00000000 --- a/python_module/src/swig/shared_nd.i +++ /dev/null @@ -1,125 +0,0 @@ -/* - * $File: shared_nd.i - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * $Copyright: Copyright (c) 2014-2017 Megvii Inc. All rights reserved. - */ - -%pythoncode { -from .mgb_helper import SharedNDLazyInitializer -} // pythoncode - -%feature("autodoc", """a value stored on computing device and can be modified -by special operators in the graph""") SharedND; -class SharedND { - public: - SharedND(CompNode comp_node, PyObject *dtype); - - void _set_init_shape(const std::vector &shape); - void _resize(const std::vector &shape); - void _reset_zero(); - - PyObject* _get_npyarr(); - PyObject* _get_dtype(); - std::vector _get_shape(); - - void _copy_from_npyarr(PyObject *npyarr); - void _copy_from_value_proxy(CompGraphCallbackValueProxy &value); - void _share_from_value_proxy(CompGraphCallbackValueProxy &value); - static SharedND _from_symvar(SymbolVar symvar); - - void _set_copy_sync(bool flag); - uintptr_t _pubapi_dev_tensor_ptr(int version); - - void copy_to_sub_from_shared( - int axis, ptrdiff_t begin, ptrdiff_t end, ptrdiff_t step, - const SharedND &rhs); - - void copy_from_shared_sub(const SharedND &rhs, - int axis, ptrdiff_t begin, ptrdiff_t end, ptrdiff_t step); - - CompNode _get_comp_node(); - - SymbolVar _as_sym_var(CompGraph &graph, const std::string &name, - bool volatile_); - - void _share_memory_from(const SharedND &rhs, size_t begin); - - void _reset_dev_tensor(const SharedND& rhs); - - %include "shared_nd_SharedND.py" -}; -%template(_VectorSharedND) std::vector; - -class _HostSharedND { - public: - _HostSharedND(CompNode node, PyObject *dtype); - static _HostSharedND make_proxy(SymbolVar var); - - SymbolVar _as_sym_var(CompGraph &cg, bool enable_static_infer, - const std::string &name); - PyObject* _get_dtype(); - void _resize(const std::vector &shape); - void _copy_from_npyarr(PyObject *npyarr, bool borrow); - void _enable_borrow_on_cpu(bool flag); - std::string __repr__() const; - - %include "shared_nd_HostSharedND.py" -}; - - -%feature("autodoc", -"""a scalar value that can be modified after it has been created; -compared to :class:`SharedND`, it has the advantage that no comp node needs to -be specified.""") SharedScalar; -class SharedScalar { - public: - SharedScalar(PyObject *val); - void _set(PyObject *val); - PyObject* _get(); - bool _dtype_locked(); - void _lock_dtype(); - SymbolVar _as_sym_var(CompGraph &cg, CompNode &cn); - - %pythoncode { - - def lock_dtype(self): - """lock dtype so further set() calls must pass the same dtyped - value""" - self._lock_dtype() - - @property - def dtype_locked(self): - """whether dtype is locked""" - return self._dtype_locked() - - def set(self, val): - self._set(val) - - def get(self): - """get the value stored in this SharedScalar""" - return self._get()[0] - - def __getstate__(self): - state = self.__dict__.copy() - del state['this'] - state['__shared_scalar_value'] = self.get() - state['__shared_scalar_dtype_locked'] = self.dtype_locked - return state - - def __setstate__(self, state): - val = SharedScalar(state.pop('__shared_scalar_value')) - if state.pop('__shared_scalar_dtype_locked', True): - val._lock_dtype() - self.this = val.this - for k, v in state.items(): - self.__dict__[k] = v - - def __repr__(self): - return 'SharedScalar({})'.format(self.get()) - } -}; - - -// vim: ft=swig diff --git a/python_module/src/swig/shared_nd_HostSharedND.py b/python_module/src/swig/shared_nd_HostSharedND.py deleted file mode 100644 index f94ff798..00000000 --- a/python_module/src/swig/shared_nd_HostSharedND.py +++ /dev/null @@ -1,67 +0,0 @@ -%pythoncode{ - -__dtype = None - -def as_sym_var(self, cg, enable_static_infer, name=None): - """get symvar to represent value of this HostSharedND in a - computing graph - - :type cg: :class:`.CompGraph` - :param cg: computing graph - :type enable_static_infer: :class:`bool` - :param enable_static_infer: whether to enable static value - inference for this symvar; if set to True, the value must - be set up before calling :meth:`as_sym_var`. - """ - if name is None: - name = '' - return self._as_sym_var(cg, enable_static_infer, name) - -def symvar(self, comp_graph, name=None, *, enable_static_infer=None): - return self.as_sym_var(comp_graph, enable_static_infer, name) - -def enable_borrow_on_cpu(self, flag): - """whether to allow borrow memory in :meth:`set_value` if - the underlying comp ndoe is on CPU""" - self._enable_borrow_on_cpu(flag) - -def _set_value_print_warn( - self, reason, *, - disabled=os.getenv('MGB_DISABLE_SET_VALUE_WARN') is not None): - if disabled: - return - from .logconf import get_logger - logger = get_logger() - logger.warning('set {} from incompatible object is slow: {}'.format( - self, reason)) - -def set_value(self, w, *, borrow=False): - """set value to given numpy array - - :param borrow: if set to True, the memory of *w* may be - borrowed, and *w* must remain unmodified during usage of - this object - :type borrow: bool - :return: self - """ - if self.__dtype is None: - self.__dtype = self._get_dtype() - - if not isinstance(w, np.ndarray): - wtype = type(w) - w = np.ascontiguousarray(w, self.__dtype) - if w.size >= 1024: - self._set_value_print_warn( - 'not an ndarray object: {}'.format(wtype)) - elif w.size >= 1024: - if w.dtype != self.__dtype: - self._set_value_print_warn( - 'dtype mismatch: expect {}, get {}'.format( - self.__dtype, w.dtype)) - elif not w.flags['C_CONTIGUOUS']: - self._set_value_print_warn('non-contiguous ndarray') - - self._copy_from_npyarr(w, borrow) - return self - -} diff --git a/python_module/src/swig/shared_nd_SharedND.py b/python_module/src/swig/shared_nd_SharedND.py deleted file mode 100644 index da024c7a..00000000 --- a/python_module/src/swig/shared_nd_SharedND.py +++ /dev/null @@ -1,196 +0,0 @@ -%pythoncode{ - -__lazy_initializer = None - -def __apply_lazy_initializer(self): - """ __lazy_initializer released by self.set_value()""" - if self.__lazy_initializer is not None: - self.set_value(self.__lazy_initializer.get_value()) - -@property -def shape(self): - """get shape of unerlying data""" - if self.__lazy_initializer is not None: - val = self.__lazy_initializer.get_shape() - else: - val = self._get_shape() - return tuple(map(int, val)) - -@property -def comp_node(self): - return self._get_comp_node() - -@property -def dtype(self): - return self._get_dtype() - -@property -def lazy_initializer(self): - """object to specify how to initialize this SharedND, or None - if not set - - Please not that the initializer could be called at any time. - - :type: :class:`.SharedNDLazyInitializer` - """ - return self.__lazy_initializer - -@lazy_initializer.setter -def lazy_initializer(self, init): - assert not len(self._get_shape()), ( - 'can not set initializer for initialized SharedND') - assert isinstance(init, SharedNDLazyInitializer) - self.__lazy_initializer = init - -def set_value(self, w, *, sync=True, inplace=False, share=False): - """set value from a numpy array or from outputs in callback - - .. warning:: - - If sync is false, a reference to input is kept and the caller is - responsible to ensure that the input would not be modified after - this function returns. - - :param w: value to be set - :type w: :class:`numpy.ndarray`-compatible, :class:`SharedND` or - :class:`.CompGraphCallbackValueProxy` - :param sync: whether to sync device before returns - :type sync: bool - :param inplace: whether to copy in-place from another :class:`.SharedND`, - guaranteed no memory allocating; if True, this SharedND must have the - same shape as *w*, and buffer for this :class:`SharedND` would not be - re-allocated. - :param share: directly share the buffer in a - :class:`.CompGraphCallbackValueProxy` with zero copy - :return: self - """ - - if self is w: - return self - - if share: - assert isinstance(w, CompGraphCallbackValueProxy) - self._share_from_value_proxy(w) - return self - - self._set_copy_sync(sync) - if isinstance(w, CompGraphCallbackValueProxy): - self._copy_from_value_proxy(w) - return self - - if isinstance(w, SharedND): - w.__apply_lazy_initializer() - ax_type = -2 - if inplace: - ax_type = -3 - self.copy_from_shared_sub(w, ax_type, -1, -1, -1) - return self - assert not inplace, 'inplace only implemented for copying from SharedND' - - if self.__lazy_initializer is not None: - del self.__lazy_initializer - self._copy_from_npyarr(w) - return self - -def get_value(self): - """get value as numpy array - :return: numpy array, or None if value is empty""" - self.__apply_lazy_initializer() - return self._get_npyarr() - -def resize(self, *shape): - """resize the SharedND to given shape and allocate memory, without - initializing data; usually :meth:`pubapi_dev_tensor_ptr` is then called to - get the buffer address and pass it to some other library - - :return: self - """ - if len(shape) == 1 and isinstance(shape[0], collections.Iterable): - shape = shape[0] - self._resize(shape) - return self - -def reset_zero(self): - """reset dev_tensor to zeros""" - self._reset_zero() - -def copy_to(self, dest): - """copy value to numpy array - - :type dest: :class:`np.ndarray` - :param dest: destination array to write value of this var to, - which must match shape, have float32 dtype and be - contiguous - """ - check_cont_ndarray(dest) - wflat = dest.reshape(-1) - assert wflat.ctypes.data == dest.ctypes.data - self._copy_to_flatten(wflat) - return dest - -@property -def dev_ptr(self): - """this method is DEPRECATED; use :meth:`pubapi_dev_tensor_ptr` instead""" - return self._pubapi_dev_tensor_ptr(0) - -@property -def pubapi_dev_tensor_ptr(self): - """get a pointer to the corresponding mgb::pubapi::DeviceTensor object - - :rtype: int - :return: the address as an integer - """ - return self._pubapi_dev_tensor_ptr(1) - -def symvar(self, comp_graph, name=None, *, volatile=False): - """convert to SymbolVar to be put into a computing graph - - :param volatile: whether shape/ptr is allowed to change - """ - self.__apply_lazy_initializer() - assert self.shape, "initial shape must be available" - if name is None: - name = '' - return self._as_sym_var(comp_graph, name, volatile) - -def __getstate__(self): - state = self.__dict__.copy() - del state['this'] - state['value'] = self.get_value() - state['comp_node'] = self.comp_node - state['dtype'] = self.dtype - return state - -def __setstate__(self, state): - val = state.pop('value') - dtype = state.pop('dtype', 'float32') - snd = SharedND(state.pop('comp_node'), dtype) - if val is not None: - assert val.dtype == dtype - snd.set_value(val) - self.this = snd.this - for k, v in state.items(): - self.__dict__[k] = v - -def share_memory_from(self, rhs, offset): - """ - share memory from another SharedND, self and rhs must be initialized - :param rhs: another sharedND used to share memory - :type rhs: :class:`SharedND` - - :param offset: offset in rhs sharedND - :type offset: int - """ - assert self != rhs - self._share_memory_from(rhs, offset) - -def reset_dev_tensor(self, rhs): - """ - reset devive tensor to another SharedND, self and rhs must be initialized. - :param rhs: another sharedND whose device tensor to be reset to. - :type rhs: :class:`SharedND` - """ - assert self != rhs - self._reset_dev_tensor(rhs) - -} diff --git a/python_module/src/swig/symbol_var.i b/python_module/src/swig/symbol_var.i deleted file mode 100644 index 2c86f206..00000000 --- a/python_module/src/swig/symbol_var.i +++ /dev/null @@ -1,113 +0,0 @@ -/* - * $File: symbol_var.i - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * $Copyright: Copyright (c) 2014-2017 Megvii Inc. All rights reserved. - */ - -%{ -using mgb::cg::SymbolVar; -%} - -%feature("autodoc", -"representing a symbolic variable in a computing graph") SymbolVar; - -class SymbolVar { -public: - SymbolVar flatten(); - SymbolVar rename(const std::string &name); - bool allow_shape_change(); - - %extend { - - SymbolVar fill_retain_dtype(PyObject *val) { - return fill_retain_dtype(*$self, val); - } - - CompGraph _get_owner_graph() { - mgb_assert($self->node()); - auto cg = $self->node()->owner_graph()->shared_from_this(); - return CompGraph::make_from_shared_ptr(cg); - } - - Operator _get_owner_opr() { - mgb_assert($self->node()); - return Operator{$self->node()->owner_opr()}; - } - - CompNode _get_comp_node() { - mgb_assert($self->node()); - return $self->node()->comp_node(); - } - - const std::string& _get_name() const { - mgb_assert($self->node()); - return $self->node()->name(); - } - - size_t _get_id() const { - mgb_assert($self->node()); - return $self->node()->id(); - } - - std::vector _get_imm_shape() { - mgb_assert($self->node()); - return npy::shape2vec($self->node()->shape()); - } - - PyObject* _get_inferred_value() { - return get_symvar_inferred_value(*$self); - } - - bool _is_valid() const { - return $self->node(); - } - - PyObject* _get_dtype() const { - return npy::dtype_mgb2np($self->dtype()); - } - - CompGraphCallbackValueProxy _eager_eval_get_value() const { - CompGraphCallbackValueProxy ret; - ret.setup($self->eager_eval_get_value(), false); - return ret; - } - - void _reeval_if_eager_eval() { - auto &&var = $self->node(); - mgb_assert(var); - auto &&cg = var->owner_graph(); - if (cg->options().eager_evaluation) { - mgb_assert(var->owner_opr()->inserted_in_graph()); - cg->insert_opr(std::unique_ptr( - var->owner_opr())); - } - } - - bool _is_shared_device_tensor() { - if ($self->node() - ->owner_opr() - ->same_type()) - return true; - return false; - } - - %include "symbol_var_SymbolVar.py" - - } - -}; - -typedef std::vector SymbolVarArray; -%template(_VectorSymbolVar) std::vector; - -// SymbolVarArray compatibility; see symbol_var_array.i for more details -%typemap(out) SymbolVarArray { - $result = swig::from(static_cast&>($1)); -} -%typemap(directorin) const SymbolVarArray& { - $input = swig::from(static_cast&>($1)); -} - -// vim: ft=swig diff --git a/python_module/src/swig/symbol_var_SymbolVar.py b/python_module/src/swig/symbol_var_SymbolVar.py deleted file mode 100644 index 96fb3383..00000000 --- a/python_module/src/swig/symbol_var_SymbolVar.py +++ /dev/null @@ -1,216 +0,0 @@ -%pythoncode { - -__owner_graph = None -__owner_opr = None - -@property -def owner_graph(self): - """get the owner graph; note that a reference would be kept in this var""" - if self.__owner_graph is None: - self.__owner_graph = self._get_owner_graph() - return self.__owner_graph - -@property -def owner_opr(self): - """get the owner opr; get owner graph explicitly so it can keep a reference - to its owner graph""" - if self.__owner_opr is None: - self.__owner_opr = self._get_owner_opr() - - self.__owner_opr.owner_graph - return self.__owner_opr - -@property -def comp_node(self): - return self._get_comp_node() - -@property -def name(self): - return self._get_name() - -@property -def id(self): - """an integer identifier for this var that is unique in the computing - graph""" - return int(self._get_id()) - -@property -def imm_shape(self): - """shape as immediate number - - :type: tuple of int - """ - return tuple(map(int, self._get_imm_shape())) - -@property -def inferred_value(self): - """get statically inferred value of this var, or None if - inference failed - - :type: :class:`numpy.ndarray` or None""" - return self._get_inferred_value() - -@property -def valid(self): - """whether this symvar is valid (i.e. has corresponding var node in - graph)""" - return self._is_valid() - -@property -def volatile(self): - """whether the shape is volatile""" - return not self._is_shared_device_tensor() - -@property -def dtype(self): - """get underling data type - :rtype: :class:`numpy.dtype`""" - return self._get_dtype() - -def __hash__(self): - return hash((self.owner_graph, self.id)) - -def __eq__(self, rhs): - return (isinstance(rhs, SymbolVar) and - self.owner_graph == rhs.owner_graph and - self.id == rhs.id) - -def _binary_opr(self, mode, rhs): - from .opr import elemwise - return elemwise([self, rhs], mode=mode) - -def _binary_opr_lhs(self, mode, lhs): - from .opr import elemwise - return elemwise([lhs, self], mode=mode) - -def __add__(self, rhs): - return self._binary_opr('ADD', rhs) -def __radd__(self, lhs): - return self._binary_opr_lhs('ADD', lhs) - -def __sub__(self, rhs): - return self._binary_opr('SUB', rhs) -def __rsub__(self, lhs): - return self._binary_opr_lhs('SUB', lhs) - -def __mul__(self, rhs): - return self._binary_opr('MUL', rhs) -def __rmul__(self, lhs): - return self._binary_opr_lhs('MUL', lhs) - -def __matmul__(self, rhs): - from .opr import matrix_mul - return matrix_mul(self, rhs) -def __rmatmul__(self, rhs): - from .opr import matrix_mul - return matrix_mul(rhs, self) - -def __lshift__(self, rhs): - return self._binary_opr('SHL', rhs) -def __rshift__(self, rhs): - return self._binary_opr('SHR', rhs) - -def __truediv__(self, rhs): - return self._binary_opr('TRUE_DIV', rhs) -def __rtruediv__(self, lhs): - return self._binary_opr_lhs('TRUE_DIV', lhs) - -def __floordiv__(self, rhs): - return self._binary_opr('FLOOR_DIV', rhs) -def __rfloordiv__(self, rhs): - return self._binary_opr_lhs('FLOOR_DIV', rhs) - -def __mod__(self, rhs): - return self._binary_opr('MOD', rhs) -def __rmod__(self, rhs): - return self._binary_opr_lhs('MOD', rhs) - -def __pow__(self, rhs): - return self._binary_opr('POW', rhs) -def __rpow__(self, lhs): - return self._binary_opr_lhs('POW', lhs) - -def __lt__(self, rhs): - return self._binary_opr('LT', rhs) -def __gt__(self, lhs): - return self._binary_opr_lhs('LT', lhs) - -def __le__(self, rhs): - return self._binary_opr('LEQ', rhs) -def __ge__(self, lhs): - return self._binary_opr_lhs('LEQ', lhs) - -def __neg__(self): - from .opr import elemwise - return elemwise([self], mode='NEGATE') - -def __getitem__(self, idx): - from .helper import cvt_getitem_to_idx_desc - inpvar, desc = cvt_getitem_to_idx_desc(self, idx) - if desc is None: - return inpvar - return _create_subtensor_like_opr('subtensor', [inpvar], desc, make_opr_config()) - -def reshape(self, *shp): - from .opr import reshape - return reshape(self, shp) - -def broadcast(self, *shp): - from .opr import broadcast - return broadcast(self, shp) - -def sum(self, axis=None, keepdims=False): - from .opr import reduce_ - return reduce_(self, 'SUM', axis, keepdims) - -def max(self, axis=None, keepdims=False): - from .opr import reduce_ - return reduce_(self, 'MAX', axis, keepdims) - -def min(self, axis=None, keepdims=False): - from .opr import reduce_ - return reduce_(self, 'MIN', axis, keepdims) - -def prod(self, axis=None, keepdims=False): - from .opr import reduce_ - return reduce_(self, 'PRODUCT', axis, keepdims) - -def mean(self, axis=None, keepdims=False): - from .opr import mean - return mean(self, axis, keepdims) - -def dimshuffle(self, *pattern, **kwargs): - from .opr import dimshuffle - ndim = kwargs.pop('ndim', 0) - assert not kwargs - return dimshuffle(self, pattern=pattern, ndim=ndim) - -def astype(self, target_dtype): - """see :func:`typecvt`""" - from .opr import typecvt - return typecvt(self, target_dtype) - -@property -def shape(self): - from .opr import get_var_shape - return get_var_shape(self) - -def axis_shape(self, axis): - from .opr import get_var_shape - return get_var_shape(self, axis=axis) - -@property -def eager_val(self): - """get value in eager evaluation mode""" - return self._eager_eval_get_value() if self.owner_graph.is_eager() else None - - -def __iter__(self): - """add __iter__ to avoid implicit iteration by calling - __getitem__""" - raise NotImplementedError('SymbolVar var could not be itered') - -def __repr__(self): - return 'SymbolVar(id={},name={})'.format(self.id, self.name) - -} diff --git a/python_module/src/swig/symbol_var_array.i b/python_module/src/swig/symbol_var_array.i deleted file mode 100644 index 75b68dd0..00000000 --- a/python_module/src/swig/symbol_var_array.i +++ /dev/null @@ -1,46 +0,0 @@ -/* - * $File: symbol_var_array.i - * - * This file is part of MegBrain, a deep learning framework developed by Megvii. - * - * $Copyright: Copyright (c) 2014-2017 Megvii Inc. All rights reserved. - */ - -/* - * In megbrain, SymbolVarArray is SmallVector. - * - * I do no want to convert between std::vector<> and mgb::SmallVector in the - * C++ wrappers; neither do I want to write a SmallVector<> interface file as - * good as swig's std::vector<> implementation. - * - * So the goal becomes making swig generate python wrapper for std::vector<>, - * but call SymbolVarArray in the generated C++ file. - * - * A logical solution is to derive SymbolVarArray from std::vector<> only in - * the .i file so swig can use the correct name; however the generated python - * class becomes uniterable. So our hack here is to specialize std::vector to - * use SymbolVarArray in the generated C++ file. - * - * This file must be included before instantiation of std::vector. - */ -%{ -#include -#include "megbrain/graph/symbol_var.h" -using SymbolVar = mgb::cg::SymbolVar; -using SymbolVarArray = mgb::cg::SymbolVarArray; -namespace std { -template -class vector : public SymbolVarArray { -public: - using SymbolVarArray::SymbolVarArray; - using allocator_type = alloc; - - allocator_type get_allocator() const { - mgb_throw(mgb::MegBrainError, "get_allocator() should not be called"); - return {}; - } -}; -} -%} - -// vim: ft=swig diff --git a/python_module/src/version.ld b/python_module/src/version.ld deleted file mode 100644 index ac6e0802..00000000 --- a/python_module/src/version.ld +++ /dev/null @@ -1,17 +0,0 @@ -{ -global: - MGB_VSYM_*; - MEGDNN_VSYM_*; - mgb_get_extern_c_opr_api_versioned; - PyInit__mgb; - extern "C++" { - *mgb::*; - *megdnn::*; - *megcore::*; - megcore*; - }; - megcore*; - -local: - *; -}; diff --git a/python_module/test/.gitignore b/python_module/test/.gitignore deleted file mode 100644 index 8b29bf97..00000000 --- a/python_module/test/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -log.txt -*json -massif.out* diff --git a/python_module/test/README.md b/python_module/test/README.md deleted file mode 100644 index 797e8c5f..00000000 --- a/python_module/test/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# MegEngine Tests - -* unit: This directory has same layout as megengine directory. -* regression: Small tests to check whether old issue is fixed. -* integration: Tests involve multiple parts of megengine, tests that longer than 1min should be an manual test. -* pytorch_comparison: Special directory for torch-related test -* helpers - - Test utilities should placed in this directory - - `from helpers import ...` in your test code - - -## Default running setup - -Execute `run.sh` to test default set of tests. - -- No torch related test -- No internet related test -- No doc related test diff --git a/python_module/test/__init__.py b/python_module/test/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/python_module/test/conftest.py b/python_module/test/conftest.py deleted file mode 100644 index cf1a5359..00000000 --- a/python_module/test/conftest.py +++ /dev/null @@ -1,34 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import os -import sys - -sys.path.append(os.path.join(os.path.dirname(__file__))) - - -def pytest_json_modifyreport(json_report): - events = [] - timestamp = 0 - for item in json_report["tests"]: - for stage in ["setup", "call", "teardown"]: - if stage in item: - events.append( - { - "name": item["nodeid"], - "ph": "X", - "ts": timestamp, - "dur": item[stage]["duration"] * 1e6, - "cat": stage, - "pid": stage, - "tid": item["nodeid"], - } - ) - timestamp += events[-1]["dur"] - json_report["traceEvents"] = events - del json_report["collectors"] - del json_report["tests"] diff --git a/python_module/test/helpers/__init__.py b/python_module/test/helpers/__init__.py deleted file mode 100644 index 63d89aed..00000000 --- a/python_module/test/helpers/__init__.py +++ /dev/null @@ -1,172 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from typing import List, Tuple - -import numpy as np - -import megengine._internal as mgb -import megengine.functional as F -from megengine import Graph, jit -from megengine.module import Linear, Module -from megengine.test import assertTensorClose - -from .env import modified_environ - - -class MLP(Module): - def __init__(self): - super().__init__() - self.dense0 = Linear(28, 50) - self.dense1 = Linear(50, 20) - - def forward(self, x): - x = self.dense0(x) - x = F.relu(x) - x = self.dense1(x) - return x - - -def has_gpu(num=1): - try: - mgb.comp_node("gpu{}".format(num - 1)) - except mgb.MegBrainError: - return False - - return True - - -def randomNp(*args): - for arg in args: - assert isinstance(arg, int) - return np.random.random(args) - - -def randomTorch(*args): - import torch # pylint: disable=import-outside-toplevel - - for arg in args: - assert isinstance(arg, int) - return torch.tensor(randomNp(*args), dtype=torch.float32) - - -def graph_mode(*modes): - if not set(modes).issubset({"eager", "static"}): - raise ValueError("graph mode must be in (eager, static)") - - def decorator(func): - def wrapper(*args, **kwargs): - if "eager" in set(modes): - func(*args, **kwargs) - if "static" in set(modes): - with Graph() as cg: - cg.set_option("eager_evaluation", False) - func(*args, **kwargs) - - return wrapper - - return decorator - - -def _default_compare_fn(x, y): - assertTensorClose(x.numpy(), y) - - -def opr_test( - cases, - func, - mode=("eager", "static", "dynamic_shape"), - compare_fn=_default_compare_fn, - ref_fn=None, - **kwargs -): - """ - mode: the list of test mode which are eager, static and dynamic_shape - will test all the cases if None. - func: the function to run opr. - compare_fn: the function to compare the result and expected, use assertTensorClose if None. - ref_fn: the function to generate expected data, should assign output if None. - cases: the list which have dict element, the list length should be 2 for dynamic shape test. - and the dict should have input, - and should have output if ref_fn is None. - should use list for multiple inputs and outputs for each case. - kwargs: The additional kwargs for opr func. - - simple examples: - - dtype = np.float32 - cases = [{"input": [10, 20]}, {"input": [20, 30]}] - opr_test(cases, - F.eye, - ref_fn=lambda n, m: np.eye(n, m).astype(dtype), - dtype=dtype) - - """ - - def check_results(results, expected): - if not isinstance(results, Tuple): - results = (results,) - for r, e in zip(results, expected): - compare_fn(r, e) - - def get_trace_fn(func, enabled, symbolic): - jit.trace.enabled = enabled - return jit.trace(func, symbolic=symbolic) - - def get_param(cases, idx): - case = cases[idx] - inp = case.get("input", None) - outp = case.get("output", None) - if inp is None: - raise ValueError("the test case should have input") - if not isinstance(inp, List): - inp = (inp,) - else: - inp = tuple(inp) - if ref_fn is not None and callable(ref_fn): - outp = ref_fn(*inp) - if outp is None: - raise ValueError("the test case should have output or reference function") - if not isinstance(outp, List): - outp = (outp,) - else: - outp = tuple(outp) - - return inp, outp - - if not set(mode).issubset({"eager", "static", "dynamic_shape"}): - raise ValueError("opr test mode must be in (eager, static, dynamic_shape)") - - if len(cases) == 0: - raise ValueError("should give one case at least") - - if "dynamic_shape" in set(mode): - if len(cases) != 2: - raise ValueError("should give 2 cases for dynamic shape test") - - if not callable(func): - raise ValueError("the input func should be callable") - - inp, outp = get_param(cases, 0) - - def run(*args, **kwargs): - return func(*args, **kwargs) - - if "eager" in set(mode): - f = get_trace_fn(run, False, False) - results = f(*inp, **kwargs) - check_results(results, outp) - - if "static" in set(mode) or "dynamic_shape" in set(mode): - f = get_trace_fn(run, True, True) - results = f(*inp, **kwargs) - check_results(results, outp) - if "dynamic_shape" in set(mode): - inp, outp = get_param(cases, 1) - results = f(*inp, **kwargs) - check_results(results, outp) diff --git a/python_module/test/helpers/env.py b/python_module/test/helpers/env.py deleted file mode 100644 index f5dae64d..00000000 --- a/python_module/test/helpers/env.py +++ /dev/null @@ -1,56 +0,0 @@ -# -*- coding: utf-8 -*- -# The MIT License (MIT) -# -# Copyright (c) 2018 Laurent LAPORTE -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. -import contextlib -import os - - -# modified_environ codes come from https://github.com/laurent-laporte-pro/stackoverflow-q2059482/blob/master/demo/environ_ctx.py -@contextlib.contextmanager -def modified_environ(*remove, **update): - """ - Temporarily updates the ``os.environ`` dictionary in-place. - - The ``os.environ`` dictionary is updated in-place so that the modification - is sure to work in all situations. - - :param remove: Environment variables to remove. - :param update: Dictionary of environment variables and values to add/update. - """ - env = os.environ - update = update or {} - remove = remove or [] - - # List of environment variables being updated or removed. - stomped = (set(update.keys()) | set(remove)) & set(env.keys()) - # Environment variables and values to restore on exit. - update_after = {k: env[k] for k in stomped} - # Environment variables and values to remove on exit. - remove_after = frozenset(k for k in update if k not in env) - - try: - env.update(update) - [env.pop(k, None) for k in remove] - yield - finally: - env.update(update_after) - [env.pop(k) for k in remove_after] diff --git a/python_module/test/helpers/torch_util.py b/python_module/test/helpers/torch_util.py deleted file mode 100644 index 659033c5..00000000 --- a/python_module/test/helpers/torch_util.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import numpy as np -import torch - -from megengine.core import tensor -from megengine.utils import prod - - -def _uniform(shape): - return np.random.random(shape).astype(np.float32) - - -def init_with_same_value(mge_param, torch_param, initializer=_uniform): - mge_shape = mge_param.shape - torch_shape = torch_param.shape - assert prod(mge_shape) == prod(torch_shape) - weight = initializer(mge_shape) - mge_param.set_value(weight) - torch_param.data = torch.Tensor(weight.reshape(torch_shape)) - - -def gen_same_input(shape, initializer=_uniform): - data = initializer(shape) - mge_input = tensor(data) - torch_input = torch.Tensor(data) - return mge_input, torch_input diff --git a/python_module/test/integration/manual/README.md b/python_module/test/integration/manual/README.md deleted file mode 100644 index aad1ed6f..00000000 --- a/python_module/test/integration/manual/README.md +++ /dev/null @@ -1,178 +0,0 @@ -# Regression test -* [How to run](#how-to-run) -* [Correctness](#correctness) -* [Performance](#performance) -* [Debug tools](#debug-tools) -* [To do list](#to-do-list) - -## How to run - -1. Run correctness regression test by - -``` -rlaunch --cpu=4 --memory=15000 --gpu=1 -- python3 verify_correctness.py -``` - -2. Run performance regression test by - -``` -rlaunch --cpu=4 --memory=15000 --gpu=1 -- python3 run_resnet50_perf.py -``` - -Compare with the [reference result](#performance) to verify the performance change. - -3. [Temporary]: Run dynamic graph test - -``` -cd python_module/megengine/examples/cifar10/resnet_example -rlaunch --cpu=4 --memory=15000 --gpu=1 -- MGE_DISABLE_TRACE=1 python3 main.py --mode train --backend megengine-dynamic -``` - -Be sure to run a few epochs to verify the CPU/GPU memory usage and the result tends to converge. The complete run takes around 2 hours. - -## Correctness - -Pre-trained Resnet18 model on cifar10 dataset is used. - -The test set contains -* forward run with static graph -* forward run with dynamic graph -* forward + backward + parameter update with static graph -* forward + backward + parameter update with dynamic graph - -Sample output: - -``` -Running fwd static ... -Success -Running fwd dynamic ... -Success -Running train static ... -Success -Running train dynamic ... -Failed!!! -import megengine operator -[INFO] load /home/zhangfan/.local/lib/python3.6/site-packages/megengine/examples/cifar10/resnet_example/checkpoint/pytorch_init.pth done -calculated loss: [2.3731833, 34.4626] -expect: [ 2.3731833 34.460594 ] -``` - -## Performance - -Test cases run Resnet 50 training with batch size = 64. - -Run `python3 resnet50_perf.py --help` for valid options. - -Example script: - -* Run `python3 run_resnet50_perf.py` -* You may want to submit the job to a remote server by `rlaunch --cpu=16 --memory=100384 --gpu=8 -- python3 run_resnet50_perf.py` -* Sample output -``` -************************************** -Run ResNet 50 performance test with batch size = 64 -************************************** -Run static graph with default opt level -Finish with GPU Usage 6710MiB -Wall time per iter 283 ms -Run status: finished -************************************** -Run static graph with conv fastrun -Finish with GPU Usage 6540MiB -Wall time per iter 265 ms -Run status: finished -************************************** -Run static graph with conv fastrun and JIT -Finish with GPU Usage 6540MiB -Wall time per iter 267 ms -Run status: finished -************************************** -Run static graph with JIT, conv fastrun and without running step -Finish with GPU Usage 6540MiB -Wall time per iter 223 ms -Run status: finished -************************************** -``` - -## Debug tools - -You can pass `--run-debug-tool` to script `run_resnet50_perf.py`. Opr-level profiling result and valgrind will be invoked. - -### How much overhead time will it take due to usage of the profiler - -Please compare the same job with/without profiler. The timing statistic reported by profiler does not include the overhead time from itself. - -### How can I get more information from profiler? - -Refer to the main function in `megengine.utils.profile_analyze`. - -### How can I profile main memory usage? - -Valgrind massif tool can be used. The script also prints memory usage summary on screen as: - -``` - - GB -1.836^ # - | @@#::::::@::: - | @@@ #::::::@::: - | ::::::::::::@:::::::::@:@@@ #::::::@::: - | ::::: :::::: @ ::: ::: @:@@@ #::::::@::: - | @@::::: :::::: @ ::: ::: @:@@@ #::::::@::: - | ::@@::::: :::::: @ ::: ::: @:@@@ #::::::@::: - | @:: @@::::: :::::: @ ::: ::: @:@@@ #::::::@::: - | @@@:: @@::::: :::::: @ ::: ::: @:@@@ #::::::@::: - | :@@@:: @@::::: :::::: @ ::: ::: @:@@@ #::::::@::: - | @::@@@:: @@::::: :::::: @ ::: ::: @:@@@ #::::::@::: - | @@::@@@:: @@::::: :::::: @ ::: ::: @:@@@ #::::::@::: - | @:@@::@@@:: @@::::: :::::: @ ::: ::: @:@@@ #::::::@::: - | :@ @@::@@@:: @@::::: :::::: @ ::: ::: @:@@@ #::::::@::: - | ::::@ @@::@@@:: @@::::: :::::: @ ::: ::: @:@@@ #::::::@::: - | :::: :@ @@::@@@:: @@::::: :::::: @ ::: ::: @:@@@ #::::::@::: - | :@: :: :@ @@::@@@:: @@::::: :::::: @ ::: ::: @:@@@ #::::::@::: - | :@@: :: :@ @@::@@@:: @@::::: :::::: @ ::: ::: @:@@@ #::::::@::: - | @@:@@: :: :@ @@::@@@:: @@::::: :::::: @ ::: ::: @:@@@ #::::::@::: - | @@ :@@: :: :@ @@::@@@:: @@::::: :::::: @ ::: ::: @:@@@ #::::::@::: - 0 +----------------------------------------------------------------------->Gi - 0 19.39 - -``` -You can change "--run-iter" value to adjust iters to profile. -The detailed profiling is printed to `massif.out.ms_print`. - -### How can I understand the profiler result? - -The dumped profiling file `prof.json` can be interpolated by [megengine/utils/profile_analyze.py](../../utils/profile_analyze.py). -The following information is printed from the profiler: - -``` ------------------ -------- -total device time 0.318062 -total host time 0.275643 ------------------ -------- - -╒════════════════════╤══════════════╤═══════════════════════════╤═══════════════╤═════════╤══════════╤═════════════╤═════════════╤══════════════╕ -│ device self time │ cumulative │ operator info │ computation │ FLOPS │ memory │ bandwidth │ in_shapes │ out_shapes │ -╞════════════════════╪══════════════╪═══════════════════════════╪═══════════════╪═════════╪══════════╪═════════════╪═════════════╪══════════════╡ -│ #0 │ 0.114 │ Elemwise │ 6.53 │ 57.40 │ 51.63 │ 454.02 │ None │ None │ -│ 0.114 │ 35.8% │ 1481 │ GFLO │ GFLOPS │ GiB │ GiB/s │ │ │ -│ 35.8% │ │ N/A │ │ │ │ │ │ │ -├────────────────────┼──────────────┼───────────────────────────┼───────────────┼─────────┼──────────┼─────────────┼─────────────┼──────────────┤ -│ #1 │ 0.176 │ ConvolutionBackwardFilter │ 523.15 │ 8.35 │ 5.28 │ 84.24 │ None │ None │ -│ 0.0627 │ 55.5% │ 53 │ GFLO │ TFLOPS │ GiB │ GiB/s │ │ │ -│ 19.7% │ │ N/A │ │ │ │ │ │ │ -├────────────────────┼──────────────┼───────────────────────────┼───────────────┼─────────┼──────────┼─────────────┼─────────────┼──────────────┤ -│ #2 │ 0.221 │ ConvolutionBackwardData │ 508.05 │ 11.31 │ 5.05 │ 112.42 │ None │ None │ -│ 0.0449 │ 69.6% │ 52 │ GFLO │ TFLOPS │ GiB │ GiB/s │ │ │ -│ 14.1% │ │ N/A │ │ │ │ │ │ │ -├────────────────────┼──────────────┼───────────────────────────┼───────────────┼─────────┼──────────┼─────────────┼─────────────┼──────────────┤ -``` -Please read [megengine/utils/profile_analyze.py](../../utils/profile_analyze.py) for more usages. - -## To do list - -* Change numerical tolerance after XPU-280 is done -* Add scripts to facilitate log analysis -* Profile GPU memory -* Incorporate with QA system -* Add more regression tests diff --git a/python_module/test/integration/manual/resnet50_perf.py b/python_module/test/integration/manual/resnet50_perf.py deleted file mode 100644 index 9f36e8f0..00000000 --- a/python_module/test/integration/manual/resnet50_perf.py +++ /dev/null @@ -1,210 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import argparse -import json -import os -import subprocess -import sys -import time - -import numpy as np - -import megengine as mge -import megengine.distributed as dist -import megengine.functional as F -from megengine._internal.plugin import CompGraphProfiler -from megengine.core import Graph, tensor -from megengine.core.graph import get_default_graph -from megengine.functional.debug_param import ( - get_conv_execution_strategy, - set_conv_execution_strategy, -) -from megengine.jit import trace -from megengine.module import BatchNorm2d, Conv2d, Linear, MaxPool2d, Module -from megengine.optimizer import SGD - -sys.path.append(os.path.join(os.path.dirname(__file__), "..", "..", "..", "examples")) - - -def init_profiler(comp_graph=get_default_graph()): - profiler = CompGraphProfiler(comp_graph) - return profiler - - -def dump_profiler(profiler, filename): - with open(filename, "w") as fout: - json.dump(profiler.get(), fout, indent=2) - - -def print_gpu_usage(): - stdout = subprocess.getoutput("nvidia-smi") - for line in stdout.split("\n"): - for item in line.split(" "): - if "MiB" in item: - print("Finish with GPU Usage", item) - break - - -def run_perf( - batch_size=64, - warm_up=True, - dump_prof=None, - opt_level=2, - conv_fastrun=False, - run_step=True, - track_bn_stats=True, - warm_up_iter=20, - run_iter=100, - num_gpu=None, - device=0, - server=None, - port=None, - scale_batch_size=False, - eager=False, -): - - # pylint: disable = import-outside-toplevel - from resnet50 import Resnet50 - - if conv_fastrun: - set_conv_execution_strategy("PROFILE") - - if num_gpu: - dist.init_process_group(args.server, args.port, num_gpu, device, device) - if scale_batch_size: - batch_size = batch_size // num_gpu - print("Run with data parallel, batch size = {} per GPU".format(batch_size)) - - data = tensor(np.random.randn(batch_size, 3, 224, 224).astype("float32")) - label = tensor(np.random.randint(1000, size=[batch_size,], dtype=np.int32)) - - net = Resnet50(track_bn_stats=track_bn_stats) - opt = SGD(net.parameters(), lr=0.01, momentum=0.9, weight_decay=1e-4) - - def train_func(data, label): - logits = net(data) - loss = F.cross_entropy_with_softmax(logits, label) - - if num_gpu: - loss = loss / num_gpu - - opt.zero_grad() - opt.backward(loss) - return loss - - train_func = trace( - train_func, - symbolic=(not eager), - opt_level=opt_level, - profiling=not (dump_prof is None), - ) - - if warm_up: - print("Warm up ...") - for _ in range(warm_up_iter): - opt.zero_grad() - train_func(data, label) - if run_step: - opt.step() - print_gpu_usage() - print("Running train ...") - start = time.time() - for _ in range(run_iter): - opt.zero_grad() - train_func(data, label) - if run_step: - opt.step() - - time_used = time.time() - start - - if dump_prof: - with open(dump_prof, "w") as fout: - json.dump(train_func.get_profile(), fout, indent=2) - - return time_used / run_iter - - -def str2bool(v): - if isinstance(v, bool): - return v - if v.lower() in ("yes", "true", "t", "y", "1"): - return True - elif v.lower() in ("no", "false", "f", "n", "0"): - return False - else: - raise argparse.ArgumentTypeError("Boolean value expected.") - - -if __name__ == "__main__": - parser = argparse.ArgumentParser( - description="Running regression test on Resnet 50", - formatter_class=argparse.ArgumentDefaultsHelpFormatter, - ) - parser.add_argument("--batch-size", type=int, default=64, help="batch size ") - parser.add_argument( - "--warm-up", type=str2bool, default=True, help="whether to warm up" - ) - parser.add_argument( - "--dump-prof", - type=str, - default=None, - help="pass the json file path to dump the profiling result", - ) - parser.add_argument("--opt-level", type=int, default=2, help="graph opt level") - parser.add_argument( - "--conv-fastrun", - type=str2bool, - default=False, - help="whether to use conv fastrun mode", - ) - parser.add_argument( - "--run-step", - type=str2bool, - default=True, - help="whether to run optimizer.step()", - ) - parser.add_argument( - "--track-bn-stats", - type=str2bool, - default=True, - help="whether to track bn stats", - ) - parser.add_argument( - "--warm-up-iter", type=int, default=20, help="number of iters to warm up" - ) - parser.add_argument( - "--run-iter", type=int, default=100, help="number of iters to collect wall time" - ) - parser.add_argument("--server", default="0.0.0.0") - parser.add_argument("--port", type=int, default=2222) - parser.add_argument( - "--scale-batch-size", - type=str2bool, - default=False, - help="whether to divide batch size by number of GPUs", - ) - parser.add_argument( - "--eager", type=str2bool, default=False, help="whether to use eager mode" - ) - - # Data parallel related - parser.add_argument("--num-gpu", type=int, default=None) - parser.add_argument("--device", type=int, default=0) - args = parser.parse_args() - - print(vars(args)) - - os.environ["MGB_JIT_BACKEND"] = "NVRTC" - - t = run_perf(**vars(args)) - - print("**********************************") - print("Wall time per iter {:.0f} ms".format(t * 1000)) - print("**********************************") - get_default_graph().clear_device_memory() diff --git a/python_module/test/integration/manual/run_resnet50_perf.py b/python_module/test/integration/manual/run_resnet50_perf.py deleted file mode 100644 index a8a24d99..00000000 --- a/python_module/test/integration/manual/run_resnet50_perf.py +++ /dev/null @@ -1,162 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import argparse -import os -import pathlib -import subprocess - -from megengine.utils.profile_analyze import main as profiler - -home = pathlib.Path(__file__).parent.absolute() -script_path = os.path.join(str(home), "resnet50_perf.py") -script_path = "python3 " + script_path - -prof_path = "prof.json" - -log_path = "log.txt" - - -def print_log(msg: str, log: str = log_path): - print(msg) - with open(log, "a") as f: - print(msg, file=f) - - -def run_cmd(cmd: str, log: str = log_path) -> bool: - stdout = subprocess.getoutput(cmd) - token = "Wall time" - gpu_msg = "GPU Usage" - run_finished = False - for line in stdout.split("\n"): - if token in line: - print(line) - print_log("Run status: finished") - run_finished = True - if gpu_msg in line: - print(line) - if not run_finished: - print_log("Run status: failed") - with open(log, "a") as f: - print(stdout, file=f) - - return run_finished - - -if __name__ == "__main__": - - parser = argparse.ArgumentParser(description="ResNet50 train performance") - parser.add_argument( - "--run-debug-tool", action="store_true", help="run profiler and valgrind" - ) - parser.add_argument( - "--run-parallel", action="store_true", help="run data parallel performance" - ) - parser.add_argument("--run-eager", action="store_false", help="run eager graph") - args = parser.parse_args() - - f = open(log_path, "w") - f.close() - - print_log("**************************************") - print_log("Run ResNet 50 performance test with batch size = 64") - - print_log("**************************************") - print_log("Run static graph with default opt level") - cmd = script_path - run_cmd(cmd) - - print_log("**************************************") - print_log("Run static graph with conv fastrun") - cmd = script_path + " --conv-fastrun=yes" - run_cmd(cmd) - - print_log("**************************************") - print_log("Run static graph with conv fastrun and JIT") - cmd = script_path + " --conv-fastrun=yes --opt-level=3" - run_cmd(cmd) - - print_log("**************************************") - print_log("Run static graph with JIT, conv fastrun and without running step") - cmd = script_path + " --conv-fastrun=yes --opt-level=3 --run-step=no" - run_cmd(cmd) - - if args.run_eager: - print_log("**************************************") - print_log("Run static graph with default opt level and batch-size=8") - cmd = script_path + " --batch-size=8" - run_cmd(cmd) - print_log("**************************************") - print_log("Run eager graph with default opt level and batch-size=8") - cmd = script_path - run_cmd("MGE_DISABLE_TRACE=1 " + cmd + " --eager=yes") - - if args.run_debug_tool: - - print_log("**************************************") - print_log("Run with dump_prof") - cmd = script_path + " --dump-prof=" + prof_path - if run_cmd(cmd): - print("Printing profiling result") - profiler([prof_path, "--aggregate-by=type", "--aggregate=sum", "-t 10"]) - - print_log("**************************************") - print_log("Run with valgrind massif") - massif_out = "massif.out" - # Use 0.01% as valgrind massif threashold - # A smaller value reports more details but it may take longer time to analyze the log - # Change it accordingly. - mem_threshold = 0.01 - cmd = ( - "valgrind --tool=massif --threshold={} --massif-out-file=".format( - mem_threshold - ) - + massif_out - + " " - ) - cmd = cmd + script_path + " --warm-up=no --run-iter=20" - run_cmd(cmd) - ms_print_file = "massif.out.ms_print" - cmd = ( - "ms_print --threshold={} ".format(mem_threshold) - + massif_out - + " > " - + ms_print_file - ) - os.system(cmd) - cmd = "head -n 33 " + ms_print_file - os.system(cmd) - print_log("Read {} for detailed massif output".format(ms_print_file)) - - if args.run_parallel: - print_log("**************************************") - tmp_out = "/dev/null" - # Change server and port to run at your system - server = "localhost" - port = "2222" - for num_gpu in (2, 4, 8): - print_log("Run with {} GPUs".format(num_gpu)) - - cmd = script_path + " --num-gpu={} --server={} --port={} ".format( - num_gpu, server, port - ) - for i in range(num_gpu - 1): - irank = num_gpu - 1 - i - os.system( - cmd - + " --device={}".format(irank) - + " 1>{} 2>{} &".format(tmp_out, tmp_out) - ) - if not run_cmd(cmd): - break - - print_log("**************************************") - print_log("**************************************") - print("Finish run, summary:") - cmd = 'grep "Run with\|Wall time\|Run status\|Error\|GPU Usage" ' + log_path - os.system(cmd) diff --git a/python_module/test/integration/mnist_model_with_test.mge b/python_module/test/integration/mnist_model_with_test.mge deleted file mode 100644 index 126837d41f24151b9bad560e0b496908e1e5e9af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1568739 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

6>=J3dOr*+R8Ng$109GR7cVk+qQB1@j@E? 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

    j(T6=R>NsAvFJwGSAwrdl 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

    @Ncs(w(om} zDqCGZq-%r4gJ1fntP?~M*L4wJ6eoi=_aW+ABAhjFKubgAk-5O6TZJ8uu6NcUH=``fzO!_%zEArn=s6zRt< zl7>gWdXT92Rgl%uiGfioq2QezOi6TLRCHJ>mQ2{~xtv5xwTH5bqpbKFC647emuxXz z2C}9XXxvS0X2FjYtmns&T8o2ALCIDEI+g>tbi5@WbkexYY5_QuE0KUZE{ySoT-;EU z52tsF<3qb%>enwsKh3=bwHf?8%}EPLmBlOi^~y8I{ntRxN0!nDj-{m8^dfHRkHfJk zX|P*l6)~;1BzYf#q0_F4Xxqh;YsPKNVOtNBUUvgV8#;(DH>+F6-zDo;`r>h+GR#Og z$y6LxV#9(fAgz2Goiox7N%!xOteRJ3M#p}7dQv2}>|BqxqQ&WhD0ey~JCwSo>?f}x zVrZDuW@vrkf>~SINTQM(-WhSgd-F^QU!^8UZmFTw!r|b_??Uoi1fl0u9wWA98}%AI zfp_Np#TA-?*zj^U>|-q1?aY1p?rk}KLguNQ!CibUN4GC=>;nBckEJX+8vS@%MS64_TW5GxZ!q)aapqrop!+b0HF zA7`;+dn)1crSEKX$!*kDsGui2Luk}`U0glAlJn*0@bWU+sd?`iYWnmmJ-#d&ZWNf- z&dYp7PZjzwZX2FrP;(E_PS%9@ODbqHB#a6tEkQML80wUgP|ofgDdEL1&MTC#jqUf|eb?aCOYc%Soas1YG{i162}0K@4qxPB!|=Zs2W!`4;scXBYD z^|pf;^*$rgF5B3go((X|RUQ_3+-5v|ZBQ*p5?nKk@M|J}9qrCBZ}~MBBbIg1@vr6J z#@$`7ekH(+iR>e*bPiy$Nn7ocjRTx1(3Wm+dQ|)E({(b#cp>JhCjI-b)ijx0W!eF3U+TZy&y1Ub;Z| zz_eQJ+E}8!{0XdIvYcio=)je@Y6$!!if^8*!*`9Z=>yk=Fz@3ddTF~gT>rA4c3K5v z{ZJu#iEwUOzaBO=_60i{_K`M4#AEU2#o)B668#4V{Mvkvs{PBwMV}flC_8|Sf5wCO zSvg=Wa|56HaQ-gsV!Bg788y~^Bx{mf$ivJa5~Y5DD#ys+$xaQt?b1$U=emP}p#paC zB60KOa<K~=kE{ek}otw1HO{mT& zeJ-oFBZi)A+y$`;b>#2UOK^97IG7(%hE3w<$?GM5*n=(i$kh=B*GR--*BOq7VuEC| zx)fc)vGtY*KF0``0$8?D3hnEqd98I zK?Yi=Tt(lWF48C`3F}RU7?aidF!$Dd+L|~_Hs;8|<=D9}`>7)yQIew)J#jc} zy#g~Amr-S1dw4f~hLkuok&XLPNxUYH^MKUTosZ^Nj0fLB3riR1>rO)ZjBTLvc?l@$ zw1Hq`IV9BCo146!gA+<~Fs{)bd|h0OIKF8?K+KeQBI+@1m{lek$nsFn2Y)PgtP z;>aQ9W%b$bcW}YKe0)7kmn=A-0B$|sEG);}fp0lOnq>k>IcG!gG3a4-PkK+iMwVc% z@Fv>k>r7-??Xf#Ti*{9=hsnXyu%JB!x~_6gk!kBle?=J;XcZ@aC*OxUJ8LZE{Fw73 z5}-x-JX-yJN5%sTP($bzjKqY)nZqe)_DPiZhKmwm?s==wm`pUNfc&CEbj~=612JZO%7{|{`<}=?Mn*;GXC)a*1x{k}U z=b+4UB`WiN68_cwOrM#Yg8du+5Vd-H_?�dX~+H4_T_1^xrtMQuHKj@t*=4JhPcK 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

    I>iwsOAtK$q#p2k#e>__SjD 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

    82dzFT}-n(H`-&)-Ba{+IXLn*kQ zXk&kzR>Sp+Pr(koRb0>K0D5O_x8tRO*nA)I_P$PhX-aiYd)E;XJ5vZ;~E1&w(9gY zNIp=HC6^DN!7pn%Z_X)v{bde>RQ+M)9t#uEz5Voz*DBC#&Bv?1O30DAD^QWFTvr|) z1y$#|=+CUD^j+KxT*uKF%^ge0fho%v%VPtiH&g+qB@UCxB}dTmT@XEKEQ0Bq%Xrl@ zr=jNoO$;%yN8v*S%p>#O84v*)!4PPm>kA{*cEpp$>zjfeQ7#vW?Fc^wN+_35@T%KoX_KsMypgSX>^6 zdk-g*D|2(n4rR`ju{($45_8-+H=LZX6~xMtMMO!B^OFj4`~6;q{$O4bBaS(Fb-o>z zI+T#Bzb~UTPZ${oGa6gSP(u%06Gvlx6i`VaKP@*yIp;m7>oBD~cGpPWGINqH*nxYN z-6TQ3wHWb=nP_)Yi^jc@CYhcSXl`Q-+bN-onr=FzH>wQJ>zdSUQkjWYM%_r3d_34+ z%!0mtjulsAkLDiEjIITxT`QYVZJsrrdSD7aR`12o?dAM3^E{G!IfoUyVNGiC_CWec zS)9678W&obfb&QxvAJY~wcLJsOdM~i$cPrrF`n7mtXfD{)oP!V(jt?|?k2JP4z~L|bL`#HEk4(Env{PF6 z!Jjl}pvXF!B>#b~mz;$67f3!Vc%)ujy6nw2wrmv}g3->Nq@TSqHX5gH&K{20b_H6;<1O4(o*P;Ek*rIw&JV z&dqqk+^lP4KfH^BQxzBRdw4UE`SzQheWXC`wi+`}OpC~+(KLFx_Yw+SOsDr9&XU?s z|3UDQ`M?XwgrAsA)jN{mFAam)F9c0K<|d#|R0#0?(?jgEv3KYJ^idH2!^zVr#AblWrb-NpU%+M3s- zT6#OTp3Z?y0bGXS;%i2uT9cVMry4&$FT~mQM_}&{9)f)WdRK3Q`ZP~ES8+P%4aQ-B ztpEyWP30Kh@5ruzD2NwNqD6H-+52ImR3S!$48)J3(^P-3ow^gI@E$SgV$U$gISn3~ zwy_azmNetlV(^%~5>(esMxPxz%!3q95U>qJLqjnPqVw3zt+Q}~zX*ot7~wJ*Kb&%! z%Lacw1`QlI-F?=rK~vawU$ z1E+?Bldhv3jK>d4%y(H%&vTvhO05|L|2W~_q!r|s>TkNr$rT&6RHIw@4)|D8L*9q< z;(>8))=fHzOWIjTSQAI?+MUAnqI*~c&8b-H5d^bCSK#0(8F;VAev%EGi>Pv~H#U|!fc-mD{~bk#};nx&e60Uh~dAb$;WZR);yUBm)8SLRRYaxQ0x2&+>W6Y2&&QkS z#z)|**%jo2*kS0?JkF-cjF4(oZAe%@8T7lh6R!=4Q2pvA(U4I`3EjVBVcK zg{OGvRTV62;#2KSePoXPdN3p6EqT4>40w-)Vb7`}+B8cV1Lkj|&yQW@yrL%H*HK9& z%0H9&Rc`$8Kv%fLcV*)Ytl-=482Axa0-D$4V2X)4xBkt7;oBoL((eKzGWeQI>AXqa zs7TRc=NuubT&T`gtD6QTT4U+W>#Vz*3pNW_qnRDo?Kmb#KFxOmwfIE5nq-gs((CxF zm8Hj`qM&ivad5d>3*PJ#(Avtm*tCwq)De3&toIGIXo@2;pHkqp1h=nSnGI|0^oe`B z7xGSfGKxu&?1@{uKyg3{XWg#>#c&CrUt zwOcRGgsriQ*}c|%%+Q>*aI$EC$nIhx*}fAVJl;>Aua!X6wo=H82_f21SIPIL?!_LHaJJ znaIJ-AR}1pQHLM6ZvJiqX;73Yg0Gk7vb~DSX;Ha0{u!`C`KVBw8S4kodj;L{Itg>) zD9&ry1+BVTu*B;X@3#uaAv?8mSK;v#eQX-(v1hYk>hs6+ynqTWbsFRe4-}K9 z(}v(yeKCYH@yI^i4m_bDX7J%KaT)k$EK_y{FK2zE<*@~DCBl@5KXW8Oo)*MxQU!+H zeGKoDUeG;vACb=QTNt`b4fKO374qQDYJU<@oW#Su3sL0VXLr{2ZE_cCH0I;GCa{V=Q$ox=Tg zEQHnd95=Zj5ES0-2KjS8NpEoq*NK`!?!0z`{A4Q(5j*=oiq69ytM`rLR@o8~qRbX0 zGM{r_Pf0^jp%fytkcR4;l!m=Bl1(Zy%if&(GD^{)L8VeOR3xRLUBC1D1N4&D^PKxW z*Y)|l-|(B6iocWW7_})Up~dGUy<4`D)XkH@&gzBqOI8S3H?|Lc_MdlC7v~#i@JRAQ$zS`Q)odZvs%R6j`>#V&f|?|Lqaqd=0~WbkA654O2;3STJ9jXqsqfj-v% zf!iBHcyQ(*C_IU7Ow*nZG1l*axjqv|C*{)IMkjFmGl~m_{6X!!HkUKt-qB7uk|nFo za{c*LN^taUvpw3NG0@0vc_fYY68dO!K8BpS)V5Vh=J=NzVy{PJ6x6MU}$ z7)}Yn+JpCD@mU+r+y1uk*yla)gB>C}PF~_>M42d8J*7!T@+S0*>)}`K-c)qN4W$o1 zCllj+X<+OO)_HU;w7j*%VeLssGxKk#?8Eiy4kN78*>rJ|GW$`OH0_?sa$V2bUodt_JM3z&)u_H9)p7_H)B-w z#h-&`amV0wYT|bpj|-Vnw|iP(Uh{?4ZWe^H)iW{A$`aFuJ7|61EK+tmo!)Y>#3s*j zqyZwB)4ZL0IP@Fjaw6crJMu8Hk;^8yNPwS@0yw=?#;0X7@HQO9V29N>p4C8Rou9|~ z)bfeEObPSaB#x{x9iZypd$A*U1qgV2#-XC891lGc4IiI_Bg*|mu6ixq(%1$fond$= za2i?1e@bf}I^oG%&p~+WDs-)#%)bjQ^y!4xjIgT#b-1U9KXzPZx>aJCprT=R?;IWS zBOspAN*zAT7lRfqi$2NbG|siQCJOde;IO=rn{!1VzpIkSJokaiR@)%cu9WZ(1mH7M ze|ki{6o-^G3~Vb}NW!ZodeFR>W2y&{ z0aF5;s#TU~VD&c&$USWY^{VsOYOiMiZuiaV-C$wb8yBt7>l8EQ>{ z7rvdKXB7m0W>hfmK17fY1KCh8yO5+R7BUmtZc+=ANQ_WO0}SC(!h%GDr)_@pHvu8A;`M(Brb<(YpeP+>}pb zEQW!Iq!Y+|KaDCQ0c0p`3jQhz!Ks6H8>8aunMQ|ytYfMPg#zyr-V-r&l+aNl?v z>T*5mt(UsU`CsP1G$I`qn9nAi4l(9J z+twvyq}K^FAN-($CjWu6k1EELrNFQ2&oHg#KK=A4oXh{mk<&Wftc4zn8?&{^f^C7! zyY?kGBO(Oe)Q3{#*O%yimEZ7jf&}e46Tt3S^OL;TE6A~(H<9B8n^8KOAroT+_;bff z=)r(e6q6g&fE1stR?yKg-x{JKfM{+0mI^KnEp zp38t6x{~W*A(Xs{rW?0Zu!=LI$-Qs`#>V+Cb7i+2D`k`c4qCJ5R9~=M+x>%eAM7lP%|C?!N&x?lW+a z;dHdOjKw)!eB=on0>6VL;AjvB=k4lYsi7A%7KBnUy;{~eIgGWN&t-q!o(A9WSoWgD zK`{2Mz^99DfO*w+7*jb#!X1UtXITZfzvH|r*RsG}_&DSWM`49WGi14Jg-H+IH5wnZ zgvI9~aJ#HF|GA)e)2jk+@~ZI+x$r?3q?f$Khx1LCe{1tdM$Js})kchrL~N%HFQ?#@ zTplB8AA!e@9f6*+W~60)gL&mE3A|n4M*c|#k!Z(mT;!bt{=u#!=J+#uV$&qF+?huz zzs|<=Me5jbRvT8T9feG(hs2bT9@V!BVKk>#ke2^9opIppIyI?0wH`$DGkLS=j z=^|(gdI||XYcT98=Wt+i>9Zw94BMlD&t6~P@+CH0uVXrHIDQ62H9TNQEs^F_C&AzM zYshtTUG(BIE*CQch;+FYhK$OgDPM@&PlGTrcPka>CBKg};>r-)tj}@J5(}wuVk&0b|3PNt+rWcmx%KB}&Bnnoj;9nk2R<~N zMve80=;Vn)uyEfylC;T{tS;>$C2mQ$eAgLzXQvZHZ@N!@Wv{>pt6&fqk*6Y$Qy{Fx zpXM(5j2cNCCz#Cwi@r%Pd2uvM)0QQ50e5Ln_eE5xe+ps0lIRXqHT+Mol988qMQ<%_ zqu=ba=rz@?RHjLbHcufSchLf`bo_zy6H@V@b`%N?$u&Lax{b@Tc$~+gj-D8bL!*4L zCaD)QaFvN0W))?#ajKj*QF{^;D6Qdo54ljSR7yppl6dc@$1!JL@?cfR7N|V9sB!g8 z337I22o;l8Aoh(5Nebb5L`|G`XWl#-oG}+p$SQ!P|2|C4(ZCn7@to(d67oh{Fx;h` zJkoOqt1mBLL^2#ZQw89I&N^bQ6M|)?lZe4DM|x|s79=i|gQw*c=y&TVrdv&Hy8C1T z6!!$7cIjcbMN|T&YtF(~jSXB6q=iK4{((uGA47eXG&t=m#WSwljDcfU^<1zg zuhX|v{ZTjhxc`#4f4C-Hk>7$`p7-6uD zDoySqE;^~`LsF=bOA4#1upcLE%!RjpsmQz*14Gs4jB&L1 z<)_o3?yrpFifuG|gAUQ&&&RVtIxuO6ER0=@#0lBS#FNX~Y4j$NX>s}VU}zEKyt_`i z#BA_}=K)M^5a6%#cn=n9PhjKZz0m0p1P6YG!jcYEe5m-C#LTGx4rPx&gzHIEN;CfR zI|<37=ee1e9pMXZp!V&L8HbXOVEn3|sXnv?y><)1n_20oGUfrR|7|6sxjfj?O>nMY z4!p7vhwy2CD0_SYYwcnR54LCFSE*Ty-Ez*SUgqAY)s;?_}8Y0^b>!q_+o|Aa}vS9d@mRU7h*u>QL?xvoPOM(OuxjX zpjdJhuF=~<*7cjQ?T^Y~c1IjkrE%TIZ@$dtu!U$M&`v^&`Y<3^lAiy45pwbaQLH$hh!no|FC(6&6$Tw;}1I<-#@JVSSEqz!9 z3G?;wMcoKp*BuEbzdM4KiXCp^y2p~W5hPe`DnFW607aj4@yAOQ*by2G>N3k4mQ8BG z7MV1(=KNA#!(OO=gFB;L1o=BS9?q&&hU|^Nd}5*bkO(cRphExdLwD728kri2q+u2m z8r#5OgCz2>I~V3uO~yqv`!QrsB>mOGhiyCV;cn&6c<0GUa6gdDxflu{uJkPqn(|OR~kC6271>7F71KjtXpl>`(U|NADuXcF|yfqhU^p;Nn?HzG+$NSgx z0q+s($%WWTLb#plW;^`s{D6Rr1KN#Oqc2|!?{kcK#iVMwi2HoU@48AFxZK^^@RQ7) zi(8ok%aiDl$_QdHX9aU+u^dD#l>wbWAL6#CnkjGU;TV=F^m_aaTEu;(E#%W_YMMTr z&idI%{&o;4`jF0(4Zw(F(u}pu4;ZfSLFs~*M7F4v6#lKG>ZY8FDJY!rpJ0Z<#XDJl z-eaOt%4Gw0JRqSDSCI0B#W1T>6aCsQ!<=vTp!dB79PLzqkNXWs%`J15E1x6QEk@Ox z+D64yESa#!5W1)Rhbw+Q!NQbsS~b2T+{K_^Vt}8^ zZ_weUFj~2l;BCKWbko0cY~#C7xPC{cDe;jxQCcH`&x{2iFy||gf1?Z4*IGzKVID|@ z>fyFk3H=v&mOS1X zjqk>_Vf2nPUMZBs?b>Z9`o$CCOD6F5*PO)k=(YGOXA|Aj;twP1_CeU!$vDgLBTcoP zMTf+>4(GQ+&~km0a#jk?4>SSx@aMyyo+T znk$YG&wqP3?!XSL6fS|>)p@+^>|oF~YbI;GEZ8l9s*svhN5hX;GV{OLf(hlUP>JvJXn{tcp)}rz^ozZQ0CHdJlPF;8Bkrg??l-0H*k5#l#>P{p> zE@o2OyJjGkA%ay3vCtj;oXt_@`VKt-xU+o?%wrERw?yK(4#OUp{GtF%7HlH-e&59l zj&As8AdH^P7G;mVh$Y=zcYVEnG=$2Pa6QIzr0w!2;`X`|ayNY?i(NzDsGl7sb9XKI zU3M5EtVvovn?uRd9O`QBfn}!z!BLcO**C7!=9~mK(|*FT;&r&qa0V^c{tq2r_0oh{ zld-$)7No{XQ4ifZsB6uqlLSAK4P9HIed1quQs7S7Lhh4$t7CD6&OzFdC=I!r`*2Bh zD#Q-<(9dd*cwI?rf!}zSno$${)iwpJylQBmx)u3*?k08n@&#W9p2VO1&2ajV44dU( zkDDGFz$O6;p1#*1iZ@DOMb$fJGk*!F7=y z4hgaJZKxsq?eGV?PxGm-(Fi%9qQmBJ+{FBhZ7>*6L_ZdMV^UnsVNUTJ{I)tBSMBLz zj(+3zmCEn%^#WZKEFUCc>YKoDh6TQuCyZNEQ^>0m5yUuY971lHVOFL{Q(l)LN}c<{ zbf!$EkB{7iKk8yI?$(T>IydPx>ow$d`ZoGG%Y(h{FAIHHC&?*kQQC1?i57q#Yi^T* z;vVfdyn7k#tT+Isn;+2Sn!a34`!Wf=l}F-ZSn`6QUs}WpjTh6rt(hE$Badw6_G-P_ zZ+UOuRntr7&Vi288hXCH0duc!fDe}EU~K3Y3E#!TBZCoe$uFF4zgk3!bBd&tYOa5c<*8AwCy|$ODfQ}Znf0BXD2=PDw8g7`hj0^ zWMOFjeOePsVDxr2JZzeV>+8LkbpN>|jC1cq?^Z`em$&4I%ketThVVXTm*YXs+kVHu?DfR9Gugi+?Z1ki0cavpy@nE8uZ~6^)qq+7?9&1 z`f;0T1#k@2vW4{HtS&+#IQ|94zCrviaeW;j<;tUk%iZW$s_(>)_dzy zI^OAu%G}Cu77O>bv&J#RXbc)a1}u&F1>wsos8 zP{)X>HtE8zJ<9Cf;J;MqSSqaS_F|o8b57cslgJ$5VpdbOmegF+#BIA%Ip^hWVs^fS76aPP0MWS8lyv#=}_-5ftc`GGU&P$ z$11+F>!dfa^4qS#%LDsxZ~H9VQ>B3mF7{BzqHY{bSxX+dodeIzS&);p9}8DcAyK_n zxF#_g){2Xv|1%33d9NCjn^zIVm(@^VMIcX~+t1bOlaG>(uqVEps`pFCBW%Xas2ZiCo5nsrH@G&<>^@S{z< z@4m@sJ0O5&W)1Y(@89H4Z5gf^E~HV1DG~gt$y~ft!OgOk(B6e3RQhuao=r@qI$K2e z_upB-CZ{pFV|4-hXQl|=?6?Kh?_SpnC@H~GCX6_Zp60T%XBsc9@1|3|R>6~}tLgMd zVeIT(N~A}MQ0W{a^5E84M%Q8qoNr!?MULU5u=bX@vr05$xu_UT%!I*X&L{Lt)yIjY zdBm4L9h|yW!v>kj%&Z_w*s^gKIAp0({ck)_K2%R9cfBBe59QH6dkL$4ZWNFP>bWGF<&D{Q2rmHRysg` z7`WiT^cHG*%M^lDb7{6iEyRr9hpFDXfVmX~3m){dca#TU?dKD)?%WOT=Vb7<0@v+r zwZxCpv*2Nu8XVeo8lT_EV>XJeq5ZUuywngP9s7HkEO9;*)my@HyvpU>%uqtA1>P8Q zv$|+Xnnr?25-!F0VZop!?!*N7&cNP;hdKJ3fAQI9}6%#$qA$5P6dE+}TH>x8XK`n(>Kx6Y;h_vIf zi~Cl?EVr}pCVmdH$-$1uJ=KMQ(`j%kiDL`I>wv`B2$q-Vi#z5fLhNKNFI>Z7Pwi={ z6k-Qj9M7`OwVvx`UO?~mjhK3%m*ng+h5jq!boTM*q|+uIBlr8_jXXc5YLgP70YE%F z-{a)J56OOx+3G+2A2B{ z$ODUu5?M3x-8|zRgci>nW8wKtYBSKo?mO>-K_JLw*XyA){W_C4Pzc7ndh*Ty;Pq88 z{^+q2AYgU@7iIL>2E98j^^VNRt0%8Y;NgLZIbJm{o9+G!37| z+ODhA;cOqN&dH;1$4s!NQVP}fCqd%jo2WbUIIgktr`w;|F|WUI_l}zX*u|2bAk-g1 zj7ztG;f{W`tU(L!{cI+FS@C2hnZOUvo(4+)wlQ@a2e37pP;opA>TZg` zMeUFD-Y*?kZ7+(EGpibR-AW{-otZen{WeP9-$;J1OT+oa7G&kIPM9Fjfj1Usk@orR zBfrobhI8E6gMEAi-TAkgS{(6!+j%qSPvH|_GpiU(OcT-ZJ-6d~|T zqb^fANY?gIa@4s8`~{p?oy+0$^XJVRJK+LIe|bQJ24m5K^NN^vZDp;);t;2H!pb)* zNPnavmjM<+Nl=A*cS32LY&gp2_mQ-#^-l`@kUgOaEo&fohXhpR!9%| zV;>sVuGdDp>srvu@g5IM-9R-P6B`33aCzd7Tn6-qEBWB_6D#~xP}zK(EcRYQkEf-P zkiieM;pi^BxJivI?lpmerv#)KPZ+voju|br_&f0iejitaw|kes(ckAA7r(WI(@Vw4 zK&>Bmw>LpesSm9P&j7{nc9JZx4VDX@fYT@9L24)+LteZjw^pY?;CISg`Vj;HOV8rn z2`g!0KTFK#q*Gh(k0gCXAWpveheX9`CXU{tU9zzpg#ODJs z&iX_=W4_Vx*@$1Zw2`t1bsFkF#9HsvC2QQRaFwM2C2CUi)1;HIz~(O*&Y1z$mJ`sc zHk=%i3?VveM(K0C%k-+qLA?6Q8wD~7uzcnR;3*ZMi0(ZiZm|O=n68E;RzlF*`~yBd zW2tuHCHA#YETm52z5^Dey|sXSvdax;wRhp)$kW(ycoF9@assUn z2bck+E97ogF4o=(A^T?;K<~&0Sa@3zyGScty@W?Ajx>`SvHI*Wr$|&<%ssQu|0CN+ zvT>J!8S{GgJaVm8hA)&-g{BV%sd#cZsjCo%ON+|U``rPYoizcfRy8xcy}p>Z@;qBQ z6b#dD@<`ghJRBCf!04E-qcZyU$+qk6Fsu^_&rQ@pu1o>d%dBt;w-2}!B#j$Jw8`Z+ zU37EX)P@j&3n*y#lr9uZK{=HfbYg2FiqzRM+ckUXFRgL5{Ocg7EjD3-O2qN!pWWo< zq_j1yO`>&q9?WcACQ(!gsh>$_tBv^su+QmzL4dFM`-9=k_Wk6*@ev-kAR zK4%*BYAOV#-X`!h4AQ)pP>0e;5WaQ@%_Mw@(TeF1@ZcvKr8kW=``n64F6m)K@m6$S zlt#Ol?J!G@;)!e5V9ZMrP4CNrx_uZq-6jnd_IjM3yMz%4lxJQ|Is}46lbWU;>%)$~ zSIogbR*)zij7o0i_`S~uj;9KuhP(lJrTY}8zlyhfB%N0%a(up3q<`l>sTm zQ{d?Per7Oe3N4%DPJCKoX|hy2*_3*YS*2|Rj$b0FwYoQkG$%0h^+n=zs1Ri@F2X^D z5b$ozAP=7pQn9>Pvh?UBSlD3)Sq%~J{P0{Xw2eVg*LGHBPb{=94S?uGML3xfK|Mzv zFh6>AVfxp5L`%91~CsBPbu}^Hfc@oiqb#4i;XGbwjs_%gKnd@<2rUkz83nW*bO~fgR9`M?@j@2$( z&vNNvuw-5{8=;DvR-QqmZ{J~#9t}jrjzg&Ya-2RZ_(?p1ZD5PnT)gY24a*_~$ja|| z#7-a^c#rPWL(ZpZg-R&g;&MLE7RY0k+9@)vkiLnR}D zCXa>qEvvYkgl-gl)1-`rvzFmP{XQ~dLMzyR5+-5Vv+?tMGh_=n&$?wTtU5Oxbmmub znIBJJev}jba_-Qt-rl(M%NpG3R8HH)?!#wUO6r!M!82t(u-N?^Rqryzf`itOaO^0X zm7ouwzUiW7M?I?&-G~paMKfJhS+MK%YU-TV0y{&_lk&u5jvH$Q_oj)1>k$QzuoZ18 z_+k!|N2=h|lLXwq^9vd8Rf9>z#?T%f3ej_<`Q9pXa9zL=vg#7cHs4%~LC)=PC}Rf% ze4*t2P%PZ!c6S{NOd~O2#XTD6 zvkOl>lZIHugK#HkEqL-yAj=(2`{#)}O6|Q3w{xb#G6N@^I}}6@*OoEuR^o8IcwXZ>x05(O{2KY*vH(NZ zmw?+bY4X<~!a?12%OWMiQc6>dxcvq$~$bNBwa% zSmB53r47G_Ueh_6$);20UqLSc?)+N+of$NbqMKzt(v@-J%uv-h#s){@l4D$y6WuJ4;#VbG{HUkN%&WMD)s(-j9z11 z=;XJ7xNvzK-hJVM20sEAUq=J{VRnzK5NyiUK814=e%XR;AEv_L(iJdz_zA}h48vzjpP^h?O@k4c z1|xp*aA%;Oxa*&S{7CNdly{E``72?=G&4+mYl3PYCHap=1*u<^HF^I#0h9Ai0dcrb zt2hp(ljR~j(_@4pS97qJ<77Njp{OXPf~@6vd^33&E}i|HcXXo&Ug|c1*8+=hpU(v> zITcFtc1^>aCbS#3X)` zPCqV}>t+P?7n@1$kNYG}Q3!Hbj#qYU0$;$>39`mKsWE>F9yw-*P5K=BHgGq28nYkZ z$8L<8J<5<2N3wkFDf;VuSEImV4Q6|v3je7Tmkj|cq8l&H-{4G1w)iGgIIfRbUd8Oo zY!Ps)Ee6$T%UQkss<{4DCadf@2a>AzX#S`l=VpzN{muoJOE{hlG5gGuJ^KX0In zCLyUY1Jv&JC=5y!&}-{Uu>Z_0axnB9nt}x1AX^lUy=3XBpmO}6o(zwEbl|~#rUyGWhLJIC|l15bgT?sO{&O1wupNxjqxD1Rvku?v>tB0f_i=!)uh4AHWOklIY5p_U3b{Tyl-do>6o`;j{%m(aSSlWMK*finlI zNI}zP# zA?-l{nQ4WPsd1e;iJPMv*N^Oq-4DqVt}*8lYKX<8^!BM7W`$cQR@1d+CH z?7kJ*a4Iqaf9mannHL-yPanypA*BsOUqF_>DPseKv=}hE6a7*7-YF`%NR7mMSaRKp zC4AW$GfX<@N+r+7;aum*!1umLdj_@1{JK>vNTf1qduqu1)J1UQ^G?nMD+|vCdTDaN zIZQ5kiZS(RB;^3NQ_#%jSjD2$H+B|l9cW0eNSpvc7c;P~GzSOU8E|cy8+xfW(2;3# zaQ;$7ey)@u89Fl$6b6OhNp=yvv%Q2Iju>Uudep$wAv2kHHPf5W(nSy5Q2s~*U@*zZ6x3GBPDBp6Hkfd7^_lAoCJ=r z6@muLzbl(*p2!wtr+Twj7k6Vr+6AW8m-Bk62{c{Gt;JQzDe!JMnbGVCBK!1Zn~coI zc|Q!1KDXk0ZBxu~uyO<&^-hyV@`c!0dI-xmEWo`wLAVj@$+C}OAnW`Or;2LRb-G*O z(ZOO+GunVxVuH!~AOGkYd_h)m9;ObjH~6ZmovBZh2fMTav==x6=F>Zg!R3W`(n<~N z4oqjSe@TS~W)}8Ul#&*);dk6_TZ-sd=FfSd512u8cHSH zviu~(aOZk-xiG#> z;7LdtIEyTT(uz*{a4Z{2`lRv3ybH8$=39F8U>&TiT?N%Ex1sQYTByC73Wk0YFnsDQ zYSt>nA6Jj2a>54aR^kHR0;6y|P!h$jEyuW*`81m!3la}6vu1}qk)0?9WpC5LEqER1 z$6P`Odr{Ch6^cbptC%)R(Izdu5o&4?f$o~0P&1{N%X;5Jp|i5!cfcI~S|`Jn8{6@} zqX~4e%}MGZ;?M4pe!=w<&eGoLdSrr31yAWx3$YxPq1{gTI5jSdzL>usRvf=acV$k7 ztmh7}&ZdCwKPyGTrmvxO{LOH$B!la=dBT6OveaOaE}ne41gz%Xfq!=r7#B4HC#C+Q zmyWz3qA7oA!0G8^v*R{c;;;_Ce1A{PDwlze!C!piJ^?-k=ivB$?(aVPCe?BqA`#Q? zfacms{LI7e8?1vx=x`h7=$e_0Y-$0~f8_uf$K-K0$DN1^%E3{C5U{i8Ys_v-rkaY; zv_xqFJi9IhCmIQwcN4vFqJM_#fqlnR+s z(fndk^2HtM1w!#-ZvxLGql%Vs{L$FZ0<8TN$vyw#I3A20xi&Kp7n~6TkL;zGnX;8l z-ZCA=LegP^sy)v9IT5#yt%r{n?ywPOqe&L4F(E@abdjtxWbYpCY9u8bDW-}GIp3F~gyf)L0D$dCw&*$2)md2g9mdgZ% zoGv1PR)?|0A_uu7FIFu4OZ8O#!{AHe2#b*J&r)ydamuY*cfe!e49QzGqZ^(B%gwxsv@+mH~`ym0=QXf;J`j-RFK^Q);77M z?ZOsfeySXt2YwTI3vD#w_QsheZZh_1K76bty<{UbPEqFg@B;Mi<2RW2 zwHE@JaI)`oIn#G1A2zBwqRVef%#26@R?LgmrdCpuFY6#}Sh`Wdr;Htsn~R~G_eXrr z1<=wI0;Q60cIF`|NZRjB-S!kiMPD3c+Uls^nt1Tg-@`}+tf68jQgOko?W{t;S0?U} zJ~cL~WIqItlH&6oa3na9w1?b9r-2Y^n>EN(OgI9EOe4sAfse#%;!f}p2*+J_FOWnh zE!?okn3bUSb8itBX*eCY)Mkz6Sl~BnVy|f+a0M zWW$?UrZFJ^=Wy@sD_8nM+383+pq__s)y6qa_AuxdiGq8O2yV2i!J~e^sMAepES#uA zYmWP(PShW2vaK2SyQkpYb57u_Vu8k<{j?_Dpy{u4B3bwSB$S$Pv(PVlVU3&yG2>Y6 zZA!yb`ilY@FLi-i){jZ(WgZifwgS6&8&Tz4Ipmdz!x6*%%(AJ8G)`ZJI{fj2smWYl zd)`W-lw?mI34bK3+Hy&L(3{3TXO1y9{Q8L3`uohALUBCYlTLqY?ts>#@=Xr^X91)K z0be|-EufjO?ZGa3qcYdI8zw1a?!#8Mm(8cz1jS#;t2ZZxdY3l%qe03>B_(0O#s5RJlEy)L2|*1a1Bi zElCriWG%)n@E9eTld@nYGZk*Ho5T-dcM%mSBW%8sj-Aogkm%@(x?Xn7%AQu7{5lJw zcGcl z=xWk0(MxP<{K%t9ZCYko&Sie|A!sOr3LpDK;Y>MoNclvM3>2fsNo$PF2qiyGa?H0Y z>eT7*6w+%qnGD9B!u^%=p<#0^tRD#m@xVm#qoIFwKi&OzCYislo$)%U%w+mM!wKb6AyK6i z<(}w**F0OC7M_XEuNh-9?*JZ~-pX_6eu@Fgf*iB^Hu)5L0|l&P;B(0^vu$K1UfC?g zyiUlVJ<|2mLuW6MJhU2X&psq``ZnStQzO(|CIr=!B++(T1bj|t0XkU;`RXx^8>cmp z+!%Y{2Ree{M0ujy9S%Bw93a_t866PnAuSyV;Fu=RG#GZ63Q5a0=@)UmuTgQ-+37&u zuKfsl!fVif^$f!DYZ^OV{3Gf1<;Y(kC*Yiyl!s zGfI+UKamlaW9X_c-?Z;`5VaT#LT6iU#`5eBd7AeUl=+kJh=3+=B@7^0v`QL{9PhGP9H&tKr6N=tFG0f-{?t{#0-qk*0k5|FB!!jJ z_!q}Mk-49;@b#xjs6k?2lbtK)-MYevwjIIC89r#GoPhqRXLvWaxs&WdK6)Q6!8hW> z%)@QT7+|ad;|Cr>Td^=$J7~kUui2#I@DS|?66P|AYv`7ISz0!|3I8n@;6FQ{jPl=k zprXA2e}As0s!|##y?;G>tPFN+7RqOs7vj43lG<>oItv7FoK`7N;kO zqW3^Eq#Wp>55t?V=v_biSyhK<`B>mjwe#rQ7)f50uE2nmb!au~H{HDME&KZX71qgOFi(uNrc(&z{B`mBuLq#H&5s{25Jj2_HaNKkWyvmHgiF;hZ zQ!fhkBSV7SWeU#k%Sxp!v*}>}@Zn3nyPApQ}n}m&qul z_h;dAVL}5%7?5sW2#K=m;E`krlnLgMip`0v%Gp6sj}3yPb*? zA{>AI1(FvR(g%BosDbGqksnt=_vp3k^`n*WTeS*8IvgR=sh#6ZA3?dho@CDX0kXRv z;A8k-`rR=a+>Y2Wwo~3f#C<{f;*2?pN~S@vcOa%dl7pisljx;%UH(#qQV_RL#9OB} zFtLj+GE3}#fsNQXSdlM8R9mv>(IAeUc62XrdM~(K(8oRJHp0c*mr!0OnyMz0!&fff z;zJtg72gI(d~gsp#+`y)2mHtl^Ltp|c^I!5mf}pV=aRrUgJsSFLhiHXZ(n;w&D5FBlQP4)t?bXe1Ag_uo$4#hy@$&1%wYj6FWkXqEmr~S zyLotCy&PRahv24*FSgrrvyu%_jMu{iJU@RijvNtU!zcFe6q;oC-}^%`@KQ=++*SuN zQ_>#p{oDa&+!I@I^BE@Pf*p+Z+@Tumd(J&5hV~DS(Y<^LY*C(wSu3OAg@yzDmO2+E z1l^$K^W=HQ6}T>V|8uhQlsYVv4Fer=093kfFqh9YakG^kD*OC4B>#`1^YF*&edD+- zG9#m5Rdzxuocj`?MQMss678Z%iR`^+h{{%3mBe%IOGYUa5|OA>-v&($mCEn@{)6ZB zdYU)fnzKhRcf$;|#zP*&*xMWG9tvsP;`Ux;f zYGX1gWMTamf|-t&>2q^E`mt*Z6$^F5>yG6#?ufQU?3!r!Xr_WDVqqNP(jPV)iYDK~ zA0hd>6`KBSft$_MBvB+6r|y)5^$H8XD`E|gF)F~^t;tLs_k2vA`H>v_x|J#p6L^(A z70S8%)TMJBSbRPgP6#@1IVKNOY`jB{`!;c`yJYZ+SqBb6rPT1FGp3v&xM*TMmenjE zGhfSEcq+$}pPI8#x6ck|HmXCdmo`=pC$I_os;IVkF&%WxB3pA0(z4azOqa?HmX8sG z%^Ol#voIkLJ~bD^41O`|Hn%aM!|8DMcrQ(|zksJZUlF?@c?-)5?hJO89~0Gduvq9m zXu7XXo2qFqgT^v%ceO~Iq#c+RNeMT%C!GU1f6Sgm5g8eO4An& zf?$)7#h1qA?86y4_}g|i&XF*po<|D7V466-G~wa$SvRmvqKd>E&BfMD_o+*xaGeb! zRd++i4dpM4l8#;$0@jakcf@ya>E;FaZ}n;7G$#Yiw*ZOP_o5zo#f-qN{nW?Qf$AR1 zAt#UU*GXlrgX+*bh@g*k<~`&muEv6MN;u`(1!hipI0Q8Gz&Y6>DrdHtNUUvy9_d74 zC#+9}coF#R@d|v{0HvKD*o)VsaPiedYAip6PVA`!ziXAaE@nFo zvva|66*2gBs+v9-tc6`O4smZ6&f7O#9*mz$U{L69*7kcf&G^y|VOD}{o6kOQP>6>q z)ptn5))xBpeg=kVN5HM`VmQ{y2MN0X0@SX+&a7z`uO8)-ojN{d-!5^Cx)YLky!Zhb z0izDQ)()r56&Gqt)mHE$)nhFlRq#6rO@lC6}>c z3Z3lt72`yRFPQbI*+Y*!Sq8@LS~UBcI+Rp4m>)lz2}6(Vu~ScriK^emgz*FLLbRa3 zCKw_@d{OdcBPrNe1L} zGY{^}ZRX92T?Gr*sc<{OFnTNU191;NM$Dp}V57Mw_VtEg-1!lR(aWT)em5MK2!fht za`3lbjV>qF_`s6%o))ETbx~Yv5_h7-Kloks35a6Xz?zG-_%f z%;EYz)%j7l_g5Hptj@)q*IlTcP!p+Bv?4R5Jz$E`Z}R6*1xf0ggfd5hfg{yZHv@g@ z8JGgDs*7=K<`VV?m*;$GlF0r_h@s7Vwe;nIc)S>&K@!t)@xST$q$_L>REk@%?g0`O zjaOM>YkmYGdku*5fjBxRE|ONhN=A{A4b(Hej&}NbGDU`VbV34|q4z0x|HwUXO}Px) zJ_%a_otDhDLz!^* zH|1PlYHZ4kGT7!?fW2}>xZ3>=W~K*|_)R)+|4_sjK*=Z%=*RHv&92H1v)9!@vC@HJjV$)?QB>{c{&qbj=6Xe=gh|QXJRsuBUpU`;m4g z^PI*TkZHCv7IY zwJxx9l^kh3(t{pRvT&-x6Xa}iv20!^PB=y3^5!h?KXa40p__qvA5MT=-U+%JIET$G z3k+*Df{E$zz*l;JV%Sz1d-gbj=CT_=z=DicaY~_e*JT*FV&uy0J;k*(;Nu>X^9jZDU#dD+1xU~8+duwSu*}v2T z{j+tkC5uwQ%khx8Aqs?&Io@MmDOtOQW2ActP}@>BdXV!1`+2#u7tVeq&aDx2ufi$v zXt_NdGu38atDZockYjMYH-_r$yh3Z9o1lE60+Bb%AeVRP;L$0Gh?M#t)QL1A$M3Lmy1OI`@TB>N*YZ0miL zdyx$9JzcSCU@IMHze)1OH?gPszOxTL*hB88Bk=pNBawAXgdZ+EEL*jQ@^%YBeAqcy z)3S&j^UPvrFB5|zK|UI!nMHR+Uc%5<64>#i4Hp(J1-p(NP%V%P=M;O%&W+wQt=@fzi zM|FrOqwxfhN$Z<2$aAh>Sz6@U% zw{xA9LO^#vFbdj^wI$bBiFtkG+_i6XP^FjzXX(?5p)sNns7Ccx2%_)scILmvdRV&9 z9jFV>?8~z45D*rQ-|P0``ajvY`IiX(^-{7>PHA8g#)Tp0S35bLX@+ZKEtzZkn?dSE z1(AOI1hXF{(8TkXab<-CPPx?puer`g=KX!VcMY7!`1Bcg!^^|ziKkHi;WCaz`HVzH zJLBgStxRgP9`0)EC5JR7n2vj)*zn;p{rl@WSn^vz$%n-xF=z=HX-J2^YigNL7w#-H z+aA?U70`XQ^TFT99!{^Ja43xrS4m4UHe7x}Sjm%4UNQ~LUN0odpJ(ArUoG-{p*yo`p&0#5lDk*bS1WG9zNQs6Qq~ffw3-XK6pZYK2oSwo9Czf5u&~R4;oGA;YCR7*w8wJsH?`o!eN&{PF@S9w{(g|wEt#$yf(vvWW8U)Zw7^IX2Dh2vNTnN`KY5qT|F9EjM-7zLOV>SEo5bZG_ro(i z4bt=0j@YVK(O+o>@b0*v#lzt|T>G+^ZL7J;JXvatT|2iiLxl{PIj;eFzcZ}nP7B!n zt&*NS^dBBSB@7pn=fRn=jl99M0gkB@0=Yl;gN@dEn!6+!*XRBvb9bwQ=xS~!+hqm5 z8`Uftc**3I#5KBn`b|t1Z3nlBRMOq{hn6ZGB_jsa7*@_#mo#Y#epFGx(Z#l)G&_X+ zc({$^nXiMN+Lh4YV@ZlVrg9lSY4TzJ2)R4m4n-eH)hXLO=khj|RL@~2EOs3xZiW>! zIA{iJk&a-WSnr1WY9C4C#%_}P0?DB&Ra&4N0+)7a;YY*2V7Im!m!R#Tv?li_TiN@tokhV|Mv-Iy1%0W zU;Dx9#WnJg%Tt|^oR2nNZV#@5E*6|-sgXlv}I2X!@<8EJabRdwMky&G4dkMK% z8I11RJ2@ZjWS)xOA#nU)hvT8A4Qn?cU*+|01%VX@*7a6d9 z{(0aRkEAbW0@=U80R~?Ukxw;qnbZPjP}!8oZeps4Y*HJ&v#5x^mJuQ^d=hBRmkYRF z$(NSbouIOj*XSAvOIXyEMmB6WVcdJJli@eobk(e-L|;aZOd44LAAKV*VCrKMlynGI zY|W!(<3@CG)C+w2;3@Xs0a(R6XAN!v6b-oIbHfmr`gjR`dhr9c-3vKGx?9O1%2Hu&S3bve27GC~OC=^}ke@4jXsgOxY?QNt=;H>o$|IZz|1zeNx(tzL zxCZ0JO^~mxiEdHqU<~(7f@X_!SiEv8Jm_t~OAlT#MgmIoo6!^6d3ZVCYbETOEQwoJ zd*ah&uGC&8l3v*4M}-d9z{ZbNWIq3N3zp-$4a=6-Zu(aSBSNaEyZay`%yE0gl>`BckzG?xBaxWiiC|wLJa_ z3WQmIY+$gq7w4Z*!o5Y?$(-9PvD8d}Dd(p$lNK33f=nps=9vDgM9rzzcs!%f%Mt;d z1h)C9H#EsoyoU0$@k}&+A4$NZ&Q|&^w1cdWrDWyFN*b@dhY;ZwBJKB+wB|RG-2$2x zXY`(uG|_0duTV@+p1aCQoJog_FSmHlDyDFAaBknFr9s!6=p?T@-xIpak7J!5C&P}l z)X45E9_>;mzYbIOaY!eO#Ls|j+mc9J-Ugx>;zSQNdEu_gFc`5NqY*~YxSC9m6ZLK6 ztB@g74m-kD@koe%R0G+eKMC(j6t3W$dJ9S})BN{Zm~|tK)=sJe`mC4rpRy8FrjHXB zwMupn_kp8VHvV(&XX?BSvFE)xzR}mChte~cwex!5Bzu7jetd-gWvs);Bg@&xkCTbJ zg$wxg#L~W(Ls0x*EAO7j8YulYL=Or?z){&$Iy|xxuIYz?p`IZfP->^~`o{EKG>_g; zOam{YGFrrMhJUqW=%8039Zp^mll=GXH0zTXyD*5bcN<&qwNwti*!zgIjIV~hhVhi|-cZey{DbiMbR5~P@wA8T1Q@ zrU`BV^wf!)R5b8CdA-0JOu7D{)P-X>xz!X$1HC}}=4u?8y@aIASxy}mJR;*gD%`B( zEzORk5ZNS+ik$Pj@{|b7Kf28HN0|e$b^ebY9o9whNjC^ndW#h!{E*bHihrla(`~-K zxbOEbvSK8I=C7O%M|;kLzm+3VP=5yev#ya1uH$r;$$5BOKG|Z9Mm*TJB*L=X8hqlD zi>tIX*{+!<;k(K(`AqYOq{}zDBV-Aef&Kwc9!ub_iA`{l(Z??@m05*TVN`d$JxpHA zWql^Xpm@z&bZZF2f+RIEDSrbQ-Ee?L$=Z_2r*rV1$8_>aiEw>yLFQ%5cj~!A6l}&% znXl-c&er(k;MI&^qUSAuyLR0ma2!p<~hxS7u*OT_o1MxiLahOC&7X21UUtmXByJ)Pfbh zJlc_J#LdD)IVU&A9ljKVEt`yhzA?pOnQ+)*JRb}SWAQ>~Fj*?g@q5bW0=rQWdiOtP zj~gAq;A6je^~ydNqIke;YgbrJDc3*Gx0FNcZ;kLNR1)~gE|TWg?sWXVjD`K8oAj=h zG?t!d!201|@Z*sMqj$^=SpCf?Fv$x(r>$eoXg+6*)(c^KmK(0l@4%0OZ-}*42DJUV z%*<`NMC9bVX}|IT&datJ*Qtk*;K?V!`K&U8)#yS`*e$YLlgBe$I2qsRmH^ql7tht0 zqjz&BJvJ|qg#9VQ{W>Yo;VVgXeI8Mbj|5~FXyJ;gr&PdY9_WQjg8irfm|1m#=8k_f zQbZqmJ^?+K;!gSQ`-6+0F?QUpMjv^m!3APS1h8 z2X4cfPxVx}ip34k5CTfvvh&_w^*N)JCRAZHqNh@p&lU3GpY;Y$f41$?jRv}p(}?0^}E?Lq%TVU37HIoge!fhjj5$kU4&pnLxr=@HH&mWRvn`>I5^bug9O z;XJo@3wjB48VPy<~(G2U8fWN4?+ReQ7f#$B`NH*QWo?@9w;df?vYENaPu_$iq*kihtfe+d>MqDyG`x{Ps8eYoL4O-3+{6K4v*7- zbU+2_JwFn9vx|JS6r}&mZ;>0t$+)dw3J18X-1$I#-dA`XjCaYB=^=a$7CV4lHB`zMtd$oeg9vQ%Ox2N$Qa!2%4o* z7S8V$!T}ds7d|B5aCRg~ZXITaLyqIxyb`$BvjTf(B;$#P*T~zxfm(HsAQExG z4|;1Bz=k*B@TfnGEk z@G^fVCcnAPeu`L1dS+x`tEK=JF5~(tj|#}mublT`%6clq-J|zLJ*TH972+DF7~EVi z360k^kfcM)QF)tq-GsXr3_M6C8z$W7JDq<>?~Rakkw@V!zo+?~e`=&?e=X!0oPb|4 zf+$|K03DMiMa&Bq=d&Kk zVfe$n7uU6WL$;qO%&(_pq39(_juw%{k0$7<8`-4nTpV4%F~w#cO$X1gJTR+!%eenl zXXo(hiN^0@*m;1vyH*w8q88v-G^x-N`keChRgh)ef3ddr2;2!P28CZ^@I+)1=XLnY z{E3W#12L1arCk7(tGjV)7eyyuDctB@i-SuvEG`RJ!51MGJAe0)J@$7vCxR?>am0xFfTziV9llkGQDN|`D=QmxNcLa1|T2M>yFpkHcBmaHb0{$;HVuOGdYR>G$ zuN^aSLNOghb1o3Rhm-1h+zsKn&u*G4;Y$wk0zkMs5l`M!hGzrHSm7&Z;YMGffTVQY zuQv;s1W2VTgSpJQ@n>@Wl@OMwOVufjRFbg}A#f?<1Nk+v^v%MJNG)VxG;J4rUTy|c zM3mu7#|LKPgG@8uh%M-=Qb6zP5bZ$CM3JM0P$*}?#X46wO9f2qobIB#v~k{EW_m} z?h)bE$>b>4qi8sF1sC{lLFaj;B=i0=Y8b5nS((i=Y|If%-~Xn1bG)f#VJ^M-d^Tu0 zf25;(lwfF0c5Tw_GS1%}i)SDFA&LLy1LatIS2_`9=AKKQs=dLvygZ5HS3>dVBV)J2^E!Mz>g0|c5)*O>Gd$(Wuw$kh=;3^ z7qd}(nIvh&REx;gEAaV&A`}Y~3m0F8-peYWT8exq8O(W(f4sxSpkuhmUcPQfBOF%L zah~6r!_>b=3^Us0*!)Ea*i^ijrVcpbe?9TUVN)1sGI1o+yxWO~a5t>Z3?P=bikM+R zCy?;J4JVs(u}JYF)qN?32Q~Cy(0D1F40r(zr3K`Pw>oam7GtX?XR}hj?!xoGlORiB z9M{~Cw)j)rLFFZuP{)61TwcPH_gKT6^PXKsWvNbTt0Kacc@{!-zA5sDDpAAKW?ZZ2 z#LiPy2649#Ge7SjH0qXxm9}=wgqU`n%9AWImhgpcv(IC8+~asamD{+T>LJvO;c@*a zKF-M!2xew(ux?Q(iaTv3lMXo3X$q&=wp1|^YZwb!c`9J7vKgNlgv0fQA9NnSKa`!b z!qBh%)P(Dn@_#Y~;k|#U!v!gjb*jPmkTi}pk%*QN4@njGeS;oFzQyrSe?I{Em0Ixb zkP;jb>7lO!~2Q$fsW7K-mqCM{cwXk)Z1jIUOO3vyMw_nJ%4-^!V;Em{H(9p<9L z3n}s>CmfCx4DcG?-5@X2Yq?zbOc?qwiC#CD2SUoC@bBs<1nlJlN#kYkSht?OZmYn@ zle$T2l^b|(;+h#cGhptTdfrn%GwOZg49O2VMFY=o1?`d(=w~+-Hctq`G=*E__;(+) z2@Z!8{ndEWnumkaE~1!y1l`kQi9FFDlzCXlT)oZpt`|g6JEv;)&+!J2y~s9bL?I={D~HvbCg{9RAL+O!5^AJszS7H`l$lm zRPb#)zLn$eaRxzu`CA<8Jb`@|(!)CYEucqpUEtiaZ{WQrl;iVwVM#;_-PV$Z{c{dO zq{Ao1q;E1C4m08IMO!4USINBagUJ6v1fL1#;}mIQaJo8#Hqp|M`$~_(e`|rSehsR2 zxsodF|7fDWBThN-gTyV|cM$O_fX92h9sO}LA>sf~yLpNwk z@e=6SBZo$Ztl^k>Jb4(nlIiEOq`|Y($?#GMsOo=66@ogM86C6s)2_2c~1-yH>24p#ZL9a`0JB*5Xg~DtuY}kx@(tMh_r)Td|6_a9K~5nws6C%?k{`!Qmbo|NB0in;&7WRWi;lZd!o$v+D5M z4SQNRPYPFk6o(V9WGvhk38LJwy*M@95;~fS2;mEa+Xg1o@0Ka-*q%x5Nk4=0elN(w z*n05Pn1dSHl5jI-8XUA-hirh6*}xbWdQFf5r>K;r?7mY z7>e|=(cyG9S;Mh9{2jf}0Gp9nI z>2*gftSI^iA?Kw~H?|IIPZnXu2~&I^=#GCbtjD7@o@8ZeHmS?j!1$F{NzzMOIKA5v zPlu{w@zWb5uf&HQjP8J@6hru?X#o0n^3C>ki-IF}clmoJ_0i~G(v-DC+E0oz;@m(^5bhPJ)RLo zQ~jjy*@_=D<86CfELxuGrpgACAu`_BO&3qjK zXSiymk&izn?E6P9(KhyRd=iFktRU`v70@_pNAyjks7}i;xhkIuR<{;YCb|V1?OUmz zf;Hy*1%T#CA22FcCHGWn$)Y83@I`eawLWzp{`lX(5)WE+@ILNK_r-Ym>ooE<=cLa% z4%dffV*K6Zgzt(GR@c6<>@Di8%?5drrWlw*!<9H~m;dN>iKBz!E2R9(n| z8UtYqm05D=|9k?Ee!I+WF|;G@%|m3b^%VT2x1UTE6~>yX7RWhx4Z5d1Vs%ALkatfP zeAx~Xa;}g}9OoS3ZDIIiM1@xUc44|y1>xZk{x4SH@;-QRQ4#C6e*^nEJ@SwI6-g9d{*FD<{*{vK5D3WefScUz{a|wn-gsk3E-#wGb(@b7RmUlK`e74j zo_R%!cFB-;5t^{gda;G)rA263(~MHj^r_-nVV1g_<{19!AaL$A5jho3^|#yw%k@Wr zohE3JA-NKk>KTIix@7tx<`MOEUXSNh&tZDxTsBmK+X4Kr#-tCO97R418m`FWfIv7% z^G>1WhiZB``!*e$pAN@1sF1Erd=S5Gj8uJxB~o{hz3naJsGTI}T5;*!MQ`!wlAm;e@Cv+VIv*FvE0W-ewd7&zNwntjwQ}Cv zj&djq*eiUnHpB=1$*a+?jp=lw)E(No^aV?O_`x*w2hVq~8uB)`U_tU3T%$ajuDg8| zw{!;M9lmywJ#&=i8h4Sw&Bc)X`WkmntRpX{SEJcT6x+J(AXx9R=a?KpdiX46-A5SqH#4U3Ohj8jv7$uOMvsSj&OQY4&3q%gRJL| zSR1zo@La{2mDy4QPY%w2n$bYCs`P-le6)I&X>kt5~?WXewKhBuSTTjfVR04RGHp1&>uLK|y>3 zsp;h5+SmQ$#{W6vE1r@jCvVuGzZ>1N)=;xr3i7vJkvD($l5mkc(s2F&!@l1FYs}(s ze_t-9#Ma=6o@+3YWQ9zpGRAB<3g6w z0!MNBafYq1&86!Oq+)@nHi=1`!hN5Uah)m0l#mIwzQz)EQ)GNd2_=M(RfQjN>7ceM>`{zkd(g6emWFVe*u3ZL1! zzq#ZR^Qu;)c7*25k0sMIBIp#(cNcjnhOV3lLG*meK9&k6o5!Y-myaxP$E=gYY^^3) zcH5QmR8K(H_wBg4{Rb%xxkj(Qt!2Jt8p73!p7=;^GFzy;5{+YoA#JNM%0Bak<-7gK zyDS+vwz`e=%^RS{^+br|o^;5cNG8gotKfqlj|u3N#y@dKXu*D6i?9FrabD(4B+M@Y zAC3#qQJ*RrJb4VJsizZ%Q#nlE-cy`AT7ssGMxu25Ajiw_#G(DE_-1T~Ewf8TeyO`u zUQC&(D%QiU3n{g0ZNAfzvFCVm*Iv{v{y^7`dclDyO{7fR82?-SooWAB2%>XxVOGHq z&8G`+{mFbXBb?)AWIe~pdV>IdCK&%>0dA_@L?1Vo^Va+kC-Q-X%(Kv0uw}6)3I%PY zKKD0*%7P*D?b4NGWc3WXr&bgfI$lK|>GNc{wI+N!yqBD_c!|l)T#hpRAm$}B<2U<@ zYXt*9}tP)Er+L3Wsw-1W0?g?^A`}YuM&`dD-N{&rm}`1exPvY4m3@_B`rwrk=R-(>?*$?RR|V5Z!w<}PV$`~50G{WEI_7KK-ccU@g?7x+CQ8LFO`NX+YmPyioL5diuTSznJhePRcFId$b zNj4T%;O#j($*Lh4SfLb0w>p`VFM_hD&#r{uxqlcrML^fWV_>y9i_U##fP-;KY~Vg^ z5-7b39z-vP)soY=F2fLAX*a=ccfW_G)85uvT)7J&N4S04%YK~wwFWj^m<4*lb2JzY@inel;nQP>AX5mV|qmhGUI?0dj&wj%_| zr;?^Z2NJzi4-c<9hRmQkojCslBKFrqtQ0?A{EWhv}LF-lCh`PpyL zx}SPu#Hwp{-R^i-Qc=2zq)zhZTqB|kyPun3J$X+!ekmj^k%OcC@x*HhR~%7Y3Uhw_ zB&OG6sBFn$a_K=C@sJLO7?UOR<8yWB))4~L)K&QCOE%b_mV@b&3So4U37ji-!totP zsqfQbb43R^eASgkFMimEwxI{eL{c^5@k0um#zM$%g)?w%1GiHO5x~XD6{I8l2ZeSI zDE#Y+Yqng2T>VjE@->T2$@__Seb?aBC@11nRYq>_PXf1?M7Vr>J?K?5(Ce3Hz)!wk z^tkvbm|U=)Ia417um2MR2a|5nC+QEDg8RwOLtL+C;b->FZ58^oa2sZ6N@I~QA3D2j zhVtUK<~Aq4m{}JIqqD#=@S1W4N0g?+vc3l*XEuTd@>ILd@l}ym7?Jkw$ zSjIk|6tO=ej|Q4GBKw?2Til&M*DC^a4Qgr1)N<&1p3Imn-37gy1bL=r8&Us9B=SGs z0REeO$bJ1PvSiO2s+RnVDpv7Bl({~AciNSHO66k?Ep$T5mB5Jojlf3{f2pv{IOv=`$;DMOTxkO0g|omirU7aaKdH=USG@y_qs%gjL#%*0h=T*tR?=!QAE zD8R674t-r77@jYNY-Uo`dFJ-~HGB51BNfcSeU z3sZ9w%IKP4?v5k4Uw<|mI%16}b^}b~zh_u-bqT11Y#{qLPr)NmY548$r&?35Aa?B^ zt~(eOg8j2zVp!A`91c&WDW7!78&emmxR(!0rUe7Dv*D6Q9i>p6w34x<&LS$Bfcg=mkNKx6_cUar4*nD2yHwcnmUB7p(ZMxbpW#Dv1+BPrkA0+WghlPo z$u-mSbO}tY`yx3DY$|23`{^CpUna};XH}u1;|N)1^M%fgbjF1|AI#u7esyPzp!cdE zg7_HyubiN^!bPI9EF3&sBpCzFlj!;Pu2~KD4E0}pm3=r#29x%_C7awvNN3hu=*r#< zVI6(+PzxXY;kA-^iQKz+Y$34~8mCQfuHu~rX~>lNz`k2}4;FC2a+Z zm~AQKWN|y57JJF;on%i#X1c)L8bt^SK1H@{bD>?g|B(%IZE5kr%dmWNE5>iVNN;l; zi3n@{I%D5=xU+x{qJ5jNWX}i8TxkmdcGGYlG2r-*3&H%$NAn~@0;4kippnT9mB;jd#q9gn$RzV$gw}1>xW0NBcO$<`f~;%V z?GGNo5hJeOwtkF0;m!iaW;D*T%))|)5(+wxdV+}qsG4BRF z#LYey?|#Pg`6r-gN+9_@dy*li#>dO624On!md6kc&QRV$k*w0jR!UHyaa&W zdQDg`Jjk6@qG7on9}U=i0nTZ)(SHrr9D72N%sI|ouYay0?S`dXkAQnt*!k08!8leZ zVStr0`@${^OQ(xH!r}ArgGBCR0X7O2;oKF6$v|fWmNo35mPdAB;+dQp@ee)JuJ0SW ze0?lF`&-3$dnV#*xtHX7$~(H2igOImdK_$wE4f+w zmZ#*z3?0~$vWU4~&pBb2ZG&E)Pjv6DX>jOl3aKv1K~4J@IF$7ZBc6U`KPuUfjk(-x zc{~e33pSb!?@_ZD(-+6h7F#fUQ7G`Xb>j3T(kP!dh1fk#Mrp%BEGQI5!R8PmCCCRE zJ>g6Sw|ld8`bb}BO{*)IW(Y%X@6(w#KNCJ*ZtnYih&k6kMzif~aq!0l{JrfAzO*?) zgZgub4W8rNLL%VSeH7dj8rcQW*Ki}(U&x%JM*^-Yqi9(L$o5zglNaf@H7x<T(g{*3%de|?OhyR{$Cw7e;hd768bj65e6dd4v4 zcPZ6Vc0fhDV>s4X&9n?3##*;fDEqM*J^w_*)H_MA#9tBC)bx`tN`dgBoy!t?onYts zj!^eK^Py|64_dP7SUuQ=8paGeThR`4_4L5??_%nFPz?IQt7zx~HR@vR!|j^@1YTUG z77rI<(o}i;+rZ_o?jm`y^8{uuN`QntJMikB5b9R+f|^*3faJJ0sq&78+HNgaa%BND z8NH!Q=4@meP0?cAQeaijW8$iB^wxDHT=hbe&K5j`nX;;wHD@Z=3|$~E3eOQ*{e<3r z_mT|PNTTZFOd>H*Pg-8w1aC!SPz+N>mA*Dw6*G^n^mTzV-dSKOnoe#Aexkymh4k?= zHC%R>yNmZXk$*cEVClU1;P_jOarJ3J@>7pKHT%P|O5SL`aR;awmQb}%anNgM0Zy$Y z)Tcs%7~0&VR|9PD_p)+49+biP1a>hV(Xt?X*a-XFa!Hj(F1z8-W_H3d53ZE)!<(WA zGNQEn@Q&x$vM~PY91xMOguEslZB$$xoqcDdpt?6!l}6zFwfeM+;`!A zv!-vMZQ}!WPRUK)HmhXl`=tc*uQu`E_606yH&B%YFPVXFuV}{_dA8UnhZ@!yLz4F` z8l?D;bZ(x5PGu4x{c9_<9iE^|b&~1A+dihZ=qK0)_!=p2Ok(uUKO3IhtMJaO= z@YQg_0QC}*iVPZk6}DZ%Bn3J|h(3oZ@5h<^8S(N$qBYHexb z`3&k2t0l8B;cWx8kUvJ$X1}4SUFK9qHktX|I)j=HJf*E)c{u&HA_Tt+zuxcLQwcBvTmb0 z*|7N|Gq^s}ymVbK=e^c|J->=^>ATZ(U92dW7fYi1*ZH-Io65*U+CjXr>m#fR)P{wB zGVscubGU493pO-~;lo#YOo81kA~@7aju)s?pSW&#vnUV-{AbijFH#{>Z#F`qOgdFO z%}*P5HNhPIRB#<0K*e!&l-tulRD;cNoyjr?tVoAGDRKBU-y5c+OM=tC_3(BYKaH*T z1-)p_|FT&JKvoNuy$Pp%#+Q)gvMI-{VDg9nugUEfEf>*Z_16`#&LIzo(+h%CSLE5`D;p@YyAnt9Ij`x$ zQgcD&PQ*tSAzNDo_9aYa+gmr`e%W*Q=j2}$?Z|=z({1#_rj6h{wS*fwCXwHtGPyau zKfE}8omuIU$Vvz+VAlFKjPII<5c8;nWVFY_A>nLP|FZ(M&wEm(g8$gpv#;V)Q7d@8 z>mF@gH$wk8sbIthagdgw^yhzSTuv>CbP8QZwPH)y_^p8IH|&K@zYb{iN;9{-qz;BR zi|HZr5>~4JEY01PLFOhN1P@^~w6O>?H|2isjyk^d(8WMD*tC$9e3pZok3T0t)mhlq zAA-#ck7!(qg5ZSE|Bw>2;s*+8fT_6QG1>4U?G#LVJr$>!HDfG4=NVd@V!mqM0G+!#hml^Yf!75>74Fff12w>2=a)|lro&daa%Jz#;MecM#gF3|0p`|c&y$xj%UxJj8JG< zr9=|WeLZBP6iNf_T_lx}qNMDRoh>UP4Mpa;FR~jXZKH1rm6VDS&ENU`;eRjA^W68j zuFvQFo=4w?XXzsb8D+dyv`flVT}n3gxbpr2$%KSbWe!Ge_#u*!`- z-V%?Q$zJd`D2BFw{YC2UsZ*_QiRd!dkcvqDV+Q*5;HmL5y8f~^Oq|(hl)d6Jd-828 z+!{PgWhYso^Xn7|xNKdcciC+ao@bua{ zMC@Y|eLlPnly=6V~>%2K)J^V_;Ym@%UoE z+)Y}GUVkl!h>S9tWy{0ml>#vSsh!-v*NYn-1j5p{T9`Dx1x$Pw8%Hm=g+Y55{Ah8E zlEuP!dRY)@-Iixuv0^VZ(iDX})f^)?aShyhrHtd^jKiMahrqt~2(15p5cWJejt4uJ z;8Wj|@QT|7H-%b&Mo2&Vqh}J9a_ph$26=cR&J>qa9>6L^C35548jv?Fgg4QWHJP`a zz`E=@%xmsKuZ#=TnqQZp&1Y%6^uYwI55FOUi#Om&<_JEL2j=PNLLw?Dj?!X_Qtdsvfh5^NuI(ElleGu5 z{mYPl^9`o@zY=(OKa_4;5lZx;u7T*SV45z<2Y=nW>7G+j)FOHTYvNXiwl)k6TOC(* zQZXE7?%2)VT0NH`r)Tp#SCzul{DrVNc|D3-bd&6T2_!i)2x3JJFuIGnNDJq&ap^t{ z^SjQm`FWHUO}~tDYeVVjcjuu)#RSU=?P=MM4D5@G#OkOS5I27ZXj;D}u7)l2QST?R zxb7W|6CR`I_^+UMx*sh}4Mj_5VLUi*4!d`93LXuJt^V%PNmi0%`r{vWXBhg5mrgB$ zR(k=Chav+y4pr=$No1Znd;h;ME!-TmKdx`Er~WvX5skfX%Nx3nf%bn#zf^%vT)-l{ls-VFP~V>z8llP!=LP7 z*!me+IQt1hIx0v-^m6=exsVAN+eB5v=8)I<+wn-@5$gHH7A^`t0i}prusie!#}<;q z3c+z=v*R45x&0=wXYUfzpm})hff;@~A_(H{Ji1x&0QIsGhp;U{m>ed7DY33p+fK*$ z+#4yTu`Co?{A=J0IHKnEC9Gd)4w?4N3AdS^fQXC7u{G>G*e5s8r&4Mdqg+hxzgYx& zgKtT5Frh0P#CaaF@-XvG7>DvyD&%?_XMc4@0q%UV{W3wzUno9 z?;tG&B{XfQlF*)Yz#I=G-P<+jzHVA=(w&5-Eq_vh%^#^om>u3UWT^hnrI4LBL48zY zu`Z{TG3c^mjwwz9trJ+WU?{R2KDkV*-C6J+Y1(P_I^wf%R=01;Q4l8yTpPl_5 zEPJ*Gn{A6h>XaOd(Y{doqYW+84Z%9b9mB;wVsg?}^48Cf9=Ik=<2*;WeVGINsmXzU z*A`MS)D6W|oz!(e5*r4%K6b|>SaowbDs84TsCsry`26J#r319WKdIXdU(JP^|G$5H36@Z40H&XBr=xt}UQO-%*vy-WhJJt|nSI-iV7aBpy; zLa=rF2@w1Hk-pe|nRPXF#O;}z@z>b|j2HcnOnG1r(z@yRbCoW0EU6rX+jXhGs|O~i z|1$bh9!A1fYe5Y6`Luf?1cnWx_@j$p0^3AieMGx=%oc7o z@i%@AF4`SW49)DJ;7~X`{mc3Dx?E5qE&-m8tz>)K({Rl86m0&(K#-9JN=7?kN#rF` zG-{5oCUw)1+(fi}w-!!B%m!le7nQdn3E&Vw{#h64EC+Ac*0LTh`@g29-}q>EGz*i2 zf>Byq9BjUoQBfHw-jIhZaU^N9xKx=vfHu&{HML7?WFLE+FToeo@bd1i-&!(6EJ5HpO zdWqe@Ir?g!F*V}OE2oAqV!FPGxO_oo_UIF`c8fps_n5+)#c^aHIvRqGx00hr5ntoB}A(zXVUK7SvF3T2wM4BgZ#}BOLM55$~B33>u=2*?Y*?049 z!(f;cyq~{-rgn~z+?~DD#Az7_S5bU(*9vU!9)#0b^#~8v1GHSn0wEp>MX$v<`xfGB zLrpAv7lP*!f{3{58(QnkW%}y|nbJkS>DE6kICo^+_@>=F(&j5mGYYSRy7V1J_Q`G% znLQu6RG(1qmO{3>H4=un*z)xv?(ByjP(8XHw}wCb-! z)#sFr94I37UnkKI#mSgjIZR19!*#@kVDX45`DiZ$K@p0eKE;5WD_#ejnvG5qQfTtu zVqEuE5B^apTzw#$o;_-d%8qj|Ao3!pzM2IU=R`3`ww?s9O#}Dcr-;#lXp%r@vVSb5 z0{!V! zQ259Vbg_;`!Q~Th{;w9Yo_8@-p3AAJG_r+LlrhdF6`z@_!5GHDi9Pq>W04uj-quRj zw_O79W`&v(=>`%tErcBF+l04iFm>B@1-+U(nALMnFpH{<(D|2K&2E1|*zo%|777+&AT!+BYi;J-W?qfC!7bFb)QyrL&` z9JvUO1e55>K^>e?8G$P9(!AiX93*BAjP=FmW*eye(zEbcFDx=M6Z8YUT8FyBmg@=A`a8;-@X-s=VUNjftbLl{| z`SXVEz8Fjn-|K*~Q6Y$^9;a|;CEmCmiz~E*K#uImq@%m0u9CdA1meZJdYd!=g3+CWVqaQrz#E z5REI+Pl1%N8kar&N5}a?=!QMlP+^@V3a>AwN3QyTrPq6!&kQ3o`~eR|n4N$t7FvRj@qBo8K^`@_|Kg>zZ^o@#e=;+sj<6mD z)A6&FDdhL>sCHj)jaW=;VG2rxYCJvzK6$2!Ez6|9di@G|={tb?{##(za}hQySb~k4 zoWMCznAB;;(M%};WIu6T6)j14di4qov44ePTn4o4wFOafFk zLGs3D7@tSU_H`}PoRQ%@yi`xAd?lTtC(5lB!>IzdOWSw;D>meOU{;o_WZbd^NMyJ^ z7D}z8hjh(|-IH)wqSL^vkdeV6+gR-oO5wB!s@D83yH$BEbDWhPge=rU~jibdhPXQHP|Lo>>0*oN?HW+jN}U{Z3Zr zI@NL4=&g!UHX+*#O*GGNe!ky~*W%^$rc4#<_}hkUuXO`U14)qonFOzrwQv`S#3idr zXq;#Z4HEal_ToY44w*{6{geTk)V>UMN1l?83z!#4k##`$X zBz(@JbB}(lz7thJ&%C=tk9;`B#OoPCNcJKK%qu1z_CJ8iz3brQqa0Lz_M95e)1w2r z?=YtBB(AZG!KQ_}s2!(5kiR>q!k&sUu2OklY+Vf=4VjUPizD|EKS#YB8 zIyGnYH-r7-c)PAXy( z3q})~WX}Z#Vhdzpo8nA-!N*_%Up=|6Uq$!NjwY9ax4`l-2`o%H0UKn6>CI#bT;%zk zwEqy`30^UVl!YNoYU=?a-x-J*3XOF6w;Qnfs4VR`S4b*9nvtORN-WEKO7E{J#W^$i zA#3**@G4lwQys{mr4jL5}s!^}0+E~vS;0De4v z2B}Yw1j`Gc2ROno$70Ft6`-1qQE^2gcP~1HYI@6w)eA+O*p-h*{Vssu zK?aj1g_9HO-_ix2EfF+r*n>ZOm_~yXQa5`c(K;HA4JP~W&-_P5_bY_Cos}pmEn7rS z#C2A8am;3k{atkYZYS{UM`-R3T}&HY2j$i^sJ<$P=D}(({x5}^?NGs23ol|paTWm_r ze5bFz*Pu~J5*prLfY*%q>DG}&D>P8HRIbDjY-Lr4T0xqXcHF%b_CUw?dsO_e>yql*+V;ei(Cl@Fq7 zyZBH#YrV1Mnwj8o{{)owuY+86h_voP3|p;&Yx6$Qxd!=AaN#u>XgEabw9k|Gfn{_! zV=Axl@M-Hee!H^GEo@gTqFM!P`|_#HMgZBM>W9r+H=q+rKx)3d&EPF zs$gYTBaUqLVl*Dzt*Tk&LCls;q4rr@AvUay{tDEEpKoL#JysJg9FBz!?v7YCa1KLf ze_{)~thwk8x2qYMiHSoq;o;WTRQ=Iy+*ZQvx_``sQLdw;_gI;o?_CTR+{Iuy^PD~{ z<#H~4&xuap5FFNu1rLoFbmnibp6YA{M&~_Izmj8VcTU1-GOAE|@)X@05C~$QijhWbIx}W_x}6v!R8ei|KJaA66KMVAz-yQ88rQ) zVY^iwsl6yo>^{7u65agJqxOy%M{FfgLZ0xhWRxDgHbh-!gkj*{hv??Pb+q^EGC7O= zKqu9WRGoFidtobCeQ|FvjIjW?dXDQW89{g9O;lc0iG2@$k;ZRG-<9nrDp*5IGmfFa z*glLm=Etxvf7px#M%XY@7*l1!xS3!C^*FYa^lVDPIPbH#-hz@CpMIvUwSd$eu>nO@ z7i|4vO848z!9-32yU1u)RrQi#`s-df{wZC6W#_NMeIbS_CB=j2=59Lm>Q}n>fgZeF ztb_|5xWi{@esB<(1flcnK<#J_c~>!jSuRObZ9o{NKX}P*avEo3jYFxmwmY4%e#jOj z7}B|kwkWJY@jw0~sehcz@R<*tz8_(CjSh5<&LFKT8$h{1gzg*(f-PM(v?IqJ#F!j&VG- z`rYUlvkM!a9-~$}%1QOlErf5TKiOsKgYDtIc%*F&URvmiIqSAp4dolarK9;Dh_;OD%ZU^<1r=5N^*>ia_-y1%@EvVK1tjY#CUQTNE_>~mx_+ zukvG|xmb;b*VNy)aS27z_~WuCKK5hz*S$ zIskH0uhJDSc2dWJCAi3`fpj@V)9)eIVZ3z%>bdn>EFDXlLQBOgNqdbFob5Od?ZY>iHzF6QoPIkl4JihX z(Pg;$+&XTdcOL9?SJmvb^aZCVQ+#G&0$JA#aIjT|m~-y=mc`59+mT?P?n*U|Lz!5f zZ-zT8G{|Mn|6!BcP49A^%aWu|bVFwp=eLvEuBXCJbIL5rp zVb(dYsC-5V?RgorBI-VxSK3m(jYsiR!V)$^3fKfW%1-ZCgC4^>tN$5&#+*GR^t}8N zu(@IY8oxYA!NzEmvfD*gexAfeJE@~>nH#E)XEKelLrmq-8e+yh3lYz3h$HVKbKsU1 zw(32@k=IuVv@8IVRD&9G2_dr0Rg`YoFiiNLAB8bnexk6Bff=v(LFRlKNsK#5^D;PR zt5lG&5{%PbQ^O&5~HJ!uz_hGo82n7ei%c+u+_yXclOW;y~i`)O7&{~EJ=8-_EU<+u zJ-^AEv3;~iON*Hk%Q5EyoyoeUsa&R#%P#TzVXxRdJhN4c9-Z$~Ew%hGRf$!oncaJz zmRHZ=nFhK+2*)9ptaCEz`tFYV{zhWC;v>e};tXt=K0=3gzozjvKiJ<>bkTOS9$y_w zhQZa=P=2L>%^OW1g)1+?xVZ{G(Cmiq7t@KG=@KG$)eDzdZy@$^0<=dvk%U|6lKpe{ zQg%f>{n0)jT|!@BLii{8JX9HnMSrk85s%=sn>J{#{7Ie+n1Qd~Fy?p-;xcYiG4UV00%uTwsrS>G`blXa?~q$*&&XrHUajX~e((Bs;S*hv^reidXt7$Q>7X z;>UTI3T!`K07$SSo1fn1t#9Lip$_WaKwoj$C%W{lA zbKNn$pl|HcrVxPdzR=$h2}7KJW%5j2vU2zV>Ob8LlTY3!;xGTw-U)7Rq!LJFCa$sO zsa)=@x&|K#-D4YKCFm6OL#)~8GrH_s4wy$C#?K}U$*ZhKz^DmbGH?z4N z{+fOA$CcyY-(@~OP6J1++su)lJ{aFh(NF0QBR=~i_Vshj)l3B{e!&XQL~z|tsX9V) zI5(2KFJ|<*g6@U~WJpT~RW2;W&6@KO?(-lo;ygVe@4@ys%twh&tKiUZKJ%!sn5r&l zp_?+MLBVkY{Q3J2D;FUFXQHp76UTMvE8hym8L@OKUjaM6Pm^3ZT7o%(>&VsO4K%+x zlVo1qOB6TMF$iPAi&wEq543k( zBG+2?;=2E8nW=#%X{@gubd;;md6OP8XEteo)`u$A*OBv$?!N#xo;bqEX_DYOE1oSH zYB!$N_wbjj?sf#j(}lP0W@Z4p!RNVcd;c6G`Q@Fjwtj8uswK4(@Z$ zT&S1UMTM1KumA;Ny<00R_KLxox-Uezz#b-_%P^7JC4*7bN@gP z{gjI$?Ckm%d3)L*vRXk5`248PW+ zUwbG~9r!*>Xp*R&eL#DS{+n3d6PwrjnsGR9vCcHf~`?qWT$F8$xaukk$*c4$8XMtT5~?g z&~Brl0aNMXcqtmanme;|!ie=)0*E#%SKHdP8HttdpjTddSYuGoc%i; zE56LY!`(S(S?dg&hoV5~s}Ol`ECz3`4@15Lj`0&(fmk0#%=_O#u8t!V)DDqzV~5F2 zjZoSYq=wQ?g-oRKOd`9ykW^20z!LimxrgtQ*I*{WuK|Xe&d$cRY9oL{x8-KZA1N z3-Ik=APPQTfa$st@Vwn0K3jiaR*~Y-02;h~625qQ zi9{!fflKOKY<@b2i$9)5hu58;!rD-Ux-V4voHiS|BAW8gO(%A_zv#taCF9kP65yNo z6MC<{jEHc~)*P`zWawdFm1%e~_ny>1Hq@k(AH2`3UP}>t`PYMUV`Aw|lK~LzN<=wz zX;_~X53_E!Fq$f@aE`l^=-Zg!kp)5Inb}$VIy94agD)S=cO8LeaUoFsr2wARjgc0P ztzf*NpPkV-fFn=VK<~kGB^55~GNlBP_B~+K&getZ$4oNpV^7Q% zej|s|VyVeba~PCp!=4k1;C+5Ixz@iK)t42(z+--9^Qs=anVQIDtR4{C25uI??a+;% z3qXSK9S+IpM6JuBshoQO^&KZvd#ehj=9xp3OB4=IPR8hnJ}fm)CBDH6@z{qTNP0XS z)V$uY;fV*yGtO0fH9#IbY!guM4HB7~Z^#*|Yz*UOf8t7qG0Tr1!=)mqs&E92w7o?o zKIO8-sT=XT9A(+-T=fZGrx$&YGmT)Cz3Eg&#A9W7Sg@=E*Y`ky*sQPeyTT=^I zdiNnT^&dpnqCI&3eFtXoeZ%?NH&i!&naXZUY-Za|d?lM#1Y@6$8TY(@riTv%fkaRY zTlID`GlSm(3sVxH-ZU5ZA})i@wJv<2Zignz?=aKKZj+%v9T=Ux*?8KQD(v0&k0cm+ zLT;xK6l#o+lo1=MNw4{|mU#Mot;p*|Dlga4$FcPu36ShV*GtX=r=-2@# zh!E=H{C9oq@XG<_V!Dt_XE^!CdoB4MXpdQ7v}7(Z|B?fac}EyeEh(71P!#opoguG!GJaa0 z3_;Tg`f~iIVWnPp{aF;PI{ESI7S4fe*+UO;T&W`_XGoLeb})bBYJ6{RHO4ep!TzKh zpxtAEuJ6A>pX+_1e&HslxYQ5_wK8h4#fZwys-*78Mlc%OLqhL)YmbJZ z;FL6sFZ_T9kJgeOhSAKRW+({uHdCRsVfbLd7t&RAA07sU;nAD17_o!PF03en>Nm;N zJux?ML3uh#PP&iH4S_gw$|y$i_F<(E=KxD-hnxJFm_0iUQtD#S(5H`_^eg7(g>h79 zvk7-cy-jO!1)0T*N~tEt2@bc2BP(vDgOPh5xwUT_t{BcnkJEufLPG*=x_9HS*aV4R zr9~8$+S2|*qP)|-KFsYw6S^bj4$LASjL$6o#2(e!Yn=932`uEz;ccBN{IzpO)6F-i z(TO@HFuaxWmS@v+UKM=Zvk{doJLvlLez^YSQl4;Z1I^NjKt;E9veV`~>*vCG$XWz> z);D~i{0Rk~-x6{)d=s2|aUFc?i;0u+M(PoeOP1+ff~`My;i~IRXgnnXUiZAGT~Z+^ zFZGvupL+#j@mB1;+J$u0tKUqxqzJ^NH9@NH2noI~$Z9VyCrjkRV3I^XPN=i=pil&O zTxugNe-6XO=bOmhe;>%4CvEi9v-@b$EeY=R2KZfaE^cirB2HXpz0^wyF7WF>b6*bS z|9Fw?`*Q`HTxVeAyNmEsxE^-69_P%cySeVtMpF9G8nVqp;ilSYh}yjiKJtq&9)7ZP zg`G0j#i*i2D*`}QX9s+qGzq^x;aJ^Xn@MM-3>8uhqnXSPX2diR#uSf({HYkAxiug) zM}U2QKaEv=%MW|D`GTp@B&^sgLtDsAGB@ZjEpG9qj}{-qt{+jjk{3WC5?7HBkL?g? z;KSa?)rVaW!7*n0*||~&aC)OJIDY72*B9&~-$Z>-?|ltU9_EAHhITNO%ay9lw82}C z{pq1CmGr6m2l8>^3Hdm;itdd$gHMbUK| z_9&+m$^D(u7_$f6@l;txAR(|smxb1lw3y(_SS>3ttuQLRiKN%X|`8Shp>es{>Xo;$N zKwgKt;k^0Nc*ovz{lwlP5`Bp4O{ZRji-8s>|GA86olB?uvW~DPsSU&A*I?`1$LKoX zPXaFq(T>~&upl!5J8qnZ8G2jMcxf}t8uY|E*%|1N+QKXqiHC-*(@^orA8L|ai;eX< z>_Sax@#u!e-*C`iE2&9K-&4Y0V_5gMJTbU3Uh3^jE>r zMRl~G;}uyfei&SnLm(5<>oz3SuV7b@bE(YV=dGpm5tZvTtuT7528q*>XZmYspSr zZ(@nF-u%WVxup;^C6Maso}qlPTBIVzfCnYXK#hKbdnp5F)6$8~(=@hJDVsK@|oW7BsO0Yc)bN6WzVV6KsYp{jOSv;VYj}nYkdPj`6PrAZhK5+r< zJk5#5j22qyT@AnXG?O!_+}>e&FXXd^FzJC7KF~V?WglH}ibDY`a}$TI%_r%hh5YQn zM+R7F{e(FZt%NmlZTRs;F`~dY9hguC{?vBp_}NU2WYXxxCEw}X$Un>ruWaf!I7XYl zTxKS6?O?>2t&M(ck>d7T@6n%g zfSQkgBuYcd__s#5=4OuvRQW8W@!?(ci=YX-HIl2T$m8zvU(OMmM2^{IyoQkuGKBKK z!Q{G(CF%SY3~eqFy!XW%_bhw~r0nIq(3^wd?44+kdVT;L${WbGIZ34OFiV%GeyaAo zV$SjRTgiowm%(L*Ilir7vGAV{oq6aZ+4evj93JhW`$QIlwf0-`@}U~JFfW)UB%A~3 zhkIer+7j^tQ-2ryk zx5LQx!>s#}8DQ~}vLUIJq`K6JzIN~|q@1g_eT=0&pwDhZ`)Eb(^Ck(IPge%^f5Z~Z#Nm15g>an{~(=KQAUQ5O2j+)1%_`q2r-(^ zq1Zl)k+TfI-Np%Mt)EZ(a4Q~qC0BJSAho)&QIP3BBnWias07MmytVeiTxJh zF#dQ8=#MsHFbUg)O1- z!W4R0?H+4hybNgCd^nP+MN57iADpcnF;;a03Z&vPuArmYl5f4h0KQA`paEee7Nn{MjzPKx6ezXt!k zX3V1+1&l6tV{R@IMk4i;3UR!AcXch?6X{2+WAB4h{4=ViErLt#UBO?9`zdecPdf5= z0%iGbk&|^3^v|^_+}8(jx7IZ{Dq^tNz@_yQjIn!67p=$j+fnta8m@$OX`) z%9w%p922h3W@*q`~tDNg~57#cOSk(w)-D3NT9Ti$Mm$6kBTGI|Gn zKR*@=*VUlz%k%VSeGj=j)Wcq~I!rvyU;7K6(Dm+@kWIUKuw z1J$z2*+(yH!PiI_j`r6g{*0lcdnd>lkA6nX=P5X*E5ZYv@9c-N!`SZWPNtll&hfEs z)7OJNFfpgvh^?Q4oqw`1a-;{Juc?8u72$AFG>Tpi-VPT03b23EBsBQsOGl*>K(}@& zk-Htsxp?YHVITLyQ>Keo6k@IvKRs-84AxcJVwC?+_}HQVS&0WRxgi2BtlEIabsE%Y zaTELE$TBSJxr86K+@Xn;7wFDo)5)39rKn?}Lyi?lku$eegUlfdjFM-W8RL{>?6xJA z^#tb$&ZmtpxIS}?G<8+D#pUXck(b|ZfX3(7=&(5eos2ul6S&*&m2j7>~X*Rpa^<+7I z{U+3ubm8?#U!48Sm*XQ`C8p;l!MFX9Wb3Lk+^ALny(abJc{ji}-*sVA)>E$IkwrKE z*1^H)0=)NouG1lR!|JOA9M`2e2()gtg2%!AM67H9+U%YIU+(wNwu99e`J$LL3QQ;rYLqkHJqGXomRF3Uz1XLRrnpdIcX^)H8F|q_;{B)V}H>d3hbf2K^KBUAFJ>>exT@_si^`Y#yP9(`hbr_+nQ z$C{GJ+iBc9dKh{d*5mW9Z>Wk}7X20HN2C@$V0U>uhDa?{eDtf94*r))i~~o>F-IF5 z^bI0;ewoNLi|~~EcYx`;<4mla1RE1_9A9?uAY-8cmMZAM)n_7PpTd49amk}bC0n3U zTLqUK^8&WS3AC*>!75k+mmds-Z5Rl9N~ht&h1_#>vKs}%MY$cX46o(G1X3*vTPHXreK7t>&>}v#d{?kyS>nn{{uJ4ur816nG374GwokYmr9QN$$>)3hJc z15vX;qk?|~54+3utN-44a)P8W$c-&MNLS&>{)_krK`=P_Kw2*i%PWF8#e1W9}L zQfX5!*79T#DR2pbUHs=zSjPf)9X961K#bo&B75p=lM#sa_A^(gNZ%4smoW=E;axfb=7~i7xPM?XWN*ukbnh5`< z2|;VVIE}NOOrC#eBIolu*b_pPpngDyUAN!_%C=8KGuJjED_CHpcGnp#_zXa6dKuNb zC(YEW9V9uq1u&vo2Kr1MnSd$bpOa|f2W-(I z-m};?VrbQl*Jg?FvI8BUY`QwUC__A!tAWjlOJVe`7d~^nMTXL}@YR<9G}-0>zh~BB z#i%@7?9->Ju3 zJENVEPL*N#S53z5pia_weVi&wuOiz#mtt>GBpcbf3S|xM(FB3-M7VE)tg$I$&y4?| z`?KYEzhDT}_in=1HBGd1c_~^>dB;c?h|@K^XxKk#AO6j#WJNuu*NDge=A6#EY2)h~ z;Cyr=K9G1w{(X|bz1h03Me7nyKX;AF_cVj}zH@N$`b+v(^*St!Fos7Pi#fm3Nu2Rt zE}IyVPKRVCLHnZ)wjua0L~P))UB1;sZpD2NE!V~Lm&?)jvR2I+5n&iyZ%bDR#Nut^ zg|tLHoZI7X0sl<_XupSZ(})Gqo{$pqNhcW%^c1nvF_mmyra&IO+KGBv$)F`~jO-5hL(|GZQt%J0roX<-#|dHrh|nyP|5 zb!BW$q63lcHG#EuR^W0wgPy*760LJNWgYIB=iZwpq&BgtB?;J) zQpJi$juPj1W%?)H0P{T)andly1f!v-?)H>S%t@qK(%CfR{BhVm`4*X?w2*vGb;0){ z7x20(#~e&MgiToraCDP1?GqQltjFiblOrYYYQ)*dW5#B3x=aDX%QnFS{c2Rbz7Nh7 zykVML{LxGK3A~;n2##LK@LOsFK2p!4m2tDtWJv^hwJnb}*Ds?6S1GiF-WPTyDB;Aa4{g~UK0lahCD_v7@T??hlp zFih96XPiGuQl7#$nmQ?oo;~f$+FD;Bhd=KEcqot7uOvaAs{}q2R>5E6Ze(?W3h?O_ zf`|7#;wxGV9qDuN&EMBlUO5QA&T=5J@4Kkl*+%eOD2&<}E!dqY1zko#^pl4L-Mu^t zR!ZE%#p`Q{@a#e~og|I7GjGym=})Y1Bw(pU9n5LtdKQ&JAYbwZKMw3AO(%o! zE0RL`^}$=>EVF&kK>9^}p};qC3^JP4iu%gy@frjvK!g`gm~ z@%hr7w{B5^F+Irj`Hw`rsKQKNG5A!zlUk_m#gAfApuKN4D9+$9KMIe*GY=DH>D@6x z3~Xr713q}Vq!s_i)_KQc`G0?$BqO8jmPCEBD=Fi8pF3KLM5MAyLXwh7(XjW-mQ4t0 z$hxohxwV%{rHpn_q%>5T^1HtO|NQ6i@VGqOm;1Wk=bYDhKC6Rw!Xn`}7+7izd$t$T z$OmdLZ9*}f8|qKaTgMP1IgWqDv7Babxz}5T$)qo05nTKjg^%2{sHygAVtq=IlIe5d z_?~7`lraP1_XtQ>dIJ92u7{PSm$7I<6sZ|li=`F|I49~YE6tAL12tES&ROVhy|OS1bxKKx^vs8?|y_Jt>rEY2Tv zRyzsB)`g(Tk%y++H?GIp5B(%GfdTjRg*b8SHgPU~fN85{pxd!=0-f>Vc>a(k9OgLI z!kM3G#*$5>u+Ma&!-?sy}b#w!*eQkrE)DqyPUJ`MPw1tD*bvJDFKy}3!bS$;ub}#-TddwOq zJRc4EvyxFSbTThK|35Z=!ESu%R!<@la$&&a0+C;O5+rT2$!E19TwvEho+gEXI=M)0 zR7+C#hSgZ?G#ixT7sL5^0@J4zIn>4M6*HqW24%&fsh(XiRr5Sgd=qYyKRP!->|z_O z`kusHHw@g~2GVFJTihX@NO}b8jT~2e!%v^1$hc#2Xj;$lE8dwwK)O68oRG&9c}bMl z6vDS3#^{@j`?TumHfldi@@5bMm zEM77HNcG+;!ITS|@R^zvJ5s3v3#b1vt;`ss&2z^1pU2OnTZ40{y}LMNyA9wmw->GX zRg3p!#}23yZ-NQ;zYz-$Gt@A!qo%!6Amd^v-E?gQu9i}Q|DvQ|eBuh`jkgWXDik-B zHSUVA~xy4$v%*PMzwOH4|?W+}w^4vT-v2%`qwe!e_hVHGP@KlK|3BE#; zoOH8f3X&OKGS03Ff96Zi+hY0K)0nfINI%mj4ck(2}9(oC*pWP27EvFj+(D& z18JQk>iP8t;Xjta$@Tfz?kR&qx4HYYw}idu90T$ugET~PHY~m|MbNFc6^2T_as$Re z`Ym`MoKanEQ8w7i*$?kDSaoW7k=y~D|6kICB|Nc9MBV6A3 zdc|{kfK8=W4($XZ2WillybV0%Jh*|41#}5t#ICohkRoZvGHeAaNLm2P`ftIF7X|E| z^fB66-o@lQ-8T)Yn~B11qwL(;ZSW`NB-G9MNB!?L(93E9IAZyfTzGzs{@CA4qN-<7 zx%JhkcI6*qa;puF7)tPdSuKSp!E@=RMHAtK_bM=-v>I+M^v3Fsl60#1c%0L|1p+L4 zajUyC9F>;DNlCNObA38-eKC(D`_(|M_Ic`>Jb_my_(I?0%)rp(RFY3sp*Jt0 z!to$uw{cm3Q88jZdWd5;UcR^JanuAFJEM+-TqtFBRL_B~$Xa+JxsY>>&8Ib1j&SMLFY+5n%(1QA`as)T9vAy6U_{+0D*p0E4UvNi7QvGfU=Sabos?Nn7MHh zG;ta2K@~?Rcgkg-@%*v2p_{o{@rvC%Cjq)%N#W++&p@py{qjBp%jA5)P9>a#xp1B; zGSqT-!3066tsL0CTnzf=T!t}T4?nnGW`4FDuNP}*Tkf8a7L@cX;CUL&g_3B5!tw|9)=eEPnh#|JC z;2rkbnsD<(FKRBgBn`b;;L{)nwXPC)YEc*F zyF}q~w?c^h8wcZ$4zj_5c69yRO?B*-alM{A2s-_QEY{hA`Hw!3Wz+9s;45FaW^*3n zPm1%zr?2MxV=44-{Q}f$(npOC3i!KN85`4gg3B#^(zMbS``$;ugl8$}Y!(FTf=a2Y zU@u4?dyLLDUC|3oy59*ZZGutx8d^7dBP8=< zNtH{zm@@yakyiiECF=x!{#xlwD6Zapy*d-N#AK0Y%v5p2WtyS0n4Iv*=6z zK2or94*G_yB&v#&X~v~V+P_iTjiBh1f|Fw4sR%{}j+SinTDlNf<)8Q*wZrH-Fh? zO|X@kh|#`UOf&B^U00)o;jo&y6F5l2xIL-ButB)Z)rL>&vgv5CE@b3N(CIw%T(_76+-o$|GVI~+0dtbwAcW1rJ9wMjR?;6i;Y`0oJU*{10nuMG zp{peh%-4$vjxAn-=T04K>9P#Rf0~n+ybnIG;;{kx%VuD;gETF8&`7dweV}VTd9bU( zrcoP}-7s$~fnyRR(CT|>^wfh^rs2v&%r0Mz+n284W;W(@Ms)&g`ttzvwsbLTD;{tz z%iqLZG#p2Ml$hGCJVst#+f1vLUZRd+&1hfOMDNKKF(Pezyth#eGV{Vv_SI%O=ysM- zj#q^(iz@K_@5x{=#S#CxDl+EZL^18de8`hj<$Y?5huhLA;GpG>2WxzAU-=rMm#&Hf zD%-#@?LDUfOUG{}IYg*pl(3b;f`+NHp@*w0L&j&~sH!0h%B2&#MdEaHx&rZ0;X%aA zF?usB3ru*oVMUV`?W+-ob*DJ*Qo24`IZrU%A(l+P9nZvs!69ns?}fTG5`vn2{?sn6 zoow5DiB3*91$UDXmb-7E2Re~vJdyyh8I8!>Y>P(iH735V;_=}v7D%EE>B%q0nMDTl zcy^D^wH9)y52V`w%mgpV_P*oimFVdk7=;9$gY z!&mMjjbYjl%JxIawtHCc#ftcT<(O+#fpn<3o6NpuOncs^qfNRgTr|}I#huMqTK||j z-fJPAHQXKrUluP`?dR^+<@Q)UW?ZO>q^FZSY zcXmB>3C*_Xz=qTMsI{_UoyQ@OY+QS; zl2}Si#2(XGSTjKd|Nd+<9XFkjdqftej^BuTcM4(5)ODCXB#EiV4-x}aae@5Z`<(Ce z0I?BnK+hT3ra`$*^s;F!F$f$bnflo{Z_;es=553}DVDHaZyZUXbq7ZJ7m;JvEzl|N zL^HW-0{3?|&`bAz5~C`2oO|m$n~~K>Ru#mtzJClEm-X8CQdyn6`yGfHy3P~-TM8oe_K;D{#^p{ZD_*+@Ou__-s~oKHr9cC zbUXMDz9Jh8*24tvBFt~v2_i{X=#OKyxM_1LvA^|+*{PudkBk&yq4PU>SS6Qn;W)El zyQFZ{QcrrfH5iRN7gC3fulSd`ev|H?N@8cIN~+Bih(Tg1yGyT=7A8FdlXw4N+p`#4 zB~}L;=3Jmpbc@OTqB&%R^;LRg!&!3TeG!Q&{DXTQajwfz1JbWiLes9iChD&@!Tk6f z>dR%dv!4iqYL77N{TENZunrJ+B>_q`o|^9eK^f%~5i)GiN>6gRfeK+el$nf}9F+n4 z{t}X~nt|a>@8JEy9W*3`oJD|FE{ zLxEW_z5w4bCt&NU!`w`U5+lnhyk**kSpoUj)IOKr`n-*Lr`RAhSxSF&W#XoD6-3qh z4jZL*k;3gl2R6uOGL6z>kNo z$icy>cuV&c)MO0Msq>m)f~GcaQOR78E;c7kYo3tD*$;@~+BDqbQcwGx8Tw)<1zfuN zVdU*8+^iIc;>lXLeZZH(M~qacr}7F(iAN7*V}k#W&dUjpoYjhn)?w9HZ$W$-U|Vf~`A=cg#L;&|rzff?c%a zp*EUo_~7&>@g{Sp7Zc%RZJHRg77`yMAmzBgeb=widA52uZSP4ENdiD_k1)tK-6T5G z3+bkSBV_EvU-m>%9nMM0V(&dt!8K(wp>=l%lJ@b~^j8VLiod|G9NX$`rYxyn>;#8r z$-;~EVZivEMVXKoTwNN0{^cXolgnP7bn4@B4Tn+wf*guJdPt^;MWKCRA)TH6iY|1Q zgx&Mv(Cd>T<0`ur0|W*fM`t>U{!xVf>KNQGWgR2!%3#p#DAw&BD@~TW~0t>x(A))4C{Eve0t{Y#eAIg8t=H zH7b(d^R{DDI|i6eEFoGqRMCT=v|XgHe+vw zN2Xope%7)|+%|F_#X4NIW!*L-xE3=&b@5+gi|GQw&w(Z_Nd;h;nT7MIc z{@+!Xs;w0gTC_idTx#{h<)ndVz8E7a+{#SVkt}=_nu=dr)CI92S*(`Q11ebnuwT~% zYtG!Gva|Gg9qBtTFxw2LY0BZk`5t&iEumwZMuoD z;r$ER=DARCcj`2(Pp`uCyPw&o?OzCg#yRq|aUIoaPr`r`skpk}HsK#szy)Hf!Pj6R zCik`B^Pr7TDSHU7NhVUqpvPcRa|&XgT*HnMS>C$YI-Ke>irvtvgYGX9;NPwm){gH( zS7st!mTUuU4pVpT^&DJMV2v6I3NXnt38s5;YUn%}JT;vg-(OintMuN%@qOEHd7m`y zSvsC^av2BKlgC8hTg`OtcC-?6x-9b9uu78 z+>UKWG|=`b*%A%;M1@E+W3hX*nKwYQwqf@~X`0q~|O$waCoA~Yw-oGQo>o{_s?sL*$ zUcDMG==*F+S~CT-YtJm4xXKc4I@iDt=jR}zH)0xhc{Ln*m`~431Gu>Vpx0i6GEq0G zm~-a}$Zrnutot?`ELPSNxumL~bKf{fW~{J$2@y`)m06W>Z)r4%v9bDTt=|h2wN(6`aCI z3jTIDVx)Z!k<<7`F5g$+sn@G;>!TVxbD>o&E+W0`5699g2FhpGo#_-+0AYj8%l>bkT7u-65S)-jvwyk8qb~zV$H|l{$UUj75kT)0(a#3p# z1)r|zJm+ynaO01V;Lo$oOpdn%rk$;(B6pqOs>Tn}dB_261~{Edjx>HPcth4lMv!jt z|1fZ_HKO=sW+YG_!+2-FJ9hwQcdLP1^K4kAv>wxx?l2o0bRhKe6DIYoG*!N%#pZAt zQT}@`94WVELf$vP>Jbic@*jucE>Xfc&i2@S?;-U%YKK;R90Itto%}xRMMb}O)6~c! zsGlcbY*aan@tthO=t42X_ice>)uqgsQXv~w@gJsLxIiQh#Gv$~EVOWm#(Rr}1rx(X z1hT6{1-&-ANmu_M&JT%&8`aw}R5BEIm6&7JBrZ~wUqHfkSinP@3pm+@0|HzTgWqEL z7$srBdo-Kk%WGz&-ftzyPw+<>St(vwehv3`OTbn2@4%ljLJB4-2@>OWL(aE1be8`j zs{QRJ-zmhLto}5Y=cQ{(L%)wF6F)b@j{{@mOuQ8yD%7MRT}^b?#~#ujF9t_A^v~n# z=V4lRHi|yf!~Xa_%DnP}$#<=xcOsAMJsS-Bk`w68-*W`-)K5`|)0{eI+GDDP2KXy- zFa5UtDqi>h355z7;MzEo#u?l~_Fy4?_&kZcY)%I0>~A!AI3MgqlyH6S4I)|UisFOo zQFwSY8GPqUkK1X(dF6lPRl;3T^3#ye3VqZ2!dvls#s=7LJPfuRPIGTACF4yrVEfW6 zPMJPWP&0ZE{nq|OpMkUVVN^X_n|uuxN1x`02N%JSm6LdmHQo3sFc(a)Yft_@H^Inui<4jFl-2_T1cWI2~>O5z+y6pC7)s`JM2tDD`UX_>t(X6MgSS2wKSlHkN4gGF$(iKX(xw; z(EMlsPlsMpVUyoPXkY**FJo|$_A4BWJc)fP_t2Ta`k?5o!nJS}QDSH>^mSwt{_0yQ~j)#3*95G|OB8WK05bvmi)a!!<*~O_WzMambGflscJ(|a{ zbl!Vv<(v!R7X`33Py}7a_(WXjC(WCb2v*mQvf?(;;GcVjuAf&;oy3djNKiSPnlDTb z*z1s>dD1Anqn%Vtm;^#cqu7HrPto&@2#lM|hb8s`7;hIve(Gz%JRUb<=|6>cq%HAj zkbpiFs|1zE`E)BDgiG1!l&Dky`%V{2!c(!`S_5{N9_C+Jo{jfSyr`z10N&sEf>SP5 zp!u67(qG(bGG$!>^si2$`K3h=;W`nHyR!6!)_>&Oqj*%_zmR;`vK4==nMB#r64v{) zECgmW;Jh*)sJ*_9=rpK6uiZVO%f6&1OU_}!f9bfwERDEK$RoM}Gr>=1HPZO_GoB7z zMt>d*fz^&20$Ga>zp?-e4Njnab~XmLAEeu6dEi6~RowIK5cwrBf@gxW(35LFy|%ng zzD`tSsz*=a${XXz#FqP}-2u13ge!A9uBXDvU+TDS(hmB1mK;1^s{k#>_hDO34|rM* zQl-g~ukUTL_&}E$!hG>`XkR1-@n<&R?|*J69mB1E zriG!CNh*AQ-Aq#M8sjs@hn(sD#&_6RiyF@#kUAyqfVE;bwVxpa%?*(x?K>BFu)7Pz zz8gX8);4%8BgKo<>IA6v0DT`NXe(C)_H!>A^Ku2;`qn{cwh7F2Y9b!jlOgBY35a}s zkshBP3<=Z&j&4Dctd~K=G9J@vu1q<$BNKXUCehCU4A-hP#f`%XkYworH;c;fLuZU> zjnQ8;x%&@Sd0d0(3LNG~bUsmi7(#jj12JgmBlEDUliq5x0vbCRr|Wzqu&@AJKOYCf zDMGwotURpTUQNA*O=;Hf2e!*c3x6(@Vos-?;hTRogCqO4g1db&8TC}cWbPR-PdN;? z&Rf7!jvQruca?(d{8kb&_<;R5k3eL>0uX)~&g^iiCaqsp*`7zIxssXBuG>2c6zqzq zScwq#Kj=#yADtjD>*SPPvm-gYUoZssZ-l#nSLxXPuYCGyIn-NQ!j5x#yq%Rm{iUa( z`|UBPk+CKP!eLCvOBTCN^zsvekHI^Ge0pqK2J$oWXqBcE`uT?vy_DzB<%jgsO+ED5 z8bwcCd`Xr@ia_txA$q;)1hIbO3#S*qr?*x~K)p>KJdBw_EnZ#3PA*dNvdj_3l_t|C zJRas2#__H!zez*4exWJCIUsc9EO}5!F(mvs+1v_fHNv5lvv1I;Q4M6=wm&rLn=7=O zJOhW1ZXkCIxgQMB;9byNOoWp6W8@kq7VkY`xeW(io~H}8zmA5MLl@bextB;rx)cgM zn}N#duL<#ZN8Gbwh|rd!)M3vIh_WvMUjAJoT}ALPhrWOMI|q)>R>5VzFB83_ILb2) zhUc}ZB=27r<1+RYjI=6o!O#gD8CFHWvU)q7xwtRe*-~s(-65gC7L~x*v=`6!|;t{8Fd+Fi=(1n=$3pNs#Duf>s#dE!@;ZY{bnd}T6Y>t zvsMtx6}C`k!C<;XGl%G`!hI15)RxJm(YFuM7$`%lCERN`Ck~EkWT5npO8g_9#5|O- zqEB1Pz-wU$>m%An)#K`5Y^O1dl4CHxU@jb*SP3WUuEViwHdwoBCWl;<#e@P8Y@jX9CGj4+kIc0TK$)3 z&Wa$z&!d?htu64;q!h0gB;mlfErM>|447*oNtLxl;nnk4TvK}kQ698#h{y(81mlL(Zl!v%q23h498)};l-ekor9gD79`PNHgQx) z!Fws!*&W^EISh9m-mXih5%X;5xHl>|(pv%>Eemk^#NYg>PfnA4(~OXpFT=lW8Vun^ zK^Ux}0n08grW5+a;ZfTyg1vR1s%3y)*a;)_TFL4(aa zm|4ez#NdDAnfD$ncfLlFzKvm9)-rf@#SjOy6u|scK3H*Uu9sW(VZk&p>N9*FF4zW= zeM2j7! zJ(;)ljsV5{R`6~!`gBch4xVetW+M8Q@GG31G5PvYY(2tZm3q9n7EL)$_!SD@{p5+? zjEUsOZ*J5*!GSlR5{hQ8$LPMJ^Wk_;5=lu{fg$%)e6ufrPU945w!dZY<=X|&Ztei{ z)Vk?<+vhZWgBzHMUm-Gme_{5J8#wqqgowfvA~souC;7So8#8_}R>H&NtMCqTb$Bv! z%5@ja7+1^1fNp?NfHXCHTFuIjiA&4jd2~g1FZL_+}GDJ~Z1v`K{BW;hqGK zw<~|{+2__KbufnTswL&ZHQXH`nBOjwgVO`UD(qs@xbe=`f3!0L!VfuMEcp?J+ zwPd2(!sQsL-^n(-&V-~Zb+lP{8H&WHve7Q%VPT^X@WSR`M2EOwUh85AjoJ)DgFIaK zt&QCBxk5IGG&55tTjPcupW$UI0fTMhAk;-lFwRp66vqwlKfK_^z0HYa+5SrO85M@S z`Ny$!>Q>zNP?f9*R3pP^hLS*;|sDHoh&gat?P zh0*klDuIb_$)*JYT65qAmFWLz8XSKgY?lnP7TM?Fd|3#!zRR_Imxa@fe)GvIXH|eN z?@7M$OS+UyK&_7Rxbo9{HvIBJo>%Z)z8NcyF5`YMGT{-_s5cMQ!j0*MfA>u_ub-sn z-V~DCs!#A!IAuaY83-x8LuZZZ)7IQwumm3u)ejN9GzgzbFw%_YQ|bYZOjFiOE$oVmA8Ojl1Ic- z=fY&$Rp@1vLE5v*n1Wmi4o44ym`X0WS}{g14wNxUmjW>8Y6GP574Y(;Y_iGq3v^_@ z$NjoXK_O5F(&ug_G4^(B|JLzjrG7ts({T*HaIdpdnI2YrdjnF&!n^>*R=jY#iaFwQ z8WtT{h#0wz)2pAyz0ylTi$4!n)mee!!PU%#u|c{}k&C5F;&c#Z*;si}2%fQ0ynTwt z$z4k>#&=&2{VGN9#>1~Tc1A)lO<@we?|VwW!6wvjpTT@;hynJD^HRl!)W?gZJl84(}~#N#(lPP8s>!u{v$Hg3viKz zHeAq2pv?}lGRYH4)F>l&(gR1Z}u#PL)5Wwh+7#(9s| zn;J`W0^2GiIP+Hn_AB($-UXHPqP?PEJ@vs1qYzGg`-OhgIF37~4Z?%xvx(R0Y&h5b z&eUlr13&MsfagK8aN5gpcy8GtupLZet@$?iWcL={`N2VYc=Qc5efbA0-0C2ILp}Rf z)C}s%e&dvF`hvzv56G|VqQ!@P(1l#&;c@vx8YjwWg*4{~W^5bB?f%lsi(S+c7eAkg(V{u@KcsseIPza%t&r6-N6c_RxBe-tO=8Kz?U?|ePV)3?vQZ9 z5=eX$gTw7*M0>^n>3zNyqZ=1M^+w>-0)`mvU?h-?D4+-06Jbh@IsDr8i2I!EA?867 zaL4Nmx=z~?MdunZ{0HTx=eQ{Tk@PYm(_sdKZl+~MP<^|-SnhHZ`y z#lcb`TvDkf_%bpRngc1?RaB9gD^+;5Z~f?2|77(2w;hA_t5aEbZJ3fDMaIk(c|(bB zLF!l()4S*oh$UEpT<2^s{wa%@%TI$v??O6%aX72YjibDl9)i&FD_Ede1o!fJ9LJr( zMw?x%nHj~Lz6{v3VY*;z1osSDI)FEoBd`$6p!$O%Z}YGsLP}SBfOa`^O*2 zgp)cXGd>D)wOvH@Q^V_{ z?U=1UF(P z@J`$x4~HZ~>CH?9;Emc~O8FyFqsd?jqYwN4UL?Bb?BGfA2#k8xVqE4Il4zHLH-1@Q z)bXqM_na&Ux}q@ZpcY(+8YLbzIcQT`gcDANa$_(Ne74?+-F(d+Tiy4=?t|;-#jgG6 zH)EP$`bRUUYQ9A$4*QyV1Sw-+s1N3`R%pM?53|o7rWrm7wj zH$rZZ@L3md*XJ;-IJ*Lsgs+m_L7Zxniw+1c;ILa+J-Eb467BV*;BEH@&{ilX6S*_| z;KCGAnrsb@2PO(6R_T!R1|IKk>05Bv3HT!5D8zCI*vGqL$?n2Z@@^oDh=_y`*lK_= z{5(jT(Ev4RAJJiT3p{!&%rtFOfnTSbm^-WpPS!RD#^?xlR$4B&^hX^GSqUiVTFU;H zJeef94bb<;xS2`LAz1U{6zzSR1qEyMapUeBd|E{5*`posvu_SEby22qQjOH%n-OpA zv5$F95VSNcKmjM)O8Pt?|w7<g0@J3}J3^t9CJYr1ixnR!T|*WIa;J%R_z4Dhn<26Fvi~Gg4r1 zm>W4xy#o1`RSg$kJ=+JdmW`#fniLKYXC;#5pKdL zpkrk&^e~70-sf}y*`whYV)P%0bC!bj>(baoyX@gXsXbm`?$9C>$Gtzs!zr$Rd16N_ z%C?K5g_eZiQrcAT9KOJ8ugE3&v-iW9zzSGj?g^)V{-XWb{j~A06#8$rhZ7#^JnNJs zs#Z2YH&ywWELrr@)XQE8&2Bx!*RGoct#^7`ZXK+JGfPt7W@I7ghU+2(`H_9Duh~B5 zRvP!~FS>Y&_3}$dWB@Baxg? zK)c-?v^y^mmDc!ye`Fo^KAcKomW4y3{{vDrG*xh<{S!@jCkC`;DpfTS#qb~<=^#s`MQeCtL~#erCmYl*<;$cHI9(Pp8KSG#V0Io6E*d? zEDeV>8tGfhD0cT-4wjI6-q7%8-F=MQbo}ZFIN`oyh@UJQane0OI zoGCbB^aSiqPvwQYHOAi^fp8~px9RicviQRRW>J`cxwugFCO+vnia#WHf_G=SOe57#pwg4Q@O?uZ{P>~3)7pBP4n(hlr|S}l zy!JMBc6vA-HBx}5-BtK+qzVNk8`1oA2X5Q79A}xB!dKNBWWdmz2PsY&U+``)XStU0iwLT_e8MMbe> z++$VTDN;bn7weij{R;yNt@~tfPc0YW$$<~UN8zu0EGf8pg*m*C@HR_VL7u*hpfjon zdqV^?h({Rfa07wY@s*@HsEjT@E{$$-cc>67XN(O!O?{sxWR+hJP2B2GUWhnh>Qv2KYi{%|+Kdp-qlZu(ntxoR%%kjSH6^^`g4xW_{R^0b7xo^=bo@-v8< zuY8F7FPz@t$T{3-E`}?6V$kDmBvp^r0p?OJIzc&&%Y2OWTpUF;;whc1`IOVT*t}>bUT^HW9h0>yh3&@b=3&ySC zBa+pP{7vcNf=)|7&E!<9o2y4smMHU{$SL8a=6L+E^%f(iYsq_c%m80FrqLJPBY3D< z6Kkrq1^cicKBegM9^P`nx?_Lf)5b`UJ*+6$Hj6_Xs#45vUc?hsKS?b@tU&LR6$z*j zML(QRjBhbO zS_0j3Cc&+@w`rM~814(KhvaHY8tgp-6+9F$XFv}=I{u~m&19i7cpIg${&dHjIWS(h z6+?Sch_T8ucIKY%>R$yPc}A3PKiY*0CEYFWAj)c20#&FuXFN7~0wH1rIkbF!Ol zo^*)9`->2FsFB(=+=dD&w!PKGZHu|z8~X`; zB_nC#0vl!qH$O2i4~CPbtN%5-RpihvT4nYiO!7x`2l&3+AxLB1dp*EaUTldEc=aCRk{ zCJfO${YaQu;tWEL+fe=cWjd{(2*(wcLQ!cQnc4M)KC+)m*1amn)VaoVXQ>GOkb6N- zT6sXyG;PQ;9wmOK#Chs-%ot~n1hj}6WY+I^LXNCdVwS!igaXGeWNBC>EpbjUxg>g? zM)e0m_~c2j>gqMz>Z`zWJf#e?W4RTEVGUfmtp-|-nSiwG5jr@`DG?55pbB4+=PO@< zuJ`llpVO*>#Joh{p33a0fjCTiJ_X%)uOZSd4Yl8>2@Y{FIkVf#!9dVQUTyzPPPvN1 zHjw0fiuz1m{{74jsZWI|PMb(+a}sz-1!2qlyWm#2K=3~-lXCtgwBE-dxc5}hrRr08 zVYbCMHh~i9rWo?Om_s=yG^6N^0K9hi2>*Ng3!2&$Mbf^?5Q$S?80p~-7^>(b32T#i z7ejpEZQcuL+sob4!R>Uj@mD(a`g5|pFv$ev4=s8_%N^0JrfeQI-9 zfiWS>DYoYnM26V-x1Eg6NJg#xF|2#%ffbHbWB{kq!!NIqPlYnP)TRAkyY4fm13iz$ z7k5EblPe^RL|{VX8=9Y~j&}1cc^kH#gp7=*CU%8;&`Ly7P)nph`FDkk`VN%AZ4Upg{;~xu z=Llg?O9q|)%#*b%eT?8b9ij9*7p<-!2eK&bS{Z^g%$@le`UoQgOW9~_dCAYrA&LW^TGXu zHr!jn(!=Yxypm`c9M3R^kYh1u{$D8h(|#Q^EGOgD&zq>tzd`6U&IXUYIV5|^Oxp9? zAI>|@gHmZ7)L&M|_UrGY&q_=LlSX3U!W{05$*mZF>VH7#hGu$J@fUrZuL9p>Q|X2< zIl4bMkN9nDLVlMz&b50DDy3_&?1Cgu;-n6|4-JRq_5sw^<^VHTdz%`qT+K$zQ9<)5 zT0Du8?L@CehxznFlqTDiL+3gjY@-HX)ssgXLo(^dg-K+w8xh3%c=8r-5%eCNP;zL2 zENVIA00@l}JlOi4=H-7SLma+l#vN^lo?nOS{Rw%QG>Bt#F{{7t6Z7h}6ny{hy6L5Y zDsnBNkyiT%37phwKwW=44(Sy$)3=L*(C$UJJTDW4TH|p{`56943BYpMdvIy^6ohdY z7FnYyus8oD9Q^BuUrrpyPLCCMIqEZpp$BM)-h>fbEuMz=Ni;rr54_)$hnyE5~ zLe1}}xBY#HaNC5j>u=D&O_QKuS_V2R?nA@bPtoI10GpuHOQ+>?83|o?u=w zU-29&{mUZoJnD@hOf;EyE}`X1oFlw{&z(ifT$p|30a#$}h1*v&z`Qp;SjjHuG-p<5 zIeih;T2;p7&a#QkA2Y#UuJ>Y}n}LSPy=W%j)Vi&d=Qq>2@&$LFm^YKPO zQM3vQbp?{n{Zn~v<9v8061PL+nH)Shn#A@OJ|Jt2lHu}*3bU$15@Yn9lg?{1KzUIM zv~(`Ug!_SrS!*CT)gj+YRNy!AliX}>WOAC5sKI|{*{8o!ndX6Ycw)&U-W}gW zjJ4i`PBDSFOEnuSYz(34do(?-ZUKgW#98aLau_5P4)uN7=ziuD1jH8MszY2x#$kv# zcTf~F@37FdHGz(VHNiT)Op+)qz@-KCbY8I`{CuUtvk3l9_bH@P^S<|VcFTK!vN}9- zmogne&**z&u3vLa0ro!}<+Pmdsll>uL@8q>EH5))x_$K^UuqrNdH)AC0wYo{Aui~Z z%3_WeMUyJ`6wKJ>gdYD^!Atc9u)Q7u={45;N7pyO2YEYCy5bLC_*}kYI;FPbY(YU} z7n~BkLpIyah3ZgOIAd@Y^D?gD@|tAaJn$6iT6W@ULn~@H$pPdmmt%G60ixgEL4GC3 zGh_4wZn~R*lL}X1V1#wk?zL0lfYltq;rmxGvhE#iyB3Xd>0YGmQVrg>{7UAiNkU7{ zm*(=t-x(h*}nsad2 zr3CN(asyqhBeb-o9G0CvP1T=1BN<2j^1-GUlJ>+g7aD4?>=-52=B~zm!+B)aqbgdF zm`3I)3~;kZMNHx5o#v_KFjejudC++P9LFZG!?R;y&(wPC*?fhlMo3f1ZSJPLfnq#9 zRE#1XyUEmWduZepLzG=CKU|H9@8bnwCZEXuJCS&LLpiK^JwuS2B*ZiN z5rr>5JOg=7xeL0pVM5;!actO6jY3^W#S|BmZOx#?-;L4pN)$S1&jaP^A{u?O1img7 zh8Jt2!C^?1cUAo(W4ch149N$9reZN%{G19;Zzps0-ezox_r@@8jm7WxVnlBZT6yv} zNl%kU&lVkMO-X{-v$HXAaUNU_C?FfEOH6NxyLOYzhjjX;Vx&2Bm3CWR)iDoXO4fMP*U);X8W6a|GDSHDrI( zeaH)n!&-L{x>!OL?JxF{iBU7bh z{-wr~uhXh~K&-PBsgna?;s>R;dTkv{HP2wYvN@&f?lolV;q|y`wG6Ltd<3j5O2GBp zd)qNVn7O!kJ-zin4D-F-GD8>Fz?IWwSh!Z27a4FBJ_bt>$&FkdzC#ZV&-bCPN>fPq zs&*1P^9|qRTe0cWbC*%AkwcHXn2Yaq??bkhI{J=NhlNTCaK6(9#DY8M>yHhzD##Xw zC5-7dgJyW@+yaurUvT9{Hyr6MLHldAX#4gs-fNo4yZ!45aTr}H*l4mAFJI*_u+vf@ z$@2h49dkz03tHIPW<*A$f+2583x~dW0ly;Tc~UE+U?I;1!peW*g&%crxaSRKZXIAR zY}CXfF)Kmsy9u6I;tN9R=coipguNfz$=^LUsMKByqOY7oIt4RehW0|FUMY}MECXu6 z-{Ez78@)Wan(%kW@dxN+yd+=Bdi$T{UsQ|3O5=XgxBD|)@4<&;oJIdF=b<-ueroHv zL8EQ5$fo>lGn!`;6Jx(k(&cp2Xmz7fJN7fI$lvFANKO zOP=fO#2WqYl-cOfrUF~F zatI4)G*{k!YZt3uWb>h4*A_Nx4$8y2ev+B*{Q8Pv#W(qkq1CU+g%{*x5!Vl}xYFNn zPyfxVRGB)w^k4Le`%;&gXR93Y#g-Z6=jV#CY;z0HxH(md?y+3{Xw(h)%vkz24^zYW zn(fWmn`51&&?%YC4YtIvb;0zB2dNf26qbeOJVCE>4)8JNyPZ=youQo3bK`n;s|o!Z zTl&|ddD~XyOPefZF^3QE6^k#(zr;P1824p$^Vj9=&nB|EU*|Hvt3$E!@E-j5*v3-d zfE99$$pz$ITm0G4u{+u4n@7pZ&wa{U9v;cpR_!Tws7?QRe(7&~UjFnfY}?QLNr22V z4vpX$_b=gxvPH8p@yqzlES1dFOvR+1h7~f+iD|})boom9zJD8DuEKiuT+VL3{WLfG z^rvL`-KAD?k3%zAw$|7A?>DEiSuy4Le3elvBNp;!JTre;s0*z3Myd7-`Yq%AMYOJy2um)iaqDDOL!hqW@*;>}|k z8-EY=H%E-VDP?cFfv-I`j?e8~fb+fwSl25}c#{=N+3*ovcp?9S{BEw}yy8d?L(duW z`Q7Vf4t@7=Fk3$RnLK6ok8=8UoB7<2r|}GHk`0Bs){y2l>n1H-T)=!Ka1?+3l`ngp z>}!0KW4r8m^A|}9J1(F3tvkP0dzWc?k*V}KlsIX5l?$v^&&RCZ!bkjw*O%H0{k^oZc`ZQ#*de>|5}yhc~_kkc%6>5uC+}nS7;M`ieoDe`NYfIrsHPbxP4>O z?y^UD)?1_b&f|5Z$wLlGuTG>l*8ZiY`RKVHSU|Rua?V~}EMe~&K8Iq}W!khkRQk?i z)8!?z`O3$oc&+G0tY?Wf(u$fMyhun9c6hLxnSW`$MA{zNmQR=$$hUl*nf=}GSLy7T7xZf23E3+XeY%rAm-f-oFWH^_+xU<5 z?wi()^<;$`es8*Tv8wPz#&4>K|Jh$1dhExpTmZ|3p1=LUYrlRIaAK?8U0(X;BY?T++BIr$j^Ag z@2eYjtWU@NFKm$lmk*SGZ@ZpnxX@T?+xniANS~*z*kh0M$B{PX)BmO&kciA*qoUyp!wA& zUMJYKpWjN&JhGd^&v#}EN}rL>&d4ISjn8UswPvyD&m)oS_{%Lktnx^9zVuW+X4oY8 zO_j6KcUukzI<&`%x5&l7p-264J^HeRR}Ltr*F^3Ja@@Vd}i_OY-{XpDP&xBwz2Ut z+8=UT4rsWY_q`Fu!iQ!sZjPrlp}*)eQrC*J;_r%>AK&Z8#;q>RyZJvib^geYd(jjw z|HDW&;*!KhEjh-ko*gQWh^EiEoUX?+M|{hN^#5HB%d=W;o#P$r|MY|$)nYYkoY>A> z%5S@ThN&GDYn#8)+>OEntvyyb)B(z*Mvt?Op-+M`QLe%Gh)oQbD+$gO&8 zRm^EQdh;NDt#(76Z%ZXpbnI}x^cRVjIhohoq%8eg?v=UtuOBbr-`qXT-g~uXQyTA) zK4Pb&Gg*I@`gN_yCM^t-CdHPK8x1?a_MIxk7uM<~zmD6>X1wen&6(JrXZ!UF>3Rvq z3(>fn@U}EdU-}f^pD~8NJ1~y5Jk&ypn=n;671EHkX<}xF+BahfPv04y8QV*hUf1GT zN4Ju4eN|an)}=HrBmXSruOG|q7K-B2-zCe_mki{SGmqtcU(91=XJ0WiUc87er5ID5 zS@+m``d42WZ(d>f8f=gkZ>%Vr%C2O!yG~=@-FqQVPuRfMN5}AUao0^r>*(LZ|Nc|W z`Ni`ZyPn=*NIGBF)Mem9dDhm$a-m5c()MQb$@Yb%dE}Un%^|NAvmL90*|mDJAjPCNi6p*Ph;1Km5o)#%#^dyK8-pD{^Fjd`ceVY zpYr=#%?!VfH?lHqv+=MDPv!Z`%>3Hldsxe}*I1)^hgs*3Tk!+t0OP!2f0{17T`&90 zD8V!5j^Xul|7sXnGm>|vZ+QAoTguwhsLf749m$GSi|2Lr?Qw#+kCTGaL77x7Cy{Q(5Uu%barIPYiO|Lv8q| zw|~mH*45&HPrqQpGi8##x||?&?B>OvmR-R*dzY7fY_*Cv+LYfop+`Nr%et#_jkz;e zi-sO-Xx_W@Nvi2=z~(IG9dS?D$z74stIuZ1#j1t!{smXEgQ1hzu^N;4l{>$%;njw7 z|HhS!lg|3FI`iL1Gp5vJcQ!1Q&qQ>SelGf@Tr#`ATp%z5D>Cl{+gCC@mxlD`b=pnl zul?q;rF%c&i~4Uc_4q28PdxXK@2tI_9UgDup*yo1Cwwu7kG`46(;XebcfQRn-|JG( zxFD(w>qTqORZD-#S5z;@+Obu2W}INW<%>*gR=GaRK<}}gd%ITJ9Fc)%Zk?V_zEnK^ z7x}p9O|F;HYI;{;?0^%}-xrw`1LYx#uI8q{}u z*ZJAZ<8E*H*|{MseD_|tX36wY&)0MK=GevZnzm7<0|zd$I6puBcE%l6ef)I!+?a#x zw@37E)_?A7EV$sF^mt?|zAW?%|9<;gsZ5J_*?cFOul;Ne3tur;9(aGOw01^-VTk_% zImhXDyj?&xzHuO}okh;zk3;6LFJ4}fG8KuGcLyJpi$1L*_j|P7uqA&w_NdB7d|>UX za!2-ud@be;yV@!<+j*>%ROzQFyvvl|<(PZT`1|~GBva;Z<=#UB`RL{^SU=B`eBzv4 zeEsk3c}%bRoK%# z{(M*HK~`t;RK9Ka8QzpWgHa<-I3IKVG;6wak+fn{ed+4g3r*g2?@6P2W;0h`R7k2% z``OAB``B2=zYgsU*u?H<&260O(};gtWCA}r)Q4>v-;bA@xX{r2!7g?=VuL*Dhrho* zc|E7m_f=MN0aJI@d({`xl1}#;jK7o9WpBpw=DWfsoSJ7U{6hzJ zeVac|SmczwORy{9E3G;t8)OqxWbZCHqx4%=GKY#1X3V7saZypRX&yJ!`dHeQf*DyGf_B(}VNnB-Bv7|YS{a~`*DC;PR0 zX5*vy@1*#=kN97gbMR_=*0F(agXDy$k9hB8)ulY%m3Xyb-^qDLRbcgAtl(p+jASssEIgC&DdzgyQzoC3&$jA0> z*)I=hdr$f`VJ=@!pXRAnGnBt=R8?B<6T^--J0{Pj_j&&)wU_;NEkPb6eb2UE8_k-1 zc87mo-6Ou-q|aFU7G3!+|Kp|>Wj3+NpLO7E7I;Z_(wPkJ%C+T7o^@fr?*7g&bnGvN zFhg;+1vO(t!U-YfPmfp%r|5_?H`Je?@i6MW>6>80A-G)FUjCWw_1J8fm2L(PcqEKJSu~ebXz;n5cepHfzINDjyHiHf z?VDS8w>8fUeuK)fOJ&Nit*2sm%*|NoZuY{wnrCqq`sjqTZfFVP^^FyH-=ZVUv1QWSwdMWPvRUq|*Hi{M*uUd|ZPJ z-0$&H$?Mz^)}`45>B~x^*pO|T*ui5n`J%z+*}LS7tYX>TEZxcJZ1aBq_)gwg_@rZu z*DSg~-ZpfpTrbOL`O{{ewWDeOX4WIq`PB_Y<;_bgnVZVb`TGp3q=}dFNJ(QaNN+Y) zXI@zY*u`&aONLT2SksRArG(NR#;mUsHA zopJEvUVPUv`rN~*(`?$CbjJNBpRt6Vu{=AyJJ#m-e#zvwnAOO)kWVs6^3jGt{JTYY zS^aH)unUWFnTvd6lG??WGGAMpg=gP>P+l3jh%a1Ummll)jZ|g*OZoJK&v>6@*^RGu zRFm2c-pWS*ep@Pi@U(Phemldfh9T_E=#2EQwHNYla#WUoEIC^0_|qc!>9RsRif>`@ z=_A8d)G8g+diHD($q`tT{x6i_pWA)d-7CXT6H5E$TqV@aRYgc8FP4s ztijwruNQmdcfi#4BgQw6-yrAPG?RTPdGqljUh%}vGkLy}Gx@&1n(`XQ1EsBdi^M-} z630uP4Pd7C%ef&>Hx_<(tX%5hQz>)6R`%I@A3pus@VF~J1$lvfFWBsds|{oNpJ5q) z-o*NLUnLDa63!OPo6HKfUMw3Ab!UYdzm!I{%)!r@4@gh8{VW~2bDUL+nId00T!8;k zIV&GkvnBtFUolKPGoNj!(nVhQc-NuplSA3MlJqjVRDyZEY|0nVJBy{WeI{oONiZ#* z6wC%}Y{T!zE|WTKoi9h6IVL9+lqLU{;Zn}Bk!-_Gv;1qHrqa8hT73J3qjI_OVN&zI zi%P@eTN#?vtwo=`oM?KOt2xj7>bRloC%yUkU(ZTie=E=1hHPYogQoLcHx9_2uNU)m zL#FY0@6602Ag}T3enWVP>YwvVIYZ>}=aZy5*V6MMKW8)^I7t8Av;7@bxc7KgVrVvF z#qbP#&HlA4.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%0AKi=?d(E{V;9+V6tb~D9%Tcc;hchrecq@aIFIXE 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

    NOZJzg3dJ|-itl1 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

    Q6D?{41JvbB@1hX2_sY@~EsT8%t z^=d_IPT^f@qyCj@Jb8uMJkr>G{C=&~qzhcUF-ocabfd~#E7)>)CjB_&EpeXQPLoFz z=*{C|nDj9YUV2#2(xb}wH1Y_?rMpF{%^wl((n|EmXeN-PM%T=$G1Sf>D39Oe+Ac@hqY#5*Q2d1`GqB+SXYXxkv;JP22U);o1RF{Ih=zg4T^_dI} z2ErUIVHnxL`4ofyP#x|r^&DADpBc(P`NKI7dg?ppg)|^(;j5@~YZW_iUk;m_Tw!m> zMHEt!#ns>3=rW}g_I`yg?zsL6>t$={R!AoHO7|k71D}V z#fF=XNn`u{^;p?1gFggKIPOU%Jkuy61_w3~6E2^4=3F7BcK>EP0+!>R!C<_)ayc5e zXhZV1v+!4NJ)hz3 z>Am>UiI>*b-z4+yHW?1o0t(y9L3~yv`F-An6xv>)`M0lu;-94ue&Pb0s*-}rb>6V5 zbQzZa;#?AT!DM1%8o0USupJNd;Nc!UIM>og_VbAtjR#4S4J{M&@S_;&7;_mfI)vf2 zUHYh)>Cb)c_3&OGmuzUg2I6lIay{EkbnQk{kZzKMwBTPfexm}k?umjQ<_6GsMhbgH zU(jEv{tJLslKqQ!?=nwEDI_VAhzo~0&en&?bdJQ9G#nn6U!^D1mhDn%1+ zMqm5lFgZ2X7%SH$;>n-Wp*mZO;~HH7=UX>{+N!Y=bLZlMf1EqTMGx+CU4`s1FW9ES z%P_jO_#%&m8{ab-F(DCnxLOM{`vJ zdh{9S3A>@pTLmU;dJ8IZ>%V%?U9$CR7H%?hg605M>?jt*d(nSthks>JfA4x+2tLF% zD1*M)sD!^KufsG!Dbg_e5!xCD;Ix~ENDogkYI@5;6Q3pocFshXzB9;-t;FD-N;2=W z2EFtq8}1l{(Q8q@47<6V1{H_n7B$z}$|gSO5ag?y@4N%`IW~MtUmz71tfIz6)9_fT z0zMJb<`_QSvtS0k{`UT`O+Ok)0RL}?_)+WMVCuQcOaVtEy>_qN8hytN~ zKJ?wxDa63N0WFuG!&FrB?v91pD`)%_7*a<>TOCZwJ|cK1IloNWqW?!>oqtUNS32 z4ny9*LxXeDp!`dje%DU}uOs15eAo!|ugc*_-8Zy5WQ4|lHW_|0OC??*3vjgCyw+MP z3-`!mqLzg!+U?#$cE+8c@7mDa|S+tUou|O1_-ZKMU7jm8?S2OesD5G9wqVU4K z98_()LCiIoc|ksrfoV%2mG1_*{b&{RCMT|$CO)(h!M(mMjuY4(?YMgSf*hegFEFT3+K` zHp*5M)vpHBnl%XEsewF0eq%jYnYJE=7AoOu>vu%gpofG#kU=N;*M#8H6^;Saq+n<`CD5StQL*QwEd4rzVc( z{*}a-iiIdLT1DIA_F{qQ2)Ij_kaO3c!;(fj-0N3DODz3y^D{r@!<%r{dX5#m;qyiN ztOzLW&7eI2e5ks649tJOCU0ttaIRq&Y-l1AO&ZOJi)G^_MjD3P5zAeFD_`E!Wu-kJEX zbq<+6EsSwnqXd1OcTnnP6g_ZKsBWD3N^|dX>wqlxrtRNE41{OW0GV#OO^zQ2l+L5{ z>5DL~d=P%N{=-J&dffeEIxV%SqLP9)=wA=c$Cac*rYOeNYKa73U4T2u|F#Mm6Zd28 z_!JO||3LOFuO_GX?-PUf5=6<#q{=5L3ndql4IJ_7i0X&AzGZvUVjY5A8|SKkM2+U!gqwa_)o9R-}#olTXO?^c=?xDt>U~lGpPgC(ptbmqaSxC7C}_HS5fz>3HtUK$L5G%MTOe3 z=)EQbP`}bfXByAL`3wE<%J2<*>1&Bmm8Hb{QY&sqFJ;{m1BuPnK|1eTC9`{f8*c0r zH+uOl11;xXBx}RN@qp2oVZ+^gQr#y3%#Fv)x~*0;>j1%@hj`&_qyc_V3Zcv6c9O-F zcA$Lw5XP89&}CvPVTY?R4epjC8`dabWIdPb*}ETmb6PQNxjY6({eoF`I`mad0A2QB zF4r3wr#Z#0n9)+s9scBx^RJ@0x2Q;8rkp?cqG7Jic`90&{w%Pm<)s^3aC#K>StehtskjvKEm7 z7_ifoC=6;~=a>)pceyjU7M;|m?IipY+Xg)SyCI`g4ZG%BVA&&U%<4ZvBbFv$M-|5q z@V$v+T{2kwJPm7=w$j+6H)<81C9q?SKp^)oZ7zO5{yP&w_zSA=+y^y?X$ymzzbOWx zYbmK-wiAm+5e5vLz-@X6lqYVZTb?%HsgyQ+^YaUhObEtrnj&DbJc#zE-J>(hRAHKH zJjajIqmsOQU?wt^+p9F7UC=EOdApn4@3Dqdh-EXuIT_v&D%UB&e z4U7){rnkfnqo2|R%zQhquH8|UJZ?P8hzzu0oySoaez})pW*>!Lg;QamH4cKm{~#I5 z!bsI_JrLv<0$tG-{G^!+eXYs(GI|tdiH6Y&OdBnco=0~nrK9FM0jz6YShs%qNv7p0 z$3NrTy~jGIVBd8IoL+PclNQgU9$&xHV43YG`PvIkuCAl6D*|8_8G)*C3DRA6mso9S zM(vOXl%49!gzJvuhxV)N(+&IZ%EnAc7+j5#y^G-RgAQ8I`x87~R-<;V5X`s|3SIoZ zcv;kdt_g5uXK+mE`1dS1qFI3c>`}(~l`!M&*hr7NMUleKU+A#plse1zjrbss2fz9V z!*HcI)>Y+`;Pbbk`G+Ajlxd?smT_G?HCc}De3jhXA5G>>FGU;CW*XaULL_CoQC#H> z`CgoflfQhZ?L;ArKd6EODZTXU4K?hyO#?MS?hFC<46{OYu*c~IR>eef@7@qty^Vmu ziHoSQOoGgt$%nSHzSH(~#x#lZvNZA@L-u_>3Ua&nh7Jq*+Tj+w56=PR?Pu8fTg9~D zFfWE=+ko1`5cr;2SF0JJ2f~L_NzC?iSbR5$)>mtT`<+nYc|-tR(sb~t;Z3q}U;of`w|~-}2SRu*;R#(`?18OA$u$|P zW}!rPFr5?_rqlLklNK&B_r>WDB!9|c=V@=k`>s57ZpP-2AXSZnx^nRF;7WMox*pZcP%O zWYg=*UmLb8b|kAUuCsw7txUmmRcKhY1l?{f27ZUBM(yzpDvHCO8_uM=(u0w{)leoi#*J38DnE@%cwRnCw8hfw*ARSsWjXr+LBM;vmgO{cf zWbNJQq);mh=A{IH(~&^Xe4Y*)4#vQl&723JyN>*_^dd2vYp~aGHZhV(B5p?K@z?8E zGVL7Vw=%)HvyVmKosTNG#u0olJVs5^55WC#5x6&<2P5Sypy*B_RQ4vq+1U$;Zt5be zbVy|P9S(wjH+1oZb0#`2w1FD=9`MkThay!&dSGxDiS|^&$qTi_@%t`vYfO@4L@pw? z^~Xrsg;@p~dmfN`6~BB#aIe>s(RwtJ=XM|#By4@u8c(FyeE4KzR}<}eIQ@MxfKnP$k@3# z;5yMra~A0_Z@TqiBsz^$q)}>P$3z3pfYaS8^dtAqd$?!?E|l+t zP)&2>IpPL)>l5(FX*;Y+<=jdKQz2?FlT5j>7XBR(fFE8!L)>peMMMprnkq_rJi;K) zcaogzUjqEo1R>?I8@*2dQL7OVvi6`~ZNXP$rUpEv+bZ4gT=Hv@eT5H#R(?d6aWg_S zis{3JDX`|y3HaPUj0@6panqUw;Cv_;(_OW>J7<5`^PeTYFg%4;C*_U4JTGSr`=7#z znX)K)kMot(r!tn-Dj@6phZ*4dH&wOT%+Y@l^goSdQ1fz_HlNR63^ndE_w()H`vsml z-moV6_RTB|ZD=GH(*c0d| zbP+erZ$q`Z#prThm^@L}1rZr}__g94*;MY!IVRI-k3v7Oc{xctBsRd!W4+94;g_IN zUO~E@%E%b^44zOHz_F`5Os%0J=49KWSd}$C|6m0{b+6F++Do?USq=5q8KshzI%M*{ z2n;&*n)Equrfa)~K`KE3Yn0<4Rgd!?@ez)*st$sav*Bvh8@ggCFIfDgl&8QG=APEX zqMt*U=c9zT_Ma!Nw{>yT&NX!XS8MPtwxnU<+*v3jgG4K2pg=$sbI0mANmaKaMmH5f z=v80`N9q;^VGz3`BiM-#{;a- z0|6{4>?L<*^5XhDIWXUz31{D&!D>EFylDLlraN6G6aMBgCwAhz-2sg?he!P+e?2*!~`-;*XWF`h*bpJyw7#z9vkguN5&|^Nuaj zd4qauA5se^cUrSim;A8Sphn^Ih|ufbB+VuTZyJ6eC3}xShNZw%)xh8WxtWgyV59XwyP1xT9*wWIk-gQ%l#8m5xm`_xM@( z)z8gkgUrdsY&G&YiR%OI=p=ROT-Ijk%i7@N78;uHfvnp30M`DngU~x(aQNO*REkv~ z(n1Avzf=$@`nCnXzq^`)-Rczx2Hi|uqOKPg<{*&v*4akPvlJp=t^=A+O3nQhQfZD zF*_5)>rU0SE1!UuUMulWHkT1;8%5^gZstpo2Q1s2g3Eti0iTuoV7tUE+WF=_{ihs? z{2#rj$A}{9Tp`J=msRK+u4nl4>~UNud>wqoE`iqJmt@CRVN}Yz24cn!NZQysIa@TqU3yz~@~p35g;a~DEo zhA0_o521-#5s;s7hZVAPp!HW9NXR}DWUH6LHt%jIRB3{ztu8RH#Smvy)YCbE2GB9r zjrk!i#BqZ?pz^Uh?XpONCEF&ktRoMur@o+(ZlNU4Zj8LysZPI^oki-r9gl3$L{qOA z+}E80ms}mN!!{YBr|2M`)kfUHtz(|Q5};#>KRS8K!!m_0?B~Rn#7xB$ZhAh$Q71F_ zVZ8xr)Q-W*2zeu`7rr1Zu>v-Ylu@_ap9mY)%Y5C&zzNq95+M|XBab7gkJkhVZM#53 z+$Tr`j|&@kxq&#Hea_5_9;{AYZbYj2X2AD~KOnT#9wtOhQPZLdrQ1_DraH?c-Q7ml zs?3Lsp_^!G-~rzGPPOgjv&q0$J3PCKrSzQ%rkKnP9`yhENRUj=R7 z3!w3KZSA?fMzC@cHmbK3t5X%-j9m&=SnD@r*lU&!35yL;jcZh_u&X*+^lSWIQfoYy zxpi0`Le@pnp8Im-N~{_cygeODw>#i1t_L8%{okjlEP-;Ha_}*|jD^WNuwtSUHRAcH zz1dr;c2f_%pS)+~B(!QS9u$OymgY!9FGGGuHyOFC3sn!7L-d7ynBDM${3kvLD_RY4 z?cXj8%x+5J zb(RO(l>=cG$M}r)UIY6)-V^sMXVl*6NA*-|VNgrXNcG_cCRO7f2Dx0IOBbA@m0VtJ zcU2UfkP-%e;9PK1F2Ea8exo730K6J}78Y(=Os>ynP^W1hT`2pU%AepE{BqCfhWk3? zgpno=$jXxqZ``T9cmw%&$PRxUjG)Cu2dU7s#jq;Bg~%90;8|NsaR0LpNI?S3eBO&@ z38S>9mLG0~tC5KGrMPvCKAI*xCA&-R5HqPg@R2VPXAiW|pUyIM8IK<`3R5!Rt3otB z-xfs`_c+2D$swGOJ^>b2=Rwi0dN^w_6`Ccy@jyZYtvI#^Z51|wvxF;o_&Sc{7 zOKyMd>k5;RtDsub8&bwN9YOVeE}I{RtCO8jMYo&kiW-CL?K#k6YKBT@?O|;B0O9}p zg*wd=W}nsu)ArN=be7@#m$SU-^!Yw8_iQc{hIWI6a2@o1D8@sXEsz-~j)HTm&|UN> zqi9t@yib0Hm78@)cI{3u2q!S|<|~nC$%5WtG0?iP2^{u|8NEsu!nW;h5L2cGwOrR= z8^@czBi({28h7X!AzjLI@*}aHY$Q$ZnlX0ZB4kbxV=w(w!oq@iT(4jU9&g@(_4-G|F`V`;t7`^JkRak{PG;Ll=}- z+@x!k=P`!$5*T!Hh}?Uj0S}~~!+eiCDC}7S5|{RYtdAHP_zL@lR2mq~o zLDdH|;9ZahoU~j-)r%r&yh;qod89v*^DiD1Zl+e|h~8R32IyQ${-60g_H$F&JM zB>nVJx^-?VcuRM)8RtK-Loq?*alv24Ja;8NJ+Y4riJ72QQWYFMTtY|nuh0|KlQp(! zzhREBDSmLvA_@AvIF8dGO6NOW>%IwSC-+^7wvfSDCX`W#g0FkE$@eRn^w`lw{QdB&YxKEM-|C8RuHn6z>8dH*%JY-o8mv32u- z^=-L$^pzgoc20*V=;mf{{J2Bi7ZtZ}BlP8M;%dAQtuKqz2{drdgS!o2_#qY>)J@5& z;1$FYU!bFNPY`wYbTSqt%RIk!nZ6gQp${VuLdM$^?3?^csHG7e7u*KhKR8kk zt!h{hLa7K>#^d9h&~@J*F>|=i{q31+N&3!}M9oPTe0u=DE%B!FMExM{ha4n*+eTNp ztcJoPN%+Oc0s`Eok*f||XMBe|y5JeQuBnoJ-7`$L34dWW-rmIW+0LrDJH8B0-j@Q4 zjI{=7qaL{Uxebw^7Wg}ACh{3yfD_lvAXqhp=#?&|JZDd%k-P%+OFV_li=%v%RXcJtD!c%G~4~=NM#QZYbS4$OQJSffs$h z*}m;&@LFXR&R@0;##`;F{Vp9cY+8>)VK2zPOWca(_7eZ@Q6SS#tCLgL_ENvL4R|WJ z5MpgS3D1;t+A#e)bK*xg8Qb_A4zHhDSEzFW_l0VsoaI)quMdF9<(~~duWhBv_Vp1q zb}oqbOTevC0o)kkg|3=6x%d7?{A5v%i+Ah5hmLiy#=eE5eH);26Z7$vO(Z$~Bb1m& z9YmYQ94|@hGo2hMfpJ4ucq*(w_3gDW;uXcfIA6mqi9R^^O03Re?lF>YCQ_&K@2%mL zXUEw237aA8{w2C8R0_X%l$D}R@6H*?2z9Eb7s-v98^H z(4Y&~AElKOXAmk%Y5UK;FhwQEaG#VA`lJStjcQ(yBD)imrf$RC0=Mb$L#Juva%X%q z)`f{aDI9OW0UtEA;eh)moU*oxnKE}Tm_O%og{>^{m7EXi+aj6Rb4u`EegesR9FDu5 z$kQ_p8&F`&B$J)w2#4`6HPgT2ekLEepv&Wb!TA7d++*$c# z`EMe;bBKV*v^uN8Q957km~mJL-c?_t&e;r_{;fty z07cTJhT7hzVZK=n)l^Z%IbJDvKGvQwzoP)Z8UrCma)MUAPot8FvGk&vJkClFfu%EZ zU|IM@!}$)jgm;-ePO;-=bVmTrU@Eh$)SSw3UI6L%3QTs=rw^zETz9=f)ob)Y1W*mV&V_`7$$|dJSxaZx~h5R>=PUg(cWVJ7x$LVtv z@Y6*C88wGM!o3}rtoDM_TN-Kop~akw#RylnEyC7>rO+*q4h^wVkn)Nbx5m|x;e!Hf zaoz}Y@ku}m|J~ZzXLpioTla!NvO2Z$mipUq_ETW+TB+6>2TP12BO(sd>Wwb|Qw`{?F-;?S_ZoyyH!0sEZGXu0wh z8o+x1;|3Pv{OSy6L~pUAn5|REeBy~*e48h zyo4WY`f624Bu?DZhn*hsY=SiB3RLogsNN~0v9yNFcsdP&BbH!jbGD&K_8NGc6+rHC zev6jz75I6CKv8iY2Kldsr=JqxzYG6SUGPBuJzN-Ye+5uBJ$Va3(ngj1&efFR87ouca z1fp+U;dgfx^nBJp$F^mlHn#!}elnvXTEFo9z8*Nea666unonco8Fq!L7VL45L*>uO zq`$6_%nsK#lpQUjn&X~9PZ zBd=!T$q_B+c(o9v_6?G@mMb*i)tOfdCDdHHAjof&q~2|L461f`^_a^>^=~S*owNV1zHy2`zxd@u=7RSb%9?I{1pPu?UlSc0s!FyY0k>~pvYTW*Yj=WbP zCqj)mr%wGxP0XyYPiTy`}(o2@dWYQoQ}I+m{QUA!wk7! z$;dq6W}I*N>b&2rV6J(mX?B;H?u27r{*~ zms#KP?{wK?9ei!VHR24syxRY`18Z5Gsgh8$<)QJIId%+w-;OZzOY+{)nKu= z23~yf2=fkb=f4SMaM27Ujn$W!Ep=g3_WL3@*!GK9`k27Yni|Y7+>2o<9{6lE$AmHY zL#noRu+t7X!!`GL)cj>u?W#Q+VT^wTz8a0??j{UiS#c4nOikeKV_NC&$2l--@oH3( zn4r%)6T$8NR@}~;3IiLjLhK7$P!BAkfp_8|a$qH!bLBm8c&dvA_pgyGe{Gnfa+&eo z7Y4;u1vH=_g0B2vjop3E=-#1HQmy2Uf1i}I)LV(?&!2IUo30Sz5tphS;-_Bx2n&T)jT`QaF{{Wm+~rw7C@$>3)FP4t(Y6doF= zr$(VVBqgnsy)N!toAyuzm%43(slAHKP(nO;wN-&>%Bq5y=3EE(Ls3nHqdd%fe}ar@ zRp1V#R8lNsi)vg?`mokZn#avEzQ3r21=rrwtmfJ9{NF{$dGUx^I7oootZ0J2O(8CQ z3N4;zO8;K*WAlGZH+nx94Fe}mgJU$;vst9ZbT~bt>5*9&?DLTbUi?T5hF$3nuG1fH z89-tdJ!0o^?#UZ1f%xXe47k>{mGV|mJXa9W}oIC+Wl8A%k(3PbPwak_;LF54A|4|MXV=6|!O$QE9s4gaI)yaTCx-!M*Q z$WA3B36;?_&imYl(lRR|8bW($4>BSdA!KLED6^80^FH?}q9{a3Q)p=FTPmfY-~0R5 ze+TDzpZC76>+@lCu(#wLd_F^htKb2?9)#4d=hJhq0ldSbr=D zb)tJn&fp>%9ln;S@0kt0+1ud1vK(-~Ih9x^J|uH&JaPTw<3yofpTAFGIvSk?G+4Qg z64^_*tVIe(4T50Ge<@6E`~%|qMICF~DQ?Rf;2hUYu-|De>3GzP#$utAH{&y1VD2w<9B z8Jy{TMnm=(V8V{m^jBgA%6?SEj?FFXZQXk$e^?f{kUD+uSq$TwQ}OlcHrl`2jIQ0) zL)4CJB8sur_<7YZ0r6#UYmyXt9A1k#Zp|cY?`L@GtqWE9(hz5Bfw@w)&;AHO!F(6`&67k4 z$-SVFdx;5V+DMYyHabI29vwFqWB(CV9N(Hj?=E#?cZh4jubF4iPh1*IWUo()94QMGM;D@=Nf@c_ z)!l9A zWuB9=6K&w=vsYp#<=J_eMcm{mM$lJ zqVocl-91IRxqjJRk5ux0SOlHEa11i;yz5cY2fgXB;AyXl*Ai-Jo^U1fE#Wdc`e)H7 z*_f35oCa+232-cmBxfh~kc>I^*k3FEmFG1GoCz$ zJEQ$s$RH5(<~cELif6XXnh6u7@`zBioVxmUktu-@^tsa^cpEW9kJWzQIj7Gc_7&Hm zbx8reWG#w&jQsJ5^%wlPrwY^j){?EF$C(SxKhf*JTyiPX7pnD_QLT>2tk2j=ruD5O zRg#~EnTB2Dp@t~L6uqFj#md65Qw2ot=s)=J)t1^yeCB zX-NZ3<_LKE1mHDpw^s0VCvogg#S4B4L=z~k?%){uY^LOI;<1yM?151G$G zU}=3axg$~|_*I!f{mbJy9&0n5uNg*Oi(JCi$4e;tR2^q4zMwm0Y~h&c9g>r2jNZW~ zG2TxZo{QZghu5T&4TT!$Z0UfDJ6w^^HuDrtm|)$XLYlE&TzIG@1)?02*ry-oP=CK` zSpGd5U$>u!zVDlXEgK7e7*DL*V+FRh0{S)YD&3$m0siRP!4wxKD)Q?Q`EyAIWFOst z86CmUHU12mCT*hI`Z?a*$}!|unhi<*REcqc#yGGmj0|x16JzUtbrpJ7a867BJ;=1t zb3I=Kiw^q}J+5uG*x?`B{~!vQwj3ubZs}6F>g7y(k0;iD3PCmb6ZnJcXx+aVjvI=m zZFV^@{+39{lyH&`rIcxM@2l|ahVQqbA!vG%^)Kqf~_G0KYM3E_`EMvtW*)s z<}9c5*=DMDyowWspysnf%^Gw;ygc?9@AlH?3d+GyS$%lZ(a>q zrzCNOyb~R{T!2aPDoikUuRg|@KvPmX)gA6f?Om=o{`f|6Kd=VJ?J1`&2maB7jW3Ce zsxLFm^dwm$?SS!%Yv~WYBJxcl4&EMkNaKd)gZ|G>;uhxwu`;}iY;SQX5#5R8x25NgJy!TSbl9`{m5WL|edNJTUGqFw~&3#@7LgbO%u*$-bA z9VV8lr_n|<9U7&jq3?PJ1|OUXmIHIK9aWjD%SDCqBO&m48>N~bSUB*|3erU+$;ze= zWVvTHIUs)q*W8GtO?S&kDEFOeazD<9trx|QYI-=^U;^YcN~67sEPq|i2wR)p0JmCV zA*Ljb-udJRgKopLV)bVXv;9RYkBi|kn2Pc$GEwn zsI~yzkF^uKf*iD~?`3^m+s+^_{yWOE@h;w>aB`%A_wUBGA> zZiDzGksxPwfa|8cg9~p?qj$>$c9MZHX3glLi6dR4@sS3{gyy`b=ZeYjB{SZFBxOiY zQDUrqr{Y58XeiU^q?(*(tZAD*D(Kij#uFao)EvYAW>*l=r9#2P@0#?j>3L>=%a%l) zD1r46URbs`25&u%gYGk_M6-MroK1d6zd!RPNyiS5nm1u2ZhtpDK7AEx=Y+uo5r1^! z<{gnzj!X{66W(C_la{)DA>j#HBujl1SGYZaD?@U)Q!SCWcPA2=x_!*RkN_R+3Q_uy z1l97nPpi~YEzHi}gu9P28M#<)&sNaR{{H!xrLQ94*iY%Df>um-}djojN-1 z{6MQtE7FC{d`6y*GFnSAaa>6vW;%|64k=aPG50M@#?l5yC$B}9E9{67IE&JVl7M@+FN8F^0U@14NY0OR$q~|)Y*@c5lef|+*rC|qk zx;4zDuF3eX>IAdvmKWu1K18HvRnV4}5qf_l9_A!W0x$D+a>ic(i&C@Lb9 z3!}b%6f^ILpl*^YSS?sac8Z-RW9xdD%Ihw8X@L~iWo*Sg3W~70ERHye8;hIgHj*TV&8Bab-X^Qwvn0}043Ga5 zlG8gb&_gqe1(0_Vbq*S$?h|WTXsQIEL+LPMuQ9#d9}7#4hk&6Vj194`0iDkOu67rT zz#dzD@cXe1`Z_k7pPMKkYi~`Yb}`$*C*~jtQ7NQrCSM@kJ5Ry}#l85<#T(QbE|A`T z8u)whEwW2^8Yk*sqGJ1I(#&>!9MPjRz%QMx=ePweH~WeFKq9z0aD39WFL_=&2SBf+ z5KkO@3QbeEuAKG<##xeM=iQSNb_%BB(5Y!8g8U(u(}}tCn(OqG;K>J=vo7fTYHD*3%;^*Cv1Y7&)SKP=?&yRe2Lc1#&|*g zCh4?KMETpfm?LKjU83zoGfDv+UJo-WKH|c-+l!eOLrWm^n ze5hW&5$7gfVs1w3lI3!Rxo?Z}eSuSIotT_wZ?<&B=3tOk(nG zADmofB(ziBMeMX{NyNWoYQ9nzHRoJHo!FUpuHkGiyjuTDJVD-~0SYv5`{SMp7_wqb4VXg%I-Qx?q&6(uD??yHuYK+i4=>^Oa zeS+gl6QN_a5^)Iyc8r)#?>cva*Xlu{(pV0o_!QXhYz^Q_P(7GbBRE3?D5xLCZFC zew^*81WXgiWG!=2Ixml^maF66gA(w!hvT()%|cPnncyLLkMwi8NN(Gq_DiNkY7 zN)S_1O0Ku7Qd_ql1m8X+eU+UwsegxH>)MMDY!^zOtgXbW$w_FWxq&2p<@i_P=h;oQ zx=e$m8uPIKKQhVQ4W6D#qZ;ytm~&?lUv9EKnOWsYGxpt~y}xd-#<}6Bm$*>y{HrC+ zeo+jP!mBiFEXQ}ac#=8|t%LXX^hghPj(R-E$I+h&BzMV1vVQwVSj~hJpS8CEm)kRa zCR>dulR4t8Yg$qupEJv zAChUnfDB)E&KXP+8DzfN-UDN)hvb)w6ez~_(XOOTpx(@9tIf<&woL*OLLZQuGj5XD zep?(fdpfxOk>{^7X~ipdm$2o}%E{%WSIG|%e9(N56nO*-<8(1;!&}BF_EF z&ud8VvM&lUW{7cY7fUh$7vOMk8Qz>R2$t>}X!V$W$PYOO3wllYpA#IgIxvO(!_8;- zVdC(091AAjj-Xw|bIktL1Sx-gP=4tkeaU^tES`U*CO?ZIFr3&*G}zJV(~pCBb2*U`G6 zpZcXgV<%<1Q=3l))Ztq+`!97ocI`}n8Sw{+qs{}8(KUyPX)#dCb$@!tW`MQj8F1*9 zfQN5@49F>?THk8)ezJs^&#DBOjIsD(yA8FMZ=`$E_R{0>PI#i*j+X5F!WJEIp?kgB z@J|=Z^tQcW7CufUJQE>htj>|x;#63u<^k(Vd|}OtNhH%;i;{rTaIqB`&7Z$$t#d2Q z4diCU?F(Qu{~}KHmj#y_vq1Lc1Ntf@82)Cq(0^wqqG59w#NX?tty!W7p;07HWDM2f z_BO`W^WZ~L3CKLkMcqJ3+uVw4wLbqGH~(3XH;*22sAlx{ zy`YU-`)SapEYi7I9hFZN5#RC*P|X~|a=~?~vu`VW6s>`-kv>|-W`m4+2=jKo9RGrF z1b;^s(AJh3P)j@t{|XgRnXiC#`$ox1IS=|u>>ADtQH1+{Uy+?2;mDh+z&G#DgwqFq z(noe9G*c;xmPT`3&y%S%{YVV$x}QjT+s1QeVGE7kl?T%H%W>3yKGA9Pfz|KonXU7c zg_7}$iRNlmd=q&9j|*FAmVOI!L-iI(O-UowGC-y~4-mP1Ex7-64B75$NvEouV!t*o z!#%q_$+(YO(cw`lo-`N7lO>Dcv$PTfe&9HAXIEaG*gh608-s7o#lY*cO7wNlXL54+ zEy17TX|RWTH_y`4rLxN=;aMGR&g&5Yo%O*0=D(=()pz9C2~`v<6X4?i^zogOH+j{0 zjqVPMAeV+5p|pBBKiNJR3m=T7A3kMM#SUNm@p?M4CUcnjan)Go!=o=I#L{!Or{I&T zQBY47!J)M>)W{=@%o9<=VarZx`h(DZqg3?Bwj?VK#WMbW6)@9lJ0{8UVB!J`#^|9J zG+3mftj8QWT(SuD7M;bQ>@cFn^@<~|Taj@#6FE=vYB&|uPBrFlK)B%rMLhz_ zAqMcY_6=2#mW9lRx#-v1g&&7wKzG(SkRM2akl5>R+)|X-@Cs?+4O4vLBFVIDt_1t% zMr`zRPjVnyi*fkb0xtd{Tz6v<^M}g>8Md4O+tsEphhv{d|M){UtKFey;`J2HN8yD@ z(eR>)g+CegD0x7FJs2Dbu1yz++3HQS&)I}Khj&AL+a4%!xy!UK{E9=>{`89OBT)Za zjG|L^q3&3J68mo*QJ#E&E?Tz^9;DnN4+}KtMcYKk9ivWyGo;vO>xRMlTtCDKztXMi z*MJF~fXZ=QM9L-`gwn_8t6B+iAT*H#8E#>_XcEzjKMFgptb?Z|1B{?}JY2QOMXFwp zhI1wPdft=3Md}K+AN$2FjP!-YTa&?cjR{OG_GTVwsat#)(?G8-l7TtXqrfAwi{9Ge zi2HtACYS20=!VTb#BS&{nV{E7G}IAOxc&Rq*H+wlXoxDG4#SndI@qz}5R?u(qx8~s z7`W*)5eyEIm!U^V&kBy)pZb*8$;cq@>L9!AYZ0kDDGgHxOi^k5adw$@GR{a<ld%$SRO?~0Lf*_om^P8dG!=q@hi%5ng;IjpiF~lfa~CFqi&E^{gc^ zO0gP`X$F%;hrZ+B(MI}q>uj`?J`ZuM3w9s7+u%KCYdav=cw;TgStatXdrID)3eRWNzhBX%#oq~%f-c&a}S ztj7{aN(cvq>(}W1H)rYYBVLql^COm;VYqe7MA+@Fgew}jzS;#7Twx(bmYkUi&5J$B zPmxO8tK-GA-&+W#9g@JaJx3}AZo~16r8tJK!o>L>=uQ5o&0p678c7aQRU=ELm9& z6{iNt2ea{bTKWjuYhNUbmKIa$ahrIZH)G<%#E4Km0+hDSK$j!`i0x<^eA5&`@6$I> z_S0P)_%9c(a-PPHSNTNS(g))q`LNs!{QUiC`ga#rJ0l&)$H`ABJ9)~g% za-U^|dj!gP??DOO>)6&K3fT^nC~tMAdfBU~SiKdwY-UM}dc)}K3eL4BQb9Ex+;O7{ zfjI}IDI+Q-TzxPZt?~P+0V%LAVM$B2mqBEMzF2I1Rb=iY1{)3 zn(;RSgCbexL%}4$-Vg#$FmIMBl}zwSr9R{h4eKTZJD6%pIBbIG5pVz}#=A(U)-KoS?{W8Z&iIQ!f_fkRjh z@yRRZb^zfZ5F>Pv;~`kq(ZDv^`%(E*J~XJmmd>9QMvL}~)1mry_RSnG%;FiLl5sDt zq7qOgrVsV@Lv+WLR{G%CTqv0uL*x9)I4-FSe+x_?2foh5{=dc^Eu?!*w@@+5t;EXQ1?2L8_GrjK-S=nsG3_r2?7a=Wd=dW7{4l69 z6^FPDH;MG_PTW)3N3Pd#&eo5oF+Z{$Muom4Cn*IxE+50$$Ctv)mUWoRx&Fqf?q$}^ z411&XLF3-Ge=6qu*)r* z7#Hq_7iZ_=s2vZATLfgHtR8%Ksso`~4!EV6Vfy69^oQRbRL+?}^_>c+egwxzDy(Nq zzIoG#`@iv;=_YVD%cHA4714w1)cDmLYo^#u6WSj9wvfEaCm9Fig%t~5qIfXW$HXs#=^`8$D9 z$WnB=%ZK2^Ow;LGW{~Q%Mw+%U6yNPKm72WQVX4n9t^U~f_->+NB}(`-FW<+?Ay(#KxRgva~ouo4fR zCoY1qi+2#eWifc{!CJED{xVRnizEsGrF3N23CtzsK`5M!LpA+%3!;~S&%G$@4N$^H z%N2r}FEZ>|l!ib1@{m01#ES8GIO(JryLz7}cGo{A>KE+JJ2MPiq6&uAzftW`&}2&nEb?$pKuJbh3HxwfOhf zu7bXtQ@nB4?x0`RQIPp63AJT$`xh9UfjZz&C6i-y#vf# z@irKGrw`dCYe6CL7Fkz63B|@N#p>D~a#;TzBfrNMPv24$PHysmRo|82dwntb^USz8 z+Hag&$cbhZlCZ`4H%xZk0q%=t<5u%jqM)8cz6D)oGc=Y6-p)g!sC<_iD{4T|32S1% zjY6O&_v}A=9bUKRpu}i1Dd=`Z!ON?x>eDljpjt&5SI>gCaU5H7ej|0{`M`deUGSZ4 zfcI_7!MiJ-W>&4lU1g4l9?fWW*9MpFQh@=pix~Prh89XMqKluLgplb{m^m24{F^== zhBB3CRl|8qHt}N5jQ>b;1QW>OL+YsX?H(c&exW~x=i=awvDltj zObgb`qkZ!;A^YJWa$C3wThB7M@$58oa7d#~TUTPJw=>pGmI13W56Et9q`&n3(IFK_ ze0dvoWKCpH4ya_>B;***jJts0Lvo}49$vtO}ka(9X4PgT58oWVNy4nmE`Bybcs z!hf$=xMM0oYOdsB$GIqcX0RDXdYYK*y&I4Qgg`Nuoy%;?M|3Ax=~SZF=GsU zsh2{^G|z+T)`|E=s+nWrjIbp}5#YG^J9NG*gY5=47^$YYDAszH?A#ClPec2N;d3c| zMlyrvw?BkOb6r580^xJ>A4Vq2m`-tF$okj-Y=5UiQV!%oBi{jo-khfQ-+7{p;&Rw@ zJO}kc%;B6xBv`9^;J7Mj%(r!eO6Pk-vcsB*KlebeVuloXzN8rQH*x&8u5V1%p-ehe zi}OHxa_j;9He#~r8hO-rpI0{|1^D3x9=iC1_i=Lue0}J^Io&Ax(efgFV4MY0=6AuS zoeC(bn|FS^WG22M%QWXUU6G!6&?M%;kte=`NE4P$Ai=P2cWBHI=??T}h{n9Zyvjd}ZY;63L`J zH!v$>fpE#f0W1-HO3LHMz}~oY_}spkbkxq^`X0aNo*p~&-?Ip3D4d}SUgu%?+Y|J) zr8#{$gCz>4vD_TGh3rzg1r5zv#O`$(tr|IiNqL*uj++_e`-!Whhx>We%UR$(GZ=Gk z%)yx5)ub=5hqdMUC;9&>KM1UmK#f17{cCXe{3|@1a z^o0*lfyzaWulrmeefk9XJ~4%JAkD{=*a0He%D_K^m*i;gkia&4BG!+SrGv+uF~=wd z_oRA5u}lWfbh##3p|hF(%b$c9+0B&PO+?k~(RBw#bg1?v|*1ka2u!Si?~Tz?TyZOZ&G?q3ewRZxJwqX*#3uqXVUSwgqZ z>E&D#dF1WFYjpV%mN|Zn#n+3q@y$0MusYstkzgdt>XbjF&-Slo78Lp7n#qIY{J$C4 z*O+Co_iPz_SANSnT=GL3^K(SRV!xRJ^BDSvv|;Vl=VYne3`TicFgZf8ov~xqb|aKUx0dlsDjo@qWJHI90u-jM|-o&FfJt;2WloE`JjT# zzzBKubO)B?s^R`G<3Vc6QN}$(MR=+FI96$uvF3t4`tRTxQn79XUQKSm!8ca)#K{rL z$ebn#2R7oHh*XrRO$4$c3bM3w1fQoef=IC&bU59W^N>q{{d74p=b=BY$*h6~>!0LS zTs{f4xCj!ai{Yw3fh;|;2!H(tBsQoSr~XwZmQ81I_W_Q{7rhgHZswlB=hNWj)f%`i zGae<~?8y&N1~;s<#DZts3}oUO;x{=HRu2b&!+IZ#G1*D9&sIR_-YQaCKL?ejiorVf zR4lk#4x>9bp7MD~pkE`InSB}%(HqF7t0&@>J<*tC>O{f}x5K0D!(?1UJyG401Li#? zMAt1HjWXM5>;Tul*W+>wZ})+s$7u*ru7KQ_Br^7;41c$cFFum=hT)&VT;`z-72gNK z8G$PdR=-8Y? z!lB@=^zU>HB6EKnYtt;wA9=3E9{)W7oY-_+|HF!zVDkj|Ym?~MBzL$ZH^h#xH$b=i z6%iY62`ghS!ZLHj=w-ohK-@&wJ+vRT*&U?U4*0Mi)&se7p%bg?zRSkUrdb86dVo=CcnX&3TM`UWa<$dtV-d!3z6iR%1=BrBmv=5$`~0t zISl%EkC|AKPmV4z2dVQrIk({uMI&=M{yuOXr%*cjI14vg)R2yo`*6_-Q5qIqK*I%qw=$K@Rw_mBCddX9` z6<~v&j6d`5ZZt?<{=~88#`8a~{71UEyXDOHb0Fpj=e!0pXvACOWmG7ZI$c5A>OyuJ z2T0tn$;WZG=Yi+dYWg@?TNvNB0Cgu?qC3Yee!owg&R-)WZTfOBF?T#ZT%`hcf5k(I z;sR>gpocyx&v}_U3gNSd54qJ?$jlR*0R!JiSh!{gmBwh2&i1*ubW0q(VIT}Y^n+BdkD=EcPMBwv7^2vv2kdE8 zfBJ3LPM9Jx2Fq2$aBRv(*yOhv;%=(YUh!Tc@hgt(Wu_79=3xAO3}%B&?U<&!t|l&n*Khl0?z;{BL%0hAL#qM#JH$ z%W&_Kndq(V5BFY9!zfKN#=*l8WQ@|m;ISkY`NqKCi(gP@S2G*TF-TPZ+#=@Hwx}0b zg`PbfIDK0*ia883`GGpPE2R*^x7;A}d!G?MlM_szstc^|?giVN0{mi=iibW`($*y} z=^{@fy3cwk?6Fq>gLwtus%43e(ubfjBLN=Ei!m)G>(O(DG8sIx0Hz(hK(Y>eBgy6? zwDiDSNS|WHTHnrL({@K;-(e5D^655IZ~DnA4Q7OnOT+FG};f-S&a$ zs2f#ySO=DxJd_yk0HJN)@VRbKU=kcf*RM(DX7w_-{G1P3wrIde`dOUSQ^?j` z_rhU)38BnlC46_sh`v~R1J|B;hVxg8pugie`hHm=^NDjLvfE9Vw_8?%dZZmn1iqyn z!V;vaDfDyb1E&9W993)e5f;=83ng;xY^0xd|G|vAUXd$ok)CG&A6Cye20VMaG12;`6Jt!9SAh z7(U0bFUIj7G_GegUY5~gy+5hr&Q0k1FcmcC@$pcI0$u*39pr+PfOct9Sz!d=1S^=~ zngNFI;~7o}1k-P3opsB_%lI%Ljue4@jjEcc=fFfuGYplals9YFU&F z{wfbxTa6gFk;A!@&E~`V|4Lxgxd9hlFC~5M1w=kY4Yg~G;n8GIc*kXDeEE0aPjET& zc`gyTDcd2xGrgg#SsB z0e{|6kZ+ex1<7~?INu{AspHmw z_UU|q*uOI1`CY&l*>{*nakU`3kn5DCS5WJx@wi@Ox%q&5BNmlr(bSbZ{`1qtXgO^% zPTV+#Z7kwu4x<|IYmyg!p7a1C-|WH@6*?#-mqem4B5C+4Oge# zVpc5P3JrPr#BKi_Sbx%nuAA*~Ial7pUO@a7^F==tV>ZGR1EJ#!UT5B^7UrCs55ng%wE>tkis zMU%ll3*fnHEPL;77$%Rz(Q)@<;k3eH7F9yo-_`!`!s9)T=k`RgZXZb0(p!6UHgTS^ZP@21^5HqzTC{#dAV?Sz~~Ds)G1J&K8( z0t4w&REs;G{#i)~E9!-GS5g;=E`MS1(}rWliBG{Vi!2 z8pxY0Dzxxd#LB2sjKjQqtnAr|vIVnA@_lbE@0J2R*2a`jgbtjlCwnay zf`+RX*cZ#f#_&>DZ>ULrfFhL;$pO?0X2%DOGJiDZ2rS&LgQfZ@-j5~MnCdP!c&=}R z7lIE#(pb(NUcVV$s1@R5Z(s1tnhCjOQn1;1FYZrSiBEi@A+J4+oRV|H3t<Lhh{RzhIZarAxE$*c*v1Lq|x@s#Qxj${6mJhwcG zGFuBFcEcOoyoyI{j(dU4du2>A*M%d+LClv-Wi&JV4hCC~AXPE~pUgoL*k=jP;y5=| z#5uBZ59fT&cEGk9Z%Nv!!>rKs657m>p%aBog8cDQ@y^X(RLgS-^EBfy?N^^q7Z_fn z7lXa&!=&NVAX0KJdPy{a zKy4a^`%dRI&z=W=E>fB^KNK#%PXVkv3Yoo}ulJJ++-OsUu8ew8erW-F>9{w9?DvL` zjaJ0}c|XUD^u#8Mh3qNr`?Z75-w6j^72$ueZs>F~2ikEyHEy&;K|(EK7?h1aI2LxC1i+X2)AW$-F%r;G zN|s*J0Z(26xlokPJig_GPt1?tdY}DJVX>aIcGM#^$xb*&s0tE-7HFDOK$>N*z$k`d zop%7|oa(4f6 zI>zD~UD0Ds%feM5_{CCS{Uc$`maQbZVkL}5o6t0=PUw6yOpaO4rdyYD-HLl!IOow= z82J?j#(n@D50!A%<00OG`&Xf4oDSL@^rQ(3Lm{u`7fxANPw9ayI6sHtzs;d2zE28m zyxyQ=YanPHImk;gxy1xjTxK_v9mNj!chEb05JYEK!;6DESuLIGu#sc09<(^kYMEIR zKdo$ZY+HlIF0wE-D-Z9!-$rhQHjr-x-tbq%75Y6cQ`KB!ync~~Eumk@0rg;zIiXJt zo0}LHy_00IxFsfhm`(3o&L-PsM+Fm}CzI}P5>!ZEGgAgUvCq?i)WjRXPJ?OqY3EIF z6}RRczBPe=y1fPh7oLM&s|Zk8!-qM?v|#;lRfsv1$ym4TgrL@5(w2W8a*B_DGjV1y7K5AI?dJ!(_V+evd}aVGxslz zz43`WoAHef`KOU)elw*8CrEA2Z@9c)1CKiW#&vBJ&|xeTycF`XrUxOTeVI zyh}T7RneL_Q@Xh=1bX;oXwa}PY=3CW zzAoQ}x|s?vYkE7!QjNjTU&nb}JvxxH*Aoi{&7jUP9tH|n2@JwNzR~phI4^Qo z?-~v8(WKA1TR4AdJj8Oj_ULVD@I$|aFz219r&%JhWp=n~`ZTzeaET-<_rSE0WSV;0 z3VoSQUXNxNNG6Pd?Ps3Qlt-dM#e}nX?j@J?RZK_cKgTI=(^=+2&M+@4c>>07NCdy% zCU{+|hz=bLXR^dx;cs#Zk^lDyU!GLL?tfv-^sDk@a7+x{TUWrb{ST6#R!2v8no&A%8pnQq zNHYvZab2q(H?wWPbrxIjs5fG<&qj=ijUf>$8;IdpExhtN4u_Ry!>%Le@MS;=ESUV7 z=vGry)6N54+96l{A$m3XB%&BLDM6&Vv)D>2u7Jqzk$5VP<2#Snp(`c&@zN;; zzH8xAShaW~jvQ_#eXd;RAY=@Ctfh~{hZzZ%j;Q0eLS>Zbwkl<4i7lc-pX5{%cpLuC!OK;=X4o5M3^Vgfvg)8k^(352NaJ(IZg?Z0c<3_o?F4etj7H`4I!rZw8=g*?$kIVNeL%WowP%7*? zeP59bB{_=`vck^ z*OMo868wOoN_JW&$6ZR>22mk*F(hg$8bvGfLkv@R4kj;|gQCG~#`1Q$!c(8=n#TF2 zJ8x4tsb{ooehV2>xsf=W`atYvo1np%Y?$ye4f~f{;2eo8u-b8vbVuwGyg7P+jvh}W zraQmWmmADbOO7v!R(SQ64vdZc{{O8QVvmNK5%%?dtwlD-H#$?W#&PB@HR3Wnt(GM%t@T3h)^K1 z49|ObgH%H}QAIrvo+~6WOHD~sUnOaJ!cr#xFuuS1jeJ}%h18#}AU*wQ80P+ietU3) zJXR~mH$myx84wJ&&pyL>4KVQzhh{pD27MriQ=5TZwJQW~dvlfy+A7@N4gK zI?cEUzh1M07~x{9n{W}cCmFIyZvRmUnJl`!e+Kok{X@;YL0FYD7H|IDNCv!5lJin8 z(9Ur#mQ|&o*WqN&kvo~Zf1Ay=?U{|?t;O(r9{YXCFmciy0RBvO_PReUUraw#2PDiZQqZ{Xo`peWyCqVz0I85ex!DA0eW5#+5aK{YP zS!ILS$;$XM^_ie7U^{k8yTiAli+Jj00=Hk%1d}ld_-tDbj+3?*+^h(p>N0M)Z8?{L zvgGdEiB~{8BEb@A1y%C> z<|A4az6}Qwg>>%s%||0<9P&+?alndGl!=EuB(HMAXcw?@JN>wTfaA z(#vI{hF3ws{0vevuoK^IxHte7$`h3uYhvlLg+6j^A~{*{q-3Hl$bYJ1sypry)1>(@@^dHtH&YCI z(`SRFcmfG-O+b+i9|diHKao4)JMgXA31BNNF~2}uSg&vwT)YQyU|t)Wvf?o*9}^$Ds~#7S?(t; z6a1QSagBucx@W0#_#&LDv=%!{*TYL=1vJ-jg)Qo?Xg2m1*3K&>4uR7+H)%7uxa%11 za{Em_sXkyNZ_S`;|D))<mxv=p-UPRZV6 zS4QDEw?Y|38kA^Il7{L_DjI&z??3-}d3`?4Irn{C*ZUHk!)+7hTX4cqV}Sb)Z*?zbagVP)!%t> zVyKUbJWB_|V}D7}VNL9C_JJ3CMRXmM5Jh!uc*AjE^3}r0g-uSh*gg+EhCdN~{W6;M z^d}XtV=#}~hm%eFU2r_%GvOjg?@m*3Z zcLzyQR!IqElYMGOPhDf2aw3WF!yL+6kVJERHq%R{fkd}bn^|jphMp~ufb6J1qXzE8 zdcplJjU|>e`<6D9ESAJ4jhv^%Z9UZd%B0~{=Is8pk+AoCGbUF};-uhA5yRaH7e^rG?Q zY8BkT-9tPz$Bm{QOF#)xzPb_q45|?!NoF~Igl50r^w+LVdXG5{k8(BOeA5&n|IHI? zyKdqg=Ppc4%O*$kJ8|jPzc?}PI!ufNv2g=km~$W+tW5;z)GcPUUetuF?~TLA^xw4M z;RsQeR7R)3AoysvAAgK?!`sFrvM_8GmN`bz$n}Z1bZiSe(y;}Vd_|-N*WjE@5@u;n z&^@1T(5D&E)YW7L2<2_%b{J{w^WzGj=BA8Few;7yhao#9&ICGZ>aeO>u_sZN`guq(G&qpzg|P+ zxfT9Y;Zqo!<3k@9MACx3Vy3ug5kBJfQkHksNVPFPIeuje%FEs$KGnl|j zB``gw2B#|RBg*mzU@$goOFpy9^$m zFF@Ci)!<^apPiK`gbf)5aG-iI%t?4nOgYW5e0~D%igRLiofZPun+PwyuLn2DqxdX9 z+4!R7GjixR3kM4i!v>Wqyv>wAl#mr2|Hi%3FXcg-M>t%3(@v9)K7xx!uG2G7xfmxZ zhk<;r>HM%YOw$r?u7`UnY(A<+gXpZfJ=#Kby^|5JP(1~cT7QwjBV6v(?-_J#nn6vi z#faSVHuy=Ks4?fKQ2Q!JzF0gVV_b)>m8%nohF`>PtE$=nB8b~++op#QMyKGbaC>bH{v7Kh_0}HfwIGzp-$nY>um$u?H?V@2p5qCvi?}lU4jx-v zP3wot@x-%f)aFbU>E^Os!J8V%!9yod<9QK2h^Zn8wxW=EZ3*Vw|3!bQ{wCSZVp!XJ zifCMpp|OW`@s%7h8SbaB=2r#$&0kAzr8ly+uWv))zAVhyu@#EfvG8d84}3C7q~r2K zMD5rHmUHrP|HlF7TzmrceNPeouzIG3nMTCl?!-JLQ*!C#b3#|^!M=!pM0J-SwmU6m zg$q>S?&9;1@O}d9rV`lh5D67yn=yTK5v*9~N>6G1We@3b3>)X2RG_zy=}PegXS?q- zQf(9b7oEi1|04&kOMcL4(_+XAFFuI)os8WEJ)A#1f*C10L2?rESkGR2H2Qjt?YVsz z2MjM0k}nmAmRh_zwb)W+EYm-g&HzJ=n% zCEyx;$8pC5SJx9$=j+rUD;)N|6GXA}TG;kyALv+=L43;v__kOEWn*uG=*nKm@&ASu zv$w)pZ!hQ!ozLR32>jqt0h@}u2JPsjOHxo5$tuZoHMif(35)w0i{i52|6+@i+AKs2JPVA`MC9_4rTcJNslP zniW|WNu>68Qr1C)4r+;_1P9}N>ud<`CC#vQP79E_G$O%yudj|U@VzeqvUrcsh?o3z zgPzZDi`g`MKBt`7mDGX(uX<7Z8|UZ!8iaeEY{ECpYOqonhxwJ(&@^;|Xh!yeYe*k) z`gV@0?aXLKS%Q{iB`zMgVz|(tMzhs`F2pua8=hdKTv^R$M2eum3+ z2ArU=lm8L5<1%pI={D?(y-&qwIN_AE+0=eU1BQfrfzb^UAWnqQ;^b9YR$347c1vkQ zs|uOI!*N)e`e?9W0$Kmx0eE?{gMMoI$!K}cA)LdHF#Pj1(RK5P&Dl=dH#qhoe81w3;x)N(K_u(~`G;bvr)?dP# zYBtQ}j9O9=R1ftZ6H)WcQ(!8kX}O*&j+VCI>y4G9_>v9Wby$i6omcRNgD}qB-<+3jSU(T{T4WH3)-zP%#T0yOC0WO7)Iz@` z=R?cdS}eam4JS{uQoFbWl$GX#h64cv8+>q&raq4KE&-35T99}>lgL{&P)yecVO~G< z`XLIIdw^_jF@r`^E@vf~g}Dc8X;W$p2F`wrq8$6{$RBg8UuBPiudhOa=K`uwB8x6X zsZ58)DR2mnq>sbYapiq&u(k9e8vD3zqft#_y;KcW<=mn!>z(k)eO^YpJe1~W+OQJB zImi>QOP6z*w%IH6FjhR4xO8i?m)25fbt)xZXw?7}G||^|;>SbD%bLY$IH-e+teu@1?wDqR^`+zXg|X%XDH^9`9ou9|*CUBln3SE3#;f<{} z-l_G)6W@gBUEyRH+EI>$>qBAZl03G#?H4oe`&ah8(0}B;=nkBH{yNX5`*d(NKRL+Di}~E!(c-x&OnD~)_jbRBm!GAOe{W1RT#3R`s}PbtCWy;l zI+4aydAM%j0#*5HxXfMw#{%!b2HRKgqr-*kJhs6v&DlgQMxxHccMDXu}>;w%g-1_wkR0o!iq3j^DO9cyn@j7Q*`!TG4B2P7S?)f4kE>ju)%*D<7KwhMR;IYY9Tgz-boX{?{Y@)Kmu%(P6o{YF`R!+k%YYdK+E-I@Wmr-sK^LM$olrJRHT%Rc4$|K8 z)%EzFz|*>5=nmvDI@BHdum)#Wt_KL!=z`9dP0XwNvarTC4i(-$0Gpy< z@LHP-WfC(P-f|Jxy{DJDe%D8X%k`+S#}^Mgm#9md(Bt~>xXvq!{bWOKDKjATv8GZk zojBBaVCU8XYzp}da^0KIh(C@lU2Th-GlEFv`;#<%KpsbzHB*oBZ^Yw8F_?+S!Qb*i z+O>qAweQG-?3iQVsIP_e?k@P66^XxAhH`yLrJ%*zOuyR)W1id_=1^ekB#)qCdN%Cj7r<%1Jkj}#WNjX6O0Lvjf<<>8K!uN+-2;Uo=!&<9W`Q9bdhQu&%7#$7CV<__hCroKJOuw!M5hW_&MTRW5>32}`Jtm|ccBygvX+t)YtK^0 zGZHl9O`1`)rw&*@y8~)M5hVL=Ej`4Wg4@UCVY)B_V|Npn!roW3NbU{(DRtw*?Khxj zw41z}7l_YGw?pDBC029REwb#)OpJ@SsU7-s5_o4_$IQhkaP!>;#FAFpY1)EfM=ZfM z*BV}J*pGt+a{)FNkvnfT!k2zOda$tqKdz5s{8POkOTrfv4~3G?COg4>{b?-m-;9SA z#=&0SWTal#h+0D}L+MSZ+1tq843>u%soY*FgY(4kYT&gv&ihc~jB{pLfLl;AeYGAS z%B7w0Q2Iy8moGGGi{)}5T2q+=kwbXErk&1O%<&t%k=cJv0rZjwn9}tYczV{8+M?E3 z=((nvtlAyLWFFfAYu39%`_mNH&s^|{*FxBS>oq;$7Y7fIzoUJ3^H6nG9p>>qC9HoV zW=3y<8?&oX**Ki6kT`<()~+ySdzRpb`LSeTLpZ*jolE`W+ekpbHC#3?gR0k^p)<5^ z;6_zBnm>LSU1wfL%|&tOoHUheUdcmCwhN=(GG5%CUjer78>y^)3eNem2d)$b(yt3Y zVM)m?<|CI^d;4EGz4qT+c8{I{boCk4wfcC&?0I|8&wP~lT;str$+O|&=smJ2`#4e5 zl{GG%xDV~p!$G_o1(8V80{cH<};n7%>b@K<|*Z&b0#){0n%wozT zH+JT?V3^ueN_;FcNl9@K(VZH=^zf=uo$>E9=v6X~$BCd;v@Iz=P=Zn>S77(0OPH!6 zjXT}baK@kOq?*&8jnnMuYnc;FmYxK)+9Am%uSkP02L9A}N}N$E#~&Sc5kbKxe)!aL zCw!4Cg(2R(gs;7X_PATas#{$o`BWxQ8$S>$aU|WA!Z=7x zSX0>mRtpc2x4-l;@zh=5+jpPT3o_s%Hl5gVET7!W4XLDCm`K<@A_bB7LcjRFw##k#iDMZ8%DU<$N%I{5auR;)F{V zDWZg18BdM&qx08 zYeKKkRIrFU2X~~z=pDXkF#mxk>xw+aazTPn-*t;LaBr;-vB;fM#t0{-)M;O@reQWU zj6q;CU85_75sUvB#r9XguA4>FAXgAx%*({_i$CGlRz2ij1Z>mlc_d=`M%XnL&9rEI zFv=2|hYRl{a30?6c&0Ft2p-D;)h-V#y7h%-Z@t6qBOSQiZ6;2Sw?vIazIduS3(o01 zpyTGTHC{?#P_cF<&2~PBu`h(_{McqlcJn4Gd!pmg7D(!j7aTMqkZRN!;iAj9=Yq*sB{#wxuXx{&E|tUob}J`ky7n@qF~&*3)dl z>u9|HsRtV#Ize2PJi3p^!Kn8>8k5$DVO&nIDJ1|FY-bL|SiD-8(6f|CyQ06fo!%lU>mfhdT^;6+!wRbTbo7l^BXy0Uue?2C} z2Op6}w;}3O7=guWE;8yu_OM|f6NGFwqeJgSIvF^K6G{TeDszly2^B~h$b+0(EvBk} zi(#ByImZf`0p_aP;9Z^@YOkAv14Wk9=2IM{Kl+$SjSSXX^(CvP&+$QKY=x{@TG*Eo zhGpL#F-D}FEHwW{NB4J=8F$S<`rHSUbGr>L)(WtCjT7~sy939+repQ7AdC=u&eZfK z(x(CHR81*}%iPVS9nT}cuL+0p77j@O%11VFk zQK=eXyggz}rrnw#VP}2N(=dQz4usa*FeX9uRsS|OUS&~!LD_>NqTqf zgfdPe>0kbllAo)Ikai3TX%-nthwQ=MTz?3=EDb&7tMQz_H^AMMpfDzl_iNi(RZ%H? z9J3Mm?_S48(~60B`!8}r&le1;#yFj6C-#lqM4gf6P`XVCg-^8BzTxhFbC`#j`a9^o zzfVZ)&|Y#~U@e(bwuZ)bmC&UF5$I6qj+*OwS&M~t$UnPT+!U7q_m(t}qidru^hO}Q zSbd~=YefWBR@9PtoKLKLJe4d6wWnU`65N}w1bmKh46Y-2pe9%Xrvi?^$5%nPt1=&g zx&C6uR#oH`6gM_8{zp8@lBrig5>p@bfJk07tod?sCTJ~3jEw zT^KF^Xa0)7@%#VL>YrmYzMuR>j&kSB?XS65s(utNHWOCyya&4-w{d-_M&KFXfs^Kvgljp(Su=|mf$ce1 zX2}BN`+$iluu`ti+#z z2J~9J5x6PjlE<$W()&EO@uiO?5SvuYZ~2Z-Qx0Ha+ZPg_r%JaDm*NfiBsgG>H2>jk z^8P4GRaCyQbGZIR9u*%}YsW^s@BM@N;CWi}Bn0+zKE43!XxwR)1iuR1U~W(kIzF-n zaocz7)TRLPU|tBrW9Cdl-P57*%`i21EC+TWv*@>v>+s`CW1|?3r@}wr3InF|(KG_! zGRK&F7a>MhmDPb^UNJGcnhgTosnpStf=QwTD4Rs0*ReG4==VjPtGd`0p-V-bWtoG2 z3B=2elS2|Rp!3Qdlsc0r$Xdhpo>*ME{4kE4Jp}UIQ|czN1aNm_B2>89Bk$lPXgkJd zd^$P= zeI%0j@pIZ%Y%?o6)fE&q7r?yxws5}ZELJ3(B$p4~g^~)+i$9pj>8NpU3G6WZO!M5skiYR9byt6cyAIwWwGOK&H`UM_ z(d~qWuO#jJLh$h-FZ{br$k_LHAi(HxuIpHaT;3l<=4c0FnM`AL&=~NA#DkV4d(%YxIblFsd`zkDEp~u31bG>wC%@@*l0Cx9gU`g3q(yxH$_p z96ul|n(Nza+(*w~$H&QDU_4qzpJ)o8tJZQjRas8PPTOF42_N~gavuzT zPzR}qDzg7q4yR>`W0`<92px`t{zscg#K&T?yvzii5+2%l)xk(H@B=emfj9Z4w5Ay#ueU12wyq#9&j)H1>3JGzh;q2OS{+WN?iO{bQ{M_qxQ< zz&##oy@%l-|59q1<%BobQL_An8FbXff#S|9kU4t~TJ<hS zxdrP=SZH#9R<7gvR`*WQe}{sJ?VVWGrhk@M)tah_Hr6ohuK)ghv7#Z&jcX2e;5h$1g-W z>j4e2?ISz|jp%Yefs{!%V$keTcz4Db&EPY@JwCd8T_%+?nuQr*uK0cKNBZPK3zhvj z7lIE>XJ60CG?LM7VD)YsW`D~ig22gHWKZ9G7#m&yA@bJPBQZ&Kab2j71#+QPB9}aQ z^No3(oB;`~OK{B|5j+$_pj}i1RrmZPZ++TuSZo^PU7G_tzR#=8IXel%BH_^G$P$D7 z7xBTI2(mk)k{T(-6L+u8G-FnxxP28?xIhuZxAxVeY@PeZy=7{No(c;6PmKy|Og|$q=B~Ms!EELZV zm@}afl1##1uvhj7MC@sA%}B+U{l* zaCtOHwGWw*8&jvUSFH@FqW%@~eg9#&AZr5eHMesfZH{l>qlLzmolKk9FOt!-8FY4u zV?AS!1GyG(=*Vs2eCGtpNUeq~OCRFwo_j>@?{ysXR>xOo!eO%I5nXumBU-)qkAiUo zu9+;tQ+s^yhddu1-_?gUaZzY-w}H_vn}fC`uM8JX=_J=yo}^Q+sRW#i_*r&=!q%)>|L8J zprOWtN1_XeqzDTaF^qDZ4b9 z;b8eVqaAr4mE*X)zGM(l+M$6N6%VNwnW%AER|E}jIsWcDBW!6{gu^-NY|d%mF;c@ZGsN*cZWrqi%U5-0m>UldoR+cEfI9V&ro`d z^Kg8(%c8}ua%9F(CY8{SgRyt(iQ)X`xILnW%fYXq+Xlno^v>Tzym~96!g+Q!&Ui*z z8m;Ir-cS^cbD;Y!Cz06)(n!k!ANamxIc_)~Rdd>IIi2F5MdFpB@P)7%W_ZVu7G8ez z8L|e=4^q(2BLMZ@ywqpvP;HUv2-WFy;PM0~$-}sCOucg-wB~=q<9{i?zjD_u!m?-XYK)p+8c-9g7+ z{Dq#*JSOT=HrY0BCw#b}M%;fK1jm6)JYpzAV{d9ezPm1L-yjG3=QP)@s1JcThesK$ z8&%+XS%~~q1~hyuXtd~C8;xBMM$S7(Qgy6F-(S_FAxx9xR2{(4AGI)bXcgQwcO@GQ z`svI|Qt+ldk}4WVvf~$IpruL|?kjz%nfEN6Xa^Rua^5N^YM=lWSBLPGP9ss;TZa~o z_et?|OH?^)f<^|NY?*gGNwF3+&KkP{T15i5d_n;Ki|48HtK5huwfZ3Vyf`D>8c#mO z>?K1vKhV}@u=eAPZ|vlQDmp(@8!FrWQ0A%{M6FxE)Cq?g1;&1-3r+KlzD>)liQ#e_ zg{w43tlmmc@9V-p;6>J?XJ8!1n=i9(THdi|H;TzClOk_fQ0HcfY5(kDR^% zRm$in+{E*jA3|ikBk~ob;d~tp-1daa$SrwJCm#!;$_r)IXXZlYRlt4d%)dtK51+t{YX6DuQGJTlDXD^HfN`OXV#cVDj} zUps?I{f=0ovP>QNYWU&T$z}LreF8pkF+;s`0?1JVailj47(h2`K{iwOBU{LM8SdNl(7L>v zq;&UnFqVHv=i6jco-M~=#{zZwb59Aj^AR?0_j&X;KMR&&SRE$0kw)HK$6i>W55f2D zfcJq=P*xIQ`t}IH$Y;5_~9?!T;Yi~PKa@xVmtB5cWDwYr$e_-HOAgmhE)HGA+8s_$ZU%W#rk{v zX#TN*W}2F&hco115q_JwWSXDl3MZ82`lR2ER9u`LtuCL7TRh1(Q82; z$nhoZP~=yN$#*>995bC9^f-k|!^&82NePv1r_hKmC&4CB4Fa;OISuI$QAk(C?ly0{ z&+(DoJPD$X>i>wV>`rJ~T0*U5f3PyiS)gXF#PO&UY5T8Tw9sT0Jm}>ZXdm8?-^+MN z!^>uH%-N0o$xWo2(-cd-=)+{qD|9Gg85hk7QarYhY_3^|{`Qgh*D@SJW&|^@-%8`+ z-M7)Fwh)d*ML>gj1Xfs$;55l}VtMg6`zUQ1{^u7@C2e-%(Bm}h=-NV;j}EaHrx@Vf zuYXuR^!}%OX^*si*U4>P%AA`e;F;=)gm1(^*9daJ6VZ~j8q4~>GYL=A*kz1wURYMQi z{qHEcJibT|d%j_F4URD54wvESB59D?TxnSKZJgd2Yr|2qGQz0L#cvO1LV^4%hOaFj zo}ZH-`GLJ;Wrtwh6q8pl(}f>HvPRkWyL2IFQ!bH`6D0NnUx*s_|8QlC5|{@#(vssE zRPg#AqTs#=N@Uz%A;%b!4c$zyUx;9qwMgQYrt9!)Lpbv-bu%;>L@bm6c91+DionVHqim5XKV9%=!syOy4e-9v z$8KdbV6Mnn`sMu^j2wMPk2Mw072o`DSy2c5_>PyTtl~Ph=Y_NPjL)H(ZaWGA~w+Q!+gb}$t!{pVGhsX@AL;g$L*)*dGy0#^-J;_xN)%ga0U9&+C zLEYN2_fN>l!L6{4<9r)Puco4(oyo-fPjnG?pDBNpB$bWY*tTgubXtiL_wQy9{qHY% zNxk6xj!ne)^&@7w4nK7D?4YtuLG<)9X*eDc42t1*;GxK4YVG@wQ4(K_7xd#%{O>80 zRW75Mv&C^2?WIf3YC@E20$G#09_QaIC9_}1gXyC{n#SerPNjIG=I875(_b;LU+qJl zZBNAFY(Z+c?wC=bwqV^+tsKf`#gSQ!?dhO^ah%0gK6C^jDD}g63D*-}@Tj{IGTH%|?zh zC43cb{r*l*9pSBuJd=c%nyj!h-yh_7e5r`V1qeJW18bl7fltaIqh$@pu>PYzK2S|Y znPN#2+Z#n^4++sfM}=TJRpL-Bp{&Qlozy%wmtJscr$62hG@e#T-pK{yi|0E*{6j9> zGE%_lU2lp1Y)fcs8)4fX9)VSH?^w^uX1MJ%NtU}<;^KG>Nb=`A1iYGb!;49(6vk_; z+!cl^IL6^)5q_-eZ6^m+xD3r!C$7g&2%E3_8JRwr!F4|sp@(*uk)^m4mV{L?-9Zub z%yVNX6`P9D&X>_!Ba6*=%|mraA2A#l=9t8ZtgJc@KE5~I*hP$^LN8lF-ab7F7XN;; zH-0Wg#|?)`ab+I}-{-HBZi+(D#WHob%D&U7m;R8%1stC*TZ$?OE`jxrV`>)UYT~W; z-Y}+h2t9V&!XEqoXy868GP0j5*cyP_*rw8%E({1qLLkwIo z*bTiM_4MJFOmGjW#3S@1HYr3vEGv&h_AHpj#Nn5b+3+r?fV4}N(QAF7v}~#kZke29 z#Yf{w-QKA%@PLOluQLYvNflSTQ$nY~WTR*=1<;VYO+zIWh>eK=ns;A7Z7F;1Z8%Au zRi1;(&p7R!>*$p^A4erb)?wmTOX@u21vg^n)7w(e??5vh z&MpI^m=R|0HeXyXGR4@`Y8EVSvmh0c*03`&)Mywau(Wdy=(itY)%luhb%e8^UO$#y zkfQ`^+`f>j6YEHcmJj7!G){6})UyHB`PA{$BC@AmkQCJ?fqtzh=qqqLVFLq5J3B;| zM0=9PZ4>;kNM*hhTwojzE0LCU)wF##FVswO?<%gpTgO}lKPU8(7t=N1djmr! zolHp6c@f&gF(D!@Ay#@^Choew=&il6Y%8xyG^fv@S?dKM{WYwNeP02QmfHt)u$k~`6?N|`Vid~ zi^75q0>Pz!$ak6VH?Qpu!F@-M;#=KoOzk}#axsdKFxeXF`5*{&4`i`hUf#p`3a@Du z>x_{lSBd+(?c|zZDEji4lU$C+{!HKsiSdttM#V)SMOpeVWiRls^U%rC2`)z8rdFK_ zAhlwEu2NBjl9hvodk=)N#%U77fb02inJda%XecJLOU}{S@J8lO?@^ljUW@q0f5qfr zeh7aYOq*oPY5Qtvux>xb`84MM@%3SIV3acz)SiU@j&}`S$ypn$tDS3V)m+YdRo6RN(bB~ z125*Gh1GgAxtfoy$&w&{cOg`yD>Duo8BnzmjrDd|9&AD5 z7;EtE=R=X46Ik(fh;`aIfu}APG5fk>vGkNPN+w3qFIVlEfRO8q!ThcGZpwN%vnY|) z9*!qnr(^J_qXF44?8kW+IX}v%Db*kRPSeldLctvgG*d60)OQEtFGvS1T}ANUVu=2e zu^bODl(=7)gUBgbq`&tp;=gfX{&6e$U80U@ONwz-`5VT}i+68(kkGnQG{)=(yG}N`Hlgi26<8{2Jdo8+ zMsH8UvB!#aUp|=N#p8`6_rWy09#lat1fC#a7tG+x=Or}a$$HTHX-5q+qKK=SB1s== z1pae+T&EB~L}wUUrWcSeuM)u7HwPRzZB%M*D499E6wDMB!+~!RlwZ#ekFIdV^hGnk zTh9_#ZL?7}?#*6q?)BW+ld=dR7=t zf2B-(3pTPHH#ttyxF%@V`=I`WJj{4&gJ+)nU=$CO(T`GcSa?znY<*0b>(18XgG&ra zSRnw+f_wNc^E_souZJ;4U z4lI>wSOvoVqNwpvo%eoc|$O15X%<(uoxwne6EIsWQ zLe(!fGi}9LAoAG?%h@d?+%29@GE)N6v@C#B*)nYv$s>9n@+gu<2=ZZzl^`^FF})7CADw;Ow<1@CFTL1 zPNGW2wOGR|BY1ePjm03>I@8c`8r z1D%z0X+s%Vex!@a{rgEwjFxeq9g@hD>BfGh@yK&07mfLh;MWvW+!16BuPZJyL;5H1 zaez05Y?36NC7LjD$AQs3l}?`88jxDwonZQ-k-8cV;m;dh^twwhE?m7Dw&jIlcTFfY zy_N|wD`w)-!#h#nPdd@pafIf|I<|0hAz< zl{dk%5-H>1r^6)m3=iWl*9vdE3n2mrg;6KM6wQwMVaV!ns`0snE~_xZTV9TMTZ<36 ziap6L-z{h;CJSoZ*|1L0fp$nqg5`oC;@qJ?+RgRhXs|808TW@VdB2UNkK4$(e;&kc zofeE7DS+Zf3>|*>g$f!5p`eo<+USiE>m|I#zdsezj<*^_=VdNj6yrJzD^rN-mTru? zR*&|70JkJ@Z^iCdW{xH=?mMju{qrv|!HV^)Y(H<^yq}2}wjd1_`lW!!&lGl6sw&7j z?4Wr+k|4$PExn?W$b1~k1Fc|=ow4%~%(+^Kf6uSRce@7Yj^tF>E|5ZDto-x}Vf`2op1Tl#e0D@#^ITk`u@9%8>VXq|XPMb<9bA{|Jjaufg$Y|X z!HqSGxU1R)rk6dTANGDFmj_J2R_Y@uEwlnjCW3Y?nSyca3ejc8O3E$>qpL&#%k^hK z$gOqs`d<}px6h}U+Udu-hE}b=&KKP+!9J8 z#?5fWtRnc@7y`$C50H^B&Una+;@%WrdbN&oO~*LGy11V$5~xnma+Ux&5XJQ^K4+4w(qWo<=^6F%%0#a}FL2z3%Ma+Ya4uAhoZ!F4 z&{H=V|JyMr`*upz(8&_q)v|^$;#{CrEuPT+x`^0!`{TRTNATUCk}n{99=}bt#gU#2 zdTD1Qn;Esx7HL>7E_V8gy%7ftFarSP730lA_2m)^{2 zfp^mnfrjodm6A&*hv#SVZl?Z2g@JywDwG1>tY^?}{)Gw6u!Qsb?dckmFy1XabIkwh zN0S4aX*cK0F^p8j-A86Xy+#Nd``#8T9$3)uR<2`|Ji#PqjUHP47XdXo$8gd5N&Kiy zH;MF8e^hgShCRl*P`faImYlwXCq7Q0hq%}Gd*))Yb?O*=Rny{Wgw!$b`+e}zx+EeP z?@N^o&(j&Mj+F4-@%93Vs_5$je4q8tnUB-fLz-YBbyu*%pa5sInjt_fo`;jv)e5v} z_e`v|KaV0arxJ*cCBxyH3Qw1Ks-az-< zE5l&te6mS73GJ>+z(3!3{JDOJZn<@tKkce7swFtn^sL)(+AW28gD94`j?#5svT3~W z1(w%b&v0!uddJ8RBbfoBl)WD{RI+H+%-6&s|2F^8JVkQ-%Mf|fcp2U0i)fdv61*0k z%*;2sggXXun1>^3_%AjZEq$)jTx(~#s{9>jPg#O5{tD3M)L2G;qX5-7v6okptdIY# z4n>X1O=#A78O~hX3trMz_+OX-EaI|`ist25?;yb2Iy8w?$hwh*&Jy?|=Mh=7_7OkI z@&Z}ku7^9VKaf?gP2p{80IUe}qf1V-&?8!w;Jrwjs#J;MpSE8_{4~eWo!$oZAHLIq zkl*xT)da{I35SCgn{nUZRMHu53j3x#1dYW3l-@SSz=I~J?EM4Ro@=0wPjr&L`S*z2 z$tWWA!-byBk-{dfyH~k8gq_^{PUQ9HH_;)PJk0(53tsti`d`z3tK}x z;Dg^gHo$5!s#s^DZrLAZzEe4#O23VF^&}u*xdvK)%H@w8U4qJQmvg^oEqkZ+CrOtx zMDd$(uw9O2jtf7acMkvKvAu;j{QW8fT@NNgPJZ;FVl4fw`i3mo!^0;ZR^eNbGt9~I zaEKMVOX{09K$&g@9SJs~SG{i2uWplI*}z~0*znZ)gtG-ujV;`m2_^LHLb%~Px3>f2=U z{>WY&+@eF{JP7JL$#6ZYxpbBl*XJ}nL!|3J;=sBS*qq}EacvRAv7OuTzrRjay|BP1 zxmi@mme9c@RVdwb5+<(Zp^7c%Ty?d>0_k*yG_kysqNM5iO*F#=uLk_ zO-eGT!$Cnz7EVR05F3=+<&Ej)kvX%S<66I+W}?=a!A41RVWRtXMk?h9Miltd zYYGBXDC`10|C0kR*uO;J5_fLXI1Bxv#XvsD4yQ#j_*?xfyl@YN%(r1|V}Jy;6gdnU zPR00UIEU`MAB!QUB3KJ4Ke}*FJ-H`&lDseWA}izMIo_=zUGT$_*>`Fy{;uWr-A&pi z6a1!_{4n@O`l@Z{QRM*aS*`+q-t>U|zXVveE(IlL-Ga&p&INKQnXa!qf_o?-ziF=6B&}A0Zl2XCPiwn0f?Nv+nbzKwFs!t?3biXOd}jdCMcb zF5g5)zWtzha2n*ikbsKKYuTb>BG}YAMmEbC5^-ZEsBp`s&jkm_7ZFeV=BY*SnJh>x z8zvjl3pwsn7+g+X%Cr}Xn!K$qBNCZ8R8Alt#|ICR&c7m6@}7q9;EN5|q=n$(qu1!( zkd^eIZ!Fs+vsQ^4gp0~=L}=&smHbjHyIRoOpP;k(`o;uO$KqL)Zl+1>)+ z`Db8!{szu7mj>I1F7oHZE0`P}l%yIDw8`dwi6}FP^VM`0!!56ebbXx!%t?tSe!j6J z^iL%`7{H`1s_XEk|nFbZ;?aXXoo$rv)wN~UHiW4n(oyeR)hlLaT>I5(Ty(RdWz zYRx%p3(0cjtL%`cGFTK`L4E&wf_i~bFenwkB-rNBIZ6H4$ZB{k_}g2lg2Fe_kkynw>cQk?8A1gdypu6`1Vwrm8Z(I0w@YQq=N;u6k_Bv5fa)&Be7~ zY(wC~zXedm6cSof0Y@h!!t_hqP*40TyKX>+W((HBr+GWcycx-0(c(`6fA58vwr-d& zrUwp_o)Cl3>2P&E=Y!%cgVu;@R5F!E{>PcPesd2>Y!D{L1`1$DoFJ1nE{ttAbg)~c zg_yadQ>mP4^3kS-7*5SYxmk&Qwlc@in?01xMT z#AzePter8FWAvFqaYQf;xAa6MqjDH)dPU>DsA1p~5!ima2v*oH0%MEY^z4%caQ6|c z%FVls$JV|j$C_U<{}t#nv1`@wi`o>_kaVNx##z>L>mj&5Et5M#38LO!*NIOt=XIzl z!ocIRY2NcmK!53?k`zlHh=qaEN+}qW?~)H916G(Th|p;p6TFR#;?f4ToypE?f1uVUSiodvF-9oOQx=2naeHH1joVC$w=xrK;({_GZ`m~*gG8ZgJ#AL@7@^Lf=C&;wpjlW!0z(b3?^PWVX zZn1@Sl*A8)@+PXCz4WVo1IHB|CHY2oh^tg9b(r)Grr8?86onr8rB@o0yaizCjS{+2 zHH^e&U8nOM&%(JBwqhWC4`4T?L7KUG$3mT&VSm#mnCgBC0Xa;T*-(Jbc98 zTPTHPUbeU&GVz^$C_GP%1kHCE(9{u37y3~u*gOOOl@&vJ>rAL#2B_5bkyKusNUPag zu($K4mp+6LA%Rgoi5h2%Yob`2>w8gi&=f_N#xj8|XUNQ1xr}UaI<*j64#FXVxbTn^ zR_&aKhs&<9-c}D#fLG0oDP?1y zrfn*hZLm5^6fNc$0o&m=magPW@ubh~23%kL-!k;g@}x+au!Ru+S0_c~f|jNAWL zL&kAN*K(2OfB@ zA)O&nB+`mIud?ywNeb43dEqm9CiFQ^<~}!%87>1S&b4;nMLR9A`Amwl-{Xx5=E%Rg zAK$48;GM=q5)|4-nW>x6=9viDFs%TkyUVEWiACt=@smV3wZhl4mr%W5fFvg#=6sWu z_^kOUE?hN@)SlRm=;n@b_om>s$(~03Gw$;qi5(_Ces7}dk9OdP&&!C=_F}laHkz6h zvUIojZH|9G9o7{(K(2oiou$1NOokIMTH6Me1)I_Pk!RrR^h_FcK9Wq(WboUnIBZ+6 zke(m94=LLZ!?m;ZG|B5BQ|lH*Y(6GHiHj)}3VDEvE}L<7oDaoE!)&9W0!s9m!PbZ@ z+BJ8aJZip3-OtL9Ye!jHqEZAqc*kM8txy&0G$Kw8NjUGGG}TZFgznh+WaRu4@Vx6; zxxRUb?m5#=u2~<2-Wk7%#^bBxf&&WyNhX+oA_lzQ_JMXt6SFQPkv@A92H&p*(l)JI z{1*{!Fr_aV92#rjd+I#ioUevpH82^Ce`WLg>-$M`&@I*`bQ)~DAcvdq0y`mI2GciB z#$YXBJj}f(-OH1xWjCMK;vP;UO-5*e*)%pc$&U$rA_^;AUvhqqX{gld1%2<^RbPZD^hC)(s!?v7WJAHs%tT;jz{uReP_ulc&A4?!E z-eNet{s?}wuBURZW$*^az8Eg%&OTGOLVmd~|MCXWs;8mRsG979%1%}^ca8!H9@K!e z`Y}wNFGVeP7tqm-QkZ8H&+U0@*`GF(FlVz7)&z8tX9YKijolK|`23cNDyh&bgAwnhfS_I#j6?_EQmyH}C%b)yfz&S$DN=QICa3&11?MXY>miPL_?!j!f0VDl}B zU14w;j?($4d?AU%{+-TB?Q|l+m4a2zr#+#s9D;FaLjaDv4nXImFs9*NEi1ip5pm!8 zfn4}>0QH7X(ywB5jLtDR++&-}%R9Z0zuEjS<*k$BpPMFz?g=^Q@nIkK26Yi@g|G1M zP9$bXT7ZIkC0!}oNB-4ty=!Y1Zg2FJ=~j45$Ddn(w3HN+(jQD#tks8p&cpU=>;i33 zm=4@PMsDaZ80r-W;+7xDyDmx6@@fRVGVo|X~g9}VEfuf>6`YZ$fEl18mPh?#TqIEGFFzTpLui(AJbx$+tLen*&$ zNwl**5xOkpX8E!C{|J*B%!(9mAd3>?!9rOH&N=-gGw0Yt@%7`luFewlwk*O8#0*16 zxzCGT&Wz*dUF7%s3nW&*12l8@W5WE+bfT<0B(2u~ljv5~z#$6Xa(n>wdv1)-%e8pw z+)*$Pa)OIxZSZL-AAIk0;_-$0c zgT{DB`~#M3IRLqT^HD5M2R?kxC+p*4P(D4DE>8+1ulmm6329w$O%Z2}k1S>qCFK}} zh~@C#$V|)=qBu+S30!=;3~G&=nT{<(#%-qrs>EYu;01=lW>yE5CTZet+yq|tlW@tJ z>FDGlhKt|M0K=C%(PW(@WQ3NJDuYuzlbfL!y7C^`c&nNJ{IELf^G5-9&04{3+93(g ztYc}i?<|Px+CiV_OhcKKhIHb+A-J%$lFH27gM8;!xW{o#glh~L_ul>J7m&;^fJL4{@C1@*k#h<4Tlf@Z#io#6?GWf!Edl0A zI2um5j|T3$sbz37*sTplmt&6@v!|3!+EtIq-xJ941`ROVz5+@)_SmYhaJt4e8D1?o z2xoGB@V(3zGTA}qFs0@d9UXZF_5bG4g^?5Btv@B#n>x7tegpHn+7eicA7ri5Z;~XV zPRHsU$c)I@ps+lHS?2he8jgIYZ(|JM`-Beg*&k0m)pBs}&}YVQUKTmSW&Erj#*k@q zDe1j2Ow==OlT8oS0`I0U937ov@+$5q+AGD7FP|n8xz0IIUf_e_&%P0X1s{px?KvEq zF&hF0t^hB8FO5ptMNPZvi0JYwWYt(J&fa;S+5O50q89AI2?6mq==hJsw^*O+d+#B=E?>>=n(>U5ajcB$&96y* zYc+lz4}ixuJS<5r#i{!mnXa8{iIsN_cr5RN(cC%=AK!>dVPD~_q!q`s+fC+h`yQEC z6MTDCg$@hPr4Q9Bh$GoTR7XbXhwgat%()IWZm7iLYGJ%9xwly{r${>RtO%Z@h!Oew zF;uyDBJP#ijuy*}sA#z#?Y)hd@b)0o*;e4_)?DbAwg~o~-AfDpl%hSyf=%mwOFYgj zhuJ^h(Nz-zsrBXM*cKha&5O73zsB2S;Mr94D_sr|jW=N+r2=i-!|1sTMTon)o|g4! z!48pBtnu-uYehonwT~*8zTTg)FA}ZV;H`zqS?{3GFq1uyJOL%!rMX-Jm$i`$!GwFS z!E@(RuIv63{tX!5{Shr>>bZXF&)1}``5bJ2Rf;-s`Rvj;UUch$d}<+GK%^4dS>o`3 zhP+C|lJUD3Sv!tW>!w3zg%D;Wd0>&f9X%3q1O~YG=5l!#sL20C=can1zj!RotG~f0 zaDU%-uA>%jyNF0uCGq-=TbQkWW>_zh!OflzjRiCENXH@ds+SdIRL1TIER}1amogur zGpNzegO1dz;w;#li$Y76Nhn#|L5gFp!jqCcWVW6Lbbl*?qz1qeb9u_+_`iO!k#t9d zEGb=ljku|J;(x z7ogH*^1`Ez30{;*)1O*W^{rp1%eUD)w?L7i}rkX*@-XMBqh69wI zya!9v=a9GFYoI+M76<0H**3x|hntXWrxbGQku>?{ zHW#8AHEFfI8fcu1WnR%3;?`vVda66&$^8XnLiiA^s!uoebv%wff&-A&T1Glnj?#A1 zqmborok)g0rjDwba7}e8u4W3bPw@$gZtWr;ewmSZs*~XEix2!Qr$WH;^kjNHEfE@* zj5Ge3?@5A<8y%SCNM`f7{q^z`sw}+;u72K6o-cGqiP>FrALsv=+rAD@-hR&UFaMJB zns%&r!%gb9DGy86oW_!jU}I0No2SGTA5xCKWK=)hr27wFfj3{jz|w6dXd@PmcQ+Dj zGxUai*|yBQmgnREw=+I4)JSCel40esBw{ASIbHTO(=RD&fOS)$${qsvLGBjbvX)1= zcuiIyLK}Ib=A=z>IrRN4W<%Xeso7D^=^SO&fBpapqD{&k2>6Z{{>Z_XaO0biy4{XA#z4- zCvkhnbtaR~!Y#)+)FVtENxUx-%}nBPg^~s4N#Nvbio0AAAu8bsJ!9KQwJuM@`#Ez_ zP$~*)ba&vZ>;JLI?!7b_ztJq|E%QGJC)aU%YA~u_0wR z|Dgj~3B_2AvaqrW6q$TVWDxOxtpS@x*aBht5 zb5catBTwj(rNR{g7SphP@;vB&dKQg@mr#5APS#GRgi-jWQ1xoZH~i8cg}NuMq4e|Z zn0eg?CpI(^O@%r<_TmKK`)4ONkrEpGgxy zI8G8aDu=;Nbc_o$70XV$lG@Ywq32o)~W%butN;4f95)m zCWb^hFcg%ov1lZc!a3hvaeO$I4&@1xEvI|wYK}cnBeMspf?k(bs_YFVN(h~%0 zHdDyme-bPguZCW;e%NN430huSAhtUWcIHUY`*WN_ zNs~o#bK#nYlSwh_(a9f^EGI^iBfX@t#8 z$hfo!hsYuR;}jRvW<}uEFJyXUG+~djoXO#^>r7U-9{jvjLVD9Lky-gK!NP4ep3uu- zKXH6r`v4#MORO5LQ)i%P!%FzOC5_9VmNMgxEwFIWBrH4slZk2I{I;T@;4G5Q%84pf zd3*KITbmov(XW)0H|UX%d)Luz+ht5jHq8LRbr0b=H`{vr_lD}YJHwWV_Aoc}H0+iv zgb7zBP{qwQV7|!(<~Q7f{*Hc35thL}uLD7?OT4ONR~|S71km!3-#EIt9p-$Bg;`63 z$goa1U3zfnR;u$G<+Y9bw*+7QhT_$cQ+Jl(}4vS0=Zt&Gra0>5^uETGd?N) zB=4Is4XoY`F?(7-=BWYhtQKM92L0je=@7IFl7JFt2i{Q8L1G*wfU!qC_ySS}(6Y}7 zwPO0I&A*TIN|P{b(ma9V#b)R>wV%dn*c1EWWf1!1C0*E|$X44gf+ZUc!=;G}VR@@J zt`CcZ#aa6y|78^ro4asY{T2Ow)e~M7`QdM?9QMM}^LS)K5jFT_g=&BO!K<-=1f|JS z2iIRH{HcO;kDQ{b`)7miF-J0e#yR-3s+MT)DkKjEvtaL|Hu5#^1s&QEL`09jqF0Kq zlV5XpqQd)+tkmRVP1+_wrEZRS#^UfMQjT~&zY48_&9EV*n5Iqn z&blo_cE*nHSQgEBldR%k(#2ZV**<~QH~dQ9JL}UfuDknIO99tii-+Iaok+LhIp)8m zwzzo7S*l^x3>mxPSOv$aQ1DjVM3m2xlp+(_F)J8f2_J`5!`giki)~6-Z(2+@uhWCv9gMnz zIKAYti#1Byhs~#@Kt)mo%A?gFXw3~MdNqb4&WFHI>@Hjjt|wx)4djSe2?%=%!{?n9 z7%J0DJ)(-ixxy7l$9+1vu!7Y)6$*cQ|8p5d0=OqTriA^p^NR9vaS|qmeh*ZF*Bc%3%w;B0q>6)0HQ4 zovzU%dhT2wtpdL2cZ2OKN$&ouiI*hxP;P+=%)9lI?fbSAjM{ndi&#seVGZ(@6>2y z*%weYPMdw9j#=$|b_>gK)wIbjy=uCCT?*WnpN&(cUbAzJ zUZKdvTv&E;62u)0rkUq_ao2|gn5D$=!#j-Wh>RTHaH}jBC52;d;smmI(LwTeLoj@H z-%E0r&A^%31GrNs9q;9qqKL;IqOq9WQvY$;=vH%6W&NO4Zs zI_x~x$1jDW3HZ1c%nyXo*JcB>q1_M8^;W=D*BJW3!w5w;{^5G=Jv83j zlJ}M0Pj1&)6aJsqG~(Pc6IB`Za+E_fK@_%MQ(ejHV{-Q5UUhB!EZkz|xuozd5-C+WaWFe+$ z2n@Dqk;3$Fd^pUV?_Bi)o~9IE$2XM?-?$CmZ(c@?CQqz7;dY-KQSYLvFFYZ9jS02A z_XF9se6mG+oJ6PyQ8~dmQ20B9?zGeg@ifAG-f&T#nVzz#gjNNE7*GaNl2u^7Zn0h0S^V z50?z+G50de{h*B&&M)ZR`$~AcH<2!SvJUb%7lDbrJN+h?#2#;0NGEX_#gqO0Y`b3= zeW+H4ef+zO!;_y7HQR}-=sgU9+>EU}E=2$HkANATIT)gH4wpwBz+G=<0tZV(o z{_`rO=?^*QtGg;-Rx*&4mxrTSGs-Dkqx*bwKxQIbE-M9hTO1lTNu;j6y;l zTes~7w6Wdpe*t4+i!CbQSyAE72n z!&K(`ICas|;oQMjVNR$Fd{!SMk4~syuJn3Xt;e4W^RthKX0D13F0=ibB-GLS;WE>xkS3yW-`j&5C_F6P1I*iFe@78 z0pE3E*zPIG?DS(%G_B_>>p!xM+;m`2D=QqYwY(s!_xXX)@_Tsqp$}*XuOdg4ev)fS zPsuq}0V}>of>Y-m{3M-^chZ6(PH8_p-m4GaB5#B4xhq$Ul*Oq;W?+4Cp6y8R24%HB=%V~sF5qns+O)Pa3R?a)=olkRyPO5Zol2B9_& z45;8<#{eExPW?(cSy9v-tHaeL>CkkRhXs8$*i=0g7c;wI=E_8TW`7AQ^WxcT+Y6+J zd**r5E)MTr*<;7LXArjV9claFggQH(lBGCCe%MCPV#NS9re`B=U*S)jXLGv|lanYD zSxZvZ+#xETPg8}QVysQEgqFWR95^1x<}Meid#9Xd+W(WxpJGfa14AIOG8|N_MPYv3 zBX;5bR*+s5M?@#Zf#S-m$>)%k>)_PWFc@Is? zs(^oDt1YOJ z%ICq{$j@+Pr4%`EwuO84)}?KUrDWMop{l+tANV-3m0p@l$cN>@^ip*K&(EiwS>5iz zOTAG5$IpDGXC5fv$-LV%!zT*Dymz7h@h3E&W8aEtg@gB(9&G$vOZPsm=N%EWrUHi- zb6JNtu&07#aqT@)^x-#^E$bmghhCEpt3Hwile@ud>>WFKc{iC-lgvym-$EB0H>JV) z5%iL_6+L2<&6G}N(b~^aIGB;>J0-;_-A-1W#YRg1*$fhL>Fd-fvn1sY4k%yKYq_pLXxr^H&Yf0oJCRROf_6gt{^|NRnbx*9WMHYb8e&|Qs3=usnY`IPfEj_s%^OSs0|tKYNOG+s!8%|Au1ms z1b_ZC(8CjsBY!ailTOURF$*U+bmSha=s!<)tRCa*ovS6Me;q;pS;8jcX?^5yel{J@ z7-9Yj?t%Q{+8j$Zi>a8_M9)poCcPh}KVOM8<&(R3;ULwC-jPmLCx-E)J^yT5__eJR5(h;^j16XoHgQ7|cR4<&1t`O*s8 zWyH+*5zU_dmAxX~K;L%@p+|NkIkHEUoVc?CjnpK$eRvXNLJ}6Gt>Jdx0eE-vCn~dR z3&<|^VpDr(pe8 zSHyCv1#VZT#Kq(oR7u>SQ-jiR%gt1n+Yt>#F$?KWj<4;bC`TvHG(?LMHB^evg__Pl z^7x1{@`v`)uH)*EZ&XM+kDuUju&Xd?cq&d{8Gd8wRb1D$ibVCVg*$ROv_>Njg@PP8 zzI_??eU3rtB6Y0!Ji+9Xb0BG2A#CSTNqy&X=B>Z$=aGGC4~nm)j`O0HWrnVYe;*HQ1T1gdyR zir(zya$WM*A9?&5B}FL zQH!D-{9B7TH&>e|YHCN2yn;{~@O+1H_a-MSHIC%YadJ2XyAL4XcxK~4&M?n>E~%t%`VRAd!?SZtUmz)&cDcz%2}v=^^Yg_a2~9V(!`2J zu1~(En7Ue7ksDT0CgTf4Ox{czradB}U{rgPr_?6~hoswR*GCnTYFF;wo+b}IftI*V zL=z-noPtC%>`ok_VquA}s;i%Td?AJIq8aq$9YY9vcb&#O{s>wUhv>mVXPz^mjkmH_DaFZiB_x+1tQAZCziOd7Ct52Q$%Ue(tZNCi{sT;%ijz!r0K@elU`@>GfL*&4@2iU9V%1$?n zfZ$cz;nOc3?VGc`GXJkJoV2!}2Eq>TIl~;b!Z)hcYXC7!D{P!O4ac0rK=^_bn(`}P zcC8;=@}p#M_iPe#`~lvddXsKG?}>91ZgMV|HjZBy55dcoa4~4%rS1;;)^inG_&XG2 zBjaKAKUI8_nMHo~=3sN?QSjDO2D^RMaOBS$lS#0NeE3U1J<Z>QeUn#C4?kVIk%(%f-Ei`k+O^7k;dD zLA6h<^g!5UV!AX06 zj`X)GLcz5ReBpl_=AN%4i~5zJfnz7^TjT;+!=+^P<_h>E+w7NFqn$U7Qz#pKm_DqKK$1W7#aNOK06-;(q0>^~eh$82&(1!IY zs2bo#y;D`-V7NYYl_*D-_EaizoO-}T`s*`X!L5Y2P zZjf&1wV;M}RyY_Qi0fWmAS=1=^}a`*bS(-Yqn|Q~@~9&ePIv_C^$alX&js$CP)da3 zdGvu!8tU3wo1F76pzU{Fk+S$oNG^_J%iK({@P$0tB)ku+eq`ZayC?XTHxnI~Jj5BA z5yZGD4xY!hqknEKZ2vqF9?$;{DQUIPv}-Yl{i4v|mImzGh4^$X1J|mBi7w3~=S89! zp+#nJYQ%ulaxBjK4TiXR_%C9_0vJz?ptWD!VMWq*v|r`GTq{39Ww$N^^3(`-B*tK> zNjn+iavR>KhRDpHTqaDWiC#zzBl}A)Lg_S$W}6eC{hA-u%x=M;wr!YkUWIem)naq# zIn4AAMCdGrU`bhK>)s0FR~tdS_hagn7s@|6R85W#WYB!4yQI143XPOO+OyFfc%4Et zMpY5&)ilWgAt}<%#$wkRTjZP8^2&Z%pmb~$99}_*f}}CME0{_y`yU{^#RBNEDG6@< z*ajpqg`OzC2IH|(bZax0&r)53OaA`mn2ELI^?(!>@r6Ol*BkCXwjx_ayGZIb7aR`r z!PRp<(1l-0u|mHN<#ykIU5?^V(2|P2UlMTM_DL}0LD`hPZhScAN9EV;r?I6c@Za|s znD>F}3DzzmM_)>V8Q#L@!wahX7kI(=WJ%2Pb;T0(#rSM&AM=~r3tG261@9sWlU=I6 z>7HsS+z@R_l!L24LvSU3_QX9n-(zA`Uza`gox;P4jrVvpw(CJ&Vha2k3CHA*nq*@4 zCF(AI8CK{YLh~u7(R0Qm+&#mO{u7-AFZPR}>y0D$-;y{uswZO-xHugL6MmzBn=;xi zPNovYA}03zzgUy?2OuaUlNI@0iBF#`#@8!uFmJA9<3zzqm~^#{EPS29U0YjusYln* zxH}4hhV?hd-5e{QWZTg36p|;VEU~D z-k}w*$lon1rBZ(!A+4%u)ypVE*ox!9n&r`mak`#M7IDO?bM+iW%s$Wj~OU-Xbs*{ z^QQ@?ms4+D12j7lfH8C3V0DHV?0hbSxAZ50BG(mBK$aYy7lFN7v#D-rGrZ)ur;itG zgt*ryKq7Sy-FE05y`#c?R&9w#8xKKLm?y?tqFAM%>m+!=6*$6ZQLpX{A|9ZK zE6%4toFhepN%}<1`v$w#abnfmCtx5bK1hy7pTd>((GWSQnf6#tVOwWL0clAl z90(ZrKeG8x#suhof$!|TJMkDal1o+0^&mX$G0Ft2W-J=dg2|o-tfg2ky?E~uSz70b zPeQqCe#8u;LIj}HmCN;;bq(=iH=p61mbj1mM$ew-;^j_G* z;HW5ZZHR#B+7sACnNrMy*&%caBTZ(v31S52yQ$fiM0T$qp!&FoOdcqteXl>!?uV1B z=B`?RWfgZ|wox;!d!vUMxoY^ca0P~HL}B%=StxIM866Mgqw#kq_`XLHySmR){f{lU z{IDPV%l!iGu}W~uWSHnnPh!T?d#IkPJVqqzq2IqQ>Yt%Q4pobgjF>UgHi~Rw@HOd79Kr*$#-eFYWxj3cdPnqJ4uu zc@i6k{^?DO>83kS*WixF8Z@!BMU?(^xC)+}H(*MaD|ksfWmYno#L#$vemgdssnZ^! z&BdKa^5Rj|;sV&DJ;!#n+w61~T`a0sLal9iw7Xw80!-56EI8q6Z_^4c8oOimu&ImAPy(g5?{ z=^+qwh-W0FcY&jPKimjBh6_d%V6iJO1z+Ei#i@tswiV@c@iy+9?yM#_zgFV)!4|C8 z;ElT3=5&`2}ciJ_pUiAJg;C z6)>qQjoNa|xa}WyL&a+?>ba(Y?YVcGJ{pT-Ov}VfzKY4RBYBb#efl;3pQHj54xYw4 zo(ExQnGLM*cP48JzhJ>%cRDt}z;lVYu-HSFmaV-?uMJw0iaZVWzjdR~eS9J=)C+(s zVOeB{mJYAu=nW9dT|_NhgmBS{$-wOTPOrSsV&)_avi<@wkp9XGCt)m|9yE+{RR@@_ zZ#K~PUAKwMOEZ|398a_s?SUZ4Oj@y16<(|Az})H_dd_+t(P93QR|{<*@V-1em)6Ia z`7R*X^`0b7zX7joygBEX7YN0!#ho+ViQVjzR4-T`@?B%FU#AGeEx3H4rXusOkD#+` zGh_S67z|x)(I+Q`_6W4&)WPqh?x8Z#Ro(=5-`ob{sNH1pU>1GyUlbmi`5Ovyr-J%y z6O?l+!=JwnFxjaJu<-G8yf~b|9QgT~+PN8{)VI`1tsOZy-zte$G<*hz5BL$+`<;GBImbb9S{u+h1It|G_rk2Qe_3zNy%j3-RPs=c@^NdpbYHTc#3 z2cJIHB|$EyK&9vklRuUZZ3f1uy>kCB^kA+IpEJVEu`+c5Zb-&re$^| zR6|7z9Utz-P&@89x$rPm;3%_~q|#VX&Kqp>G@IN^5rM7(bt3;*6RT3m&5mH6@c2c0R7-HI6Y4La!yxY)4s&;#z#pDX&vHu&H zA$q68R>(?u;l@#mKJ?MPS0OLp0-CqbuGcO6?~2lr@`J1 z)Pl^KNo1}0S|Vy5$ke@af{Bm1nIqfJLngO3756G7@tJ9Gdv6L&9*e15HQY=)jc4KpFobqK+=f-^1)6N@>d{P8Y=?415Iq|+wH*4J_s3yWT9@0G92RE+fU_X z*^}yWAUpQ}IkR4p#Gm%UFl`|!ZoU&PZ_~xpPF<|&ehO3Gm*ckD6u54;0`&{_pkee9 z^7hOqL&jRD#712>xLg@4L>-8(mpv}_{6HE@3ux|%=^$em0Fysy(O!QAbbAtj$3PP2 zO1-(_v0we3;dZ* zIA22BmU@DV&JpsrRU9X`@z7iA9PzQ<5Ah>5NT=t4#(~vTk^UmZ$mO3`oo5`=ZLq!O z0DX}Ci%vN=16^Sy_U*jQ^eyJt0He=I7~xz)zb5{F=Eg^5Q}K8BNr({7hwO)uD8+dN zO5Xe=Or0R}^l1otcfK9f3>2VF$VAXJD#%1}6aiAYhAlDVX$C`yr%$}E|MP)UWzoS`^-DT+*$A<|q* zBq@G{P<`k73tZldckjK{^W3*Q=Rdp%H@9!Y(v(+lzN87)D6B#aj-&rg{4RGE%Hm|R z8GY-}jmak+*}MNL@#Q|wq4`~kp2+%#=HnTp>RLFvHGB>!=?I}(y?J!M-*oVG+J!?E z``8Oh|6v#Zd8R|Sh|b{lKCe?2z`8@8WXoj(*kTNiL^)Xia97Z2+gpX}cLH0ku5&f6+w%upye#ZxdG}B1)+Z1wqt~HU1f6fMe zpN}VJcXFN1KvZ)UfsLw{N#^PZz%*gpo<9ww7V@G~iypq%+lqs)RFNAIVhHCO9SgLF zi^09*M2x*|Sxg({74yM6!k)O-yPHxsJ^UG$iNY<2)$(`PG+oX&8j?@Xs;(u;jiJte4tml=cR%699Ti^rr{Sl4}lAqv?0AAFZwjX|J z@`34`59H1Wz~JR(lyY7No+>hWH+ynP$-E;l+7m=R70AJ3@zuD!i?Dl|jli#bJ>-O_*aJXN+{#ko!ao`@GCOwbOQZ&!4H;qiJ-aKa%>YaKvS>vu>aX! zxZM@O7EL>i4lg$WuSO32KI0e$iCrU!O_DHGObS!WL@-ez4N^o-!R`xz*cm-U<_jb; z<1e1mmgwCKYjlp-$rWMCPJgVj_=nTybTWD-?IbBXh;9>9p&RGV(#tM9!MOZA%X+A$ zV^G{u^lz#pk2VLAh66iLp`nCq`pkBZ>tv@-V04R?%B2!zhzH+Wc35T|tNJ#72p838G-Q{G6K;CrtwIKp*dww%lSk5u7I}^M=*ur0tMc_Nn5DVZ2dL5HO zt&kw}Tyu%^w=95eBXQDyFrD({R86^0^k<+wJu_6~r? z7cTSgVK=Ot&>*gRqM_hOVrA(^S9rRg2XAhepzpO7(e;cQI&4vfEd9rH(&2*cTFHf| zc_|dDpJbA!t*feb8SQ5mo1Nbb(bcdthS^Zhih82LsIM-usJSqL9ns-n#_y<#)NaY!)I3Mh2XbZrIIRRV;NKg3X4BkMut56t$Lfb23r}-#Vo%@8kh+1<@ zp;GpmM=|?8_cSB$f;%f7&m`hi;T0ul@^2U*OnUHnlAXSQA zgpdAIOHY<&Uwbtt?8QN^Jo+Xiw}}UYR$O_ z$H=wy_8`#}3?pO1@Y_F*x~~fbx5NS>(#`{gvOn>wU^E^&)QkI1Jb;wSObkD|fDW;; z^t_f1cm{l7RFpH|TV4uD%zFyj+l|Nv{h-RAi57hPM-;Pa?t$!O1KbiJtoLX`4(;X` zjS6DRNk-ytdThmiMD=?)?K_#l#Ljq2vdv1##?ZN(CqNsQ{;475!?N_1`vb7P!cPy} z)yA_5%c1>rFqtu|2!(gMF~3#<-$Z<3_qNC*yZICRaErx~ib}Zna2XEevgA~2Cj9-p zf_!>h0*iWGF_d>9Wrx(@sRR!_n<$N&{N_~E?l=NbXQsl_oVA#?;TpT<0-5 zjYbk;^{V(JRYoOi+>v40XE^fYJ z3O&2UtC~LUAX$3KWM-5c=$sk^c7=dV}p0hH|b3= zOyM%7zPM?53;7(NLoCMvsFZRfiBkK+avKYrb7q`;vrz<#MeoQ<&Mo<${6(^TN(@=k zrwh|A^l@{STDo#rA79-Yq1WD}L;gX|0da9Bj2z4bp^ewEpm`oMG$j}YAM;@Er6g#2 z8wz9hN+Cty1BpB~TKTnc4;6l$3iGE#urg2ovJWHQLU)}nXxcubCo8{_W6g=^eWr@) zym3bDo5568`b=tKKYy89D2X7mrF>@=G z+G7QIlZ_Ce5f1n5_v7m?1z_rz!t~fWg2Bhx>=4g(-1o2)o_KE~DX)c)aSS3_H@~n= zht1*1-emf;Q3-ZfiL-e|qjcRbLA+=ZL%Hk92w_!2uJ1jyM-qD3$=^L5TcmD%thbyEZ!vTK_1u@%;30S8uM&5(V@m+8m ze7CBnj{dwfyGM@I+PIlmILct=GieCA@|mQQd|LXq7=T1qhN}pPeQ|0Yy5Ie1m zy9bm&m+K-jsj`L~6V)JR+n?bPuK(Y?ZKwmaD(W@gGxZ^s8&kX;D3JFOr3r8Cj(Nmp}L|dw~BkSAe>8Ke;da zi_zS)6UNV^V1DdnDz?rE>jk{n?4Z9i#rr%tzDXE<*yhl0Jf}&h${cd}+%K~B{Z(cn zCz*4fDKLHZZMs^Mle8o_5_fS(o|ZU%sfwld z+}$x%uMq!U5TUnin#rD@R>0rb34``gu-WSmNvKUm-NQC89MDI49&6&f2aTL#CY5fk z9wO53wb6XeAHpG-NaSZZ()aoW+5Ye-o5Hw&Wa0Y)c}=JyY?8#7}GpjABz=%ZXfR1?PkoM@ydj7=QXI-Skb9OqEL~ zi)y?<=}-i%pL45HIyt*?S)>NMJUy25{8!aUO1flpyQ-0xgQnEFsWDFYaqm_P+je&G5^7nv*kZ|U#<`swd2UrEtG z2u7nfOYdnf5wswPMmlKX# z1+k+dHu&H{AWE%xjmG`qkaJ}z=RulIG$LYPj$}1_{&$#lOAG=yc@>qqRmh$Fdtt_1 zX-LcJA(#5Ef?;7U9u!ul);&FR7soi1eX2-8r|*Q5d)MJX&2uDQ=^~A&E~FxdJV^9_ z7Vs#gGlzK7VBxhp;4riW)(s-jJfVOy0<~anNCfO^Iz z0e_Af3WprS1K+OF;6GthqTB%@CIiv*yb*r7x{=*4HA*xSW?<}o1+FJP2fe}#Y3a=n zuv~9KPw+b8HZBub_w+d0PhJJ(Q;KAoTt4!T+F{xQKQ>WU5`(RIQSXvCq|e!e19B@c z`pr1A+!ZM!ybVp&Uz3hXQzHBIBQ3jiA0H`v2b+I6tVQW{{QJ_8%akX;`j~6bdszqn z=^HTXgbHc&TLoBbIkjq^ku`bt{ScYlEk+A1PQy@~v|jZpfB4p9ieeYN(df-mEI8#4 zq&=NF^>}j5_a02G=3!&mca%gt$3^9j7^|>WDkVLFZL=pyf7DHIl3qyMj$foa%gu?~ z+hydWMF7Y5%wnn?Wc1>y!q9{Jd5*s4Ffd317Cpa%_XQ6@m~a8L;!#BJ;CgackK^iH zoCADHwfMc?8oqfHP+OZ%L~B7Fe%l|4Jee2pcTflj%+#g-#v~ze*)x3bQV+h~pPRObpMNL0U*1ZZWp88S@m)~)Ad94G>yYBOWN7?-i*D!h zhA}P!zqn2e=f_@zh~$%Wy@3H3bN#JkkFRv^`xJ2Z@q>otsZ?BF38c6?QNx>A+>Ai0 z(*M<7k}s%F<343m&1Vr{X2tEYd8gxs(VaAiIDlTf2U(N+gAG$VgKyo=fmrfX@-=%N z$<;H3gc-KX-0gahJ?Ml39xT=sWMNr&J(ZJO4}1sA@v!Fv(Rlrbj8+ZMo{;6b>Yn!W zQH=^#3NMEk6XptbE$@sy>#oCg1$EhH@`7V4O4W`SDDZW*E0l!{_ z;9x1oPyOsb`yL0wvBAfv;JX`wk8Q)*(F-8a_#HKHjK_kE334aJoU92t3lDxf)6sD! z68<*`P3uHp$nGv_I?zVG_{m~mNfx}_CpaU)tI7_a81P+S!+kLh2pVlh-OdOvjGr)?nlwcsh2r8R;Y z(**R?;d)@Y%Rpg=A}$OOhF6sX*p?nj4&KXQXZ8(J9@0qQ=xm&IK$-Uaw*X;T4YsiX zpEU0P??@ad@s0i7-}! zeyK;GTWAT}^(V>X&^ag-F(*^r-l6+mR*^ZfEkxa^8Jk=^=oCBT+`0!)+m#=O&1K=; zvjisMG|LvfnP97)YEgwaJ2+jFkM_NV^sVqQ^bbpid80gV#VZq>egCogVHb$-+P&b~ zL&#F`GaS>umPl2Pu>IC<*buf-ckg)u{i12;vPhYEt?L2$yWBa}aVzL=+=eFq6ltK3 zB?NX}Wx}6D5TX}Mho`H+MN45k$n`+b{Rs&gT!T)9!D#xr0FU#AqKot$jJfid`OQ#R zxjzPkQ{Ism&o9CE)01>G?F(!C<1DLE>@7_WTodWR<^Ya*Wc}?K6cuq*hLMrl>}j4UK(3o{z*rm zT^+Tj-(w;Sl37dJr_{5enb>>I#LgL;qP(hr_?9j~p-I0|`+|M1|EKiK1Qc942L(ZG>sp-X z8-tTSx1!CsJV@NxN7b4SfDPv&5SShc<6H(}bdMJ}X~|QS*lcdcEl)o4=fF4>O_wJ`PS=wTE4b5ErFy&93RJoHoCQ<6ljQEf zf28V^3=Cg*h}R!HWp>@K#@ny9p@G;>(${AVYU@Rz=U6z|?3D_xoI`xERwuPcy-r)K z<5)T`me_VnvkPLK$$}S^Fy~A-NqrnlI!-8~tz|ED?0v=5e4kmB)_V)zE9O`BM_RG& ze7A$tt$bQ@R@P@CLc~qH0+K1ND(Qf`K znbIWiPT2*|+FS8@@CXrYi^3o2AF$Rg1Asj- z$$11!2(%{!VxCZ3#XO5Yta8E@Qk$&;OH&oGDc%9({~e^pA4aI?pa+O_o~Qf2rO>qX zzR+2q4hzn5%&1Z)=1+GZp8flqOnwX{gG~$Yd>dlwOfFacXo_B@y8(T!&I9{js>9mv z2l1B+$3fe{hg-^)K#}KSddqPkb=*J6PBaT**o_#7_;nf@v?9U&LLT*6fz;z$D$dKg z!8&9$vM$H}Qs>nr^ht~wmsH8^q`}IAp6;B_;S3{WTg}}kMNmO9jfOZG&|SCBL2=;~*dphQLDFsH z^SU*Vtuqsw#D`e>(LNGU)J$e_XW`iR9$oF#lbj>@2u}FK<3gKis&Y7ip5kL@h{dd` z&088t-VR3;w-knQtq}6kY!j4RS`J&HzB6qrQgM}*4DRyRs4`VdX8SIfg2O*cS|FK@ zsl}$Cn*M}N`dx(CMw2A?xI1i_AAu=*DyYaFQF{4Q2@Tl1fE@Yd3471pXXZ9$P=z{k zc(+~-KaPH9{%W|wXp$JYeER|{`STEh-{<3Pmk>w-QTiBaks z;NyrahJ10Or`OuT)GvW>c}1vBO>P+2jof3stbQ|hBs<8*Xa1;uJ&WKWF%auFK>3r> zu&XDHPA}bx%4Xl_Csi&}A~hTS8k=#M!cJJ(IUP&qWa4{`D0Yw8LcFqap`LKXL4t}S z)QuOYP%odJ^wwm$`$8APJ8hPp?H2~OBvn$stV-r(hA=s}p&m-6pTtA<(Tw`VP4tQp zf0cdYTJq??TKK*527a_$!Npj=(L-mh!9r~w^wl^G+omoBuW1)yv-2MC;xoswyzRKs z8Fgm<`G-?Ns{oXoA57kp$+2!EI z<$81{c!*S!Fs!%{iy3RV|Gz_7q@3%J^8I*$eW$iSQ05+-7$?+&zYu@tEF{NwM1z&( ze=t`3fvlZ#0i719W6$+h=p#(=p5P6-)GiCf&yPXMA{&-x{$pDDIvk|#FRVHskV(>8 zo1yNgmTtzJNF3c)ORe5kVEaH3GKkuE(e26 z#iSv{9gU9eXNnD_VB_Phm>&}Ytx0?s+_#VJdb$t4%yPxnmI^k%J_qw|e`24Cy`dwv zW+-xj!P$*m2Cs27SOx@PeD4MFU>m@OPcg7=-!<~vSr9IXOrh2}6==0$K12y~uIt=j zaP3xsh%d%mwk?VKe8a&1VL3FvF~hg}?~<5%@1Sk!RWd8Pg)CltmSoHYXgOF+J(ecm zl+j+edG-HnK54pP{tjv(noE_RGSo2r8Yy}Io4U`D)&-}U#Prep+~zS9SbPL5r9 zI1i6U-G@788=zA914zgG0=2a}aJ@6fe9&vBcP^(hkq5c?*v!lLre2)DNCAlr9l=KV z7w};s3B!IYuHyCJfyIG&?3XF7jN9@KOdGrif$j4_-1I4(+{2HKoz^(b=_fS~+6%K9 zyP3VC@?=}G5h)%Iz_PwOIK}fIU9{Q_Ltn@1zLcrMejZaAe6fSn2$_&s5@#UN;|}={ z^`4$-_)B$s9&x^U6L>L+_*C^aDbK9Opc8(yT$vy0AKinr5?NehbBj)mG+<)SiGl_d zV`n&K&>^Q!bl(0Lv^ZRfhU+Au@_q>Wdm7058mO#PF!6A` z4sMFYRL&#-k`FJ2w-wb4bMy!~slZ=V^nMG8)t-TouH#g0feW!J8lwZ*{N&xnM$*xC zrn36@c~YBGkB^k5;K#^iaQ<2ivWEy>4KD$A`+m}W-w=-!ZP5LrB?Mu+FTwt@qhPXD z8?3HQW0klL{Ivn@Zy3HXKK@d$U4o^z_`_iE$r8>zlwYYaxeIl@=2St(Qfxb(26s0v zqXB}haJ)z#j#~)nE$Q8Zn;s1?eg0vrTi+L2&!dMYyz(*0q?x`g)Q1ndqafozD_&0N zpo5P3RQ?$s9jXd|cD3hpTiZcUH@rpN|9qtHWa6MzvJk$04+5Rvnd}k}gIIwaZbo<; z-|Ln^{l)-P_?t>i4El*B$Jka6=Yf?`C7koI1{*^ck}Ey_FnW77t_qGP6KXkNHY$ti zRu!yQ&mQ{I@)~1o=82`;%uSb{m)^-~A*lkZ!K2<3?DB`8*)|JTXdc5|TD?@OZz1FpBqV)7$3cnE-&gWMOlV;*yVpr71nmWAV8 z<7nZO0mmEKpvNkOmiw&2J3`WQ%tsNHpL~G>E7jp#aVmS==K!gT^8tgj5q9#e9gRJ_ z92D#gNyi^S=K4}?y^;E#{YYL2C{(6ohwn7zj%pRT~Oms#X!=mVNPbQR~G z48YnD?kw`Cqfs{o$>GWb&Uu>;i{B^X?;$@l{&@k#m`|u4w1kN6x(+-3b{X!)ZSn>jy}CW%#=4kD4$%OXkf%z3qvl`eiFU(Gr8c5?S=L13!CU z;0~nyD?uGE6NSNHbxDoqL zrGj?;891=q5zc1qU=4NCbr1Yb;XD#W;Q#eBS>XDYJ+^`K$}D;dOw4vTRyIFdLrP8u{79J?}p7+^hq9n0>e6Mp)++N zbXPG{&9T#|5m-uX{^PBBAIqY-XbSQ0??>LisrX1X0q1XVpqpt0&6^zs+&2Tg0p_Gq zfeV7f+#>XH5GI_80_)*0jMRyR>v#8}l^&o_csSM>cEYYH|IuNi$83@IUa0J7!TV2k zp;m4?o&h1n#_>Zo?tBJAstC44;8EU!4QTdUrkTCNG9ncPWoZfg zYhqN*SEFNY9;%)PG7!VL$xUYA(u#LvscIp)E*L?ce_Vk2riVdwroV3PVgYRIxq_Dd z(x7esot`pY&onk9Qj;=XoO0_ev7>jyE&o-H4|E-G$OytR%W}r$zi7Ph*#@;PC1A%4bBOpZ z#mzpRV{yP^8p*E!KNjyp`3lZuXZ8U1WmnQuwSO2Hxt*vSn?-vEydZV>3Z1rIp8W0f zps6by317}8a%OiGn_QO(isx?9$5JMEqOMAJ+oBBm{ZI%M9(B+QRM4RH>TAeBy-fPD zE{GH!4`b&$Yz2XD;rKw|HLjmlObhsrad*rh;9XWozpmwnEccaI(6b4Eexb4RxE<_` z8hkk;fS4WgB}+c7B<81G(R~%iS~nQQbyWoYH)N0_r#P*z5xlDT#+n3xy%;jzLOZ>!h32P{uu&==!<&Th%%ya!oHmEJ(TnrwZI5;2-{5q-x+0kLF6KkYvDYLZ zE{7iZ7(yg|1mK*9s^Hu-12bhmQs?Aac3M&}$nI&tGbfF(G&GNVyy}685JOCcIj*S1 zYo=SR4ION6LntcZRwp02g69EzJP}M!aU29mA9>txwhe2~N8px{=@1z+!0iu3G2e1J z8a3{LCvL-J_K8HIao{p0e^wwl?E~yU%P%U~JVcpWez>JTgUlK;sVo;CW4Augpz2fp z5xW*y{Cd})1b9j7Es|QmbWMn`6X(9`S_C)K1+9mP52>VWTV-%;$P}i}wWG-nHYDs* zJtL(okG)3IP-&P~@B7^j(r@{WI!185CEhOL`FK8Vu383`ZXraTnX5NPdkd9!GN=ka zauUz$brGd2y~HH#B1$F*Fb6JOhiwMO@Lu<3*cGXO`6i|y@-CA$BpCzS=LP5P_~G2% z2x2+=9L_c?;O5r8u&{qON}tw-ccv3e_mlIW*HJ+3jf>-8Ff^;B2mquhQPpJxA|DRlnk57FgP@z5qZ zUGMOT%|t5CA7fimA?>aPZZLjG5~fb0mhP%(YNUx$AsTGK>mIVO$Pm(a4wLjnO{~1D zu%2Jk%l}9Tx5Lm^{Ey?wOJK*{ znfOjkmA+WE1a*RT606ig^t>j^d3$__kdqmRydI-{J1;?J)PAN_;W(0Met6)rKZtu& z=@xE!MGD`#!Op&ASf!27{y77~Mla!!=-s+kPG6`@|M{F)oJfYgZ2{y(#2d2A(}Z3h zI8NqFay%UFsnl9_pWIk#P2~@*fZi8DL8U_K^&!(tI%`W8Texq0IU8p z!j+NB!7;@KZS^JTB4-_ryPE(a9_BczQ9&i5xmiY|J3f={CQ~No!lSj~5Pl*NM|?!F zqdW`4y>3EiLo$+U61X!doBBCyg3TE*w7DUUTwJ~sy6io5kA4`ZZI;!QFI|QS>2jhs zb?WH7E)$US&!&IkwvlR;9n`^l2&6tG;orcekZf)a7t`eNws;LL{1rl{FPX3VtiJ%W z+T+MXj|80db)$0EB2d#n3=|c0a6pz}ygyz?_<0QkO_Qj0Ru0iDPa<{Oxm@XiU0mli zkjj6ej2Dj`QIQA$9!Ejo=Qs*4>Q{re-a}lJo{vuYm+*IJC;Nx*DdXLGkY)kL_*9fZ zdl$}Swz!5Gsw(3rkF)swnH9`7%c7c7YuGyjMf4drn_gb}lis;8gPOlP4~2#s$XVa( zMBo2A4ej~@|CNrBNxRwfcy=j?_@@aC9~H5Gcn2OCUP>-+iAFucID8gYM!$dh1Fe1> zt48f5*|@iy%BU=7WmCG1lQ(Th`(xp^G%ds)GQHHqaKp}TSF*O7ENq- z=;Hj~c=SG2OL`ui<(v@jD`axEz;l+%CVY*Ab3-Puq^=I1FY6^y_Y>(aFA>cBB!epx zuc2I05lzqSfrR@k8Q*plE=lAtx2@-)-<%Cl#S_F_kV(hqKW1w!Rfe@Z$Kd}O@ z3*h@c4H#15?oC%M;GynxEQ-uUZ!R0eemR3J&t^e|MkTv?`Xb1S?`40wcagh4Zjg5p zYv6aQAz3P$$%Yn8(k-_+H_hHU5O+JK`}{{NL`}NU6Ps7iDVyu4%Y~T`JL*m>ea+d; zv0~VxCPBjuE`foYJsRs;V#M}pS{BW*>;k!b$iC_LzTyU^9?B#^ucWci@f`N?g)_gN zETeCB=Dfkq1-qgObXdF& z&VJ*?rOx^Ezg=_a)QkU7_0oL!F*ra3Y?P}4^0t9Yc?c=yc5s>MOCVRfo3tB!CO(1L z+zx9Mh=dCvzZKBQswPr&gTbv!f-%H|60Ij4^lkG3(218PwO!L;^Q%j^=yxUS6&_xh zy;l*fJ8z&A#^AEaLSp>u19LoT2M%wVR`vP&VhraP7-kV4sHoF!vh-yWU01da{>*B_ z8UH<_U;S#a!a0R3d#Q!*50#KT3AyOZy>BP-+sX4BarC++hvF?P zMe-}?)Yw(orBZ}7cP!yt-%^n2c!>pZf+(9Uj~yM4nH2Gj(ACpNY!6e z*K7EDERtyYRKW?SJ$RC8;@G#_U~7C1*5*W0(R-&rNvDA6TwI2?Jxi&&<3%j}&_{-( z8g;iimg|g{bh8n!y>VLe9-Oz$j+=!5D!)7qH!F=G;O!gshLtEhh^?d+bPp_PnF9LS znIItOk20yRKt~|6Vso_|R8R2Wq34(B5=lp@K2wWq>zhhb^t{OEzC7%lRZY(DH_+|| z&eyZ@Bgd7cgjYKYt*+bBa4zF+`3A@j6U&N4Bf5AtTpB}_PJ;c3tC+y^4#$*`eXSQx z9=dqY$NdMf2@9x>jW@(wG|_#Bc$w?RtT4`Z8OT;%Lhl(txK?sKmislq)r~q3zf~0; zx>*u8V;3S??L$4fUSRzt4{K=+qqr{+&)qV@^NJ_Y&Or#&jq)+fA`@~|5Wh(9V zu#27lkvrA}MC?Qa{ah!(v0+N+0h9!#$jz9D-rS z>X0#eoMdm6rmG*H1fO#uxFA~}<#!g-i94%xhvlYV*g-=kc&8W~pO=7ZxijFo6lG5+ z8spldVq8{N1!hND;n#*Q^y2VF&Ocy@FJ^4P;@3l5ckndcED&P1749R(*Mh-rW&}vL z=b%gTPwM$QzapXiE>W3t1x1-bGP*ODF6`Ke?*0D}rPNTcxvT_+$oZzf9isP}TJYX| zZKhdqEBLR8ATz`{9)$E?^j-Oi@)d9_&IW(_UwJM~TG~U-7WUEq{)W)t7jc6*e?!s(*zseChYcG(dpT^jL8wtIgq1)l zwfwQH^fv7cHHYRK5~y{ck$k@#14^4tVI0>h%opMu(aIB4x9L7MS$kqkLo-BmHBmkr zC${bQR5UQ;rBhZ+vR}%Vpy-YaoV({ZPTLqs8V(&NyaGnJZnY)^45`Ck31fP!=ouF8 zFC&XLa{j>Ta1dGl1qHdDYk^!UJ2u1zLZz>0@e(C?8nc1j#Ptd~zCR}l;q~NAYbL(B z91qoXW$eJj8Rl5j{3>I`>15aVB__7Cos4R$F_(;3SmLyW#*cEd8J-Xf4T(mF!OtjS z_J(xLa>0S&K$?D?>m?iP!f&2OaGG~MRA)aXgN_Va{)@}M^!=b(muyfZrhwjW5hW)a zcrfGH3HnZ?79`d)@JK}wN2hHg&8t$VDwlDslucsp%zR8rWFO#*L|z;Lq>+^@+Rc`O zqT)P;nfrkJKA{40MO<+_VG}s4OCsKthRAPhjt=#=nMk4q4s&;*vVbExzg8e`-dd22 z6?Lp)LKuvX>fn!!hai72pI-KFfz=gZ_%x@GemC=m87V)ANLj$mW8}z4p#s|z9s=^wjTj|h zLv*|rS1rz(k0E8JY0aJ@UE_`=u=ZvUJ^SAf4m%QX-y=&>F0G-1Q5L{utUDPVEsB{EZXGm-33rOO|cks4(lvU3klmCu#~Fex4jlPRC+ zjovCS8knG`0)CJw`7cS^-5TP>4uvS=TC%&Da~nQ5hid0?al^@TptI1Ep8I10 z5`)%su_O;!zkDA2x$}$i4@=XnR;f6+?G5v3FqB9;KPD-f4z&M4H0~ZSfCj#Q7?h(z zrS+%6&jdl7nPdqeA0_CQ7!CNlQV(CwN?}g=o<}qB2qOI2o2=$$P5Gxo@mHn~iL6;i z_W4C~cNJB%RIs5(H{{~_JCnrky#Z)C&q67Obmn3A0;2Kgmu_;T2^o)lqH9+3oSoOb z4c_mXttau&5dP>^VbGP8Am%hlZR+Mz>*P+_t#^`aYv6J*I%{EzX%+3_czmZFuEDHk z8Tfa7QPr56fS#lQ5^dgKJQn1R<4geKRu)PPb66CMISBWH%LqWRBR=^PNFF3S4L$RL87p^1ir4(LeCXBaQ*Ld zI_PJ*gotwGDW1y83 zotwL6+UpJAsn7MD4$q($&+y@+%m{dst_MGpKSOoRQE>eEnBFXo(cO8{6X1t8?d>*z z(&t=Okk3{?*g5FfGS*fAQ14ilqH>meSza&|Y4 zXRLtSC@r!-Gk{%EU;vi?W}l-L4hkxSBtWE&W%>aS}SnswFE~@1rNd>7XeLb32?do*>rUpbK?3 z)-XKE2C!3k32GR2QP0N-RBnDdHOZKbQ{F_Pn`JKJG5ZnT-?yStC~XF;YWzVee@@ri z*ONmuJRXvFL53LS%-~t4uk?_w6S$AABCREJK}Y{FsmriJ{vCPbzzkl!=Y2+;%OHT2 zOW?Sx-i;_RuNL0-o@Y%n`8YOsIC-L>g<7v8u&47pCTTt=UU#H%YTz zqcpqJSR2Wsovew6AAPgr7F}AO$(Rf5gul|fRX4AzSLKV`f-}F?0RO5YB6V>W?C*3& zzwe!F$%8F;M%fv!)*gWiQ}QbMxQyvVy-{7KCo@4mbT>Gxm*V=@e0sGTM2PGQTMQ`i zrv{hBVbp0c@@cEV>cR->>A>aIQ;2%X^v;R}%g-07 znx6`-eQ*q>e!T}qovR>h{uInqpUWOz{TRoNjIqCSzR@Mq4uXWeG#UIDMC`%}m|0v_ zaKr4W+!-7}oL~JSDTSR(*yS`<=hRw|JLL~&tN-9ikt}epTTg7c4Dk6K&nlGuDB(tf zBBGqKg6cEraP0CSGS_mNUb6aJ)cmH-eU`eY*6o1InJCcxDZ|VPIRUlTlZjw+FX&Z& zr_S6P)ueSDJXWw_vW@hi@#i?Ht1!crCvMS+Y2%#lG;$NR8SeKiKmbi+~mpXB3kCVQx&pEevCLhA@8xapw_ z3;w;Qr_A|5pWCPFt7l-(Judvw+tf!Fao=eh6e`h4E+DA17J2V3F>$%M}^d1ft&zh`KG zO0yT;kShnlGfmLIl?916{fyILp%(s)Yf0igVLH)0M2`8(@a7DAz`%mnVEk1Tl8%T& z;irq}P+P^s*zCn$Ez{xov3WGDdmAHVmxqyUEo5S}2wNOdSV^UQtV*i?V$I!gthmxpl+GwaN)lKIO{P^^uNx4 znTM?Lqk}FSXLIOGC3UzPFh--sBTaJO$Z(9;9(%c7I)Z48IB z*RdcQJCDiTexEv9i;_1pJBaE12=x5*jhdAYu|A^&J|8~>_D+%zJn|i;BRPzY z%_XMbjs#}icLvu&aWF|(hTa|9Na4lx`1(SR$!iio#CsmmzF!|nfLsjD_v<0!W}F98 z)qsq=m=EvwWYWBdNvPF#6xB`&(KUC9L19ZcoYZQ?Qx~_B3XyW!VPy*>=MR_nGbcKh zQD|9O2x<*3^uVws?fJDAzUMe%r&a`{E&Wb5hsVLHis|^H>pGE|#IecOA0ioDH;7N( z7ED*N2KWA8SVGSe>oxD`k>LbV!Ph|tqlQR|I6u68^9dtj#9(gSHm2>1DKtw4(8o_d z!TgX&nsmni)_4Yh=5_ATdeozAwI@8)uY$R?wl4h53S^p%1vswL4HBYupK~s9Fw9Vp;(+W8PLEQ6A@+fm9U2V@TuI!AsPEG~&fEv;?j zmgp)}mX)R(j$gpHMyk|>C2#y^p_=*jMJrw-La@E)aH}YJ_zP-PGkU0-w1A(W$#mvWw?{z^?Z= z@pv|F%T+?_htq(!IgITbbL7~WX{1#mmh@-(z!f?Q<2^lOqLc@tLVB!iMk$>*cLSBu z#E|*M@!ADup@fM6Nw#88J*5l%0>fandJnnrIUa=ORFErN*Wp3gRZ>uAL-xK8Fge;6 zOV6oLj-g%&Zm08Tsn0mM;$MYQr$^aG{D!#GU^*1w4R&4DRiaw0hx@~>w*_nCZ zxc@+(MHzz6o=Q^N+U@8;FgsfPC zF%mH*8o~i!ak&By4?jntm9AL*xW+_F?=8s}8{x8pTS59q9J-t5v(^d&VE=Xocy$~= z%aR0``kx4-DmM~A^*ly5EtJHHoyV!dn=xzCBeJzz7kZYd@=hjxK*xbV?(SUx9kV`= z+JmL^p7Lz4lu8HXBLT4J_c0P3;0%u}XSVbOUt&XR^&nVZNE*o?wSF;*9Dn1*#*$)?}ds5GSFpV2~Im~=}I;iy+T|uXwz(Vxxrh~ z82^Fp*3QJgT4z`Rv(L2Xn;0G$6UGPM?NOZT_3rPhp~CA=&~1A-2W8_K+_*@MKDzmp z9`C-4d1{szT}??-@jbHWU=LmG?+c%Ogy2WULiii87H>XGhcHLcrn4fR1P><=^}oj% zou%4z{q48(%a3B1;m8kbZzv+~&=@t&jKz&IF5r5a@n=ij|2w1xv2npg*#6i7Km)>spM# z@Fu|n{Qk@*-x3gCXo;O|uIr6U=mn94YdxZ%RIHR-{G z<*ZElY^t=m7Akv>5VMh&WHh>;+W3uexo|n`zve^Q?B{{tZ$Sv@3%MY>`!@HC+eziU zSX${>O-|3*1pVo^>C}h$IN3$Yq@p>VH7(smCf7!D+bw&{?0nAZSh(Tbv*tK@qnt+V z9w9QSJ;=ZPI5?>1QmcOnaK2L*1sz7fWVIih;kSf=xi%(gO=*<*63PZPY=+jimrUfR z^%0ttkK0q4>9X21sM5X8Nc4wsImRy7vO%Qf_ACd~lJaKLC#{E~8!xF{g9^CM^n=e1 z_3ZqSK4RuohZp}$!Ej|wEd8es_q0aHZ_Xnc*j~XVxEmvv%cC!!=?Tl4UtuNhVwm1D`5G`QEpc~$JWefZ^E@@2OkHVXFB zQ(|Wzet#a;1-~b9N>^#wt82zr-lw7JQA4Pud%%_J9+}2ZG}oQChMhx`O=A8w;Xu~~ z@_5PwwY$OXK`NZE!*mY$_HYhd6Fr6>TvyR~7L#C&n_kOn=k3%nNtyhy-w#X1zG5TK z03GIjA-#hfx8aWt+HEWXI@Z}lY6Q~N0Q^N7(j(E2CWGVfTRf40f4m8rO7Jlsw z0I!KIOcFc|o`aqAoZSUtQoRTIou%>1Ta4yT7T{&bsIWq{)$ED7e7IL`b%J+b1n+)Ek+yTI{MOU2oyf$V`a@Gp4BC1 zoWGT&Ia2T0m91~cEf+r|obPPs*DBf{FGvS2ci`g2ne6=>Idt+|3>LS;VdIVvT5u%= zB`#%?Od1Z)Z-yyN7wD@q4aBRr9=CiOCnNW>VUtD$tRCA1-4D~iSxtk; z25-bZZe}i*EQE7@hSEn$l@RDy3#{&Ylbo?Iv|VQniylZ~jq?*QI(LF7t-sS8u(25z z@9AWOi8E|3946k|v*1*20$Zx_kUH=CNpGH%Z)#GbuqPgy9bvyH*B z2~QkMu)|@I2lScw4&pHBF>!t^M$$9ukYC@Gc;D4U|0!*>`+Pn-Dc~X&Y#1aS;VJkk zB@D*C%mncri||EY1tdgI1?@?f;m@^HdSz21mK0`j_cqSoB(eaGcdtQ>sDpUJM+MJ( zwZwRX&0wrH4Xx(>BZfOFAb9=+t-Z1XWX2=mP}^yfnX@LCIUbKm+;c8F*u4*eVJ@6q zWCssdi$M_AOEldK=rcnAJF_Y=_K7e~PS=7r8JA$kPHSwPy9`cLE17&3wM0MM4ZPP| zaqO=L(O=v^7x@pvl)Xcc9T>)FL}?QKu$d+^@ALE86^9@qO%>DlE%86U zQTFZp7$&U10M!3gtuS^mk&>M8_*l2uc$?lEZ(ZW zNLQ^agTs#$=&;pG8eHKC&Dv)`^j{u1&+#_wwsKi7*?sh8UJOIDqu;}34FhP2;F~V!MWy8 zsFnYZh@O5$xIYh%4Jm`|+nw+&@D%%Jy*MT(e4&b-nJ~Cosb%5N2fA!^5v+qT@^|h< zviYSW@$gTflO)5y_;4u`k-rt?)(X=#Yo?O*nU!=wDL1>}Z6@r+YMian3sJ=%*$JhG zB+PyszlYb6MRVlgRb3%yvy{O!Q(fyP7 z?8jgF_DDA~M~;u}8y9aGHrR%TIq&hQk1KJ(!C>QL`$_O+^)zxqt%dQ(6$0=9 zuyltH$G3dTn7ZWRKd;>zL zaMuA`eajtUAHSpyQ{FQdy~0rOVHH9 zj*p<`$v@+`#x+>6<|Y@n&7>1fMlh!+n>M;FgyfdP_+QZxsiQ)8~!T z_UmozW7WIlov1ivyW3&r1v4~1l}UDU@5jyMIV5@72E2Sfm=rWUCu@HPvtQ?SV)6HR zus}Nlj9iSEl;_`Q$n#OSB^LwBKksAeXf3lxzyX59R8V3x2Kr|CWB=!c(6I9c;WK@X zKNZ$c@7xmNw`Kvk;AU&C6?Tg5c&+J?qr^|=4c zakSJc#zd6~=EeekUayQbblo(^)fzW2YeN)GlbnPWatl#Ss)$-`+Rip-){<*a-?0&9 zXGpz1*A>Vxq4sAcs15fy`((ZdXlx4f(5LixMI$}I#+Z1ys?+HS3S1UB2BRltv{cLJ zl2ex&Np97C{3BzkcEP@dE6N@j`E-*}Sv6SHb0LoA~OSiP71&r1tGhqHi9;eK-8^;JS(Qxko{$6=H|GyTTQmzg@x?w2Pl1dA=&4uO0ia2}aX4qY5 z3i6LlNrlb?&6uf-QQ2AWFn*_r@}*2N#Dei-;>JY=qEp2rQ#J&0k>dUBcqYFKg}a)Cc&MFdN?eG{%DM^{Y$qkiG}7T(r6=-Ni)i#vHQITYK`uO3;e^xdG`s@pBo0MqY{8} z8%eUT51g(oAh({^(?oMi< z%=w3+mxJUvX*~1JfMdd1k#*UTxH!oRuO5t~$4?Fr6_+v^tFoe{q)V1cN0+l>UiIYL z_%>Krw;i4x?xyEv-^GI+*P(r-1MU4|f?aO}adn0wo*LFei%;&5G*wIiEr4 z!5lwIteX~_&%_*~qu^wFh}sB>LRNV{xZa!0YhPGK=l!CzzbOg&`-jl;W-5Af_p-XW z>3FZ<4JqdhlI#i%yv?0iMSlC>uf%3*y`mh=RDROK>^b&=q#fNPCj~~6zL78f2f01v zOdRBLDRHKql+~1_>-knfM{y@fUp$#S47SE6U&3KKbA&lla*^(v5d;#B+&qUIf>!ke zI$bB0>_iz}h{sku_-ca9=zf7EV*D_lvsoXP@{EH;;}# zg;R-_Nxb=5a<^(GthPP@QtNi(z?}eM7_tB@{{5!En+xcXp#dnBJptuqoSRPY1PuMo zC#78HTTbpass{=|Xt6A>ZR0U86yR@paT{RPVq0+gnoWGmE9s9{qPR5lB_#U!lO=yS zmeW>icE#pYa5EQx7=txbh%b&9PPz@f+w1AP|FbN$pPIk{I~qA!j~DwUp}o5|k^@E9 z={1Y+rgFZ$Sdg1oyLiaVX|!_ATuoTNXWjNNl10_)1j zC1-WKDVsx|%@M_(>*F+4_%;!&;arq9!dNk4jDqpk$b*~HVcv>*;`eKSuGZmZ6@?Z= z{A@9Nk$*wtm2@#v@ce|1*t| zGhyJ>;u5CQa2j4u`$6nRmC5Q_XodiQlnzycufQ6do@U6D)hr^o;19QsE-zf6WR zl?`~^otqE1`(n+_sqk+uz?J{FT#tw=?mC%8#kRgiY3}(xduaNF6HyGA~0>f_8&Lbo59PVc_)Gf5I%16Pt- ziNGu$&>kuy8$E5P>5`B1!0yeA^!kmQ?`jWQ(H9Flu65Gm3)0x1mv%r>=?I;de}mj_ znu`k${v#iBIF16x@mkxu3}l!vdf=B7@9xxW++-z8)PMTX`glcrH)A=jHa-CoN8(_? z?y2Oz_u@SHfhdeIOeMQZ^eO+lCEyW%7Os1Vqx^$FRyUr@@{7)fjxlqX@5*`nejlac z2^rwd?}T4_vGP9S z?sF3TFRSyyeJ_$-1u^uCjU5x1zk&X;6DO%_mtjeEC^jluqMb0{bo0qAmabK3?we2h z)%`&*$O%s@dk!OO;wk@?nV7oS0xul5MKAsyG*DrQ!f9XZm)(Y$uL~g8LIPKX5_)}$ z2Kap24sRL`LSywTT;;l-4lmRpbxML%(>e|W{2sx z!;dNpIJ$2V9p^Yb#+ps=lU->KzDWH?~|!UqxyfH&eGccVW_(sqo-~DNZ~6ogSZ=$r#v} zk+xG2c|h8Sb0D_+Dl<5oPIu39 z=Y9+HXkXMt@=@#rfYTgk=oQ2j(($Ci=_*!t7Ls`@Q^_k;S@^!{IkAY+Z~pp}zX~OgH!mn)D%-tt)Y+9)OsZFrU;~bgssvVPBD?mj+5?6j(#$37> zNADJBkod#g-R4RkX&d}P%$izZz40!}Y*B(&k}d3$kZu$AL2(#x;=?sZzmp&NQux(p zJv<8hP4tglq_xi75Nv;$DHP78w(;k|%v_OLr-@Sg+_+{Jj|S?Rbeg&8nguGUZLrip z5!+3}aLLO^^vs(C(pBe(zvl~F;K+xGa_iyK(nMlk=-=%B{WoKA+Y{uq2jHZSDYf}p z$XX>PqWV2`qOj&M%@^thXC-;YSzt3NJQyR1v<4?eqCwno6iUS(g5%X99RFMjxsGe7 zz&p-^XC#GQN1juU_GJ_;wC_S}+gJ_6~CVsx73CJ8$IX@?(XNF1+G=K|T?aAUH4?ruAN>?m;{pm=lL{ zHzl&oLS;1MMkHi(mr-W)FzkHc27f}ssFA}B8ujT4S(Ysbzn)3L?z98MYQ=3f_TWus zb8!gy*As~jcLq`Tvv`(e2e%P%!F%8O|fvRiH@90;1r2Xf_({?;@9WJY%wcj(}?o1Fff8IKKTO zHsnMKGyYwYq;x#PFi(!pS)oO|lwQ+<3pe1N#!b51^aNE38AZYH1z>-RV-Jc*f>wt! zRkn#|-~W)ruOkE!WQEAo&)k{mK^$|WG!h=jM?ma{C~`O1oEahVsF`$zZtsqUmfG_~ z?@TTlFrVN=UJCB+@dCr;4@s|uFp3CIkXOGWFy5tx>n{q!m|HbnsTzgKjxuDE^>nUV zwvqf>-vmd+Lz&KEBS@CBCO5d8+e770%-y|>eBmwsOYJBX*(c3t< z>m2QP8je?%6f?@-w_}!01v4Y$6n1QkhRs|iR`E*`&Qm{+-;;zf{=#172w9AWmJ>QX zg3GVI>Hw9G4b8iRF4I2wWLB@C0EKqs!9;l);XR7L<+z6aHrmKJE1PKF4G(I0Zwjw``~r*PFfbk!`!7M+~0{vJJJK zgfA?Mo;-gIbVm4a^Q(S1BgtU6+C6yeABl%uchKLJS@gB@5au4p!*4!8WZCgK^mTVW zyOm>k8t*;~Zrhq!zLWd$p*~;B%EZ;MzdeOM?)Qh~T~FE6ThHkN6=g;~*_WFo`QVY= z5%@Zmn@y}+52BeY*vxxP7GCUNgTy28@|J!`Trz?#b{w#bBVI|XX>c? zi5z;?LWUNx)Vg>v<>*^5)qE4((ia0>n+ma}%MI^me`Oa6t%3_Ztw5^sFzY%Wyx@2| zi#@png!~2EnYxzDd!&WZ?K1dKI|^>Q%0u1o0jww4IO|~*tFSYdnUTL4hAuh)8lC)*P<_Z~qcTc2zd~ zr#Qgi4qKdi+#LRG`9e~b^b-y5Igoj;hE?W#6BT@IBx2kV4fRWL`qRlR$DYfx!XdZG zDz2kwI7tO0uFawcU3>7W(L8KDDop&i-f{j?*`|#_YIuFiQu^Ja0yca|fSgY!QRbmN zRK>(lZR2#9_6p!o)=aW2Xc0tP7}8Dg&xwK7JhYFVfi(_DdZM1G#vswEa{e0p>2f;4&MVb9Xa|twFeTG!zcIcT;n@HuByofq1EL z-^Hy{Fn1`6YARbXCJXNo)3G(k_Lb5pX?y4l$qA0@Y{2CBX0On z0A+U_Q93Rew;KE5P2+T;JGG8EywaP5&Tyc+Hs^qv$wH7FF{LkLYOqPNmxhXbr)@Q1 zxF}B>D;m!dK|510uD3(^1VPyKY%|W`e@$P^cLL%Xk9@ytq2bHz=Bt?^_|aJvY`f&( zhF}ImjK2}%5(7HD@hH3%exDAwk7a?S^jy4G zuoQ>KQYhUxANfAm)BI0@xb>+HB!^8#qh`)cV_gStJ%sFlKxa$3q#Opgm(HeX~QB85Vs&UEDqKm8c4Ao%55nozen*yQ^&N zgG#za=s&V%auF^QO5zsLf-PEMS4m}XHVOaZ0@s41utfDc**T$)GB#RRBR?5#?KQ!^ zMhXXq9vN}!u12*NtjU4$71uIgl>4UcjBlSS0EPM5B&2nONF&2)V4I65ETV^<7l!hhBLc=xXiP#JHy zpjXEFHA|y?y8_%|#d$}kD!?DN1#l*22Zp-H(_XDua_o!_<9|~cX6?Aby?fU($085l zJI)Og_v8|a>8+vJBKfd#Xd09%>cMYb80`LGOg%$XFlbo_ZuMJ1cb3Ycjgt-ftXhx4 zSBlZ{@f3V3cOB~Yp2EyM^~@)oeemaAC$XkFkS_0nUyCh3^87DyJc+WNg#~bH$PlvD z8nM4VWx&U-T{vTCn5dPE(2%7~#3v?!ZppJI9l9mpD)f-FI|e|IXDmz=3d6uHpRw9B z9p}3gVQ+3OylMVN%wL({V!(;w`!+;=JtFgWT+%rALY=)72IN)BVFS zPxuy**w7B484T6Un@N;1)nWe%SK7YeAo-`vkn(;9I(Vf4o*4O{=tFUAxww$km~|hv zO4#A+^2>DABW<{nmw?7lNS|%f!Tx{JM5}T-@T;$Yoeop!{**XUu*{c!-g*HKHV5Lb z0b^LV@GYL*r;Ll7^PqaI67Jh~4t128OfHX|0fptZuJ#?eO7B~C0;hYo$-qx9v3{K&g zK$lDCOReMBpgTYWPG-{o0*^y#hB^5+BbHg0rB5_WCbQ0VTVY4oUn*9#5+-)}qS{q0 z=;qw4H6!ty|NT6!UYJkUz7oSvm0_^;dnY{Oy4!p5rQyg8UnI{~z&>BDtLt}~c^9`A zJ)g`Vy&R`9>U<*H@1M?ml&&P}74DF4o4m0gK?BMk6yl@-Uur6|2tR4tHgBoF$Le!g z8$pr9;B`HQo)YB8vq7QQ={toy_MAh$YEOm}kN;q8#d{i+eU$nIr_oJMI>?(nh9+%r zhm>e|;2Ys^SaI771b4KM^4R4#_@W5(KN^D;--%`>;}eOu7@{*y@ZsM2wOE;53X9d2 z;D`iwc758#R3+V|{j=r}ax@Nu3U9Iw{v5|^%XNtOjqK;H1LW36bDHpa9nGz&0GGM3 z^m}S8ihNm0i|WQ`(Z(F;a%ahdoPTsvzZTUtn8y1c#4!yOT=BR6Iw zq$DXHURstz>aI-usIQL9d_(-TU>M&Cts}`RpV1pehLGlW2vz#8gY$89Oc{v5Z8bab zs-P;j2aZ6Clpx3oQ-)J-Irm!LWfMLjLrix$O+H5p@eViE(8@oWU{V^zMmIboasIv3 zqvHkMyT1XKc*^qLT>^5pJB~=IsM2G5eleGguhGx9lrd+~eCXErL!6?7VNpgO$Cnp{ z2V9pv>CkO5{4|N!s%t@6D96@&^qKCzaeV{4$aTIqV)WOUm{rMrZsnSA z@wYVaQn^ijD0#uL!aDR&IEif%=fKqMBXlj9g*DrDQGP=UTHGjtTO*ZlHAmaoV;)Kk z@A2r;s9eyFus!oZKe=S7>7DHvQp#|HC9;;?{_=mwSWt# zxAiKPYs@At*i2t&9mEH{(X^=Ef!dN_?8`b2-UDt_R7)2(7LD9w_MHuGO@wtfv+0oq%De#nDTG&F z%amL{2}*sk)UDhErFuA@y7W!Da@`czS)T@#>!RR_PB)#;b+2x{O2v?Wp?I;UjNM@< z1CHO$knav=ur~7#^@kLyrFI9?E~vp)83~;AwHe*+3h+c`HA^!DmCe;46cbmgu%OHh$CPdGw#@dpUt<-_MEhZx=(XZmvT0}{n6 zqYFirQgxT*kl4^fvdeeD*r7V2cY7w;u*MAvLT(ZM=b?1d2^Xkl%!qT2j@p2l+ z8VF|`9e$9Y52b99>OJ!Q6eV}u-jO?ByGTS|9nJZA2=6DqfkWELxOTh*m%9X!22EAm zwlN>A7ABMFM#30SHlh(xe#XbNXYKqLCy&?iA}qUqwXFRVeK5|^EmZ+Rm8nssXJV2VFo zV!xYhU^c~BVZxw?3DL=6*8V;VSNyWz@#}P~{@70!>6LSLGL98i*MhPEvMu`);;?mx zBVPAJrcCWPERaC>5G;b`1GXe_>MXA3lZa6(gCM7*l3Emt zAR?34R)^6^Jhh8?>+0}#&lxBf%0l@||HuRF98BxqOt&5T%l?i#kH=;{rYD{lzy-S- zC?uCdYS$bkx1X$LiZu8!=m9rZ_-q5o2bR(_H*s)mYQUyBDkyjGEwOtsLhbKvBXb>f z;27TzqVU)RWK$Bz-V|SB6~TF=NXG&K^ej}omkh7o29c%(RVHm> z9VBtqSEk0Sn=V&T$K$HkLDs&7EHE*J{qI6KmqICC9bJhc2TJJJyhp5Wz$yB`JC_Q6 zcfqy|P0e=~rcv(&%W#n6Nu;LNLvEie9-DWDt(eSi7I*aTw zs3V$p#zDk(GS7Q&Hyhp6$SiY^0NLVPdf=fl)wgXXj^7uNm#J6b-7^#1D)0kp!uP{4 zw=>nsw_*DnmSN@57t}0W5sW=f!Xn-+8usZB(dRyEUg^bTnaEQV)YHT-ZIj@}+*Qc_ zeLz}FxDNQ2ZFuEe6Qnpa6QOYd_DPC4WWCG54_f(aEX*Wr-S1MvM4&%By*jL4OxayjKHY$ve_uNyHZ zXa)rLJg3eAzv*6=AN1CLMszeV8Dr-gkl}mh;ZONa&TFa%WN;gJ-$VL&swd7IOXT|J zfw)Ojkedmon4IgiVjpEZZjP5dNcN|?LF4Wi2%nM!?K3`8nWj|w@7WVdZlvHxF;mhX z+)67?o=4MCbtsbx#PD^+IBi6-WmWwZVjpx8(pOl}gyb-C*v=oNEYHx7B1J^f^Eq{$ zsn$%2#BiHq0`UJ~scP#Em^rnUgs$e~;-G2eQiQ)EK?`NZL_jMQ_ zPo>Lu>_SFy6?u5MmTu@eKv(hygWZct)?xWlY${s9Ca?2G@vm7pmOhDh<7i4Vlb8&n z`>(U|$GgchcLQ?CI}ElvCQ_k2-ptUtmvk}bED3{JW5uNuw;a{R{iy=P`;H)r;UD7ScrR! zAJE8o!sPS=8`PUz13a+ip zLBd*$_RVTSmA^5p5??iC7DjLkrE_Si=}tOZ6%kAKp{!s#`L@Ru7mCjZ=}k{y-&G9| ztF*@DdH2YMi;2Y1Y#DSiH7K>j4!T3Q?D(6%R7=l<^8!VKSKI;6vC&3_k`i?Pmxh&X zOTpmYEQmDb=E@Q4Nqo^#SY&>VyzUSI|0i-SE6SSKs$FZqKV?16xxj}n%H41$-!#}b zDF*&d6@q@ZaLyUM8xNYt!>x@&WXPd~ZRWivh10gd$MhKJQEo@szg;+Ssv7H4mg4B~ zZ!{`38T|f}BWHFVfC+UkQW7>D1AJ~!BR2v!6{hl%$4@dJRPxY&nlpVpOP}rhS4*9= zs=?%v9r!{M6Q&bQbCvkz?o_l=>1S;%9cSl)jI=cZr zOPfJaKruO?!~@0OtMJjnI$Bq1%=OO2c^?*sQ~Ao{bXY2fnyX)i_&u_4P%#wzqGQPm zX*D=&-iD$^|5$}7%`kqq2s(7{(;duxs!{To)MuQ-=^^KFqgg+DC*c;Ep00)qG_{dg znvVu*hl$2tah#I+5v%rY#ky66nD-$E42LeE%k^+rGJFV4wob5DUpY|A&QUTdf13tO zE+Xq~eNo0~G0EYLPzm8Q_#(O*v;Hfl;e8wr-$@KT9FOAVbK!J>{Yjjwn2MUM;vB0X z9NWuE>HFWyA@)`S>le8k=8JH9iErIZ@SawjTwa08WL?2E_aGj&(t+9TnRL5dJ}Su< zLw)dhcs(w`iy zNUECLb;;|ct91}=P+g8o zdDl4=q`sXeFRP^~RQ{rTCk?2;MiD%zu7YKg>xoHR7zCJ~qg_^JWbBn5EFNy>_6e6E zM$(fmdP}k9kUL}~9t5$-FxlJ~hYF7UfU$O2c>dTk?I>AAf9Y{+~W^H&_5q z`17c1avM7J^U-^9)kJP*3XboZpi^!4l4qXY)cEW&w5>W$}; z9sb2O-poaLfgjXNfg^mq)P}J?OYrS;t`~mT5W++f;f((`x}>y_k=`ExCr_uKq(T{V zx{r}O=_w$SJ_BQOv&iIq$t2Ar50q|gC2x0zL7e;`Jy9XTCP_HZ{QuN3z%m%TMh~&~ zhBKL8+)VhViwbVI>BQ`MB*PPVQUd*0Q=RaP+4&c*3DlH=`$5k zV_GI713C2kjo_rygETpA8(Np1;G99`V6bX6F+116`QU9@IhFA8yTFg@tnAy|0h(ia5Y(xT>Lx01ExG`+J1*h;wUcmugh$hm+=xzH|W4N<`{9;`bJ8X#KC`aIB7`U1#M$0aL@TV?e|=dXSGb= zvV}FQIcEdMUn=8L-(TclmpEq3%LDnvqfz=k`tF52OxfaqqGJj;>(nsfj?2*gUmfO0lIqs6;d?q3A5M7 z7se;^!6Pdf2;gUlg?f#q`_ol64%;$F! zLVqhOxbBie5`%vclVjuTH9rLyvu(sy>6d80<#dhzoP#0(MfTHs5m>lxA^T@ZBnf$z zO2?;ge%BLvCiG%HUOd!mA{LA!V_h3LlPU!lm-6#w^K&e_oK}3NCQfT^x^m~|?Id45 z6f+VKB1=}onH)#R@8DPiEIFz77QM9(QICOqxyEPObG z%L)W}|7kVSGM)w=lRJ&|>4CVRKn{=ECWC0zchXX20IogR)T*%&bBAYv=9N_N5wC@u z#J5E7l{$0xS`Ya-c{-PEW^k;AP@P5b)bivaqRj2l|ENV0)nx1cF?8OKRK0N=HwqEi zp;So9Y>3?Rd?*##L$VrDNE)Ju$d*mnBPxoJP2BT*Xo-|iT1II|rEjUEt?&5<{BYfS z&hvae@AvD4g7-N_%it#eMiK|XsCWpQs zqK7ojp!0N;-~&g zr5BDg0kW>Qn|@7q-ybgYWQf3 znVRE`A}8|Li-xYmiXRSb9rF^9C(@8Mg)0U=q$y34#y>M zv%p6>N3fi@^o~M9`ewRgsuiUCbf^Ehp8;v@PprY@1yENJfHwOD=&fbvNl5o`n)S_u zT20RZi6)MHx8oCQe|H(4az9KTE>|VXxHEJ3h!%U%g2k`PR$n%NKGbwqJ6mtAiv0Kpp{GP#** z)FA9O+%C?CL6dNHVcL7%z{OiM+Uz=hp3^}JgB9UTj6NwB3n4RZKO}uzZ}oU!Dhk@Z zW?o1a(6|#SrfW{lfQNYuC|EFfKyNDyJ4)cB$dyFodjfrywhmv(sS+A)NmcHo!m{h# zsQxno2J9SJDLWlH=<1E<8jW!UxBorC^b_gyIk=H*zL!24V~^p_VU55BjNgD>vW zhob_G&K2rV#EheJ^IP&!RHyNJTRxGx5DxDy>OjNGI2@!ryq0zfh1M)V@r5_(J6liO zt#l9lXO&RRR7F(3!*SRwB5+2xJ!tk@;rTbEWXZB*F#N8FTQxS@ws$93alP1q=nCKAgJ{8eA80`Y|KGkq$EyWvW!fr_hA1tMZm##1-zgy zxfr>@0QpnZAY_vU)~r?LDR1IDC^-hyPpO0B73TvlR0 z@w-JQYz)&GcPdnl+L>Ri22qo zOcqdRFZ4o%h{t@V_+^0X@rb1a| z5l;A<1h+p-Y3z+qz!S~doRg`X7|ol_fA#DF2{2J6g%`Dn$K5_G?zxD?zA2ca5Dgap z1!7WPB%QZx3)t=TgQ-zkc%r|M%$1Y{+j42B_dSAsn=j(UUR4-)pvLv26Y1DSEshm_ z8mzyK!Jb(exb&(s`SW@gF*3MJ#m0Zq6^G0z`!$L>uT{kZ+P8QWoVRJqo!9tdu@!o9 z%q#im1olRr7M`n!VG~akqj+v38I8-MHOZc+bg36+^;^QDhUxsnt75Qe_BCera#=i| zw;9$4#gO7A&O6-V4dx}*uyP0?MbUzLCY)p~otMM?noSt|L4l^+*MTe7cVXng82EAe zGF_Z`oT}f?=6s;`XgzGt@jM5>$RG`WmKu=>U5DXDR1p0jByKt>O9oqQztD+_BKYY$ z=NByYLY4f_)TLM$Qpl2K}#WJ~DhF;=MR2OWf~IMgYI%JYOFJme7_ zt-s0Ly!7eIx`RCZPD?235(kks6}0&qM$@uVK_p}`M9-TBTN5Pk+n-zz%=4nRG#c@3 z#9{PRAEsWh)vS@29ey}nMDD$~O4QaG!K3*Z=$i5!z#R0ii{ z8k3NKPPnaN%j{9#f@^C}l86?4)9|gQVb;P|_*QcReaWAJ$wrsy0&_V~Z&ZLMUoD~V z`&$ySiaBG zBsiPPldL7KTFI#1Y)9qq?|~I&ZDhn>obz|Fqz4l5@%>;Z{@p^%Yg^ffWl?yP%Xd_@ zQ!4hijgCxviCY)VMfz_&sQ>qz(iCv+NvIR!SBK>=yzmUvMYYh~0%oja&P+Jq&Vam2H;vBnq(5~;Q9m~Y=DKU+lp`HrST!9Y zWt1_ui_7GOPDG|i5im^LR7E`&zKaGE-+L#?deN0=FPTXkcIM;a*B12K+D!ZyXu$s` zo&rjfPT`(?oF8JgE8RWU5!Ww2MOlAQTrc&7|KHA5VsJA8ddKBSev>34b}a+!WrZ-| zzC7O8l7`Bbqohu@mUdgmVc1k}l;^&expIu5gv>(HCoiqmvbM?TY-zOb2;4a zaiD5)6uLeyhIn%$YBL~%3lvQmyRnsUdvt)QNLmM}@-=kzT&`0Wa{;cF$D-5B>!dj# z21kbLN!#%k(C-*&;%nt2ehQXjT^l+xt2C7@Tf8uW*__T>{@tl1Pw-*&0d z<=pq?rF%AJja;RS;1)cTS%5k>RB82odrWM(3!bwENknu26E&iZzw@q>Eh}b$K+Z9k zy6+5LPc}hysk5xT^=Z;0Ga03)XW+cjJs6bqgG{#E$1!X6l7qzz4s{0+6Sq1r(`v?T zCCw;s{RkEK>qZ}#8DM#C4Xv#;Aaze_pta~XyRzdVRIIs-2_X&OxKbF^zi-7aR`#GS z>Vf&8Kj{}!2^v+Tg+gxC?3d+SrcB+OwQ)E@>Ng(74+n~1n(kVd{!f6K*pKsPoxMk1 zkN#t>Y+DQt2g+bXs0?QDg&=j?Er^J*MxpgfAxB{gx?Vm_e?CoucM?*VFd`2f9LMij zxezs#ZXvs>FVo`G-T3@-Gwl=4h6H03j1&sR;Y%9K&k4hHOY{Z4ce4pp+?VA2+u?-L zdi^MSwuHb-k_zJlm=EDu}U?7ZUWc{9sn zGaQ3lKDeoLSe7ry15gMC?%$mrVCGaoBJitu$71x~Q+Lbm?W>(+FyVvK!%&P}s{fX7Ub50?0yks7&kOcX8^I_>g zHow^AA@c4nVQg8}v^A?)r>rYRdk0N)pRp3MWHM*xK z7aOx9smP%dus_xqvNyLt*`qvydRMT%tp{?$pP>B85>Qrt2$oR;Bsb(R!`l7?#R=#5 zyP6S`*Ug}%I~Nf-_pfx)DQA4SMTGdT(FWJ4gXBs^C+SY9Cu3#b;H_IB%(UWj!e8zq~48?*64MZ#un9h`;EgFJyk+0)smD z*dGp$$xpL$;J`MLdR5Uze$+x>4d*i@cXv>2$r`qLg%obRIFmljk%GhghwQiKrc}>a z3Z3^ju}hD6VN`oAxqZzAFZ5;6KV7e=nB8S+J-eGk%#OyArR#Cok7j1TIIUroS`E#v zz0DlCm;sZw-DW)d957UAlqpcofWh#s_*SYKG)7(@|4Ary9?j!jDQqfZ*s-EkTJ6Aqy{&ZbMoQ|=%vQ7M1$XgZ-YBblQ6+)nO0EpmhhnwfbQQm45?3!H18kR4?A~{J=bsD8F7Q|w9tsQDTd`*uBwL@2e zB6bH^L)+{O=+TZw?Xp$DpM?a3bO}PdW4? zeu$7j3D=cSd0Q53&i$iH?iA7`@@nY6&Xscna7@AstS4L~ zN{TVexnq-Yzx+KI|Sl>Griw`%DzLFyfcjhnIO|a9VlXyI=gkSUjuw-`v@m30g9T(r>4XL|y;LS{|b&Nyf?jf@6`9%^~ z|DGP_I-S#Zy`>^OD&+l{B>H4}B3+QH1i>cvA#z_HnP#X5YwQR+rj-f)cP^vg#AL|% zkVsqQ2pvBygi0?@(s7$sXqdVgTr-vVZCBR7C2nSvey9ZNqU0!TuSPEgZKnI%X}WB1 z8Y~IPC5L@t;pwdk2;cUAn(VqpPYNw!TsLdr5L zc?{}~Cm`&gDs@Ls-23+vSrlqPf2MLBLYXL{-}Ri{5Emhgt|t-uw*WrWj?lJz84zY8 z$utjr3{VhdBzmVp-q$ed6cfZGj+|g$S<66FIhWy%O=BzN2FTA8d6e#qz(Wr1zH5oZG%-@}wFv7} zUf_UNIP9;h!<#StN&gIvv9>4&b9P_iA27I!OA8jkttHuTU9+BQT13)R58=kdN^``B z68KNZliB{MlJZ@miNonqTv^x8WF5&S#tSBq*3F)j|85zouhszZm{oAsQ5YSB&OuJa zLwds@9gL>l0RdhoGiOH>Ml{xv7jd$vRZK8D;WD^M#-WqNLTq;PWUF4`g@Zh_1_I}5)p#1hxc&z#X_py@4)z(UV|!uL^Mm|_O#uj z#C1k2sYn?lqs=;Kv{MJzVlP6|?^73%49?YT2l3^G_~eiZ&h9-#3xA)6r_>(nlbdnZ z8m>#9;6X1~T2QI$XF+06lrHl(XRq#UAtTG>AjmcYb91iZ$#!FA<;+U%&ew&Uor7F8 z|Bp6Vi9_VbW$3J%4syR@$j7Kf(7|O|*CiB^Z8j;$Ha@_|hJboM&LXRFg6MkJpurI( zoT%W(ac~0YzV$iaWoLkYMvsI4t5RC~Dvo8W6X=>_52$re2#I;*2a_?FeAoEK9?-r) zR%Ipdrov0!{l0~8UELF2`o%)pqzPDGA%~Mbajw|?sn~b3oB#Y@1UBA|ge1r9bOdjM zhV2e`bN(nikqoDCfoq^*k||o>-wn5)Y9Y}pW_+Xi(PCmMvvb)dsLVA*`(r*hQD!S% zY1oRgP0P^X*HySAeih7SuEMyXg}|FCfO|M*(tztpIw5E--e$_F$bo7wGrUV0kNTnL z(;@O@xexZ;$by~;A)wQ64Fapg8^1>NkapdT>~G;0yo$M3SufKqWEt2)U34_D3@RgY zUpeAoVR^2HKLV@kC(@;wOX>59UYzayk$2&|1ANd~(D?V{3X&~YOpdP-K)*s&TKG8( z&Mr;B*4JzJ4olT|0ok)*X?-?RbU2^6D(E&i61;*#lsMMvu{7SIrT0nFBF0MKW{_aMt#pw)IjtRk6InFD+{V%<;xf}0pJxz{({6U?Qg*hg-EH1e1j*mlr(HWA09Jf#i zY6l~6>qjfn^OTYqb!(tCKOUQ(?jiym1LQR9188YNLpxz!($*t%l1deg9?BulS0$j? zlq+akx)_$UaPzFKc3{4yj@uo!Lt3#8?uwG3+7IuM`4h9L$jfpfurmyr$0~9EifsPt zGZWEAWeOu<-9oEW%bQ-cbMc7R)QSi**l5z-LSX-q=dw)-T`bw(F)uvwa&R1^wXM znkD$fhR?ffaEXR+T!Le4gvKZfIU@d#Bs6 zn~CxZx?WPeQA@m?J}B}a2e?kVz+*R(9Kz#RNO~B2{386wYGfM*#_6i#>(I>8m&{Y! zNm7L8nph9ou^;wwc}E2$*zqTq778ih;6Ha<{)7)#W91qCnM9<;+j9#n|C_&xV z(d6^M7`bgyfJ%c^)ZyG^aE%s$n+BC6B0K|kpU;I&eF`kQH-vCaH*CMwhH}dKO!Lr1 zsH~iZ$F|d{*{jJqa)sjIOVn@T0CDe7!lk1fu(8Poj5q#*Q=8W`XgZeB zfbW@Du6>nOy!u4lKFE>Uf_f6%a1-ZF=pm2WmU3C85D4p84S69uLE*_1NVwWc|0GGl zhsw`dXMX?4GEx6-6_~{wE(W4y+bx|i&KRahR9UzCDWD? zkbS~+XqGNP!8CucogRYg{5gls-%%QFia7jV7Ma-2aU`8}*kidnV0m-}k@+x)(Ut?4 z?)DP2E;mwZ%LvYc>5Vd7GN9KW19G+q2bmasg`lewy^dt$u{O}V4<~sChjpg z3&Y#Z!Q15mnLE*y>(ch(&5?h!TkH{W@!=$`6?-xMNjd4Aa1>r~fx*ucegiM= z23u4-9pi@c5Z?SEx^|YZx{#aCa2)Tx@KmDxU=_oDjKqmPiy>@{5uWoaK$BW$g}h*8DMH|bTW-PUUcOn8;tk(N>)A-08x`wVCrhibp|cq z?czN!D=QHM%Y;bZ)^K{pEdfs*aKW1szA@Hw6VZO?3mIR0g-SUYk)Zv#&=XRH4SjhS zlGDtp;|iRdIY4ver{bhs2^5~8i#KE{F*EEUCM8x=VcSLw6if%_V^MJGZY6FtZee0; zf0KnLPSDiYBp42y3h-p^8UZ|M$* z)(pVp{YlLFhu2B=`kk28A50c^J%EY&ibVHlCp1d=GS2?F%;uKEWZ<6*=Ku`@e#a;B zcw7S7CN77^B9n2t`f56Kq=NJX&cGY*C%}A*zmQ^f6(oOgXI7436xb96HXa6GHTNxX znwdhnB26&gxC&kN-XU8(w8_+@hxBZfq-p-SHmcH*VDiw&l*~A#3(XuK@4-A()H>$~ zKit>CW*-Hto>U9JyKW$F_Cs8;b)1$rULdBb`}vRD#W}AspH5ibPL)eCf&a!ERyC|e zAFeZ@8(6~sY90#~uG&#fi$*D%<`oh=o`&l87n zFV->Y02vaUhIncZT=uf0a{nfA4wcJeGd<~2Ld{@6OQYPXRcY(9XqEIbGSUA3Vz#Jhb=0_?4a3e9QMqlnw2N<@s?^jV`?kt#}^an&ldRAMWj(LCIy6k zUp3h<&z&@WjmO|Z4~$g^!$#qaFt)RRBu31kDG45MC0rQ(nAO2sOxCp>pE`GO?!@q6C(5xs(sE$G#f(A8AEj)tT^6cn^4gEu%L}H^atKB^10m%;g9C zn0sIT!jgAf-b^B#sa3iLjTt3aJSYR!_6_7v)dTv#b4ug2xo3&Q0nTr=sE%yhoX6tg zX%IZnK={l?vPbVZ-%{%u`#s4I-aQmE4K%$?tOm!Z+MZfE64lMvj+W8y6}!o!M=r$u zlpbdL1!A40CX~JZKusZ&4%^4UCSh^Yuj#6gyk`XU3LHV##|qL9htc#g9r*BNCHPoN zk~_kuNf8?c3kI5~@e@(p4r#cqSBs9uCX!p*Q%USbVc57k0CtGZqjv|jfInd=xuDXF z!r$vqD#)7b`&xsWBr~xswVL(V%o6QGi2JvulITuVxGZ9h@57$bf#P~JOAmzb!RK`D z4|%LuErOx*evtwdUvMlChV%Dh$$f6FyyK88=)cIv-aFB7*ofOv<|RSxx5H$(>ooi< zH9_V^7YTCYqkxwT+8uF*_VkCOjp?F4xaa?miDK0C^jY|Q_dVIiroj4hno!8G&i=fx zBhodyz-#+2Qs+N`ne>c%Z+}|H?BU;m++UB$WGcdW-cpF~i67*xm>|Ekxe#J~xlXlX zIvmJ&&*=I6VT2bE2#pMerO9$+#d|)zB()RIJi0^*ExO5ZPqD_@SkB|%Tm_;fF3jI{ z7x)r60Bv=eFn;nW+1VsdRac)R`W)L|*;9q=x_y>@Fo|MDthI1-uOG9m*#L!8>)_|I z98z>-0Z!C%qOtpA$@=%N$j-`Ys@4_+Vn+)wC)x||b>Os(M+t%)4*fLw$r1l=YZ|~W6bo^ zZlJqx7W$0w==ih!cz>ZW9UMzzIwQq!d#h^Wlg=2b@aq7*crBSMZ}i27S2!N?o%2lO z@jOP{X%9Ir{2ovEhmpy$FNx!S`_cW=DB-mVo6_@BVbL26I-cVJt4G9O&V{Y8Am$8n z!s;%+WYHrUsdgBT@HubApaux-2h6@Y8!x(;gZxSf)3NX_`bKRB@24{7z;xB8Wy1w9 zU_Qe%w3)!(_ySCDqHrv4BUoGYV0NhkwO7~F9;KNY>|)`RbRkMqCEB*4x1`{|-7SK8JcZDqzvJV5Y5s z%dTezvq!!s!jI)?aNj{0TrcRDW=sBH|C+Tkn%gVzAejk^Z=8atiy&s6z&HS2Q>1omGbe?Ni}cv;aMA9Zb*I zPJ-p{LUGwM6=Z+A!EIk$g@DWPBQJ^nbI zP28=vFc!yq$gh7tX#oB}X`eGh?b>?C?pMR!Wm;U$Boj~1QcnZB=Nys}baNcoVmZS`fUMicj^#;P<%RbR1-XtW0?PZJR#5HBZj0^vX(Y8iO#uN z)VR0>4r)K7x3rc(Wc+(_<9RSmj!DG~5$^pyUPF~W_0YpycXrLhAlS0kk$&j)#`^SU zL_e{Uon6>YUD-iu!1;bwswblDbZyQHGKu>e&zV;OdpVz22WxU&kf;|LkxYpb5LF@S%!!3tQ0#g-d(f|h zeh_^?Kczg!Jv&2jElQdS-WSK_(@&WIp+FS#t0$uq;-PQck{y0C8;9QQgOGXUWZDZA zydGW4&kIW@szxsG!R`>W7B;~4{ghliZw%cB(qZ{+4G`EjmkrgDa5&I|Jo)e)Kfae?obDmb z*%3>H?$08uqY1?$uZhb#C#KP4F}P%C;OxN#_|B>rSN^axbvt{DUH7t*w5=1w7t?Kd z0=25dZ(0p(xwn%0eXE$-7iZAFCMr<*t_3Op4`ine2alD88`(EeX{~$kM!O8{eHKcJ`&*%^Acq8B3S~Bn9E06ON{z9d7hs*d z3Cq7V8sIL=rx?JI90 zCtfW?@dVDhq!tBlVoy;AvJgkrO;I!VHX4T@u5P-?3ps6vrLMwQl$Z_M!(KpkxD+lX z+ze^h8V%QOL~(~1aDUj4lo1EiGO6#9#rW(`H^KSJ zWLcIyXm@pE(by_-^N=%6i@HL~3{Akle46Q!!Y-BCJXV%XaKk(gy`;)Y&h zyd4${OJZM8AO-J!%pFXck^(1dhSQ5Gv7Q@9dIb2>c8@aq3^_tmFAFG_jqL&9C zZC5P$VgH2PjT{46P>~*4a}r8H6V!uFU@$KR|4kcU8?A+LTM(Zr3MHap^ffkeUpK6~ zvIMSjoUp8;qVOcbi@#0W41TJy@H%KEl}_tn9ZLf7uV^~`sj{0V#p;rmchbqquTj>_@4icDs4=s`4@`VxMfjfQSW|yo^pu2 z;;ar{+{}M4OAu>I6-{~B9VGqgTs&bZjn~XInP;)4I7zLSZn#%MH_ZXu#EPT!fpxH7 zl1KieyV7{kan{E=kR~%+|#D_Z$=W2czKdEvI|Z{9HEX?;ke6=$Gn)Ni8TxN!kUw* z1GUS+^N>S}C$W1BeZJNju7cM zeCan2#^n6?!M{}NgsZH3a&^0M~E32DMtRKuU%Oy<3H`q2fH#ay5!$AuE94 zF#k zcuaY9sA)WnG~J2A)Atncy2SxTw`?7F9XEmPd+tK#lX`r==qssP7J)+hjd`x7gS0<+ z8yx+43GZlm(=bb2+8N~v8@9_gssz?>gtT`=*;60QWn#Hp-Eulz=^dRsz6HC^%0e6y z!X7gOP!w1IiVFl`zKsd)yC(%J29j{QP&|koJ`LU1b)e*D1uOF12WLda@S|MAFg!Yy zob&8v)aNThXW2FKTh*DdofL#S^Cv;_3tvoou#!x+05p?c2HBFuT&JiOEp1}ZbleHt z2fj4KInP0(gL6SZ!Hx{Po`t?lHhfc$M(^xdG_TN=V>EF+p`%9_gLr9R?wz7bX9nSy ziWj89z>jw;_Or>)lp^S>(>AbVaPii%WdYUE5f zW0OW!Eo>rw-D`=zaVey{)5O5%p%7y{0oxcbszLoKMiWV%}xm z((YN%GVBXaMJn)gayK0d_T{>O=W&^)A@Cph;e4ZUvNW@ZcO!2FWRCVjh0HqWmX(B8 zVnU5Kc0Zyj-xrfx(H}WCT`GO)c@}lNoT=gBMHsYQoBGAvpfhfya?i1FrXrd14D9ek z&+jr=?Gp^S{h#2mTfNDP4fjEJ^E=3Rkj1PQuc1z3@$~KPoy=ZmF8{flyW{L&A)a$L z*?Jd(ut+r8d{W0Ieh!exh0MX)81hAjhyKToG)%YAqZ$kR=>BhE@H}i5GtK)X%*l7d z!ntyww$c_8vh}&M&OH$2?*|c^|7d)4Eckyiqq#L6#JWQYEW?&!`s4r{InfF|7zIZz zJs?*tR>7C~X>`3^4@vo*$J~&cis|b<)0qpC*u>}hcxE`B;{t2IoWuyw{^$g|-(*1O z=FJ#?r4YXBn80s4c}Un%#`E=cWO|FMFnZxB9Msby-L3H?({&!$W*;Vs8(VO9*efPQ zqYUm?#-Z6;8~Xdq6%0_FL6^8^!?BLdC?&Qa!xkt^ttcpD3wUlQ5v zP9W)U41Y@Wkc;c3$xMSjs=GTFS{6*fZG3xrM*bp9x^)Sr%qk|8%lz<1@K(6ydyaNa zcP2weWx-TY4qcKYQOs-_?iMMAAk(X;Hm8aixgkn~Euv^{u|7`NB9H6j&auVK-Z*X6 zHd@h;h0mkg@JZ1ZTEMYcmc^{b{|@ZO8NHjx%Lftj z$4J(YE`;>{N3?#&(1Dsks^)!{hMu?xNmr+1Y3m4k{Bs;gy^&Q#9~U^-l* zYI!%QG?z7%{BRbBCnnR>ZbjO>`w6P8w4_T!wqV`LI+$jziFGv=Sl_3~v0-n)uFsNS zva6Fw_otGfL;-xVVjjHd9B0MVH$ve2b&yk8PgU24pwRPbSTkSCRMYJP;X7B*xJPlg zvVe!uqAjFh!8iEtAi=iJdSrNGF)%tKwCrU%&+YVUY`td+o0NRXoLoz^a~H;EQ=YZL_}!3-&kCeeHtemr@?E zS}k-&<{4C0m%+V_qp)vkJC}EROWv1H#!o-b@=Hw_(7Rni@&y&p%zpwr)V$3-yT_@@ zC=YdZzNEUR&yp@{K#W-#NimgRjyLvEoBRw2)IJF&QME)eR=ROT_k9vo zosX(ZuaT7<(ZJb`ph(*V94B;8x+;cN2l7C2fjb;>tAWhQ12ARJYI8vLALi4Z?Bjqbj+1w0%}T#Kp~$_9l4B` zyac%SfjTQMR!vv@W;l&i5o zEEDG*)&aeYQL@2hF?(~su;E;#C!BC}gM+izFgrA3!Q@&zu*OlKKCVg?Oq209o6Jm8 ztE2lOgke-~2ev*~Pv*3CqNmq!yxB0w{Kzb3?DW<_csrr;;h}gstbuOmlc3Lg4~$#0QQOZk*kiHtcHsV6d&p&t+yqae@-FfMvpBR z4FtoKdhwXE3!OjiMa5*IaLRB>|HZdPwyQkxzQwQ-(oQhxm zoMjs|lc|MA16koXOdOix!G9N@+!AIvmPrBeR~E%L`KdIw{V392H{{(oO4V)hn7LI* z)ejxSb6d}|c6%O^-T@1S&0Y^j+fTzYMPZa4F{Qcd@}XBI5AjD?sK{h1wxH%O(JBi278mMzpy>W^hy`NED6=Xw;JY?A4cnLC-$?GdQ{V-ZTv*#d{h+sU%FP%^WNy$B_b@2p~V8vxfq7L((hbLhlm%E=k5KMw6FQ=9I4jdEh9Sv=- z$HyZB)P$Qe*kAF7gy=dVVHO8LOd}yjD^TQ6HqjGhV3ON2{(+f!Z22WKG+Da>tG25% zb9&#=)zU{HgLj)e6PeTKuKWP|HjA06knSn#XJh*43)ttlz=^`iN} z`xgeXtxG|7Q5;zo@s>3jmB8=6UlQ9@$LRhnW31h`1D9`l$RkUgc^Vyy;7jfX2(OJ~ z4m|jbDG!wK-s@fXL~1hnhMuBpayS-v=_ozRFtl~f5E0;JU4J&Ig7lw6RI(K#1~cVQ z;?ffmb+Uz(I&={S7yczzb}DdtB!5^`Kau1QT7urTZ){kBE!4l;MkZ+RvC3Ww9|6}h zusM&xSq5~?j_cIwU;)i|vx0i;v;)zoPSR$qfU6(m!`{8&_;mLyuzPeGmxxF)I;)=3 z2|fZ$oqZ^kQl5=3e6E0#SQz6|ycNXfIKlbK7u5XiJrXBY1b1xHsKV1H)XS}k@SLN# z%-B}=ykR5!YfGl)Ur)fR&n9STv5Us%oT2_Tujp-8b8OjQ1Rquj;@=?=koBAh%!_bh zH>8EO@4wO4=gQD&>=Nk8QvRQ_uh4XCC(f3chDvjsFmOZy*JPbWoq5J6`_Y%Egf!5~ zsS4crz66S@3UHzCd**Kb4KhzE93GudgJFekrt#PXa8kLa-rtRb8hFb7QEN-a|&Wr-6Rcd;=%<+(ehRJK)QgyHs0e0h#w= z3K$Nx;+p;{^h=omnp<~cXzK=OnjM9i=Qe}>x`nV_q6dTvX2IsmhX9Q=pzFhBaQW6m z{_gopi~n=Nzq!+(=a~}sTcz;i{ddy$vkim$Gl)+~8kxV~D{Z*P(j=XFc1k&mE~m30 zvzqJR))%ueyS+`;K?CcPa~%%w-`3cDqG8HjDlftG>UxJGvoF8#3$?Tr7! z4c*qfI})40Q!E+-ehHvb`Ahh)A`X^ioX05wXUI(>WhQ<1E8K2A3$9cq@e6GoVPQZ$ zZ>?D~8yT?(eCulPThn%QiYy~3poX`H)OeMO9wZ-eUGB9^)yU9f1bP$-nmwwwY%AOP9_|liSUh{fMRyt*J zqfu=KZ}m-M4Aq#A|IJZ@{vYL_G(FVBc8fpgcgCP}&04HJ)=8G03nazOceq}QGK5W= zf<47|n5>0a?AU``DAW)F!)5Y#X7UqeLQ_3feV3!Q&PjOe+G0ql*^V`{-DvzSJ~V_p zLbbn-$&H_-@FYOh^t*5;?%nW#*F7Z_+A2!v2q>BEV>n)xHIV-MSzsV5i(VWj`TEBt z7=G?9sr{-21s}$kIN27cT(SX{aNeXgQx9H!>sfr^R{^3w`BX+m2yKco(Br{O&`q?Z z!t^}K{`y3mYK>4DOzGE;hsm57{=j+)!GW#O*d&wzdUeleYv_4!)SQ8WYf5R6R3n)0 zQiK^27Xat(pu5tNY44rcXf^E~l@oYJ>u>4uK3acg4tgtrW#n^wZnXq%Pf>=J+9s2^ z?PIiOSe&o0pq`OA8;-^+7+8MA4hKclakpL+nx8q2{X(Z;)e`PA%Zz42_8G#{NoydW za~3SAa>T|qXL?vj0Qx_3Iqiq~aNTbk^w~`$Gv>?%=dGTw*T9~zVJ&pyt9Z&g^9UQb zGrL@@3c8Mqp#I5RsNye&H#1aF>zy`ykZ&O_7HKq4E}NA;^NBtSNP%WMD9aY7k_brH(fClhcj#V~#ft=!fMB5@+7SAO&H$nae7tz7^g$$X|X;|^A| zx{<>Z4Y15-9$fmZ3%xoQ*f4h?NZOfz>y1ocBw#*wS8ryYxh;XAw_FzF(iM1rIgI&I zSVrv9?YX&^E=enM0~=diJm$OuEf$=|-CSN}p^p`RvJv-Awq_IIG%me9fj9B~7IxaVY`WsrF0Px*`Po-#!_@=N zaL?FvytUE`+qsPCOkpv$>)?L;T>6rhep(9b3Qc-5MTPlI&caV`clhDI0|T%7(Gyo! zaiG^9cxK*iNNjs*>m2i6`L{tyeA=aknWS@a<1AHY!8Z}L1`=oyZNB% z;S%QUrQP(Q-!4XkM^MVCg@6Y4{zf@sb)t_dZ@5dlO!<&9nR7@Psxpv$ zH^@D)A~^~iZ?sPd|4MEL->c2=-<&k;?%>Y2m*S{Uo(QWuc{QX4DUvpmDzF~AM|t|w zFxyuL|EYPh)=^RP^N+P;d)Ob6wcZh;-%aNIBc&k!hjWm|sKC?8^$s(0Ji|T$or7lLduz zX#Qz#CzK8u^V+DvNvTnTee$Aj|I5;IHxZsGXUCdDTK}*We6PzV8kDXJvx&j3QS1 zVgoRSpNOct6+GfKkfwwrn0_gpeYn6C-RCWV+5W=h^l2qnFkuU+)AJzbxc>Ceu^rGj zGG4H?cp*0H2#EP1ZTwaJl%_O=z|_%XDC#W3G0_09J}-BV7R&tCj1uYtjvUHCmCwY^|;iE$Man6pAu1} zFI2iM1RmY_!iMRIf%wRH=5eGK^Q_gDxhqkERgIZsf_4jSlIzDq4bnth^$S@)-wOBn zOJH1?HJXPVXX-gNlw?8=y%TtwY2Eo2CO>~cgH#l8+wL3GwO*e)%Nj7MKkD&BOC(*o z^ElJ;TN3)Rq&Z%_32c>}4&56b!RQ}z@R%M!_7<AAJGAqKbQ-7y6Dt}2A zuiZ2jXs(ndD<4<0x9+Q=;v|HMy7;i+I!l`nL*j)xeI z6PohF5pr*)fZ%O5Nl&^(?9Ls*o4y&eNqG;svQve$nu!a3>{lQ>sgtDofE$=ZbG_sv zN!(|0hbAeC(kYNxRt@pZ?kKbW z7c-`lNp014(t~#=K|+}*9pEXlQ)i3u`-(HMS#c%YilBpoiD|K*BekE<#AVb}_9-i}N37pAWL63jh0HW9D zL;H4phWVH80bQ%Xf*4+f{nc;V^kLBunzW zgrGX`IlZULlGF!-j83p9*KKkD>3`E;iDf=QGnehk! zBz6jPzFmgt&XFh`w-QZ-Wx(m7Iu-p{jT_QVvkw0qz{0Dkq(9mY982fZT?OOe+>!<0 zwJ?+PJaWZjb@l8mHI9F>cLACvWI)w7b?mHMPUbb7#u^DZW4*>p&5Pfzfn5{I$g0He z%w@S`EUO4+C9>CJi!lK)Cvi*~-%5r(szBeT0(bt~1WEZ^_IqyvwM%;o7Sgl9>YW-j z(ppE1aT~Wgeolpo+F_z`0-F79W>zQdF$!Dej<>GX5zb5t_Nale(?Y=O=W^IX!{})X ze-N3FN1hcnb92N`GU%EGyNP<<>)h4 zmQ?#o!m&XG(kkLbSA}1M*gJoWXHHcC(V{N;BkvwGa(CWR4}Bqd)I?xawg}JYjf3C2 zB*E138r9?GPBYQzL}x<+_S~NWvphY~V?qNiu?oix9r0{Qw1waxo5mUrJY@G{C{~nQ zq)T@6P~Y6wBy-FhZ#L({mgMnpO4=HI>t|xRRw-JaenviJr=Yo_3sJSchK85dfloTa zjz(%i%)?$Hw{*PV^=3lduZ580uOlQ?>IwV|S%>P}9I|lSI9QoJ6Q)=1hVdNBQ@W>s z#2og4qc7HRTsmQ>UsS|+omkKOb6o|Y6Wj3tm)EZHy#XCOGq9QJ2EjSCm}&A3nWO}| z&!&TAkE0 zr(6SI?E-r;u<#+qJ~jjsjy+oHq6@a7XUUvdv8cG?BW>)sPTs!=r49D-B>tNW`Pbh; zB7cmMVApySvggtL*Rz?;BXhxjp*yvH@sZry9Ye0}s3IZ1lR)F3Kc;JFKuhI4(AaFl z{JgM@V=?Ek!8DVVSyBc&e;Ly-TU-1!WC$$-FUg#nBG4b*O0)_V(2HItu-It^waIaS zU(pPi`79syk2%7v)D$StvBQM0Vz^bf9uCAy;bXsx(00!TKT2`u?GH*gI3mu-yI8`M zW)Z=md0)uZ9y9#5SOs>Zlw-=%VEi1aO(ZOjFy*S8hqFPIBpz;~3;VL+pM4~pyqwy6 zQ|Jhqjdw)-(xvpLngcyN=_J0~K1Q6UaXcMyaY*4ZuPgVIAUvz3Um=NBWmU1(k5AFR z^8KWA|2oWzBFsoPqCs*GkH=B-Q z!RddnPAds21t-|UNo%23LmXP}oTPW=ekUC+S!nt~96vdW!Vj8+t`ZZ`a$F7$PoIkKRgU4n3rWEV;AH)G2$R?@S3%OEDtXzV4?-7T%#}57dGiGZ(8>y{YJH2f{b8 zfMTO4uvVLim${6($)P9I;KEN@@lpZYeME7Z_A)kiUK`YEo@a`i%`xu2A3tMB3^Vzg z799;#gr2bynExmT&4s(@S&uOK+jy7^IJ99W?ZMQtAWRWT1d&m0_tt!Z7QQ)5|7c&s z%c|4(a>6Ib3y#4e5#oaNZfB`~`WXGAxr`?E?uP#yjPTDsX&RY15nip0C$1cyyTgW3 zv$kO{$TflM#wzqe=Pc|LT}2io6_A5gkpxs7a8-H-6%F3TZhW?!1WDY26`S`^lgVhQmT5HzL5!0&Cx^ArxL&~OQG%Ozmb_iy-R zW7An0pId<~UCO+Ojb0c$uZS>$A!0r*+PLhQJaTPTw0$+68dTKLKLyp;?Ve zA2nM2iwDK+B1E9N8>2KAKvQZi38*fCd49V1)%hic2u}g4w~qMh#cOtCQX^^E9}WD+ z;&4-YgtVkbqwaeF)v>H2CRRmoRpKZ-G`~VGrweG;Vq=(HZOS*`i3m1S#n4cW(>yd} zgF|K;QCoW-YF3m$lihPNbh-(1yv|X5^;vi{$Oojw&m%ON;iH+t>}y{kP@P-Oq^&c; zwa)T*`Cuhc|JqFqsvg0$1#aLlaW_-W~6xif85`&07xh#!(eQncmj1HQDaANgAS4u|6GAWb2L@*l{- z$mS*J*l2)lic6qwC>L}ts^H-UM7fG`T=7K?{t21F-h?J-yt#^A+$ANb?^{5QV<}OM z7=X`{lVH}YD~!p`SoHl9O-*K16Y0lAsBV`>Y){W7e>3$l{evmaQoT;ybH35Nr6-yG zzXuuZfDo7*b&E>QnU67(CxBkDHuz7TLT`lEvmzej1hU4@NsHlYYScTA^vf+`!#`L- zrrZeAoSK0R;#TO#mmn_J!$3uj^Rqi&K{0hnoMc-;RKM0ivBxK}>sul@v2F?&sEjb8 zJ2pe2Cp(buAH$vT}6gpGO4L^tEz_y6Pg?oNf2Z?sN0%FX;JSO452nJ;ZUGr*_nh5f+eoV?9>yYC!$$ljVC<(# z8o3O4e^CLe$V>sF(`IgP~zQQK_kwOQChglbD$Qf$}Hos_R><=rTW#b00 zQ;31Y7qReuUn2={)Wj!~{n%|$|MB0uti~ln{Y>kfOL!n?p1`}XmLK5B-IZlsfQab3 zv@A?YaINPEx?U@10=!@08He@cap7e$M!DJ8r+)kLnFgDxZoD98n^)`Ed8lqy&09^g`mm4E~*_X2}7$skXgUS$TxF&Y;o8DsZJ@} zJ!LboRZ7F@MNb*=uxI4xOjW$KMguFac)*&gfcI*%@b`n8_%-Y>JW3A*MKwg&&_MdkxwU>{@wL-HHio7 z&0a7wA29M{0(rLT8HRgZ$7K>V_&RwicjnE(Egt7!2gmv8Ybe0n{RasIJR$q*A?a8lbnSKEka2%0EI$!9;ibbHH&Am4lWpej2 zE_9gbz~i4Sp`wt>OodAFj;3akqmM3NT+=IhpgRf0<^|H7mE!m+DgZ*3ynziBdDM0B zeF(pQgU)`Vg&$|^r#x+MIIq2%{pagLX5I)PBX^$Q#>cYwa?dd|-)Tl7W+GmFZv$GT zafFq;jf28f%yp^TWN_&+C?a{-D=UdNKHWfz-Ojks?Is4;R)WRX1X2+k#rP;A`5HEz z7ajAL#BQ7pPd>Pif3uC?^mW@>Nlr4h14GnhBBzi5&(fUgR#NJFNkNv8QkM)E*q?in*-W_xi59!ml^T4L(5@>wVz{_Rj_`>Wq zHJrGFO+(~k&ejFAww}av7MEY{W4|4o~IlTM#9dmoU zNuGfg+;QPPza=YZ{)7Vh=*SuBu}(m}FG=D9)qQZHM;-Cr2e{>)M@=4AV_&`;$lf=D zr4^g#GN+N|&tJoEPh%>o6zbxC^KL@M{hbgs<^h!htNHx4QbwzC8t8i;LHC5`R1n=s zEu!X-$ioM*B~cf=K5%ZYmc?j$CywUUByu~=2~f4)5JrF9fb&t(u;t${pLVYWSL1kQ zQ%?XYyYGcxm4@`A!bv(#aVr_WdWAr~Q_necuaT^xehk&Qf<;dYn9-Pewu&63O+B~Bo+nbctkD1_ z#Z}XLz7;S*;tEQMM#8!Ic67DOaj=yH2;A=gM!s!q0pr6(qDuhZyJFh=KK6}A1a6V& zZCbMF1i4&)nSOh6l+WWh=s{a_K&&>3F8$rZ-}tkN8b5VLn`vh#{hY~6eCNnaP~C_j zhv%TYeRLU(93v%;CfKY!Nis>PJ`g>_YwW3-rbAL~L;%q`a^H==;Ds zG)(<9x-wNv+tpUQ`Sb`zxi~}n`3r=|{YNHMCDI$`Cks}-+(YZRS>A{KBK2IiBUL9J zCoEOx+$rCU8~gvz-HIt-a^M!DA~6G7){Tsqa&10L%-_!*J?CdUU64d~xTTUPg(mV$ z=QHSJyrHI-pEhmca=f2H#7TSA8<_skkKFKl0LK`4bTW=WZ-}IOf7j8=lSN2t!2?>i zVuEp1SR14;dY>3XTVl3wQ(@QQz@O1_OEsbXC5PBHbT%C+@ zUu#j{YJ~sP#R1Q$l#}11Cb;t6MqFwu%DbW2LE0|$x) ztV)n+REN67bu`4x2^ZxxfMTF8Uf%0V1ar*6*k&OeEJL7rrMx9@PtXIK#{Z-yb_7r5Oo6(q`f%|?1DU$U6`yil zsW$HvQqS#DEhCq5J79TyBzJUvA-b&`4;JH^NwSMM zl#Xj`SE#TA(lm6(oBBB3X=-Nr1)~uc_9RVmM>F0M0$h!{b7u{B0NPp??U_ zarIvQ-Jvp8XZj;(J()$KoUg)n&xzn1qQ>Jbs-VMDZ&RD;z0F@uUBK-1DX45*3-36G z(1O07bb>SIGI3c1(bpH?-%p09(s!G5^_VlK3T@~U(+P0&;}?eQiNf@p8VnBY2hKW= zKAo5G%0w-gE>T6tvORIU3LisW>e2#rBZyzUmdv^Pm96bu4-b>`X{O~K+%(2{3hLH? z`k~2!GgoGUzUm$FHM7yG`kIXOF3cS`AKk1`vgdb4wH{}7vPQAMf?{f(}5|UN*o`TgWB6@ zCiLAZGz)T}<^Nej^*9goI?TtVOVc6La0lFSZRcEW06RYp(2qN=qO{%~d|u-Nu?IK8 z?yOe)Ihsf7z6~=QxGvYXRhv+GG#jF%wBYxFEV(?OY+Oshc=n$7qKE8_Zz(&ZIk zHSm*>pJ+s!Zym$QIgZdSBgu?7RD+D~3Yt@QjMN!=V`WAvangz5dNEbZ`n54+;kbKv zU_=EiTjY3M!pXSEegYn{QKH`*9bm#AIjEF$2eZ}!99CYA?P`{|_1I(M22&BV;Qb)d zq1pK9_*COt`aY0+FO)70Oa-4G7fF`6I7~@Bj#r)uL6)36ez!=)@QDZUq?|ISl$^yg zTB-FYt;Q{3bHLWFilhsqA@R`++=>O7kKSQCaX z%tfee27_j9@4C zf0^#0l5JJsJ^ll+`eu#?X&!uW)B+iBC92m_uy%(sMh{+wZ=)sfb9x$j=3Qh}_9hd< z2OVUAzr3|~2m9PLz~qw%e@w&Vry+au|3 zJ1cb6s)gEV5>VV|1Y<|#&~xu*SfqQ7b`Q(oWRX{JyJt6jenuRX?s|jr^t;4uXemB- zRKa=~d7?8p4kVPek%px$u<}*|@f9;e!6Z{^q7y=+S{1P+VFhNotKh22PAU=kkTnSV zNgTJlrb!vbsH?sb&wN{m-}xefrz!q;yF=F;mb6KfnDM=_QeA^+&Cu{cD?xzNeP1yde7Mz!`Eqe`USY?-cQn4w>Z&phbEX?H@3W?|Ia>li6gEOw<4KrqCqV`WOW{y2!DX%j zW-LP+S6A)Cl)S61>4|C+5-$y`apha?_pzHR+IdU&SkaT*U@v1H!gBf!+n0yxTS$( z?<`V8_t%ba^86-zaormH#HQo8H!tZ-!@XE}@e*lD`AUNAzLD!SwJ3M)6P>tlJ1VsA zCB+M+!S8Y_S@A^=ozo3*xmP;$`}?C~{bFc6VuZaauV{7jes=w(dI)xxN8mCd#YqkH zPM8FHTV)y4?|aBPo?nUE6Jo%S&1a5wbU|w5BNBRoJFibEqMZXbdsVmm!8HM+YgsIY%TO zd}cSvs6&shB$gXx(Onk1L1CXAtbZ6mzW=^Q=3f=YT;DCYUrvBjTmV~|#+V^4Ga{^; z#lKm}@!n=mf-tDTyS6hN(iqefsB|qG5^io4Ws4q z7&7q}6?HfRk8ew1{kBN7X#Ph+^e(a6Wb7ezj+)UNbxULCKyIhIvyNF;q=f8MP3E(3 zD5ig+B&#tSH)d==_0$1!LEVeFd#e!5%!A3gfgv{iMIUHcX~U%b4fLqiR5H?mSo9!~ z7*_g2pt}stYhMGm3x;90p%ES5EQu5Dou|76M{)C*u;8WcL99M@3=Mo@V7TcpG@i}C zzBya4@T~$=#EXH7X&UD@;@DdcUC5~|_2h^4L~1>|n|5TGAoFSkY*AH%Vd-)B``moo zOSi+h&EnAewwfH>e})T<9mBArdKkL92&}Uu;f|jc^p@}8{JKf_!@iXrn$<&7f3&l< z(zCgIpa+_ErQoS0y7;%H4L2`yVbd+8ztB|K=h4JQzY+dj%_RorcpqKQQtnZ1(Y0CnMS<41y-Iy%R+;JA( zn{a%DdF@R1#%$cdtDFPbm7xn+-==asJat;jvEmk={=q6f z0XQ5OL~OojlJmY(;Dqx^kkvvA@t%sA3vZx)ksdiZ#h!ev7$sS$98 zFe{van`MJc;;onTaFqc2435F?o-}OCUdnFwvVipTZs^FC0g)y=27;;F6lX~3!dlGzqwkIv<)(BaE9%2(B4{Mz|AW9bfj5;Pm9Upz-kdpRbkS`I#w*oqr% zMNoCV2uQs8NBM7haoc$wm)WX9p5HX|7UNhT))$ycr-$TT(0-D(;URsj6al(xH=()F zDz@MJ1!>AUO4swbj$_3ZI4}N|dAQdEQgeBrZk7RYnhXg{o=wZgU4))GVV<1w0T8ss z0ac5^+Aj(iex;UPnzR~@R@I^L>{X;&VJ01?KM$OK9cG?F1qQ21bJ_nyBDwzxUKYFs zb-#n?a<&@xA5#W!D5oFhugBWRt8n)4PSP5*lqd}6Gh#h+AfKSD>k7rt7g-W&%dLRT`PVM(}MwS z2efp&13cI|6Ww-nW5^;I>hZCNbT5^{z&oe#CHHJvCT>TybsK5hEp-s**}@Tn7o^`i z0+hGk2g!-C)Mm|X8a?$rz3O|4E*-3(HVT(XOKTp;{h1EF7I$g%rE82HzXMIrT0sL+ z6t-9o2`L;Lrdp9L6z&GKwDH7I;EZqW_Q0*buApvhO-j|i((k%Eh-%^rDBpdUe%joC zew!TC66Hd9$GL^&G4&Nm819{B^X;KOxwIuasR?cFtRQdH@HlN1)(zJ&D?0> z?vp@v4HlBKE-geZ)&><$k4MeQ!yMBf7BeSo!uxZD(A>j;7L{BeirZfhf2|W_&7Acp z;>42GebwZg@gLUQ>@N|MSq__&UV{qV^SR> zBrxH-J(*5Iz8xY%)BUg_#se=|%);Yc>maa&he~SQeEOYF>TiA|%+zrh=g!T0Jw6yN zJsHbfHDO)+DmZrIId?`FATIurye->KQPJi!jvf7wI`oVuryDs|$gR($bj4KIZnz7i z_a9+bNh=W6Mc#Px)C`&!{fn z=aXhri{=9`puP|^xqkK*Mil&4+2E$7Ep+*><+T3Jb&ks-jze5l<7-g|eY7r>`5trx z)`=WiYiaRDG$nt+~xHk@?;%|-{AV~g%8-RM#P& zx^x)Q%9<%`$mlc1V8bcW=vmLIM0zj<)p4y=_h z-FH=h94VjnTifdEnYv7+N1%xzqg~+njCsn zM+tn(`oV!Opo@xc8V_Dt4?QDOjIFJtanj1YV4drMf5c8R`X4;0$CCu&GGqfwS8IZN z!!25&{gxKr>mjnb69gOXPk_lTW2E!H9oW4f9nD@{LH)v~TOY!xUoz+0ibrAZKq6Z4AI+Ql zl}#^crGv}Gh^DU?wu)Y2Znrvu(}}A@Pjd~im={JHYfH%cqoy>>FoUQ^G{WmHWg_eD zMjf}#hua(vbaL)6%zU?=SUb*w0DmFsckT|>v^hfI_7rmM#sPe?D+T0Nd?%HcqCvaG zh~$V)<$OVIxc=5+DwoxVJAyd%#s8S1yK!83H)TNfTi~wG5nbVqoU1l)!J|2}9oB)0Eg~ZG56kh$VN%eKqAdCAQ45aNi&gm?a zpHs#gt+IH)Pnx{?Xo76eVRlHLV}Z`rNBM~on0vpUuH(3ki(H?Q2VWL|rl%q4p1zbW zJ1YgOzacqt%aBFiKB#$j$aq5BVH$S$4@lYnq-sET zgI5A^%yNuQY!guX7thH~@f`M&X({nJ+Lm_nDEF2ct-)8I-+87k*klB%Zh`0|M~xN@2Bs#q7OP&$fz zQo=m<2p5vXIW$j)9l-48ms#D7R)TvQy|~{}6LKve3VSnys8h>7>h~*?M!t-rQ?*>N zKPv`LZjB>4XKle_To0S0Ey=r^^ON$dM3_P`A%&^&d>`lyg^gTjBNV-mFNYvLcro!I_Iz-BiSQFHgU|2 zWUn#|;LHX+ekhZ%Dd-i@r8BA*&TvqiV!k>T)KZy)gKYfBM=A>`pVLS|YF5 zSLx!|oiPL43)0DldSq)(8IUcVRS+h;iF!&a(XqI@@SFSJ#tctEtL#51;FRO$MZjK(8``Znjd?O%;ue;pEIW6Sq(i5R-8vZuXsc*{B4C3Hp%ef zS`=}j+X-02;S@;&`dvAfD*hZ~^HgG?;loLs-X#R`;xX{HIhu$nsA0?@Yxr`JkkI-; z_SmL4BI-AZ_u@baWBFE$_cZMfY3psqvWQmvVS9ufm+48iZJkYgemmjbO(xh_$$;3v zX`&wN2G7P;VI8xF^m3hkjaU^L;VB2OO$6h$jij6rEx6*=|TgUW9g6~wFx!0^ir zO!QYZkj+ShS-l>(Oh^mwy-UC!c`I<&InL#&kNE9^Jx+?b!t$IcXwAyQ|Msl|*gOSe zPX^%pmB(QHrYd-xc^O+u0!?Q{>qUPh6>}0{8y%z%-Nd27JlpPs=(%cW>WA!j3wT zfFIBC$Y~$gE6lRF_v)elT@4)H;l)33Ucz>RLjTP9G)w{zxpe@29`)Q)%#bae=dL4s@t-K1Z%|X4za176BDxaGEvn zPPjpB)dkYk^pS?dTqGgmqHt!9KCnH~5Pm>FvSZ`XJ>n0H9-55nojUlvH=g4gUO#)W zmV4L!5Qc-F9N@a!C#wC*1Q%#dhUt&Bs83)nExtGat$z>E1Kf^zMQaW{Q`JkvE$iWL z1h@a2wgG0VM}xD&Q5c$p^tYvmwS%n@@^HRca*!=;HhGsas&jJQEo4n1L14>h`v`g-7V%y z6))+5(yUrY>(~!L9Z^)(I18RwCbLTm9uQTf_w;Bc-P%zcHRZPM5N4o1v=c5jp3Q1m8nuVMO6;W;A^q zQT`K)xx!-P{`C}0_2WZ!yA2(EBhUFg6LDXB0P&EWgA)agxMHUPH3?jZSzD)~;yiQM z=A1=#1fPbkej(cSX@s7d@B)@dK7+9bFVOw&2E4HUFWotCijKUwhH})S@N6fBZZJ)yTSqK2v(f`n?4Y)AiIh~ImgW)+^Ic} z*3Y!4iisS)WS1~6l!bu^W#GTzY8t94gYT?M$@r6#;Q1R+N)q6fUn%@T| zJ@?@g-wmcbQRCf`K1(hYnnK8{&!BMd7LK-GA;Lc8;Kb!jOPha!uX+;{S-d81f)dEY zL*oVUi^fPxT`dU=IEl7Ty78{0Bb->3ji=Tmljk`S)Y*L&IUvIzf6WY>Rs$0SM1cUB$(zLBja5>2q zZOvGk7is*MOf;D(d)hIkU!7==9G9V@BpP_CwZS z0ScHk@j8teC?wkoK9KYebI~;M1B9m~VsA)9^VzgwxZu!B%{jO5%|j#T5wHdxdP#zz z-w!H$)ebgt*+8KYY2Fu=A8!5M(kB5dBx;oSWhgBZ2w~9^3$)GH9V?r)4k3)eclt@!% z4-?Jly+r0pJL)OQ8e@|V(G1#;$sZzNkaJTn-LMmQ1$o{@u^uL0CRSCTHS3uLOT z7J$^dEhzRi8bcbZp{XR2F*ZF8A@-#(@!@;w=u(Ea)oj5>TL$K=X~2=JbQ(Ipp4Eya_tSzd7^BMW{z`;^@ zknx(z{c9knYMPodEY`s1(SLNIVIw_#GKnlM8>D__p>+M{KkSZzK%h5YlFzPO?^9_6 zL+|;~fK5>})!-InC0fEFjedGxcq%+9lEl5qo6)#)B_{0cCgjyw!k_UL@?KBFb&1#5 zU;X8{x$6QM*>N0#trDQ&yB=)ZD+}K>mf-A<6X8+8JJvOK9CSPcntQ{OI$xH6l-~;E z$EQb3p2K^d?QwGbR;dWiOwx}Ny>+0X!e%?JUnoa8i%|g z5#tgWW8ngf+LOah*U}V}$X1}|s0e;YenHpFF(bDnhDcf2Y={~d4;%U{AdqwAnLfTr zje2CU@aqht3E`hvhbc~U*OSk5b3`8SSK5L54bIbEAw?3?YZ=#XMkrYDf<*XcHqU;w z871T5(eMHHcWzqDW&9M$tK~Hu!_OZVhH-8m9UG1(1u*$kA!^jzMFpEuy3@afxl$^G z%`-jVVpA-AIvNTZZ%T2>*m$gaoca2i=Dlho>5FXOS$Qa2Mn<9{<|pxSg-dUV~Oxomd0nU!%=w& zI@BhGd;4lwg9>@5PJ9me;#**!)i^lvc?I-jD$(h4&odSuPf*7kZI~9A$f&iqV0c_C zF^J*35QhO5c&?!);|lTJw@%`yK2b1~0fuW!jYz@$Z6MwyEATy5h^uX)>5#==zI~NE zT-w6ji%p$OEnS>Rnw0}q&-*}TgdPKp$tB?U)1HXeD3X&d=_n$WMmr-@X+=;!f6Bp8 zW|j0B+W(jHeiRAtUz`!D4{BiH)<~)%ngaI>o)|m0?Lg6i%~a7^84_PQLCyj<%BwpJ zKUN(_6C-1CumGr}nK-_cH zmg6t$;b@!{sqI}sbCU3WQq{~kZig}V=DxAb<>LfDLM~-D&IGb z%gD@#M41^Svr;(EeVwR?_CQOB(oz~k`d0Rq(Lj{!5g~;0+?O;+QYl&@q@5%U4dwUz z{sAxN^*ZOd@8`NcpZEJ@F7)|rh8kWIhNSK%e-&fMJYQ#cX*x}ClYfJL(jBES;a};{ zq1|Bd=NtL;dJB5YwMGxA9pr8)clYPM%K;-p&~jIwI9;j6gVeD8lLz-cSh9jvcomT& z>bBTzqXN3;4nf?(-{irYbKw7K9c;hB?PbDSIiGJF&rRtoB_86mHg9~r$j|c_yz&w= z@!EK}I;hLHE(w5rKE=emd^u*SE`r~qQ7~}2j3nx~!{%@5u>YVE(P!?`7jv({q=L(2 zd)8J6*tr^&d&`Ob(_2g^=Vw*T;^y{NiFiq3Tz!h)Y_ht3JxZ7bf}osG1HC+YwO@){ zJ68&U7TPr6n>+r95CspP2V{bF2Yqw86&-&dDCDh2#byUkKRg$=P7B3x%TD0Ylx}=1 zUc}9&xqQRiM4~;;n@n19gK3&|3O=^3!S&9kSl>=UGH0G6kMHC_m|HA)ygmViCmSH` zc~%!~c!J6lzUJ8s2GN1~><8}~m1!K87rLsNMmDtSz!ZCHe0sx%zG$i=zn}QSz@Zzk(kc-a ze^!7MlTSjWV>fsWydb6jzR{a^c9Yb^{V>_b0QiS9*=j#KRJv0J&Y#Vx?u{@Ae0quI z%#~q>e%*$_<)L_{{|I{IA0?MJDDu@$9%6Hi?~}j>JTSG$fO*ST!`wuUL$-7QYb1OM zFP?SA?s?H@yDAU6y=M@&oM;S zYBjo@v&H=e?Iau(|`8StRGEcKVTOr&$enN;g`=IQlB{JKgS4s|S~zu5sY1Z(#zqrwj#RDG&JryMK7x4ZAcwYEvLLA(q!a`d>4 z&S&B`{W24lCy74{rRcN0-6XH(D;pu|3`L)o;gj8UbkVvorhLIfDj6sR5B$DczL~HT zfB!m5GzaZre{3KgIcP^o3;RJw|*x( z_1vlEo?pD*$F35)jwsqP{V=qG3p0E6T>O+-j$N4yUA(r9ePh(ZXdQh@?p3PdTA_(( z6nugH84ayFzfm1}g=W$0)J3$x@C$ji`#y}Eyh^r&noyUvSQ3!y3Wj&y(=iR|m!gfwb!0H0%?AIQXb(LO$B;jo#LD(cVbkur7@46r|(g5e+i;_v7s&OTcZ77cG0qqgRSTLHE`H6nNetTmDLc#*Aj# z_h%pEhDd?`wFqpxBZQWBuaKv|+)3eoJlx>320t4;XNA*e;K3{}x@^f`vO~B4QXSpc zY&=R74tA1$qb726(gDjerW3l8{yq@E^4)J&m;H}+HjgUd1@c;Xd&?(vRhulP>G&xMk{ zoinIdgE^#Us-h_wq-yQ5cx$=^49#&wlWUK_lMTZ%&Cm4k-Z87&mjqD^9d{X?oQ=lP+F6i!tp=;DJs|sUAok|mrhP{u@GSI!!Jcpw zJ97cbqUtbJA`v|7li{UdI>+2mB~PElkrmvz_<8vQYGE7&-Pb18cVGFz>T+DM4i!C8 z_1gpUE8dgAS*g6H!mIGZ;09(Mn}i$zcUjjHz7VfxS6>q zbC@0X*Coz+a}UaUh%RU6&6M+GJ4EywO{9Pi%84I-^ig8JMd>U=&1 zR2>h)l50RTvnjQHDoytWxYF-?O0h=eJ+=e{6W8+9DE>H?EY!4yb5RoY<9ZBn#tdDY z6cxwVDRMcgFR$p$Th^RsD;~X0h}N$+ki+-+;n*Hfit<~~m(l~Q3ngnQ*#HDr= ztxv$Xz7we8tcT(qX_zk|45we|kuR^6pu$I&<*CnM|3z+ukpgG7VL~!nXe>$QJyoIG z22{wtdpn87UoX5{+zg3#pHag-uZjLzLtHf?1%qqTVZ?*W1|FFXHBFU*lILn@FlRq3 zy;lpDm#n3!X$wI9(ji>@GZzixUz0_?3Y5x*lhU`wq)qn`Gq+@nbTxR9DXyx(xZWUL zDeK9E_eZd8sRrH`x%=U85nQ2Hqho#!mWz58tO>C0Vk^QIc- ze9uF{*NgDY1~9{DGtO$9g^FLaQSEptJ*9n^T#T}&iHsOc;25aJA0|`DmJZnJc7qIf zO@kx4DH!M?Pp6o~)3${NI4{ddtT_3GQf|g}?bI!}RJ)A*wdxYN^`U_L6O9CgiX@_H zw28MaQUpb;El|1L17;q}VSL~T>3epG>sC)DYj)1T(aB=<8p@)$_7_WK);@%4;ny@P zL4sJnsesA{_VmWTN&GD~Jp7q250{hQ3I5&`ftcHqaZSxb*fTu}mtHi$8yX|j^Kb`~ zX)49}dV1;1h2r#qbTq9iwTEuGc9dSs$HmHBIK{4#Jm)%?PVeIJ)JAXg7P7%!-&%}F z-7m27u0qX4Dp)_LNv`szqul8beECO`?96^jw){K*wqZ?uTtY!md8l+ym-zV zr9msR-V@DzU+DzNXkhYYL(PS9bo7cOW@~svYYJeFbr7i6BxB!M6G;3NKy}#~ax>#R z9QS?9j?+~Ikrlf@sAM}+vA~UK)SrvLBySSM+3h5vv4 zImOKopR)>BxUCs8&l`hs@;y2+LR}CNzZ{1Bf6xaVD{0uyyQFHr1S>poBJpOUaEZ`1 z_@ER?l@7nBi+Nqd@}ekNF)<%hcW=RcrAcJ-X&IPkas!tHiSfpK9Uy_bg}L+gk?!+% z1q)LiLck@0`NPuq>%}r+Uu;5~9u$C1^>$i%aRE`1izl7?&G6Z+nfT%zOa5{1rkNQ$ zxT(0E$VukGuw5QTUblvZ_#)-i4SDr`Hzrs%Qft>LI`W6(NTlwAr z9O}kU@xN~JSIiwxIM0PCLFH886GO8<%!A9GS82n)5;!ORmML*wL>1+c+DpYiDwnB_ zKS+pJxgCh~%>Xsc<=}9%f`nI#)SvzEfwbHBbA97TLHNup!3#B4xUzT~oE6C>7uWrw zHgUPcy<##>(OgfP9<3%SLJiD_(Q?*9(Gku&8^P^PA8ID<0iVa;CJQ~^(nBqWsYc~# zq8M6*88LT=>99OhZp*^;k_uqLvw#aC=gGD`m1HgFz5n<+47RPyAa}eT(2NR2TqX08 ze%~D^7`qt^CbufNK3_5u{ws*2^*zMK_*;nQW zE-%~ykGfXkXU(Zl{y?_=R!=kLKQE$+%TM!YSrjhZm5iqjMd6xOQ}WEn8D}2)$YtU- z;)kJWV6;=5<1m|Y`N`9C+{!V5Sjctqxtj*4wN#tGF_pa z>z~wK_y`ePU+@n1yS(zTmxN2k;rat5w8#B1Q_}Pd#TvJ>SB9@rEn!hMa+NN#so@=z zLKSNK=gg>FF+h$h4P%p@!5)WB2+>nQM^PhMImZQjx>{&r?F6_k69wPD4$=mf5o+Ht zl?FuBL4;TsT1x1!3!5E?hQT80X~=_=W&T`Gya~SkPJ_nspJeNQ(eNPtK2{~Rk;vum z;a8;?X2qLu92zdOZu^P)3~a!Y`_0M14Iim_-$%waARbe;MFO~qK`tqxzc%e8s}iDE zZJkrVb7`c*f?61On@-BID~a=pM8SI3P?%$vgL6V|6Cv9Mv`v!&v#+H%`(iL`u+xK` zmfZ6ClywjjjqHL_%8(2uj^QB^hos&0LxZZFm`uhm6~SH=p)!+ zS&3%~m$B#UEMPIWV|L#@2|se3go|IJ&_UM+y?Vd0vAjS`PyI}LwJxEXf-7vU^Mc4i z55VKoX#ezau+e^$>O>2nd7TghPjlv&?73ujofvpp%7SzLN4iC0C2o#Og6_^Fj#IM) z{{+q_IHR3p$vvT)X3WCzU2XVVG@5iA*9S@GG6;0CMdjV0G){dF*)>5LcjxYeP3q(7 zheb``fYWL^tnG!XOf>P8j4&#;6woa@lyOF_BdIb*{He@2rT)s`Lq9c)+Sv^LUDs*o zqzyD{fhD*KYtTT~Gtlw+R$U|4E#Adt^Q&w0(Nir6DjAcT16s z{b@!MzlUJ8dX#KzJ%v*@tK!c(YuaC;4RXZ>?7aPtpm5g#5}FqYkyEi$-f zu?RO{zgAMEoF9xwPzOdGlch$>jtfLzUnB)X>GZSOGoqZMj2Bi~!qq=ESdbe4bN5x# zj~YcNzxWlEZ*_<91s2p_L=P-yHq-W9?o=_hj{J=KOx=z)(%*Kkso3Wfvh`{U6aO$1 z>auk}raOYRZ;>LqrN;BW8--%Q(p3E9m`<)v&S65=`QhS!%^+-_65ujL@h-xkL8_q6fO;3#9tGvnULXJIMd8hz6w>-X)j zqEGM15%Yy}LGn@>DpvseFy55fpBIP9up)43GldvYQA`VbLk>+N^l3u^n7xp$A1blL z5w#>p8kyT zMRvVC36pzo(XDaZezNs2uKg&6qM^H(hRUh%K%t7Bnj!%-%$8_OI{`HTGH}kmi>Aqh z(x06X?6VEJg7HbmNSMZD_PV7UtErzyWDc}5&Z?_nE1N-Ud9C1I=Kz}mBp^+2fM+OX zjt}0f2ag&lX2xDM7_;pq4`=#7t^Z-PJ-dkv2ueukSTB`J3+1htHNfcbqwxn%ACr1N zkg0Al;LywENR>wD6K~Evg*(aeI(rh^yoBjKlty8>IGBmJgOYs}sZ!2n{MP{yb5OzC zntG@MgXrpBLUn)jK*6ah`e17iY?|_rKDN+?mHzTDJJFE@`_1I;6{|sGUo2_1<_ID) z48iN{e>@GPO^k`lTntO+fzhxg>~+`!l9TsS@7J2lMXgfu_r^Tz5KE*|(=6zz^g6Pn z?Fs$IONK)S)UY^F1n);hfoOX+8!0JHZ?3AwW|!%BL%)v^d&PCIZNka8JwsHpse~$) zCDA8NT&88cGL=$jB_zO!*6P28p679(UoaojCFjE(gEe&ceF-=owP2h~KCm{|Oo-uO zJ@S&9xjg>)h*tg)NA_1KS=M%ymZ-D{Y6@Dn%!B?N|jxGbZAfeJXTZp9TF~w-k=v%itXh&x8-$ zvs<}rkPezg;bG6KFf&#ZTAxT`zW-|8-aH@L^YSE&F55t*TBWhDgMwJP0Id?=l2oyC zY@?Vkx-?vd$pfV{)c-8Va2~@IB~Cbd{biz^{GN36iQ=~Bn?beNfH8}zMCZNNXqme@ zIejDq5{9@O=5#KPwM~cKw9Td;+%3`jJfHdc>o0b#oPklf&7@_KdcCNV5$5iB1r|Y` zM0%+Z(UG`>wr(!Dd2=CprnkV|u>hQi3A}^3lc~<&VbJCtk<2m$ zR5DiPSJ=3~3|<4hW4#Ug6wlI^RaPYb_X&K@vg`HduRqC= zZ|U1%%c3egTvkfm7XM-&|K5$ce_mop`FJ{S&Q?4$beE^seFNg7v(f57Ep}%ME)fr6tuMzv@ie#_UOp+A+k;KZS zLg6t1thVL@V^>bca~w4Jbp!NC$6T_0t{7@Jn_<&q53c)Ig=&w4`71dG?Bpg3_;W-K zFKrx08I4-ZABm?=9Q3Kki9Y(Ocb(Ocryh0O5f4F`R^-%S9W;v>q+eezr~dNUSo}8z zlCNjL#9(8HJ^P29x3`KOUv7hyO9+T48c=zT@&0KbAC7ieB1D+O6v2IV-|2uuSWyw@lQM#A5grsp!pB9{b z=pEac5)OaXCXm=GF6@btB{*eOK6DvVfy=bdq$2wWmy`Db`)F=waQqP%$3LXyZy%ET z>~4rrD#6wplJ3XWY?v` zi^URT;^PevF0vas-FI=HZx>&?>ky-DxfA=|Pli>@M3S^|0WG?Hnt1J1#>R?968GOM zyjLxbS6<(wcg*&{G22>!j&>;LORUGMyBK!ac*z z0kh#2+%`yqvzb}Aod1KaR$MChG3qtk}UiLqPfbDy!?fAPe(h!SoF3YGw z#YFtUb#kul+K!!jZ9uB|Hf`Omk2w==kbf7B!k(ky(6&(qPc2)53tHZgw(SWd+p?d0 zPE^GLy%%6JqQv(SQlamDrBf@LbSyShg$04Pa3EC)%M=-!I_EUh{Jw@$3>4stdLR97 z_kXx;M+~GtdjR)tbNf^eV{&cUL`cu^#8+ZbcwBk~*jG!Vj<-6#TrY=hEv8HaFNPXd z$792$VzfH89W4|G;rLu-;7jCU)q*fs6n+YA=c(d`oDDD|_dBu5?j+kIe^ZqOd9d)o z3h)-XO6_e|!;stodTi!(dUxMf^37cgy?9?Kno6K#$6TmdT!NP_SwZf!B$O%lz$~q3 zo?pK_|A3z}48ER$cH(biE?nAD$S)ud(^y6nQ%KPVTRYc_(Cn->UnNfVcl2FBnu=aMP#aI=`VUl{mmJ{c>$GSO9L4?5jVM7q-qp2kLM>muWufW77SMXU{I1ztQ3U~DS==dQIH@y8#+ym1kPL1F>-hq zz8x&ZZKr%`;ow;;4!=r@!=2#kQlQsF7&xVq0u90WXrZo1m2{V4u4*hy)tLxVle}qF zbOOhedBYyhYi6p#H$oUY1sBCUqw8-}lf1hk{85V#axnN4G#zLsNl%WD3FilCz0*!m z>dYWSr3mvR-_l3#uTcB2y|{GR7^o+#LLORSbDkR7|0;yyja&xhvL1PEwH1=L)k5X_ z2&!S0K)mc95dO7%vN1FOtAno7W9#hLmQn7VK5iL|O*nz`zE#i;T@KfBGM5aEt7KNb z7~qx8HU^8SQ%PvF95@#>vVWpEFObk%)Hx|se|*n=czRPAKI`a%@jwuEC45GWZ(q3V zUIixizQF9A9yoFOLGGNGk29x<)#rt|lZ@?L@B7Yj{P$0md9_B4c|N=wg*&9{vkcP6 zk>z#7x%U~FdMT4Ea;_mVn<825fp9jrQ30Ro8KR!CDp|21k;vcIKttJTFq5yO&Rmai zV;JWtQRns@EANw987tHp&oRt`Gl^a73nG`|N;T47(Ww(B;7LI%4V4sUa~fykRu_OI zw;F1`*o5~x=m*D_wuRU`Mcm9lxW3?=5_!4Q2urVz0|~1_P%)E1@hoXn2;UEeBjWUs zm>NiIyTj^pd!_eht03o56#bqUL96O_(+PQYpsnhT)5RI$vEvLF$R8nr9&g~&l3~~+ z97h+3E7#?FP6zGLr8Gu7h+gUl!^$H%xX3{n3LbJiZ^Jw~&d3w(N3KC#Sut)ODP>I7 zB!f(WHda@#f{TF>c-JTuy`;Y~bSM$jA34$86(VF?bt?_HG?&(h3SjvWJIvr_ea0Lk zCc?@Cquk}{=bg9+TCL46r^F6>M2^5D!zpxKeJ{> zVB&2x2%KnxPe*K^!PgK6Q+^9t3ie`sk27qUuaA;U0xgKi!{axih>Af0O|8Ac%1!kF zi4O$vl{CrRoPcGC0qisfQ+#;LfM{h;Abg)=aHz}^W=89RYquC~)2+r|8@XQDguPHA zwjE7wsN=H1dg{38GSJZ~3~)8)7_Ya8*OPA~BuW!k`HPbq&nCjQHPyKLS|K;PRf6V$ z$LzPgNK`L}6Z_36C@cG&Zjj`Gb>1+kobZ5}o}I|u>m$g`^a6Bw^qlc3kB1@iOAt^# z55(1zpf@>=9@F%|@oRt34bOJLc^gG6+oa16u93yy`|@y*b%YeIQ@3^T0(Pg&6n5l4 zE!^-b0)-Vmv)AJHp+n0u+!{KKs_xhepNnP@V=a9exJHBTY*B+rHR&WXF9!TuBw_N& z^ALT%4&Mo`KuVSu*0UibZsZl5`e+FeKQ_a*j`?7aT!Bvl&0r?NI@L|&utZlmvzOtEuHF`x)oS=(YbEV*B z@@M*PVJEXBOas)tzmhHHJMmtWA^N1$a?A$+-;FC#W7Y-e6hFxnHBE==AD5}r^T&); zm?)(9{-x#4Wpw`O@o+C_F}b>^iyR)2iBgq>ZsLRtIICI5uP$@hBtw+K^v$>djQ`?ONn^_w0{S#Bx z(o9p&wK2>VIX3aTDAWrgNTG`@HcG8zt!Ja@o01L1oEX-QMZB1EQN*Q z4TBp*cwZcx`*WMFekKex_Ck1T5ufX->H)K>;^))^F_0L4gbTz3|!{E1Ejr!;N5)<*lZb$ zlXGH_q;4SdMu%|9nQ!#>y4B>Mxgqt}b-_t~C#g_kwWYyLb12Uj5To@Pn14tEmwH4% z(ncQpVNX7dey@PC&Fe9t=mtDjzJOtK%8ADb15C{fhN7YQu)4Ju_Y_!=qS0EoC-jj{ zdh7sf*CpJNX3b*44F1NR1#o6&KCJce!3?>lpmyOGYb_Q?%yMeTE6;GO(wfEcp5Mfz zo_%EPsVM65$OhYGF2mo6TgX#J0{IWiFy#6=v@^biho|aN>mLWf%Wopy|Byz^AG^T! zv!Ylv=*!Cbstigo3fu>TG*?cN)xNzHzG z<*W*Sp!@nc{CM*sTo7&*!~`G1-H+2iOD6(9jre21 zZWkO(f6rw%xjm=H4c2DhG^C!FgiQ+h%;GQsSn9cAMZr5N|9dy|jO(Z4x5b0)z2z9+ zv>E=h+l9(IPLd4|s$gRI3=;Sxn=0||P^Y=UuslBnQqx_qLqnpJK;Bv?s~)`-e6Qx zWzfss9j6`TX8oQgi0;Bd7JB1IT)3-XUTzuK_$Co)=O@(Wd;Mms(H zvC^@D_PlMO^2ejW@%C0~tiBk8?H5Ainp|KG#nXxDA~<^`3upT0(zEAZLhqGIG`5zrE9WgO8w;fCy!MeN60d3XqyT#0=_{5AS&1PJ({c5MVKVK32>vt^(6>c1 zA$ngBlyjcWTH%*4%(1m*7N(GpFV^7aR!sGi?1@8KHim2&AeW8>LP_XH8W|Ce8QD(- z4a1`hfuq#DOs3wgvWMP|*TU-?_3-A$?c`v>0w{N1i=E5c>A3u1?m2ynKG(d4%a;4W z4CX3m9n(i4jrsWdur!%E+Rk2dy?}cS%^^)Mi2S&*0IJrez((&D-lc$6c58J7>=2dc|Aq=MGB$3YDIdH|`ET(VaxYW-YS+-CLZ{{Qt?Gtu`nv(oknY~B+&=jaWK%c29sBFPHImP^pofEaV|yJ8@hsKD2Cyw zGkN%a33o3u&SKkA#PQqSg%CA1xnA$TIC_PD38n_RWB$?-N4DJg9cttr;koolI9tkA@}}t z6dB@ptXk7B<{d%z2diO~Lo!aZYJiyBP%H~SgbF|XNS^N-n)xJ&>Ttc&#R=J9c5pZB z`MC;K8M3ZQ1Y&BPg=``M6AcOs>C3M!{X&@JbB zNm}Gn8txp2!hyqeD<_-b97e1@b^Bg)wU?_O_S38%Qf*?(j(?ynYTP^_Xd$RQjm4z+ zW-trnI*X&yXrU7Uy5$zMcXb@COAd!Yk3f*hxFGO7R{~_wb|yeLkbQF{kEkDwV{(5d z@r3;A$i6ogsDtC+O5-VXT=?xOq zL~HK6cQr$|m1ps2(FFP;;5%k-<+?$iG(h_74sbte#47IP{LR1haSMK>kB)yKDbGj9 zf$`Ze@_PdJ?z|s39i^b*+{UPNrSTCs`pB5ZTt zRQ%mHogSaQfLJKzkjnKPDE99xo}Rh^|LI?%nK60fm-H6=)Y%XFs>TH773x^dyGK-~ zwUeu<%IxFi1~~rN4cPTZb?OvYwTR(O@gfwNeS)!hy#+2^)8cw^SvZeBk?;Mpgv+XgLDAPi_R0F! zq(bnEs63No`-{Wi?B=h;sh3ALZQxTYO+S3{#SyYjYB0O<6iJL~2Z=45LXKB-aJ*#^ z{_CD92#ocl`wk?~?!FT6RVeVtb_oY<2cX18YZk1<#q)3 zFwX2O`82H-_kM2`TfJlVFq{OOtAZmI$Er= z#?Hk{nf#>j$hliFpIHZEw~FD>{_~_bZhHL@6ZLvAj@L1MPAMiG7QrEd1VQ?5ArSrR zOC^>J5bt%Sl#Gw1`{5^^nq3QVYtL|K5stJ{77F6ak|Ei31@Zl349?|~i1B4noHw`z z*!hE0_Ruck>~4h~=g(qNw=g76pF`|92cB-GBF3caLaJCX$vGVWXL&d2rgJMmPw zp5_AK;X(9=nnHcS9~n$@9AX#5{-o1(ekF^>57WUbk4ZpF5M5Md3>&KAK&w*(+N6zO zy-6`f{>p&I3*=B}u?l$JeM2p;B#@h53>Zs&20!F0!*KNq=8vl__=shJlk-))G4l*{ zyZw?WtPCNJyYG|E%X{HgU=d7S8Ar_;PcyFf{~>eX3#nhBfk~^l+;X!PocdLYYpFWa z=+0q3mAMg~59f_6GQ|%a?%;C7fJVRQC-RXdptFX;%Oer6O5Y#L^ryh_Ta#gUs{y-k zw>>%g)e$|b%INj4mr>u)4~heW(DnhrYrg?rmbcY!j5_gp8+i*>2;j)U~- zk8E~&&{kOHy9Cp6vLJ0;IJ({+q~a6Hz(w~C6@M2Gmruk%Re>!0`BehVW`=NHUL6w0 z9>Xl3J~HiNG6+X!;)?zUycCHBA}Ft??rJF%>2FM0e@frtnJaprJXOH?%y)bj zaR-Am6o}-brDXCaYp!Rmger5d;Ej)=Xue2~FT{rNO;|9hVEwtXi2 z&*7le5(+MAYCs=d=C%6sAku##cus6aznz?8Rev%}({}~Fks(ZJxkaqw|AYV7a^lxA z4x~SAf%ZNwe?MnCWXf)VBQG|hw@xmxEmC7A-*E5#wa0X>){1OCdl z84)dM!WaEcl*21nZ>bAZ^YS`a3b2|i|Z zcEIPs-_~(uhS*nnM5ixggSH!K<>zQkmIicliUetHrY=wAwn1`%#d(?ALgh9 zm*YQCfWK{yP_xgPsJeS1s9Y?DO6dwPK3oAEq2d^~C5I?*{Ejz!)}n)bm?NE-UI z8QJ7;{50f2znC>L3U@c+(1QV@eXbN`%4$&HcanrxT*8Hhf2ro71We4{1UdR!aKU*B zPEl82`zl)+aP$%gx;lv{tV8~~NTz-`h#lEl%5kL1;L)>YBENb3Jb)N2!nir_mlU=xayXQaTD?L9O|)f>MrSV0yWt|aqTUPoR< zB-Ad90S_G$;C+b!#r{J$ap)`EepvzzY36b=vnY<8+JyRhgX!^9FB1Ex7(9E2$tQ@@bDHTz)q&kU$=F+cWh3 znI9Fx^gy`+29M5x0~WVgfsz_ZEZVCB!aR2dE~&G_we5YC-#EdLCYPc zI>hDaPbU1`H-aVwB%JoXZ}vj-rHNpz;DtW@ zp`;-?mnuycX7}f~LEoO$@WAdD9q`~|bkJI+CZnAGc$S`W_(Z);Yt@(kzk8?oHG)pR*pJgT7o=;=CE(vN1 z3#i#089MM%jblyp@a`;Ap#Mq#5mbh*CKEX8dtTofT*r@Qe&6Dr;hy8s-{?7p#~AVT znqpvM(I{0O6{6L$XCNbJ63yD7^PV9%Vo)D_1jmTo&6ork199 zPr`4e=fL%$C_QQx313bxMgOJdaDLqZ^mrT#;zbLw=Qqb+shmZXa+T;eLu(XyZ;VEo zd7!4iWfiC_8sEH4eB_@9X7{YaKaXrdre6b1=kXySJ{T0N%E=+;zchWe2l)N@L%d22 zptM^HzR%0SKxs`hNDhHTT<%CCZUNUXen38cAmC|Jz%dnn6OVu@@?L$2v|7)mkK|%$ z{n#{8HTfHS`)5L*UX|kqKILr4UlpL?GRJt+I!9VwIFsJK3H*jl9;|&!5U9m-pZ~5Y zle?mrn>ii>k=PwLVM8N z9w=nys&V*eXFYKIQVdJhCetqaH>}lHZ#sK4o1VO_4Wv;IS%dg&D`pR5>?*;aJ|29TYmTd`PH-%cG^!T=fXY8P zL&Hq7>G9Cdkp1%o>DiwK&L#Rd<`oQ48--BdKTO#R;`L{yoFNb9>ETp6Qm%#kV<>(^YPtK1S^T%7TaF*jGlA;)D zD}R=*Z4u}5PnF>80zUFq=n!qsY#i>qO&^NZ6ZNhXIzuuEHMNEaY0o91A4`ap!FGDA zw1AWe31Q6YySzOOpE-8HB4|(f$zIWZN;mZh)oc0%VbSSAc=`b_*z6+Jd?^8f(^A+n zXEJU{;_gZp5|}TIMRaPr4TfE+2Y#45RIoQ7Ml~GEY-Yf#@Y{6WqC|S|mInW6djfV( zS3>P{X_N}P#kktlK#NX3RyY4;qAeG}QvEQr;CglwJbkIz&=-2aA)go(SOMR`4%Ce_ zp?S$|aM+)T!^;H85{r1vppa61Vb7^xZ0lH~&?DPgELRR$mHTj+9(0{U1Z;9ZuyN z#&Ho6qHGD3RS`?qS0|EHO<%#&uENS_cXXMq4OEj@9 z7`AjhA**EaNX^9v7Z_&c7I$&RS4;s#S*NbKyA$x3M$mFqOaQbf+ z{7P^$a&OXSOm=kx^-zme;w+`SVv7lz2w#lO z(!0U?zkF=EY(Va~b9b4blf=1QkiTcmI@t7h5gRC4&Cm)*a9;Zz?YyUvyp*dXTkkT) zj4y|{v?E*vMgzVVTLrm`W#B}s8eZ5j1B-Iqpupk*`y^n9SkG`^A`cDo8m=tHd(S6< zM;zxWzcL>l)ZM3^_8;kAq4@fDkM2?3d)`d?+ZKGUv%cX_-zj{<^;=k{ac)NCt$5b@ z1sPN!)CU7$WTyp06+a_Gvt+32@(HBshiJpfvk4?p*c9Kai6ze#c5$CUb$ELG9DAjD zWxec_!`Kixk(qmQ7OK5jKt1z|(Ny&sd;M| zNsLdYWdC70uEw!qR2>yew!qM+;d)``lh&PA@Ww<@&@rmT+|@sDXKOP4 z>}){6+jsD@cm|!OdY_t!&n6W^wTw=HDP|Q_vOCP;pxbIX^0+z5OPf&q+H($rj8;I= z(?PoZw>sT$j1O-4+$=QoBR5hX03Wg4Fzw!|ozX|g&{8)q7vgAYcPG(&neD6S?DvS6G}>Np6m z%EQ5|Ukl!AY@-gVCWG2~O@7{8EwbCZ13oX$qQBL%VZ$ANY!8@$vO*&GeoY!H(c3@; z(_b?w*X8l^l4s=0l5m)AwgFbm&B3`c*XhPDLZtLKx5uoHW!#SWVvhMyaNqHOn_B^F zdGC#9edfT7;dqqt5hd9Hv%#q1804+Zz;}`hA(G=O#!h6S+J$ILk#nRuw@T_)#XhH- zF14Vfr#b9BWdL8kInwaZ{g`p!G_76`UO(Jx1^WHBu_7=VpXTI%W(C&4tvUm}cXzCAtQlJRt3tb| z9I+7f1NEn)yl3YO@am~x2-dQr4_;pbS9cro_jWsW4NfDeU%0;Z0Clp|qnG~N$z@+Z zyra&=N0_k+V^S7&oak|`p05KSEn-uQD_rN~E{mqyF0qjU;dGt~0|OP&Fy&u4rnhdvLn;TswNnQE?O#WJ#?|6$ zAq6U=T!V|x-G%Gh1sjqlS%Xe}74CY{L%xlqLP297d^yf(=p_%LjQ=87ej*L1jQa{&$c-_Cd$S_o=Znj*Tl@!}*e-{K+dOGf za3d;hNhHd>>o_)P2G(d4(ClmJL|}G5m(^|}yJO#y0IyIeDxV8dDmNi`cmc@`A3`$+ zXEb{Lot<|33-2I*FZ^Q55uM&ryM2PVxJ?v>zMjO%HQG%1F>WVn<_oSD(@>!D39@4Z z-j8#7%41sI$N89k&%u+^_hRDG3|#2$N^`1DV~x)Y)PK2v z?wEQ3Pj`?dKNFUNYi=wSTfQQ_wH3T;A4+&#%ad^M{X9_Z|3Uo}YUnwIwdjzSi1WE# z-z`x`Nb8jKv_C8vDw21>V$P@a@jqdZ7aheWg|{TBfaS@5;+_k)QW^EjexyZmss(SBE6^g@Mru+y1*;Oylfg|=MD*n&s>Ob! zSLLfnwlK0=9xTU7{ZKGy`)P7Guw09gKyQ&+>l$np&m(oR`H#;2W?P9=>97K=88hF$?%p~6VNJhmTl2`jylkhY_ z7*JQJA3Hx0;$)LScIppixaTOO)&+wzw?Fkb83U!aRH*g=4J?}|h5MgLK=aZ}s1J;R z^?SG-)WsrRn8ZRjx9~8=Y4E^-VEDZ)UVQBu4t7BPAhHm+~SZl9SX?71;^Us;I( zUc)4*8QFU;-OwWF4GB1K2nzgelg{O$c*Eo-RaqQM?b0Oh#f2*{m2<~T%Zr6ms+KS! zuY-A9UrKfP82OmL3bvfRkCGh@jFM_Ns&u5GW7BFdo~glaSnq)=@4sOOdGE>KeOd6| zr;W{1s>ltA1T?y}3{-;^&`zii*4>mO`ak1vQRrFvgwQP=7^Ej{-IO><_@!MyEwvSL53TFGV46edG^VIw^sQw-j+pTTY7 z8+_M0NQJnck4LVft+N^0;;)ECn$dWsMFO|9f1>Xu9-*7{C-AxdPBPF^OX9AWqd@Mm zB{kl^*gx}pA!ETOB5fpz*F%m%_&z7({g+422F2ih{rN=m_96@kFQVtAnn7!1D;!+% zkn?qz!tK{L!7HK;?K8*F$g~@E${*2%vd8I~3%BXcgabrRW0wDkE-O#hRFA^8hY^y4b93I0W1 z?e2mEj`_H6{)Ef?B$4f7Su|qCQj8bM#x%F1T&Jfb8*ynOem0%Vewyope6WN^tVAv*f{;KJM^ZL(V9DsIN9i zh4yC!@Za{eq~MGQvO385_3ki%YqW9h6;I~(YhSA6JqH>89J*>K26E?=(5@~P{qpCz`L0PiovsS`j>FJ zd#4>>6=CepC>OA2wb8YNc(ONqppOj2_78I>s!B6C(Mu|j^a z==!)4@^U7^*@${F;n7saFf{}+&3cJ<%?gw$n}N7Lonej(7r{<?6(?#Td@KuS+Wf$`Yi>Tln9$L?t=6? z9ddoo9hl7%<6Cq~@&A6TgDIpI&pa-r;r(w=R#~2W`^P7(e>JGGSUL!|&%?anGdQ=Rh3LeF*Vap6&Ce+ELqifB4t^%5 z{4Ue~B7(5Ya}mzZ5P=;n>v5v<4O9-?jHAcC)56O;;m_kd`p}^nKECJe`-yGZwu`knGaF4-jMpLYo{PD1cE~_CnIN%!f@RK9i;Umnufa`ertX2I(qCxXw z1j(;y6JTP)7q&gpd>iW6id5C{^7@1jJyK)lznjn?zJCzJWukCFbOwesEk*ZsDKuIz71LrZ zL0wiCI$I)%>fJa-`LYvSJ=y_7T63A^8A{kxWr4f8UjR`aV~^;~hesI}bf3p+8hb#1 ze{RSDnu$I*C&a;&)F^h-qBS=M^V?Sg zkIfWuY$%tuG;82ZJzpk+%N!{V_Tlog-zd%bL{_c%LLO_6lBH}s*mlpMLR~{(zcK>& zVdsg8NH4l<^MQ@KT;N92JF@zLF#Jf4g0@?Fd@+|C`nFn{K0Rm%Y)THCNj*wlyq1Nn z*B`;F_#^m0bqaG3oX|lOl z0Tph<(x+}NxG_M1?#6HhH zSGTG`i+IY2L+6iS)1Rnw%Td;W*#eyhvtcA) zB2IIf1PX2aG?wr<2b(bsH+5zHh5sa%6kl-lXve9u^LJu8FPgU27-Rg_P_)Qb1Yhp` zk$>+NDDvOclpl#-9w2ffV)o26TxUqyu59wgtQIMNgC}Z$( zf0UlH8ZJ&2#^cpb*a?fTpa*jlT>q{iVR6hCe4jU)V3AA^r*-tCYYnIt(*@^zcec53+ZE3N>hqpQJVKz7zK? z(e(S|6PRMdfYG=Uln><7An922ohu4aZ&MhR!`rz|j~f_w#Gg)n5R9LG{$Q$J{UW>O zHDb>mU%E?64~I^46U{xfyzme+99h(bady!pZ&o@kXAEGK=mqqs^5Q)$?j!o`*5JS{ zg`N|y=)#@1(fR|@?THb@t8W9O>gyx8b>YRH*Tnhb2w5gMN?tf1nfvZI_#Hn2GpBsw z$)uOUiDQ}dQ!S4`uis7_l+IuV^R2<{3ry?lCh;S%h8-GTQ`isSY}IS{Ml%osXM z0)YqT$ivm$Wc^?${z*)y-wRgYoQoT%OWI`gvS?-``3%;5>jwY$+2H>CG?Ct$PgQpA z;`k*&&aV=MWh}>G&Wc9a;$Eu7olPp3UMjtN8~M1njwjCvw5Q!UzzVYS;6to0Ih%G2 zh7GIeVzk5VMr(Msw-~n0IF7@6t-)-gHGWg5gWQdlH1p{h_M!g}5iX6T!UxZh$=)NZ zr@mCf$1+{;nkElvF4^$;h$R`&DFBll?I5x52wn2)3@VOrov#%~an!+>e$Fz5{1dM1 zo)_=2?Y$*U_zq;VtUc!=jA8%QE#$xauZ(=VtpU-=pU9@$MnqMF>!FfWBW_iEn0`e8 zhTiP~gNv=yaHNIGZ~a0lg!A-pA%E*Icb-6rAn zMt+6Rn6CqK%tn|u;-B#0vU_lM`f3oY5ybzlhhe@;3?|+3fu1WFkW%>pcsqRYm3|)` zbj{*22&dt6^t~FcpcK43mZ70z0g?KU2YKC(vHMyy4fIk)tpkGO{;d1Rl-^+6A|}E~ zvJt3*67IeL^wKObnAG->q{#<^_4RNVbD2`Vc}pc(9$?3)tu{f4`3`XS{4=z!=%T|D zZsAb%YHHE{mze(7K~=f)fcPCDFrwe-zOtj_-*_=O<8qOjFIWug4;rC)i!GGb_>)Cn zxqeHY6&Me>&|gC}wDGbTmK*kfcau1M5ydgu{}f?!WG0sh)dmBORSq9g~>400K_K-n!E_3Un-N5JgXP>Lu zBrQ({cMVqH&Ez&Ip8 zN@yU<-J@Ij(QtwqE?E$O7yMr1w)LxUqJk^woo$QTZ=Qh;jS{p^bS87sa!GQHA*eO2 zqg6Tmbj|xw8n;soLn8`EecpLeWw#1$6m=5AcabI+cBhlK4kh?H+W;m$y+rSjSFFvD z0mOD%gYO(=Xja-y+P;6ll#H3c=XLK`y>-0(2 z(ewD9a{-7d^6)wFO8FRqYcQXx6n1;1)6KQEcIGz7Q4yHFbqSlfuMv9wV_-@RhJ7yPPd|x@$y&g%e zbllPE!YrKgWQ;f)nc(}270@yzf&5ecfQdGS;G=zMK%0v@F9LNhMUFY%2t~tpO3w zEBJN&0&4qg4}Lv!k5Q8gE%xkS^7}QhV0tjtCB(2sK`N|qMa)Ykv<$V7kmc zI{I*sO4Uw=D;!hvb)_Tf+ngYJ1xhqu5Z(!7(P{GIcQ+v-EV;{tfT&5m3>=M^ilK!Z zb5y0=P&}subyms3%H{*$EVYAPGbfnokhSiflk{H#ibYZd9VD>aD-PwOQ9=`U!`KrG13xCoCNZSlj6ICA@O1|D7Y zlwMn9$}4L;$BGM`fJECHL^>v!V@$JX`^zpOy`qvn?C&PNRVyKl9wpw|bI?t(A7({_ z!KN4uRJ!Si52ik(Ia?QjoaSLz=Kc%SzA9oLmubpTF(Fr*_QR=(?RZG`D15ZjfnQbk z;l1V!ZYJr0XM}BV)V-W4XK3IVx5-R=n2|Sm zDSqhTygJammJT8Hoe>AEpWMb#mh3Ij7 zBEPY;nKVq;M4NMSAfi%|@AXW!!8K2Uupc#``2J2f9GgW_<>E*ozXmYyG+k+{#x&l~ z@#S5FNr-#w{bK$FFBE1oQTjewQ>lUF8XxoPu1=o!8j#l9*k1N)_W?kQZXPWH*nM5$VT1d-Blu3%oez=|=2kaEiFC4W5Tyh9A z=yi#>Mzzvly8(R0?Fn1=3t?N!Iw(G;j1`+axo6@`66aRHac=o!)INx&9X5mKqY2o$ zc`+#te8n(NbBMyT`|#Lm9POLS>B_TL$s(0A;2>LpdqVlV;Op1OUkMFJIFt^fH&aOD z>S`j@od%t@nncOHh-O)@fuET-fr$}@k_GnIaYqUY3O#`R?n_!Cx>%mVHp=H+f$i#3 zplYa|d@433w~OOR)2t<^sa{AG_#TL*0)OseM*cJUhgC$!Wj`=s zMgj)^_m(6|A3~SC_RxE00#5$*4tz~TaW$`vwjZ91z7h_2P=TA3M3~_EBwKW3LeTnB z5*mwXz`8}lr2qG3S}TPrqioRT|`W^lAe?H$BZ3YKvsPd(K`NxI_v7eoAq)Kc#&hd3}51r z>FRJm?pA1r%;hztve$`og{&;`}s;?p;D|(3`_xU=QQ%C)oC*ZTE z)I?~_f6Qt_C79P-4w_!YxH;AX0}Vfs#y^*#P1hCbW*Ac4K6j!Oo5nq7ctmfd2UD`O z2cIO>(3G{|BtbI{u8}-u+$Iy6w{~zoSwmDDct$Rl){%qPWbtbBKB!9$$89CMI44ax zz5M<@yT0${JAC!-dRvzsxD8>sua*Z>n@Y0F&Ag(M$!pw zUU2V?9#mRq5ut@ju<2zvXWuw%3k29NMw*-&7n{v7NRp97w2W~WnqM(mCK3Z>%H>X9Q=zt)p9B?H0 zttU}VG8`hMmf#z&90*O+Ms0g@{4uANeGqsE1)g4E9wldyb1iB3VAVUkI5?f2SKLib z?%x1{JB@JN8v}6atcFiZ&Vuq^Q@ps9%SE5M$T^!=!qoR%F8ERvD=899R{9Gv;m2Rn zp&yBCMph)ukgjFNZ5ZpWZ^cixoX2bNBGNK30W-G^6V-~FG<)Ypy3)^_9KLcC%hW}1pgW3Y z2^9h|gAhVYbVSn{H=2cH3JTaV%OVs?y`@EYR2YUl(O)bt{VGJ+0`M~ji?zFyM zp6g{uLvpx-?iCS&-kB`1;<{+wtIh+>;y5C5{WHzK&`idL5HC4zLX(Tg8{9I9Z|G$P zYiw>2fp`^6lddHN=4Eusoh)i}avvBL8iW7S-&E>P4dow70m)4nv^nt)^^f_8HX2#% zUMUk4K9`2JZ8b!(*$nHHH^M(*E9^?ONA*L}WU-nUx){G>i@tKKZiofGTQCLPBh1i0 zu7oL!^r7SLA3QtZ09Ix^8b80E$q}g{Q~4b8BkY6YzBRDrfi$|Y74(;a zCduP?vu1c^W-LzV{?k3D#QcFbmQo2)o9fGy9WDrfc@f90A8u*p+vZj zqCzXVf9E`GYxvAqSp=YxN;phfUX3m{CNmrdP4?O}Kxo$jNUFa^#3vw`)ixayoo|8t z)&b`Ct|-!@bi_n4TLd<@JfbRQNgVsNei5O(PI)LNMuX_6ltD*PZVp89`0a>XxCUd#-UHNz(Dd}290tqJo(2{4@ zS(?zDpRHhw>$>pU{{}agg+b%OT*xc`#fr?VWm;||f^;Oui>emGIk!~$WYc8WZqSJ} zH%>tl*~f-`7EK=aTvd)jCic@`@cjYX(0yL~{J^T+rHOPAldKf}v*- z_-D+<<+{?)Z8OHW>$t;WkMFeGa|fMz|2ug;_Y3d8r8anW{Q}ruoW$|D`=N23C6;Vn z1vQT0_z*_u#OX=(*LQ}~+wYSx<+*;n$Si%-D6+#BKVDJa$!%<=8>KFS5fJo)h5GAu zSnm23kIGJid&OOJ`mZc@$YDQ9-_ZiY1QBSPs7|Nx4YBjj3J8h4L3id>(&pMEh~9ma z?y+gX`yqJ{kd)jlFhK_UIp3atOa*}q%vLu^I>Fa1d3@S zGS`|CA+BEQ3gg}8E|8CZP3lEwV%gFU?8T!zP;bbh{#`QQGhPD= zpNNv+NB#7Ci8{(G>>(Bdl_cIGm*?X!1&UOTlbPEdksV1M$lp94eR864yV@4!{?+H` z?K}gT53EO~JcD)DprmnY44RfMCK}U>VKcDQm19W0SX`hwf6VctX9ZrW34%L5lkk0* z5qw*wQvc}jOuT!c7Y#&PNYhkBD*pHo*tM3j-FpU^Bj%@YQi%k4SuKZ`zdWYVz9n$w zyC!MnGEI1OcR7?7*9B}mO1eE_VMw*&Tv2l1E_2%Y}>B>W>wKt2^iQmZOC9E;5#0v)` zAHl414Iol_4OH$MVWH4e>{UAjV@am8VC_VlwJ``Lf7c*$`$E7mc?eQ9%}8Hn8na&N z4ChMEhOw`4Byh4CRQgPTyY)qMQ@S#!`&5zR@~*HwY6JJ|3g;P_zbBHJNp#V}V`SFZ zFQ6mC<-7+v*_hs5((^*Cp|bEUV^AoKU0N;FKye6mf6#-Kha(8qs^W>cX(*R96LQ5) zu&TXL#3aNOwDmHH_@S#P!g1a2nyW!gI~5jfXeK{rX%OqZFL}A@RzPO$1v_IADAg*0 z&p9%TtKT!~vF;36cq0mDB&XvQKS2zuKSJ|w`;r2l5VsGPB4%1H%-@-hiNvc3(D`L5 zHOOy6r=U90;!@43U$?9|pi#uT8Wn@L!_pvCkB6TZTp~#ej+yNBtKqK8O>AR-FFA9$ zl@tZIW8K>6{2!h95Y!`x4jpX{~W}!7qgg*ucb&Ha;~Pb zOt7dip&}1bsmr(Lq^7)|9@)@_K_zSOmT5d>R9vPn2ZhME{}ISaEnprUy+|XLZYJ-~ zPJm;6oIA0)m`rFW1ZQsrm^?2LduEiOmGV;TTXUJlHkptgQ+@H!!>82$5(l6u4Cy!`yam5;{eeW)DkGDkC6m=>zCJ9%!x#OD)WxTfC-spXc>)c+b zjo;iO*wBzJx_gxt-* zGtkwt7)K8XB9T%CL8U;n_}Yp_Yq*}T_gHexVq)>o3dR}h*`4-xl6ar7aVnR^}8jLGjN&H z!b~||SnVeXWvY$1bbOF~-c>?1{bZr6eHGc^A4lgyDsw66EHu;71*jrIF^-;$GCKT;{{XFsS$^}hl^O>6%CN&aSU_K zr-Me|B)nRzhHnmYy`Ou3(a%Nu&~QALh+jKR96PePELA+b`7s?0QXZlE$M^L?_g6x_ z@Ep|l5J&NS6Y->HG5jm3<+=*X$mE?#_|fVp2|8(y^XA4w+^-aRm5+idr2_!T{s0>r>a0hrZhx`vGqLT zE~0YbDSNMF8_Mj-A+@h+i20pt=*$%7{x>9G!Mg3Nq90EEJeXcc{FhjbU=Th(h8T<^cEE zFtt%3(a+MMXV+`=$QYrf!E%vb0XdW2>&CpgypEtOi=MRlZQiSL2O?A5lf%(O)f zWc{=lSo82SG3dKWvzsPh>}qe=ae5*ACzu42XP>~VZ-NbH-!Ft%?Lj*KkUkWo)jklL8;b^)X#& z0koaU2a$t2@afJK4IhSu$?+rWiTO|*t6eh69=x=HUiKUyZM$ZYsN#|Ou7j^gPH_lK z9P36qncGkyB22yO?7{xQWo(o^NII;!nc2d8%zGD4^=zhsoRm3#Ul*dcY%osRznRES zDyW}sY=`v~sYJywk2YTS#q;*Y*tH{*TsfLSj~~88+V4-oqe=Urx>yMNx=-K{$s~Hk z=L9}p98R_7yO287i4Cr~VO(x7fpY8)M|>BG@0S#VUjgjxy+qs))<+}_885sh7q6U~;v==O&+zDoz1jFTCD z+q(LZ@@eoz@h%mvJ5MwYhmh#d2lys`BO86(0dC&eLu4N-W6^{hxOzJo4*v?nFNt=n zbU&XC1ZAPcL=AYqI)^Sc7-g?z#^DmJ`;coLkGBqeXZ`aZ!7iLje&0NW88YvAZrPUb zB~FAqaxa5lF$?%3IkTalG!Oo|B*RB@2^1O&WA4wgM)#8k>CEK;RABN?QgrqYj6LdL zzVyw)M}8fU6WL12%@irmEt;&a|HE2+ngri12WaBl2uRWzrTSkt;wGi7$j)q}zXgnm z{Kxy~ryGrhuEKPrB9o_ac?s(J2=OQPoPgs)+GO?DQ}Cy93cbBxlsb;B!{$#f*o?f% zTu*}!C6BgYiB=C5{#7Eng>y+rRV}hVrRe0^N%(Hn3v`{TgV|%Exa)Z#C|(I98qzh` ze(pLM|1bee-8!+W*@gDOYBg598iPYD5+%s6P;mKXj>+chXiPM*Z zu>-f~R;nj~&D{J}Z7y2mApR|!$^Fgkq_b2B^!*FT#;EJ`{=jQcHYtUqVP%MV`ja02 z^@GaWic*s$vUE}#57MS|kWj{zYUSHOP1ip52x~@fnG{gZxDhx&XL6Z>vt)(OL!!Ct z1pZ!X$lLBAhP(Q8NnC&ktWgl=+h)dsh!!`WU|QLEmu+wv|0xXFQE(DB#DhALcxU7{ zGbel}sMyHj<2_2mKy4xBe4mett|@W(MvC8l36Yw+4YY0F5NeAk!Q&r-WWCmAeEN4g zYQ25VW*m@&a69FOshc$+S+ob1(;&c!l5n#qhGu*=hDrP|yu<6Hb3zvowPs=Xwxfet z<9LmAmCvIqCrLs3tM43BD!?!Cc|tp(40#Pj;PUe$JPJt0;rMopsLH^E_A>G!MIW=5 z%Y*MWF*q$3j*@9faD!bz4=R47rZT>0T{M+w2T5Y`QUx3{%_INaalnwj6(oH0D5;S> z4_ezTK(1d5ZQlGL>P_GAbJ9$B(3L>Gwq=l6O{r*UD2b}=6R|R043=}bgfZo2H0zON zURMv%#V%{%{oV_3OLRVre>%=;{Zxbn{Uwq**Un_c7WzN#KIl(>x^BM2Oet`!AX!H~oTDVe!f!Q#vxEL%y zv|w~?H5EK@5cV-{WX-4$LFp1=8Fv{wvKCW2*->ib!XR&n498LEKv-%59T%d|_(2^@ zUQFbD+10_k-nojJK^D0b_ldepuAo!K8<>SJw830ugc!$PXWJw{!|a^X5HudnR&f34 zmQF{=r3G#ve(nXmtgl1NgY4n^;}(+LRe|U3og*_=zu-TweKV@*qb~SQ$wxqSDRk(XsW}IMY&A- z!SD4La|Oz{-%V?cC8KmS1-9Nvhf{e|>vXfW;qsg|lq-GA3PnDoD~IRNN&m&r_pci2 z<>a-=%rs?m7mI>Z!d_Ik-xSZ6=9rvLDdYO(wu1eaauVLGjCQ4uJy1Sn@@6RuqzNC+?71)jbDjV^qi!go}OrQeu&)28_a)Xbmijb1>fh^7S1x@F2 zc>Xwtlx)l)8*c8zDD_ihD5svBdNTpddykXwbR(MbHiC9ORV7mwOEQc41W=r*qe?+S zn0_J|gq#e?rFAFj*$E3kJ~$Z5O2L#a)tUqSASCcOy5OopX}P9yw03GEYPJZ&?^K@}Ms>`zUV6 zC+69?AU(W^cf(*B-nxDst-c6h*tPXI|BNb#nI$m)c^2U#>3d|wb~{qJRh;fz=!aL; zrtl)u0*RM`6AfM_LrSOJgr6n#B(ZcaZ9SMmUP}wX1__SM(r8$1gY50p zfuG)MN$<`xT$e`?EsMWP7Yge#8=iVofj62Uwb_&YN>pH(cs;VyO$w(~p2p-c0VwT^ zCR6^ChVn&qAo8_cteGy6UdEFiA#;>3q9cRh0$=um!mnOu@ z_u!;Gf3W#}D$H!!gKT*gIjK1hyYr6I2L^_8qsdaZ6xog*`z+X6tqvlzXcKPl@P`|L zQ#tSE5*oB^oGOTuZ_{%kleb_?~Syx?!80bfz_D}CZF0hN&wu&4|}Kw}=@mnS6v!3qC-`#R7O|s%07P)++2fhHzQoEks|mgmX?`$nO2z zwq8cOVb`<%@INE$BAIHKB80*jL zu;j5gRop!fT$h((h~r%Hj^{}Rf*#`zHkLkF7KggBZTM=&0y^Da9OgSO;`uS`><4<2_CA9yS2z z9ixZVzs14Br(lbE8D17$Pa0cB$W%GiI$L=u)VaM3r;Bim+>M9S%I64G=Owf2`y!}g z(?puSPZUo5;W|LtTS*3^0_$Cc`RQ{)@PTq=U2nt)m;Dc@QsQ=V1x8&AV8p!Fg4De>a(Gw*R%kxPindMo-nEaFOFKu(tn}b;<2B~Z z5_f7c@SVh_8^OK%hoHJt9M?Z6plO?xu}vcd1cYb8!=w^eEcb-WTN?wHetW^5qG((@ zB!{O038I(`K5VvU`bAd~xmN}_viBb?Twn+qp{2OH!<78sc9~`|d*DGg*Y9SnjnzI^ z;5s+gaMtJ8!#Zvzv34?zbK-ie>m7-}*VnXN>?6NZY^x}j6DLU`CoZdH%H?+0WP$(K^iL}mrl|-SGS&D2S$%sNq zd#RN6kV=V$hURnb>&Yr1QbZCOgodw8M*Yt3zy9+o&vWkkT-WFGev|FZYPdW}7QZaN zObq^Z_nkT-@iZ5Vk6x#WA+hvs?I~E0>5pqH zo{{alm*G~YZEUdIO)9Odj;5p6$vW|QWO?Qok!tBB^6IbY!klP!;-@c6pnVQ~{t~dE zeka-A)lTQ_F$P1qI5xTH0M=aHOLAQ1lLzuA!1M4zSiXlNs?5B=T=@GC8)c0_E1?p1 ztVm~%=v)Esd%-yA^)fVT5rS0dBzopjDwg@$!6nUl`pHNGo%3v|=W2UA;^4|;Jk}t? zD|<0dCK<@=2As1%7DnImQTx_nl&_Bm^Hpcqw#f}N<%&AhaHu7crM7T=sf5KXIgXbQ zF&zTtHDQ&t8L@F-LCB(-4)Z<{orz&MP3aE$^xviq+%8t!TY%abWsrZ*q|o(VDmY)h zi+N{th{=$U#jxELu-d+XnY~AeD83)2?FPv1ndS-ytySpGy33dz|C}1l7UyN&+l#hC zws_sVl0201Wxt@r~>>>hP66TFloJp4F98BK&5iG)p*RbK-c4X`SI(qz)16_CuNii5tj)5f8$?KZI?j#z z%lW&CF{C&Zw}CTsbAHTYQ~K~ng8}%4Y(cF6FSGhX3)Wb3uCz2eT;CC4dY`OW3vlQy#WP1LP6wcYSnAQmABO|yQ4}6edZah(Eht$?_ ze9I(8HOmuaf&=Ldfnd;&DaX{!A93i99@UCL>+YQ1E z_~7h{Ure`SKdG9$0u-f$aK6ZP=JDFgRCo3Y`Z6wl-nO5M?|~HulEFiD8Cq|>3}pL0n0I?Ms(s(f#7t(0d5;G@ddQXV`mJO zUC6)#AHxad?n27beZhM3V)AYBOt|xw%Y4ju4OUWG`0TPN{V@9+8YOju{PbE(Kj=kA zR~2AdvLp}W0^oU7n?D+j_&GpdE)Y^Nwc z!Xptjm)20nZ<}FwTPm*J6N&%&4}nW}KAr3So~SFB!RJs4`rd9(G_aVqjh;q_iU{n! zuom);lyhF6qhO__$eqEuRECQ3S58_CHqK|M?Vf|YSSd*eNSj05%pPN2PZ)T7PvotT zJ&E*%yji{_gGbUL!0)ptfAx4MEB|ugfmC)DKbzkPpgi1PymUC2eac3c&u0t+#?VhmFr3s|V_9jRX=QH*bHIAERL ze71MDFY(rYY~pfsHSrd^Kt2ZjA^zGWXy9WB<^NI8eX7cYwadY0|Ff888HM9&eY9pm z4=_!8!2hKoZW(HX^6vw*XKx@TYN+tZ(KK^AH!*zn!Gq3_dq(_??^CmMG5YM}MM#@f zfvGQM!IuZB_+0n}SPw43&qvCM7q5ckD#WmVe+uxg?n}WryBnCoiez$`+sW1{8B*(c z!WLc!&e4Z{H{i(F7~u%4uvGLCGtAw2vvyoY<)cX6)O;j|%tMIV6eoBTtp!exG(o2; zl1R%|!zrE!zjs0-=MC1Tqm69+{R|g5t%TdP+H|Hv3egO5 zgQ_hh^qqAm1WB9Gzg)*U_{l*gvQPtBLX4<><^|p@4|ljXy+p-y_J%C?#U+dk)St2~j^M8;D#|N+a&n;WSA(#LRIjCn*7z z+UJ;~hAMFFzxV7L$q9Vp$?K3;-AZiZjv~+f7cF#q1ZVdXQWum4vy_S$$LGE=)^peJ9yaWIF(Od^Jf%;8b3~Gv27;x-2wO8fiU(;&lan}`U9=Q+v zMRsAu#ui$V&C=$A4X{l-iAh@$j=lGs=%=rzpy7fOO1RT|Ppa8o3m5b|Q$m%_p2i*Fd+{U3P)c2AMAnXo zQZ=tl)Ztw&$J*Zl7k1tN{kwcH-Qo`!Q+;@*SMDlAw|98iKMSA*b{`ZV6}2g|UgaS`W!Ud!e8rc-(8 zDOh4FL-)SqGW4p;vEg44jK8U5)O?oGLr*5bNH_t#hFp4^5ie{wPh~Jx^@rT1q0}T;|esXbr~(w-U^4EWAVbyAX4+i z3G%+k(&uj-u*~Bl9r(`^ep+}jPc^(4fjlm!S^kIR-#d)ic#P-mlL+NG^{_Zhgf7l1 zhN%|K)V9NkK28ZG?HB4`(BTr~*9w7=wGC~w5&(-958}Ph1$q;o)0V>yU{yItyQ~LE zUAhj=`}~`|+_ViG&n;sTPD%2;{*{vQQUx$D7e#HGm&EqbH4s=3fyK{u!0%g>b7HK5 z?Z2MDh-)R8^`n*HW^`C@l1W2OY=rJ}7l2v*jCD@DMz%3w=C8k>M%AAcB(va3gL}C)>f827lhJ3mCl1ely(u-nGq4n=8(h#0T2Q%N9 zA8mL{t1c}dX;DddU+FrPcBdr%g%<4Uy~)}OIpVouIkv&b27MOZhp`KruxoM%`^Mj& z#)dzn7{&RRPjTIdt4DCrvKKVl{ySXetkc=ERN4@0hq@%r(7;Y(Kl=lil(C9wQidUuOniKgYGj&L> ziz*aMnE*Ab63ImSG14@Ai(J=|!nY3>(Krkvhu_rW)$B8L*~xhFHmVG3YzmkW$KB+o zbPk9`pClW;O~k9_ad25{1t9_o7(88tjK0vtu#_1XCu@t17i~~`fhgFBq|)cI+L$o* zk(7PT!*FLM+?f{&tF$ceOrZw|gsL&NUxG;b=uLchS{TxI$Ad%GKXNbGiFe@0E1Yrr zGFqNLh5gxzRH|qaMl^Sll6i&1aO+xh|HAb}-$!CW`!gKNbi)*hTf{W&^HlnLULm4{K_%P>{huEPjrn1k&465@LND9W0| z;zQ3L>@CiR8L@3M6Z?HD_%y0x!h&Cncx(tr7YXAsw@T7ie+2S0g<(we1pS%5gp4mr zg(BO#c>0AY0bduq|1BOKv}ItW*F6$FU`jMXl`JY&|HOl*IhSnL3A!k4KJwmiXXov0 zMD8KCw|t+Br-fqZ%-xIW=L9EwcvcicwVUYH$}l3psN?otWa6u?!?}ayWMiEMWyj9L z{@*UB%wx&l9s8K)&_ij{sFG$144;-a z&nOonW7CsK_Q}um<9IyzaIF^1Uq}<>ce7Dz;}`Z+j4cSr%!X~-OW8Y*t6}Fa9p=2r zCNk6GH5_`T!)Pbg@`nFKvEzI*eDa?n%H=BYFAM||rLK6g+;$OJbv+VB8*0$-F&`*8h24}=&UIHq(4C$tqqsvi&eZ}Vws+9ZoNmjovDnj<{b>nF_?6Ns&OB;M~1WX7Z)K*t{?n0PM@UtQ(CJ5pj0 zd)Eb56qS=(=Qc1$(t}}jekcvSuSxc&4lyh5M8WT$!{mm0BdQKuVfzdvh`Y)M8j~W4 z#`$`*efL7@cyTHE?30DgtR||a)kj{4g@NSA4@%xXpfmd<`3g#57KeQiwPk4z@Mq?Q?9UP=Tb`$+482yiylAd7nrL!9_g+FlqHy%kCU9 zu-F0o>YZRw;Bhkb%xToG<2s&xGCZl&Vi;fjnXZ1BLDmelnLihIpx@O0v9hPDF#gFi zYU>t-vbOu_T5d%8-j#(jmn7iGUA%8uGJmQEWIDKzn%;iM zOkIV#VLzBpC*P7;ue8aB*jq$bR-JFMWQg(?*y3879QrZ5l&v zR^MHSvwoe#_~|w%boe;uB^R-{yy_&}|0D}5u1thkGA79Xn1jNsAgbRs0Oz28ta{WZ z+F2q1&m#awug1Y#;mu^s=@4A7DS_Imtbpi7@5WK*I{ex$j4`+TsQ;`^ zl6lC19-gz0Ry>(#QL*7Q$z{*r&%(_VjIWWW7W24y`h3{j!R55vuE51~YqC{34Bwka zmKyQgd#oc4fB8zBt%k(W+Qt*rOB3z|u+ahWR`)!>MGi1y$%&>y6A;j%DfflONgNIGB$hbGC17z zl6ihP5N=#dK$D{FxO=F>>&J%CuHSo&4^+5L2e&}oq zg^2!3SdxAKzus2^VQT?;-#?xxd#^<8r)P1Y7B_!-Fv2}AGSU6c2vs<2Mq(FUV8tIu z;)%P1(5xRpx>{Dlr4a@!hP%l4-z4_8MHCpfY($a1((l!i&+T+2TE#5Y9VIyJe-o z$(Qp-w>FZcQRz_OX~n-a>j|oB7!t#Bag3Q#2{r2eaBtsi_}jDtt-f;INc)Sd)iuu9 z?&L&JC=h<17r;5Wv+0~Ev822y2tzlUz}hHeZx$&)%AG(++3=e@r=@IM_!&B@VlA;1 zOam0nB*wSALHG1mHZH822ELL9pGW;Tuyg@QU$B{m1;4_ym=jb!)aM^yH;4f|YZ76{!C!exaN zXPR8ZC~0TVoMa7Q0;g%PzbE*#+#nOac$5AMf7sZs_PFt4FFE?52GWA-aL<1q+22n% zK8dRVeBZDe-v8wMyG7-oa>^eUN^M5dDS7z!ZwQ#ziDH_&sYzkSTFh5Hffu>`*p1f1 zB=%D>)*0@kK~J*D_~?Chf@%ylx9dwEhN z{}j?^IR*NY5nrCwL4&yes7R|SEqx*YbvJ@AWU(&HTJ8q7@?6mUnlZIo5eK)|x%Sj} z$OAPf&FaKy2cMBO(>jUHvKD%!ZUw4y_sX<0eeBsBNjQ0U0aKM33kL`7u+pU-dO0^{ zl42!H{O1A>eNt!)$9zdSqYjfDfC@$$fc?sEbbgg0k=8aKC-#Wb+$C37v3DZ)#C@@u zc&aRR%X-mAT&LYP#1t2FN6-1{64vZDz#rFo89ih@!4tcJmoSD zryT+>+f-a-0`MRGP2v*7NKthN85}hOP|e1zJ&!=CMvboXK0tgFHPDSe3CE^Hqwz** zCZ%U1KFIu!`n@ltKh5`nFrFn=+vp$QO&D)B#HPhkf>0iu>R4=mpPcm&jolItS zXySAkX*TR^Jvpx_Vew8h7{?>d!@YYZO!9ycrmgr!78!AD&plmq)`T=njqt^xihSnt z_SdZbi3zxP;yfH*ECJsqi^Jp;rB18nl;PvN(c@1}9P6 z&;V*DE?`VuCFVqW5i;8V*DtHWNxLSXjo>c)`sM_NJ$g?M#FXKNr55B>>8rI&TlWZ@M=*$Sb#`QWZi-mEex-psPC6B(`AN`B{W-93%hspIp zP%>K^6plGkKkLO%XygqG!naeUwi03}f0^`s7s0c!rZ_k~j5qP9J^5IYi*uH%f-2)h zWWq}D{&%huq2h`w_CCkoF9+#oho|J;-f^OMB8Y|s>cY-zil`kILu2E){_J2T$GiSP zVn5y_>hAqu@rBPWw$a0t&TBdUsvW$Tw4WJyKhYw>v>19PTcM$^AYMQA5Z!II^L&p~ z;+EJL44=XEH$H5}mV4VUJ#>VcX{^JIP9E^(VKJsy$XFb=)1wg>%-xD@JejX`+;ZN254P$9iG0}!MQ}Y0x{S?QuI^M z_2YA@xoiQPP~`3g6O3SiXCjK*U8apv3n0Nd0cM{crTP8mIBv;8d=ka6gi}XJ;|rD^ zHp$>PH4Rj{={yw}z7ChvLa|m{h3sw;q~4o0;MkiqbQnvAM{C_-M(Gg|n#?K)Utdn9edV%sAFHV7mULkL ziO?x|De&w4F5dG?9>kH`R}_3t!k(kbxOMVt68PpM6v?lF8TsX~T>JzKzKNw)(n0K{ z|Ly^AxPtui&4P8OgfXS#I-_8mMGAk|!UH!~QZBsE1LCXy1z_Zz{;Arai3J%zs$JmZFSKK3(6KPi-%HLr~x= zV$d1L=*%qz$-2ex^7LQ0tBm>crouiEBo#y^Hl9C{Wp6n$8&i@=O5`q-M4C(o%n(Cl~$0|3X#xOah1MNyaJE( zN~!L#H1Oo+=fYb9fc2S<*;^R=t1?DDEV@I?n+lm@y1h*DflDNB>rY%CvkCv9I+gR8 z1O3gaG%xHIUF$G{ueZw6rB7M%ZT&|si);ceIni{`tOA;vi}9{wJl^VDOkX7PNl3*~ zT$>vKKbjYz4)<)(j=Ka7VMpNlJP&wzVHw>dT#eJNJ|n+hOM>Yp7HZvM%W+NVf$o;X7B%mgws;|CKn+{nxfvjCIN zo%GA#W0^9NkFv=g!zU6TS!)Q z2{HcEPyBv~W8gMVG&g9+dsiP}tA0666uAhaOgc*S2!VWk0{-L&v-hSrVArxWFlr}* zp3|4&F2gv;dbSaTk7we#y+^?8w*=fNYC@YdPrN@%0MAXdgFEHfB;LmrLVC`_PbC5P z#b@D>LaQw3CorXSy_}+I(|g67K!&N~gZQN!I9Rkwedd7^U$`tmLW+ z`kPH6ONK;IA%O+QlxiARq7LwscE##EQ$yvb(#ds|rEX0Se zd^<=d6^dFcG@MK3x~@Wp4<}&r`)oYRI>KeQCY&hZK@Xi&gG&-hI5TJtm*@8d|2fs5 zrlG~%WBN(HSswLXvw--?wXu2vhG;k80zQ6{&%M8KjA9{kcz39tsLV*9&d0Lp%Gv*5 zVna7g_;j1P2S1`dcBgS&N+!XEsbD*A7#NET*6c|%e!95^-OP<}Wm6jZ_Ul0OS`||C z?ldtRDkR$<%*F|6Vp!)Q4@DzFP!sRZ^$?3mPP{2H`30o4BIA&TZNgVJ8WyBW26@Bt!KdzovAcKQJTD$oJ$jzmeEj-$(kT`5mtRz0w!zC zne0JLB$~0LSKS!atgQgU5^a1xGYEqFo6)H^lGLYWkTcE-;I72E95ye2I01Ew0S6vE zF-wxn>(d}F*6Kl3{tw!i;Ee8#kKl-9BM>)T@&{DXQ7p@H3m5^0Y#^2=-B&}ZqA&Fn)T<%Yo+s$|I;5mcQvDu zz7(#T%7c%K@5a9WI0yEO zP*P$OjZF=x+R1ef=l6Rel1}Ygy^RoX}IoWGJK(vlGjQE6uW2iF5c}>NeT5U|SeJ<_qxki?{&A`mpk#ygOv-r;Y7=~m9 zp@W|g|EilfHvLJ#%uWV(YCX2Ka|` zVViX%F3mXwwtbIj;YSJn(iIYTVIM$ZOBws()ni1FE^^q!0gVr4k`&>E#5hGC4*GjQ z&)o>}UVJw24kSR~0Y75&-yf7= zEblk5Y9L^(|AZPE2|+o!;1$m%`d9ifIiA(S`4!?Bo#jU{kehQ$v$xSrX(ITme?@c4 zE5vC184?l?@MGdPy5`e96p~FQNo68XE&hd8b(C?r`f>J6+EkcjAz-m@V;uA!+yJ6Q z)8O=fe28y|=e~a%FwyP`tZltcii(HnqsoIgyek>c8@-0W>DSo#{0rpPw?fQMFJtPv zrT9mbccJcc3Qep#9ObkXdHPEIoi9h)?F_&|iXEEQk1t)hpLH@jGFu3DSh8K9@&EP!N(@URMDjkZF z8T+Vv&P28>U@umbnS)V~EVeFOLOY{#;NuAvt`Dw8=R+BgyPZ$gs$4^jctg;n>Ubrk z5h_=h!8POgFgTEg+Tqb49Ug$OiefM)V**ATHRf0Y+I0P$a`KiM;)~^%;Zmz2>K;%< zFJnIYbl@HunPpLC3exFMw%}mh6f_p|}!C3VbA;1?S0s2N%<<>FrebMi1S(>lg}gj*>HFbJ2RD66vfk$BNWQ zd=*iO1)bF#TUV81$)2N?e|J-25Jxsizl5*0?cnq71v$y>NA7ieV6t2?u**Xaa;B^{ zzxnJnb?XSh-QRvtHcSy~0{fVBavP>SvV}7o`=Z$<6j!fU57PyM;pS|A(tFbzl>8>+ z&Y4TVLtBC=m?#x(3BJ|LfTH?1s(i_jQptSdh?~h(QyMLu6PDk!MyzV% zD`32_*L=o335$-Tf22Q;^U$TJkn(n6C@@oFbB@TuMQwfX3mzoxxhHAmE@LWiP7u^q z{vs_qxY^86T37ia7S{WjfNkkiP%{`Jfikfq)7}SA>nxeOx}^Onrwopww3_`sAV_?nvAPzms1OS;uVHHi=Ji_@y*)bsaCp zDI6D1iG#HhPZ2>o8Q7t9m4Pc~=oVXf@N(ZvyrQGn8g7=dGm1Nlt7n7Mw%;UoJQ89( zXOZFK--z29ZE|$g1ng0ofJe_*f%&K>-^>X9>KOCaS?xJbqcxY}Aw2g2C)oT&3@p>^k zU*a?liguCdwc%vP{iXEm&tMFG{h&TMX)d0Pll*0-WErG` z$KtQ#Pv%sHIbo*{HOE8mOeR7sLXkd-2vj5ThL+fA+T|lL35C?uFu%@bRJpNV< zHh`N`7@umO2QU4D9NFDCu5}0&1o+T2J8qW{BLoecv+8JkEF=|vge;9bqN2W;&YLVm zS!WHHmUWOcXc|ItO$Iesm_nwDpGDDGPbsT>BG^-!VD;%L{CL{^;^LgjE5R4pomCFvi?8J$qN=C1#I8S1>YvOyk9M=Cq9~m5s#7kjM$u%yMU9mI(m990L>uCnkb2p+Hp=uXc zk?BHj^|$k`4~>z(LzDT9+$hxwQ?gEbfDO)FM3!l7g62=d^t{Ft zG!L@Cfx22cuP~SGs}HB+u6$g=IS8^%=cD5O5_srwjU?6#(d?!tP^7c~o=+H~xAkJc zU^BqiXQ5cR`wJssw-iLYb?EqbA5`nFrwhZc(Dl{f=9z*=VCEeKzSo!laX7RaR5oz^ zC&&GCV}Bca{pSfh#<_zg+}uakaM{56`DwhkyXE9W@;NXWol3+_Q|Xb^OEB0ezu$PqPBKP2R@3jI zllXUYqp&u=f&Sb4fgVuUL@tWY$0p$<_&FL!2h_NZsYxpScsxY5J-80xtFma_%qL{2 zMGSWao}YzP>^ik^7#qhYp%cE?N{A5LIA4Byi9Rw3GPP=Y=)TZlZJ zN_t;bAGb~thuYtH@J+T6^|I56(FE=suc&1YCe48q7bh?XdCfb1Ck2;Hcuqs-J^-^| z4IKTZ14=$KG2q>Gveo(m?0KjH;j71~+J<>JYq=x(o;g58YzpvG?+Q|UQXaRfzNgOI zXJ~jqFCCxzi%IH{Akn)MSPxGd8o1mD8`jidvJ=PJw#p&O+QY1QL)sxDoegL59QaQ`;Y zfev-PXVy06a@bN(cw7o&B9~D>c9e+CPzJ9*%g~;egO{Ab==_IDAhOl~o2NwJZ;tUI zGD8%zxZc0PMniC(yM)V)a<0pBXW>M~R5*QDhHsGEPCALb#-(50-+KG;!n`iCvU}N7OZ74^4$fU#^p? zzprWe4RexTd4h@5s)y{&;c!vS3#44dsakgl4VBGeZ60w9FM(pNPx6Q@2_9oz{I&CT8iAR@kYj=04#NX(94-Wh|W1X*j63^#*?ier8W_|{aVn(-PjamRf+03ZY1~ z?(?3^T*y39OEb@~)C14sRZup`0=IX)P(q`7M5CG&5euh0jTayYZWjK-aD!yjb={8!hXGG20j>83}!NsxFMeZ0dRS~s5O zY45Lx4fBO9#uRgi%(6r#`j#511Rfy~Tz5jJU?tekyv43NtjqtsBCl>vekZ+BwHfCm zaXewe9;&%`4$Wy>4)@P!qvfMSHpTLZSzq`xXj1|FZXZDp%sfM!hBkutoIIGb?+q50 zgj4&5e7rvXn!+@WV-&as#3JJHF3OxEUY4brW|3KD=r}Za>oyG6&R`8OdTf_ z(H$@Ph>~?7y`50RD`7$i^KgLNQlA3(2E|abJsgJ4?LA;|JeHl+zwICVnSXH zp5m9_zqdxD@!2MtaN-ySL>wWZ++Hf-^9545Jq^AjOrRZhuBh50hs|8BC+NyCrsaG+ z8)RBf)mOw3saS3f<5vr+Tc*>1_0m`oaJ&9W_%%k?CMj1cJO^I{sDNUJKHk)P#HcQ_ zLb(I-bosb0wpV>c*VJq}t7{7gpG}6PR;|<`BGqi)w^}#^gvyzTlQklPn6NVxB~FMz zW7#xR_1{k)=2zmjNlO@$+&!2U;SY;sqN(HqK_=+B4d#BIh(C(F$>(qPaBP(fWd7Dg z8`mhF$XqWlJ}`qc)#Q*(EurMVpI+i|P?+ntXflzzG|7Fv2KFa@G|v<&1#*m~Hv5!8 z<7YQfo-~id*Q?X{F$`{hdmZP_2&1{Ock!m+Q&b!&!QF3X;jsi#QqZFMPWHv52u+-KM3Z4M3mTT3nF_e0_Bw=hLf7yMpV5Ss#3m=D{a zX7?-Ny`TGx>g&Nmxrb&~PM2f#l}uVzGs?8-H9-5dMCOG%A98c5@%YMpWc{fWRxb4> zUAZRAn8Z*_x_ z*alqA#898@r|_n`80;`Qj0&4MS zTc+cWo($4cZACjx^Wbk<9gSzSxH-B2<}LbvhWsM_x^)a=g^EFH?-2Z*J_*Hswcz5F zkBGE_B1m72!nsE0$)Uq9Ft||MB79FCbO|e>L-AZzdx{GlirbF8`wr57F|)z6pHJT9 ze`f}E+@?onEg`;>fpZGTps{W;l6!t6ey|Li+|y8(*NQ{q9(ar?Ag7B$0ZqA?%jubT z_;~|ck}V2vf622ow;Mr5Gl1RbWB^Y$+#nk7ZE>l;0BjOd!wQ|fWT9RFRyo|KNz2_q zu=+o;+*|=8ZMj}5>rZ7$O`$Eoj;~&k4A+c|akw#&^tIk+Nbd+#YeZmxVjL0itwbSp zA?&lhLb4}u{jlp-k#5Y!e!GJ(wY!n1-9JK{A4TIXO(XQY{v6bWi!iX`G~-ihhR0fp zfWP+xeC>J5dln%M2NJt@+Ub7eMb`lJ?Kn!LLe=ruw{SB4{va%zDMh9<9HPIUHS+R4 zdIQTbHuCr#=7mO2sq?Q-)IZ=FcTe^MmoP_;4b1rhy;bqVYf+2fKO*GDdrx%J?D?5K0M?1Zh$Xm zV#y6zRG)JJpL#1}&QES0A{;`kTAQ#o(hS99zO!LIQ^X&x=o20{ddp}8n4{*HBZ!fY^vR@$BzVa!#{aVh z3>unXK;&%Dw@agvw>h7V?P_XTED5grCt{i1Zqh5uop++YnWH`&<9gv0ycd{*Jx+6B z>Z~7RcL8Oi#dAUVoe%VUY31b_b%9aiemJp80Q+Plh+Rewjx1P#@jp2CcHb|K*;ob zPp;bBIC>FA?sO%J?juyvI3A_{$m8cpsl=^y3nQ>6+05nVSA45zhuw(}anasucr~ny zJWm*=mR}W9f@~G+rppzjaJNq)t@KVq^Q*j>H7_mRrp z-3{aThzhGmaUG?7WYy)b(0bzkSxkG3Rr7{cvqX04pOsi~#vYD#E8_etA6%qA0X}^A zhq2OzuzOz!bS;|(y~?5t`CQGI!g^w}VE`2lY{1x(U(j1AVG+pX@$B8t!Gz9sToNBn z_0yE0;qpzo^Vc1sKVXKZ-%8P%lnW@)S4CC+N#N7juZhXQc+`%nCemhu#O}QhowhlT z4z@QlYiZRixX%5O(}`qgYC1}GMbT|~*O>g1Iu_egRAI*U$Mn87FaFNb43$0yb~{*sUYd01(#jGwgf@WV?JJTNJrdIWjF z(Ufu;@4{u#Og|E{;0a(WY6~8Zd1TG0!=!TeG*Fr*i{?(pNY|0gprp?6N5vDF9>Ew8 z327&Oqrb?@r?%W~D;duD$>Z;Ph4|Oe1@6XhuF6NcaD6y}y|c~-7q9lfW$KYIcT^Ci zTkeyN2vK-_<2gC@_##m{mVhl24q_fvV$wJGQIBt9@F%Q+9St~2wLKqE4UVao-^>Dd zUnUNQt=yT`g0~gg$oU~rzOtnxz2tHRk1FpnKc4lFer!&Gl?qeP*};(>@fc>*bIt?D z`9*=CQS#Y(2j?L!!oB(&hi1MUG}leR*x7YBv6thcSthgc1*y2~)jP&aED2`4j4>~j z3I~DZ{j^O}5pwT};hcg*=yz$P7xm|%uC71E`!?Xt$`(}iR^-o(YhiBv7UrLBItjsH zR=Ah#B+bN{>JBTwKietzhU*h7G;W7iD_!wF5qS*x9!rh;7vjK%cVtOK5G+1p11t9Q zl7_$u@WZVW$KNuHtR~lGe7qC}pT{v}@=5fPRtsJ`V+0E|jF>tuiPjxpiM8uCqSwDf zTsrSFabMFx{s~OQGXeXc*E5P_i#u_<=nUGLW=IcN+m ziqI`;AyreuD$1qfNAFFT*JeS#diyeMRWE5zTPho)oB?6&o$yj{jK(a`Mql4Q^nr^d z^K|kCTvaNEQptDdNtGhhtZoFpH=4)VmvZl{r>M`XccfJIHmzQ`0&}MNz*H?kj)f?K zyH-`vO)8CKtla{-SLTqk^lqYmi|evEo`Y7$Hn=Bq5?+7uB$@YJFm(D1Vad^L~fvgeub4bGwSl@a=)ZYGrNSI4GHwq&#MdRV)RqG3Q6bEy9n z$+ZG7ep3KOe_6bjca?a_%A?R&K5Kim6nqv$;^RHm=y|>Yy5_xywE}_A*R&CjpGYDC z(_3gZ*Wdcq061(Qj%?#3@cr`~l`aS~S6Us=;-Cb1U}FXyitFL*k9<0Z^B`IUl!E;e zefVIp4Fs(s;dz!AuVrx`T$2Y7P;!OzmpT}^sEYP||3mdgS8!DEeC847Q6bkRv9k{L zk|!0${HvUoJ97C}e9F_o#3ruyUG)&$nPnLLIh`hFI@tS9I}1Y4bI$i%>Q5D!7iNLQ|>&4ADKb zY(GmCD#XECJp{yK9zc?Y3f$i}gVLlpNP6^`o^#A0^*UojY~%vYRkTFqiCQQiUxFiH zeDbJ&HWooV_~=}P<>f6%{qpF3k7m5NWF@vrJi}|hK9Rc|%Wa(NR($=G!CTgrOJzi=$+s>#4GP3VQMoVaCHU9!72pJV(~lYE_C^4rn_Uk%5>bCDx3Z0LmMHa^s$O}x=RZ~^Qak>H!(<@hTi zM)03W1-{+Q_^@{t%n#wXXFe_HKA&TCbmU-+h9Z4^$OaWZ&0{}`#?qcgQ{V%` z`Ro>5g4buGaNPSRxh=f{WBfj|0o;8@BQT40h1`d$X1#DiPaWM1lhERfAo?hX;xw}m zs#Fj_yw{v@kyb{hstpv_OUNF^i6?9x}q2+-m>7x-X*0Yy$5${Wc zHZ#RWMTHRde#vvVeeX0bKd%6WlAEZ~$|ayRoW^`iv4%NKC+Jgc2PRbH29eBBpmV&{ zj3TSF%Ts4GrhmdYmXR;91FbLR4qG&a%A7Hkgdz^cF< z!2UhW)4W{GHtH!t_0wQnbZsT9cytJsru@Yv4SF!;<2Y}G%dl3SOebJN62zph)kz5YMqkt@aKrcH+e%OIdmdy#&-& zV2l&EEZ+XO#h^Rl03UtiIp%~I6+HW@p-puXZW`T)HdlSwg9V>xrQs=7Yt|a-d{qZe zU6nw&s>9&6Y@Ckdyhppk#gz1If!Tt6L~&m_zA_nLY>onsbG@v@v^YBL(M=kVGaHmC z$M2XbXkx3e6!%E3hSi(T5Lxbga9_}Z3hl2W#sYq*6}k{|m&Q^aH}y2VSb}plw{T9d zOjapy4fNTE;Z>XuPcEK^!zvtWtxpB>ijh=}zo8ebSJQUeL^AHX6SunW#FFFR$()6m z^p5&65Mg}rq8LkiCJLkIwm^Jc^#Q)AnL?N522#m!AHHnd40b97^s2;R`s3OWxFz@+ zcTKaR$32dqPf`M@Zok5E7aLHQG9l5Li^;o)``FCpW6xt%7%JiR=aaeYo`Mj3>G{M^ zt2I`TC9gl+RBK+ zbw8LpXov5=j*}+w_4r<3H8!?+LxJ@$G^#Q%L1r1P42Z;|);H*n_Yatu3!nL$8nyA( zs+R=b^wUkz+d%BeF4Ab|3m1R7($?8WY2B6(9GUI{k{8}W?UX-cuC@j?oYcW*U0mKX z@gV*;eLYUI+mDS|`ebBX5HbhUaF6L4I=O!%x!LN8Ax3jx{f7P2yx|UUmfQxv9%RrS zGZC_UaV*AOe@*hFF5}{-(m3Wc0VBD7MvRC^l$Yv_@Zf#*6|&z(9`*3p~r8oOJqf|(^yvc!FRkl)Jm5u z6T|O;=QtL*A1p6QWd1uojbyfN$NWE@#9V}jXYz0HH%W3mr6m(_(Iyqp&jcP@h8{8@R1yJ zKX99Kt+i7Rg@?3d)<(K(r8`x*9Eb5-Ciz}s4kN?u7h=j9;ikO@tXo=vqIs^UwE8S; z59tKy{`ZuxHi#Vo!XVqS1;Zbj;V@scF(Yd#2#9cwyRA>j&Ku9z|L&KgW!)Eg^y5Sm zX}>hi1vJp`a+3*M@0tMzE>D8{p`8G4BJt2pF9>_lOke++h`+p>sfO1WQJNb@%-0H| zV{bI7_7~y#k0)?mju{58>!#%kW-;gb4wKijIo3}*=kwTe49DKjXI8ta4 zV*OtqdHrP)EWI61l0JT+J30bzrSWRms{EAtFO`SUxh$1E_k|AU1z>`#DbWtU%l=UA z;Q4nsqi2>c$5;x%%&KAHtn~taH#>n`+A3Jm77V|08flWE9^Ngp1({QssGJ^^yuJkV%u8dmOchPEuJ#*<^c)OJ9d>tI%a zk^WkgyMC6;zWxH8Yi2UpE-uhh7Y@^I`h$|tMEGxx2i-5Gj``INu=lJQtY{11Psr+q zH%&L;iRTmG+u6~!{4zZF%?C!8|AfkyA|S020hexj!a#He1SOe+jqfC;(jtak*tG?+ zynJZah11Bd&!S$hpVR(39W?CEXZF7%5tuF{3op(YVnA&utln{&)XbF!W_bmw%R8gJ zm?sAP*aG_;?=hh&t+-e@l=S6ILd`{+ai#T2s+njBO&a0M(nxJ|Kavj5Cp#gjV=z`h z1uVVmNa>tOAk!p6cPvQDEUXYDa2la-S|qGvrs zDz|~v>k(RYZv&Ra0(^Qo1iRP8kuN_jkbg*%*VFkLVskFx1ddmcZ+?RK?R!Dq50BCV zwl{ccK6CNPZ)9(Src0 zbfle3UG;<>HBKfQ9lYRkXc~wQ>cAq478uXl3;|YA@ZrcXbv|B2KMjdEEw@ zrx_2c7e7F)+5_y81rj(#UxxMmx*SGKb%=avEB$f(Emd7}1XusbfTb_oiN0MD)~Q^= zNiX8by`R6xP}M&&aq3A-osx_?vn8SJo*+DnxkkQixyC(nQS`lU)!2*{o zVz_dg{w$WICjXMjm0cFhx6vsm-7bJ5Hf1#L&Py8iEeX1}h?)qUc0qrG5D*seC-u!A zm|xqDqP0dZ%;sf*vg01+<)|zkUusM8mF3~?MK!Fg7a;3x2Iwv2S{U?uNHV#M;-cEq z%sZVE3~!YR4c>nmn1$~2(&QA7mu)8sZX9p#BZ2z@+O(!6n6$UdCs~WiQPc7}@oMJps20KA;Y_m7vw| zIm}*JgHu*rrMuKsV3B|-I&NME0Y3xi8mF@)uw{@9y3F;p^^U=f!}|C*V*-?}9_9LF zJDI0PIkx|oX}o0RFtnbzi||yRz@E(r?RKY#=#~U3Q09ayOsC=YZ|3-D?Glug`A3h{ zXJPm3bU6A~2#Ykg!ldpwT!uW8lzFspa}W~@EBc3v^mgLr89H?D!>6?0!VW(7o}zuE ziv0VW#TfkjL5nw*kdKCiXlAAXkq3RLl5RFhA5DXCiA-FTCP5~C;pP*?H%R-F2#&G& zjm%rJ3C{CZgLYXEomZ#^%R~csI`b7#_}C?4*O!Cg(xy<}ungofvv9wTHEk6!B&WS& zFi%P!5328=)eOP*n-kD){Y*A4X@ptYZ$OnV?x#UhO-a`B>7=z&1!{fMaN*I_@JL&L z>w}3w;H2x!qxTu4(q(eyNFEq^E`tK@cd^ss6mSC)>6sk=uL~{*o1@3KYxJw}dz5@| z8s*D`@cKM!a%OR{oj9@7+$Z~WLbs(9On zK}M{HcGc(7o)?{r>h5M@UsFum^e5oa);#iIsU}(t=)mvr2BM(agQJ~erZjatn5nYpN3%!lmSIoR-DDO{K@iIgDQUTFx+zbTol-?aj=txp1V z-$}REz9xaqTGV0de0)35PtL2#;7?^Se5vsmXAf?KRqxecwvRBFUK52^8z!4<^Zi1X zEj>X_9@pWgj771r$9Ex{l?=MmxxcYysDZbp8us}w2F;EXxc)pDl}}mlm%eUd!&Zf& z;s*jx^u=h0R0t$13Sgj^C6!5hPN%H+0<(pu;G2RycyGpP(q9uq&h4+{c1Gu@fb0S~ z)q?YfzKJE8%g)1>vszfJc@~sciSw7TvoZg47aq{B!1^c7#4>arT5Vj2OYc?F__wQw zzz#(!F!v1`lot#N`PcE2gFjv?ngEBoCpW&nBWSX>YArdRr2tYEGSH{Djp^Ziqp{U~ zaQJ8#{8BhgkEIQv*Y08zTyP6tRSAQVn+Ca|S`F^Tgv5g3fwyT53yJ-CBRf+jCI+>`ur_rU;kz6)xAr1wXz$p9?T`qkQ zYF>)aVrMBZyDy1Hc1O@VLt#YKBLY9{T0??^OX)tRJSxUz&~wzfpKr>kI8{XBbi>;!Sw3}lZOa14Nv#^{01EjgV0y@}0znGM&3rNJ*m5R@(F!L_bc zXkA$V-VQcwd(UqA+JCx9g>M6In?*L7NM0r7WIe}EoehdfndIk=Of2I%^8?~PKxOd+ z;;WU39`hnd!k<{!+mQzR91+~M!GOiLvgoF@8@#Wz!0y5f%zAALil+u?#g10cQ4Qy2 z3o-P*hdWU#Hb4tKeZ129od$61)tg(KVEVCDO!|xca78VO3f+B6>q>XR?9l{pd2@%S zux$su)AWjbx9uh74bm_?;|^7^zJ(d{-y83X`zgq*-1?k6l8%5gVjFNl?qb-kI~}8x3C(*X0cV;| zQ{|1P=@g;m_%hOozWZi}a`W<`L~SXJZE@f_GH(#AqDkk+yG)(`arnjxz@!!WFjHF= z`4{@=?@m2(nL`)w*O@e2(Bna~vb?{ zMm6l3pFpE0nc#~jP4sq?3ks-cgX*hrc$|2f@&X%}CnG)RGaL^A0lU!F$rDc3hcP=m z)S+M1g6GR+wCZnP1JdjmRA8|3sPF1sCJ^>S-od*405sg*yDTe-5V>NdZ`V zqIH_NWcglYXp)+R=ZdF5pF%x#wL5|CZvVl%6`#qd&Tr^W7Nz^eIcJa7WAyd&gXdG0 zAwQ~$WS|%?QTzo;^z_pgy(j6NHLD~16cTT@3UP~QRSU8 zGxN3`R&}~yp4lPe;M^?wnq&O-RZeac%vlC1H~$g69Wl(cQ)x8&+$J3Ooyz62)JTZN z1b|{|n$^O2WiE5RjKEL)Z6y+9(@HlGS$mS5wx=E4HeTdruJ0(55JxxaFF})7S1$AE zfR&RM!OYSyIFp=*rQ3gk-^70EB`1L|YCljn%gM}~)1KI=XoC~E4voHoA?7(5Fh4%> zcwV>5A;egTJd+hPc_|+Pt8~R-p5{ts!klBo!(0;gTc^U$a2x!aR>Mo@@)f=@b8*SV zb#Qv83*yN|a49vJ|7`m)^yV_pk)!LVXjd`iKRpe91i~TDT$sEVbAiPwqVQpf5?;33 z2`hJX@RkPu1HO$U$C}#0DrlXf)$zBuJVXl_oEirC7FDq7Nv9qIef>RtoSeh&yV!e;G=FhEGmmFp#?Phf+|U$#PK-NOA+65oz1R6nkkft8jT-$ z%$^N+V`Le=jI$u?-^Y`P2NP+`#h>tf{WOeBOC{6O{9txf3SBrcnmi`%5VL$LPF3S} z#l2fu!{-H*|79w)H5s9zq&}QbuP1M2jN;70c5t%K4-&>2sNJDcbUfiU#tObSe*O%@M1|8fkZ0e7ZK<~Vqp3yD+YVJN#<%E(-m zf~oPs_)wq@9oJ95OPmX2Fmg4t>E0pD%nUMR(1V#prkH$s_l;D9XTV?CrLe~`g7ctH z#;;%WX}H=iaxmuv(OVUbIT?8*X=?&~_gx&qZvG|}DW5@C_AJd>ZUZZ#PN7rjLpJCB zdVI667H4&4G9GamMCqE-qK-+&O#@FrS*wn$)LgEQ*d0qiOcc@^Mfe3q8?lP<|gmvPQ^bRb5O_BiM%`(2Spi+&|F*_4tmAWHFFEdXsa$3Bye7oVjf+8?H#F_ zb`i|I1nB*0U$7XHrJG;Op-a_U$)Yuv=)|18@Z-TEaMg9e!YCz<+;&WesU1b8DI7tT_K0HGCgcjJjKO5tG)iKy{J8=MM zxcOKQ8!KACW>Yx%+IETBh%A6u`zW~4sz?lvDw}YPQ9APB0$Cw(kN(TAf{^&XL^>y( zwvKV!Hvw0C^C=rQs)?hxrzCOG7-epma2f5N$+)jojT~$HOWVFAGJ7p_p~f+RreAMk zw5Sa3H0IOAawQNocQKgPsPo-6AB8^IR+Q?NApayeCgb(VVCV83iq`HT3W=_;wj-JC z^f1EpG6Q&X#aui&pBmkoaey)zne1KX8?+>0A7m9@GJX@-$d7Z6!>vgQB#TL><3}_| z-yD{7cF%&U`$1rC5Qvcv=7Z-XVkc%*bW6$|M7|UWV;{?RGbB=-^w_} zAqx_j&pe?tFQPZ+Bb$9K2Gr9W$NAXY5vQ!g44c_C)=cu8V`6F)TIYfO) zEDB7zOIFJ}Q-wu3^v1k*Xx=wQ`z|fvIY+&ta}VCeC)+L)msxRO-G7XE92Wo@U%rvU z9OHYzS|Kvr5sRkkCg>`l3*on?fx?muI?dxW4e#5J2hLBWQ#e-2z$SmHW%G}5CHwg# zxrYqg@JIeB2kc-x(I{q={O&3yVf8CvxkV_9g_Hts=K|t!U?$|kbr`G3M%h2NXwCK+ z@KGrq#}C-z_ct-L19y`lj(L_yLfpV(O8#^QGgCpyn_EsgdL!H15sA+O*I z;U}%6w(Ks*m|#c_EIW^*??Ra23q{`~PilC`28y@!5Qn){L`K96 zj*&fN_lo( z{Gx7le-1*YfC(|_o7h;qr-+p7QitCCgQRuU8>T`0BAykuqoFl(u%l!z%4s|#ovaDx z>@&tc?iSGFRLs^2g>&93KQ!DGLPBUT*?H53nVjy9QiGA??RV~TRhr|B_xq^!(`x?9 z^{#N*>`9!oe8V>ZCV^Gsc(2^81`S5QS%rWm_Q`?u)UA_en9_$Pm+NhZDFvNAYg6_4Gl!!Q3XC`6dp>YaJ?W%cW zk5{0_gg5kbwL*j6(I^Pq9R|xybK#lhe*7!)iR|S#JT8Z>LQ23Yu*$>}UXo zY|+LCpZ)34t%YR4%23Ts@nq$xRIY1Q!;ZZ4fMBhKP+EAMCPrR>O;QFp^YVRsKN7^bT3IIE zC>!aUN+vKrmvt-aAhSv`q5183>T-Xc$%-s7^zm*Z@ny5b`s3$R2!lNsmE-m_)w;Btg6oIE9oheQuS(h%~GuDXCrxqFw%ul4ZXU=0l_IEo5{ z58DsFgd@|uuqU~W%Gs*`ce!Wk9ShO&>{(E}Hydk?Hxu`I8M?4M9frQY#F1tp%r(2k z&c&JVY`+eS^$k%n*$QI$@$ilF*JgGHVe|Si3UT_lX+Wg$taTOe3f|EO?R)gNqoPT} zVjDCqy-Y3(~*NGe=`C+~6@#QksS zrS^}wuKy(UH7~}aUuI(ZWGhUtQw0AymB#PE+|KR8ED$b}fUZaH`TB{y#CKN(Y~At@ zT;x8|AN8T63J+q>(sfY&^f0)ty+9MD1cFmqCShK8;`NBdkkb~ze(Dis*Bs4vBEB}lcr>vBL%bhR*+a#=lb`0|=#1I)93#=V z-p3u^p6H-UvJb(QTieOHy|Sn~FBc0LQL+b+Wwr4o?7BuUF-jzVP1OU8bcC;ASRLG3tTp8PWMxH6TzS|J7@ z`5F*=qzXj+x5Ba*3tZNlNE~(S!Qt*|I`wS<_74uz3<+mrN1c5P|HBLtc&ZPh>f>Sh zkBNGy?t}|BBY5rqIOdbBCN3PBO~c>VlfO~FXo{g4nTJ6bvT!|K+cFXCmDBN;lNDAu zek5b_3{ZOSD~49AgrRpCK-`mIx>XUA{lJxeHoZ*8Q+t?D)PYd<5?a_eKySNeA@3JYvs0mc@*pYM9&?LCzk!N1gCH6W#TU(t^ogo^=JhBPP=EkH#D`b)1RRafYXp z&*Awr1IP*#Z8ZHP2OCpnvPy?CSz(U|u)Fb|Ic25`&OUxnpOs6#J_#n>M{ltb;$P^V zz3cF^(IbqOab@;bE5Nyj@~qPxicc7LG~uyPtM$?<5{;Y>8~4EF>-D=9Z+7C@JTHb4LdF%hcnths(fp)mgGe?WOUT z)IYRs&;&XS+Hc z5al{65Gh|z&fK`o{yCOHENUW2_-6?db9E;eSCZl0InhQs-1o2MFihmGO+6N#**d_!k3lfkO_$jopABLS=W%AeG3D<~!M&XCA+X4v>|c`w z-Frod)7y5c{=x&kR1AUO>~^A7H;fykgzaa;#0(5wK9ZMc>EwmJ?3O)axda*V zCc!$mJ@Aq~u#kmKf3L%rX<9|?Wid1 zpgDB&a)kH8#zbZAVLT|k4NMmIGF}B`ypU>7I4UX#N0nGSzd)$*j;b^1Y2(hXT9moR;Pml$6lhC?pS39@@>~e1T%8Sx_6PAc%_1~F3?uZ^ z!N_zWl-d6W2HNvbzx5=zns(5NIq_g?!Sx*u&Ib3jABpKVH*7j?jZ>=IKt#0|$P<)qj&xI;#L-!@Jf+P-HxDT2A_|Rquqgi>@tqV+#%jypL%a??FW&?OAP0{ZNHmseN5jiK zYHW_62ui8x;^NQKut@F%UGaAtOtQ739-mi3=Y;!2WQHjUPJBgDl8x}^$shE#{X*26 zxfPGDa)+=ri^)N$HTbFfIWhR$i|IcN;4o_qSGSy`Kdc`SMp2;g*e!ARl~aH@Tesl& z_m!AE{T3}Z^2gT-7ih43IZT_NfxKt-WN%s>4sKUKNhxpU!nwD* z>&p67Ct+gH$Ns{ z&E(PJ8OQLq_{!v%pJUCRCF6@dLHM)C5qb~m!M(kTFj&@vCj{S-is?rnK=lW)kCsG* zLQO_R+W^I7yqE_himtY9XUomPp-PbJ5L`WplcUyQYMTOP%gUk4ac}JVbPzW5DsX$d zTrfKw1odyi=)6BW;6v(km?1kv3RdJnYLy!O_Nt#m?kc1k9g0X&%qdzZ)r5WlT2yYF zo0i}Wm}!!WamHM}GT#tG3`SQclko{G-7yf3Z@kQ@j$|0p z6OA-^wg<=k%H#!h<>DZJm=zBlBVZVX+r5*i!AK;IEFJ=KViE9~L$T@g2ikr+7gzLT zgVxp=xW=cAx%lBAnR|XWh9BApiusmAyMd3NCZDH*9ihZ(^SfwN|GwI2hi-)U3l!r16rIj85hsW zhEocjSpT&gA{lpv%c^h3>sO+<{gEm59ya1; z_h)JRIe+wekW3FdyP|IQRFl;7JamD*G`7iXP)p(Bb&-D93m6et^{5$A2YXKf*-~_tca;WD zN@2KWoIDJvV~(tuK?}~b<9&`*Y`n*w*&d~jf3-PvkclnZ$sB~6bO8#?`^`|}P|UrV zhc3Tn!ptQixVJEgu01p#+GEqn^H*n~RxyTI!_6m#h?OK7#PfW4z`3V^CxkR##zQB}MQ>dZG5RC|Z zO=IZ@9!nabnv-|paAzvn$MIXD11{6SrGuE$ZVRp9^3eFZ1wS5E1EH>sr264?8vWw~ zW9XER0vZWe`oyAP!^J>6e@N0~@S;4VC&glP&JH5Is1Ws@j=+y=60k#A74n|_23n+o zgK=W`!tNh@XK;exx__o75S8Mg2d&Ck{#FYkYl0TXA*f&cGpzH=Qkm& zc(yO@d$5-CfNS8Zfa?%Dc@b(yXV7`(f2eiEJdTaC7F6a>?n39G@s zc>>0T=KaJ(hU*Y^CBWHrdL+2~8U~ClCD&dw6RCg4p!|j#Tv*L{iCV(RVF3j+SK@X# zo06br!wJ-|Y+$CxA3~E(H?ru|6!yXOn@dB%%I(-R7KuOf|njxB@c*Xsww!* z`41NSiKHgbdp?i^ziNk>L1n4^`tja$u9agJsm9I(xWfub{T80B!oP&?ce zilg@@5=gUNi#JB^<1m-4$zHh*`2Rd0*ZmLu*P#xd+=k&hwi9^ZzwdC*n zB=Xg#$$0DU79!RhhugGl$>(3GAk-~{BSuPaMq>r6%`1UFrzr4~Bw_6LZ2UCg5AjL# zf{MzijdNOJaR1d75<)=KxX}b#Z zJ@+!0?7vAu`mA8ydPzK0l!>z4BA_xs7GoD}z%90U5dLQzF1=d|rhWxf>Utp+{xb>8 zB+c-Ih#(&L+eUA=97jJ^3_hcyd)Qwr6CtdQro2h5 zfh@gJ#?4i8Lr_KCif#!^1N%3TkY64OL1Sg)wSO=BY^Z|NXRjsq3KLv%P_=G&JWa5j@jtc^U3Ek~D< zd(rjGqYG0>+WHvSW%dwe#EmlBFI>e1;hSKZ-gg=}G#3*8`$3wx{IAP-UkncIpqKey zK=gbLOxU*+BCY)(v{9R(7kHe1_#LuCWR z&~+BQp}C)TTl+g3+>wtePIGW!uLKc#mq9M8B%sgUHhS-TFgUNhLN=%Eq+XkL;W?RB zYVkT3UTd@x)wfl&SoSS_ze0xmvb2KHP6cw#$qC&izC`Js5u)rK#V{8p(faQDY=xp6 zgojySY9n{1_#jM{T{I?@PHkjA>E|73ng+r1kJ8RVcOl+%88mZq^}5_@dg{?frg6U~ z=-=@MsiIwc_1lRcTW*crzh2XL%Xp5%m5B9fEEHazW)c_8^?u6d!JeC|8S!Z`q@*N* z8F(aw{ioJrt78q`_#;B3w&;PugDMDY5opYC{6Ut?x5k4KEIwQrZBFQa7O9sjc}4CgI=H|mk%|9 z8NSBQ_9g;t&RCO|%l6__jWg6U*BlpHnsPonIfyBp4LgHgVAh+f=)Zp>dEc&trQ4o@ zNWUzc+}A@2R<%*38^xFr*Tfnf+K9^xvS6W!GIpdkB1fcy_Ut@v-c?0@Cx?LBCn3(; z_#S5~hSFyZ0~p{~2hXkaVUltpu`8TSZC{M=IcYj??5_!_e^r3@Jbyz;NDd14dGN2y z38vQ`r^Ei`HQ?jj4k^ViA=GFW5!CWve#Z5abUZfgYi!G z1?o6BN<+&}QE3e;96D2uF&Tg9)LndP`hFj_w#MLGE|+NfLmQ?yt|z@!E-)Pa2;R)) z`o1r&6Vnyi3O%AhUsG|WvIp$?AWx+W&B(TKuJ2jE;QYt);hs+jU2*FWUi`ipTJPMYUc3}~ z=cpImYmxzlcXD6_!*RJC6L5b0XF6`{g}w6&S?wub$=aD)+1E?mvEp74n7K&e^ZqD! zVJp}eU8M{sI4-M-=qAt+btm=gTjs~W53=!@HN?!UgY>Xkye=h(PM)>&uhlYg(XJ4- z22iRcrh-rAq@Zk*Aj&jFVP)KENNkV6z+6W(w5o(CqKqZAI{0b!bR2C9reiyuL2Z5o zbrWW3ufZaaIBAHdO(Vgd%egdfzYB$m7qL}O9A4Um;iSwaLYW|#wdW2wbmKgJ!HQEJ@G|8lVLay+Pgb7&Ih{;AAIFVr}}BEZjD1{MpAFei_-blSR%kQ$>5o-N>1E zWRWQt=kG-3m^OS9U5{6lvUz*eHi7a&Z^8@OO0Msbh8H&kxV%mtQ9Nf%&F9yE(4`5D z^$z*QVItMc&*_r*k}jls&YpnH8!~W_lNjfOFDBgwv=|H10;=-;F4T&j0S*1F{6(kZ zu)A0k%k1`Xj`b_(J~B)%m`3uI&QF3{Z!%H*SSb9s;f&o2v>@bwC`nhn3}Q?eTf6Zz zJeRvg118!dZ%QijK6fE}T)6{(D%~Op6iKtzeSZJ+*$}rZl^8qjgs%^KQR46uyfBo^ zpL|P?T_E4WXdXNd^A?>)uAu^TD|Wzi!<$&Xww72ZZh|ZLp8VME$rfp>0jYhL=x$mM zVe+Z)acdSm(Aq*yO8B6L9D`D>b*M@kpkitr+2J!E1T3cD+-wt6bb3t9xSikInHqRo zM--nk_oAL!HX zR~be$8)m+_O`44waC?geZr&sZ`*ta@SG`mkjTd;)yIG+qdnJMj?7hIWIgH{1y?^BH zvD2)f)~wxL2yfYoX4?bc-hd_kn&(H>?bfBg zpNBC^Tx)Qh<_wG)tcOXL2WhRO5oDgZPrLJ{!l97)pm8Q2)PFW27G0z6QCA_n=oa1e zDwUb@klVXI8zglPn^Dy42Pp7b=zDu3ZnoP@V!H1U1y5&a?&;=7yf4LRuYS>Y+|Jiq z*9$I+XOZtFw@DwKAqnw(^nG*!KaP}OfygS86Khmq&5Hz@zvUt8eU;$uy3_E2B!VTE zu^BV&f{EuRV^`cHDy%UN6ct<{?u-F0x$vF@6(xeuHx=xtE+bFPWEz*&yrqKuUMTf= z5jab(!~c@nkXSZD_*w^83&SM&ffuB@NyBa3LJa&O+4u%;qx7XbYF2(2ZF+Cf6-t#< z*F(YN$+CJJoNWs?pMHQFnFq*M@5kVCX?!MbeCTwkjD@yr9xXl1%7_Muf^#$*FyJG3()p*gl zj_BBg(fAZu;Hu+Tzr+zn4Qt>R&jdyzI*8XKInZhRO0_#*fOAkGJb7u<==*mXxh&yI zsc=4bcPs9(Q8j8lNaSh&h zjJW-#8n&P4EX#9n&EKEM*N@SW+E}9Osm9LF3?(<@4}$fWG!7@V(YT2+jR~C7ejnDf5Fv5x)>{er`ep71Bb9=9iI0PP8Y`&<|yckT&zZgiA- zCvBivN9M6tKSUBm{cWh>(nDUXJWn^I#L)SlclqqcYjVH$wIm)7#B;nty_xotob1OF%I=*f@#l^Ut~_rDg1H!0||l*4B?mH{5%gl zdS)(Yo#MgU!?DyrF9?fzIBsK@4sX&>G;`^IGkxMcl_@iIM&F6g@tFN}a1fR^*%Gl0 z{~Dhohi5jx<@eH%cGQx0#4L`C?_7foSOEDc?T`C=I&o&j0?vEb&A+lv8X`9f zHaetEH5nBd0&(6L-F^KgGd|IlWUCj_1EoSt%7{2l^ACsVn;uaskw47i4-WWETMb;F zY=K}gT@zWiF!<3qk7T6_Kw;rp3aV0A=MqL(+6Fh$yOof`dxL)-P zjQhhUIzNw-Sr&2_8>I!$1#MvSF$Ey(Bq*^9C#JydMBB5O+DT3DbWMP9j(r2|-J*br zYf8z+?pj_OQ$u>iVxeThZY(?b21YsHPo$p^1}#~P!I?UBdX9wcSK{Z3TNz6=eXJ8T#464cfmL5=*2gRCmYB5=b^b69Lj~#K-yFC9Mmuh|9Hg-q zEV=B!IGySc3;}->5eH|I51%VxN!>QoymS$*r%lI2(LAh?o{a~jI_NsD)6jp{8G2`) zB>WURnDz1$I-D5iDS8-?`Tx>k&uv{gQ|Aon<1!!v77xkSL(y=e1ePkiX+3k?@zq!D>r1EByCAL+9a_Qya$dinf%7cA+7pWxVR#*CQGz zlAUCaB#88>n@t%Lc=TSZ9-1l|;e%~+uh|^IL z8o3`At~MpVI@93Ca2SSkn`7x?YiQfp0oILYpjP;SnfxYYj?XO2dpo%cg10Szk)UWO z&tx^7PGYG1z-~lt?%Tb8qm4)JJ+TjNh}vv!ZvY zTd&&iloLc)tfltyomI4QJEU-_SLIO=Mrjbq@GH8x!uelIEpX=$wtkIQl~v z?R7nH>wm(eKq!pMEm1PlGas^k{>1Qu9dJkR1+=(o!@(o7>HHNdVDSkZ*!L~l%wui} z5&I$oXQMsw_?LQC_*4?iH(QS}I;JoydImCTcSzC=H&njy5>5_XBPVn&L2BE6{^tBP z>hmKGqJ9h1uJXzURV958N!EsIC4sbOau)47ae}>Ma|(}axrsyNhe4q)h>;BV3e~o) z*ynkVeRIA6?|ExrhsS69^U4u2cZJhg6%nZIJR8X5Iuyx2h|{+vqnJPix~KeruX@(# zIeQv!`6*@mo&T2>?wAYlDjqN}sTFSgeE~K3F~o3E1uU+(gp$GK5VRu#s{aYn9Y?Y- zL$i;V3dYbx&m_1P@tJ!6iA6`{Q0(P;Vgj=@khdw9h`CA;@7Z2v60wtND=O?6w{VJU zy~a?ec?4F@%Y`%RMR-@At7At{6xeOdrM-4L$*vZP^}m9M+!8MP<*)<{PwL>ni5K|x zq9Bzn6vgL0f%x&oL-y&$gH(rOqh@+trvLi5d3|RQyfxX4GE2pQ$j89=k5~NO5N&d? z`x;-&?g32DRLb?&->)yDNCsS}1umWQZR^^HDA761Gnrf-N^~ zL2hXhR;-!@mP=Q|`t@9vFDeg@HL4-)o`Dx13SwLRGd#EbIqO1I;m{qz3_d7g_ik0K z^;povsBFK0zGpf93-^5=t(UDfG*aYTRy}mm!&r!}ON5%PGG_YSE>Liq1*6G*WTk*F z$E=?NxuYNH;+JZy2=6!(`1U%QY+eUq)5OqO{t*c;*pI1Fd?MBVixE`_MA4>;BqkHt z-MZz}qjeieRPCXfYYQOr(GD;eoI?calwcq?kY>G`g8@A$Op^O$^imV8t=@2y2gTrkc)y zoimTZfstz@WJfDFTzAFF3CE~ZJ?9`>u&}ye^byL-*kIS|DYYRTIpqB<6V63YM3ZVd zFwird^FRHC<@-L9Y+e^xIb#`qi@k~lznaMEZA($4Clv49eL$2xp8<#dQhXs;%U1AB zVC{@)c?e0q9nhzU%MWyT&_sO;m?vL@W8*>G z98!&09B`V|j#i-_f1}6*xJrIsJVf1t1R$~U5bfA!1$-_C=(NrO-WhJfx|11LwqPsH z5K@EId*$d??u+GMv0>X2j&o|9JIhGi zSEti2?**Im1Q>Lx#~WVviC>Edu20N^M;)1L+!7(WE9?rU3C_nr{}HPFXTWTevODqd zEC6qboSI1AESPp>kcm#zA;&aLao%rhc*On9haR~`2KJTX=3$neYt3Vyik=0^?OARs zN6OE#kaFn@!La_KbPivJA}6Ps7#hL$dv@ z8O*)cg2i%PWa0TMWZH67ko1tPt^MGLX|oG)d;Byw6}y_ZdU!HzJN%4Yq0fh7QM;-0 z5f#V?6ryI4^;G&!5!@EHqzjxaaNFk_bXIdKzBd(vQ4?cyKdX*4OOB&#d?+lb34|8! zaAs46FG8NCxby zNc_WA+~56>y(Mpl`V)1SIt?D#X?`3Gl)I70h}5$A#cX_BH~ns5K>RqbwL!H%O&$@) zU6-;!V^cFM>I*b&IiOEsgqWs#^Xd<%)j<4MW z636BM8MA>&xo?Pn$SO46Er4WYAMvq&ORCn|f!z2A{p^s*e$Mm+-)(E5eXbB~RrpLq z1mf6lu{xl1$_N51RPm>dB;H!q50PbCvE9&=9#R+Lo$HT-`)#%CzUXsg{P!DbdPEgh zo^2!vk229}hcrw}K7ow~gi&X?09`ZR0It*ulQ5Mgcrph;-e#0J&i!mJc>Exr8fKDN zMTP7whfM6e@tc*F@&!Oog_iM_O1jqBw~!L9rLc!4|fwW=iHl}m-dd&IeG zB;wI(R0VBCyuhV4kP7*}2EPxSXZK77*KZPl1!bv><9P!d5?zYtFQ&pf-VNemG6mYA zi>b{yADGzB%`LuXz{yDNA)uT_mMzc3i$YTHFZ32(Xe`6DtxjmnkHrNpVX%439O}C#7S?^+}aLMG`s3h#rS#M z!egmru;rH*PI6S`cJ+~Dt&c7&J+hZ?wLlU&Z;IgKHzWMzyOrR(WIOx}76N_Gc;?Q~ zAqeF1FS2PFP&uy7dUWmKT<@i1v%@p?$)#DS7Z`}9tCq0p&Ut1AnsIof#ge{n4##7i zlCV_x06vJ zLnsSp5;rYRI@@R*O1cbj+V&DiQ@VwtN8(vW{aj+hi(z*ZrlXhgWaeYO5$yU>0-wrE zAn#c@o4>V@T7*jRBrk79tF5Ap{Re5Lyn7tm@*m^7dxebBPVVl@d3r*%uaFUEV=Pin z$B8YH5PSPI9C%X5q$C!gxuF`p(o~K{X+3nWF!zr0v4FVfQ@HP|CK~PD3H0$gED;c< z880(PzefurH2#~|_UuH(XAeknM=x~5t)s8j2!M-lA++xFgeAo`M8RkQKKZ&9CN4^& zuU5BW!Kdxe_do*_8w==oX%VP+ zyMee~7l-b>7r<=$b%jYU4X0zt0+<%@ggA${am;`rQorOnnWwf9{M+u5;=6g!sdNU@2ZXR= zel+d3j-vM#dy)lH^s!_M3o`uo#M5goS+@2di7&Or-39(gEJMhP?dlN1-TBk2bm5eW zbnUX8g=Fv8I32v|LN!dp&CZF3(^3hR9=jC8F4nmS0p8gp#66rbt!L?I{v=+zKqN@c zj=|~c(^*(`9e-xJLUN)RNfFuxvO|sJtMDZ%o1Fj-8Q1YQ-Gfp7u~606hUXb`-pn^6 z#Odrjvh2)pntdk}*?IQ(ExC(!Uk;?b@yT$-KaaUo^@z)H2g5Jl43taQh}(P;=|-XH z)J=LX*#6v3)^dK67qYP=;&u(IRG$Dz-_{Wyj*l2$z~!TQRckBf^uf96br_i*ivzE? zdHRAf#`Nl8(!W#*Pj>%hcM063k2ud}$DehiDC8CRhzG%$?~S;{wjGKTV^|IL0u$y4 zq@esQ_+K9~6Lp&lb9DpQVY~e#OxS?#UwVV0nqim|^j z%8U(N$MYiD)U`nnZn*}doP;0iuCfVN&9P)MT~DF(*J3k%_%J;xVSbRhiNM7oqQlmTZ&a3H+SJVcxn>$+RzrU&EmFRXf`V+t} zn1L|*Vn5mWC5TKonTKCO=b_;-`C6gH9?;Z|kfE3Y3wn%jS>SErV}1@3yvBxGvS`tIhG+^eqVE6V*{nJvE+gp>HB{G%Wq?)l0t&)AH{vkyR3 z-9nHnO~A8`iI8|>Du|T~lGrK({4dFct_(DTJqzceMRyY^aGOD>f;pJ4xj=TbZNUeb zAF0>1T4@*zv?FEf< z9hiT2uhD63;n>oz%3ogpma@f%@!on3I@yim8){EuZr+puVFhz;_g%fo`)4&Mr%eM`m+mt1-*W}JMQ8w8)TlW;@H6zYFvJLk2l#6cTl{Lgj=v_9?U z?w?*%{!cL}S-F&?*EFI+p)VfDX(gt1uL!?=1w3xzcAH5qryNaZ!2#@ z{`giJaV`L6e7HseDojz>t`${m7BB?`%@}_DACYLEfo(5hh)Vlv=0BygIJ9Xp$1K)H zwZn2uI@k4Zc%95Q*;+s}4y{1Rv&EQX>xm~%s^L+x32w%W!_=ubLQ2OpHI@30~z*DkTdSD`m zY1+{U2P1g;LK{&}hn)N5hx3OW(Z`y*i%txr9V-;zWPAWM6m$Wl>@1Ee6@rPGSLv*5 zgcYen_+6`!=oc=6pMTF%rD%>@@BV_O?wE|urT0i|xdVL3iz8dJY+=UsuY}~ZkT&VV zhEyQ_mGPsTFrd#>o(Xl6(DgW5*3_H;CYJ}$nBB=ZLa12Henme zRtIx(z7qN>FdAYnAl-iJH*;IV6DE8A!}~5WJoOR@6soySBG+b;s@m^R@ct+mbhpFf zmQDCAbrSv^bp&ZafAaTr1Wx^RANw-@vTLVRvB#W-sle9|xIIf9{^K=+yOuWjwMCYY ziWKM=Helv2j>PRRrqQt6U^wgnLt~ z*t6ze@$c7qCh?XE&=u{>=lx2xlTNgnxTX@kjO&GQlJnM$3*7wQp%;)wec!vT8Hkt>TWIcn-(0C?$tF zvdLJEFF@5 z6a_DEEV0aHJc2AN4n9sF#f#P&NH*i?iQEqC2}>8ffMx$pz~_#^RH&*7AO9O6M|T*qDuv1P z%b^@P-}^S^{Ax#01p&M)VgXJa_GVJin)G6*IwLe(!LC@l5L35{)Xsb*M)nP^BZpjr zVCv;i`fNA{%XjEv+J`*$lRBTZ+);-%l?hOFDx3T{Dg!ZU_t=5DXuLbjquJ9N>FTU7 zoR_=^8-n9u*gGC-lo!#=uWGPM?mV%MdrrQ+9U$r>xlr})I^5st2Pa+2=$kz{(4rf| zml|1NDjgM19u~B*>A&3Z_2P5PfPoFPbP)V|B*1L7U?y?RUXJQ}t#FxvCe#j}z~gpm zaA9pFyYyrTIbisRC^0&)Fif+^9wBcrh>~{X4J~Q*+ZLyxw~K`kRO?c zF@BE}caIJRuiFN&!5{)Z+1w=wQ!j(qu_j137=~5uT5Q;{V{kxZ6-q9fjP>D8@OVYI zSzAdS^bai~e6x1)v%?mQzmL=Y!sDpLGVmbEoIi)_6MyLN#oY;xAhqKG$N$}II<+ee zefIgl!azZckMlrjix}d)LJ3AIW9iW9A@cgLCHyM$$M^k}^!tZtBq{Va=nAy3Ib(C- z{j4b1^;8+k{0Q(nn&_N00mNVTk!g?E2~c51=xL3I{0S>>L7LMA8u*M)@1$okmcdKm zOHMNW?wJ7YTO`11-!0-bF9Q`8gwd`UG9a+So#wuHh%;iio`jk+L&F0Yx*>@U7*bO1 zV2797Gs$uz#_X!mRk-#eiCCwqqVB^Ch+Q%f7pSJvyFyX0s;7z=wqL-DA3M0LOBY#a zoj{Bq+$XbdMl%glJ79-xCppoulKFMF5M-}gkbj#FQVJnLpb{=Qcy~A*ky&eR}2ar9lKaie_nM8WI0ofJO3F3abP_=iE zRxTC=tHumGr(%KKOcCatI0Kh2Ob7jC64+cU4&@6nVL0mwbnRUPv)Xi-*Jr%&*)4f9 z>)$)kSx~li{n8^OI^+(StY%9Od(p`F4*2p0JV6H28ac)bLg4GPwJ z6@=0wDsSn?-FH-?H3{d`Ymv&&_B0x~A?-yz+jwU&zW#ZG9<=IW+hUKP@+axq)t1|_ zQF$IYY<7`+*xdowPZe;!%|5=dOD~bH-i_DR%JFKFFS7H6HL&mTBwEHXRLl|`NxZEZ z>tCF}7;{}LH>QK^(eJ^%%A(Yx{{cSSuL~=EpVME!z9 zte|+il5_ykzqDW*8GHRz`oCd(k z_>UKehh9bU6Z96+)JHaS_L=Q?*IkuJ*-ZquqD(YZ!L0VUAP#Q~gA9vc zXd4K|Af-5bQZpNt+?1g%DFobNI4;1v7G}MqC)GGHoA+sDFj4OfqjwEsNc56m!dK}5 zz3x(4nXQVEf}XT-I-M6``m3^m zIj{nc&)EP4mug6?>}l4|hMQ$6gu>R(gP0g0U3;!K4!>n@B(tx;A!*t`J_7G2_3f&0<`BZz10vHR9{e zotWft1!P0qz~uK+$`=zS+In^%|7RP&Ppb*n&12xDe-tX-kVo+)b+E540+x+rV#*`| zlv+Fo4H93Ig(b=0DSLsql#J25|KxGAdnH-%Jp~VcT8tJS46WYiIq4AM@Z2Qk< za0>LN%TJsGD{DV&T=gHw{2AsaR`xR0s{Yh+Y#Tg(kiytR7_xht?Sa-;WAU~`Nb#~F zXBN%oE5-MchjVJoR%j&92M;*DCwInp5>$?H`e$f${t@Q$yh8L!eGQVuN8z;K8h9{L zNhW7h^EdibQjz11pf$rA4ypU#_B>Y%-^fC$Yc_F~38TB5kHCM^``I}u8MJUYcTP}R zfEsCmxbB1zP@iy|62i?ID=bm$*Ja3^6%D&SRq^H3!q~$t`WUU12N}Ve!BBh+4OX6r zO|w;N#~dc0U}+W;S$`U&_$T4jRVj>jJ5D~>^pOU^+aO+?2q${>(R;c2JPl24>TKr2 zF~lFkX)n&FQ*a0;e9VWs69i83zB6edJa~F{Io`jfjJW$0mPl)Z>tZK(zxx#BQI1Wu z))brAPIx?h5e-%GrmIz5A@#wSX^N&WzR1~$Rwp=@i?}x=T?v9m=ceQD$wgFU?JPXM zx*uBurb65JQl{ay7*q+2&^o>Yx{R;EpqigI5dqfx~iI>2sf&H*#C>8E;C*B~5PWmCu37!bg zBT6zV@QLYUc29UpR%$w9?QUIWb9WfrmRbYvT#sQZPnUZxUZYOxfm|=r2v;vy0cj)L zeriP%UYQ0u!nAZXv0j731N;zgb=ySGeMkrPbHa6 z&~b7qG(KBIRQe>z?I#2D@yHtZv33izex8e~J$I16>)IfzbOV3xnuqhHWiI5$tYhGZA^aar>rj!PLnvaFoJjtZB{t%(EAF`jlfK8zTBqPrW`=98d z#X(&nuQ5n(uaBeju?xDoE7Urw3fHRZ-=PXCrob%SQoN$o%$78MB|{YoywbiijMA+P zT>T~!e|_FaZlB6v4^F&FZ)K*N{j%5q7BR6fcd9B(Y1|AiHX6~f$l3T>pPScKhe54{ z2@SMtV^<9*aeNCk%$vj~JFRT!0R^BLKGvkr_9HR*bDLyp-zP2txm2#f3C1L*k`#>u zzR$=`m=WGati>v6oyrjWQRjLjk6P)6J;`u%%3Ew$`3TopoxzXcdQ|#)6qKnRr`Gwy zBu&YH1{cPFb+ZJf^ylE6z;SZt1Nf&L( zf@G5+>btlYYS!<@XWUuj?V(EgepWesd6;7>IchNLaxY@#DN*!(YDD_C#?n79mj*Pp zGEGrl=&&ZAcwUI4`bWQ$?PL!oMs5MgnX&BdSS?tR83-j?wgc|xW~r|lsqUFZGUPT+ z6BMdR)_4W(%qfJlVvZkS$R`y84rFwl5|utJfX7~(g}t+$Q_E%Zm`nDJz%e5*CH@cj zGJgs@a(D{YH{0Tr1|v{ik3?B=4zvqP;0s}HX4(H1SF}tA%>7R1XKTQ|Rt@Ss#~L>J zU4-*n(lI^eH8IYNp_g)&!ay&#;~!jt!y-FjsRJLs|6D+`3KqeOWz{gfd<#S*CXxsC z)tIin274E1!u$Gsq*Mmq7;$b=L5?+bd@4j5Hes`zF8*WhL5SHY;FuhE=Z!L*y-k!U zwR%8KxZNbCm%01g&%0#s%quczvzw&;)g;&4ddTx(4S46g8AApZqD^QDtX){mE=?IB z>y&~(bZ#Jj?!?tZbdn=!dhmn@=o|7Arv%fnX(i|}coKr=*OBtQ>a{;UYNFJ*4^{uV zm~6;?iyHG%k*7C8ZvIGPK1{oS>p#pRm8IJ3o$sBrH8TWrhyJ3+B0+k>N#DNTy1B;AHB?%&w*5d|>I$TO{6 z@ebO)FM?yfQ6#bB9{HS=$4u0k0$tk!p`vUOlmt)5CP_K^_rp3|lYWCtf9Xofl{t^w zzz{n#_9*O}^sUB!c0S&)Y=J<5N$7980EQY(Kx=OuD>|VR@2?sH^(m?J${DUNQ6oWX zN(8W5FbicgTXAdcaWX0$Noc4hzWLZf%4cr^n^RL@{)=R&d6rH$TG_$Fmy2lIjUp1< z5y-!DlqjSBX1sek;(68VnDzH+-luO+O6_wW4#Wp zQ8dQ6xIvOBo>qUNc-s&asC1V)5w)>cniJzL$C`sX= z^WX8r*}cT1c@pM(CzI7<2;LhsVc*H))a~^e_=1nkq>~NVna!U$xAuAJ*nJ)*uHkkQ z;*qGlBbAc*lR)6{Q4+CYKCF1Tl{RUPqWsc!cB57!HE-Kkdw~CkDf}nI^X~hG$>-uqiKjuVY7~9HM43c+=hE0) z#neLX7noYNMnUS6eYftfUNSv#R$5ZiCfz(?~7Xz7y; z=rh9wmuAFcM$Zyh1(j$pX)1p7y$1il8M96u!@^aQ;Ndo7n5AB74X;PR@UkaxdX8-6ZKp1u@4 z^^3u1VhTB}co~bq7?+ur-~%=m^?g$4M*m#OJ7WtoPo(eJA>4pv@;70FD8KoS=b?9 z1biP8n9+F^{^2<&SI(kGtSo8Uws7iLjf~RF7{<=2msS~Y3}oZa^x;u^FurqxD&B3N zMYHn3f&Z9pklzb$ZRWrHv1-j$~EWc3AzXoVKVg!jorzz~tE%;nVOPcpJ73 z;mk`iJIV>3vi)dp^_l#AV@48+14ae8#YP ztddd5+eK&Jm4neK6TvjOnP~N$BIkM|$bWs?fxfzluePM3AM1&)Z06IfevbLql0|nf z$|I94Y+&x*6k5A27_6Gy*m)Y0dF112`p$S4tDlkyr<88ctn07om%81ct>cW-0ycq8 zk^toBUm%WgeRO$`4pijpgY6+@{<*F|6iFNASch3;e10F>;8uiXGqXr&#~Nlm$MRUz za2q#z1uS|yQVWh8&q&uqfG1ZbMVz|)`C)CTj37UfP7)u+;IPy9F(i|Q1w6z4H9l1T zK{eJ~ybTZCa`5fPY@#9?OFzs}1cxMPkPV9fqe@LM+hoFwhYiEzqCvc86iQ0e2gwqv z1d>&jN}Yse!OV&OsB)nIXiAI_JsWOM*pW`}Z;58xWWJ4X-7l1CGn?07djloh7EV=$^9 zI#(ya(#wO?LT^4y%@V+l91p1LSA^@&wxCR_4m{s>iR7A2K*jGzaB8jsSSKFEe6Kn( z&vl1c?@$v=yio`xTBo5u(*QjLq=3xfVhTILsOgn-ymM9xzaL*o1m6$Snvt)Z-+d08 zldz?``@hnB?(7!+td9)5eoL;}1d&sg_B1HmgWffs0>a`aF+z7EX2i*&;AT~jSWrxZ znmW0^)ssviPa9MV;xSRN~pN>1i6gIfaNSts@@?S*&W=2h%2VyQICjAh2W&%2AGI%JuqOyB=Y2 zbD&v!a}S;1`H_@Owa0;+YwZ5DH?cx26<6t9Pq#oAWW9LmyM>o zqiR7|na}x{vcMp@26q%y(bQeL3CNtlg3RYYH3VUA+$7YlxwB^^+~?sMN)%Ssz8qvNpIT6#!?7gm_B)YAW!fh)(jm zMJ{d^W@oI)Mme7Z^m(um416^4xqcn3UL=8>&z=33YKYY?-E=$m{eI$)FfZ>v&PSJt z?OXrQu{UkR^jbW1$$f?n%?fn?{o@>BU55%8iqZuJ_wj8*kJ%rGA9Q^&OFtXW!OqZM z+`D%g{)x+hy1k-!<3R$)jkl7%4F`InoSsmRYbwFi}>8q!yw)nR0*&G`E|AE!Vb{3t5wY2+%n8H zenA^J-t~&&FtTJg3Z=ZBg3@MVs7cAC^0LeDx#cD{NN6+OrY-yw%bmphn;#k(g>iSi z?Vw*A1rO`p@Y4Nh+`Enj6eyWE{w^yLgNH=_VI70S>S)tTu z64N`%G1UX(U?^w|Tr6{GPDB96ZXKk1xPAZGVKcOGtbpt1-;-d&&1CnRR@mFVmUtiP zp(Qs`X~5|cq|+Sm#D!wCQ`JD?SH!%^(1O_@&wA=cL&o<))@ZDbY{}fox#}(O#4K0X zx%(>w$)%I}Tmz1oR)RDW2}O~?G&s)>|CFiYt)n|>om&naTs5DGKfe*nQ;X<_ z{WYZVPZoPY@Ep#XSVlH{I>wKhpGNA;IW>`-I&XDNE{zbKK+E25W%~4VXwV~TC@|WK z;wPlx>(`%DGUY!uL&XIx)^`w{cZZ4OkP%M!w+~FJS$Mal0*nvo5&?U0+MAj{|FbrS z;GSlh@OKye_`?M^jRaG14S#6;Qb9Ibhx5;~rjT{=3_QsF0MZ&IROt9grdgpI1x)8) z-t?!~Yk^oXbO#kOIc}Y-GVF?21rL8p)_(WSWskm2g@RB!;`rVK72U)+N1YW(RyYqz z-OBjSI1jfZeWY{Wt>!#+dbHxsLfG}e7oK4NdH41iG*#||umjS#Ku(enQ07~z{>*%wvRnA`Q{D@x$Pgh)I(QxY0gC)c{l z#E>AZ}o;FiuIFjl#QX@_3pRgU{!G;o%Flbp|}{j#QB zKSt<)a3C_O+1&3=4=#OI#W{y3fZy~rbm5KT5F8f)@3^4QVsT|qS2#nirwH>cluW@$ zVH43?>_m5652u>D&(otD^=QGYtBlK08RX59WIUWcqTb~RV5gTzQB#13_$($e9B*6y zkDlrNH^^j~&%jrD83f@Gcz2qiqVsq7Phcz6etwpl&n^S)v;#!UyZ~d5o~LTN+|gR~ z7EDW#f;r9_H2=yb*mvpoR^Zdc^7+XTHFobyqY34?kJ!qZ#*WymW{EgT&_&0TpEw| z%hq49M42Hay7ZwuYc*ew?z=Ax;XbFJB48^ie5eh-n;UT3R{`Dxr7!f9N+0adS_I=A zZaAf?87D&$oq5leg8mlx{Z$&Z-FzXgDu?KB*=8TZUXb_{0OxoK>`(EPaA~ClterRo zM}y7KR8JIIx+js_cTbaD+&f62#RWd9)e!9y+OT-SdBo|(WZ_<0`r)4{-k6t1!e(A3 zPgXaAmhVUM$EqK`$R(1ToDNcHqz%*FeWivGkMQ13GiZIs9WUotkn!p|F4xyY7fvV# zh`P%}Z`?(v6fy9l%#P&%l7U5k#9NRL<3<+5<3b)jmDA># z%bGEgp54?zH5b?^^2EzY994b{kmXCYalGg<@IFr?^OV(*+7H1~y-+YRt6_hKWpgTqdbr?mNKr%BVpXA!^ zqX8gF%-EA~*;xR}rhKO6=@#G>w3W7A+D4?q8>oG|4PQh29$i@%2NPW-@Rd~u)a5V3 z?=5#|gwP>Ky zxl^d`6HPj2kYktR+M|stLH&9?e6~E7lxGBxjEEnkVe>S+emDYFm;T{De6Wz3&kKa< zSG=Ig*BaM-JVHV)ZGiCP)nxA_bK*7OJ1G`6$AyhN+~6#Ug9R7iimfhqhN=>s3(k;r z)dH$?lz>`q!lK^-xP|K;%Ij)!cVriM^o?^3*h(-$t(9bJgf}R~KBI9TLSee(NgVJ1 za(#**GnF&yW?j^S)DvMOXkra@_n8Eh*Zr}d{c5JAo(abVCPB8gF}!ryinArfYbRMd zfvZqBgdAQ&lm9LSI~RuL?3qc?!iflna?II=J9uoLAn1O+fcstxW13bJMkOpa`y4w3 zug(j^hhn|B_n91Ow1qK#vB_{KqzrboYr%XBg=bo?aHqdHVZJ1h(cCRW`RHVf_<55C zmvxa>Qb91Z#DLqgz2rNp50jl$=fF~EI&a{d9eH{-3buWzVpmjfy+!eAFu&>n{nDKO z_(cvA5vmRK`=`)XilwY*`3{I4%3yR0_Jfh8EpZO5hn0@c*>AV%$%%m#sJq66I-OR8 z`%_}5Pr-a_v0McDcMVWR*`9v9`;l37{w?VVDI}uOd$A)vfy=8@ZlrpFiP~-a)3*aWdIoxQB*zd$5NW+<^l(F41M1;!y5{5cDmZ4l|nNYA?(yr+JUx z($%lJFz>lMuOv_tj;Y*(#e2%Y=ISQJ}D$s}i( z+c&#!hS|0~)KWf#9nB0QUmxZXo`(sHpKYOKvIL(`l_4G__B4IF07kT2rM1tc&1Q+e z#(}02xIJ(e*()vZyaiJUO4;Gf{7dQ@DY(LrPetcaOYrUIB-$bI$?allW(k z1iTen0LQn*vPWqM9QYVOip`={2<8Nm)e`pb#_W{@xU4r48 z=b^a|pRw%-f=jw-_)1d;y7#Og{3t%@aafM8s(i37iqK*`Zr6XTh{T6_0PjvFnL0X5 zY>$1Xl9~cwxGWhCJ33=%!W1Z+UCYE>&?bA2=aV<9uF$ndX4S^l4A6hPoun?_2;Lnk zrB4=!LE6jDIBV?>JouFbms2WK(&rtYcR>Y&7L75}X9=)Hm5J=sOBX=(77q^2+{M~W z8zJ(h!lXw-6?u;r;irIe^jf1E*sF4RyG6S}tvv{W8_Ln=&qeV0BM7Do{)0G?8^pl- zH9PfYG7fjTLfq-uDCH}UiZ8U#FH#fNCy7CyL^nIpXFn@AI2qdyhG3_s4hBi{P&+Ce zV(OQ|23{D%Wj`c(yVT%^ffgKlF%b{83-MMp*^w2M({Q3<8r+z^7ph{#!1dn{OgZq9 z&>tCivor#J3$($btTyuO_kK)Rr3&c>Y%$0DFy5zm2!0wQiSsYCd~3x+Boz`|l3<;A z1^Iqv9bT0eBVOiO_&{wTeVYFUVv4SyOJo|TxGiB`w5!8>-fM_1c!`la)Of~i<8+r7 z_wO&%VU(BiuyLg?=Ds+Gf%zKfJ2(|W6Jj|B+b7y%dxoeyiiTS+;xH^L4YbUAp+H=P z^zV{AIph?dQ~~SNqfn@Y4eF* zoH_ZOBagSd85B2riGqJN<5SaidT{%Ca-@&j{i;f#in2Yq^eGCP|9vIi2b@@!)8f1> zME&nsvx5*A`DVx(e#G9tC?q8HQednMfG~4aA4hA zS~fBjg#S|o_Ysa&amkxHYe?b&33F`IAEw*tmq1TM6zqJQPo{sr0IqWq$lr=lNNyiR z{V`vtjveOS2f;+#_zY}PDu@2MLs;OH0&2flwp8AnS=p$`TPfNJ?iUW49sIHx{#3N1 znaU%$lcs}b4rrkj_spE|yBoh;dBOxN@}ec(c5v|Ye^7s&k}jP}P~TsUvg>DXnUHB% z`P7IuNK(9h;2TcW+{EwORzaWMkc2&tO6Y;@tFdSPQ*y}h9!ys11KX5Xte7o2hLecZNIF)i(hTEENQ|A-mFxsvPhUcCWGrt}zs;A7^+nKn2i97TxQ9v~` zg0P^6us-xY141dx1(Bar1o?EL$924@cnFpBPQx3|5PZ4h5%cES2hx=N9WBg!pzPKM zlA-kkooC;G4B2At_gIKRQkJM)@B{;HuEHnL$<()47cSZ#p=Q!|sdLRJDsg8)*&AEH zVWB5Vujk>wzF1NmxgLWZ{g}peBV^5r21t`WM;v3@nImQ`#KwC$o?TW%Z{%|9qm~eI zxVD!q{yj$4s+wV`xe_R>RD*Nkb{Os(#A*(ClI6;^W|n!4w61?2YW1B3`~2m^N&YoB zanEAk``m1L-!7`um4GWIEhiNxkK?vZ&VSN*kE*@2CVPiC7w@}Voc449z3A3TJ~RDb zb72^7e%pv$Vm0)&$ue@vkUM|weqyF5_6h&z=)A+ReBVEAW~PCR>_}OaBA)v?AE9U< zsbr=im6lXO$|~8}$*7D%q(~X}bv~3*(I-TEDbhe&w14;a_qW60IB-Arb)Dz?{dzrK zmO_0}&ykcCWiUP-e#f0U7=F+NOLmr$w~QWR)EkAn+fU-7rUE*zTAFG$_A{G9o-$V|FHy%Q z@x-omCy2Z}2^woN8JEYqd8H3V7}K{)=_Ti-n7nr>mM>I6u`?^F`YvCNr__Pp4j1Az zu6ujuz7ZHU{{u(KMwGo}M_#WDC2rzQgTm9XpOF`TI28?zNFjJu1t&bljQV zy~nY62chkp&;IOa3X`Z$>G#oIqU+U67A;!=>05;H!_z!o(1BEpTqJ_3i?|uWI(amG zew|zS8RQ9Nz8OvjivwCT%NhKff5Z1q7R#4Jf`zgGoQi%iHu00tWzi5B5VNH(gHmAm zu~JB$oPv)AV;OxxCc55gqT42fV99EAsx)Lx4>O}={|QC@N6x#RXE7D~vY+F&Ic{L2 zA%*{mtbzYPiJK+&V9A#Ryb{|?Tep0m>m<&T$|gAoU+jeSdrHZ3VR__|i2w8c(7=|2 z#-Te~@W7M|y0XoPzbvJI$9o;kI;!iSg8p|Zy0{qX*L9LAXU=&Re~ZzQTgxiDa(<(O zZn*KFJRGR;fy*whnPn1tfEQ86mZ|z-Nb7X^Id>i2G-|iZKPWC3ugcBjLL2BngB8w_ z5T|BuE?{fJE$Dq33B3cls4JLFTpk=n*;S43b=Vlb;Xm@QUxD~9n+dZI>;^|w9tw7R zfy@=Z7XllHxCqW%JwXh zqh?3W`N+Va1Bvji)IdUd*h29DD3h6gv)c`SJ@?N z%a}452kdF$I->`-Vu({69qkjK_PubdIWrZvp16%)&2H1?RjO!iu8jJ7t3cB1EiIm` zhI@XxlGV4Bm?=LfKd@i}U#jZ!F<5)p&dbTh_0pha%_0#hZ1+ z{#HD$_>@Q*^{1j(nlnl$H_*=;Wd%*qBU~?;Mb$Mtw0*Mx|D-D85254Wr?r*-w4Pr9j{Xe_9jn1Cv+AlfZc+%-)R|aJE(p>I23>VzVm7c$8A#mzoeZ=`SfX zyGJ6Y8NhFcuXN;s5EbJ5?9SQZjgpHK*rr#SY{)ecer8SrO!Km(e!<76n&VC6#v=IF zwVBzJTMR=}GigCfJ<*$)3KU$ZnSwYa< z|C&zLQ>Ui?RHvtoLTHsgo930;C zk;Lckf`&$Sc$6>~6t6OPS3ZkaJPRPI6PJTvUo9lfup`AQZD4)jcc_t#q}8&2Y2|1f zdzE8Nmz6Js^-iL&wO0dkKFp_Of6PInP8DTz4wGXG8|m`5YK-`C?kqh+4;Jl6B$~5K z(7;X%CCE#1!O1wcvE~GrCRLi@q+GN6n1Qq|>IEd^UM7Nq+u>WU(!E+}v(>6SZ z@LTCvqF9S(x{s5?JU1GipT(F)7~}csTTmEW3KzJ2%x1BL(4Hv6dFxcD(o1dlbJ7kE zDe99;QXChe=nFIPN(-rbCdMCMd;yMLsR7A5n?XzH2*!<9=l6QO0FCJX*mS8vOqYmb z-z8;%*2rbcLuKu)8XDNT=+I*(BF?JvFf>@^ zcAN?Z80yj03FYw9xrkcdE~O`?TjCeTD=;(DkQS$baG{|6{bJ4fTL6io7(kYH2-7ckxmODoALlkUaF9`ce?a$ zoH*&K6cQNso#ni^$8fpED{9IoX!$7zu%+T(rjP-zXih}{9rE$xlr2cLqj zWfdk2a;&z1>$t=*hQO36sC~|zZ@0XMszR$qlaU$xFIN-c?3PjtkZ>W>gbZ-?Pk$_p z5XC15@fkcz?Eh*{4c1S)CnpdzB;_o?d3%nkWkg2M%C=sPi_eeF-j}dNULX-#m-LQ$gKdy_X+zQBZ z$t;|!Ac~7e77$D2N8tZd50*Za7A(z>WoJz(ri&E+Q29Cc$rr&s)^(~I4DuhdAsIX} zRM$?HUta`U>}nCRuaZ?S<0$XkTKfFfP4MS+Fl(Nt+T>St#v@E9y<5S_B z;!846FU+nP6d|5L3t@V$Jh?dkH$5@8o!8eNhnm~w!P_leY~<=tm=pJz4T=#F*hQOR z&F$sr`(z%Cu)a=uU&n&Pqf{{1oE4R0u(F4lY|11DEfrGkuCuF#f6neluIhNX0II!VAmMQ)f2lA4{|B z;XH?)iD$6#W+(jF7|Gfsf2N@dmZ14s3xZxXz=@j0cuTPx+<5e@cr4!WYZ%-f|0k9Hb1YK^EZfz>L<2 z&q47|hjISNL*SHP0&g1inN!@3J$0KjxUW(~9lim{mA7Ix*@QC6UxfHuwRh3rye4W- zy4hbg`LL&~gJZLQp)zx7Xhww<{?H7VB{7> zd}pqJxuaR6##1)Hzd8kAlmeJc?r!N9?N81-gkzCv3YdC-VDw@abI(XJ32x_nQF6AR z`HXXi`p%&SO#<3?eFyv(a|GiDs+f7V^XOminW%AGo7|q6K|g%&C9d{`m?zc1b+8^l zmmmr%qT(R-Ks>2fQ9v|W#$#O&r5U5nv?Rz5`xR$Wcin8bb}SZ>xOp{S?*p3`xElVB zanHNkToUaQ1k*e((6Q;d5T+wd|C@XOf zVI}JWh+K6SomDu4^9G$J=b|k^Ze{>%OuonET|PD>+`Yu!@t=wf56sd2N&se5W|F7= zMX0c(g`3~z!XNU3Uj06iW`FGCZBU6KFH9x)uSQh)-~3F-%oJ}rN2-x3o!o)DrA2VF zwkd9V+lrN03RpZo0S_;Cp)JlQ;pqV9`+Jqf{^Pt)f4=zO#nM4?qeKOs{t}1T4FdX5 zUJM9M7E^1(!!o4q$y6Hdd^Bly)os+v{nU(t1N(4CvLwvUi1^ zDrN^s;n(`|#_}D_OkV0eOEoQBiVex|-Bkf%LSNEL4crba_6N8PWU#&q&k;}V{`HGj z2A4Cc$SqT@uXZk-h@O(b{brf8yY@FRfBhQXd(5N-uE7v|^CY)V9)KGv0uAj=}MLzIEVHN%)s-OES48EqN4sWvM@`NWI4>hZ}La5 zZS)s$)#ZB6JsouNwru)P=?Y%po>ktRy^QA75BPAK5Nt1~B5^lGsgr9P$(36`dQ(|; z-$_m8?Bdr{wRazyKOyi*JcBk?7_;vsoO!2>6uW0e(rNBrDt+b0!Z!CXZux z9zDkOp7fz`^JP48YBBhdKv=O}o-b3TNLh96{2ieW-GfREf~|Hqa5EbwM86`$!kOm% zR|c9l6gj`HINi{aRk^K^Vbh=O(6hANZE<%_pLXHOfWY5kABim)ShPjl?} zN1W%G@-SY)8}py(VhvA{ZASl1a90c`#)kUSHaBRZ-o1+ z@6f>EqqO%$D;7z0GuK~FgO#>*jJ@t=CUrmy_i3ynHSQ9qUo#!eVz0yB;J>7}M+ZdS zs=?)Bwd}U&DjK)=IgAew=6CLRL1xe3qeDms(Z1~pl}VcLVL7+=zLABy!cKu)_#%4Y z>2%bd*ad%O^*}<=4xjJKrwTlGXqo<)y1qz3w)Ggf@w%SQ)$L-BNo>L!*En9^+NaoY z2sz#?^^?CxgNN=kXbaguZoW9Ki}$Ao%1`22`Iq!R(IfcibRnr)ssO3R`Y`%> zlzg~;k9RqV2hH2n@p6tQSkwg&tJOE5v&srSt+K_SjF0r(x=*koVGz35+3?kR6UXk% z;O%&k11be_pmh62W3AKzXmk@LBV(b=qIZdOA$RXuDs&7BH+B-)1@BRKRXPY}-={Cf z4HMqu0lIA5GW^`QhZCWM~ZG6STp<f4J$fOZ-{51DJ9^cRl7VWa5y?39X(VxRGr8E%&qkr-oE{Ag&#vNo+rwP`LeI(M^ zVQ_!l5c8=}7>}_!c;Ubac+tIrUBBZwJuI<}n3|?Csaaa^cA`;Z=&ed_Guw;4M~^dx zaebt0@n7<7$q`ujS`_?S2O4b-KPMJXez3w$hq=$~I7oe%+aPxBEYp$e1+Mo+!B1>E z8Wx2^p~gRbR5o?-^rot7e_vJ+vE;Wb7_{xdwBrwH%Wlz^8TLw~hP5YZ>|AS6?p zeF(d8lZ!H(X-Ox+@ncNknpEoQd6=%r*1%o=Ou$BNFMhGx1KsxxSZSZdsQGp(Rv%6# zTjLyI-+L<%U2&Sr*G#9C=LxJ{T0&a7r{P4~I$OF!S`{KK_Y38zPfe} z!`}@w&YX7*)=4Q_Du-*JYjPFPDJyAQLnhPg>eVo7jSINQAZ^imNZhs5;o?ChJP}!f zYv;_x-qz!A=3OdzHU1kTIztI%{Z!%Rf)Di4IdeL(V;VI&#Y5TN9QtGD0Q+=g9nlcE zi#vCJWfWTy*<}sgxct8`eDrP=v^-socdVPJux}E~Q?H;yw?uHa?s(X+GaGl6ULeLl zQ;?BwCGR$F!0kDyblmDo@MHTjZcbWBa<1nS_iC?_q zn?^Dx7{Z=)g8$EIrncOgO23YW))EJpAD&J_d<#fITRxac+S0FA9+5BB*Qk+FC4rlq zPpju9nOzV;#4YndBV2*GmZ`(H3pfYf&*JgZ$CH-p|C8W<@0oy3dNFYD^yJ1qMF}`d zhgi|wc~tkD4tUsvVbPA=OyC6pkykuRL)D^)Y}`Y9_^yQ4wAzVI_EAEg`DM(h6}uYD z*(vyP#&oc3(!e(X3b3}B`+lPwh=0{V7M$h$F3a@ky!_L|dtp6m9Pftn9~k4SpHgUZ zXd3EkZz9Ll6*wkEE>T@o4+5DQ^5)KJ%$yzriFKLeSMpWPaVLyR)+0@OR78bxm%_xJ z^C02O5Ucvd^mO22h}JJgsm7n^5@n353O_d{zI*`&yd*N&t(oPwrP9AQxIG2o9crcUt6N2X%Y>!Tp zR^sk*8^X{sU^;sSH^a!`<8YQa&C{K*8$*nE)HfZ;H{lMDFE6LJ!>&N-&Ar4^^%~u~ zD~-~DTtn% z#C{d*0=6fHy1Mp&)_<$e+E{{)h0O;y%Wc$9We60`R^VU$VbZwl2*~N3f~5yIc9?hquWC&isj~ARgU`kJPMVwW zTi_U5r@5Ml{&`OwQ@hZcdw2!A-9J$&f~D{}6O<%6QP z=n}S(KA1BZKR+H1uHPr)H&Zcm3!KmT*G{G5oXW|RLXPX8Tg3F+sNzkjQ~2CH1h>=& zv&S|)g4rKEU|H7(+We)QKG-@4D(o>FnBPgol(yi)G&vB@*2bS)j(wG`3%a+ql0_D7 z*yt|-B;tQF;4}F1unL)fNeP(WM?uKxDEyM!#(dxPgND`T!K?Ua*tAmzOB?3G>AESf zbBP(4+xSqWeOxg``RWL<30{C6AJsN=Df||_DO_aH?|XulU2cn%Vmnr+lhi_znLH5S7G{zRN&DJc(){j z82ol)<2}xhLw>`JsaJn-ZlBL&Xl)oVNbVx%FKfV3IY-DaQY10-30nDfGpENzV0}v( zev45dN-rFVw$&heM6Q}#%rB&g{3B?%I~waAO~tP9cksXWg<$-{5QG^ucA@70#k-Vl zu}%bG{3a2{my+psYU!wiJJ@&E;eF+7>ioe83>EV5z0^3)15*df)Dkf! z;u7h)C4=e@wxM*s2)H!IQTOkmuv+UhDxWaNst$9|xpD{=u1}*+?M7)?uL*`2eSF`oes<5?IUe$KqSV2%Wppvf@JliP|p?ZpR;@-sEQ( z&E5Bc4LnJRcML1*d4*ka*caQ+GL4zP3rOM4VERja79IU&i18Y!DE>JZKJT=})S%VO z>`pU~ZYm~UPZYtO-f|+d`aHRu=ts*6ra*8Iw@WOULYJFm;ni?ksGT9kWnPsy7S?&P z#Oo>*bBLgy?>=VyWjcx7s2W+Qdy;f|%5d+GA)F^S9_HLABB>j9qL`u&$0S^VHES|B z|D-DnY_)*i*Eg`RYXe;5jM6myA>ADs2RiF|NQYTCb-p8v2RiL>cSQnJ9N0w;XpN9( zA@gXE&@@!U z#)J7ZncGveQWw?~cW+9B;}4@C;e#k7wY9V23LLx7)fStXl`tmu0cu})Lq*kDe3{%0 z;U40GYqQ;<@Pj`L<4Q>U69s#&=`*{$2O6Js-9qEQDwtAumPvb80l#8Hz}YC8ty10( zOWPVDbjfj=>JR{ZV%_xKKsjYZ&f{?zHF$Ki1^(%VU|)kg2HY*BiZitNo2KWnNvrpv zLDggGd37TGf$wyZ>o_vw(orV&z(dyVbQVm^--KhuGtulMkJY;SlPoD{purAS@aFnH zba{D~zUq@>4XWLsLc!#yxE?K6?~qbMurQOB;+H?m}$bN#!o-gVn+SA{H&e zJ}Nqmiw`=&)#NMK`soHk4s_w+$!RdwF$N>^&onabJ@9uk;7zv|STM&2cP?upio6hb zKaYFXG-o3w`a}He}}My;xRy0mp5Y14AE2 z5_WhhdhQ<}UbPZ*x=$tQ81z6uVGo7{){>rQr_tc-M5;LbI7~g|KyTKk!X~zmOuueU zeyG%w7x!I3^UM@Dm?8xZVpjBYPc-lKz;>=`ec z+nf4D0md@P=xiUF>-ZdZuY8D_C92fxoF|rbbT$4|*?^Ie84zmSK&SBH=%yoA=rr>T zwBK|Rv(uB9mK~uqV9HXi8xn*%?x*Na=R6QO*iXExjfkajHu?4=0k}FojpwqYgWP;7 z^ScFmFo)wuK941X{~be_oT*?XJ{gW?r&05R=kS@~dF(KKOdAyXQ1)*$pV zT%Q>ztb2-gnp3cz^CUm8$fvuDr#9~3_EQ~73&?VP6ELvaik(8zym`5aY)Ob5uD5@P zlR~GVP{0r=zS{_Mekiri8atHd03`I}G5QBEn`m_#k|U{NgwT^QZVw} zf_#Y?!kKH$A@jpDuuuGrwWj&RzEg$NTNT1lumjaiD!5DH7w@3AC6yQ&#+la-k+l0Q zBqza@y-(&*)sjs_YrzQ!mb1qamweJ>9)|T#RrvbFTcFZ45+BqUprF_X<_K-Xhn6n% zxx5!|#(_|L)3JmI9F}0adNLcd%N}>;O~t8g1#pw=a~UmdCC8VA(e|JVv|3yazE8G; z$!gu~3;$}^SE&oi_Eo%_E6$U!9fm=$mVA11Ac%|Nf`Rr*#N{&dP zlV*pdStFMfFwX`5Z^P7S*aj@a4nd8ICEU<%#cQd*sQgP=H228Ft3f)f)x<9PVM8c8 zRJs5gX6?t`SgxYMltF-aA(66l0}XF|_&6&SFw+9oz7dBR++0B~eld8YuSD(76G@g` zD$5v8L^rS>KwdPx)Z#?&>Qtj}WSwz*<$uZSR_?I=~_vLO2|nSft*FuTjU+Q6tB$rAEv|hgwJH=?`{(Oa6DRheWT&>3@H5h2uHac zYI98`oPK|vUcFmKAHC8-@v-l)<(oFU{-^^6*uKJltNN*MhCTflJVxSu8p-H9ZJfHi z2G6hWWANo6s&uuU4EMGmm5_!FT2|CKAd~A>0bG!4B3cKp;DeSZ+}ojz+R@e^*&j{3 zEcfFrk^uV?xUBc!O=@t^g}u1y5FXxe6)OTJ@g1TiVAIyg;CN6DT1TQ-UACIbvP|GQ zbf?%Yj|d##db6KPIM?Bmk5oTq7Ou8NSd}$|}&e zRz~>hffMFEOvG~4D)K5Un*=2WgOPj#1l(Cjn=JGCSqgPRDWHC+> z%EogCi^$=HcCao-i2o>K2LwL5KrcR=N&M9G*f_5S*b~>pID8u*pIWEjwkadLVIS^J zq|8%DZBc0%ww|*!K0LkU~-|6INfDA=9dIN@QWxE-J`xG-OKgBJPq*#dKS zcGBz8LgZ=REZD$JRc$Vgk@AN@X#8^zE_kB=asdciOqZdK=S!->?Tv29W`p~ZNmy*z zh3W~xgARJLfb8JySj}8NmtS*k2`qzO6TdoM}6?i-~)U;h8w&c=%&H_ z%-fAlke%Lut6t@hgA%jQCPSMsaWuyxtFmzLtS&vGt%*#DA~`NtL}JfZW6b+4aM!mT zoa_2X*3%(k>bM!!s7JHQ_N|BBEsNl|SR%WecMnAVm0+Zf4V&Dx65k%;kyyzL+`raP zkhf?j8I8D(TkbRH@rNZV{zSk5F<0E2qd^uX--5(GPf)(gF~){(GqzD}WWdTFT6Y^` zL{18R+I|qW(TT8Y@;0=xmLqv%G0?v^8kB$O;)FmMYE)+qX}=D$OQ)O%A?0|s%_ou>%N$W4YlVZeV$tmS4_doD z7Ylv;KwgCgkSGIIi~Ney8OUS&d*M;HC1C4vbpXQ7JcjW723qh_-f+xX%Pct466I^})?!<7tCl3=_QKJ)$*0rpF^BPc=o(bua$h^lQyIsk5?~D{Lc{k=D2F@PEv-gA#e3l1 zDlSa7&~pe`%V!V8(?YlFEzb^<8qt$J^F& zzNmY2Ebj%$eAR|K*vW88WENHAT-slCrqWEux#+UX51$p^qBn)pz$4)p>C&zx^@X#z zUEWK2KiC{1Yg(B8ioq~vC{G)u=(X_vc6BBI4^G| z;np>zEn^Y!J2#GhJ~I(UxUa9MybLLGf=O}V1DsY~1Ci@46Z;?9D3|e)U31?XjRN&Z z?37{R7q7_OpP$mg*}us5X3l?Pbr9wVI>?&AJz#V6Fz>o`46c5%o8*Pc0C$?fc?)95 z#;Yyl+fgCVN$+BeN{Z<4b18J-|0czcRbfO&ia)Q{2PJ(}P^V)NC>OlIiErPMqd})Y zQTZyUI81_at%q#j;1BA!m)ngkY$nmHBE7{Ahww06+_0q&j||PDOSv=4?Z7`g@xwLH za$gnV#9YZ_+doXbrzCzG4M3Go{ba|zDz0Ny%ADVmPCkdo!@|T&FnbYCmONa^c8*u0 zeca!bI>utr&bgF?9U>}*zCTtF{ePxy6u9 zE9Un9PU7@w*mHLJ)wk3_=M&jpa|Fx{3rL9MVqTrMG#G3cW5dsQfr-&+dM3RHQw3*< z)9bIWrAi<5Z}j7}CnZE}$d81C7?Zg6RoHv<0N7;P;~wjHy7W&Yd$ypHHi^9;Tck=Y zQ?%2FjEb~C$W4z*XLJ$YDH$Bw%ZRZ*TTGSRLUEaKI`eFeFy@*T;YS@^E{9fxxmu#k z*X(4RKWt6x)UIIqx{p-xhYGOE5;3qRpY+Qc0zS`AM@joiCS?8_^75ND{Fo*qFuHkIdPl=ajX)X z&#|>Qhh57JDr!Fimsb1YnREunxpU0lT`le6>KGsHhP!Z!`!43 z@PnIMT=?cf#p7*h;67VoQlh~w4)!Fu%km*%WIc)<(Xx0R!h^YtDt52Y0pS+`j7M1n z@1W&;JkEd0in;|tK&c$mUn+&HvLaUS5$TA01lzk*65@jwQ0I^y-sW5ZUb-_8uWnoh zwSIb-!|@_c=R1R(H^&BZY9y{%vC#0u6sLGJLE6nd_`bgx_q5!EP;n8b zVH*8R1Ujjh+``?+q-x2scYSPCi#O-X@ZwMxJK0>TQ@E?k2lg251Q*H8_|d){suId+ zfY34cCdT#bOJA}|^Ck;|dJ+(-D(R9FZ*XX0Er<^!;>Hjmc>bXs=;#zUaVn40CCkIv z^Selna2oP_DK=g*g$MUukg>o7oCN!j_jDP3CMwELD?W(R^rFUpHL)A zh`(mO9Gxz@jQqA6z~Kj(9QI2c%`-dc^B>tL?w`YGtyktvQ=Seo-rn@@FC{wNW&-*@ zt0o@uK6LByWLP-UkFWdtYM2eV6VYOu z_8NM1g9_?KFnF`27#^Gx<90b`@#0Vz4w_Gf+N*~ly}%4#8#?1XC1u!da2tBMMfh_J zcYxM;NA^eRWh#Ex3Up8Ff^CpGJbZnDY239Kc32!D_e^wg?ZaVq)n5y&SF(j|7FnQY zYRhvuZUj98-Q>NDGo;ic;mp1%biw(D%(WgzrgeM^{++lJ6{?*;lTR}uRJ8=}}94hus#Z=sc$;DO;}aJ81j4H4!f{^2D!rnee)jMZW9 zw0$6By%<9t)Pm05r?l_wE3z={81C=s!_Nse!1`K4k;Vl~-k*;Nkx_8Kn9GoCF9m93 zM?AvnSmti(7QxF z-Ed$Imb_$q%C?aM%cY3qNLHh(k_&k|+m7T9ahcW1`;_yjki_g{=)SiD{yl$0k2@8@ ziKKt@0-tk-m!#$koX! z$$efF36=w zX!p(pRDHP|%ywndgDV!0#t23Hl7Ed+GkeSC-;E);Kjy)x{s+je(4!SY%TO}Bhx!Dq z#&I5NflbjN9>2VS$20)p*lJ@3Uy)U67I?k>A5Fb99&dWCLt*O?W^>0v#3_YXb$K`L z&8~#PKMSGW=M7Int)T8l!wP(9BLOSU$ig^rX(+jWh{;%!L&oWGd$N$%#C?Ah(ciDd zEO1q#YV{k?t!NXN4hdn3;i5+SEHV5&y^D1>_92rNaI>YUEV;)vP*v-4%KMUmi()UmFxndW`w2ezK?bzH1Z@6rhHGI4svzAS(aTs6@gj z3RNpWTD}GJY%qX8uQj;s$!F}=-b~~-NZ^6>b?EZpJW&grk6%BpX8abnqf_2{+J5*l znfRX_)ZBK%g8q}p-&s#KYg;03-gj2k&;s=xUa^|pE6By62y(K-5)93ffNyt+$9>+A zb7$nR@>Vul8s?#ut1HKcv#=#j(ANVkE!1xW#bo~!5C(zeV z*4G@t%Gdvq=c>@?)ETd{PbjS{&L6pk&qE1_e8 zC0)2)9wthggVt~j?ZgZcuDFhtU3P)eQ^R;(bsDB0bj8~oXU2P>6wDJ3XQI3^@GJK_ zDXiK7(--fcZ(u(0vwzRNrjf{jr6A}^GfozSz?DOvN&lT)_9`z z9myt5iQ{p)aUqIUYOrO#tuIj#8c97hiPezrumQJ!Q4?>uyXfG3ejEEGc*J`G<5OD z-9zMh(`j-wZXEXibRhRm=8^gnGBoPDEj8>Hf%%V5pqkSG5G$4doBhYR@sLj{Z>+pI;3}(vw;P^mbuB zwYajIF1FRceT7}*jdvsF?p4QZvq+eFK$---xj{{9vbp~+ZU%CNkCh@`BxT1u3`@!( z_G0;@bG#}MC`FRiZ=ad(%k0U`)PwYBy9gTGPl6?uw~0&AF(%w147MJWCcl@oGe2{z z7~YmNjPJfj!@a~&{<=di9l_)$)b!K0oM@k;#GyD_+xw8E0td#XzRG_X+goe5EF9vw0%pBj|G# zJrF;x!+J#BBg<|cWrnBN(N$`;By2@ARqvQYJ%{x0;Aks7@yj3LmWGksBP*%MtxJ$x zdlWD7njyDTgbjke-=`u+wH5b@I1|%E|8V<&GR~j$g}d9iOni7u(1~F;!51v>vj~ z#*^EYC-J)5bhNNgC(X<6lBOB+8L4#@;3Lef{{1~scVim;Af6BN12v)H_W(H0i=)Su z{9p!eW{?xYlX2qs$@uTqW9q*CEF9p@(Dq+J^N1_m&;~ z{D4gO_z)h>jm7bcqcPrND*P?hgugSmZiLuLE*rW8CdpLbjqC~Zrp#LW5pj`7X62Cs z_az{>r2sFVensO->~UAHGL+9yz}E^3ux+serpLXcc|pIa&H7BLWbBNFGG9==Dg&0+ z7DH)wHo13Zl-e${r|TjXL-~=p#I)@`YjR^1R>l>uimGyW_HQeMWY5LpG3Vf^(ibQx zS_h%RK9otC2Nff4=!}Dh==qz!;7XMT6t%A=Hr+$ixH2Du&d$ZLDQj@w_%QsG{EDhf zpM^R<_@HVy1Cnh;p;Gb*U3yuPFI>D7kiUichwh>SMtTtTt{ajI53#SiKf!gc75ItI z@l7u-gqhrDOl6e;lYPt>)SM)#?aW#DYpxy@TItnL_jDIl9_z&&uFeo9Zi?SL4&f;- zC-M0}B5kg*Wy$BK>w5%s_9_A6)+fMwHXintn?Qi*!p2Qei-;<73*1ew z5W~S5&<>3PkMKE=Bn~v%NrB8e?6x85&a}0XBMgE?o1c_WUydRk7Gcd zZIqbHb=PB6kcpg#a(SZs-7$?=Br7VYzFfmI&(*mOi#)J3rQdjT69Q_<}+=Q;ZG9125! zv&;@1@>cYM#n;WEsQqFsPAbTO%}x`DL-JNQ#u-DWh6oGl=XPSzGArl|OOgV2u*)G5ANL`Zeemhh|Im#17D@T|xSN7h}Bi5Vt$tOGY|48fBd! zRqD=xqc`HA%61$P_OJ)qQGm_!63A}YNCLR5i=F)_tq595MAn>P)(1Fo?~vbM8NVJ+ z$t01Q3}0H3!#Vy=O+)3=Ihb+o3mY!C6s!)6=f`X4!siKfXs-GdV>)B#{6Csd%~g(G z2406S^(Clo)J+9%+vt1gJxDfRV#n&`hqdk z@DvUQn~Xfz@~nY8o1q0hljHCdm!I@*eTyGWOAMAKLi#~ zQg)VT3vs!H=g-)D4GOnkWT0-DA1rIG#2W5r$qcLj!Ho~pGB}p3)z*iyiLarh+7e%I z9iVr{6QFwR6PYsQ2|1T)f-l4av2)cFT((aJI^5TR##dLA);!O&J-vnlFU;AO$%_1g zM%VF@l^jX3azoeIukimUIuC!Y-ZqY-jF9XRWrWH|B*nQeBZ(+7>L*1dZG{GkhAqh^ zNj8O2A<4O~uN5M+R4UStBJGk&^_=G~;Pv91bKlqX`MlpN6~a()D4NI$oF~G)$6@VA zJ2|2?3**ynflbu~s&mi_PT8-){E!lI*N!EL!-jaHy@1Zz%Wr;gsWQv^#kmhUib-bF zMY{OmYqr&-o_?$Cry<&p;Fm-((P=lJBbv=9T&_-A-ZnEu)`wunCM6PbyM;=aUZggq zB2cOI8Kd=;a2tJ#`f(|+Vx9{Oo<6~TcTwVI5+b~?76IPvxjLmW3C|{3rj2!%rLhrQ!rS1rd-P;X*qfSY!R`cxoqk1sQ22 z+TDMj7O{bK8a}xsP4W^7v<%R^3&+5xF&>{J%z!3#HCUA#BHy_ATI`!5ddVt|eUdkW z6m9jPr^DJ{XSopL{LmOg_%6YO!F1+B;xJjn&A#i;kJ39|GHH8vDco^91#O%YIZHVP zJ9XCKCI=ctA+D&CPYC_?CL$Ku4g2Plr_^AJ${+wnD?aLH+Pq!U~l_L>I z{RA;uwug<{SX#HZwU-_pipCP-4A|wH#hRpt6Q4LcQqE;KYt3?S_p&hb_Z+9UCn#03 zeMSFZJ-M{;Df6JkmiemSPWIJ&!vT*NH23;N_~SJpw=K`?Uhrc06xm9c>UlW6ezY$C zxdJ|~^QEX^jenEV$e|ozxS%&eom)81Wbblf$Ug~OHQhu{7`v}{P{BvIIWD-n2obn$$R$0nQ)@vb_;6vajqfdSkg94 z0&F)an5*0HIA$F~>r_O^oOQY|`>zaK-|dMe4gcYcrYwA0cMPVzx&*#MFKMz<7G_-1 z#_G<8W|G2bV08CCT#$H$E^aNa?O;Sn$mbX=vsgio{9Z#&PYlA`f;;ps$H`edyac2I zgz?9RVA`a$8y?!4ncWz;QIq|ubL_@s{Tm3vp z!`e&WzA^!p{44|kofAw^)e!qqJ{`lPOz5oWlh{>e0M{FCk<%)wi~{?V)UtAz6g~@g z&gJq*x&U$!i}0gYC+MDE0d}j7fY?;dZCemSS6q7mb5gP~IB_w$wd+8HwX7~DX z$Z7?9a8v9duCsSS$nF?2Ysp*E(I}1u_Azjmn|t2+(@8|e2blPr#l)ka1`297f}5xY zeA>q46MTQt-z^n9ffUP?54jwGHHU4iqe)4+IX8C&GWqawB`roY~v2T`RoH2C3zlEzjL+iVR> z^QAG^eG;avorS_TwZTPN0bC7hsAz%){M>h&?u)n#R(xT^?7INE-|S<;g~b2=ZeVBL zLexB)MP&-kko-OIPy?6ie3J8El6Mv}WO)+%C51uAA{xd$A^`i2;!KU%w9IG|ew(ri zG=jp2^fgDiVSX$O&km$TuDj9Yy)Qh^7lTxiMP_X30@tcS8seG&P3tAl{FETn1uX+( z-QUo4#hTl72|@YdYjEeZ4SMfei6NDBRBp>-dSr1U!o=k)GV7c+7;~g=b5RbF>dvDyjTC7U7P&}-9>%$r1PVG3SiMPTgA zB#=_LO>X(-6Uj-b&=AOF!sH{d_Ld@iz3hgEo3>+S>kzt5JRz*Xf3#+8I~Cbeg5H9h zOGl%UJg^yIy;RMxFVP7#{bjIa72u}cQ&p|v!6)nn?R*VB+iaKN+fo# z!(GA+pfxcGBJnO}_@1YxD|*N=Pf?z=emmK+#Two2=)w8t*2IAGvuKg$Afj!=N>8*< zm!^&ICG{LmySNoYzs;ob9hqP=IRaAar9f}0K8|{J(iK9Bi0U(CqB5aJ*Bh>Yy>pcC zen%u8mb+p6z+X3`WPZapJZKez6YhuIv??g?-54^Nfux8sd zq(bs2+ZIVL?>2|*@|Q5ivxYb9LwM{XMz0tJGUeWf!D&zr=i7?mjh-sZKBC5Iay;pZ z@4aM9kK5JTh(f!zAkH*@f+mN=%&kuB#JI`%RP@AIctB&>bGt;4FFTBMis`_i zTLyPhtuSCg3f3Oc!BQ?gwsyTFK9owwn;n!^DQ?CFsbONBuZp6Jg|N8fIJJ=GdToWP z(O%RNWUg_uk)>zZ%Dv_Aet#xb-Y%ftMheg*H-%1rdkC5R2$O~;p$$aCl6bD;kuyd$ z%tqno1qGV-H5sKXAF~m+67jd095o+~!^uuo*kJnrlWI~ddlIOI-u*)*^EK#PbawzU95FrZg zMzDEU0Ub;uan+R<&{wO7f868f(%6gW>X*#e#>`-}x{raKDMKbNUcix)%c(=nQmEFK zhVXq!%~v1}*%hNaM{IfJBKH3I#DV&bj3mW1xCV=hAp%)Off zOH(H3uJw)3`RfC{?>oi(e4=vQtlxLBKXsT)*|~}a3VY+f+g()fUm>VoJgaZZA+h@)b znHL?jBi;agMa0dYd1tZmHGfH}TtCa(SYW2>ZUqbS0&s8K5H|l?g9iuK;fBLkX@%hj za-W+4ElYh%6jzF()Q@%C*(V-omJ2e+3vp3P9<06J&YbJz1HGRb=%x4v3ck+7LK`vj z%OSmV6FbD^2R!M9(moP+(G;hv@dz_D72jDzp!9=hi_3SUVr=eIymf9hofB9FMM>AG zQgV5~gRL4LiYzOq8{0Vc*OeGpt<4Vt zyS4F2U>ABiu7sX#vKaZm8)D9tps&_)Oy_$}#uvy>jH5$!uJJk>evv^I$B&~h1chiRbO)HvQb^mvo%7W%`n6j8|M&X z$2s)QBkl~Sv>i3~Ov9ly>tWr@1hn%##2Pj9(VIA+$&F8e(}H*>q<-G!SmK%^FrB}~EwVHZqL z%t3vvMD$;`1|F>_C2DJR$@h_RI={4^=-7#JOqd-gG!jSpbbh0|+geyAQqEm@ztH^S zOVIT0R1)9DV`Q!!g$6Z#w)>k8)&Dw3whOMtsJh>jUwjsdtEIuE4Y$bBcZu|F);X|i zlja>(FXEg$OK`=UUEnUV1@0D{2R;58RQk*9!fZ}}=5!HsbE*P^T0?5RAqoynR)QPc z&zaX9k2@S$`1^?S?Ad9c{WB*zYdeqC`LCKDxGGQGtxSP@XhY)0?YaJQK%8rfS9KoK z_>+<3aw^x)FrEo((c4Oe53)LA%atVJsw zX7RS)G39n^j`$7;3&4U{?7E^P_NP z_e{t@Ihs^4P9Hom0^grTnCRF{r3NXY0uQ(RDF$WHQzUoAJrWkql1lAEcuZ>sK2!;Y z!?GzfJ-8nS3^#E+SX;7D$pM$Ap25)9Q)u6pS>~q2xe(HGlDYq4A6Zs#mz^c;MOUPo z!|>`96rV20+bBAK8*;kvT2&PLt#LBlSn-^eDu~@lL$6Q= zRhlIJ^tyAy8MyDUfMwTD=DLX&xUOdj9_Ki%vK#XuXf`F2j}((XR|XmXpdE|VOIQ-a zJzIXB7pdcm)2yYh1}uN|iq((d;p066ti8`_R8Lrhy2;v*{`E0gsF*{BTWe{7Zk=^(3h|1&c#=;uL<;`WfO1J_ZZ?7hevO>7?4EKE@Gx3yZ1$+08IPco;mFVdJ7;)(> z8*+dT7X@6PVMiWQ8J-^r-l9yzqT_Jh<#CceBbDssm!~x{DI}+S9}2F#LgjV@;JhV@ zVA!h(t2gu#k#c9^$GzjT?03P}w)ez-b_#tyQyikw4zd{!3Emz%21C-?(62@?OyxB> z*>xI@I84HXkVf1xa0t7ieQB1N54P$BQ_p`>aGoDPR?c+%^Fj%uWA~EY(wVqENB9cV2C!J zlgHc(I{3L(9LGC2w$ar$aAocTYVJ5fg|7Rx0q`AT-hKPD}uml^fJbex!opwFMz!ey^m z2(cEXdK%n4eb62)Dl&=mfd^*m^)*RU=zka$tqP|j`B0JSp#BCAuyNW=`v-54ss0r> zmRvz@m}=4vj@^^=`XX8ldr-Hr>BQyOY1H}Q565oICQfe}LCa8%oE&JS4`L@@-=?sI zO3d4gLl-(wqe})k&mGeeZiG7yHE|BQtMv7jMl`Ch!GY9hs&$Raw8$go?`P@F`E#)5 z$|SS!Ol7iUz>vfhb)f57S8TRcrb|@j;!vO(E}nahoa~qj#_wjp*4>S8(l6O;64yvn zyMOCh&W$@tht3p1Uj0cruCxg^JH|kw_!j~TbWoamR;_m4qR-a!vOlsu)9sq-c*wq& zB+gDly*abd#rh+*)@!5I{DqJs+D)m{TN2%32k~t(9K+`wt9wZU$l}}7cy|i>Sakrm zDJvo~J{z}qd$2m8k^2=;O$_sQW_bZl%3ceTFCsXzzjI`l;aY@ERGD zYr~O6x>&>Ypha((u^I(Sd6MQjaOnIL^ZV0ybjyWas_>EHa105V`+vH@j(ruv6sxE7 zxOFdc-1Qx?owXX;HqRlgUv{yPC11#TVvPUtbl|ayB5d0tMexwlHuyRzo4vNDjS*2V0mVZz*cne$ zuq#Ut<5o3d$Ijj8I%b7JZW5$zTQH3ibHS*rTM*M~4y7Y`SmsS|Y}OF-sH%e5kg`%Uu6EgRz=v31|PTqy4muE_ktq z?Ao~UOzjoGrB_9^W{H1anYkl?GChA(5PjrLBI6hJbX}6uu`~K}TxpdHj>>Id3*L4cx z)V95l)sY1%DOPme&q$CMorJZkw~%0M2imDPh-M95uf?&+%V`SJQagXvX`(7_2<1wxMAmi|HXh0&{s%>S`XZ?-Eywck8k?)3=GM)tw}we2YOypP80Ifrg1c7VBN0haB2$u8U$ zLl#_nM<1mR;)x7V`aL?BX0B3z@)Kw9ie?^E91*~GxzRN4p9*#k@)rGp|`&()tsWnQ%ki#Ip2dgbG`=DY|Vvl7VEI`x;5559j`lYJI<6U#^YY0*Ysk~ z#X8H!9K$6t1G4&OpuvT8_|8=gUn|9vhZC)UN2@r_0Uu1)5`z0S-e!m9tVRFs?PN4Z z2<;v?gYJYr{I(FmSJmI?EOH8VO(YQoNi*E84A8Q-1!ZCr;6RxMO#6Ep1GNW-`DClPeu_`|C$JIL`edrUfi7q<*0!P$qeh-t}d`1>Imy0dQ4q(}VpUNwX5U+2L2 z_6YK?bu!O$a{%psBEX*QGA9c=0`XD)M%?2PCvdmLe_9I^|=8#U@77@y@@;{ClTDs$VKIAO8*!_qb#D zwQLd5HJgJ(={HqXBJ@<3J6Y=^#Oq9W0`cOLNlC96PFe3mW?u8a>zg#d=Y|g++LlC@ z2wt9p6**7ITs2$xVZmjmcW=fO@nP^Nz7X~cEvGZ)zha&*R$%O3Euq2p z-x3==MSQnBA7?B&jZ5xY!}NVuF>7Bu(G$Aw_eM+sr_@cMY zApOuK4+5_~l2v;YprSz=?Q$$3vn2|Sytzxmi()yi-aR-loDJpdG@3F+op#*34JSjq ziCEwPOka~q-eL_b&wY*qvB~tD+FlM-piFe+SCA`fRH*V%8}Qs*$-c3f3~QycS*Nyh zXfoxCS*<*GzH{t>^N~XkYj6{#eyg*I*4B9buPk;ScE%avSLtv5t)Q~60I{)~RZ^C~ zD;=re?A;3$GqvEqTkY&L<}{Qye`Mo(a#`oB-K^WnZ^ZUV5-Ig7r*i&$aPiM|R_u_`?+xPG}SwFc8ckZ1|KP#!BaW;pxnSPr*PyGsldbbJtJq~W|S%Q0ho`DP{K4Pz^ zZGQXW6FjJL4+A9^V`i}&eL3t57x=jIM*C7|F@3|i;05qWD#s%Ys$sU*PLP2Q2Vt~t z3OvZHq5m*}PO*PVoeqjHZBc*F?w}4SuJxx{vsSYzMZNgrMKt6(KO;H+eWj~7{>g{; zQoQC$K8Q$7q9Kpf;rXXY=DYsixAr>=0rLmxorSYNIDawd&P{>!t8%cZtAy-$st7YQ z)kwdA8TiS}qx}(Q@R!fSx+L!J;F^$yd!}>T^PDWuz7vXrhbzg{B_gOlR~EO}DnqxV zFlyx;;TTbx5V3*FRe08*O3+5)sqP0mqPb3*%xi9M><3Z?QZONO+w5~_67#Ke03N(} zj^~3fVxYoQjF7+1G2EWv`0V%O>cU*Is^1-t8)m}t%iQi)PaLxDwqf#X^Xr{v@svH2 zLMM_>l16iV+8%fjXa5+*j=Y=nDmUNy7Z3$cW0iTUQw(T9=3?lysD^^$w@C9rhPh-b zPJi4C#LwSP!w|>biyn~&sg6yMahIQzoYNsymf6h1Z7KAEVLcXxhQRcBJhDDC12%uv zqGjhFFvGS1*xQ*+bgwQ$lkf9z^4JNoJ~P2g?pHB{9teRyX^&wjXclb!%{iL&SF=m2rY4Fij?w$ucU3oL@BS^Ld8T=K@;kv#-MNpw|hf9nM0RU#no3wilTAdBc+@vON94Ak5mos^5_tBDE)B1Y#2bPRWC6`bt4UJ0#W4V?R1)ZGj%^jR zB_1|PouirQADG}@0ZfpD6%0{#P*)qIiI;UiD_NV|Q6}gdltzw?j?s7fevt_pjf=MH zqk$Ka{bQQYfn{dKhXvuM=0=bk{7g)YzA{N#@rZvy(8zQ>1-lqq;~3i6L_fu(!H zXt=sG)!P4#iUyq~v!AQdk~{-=S>ubHD<$zr{#D|-ZyO4`C_qD(6bMVF(k7n{x;Hh8 zy39y|Z;q>=1(T@w!QId=wI8Ue8|*H9YjLQIen?I#GOT3kbol1mNw+??pxv=S)Zp6}G{r|`s$(39GUm}=0tNK(4UQ%B zHybN6yy(DmL-5*Lr30WB+l`vVTmD3;v+X z{2!9aG;U|1T80x11>hU`m?o=U1H*4Q7<8hBPCc9pK0d;Dbayr9m~*Ey(~hI?##~5~ zTScoqr_x>bAEQX?c_N$f2*sD&AP09&=5>6yR=06mBvsodW#(~j5|?Mtgq^w`=+Hiu zeB&}&5pqgqKkg1=Vb5<`WM{(k-Z}%fZ|r71(&ONogC;2+ZXk=( z>S58&UuKux52Hgk$G5#am-kbn3`d%)&0eY%67_4_z~U7lc6SQN^3oFK;=~xy5KO?b z?WHiQiL&JLDD&{EG0xp-Kq?%b)&9XoRx(l+LFV0yVjk5+v3=Q!ly3P!*1R%dRe#Tg zT1`i|o8gFKU!tLB4-b!aceC!_(Xk(fs8PC57!d3bZ*fkS3sGQ<>Fx+=`+G#k@y_T`65(4cd zXK?JL4m>}_$J@Q%6I`p8GTUWZ@W|;^Xj^}Q)ZaA0bq}Pm$~g}s@16#8F2ikPDaOqs z`*CLRZ&Go(i|z^t#S_A2xQ}DB?v@B*HHuq7y!1XicUcL3Cs{^DLXw>GN~Ovi@55;Y zA6gYz($IkeG;RC>wg~UQ1DhwPj%FIYAyP-H*S;Wkr%M$;-uS};FZ>hBI3>CR+%sSws;&&(?_V3MOTXvY%!RL(T7Bcz}qy?5MWGQS5D$siRUoc=_-9(_knfvU(J}j zn2f>^<FWs2#N>N{`p#edh=|_jx2OTQfwJ-SfaY|?0o}p!&+J1JtNM9uFX3qL=1{G(lFmA5>i&>0tH{{P9DKNN|P1fwOL-%v9*s$D-W~)?M;hzvc1kD>^ zRHhb_ygj$bpzHwMD3Xth@1$U_i4nJJ5aC(L714>B0NfTAhxd1#q=5%SG3owEX4Z89 z5Z6tFho}oLfAperqYoxp8Y6zy!djI}ki7je2zKv7k@XKr_ObPNWl0ZNoFxwb)WgZ& ztPy&=<~WLVdLr?^%Z?0sfJx0y`fZ^rTs{^1*bsCxrKD9Z9GjqiMzoq$4+% zM2m8qWsV=H ze7}TW%%(AuHFar0iw9~dMgs>SCCN7O*cDy_t7HdAh@2kz9eJAd7e}hI@f^)Nri9@~ zGhy}QIC$xlN?#TZlc5k-nlJE>y!#Vk*_Kvx*<)2s|Oq^CZ#!;AvP2eYn2Afm!gek{mn~42j z!>qzd=^J5GlN3VhP&p`2j3K4<=P0R3gw&@dv}Ml$a{N`V*_u*6$Uka;)6~RqsajH< zQ1l6ED1M8|x4)++TThejCCNl`_6qz~x*XCsrQwD>`aJ)VI5JjzmRT(7OO1y8h(OvH z%@>t|ZeI%PhMVYtUw0@k(;Q_S8_72XMM$tdg5G`i*>QI}FlqFF6KU^h=LutYlllxU z->Zk&e17mMcM()v4v?nS^$Z;-R$|pN)WfNqwZQuBA6v-!q#{B#P6^nYg(6yGTf{_ zsBk;1eEOL-wdtYR@Ho3?pE7*t?m_8waik_6scq;%*lFy`v~7*d9*bQKzXin zW-apz4@nn*U%e^)J57Rk4TQrZi(`1uYogkAPL;oJBpxWEs6FTgJXU=V> zmnLgNPe?n}*IWaxOWZMGl?Z&_8w-{n=itE}0rcoM!>vX#v}%7j9``=eLL)f?O3lfO1(y*dnjTUUWg#7f|$Ool?m5z?R54zKwp6HTv7 zWZo;{_Vz{^m61>C1vw_tIuG2~;E7$Q0+HWq7ZJN+1qUqsz}09jy|*dB%&W@)%O*N;Nm_NR=+&LuckAsDCMjs+ik@w${PYV=a9Dr6y-EipYpG7+BufE&qA1ehVyw@{9pn~_Cw*yE9|za2ogQ>C%VKxWwIn9 zQELk4@JkY;A+lk_M!*J-6n&Jsg zu^VPa13mi&wxlFN#;p-LNj-YiPPHy%6Lj+D1%&wKWxo6$ZL`?MFAejcNnQi7?t=Ly1Iy-BJgTZp_^9I8y* z!j1N$tiS3Q)1_R7>6Q%MsB))bu6D5Qr5rA6cu%z(2k4=|3=%uH9&UU+O?TCfG2i0r&{GGeGoqawcTYzSjcuRN zArPeQn>nALdOf=AYv;K7i70rviS)|z(^oRtAWP3tQ`OJ3`tnR(<@8zbtNH_Z<)RNq z9-qMIk*kcQg9(~i%0O;<22@o8ohM@t+uC-Kz@>_KZO2LsYbgQ`?>;vE^YywzbFN^* zH+hWj9jOa@XG)~r71O{i3|RBsCUn{_3`?CuSG&2uRM!l2QG897Wy^zE{t~EIZ-_ym zo}d$%MLMsof~YXgBY5U4O!YXAcX-Jl^VyO9YvR#wJ<(j}&<%IK4@KOh3d!=3usyVk zw6=-!ejL~UnQ?Md`tyC z*8*4IX6t|Kl{qTdA6G;`bSr7>d_$UKSK)k_0629o8Nc%Hr5Cwgm9RLE-sd|GFG&|Q zF_*+f?_SpK)g*4W%k^U24d|a8;f#UaEc9Fxh*_!m7}e*F=T8Wt!jH}PuIn`OV{A5r z{L7$c%3I;hqbzn%I*h)49tPoy{!t^jbetq~8JaBigZymCx-)U*u#Z26WQm_+|GT>q z1KyqmC+{MdRiX}C#+&GZzLL6n~(ArI56Iq%L-KBT)@&Ceo)GIi{Tp=j-Ofh^Bc6X?lf+ilSVy*q)5b}HDIK^6gM~=rCFGQ`(CP|?zs=_ zvIDQEK}iG&m~(@ENqmpt($*Nh$BTW3vb5^-G~Dd}fEXs<$8V3kN!^?ZM{#j&}LgM~p1oz2W8*KGLVciRg#DO9C) zxz7Q}o^XI?3S#8Lu2kGroM~EAvH(kbj+4z(PNAEZD||MOC!$Uw=Dr&&uy<}GoEx9Y zGp-${Ejy}-)FyY@@#~VQR>u)E?iYjqth7L*CJx{Hjt4Y(MXi74pds^xdL9_Y1@BJK z2Mvv+eX59g%s>{~cFF<8@+2T2@fq^ZHNokkRb)&3PlzIp#BF*G7H%u%?)wiwEq(?p zsn`#R5--TswN31tuo#%}+#bqP?;&rQ1-U*Di#Eyx9tuT6rsD-no;RD-F4Bj~!AHUF z)D*M88>xixO8_yiWVHRX61q+FpjdA;{VjC2?!MLq5^B&!Rd-gw_whU|c~nU&8dsUU zRh1zrD?gL$gzZ>gF%1d~v?0tdo$fMvLCehdpk)bAxh4bfG&@JEtj^)RXVDa6p!VT517#Cn{_1yX`wU7vMyC@*fe=NtUcoVlh4+ zD#sTG4cS*;tLf(}3{eO+z^Cg3Ij>(Vng5`iv3Ilq!GIe2qw*X&bvUtS)!fiJFB6~l z1wd&v3uRXG@km_<@zDyy$ZzHN%yI|z?aM~Lsd`v&FbH-gnNg*_Ec~3o<(Mzj(kvo_ z@8(9szr`obowL;}ak@?> zvuz{Ntzom6ye@UU-*@_OYn>hRMDA~}YGMBzM` zCwK-YUYw;p(>}5#N;yo~Gc{P^&z76nGP0ETXdL2bJU-B;U4mR0DIIC~@5pwF>uG7RBA-w^h#XAsu*_Y=W; z0^lv{f_DPuK~MTBP&vs@PPtm*`WR`{(aR&7T(*)uQ@MOfB?GEj@$e>pJ5ERxkOsdb zvRFWkNgV#g?DegH#`jHdSj+~u8b^|Ui*3=vTohyK>`?r7Ak(jQ9#%e)#S>&H7Mmm! z-{rD+zfX$Ho5aAD-zUMOe2Cm%W&%^bCeWPa9LK2n595-l0UMcA+MJ{V=T|>st~C{- zK)dzRvw(6#t7Hw_a$=2ANy2hg`Y1FFKDU$UhQ^*p)W=8Q?^yg;tM zvh_OD%xuKkVlLM`Scvlu6L=iJb#XmE;5}*W#e!4|n&K zSU^pq{b=ZSQ4o^sq30d(dL)+}^O-e-UNgUt4aed!`$jVp3jFj)g)vI0BYE{N2l-5| zk$1PWVZB5+OikNPo)kBL*t`HTs#`;r_RNP*t1O7n*dh#4DduvH;T*?fF7)l(MYoMs zK*?57&`WwuA5ES@x3@CzF5?Ty^%^9#Rr^tYJcl{TG1>NS3WMvbR>Bv~+x$T~i5^#~ z#yNcV==jwXw3J^CPv%Dv<1HQ_(fpVWnV8_%!w2}-L*5Dk@dkPyOu@@JyjQx~;2*0pxbf zvfIJoQ6%ktFT(H|`Ekj#*PtA_2EIwjkw({Jw9iNp;tx-TI~GOc2mf1Q3Oy+Ein}Yy z#}dBgP`J7@oEAScCFJuAQoVz7l9h!K)lngsZEzAx7b~$>E7Qr1Ia$!t{*3NX$RiiH zTu$vy&h2P_fiyK7WAeSj;J8B$shPeC^Bbn1@3CjJ?}cieRd*%r*nI6J+3Oo&*QXP>^3Q(u>wi_aM1auA!7c1NAt6k^mkD~UFUjv$IcPM!l`7uR zgDyjkpVX`a8<)vqo_G_p)ztzLt=?gvZ422Oa}06x40PIjqYk>J^o#yBG~O1^9BSwz zZ-*YEbm|6dJJn0(m2l^{g-W0=ZHD2Km&4KgMR+D$3r{`KCwGp^ktk~;jzuqrBdtA~ADGgrFI* zRFcI-@)wy;qPZ9!l!tdz7DAP%70EcWjP`uK&mJ(_hyTrWrlsR;;5*SvPEFg6$z27w zq*4_p^PPtKcDFEi>M?jW?*=vG?;-nN2*c&VNNC$KLOcYg;p$_>H0n@1nc?}KZe?Q8 z=e`Uc;P`ZLhjWSCa{)+X2iT8}`6zx%8UNgFf~TWD=!)MJjQm=8?kq7KotuG9+A0rI zT=|$4EfsjmtrIg1OhAmg$6KCy3F0dgVb6+UvSz<2G%g5&eodh1VV6nbf*p8y`E~R) zJ_7%SqHAV^IYfrO^&3Y&+ltA|n z6f>t<Qb$L|Vj!%(CVlCdk??DGS8kvWa{q;G&2ZU*&7(w1(pvW4M@vk>=L zo*2;tNMFu}-KFnwG}js9l^+s~(2LyJ&l5^4IA8CbYs|*TL!2Yni;Wmuj6Z(gf=4|o zNrgrnJo_qu>N_K;NO>KXi$B6F>s!pm#JEx2!_(koQxWZxKO(Ai;& zhm{>6ymp+lJrm z(Z*82I2xNgg~aq)m~Z0FjW?#Lwb*J@To=5s9F^Pe!WJ9rkYIHzmCx#bvOxCv$7 zs^QX;OYz~w_gvnLkC(({AMQ;!!96aEd*ad_cre;bHJ1%gbKTpx&8m;)zIqDoFaL4= z$qXn+`a@SgI0gsFA)xFO;IB4@S!tXra#|?=0fWys7GubJ9&69*%nhwM)z#Ptx3u3>+*{<)lm`bxo%Mw=MD<9>_TEY z16KW5h_uE8e=TYwwL80!Z(=)9zga}Y$NrLai!Nd2jBeOtS_KRBZ_wjqA!zpD9c$Wk z9ZoM>0+Z!G(WdEwARNxk0t9%_wD$zkoC~=0L<+35yvckyI0w{k$>UGQ1?<0uFSJ!> z8Id`T@OjN-@*`sbY^egCtbs}kPsYdsY5hVYF6dgFVg(T}# z!$G&>?3#7n3_JG?HoQ}!Yc6c2!$IOS?fOpmv}gw8^WDN_AzP@c=n(O~8cEk3ab_FL z%<$LPR($hm0bHrD0nSnZYMr7ep*9PDaPu|i{$#vxW-I4*%A-P@)33v$3p5^W1;f`2 zt}ZShNB>9Bc|YX%y>Yy)lJ-{8B0@@~p8H%WWEGJTDY7E!(~wj|dvDQ{mWCuFs^>n} zql|_kBSIl$lO%h6@9%%m4?X8T=Y74e*DLlb46pP8drdb~SW*Mp+s~0B+rp^J$y4|! zd?{ODn+i3dqr{p2o+PYg;p*dQcu0#!DNFK_Y8D`oHofd7QV@h->b-2q(~Hq4UhTh}F2+w+xPI zOt5iLo{ifkilEVfR9LycoIQFZ1D>3h5s29|q2g#KjtDA9-$O!wF7{#E59vYv(ky(k zAfC1eg|MqHW^>%`Q#8-r3VynX2|jNjU^ulOSKh24C6mX&jAzNrkdP7kMr$)%S-lT@ z$FB!AH3I3+VDK`@qvrdKuwPmmUe5h%i)Zt5(ar{+};@foUbOCF+Xfu`_ zO5-nIe+njCET!SU&$4FeLCnLJbf(JaH)(NiWrsf6!J?OIaM`#e#C?Y-sXvhgPS=EB z{Eb5xCo+pB$Gjn174lHx$bDK$*74~bGpKXj0IOxi$a=9-T<9yxZaq^CN;B@_X?G`F zV;fI;a!kP}Pnw^rwhV=W#kswZVKO;qIeX*VYceMi$l*>S993LSCN3(a^n5fMZ1e%m zxHreC!6!J;I+$o`HN$>4J4hKf6_4~OL1KymahZRPUG-)YH!Ep?-G5_=vTrX|KFWj_ zg#qv_`T@B-hnuCJRiyha@5Ne$SGfOh6!*7iLaj#!Yont~E|Kl{l?>9uS2!Qw=wI?o zFq@iN_+hjNmkoaGqk2Qx^y*+4(fU@21O57}io`}@T=PGxo{*)$XEGO;53TF*!K&MFqN+wUSR-6pk2AqaUh8 zaZy$j4ZUti|K84~KSq$(J75j-i?vC}VrPDopC9>cX@&L?nix1$1#wvcZ#1NzGz^rG z*4ydS#7hByrbTLGVVJpX{gymyD;= zbuJ5`@%lHK!kzyQDreJInR+NAu1H#UEI_LLf$n5t{RPROQ>8>E` zFb5q!y(MGo?-IAa(Ktgq11HZqOh>G;a1~p|U+;YYZ3`w)hl|h9^G+qWDp-@Y8h=`2 zu#~nub;ED6XQ)&7UNmQgXp2MY}GD)8ygo)b5!k$-c%)fOr zFyzr)vSG&+8nn8A_ALHIyEHi7L+EdEL^PV$yVR71-d>CoU=hwqmd3YwW7uFViNDnR z;a~80I5$>IY8npFV|PnQV$nw0+kAl>UhTzx9*e`*5{+Q~bSj*6T}fRXiqP9Y24+^x zfnD?U;eL$(ru2*ux%Bt2@kKQVBGjStQY>+i^2fLACKQ?flHC0ojP6cKAQpR=CX{Qz z%3ZU-{FM%xx7p*0doQVp;W*f}av>F!GNhs#quBZHG+_VDBVZa9iGSBTCW{UMzHAkP z^Lhm|!gm(Do6DyfS(&(8B^_i$jN!7Jq)mxfE^0s7gPZ;sLcG&5fW;y-iV235l9R|J zuA6wU=@?rwuhhCso(EHXI>~DBa#(O~3j3$Q0xq1G!M|>yOBA0aW6a)a_OrVOoQT(k znY{^gPv>SH+S4ZmeOMni?!#_5%BF?51V1oNw@KKD=w%1ZO*?P=n1OpZebu zMU6DZC?yU}rI zx@6MuzAWPD?*Lhb7obn;IPEJ_hMy)+$SIR^^pyQI`a}IO|Md!Kcq5yIbGCn`!at7^ z$Bq={$6i3^xNF3fF~zNu2yT1YLS$kCsg<{YrWr+(OUHkZtokqzS+$#-b`y~3SDJXz z#T!*arhw{}@%ZARDCTFZfwr1(GA=%n?$1~ZggJ<|e@jTRKnvA7(ukE}DDr>T(c#q> z@oVoc;1^G$5?^DO`~o-F(H_E{h-;cbpqhHv?4Do|A~Crx-h79*z%ng#$t= zI8v(ypZ~ldYPqw>eTyOtNJ*hJ)@O<5%@R^|xs-;fY=s6dd(?lulD)Xo0Dr%$VG4HL zV>N`OXnK<$J^SAoh&8n!t{=L|v%tI7ks_%Ou`U4QR<426LL=Y}?Zc0)6R2l$DL#%i zhawc=#YHO7)cUI!lDZ0aO4aba3cG3F+tuXSZ4YqN5anD&L7X#_>;2YozTs8Ps4KD# z=J)D=wqyYv-#v#3vy_6Zi7C{iyq@}23!z1N8H#<ND+zKC}?=p+|nLKvZWmsYwgafvBh~M-EgswhpDF1=GQqOaQky^Z5 zv;vi{G;&OrlVqGzA6a<(77YCSO13b4A-?zrfry^NWaArKcwK4??@~DqyFd5l z5W0-Xlctkm5jF7LSOzp^3Xt>SaQu#p%|O&Il0EGqjn2?T+OUXijjw>tz30hj;&_m# zD#X<7Gx00eF$?)^WYg1QkK4YFhxI3-sEENs^1e)&_N};%XUzxE@g#Sil|LfgKOd7X z>-JGq!wP6{o!h+I_Z*jtrZaYP@6h_w>v3z2F_EpDB$)s7IA0-x2PtZsG5u{cvB`Q4 zI^io}Nly)E^{U~TS2CdFD@rHvE%8F557_e$v5|pJ;9Q}GLxtaHpZ6L@weTt({5zd2 zcz+mPpD#!D>QeOToeam7ENID;F!roW34Dv;GRTFGndY1RI7{siTof)~{Cs7=NW2=Q z{)FJqxBbkv)l0~P^-ECu_+rr75DioRjnFB5QJgc%fPZY?O){>a1}FY?!f64*IPYFB zX_+@p;5B0->EQMn0~=Bp!{H*(ld?snC$F(!LL6=X7>fPXl^#t%G>XO@V0o*tMiz81@i_7Y*) zyP#Xt3Q0$0$<@n>AX${iW(Gu&2h}!Ya4L81c?8qAt{6sQi3{{ca9y=?t?)@omix_I zp}zOG4EkL*OPP!zA!jP3K@Ek;mZrD#cYqNl!S|~@? zuSp|@6Vot0U@_cunTYv6*MZ5$WK=8?f~l$3>B~>Y$>I<1Y2veMG`;>NiFD6EmvLOb zDM^9NaUG^tm6meu?MPC-#}mUscjDh?j?~^#3r@v2!-x0~;=1Y`nYH#b#ylP+dj)sM zd(Vd?+0OwDx9sEc!b+l_BSXfSQF2Q?1~nI50hdd6ndd5Nn?GDj#^T*u(Zt>jN7LGQ z2Rt+(d-p54bKMZFzF9}7Rx{u}`3Smcg~Q?VBINL+6r$*t1;OHHQF;7v^p;n~y0|iU z#qHX3Yv_=pE9*(Y^4&xv#va^uo5HdT34FaY1TKkPVqKbrsMxqEu=Vm0*fG}_%3>EH zZz==M(yO>`#&@b1r-5Uu8UV}$K*PqNg=7i}HdxWXGhHO$f(`xsMGCK!o+Z`YQ7|vK z3(p#V!kg?x{8sA>!QT5&EINfL{!e!vIKa$njesJXDQ+B@aJ>10krY77~g8vfT@N7y6?8s`v!c}gB zs%fCU-cl@YcLIY3d6fI^3ImxM5R@!pBT>+Tc6zR;k~c_g#7sy?#7_t@uIKYA7J{FZ zD6o6oVS?*&`d%X%Lu5YDHEEnzen~c{k0e3-@0Uc;tP;r#ahS~QDXUh^faYly7^<-j zwtt&$vn_NxCJQ5t$(n-;*ag(Q<|x)I8zXXFK~$O1z=I#RLoWAi9DCG-&g+(9-pkXx zk42+oS;`n|GwT<5&Q1HKzSAcPA_a8r!*rs1L>1p#nZxPj`>Fo*XK-SM0eLex!N$%l zmK|Gt21H{EAeV$eWWa2A+WiVg))nKg&0Dy8cL=U!6JfRCG19#u9HqP)Vf+?RvguVi zZc*2Or?ci0{!{~0bU#R@Os(S_A(8N6S2t{M7KWI&apbh78k7f#k@1CRagNY+x^9&- z{@0)cAA(*0pP7PVLowt{zNFxgyA|yV>43m@?RZ%0GV$LM2K9q)L7qzwuR9+mJtU0D zuZ@KABLK}y%wS}55u9jrMt+0`N~$95)gHszFB7TaPGz_^6a#I`&cir!&Y9~XM)yyU zM3Fi7sn_@>wrKlZ>fEyr9yUwTS(mrrdQCfy5n_cazF&jQ_Y0xxaviAI$uSD`_sNM_ z7T8p`go%vE2V=Q%cC9$)nQ%x$$)PKd8E6SHyPk*zop*gS&P|E5v~ZrG;5$H@vv7@+Go5$U3~p$b;mi3i=nwH~s7TC# zi1v8Yyc3Q0Qm=B~u2P~IZG#;?kr?kNAcyuGr6!^Q?CgYxz_+_iYJbfnPLXS|Y)c!e zX9;Lgxd+{QzaC-J7+w9Tl%8y_W;7$6F|1n(hSn(AOuu^udwhq<@hwSoMym!%`c_C& z7U@#kf*@#k63V_--%WQ<(jpcsx6?U($$0FBsIk z-gY@mNwJ|vd-G7lCjp+$Fhakf9K3z@5|L4$RJGCwDqn49`vyu7DnFCI>P46~X%nf^ zj>4zL-fXIiDtxr+C)zc!V57AMq%Wv}kGeIi++7ALk0NpNggCVPtphdgYBbMH4q9ie zAely-<8)^&XzZlc-I4JS`i76IIG*kk&peXVc7~4Y%Y;qFtB_dD!|0vGbj$ciW@B0i zsyYr*%W;iV?gpPdczrMMWNuKI6>cI&Io3-Ghld!|5Xgzq(r>o?a=1?9RC zro@zC_nGveK(d{=`?j7@nCMOVFI**0c2}{sM@ndgwGCaxiy<8Z21>VbjDw``&8!&nO>GTh!xxLmt}1yr##TB8kw_i!?xS zAvi2c;%1wTOoPlx9KMr*LkgW_N{%9?g=muhIDUe|g9yC+?j5mg9ikrGEIG0CF!S>M zcGx~M5N+-!g1$^Yd&_$kmcQ+%@?!p&Jb68~GcWnqnW?m0WE#lMbb$WC)lBB6LK?A2 z0uF>PV_zh1p+yV!q4Aj#Mt;QtR1aH;^7kU(uIg;uU2q#N&)0&X&Q0V&>u>(~w>|LR zf?L!wV=aAZJiA#>t`BQU1(bhYgPsdd!#n$2p>mcuHnlrb-Ai(`uQ~uMyVrA`D-U?q zyb#h4&OrWkZoeqd6xTOTg4{PHaKgNTG%egr!yc8>+fS3A;MHT`&1(Yn*}|ADy@)+B zUX9Jnd(F(5rG-!bm|$&BDT$W-Lf;APhI_vz!n2`zoV~P+wyi4Vd_+PRXLuJa{@B8i zpd8c^F5_h!+({lJwvd(KLN=?C4$}3CQ^`!fXJmTDd|ak=h|6#b*uwIFW~(9Y{^zZT zKkXCYWt%6ubloP)Iw|~fe~AY3Ye=rrb*O6Hfnf9$Z^i1MoF3A>*KFCM_Io%bXe%V* zNoteUN^=e-U_*_#K)&w?-rN#SpZ_R>*vBjhDZfSS&D?Pbx4S!3k_3)-HQ{(5AMM@p z(BqI1G)|I0pw%%gw`r-?M>^F zG+^E_IDMUj;Id07q~3gqsn>%+=(r;k9C}ASeXk$|=aN9_cqOxaOCO$46s9X@n$bI) zn{~ThCw$Wiqz5eBX>7_nz6Q@3r>grgHxKgAba^$|>a~F;Y^q|`vuCkxl{Dtf62tog zrxYy%H=+~fRooydvc>4BqmOZEC*b)>dwl4t z2+B!zSUmYQbe&Dd>y?Md#LYVaDzoTmhx2r{@+fjNz&YuK)OyW6< z`rzu0RN5493H|C0(~W!fP%+m@#B-b&ew4dGU$xA|5M5=P9e)1!ajPv3+TUW!qefue z#1On`YepwN@g^$tg>_Re(&5{GXzOXAThLU1e4|Z@O=DR)Qq@A=@DVr zAfriyI|orJZUrkX*8!WkykqBsIGBMc7?x{Qm`actCTCW5-SFR2}tG##% z&m-6eV^86*SrKC+6N`ymhEO^q0~QQbGj{SlL_bl3{Shuo9V`~oh4U@R-cCodXVn!N zxgi>#?rOqSdXMOrtA4ocPBxW%CQXU!WzsqHfNaVlWZd~*tYUBxgnn8=D>pRrjjqni;M(4|^yn`cn_H_-p?*ml#5uhq z>s!(wT}g#II}P~ky=@pFyps6)19}T=AS38I3A2wx#RfCd?KBhpKbzsUx#x-CcM#rF z7AKv%?vo$io#;TfI5asGP%BV}^-kINqdbra*`7r@bU#vcr(bmGSRq^TbrjsY(om?` z6JxG)V*Uh08?)RZ`pBgKg5%%QI(`nJFYjPu_!sgd<{c4^7RRaxc_Joul=hpP#KZX! zq)9CtN=|#y_i;}c*O#~Hv-Oi0`yf-aX#LI>yZ!}ARF16FR2K)%&kki54IN~^x$G|vs_ zVS614^HN~pQ(3(5JQDOHOqiK6oafsm0f*k?qtWW;^lXM9jvB_2fqS!2@{$!COUc$emUP@ zswOmGlA0dVF`UNNKJbE*)@2gq^O2)e$Vz6@lYJ2Bd%)hUyJUkTtfGRy{Da z@%zDHjoX^pn;NHKmkXEceLqHj&oM^Lgz+|o6>D)`wSaY-UkW8e9yb&w!M*s6xKsNv zl^!t?(Dfs<&?tl&b?|8N!wFcCEi2g8aFfJejHHXaBS}QZ5j;|s4^Fuk(e&4Rn7`mU z8Thn;Ip-aYe+GqVldu_vta!j!yv&E{vjjxi$D^;{7acPEOCw#+QoI|9`fF-oC%=_9 zDE^ByA3sgSbkivh<-O2b#PL&=sF0eeU`iMq<(qjJ&NjK=U0(qUi-)N%z} zm(Qd3|6QjAxz!}L1~^V>E&te40p`n`g(;W9;G*48a@8gXb0 z_?)}3sSy^9&ci0A9AqC9L!abfBK|Xx%ll+(s3(uzRn$#vwF2QvTOIRcP#vV-CEyqJ z6qs0X5(7jlFleZfs9Gi9H?LwCZtKN}D>WqaTPgi#63xA@BH{0zuXsr^j>}sBmrQ<1 z%v)EZ%y@CwdbEw0W+uS=Yh^UOHx+A#cLK}XLm&M*N33@4ZQ3)rg^W)cq0#0`ptE5$ zwG!C~p{F3jK!2?(R{PeFMVXgCP3J3J z@~;k0e-y=lIZ^cG%WSe~Fbx`;CJ83$KA_voWXFD+f#(7 zmsGIfCO+`6m1|||y`;l_Ct+k^AopSnIk*DuuhubC@fq?ujq#cJ z2$lBuggdt_V$zPA@M!9o;K5`tux= zdtwjna}Us~$0JaRyQh~@cbNAh3IF4I@}F~e;z;;I!rK;(wJN!IA?gp7eX&9dBTtrk z-GOtfjzHw>rWdew>Dn>DovZ&jSx0#Yxl6F#Pyu^6-rmog;S{EAor! zTwXc)ADK>ju3W+1#dGmWbQC5(lY}`@(csf5!No{(@J@#@hNcti-7#5ghD;gr=ZOr6 za16TTBMS6-s6IXmd`!kKt{}c&cVdXMFgpA0g?)D#$jiNUC^JrkyfD{+1OLs2nb)s? zQL#1z?bwZs4U4Y|xjCwd8F`Uz!SOmjGhX>`>AmS?sJMR)%yaa`Z`@g&!MSOM^lWj! zzzaL<`bg83B5pUPhF(}Pj$G|5B(ptZiOK60?%Cp`8r9)lB3q1*Qpr2Nbu!f(jo`Umy+dWR*hR23qB zsv`0Iop_pAYl6uSbKz8$4>75{0|zX$@#fa^bY_$exmc8np^YcV4<}pbxJro9tuSnP z?*J{HTWPIOJS6%YA^wwolhlYm?3cQajMcIj^78L-W?B6)oZY>OY>PikJ_lK&yi^T! z8-IuC=(58ro5gH~zpImP3p~gv>v0HQWZ_Oh892sT)ArMutncy}_~4i}Cj97OT~~O6 zbM8ahIw+3T-hue!DkbrjqO5|qE!8tUgW(hPc)L_nvE!&G?X-2nmY3V`?`4)687ziv zib6Q*(?{KJW`e4jH0pSKWY+di#O{4PjEQ^@)V7_6w?fzXLRpFU!YH2HV1L28>926Z zKPwz@nFTXG+o61BJZxW_i6`<@L8yt_&F@%CrC#&lQLGht9eI^RiVaiGUG;QcZ60mE zCk7{?gP1v*v!QsE3}be*8Z3OQY4Y`QR778B_Cf3U=2$jzKeI z2i}?E1r2K&!SA&;rlw7#W44Eh!f}>y?-%C3aQDQzng7A1&E<4kO_{X~?GtNph}VN&Qkl#!uaXrx&AIE-dRUjvXwJ#d#soZZh0xn? zfd3&9GcO{xjERu3R}R!O*a;(Flp zqK(WQn@99*KC#f9i-Qy2GYKNj*p!k>Z`qw?w$0y#x{2*nyLcz$nm4gi{;Y-;=N06X z;RCkEq>Mfed=4ou?clMa5dpq0JLQ}$US{k;R#j#E{w|X)BP+5u#YQ;c8HUd)z_F;bp z_njC@=DqE_&QD)CMkebR@g=!jLk2+E0aC=opdU$B~1;n)NUeom-Rl0Rtuc**otWwv+*I@S7=JM|J;L1yG|4Dx15*q zXBOi*9-Ac#HHm}tb(&N3h8O%W4!#+GWFJfFkboO`ctLy*8LQsTrsQ$U3d={y?vPhB zu+NA%(yk2;zKgTVSwj3&)TX#_ub2QENgxtm+MevHY*-xWNM)=I+BMrzf-3 ze>~xtTs*Dp@`QVFE9ohZOB~zd3BFCZ!LE<=Bh#gnG2qoPrZ4FY)cf_&{;6wF`TH0a z=Ud>2)K88}ehof_i3x4XkTTF`w8OP-t16#Grkch!_k zV8k$JQ3JLlaqf`OB-+>JL*i!k(XEq%;B}82E6@dd48?HxBOKI)SKf3L&>O z@XLQz7<5}!AgbO)tfwn+^RPF>?{g}9F0vZ`3Jueze>bC~(-Kf=7@-dj-UHYC3KYH^ zMk60?zztubfW0M$Pjo01UHy&L88k8-g|>Jl$B~9A>T_9g232^Hjgc0=*o{SUXdjco z@K%=Dq-pKb8P@=H+sE*7^39-+r>mZQ+)5>&aLhz$?U((Ss>$@WXi zkPlU#L0&TfJD>Pt!^{iR{+&8Vxw^2$RhzIt{Vtij#gc@pT_b_t%+au0*#7*V9OpSX&%(It}Gf!`Wz`B=YtMf^}mMn-33KRb%MSQg)lYU*2 z%W?TdpvGf@&2f%1v(r^TbpO4hVDg#fwW*_o)OvbCJQmm8%cPO!Hl%Je0uJrn3|Zn| zXc%;`O*3zx@ckH6=s1b1{i;bwa0W4TX7KuguVi`P8gzZJ7gH@aVD26PBmFK2>qM`T zJ+V<_$Av=hdy_hc3Wkb~SS14bxN8;Ni+(+;7%H<|ITzM;^!H=zW40BBSwO z`x^31qMQ6v%Yz|NEiR8$gh$SY>C&aPq-yU7-75c)F54c97kkw)L3|9&7al6E?W&|%4Kl3Sr5@C;OeUq`y3vfv^<`BMre z<6KGa?L^XA=mz<{ad>9#MA$wOKv}VEsFl!3ZQ7R+!}%HTiJm8Cm1jbb;tPB;oDKE! z>UamF9r@34vS@?$2!tO?p{gfMuw~hCDsR7^IGNw0rN>*C$8Qqp_Xm-*a59S%?Q=-R zo(E)YRUfz(6*BkJC(^2*J1}#P5ZO1Kz+2gsbdr81t^7}je7-*&o_`C$GxEhm>7lS- z-!5(^%;Xh~nQ;jGFrJ?JKFn50H1f6n%O{b3u{hJ&3+j9RgRDvK`2q8yvH4O6$^}xU zQBsP;A5~_@T9!}=l`>Lrlj|C_HR6o=$sk~UurUj-p<>ceCef<}#j0eHpWzO_{t0pX z_b=f8@hQ%GBaE)4^Z7-R3FP{T)u`2wJ9qQXx3uxiTKK*+2V4}9&dV5k&;6OZzs@1h4}?z}>M z%+66M=N7Pd^@h3cYr=gGCBVaA5}1d}2xKESp<2T%c=WJ?Nk7|4jhq~z{?S4bem4OZ zw#=qxdrL|F)I_GXD~j4r8~}k*6+US(BWvgFBY3HV_L3)D{+hzPRC-Oc=f^V6rKfo> zzaN0)m~Bkz6c5ZuFQrrVdxD}uH28`MFn<1b5@~M8tS-|+cOOSAoFWZ#O3Pt%`BLP1 z#qcu(>AX6Gho?N@T3r?>_`b%*KeupAge&%qtARpA8&1P4&_{;hahhuet^U}=QlBUI{e`|VkW zaJ#w#j?U4B>vL8k>$e6n^J8$9R23abI>h|`)Q@wxxAA$=5tv#r7lQ{h(Ksgt>Q0_v zdd`WHara6=XIl<-Dm&u%t=#N%Viy#A?WcdA1Tjab0plBZ7L~M3m^T#Ml6%e122!9k~ z;Pap`?n`y0+4HlQiWolWIueQVG-^R*@Gl+ySw*+8&D2MEh@|x=VmoHAber}&L zVN(LiFX+b+;YUQD+KpS=rZT6+$MtQPl|Aw68CLSo(Ew+lBmq#jpT5lH~kf% z38CDagx8r5jH@l0cI9JUcM~?qMA1I`c^H|0i2U9BlD-Hyk3tdAXfuPtE5SZE#F6ao z>$>xnS#b;)Rzz_1fRLcDz!55&k3oU!8%8+)7YSXHPG_bshG}`bsno%x5UO#S365xF zr|BBuTEld(P~cEyc^3S})m)!P)QB#vs~~f=V`%!NWXM=<%&h+EMXlZ_;mHtr+*+~= zWRrdoWg%{-e8h=!kj8?3*jsA*>;kUY^^JS4*RWeQHiL`GYPdCfBHWHiWCXtP^hw4P#*SQco5%h)_;iNn2>6u*qUQ8HJjoC zP0n5F>J4X`CezZ6^K`y$54ksyPtO^(P=}rKK{YoQ&cJIfmp(&BlMd0BTz2Vf&7-Gp z>C*k0_L$Hw1LImHXpE&Nyl8R(Z<|wO(Y~7`=_Hr0`b=d$bUbMOQoRLJ&r|ZR(g0?K zN|4yK60o-35p6vb@UMLm**wjHPM#)9Cg+|V2**dW*tUqq>wTRO)jH9 z3eyMVu=jvCd`S%9&q*~yqh%*SyH6Yc?YRp<++FcucqSPdNXJhiiHym?Uu?AOQj$=$ zl>RHeKzD^pQ5*H`%`G33IqpLuL_eO)beLXXsow_VK@9v|HcYb}Rj~eR9Gl2xBbJ>> zIA-~UKmHcS(U8nXO^Y$U>^E)vwnGGbb`A56eU%2jm;<&>h{EX0_0;FQ6TAwHLfNK0 zY)ghX7>cNXNM1XM;P#;zUcpK@G zK26^x7lCZGHhx~yK*RpUqj-NHUH;_)DY;{YbFKIv6LMynsd>#8hLR%4E0QSTr_$R64yvl(|E9$ov< z5dL*HlWe&-azxf2B{t2&pC<YvAP)^~5`M{@l9vQJ6yr}R7Z`DXzijD-ay@+TSp1MS#q zasZohTcP3)%la=r0Dm3U!P{$T>`pHe49Ysd1aCeBV%Iq@@8&?XPfmy9iRsWDpvPKN ze+Pc$VDlZBGK`RmqE)Z5==z;|=xK{g_%7v%y~$cw&^|^}S`(P*&$zus*9M$ZxBy!` zr_yexAcAdYurb7jzKONOyUcf(Z;?(uS@^NtaZ)hPTod-c?;_?BK%c75!N?XP40?Ep z-MH`^??wGIx@}o6De83Nvbg~=bLMZ7vepdLVt28#OGW7Ct>t93mIAI<)38aF?ja|| zK9SRb|L6iydD_HvLmtdlg=CKLl)N#O1oDPyx@RXF@o|A5XpGCiqt}Anz!prhQia>@ z(m>5lK)|g6I?v_+9G}`os;WAviiQPdo({nGb2#p~`ePz9@ejTBJ`V0r?WNW;=P}db z{TVjB9JQ97z`gD<K^hlH?1dVTmlbjb(2~=Tj@kJ6%9AKA&FzQ)M!S|~E zSb1NczGUlZ?As7VePbULzVe&s{Qf{PeLd-!6T>)gs|2+tN8{)sRe{sMEs|({oD52e zlLieXj1$wa`7Gr?3l`_$^G9u9AG{H#U08`0r-M*F+8Pyg#Zb!P5V&yP){p<95nk!-RZ77XKG#imUlABTYVE^0FFW$!>eUERcR`fZ))dh0$9q6dd>wA* z-o@e{m!sSzE3$7Old1@Y;oxg?+&;J;q?IDcKtAURTX};PT`K|U&kT+IBWGjXn?cTf zGvW32sgviy+X4n_id!R(qK>u#w4R6p4{mQtTPuxvpL@Xm4iCgk z-7b7Fm`9(RE2H1pE}HhTkGXz8h)GToCeyRJiIaplgqJUXxPcplXUvduT-S3#_g8W_ z)kTM%i{0$`XraG*(+91>9 z=L?T_4m0;{9zzfBJL?p;62W^FR!=ZOR_q;Xo4ArL90q*&LWp`4J|LH>a`5f*Bj~WE zm1;%aN0ki31e_f97ujwyo=)cD5UP)jMd5^bwXZ?YK-fZ$D%ox@m{lUIb z<$-Oqh|OW|J7k)X09HM`h5_Zx?D7Tv^yZ5h@TfnUB%a9w%en=mX0``@%G{3y>ndsf zqK$x!qG&ZE65{C+WX^GX_4koXGixfmi84l^nicSLZX+4CZbiMbk)YN$fy^3drfYTi>xpAo8~w&P2s>MVUfU)D z;mmjb_RmWp!#^4)#-@O;k3POU;XzI}f1)3DoTSe#T%wvGCqcFLI?0WyqoXOy@$`f_ z@G#{kIl50&FjwCiI=SC!N9!YAVQdMstWl@dEwT`@TpoOat%;SPF6`cQ2onGLgIUvJ zXuOw=4tFx)q+%6Dja`BqGbPYEo=BAyF4Iq6W%1?u6xeicIkta2j7j2$=u>}BLZc$! z##T4*Xb-~d`S0n`?1_SV4zH)cUrJsbx| zxVQc{&F`cJUNbo#6oC~NW7{tF;Nl`FoFuLcP8ScOYyE6`u=qB_#3nNb%^XN)vliEX z4QvVtO@P50Kk4;#UUZ+v72dxWA+bVh#3k^MnOpm|Ko-vJSv6-(@79 zb5n@uN1(A?F8CJCrYbp;;SQ0*h9Gs+idTadFS=oO+$om%ITNG4STdo;YdOZ=5&no% z3|v^*Nu2#|kmI(yQDy2Bc)VdJTucrIAEApR_V`)$_UQm{oTrIj47Om|E(WA4chiBx z^5D+ir!A*+;ZgG=-ml3NFJx&@nb7~>#@?N9U(Qxwna0ftrAuJK=6>kyyHDd&evsGd z6WD@1T__x>hC56hL5{Z%R&2Y>FXPR^XV>eX+X-QLs(_e|#?Tu5Vmf_vF;$S;37yXr zso%5BgxQ@1syFR1m?tXuvW#=1eR~KZ`#s>3$Y1`qK{c=$I|&J)+t74(J7RkaJ}UV_ znew0-3?ey_Em?Pd%axZ;3^3>I_me(tyZp1ln&*Oo@*Rqw$2p3TmUnIw3rSVh9Oq%+> zm~MLzKs&e0A|H}DZ`3$GNi}Go&Ykjr)fe#Kjzo0PPy_YWXLP;FNzCP)p?*5G%p$1> zs2CWf&$({P>PN*my<;Z)Yx5-|d`jQuCeV!EU1aml=e#|3+pt$B3u?BDK<6QXOD6}z zfvgM?`qvEpbFZXkQMd4_!3lOx{AOw%IYuA9%4T;L5VSPhLm6v3C_lOkH!myUkHpSp zzuq+i<+%rNrF15^u_h4VvIi}LQfR~QOuFaLF?v~kE|>>#e$yS4X*#Zkaqne_pzbGG z*7}clC43;MX5X1{>mo_R%w#gLZ7XIcSb=wgI}E80lhd81)O^`Y;&*--ZfwXR4UYSu zJ>)LoR|#RNej2u1(i#>Iw3uaoVn=)SG#7i zKO^2?b?uqJW#OaquJLr*OQ*_`uFb1m12=ZsFPG0Lk^O?cy zx$JSkc)DPDXe7~UWbtNx0emXWM#)-7h~qMzzbTFz?IWw z&yfPx<4n?TYr1Q6n7`&^7Km>(VF#Nuh~poB_@Lr~PTTa*d;Da0UR4FT1^+?CVQ-1$lecfYFhoL^aFUrh8WbQ}bRA zCx_l7@9QoSvi&A02zkdE{W8SI4c26(;4n(>;Mnu0qDYeIIyNVG3JTov!1kFdti3)) zF3k*s`4#7w&u3zBX~0*aSYn6$cPBHYrBNU;Wt0S$ouNNWl%S*H8gt4}8oS>HP%n{X z)WBv6{#CFg^&_Li=1L=-rZ)knDsI96%Mz+8`WnxVe}L=$D58hW4Bmx(RX`6kkQD{t zG|YVl%%19r{l@Y(%NnLb0apWG);p8@+v|^+`5J(`#lUFF6}T2xMcS`$zPCUb?D#PQ z!zcAq)26*}V5u}T&*jdk(=9YoLYF#)*5lX9?{E^YjGWhM#ea`I$%!A&*!|OMAv)fj zeNqs`*lT>I*_`8rhOdVu6?X8|^ghKk$)xSX1$fb8h&x|}Qg54G;CD^}wIeJb_`p~C zK64L~Ha`x(8_cFk_e61uP7t=1#?#`x55Z)E4(u-xM$L=>xX*p3z(5ENjL#%Z?lvGd zBNi;*=hC#@?$l?-Q#x+uGpH!Fg|*-GQ0m1MBK&I=mh2XSgJM@`hLQ-)@IQeetNKZy zYbf2PFdG!cB1w-`6}@?5FSz?^L;ogyRJL^j<0mI*hU|NqQNEcMWGhtaGbyJgm z9_K}S^WD&`;WruQ5C*#(Yhc0XLpsTO6Ygr8g^}}DLSk$rdT-l-zFtHNWe^TKj-gjXA^E=^R!LfqzRMh87dG*rOQws=I3++S&-1wV{7xL( zAPE6Bs(7V+4V+qelNvX#{~tx?9ggMO#&HcJlpUfniU>t1+}DYup`wx$6-6oyk(Nr4 zy(KebugIv(`#K-9q#;T~6arbtS?_xmr$;W!=-*K=Rz`Tc%A?A-r+@Qmd#ur&-M zdz+gWl|xx%+VYhk_A{9czK-@G#q+-~B0L^= zDBi_}ItlzRs6oS%LYRwx_rkk(mr0z0Gbt~h4Fcg$nUc2U_~R7E%$4hLNo^!>+nt3?F z_Y7msT5_{pCoE1}iX!4w9AmHm9eiX#(!d1;a&O`5c|82ILKTnPTntf#S=f7Tf|l<% zMKV^VKtpr{ky#K&W0ZE{!iX}W$?-E(-acSM?0F=HF99^07sJvgy}NJVu4UfS$R_b$JPtjTmdA5=7{To-~KXgloP-gdGU1rdqLx?UE8p=V?C<8k)+IgyBe+e{`jv+3WN^| z!&$8x}1bV%FYqMi6?!e!Q7Z_|Tqn^6p_r zto%?0ZSic95L{4`=6s@;Xx-~-m~z3L9MvC!p50RH;SE+$soYD8n>pXtg|`qiZ7~z} z^*E)cve45m12U>PmxF{9FW|i@OxpOKR4@tD^AzV999>0!7~Q2}PZ!gIwc%7!I}6=@ zEMeBZokW9PZlVF|J8_MKmHA`V$``GyMIav_=?^jF8sM;&Bo?0v#N znu9kdpNFzl+hM`RGSbrI5B?8Q$?pHeKw+9EEDf&!hsCpavZ+0!L|TZO>jq=`ucVs3 zT5-HGdW9b3X4ZBGg6PmzUs~ck4~(tvf>!Kv8ewh$Cl~PX+CQ(NhkDP_;K7;Xb^SY% zdTA~>G`624NSwg2HfbzXw!?{b2ewg`yPtiPfUlvAiyA!PNeV-g$2uz0{t9S5J zuAe;lAx{687sAr(yO?LIU6EmT=r0jtU9rBm~-h88&{;dG|1~(IXqhY+OQG^$kpJey0 z%Onk}mO{;%I`op@c*s`^pt~eV@ ze3O3Qj~BPGVwyZwoNpm{Nt{D6Z4D&;=z?QeThOXz1CCVuW%g-0)6KmrXr{tsIGD*} z{~YuK<@tFuQ?e4?d^SMEVRd?sPlA*UzMy;7Pp7eBis*M#f+(~{(wQ|S^yM)IoeKCM zVnG^t9dL#Ix61;b%<}=iI%jhCULu+59Kkv5mEhgHjnF?|7iL7oqMS`G?mWr|SEd%i z5fehZPsS1h@l!N@+bU8&V+LIP;=-k3w}4edCcTi{LXyA@|9$<&8cIAtub)S_?3O8Z zl%52Ck03hsbRAiG>k<39F_N}zS;O9(`+|l^>!K6iHgvmaOYe0#LcoQo@a(})vex$r zY|kr#Nt#3SxVSq}wgkM$uYzY)Qz`0SB))Z(glP-J@FFJ|92dgYwNs4?=LW;f_bx^k zOQk^V1wiA&D{!j946d0k!TOKeVD_XCI2ZU2dK5RIb4EVbix8u_(o0A{!YWeKqmKo5 zJ18&c3?z>FV%4%O>|@tCbcftVVz4Qa406l_+sP4ZPmvTYjfjOCvy~yaWin4Ox*5cd zCcvlc5t3aS4fpmG)3YXu-?r`Aze74HC`H zNcwr#1JZgl4=igrKHnvMqR;^3C&wf5*7XOY&eu5Pnn%>CxbBmmCyF-)GcSz=P%~jZ zXf`N-OyFBm!`lt2S9#14E>rerRS`QVUyHlGorAA-D^Zl|OIf_*qhBxVB{xd+q2tnJ zVvUyM0_#KV-S}W@g%;RKu7@KtlfcHV0B=7lBBOI6VONNpv2X4xJUx68g%^Jy0!8nb z|F}+UPtXXluua3ny{Yu&&U#e#PebdW$;PD}KOsZ8h4X++;*}M>L}~p+)I`02nE8!S z@6#tB&$5U)u_g)bcdml>^*hNdKbFpkFs9E-CGfvF9vH;84qTsXz;rH)lM$KiK;q?4A2o>jcusZw@ z(esw@4qA}^#v7?dl{ztObwpxe2e;UI+WK1;;bQN|)E;$E~4gl`#;c+_Wmo${T(*yTLUFf{C2nKmkTn1xv&ECbqWW`_%maAux4~ydH{U6|ARntn}B>)Djk9_V_*eYW;i0^vx&Y zw|xsJUAhGQo1)-*qaGxlIZr-&ub^vsOlX5%D2nyVQ&r$t@XKz&=G<_&ax0$x78b&S z+e*yC*Z%NmT`hA?^d84o2I8shO8YNg#{uUEu%0W5OB_Bz-^q34C7FPxp#=CbKZv+J z2_k*t&g_csT-U`ujnpgh84wRHpXRW*@U!WLxDXayaVN`}a?HpaiQlyUNS%TyZwWr`IykQUwo z$a!l(-%ih`K9?n7j$$z`@eiWQ&D&_bYc?*-Z^ajj3^D0#2Kmy(ad^7|;p%_|#QvNI zOYVfZjlkClCNerXM zMc32xIj(d|ge(+8+xOQSbp@{m zd0TV3q}Tvg%D)7q>L>6Kr(tR01tz!o7EMxV#NlV*M(Mk56OYvAB!+u!n>Ax;W#kWf z_+S%}mD&aiGBe=3%5kWQO=bf34}wb@g+u(d7`{82EV|{1%Q&Xkl&BJLNp2(Yx0N9H z%zk`b8-qm$yXl8VM@Ze0{jBP?b@<895C=jNtM8t>M(!;x$47fOyo5#<-C&=Ci-IbM z-kX=C)MXt!3|r25;`Q-HL~D)vvg?dWNdi{cmJ+!sU1TCBkR(35K>`k*V=@nOtPpN* z8<)@Bc|!kDyXD(x!C*F$Qg3LG8NpjRj(CytT>rTvN}y~TB{w6PX&f`vmgBNKzI_vq z?@p$x=YE5YG6Q6K(0pc7PBxj*^dEJdF+#HwtKekyUslXrh3wvR2J^W2j$(5Q`S_k= z%xh0YfAnA=6OQ9^|4D!;iGd>*O?z|{>7JG)HHJOJ2o$sLV zfDO70dlB38|1jgG1*o+BAdTNE=wBT*sC9b=i@RB>v4HDM9{U3AiN8pP?L{nqtjzNY z)WF#14cs~6&p8~HlYXoJ*rKvL!oSrQ(^aQnaO4>M?fVx#cKyd{Z05&>lW!oJTt?;k zG>+G%#jAO1MxJ;K(^{Hs#5iz0 z3e~T)!$Thp=vn_AuI=qMH1&0Yn~ymEz(66r^q_;p@34h6S;3f=!DF0wRcwQHZMDpk z2zIaj4Oly;kNM)E0M_nDaq6XfIJd+KtY*z)#cgV^%Dn`-JoDh!5;@rGa)aocCa^`D zhV?a{--pw+rt)y+ zZ5Xq=Sc{tRClR}USE#V`Mz}sMgOjTl!JWy1&?X^|lh4%|J$|;6bhqb0;OJHiwz^T( zHI0R(CNro)<$IFZb(Njcv5v&;AYeKF8+rOm2hC3l2lkTn zd#cFJ$hsOyS1(4=c7Qlk1cT(W02H$uA&fR@Xp%K|ayhnnW~; zcTgcM6?_bL;qtaAyyH2~usuzOOgVCrtPT4^^}c*Txrc%DX#@}6d_Md(ON7ikYfsxTP`Xjl38cS5xWM6y$D-TPfxmF(zkBYEn%j?K?<&1BcNu$o0W7uu^h#h&{iIw|5)7&Ug$Za>pUE6muwx4CuvGo>K73b0{ z(@<2#9HMoUWgkB)Af7W15@S0DI67zzZAuqGRICQ(O_$-g;>OfmU@eJ%7Z3O2T2b&w z2sb&kDKjbSw&M=TLQ#UU-`VsN!gd(c#1J zx@Rf27k@(8V6Latnhw#90eC>X0ut>%k)h3rbgpw8HjYH#=D@W~#q&|RhO?^3g~Y&6 zQXoogh-7M>DwADr1VFHDKAHaFDZObGMP+Z!FkW*&hIvxCjxv7vIIDbwxx7saXLr}r z3Riy4Tj0uw3k#$D?K<4&lZn!Yy2#!B*F-J-Ado6an(cz-4q zpH5)A4t~ZPUe1h>RW=n?-}Uh{Phi} zbzKD8XD6Yzb_%)F<&BDOR-zGk0_v(K0HqY@rn@^}cV#Fy+HnWx*f5+pnFe&uLY#K( zB5wM3msZrrVfLRuurmLNlBaKDj$$45xQ2mr?s_s~bQWo_sHAe;({SRbCY1b?rw5Po z8J{!fo+&@@@Kydfnp@J1%BTNA&8&8MpdpZq%gBROLpaRV(*O^rL9%4pQL?ZmlU3zo zF<(G{1WrE!?-R4(c9kSrK1;>h&W3oUW)g0Tk0hFdQMj`B5*~l5OIN>CGv>QKohRZp z1!=Je7zT59^o6;^KhO`78jR3-)grcSvKVd>`b-mQShP2YheMe*@Q^iy?33R~dS@Tx zOihPPlTYB85l^^O7Xn!dm23<5cjpjp3H~R;Xua+LsaqZmXT6QU<4Z8~V-qR~$`VQ2 zFV!)RHKD_}2wsPur(vlYIPk+6O{8uzGQlAr$^C^wAp0Z@wsD!}V>2d*QHcm^p&J8z4x-3>)dK&Z zDC$^n8+L`eLeyCinEB5RJ_{>yd%JTe#OhH~lZ{p!%W^@GCun6+B6Eae z_iuj;P}Kub6I0=~zBsRQ>c5&haj%A!)~b9h=$MeywQWhl0)27Xy`yz?cN`MVisDkvL9chc944h!(TZbpA@qADG5fxr>>KN2+>bfH z-2OI-X&=-EWe_(hX6R_@sGnLM~O=?YJNI~gUIBl;7qt!d;p5XzS^Wwac@p^4Bad8RW7VclFuejs6>V} zU8X05`_3iMd1In@z4tq;d0k9xFZsfc_1dsQ`6=*@R*_{-*T8Jo*&w#&fl>bhEx7d* zP$xBtJ*QfPhgE%1Z|Mn;_}&ElIV#YVrHhf(gY5m?#v=IkVRj~fx=kQJ~~JY9SvcXza=bF^Q3v3mvedO7(8-F0AK!M@oJ_L zp1%@Aox>!UIVGI)C`J$dg~c)PfllgIe+fJN2(~V6BDtso2TC467~ew7s4ayl zow9UHKf_4xXd3jtuVjDt|6*3UM}pC@#pJ-id)BDyDXpJ#29AiCQ+G0%_b2`@ZXXO` z?<;dW9%_Oi-&*PSJue>^KBA3x$cf?FcJpU{D=!D-=Ej=M>LqghlyM-e3-ErUxSr`ZMe2m4*dF%ST;)-Pq)*DL&Iip zOxzv(4oTw5<)N5<%?Z6%#e$l$0_|A09Nmp_nE*e^-C~2WZ%Z4|JU^2xHmxIP)${N~ z?`wMYo+21<8Ncy>b~@$s4|;CSBvP_zJ2(_QqkAG3LWt-gpeeiAtph@6He8{VjcZK~o5?OGeR*br&G-Z#XQPsX@hl260Y5YgoKw5xKlV zi10uEPHB+=I!i8x^TOG1S?&>(`tm?(QX%;ldV~0zWMF?_4cxVpHny*Dg-o;aOq}&; z=-+UeX3p}()wi9g-<($b@z(*by3WFE@;$3p+iV!=PV-6FWOYl~YGb=h<9(sj2p3={i zbn)Cv?D?=Vlr3o`YeiI0G5Hc4=}e^dGGjOr-b%k64JYO$!tneUXdJ_DScGJ&srDMaxur)Z$~!mipD0^{0|ixGc!DRQ>~_6h))E`W)I}Wdwx!JA%V< zV`L}faHhT`v*FY-=8u^)L$(l9-Z&Gio1cU7-wmKy_?HbFi-jY~Q(%hj9&qo8hDgt3 zc$)kN*EPiBe7R55qwX<#zG*F))z!?V@-hf_Hv+vysbtq+0P{{`n0m)fBa3Xyz_`&7 zH?AC`2^(!;<9%%uH8rDGR6FS_)hJvi7en2ihjTvD0V=0kLJHhF;UfPL*lV1@+^X9H z6F3v7!fCK{?WC*UloE~gKVe;o1nAew;&@k_(Mq?KWX%an_+i&e?>@WF2>uShOQX_6 z|IHU_q8Nd4k#k6*LkvpE9;aVaC!<>972-6ql#KPx=J{;f32U~;(JKo2U^mi8vYrZ% zvrFcac`a@sC?a%DSvoR98Ogsw*5k1rT91Zd zt$7Gou9!{_Jy}e21Q#)mKO>F4<*yiM+n4%;lB$fU1x`sebjGaCtfWGxIC?&o~D&+V4Q! zrS(_>Y>^xJuIkr!(>i3M^i;nUU8Q=xf$jHGY%J{+ZJ=k z{~&|r3B%-1L^SO!UI9`fckt_tF?w+9BSVW-iB0Nzs2SW(4I?6;R9K&NHEE!le5YY^ z`t6#@eJe@Av<(pQu7z!#5=1_!B*NIgNydIVec7t|TX>|zhJJmu0afbtF--gcU5#bT z{NtVEgHbwkZFI#y`BmgC$193@GMVQj+(Vw-VQ{G#%R=%hoSpB8AEAS;=i3UKe)B{8 z_(wEfcpfKRtfBY%S;l(eH!V3TNeg$V*Z3(A$l25hktt&E@~|PC4~`)=Gtyz#uSP1| z+=>qS67jRWHB?qFfCV@9LR~`~WZY<>ncQx*c5E1?cs?c5zD0o@H|KenH%Jq*lF{*F zIT;*uzyq4w@bmjqAabq%`GpsNTS_=lYdJu9MH|rL<9Lm0zX<-yIAJtrVkNZ-i>JSO zg5d8Ff*}HqH1LQNp7spE{4qy7JUf6&pMJpFJnUo40zMIeUTtbLdn#zW5~gQQF5#&p zlw+p6G`>qRgRq8G5M1BPi0|A>OH7}G&0$q^vwA>(KiWVmc70+m^MUcooi?EMY#t^g zh{G<&bowc}2rlcc0^L?2;~gt5<1yLO-2Rbs=7}oc@zuU4esCd?$=^!Le{!D5-}^Az z!kManoB>|d)394W9`;I2MZTqtSXwN@J+BIb{m^C-s(BKAua3|8mNI#FkX|r7&YHg>+5Ibb4l;3CD`w zg91N8*{%;cV9r*6`1DZf@}~kLn&p^N*ntviNeDU#XzBigdLC+|&UFhwsKOihEBSEQ zyKRs@CzW+x;eg|;4C%^yw@{>~s|o z6cNFVA;0MPnjTVoClA#wG-9-LHh!O;30@OXBzm1I%#e)5_XAw4#eOaNM{^9pHygO# zB-bU#G{v=CG^=oq7v9zo#`A@jX=3Yo#D-KV?o-TOJ-Za+H#w4kJK>DOSu3J6nhVcm zB%#VLgFewLpsBHcC_5#b<9cafw&Gn7I`M-3(K}7^#s89kL%JZ!IV4;I81%SSTjSq4 zMgy&Us9Y|O-kj|Z@&}r*s)P^R?yRO^Cl%mbXEXg`7)nO$y*OqwU`;v&p5P-qx1^pr z3Esxm^0{E`KuMMQHRx}DYdAN|mrU<4M${L@pR6@1aXG{SH&>cAnoI(oZvwl8a%61X z6r5UXU?gGhfl2l;ba4ANrpJyuM~3fVTf{xw>S2K!j$CEpcPo&3+oYP-$4{{HlN)t^ zdmU!p zUXRZ=8sS0_3)E7+Q)7AUEPjy6VMoSJqU_c0u6pd%^6Fk#H?J$Y{7}1o2V{<-5bZwntf%9bl=fvIvH=A46>@XEN_^`y z1s<*7cFu8F0)sZuZt01a3=j zprX(VywfrZlNWcP($gNI?6iQ+I&%VA&(z`W074C(<--y2N;%oXZtCNE**`?W>lVsN&L%XfpSUZ; z(JanObWmFb^i9IZVEJ-%w0{Pn3zxC^hRcX<=z7>(7J`>KhQ<;v4=CPION6A)Vutr? z+Q#ji4LNpTNsk1mK0HW8eU)&>Utc)bYDuSu8N$~&H>u9ycJkqc6UQuZf!0(D4z}=z zwzG1md~Y*-^2rYGa(UYdr9^V}*cH07y19COOD(3)zDWHQEWlDz)cCWiCXF-p2K%$- zkddl}(=sO;>%KdLM<;7wpnn;Xm~JwkCy%WAcH|;Nx~;U$^GUqEjQH?v3G72%qyJNx+FSJ-NM4R1R6(`qh9xc}!2WA8^nZ1qeL z<6eO`WUlrGxT!Ea84jgYP z04;p{VbUmrZ&wVUK(rXmKHSRYztLnG)|g_rPApUFlSYcpr@_@XJE=$1J&2y1iaY;g zur|N^;qP}p_Kc+mY;br?*Yy~~yK+6_Hnj!N%5|A<*K2V+tO269*$drlFH_I3La4Oy z#qO+V(j_p5>$dTT=tC(g*Pw2E;Y0{2@|=zn{UPWqXadaoet4{X8=X?iiO6=22~sCQ zzNUYmF@ke2H&zGBG6j(g6{0yYq4c{mi7^epdpJN&Pm`zJbV9es zgb$&^tkEGKxFsGA=ZEr)w(!4$3}!D}cz72-=>|iod?ZGi@ngD?A2GZFVAJxAKK=I!B^`2r zgw(+@M_)L9K^@hXiZEBgI!Ii0DWhJVLjOoCr&-0KyhtB!{O_a$9um|i53ClzlWjNY zx-^!!Z4kzgONw~D;ybfFF@Odl&p?8my8F|)eYzyQuaO8|?k0MZ zLct(+6+EtqgTyj^MsvOr{8F6@+Ecqp-RA`c>zpSU7raiz7I#nVbL*tqJJ;a{O|JVS zQ%Hh5=aEsZ0!(<3h&kO7^lB;hUdXxCTzDr)>IV3*t%l2VXNNPN>u=(>&pz~qmn}rS z7c(|bzD_)rCa@+Gf9Oa57Xm@r1YTgltG>=d?!7+t`=SO4C{Pmm%iO{EupF>|k4XN2I z0Ylt;<(>h@RN48B%;DdP*Yy6;EuvR3{b@DrV7=i%mp#e2`xLGE73e@*6Pc=8g6qA^ zQMvjAZs7PGx~F29z<1&xJ^29sK3@jw9;vaBU(4x{nmq1zCT=hg*G)eioQkroqV%M) z9BSC?0RgS7MA9}uXySD;({j`C6%QZx`?sTfTW)iO;It0=! z0$^kHXU;o*1p~Oe>dG(?;u1Xzil5w};b%wS*M5#$-K#*HweOIz^RJnVpRpJ?vkR0& z3gOO*r^G^81INTu;cM|e{JE(COqR`~or4;{FY%4$tnP!M=uMb>H;TO6AA~jm=_GyO zbs9T0*=YE$C(ddU<$RF_`Lbd8W{l26!=J zls;O00ozULn92vajAi~VMyDYfC3K%LDs5AYtI{r`nchygx1*NXToi)_`ir1hY9Z8( zXH)G@M#imtRd{4nDhqhYuaY=oAyiM!pR|=OT;_HiI&*&+oPHC=eFnDB_G%&c=5d{RUfYC@ZiaZZzf0nHT=FxPpeM(^Ey=hS9P zWDM5?axUTuT;UjgY5O{0hhq^vogs`XQa0k(SLZRC<5a&&n}xXzEc%MvBVC3`kdow5 zvt_0YmlOFwyxhew;GGj(ZEz#_ZXE?`PiNR$-!^G>V9lji}gLe=4p`Jew_BL2R*l<6& zl%qua;e3Sq(Y)#SfMlus3k zHX?aAbQDe>`9K?>v5-BV8cE;!=)w0puFxE2i24s?jKAIsWjAeRu=nqC zsN%c{FQdd^^&3;V;OQptxNw-u;iWT?os)PvB?nOB(oSfaaD)yIBRF+R3vXCIr*%AA z?0l!pEYFXicK=3+ZSqv(1O7?adRUxX^W^8==K_wi8A#>Cr&CpR0X%aj4&)wKLynO( ziHuD_o8y9b`j2X85)6JFGLjwrWl zjirP8uF%X}eozYvgCkoX82X;iN7H&Gu3MVReg57>Gx0sR&O8z?o-83}n8Zz!h@8{m9PYP36g>zz9Z5l$0q=(_^ zF(G{B@tEVAEW)Qh@`&iVPc$+{3HA-0A*)+{6T^MVxO|cmUV9Nqwg(zw^X$oV%SJ!^ zu~e4L2^}SZ(!F@cQG*>idYxlLCd2FJD>yc77_A%HN=DZy8C9_#Q07}2G;x{Mv*R-` zY?e5_Txkivr^u7KQ$;L&*-qsm50PzNn(P_DX;gBKK3tok1ks0t!N%eYI<#+vj7N`& zi}W#QE6HYlf4PAB{!W9>GfF5=Y7InR9-trOL-1hy9m8$LQ}Mlt8b+BG;W9(ct@idN z>G7_nuOwzMuNu#?k3YCV^kGZpV#q^UeYh77O{ynjJD=j6`+hjF(;sY(8>8QBZtpH( zfRBPVz|qxzNt;0*@%OqzcpZ6|@Su<4{abX}<7vDD`ZF*Euv}fbr^@0+PM?B60e<3`U#BNbi+0dUl>0sy4o&7g;ApbNf>GTIPk9 zhJ`ubNH{5Tje%d;@npmMcBA?-MQr*!2VuH6tdP%vk#8&ndy2wn+e5kuImcJwD4ktb zLcb{pl2iZ0VMF3ta5-`iTdpGARBdK7Gkq~`cWtH~Yvv-)GMvb*KZv)RD!85F1(+YM zOQp)WZfcwl(drSyhk9Wckx+tr{Pscn!$VMi$elF*IDoopQ(>ms5wu7jro#WVk)0t2 z(S&=R-Q=bK@!5GGGipp;A8NG)qW6; zBM1B7%*ZaR{8@t12fJ|iNfQaO{YqBo-GjEw2&O*m8oK71k}1Eu&`Z>pabMeu2bU#+ zN?Z%o$em6OYa~$Vokb|&ZGzD%p=jOmn?C8giLvd1H8e zuyq)0_veru5Y611cai?$X70k9^l@d?PMTR%hJR*sLy8>dcUU5cmBRPQl1XJC?J&() z>_`Z#3QZ%M3sYfQunh6sG7IjcI@1NKWN1+>mnm%Io-20w;X00&d8p+rm(NRvg2GH< z{)zK%PI*pq6TrxRX*K-$6pTOhDJe0&L>A|#k>xw*p~h%Lkr)yd(ZjxPvq8<(#q{maWH=cHc=gUCoW5zZM&Z+kbryu3Vi|UW*Vx7lyT74u{ zFLa`AVjHkZU=#GhCp>*Fkw)E2$G59YnT!yBj`?E--bE)cG+_ztP|$({a;3z!uZEf9 zT+7@TS0icsUR>dqCC+6JfN-2@+Fq|^!0TtU!+CsS9?L3!3muAv4kz6A8F?1 zBrr=cM+paQV)WlL+8t?ybtW@F;CCa$h^JNSMWxWUq6rAX513)OR0>+6yrVLYX;oY{ zIaT@&H;DLZU%dHL1d$*EA9AO787!$2O+PFvSCLKL-nU;6W$BHu?Ya@4n zD#RIb*=BjfWt$-*`68K7_oQh&Q>gF~VA6JO!hMr>VTigUukW`YFQ%oPKK`nW z4qOXPpnL)87`=j<^@YLqMISTyY6~4|_k#y72yy5dC-D>IkozD6D&YfVuEs->j1Hs( zo`x5tcX0Rh0o0gw6yK9NvO`l9*S3}sRFvXv(I|p+FGcK3kYW~$KV-!Rqv*$YOS13y z5>Q+-pEZ2B3GV4F#!w@rEX%9It^E%;iyJCwKQ;qpcE9s8%eh|E{ z3qC1z(VY9xiu_u8jmzm}L4>(Hv~3NdVlKIG|H^TuSm>$2cd1sq zS2hK2e(j+pWrxWxy_GmaF#=|On@Th`h|yl}rkcXrVoWH<%3pT;DIM0BO&z)lK=r2% z+%+nOT3$05oLfP{BX@D`#w_e`dBS)#3mePt^d*ZkvLUem=qg?{T19N8yx`ZY!8rwR zk6nvT66Ba6Nn6m0=kl%2vS7o_dAI-CNgsQpfy=^LV%w+!uO5CPbAI*HjzwqaV(zna zjqo}qC#-^u{0zf_NPASRl7q7|J=s%Rhsn;^b(p{>N7cpsYxoDsPy+s;P>3pXx=i_X23&UdAS`kd$ew@W5{XCrhVmC46dZVtrZ%BSiBz&Itf}Xf@9QEd= zKt=lx_Ca?xH5f3(BM+O1&OS{r2rh%O+P<{@*Htnrm4&}a+&r&Z7c~+VK;+Lg?A-Kz za{bU`BIsO9Ouq=>b887wbE=EU6X`MXD|$y0v)#z=#7dCW5`@0RT3GSz0IcR_{ieSi zu&!#7vH!7^5VZC>9ZPcr)1@^;K!{gp?7>X&i2j(`^aK?Za|CH)oN6w6&I8Ki|1*HUkdi)4&1j? zACU78?>adHbAQjpyGo0364{70VRK;Pc@4~|5k!mdy|`~^9~AM4!aI{qHANMrP`BbA zS++2PJje?I$Aw8GYSwHV@>~P9{6*x>9d)`=I|O`eb?95|Y>s&+h%)lu@OSwYvgb$# zmfqh&&gIX6Z?nwFqt`BA#W4_bM;l?mop`ddVhxNmy(IfX2O%>c4v(H$Pv^vjK( zv~P-|in?Ct<1av#X1Tz!B?F|X)~)8!x>ypleI^ye7t|`Y7fp*?aN7YzW6z}vL8D)u z?%ThO4tVR*{}k29)bD5U`|X=B@O~fgjm?A|E3#4i(=1R9TLqJymeRng^}v|(db8{2zlIn8T!MFDX$V)E$}Zhz4X=1er1QZyUY`yKIK zNGe2%P30-(`GV8m!x+VJ4$nl!LgqACDqF6PZ3DvSlQl?Z?5(Y7nd%0@cOR1Mqzm-M zX9j9hg5ca-D|UNc8QAS?gfVR^=nfSJtL_PEf!W0Q8_V@@RKS>Hq~?YR&~(=i7!*{` z-e0Xu4hV~~-Tegj1oF}M#eQI4a|}N(YGG0=gwaA_6*J!=7w?CvGULzZl1(xE#^MKT zNk@Y)hItf%L{5w0-_U;AZMPX#r@u!l%|*DVD1c`Bnn2PrE}J{lMshscV29j7u)ZRL zm6ng-LxKcWEDb=*bB9smsV|ByUxJCAlc8NToa5U5VvGCa~219PM! z=pU1FxS~x3ZyW6=YD^fMz-h*}ruWdQfL?Y?gX^ETZNbjOSa|6n#!er*P9v7;Gg)ql z@K!b+nhqZ!%TE+RK)g7Hx84W;N7C3B8%Oh(ucAMny(U|xMUZC?vT)rtN_BWFC{#3n z;-(ihQx|gijie^jO|-@iM^ji_UIw$GDLLXFhXG6Kao5%^n7k+r%px{{gTy~tx?KR} z*Za~+?)UX=sSVCfUIF9l0_lQ7rNmD^0PY^lGg4N11cHvg@b^zXsC_PrrzUpOwQI}i z$2^wR$O|E-Ip&g{6T!8oDX8D6ATPFi)60kRndN&8FY)OmLtYukIAF3LUuUU^cy zwTmTjt3N*~9*)5jJ868hWr%e6)UvIY3qexD3@;y6peZ&oC~w5^CHC=%eI`Gy*(hlI zzw=S{rg>4w+Q?4&MmU_@C2;i@woiNyjEm9xwBc?H!^+9 zoaAmTBQ9l%mA}#jE8QDnaDdC$90?vFiG`oY)U!L_wOlmHyIaAvSDsWPU708UF#uFz zC8$P9ASqvF#bzJ;&b9`gguL77+)mw=&KS8*ycQmU|8#D`_ixGn4<~Dw<6w-TZ`-U zCqmASpG5HfJXrBto@6Y#N(PNSV;|Q;e8s;E@vFS)H~wy1^Gg%2%#2|VEOrFxu4r0p z9EnWNc@)%2q~lz+X*jQs75q5?xAgfE^_s7AiG@AB6o>%6HOD2+^agd~n>b~jF^D|h zhB__ADE)IT%>KWVA@L+l?2QIN6Mf98;kujFqjY4+MtZAmC%7AqkeeJ6ZNrxknw71= z@8xnB>(T;oxc@Zm@k_(vs~6z)sx|Z+*P}0aqJ?8!%|yX<12ba1o0xOE?YEJ|)afiA zqb^GFAAQ~kp{6m^d4m8tEcnI#QhQ0p|2DxP%Q5=BIvR2Q33hONJL;EdJa2mS#8FQW;OWKi1X-w8Ibz8yluku&XSzn_tBT@n#l&oRT z$Y0tt)Py(ca@j}m>J>?w&rz=%d*RKu4yI<#O{$QjSou>wi|Eb?=gtijzoa!mti=_q zxo=MR_oid;@pvu=qYfp}LFC)Odiw8;9()*mOo~sgBB?i!G0@0hMr?YhoK*~*)Sr$f z|81p;j-yNrn@3;Pl^O;&idO~>mD1b?+wj@bNtNjiQy{l;jGWj%&Xj7sC$9Or96vdR z*s7f;+k5L_$v4E#=sL1I@dG`=aedvel1PjBFf&Kh$;S9hEFmYzfaGO%-lj&j>h)Iy+RvvGebFZB@+5|=Kl_Z$YR@Np#YlAD6^qZEZctwjUFw^? ztYXbd8|>wr)#F9xnD{*p#r(U;<2~7+Sbq{tl$B9P?raxy*U>}Y4avo;Cn3pf0+Q0Fp!jJTlz)t5#7;60 z)Y43UF8M-m@;lAlyt{R;IgUZtLe;%;Uwh69QxDoDAl}P1`>|ubj z$L@UavQQ=~HFT);69WH?|IqxR6*$ZDI@BDt=J8@zvr|P|h}85R5)q$9&&E5jo{Q5^ zDd#b(HRmU3;hf4l)OT}?hZ$tarHRz2o9i|ua_o|n*{qvsH1wSa<@OortYE@5(EfC$ z9B#iMhLR8I@Yof2WGf2!lAF*X?K><-~>*7Bkdtm&x&2iZ)x(`tBLmh4Heqqm1RAMyj9&P& z1TS{=aTy62zMYjc3DQhIh469KKwl@^(3deJ@~Tk2}M%&Pcd>g2K1^8_}=zI1TV_p&v&qaKHZq&RO-I zHa%6r#9kxRI(34*?0T5IJlDiT_+6$sT;KM!+9|YasUVMXSHb2pi$ElZyH7{Rpk+-a z{8}rF3w-j&lc_N1aXhNn<$43>?5V9(GkCj7@dJacXt@-B0p znPWcWfzmD_Gh7SNo|94SV^4+I218hr%N3OIN(nAN zkY0;3Wp~pc{yiFUo2ALS%JAk`Ka-r1g~^ZNG4=W_5Qquj<>^M^sGBkr>nl)Kg%ymF zMik1fEunAkgy70}AqQ-cD_#J<0{n3JFl*`aGtj$qX#E zh#_yM9l6A1a6A$_K)s}wmH5Jv-Dw-Jbz2XPC#7I}gDLvZAo_EEIJHqb!+dt+fz@Fd zh)(2ke3MuRUhV-a8CNdXR7SK%C9vJ$JN8DGEBQLgCybgDsntJanCzYm-g}%t{Bb%wA2|+Xt&LQB z|68(;J0B}fiX%?XilOg?1`7SXN85v}-7bpu|X1w?RD1$IdsLC5Qxao^G|as3F#?y0L4}>@WHN?x=W3p`r>-F~! zcJm(MW8Zf)^^*;DEeOJnXaC6YJI_d-^-{1k9w+xVOM!oeIP4PiB~2>j<$R@3WS0)p z&xTjPW(z=OKq#@DeF9G@XTcYdo3ul_nVsk7PF2jG(~QGW*jJO!Sn5oJ>dipSzC9)> z&&P?ziz)m|X#=!fdlmdmipTke9NWjBg#748Bt_yXM5uQaSbDvph1(y(y5R{p<`4o? zI8LZl%5(B>JP>qB3t`{grF8rLJ9KDaI^xuguq>dIhzY-?4`f>y)vrm6&{;2(UG#^3 ztQE(BBpqyCstsYTG4SbL9mJ)@q1<;xI4ze(_skdJN0>HXlHDub3dvKjW+e}yAd%d7 z9zsPShgm%%6U&zUrbXlB^!tud`g-qKcrosaM~o}EGuB+F?(jv?E$fKGdO|XS_QD^j z)rP&Z4dLSV1dda@1KyaO<#J03pt1Bid^}ag)+&~xVc$X8_*tBYBNEjxcZAEu49BxwA8w+Pxd97Y5W0BZ|;-hFZFPd zx-5O#e~$?M*8;=e6CpG%oBYt2&v#jE#v~+pz#=(A(mT2s(zj}n?BX+|a`h)t5jT%+ zkvj#g9x0%yr3doT%J|h>3hTdJrdbuTAn?Kt+CHj)m;OR*l~iZU=bOUBIZ;&d)?OH6 zWchNoAE{|_F3#OeaIUg0v_1wDU9+D~I_QY&2IIJFX$`qB`5v=ONgWqH@8zAVpM@}T ziXQq20TXfhJ5l`re-aNcECm+AQ z%O-Na%E;UVZ?4b!9ash5ifyM%FhElX5^A@Cr>Pi84-7(2xsMf}BevnOJatG}HAFVO z&VxTk6UgDH8dA623?tr6!Z~4LI7Ryam0z7l>l6E7Rn)5sE#_p5gUV z((uMVj9sJ`#$@w{sfuU}T&?tA;{7*+uJA@!+hK{{xT=(XhXI@zh{uONa+sWCA$+2% z4Ug|krN-HBuzYO>@e7e8`|tDd#kEMZbSS5FYodUED;$EH79)T9IyT2zmRUYIjC(hq zM{eCUXC_J7LU(X9`i7~&JOw4P*in}I&OTtmy+*G4wvkG#aKS8&SCCP?90n8ON$<=# zu%K!>Za-8EaqrB)F2ospc{)Vik(-Bj=AiQZj&=7Z&KMQnwZXYPzNg3A7tk~n+Trlb>a|u3ID`#jM>=>a7a7=Qg6yt9@=YPA^0_t?Vs_9 z37k-i9~W7b)0rEgvUnmN)iGaX!~?#3Sn;$rIT{4Q&^p<)iaBeV!`JojnIbXD_1zN^w+U?E~`k?;EUI zNokitBH3r<4a$K}n1u9&5Y(DTKa4h`w((-z(|HE+&vfG@jUu|GW+J4T8<3kWL9~1O zQBv6Q3;zAA0qJ-@t2)Bz zzBO%VIQt1KGN^)~gi3V1p@`EqCBXEDzv0_+9vQDUp@j;nC?(c{Eh78yx2p<}pXuDp z&IjdI3gXmnO?1=ZAN0TsN8}}kvxk;^MMCY6@4`ifGJ+jtQMH1FV|Ni9g? z(@56+lk|s3Au)26Wj5QNXBUhLVBcC-)cP_V4>u{J{O>DtOm_zU7^_XFR!jhEr#5&hIzSaquV&9K+s(~s5}3a2p9!PZ%*;^TQ6bs;71P%5z_iw#kmR8Y zw+^+E>Z=i?WTzZ>v<%XDp4o7{CfDCFLBHBb5QuWoJKih6N`uwbh}mn zQSRdy35*~Zb1u6~wy(=;gNX2Eh!wjlaoHgOwJ!D1S^)f_>5*>Qu_fk~6@Pe*3A0l@RVo2Pq zP}F;>0l!MkP=81Tl=rWM$4NYNDxUyGs5^OH|f)|EatM2BtP4^5S-L>QDpXX zDiuN)qjxFTDXmC@hvIPO^2^MlM7;{HyQ4vgfP<*?|;y zm~cu8TO_7Hb-g_@_a(UQVjweTO`HAUdcFSb`pi(UrlX*+*WRvg`-HeCL)4)>T0k#P&p&hz0(5ZJG zi#~UwM@u5T`pg}-XXJ6YqhI9x#6J4<`bD^KV>l15Qjq!) z4cK+89Y!o{#qsctKy;D~M2%rxwngC(vpcYgde7U87XMu& z2P3YKD#3k3vdRs!i&vGahPvVPC0VE`r3LCLE75CCFVU@Eg0H{E;@|6unCja^eBXVd zVRR!%4!$Jb1|H0J30pXvyqu9}NI<)ca%%0{LhG`nDidiOriD5|KqJShbejqiBjZ%> zwG+K84y?+<;4+)ASYGFL8=TPGO5~1TreEabk>AaAO~&=XIK~cL@@By%(=c4%eG5Od zF2LY+0~EQq2~-jm;hAY1GjMS#8sAf)wpB*ZqVbV=CcX)sRfcJZ%{rLIvHJW|pA*ry zdgyu~53hT#Bmpb-U{^&lDHMyQRFiXi+`j;0>EFq+X@wjgy`3EFE&=wtyZXOrpZv5iDj*b+{kyTn8}PQ$x{7l^aSee~Wu zKvK-l!=4-O>DwJ)5IiRW=15Ov46`IE?WZ_n$#4w1Zo5LSiZ+ppl96EOSPjz3LJ;mI zMuk34AjcsKp8UN4%RRi=9h~Q4i&zLFsQT0}{enSRj{9EL+#(KTHNR1f|8mIp^e0$f zxRQD_YJoK8eiR+=XRXfeWB>W*;H_Xo`0F$U@;j<9e)}f!qbru`TU(=F=PtbISVwkA z1VO7oIMeOVb@22q;(^eYjGo1Q+LmSkA|so~e(H&S@AGl!=qGyOjS!aZ+sb*4|D)#d zoU3Y=CnME=8iWpp!-JDQpkYBQ$Y1_QhdGaQ?bem(EFO$EV?L6Q2v@pvVHru|@~GN7 z6{)%NDVo>2j^{e{1~%;>D1Prf_1>wEc@uvax;(MK`Lddp%{0;g9#mWt!XIn73F|l|=LmLHt-sH}kXYk*)vmy0M0Z=Gn#)x3_M%2* zOqm0?m`M>Wi(=HUuOdHdKQe}e6;xSR3$*|GVB7v_P&>2^Ka1IegXc6Tq&1Lda~>SN zd&1$I1o)*GO&smF!1n1WbX)f=+t_wQ#$^j0k@`4YPbI=z$}q*ll5lh1K_|>WD9n)O;cxFOM-^ zpZmb$dojj|Osn)L5`n7yzcIF((tDRb{LWfg7dB?4}|N9lJ*NJnyBU zn`K~ZZ3#y2<{b5kp@w$MSxD)0r#$P`?BUQ@cvAWZ9megUwd5uV;GSUu9mRCxn|a_8 zmqh=*yh=*Kl<-^dZmPC&KUPFPCs{3G&`LLe>D}v8$5fQ>_u(8K;5s@H_~Qy<a*2XBM9sopXoE#8lIHzbj}^>lt*a zU4+;DGO5LEan!pUT4D4s2+fY2g+9si`28IK}d4K)?j|=7HUwQh8kQx z`lxvvM9+B0s721)3MX{Ir02*02fK~=&JT`IO?3u+9;^qLK9?x9OMe-o{kX>_{cA-s}X$K>qK#8Xoq z(Cj}6OaXJ4G&Ps91!D1_@IeapDY~JLLinr1;(^ zW>|sC9}V4PTopMtYUo=WGYDgD`v)2vJG~2xk|gnga4?+9oq?ay9+UIGB4Ej}C>k4M z5ATcClMVA1LRI8fa^+n&D<(C0EO8a5ee)%AGhJw6qz@w!b`pwJrKxYP9fmL0 z#7ql5`Ggc_{Ih~yr5)5b=m9yap$E>#|IzV)0xXG($BDVJ@L2yNoA7*)^!)orW~H4% zrBNwdc6~ma;-0;=+YeLzX;o++xCZAp9K%_Moyfn{i{UYs{ZU{44y+O{f`W(vc88AA z#Z#uiCnHm|uh+n-=C!m`MIQ@wms8V?VsNdz1byH8p@GF~5~HvT7J1vE$onGnyYYv_ z$|QklKq52p#lE5}`4&0yL<0+S#F?0wPmttLLi0Z7Fr@7iER4MkD*4Nyi8m86TPA=J zzNR&Kk7)3`RIsw@VsCAB#!cPpaj#el=nl%`Gk0AWlL=>MKB!>CXRG4tlPB?`6PMdH zJ%R66OhTMcL!-H5P9ARWkyrzcU%e*v4BTbFT*>N zM~GeaDO&hx1*@B}9xfD|fPqnex>`Pz%SG9dv-7>_Pxm2wSQHBiskQXtv050N|AX5h z1cOg)GQ{2!qE_~k=!}&u@VM?GhD0@>l6ntmi{1kci>A=+ngPW3f+Sz-h&7piE{)a& z?}F-@5SrH6K+hf9jYsQaz)(@9Lc-1y_LWMZv)V8yib#RVJwN&*?`D6U5ZL4J0=!gs9!h7INQQ80N{(1wp5`@SnmyVpBU8 zS}~s#x2y%Rx#}QxJ|49-*Mj5>FX|n=4o{>l0{Kc!8hcTlKeD6| zCBK^Rr89J(E0^ob@ZDjaNGv1i<^wUAnK1QFDtv#q41M-^l4gZ*lCmh5*%rM3CtkY* z39AU~{DbmH==0f{Lx|ReHA9ojM09W1p=+ zrO@CFHgJtG)g4!7F3&no8}b^lInxK#_f(_pnIklG{!^;ya+_$aY$L_ooUZxoD2iTd zVz(Yg@9ALBF7;pdn1(hC;W5D>Y9QZGM3El0{c-LK%?)z$s3$H0v#=5>E zPx1p1Q=G8*$U8>IARGPswQ)_eI59eV9vcRd;L{~{YM^_WxtlSc41UzX+Sq@*mnSs2 z9FsOI(6|l;-~UqC@~xPfUq^$D1F(3RB5qGHU{Yh((ap8tT*s`HjBdV1RaP31gQJFrtqQL3YI7$g|?5@+9yn%EIlQb#$9<6z&aCM6J{La6DiJO01|Ut(8rHJpOuk zP$~zKM{dC9vLJ{^<(z#>a*6o68PurJ9?o5oqxt?e_^IR$IX2t}5&A)}c&QWIu{lI# z8cN9>fqq7EQX|po zCy4Z^?w}X17vixkwy4yxk6Pse;N|K3aFb3PJiOL$O0xpq?mYHC6pC{U zhu~L_$<}I)#V}t5E`1lnJr~;HzVQXRI#LIl>>F9NEtBAK`Wf(A^M$sg*kIVDS#+Ji zDRT5}E*7=db0{(|{1LK@=%)1IZsc#-`{t}C?iu1Vncp_Mq1~WdFMVY*ewN&?n zB}UytB4J|;sYkYhn%8qIIT%28MC)TTH`5eTZ-6hmj9_%hGT{GuL4U0~%{kcKL+fGz z*3v1J$n~4j7c-8~6R#y;qof~Pc@PWvIqxAOtdD%WrAIbBF~mY6gcZAW;O;Y|4IYiu z$LSFUS^1FU6gBKK+s`as&!=l2p2x>4H1Jx62xBDo*{~@t4%{0&~O1RnI+=o|LAeY&2Dc9 zLPzTY;ysVYYC10D<_E>-9CQM+QV+uiy*=~_$D%RymBWB1=IFH|2wy&ZPF5C4L$`e_ z`Mqurq3u4{I8_%^dWCVIJ`jktE9||lNmb|aNdM|$vNyFJ<8mIs0q=EmhRhrK?ezl` zHqaq@Z_m--v=1~hp$>Mwu){8+M>OomHKN0HME_Rx6U!9}&^yZ#FI|WsO`HFtbF)|B zjuoo>O`P9VQMj_=W6f2(ZD|d9M!Ga9BnZ7^`gmE(1VGIgV3#Eyx?d@w^P_6OrfFoE zUpd+Ia*(>d4u)JJ2f5dNu$~r?#Hyy5_^gm8p7ntkb;=*C_vnMV^K3kK^)A?|UO~q( zOB@J~A!71M(Dho0#@`Pihnxan*`ZRX`a2c%F3g5oiqA>Z)GXc&j|DVD+!~*R+vC08 z4b;_Sgv4{M+sRu5VMEjv6bp`{VIFyOuBIAHg|#{MuJ zVwSi^;>CfPWFc8fHuD$2u1za&;``rt*=iZo`&@!MZv|kd;Sh=0UQQKyrt$Z4-S5OM zEml!mhTr))iz?4l;Jlcfyd&D{$=TvWE_&6UndK8gqJAFWDXA!;;Sj_dT{K5ZzF_n)> zLQ8`Kq#%A1bUL48lR-MV)qAA zl6EK=c1+dOXC-<3ppU$L8V)iaP7zzKH{@8~O;6JZ zR^V40&A4_4#VanO+4DwhZ#sqb=YsL)Jx5GvYC+dWL-c+@L;0s&e<37E47RxnV%u(A zQptHnTOMsDQ%@{LGCiNUeqlQrE{TBp%c8KRAsDqYK2yiS%McT|fckkvVL#WN+#P9( zeWGO`JRd6>_NqeF!)RX9)@(SGevmw$)JuDG`iRQeH7H%X3e1k}f`aymWT%}xSTEJ5 z!iJrgQ1pf#s1IR|_ov{xm&V*aA_6R#Z^URh=QUT(=gxY16|EV8u(A3&`8wByY#bD$ zZadVdd$lz*1)Rdj<*ig7-!N0=HPAihbEwBOA+S8&Nb_HugEb)oG-||-kjAC7K2Ct# z&)~G9*9vHpL6*F5nKYRA#SaEUs&V}h8CK)j2yBZg{aeoX5wVHVHtX^I0WAQQrKZR2?93wq4d9baIme4=(g(bju1QybxA{;m<~icaJk>t8vV< zXVr9}b{ZClEn;{5XMklN%izrdN8bC>SzHf6pZ$8;kG*l;pB5~2hJ@V(_{zc`=zT>h z7bJukZ`84H;2!Q-yO5SSgwgg#;o$V70vQoLIp*k$Z9kk~bKMN$(|Q=%rS3961oy!M z&NsLCl{(4_?uBUnYa+2J3hckzfK||YoY7xPXBb=}$J-0Zg=xk_K4qK)uGtEMI<53= zqdV5wB%rSI3F13dj4U~%&HcQDMlP!+mrK%#Fi#CW-+D@)-k1kx1fQcX_y4YSbuKpe z%mmY?H>u-_Y_gK;*a@!qK+5KFPU#C=ro`KX>P^)pc3Q^t`{HJ{Rz4X+g zQ%gr*ayHi{tGw~>zUs{4*7d2ooZY$L@ zdj%?79wx|p4LXGGL7{+i%+b`DBstfMXUSg2?jpQEi=nBlz3>V}>%}e)u8h zE-FN=#6ML9&{@$$ck;Ax;CcXNWhcY+fzz~i@l>3vxUE8H+IsvjeI+EWk0o-t(co%j zj{QTY=!?(a*gF&Q;l$zZWaEMm2pl{HCv7#MJwO@H?3jcyUe}pjO$Xqul@fhi^NK#d zD2?5ctB?$>U`&Y`Zjzq_=CT=d|98OdMjJHC;G8TrS5Y-ciquUQAgItzonK7A%Oj5H zo?b#Mgomh8Z3yI*{UOI&!?|aQGAPcxf#!E)iNt$uKPd0ZM&!F-tk^Sh?XDuEShdkD z2QT4`f;Y5r)-vdknTfq3KS{4DcVVtfhv+(6oRS}nyZ806lQi@VgXjMw%^H&{efGtG z%Y)U-t(lD^*+&4oYJ<_&{vK&?i>1Mf1c2d~Xv$F^$bX58U|>r?#iPb$Fu9n^&W)c0 zzpr~~V3j%y8wHVT$&;~rivgr_9w~22B*y#7ursWJ#)y3-{J24SpG2TvcM@z6_{F5$ z)xqtmsjw}imELk&LcE0CNUT)?1{PEk`$<8xT5$n&m3sigQmG_#jWljkcf$N9ZD<@_ z1+Sum!Avrq9o{&BzvD$TTAc4A^M?--lZ{tVIXRqMHJ*d8b^~Z9Oh>aPl%CE>!j7N_ z-k5U*eEHBuc4)ORK2o#5i}Pi<55Fa1H%`;T`Ex*F<`S?JcEhL3f78Xu%W?J#M2#Ee z)O(Q`WS0lxUE9_0YxDtBeK`iEf1~lT%0Y6arx5>|5RQ$%2F-XW9M^d%`TE?7W?mU4 z0T;&DdLIc~GI=)mw6v2$znfswBUQM)Ba~=vbATvaAotgCzQx0XWd3A(;_au3|7=~! zrL~@Pcg;ImvRN9#zOBTiqjykOD3Z3e-ocA3m*d~Nmel3k2Gtz{%w4ZsniF4(Gp;6* z$80KM)FVicDq>O#>X?plS)ARTNPpR6QrX@AQJz8@Dhl4gKU^N+spnBTqnvwJc79DC zy$qv~Kleb&yx$BOo+1l;>``ClCj0bcI11+d#@peGFlrzY65O+4y4Pa7`rmqxO1(e| zG|pqT=E91}n*}P>%z5lqE^qoxLI;gHGht_64Ruu!hilm)aCNm2I=lGc-XI}}TzZM! z7#j^`o6mt*0_QH`FQyWi47sa+ml!=gfl8~TU{jGgnIc?BHyQ-v-UzkI4zqqD_TwLO zTGI+wcHX2#*O!5p>_n(}zZ^!6h+~v>BHht_8oIdM;V{R*oPF>LsS%$DCpOPPuQ3bQ z9>@8{CvHc#ye@WqPCSgcG1R;K3mGX?0i#P^aPA^^ma=Lhh7E$CYHfj@hbtlTcn~N( zRHx78HpA!jTxWLCHaa=G26i9H#L4lh-1$|U$j)@Zz+p?6HKqg~hI;VRyht)BkmH0z zET$(?#j$cI1AA1f=%=4Xbbq-4o8?zYLsq^b*XOE0v}h)q+sfsiX1JDpx@wDiB5k4F zzK+p8z5+d_M1b|Br=9cRA7D3r8e@uwKvL&27 zF2ONa3kZ(gn2q+*QH;-eQmH!MiHZNz1e5h7VC2R%qA_$GqkZRq?fZ%Gi3 zO(S7JmzknNr`QWdqMR4vF0(zjdQzsK1FVFhT5{=#T>tKdf+E=REl(MDB^eOsADi?p|)$;}ah=S6VB=C$B_ zREMbj;G9VHmh|YSlQhp(8h?(j1*fo2v?ywvZd*MM+GM%&uxbWwoG%55=cCYet1On6 z%*2AC0pk5^7wpu^!#le3$o4d@x5dk$dJ+m4x^gBbRiVoP{8EnT9U+qTQJQJ zft%#=^S7#UduJWAdfCoyT--tA)8#5OLY&~mTwB_6V+Cs`YeQOY6|vn(=ivCTJLJTe zQX!KmxMl^%`__rWue>A(;oPSWp6d|aHZM@96XW)^LR4&`DEX(=3Y(^?5u-O=kZpIw zFwwFL6~7^v#K+RqGlG>hN(s2=zaBCrHJ?@EcI*ecA5uK2P4DcSM>hCm;pu8sbU#*r zEqcx%I=_cVXDvr*4-@8#=2MIj6~Gk-)UmU@k6o0VL_1Av!S3k9%II7ft_=2z)+|_u zP7CGX_NgK)w+P0g52y3bcy_SU0-wQ7;XjP!F{Ywo^$|EEx*gkFr+`B2Pu|5X3z;po z7Vuu^5a;eoV5bCf&WprIZs#5h)#-WY7M)2;mETisqkPtF<}q4$qmQoc--{z*zF6rj zz?%00+QsT%kxM4A@a&}rjfPRk#-IGYEsdX?OOY3F397qJ;kzA)FzM-9I=_d4rkgr$ z7)WFuS^i}ECeDZL#usrsI2#O7y6|LIJP4@+1Ps5YkFp2p%Ssh|<362^*96g?yP^2( zjXm_O5N8$t>N3+Z8>qjjFv#qcg(dF>sh4m)_1T||*`Wlse?5k^x_#(GK10%?IQmRC zfc+b@67B|`gSrSVD|oU5bT{k+E9n!oVFuUB3bO^V)&OF*KZZJ#?t;0qEXcB7qjbgH zNM_akW|R(LIChaMx>O!#w_d+X?_AtWQeXZ?U;lLYx%vP&Nqb?^u2m4Z+7s&%Et!i4 zL}{gdI#cVrnUvqDB8jarvM&(?FS&)x_0+d3y~5}iimIVX0|S%J#&SF-3F zxD75vm5`VIi5wG8&@g4m9{8bspPVjV3hp&+*y!s9@{a`I_wqS-JHrv*rRPGp=`m0x zsn~H~2Ci;UV~bsN>FnR>#Bb(mlDvC}cx*U= zYI=uAmG&CkaxJgF}&=i|~6eh8^P5@%!0iT|^ir=pDpTK@YsIDg)y7=1As7!9*2( z_PB`~PZzHU&KT6ALSn|r2QUP-rGWkt6y|+CIM-|^tq4U@1jV*8=@%}E|61CWbxS82Kq&CI)A@N0r7FxA!A)!2d~GO^jup@!v_s3 z+fV+bHc3(_kst=SGv)BdXO5OIa z7-nP(yN)!_l+|*Kq{}SQbXgR)(S11n_zoD(?8dAm->6AV9ZyC$ipJHXF>i#0!N0kP zm?%p?yv+z*y*&{oq!p1VXJOYcZzM)dRGF)eI7M6Z_N-h-drMHZc)Lzqv$IgRf z#oCEj`8k7rv0|a6H*BE^Ju3}A>G4moO5Wk)X#qWPER1EI|Dm*Wm*1pN73itj| zOq0e4!}FM|5eieqCW3TvIU0GaC0}o3vwsd4(ClwsAX2LVb3PxXg`(TZ7Lo+>##hj( zi^A!58iQ2}1S?NI)I^)7S!|Zh5lqW}SYa;O%oK#gFgI>!qk@?<2DQz{%w}!wUXuWX zJ;%%3?T(rz?BDt5@N-*>^1MQCWhBTbdSFVuB`#H717%??;J+c7CY<}g z9N(*i@t-|#k;Mp!-5Ne!)ru9@2 z8DH<$X5I+=BhCpm`0SM^d6>Hhe|}7+(NdS#q3x6S3^+5F+;_pJTg4>D^gcWF%wf`Y z)s9{fJOcWHRZ!+|g8ui)A9nbOV6}TU`I>N;`Pjaa-IEwapR79$58Gx{DjkgkkV``0 z@_G31R1|r-RfMnGr$SDY*HfV{AuytwK}v2f!{$rPaR0_$_T~)3R&zOy^Q=JQ4A6>LO5QtNCTkn#((b}!`g-&} zg3A$_2_x)mu48q}>ml7}pH3RqJ%gdGiO?C7Kwrqmk^b*Fcuu33s74kN$Ni&>_255J zUzI`vC3(!^m2u#t6GW$f7$s_pUX%W&h0NwSJ*uE3g^Bv9cuPhZe9Sti`<-Kud&3P% zOkU%;%e%pBs~w#C5KOHX%!4tTc8CazBMLcQ)PJ%cX|u}%fr^jRlbb_11}rDnThbs^ zHI6LY-9cUqP2#Uqe9Ro2>y2_zEJ<%TM^CRMY~2?I{?l`T?rbl*)^#o{8(~;+b(Ule z*TB!7zwC0C80we!nzYaFNYV|*B1MftNU zb16zThSIItA=H6Rs7$x1VYL0cu`^~pHN2h*HP_yO{G8dOV(|ewbM0qFEaN;XEcOO# zD|P&Q*B?am*TB=v2D~{^O8(t_KwhcVpikXoh}C{H)p@^zfSk%ZDXMsj?($?$ZJT-*Y7X zM>g{}c{jew>jhCRC%$@o7FgPKf=^f=*>-OM*>z|l49tE^GhFY2!ukVf^Wriw2%Lp# zvFbW=Jp!)C;=`%E>ksMP&v#kRk&1LcY6mIL#IUU^kx%tItF<$+#7t?&5 z$do_94Es!s9LVdZ6D%vh)7iD+ky{|Kb4?-A)p?M9{~8|tO;EdY75cx`M17klq+4YJ zJ#M`R3R|>j(pEk4EKZi1JPm{Y8k)(S-xtV=c6BiNvI#ODh{5+64j9XJ@zQ!1(jQwg zsEu4d6{(#_qoO${vf*zs^mhU72r^-F+jT(JD3|xGDUif?ua^#v%U)9j-)yGY~?$8h1-3uS|^OVmJ6biQ%1$9 zgL|>MBMKxm>siam^XX@q?NGFJ5ca=OMs1UPyivRc>K0p*113Re>313%vPVg`Nf7O_ zX=9$PQpey~p`?F%8u912o^_rckWwHCZx>47ACY0Y`^*)(_VPk_`ag=!J1(d9jpL=E zp}lA+6+%ghJm&U~B2`d(+t#Tbsin_?QxCrh8z1(hqvu@h9^y zO#~;d+DiHkjDwJw3~JSIOs22DSp7}uWW(i9y!TR!|G=F>=cA{vbo(ysxLpm=m5yNl zrk^TvEQK(y{or#=f`7hc9tOAc(32`V!ShT5;J{gS8}}ai{d^6sG(C;|!Q=QMMrw3n zzbOCsc^+eSsD&oIaU+MnGpJM%0}a<^(vO`f?1AI6q4m~Z_Fe87xKO$b*E?Jyjl-o> z@A^%gb@C|wdISPB|92#VDJG&xQuLSIY4G-MB(pNcNb258kd*5}Gtb45U*}Z?u3^n2 zx2B9I^K};U{e2hx?$wDC%Y7l;O&4;k_A`9h)1c-%UNFB@TyQZa4|yHlKqm3<*vxgL z|BWbd^DO|as(La{Ig19Avt)%*D5JYagm>2=098x4&Zh2#`E6ASI2LvjZx!x?q=gq4 zgP{_JeR=_3eOU$(>PBpolMK#E8m7fzoYNs<2*$4R@zJm~*y)_25gPvV*f5`CLCbOP z{yh9McMDD{KTK}TO#=mutq`xRh?#EVFy&1K4DVBbMbb*(cKAJ6DfOJ5tQ(<%_!nem zv@K2;P{%=CIVzbD0m+W~&~`zG6u9Ok*m zlaC*45zl*Mk&whx%rQ8H$1jSZxg%d!-GD2kw(g%Nfl1W2u-`dD!N0%<8}rE#T}VDDJWCS3naEJ8WY z??WDudr}AMR*S(St7q)TBwO08s|J$W1=O+C8fFao!Ap*@Gf%+{46jQw{APyzV`G46 z3c0-KIr$K2!#Pm4MbVztT~*_IS7Rxi1cDP`Kt%Z zqnBbzLJXY}90osvwV>pVb=6*RS*#dwB&mb_bVW-c9msItyr1e&?@-0fo-~;$>yFT6 zuZE%gSq|r|&#zKlLvd-XHwFscvlk6Raqg^sdce&KeIml(>DL(g_v$?wZhx41>-}Ok zom!6@=eaC!U5KdCSi&xtd=agp3#gjMH@fxn5^6fogpt}oaIfDE^u4Z=DXU#!Vf;L@ z{z?w3t{IM9?|zW1kH?6~=MZ?_QACICUSeK7*+r8+2cy(nXXtq{1O3hyP%&>k;<3gT zgeH~Y-K!56shW6twdFE~?JuW>YPIB(og^&M568F06TmVj9Bu3tz{FG$8rSR1Owql8 z-4zV{ZVRF%CObfG%ONm|{sh~<$->vBHQ>c@tCNW~Zk`znaw^GaKR*+C?##rD^VR73 z*oiSYwt>j}L0GV<9#_@1<0hK}aO8^^1eR-J)tfYUJ#jxb!%#z2k6GBhSO6Z^Q|U*? z<4~&Yj)K-3w6gdb30bvO68>g8~G7{`A88ejWx=a51vm47=XYw}|gwd8`9q?E98`Tq0 z1Eq6kv8ca_;udpao^*yh$WGu`g{CCpQw=6Ho1$Qxtl;fG4czW8pczf)P`$9382!k@ zsycD@Z9Jd%;M+Cu(e-Cq|JKr^p*oOxz6BCfE;Ahu44GGFwvbm%b+nm(1@52nz`tV_ z;2l2$A}aeBlf|>ETsobpfoU|EJo1BT$Tq;u<^(d)?ibmo8wWaDX2a6EK(A-pLeIYp zQgLY?nrcnK)le+Za$1-^LSu3yqL(XEoOFn~f^ zvl5FNw5YX342m8rW2Qe&CJyCah{*fNxGTCGXk;Sq!r@4$Zkplo@Q+#Ht02WHDrJo+f+zVyRT4>dvf#ruq6haCBpQip@lR_N(72(Jqhp=8D` zI{C{4zQ*0#m7kAq#_=^8AYKxK$~%m4tExBz{4k;IcPMoj;^CDOQ9R?>VbEx)jx}d1 zV9Bo>W^=g<$J>|=`O|IS(RwX>EbPPTrN>~?kzT6vYY&;-Sil(W%!7&F^oZ9+d6e=N z!P{bHbe+2;J}c2DOMA?4-X&E~m2$(#$P3*3=rVnKKpn1i0vtQFpEQgaq15cZ)Mnls zER-K0cXJIfZHYa2g{>y5$VPJT+aHX4^bY-BX;RnQQgB`=k~+m3(9R`-s>@gEh|C>- zV%o#awZbVJo3#J~jKlElRy`d5`6}6eY8%SWI{@-c`pCDgBdYxKWOyVFH>D)t=O5Kn zQe_<7rqfE~g2M6frU3eN*C6#y>?3K07sxC%XL?pXg0z(dq8xrA9Wx_wg{YdKYVsLq zakhdE{x^>Q#p3kFkF46%5-{DTjJDNVVPxJacsH??J;#fo>a(|k_P-vw*=>yaIbEjh zkcy>2#I?mw$+oX~C?shHuQRmqZqGzwR(rGRyle;>#2jHOJUltSZ7b2(UXAT7 z8{zs$93-XwfJa{A@LOCpULAXcmCFxdVxtR)1sP+gkp`%C4bl6LB+zP}1*Tg>pqPm} z_B5-&7}-_z)X5mvYx^MEqbcxC^uYE3IsSK!kN7}86{8GIK}10u8;94z=u1~z)1ik# z^76Pf=@Z`bK8^gSXi}=1OPRe7@UGdHOMUKQje)*0z#?50k*j-U$4U z1`_`c2Q>Tri)n}&g~iD`$rpQPCdmIDaew)Ze)HLZTid*u{VK({$|jyn4Qzm_aUt}^ zW=}XZ!p#fo<dj>j9tuCD-R{10uyh_yQESIK)j6d4&2DyMbR61m zSqQnD_i5~_BwW-CqwZfdG3;3rKIm!%g;k0I_sgQJZpVI(+Z96{;@6|f!A2rvV*&Al z)fnJXh--ys19TRXWvm%IEp!H-?f+qY{R*_SyR|_2rv>?vc8J{P&Pz4n57_yYwfNCE z6K6FlV9}BmVk2m0Jr9Q=7p(!VWdI}1evp;0j#Yo71BG_^q*L(}jOm9nUzSJXgu4eo z`{WAHeN_&7Rci32d{Culwk!S$Py*F-Nx_Ese^?n08)mbs5L~&u9TF3z`T3VdiN5sW zD(wSPX-JPH*)1OpXMJbEB6oZEH{~*qjvN=K=pBXu9bBJssRmz#^N3y=Y{tm1f2hE3j5v)gz|lB8Q0jXKiPi;l z@pMXBGrZxqgfaaz?F&7*`8p)LX~MOCMFo$ibrK0hAJ|ti!shR2#r}71s#c9H!WVBs z$yI|y@@AO=@Ee!m257}gvRe2^0D0S8nDQ z{mvigLibAUIkkHJ(yDOsWh$3-E0)ETf3wg%&Ii{@3&XQ1O+^ytFm$@|HjZBt;2&=5pQn}elUIoAVzNXwp0 z#rIf4JUMo3-m>D){E zJFmm%p$=+ZVSuZRJ`-~~5w6)K!porbScs+|TF1l7GoDa`f|JG!w!IBA_U(#i8MKu`u()~u!yt}SfC*134-QUnfNRmF5g zD_ppfyIdAA7{*%N~bsMA!{`L(J96%nDpN-a=3gxhW(z6&vH)S zXU|4Z?Rm&7KOcnq=~eu}+eETv&WCZ<*|1xB6*8V0lvkjGCeJ?6o_I0AxGCJeff47Q zT5k+dW>M&}{UB3Nu@<&0GUq^cndIr)J>Ynh`_2Y-k*N8hu=|-T`TlfK<&7>8Tr;2sVYqs;}VNhGLgm&NHX4UBo?Yb*Wr;TM}P4ZJ#H}fdFe*Zt#M`$BE zR9#HFpNt3nX+MbMJ`D`W+K75)@$}CcB`^pmhWLdg;LpDgM|`&7<6;vc#dXw@S8e99 z!jI^L+9>b}kEZ66|Imp~L?JY$1Fl$QK^yBtwK~qigdd$$>7*PO|B@po6tBVD$^@M5 z77TKmSE7-d6%1|q!gBip4C&uNm0x`zZk0t)Ry$Q7oHU7)40YkDThf$%d`&`wqCoMq z9?hC?4n2LhVbhgS^0OcjM_m}aEjq+bbUwPkpu}bdpbLQC^ zL*(<$V!!H93^@D;`a3mX;3emM*;Gy5g{%k9k7vuCHDuw2pE~LA-Ge*6qA^a5G3%0(asI+t! zy8kTa`Vn~;mfy(Cv$BGVwT?J3tCz^lF2(#GuAnM?4|@ZypxTE(2#9<`3}oC<*h?JV zPUxgpSBc=9qvd2`g9J=ksR+@2GJ;#{rl6`*G^Ut-Vx~)v2S@wyxXajubK9MU_p7ck zUh-CCdx0jH`c5IDtOR@3BM$C~6_MDvx_J8JQnKTaJL6~)#m>_@O%>|31fJ6WhzYmr zYTXlzhx!)ME#YhNbGI<_-bhJceyoPIhh(tYcovkOionO=2`Hhdgla|?@$Zl#CeIBb z!(+NQ_t`LU-tI=0ewPIKcz+NKJK={7pJ>9jKO`~K3{7hCn zDqCav1JD4kitekU1iSX0bCM*D3ZDkTHI`st`lC-oNufO@epSuWX4B$j4@ zNS`!Zo0tf(&4uh=H3MK4Uxd=r^Qq7LWU6SimwN^-fwR&NS*f^GSdeFi`M0`Z({pz? zKd*xMEx1E39#A7cM0SH2grHT!WN=AtCZCSW5Zwz?Y1q(C__fj+67H*z4|U3Tr#_I( zJE0Bo!rv-yG@+K08Tk)xWa`TuLlWbZ!2DXIvy3xW3kmG0@YKt!ITkcLH+XH$o*DzBNLtwl+NGvh!O*Vlhb1l_-~7VSeszMyvND7PcP< zjMF!ToAF67yfz#iZ?zEn*`{pFh7h{__%w7`=R|iqAH=ZP&*-+BBA{=7fJU5dq+OBS zNY1IVN4jIs%%}q|N8Uue&1;B_ggoD9x)p7fH^Aw(>CBqPWt=~zgxlR+rA=4-NqM3& z?v*-6&zTP2npNr#i|0;8_eCGTgPZ_~rXVg$RL$OZ@M3qbSI6eST*x2ii!X|GVWa9l zI%DTbh!LsdB~(p?JKmm<`Kk3w2^w5R$#QtX7DfOoVN+@*{kPHkUNu;*p3DJ zm?_B~oa-}|PT)LNVfVJcgpmy--+eFDeZ$A=7p{@j9&4em`64a9UBm2bJOFKT7n2#0 z@7O1ss>qIzWpHvwHkPM1vzNU~G1#b-F*{&Jhx)DQxsRdL&2BboK_=bZzZZH1)1k`b zGf(L25Bhd_AuPLZ4}rG3!7XPuOjoocKO-gijn96Q2ag%zTC0Qe=bj{c_S?Z&PY1bY zSWI%~_d;8&JzQB@fJG^%Kvis%nQNiOKYhM~)&<(2b(9z*9bJoQyLi-fdOluq5QEpt zr7>J21g?K%@ho!;M*II`x(%iAi>L!!`o4v}?H3}QkG5i8fHMscT7b37mDycIJ0Vcb zjE4Divel-Xd+D1uUVmQ(b<$kFY~%){KJdhQB#4gAyonFTb>W8&7T=#vAYaZ`)9SNU zVAD5N_2D5OB{7Z^d@Dy;?aiRLXg_JIZ-xJP~3teJqEZq*aLeOULu*|5`2lpqiDNE0p2Zm&D`cVFfJ*7s!CQV z3mD!#BF5L|xLF&>jqY&NJhA}qT0VzGP2Wh+Uu7DELe}?j##$RHRVvJyu8F1-kITRV=~e97^qDltsfax8=_IC$*Tep$ z*;VSFCCG`cUo?j621NF>kYy^WXc1pi`KQ4N*JVY+BaXYcq+lk!khvHC`0b%_f8@#D z&{#0AZRQ!xF#+Wtd)Os!J#qgxYmnScP&dU7eYuRC-eMnGeStft5A+dzEpgZws|D}P zKGV}Pl5y3A6PO+Li8li*$yPQ4Pgc)^p9*QveWPis6u#o5$EzXVg2UZqI$t95Zx$Bo;VkgMT=voO+^>`PJS+EJ}HDX%?F}^SkTiCCSz?#j zRFJVOqG58UiPNh#4A`^{{GB4*6Lru3BR?o$O{9v1q}1xOG#7mK%pa(!2-cVp}9;`yE3i zoxdb)!D7bzNhpn1o!j53@L?UYr)hxx zq`!HKyTgd?j<4t{s|}8IpGeAiOW4=$N2_XYbH2Zwu-RA~CyynvR*M_B%sl6D5{<;Z za0c|{2iT@8iod~ zr^%eJ({NnL0@6P5FD9o{P_skU=wN3ACq;F@>i7ouDVWbp+-V8k`HN`q+x^^qy@+~; z36tkvqUhh@g%BcmLMm!f(LnH%Sia@_ZNZLJHV+YYWiDY4t!js7POflHgyNhkH~6>q zE3=0;hiFy`@JzyB)k(W z>l*!sQE=a~haS*yv{3wZihcDtow*&og=6d2(&Q=Kq}@bWAfxn(kqLc8KaH}GQS*td z(|ia+V2bb!#hbn;Nv1yf7xNKE!RYCZQYd9aqtjvwQ?+ZSI|yt?ATmJQ@W zh{auME`ACZWI9vfu?ReN@iO_qy@A%6t%MWnD@oS-UUtRBaJaEEkrX-B@czxJBFn85 z;QPl3xJtMLUw_Hv{R;Y5rRO*kM6X$pfb*X*f9(WVerzo)JDkoeUfxYw{_Ud?aX-mq zH&uA^Hklk>;*STD+u`sDZ9+zxQ0TfpchC4h`{rli;pbMcb=@91m5qUAiNeGoxepFp zAFM329ARvm?r`&gO1eDh8a6D7NAK^CiGTG+`a8}9HAT}{k+_Q>KjejvHY~#$3o~4J zQxFYh8nMKCsXmHvSInFwWwQzHU!wKx1p(pgV>w9WZ zD?^IvKJfId?cqD!hC(tS^sV^_Pj{9%?i=)H^OWMCTu6i4o77_4f)+N_)0ZSl7~&20 zRk-wD5d9P~4@Kv?;h4J~{xnplO6LWTy8SVm`STH;x2_?VrtE~M$@);9a{%@vwedD| zE+MI0E{|M11Dc8vw?Y*w82=~-RL+WECyWn(r;lscGg|vlOLn*_Z5s~+ZU#8qTmh@3 zOz?@&4Yo@`70+^9vUdeWOwPC;*lT3MH+QU~gK8S6ayFKFy?Kjizd7d9_tng{iEqljnZh+ zIw?Vh0P$c~P}M@$Wn^g^H_I%Mhd1@cIJn{)-Cp6ujGHctL)xdQW?LQEYTLn{AN0fa z0>Et{zfs{s5z}?{FKn2e&NyoWd1ufJ)(L;2D$6Bp=y=ot7qx3a&%PLJ+xwE4MNcupslrg>4Du~*a9Q>gYMp%4Esd?D#Wj%jW-Mhmm!>Ae~+`1@Zn zNQn?w%*287q%$a4Rtb+%I%iH2=UD@F?k(4JI6V(9bPlJ5@%UE;?89I523s2 zW3ZObVKR?s!q?draIoz>br70CE?M+4UbZJmrSA=JKB0(zo_wH9C%(XAn~gY5Yd(3q zx17BD-OF29(E--)g6ZG{4WfCRO#blc%G~WTjQmU;{5}0QJLQ%vIP`LPnHyYeYA4W5=3g1<-Uyg_ zZIBGzO(Df!oEfpEkM!7SIq(aR#3gHhZ19^6I@1<2v%Bkv?pG`HZuJ3S0k?NOz~wDu z6H(~IY7k6R;i-K{gbg^G%V94hdZ!BTd-H5e@bdwYwa>{b30;`Da~^H{EC-oO8hFEh zWk~GHELQUP8)|NRkZe9^i{m(Nwe76E(71R!&P+3iG__Y{j%B_YXd^a%Az&6$6OP`C#iwc%j@ip2WP=g zQ(O@5luZ^p)G@}Sn7Nqvnhg5Q#ul+0qUARY2RXLTThB1;)GwxMQu=7{fH|XlH5kQQ zr$>r5Jdf4 zf}q>xGkI4`828^55LXq&6zp3DrSY88s$mV0+WL@oxwS%Ee+v0;8pV_+rm)pj84VI= z05Fs5aI&44iPZHXCiv<6zB3vo-|^x7y=J2!!Jq0tcT)M@+bTh$@n-Q8}`f~ zAN|9abvy0w{-->w;J8CQnHv1$u4ph`nnH~vWFWx4hV(X0M}=GCm?qH#*r9x#IxJNd zw00ssSwX8@NV+D&E@o5JY~)F+cTY5QD4V+1~wfP`kL0s$44K z@X%&##POX~r~es)9RCH3X6E4QM*vklo$ULY_V6pC4v6`Cs&QTcgD(eT&xcA~X+|N2%%5enUqc^HYfC`Z#pmSGy$;$Gst&JirqIy~k7(Bd zH5677;){Mc0AKzkG7C%sAbga-y7PumGTsuD`1)9zK}nV7mH=HB~6^iOQ!`a7jmiOVH6_x01>33EYdq@F&w6pF`=uLYt1*1|KpIyAX`52qXP zQRGk`8RgHz)9xZ1lgfjZHX1S=ex1Nq$|nvhxU)HZPgQ3WmWpvRr0_{_ z`@>ZBsB92KdxenKt5?u7J0)<&6Ak`3`4e<;{~pFK`y##6S%8PWABK02KN68hAJU?6 z0*;Mr#%IMEc(g{2`Ta|TrUglY(BJvIhcW`HDwd1+JwBNE-W3k z&~w3=xZY_SDVg2|Ikpo7F+)Fzd};?3`56ZMUrWK}z6sg~N75-XF5!lvc>Lj`&Gl5u z$ehtv^i1F?;$+hUGY(5a<5(^cG#{hy$1g4&agRXvOlzaXN`ZvpBM)Y^slz{k`V}QU&G~2X6jF=zb_KMl^eDC)mFmLNV{4Mr_ zgpKu*fS(hf(b@;yk8u6eJ?Gge#~;wXg8%5LwOsC=_Z2lfcC&v|I38no1Uu5c8ZW<* z5|o%!;~m~x8uxG_5pi{b%Jqrx?@$*#oU;kW)qbU>bCfu}u@}>;7lKaaxnK~u5K=VK zh}F9~lzMxRl+JR)9jEs|NY5&ah&#f7wI0^jCgIhgIQo2eBF#AN4mz_Fu|Dm6-!e*<`BTl}Z?iMVQg81V?5kf~RLQ=LxewwT&-PcHkTty`}|& zng-Oq`Vi%tF^s<8G?VG!i@QrYFnSG_lU$iX&aXa?vjpxOz%vD8)g8$0N)vMDPBrV0 z-A0E}mXMVR%6PiD28*Sf@RyW2O7+JvN0zUq-Y#Y&?Q8=I5v~Jyv>N!`LV~@58Bnup z5%b_-87QjwfVx=|Sq{dWvv?;a9Sw&&jkX}}%U4-r78sPe@hHl+hgNf^oqp~r_%u`c@J%SnhryDtc zLyQFz9cdsKxTk~iJ@PPN&N~>t3_vhNja>Za2I?Lbc)Ge7!+QuDu)-d5Lhb1Ih#SOb zfa|YD{zty?XVdCnXIS>+2%hWxfVcBB$eL-Qtgv-5NVb~Ok7L{E7%v4LEaf;}DVrDx zxmsAuW#m`UUMMa02DgEY@V)XT2ytDRF1rtO$6`^~WiAd&?X(5Y8XfT|dm4@|yn!PR zUb8;+ZDdN)8Cc^V%!?A6$!>Vp4?Kl0aNx28y0-{n<>If@VZSYCj0n@Fp)?fxp~!c< zqJddk^TG9b72Mg`0R9@w(BroZKQ<|bd>bD|;`>Zs>>GvV^@Kv<^rj*19BCVR|Y@vJnGaV$s+ue^z;TG=I3|9K=_UNb=EH3A&f z<<8>LOK6H}1@zzgO%Aq1TkM`$3+0~^QR7PrZ5`e~9$jf6llG3o6GJ)BxG9|}!FI5a z@STDt#3q^VPFc#!Qdos;HsXPrfY2Ra=M#Z7|Qv>+LKcj(a9cbj}3P5+#V zht$^gI!KN`0E-%m$sAu(bd>eRd`cjT~2I{j+y z23G4L@W&Zxc)3=Y9#T6=^-}kce@;AQaM1)H5$urKa70?8ooOL!GAN3Q^v+d1d@uHmNz7b_t0FVV zPG2cz-SeAp=?vHP5kCrPXI@h6-?rrEL22A|T)>3)e&nSriiH&?=FxWhcI0*f)MB3* zXgRzh+a6c3Mfb)DKF&Ie&rVOkNy}XD!0IsUO(alZ{{jAmSm2|#n`u|{IH+j318ZHx z!A^Sz`hHlAd=)EF;&UI>3dNy)nlS!59Zz@>7pR1+4S3x>LS}3|jXwRtL`Hlcu_%*e z+iax;9n18f`f@DJYA=SW2`eg9ZY)NJMR}mDdy_OgNoI^P)!9qgzWDZE3?17!A8&R% zp*|L&c2I@GRLXd-re>8r#!H!Q~m~)To$>7Wa%-Q%3 z&yC(A;n&vFqKZ?nQTPxwzNZ3;APRCNIvBE|i7_!XfWHeA`3t2up2WAM3(j8`XGaq9 zXi)M(+9rG%s@tpZ>XJfy(7uzK`DB56r#zf{!TA+5k6`5rS9n9~*~hDNfVP%{nwT#* ziMP_O_389!#~s#fhcS#EX@!2@si zv%61)&rX6h^7`z-dQm#QwjF%BKI63qi>U2@0{FDaG4hv9aQ2mR@coJ!u5-DG<8rED z&fjx5tfiT6iQT4W9?oQ8xbE-ZtW!Dhc{FKM{Z8@0x!3iXfchlco z2V=as4bhzMP6v-&=R6San6#SBtX!up>9d%?Wn@)g4wtig{O=*jU%r?y);HnY+bVi~ zjXRp%8OG?s%h2x;%`scF!0(?AdV0uE<@KFxKv)Np_joaE_HQN;qnmhY(>kb|8x?n<-))Z7&N)4=a5LW5GO;ZBTB37bFcyb>rmh>GqW`DaWQp4jxVcIawM(Xf zl8rv>nz|E0p1r^+OQP|FzYWP4F2#Ev&QPW0!4N!CooIO}FwEqGP*h=F)q6RQb4A|c z_LnE=m~9LlSDnl=AJ%7lZR2p-`$*>Lopp4ZRXzRsR~=rQUVt%{T>p1pAv5LXe5~Z( zqT483f*jVh}XgPH)6tA?pvuK-(H&_`3Wt z$r_C#s(VYgT~RU~=DNU3Ym4Z;E%{u=Lz8#kJOd0>?BMr-88D|wfV?OJy7}`I@_TwP zIdka`J^wEdt>T4v^pu7mYQHB>*-jd7ZTW{2#9Y8<;4OMhWjc`aNBHeG(?R^b|S_~#6v8AV_mSxExapOLdhdT_(j1ojFqgQ3qZWVpwW z?CX=mW8V{~O!9JSbjXtVW9Cbmb-lqOG8xQNxLr(rEb}X?fu8##hK1q*Y~PFrOv>s+ z_;2Af=B6^o=bh1wy48ze@~gX07di;@+b+VVL>3~?n!vxg0Vq@H4dG)YWO45c=E$#b zBE7r|%7Dvzxzy4WE^D(Vn9FFFBRDCq#qMj%Dc`V?-jhis$`^Yv+OLy7*y4_PW1b{p z$3l9<`6Y3Uh$V{YAL#1N5j-+eh*{Pl&-0&`LmQ?Vf~xLn7@ocj=F$Rs`pzO+^Wg~_ zT%3aTCKaIn@Htv7<3ZbeGqCt`1@>Vt88JQvL&aC2byEmCLI>uv8)x`HK@^gegG&@;BJc@z_l}15r0h6vgUX>B&fr52w7ET{f7D zQ$(g?M_3FFwvEStyJ0*7UOAJew+gEorNNr(Xz3grW#r$!fR`N~XwbODP)_%9`N`wB zcUclDx`;r9Y!><%1N5gHq`E)2&))0|J9L8BKPOkRtB;+=6VjZEB|eV?YgmHLPA)Sa zeF!4z*227{zC=$yg#Dtd0Z+247limmLq)a+O!~SFlk!K|k*NuIZ}$(JD!GJih#fDG znc|2&dlFDDw~#)ZR?h7>rjr{dZ^IsMiep3)y?i(0^;6T?s#HB3=m^IpiD@jaEP!qZ z=%I)1R-j|uBJi#wjJUomsZ7d-z>ncm5Pwqj0NLll!=SuvnCxs6Fq(}ac;Yw@WgXi|Oxk`7DDEbwuDf9(|0y}R^$qIQ907C3bx`D@ zfjiqy5PSX^nDl23sL60#Yp;H`^GP{+T{urOF6lu-+eb3-nFzm)bH%FFCt#086thiT ziPp?LMUTpcz^mqo7(U?@DShI{D$Kb|VtpQwDJ7|t36bTGziNY%tn1w z`(AGVh3|eSyFnXvPi;h*NCWc8F^%?3IK{TO2UYEdd}hL02bdc8l6ni$aEHJcr)d8n zMM(>>DUQH0Yb^qP1@wBvZjjLqLYrILaPzt@s=Bg*sC-i@cw@bfm(bo4H{VOk33 z?xchEw=jIC@S!r~r61XF>@u85*986Pg~aD!5%FD5P-8_5^flOlNJchs`HxRMvgcw> zu`S#BOCLr`C8%=RCUpAZixN_EsDJ(yIApF(7Tsz9xnLzIe$oia+@AgLa#1?8y_%jd zx`1CC%jjXRDU|#Wg>)4z3*pRtuHtn}YB_|?8dq>y!y&jN8B3f^qe$s+FRfP4hR%C8 zF`e5>c_@z&%ZOU?-lDJ%=zMNi=TVgd(qcN#5DZSQNjW%Bp4X z(gO9!{X$_V|Hd_4IR2v1Dvl>8bQdm7je+(qU3$r22U&LUC6Nd#g^=gtP_OeK*bjtI zHRH*GLyRFTFKdRNR81JF3ZX|F?7{PiH;mkUPoov&QP7YI70=wjqh*MmmzxQ}uFf#> z^CL7n6=VI1-EbvuFBq*ghkwG=5N7rkyps(1No%|?DEtGRa4U{#iX_opVoCIBs4CQ@ z-=gZ7sr20QxiDPSMAm#5M7No#phYdQDK`fdGEPIb`F;B7NHV-1rKD_`G>AsLLucOv z_^Y}Ac(GZ;x6ul$j1nq`VvX=YQx^WVG>7#)9~nvg4AjcaBc^4}^n+{$-9Fe@C1JdW zS^tnnM-E9>ZB@Ka-%SaFQ>(hk>ep(R(72IvFQ~yY`^m&!XFt5GpGChM&!Su0KjO8i znc!HQ2L}&Y;8%4+NRpNSYwHpc^&iIvY6`|H7E{sO;VSG-SLPe95Js!Z+BD6}mE&@b z=NB(zQ6adEuAgZQ+F~+zcKT`Bz-5*!ThhUywucVpmkSsz1*`AY6A7_%0K zO=GK$WvTOPn>miGK0|HCHsUqwK>W133+|WXfZK-cP#3ZdUd%N^y^?iw=(QJ}$~}if zE1k%m_G~&g@gOZO9Duhpmuhkuk#pmXv3uGy9Nst=cD&RObY)QRUrNzyeibj_rvPADp+p+y3hNZ>w3MO&yp4}n7505-@vh}9CER*QJwkmDuxVSutI&K zFt&8*1AOjw0S>C4z(3PJ(lbfxY0BpSyr)uxyRB78pkf@^`9KbIj!$7+G)u_*;#n{p ze3lA{`(n9&5vBDrL2oL;-tjg%{g^w?O>{P-9v`8U%c3{Un8l9}Ic?Om?-=~ybMpq{ z9MJ5Zhx8o7v7*Ab?B#13{o)8*RNn=eb2;y9L<+ULCIX5I^-PFyF6Z+}AcJyqX|E&q z7I;<8Mpdtbm=ZBcHGxJ4a(ticKyqHEl`$PC#L*!k44$+UpLrgjDd*)d)TM!3b()H~ z+qCfVLw!(NB?~56Iry!(mJCXlk{Bin?^t-^T9H~ZKWh;N?GvEbN6%dtz=f#Mn&{FN<@E(U3^S>Pah=e##gHoHjGU02~Zb5H14k`Ixg z-Xve*6VcM2iGHQpX!5IwG#a)s7x(#-GL_w+TToW#zT_r-^;ncXUN{}ZiaW@q1?Mqz z={r;x<@Rwi{c~sK^n+CF=@Z2fbFI~<#y$ngD zpbQ)szYQl7DNb8BkzeA@$AwD4AUjzAgiRtr>1rx5NXmiBHc8m!tP8x$QCQ_N2WI3w zCzbM?kFkcpf9gp0d8y*a)RV-lK%3F@6{CNWqN%v+W_b2)0ZlZSYP`B>J34%}gdL+ZDKbbvHFL7zL02tijbN*s$o?H2!y~ z8k!z|lq^G0uvNCC6Lk%+yC)EYGOxprocp9AWt=3+tbx)-b%Ej`D+E_3y-e z=@D3yPzf_-S3u3qA>ImIMCaGlv>_vrEIOkIzcZ)9jA^ax`+Z00w6E2udB_T*3l(s0 zRucJEe-&LWBKDnq$|kuYz`}3c{|nFuFAu zuIREn?RA>awLBRh_cCeGPbKcp14)*HD1T;JD0T`oz`~i);M3ngCLeV~{+2)*E_sLi z(vgMLQOR)k-!*!3vm-28DQ5h%=^Wt)++_pxcHqS&deAd#3f$$GsNQdKh(psjX6>2^ zo^oPr>qQqbB%Mi4UMqvTgi)i9eP4+B{SoT7%z<7xd(g-xzllifnt&hF>uAy4L-4-t z73a9N;b!1rP;fAxN{uY$?wp)!N56z!+rAa6yu9GPm^sJHti;pHJn&lmF7&x;PtOU9 z;M~|X$hs|ov+K`7@1fmn^>#5PLSPvrJ>gslg%O}`8G>OAH?ZXv_fGWLhCeR;HtKO- zjdORh)UoC)9aX(SE4XY@z-~hrT)G)D_vFxf{0oen$Cy!Qi#-axc?aPsi>ct*H1@<9 z4;+d3LQ4wEL1Wn!P}vnhZn|)RGu!*{!}J$b7qB5hY5(^q%JRkdlDN3ppM>^h123QJ zfiG*JNBz_2@WLllz#$q1wO67+r44L9(@{H6$ugggErOYK3uyD-J9KGn7V!uUhVJR7 zkaN(nNkRF*l`yI8<7zU0@iB6J`bL&ys$r|qS*+-|!mK~HotgeDj=WxLfX7$^&X!jEh>U`rAY_W17xhmU%IP8Tx^+HVH`83k4 zvl~=uF44~#J7JP(D}AETNkm&ugY9{w(jo3-`WkLVmKKZ~Z2ako$&I+~gEdu+bfX*X z9A zZ47!_DwD{L<8Z=iB@BOSAUiiolmoNYuA&4bBZLk_at`31;h3FdB!(= z){<4~0>>JMN(MPv{$-HeMU$C^lgk+DLg1CVhM0?#IdO61qZ%yAsWM$t_$(4E7F%rQBg$}W0 zCsSa$_fe4+EiCCQ$4In=oPhl!lUN2a8Zx?6;h&uy(Z@AqZc@^Twd z$>x+6*a&)i3nPKQyw+GF2c3pCFGX0xbaHoBF6bjJOroOz)uB9ynR_2 zHgn&p%!Lg=jaG3T4Rg45FaReO`GAd*7G}BYvj;?KabUFto^aVu7v3wOipk+P=fxtv z;-)_YT`P(1TQfLePT@;yF!)zl5!tzNU}>@kB}f)*wQnak_lRQG-H){A-6+-A@E=LB zQ-az9GSDDD8Qm>XarY`&8vSN1U8a`JQx@mw3h!&gn#j1cKA~^sjLIF1M8_<>luPPE7H%+S1n2-Y1?K! z^5EDebWLw&Q*XYb8P}4i^~+?GUB!dCj>UMjSQoVKTqSQ5C74**5A+Aezx+OO9kO_w zuekIEVSj34i;yImwrOIi{CgT)QcYJHI%6Y>pt6h=v=0Qrq;mzN#k-mH^4bQIo7K=> zTLUw05L{TOjoRWquw`x}UC(O5o2@UX?T$FkUy%V1gnyE;!3D6|%7@$aPJoPU+ps*i z0A!A4V3+G@y3q3mcKzw1UfT!AoBAd=)}D?*dvDj;nkYfq(u=Tm=p&isMlrp7KOTD+ zOr$S561TW{#D9(^=h3UArV&%=7r_XqPIQCTw*$mfUK>@553y#-9vIiUm2FArrp;&K zxbv})`X8SF3+7ItSH9gR=fg~xam`>XtS%#V&B|D7Rfvm2I2WRmHcr)8OqOa#q5JoE z3_t8kQ`FUH@AC~<*M8h+mZl<1-Z_Q8^=%P2o>|D=B>221oMe zfKGNO?#{nSc2`xyoV!w}l6aU-z3YkHCYjVc=QLy4CW1BY({bqLH}a}4kL+R&u(NEO zNq#~H9BAR8#8r;*w%!u*F0kbIjx(g{(RMsO=LQk{Sp$n+Oai4CQEe%{Ni@bHt$x~e z(HIoC^FZYAA5eGSLI3M6CDcI1Soyj-m`>A!+U{VKzHpzYG`y-yU%!TGx{eVGxp?~3 zuo$H$ZJ@_zhG6~CJ;X?V2dw*04ON$};zfIRSTO$;@jY;xy=NTHy^*KT>+|dBcJT{% zv#Am%$t=gRq`2ZgcD#_eUAL z9^dPs}G~z^ws}?|D!a@B8P#-qLnPy+#KYt&gNt)0^-mH%kp);R_KTDYYMzCa3)p znH>d|9OJzY2ew?Hw_CNqY;Fw^3HSo!c^t~GKTKu{37{`;6O)-6i9I!P@GNjP&Hk>1 zcjlE7UHcL0?2^apu#6-#Rvv~{y)4`rFrB{66)-k5US(3lyE}VV3lDHff0}?p|>Y zXYsg9nb0Gg(Y+h09}UB*=Zi?njvI90HgV#ycZkc`>*2Zcd#OzC3p6QM2&Fe_h|H|H z=yy;EMCH^`+oT+C-H8GIvd=W>6ZdcC1hc!vZ=wB3d3^Su4eJ&y#!V^%yh*-5(wClr z%wkK3S<#3GKHY&kecRcfptImA`INWZT7nj=iDAYAmm|bdYtSjq?ZS zl}q<=$zU(0%{)sF;U+TlrjC8IO%-O#XF$t-Z(_Y=5lPSOH98V6SbH^>yG`Q;o|%>N@jtn(a$>cnubdK+|4lFqv~1!cVP)sB-RGZPLM`oae6nVk8*c*T(>lI4~Po z3wkU5(Upf|vBReTlCsvYm$o!f&GrQ3&$5Efz%-g?p^iRNzY@RF0CNAS70zhqq<$r? z)NOwY`=nwa-s{SsIwsouAyFBAi~L~}m9BFoddMKkmVc#Ghk%Xe!OyJKJ4XK*bTeG=_2mzN`G618vktJ zv>JueQ~pxVh)x=9G7%rW;^P##2=>X5yKKoUNm^T5PMx|#vEQd3)kh=ImAiw!Ty}=o z3|YV&Ztij`Bb~Zu-zHt<)#!Lg3g7-6C08#hfT2?lopszFHaITB<1zu5!hR+C8XI__ zxuNt=3_u&-C`2S7cA6a*duK}Vqd=^vp7ILgL zEh6N1oEZtu$BN=hkeDlic42+=q4HGPakU7nh)4`9bZKJ`{Dpr1ch zl69A|aPLCy9JkH{&w1;~*%nh0@-_tKE7y=CN(tne_Y)>5#}y}O)q>sM=cKi0AN<$Z zL_SyUM5kHh=&l^fnC{hP_q$dC-0`46wvXZY#V&Gh-&^uK!jDd)QB-}=W)w*kq022@ z>3rdEDtF7D{LMQ_O$S_ocftrmQGtbC|rrn7n6zk7h`A)5#wLe7@+2xm*AGj0{ZyW4E~mWmV}$nggu!t z^xlG#@H%(EpTk%euwYi^|NX&%?7OJS%FbNNrSwNY|CkPNv#$RKp zL?<$ydHjv*GR%{NFE=`|#f+s;U7XJHa;N{j~qyVBj9x^Zgn&4ol6qgs(#iuJK^4GR- z`^>j<@WYwMw4|vLGVj;X=d(4L&ou|h+ocCEw5Wsk_hvs`e%_3pI9bn|^0S(}*uRW! zJ^!AFK74?;9vNfmk=;i6i6y+@+2^TR#C?!npo3*ozfp^fes;W3AJ$k|z~?`+F+Vnk z(abX;iaBpTGF6`qm83PckedBRvsf|%g<8PUy@kPagcXq zJ|+S$xo<#J7OOB4s|OR=V(}y@mb@4G#GLT*U3Gp?M*&`07Kf_;cqrm71yj_=$%od< z7%_YRvOJYwWu_gzKC~F8*U01To$0hxF9}u6&4_cz7c#Y=o`_exqnkJnx0QzoZYeCJ zaOfhledlH7_W6@|{qbb}ua3F6vwIN~IQ(b$UHTmAy_gNxd-yo*+7C9$A9<^jkJDUL zQJ88|N7tU6!nbdcV`oW+Q2N#fo;mZ$qpuf0u`B{kIBI~ha1Qa3`o%sSZX>s?7~GT- zhm+zg;CLUBy=hZvxq}22ab544*@dulwHV5ba#@|~Qsl31C8>5Vh;{ zhqj(!y(B4X|0Ru^mCi7}n_Y?zZ$Bk+cg5iG#3^Luo+TXf?-u>L>N z=C@XK`mhd+lZkRB92KsH)JEO{d?FsuVlgWeZV-i8v*)18 zj&71vNktJCf)XF+y}C~ldO4*S&e>C7reQejm=MfM1jYKPlk zs$zj-!kiPOEeT}arQ?jgwTZj-c)(Z&*_`o7sBJ3p?CYx!JBSouKTDs?U{hn*MvkSid}Y zShbHQ=Ua^{!j!NwW-7-bn23pvZz(Gj0pGq&guA($Az00YuHR(<6KV;IEFw~?oaI%FFx`gF%nW9*>B*KkZ(&0=BTQWdH zyOQxpAD~|*nUDwDc7u;jI@HG=hkb9RKml0+YGGSR$dD2<@77y3c(NuYOzAY*a%2xQ zn!aZXKHLPY2xoYwqz3B8qd~r81<1{IqdMAGnSaX*FyopV{3m=KyMjNlK^tentIEfW z!O7)t=r8wwIe#X9`L}i4u8rfez2TfGjI?pWgGQ1T)=U=`ye3~eY{Ak}45Oz1qAgE0 zV&V5Z_C?boR6Xbq+Y+_G<#izZNPWg^oOu$H%p}0iMgWu=1JP-EIZ2W`L$*G<$MNbK z=;t?ftVUxFJauVc{KB`R$yP%Y&h#UuEA^?*Ty4l-X$(D0rsVqQKc;Q=8gj0&5KG42 zz)JHuxMW)kn^^yqwoYy&wGo_K_pm>vY;j}vNlQRgR5JBC6GX?P0zjh44!5hGp=Ty; zWJu>2J5J-V&_tZ<)GLF2}L=OHGLPLS0fHWBuuc~3E zO&ZpVEW(*9wTS&Y5fbd#168;C*fBRvn0hLt_ClC3beV4>X|vKv-?}L1tCZl+OfV*m z{qYd-tc<=pP>3q#mGnuw8M;nci9N+4r5FO!#y6rJ;ck6yd}!|8>`!Bl1yPO1|!J`gR48tprH&E=1Xhm{VV zZv8-YT(=PIu^i~L&cx!xESRP@2kiYegUx~od?mk&IG!2?PnbY9@P0X&!s9xpC#vYe z^CBpr%rVbymD2M|8fbb+5`BICI-9WGP8gZ}n;aINJGIpGsPr8tJl=N*ycwO$F^ zliXx@_|i8<&wB_Cw*e08rcpD=E^__7BD3-LIT&9Vi#uBQBr{YS%j;*8lAbGcV2Lw` z2}aN+*A%#&wE-_~b)rA^&LHbQ3xP(5EBG=Qmspx=v#~R_E@-A2@b_H!xs-d0BwMuuX!sXn(#OK{-aC2V*MP60p?p-se9~Osg z?-yd7$5q0E|m+a=<6+Yx$iBDcF`J2}R@FwQ=3j#dPGrb|xU zp>uznLBn}~n<667(q2O>+&)CQrA1Tj6g%uLVA2^Eod1?fJTL8L+xdUU z5?ep$IS`DIqSuMznND==5Cmy9j2?Kr0(cdliJQ|f-cg)Pq!ZqfgK8_ls#KW&dbShz zI?EHkA9LZ~#WXNhkHhvo*T5`HnKcp($9ZPv;GeyZ?)=lkMxC!Cf94d>T+W+XYq^y1 zFDXUQ#2chLHWG_GKM|0Eyk4$5%d)F*&#ZXU+*{COmOx^)@{s zYVVw2MyU^%{mg{6`My}~z6xr0W>L4`XUz3+d#Zmf4hu50;XkcDXcl-vls{8c)sQBl zsXlD#+oOa!Jcrq9k3i4HR5E8+7c?&W;6U9+qNOYoigt;#6ZqE0^XR3Icgg6>KzfOlqo=o(}KS_x}# z^CfGzJ9RH9a#BRM?+NI)D+b7`$7J^(1(46a4zg<8Z@s$|cKtRXx3(~Fv-cr9^$y1y zWi~XOH=j0a;vAO(X>{rEC9qr^fN2j)7^9*OSQaFN8%}?7?;|H$0Q?pPRmhVHE7{2|rfQJ`)Krj}eXOju+_F4(%_;qe!A`WHF$>7IBCsIsBy)k9YoAtAMWiBru#aN;MM2*AU!3G6mJ&9NrG9} zXW5R&-=0PX*R_xr$Z4(T8enew1moHxwbbnkk9cSba30Ey*Jwf!WGWDt732WkG>7*sAz{jN9=+@vO45>beA^x()g4cRz@RNQ}O}dCP z#hb{lU2?GRUN=z|D1mUP`}FYZU9i@z1@E?71OK5eq$)5VrjY_!!zan;xoBK2uaDb} zQ}CDEDD%bJ3gv|#V&e%#{>UU*_I2q=D2VtHde!H%dW3 zw~EdUkihYaEpT^Z8@a1_jQ-ucjHqj}%%Mfx-S0vj@e|9#z=tAi_qq}~x2qC9#q|@1 z#0IoBzKm(-gHci@jh+*H&Q6p2fU6_gh~VRO5IZ-Po&CI)7;t}Q5i-rF9`l3_naH5q zm^AAUcaQX+@4`vHb~6Po4N#z|0DT{=aPD9{ghXASw!%q7tfdH!y^LYZK6Ig{%Y5*e z;Y&nA&Eega4aD>S4`zPw<2da;RF%Y#7_Qspb$mJ;zH1Mw#JRq->Id@GMu;DAKpORy zM&UQ5otQPk`N~EYgUO2$xD&huvsT&CIopeg`6Y1-fdY8OIWSM|O@hNy)5yN!n{;0v zg;LHJ@_UUR&gQ(QYUK{_OKOyEtUp2Dzk5Vwi!;bIj@6=j<|Hnf=7XPm717M{EZS{L zp+R*G@T!WBFK)LGfjCWLi=$nrXMTi=&Amjob-aKut!W@Nd;;vxond`i_*9K^Ual%o zgbR&^%$V09f6EXr7m5le27`FY?xT+EoJ|*_fSTvhIDx-p}Bao zQN{c!suO$_LN6|ZlBk`uesw!LnK;zRmQM>B{tJ3pP?1VHml(T^8He)pY+AO?QeVY|#14x^-Jvq5~JF3u^`0+*z zUc2r9qi46E%u-oymwy!U?}oq{p9NUdZH7`$<;h@MDb&&{qL((Pa5^M7)9)TP=EaZv6ZOecy}eFYo{I<-7tfVNB5)7#d)wuwVLQPrNV!cMX)X0 z2_r2g(3}uGcsDSB!`r{J8+w+ahDZoW%eX`QXWgc=tREXaxio{7|DFk@-4$eAV;)-E zRK)d$BXGhaoG2z$;tI2D!r7>Cx%XqrU+E4$PY0Nz4g;i2-xr*COYv9Pbh>|922o-+ z1AqG-d^;}#N?Qh?W8W1bZXZIO=X@Y0oj+;cD1&jCSILoEPRwBJI(qlLC9KO3;BR2g zW3tIN^7W@JzR}zOPZfH3%~FB1d+-=Nvyjr_YfotNJ}!PFp@T2&#%c1#Zub7aR2=t> zz>A4Fc+X{wDXCK+G2=?mQGEmwYz|}ow>dDs@&UUrT%C6DAHwSw3m~_CC0?Ew14eS; z;OJ(6uUb}tRTt;8Ka&cAKg2MBbN&1}w2ul^6w*7gooqvwBGflEvtz6ML3CgP`~WGI zJy`-LWdD*YyVRJo^>dAuJv|F9vHjF-hnDd-IDS?X zS>vmRZ9;2kNkSa`qZ@<)OzmMrO+P4cG8-183L3xQ47fsTr(>JT-UvVjV*mfD!qa5 zIp7!WdX`ClYf})9SOqow6Xe`$A6Pe`o7VHWp3OWt>L4>n_nO?nxe;QRR1yjjm*0_J zm$HnOl$4W->PEQPVvRd)x9W! z@eOs=mM5$KWWtTxf;er(HTwKdK0ZG>K$5kB@#pLtEKj%s#a1JZtQsV#O*%}H$Yf(> z86I`~ahvS&IYN9sDjMhfeF!rp4^f#!E+4V&CTTEyNzU+=Lr&{?OgZ<0SskB3x86BJ zLrS-Ur}0c^dR++FFZ$tawmamd&*8k4!YEK0Ike9T+Ut(raq1))z!z1ls2}} z;jJQ=_|pOtE=`2Wg9>!lf5&Ql!`#`i@;A7mr;lBHH=Bmluc6*MLukO&O1wB*1ea&& zq1Jz)aK)^Ih^-jpd=1`6#ST!n??0hzvlFz){5Gmp&Ze8WKFcN}D>|Voi#TlJV`}Rp zG-1Mf;<3x{$B#-}{b&z7|0#h^?l*9X5XVK)U5c?G zCG4#)f#CVj6>6h`@X>@k?%R0<1ET$~Rnr#qGe^kl#idYJd>$mCx@eELJFWb^4Axn# zN6Um9s+3s87V{mz?%5G!cSnN1{zSN$evUS{MSzu8KIVEibKzKf=vpxm#*_Y0)djWi z;LUB2=K87Dwb6J#Zv$qO&NKSmY6r%Da?zT5EAa=TNo8O%yzy~@@U=el)LV`>ve^@V zXq_RM2de0#Ppz04WeST*vcd6v47l>d;fbe$(a+(F$jwu;W z)Gz{@7;D^lW(jD|T}Z25Z=u75x1h?e(nw`nBvA_52;b&T!V{Ox0c(G=UK48JQie7T z1l5ylQb2#?2#{0V%V^|YUkJAeV+uamkTI+9-+c|>|(=or#k@{XFGeoGi{N%UIpPu5t4kwt5{ zJpPAt^fWvJUR<_NgqvHembF0Rs~2fxVHQ|T7ln|nd&DFvk4EfOgz~IBG+tOm?2lE! zy$83jeOU#ui~dH{rFKC7%{#oVz9t-`!3f8e}*^^lY8SJd{-VeUTLFG zJ{W;QUp$=@WrTxnT(?nmoVo{IAUf;ku|A!GP^pnbpLcS(l-^-dxX2vr8q8>4<2zE% zYoqorJE`0W27bJ&H`2@Lg5IcDlpkxRk}cKv+wMLi_U05e_-nE3$4J=qww=y3(1K6D z#CUF5pP1Rs&D3ehd=k>H#uz+ZgQm@E;7ENG_UT+@ysM(A{M=g7(l(Kdy1#=52lqip z(M8yP`U|VZdF^C^R+Ac!Oy(D}hghAtfiZUu!mPSM$o?aY@St1b+InRM?pvZwZ_JT|_Ted5yucH~qMW(=t}6;% z;`Wj2o0(U}FUh4@6JR9v5FX0naz`H@P`~K!(5L&Io_*KBa}X0o?aCwI7^wqAuXaNG zw{l|W7DX?_D3guGe{S$wcMK-)vd3q+ zaWEiLNPS1SPL7ZOlx7!^#RBVK?ax}U^gqSw#6N?=^Y&CGc>(@0P$wJPCc{ZPf3Wr5 z#$}7v!lHBBp0Wn;Y8mIv*?EGz7k9yf)sc`}TtfaT1kvDEAs{x$Cq*9yL8(5Dx@m-i z+qM0;jLR>M>9|4R@CNj)S^($bFT$bY-Y9c=8qR$F9WliWPdHp*#;+VFE5BspaM=b( zvoQj1Dhyt3wzT(C5lzW#VE-w_pmWGWs%*FclG6pyMWBv7SCI$tyTj;De~y@VYci10 zM@ai#(>?vd(DXAAew|RJb7b7~DO0AXOUs1psag+@ z+&p~*8dRLZ!}ErPrMDU!mG);7DR(R z;>I6w9Ugr15Ffl7fzXsuDi`VkiGMZlpkFB?{?Hx**)Z(&P-A|`Nbrl3$5FHRI8pN` z#QFCGu+lmgMjmIQ{)Df~h4dx(rQD87^5O_eKsg33;qF@J!=QN5MKZ**C7TFBNLdLf z6Ojg|6GCuraySI52G!p6I?Tig$e~+R4ETn{!TdkRG39a%{rKf3F1u|12MUdUNz zN^z2XA+9%>&U@gUi}(11zH{DA6sleDvksT3{4E0u?Yo&3F@nZZt>)vxgjc-yx>oMa zRf>1FM&c@ISEH}o8JBNcj9Z)?F(=?E3bwta!XM-5&Mnn=rDS}$dZ{XZ#9#ucP)SAU z3F)+x8Kz))FqHS@&qU)_F@GTF$_ohGkVRxS#!#2vM(|@O3|B}RfoD}JclO=E zB*AyoF6}YdlwJ%9-ka#O;)(D;tC##En-DIWGG3oj!K`F1w106&?-Wbgsr`{umBm5N zq&SkzWv@b>hM~o(S*VX=bh@fOBo6h$)D05Ybti}LoZrLd-v7|3g%a)es-Vyx$Fy?q zn+b)@hC4NO!>H6YvT){qR8#vTy!rK#iSD{Vw3K_u^b!ZS^L-EJROhnkdbUutPYUDu z_2|Le$>hy}t5~0Bf)#NKv2?W!d_B5|yHj3cyEiK1Seq`dLuDdvTW|-&RKuW0&Jo6D zY=teIaj?n1nLe4L0jrY&=y8P`toq2f(Ihn!l9RHV7AZtv{%KiYo|keth||RD(Hr~` zOv#Bff8ui`9*Zs;vk8X_A+5HXmb8e0!Tv_>9TG~;+nvN?a}wamzF8pkN(g=#vNVlz zo!-A$_b4OC+84uZ_U0srO07M>)*j^_@IE8AYVCXQQ8w1O!RnA>;EC z@zRt8wBzoB;X38S=KCdhye<>_hX@vm^zf2iP+VmHo84T~LzS;Lk+mOf;mf1foFkC) zYPW91GKK}a?p{(QpoT@G>imUw*5ZXv(P;SXJX&`ILs@CF;Vx}i^i9nM*>M{he>)sS z?yd)c>3yJc;4pM^ow8XArlCYd3}nbUfw*2828^B~rxc|r2yl1m8#9d^jZOmFXHCs+ z&*M)`QN!{b@kFrvl9AG3A!y*3GD!-abn+rCoO|*y?tM55C(V$%($GWC|Z3N#&ru)*{qrX%xBNm1;(reakHDKlzx)*xa|SQ&=lM}Jsp*= zYv4-dTDo*wG?ks$gB|N0kVkg=(93MO@zjZ;c$543Z|;1~7LU(^%JuJg(>kh2bM*?! ze)|I2c2BSvm%!830vt<62zz#u3<){Gzw^Z;w6YwhR*cc#zYXx4$VT|QH=XlU#Zc4B zVKC}E5AJ5IAEtbb zAY)gK808d?Yo2z~?GHnlxpCf*7p0CH4Oqr;ha!1on$Npp7YQ34M$_|+Xk_`_2jp6k zFjqYR&qS-Bp?E90btdBW9j)LLP{5t}0#MwwgeG*K;dKp#fz-B>?e&xE$xAu@yJ%7-!Y9`%6q1fnSfpB~|sO+)CgAj~T zmv5l|;I&&TRcT{ZrKird64*sUSwJE!`pfi3N*qj@sr%f`6;3+{I zC|u9T`bDu9cI`nqS!*gOsYk?ezmY1JLT1yT5NqVQkBENLLW?Kw>AmTJxTB^DI(BGL z=k>Yt*$ZJ%o;V-kb))g=h9Ho)RWx4ptOfd9CUTsUt#~pY>3uO9`gejLp6%_UHgO^F zvNIHKpS%kj=9~iCFng?O3df_GpJBHCp1zM&wZJFuJ9cs3h`eDJ_ALu_&%XcY#>So`&UPlE&>XG+elp!4=)NVE^YVe@TxbVCL06^|irD&HEdjTVAO$5T09*Eu{~ zkd6=b7ZLetPvZQe6we9E|^*D+*%L^0ep*qV zrsb?)&1Aq9=B{piaCISeuoGu~_Sk=i)lqeVsWm=ZIad&5SejGZQFH@N@-HpsMy zhjDW=F7G{Y0lgk>h)14oBWAyXabU3r{Ii>a$LmhQ{OC?<{&gNK2|7Qid3+`>$~xG8gL^>Av4g#+cMUdKF66p`37o@kh`xSfjQf2| zAYi-^-sB5oOtA}1k>ul9Yi-neevxDc&PKPlm%(hpF|u$)IgLILMzptY2B%gN+L@mM zx|der2oJZ_yAe??Q8MFEX zj9>GvfK2staz((4T+r=cwm$4&6esAS>RTc78P|u@x7VQT#9PvPxQ=>k_5dD}Pcn~v zfc>gZF;#gDtjW|z+YWD>b~OM>vW>|}4^QSf%s}KE(y6J6ppdl@Yx54`VZVKp*R4Zy zkEGGdZK>q--+NR=GmiWUmPAXZ1#nRQFw8D3p-!Jp!b8I}8WOL8yEAL)lCV=)yIugF zz7?j29&nC>Z4R7^DFRmgRltvi1QTN>;HiWZc(dOTV%}}Tub#J!c351(^j%M=@9AF5 zFyWIO3ceVAa0QCq{Q(MEM_EUm7 zfle5IVWe)+_$WD9n9H<{NWiZ}uFo=I6!X?V+jdp3cBscQ(<)IRJ{szJ)`R@Zc`z<{1Dn3OLZ0w*wjy7S zIC8t2?A#Yj`X*i2@%0|=Ruw`~tpcz}b!Jam{G}p)p8(q;iECm5ASinkX?a*jTQ=qz zzPl31^Gm6t$DS->oo6lp?^A1G`0oPFixfe8wmpXax#vLWvINlDg+5zH$eB=&49d*B?Nu+2R~m zs0VEY)9QA)SVD)yR#GC^PcLU(BEDMPEWfZ0J*6ecE-?YP`0qX4l`xH|@#fwiy?XIJL5{RW5j9oW908YO9nnT;i<6@rmD%4{4@MahKyM{E5nlx=|2On&}#B`k3F>V z*P`9QiDZYiC+%ZH@xS;A+P5(h9wmv;=p!z4#zbEXsyU6{(?w`nssy&LHieZ^%6QaA zkUZC!0=x3dY3Gp;sxl-AzE=C;P>U1po$HTFyxrh-jSVzBD8}6Q24e7KKCIwaGoclc z$3=#62y$DexLrO(L38fhglzAQ^Q;8&0WG2Mf z>uFAuP?07fO&Uo5lv2It{p4F*UC(*W-fR7S_w756S~ErXYo!8=2E^mtpnc4W(U-J8 zdo^*r9>6Xe5`t-`UBE767NnFbgW<|PTASm_dD+i!cg`I8ajcF>PFsT38u7%K$92E> zvS|6d4Rs7f;FiB1s2wYzTQ*11)Tj)&#h;0~I1{H{yG;AO3evw~ZyOZ93S)G1JX!x( z4`VJ+T-7?vTu|QvuDF8~ezl@nlDcH|!kNY&SN&iui>t8u+)`Zj;5w9s+d#jo0jZj@ zj9fk9Ni^T9LZ$yk%;Fectr{%Unrq^cz}FZ(;}*4R9H+O7J(>DTp$%biQuu@e%+L3a8k~WQU2gVH^#bgTrh8979PfN*|%~o^TfvMqX}fY6ptzVs)3W_hw)h$_hD!D%H@l(XaVX%Z4-3uj zfb-*>Y=&GuJ578iyr~pGb&+H6%$=ZwYbf>Db&tHbJxX=EZ;<=F$#~0Y6TK`J35Mae z#7#B_s{`Z7&|7OP@=IXn$th9GYeVq9+?o~++JO4>f=1+ew$s{!(eCy+@>2X3N%bwJ zO$TnWwOp=8)$$e?tEz z&R2M{yzFJJkD<7)2pAw&@DX4Vl3w9P9#NBR+7?Cdk{lLxV!aA9@ zNwd+%Yoc+zACG?6@r(`F;mX{vu%wy04xr8RPw?~7Z|a##dFtUwM`IE_frs3I)@oZN_%w1EK9xxTMr*-qQ9NWPOonC+ zjz92G93u@%$!*td=;j=bsY~=R=Fv>@E^Zn8IF$nZ^{wbPql(_P%SZR_B5L`P>n^D5 zhU5$W09ga{VZ%S-d%7BOJC%7unOAW^tS;TQi|adTXhNyeCWr_QB+GMO!2Suh$ltl+ z^vz0dY7Bx@i9JIZBtXa#5A75)w*Pp9 z-Yox2bZcF3)`rjcezcvAbg0A0kv96)WI5TT#QEsE_Tch|Z7_6%`|dk=mZa>m!8t<+ zgv$y&^|OLx$M58;ayAA^brL~4J!&#v5hfhFheqOjqVe-ND}HwZ^VLQPwl;QBx!N0G z6SNlP`YoX9Py#tLYZ76VZJ@RL?yBxW8JcEtU$|Mbn@L# z=p8|R?Jr}Tt>Fj-P9EqQ#`)WvMM`c*wt+5xlvA zzFs~Jl^bga(MZwczn16}Ip7FWQv#gFLGjqdJ~^_S3v|L|v&3 z?uZ+a;(M};_)9%Zj(m*z70>C)58glEp|rL!`lRW>k00k? zYx-@Di+vG{hNHN1emDFHQbdQs0a~eI4Zo*vhjo1d^h?z?MoIWH{TW?CiF6sB_DIL4 zNmFr4kv5q#3$RN>m;2ki=;|SNOx&9YDSb|`ymU2&c3Hutl{{Q%bdr6cnGQF8&w%d3 zq2%-9EPS$D(DaAz?QoLRCTUDv&1_cJ+E zYbW>rWnN8|b3Mv=+DOiM9w6zb3hBVhS=3E)E9lCfL-#$C;rX;yczaMCPp^7ICX7ZA z=a|1>5%3tdkI3+Q3N*oWvK6^A@eX@@S3%<~x1FR@ZJd6O3a2w&y-Dpr8;1NkPg5UH z$D>@IZ?L?E-mbNxhXYPS<>ybV-PjGB#&#VxaN0s$% zqt4hBCM3yZ)ElW1@E54v~sE7jn3Xk_ntxRJA*bj?*lr-F6Z zbT$&)0z%NS?>&`tP$&D}IstdI!9!M?F@Inydo$`P=Rl00OS;^_b5xF^`~!NS{wz6u zbQ@d`T}Z|=qHy{^JQZ%+fE5=F@!I3}G~xULj{i6T^+FbtQJrR3pxBJdOe@I!z4KxJ z$Ua(QRfXTV9mnvbD40KgH+2YqOZQ!OL$xREFzm|a{aw@+v+%Y?tc+yYsJ8dLzbv^g~imnf*5w3bAehf zMwi@ML<}C2W#2!LK3_@VSoIX;6df>A(H_H|wi2V2N3dIaHt9bn%S>ITM_0lq^ZdkK zxILOizuBr!77rh{iin3->dXCW0=)Le;%afKT{h?KD!6bZi3O*V1A$PVVLH{Vh#N;cHzHmV`jTVuCh@)c0 z#fztN9?K#Wc_Paf6VHat$^c2BQrHyE`Rw$@*`WB@_}-ZFzMQbdKn+!VQ7BK>uC%6d zIcape{Ap%W1T{=-96pbTG4*E=fCpd3-Nu zZ@WU@+J@mw&!4pQsXMfv7ec+fW|C7|1OBtlvI6H)(BCD8+^ZR(f65NQ_kkqbU=EKn0CEBKpmudX zxt#XL*%oxLLjV?~7enlZNp$FOBgGlMP?xg}l3$qO(~BZ>ZIv^7Y;GydJ{bill2II{4NBy{HAjCV#2v=z5YGrH%^di0{i@~tayQe-M_&ld)J8zHI;7g5MUpPDv4Vjgh0NA*qiaLda8Wn@!P+2T2K zAiV@OUOz>LMnb_m{6FgJ5efX-YuvqmF|vAlsoJY_R&aYLdDvn|m7ko!Pc}nje1jbZ zaU9QIq0;!-hXH9Td-7~?9ho}w5B%O%0?CGA5Ywa$GAEYO?M(|%D{(hpZchceHC(Dw+9E4C=W4@Spwt$QNCJntWyGIBN`1f3<1+rd`x* z45|9aZNlpRqdPVv;qBHS*f^07O^>2@Yl|D{ie1fYaeg+I{X9%0?jM5g=VGYi8IQPp z5m_AKO3SC3gW&r(yx=1asf8veJ5q(oW{c?jYY#xvTL+iL53}Oom4seiN-jD|G7C() zm;OfXMp_@_4;Hvs@^iPE7D&ze6&(T(M!Z&Z^>hnIt$W^N4)bK2MH;0o(c9 z2fFUHGI^V4g6u6Xa$qPs25FkL_&FTFyB_h&(^!A@{rz7w|pc?^qxHZejeF=R;6j7nyjpyS9RR$`wh zeL8UfLe295M~lf{b6KWjp$fVBXFAet$EXc=SNzW9xjim6z}O5k2+Z?=(2EnHv{Db# z{)N*?-3l;)^P`@gQi5gO#aNgUP6qpp@XOc+6sjyBW;0~rbz(YfiC=}jy4HBHE`~gK zJC&iQro&0s5RMJiPCW$&nZ~bnblsZ>h?eDpnC>FDpKuFpJ3JfGo?l{O_IpF_veTq; zb^_rvmMM@ufX|CX%LZK3)9P{8%xwBLbJtns(Aku$^TalK~fK?veX26@<|K{F%cjZ zd$>K9Yzf|IEu*?-KO4InvT*07LJVs5z6Uz+AA+Dnoa&|d8CUYGWhW(hx zfQz(R--}eN=G=avjwp9OhkW=oOb16UVKNlr0=Y@RfAXC+Y#xG9DHCS)vdi?N=3hF$ zc_B^?t;Yw?(&@WLYw_QRKj&#y!wM{idtqT*Mrj}WMnNC1o(sZvKh?;9@iydJg?m&+VRj-+|J>7r4u;0Q3w#)2ExwKq)x~B5zGZO=&9_FS%g!t?LX< ze#H4UuiJv#=?maFd;#U#8$d?W7UTa5qW8x9=}q75IPF6iXl_iQ$1Z2%N2B-j&QBFs zysDTyT4oGy99&@4yREQTED2l}-Xym1mT2ShiK;ba(Iag!7%H;~G}r86r%5JZgoHd* z`8SpSwX+|G58ol%&1CVdR1|!cUx?RIK3ypZI}R(Sz9+3w2cc2jlKS+_BtNE~0IhA4 z@a0KItnk-_HFrgT^{yfoSHwB5S|NPe|A~HkZHp}hA2^SJI2D~ehbBGoz~Vz@5c0r) zgmFDDr)Bd<&0Y^uSDu5X7A2E%8EyvC(uw0D<(N=46^?qnf+UASFmc5$`chsNKNKuC z{uZo>%I)&}Wvb7Jobf@D`11x`JhO!!^iBY)CKKjik}4dniNOax97lS2B1k++A}hNu zlTE*WGNm@xS%I%nr=v@JZMyqr}2$x6p|F!_ud>v&DRP+fcD{T$Rf z4wIX)5meRY33WPtg&dWe$BVSKrOPDbz{59}L|P~^U;7n6nDe(kDxb-J+qDfH(zVH` zvK0DX+X3tJ=P-FEPr=SqW!OIN0u44U0<}Z$QRiwFo|z{|H0xtA@%9F&FSG?G{bEqQ zT*o*soC8)%9}t7API}PY7%VJXnPRSUpqe{C^?HVR#on4+_Ff7m)P$4Zu|R7565ohl!iXDPmrCAC}1VqJdj8c@g>+`MP+OAXtEqL8iv_S4@8WuVn z##0h6sm*0sEIxmo1-V6#5zdlWF4NnmD`I@$OARy!r4wuEVu4H=BR2i6fx}<4aa~*_`UFjYH_7$n$VCINElZ`^e=TtE=5^Mq zM47HHd&}gHZlJ}>7Qhva!;pG{uqu+>l=0jSr*;k!pWrYuo)y8&UuldcPbTs)U_LyY zVTzAL0%2k2Qtqr5{DWw+0F#6$uW3D^8fzacyKP8z<+7K z3}2dP1LN}=U0-wWO`Z!~acvcR5{!bi^*ON2{4ohgoC{M|^^(k~pV4qz4K-*>hiooe zYEdSE2jrq5B5x781ltk6lR7wW=pFL=a$&~>Coog?gX%{Y@z6aB@a~?=JQBE0j^+xJ z6Ca%{$l%}>_DEm} zRDSsjjteibleeXTkX0p>pYxKPd{cr1MGK?xKsf9cX+G1ju_3$xEu@_MU5u zG2re^(ADrj%WF3Yo(O|;hUp~Ny^tPUq5w-yt3ZBf1!mZAo?VS_5_Y4Vw3lj=TZ?Nj z-A@Z8?L^SZZ!Ntx+(^rVIM2kDaFXez3TJ}E;ay=IFW#vc1r8sl4`&U~YhAxdo9tIM zWASW0uWvQ>xcK6{pD!A_Pn>`x!yBkIK@tu>;=jYGRy9j$rnbKD<3Im8LWd z629|h%zJ;I{NT82T~P&)CiR%seN<-yZPbXvtP`OB-IrZ=w1Kt$lukA{`(vs05AZ%A zg=?j=XmUjj=^ND{MVm!gfw~pT@~w|U^G{>>{2Vgj z7uVNSZ$Sy`Dv0*gLx=AYuy57`{)sz-jL_5?jPBe+QbqSdhJq$*d_9j!@mJxhCTWIU z#O0WeI5I|GoZzUrDzO<0CA(xJk)yN1E0<*ma`)-j?KJNdGx(P{ z86Ku3(88}A>&00W4V)Ii1Fb0fPPG;sXWd3mhXR!DIfGlO)=>6ilTn?^F_>cVkY?-~ zV2q{_e8*n}5<%r8Gb4k|m0*au+ur8 z*^BMc*e?8vX1>m$aa@-@yu|=4t{*~4_42gYsMfwG$v;7v&p zBjhiF4tG<@PFap|80@ zc{-)26}^uuz_l;;8MAYXVedmD)Dv)pxtb42AQyPqSS#0f;=pn8=U^)xSXjZV?!HGt z2hU(msy}h~;|xo7Z3P9p3>>Plpbs7wL8O5ebwdom2aG=n6udJ-4aiC+tyFzDPYa2q>I-bn0$*(+Az+0V+x=KA*7yF(uCIw!Er zcblkgkt6TjluEMhYXx3NF^34=HY&YhKDoMnE$7Po+jzo@^D6|U;aBb%y&{{5$ICcJ zL+>uA5R|}Uv-qG_ZA%(1mB4D(Tco$o9p3(Y$@pK~2E{g_Xy&2~u}c3)V^ji~${mBo z>>B#%QY1bAT~fJlkWo3?OCQ7}5Y7C0lDB3mI=XDe2bX+swkd(nw)y03;B_?jeoXEJ z#!%kOGcc%a0i&B=)209uR4GfLL(xlN|H`D+%(?Cfk@B(wmv3&M!$_xUvH$ZYN+E@CVi zDS;v*PuY|CSJ_!_hKY;`r8Op*V3FO%Zr+$h8h)L`hWPd97SE93vh^@+8-sVQw~*o`tyW^KpV*2!?@nK#ek8apx#I#NGgNfW++px$VpAPp@4W*als3{+pXU0P8 z?uYd38cE~TSV9iHJqB}sM4_iyH7Ur=N7^v}`{WH__D)}*o$Bx*E09jBTf~2@?~clK zX4K)!dRT9M3pWq-(j5nNc`I~-IA^XH|6ZyO7#O`Va&-*lcsYkbJMkFOO&76`%M8rh zlScPAO(LHbeTOCQ(u^X66hToc0X!|+NpGGeXuMxe%!(_By2cc0_3k$9nq)*-p;)|q zGnw=HsblZmeDY~-9B97g@<7YR$l|Y3uyeW_jHh&h;VLVXZ&^uYX8&f-K2pX#25Sks z`zbx45{Ui7x%ky;0SaYg;4N`ODs|VE#L7C+>Qm3?t?F~Q(Se6XJ+0&gU*34W{&x~@ z`Hn2n;`rE&U$EV86*}$;f(Z2pG<;~5;Sptwi=axc!91O zaRLv%J>C8=226vWVfVBSGAZ*4%~G;v1}045JQMRttzSIIKKTW6Kb3RcjlEfjDnm$ea!jaTDWlOVYKCD z1)>@>iZZA>P~3r`X!{~2({YJ~hbH-%m`k;5#@9K|e&)x*z_vQ-6?+K!!n~PPoL73$`yNL8`xreJa+6W5YQ}$cHPlY> zAi16t0{O@OgTyl**|)_Eye*v!f7o2~Y)GKF3%U75=s}Dfy@aa3piBn=&nNR~OJY6y z;`n45*Jny*UkE2h>sLXK;9qw2<9_(o7Dse5H#18oC33y=O5*hKBuzCFqO-04!v((9 z&@1}-;Cwzmqd2AGA3@6 zBhh?o{2Bg*S^7;14@L;WBmP6ItGh-vJSgEkO}GS=QPOd|00ws3Sh%60mlxP$E#E!ZKr7#rtLCqvg>)2*DZyk!0rRCNDG zcATFGl?q?LsZfp?ng5!&-AJbk4nKl*92@8&Q%SVq=GO1H{_F=AQLMEeB?bR=(nEL8l8IWAk$v8an-e5) zit|wtn*NbqXO=U^27-vrwnHd2aVmO#TLGHwzu}GS40z<+j_1|Sz^H#1{dZvsf8(2R zbQQLyj)y|9!^9Mvj2ft3-~$joS3sO5wc-qoNvN-QlV1E6L3>}9!92?aAUSUf%<^T~ z*UMk?EOORk(V=qMSt-ZJWGdq)Uv2!QKZSmC5XM_N7fE4674GD(h7Pm4s5NspvGkh+ zCHEJi!FPK+srrY@2Hl4rvcI8i1&`#_uy-5C$GnpNb4eb{i@$`=4G+0;~y#9^T z!+QBp^K&v4NWM(e4N{qt^S8oSu_n&hR0ao%IR2itJ4p~wLEd3|G@59JHN&ao^V!GL z&+;A#*&awQ9O;4Bkt%XzN(LUN=a}{vOW1)&PXS-&5rbD9bo^yC+;N>u2-j0r&Rj_( z#Y3riq9h7_TaDHZk4b+?2i2V@N#(5N*u_>l)MG4~8s40U7fVjU)5M2Rw=@Fd&7Sju z(nR>-Ca;LEcMQJo$fFUyvw>&-gUouimikI^t~u^Zda}h3(%VFgt2=T4*-qSR9!`or zgp(6Xed*iN(R3l8n>;I!3RYi@{4f?6=`Zx3v z^O9^X8KANE4$!|1-sonohD*xU;n8g?d) z&Oel{Rsl~@8z$kg0mw@(Cu@`s?N3jjQc@6J~t5B3MTMZ?WUxd=-`g3*+l1zLRXrYn>3@V(1y9BrIO%cu9C(c=f?Em@6jE`;8EGyxX# z*1{H@Z1T^d2A6b%f&BC*a8#$%*@M^gQy52Ssr zfb7yb(0_1=+17j>6Sw9O@rs$`O3GpQLM>sv;!FC+IG)aWYXojLGNEWBnY!ODzyVPa zs9m1XFg25hyDkpU-J{EC!lE@ay(5Q>tNB0|oh_!@-%f}3t-kDrVJ#{r5=cMJZDr=p z;W~UVJ3-AagiiL#BK@ha@I+=8Q9APuif^{i8d2_f=qiG7<8+;naiQ*b8n%dIm=W1}5h%-~^dNg=uZ!<)t& z*h^Fv?xPk?`gp#}0#mvu`NSd|p`as98 zm5`s!p>$@MD1S!pJH|I}8keJ8#YCU9!)s?};i{`gP~1w9S)s@AJ`}BRzM}#pJ~ZMf zaJ;1JR2{b|f2Af-nJ}uLg4w5ssL0nQTCUl_IdaWG#pg6Jox%AvGCQDSy9NEY#UAWD zmDx4c?}>KXLR_UV7uV0sq0@Voqga*=snQZK*0tj|@&%gclDJsuPQuIspScW%Jy2U^n3|soe_Gnfn~%ast1IZ9%y>AzBm|bEE_u3!;ukF}Yov^r z7!m%qg}iHh3ihMs;2RbKKI;2%W>+i}@)u#wLPA288d3U-`|Kp@L)LZxkDz=kJ^O$N z_~g)ex)ykKcOX%ot%#=cM7e#22c73Xk9pVhjBUOcfd#&2=?4ANO#H(P$TYi3+y8XZ zQ)??Y4(%S?!>%N=w}p_kTF$6{_Z-WMkpUMkMHtO|1Ql@{?{7Q}T{bO4XTyJ__pdR0 zaTA2fb93REUT5EiKS06aBJ*NJdm!2`#ySu!u@%m*bzZfRWk9{ zqE&R3kN`AA9w!Ac3!%xdo4746fxU~DplMS-@eXOEr*}!>3N0t{ZTASkDi`86bO^oA zzo6Ey4N+!G859>?0EroUnS(kav{f7_J7@!4Q=)L5nI~qI=F`?i(I`IiklOghVVGJD$n8Oruq%bCx17YI zTozeu-W8&lBu>1R>cPX34iKJ{MXMJrC%tAIYwE%(j{S0pR;GVIXX_e5uelNj& z-A^!7PmH8Uavr{kfPdatGEe5n5vl2Op?Chz##OvF_rZ|7_GSyn^vuUc4P&%@?Kf)l}*9S5G`foU)ykJ>ZUOn~eO+l3@=V4LL zW?W?x$wb>ol2^5sRAwxb@P@;&G(3#0_FT&O;Z#V(nPTV{%mI7RQm`#|Cu)Ob_%CBQ zMD4S|J6#-mlbMJ{!E3OGZYioAC&~*MdHHGqh(*P8e;GJ3o9Bi0HtXFoyiZm`ew5tg3 z&tF1Yj;vs;gW~bk^(|o1H-nU&>!9Mx(&*CtEksaE3?>KOWosdcW=T1s)m%N4mN$hv z8}5>U+AuCl-;9Qrgz(~)J!q@(gqid~h@0bxV#;|FsCzobanm%ZyVMfUD!Il?yzL1Z zmePC^fqU$_-+8#vljAz6&*R0m+S^|12HMw+-%igVl^q0@_O!FgULX*_V6 z`zgvgbH8gldBhCM6f(``GVtlkXZ&%k6B;`)A-*TutU#Z??9U@2r+h=O&G3C{bJh_btaiX#-Ud(}=z%34cXZ9fc?UcY3iRIusILhjZ ztKrC9z^A|T==cOh=3Xj+2LB0ESbG8#HH|ku)1H7@IUQhm{u`O!zlZjFu0u<6NlHIW zrXA;JasSS7`mO3P`dpm@KF4Cn94;fD82XgxuQ>&a6{1)R#u^vDYap#+A5rOYI{@{@ zkdO96JEVqL%g;nhzcO&sETNs|0T`5W6%L!4keA;C_|Z;b)caaLjAvTGi}%??Dz%=D z+&BO#X{o$Ak(+onRG4ob8-_1BF5&@;zpz+kJ2_=A6Hlq0qcK}u@Kx$6tk|GRXZ$gz zLJC{JyE(T}X5Shrog51_Cu1;Hu#t0Ht%ik?#iUs82&}OwgTPQ{OsLzy+!wQ>w|=A{ zE)ge}Jepx~!G7}SqZsLQ29z+5M90dqyuDE3K0YKB6!M1fuBwo{<&a)n}zwe0+!K9wD$-$?mLi!{hur8qgz~7qo3+hUavW@o;)DDqRr6;;aW$JezYGlpV(X7ti4b;)`|7xnOvD4!d{TR!|rB zf`;~^DB}=|cU-Pgadk`B_C*tx*+*ep`xauov6Q+QN6~e6ZW5Q>e~8iP1SWO#8t3Db z!=NoAz&=)kt49V&`1&byW{VGgm^lqX9oneo;R(hQ`y0Wu<{|!j8BZIctLc)9$<#r7 zn5sQXWOA+*^UlrmfCH=j!TXFn{^L!h3w11EAbkm&>njMYS6AYTnL_+bZ&ke7e2?gD zA($RvfDFggs7)3zZaAlS#pY8MytFz^49I%oHAfE1Rv6R7XYS00S$U9d!ew70=JKlp zvgxt&mx=y@2JC8kK(aZnfVcEjn*2c)Rww7<)kmpNmFz_oC9R0iS0mQeRS2EcGEn0> z_Z(O>!}89T+@1I`4Z8G}bl#AJkL#)!ja%s$aBm+pcE6$4+xNhUN>l1=wv~2xbd%G9 zgm{X|(zx-Dr0vx_qITyG{_vW@FMALIb6;D4&9Odmc!~lpDEZB7nY<8nhV96Bj8TMOV% z5s;ow^^)lQDEaF<&b1~Q;mfd_?5eB>^B%|6#bx#Us^nH=dcV-HO-|5C+T#PRRc`EnW#j4q`k=>up|@{0&22%x)(ID-`nP?a?$Ay*V|vO2dn zk&VV%Vk8;LlIs{G!Bi(L$7!q)&Av<^?U57!|!z*Vyja@>^@ zc&1Gai~GmPn^zOK9@ATv#}|fKPANEVb`7>;b=jI8 zQMuA)`1z5?29CbN&3K12{G5Z=g$jwTn-v^BVoch&{Fzy79FZh)=n?k<(k0b#PKBWH zEsZp|?;k^lvTWc;a6D8C{h)c-^^jQgg0Z@xN5A!Q{J4{`5TQ7oeiuBA^M2ez*Wgkz z6t)58woO9yiA$j&F_RpctBk+eI2Qc3Fp%SXooZ%}QKqP$1}*6U!8hw6>TM)^>Kh}& z*UpeH*K)~L4KZlVzeF!*u0w}cUBpiLHr%Ko@T^vjeOBWMXBH@9ild;>yQK`A&3i|j zhGt;gU_a*si^AypA~2A@jQ)wPqRVnm(gS=2n7+dg1lLr+QCW_$9xVZ;ZI98cVH$Xk zaNpZ;spRmhb*$bXV6IaHR7Y@r9pUA;W%U}exz7iMJ_Cy0C?omHPUD}Ur|i);4vlgC zW~~1@HF&E2nXm)1!D){@9_;U9);0}6)nNwY57qNb`Af**5P1y0-i<2-`^oD|DHx|$ zgEnt9G3|o}#PqI$)%TB6uOoeotwFZYU@uZNFGadOdl)yRaPMia+g#pj5{!AO;0LpC zSm1G+`8NL@thg*<{OFjNao}YK_U6AD>SG}fN7S<*%s317tn`4q!C>@o(57+MXTh0? zBDB%06i(d}fD49Fyc%h39xNr_zB|IJK`ne2mq$x|h4_ah zko=q_2a2VfdpyJhR+wKPRV{5i!Cwq0@i)WYwm8t$Y9_-XDHK}n(vJ^ai2bV5^!fX< zj6T=fI($%^&a8UN3a_1p#k-<`h;AhP@~1#G`7>4Yd_V<*Cy=983gF|fRxDoqnO-|9 zfXVzY!ap8GH>^8O)_x8LvuZ#5x}g`1A3B4r$ZUS+<@u;nXG9L}(1GE~dNA9zk#&Vg-RWpV~OdC;pdkVfizXE;9Z&{MtbbUq44-j?48v>=Gt872vO>7nwTsPFfl+L_$2y z;#6^4JSLNb|2!(#KCa_-#X|@Cq(dP^EC+UBj@#KWRL1vkk)S+IOoZ3ygzV|ZdVuUjVL%~y1 z)ObYoC)xH)8UJn>CK@w-;_G{g>_OQsD7bu|&Qu&^bWd_wpYJE&{u2$X(k;eUJNKgh z;BJ^vAc_}XxWSgk2p2d900d`;I6WTl7iEUrHn(XtQf`R>xcsE%I zwQ?u$Lp-g~>rx9HGS-6MEnmQ>I|<&#&bnW(N8lGImcue z_g>$vV|=UaHxqSyGr76*CcgbGhbq<%*rjH|yv!7Z0jDAiOE18rPs055d1~apUPrXt zy9By)-k|hyMeMcJ#hM%zO3Er2asM`SyR8mW9`&&iqPDp2;8wb_6g=5};_dF0HB zYvlc7cls;iCiTlxLN|`9@Jn9W_=4gjaBI*<7a9c#Y~9F~tQ{w4^A4BJWE z*RSN5q7+&%QGB=*e`#GJE_$(K?8OWCQ4o)zF%0Rq zZ$jFY-iT=MyrJmxR_KJ?sk)IXWB> zidO4i(DfI-5u%y_!%h#$#&emlV}B`VX_@1;z(rJfdlCen-AO&?Mxf@%R&YFQ1RJei zl3O$9;K;w-m}=BQ0-m*y@|8No&({V2>DI8vryOtW|2;_S^3T#8S87O!LKCX<_;kLQ zJ<)QXht<{dNKXTUvUg|0jw{@@<*PaTJ`ezZ56JOO+o_Sc8&k1%-V$8uhhTB2ggi`1 zz~5p;|D))<NnE4&664| z^(Oy19#IR0e`KexHl3MUOAXJ6Hf-z{K`Hevw&c1#Wd2YkrL-K17Of^-GX*eAuatK(1p1l`!ar%RE=CFn=sE;gfq0rL2>G6l8% z4Dqa-L+P{*LvZtIMvF<)Oj`Ek0`HMKH0{X82GJbo6*a&Zk8{-Y3FnmV`%6vYFTiT9 z^E9*c8F_FBV4cQ4lI_zCasL4(&bZBJSEb{zt47S3SWg@pb0Xc{$tb+;4H1$_r@Iz5 zljs^-6nx}P26k5vp@)FSct>bm;YwWOpx3bSuK*->`eEIgy;wo>X!vIZl>D85hSxf& zK;&DH@wkdt1beBaT?zb+79{h!o|A?}iez7~c!QZe>KxE=QqBcvJN-LhE zQ9);M(ruPM^W78@^pTrKL$qM|KVj}!9#4+F_y&#deo`SNj>kA2P4*2o!UWASxa}Q< zL8?nIF2M?<>orjH<|QIlyB%+3Y2fP1jp$`)#~7ug!ndre^r2xUsOlb|5njqz^CkjU zuRjmb`#4WztQ5L&nHSYBx^S6$U+ZiwV`gj(;WOM>`7~t~x;S4^J2M-k3&v5)WDmA} z`cC6UzmO{VQ8dbW%6^L4iGpvhfrX(e9ywJ{Q=%(L{;CJelz4BDla&BL_b<@Iu}J=_ zF8XKu@%x z*zz88JUov2+))OBgelPKae?ObXi$CULgv*sZlClv7J3g3Gp~ws;M0>Jy6)LQcn8rS z+Qm69_Hn=P9)*7N&MvgW-LdKi=(WgXhBM&^nBvb6%{0n4c5C>`@q*G%X1gCZ!Ye20?a? zYd?HGB!Z*K(TIOvgTB!T(zoRaE%_q=t^PBx^J5m7l6wW_Ppd|sechyKo|RduFUQip z(@9;c3fb!1b98&rUPeIL0e%U8C7u}>VD{fi?1*{>YuoqH9d4I!QdB7J7EnS`auiS8 zT@8B+^l_KxKf>mwlJu|#D74`#J^$2}KJE4)?7G=F^0fi?JV zCNQ=~9jY{tJani9=sf~K`3-c&v0Tb64e;HiBRDrMlsMch#}8>Dl-K$eFGqTl-Kre# zZF?##xza{G8eh<0k$R@Wq=qSk6R4{q&CdHIf;ag;sOg^-cu{41FXP z#}&br+sTUrzuj3o6TC)m%~VzwQjaJDX4{=`y1lmjESOk3q1^Fl)sfLMj!1M@8FMsAe;X znATf{zpa_31#vynoOyKD`)#~U;jchpw=c|i$yU;$-_H!V#R*A$tT7+l6#^a-f<7^nm71b|shuhQ{=WMsfYt09!Kg?oH zL`4BZWa%Mw6a4w7muCM^r(3!1<*ct(xJlmzbw-XrW!q1($zvYby3L(_ysL=opU$Li zEly;O-!j;(oP>h614!@82*{0lO|*QIz^`I1ob8n(2Yo2b6thE-?Ge~+C=UVGhDq(# z12AqF3@@)2g1^8Ea=qy%JE7_gc&s&nH0M@kOVe(QyEI5Q_t(Rx)$UY$x*tk~t3uiI zQ0P5%n)$bW2Bb_Vh5n-xvFY9-Tw9z0&M!L1MMYuodF_KgTAwoG@h#{p*@a&hE`T*h z!#GEfw3+$7RPy_XEZw)!5@V-FK*F^f{d1$zSUx~&ZD`7#5(3VniM zm6P~lrY^>~+$XCtPvhjn66kyDyrfPF^cu%T+u4Xj=+}3#Or} zsw8Z%Da7;{+?mzQcl5k^E}h~u36EY>Lp87SaA?IJ@?}*R{X0*t!9YG6*N4x7MH0y* z)Nm(Rlm3SMVUN>^;{9Z?9OniXT}SekOyy*5ie?g3uh=)OVQ|>piVo{Xpz-S@P)JN- zt%pU-78r}soBhjC^w|;gkg}zp4rIfy+%ZU;SVGFfl6X5aiip+K?NGJoI1P7RO7`k2 z!ArXy^8DOqE@$V4Wmc<6^c;2C(U3#>ddJ9{+fogWj|t<0iKmI;b8#rEazlru?o5k# z2b1c>@h~>^LqTjdF1NPBhnlfCByt4=lznlQd=W$~Uc;Q4myc~TDrkJka*P*<#}oUG z<9Ul(aO~k6T#s^y2`|-DwoRXG*!mU@541x0X+O42$PKfT3bE-%C)Vzs4o1(7h`R4B z@b3=7`JJV7uf723o)86vVj7g6`V{QHh?_n3{mD*lALjj7Tue_(#S%lM6rBA15GoJ% zFTzoOKjxMQr zM78(%K+<+ssChQs?4j{alN4?=U(F!^|T8Ix9-%u0U` zhcNwfWTW^Qx+Xk>wuo)$SFBhbszs+xYc613dU2Y}GJkpACBkgpP{Cc+R zY&)I~wSo&nmS8kzGd>!<3K=I$KsAab!o!PjtSbU9Ecpr8(ND9u^M{M;FViLFY1HM- zB0QC~i+c3=cAg9D zgytR3nd0H8kY8nqz893xS$_hyaSW*+SF`B;Wkgksmw7@hTEA_{*HM#tC! zQnbMV6W+&goaI4U--_gH_)q#`w-fdbG~j~ zXkvIAjkCqUA1qPbeI@u*eIWx9C}aQrb@{=G|@4W%M)l~Avb%Z z1Q85qxkGM!2!zCA+fcVhyuo9kO~cU%J!G_N5gy&Hf*O9EAKh)TQ=fw4;m>yNUx$({;IOB$yz91a+kCa_@D(u8YvWWnj(p>VM(9H(WA zF#S{LqxsYNyw%Uhp%cP*Kjss`!Fe?A>KqJv@P*&v8bjk03SnIX3r_+v!BRend@bAx zQw86E&uA-7sp44R9ufFQeweDtRYS=Gt%m=WB;u~w_lfeTJA__Ygngx)drLVTlbvQ_ zx%UF>eH}y&S1DpgzAt^Qxdh*A^hc&G1kV2Tq4#p?VAcAAR5blRTKkePTlf2*4}%np`j zSsih8F{%M`$;V~YHrB{%VV-W4XNFoN9W za+I|y9jxpUS>QEuUJWJ`lA6?M1GU1*z4LJ8-TTDVY9Z#PT9b&m+_~DM@5FOwGc{3- z=A3uiF)mS=^Q$(X$_H~uk>_$mj~4O|axP-8!%`rt6HSKfM(`5%@nfIWczuS6sMl^n zXM4QIPllXpSm_78Hwi_ng_q%4xeQ!7kO^bg{!qJnDWGZJfh>rFxUzafhzG}>9+kuP z3N1QGSqc~Nni=8lRuC?G!Du}kU~PQYQjz=!IwQ87_oE~jN;tQ7S41~>Zs3@q-5REg zxVdR->OlyydCAx7@*}CiGsyhba9krfn-0D^Lbe}IK!vZ5&|2^o=*Nr`-Be$Qo+sU) zS+S9BZiy!koubgcnPasX7ct%90u8S7m(qJu8H@z;fHnyvgKLI0^-GvQ{r~gCt=1*5 zEocSC@p<5-A<|7r$m z+byy21|{9+c0hi}eV8Pn1|O$x#G_qmm|DIQQx0*UlnIBx`Sx5=w|W`={J=-~)qNyx zn>wogbc8em8%VpT% zbDXL?&*0|X*#MmfQJmvwl}B(4+LB=E@NGX9`iFt|8VU5>)5PS(*i*w(g;49Mgxmj) zf{&Xuw`WMFb}@@kbLa}(UXqJ{t$GO2o5b6Yc#bStxRq2^NP_m7^GwC$k6>=Zeck9u zTvNqB(0CX5IHL(PBF%7?_Ea;88Ri&}PD%QPO8UX$Cv!KA%S*@<(lvj5;OQ}4W?$eB z+Prcv?q2?qiuWt>B0tQaYP$sC(=uC}ttp2&W}#3hkw~X=T*?JfFG<`rQ+yKhiyHUq zftUY#nA9am7KYvd^W7Q1<2rWy<%_W*Ess*sjrH1Z-m-~9$+-6Qb^2y*66!eJVSW}k zLvSS5n||mCvS#j3iN{IdwOsmY@_)dSD1d>by%96PVEum7B)m!8~(JHbk3^CPR!V9_9S z+z7|4BTXQGb0usPizI@o3n2V!58c1a58BLcvx3hz^W#t6rGK?7!R6l|HSCIqH%?#Z zo6k2ezd{F3m>#1u(^o>+Xe`?{?I!h86Cpn*yTZjr2?z}l=X^ECLFjfqzI|^-3V&6h zirpzlTZ*^vh?*(F%; zOat@`qaa>Z7emLkQIpsVFq%>b2X3TNC1YK@wde>`^zfP6I~RbE9p`5-3PI0vNthZK z#W6`g;b5aogY(@xY~E}|>69Ai}ebjU5C^w4~lk?`k zz_&jUcBUz_5zIu=eZU2^|IWe}>!hLY!3w--Jxau)InK_1^(1Sx5XN`Cr^CgU*g=Or zT6ldKl$LCRwHxN(esO0KRG|fhh1q1qwv)i~dI#a-yGXjCJqr6=#D(RuuqD!nE)r^| zY2!+8#McM+E?9um?@3^sy(LHt#nVkap^#U92fD&;Q>itQL^`vU{0P;+=Dh%mf||&) zX_FYkd6Ut7IE+{%kF$d>?m~~3I{hmh3BF^G;B3NN9IxTL@n7~~QQKEI8_d3(3 zOeJ~6vAZ-sG-1p-Pr9wolYCk|)9i+oK1_TWN^-cryK})V0*ZR{<=`!9c3vF&wjaV@ z{~TfU=3V&tnIqns63K?I>*n&NmSos57-jCA#qV1`(*G*@@#TdTFm1+a;^kn^Ij%P% zK9_(m8hNBt3UImHTnxWEi%tv;gZtvK=ybB4xsf{`sXzshIqppk`)I=$PnEVZxbnwj;yi6iU*L@GVquQD1Hbg>ALo)i^UJuR+$MD`%&hgk; z1Y4a$NLyAhX?u4P)HfVp9}1+xqN!#;*6ky*QEn)=au?LgFi^a=kN)+Krzs`R!C0f3 zNmYu5x|TyUrfe&?6qwPJe|B_ijRNy)TMEQYC}+zf?IFrh5X!yl$X$tiQc-o9$_~FK zHELzd*wQ1g`(hw%zTk#M*DsI<2j=qnwUptCArF=oCBR$~#;WJc0rv|}=&eH=!7$g1 z9$lx7-TU_=pJxIg>sm?03S$hsbp>v6{rL+EJn^)yF;;9+!kF(<2{Y$BoU^z|kNJ5s zmws#WTcv~8S^68{*Gfh3eN}|vwmG27WjfC6drA7kFXHFCdDJa$Iq-rK(WNzpTBvHF z8}A=c?K%(XeS=g`vmP&%NP|Gv9?nJbh$eNcgpO5v;Cnas|7ENX2d!?gwM-Ik^QJqj zLbEzr_HitU=oGLxr-I7_9?_m_4fK0|0^YLU!|pfX*I&?7Y}l{C7#nSky=wf81nzvwzV$Re3b$GR2D9F?hXS3MHQAQEAx^>?P(nSysil{0@&0v0b%n z+rVb1-t&~)uYQcvb#~xV4`q1BWu9ULxqMvG4kG-jivBv3Nisc4AVl;lb@_e`1+QEr zhhZLj!>tQ88;h7_MEKwXX%Dv{H#4 zlu*N_Uj?Lip);}jx)4r@J7Hgs7>>P^fjOq>)MO+JHKGJ*nX^2wt2N-y>D{>PYba|n z#TVM79-@N$Cx)FP4C`vT(BXSJofMu7(>_eXs_iw@zP}nIRHxvw0HhmoS3}r(5wmai zx?!n-I4!oEj~$B3$?r!>@G7T*HY%^ck}5yw$eIry6WsAP;x}J3=#w; zLPlW&&92d6^k0lYwK+>)Ivge%@y)m;&Vv=5;fiytiqYWTL6nLYg7KrX!Pj^>(uKw- zR(%Pk-YFwDT^Dk!C>FO)^}tn2mb1Tki|F3;^)TVGBJMmE3v-&baGiIKGu-mzg~`Ew%v*b2o^8{uU(+1ddS#KAqN$`9ccgQND>w}1?w(ff@?Y|W}=%p zhTJ=8*ru@!_BZ&^=`xy7p{7R{aWUY^#Y>?(JeADSY6i#5iDt>mD?oDJSz6P#2^MZp zhj(VeV7{xIbi7l>^$*OzRsRw3H4p$jHlIKK;UwitufV0JuAu&thg5HB9WfMn3g5R3 z;(hb~Xz)rs?0q#8Yfdf$uK-QDvd4xV6|=&DHVcsK{Yg3{!{EjFPE?7^q95f;$c9cz z0;<)pHD(KT&aI)ALFw?zbBNr(B@GHk1u^$oG@0`0B)ru9N=FN7;R46Bu(Kqj?nxA> zp3=y1L?*z^2`?b1PZ*t^7IEHeZEp6}qghwxf#KB?%!D=#EPVAJXxs_KA6M#3b6*yq z)4MpBwm}?r=#G-Pf#&>>W$3 zy2?5Dbe}QVRy|5awB}>lQXMm+SgyMwa~ODEjX}a@Crp2K9`^Azg2WD4ta}zrzTOGL zR~wg;?AZ$;$ZsQfKi&&ob@S2eS1T2_X(d5Z{c!B#G@Lh~3NuG3DNnmaYyxM}sn)-U z?mts(nvp{eggZev^NEq)sZT_g1OR@rfY$wmY)5+)=~8%2U;R>m_Wcwd7MJ0TfNnY% zn+@k{UjvCLAk7Z(G&?>C{&9TMS-%c}xAXuTyTbu~{yhhu=`vjMR|J1JI^YBCR3LZ# zFg*M<9j-r`1wqanH{13szL|yWfy-HF_BjPRI`0sb zZMpDx&JE1|I~C@Qeqd!e_S=sx6&!xNjV`QWaFbseZ`ub-)6EN?5Szh3_$Ap(_IgOe z`yB4RV7!T_WLBG|4%%YIl>q#4Z6h;~#pj%8l0>9=3OIGgll|@@RN$j1zk5W-Y%7|< z5sy4tGv_QUxgSk;Y$*Y^uV$z_91r`xZ^G)1QQG;r0Zwi^2Yd9k(2=7FA z)YxA(XKXhdELEW^KPZFjipS_DeuUv=6+`#6&p8Y{UdmoacKBsIM0xN+H9K7 zWWHaD64h_{)7?UV+J7N$%uXpyx$$mX697i_BlR3_2P2bn{7R1f`{mps zx-+zlu_<4MW5Uap*I>b@Xjx6Z(hwTRc3$1pNd&5&x^L>F8fp^*{i*lC->S@&al z(ArdsZg)NC+MW@5e#0d6NSXjgg0HgOH3DXbh4o30{IDG?*}0gK8jfZC^C9C!GI8|b6W0D*4B(6e`cAuq zjhoSdt`9e3<61x3DDjr&mY2{qn=X^VgK}oM_pXxU0e6~XmU zslWuWRj^HB2S^(|XIme|)3JL8F+kskwkX{rHaE*?rlAFPmrj7QPSYF2wUIa-ID%>E zE;vK>J00ycrtaxmK|Q9J|KnaPmCKBxhm8wqQKYz4DdHbu<>{an-bj za@$1O@YEZn`hF5knhaB2l~J^89k>5Zr!SumkxD&5Fwq9G!>EL$91jOK-S1RkVhSi! zmXc-p`rI!42F_>gxw$ry2@BtYh2NiXtYQnQxb-=lnpHvU-s$1li$>6_5(^(>ETKnA z3Po*>QS*QyM)!v>4*OI=_b!BM{6ADE*@&}SnVaISZv*`jX>z$+D{$s51& zelEX{dzM}xueUX#;BXq_X*sQ7Ojw?C$KD2Q?p!s9_nNsoQ;GcMaFc_!L2%~cX2>j> zi&gXO;PhiXjCv@Ek(GJW*zFNH{Hx6LlZHG!*Tbkh}9|!ReAY5PwRUXArDPE^>|yo&GfP>~1BM+{EBzfi|+SWg^t}Ekyf8 zDQGeEDRJ0UMP08alf`fL;|-e*x>c5i#wo$H>#{YbJ<6r+J9ok-R{`>^X`HNoBZK)N z?|_&&v0JuRks-NMDkHIg23LKiS6e4BrI)V|`_Et4g|8owD-SDixZSVB z=^8A%ppE~r16VeF7;oI@BF*b2q85LEh%RqsesB=QjUVEv(?}rQW%CldMq=?`Qv@A- zQv{mk+aSwG!^|c}3hW{xu-ju7Js7J^ALm|&RPQ0v%=1!2;BOi+7#yUbzDHrvZzD*G z`^{TAlm~CL@?b@K0bL=sknvZZgnzb3V1SeZjP7=X-^Mv`aLpLmTr~lF4As$tRl=w? zU9{JKN1ht3!vll2nZ31ApdBPhQ&nH^+*ci?=4PPVYYhJ@Z zNHO%in1CI!U#R~*ZufHH4|`vj^EJ5H!HkJ<(6!0}jtd-s#Y#q?8(j^nD@;n5Bx)yv+JnbbVr~~%_dJ~X*4V+0J26xbXMbYnD8}+uFB@J5em_yd&Ng8 z{bhhO<(7iB%3}QdI|Tz67b$t0}Ge!9lbkNz2q7A83yyOt1yq-h76k;(n>IS{F zaDZ8m$T8vHa-UyylRmUHg-ciD*@3_yjx{BVH#4@Q=14TQX9%-vj^&fi9N`A0xPZ2Q zngOF*_G40T!;F72~=-j=JjT3IL>-}1YTSYSD6vbfB|sZ6SoVD%Q=N zVMDfrI1!;{MXG=9GcWEzIDE_HoNqPDK|^^qR=cS-oNQPHQ}rwnUoC=;cN5{mCo53s z)PVkSOO6{XNdJ7li{~%sL#JCDxuIT7YnU@oadZxTHWp^gP6tvkZ9e^-Swyo1+)>co zot<~Cl;%!c{k!<1x%F(tz~Ovthx|1ODvBOgeSwA3d}|7KN^#M%U#J z@$kRfe8KM~bi!FF^z*MI1`)<^`IIVLo-`f#v&wL9PYt_JNfMk?PQvYt#l$8&7z2jC z5UEd+xaqnRto6xbuKG)X{iF-TDen`<)wn{-Uc1oVt5F=2h2xr8{D=OAcA&C47vk^4 zK^Dh+O(i)f!_CQ41!tSlzw4R&3m@pQ&2#W9zY#=MpEu=SScLX+hPcHJ;QZ|w_%hCu zKIYEb$`fPQ2nR1}`rs!m6b-_|A1zSjmMo1FUw}*ZNTZfy0!OekslLOm~xGiKkj(SJq<)w!XG$J%bd z9@!ZBFt>n+-L(Q?_jT;iH(sz+S=Ov&&>i<%t%XfZ9P>}|C~4*LQAsk#sd3R#_$tit zOhQHAh;2VzB`6MVF~4c$#W1`&?gh$XTS0Ns0pN?AglRuqVfM#ze$&caSf$X0T3(T` zHqjY=pZdpk)$f2&h{nUo7G#!V4E{Z(OIL=K!*m~8I&rN7NT38=A(B8luik<>3uk6d zehhogF$(Hj1K~@PEP4v&^e*RfT?5(t6edR5xu06tfBwPc-N6olvOp2sMA)PK=PbV&Og*dTG z5L@U0fxRU#7Ma8-i`|0NJs;>%mq?f%bRVrdS?<4sI|E#G9J4k~As+dBn53SFhYl6v z^*SFY6HJ42uJ8M!YLIUIJ&w-w=-PSfNX&SMSEOP7fwB%@`^<_uhSp1d>%4 z0WDX~vNMJ1LDMS=uD4s!f#;53b2JBq-pWx6?%qYr>d^JbT-=~l0fGC@l3BWx)T^$e zb8|Sq*!}fbIJAN8bTMRS%sPcP=FekZeas^~?mAEQ<2vF_)4`!Y0W8=Q%rEI9PaJ@# z`!9!8A+LBYXR_$Qyd;i8=z>2t1!CXZFiczHO}l@eN1uE(P%gB<^r2`-I@8CB2+KoO zvo-2njls1uQ$fHhkcv$H&1N512yF*!>FIl1#@tH_tWL$j;n_*FYpXGN93}<*XId~} zVgX&C{*u~HJ%+Oj)!@MdML6WaWuaRBkmSjQVGvVfkTcP;JJ`wLs+e11Je8Bb7 z3+c+P+w~s|3{f`c9$o+1AAioT;45>yxchr<(38K$h<)Qa7&6)eua>P~e8sA0+ooZ( z&TJ?18QG&^yhJL^AexUQq+o|IZ()EoT^)I7|z@1W8J=Fw`Ih_fLPK ze!oUA+3+*=@1I5k9KX=A3IW`b8-bgvgh*$~0zeOOw1}!E?Fj{xGpb?jxF;y}%b+Q_ zL2Pz7@T=v&6N$K1j^$X*e5pIjW0dFPfYWn$R7!Uu=ZkJmv;4TNCxq}g~zppDI(<^?+C5!kw%>#TR1<9cas z?pU4&a@@JsbQ^E9t@eP@`z|Q!_=97$MPTy36(DI&sl%j3__9b1j8v1^9d;+F=b>l_ zzVVMv9nmMX!<-W`F_Jc@@8h?h`ohyQUP4Y*MWM4uBGH_diMYfKZ+i#O6Cs0mWzKO% zVOa=G4_r(|WY!exXkm{kp1xjlw?av+Lr z_y!3MZtS_f7jVh#Go7HF&%S%Sf*Kh#W2+RGhrCjV-zx0z+Ehmz+7~V~duIr)fJ~-#jtlz#H;qm?JAu3zxz5gti3f!b)i``O8!NP0 z@n>=k``9rBOFrg9MaE@vy2}rWUB~$G7h-7G+)FshF^Yn9B{^nU1J?pR1=4r)(R@6P z=JqGz1cBo)d2bsmkoii!vFGT@>0D-S%{i)m^eElAnvf+cQ{bF;CVglm1lDJjC`YFv z`v+b#0@cev_g5|D{b*vXx<%>3&w6A$u?oy)5fJ%#g01wGqnq|6aGj$}{4m^ye{&t^ z?)xpQyofTG7`l+%p?UaND1eApeIWPb3hAjCBc%0sKF8imfvUeka3sSNB)!`Cw}k`^<0Q7qbCxA3>dn6_PcVi1)e?y8J~n^YVE=+ugj39=z7be<~&e zjRFlg_0x2SzbTKtV|VeN@eKI)cZhw|+D@BphTu-C!*KGw9#!@(f`<1eAb7_hY3+N1 zLc2rBY#k#AA6tS~!!_V;vkgYY@1xTt3hBH(wRG~oYw&QD46cx6X~dQcjHC-uX!0#I zx*-9hjoGLhtA!J>gfZNjNx zq{l=O&Dy6y$Air{uXGrzA_c&^(G5e7InezX|ENHlCEZeYoK2m%oD^Q=Jf}YhZu)GG zf%Ph&AiEOwB%a6OJHbRu_8K&H*#!?Z)7fs9N;I1t#9b>oFmhxKNSExvoeCdWi>n^=$$B|6!Psv& zvrwu*$te$>&6I?X*Wyt@WCIl18Dfv<8sHlX!GuyBlGxLN{mXWsoxnq)njg>cc&0RL zQw_n5B7!)OD%+r9_?#^%Ey4>mOS#;^4k+dv2x*C3WazCqmmBJXcR~>;F?~IV_7&4J zg8mq~{vqt!A_29kyKv;5A!|NE1tz_z0!6odB-^$C^iNL#;R)L?Rm+`wS6B=^wX^Y= zlmdEdH8N*ilt4Z)f_@591E;f!=(TM-8=z20bpxhBchfq$WxS2R7Xsw2m_f8YbHQw<2`#ne) zt%3t8$?!^nP`&oWXtc{3cuzOdCq8{tZT4pFy+N4sg@iyslRaR8JGKdlLc8v4@VLK# z)-2Sct+5wKTecLIt4Cqu9t%kHFrYbQwm9!nF>H_A!0bEIO5DwNfS+SF4fxJ=YeWUX z#zNFAJAE_ma;t`Ss(0CNEslre9mzapEa9-*Vldp}M0d5G#zc)s{=Je-gtl7{mEtYT z;rBUUe243JPBR2;p(YZ|v30sUtjzSLNI>rLL(I(RV?Z3DP!GlCVhQK;v#l% z9;tM=zj7^IwAg~it#X8VM!2E)(lhc}yOaqrQJ|&@7U&?W4{xtU09~Gs)ulynyXG&( z_<4f2*D&I7?u&)~!9NSN7bf@7j< z@zH8Su-Ogd!nS@2zilAC*&Y{L50Zv+cfe$9K3Iko(}~y4k{JhE$fGzufABysnzY=g z|K@uP%<9JFBaN(6-VM1aF}Zl>(YhG#n7)F6n<3q(d!x118w>fo6IA1 zDzC`UmqO@z-9~=6anEj#7gT(5C;D6T(G@!*>F4kDG^C`2Z8SD8S=SfM?lIkk`HyC! zo_s1w@5v`Rx$QJ6{S?QD(Wk{;ZZIv+4|-Op;H%6Uxcndh?`d9vnO;-j!;0Aqw*4hF zJ!$Mt%hfdJq8nIbO(w@a3uDH)mGB|)qIWN*(t6Nh7W;$GIN=ZH%Fp=(As{7#BJ_QF8g^D4fo$-T&MWJK*%cy897Yq z1JmJzfj*Z%QXmTcn_%EY*G@e> zS5l9c4b)Jsj@79;KqWiN&`GZv8u1hPU3(rrn~&1{6*r0f`x3C7B5Bs$GJ(HYlx00$ zKZdD2gXr?Ki0ll$%+5`l!TMJ;LdVx+=$W|@N-kw{nbJJd4;6{1(O8TVM9!+@R&AS%D zjordf{aA%On|Pm;sodkK{s~5f$}oKC?g*34ZG+BFrjVCvfbWG)vNM+!Gk(86avA4D zS{XSHH0H7JQO6q(=2%0R_91v#pTXL_w#E+*W$-w85q@n=fu@XgD3bmW`#MX|IO`-X zdmfDm>w__ZT7%xGI@Vk&CF-f(SbZ&>ci~1AqkO)DAZ^?nn){XGs0KV?3|Gvhn(P3v(DWzsZ9dZl zjaSI(gGpqlVTcOp-ozItkWL;4)V`w1_>JF&3#T~W=(h>*_WWMDBxNxu?Yu+8U#y~? zB6?WV8;=K<`m(ciPonLNT%K&kN?OR9&txg;VQS8Ca)jGg=PqNJhf78&U#*onDm@k7 z`;@|Fa|_rmtYc=kCzWp3y9v5o&p_+55V5pdNv%2lOvB?y=G6|d21(B;u;y_jR%#u> zWumkB+Z8^MZv712Mzu(2(OHJwDo4oO9uxYb@C2MXoCn!avcSGp!f)CSsPB7Gvz(DB zM15Ekf22BtwB9CisWOQwKQU!5mA}9P)$_^e;ZmpxDS@NnQTVmk1_Op(u#HDjxV-pU zunl|0w0M5Q=|M3}d0i3~zo10EDT}Om9)YoveEN2XfcJw&{Cz0|MPA+q*E5_4FglC` zg$dG!=9?kKYK*Au@j-bjC6JPx*$|tu8k^o1!|yIndSOo#tFN#X9<2e4|J)Ay%vsWo z!B{#c7hZ3@O^e)CveuJbXxQo%aQUP;-9J$r>SXSNevt?9@K0pceSSgKY>y@VRLbn) zxn?le|3uD;mVplEWk`B$h>o9JKtx8JzG%+E-P%uy?U_p`xc3Lg{fs1e!|FXI_ObFh8aO6S%uBCTNoqzoUq;95ZIu%{*K{iE{NBt@|ATNM&m5~>*$9cFEU01Em$+ z?d=7$iP%W2(`Ct-^@Y%%nh4v!ib2%-2+VOxM70r)2cz|j=t&5}F~RG^tMnZS9F#_p zQy=M0j@@!(<~gWWy3d%=>G*l%KXh2N75rTaaN2BhC~!YR{cRq?m1!4ozT#!-a)|Rx zy!FOu<0bTVzz!6+D}{FYYB+g1H(ylUB=h&Kr$-l9N`obVt2 z*};97)ANlzCS!*W{0iyUm0qxKdm1UL(8R~t`)Fop97flggF_!nE=#QAxCO7sx6_{V zrh}|mPn92gp#K^KRSl4Sv77WDw+C*XUI1r3cpwpchhBHfLa*{HNK>)`Cz~eRB7Ghu zPo!Yw^*W|w&>yTjCxM5=RGMU#!0fD#Lq~xVNM3JdcCGTK6Gm!aRJs!!qHa>%;^V|g z+YvlcmZ0}!Nh-Rzn{102;<(S;b9Zqi$CU}ke}6K_^zvlbZjuO-eo0}a!FzJAa}L}v zlwqAD?|{G(BX;ueE^=v|EQ!GTj77>qQ2wTE78I8Ya*HT2Dv?0baF&58<1e?`c5QGZOc`i`=Ax{4?f? zG;37OOmfWzzWcEODsCvi_4CevZEPgzYDlELA2pELY{3^l#(DK`lhJO;Pu3(=ffZV9 z1eeGfXgeRn<$=#ok?Rp0kF=HStx|%?Ejn1YBZGP=))9Vp2)}j_Fwv>z%nwU7eCJmM zM`QZw83jpr(!#l*#m)E;*&48_XR6s`uA6kKVh-Lo6-d;@?bxWln;4f6XDDygh3{*` ziMuO{C(YE*cDfK0Q*W4WS%llB2?Be1FL*bVk&)VO!x-xny{SNe(D`5 zTpA6o{B{!cN(>7I_OkZ9Ib8Q76MxtXu$#Nq!N0{bXl;5DP7K(HiV0jFYx5TDKPwE6 z0*%1#?pe~|Xn+d5G;S{E?ui{45V(d9bBx;Q)z>2^xS@wkRJlk!mT}Lhg*)*6<|zCz z_=D8Hxdngo7}nNZ4vOYW!`Zi~Fwv`uINIHyceu{q-@D|Cv$PmVoQ4Bw*x}Efy7fQ_tKjiH}=B+l` z6(azpBcbG7VVm#y2w{VeW~BPa(uXP$r*yLw*vkz?p>lm(wAZo^uc z$xQf+bL>-b(T2IaW}-8t3f#{wglpd8tW8`TJZunV+yZw|1JjTEut;Z=AN~UdGfH_6 z!^5GbuLX62ec{c&bhsrW)v%;*14{jmqVw>l@_pmD$fk@)iiXl4MFZ!#ucI;>BDBaz zNkb(OQCZot2~k#(jI!c9_k|>tgi;z5O$8{s6D@@;c+W@9X+}-tQY8%<xOVCK+ z5puYb4*N;r={1ufgso@0CD+iC_>zW?^8;;;d%ezT9yI-3L9N&K!=qa_h|$|!gkJH% z$>mA(QhY9G4{rynJbQTi`4qlW8-jQ;wf^puGdMUffU}x@(z0a_V1nFU$lmdpuCoq9 zrJp<5)Q5JUe>5H6RevT65>=qG`!cRhJwjz)s*;=TZIsb4BR}#N@gKfi0;|rU=dWzQeq#gTf)Qpdr&JziJbgu#Hh{wOY55@;N-{k zDCT2^T~l|FK*Iu{9=fo2cs^T`pU!lqyO75iOf($=;qA#2*rF*+FTaa}4Ug5J+-8)_ zG}^;%=Z~+SCNB=5mlKJUJ-8-Of>msLN~4!VK;)l%s^{BDD+cE9 zwI;ly8CEWMe83d^Ssjd)oCRKg%4znkJLtD-H!=J$4b#&q}4#avV1J6djqJ9Cl|Q5w0-i~m#bxM%@bvtA_TKVNHZ{$R zjs(poIyz4D_`nhJ?cY)M%=AJ!!Lu3z)}BL8Esl$tS}I7YXky0050L)~>0jII6?iUAaiaF`B(Ie3y-#HB7p8ga}UdUBJ3t z2hzM=o-HQaYwuoCpPy~P`Lxe~+J`H+WoUYm zKsq;}%CZEo-Y)^$mrVfWNt)a&C6$yqoF;zU%t(0N8N$XlGgAJ%`h8`Fa4oczYE>2B z+MVgBH8>v&yK2$u^)teTPp04VzS5o6rF66KTk=nC8Rb0g(Xi{FCs8Cby=5jkYVT71x1$Axe^$ zu3)~eSAppc*(A}G+Y?3RS%zEAe&GQ|iXCHIC_b5ATE)oCmNH8(w`u>YcfjTHaAiGYr`bp>?#b6 z%E6wPWn{cV5Q;jCIuT86mP(QgLdfwE zN?LcB<6F}K9LmnX)oa$m-~~Nwi;chNADpX~Rg(_!xHdN_T3 zD>XJ;0@X&wY_?D|I$YwObuIFEMr8(uz8FA`w!n03^@LLH>~1;D8OI+z%kmWE>qGi( zVwcx)uv=}zO5<-{MDJGcX}Ctq*aAEpJxtr86);MC?+w1tW=Q)d=cS%l?gZT+oEDL&E-6)`9W~>Z#n&K z+)3uCoI{<8Vp#J)h0OaVSKqf+i~1$S!4@H1kZDoEh5HjQ<1d3p$`8Z*;T72Bz8h`d ze&L1PkHIGU>FED05vIL;g+~L2$zh%!Hr2@z`32iJzT<3AmySc-DMB!GDG|rD z0<4LbL#=5hSa_x$JU(5+Q`V~d8=}iV7p7t2CVPM#QB*ldivB5_0K!9apw}z`Gd=zB zC%=Lyls;fQbq&e=m5RWh63lTjC!p*72ng{|hOF8?{Bw8-o)OIj#oHU{9XS(tl)oO$ z3&oKdO@K2-)3Mt0F8y%l4BYvXP5)kKBx8>o;K}iGkai*zwvq9~ti>8G`6knq(M4qB zuM>>7;8?LvDs;(ScU-ktynZYs5|=txlIDpDWZ_soJ<@rVTB>cw#EI82*Y`Dj>KKL3 z_3zNEGqx(+c7ibAU&pS0{UX6sV_Z;Da zpC^-^QVzHGJ_MhW5}+CPl8TC*hnS#?G@JNBS8XhAinV6NKRJ@kuBY++rO9}<|1;GT zJqw@9#>37}p)@e(Hj(@B8eOj?!h;iLU~%sne76&U6%r1xHoO`ZmX3n1O(!hLYoVS` zd8jlv6_*94;OOT;+-brCvO)W7SJq-?NT>_oi)5)}7vZS-h zmFlj#N;YV!LC)rI?#?Wa96t!lzq5fCIM&`H>UP2*wN{zU3bcQeB2-!wb>CD+X>fD#Gpa!E`2g<~dc>$5M{!<1loEC#^#+xzVxi{TrEg*XBQ%Fi^9u69ugFS1vK+VZ0pyjdXJLq_h%@t-vH!huESNI_)@ss7`OaYtuT zZ&l7Aopz1-wC=zoR-MpaeP7@+VUT_o+yd?FKyY{43ZB1;^jkOHqcuORnc=fWxU8Gc zB)q+k3+krRh51F~8}>n+79u;_83t6IQ=Qo|KLO**O&!d*8GIzI9M+0g?l2$V-G)quwO%XvcC7|K)WF{x^nr)B^H>l z95@J z&-Fg9h=RrLyVzly08^GKbHOBC{!33y!90Nl1eV>T=l;Qa6j{S8rSeQ% z!9iTpyaeJW5MngF0=7yClN5h5`g-jYOg(s=97}w_JSy)crQn2rJEigCCU3ZL$B$?Z zPa>cYLiYE@;NJ7fL`HTRzUMrJ?C(CfUbTo#>PTQ;H>A*?dm~BT0ckuTEQA#=wCJ2H zBM7YGI)Pt{1WsmMB!}zReg0>|-9u$z)2b!VH{rYmLlvY&^C6ncM9|}717JJU0N?Dau=|xII`wvvpUQrq z+V+llRpy0pXSPvg2}2ypILMAzYy)q-bF|Aba1xqVU{+JtA7~Y z21=5u*rb1lJuE6zzaDf^cIhBFG%X5xlWJN0C|NYQc#1=U2;*A11LyDdgup{0)aT1u za$iyl8@b*1PP-l~f5hP7e|zzjyea%vM1l9cNKl`?4ivBDfUaaS`rj31jciLGP52li z=Yyno+){{$m*#)Z1!A+~C|oz8v`X(M$~_+9=GA{mqT(Ltw+W&jIA_OqZxQ~cJ|{?c zp3J+lq8%hozGUz4Khr)Tvw8(}89MH8M%{MBjock39q*lV$M;qlxM$K%80W`*7N#3h z!JJGYbhn3iovx=P9INFf$-+iwDY{iX2~*u3P| z`OvpCDw+2md8p)%R_Yq49v=Y(&F5(QRz7?FI+rQUmcV5jADlNgmbso>$^88t2BX}L!9T(V zh=dE=nYo>|y=ruk_vhm84rYn)&|DolcsqRBtv=f|Z~7s4vn&N@R93 zra$MR@W!1q-~I?>m~kH7stNV#1Jm*7>?N?`!%iFv*g{UcR)QCoxqW58G-A5K9oA{A zAcqReFmE5?ywU9tH`v5V8#I!Z@FqAcw*g;`Nn@ZvFe!N(g>!AL()nI`bcVkSr!sG@MlpV*4P3fZ#qb#6fjsPEx&~G2g92w6)Z2Xp(r%J(mg(9+iV1%9j%LWoIJt0SpW+D$n!NJCl z2s6c`+tdYJeLHG z6Dx5BRFOo7bM%P81HAP%l*^8B{^H|PMj^R(2I;!dz4T%dcqtTiYc+>uazW7sy&eP`OoU^B3!6y^8Pii%l zUf)UB`5h$0cQYyKv!wkO+lfV67#w(SOgCxj!ShY6)P9^CJ{g+8cNMF`|2xH!?5rTn zK?CkR3}fc|&&ADLw`%ZRK7RbZ9xq0nhp>2s`Ym}}7H;V`a1r`NtlD0Y?X~(uO@1au zFG+^ab_&=MZjbIeqv6-gFz)vx5U-rRN4D)sBO;O?1 zss@rm@4%;1#iVJdix#r3cy7543d`uB*wh?G{o@^WyJraI9{J9TODLxNr-x{*po`wq z$-xc6hv?Ts)-dnfcKq==5oQ^uk>n) zp3+S0E1yx{xgz9szY!I#DTW!Ncb7l@wUTVL_n`Y?3-FKM8N6sanGAgsz?1D~n97aM z$-jm_U^diBCd!Yn0Y*T>Z`kAC;6f666zJzyIqa4qbs`(xP9LNu)6Eww$;w(;9Q}3* zcT^{l&F=Qt*;|jzYHl2FK#5YByJW>)%1F)cCR6_b;nitT*soGG@SB-^9BXaB^|K>S{}CxttN(JYQ{KlpXo~X-|S|Jo@tR)Q}T()rz3*S zU?~`D8wax-a-bt~7G0rNh>~}FIp23T5x!X`X!Q7dHP2C%guJ%LD3VUZ*EbV#Y$X;u z&%mP})1dp;HB7maMvUiM;K!)h@I9HqoGTNlfBGYO+EE*=rH)aHq6FsVohrhA>>{H=Yo!8jMdQ5Y|!e_)b498uS99ON49 zq9x$TEbW(Kz5Z6fy!;r9{j~t5R(X=1@lPTA#~E&}(!rQZPk@j-XV`a76Te;G10%uj zv9XQ7<()4`+o5&TSf@rX{b?V$D5{SUcQ)be`xYp>BLg=*i-Yg`{m48`jv==240PNX zhe}Fgs4G@Q%Y^btCR0wtUbCcry)<|z^nv0>X}p)Fh@lEg>1lyDXv$1QJIl#nOhd4? zcONWL0{r_x8RXYhlaFZ)Xc<4ApK#|6X;Zhwvj(y}v9ScAd*B>%+<9F6B|8t?_$e00 zEce5~)iRiVb~1+frc<)x4bl1+ilIu}cWKxZcCJ#aFOjK)rQEDY#zPllIJZM*PY~}= zg9prtdJ3yz84R|TCP5FQFu!{{{&V;Qdv2Vt_iKzkCwXEwh;Yx17;{ zej(+)Ux|o}JTyCPBd^UHY0l&~bXRvJME;$MhTQL;cC0qcn)#V*+igx_o+zQfz=Ndq zNb{q)y{+03wDFLcN5*TERAf+=%F^ka-2I=mCo6` z4%Su6LCC-T_}u>}NEBw!v-B8b>>p&-tyRM|oX6uku$X@_i3YTZ;hEvt=sTsEeeUVV zDnz=Gxap3#Ludz-s@oEy5lMb=xej<4hJzYk8;gQZLBc|oF>-RmOG!rrm#0o6Lc`%S z>dzoE`_Eqdv&%$q$cWrI}76E($LCyDs0Mo%_?x`u#L(^)aTViT9W2TR8@3=HcZ7s zCk{eNTNa*ulZW9O5*h!#3vgnLC#d?fn&`C-Lu6G9y>Vp(C)wrE{XZpOdFzDw)5({Z zbIUu>{J}ETdt)IRI$(ma0!8XRkdLtrLj1BKIV?Lf4o9~|qfcT6kvY5pa@*o@DC+`{ zuGy$`N*LAiUX!MYoU5(>F}hW30pB!tn7PcC+#M$iKMo7?x-G4+JhA{7Yo}UaeJ&p| zXBFn}nU2p4M?l~C7kQi=Opgv5;=j$2IA|q~y|u2?#-J54YNDXx-UF&ainxm01Fpvy zMwToesgtB%@I=lA)H1ur)=klYmxptSdR9G8XL2E=q=&PX^3UnZ>XY=Q`E-mLsHB6H zCTQ9-Mz2iShIbEj(TtSetbAS&v~Or89vlDCq`UphexE_&A=wFY#b$xXa}n}kgomf9 z+v)bN_PA|>5!atIrIpc}Q8arCs5=JY_4r!6SrrAgpDXBaY(7=q5{^UW+c9VIb)0)8 zodn*x582NH=|qmz>0^RZP z?$Y*P2HRiJ?B841xsS^+N03kTPesAYCEsz}*F-8gdy4+aP0L6>pR-ZCAO)ZWvEH(hwQ z!Vy%IOrYhVC-H6HfgV2RaMRnxD7Nyb;nlEGdf!nLd&Xjs4VVWF{mU_AZv&ogJBi+_ z#mK0`ccO852D|QkHZ7TXk!Gx4MqI2ZJ0Qp=Qx9mtc>5^4oC`5jZrF-*@F#2UGI^8mWxaabu!)+(^l|KOI!iYF39u>xW2e`BN;&8^iZa)#8{*}s26Gze2(s*$97!g>oD3*Hz9BeJ& ze*9EMhVzqm-D2_R_GET@b~>tN-y=F+ELv>+M5_{(bKaMe_;BYwc%ZNmKenA9Uzc#_ z&q;Q;`g#`Wb_aTBQ$JMRJ`Uyvw}|b`7|`7v&TLUFfCCRs;_2sE5OP!!9=-p{yi9yl&(7M~IuaQwCzA04bf zseV_%k%!W7{AWJXlpBT(DY^J}o+R~l3WSsw!|c)5iFnjyD%hXd2N9)!lhC z+Cd8aiwuZ&%NMFW)%F`BSleM#(xj? z?2?4@3U|@eH4T2Ax{OVu+IZPO5*!|-)2o51tlG4Gj^_|Y&!{BOj-O>{W0!@;b8p}y zX9--mmCKY{Dqy@N$Go-or;XfKwRuFDocbQeMk$Np)UsUM)qrF}q!+&YVF5!+rjhrB zpYRsP(o<57pt)nMWKz@zM%F0|cg^a+>k9F7?wsfBj5FZd4xx!)IUa&Ajzf6_9=r>udnV=LgE_gRq17E4IA7qvoqP0P+6cMI z^`EbAPQ`t}BK+dQ5QcwJq+aq~8Z&q11~~j=0Y-Mp(wyLU?Aa^D7a7aL)8Q_(<+gy% zyvzM2&CaJcrrm}Y&v}^BXazw|YV{v|Rzq;}6*yX}iQ7e1;u9}tw)3$Fy!dwpN{%>x*{4c827V|2|=joaEB+-k;m*Z@`2q+w#4IL4fVWk3?|%nNpa~dW_f`u7!^9Q zTO6(u)y8RLSUUu+x*Z^I47vWfyfGvnlY$r5yl`Fb8!9e#5Bly0!qg%qT6RPRf?nuA zEEs^wNp9E1u|&2gl(OXk)r8qE1@T9f=+@#NtfsgKoLihE_|s&7y#8{ka?pg(?X$41 zLl@Nl^98x7`MB=Jb@Icn0*eRsz()U8Y}#VN)83noWy8BTK4lzQ?0H1H7TAOi|-QDGn#@rY9$l(8YN#$k+dZ=trg)-@9ah%8nG`JZCu_xU~Yd zXGY=8&|J9MsfmMp7f@dQn=ZCm2{a4oq3Pl1)<2U*%MWsy>@l|0N*TfK@6TKu%$rPH!GD&hdcV>FN z4=Wd&(O=4=^ycJetfZL=tUEIeeB&BG@5~!g@%KF1=@-BjVNK+2E)X!TALV|o7o54S z1;Z!jptSTxB9t~6^ORT6=&4EgevvY|w2g<}4UPD3^$9e-&t=F0wCJU#4@|3#fHy-e zjjXkmLpv)cyj)vKpEP`6W@pZ&L1A7TCpm`}n>?fG?{2Z_5AsoO?S9yo^PGs6tJA9J zM&dvBFY)>T5*?7EXya=l4kqXSgzU_2ufAVhcSdBb_5 z$(U<)3+{MI)~iN~@uw<_z*w#u*sS2Ami!vhK2rnk?0OBCT2|p9UNY%;G?)LM&RhB* zAee`fo$-ic3f(EVim|yl0^#=`(7RwCuKjC3MO+WV!C$2ix>`UVn99MU3JKWySpfs8 zv_M5G0<1s`t4xUmqdO4ML~-Cx6B-4(?1_iT_f zsDMe8(d6n69aZUy50&V4D7+1C#KF+vI%Evj;${9X_i|Waoi`EbMx4gh|x+R*mrz9`;rx@b!O}S6hc74DE_dRL^m=U zL3qUgjBnnBYyAF_g%fKStGO%DHK~9&ZUZK3(ks#)TS>Dwa}G7*dh&u}b!}cyiCqiz z;m*Qopf#D>HE~R>D(OI++TBT{7LHQa4NLHH;tX=!H~~}QGRTa6?sKItk5@Vu)>~Km z!Q+}NJndJ5=l_Pm!|D5R+vrkMyN(?@Die5z_EA!v_OEu7*!A4h;r|z zlS3OOaooK*WPyn}m~31O5lsx$QcZnmP*VggRenN-Y<%OzZ%4^us7letVcHJNh( z_Z!Ke4mh?ar{pzrmW_`MD$ z4<}E9+rf`%j<_OI+kcCA9=-sU-`rsOh9TH6MU%SCse{ySbLsxPL8u)H!q#(V@zwAs z2-jyp=RA2hSFTylYnle9M@%8C@DzzBm#IZ@7Pu_kOy6dupvPb-m)%c5M|zfJcYGrz z7Uk^amz$YN4IzHt9TA*Mmw}RFEq>lGKp$5&3MudZ){(%57JX;&Dj;8 zpJ52&)813Lr6Iult)q{QWaDLpQeyuv0*LYs`12u-@K)86Os{t|?rSg0^Spy+z1)$0 zO9hE-GWf@_5JP48u(`2B>o8=yLuQLi1wL zyYVG{xnzUO6zb6Sbq*W*auJHEn9wJR(_mrKIWkqS9>Sa-Q++BApKnydkv|jbXErNA z*t4Thd#Mr*t`CL@hqqzZSUwYh={~3Dph#@Xg->YuZM?`7cs}k4T-#R{Yv{C820QJxzTum zT`rrAD}%LY-|;u(Ye_OZ8yATpmnxYx@=@%6Quz>^%%@iKRdB`Y7Ra}}iY_BJ;PT69 z&`>%7^){^qkD3|q*z^~(vFjMUDP@d79s7vg4GV)F=UC>v+!l!clZA`hjoAbrSzsk+ zL(j^eG(c}0+~3zuA#sdW9TtUDXA=ngun=a*S>nf|G00yfixz3J^}|bllVeUoFwa{8 zvhUjg@9}$_y44lOe*4m6qlTb1G70PEH<0OPq}bK&ImDRD#g*NtLOVAfSXeU)o~)t7}Quha0^(&Y@zqyKR?y*EE8FL8T#}fUgMYMiF5R7~g5SRN;@kfv@`XAg0Ys|_q zNZlQVIQO0NUsI~w=#63joIq*w0es5sZt3tGnz@>D_1;>J>3wT)lT|4B=2}dbEn9<9 z+BYD;_5i*c(MLU)&ZII?khHW047^ggzhz+gw8L~k+ALDPbQVlqrwX1N92O1TiLPHF z)O34+=#~$}cj^gx$fg$ZUsR$+!3P*RFod7v*F%v;*aBQLb^5;Q(;L-dM591GLNWX~qp8!{b# ztsjRI=jF3r%@Lq@u8jS?3gOL+YKHAl!N+^G>XkncQ2(+Sf4N*G!C#w5e}5$@s2U?7 zCErO+{Y$9yv|I{k!;1ITNehj9}keS-xJ;efsk_cgCBfg0piha7}9r1iC$Ak?INNR!3m!l3=`3 zw3fsx3FBn@ov`q53ei;7!`rsGkaNJC^Twy+-F!j=ow})u_e#`Un?fhbBYMAGn7RbJU4y9H`7s(HF@?A~9^ks7@pOss3`SKm23)Q!q>NFTV9;5pzPx>RM%M>uQtgXksw2cFLzFxpNG)+LAV4rQ(c7nNBU(h^774!hw%>~CUvfWidbGNOld1nk-I^4~y`(y&Hx_(|+PZmpIbnZ;#LI=fQtd zpHT8~G3++FgeLu6f)^GOu}Rv3rk-2|Ka48ixa2_)$Z=iHMpaU2B1Nv}PXKdn_A;OI zEbrj@$*kWZV$3m9nvMTs{X!h+t(m>#@4q~tlYA`vON7nVGGI5f(qsM&Si>4}88s8rP{?V^1f?s_x0eAM|$bW%)m)=__M%vN0@@nWx=G%1uWx>1rl?+UJc+pM7Ru>=%Jm zg~jm7-??p;UNHJ{ewt=c1a-JlY0G`d0m z$N<~CsD`e)nu#$d6liurDCmYuK&z7++n6_pf6yZx6Zdt&OG2@e?x)VvSCIAPUBp># zF*+Tr;jt~R8TV8j*dL#XEz|!(>yNAW$EX^m=7mx3SLX!{1_!`Set=!_J|6O)T_>s^ zm7#inFepfcf~T1#(u-o?QfG)`IoC1Oa2(Is|1uqTy^@#6by{A(Ta7wgmaFHM8Qo`R zM_!%1&w_ay4I>YL_|_2ecn1ldmO!O8%%=vbZWx`GP7ce>=lJ>M^yAlP>>k=e2c2~3 z>9}FqprwXBql#cYR|IZG24dHi^{_E=AFevEoLCphNiT8~N5asET^W1l4I>+vfFCU>R zH;M6ID^38>)wX!^xgP}IF2-ojbsUp4oD_*>k+-5(u-eiFeZ*98qh>oc%9+#0KN;MA zCIYfF)j|F3Nf4D<1XaHuP`R+JbkdPBvZyy3wD)&2r+l{2pV|YEqLPMkGFDI&Rm&Qb zrV)+yU1*mw3%a$_NKfZ^b{fZ5y>R&=BX(miY&QfkWZM%5OA(pqZECvPA{r*F^; zb`dDHFhCGgJ(sr6=5h$upP=Mx4F*BF+pF&`xAysg;g z;{tPxl;GX&vrN(-9XzF910ttW>8J6!P_beGoUBU4-@i{{MHJ^ln%GObrPn~uB`tg% zCsiL$Bw)|b0BI^V!M*=l>CBrOQA;C%zP@*twzwXkOVWm5)&ftuxO)*exoUvmSRIm`yi@V4XQYfYWJuu`Q7f9otWC3~hpL+fel7W|13DDbd6oX<*RhN`D!r z6X9>Ve7Cw*a!~(1ExRp)6UHy17qdRY1N#)vosr4h&b5Zx=(X&X1Ajr$ScQnR&Lj^W zrIX$!Gb-;;LQ|VYa9ztPYWLL{UG?5U;T%O)0ZLFd=RY#eMH$y{yu~0BIm}rH@ZyUr z*$~O=R3h>v5t%ZB9Vs{u ze@=D4thIq~(f147d3>9cIC$wSjK8(C#O4QVUF$#ZoBk> z%(kCFZu6U9H`*Z`Y0 zTR0Yj ze47ONUMwUoEvo!K{o44nDw7DlRgsZ<8|cSZsW|<51Nr816r?mWpubxhWF#ZOOfLe| zbh}_%v@+N|t0b4d)UyTp&nb^JqiVB!X@OojRZK5HZ&6V!_25Ib`8nnRmv6T6{lIp3 zBw^nw29#1q$-Y)q82r}5oHo|rd_c$0qg;fauOW(`)v}0ujSkj5vFAK^LF~QFw_u)i z8aRv$G2yaH;bmz&bgrudD-q6za&0NGwYWih<;!5hk~FaHYQf-O5tw(~9mhPL(rbsB z8N;z62pqQ)OCDvSQ^y||tkgt>C8lWpF@#DNiDIQOm;X7ugse4e!Q9Ok(c1Y2@PdDl zdXrT0`&ArVi4tQ!^d;cq;`?CT9fMbD8_;=T8CJX&293H-^6=$iG|#;WQBy8JT6`oO zYt+PrM&+dG`Cj0aP39XN7vj%7be?)oE=Jz1SbATfnpo)igZ*Z6HZWTTFI^Nu_mRCE zYrYaRZ0`w__g#fGo$Vz2!$G!Ko?}^PF626SA=u10%SOY%-boLz^xos>I&A3AcSK#WiQ6h@#*fnXu0U=Jub(OZPXyk!caw88i{a zzrMzc;Vm$*P8#1#b;G}JzLR^g!h-Z?^YOW!FC;cA!n3~hZ0JuOG4W|9GtC@G!0OBdi5Hc&B-0^H8HPxr2 zF-(n!hTp(-f#oPUS(b+X<2runkubRbApYEXi1U>!MOYL?jGejX`EG5PTo;2^JNF8X z8>VB+#e7DT%Y=5kPGQO-N?EQ=1l85I$U>JNbmi<$su%N`2OSEH)gxu*9? zkAyq@VAGHDO8ZI3=`M^C&qc2b(L~rj3u~TzB&!{#LZK^nhgS0-{fd)7=)b3=`0quw zPrQk9i#TvhR1qi^wI;pxrDSnsCMBTrU*TmoJ#Gf34M zN1Bmt3Hf4$wA98MjWZH(@uFFv_c{VI7I1sG8e7nklZB7&5}<2%7F+v*2x+!KUhEPG zkY+Hd?jHUQEuj)x4YWdE3O280Fj_mEeLC+Xc>B3Qve9ayo%V}v%HIvj_gdhyek5p} zGJsbm+=;fg3lsx|q2YEYajM^mX6GW%QpuC^%-MkQ<%Q5;t3fXO<8Wh=s6>6yPa7PyPNSO=bg(;eJdyJYF3`PQ@k>`MnpIb<@U}h|g*kiPPi8-X?2C|*WR%kX1hRPGex~*Es%|t zgBjcozTnhb9H>*H@4nm6xMHL;a6$Me18__+2^Y_jF%{=zgV>j&(!?R(3Xt;Pa z@pd>4ouh}~@5*O%r_(a5b8rLwaw(WwYX(W-eF#o#q4^v`%sZcUw2K#wi3>7)8vC&B5sk%&z3>!u^p_dQWi6!rbR>6Tp{C{8|ZDnO*rhvormn_ z;xRk2HaIZz3A~6@jCiM@*{Thw-r}#mnZsRMnb`e>^dP4Pq=cDUOGxcvW0?_dl}G zI0m1VxN@nKp_ohEKn)LaLQ8U#`lRZl77e zb=z){Vf;db?nu!KPn#fQTn9a!L818HeKPU$EC?Nr!0S^k;W^p!nEw7ey?I#=HauBN zmjw`LSzX2iMbE4MJ1z&?muaKa$^rIH;2GMbqm32HPO!l)lRnA5z{uZS0K}9)T;61w zp7@g5XV>DWWHmLYOC+b)Ux3}d!6;niPF5QjV@I$w#ruPF(wj-ZcQhaiHR`EppcLs^ zoDGR53PH2o9g+=0AofuQNqejV8r6$o9>*a0J5w8uJc))?vUcRefeSS3(*o-6xt<7V z57SByZdclp1-ElN(C8Dlr)!HQ{wwl{JIi&Qb`+w8S`RC#TuF*gTBCZK2dw)lM2-ZN zLujFReTu$0=#Lhn?D#8W_k?n6I3teXicuKO$J zZrLBe%fTryNmLgf$T^^QrUVSC9Kr7lf@sfQ_L|5qTJhEsPJb<;RucEgrs;&6UuL4~ z|0p^Sf2`g&jwhQ!zD7evgrZ1focl6DgHoX~QfU$mR78pFSwtzb2nkWiIQR8XLei8} zk`fI?LlK33=l3r>ujia|-Pis3yx*@&LA>KCEWWS`za4CXelAnvv71LL%3_IPtTXuO z31UIlOY*hB8Xl|t1J$N$cxEj>&bidcim07~l>_?Bt)N11KOl~iVxN$@v$=R|NjW?w z^Fez>4gSfhBCnEUpmm2aeDsfoaIH7g&sh&A`tKW$$GoLQKLN_$dElb|rjpsYw=raK zZ1tdm2892pAbUe1puy9SX603YOE5o}$V3xsJ8`%h;fh!o0V8gJPr37*W{)YA_$>x& zPAI}WrAiWZb1uwXHofh)qR2ZZPrxxY1ybZ)kp1Ni(aC8htHg!y+*?h2k<&>A zZT5q~D2tAtK47|TCM)pwK71a(44ut4sOxL)ZvW~yJG})!^sGCq*7YVo&ejkEj!VH8 zIsgx+%!Q<^EIQOFVY=W8H^aA0=4q56wfyeRSj((|fu?vA-F*>W2D-qdn`u~Rag!zC z$4S1T5vx&f5%+NXDwDO#!LBd6hR-;LJYC0Pn z5iK_FZw8!aR?@8wHDqe78B^7Ig;vCCnKp(A(>#A^On*9LVt=2&k(vguyRwO1Gf%^U zJwNE2UuMj&v^P*ZdY8yrmxD*472Gmwrm?>}>3bC);~H+4uxEBGV=Nd=-rcMsw@yVs zrBX3{I_*FFH76Ioo$un?dbdq>A z?eFKqgFDG|qVy~?yd;Sh-Hu_l_e`!qg*8O`X&%RUt;6V{NHFf`V(stifb!8jkR#(q z#mrCDY!lDoI*xm>alDpsKVm?BhbW`yt0?fk!B5|>Ny1Y(u2iQojm&Ju5?86i~hnHBELe@Z{RKSYdQ#FNG8Q$Wo80L@C) z!mh)~80%q;!B=0PZ`^4*7@G{f^C&LjSn~#l1);`-d%w*Nz@w=mSZo{*bHB)#8e17-8~;t5`hI|lj~d|4 zsX-8OL5B`Jo6PaJ55ixKQYuou8UjOeS?3fjTwFRCeg8gTE==_yTds2NaQ`zn7IhJW z4Of|JYtDuQ&6OM%c?-T7+7I9SpVM(IJ=}UI4@X|4;p4PfaF^rAryHlhocJ5W@5&bH zG}{(tU-}R9Uhk}#VsnYe`Ang$cPwd;#~G^1<;14(d%}eNN*eYl6+_-uQ=xB}^l0cH zqz;wfNreQ^6E`FG9mep`KR29lgXA*`8;SAb)5P?3UOC zAAe`V3(F=}t?VQ>%ZSjO_uX)7lN|KqF;ISA1A=baVxe^a{S+tBNNC=D-#HRyIwBv;(Rb17L^nM)eA8W+8l_vQ6 z%zPM}5QDYa{bYT(~Plkx{UE;RKFy z`&YB$;biNuC5jtrGvkM6K=ABHMs89NC`Hdku_RxZCCB}rMnX;cl^RjqlBMBUuJATb zirP6vL!kXiay~tm-F5C9z4@pcy%LjgTsoZo7yKJr)>ff*3WG_px5*QuGeqZbBY3wh zBD!xWz3%5uA8m-E?qlV2QMd%!wmOqtzkX4d-ou=iVVrq-B9I<@vz|z+-vxWp1ZnY{ zkLdJ!^6ZRGjp^sxuqHu;tP{D!oGw(vX)T9|%A*pTHhL2m9bON|0}f$%OCZhX{iBbU zn?b6mk=3v#|1_1hZeOnLGDwpbF7cNIM@ERm_1zePvVm$R%WQ z>_cKZ_?sN(^2Vd_FKLWKJY6yuD-?ccH zEr71RnJ`0`58u_M5Q)?X@UjVoP^BAUYiL(>Ej);>$J3(c z=u_n<+^+2!WafmzJU&4%-%!I?#_5x07Z+#?o5V}s(oI&{Hj}mYDD7z)VLd*|(U|b( zEZ%#L!e&-vqjD8nlOW7`yEW6F_Df*N>=(GKqKCS6MB>=U5c_VnDok2z0g|!nFiO}7 zE!{9ew+q3#Lv>YRkp-i(wF}2ia?*|x$y0N z3tho`!+MK$L8h!79(Z1jk@Awfy~bC;?dTTRtIxo`uFKSWb81bw*=pExC57HoAhK|cyl-gJbg@Z%S~YLqX>C8O`P+&J*O)1mU#Wn9%cqzMR!}|C_N>y9RnkZnJk<3YZ5Ke%LXWyT7^| zin|QL@aTmhx|3f7y62b@k%5iz!?nAc`AL(ga4b>kkaG#+K znG}_e4*90c*o!1E00ZMNxl9!mun!n=u=HrjZ0plo~ zzS0dwWxlZ`_wz~ff7%c{V>PL$EWyreCS+!MH=H;APUSWJkW6ni3|RaMct)4OF3|uO zX=&_xR)eQf#&K!ebBw#W7^Pw&YZhC_waS8SIkbSka@f-l+mxa;CwQPq*=z@I^F{oM!6ZF&9);*ki}>JZSR> zVJn7TlbZs8m}w`ANB1p(JH@pm@$nk&_mTq>TTeJKU`ea4Cc}``J!<9qoJfrDu>TJ~ z`LVGFB+q8Rv4sl2mwFN-SA|oL@_4v*ED+hL~tTWJ{tAC4!1qS>sJXf<7{nuL?2037lsD%~jZEIgvnJ)Po$|P!Ql8_+>Ed~wscf8<%$5)6IZMtDx&iO&X4+~D;Ag*(yn00POC8X1{4bZeJ;il< z#f=8aW@3H40-@`j=#;VBK*g^Sk@Qk}Y0q)y==WG$wRa6@dzI5uR*E=PumIzXuS4NO zHB$XYiyCw9&Ieg{XxH*1pb~5V+97g0JNGzHj5@(o$2j7csTit{E(GC6AyjB%IR>hD z!|kSX^p0XGRemmL`ZxX|kuCpC!N~}B3jU%s3x~<_DvqgeDigZiO0e^1USnOKn82j{ zZ>du0dF-9jPNeS2(`NYtnM+fY5zxhmFpqEJs9@u zTN4r(#@y0Kq>2CB=o>uBJaCpmXYK7QB0`Qb4E4r3LWVf zqMJe*;rP-*v@cR+B^SPBBJNHlb0@-3_U9R}(oSI?xJKhvyCi(kdDX;9s}AoxH8nMh zHpQOhe7t>pJf_2D6N!6L07v&b!?{9lgsx_?V74gMf0=}Ox*;h0$b#-@%Eksdp{;kbG=W$EB!lZaXm63D8DJF#Qq0Gt~T z05_q-m@Bptmrju-XI;E7bu0(frya+52Mf?s*~xzID==QX!HeuOwgwFySCV@*f~Mpr z(BWqnsAYT+smzce$Bu?W@43@NK`RjnCnv$=#%d;%Lge*R4P4MPlc3x{3$=>yybed>F$>>k!dcQe& z&L@bwUnD}5iZn}s$!p!&!so1juJl} zZa9ce*~;uGZFhXbTg|cQo$+tjdbna^z$Px8PUW)J!?N5J==@cbcj+dfTNd1=FNXWs zQ#;!sd5tq!d%lL~6Blyq<}cK^{1(d8%4Ncz) zr(2iMetuCHU44MN7ZayRy#plbcmhp(&AE@?CxTx+=Qm~zXqbIGn5WOBe}+wIflD*p zrt^T#lgOquL0sM|csF_DB}P+spN6{$L+s?dQG9XCgceAKqHg$MOizr(mZgHGDcN6X z+Tj64Uu+KiJTL?Ob*_-If3cW(>;NV`^Z~x6O>ilj>lq2mVodS^a9ARj)jY*;yekP_ z+xF$K&oP~SHF^S$6B%$^s|HgK%Hv3>1U@yCB0W#7@cAkY;Pv|xl>VnnW?!!)G5Zp0oMtV6 z8xlFtx$tgHUIXGhXFk(K+setI&UPp|&&_1F-EjA^TJV0>PBeC(pgAhO%qdj?Fx$2V zmK`lcb-7eH{lnYj*4B^oW{DUy<;;L?F57HwZGe0yWldYppJ5d{${=w-n|eN23tx3l z(AKN^+%7?k_DS9Vi)kGgrj?3G^Z4Pk;u?ChEeQ`&cS==-(Bbt)%-+V5DRt4D)4x}x=19M*O!MKzYFr=H$BtJ+6>DC)iz|8_@ zLR#?b$rfT^Cjp0Q^k7j8mu2bWF((en=R$_FL21 zaTQ#$PXHg^DWy${aVVF=$19PR${992#sw(2KbelSe?C?PC zZHADyb3b-CI>0KiWhSQW^T0A895hF*IOb6hU02)>hf-eR2U{2Leq%w02L|c6xMmnG zGr>vrkC`V6dPs4PIB-@nHhFnBz4!4lUHmDSW0cN?DteJwu_%%(zTv?fo+D(cv?7^) z-)cZB)*gi4;wQkfr5Udb)S+B|B{gl9hjmwlIEHg4m6AUX^l=Kz>=b|mcXd2JU`G{o zE<%-14vF(RNw%aUVNK^_Hd5dWS$k+B3cVLa#eJtS)_f_qSLlQkt~c=3xEM4B#psS> zOX)o;L*gax0)0a@(7A6KIUxFnktgeDkJTQ05j~IW^38(a`V#!@c z@Hb5$zs+xwkSUIsH}^8?EpMj>|9&C!wqGD>2Y2Jq{+HancLwT@?2R({v!87wv;jrxjo*zL^oIlEOg4>-4ng zDm1nX1ShK;8iXYfVlk!q^_Eb;+oH_ZHTJmqLp2j%_!4HcyU-KT!n}~{tMOq%A~C<2 zL~;^p$y)JoP~3N(kv}$0e;fa!KYOxp&jwSl=6xnV3J)+9j&A7f#O*I@{*gL%nDL@V z;c!qf9$TA9jy&cw9a^D`Sr=!b(zPUV@Si6*CG8@Mm5OowoM&|9>^^e3c`1zu5QE;? z*YR+lJzid_OB)7dVbdosd~tRb6kc4-l<7KFonEMjzs@UCwe3&Hiy7auo%Ei};P#c>^r=NJO-y}5T{|~&zMdYo zQYeO*r0j^fpR_P;ixrAHZ^h#CA?)IkILKW15pAQ*YXt6?k*^y&(fR2HVE%Et;tS)9 zv;^08|LaL~_LxFkdp=`SD@Sv3UXuw+uH)p>R^6!HO>N)#Kw!Nxl$*(zMEzNaPeeFh z^FGd-@rjR_#pPT4{FZaw|zFX|R8&pQhiU6Vqm z1~;;1Babe1lf(=`U0mzD5A;PcQTf0{M)JEEv~Q`vHRdf|4hc$0fFKvHpxPBgMKMKHu<&z-keG0Cc*+*Z! zK7jmdhNw+L5?i#I^Q3+2g$0w8@tL?1^m0zGpNmAmL3lMr9`Ar9$JRiUOCRpMwF|!T z9HD1)KU{Z-NA1>R@+WXASiH2v{Z4wg!?Bx*E>nc)izYCWT>@mjJz2y5A3k!IGc8Cm zN1OOmH1^9S$hi`B24>RDv%k{Gzn;*9fMVJbcLVmuO~rSME)%0+J}}w81lq(1#}F^C z(Gi=3^I{j(h`I|ydgy67)8htnO!z1aK2;-6An1>#?nc+(ANOI73$FG8{ADyBdVFYXlLJtZxZ&y znyAO{$5)B0w#=cmp)=w4k#bPvTsG}h6OfaYN9fTGDw`8Q`hQJkxF;Ah)%L*HWFOqN zxB+OkAkX-ABz$NLrz!S-@!drO=%VjQHgdbFHPI&M!sBnbV3Rp%Y|YcnV!LH5>N2IYUduS7vMZ4)*=UlXyX` z4YzZdA#2e#O3n4**~eDmysd$;ygwN}sLf(N1g*m|F>bl?cM2w)^}>1K4s7W>3@0>EuVp?laX&>>SLcyQwsslN?N8|Tq*PdZOdB$l(m5y6R2bWF6EiJu5t|5O6#iogyf=a{ufzcz zZ%^j^>3@zwM^mV$moeO#I*%5ObuuSDT!7EA8N?*eiP4)rjVJUi$|OxUp1V6_=*LiL zh))j3Ooa?+i4{k3y&U$gm;@@~SDBIbX3&^_2e`roxpMb3qp`G)_FCS7#M8y}gk1w{ zzZA{bMMa=f;dipCtqih`l+x08+;1cQ@hTQZ;J;N1zer5vI|nh#-;nhUyUEMOEbxxzI-kA+ z5F^Fyq4wF3-GvWHwX_s9DCPP^LpSKK#d`8(X&ntqQUKwid@P;cgpmrvL`Ov&)n~58 zYt|Yt&+jBw1cadLY(-c(Ycp>8R)Y@1uQ1n+p;;j3mr~#o`k`}5G5nUJh<+RsXumtnuRK${uS1< zVJdzhdr|lMGxlhC3ijnU!PtjG?7ve}p~vAKDbBIQ(|YOjTXHfDIK3U8@NY&}&1~ZC z+eYl6d7{&P zZC*ibEiqoZ4psVk=+D0cHLcf_co#(&uo=(7{ih>2=h;r&scsG;r8~HL?PFws@}bFV zesb-o0j^pZ5BdtVixQV(F*|%Fkbb+kFf8c_tjoO$uq>!gplgMKr13M3* zwDCjRt3;CV=n{T4eM1Icic{w6&~3rM#}uM%S&KD0pMVsEm4$*5SFl^yRal;7dFG^wt>Hu+1bls1W|BchOqrCdWoI zBOP7qKu&uh?Mc>P6AonKU-<)6Atw(tGxkzlUmbRMZaMW13xh9fI37^-CnBa53Da%j z=nT$9PVUFRFL_&>dT|c*lk>tRe{a@UrVd}~MAD@#1TPw&!)L`;OmgnkaC{aQ$~U*Q z#^(77IK8Qs`aBzFrv|5kg-j$oan#38v27?=nT7@<3>kiB1G~Ab|L%zZoL%2UE3lb( z7-vGH%St#Y97R%p<-!iLWhgZFK0feTgRlBTV9$DPgJr(%u z{}im;G~iJ4RXAPIiC^;z$et2On$uy3Dzzfm+|T7Om7bz});d_cJPGz~F{GEZev{m| zO1!+r5a5srbD`xGbAR^)9ozT;ip*!xhq^gL`r0K}@u`qiU3~^0`Me-&gyKQ5VK%01 zIfLyb$rvM}Mc7M^=#MqK(4m3L&pn=p3T@|TjD|mL*G;DiezkP!CpR>(vqG=yoSyx; zJTZv6h3B@OWH$?sFpmxQLvj8rhRlz`Kgz3sx&4ya6vUAHF;y!5>^9-MW(lXfN?`Jp z2KFiEK205sfGYhEn2>$Lc*nO=2}T{hXkEb3BdIuAU;-WEl1#X~HpdRVj$_-8q1b_0 zIB9S>x?Ihq10e!Tvh)I+a94pBb47?~ZYsW1(}y~~KUD2<6n)^;N%yWeNgwz>!!2*V zQMvO;(31Uyr2Q75Iqw?ipL@$VzXAhZ!4DvhuY^*crF8wU0xZgY2aCEA$nmh<;Ipd~ zzuOr?)O~px;Jcib$(#Yrr!7=QV>-8U52aG$dZc=;Eb3_c63Zuhq1D=xZp~py(s>n_ zwJ05b){fKJMrYB$>Kf+~J&bZfip;8LmMlAUf?6B)63sepUTZ0VqHIfYZOSI_j}FI@ zRc7#Pg7Z$2Y!Ip&2Io{cSpHx!d2!+aN{^o-3!i!7i>fIolYbmn=<}2E7a1r@6-c60 z1{HK{V4B~q2mZP_)UuSpXWs1qoj#LV!SCV~>}2&> z_@z}8+dbCP1D6)#!lr|)(zF3;^CSuL*Bk>!Yfs!sc460cKicRw6;^LuO!#XGAtv-G z{nm9BW(!oJj5p_q-?|Paa{D0s$q{h5W`NHHrHS+Tcv>73LXQ;rutR@U;i~R@xT+rk z!FqGxVb~p9@o^LUX;T8;-C(dk*Z{W={xUf)Q%66TrV`Ubwy=IU4yN_RlNCN==y&}T zSx~>2%h8m;I(@FUVpvaF>eS)>s450XJHWE#3z(_L8Q4<#$K+baJ1EN0#O$Hh#PD$$ z41Lfi8y36+xv2m@ZkWOBcmd)o%?~B>JmBayDZKTvg{;ZF%gyizhpxOJ_N6Z1BP%V?h9nmW*qa@Fy)k9$vPZjEEE*UN!ci#bXU%c1}24)|Q;k7nsBq3iE) z?mzMX4eIZ3`PmihwmT2lg~@4b)wc#BFf2`K3UiuEKfA;OQ7U!16<YiacNiB< z%)`lTUc})25Z%8m9NrHfCoK-mRDP=kyna?p1k7Y{uDTZQjKhB@DpL;?@pItSPFK2* z`Y<#7XH(a(Mrgl!0mdF(r|Rc>jjyCnGRdy2fX3C|$hXj?kjz`gT%6)b-rDNH`}8Cn zt8ZWz|9xLm+E!arsAYk9O@wv5$AED1J(8CF5wA>7gsn!d^!pff?t?7CaMsf^^op|$dAXiPN4cGlgV_(9Wm&<*wmgHz@h+yn`5d`3w+7~T zKBP7B8J{E+cByZNzue3e1x9 zBo}Yn)No=6Q?bf0XgRVDi_UDsC5;w%=%gdzy{n^_Z%o6KVgTdmu^^Xe59ueD5|iDc zG{rie2<1(%$$~*N(K3eah&+$%%Zp_1hX$N$Yfq*>k7InbH1X|LV|tMPB&yo-)9Hbn zYv#2lzK#_@?Zb}P-am=gFDhypv-&BCp0=2~BifD|G|z%%S3UFJ6J2umvpdHqoQet- z3jn(lAUI(%+!Kta7oDp?@%nf)^kfYGu+ zwzV&izPX!#e8X;db>(!^ZK;LO6Yz$7+1pAq%Ze%gISKglob&blOvAnL*-%&f20R(c zw3jTQdoQFjUe6opweB&NPwghVQmB!f9M-2cn~JH?$_*grcZK;34UAv53O?i*8`p!j z6CvqRvP6-a4OhL#ClJl-y)A<{JrfTe7UtRu54Y~+0CqSTn%Sx*aI4`v}Zm{6@)vc>-ZI#z^|@!)!TB(8~` zo5Jm=V@2R!)F~!Bnt_w^4#L%C9JgogPME2)7AzLL#5b{Cq-gRd$lJ*AD)MER=?mOY zW9CU5;BCMULI23Dxl=J@jstxB*~H$sbqx$=US#LEg^=9q7Vy1V1h2Kcql=uDU}K;z zS>|m9z0SAEkMNH*Wyg$B{@GKQIFmpIrgYO>M=M;`l8?(aO%SPKdEV2na^&4QN9HP* zS3Q4En|>LcpfO6iyqB_##B_u~?lEB|$^A1qxp@WGdsK!c#a@WbW{_s1!ntgYV7E*s zHTh@BdEbAKZ&RyjSalXuz7v9)Ky-=q)MGg4slOjlNk>ib( zeg;jt~W+vTu^f1WixB}mf$-G~W zPom3q1LpH`U(6en<$M!LpgnQC=GO5-qAmM?>&*P5#)J>u_J$y*{v>4`2Ds~%82Vcj zlGNFiG!J{2sy}}8czQq4*Aa)4i5nnmvLuM~mNJ`nRDif$3YL9Tru!?zOnwYaa%13g8eP-3z> z22^IlXV<5A{l=r}bRP$JHn#@^c88O}Ol5A*a1jK;lj$sjn^fv*B_@{~2a$^^m_u5z zY)*Mik-!W(>EJmCb}i>J@#mqN^TAvdlmMA||KS#n5x4AsBG{`MV%Yp&)PGF|<2P(i zgJ-S5q9sb$=t*Edpnksl^ulS@jVg+DAXUd(G56>N7Fd+Cqc77oie&MvwoYPW5OyD?n}% z-p(itY>y}BKC46G{TCpVs!xj|MOdHWDc~zxMin;c(bDtIc;svn-cWBM-BqpVk>5i! z9E>5h#sa1#MX_s^9>PO2zM8xmd=Db8_mhA zPZoGlT+H;pt~|`H=k9i#+z4F}iseQ+s5i6?MV_XSw1STi^-T+A);MwbcSo|{hGTgL z4^s_CZuTtQ0?X?n=z5zZ@>=#gZHzoaBAs?(!F4T&t5D|6n0^V4##gad`F!Zig&E|6 z@nn#~li>Q*jp6&^jIQ5QfO0#6&k0#L@P0B*jCs;%{!Dn;ScOHCbeXxa&!I3`0dYW@ z9N)PLy~MV2d59|3Ba7p62dff>sh}_Br&N#qcu3`@gtML#8ffdOMXz!Ddzsl>c2jv9 z^)tInM}*fx!h=y7fRgYpzyph(G}7Th1=hFoDfwnmjHRO8;AUe2FXJNMR_#;DclavN z;G-~bug193Hw-T=G@zL!XTY#HhrHepf_xG!RII}TqFcT2VNx=joV^`h2B+dVMv^Hh3Bt%!#E!1z?DSVvWP6Pv+`D=mTx=3Z(t+vVw!xeX$~eafw_@7xCGTQmto`Qb`) zFhIdYyqj;s+Id_>Yo9^#Y9Iu>zuD64k?q)a{~VE@B!#}q%274s3KUgU5ChpDx?ME` z8}qfvel0sZRuN9ZE{2nSeM!_lu?O0A*U_w-K!l@`aPQ|VE(iUOI<^X<`7aMB&iKp} z%$vgWDkKo2l}G4~$+u049MWmdRn7&+@fBzOmrkKDi*D!Kflk}b!}yIY^lecF$M>0o z(eb^YyhoS%iC?Cg4^-*#$QcNY73`nza`Y*SWBC_8BjF>P$kF#(q4;SZHuyXup9^P^ z=+~)K=4c+&eW)P&-CVi7Sqi*S$i?}kHgL=8J;_g72**cGunD_dxQwR?>g8S}=Y?!& zeldfW>QzyR+dIxa-oi+BnGip5VK{W-Dtx@W4z!Hp;Gb|EB{z0qadtDwo_>zGBqW6y zN(ChFOQwmxQZU~26UVctOt(h>`d>LocDUN3e7G#~f`!=2wn-#OX)e~*O#_3xToCu= z!v}q)nD%fQ#@9A7s$BlUt?dZ)$>n+t#vAG9ttL2KE(|(phsl8{H)ywz9tLl|hSxeb zz*x`~OucxWW9moXpB6DxPIJND8Bz2`g%N>Azsb@2o9JhQqulO-;|0dI(@>#n)$Wcg z{q~KIi4mBIjY2OtKI&7tq|6cY6L(U{WLv7yJ3{~KkAURC6YS3+HP~md84UkhLGFg= zVoFINcgFY+wM9PBquvE<^0jC%-~NwEn@z&<)Fp7xvj-)$WKpm&3JTWv5cL%Y=*&Bv z^s@Ra*gL9Aw}daD!bQ&X&FCe9RpnIvRjje}A59E&RblT;;-JpI7xSwfa>2C zIPDw3Qng58y2p!k7fqmchD|tmIGx#+nF7ZjamvW(XAs7eQ8&p?uq-7EJN6{u;QM`O z=O7PKM*ralGZnV?EDMfN=a}6y)!3@vbI^n2V^!37bbOSI9f$aM2WGs)q^NY#ue#i% zSMp1IW>~`*q`oAl$xX^~jKR?7%Q&jVGT!j5 zr||4WAF96@rIkk`;m<-_Od8gJbu)`tU+4M6%3A<$MEQ{L^r?_~>IV2cNkB)f2P9cp znshcfk-Vvf_@H1J$0&JEL)LQlsbNo<$|VZ zd(5!BI*Yk{ErV{Wcng|h^KmYB_r&LZg7T$AgWlu{dTB40Au_*D6}58M^;-+TW@8BS zYziZzM`qCKyj$c&Z82ReXbIi*%b~3z6TAw=z+{^)FQ$fj{+aFMGq-zG(<`V^-|Yy| zCo^F?=i*r*A`UVQEXXWcfX`ownhxAwi{>l8L-&dtrsUlkP#CHtUWGN}x$0^(-Y>>w zDjY~&LNv+tjYUB{HyZTyKk|V86y~NE!^nR{?CN<@q%Y<+t2yhC$r5oHto`+t{JhKc z|9T&j$zGDMdRr;%mAFTAX4Jz-`XcbACrQTRJZ!xAgq+h%0B-{W;D4_U;U}wEiNl+T zyJ->$-5L#>=Rcr^^8%>V?-bBIUruX^oUmM6o7+Eh)8~#w(6#vuvQN~=)_@mecl`yU z-nwKudH!A$-damjRZH*yyMR3ExI@C#%kXVi8j5kboUyE1X!x<0NcJUTi$^{!mph8% zdpbbUe=f(?Q3i<;Mby*_!)1HSY44jjw03rajZ&^`qm@08Y8=G(L-921!D||2>WPnh z9dTi=1-Ru);qqZKOexw&PyE&*SmuNGwuh10tL5xw&(GxEvwP4vivVBZL6h-E!zL2B zF^q-L^O~d89n8u?KA>L(xbKr}jW~CXalt=S@3D+Yk=}gf-NG`H%aS7|K4aIJDa*KU7Ek8A`P&?`MJg9`jttz zz;YV~D7ljvUvJ?2*i&@u+jSkLK3?;WMTjA9HA-dYP27ep=e`c2CZ9bX~XI}PFqt;5$ z9#y0gC#%SVNJ_r{+hqDOej$k3|DvWQFc!C_E1dWM`0ngdtH_CUZ3Ih1uSB|B8~;g?q>=eqZ&H~0?|SA8xo zu*H=%ZJ)_Z*gPT4SE?c4tQu`SGXp+s|7T($`T&zFeiFk3QE;=WM(Gol)X1-%xhd=b zNutXz>Yx(&s{51_y{)6))DFU~qcMzK!A_I6220@yltaMswXi#n%hLu7k{x|Mc;DRt zJ2Nh#v^PJvA4-P7!V0=eXpkNo4#77a6V&e36ILMd56RiFki6}PC&Ak~p~!6!Z1#!9 zm&W^O`Eea`uKokfKlPSO<8oBmrsr5W>Ag_-w~@$loQNN5c5s}xB(SM%pnf0E;u6&f ztetR%lIl@X(XCwp3GTb4Tq9QwJ+-g@q^-+Eq;o4ERJFWe%)bH{wU)H`9iww^lKV3$&~fUx`SCm z6*O2qi{XVH#*9i)-sScJEHRLW%}=+`QdMQn%W)gqFHNWFd}c7uy@M2#KPGX-W5lQa z0aI2SLpp+GfxlD%)~)x%9p4+Mw0kZYTO|c=W-FrDiN%<3W)^k_)PrwbC^(IA`+bKq zC?qrkPV1+M0!>)hyS7;UMmFGxTZ<`?9WEJ{6J;iDY+$Av^a`FC_^AH~80q3G# zG0ScC(%#9Q__0I)AC{G3>l6)B7t_mh{UR3nKRRMUIp+@9E@b+8kuqp^*J1ZF6L4M> z1jma%!JX@kIB!0s-6nw~Z%+WeDp5hF6ixc+Z#=kOT0%{%D{0oX3nohzZN?^*|Dg3& z0r;NSO#_2++1HOFu)@rQdrl~=>s7;)6%p{y@+v7(pM+N#9n6%?C-dA6Vl4el(wpC7 z(t!~&wCg=J0DGwXdI2Yg@4@*$1+dWUD(wlb{R;sL=bGOI)*iy4&Z6& zS{N@^q6xNRtftl?SfeToqj{MicwZU3)fIRtTR%{fPHtXOJ4SnB%uLB6JJ`7}96Y&m zpSNr%?92E<0_W$UjHdy9C<*5>Sb?md+JAWE*a-a`x{3~l{vsP`7p*Yeij7nnTbZr& zoWBbGahZu`JPT~9R5WdDe@D{N9~0}w5V$RGLk84VTi^TPmLsYbk#6YVu_=v}7B- zwfPl^yB-1WvzO!V*A`^(Z!^t|JB0k#A7k@w9TelKo7xYjqE%x)`h5DvEY20AR=ZE2 zbpywe_&tqYd9t1f)OTVmm@afEUk_*bM`@PF1j9G&ByJI1f|kw_=pdd9CJPkk?01Dk z{=###+gM4xpC@7SnlpGi;2usZ7vl}qUZp>zDrwRlZWf=<$D8PNgW=trBG$6#e+->> zAXaY}hACM^HX(^bl(fWm-ba)~qV-EsQZz(LJ1NSn7^_THE=Y5~&zORdTzohEDybWc zCAQxr>5@lU`0b|;PL}>jj(#vCQ&Pv_QJd?G?th=)^z@^oNIr#C7iq$|3psW@?>qZr zqdF~pC&qP7cTlf$!tilvI<`z(2)xK|bZ_-Cx@-SkcKa+7l>RS(tY(GGj=WStuXtJ9 z!Q7z<9vV=!wSX8!wK4OiFTuH{In2m&6SBg)3f=g(&`tC?9X;AiJ?Hw)4U5srXcC+biUh+Xag^-5v-2SPKH=ldsWc#liYwR%GozlxD1@rK7mkLB#_28s|Dd>JQpHxXcf})V| zf~(r44CObx{ z_K&Gd@X;{r{ab)?-)(S%-7k8j!i_bM^nevrNiQ8vAvtSogz*P}c< zv9Oao9WMq3wlBb?yp`4XWJN31Ung9*4=Z(9BI#p7^~?66i02k;>0bDQjyV=Vrs%WaSlZgH_rLX*Yn5l0@h#({$1_JERRyLOLi&#zXEME=RD{AnQ zV<4Nge+|5OF%MGGtVsUNsZ>&83;w}$;-DG8Fsv_pJkUzEs9wj8D!U9__NA-UmQ21Vg{+LVX$GuOXsejG}>W>{eV6g&K^YsUG@*F(za zT#jG93C}Iq!g)d+QO?+qHdGjqr=NEb`@%)|-`HVBEIJC#C0Yo4cCUbkF{3D=+oC>$!Ht|ao!m_ z&HZG1s4wf}phpfFnj%sQc%oJk3Lj${Xc|O?3m*C;D?cjE! zpMA`|w|*b{0Y6QI>2Q1`TIk(C!%$b|hGiOwR!tzIDvJo#h=b9D<@n-_Hgw0f;l3ep zvgx-N%$d0kXSIK(1~m=5&$AloKE)|qzDvUF)cXP)({3kG^}eR)=0H5hjV?f!z>QGf;m!Fa(s8~|BBsAnf~t!QZaWddF|hZ+j2<1@5SWD&?5c#~`zI1x+f8rKeK5$ZV4dX56}nnKmT>oEw8-xoHzj>dQx=k`++Va2jvl zisgvCB}Cb@i=?g3Am2;RlO=X0=%tnodwK?m$;&j>LqPq7w?f>@yC7QR zLnd3C#YZ;BNld>LD^t6aZl?F)MnVfS+_D(qO4DxhU{XUK1P*B9=E50pp`FKdVUsW~ZUHT~(F1*PYxFaY#gOz?5QGNe4do0P zt8x%NNGef&fwVyO*kQQ6Z6aDq#)E{iA6@=h6DMbIrx(|+%Rdt?CS z4nH6{#&6NtHV4WVwA0t?ML|o6LT%#f#ex|wEcPt%6X~dmzU4cb(J<zGc!$4m$tI%mDhfIa^}wW13A>g)rZw^HTpp^JJtlJ)Mcx%MH>eG4`n48c z`x{`zzZXn+Wk2IJ?F6usZ$ngQ4Buh17-a1eBHxZ@5Zm*yxV?*W)Hf@`@G>4PZ`hAL z-W;E@{s0zg6yx#cO=!Sza{o^I$tngp;CQ$H@V|I(sEUynh{{`1p7KON5=+FerH@(aL4zR_B^nWxka}O<) zF(kQqX+$`v1UH>Ah6b0NWbIg_ssAC4X|hWm%#GC0`m8-&viBCvofbgqytmNhb2Lfs z+Z>E7-3Jq<2N3%^#vuH2J*hH1&wn~+kk}ebrk~~j=>D)G2@*4DmRl!z#6LzLv4BXs z4zf$69qGD@o+vE$f*36R4%>881p{f%=mcvgJYahOD!<-=@y|DcxMw^SHP^#}Np*C8 z_A}a>e+6ebEXPSS7;@|cFuyb&7d@yY3P&EJl}$4HFzh_O|4@pf^Hx%sLmao^`WSqj zs*KkIZ}VT?HK*lsuG3t1gl*S)h{tPjY}+2q?Zf`k*z?kYd(&5-#J(oN%aoukLai7z zG|ZoIT^n_DIL7a9G$ITs!nYBv21dzsrKPPrs2_CR4Fzy8|_K zi3JgEzW7iqf>f8@U_Wx+?18mGXkFey&Mf-_=67#mY&6F&JMfDCWpy*TWR#Ac%X5g^ zpaaK$eN5MV`A4OMCUbw|csiqUC!KLb#BAm6K6324HT*jIh}tyGL-BP4VnkFx=vN{N zU9Csazex}p`iPvJDFJ`Pdg;2=L#*D}U$nz^14NvAN|sj4MyJqoxW@P$s2vMN*9#wL zq<9zFrPezlOS7h`?xd7`p2TL-J>T-u8vFF@q5XKluV|c2qI*;hrrT0gg~^Acb{> zL3G8jASjKn!(Uv^E3TrLtQ**Z3Z^ZzTI4tVBV&weF8QojLmQ4n>Z9ddDbn^*7iT_N zkCsbL0B6NMg7+A`^pPB2p zKvW11KHrPV(ox_bZOxwlc?^2fOISLjMzyE$X!zA&YI@GWHMQV<02m1_h zwrIvj6w@!Ge`7>)^o^(d6n9 zH&A=q2%X=5ux=)I=#aWSQzUps;!pMwnRhopT=OxP-`Y#H{nnLkL&04 zq57sP_-v~XS?j_1zjp;-lD7z+*&+mc`B%uiA37UuQrhX|luwv3% zvgWojmNux6q9;}4a^hpEE!cy*#4GUG;8mvkvNPPWoR6z#>}3NJoj5n1E8G$Gr<GtgTJ+LTvzQj28W3= zf8TMuAGP~b(VyG%oViVB{3{~+F6L2(7#sNY{x0o)cpW}Z^2Xi*f1-x7ahwmA1vVT{ z2932aYoRj9Y26R$K1npqs*GLqYdik(kca61HlWbi^^h>WjON#upg1YQmoWh9JbTj2wNlkR#&% zb%1}~Wwf$1~&(wsy{`o1DJUm1^r2UA>t&ikn zh@n{kPs{9pdk>yEt|OSA8;iF0G{}R+4943|1*7oG?565)+-kK6vPJc<`+gmLyZaYN zuGGYLZ#Kf_b+Oo+^^(pLcO@%(>S%VM0xk>M2F2WLqIR+r4QtFJ$9iPpcl-vTba4)` zs>;T|`X-zv?GGw8j&#fCttcj`0^g%9vCntOfSgJolT>aDsU|59^U4~mUf#weFI~(k zDFz>hLRyyk0_yn{Fu3F+**8C5eDg*@=T zK3$Z!@)0Z2Ii8J>CGb=x!Hb(|bWORU;A2PzDvDo(cTFYmwkDV42T#J}+PSdz^&@(0 zgEm{J)IbD@cW~JsOZx2XeG<)`Pp22x&|()MG<0aBccf?UBRfkg8F7`1%vxp z+bx_*~Oqb>EM;_hC; zE{LbTaksGiw+t3Oji$H$tbn(7O(EuU5^n1|#V)mfT6K(E1eb2v^kVRjpQs5j2 zKPrLm>tm6?P5AY(h)!9r4wK&ca~-c>Vt36HHqAC=c$cqIrXvgt8+Y(d_|Buwj(__ zY*6f11GB}D`u7e;C{lBP`(W4UL1#-<|*Loe}i`ogIg0#j2-=Chgf`KJgFd%70KPIl0!F*6#c ze+O5K8spJx;+SIakYkd&;ochc7{8n?gvKM0c$@- zBi~U6FP@U6mCv8y&xmF`l=F*>x&^|`wW2U(c?U=|E&}z5a&U4<3ti{Bk^Zggqz9RB z-aKX>T)N}~mv<#ndtYm)$|3k(M1ZAt-qKT|r?7f=IVg_4p^D>qj9aS^xe*6okr+?E z&st5AI0uB0!+a3B8I0=1>gcTTi<-*5CN1M~nY&f8SaS9vXiRcP{%2iWurYwxCCI}r z3pct|Yr5dBvpEQhs$%)i5cb4G6Yfqq51J((V0rR%D)?JSZVZH?|7Zc~9*CulmWhnV z?KE69d;@0m>Eo-fAy_me3$x#IzKl+P`eb|%)J~LwpRRiBAN?ongxia8po`LXlNF(M zN;)0++Q(~OIgP%tkwnJ{{UpWw5>z*(P{nu4a87Lu?39*=>xoaOg|8ug>7Pz|;_ZbA)&PU$_(E969K3vNTu@MCJNrl2SM!6Pnvmglv*`s(53EG zG)-R-*Lp643NtQ`Qxyy8HR5KAj9YN{&SrKU2*6fr5_8wMh1mSngl*^ES4s6|f!)p? z<}a^O)3qOEfr{bkrmELSH!4A>#6*R917=-(0!Gk81IA?Fc2Xi*+v%7 zvmpb@BDpj3^iEPzTZaW-|B}kLMfl^*Oxm<#GaG%nlsFV$A_=+EA@b}U67x+C=G*=v zoknJ8J>pGI2dTl|SF<3G8{(O}&SHgz@0qN=bdk|du7%7&mWXa7jFaXi(C2rM{7Np< z_3{!uG#o*fDl8{Y+UCH6q}}Me{{U8eJque;4T8=>3b$lUA+=^4#;jFAi>hQAMIP{G zi*VlRu)8#jHy8A8O~!Ac@vv-p5M0+Bk7O#>H|yTVF(34BrNL+B-t%;@VWaTS+QU$> z>IzY{UkS2qmq?&tBFHST!r@>U?3J2`^HnX(peqx1m<-YLFQ;RNMiN%Ha6N????Bi> zp0Zr_?&K`sw_&z*Hew5;QJf6If&%pCK>!tGSf`sAa{O5chsp&*iD--s%M9LGbf`{#n$4F@o~a2^z%-i(h9k0*{e2^03u zM5~kI%+3m*rPIayxI4ok`Xj%QF6)Y7k8VFkniuQ9+BIpcEswIRzAwQu<0hcf<3e=2 z7{MCKwUT2A)sW*Zj~%kBU?f3^HokjC4_B|D9uGgDx<)P4GaOHy-w5HDxhC}Jc0tRb z%T)P|H6|E*0oPEjmp4%bL^kH4_0e=Fda?*rx!k5mbS8JlUw<6#&hvx?V*g-n>US#N)=9@7uI7J8?qCmXOa_k_ zYsgv|02+~BAoGhO^CD9WYtxre(Fr~Dd)_H7*Axg_6&1;zh8wi^Y#o}%L}IDuHztwe z>?Rl`W9-)VqGFtg#WaF4Cyj9?GAko{I>QFa4rNm>@rKj<%QW9W^nj55l-UhQ@d}qpc0+X_D zJMFkvM(-zb4!ig1r2dT)eGqYm2B8Y{N2Ouk)GMUaA(K?emcfy{NO)r&K%PBLA*cB% zblHO#>TACd7YX|k(b5<)PWe5%eJBUsy*?Wc8mpPAf7#hcnLD%?7wru`XEUByjxxY_f@djOd-WY-bG8{K#f-_O(cxP1`&ykM1 zh2%1q6M5V+ALJ5^;Ft6>4F1mf%#+u_3xjE3EU}svT)Ti0pT?-8YYl(l4SR@OX9tJd zgxM6W>F`8&B4lgVlHCWI7=HFkYF^EQyVo9&L5*POx#tU2{?+WQ+C9*5UmhlM+3_8j zMYu|LF;U6?MEw2sW7(5?>{dk?qP+J8jj3d@$TNU`8=r)`qy;d2MKCUOT8wY&Wl?i= z7KG0?Al}>h$g(SX=qok}7X2*5ajTWcB;I1yD!Z7Doi(Sk_Z8FdBej_P+y>U{F5nl| zZNr`Q*+lG7GWbnc%6S~P^MK1lGR12M(~Zufx7^yd>vDQuzEbb1`rU^lU98dg_#>DqLe;tvbrohpdKEnZH=E@9$}N z(j8d+MHlCEKBOZTwlUw|b>oy&P52p81UAbG@lDGtjC>tOR;}7fYX45cp7mbvYppbz zo|1VVzVma{2w851x15ICiO(t&TPsrDw zTo+qu5uDYV53a2>)aY#_E%)W4$6PPS+4KWkmd*ju())Nq`88R4JeXQrO5vY{3&^|d z5z^jR1~SSBi@E2`nCWwl{XUDay)8}e4`dM0u`F!q+Jh7PS77ys4l44)AxdwEj(szO zKWmj?&xQ?j(prChQ&lDmOfE&u1Pzmyf6fu(9gV!QGkknAZUNVso`NgYzOYjrgV@QB zvQefJ1YfI2Se7jV%mx#Fso$}q-i#i+Gr^wxpqPX-W01@p{zL%NPd(gfWa=i#h*3!UJw+ zxbZ`lTCEbHOka%sqjX+_nW(Gd9h4XqhJ2qq+w|H4czg(cwgX^%Hw8DjdR^(tuEGTMd!Mu<}cCW)*Qsu|pG34c-)5jOD zFkax67D}8{!dTI_5}^EhEnDw<1qTfKAjObC)4em~@!GR^zxgcabUH%t+vU)6BZ-WY zxrz%qPlILc5DEHaP1SotNz>{F_`~)bmgo9o@oHg4^l&8A+Jz9ZUXQ$R4?z9OBSh%G zNGg481BUu>`GeGDWP`i_+x~t6;aLJ&x^EA)yw^s4B&~zal^5vaSqG^!2GK{RU|PA- z6AOQB!%`a*G3zLbJXZtZdU6N{FEH}HO{OdtQhL8lUcRS z#W)mlj}5pIN>vgk3M_sU5M9GCm^|JA(>9u5`lfa8I^K}*H$SCk=X9_SZPm%wV<*TL z4{ww!7ErslckoYs6Us`?#@J6>=BA_+s*D@Nl! zOSrT$myO>)5uXgr$BL_i9Md-f3k-#+`IR~%wWxL>=2Ca%6lUKmY<3L`K0 z{6vpAJ0FR}y_2ZWmqkXd=fQs(24vqlH~h0YgKX4Ti{19=*ir8f(?UNptIKX-@a0sv zB9JC_qQ2Bt?-BdjrX0h?So$&N0n9DP!EHkasb_pJI7_SG*>#-|z1th4!@tlIY!rBE zT3|p_D19eYM*n3ifQ`<4eD~@WZ(K(pRhy9t$`gY?wxfv&>q&-3b(s*Z*uxmN713k9 zG3@?dsdV}ef6^HmMvnbfpo*V0=s3=AqrOIldMm^bzp^%F%ZL^^8J&m{XQ!Z0ZZh5q zf5PUkCb)N*C)j(qaV&=}Oy%c;xs@WdFnbBrr+Z+)c08Kt4KRX&>$q)L2lK0!dM|5bdc~d4(R;a4dBZ)c(@Nl-Wsy=4a6aLkS4K8-@B`u7Sq8 zpV+nLG@eS!2R$c%VCE02pQeSW+$6wSkvG%(5I`;N^y15^a1GVg=!NWbRkLXEJWN_KlZ1=4Q4zB&8nP#X|M<}ctbk@> zF;YN&&*rj&LM<5ndLu4VO{!k3ERD*;Psn90IsE1#M5DMYk7b%GY<8wFwe|>T`O4w5 zCC}JfMh>Jztrr^{kAq%?5PsB@#HqdN=+v6XS~MMI)e9tmfBz7D(d)>0Ode3@?^WQo zHk#P|oA(@KXKWYE2w%YhHUX1ht=##di^~Q9gH`y)8%+f&F{@bs>YwjwHJWlhf%N= zKM66SGeCGatvY>55Ba7zj|9AHV7*p)L37|K_UN3y7-;(e2i=;{-*yez61NBT^tZsv z<3aGa&nB+6$QQT=Iewt!=# z3uo)oMWU1O$UT2BIkN*N1fC>T8Ijdne1B1Ez5yJO?PAWJzD(a=kRTtYUS!^sag@&Q zVrX+JnD_`dUZ>JIymY3F)GsZBPd_b)#$F-JxEX^_*EN$HV+GJYynyH#yr9N?bIG&T zY#8M-XUjqcsrbM%TFT=b&fLWHRGuEpFt&i-lm5ddT^{VsJq`YLMZk7cX#BEK2zxmj%-Su; z(~%-re)$S6(wdDwlAADCa}{XcD+1fUVo==1b>eRQrn%zLxNZCy_yX$qFsT(S&D?Oh zwJzqgcwp9JTPR9RVy$+Ep@-oN(1}!stMAfqAI;)@vp-8@hB*NBr+mo0@Eqd*Jpk4C z065q002hS5aSoq}z_(q``PmjEKe-U4f_=2BOC0KP3Yk655Z7$%f;UqlO}aA49Y8@rFR6{@ek|FHL}wW)<9;(#1qw8^-5>H@STe=g;{yf)*`zfDVqK z&#`2bstbYEh=24TyMc_Is3Zq3g;67JAFaC1oZTpCiy00AI$_5z@@8!lZM*yp*Ezb; zpoY`1$aesIvs8%aLM1``0T*n%DT9pzLd@uLHSC<%1-5d96dy(q`^PP;zQ{zfa5w`7 zUZt>CSD9n>jSNW5^`U&da4_R$!0uX$Ah+@o20PVozOx0;nIB9vd@jPrjxta+_lF6^ z0(N-IV_YDSOrEZ;(QWpZ-;Vt7=W$-Mh^lg3|k!2mD^%itv#quj?zW<=lxpKD~o zo)$WF-5ppJtO6bTCc?-CB@ps9L9M(5@O&mj|Xn~mQf0Ui~cqxNE(>4j7M z@aC8)y#HxR!VKoon154X*`gaPPvtqIQ0NY=z5%4zQL4zX`@*j-0MG4icp{;r zT6nt@1atdI%`|UVx$_~lx%zhwZ8I{G{*qT^?mpM8P6m;FCm$C<><=%a(t;c2H*6((N?2|`n0`cn-_}0@1pf2 zASoW^=#LUXi8oyB%isyME0T-vJ?O~EU@oJxgD^%MJ6L=?Uh^6Oqugo4@bfGfRZzxt zA@50qRSL*5(@mJDO)?DW+b*qykD?S~C{ZxQ`!Dq?TiWVxP*-fUo6j9H*iI}FSLG5IP+1HCj z$koqlNb8Ps#H>dRwpNVN><|OA3b_Mce&%6{g%Cu2_(c=F?^9a;f;G*#N>3fHhvPpj zndSOzw9ZxrkMVlJuZ9J=5-Zvic^Jp_?0_wKRgA`?sq|X^c{=?Ww?73LxZTi6c1hgA z%e++B`N0!qbt^Hcp9jwk^x^JWZvL}a2&Hpp;Jj#Qa@xg+>?@6?lB11Sb}x{voLonQ z4(h{3^_{rE!jIh0{!UHgn|QHSn~C?~nNaE!iT_o`V)}uN+%CG9eC2vhtyvFY!HoZ4 z@_kKs9k(3I^CM9%vyM2mhhY7&7-ndTEm70%g*mBiIPvjgx?ubWt&PnklEoDMei6fE zi&g3FhQr8rqajykxwM^$;B=*b*-*(7!r`Ix3FC3AWb! zdjYZJ=!IUCX@D> z>?oIkP^%{1Vi3Z!Pwb%4;~mp?z=Oo*CZShaAHDn`X!#>64v0A48MTxT33^4**FthQ_{?0M*f2KEg& zTd|4HPfWt-Y4=E;$X*=JvqatNTn^$#ApXaw;uN7f=%afBZLTKKop#5;`qlyPomGkW zC4iRN-o~u;o5{hRc9MJl9Fw#!119P)c;`?ViFQart-nF2_ezKVUwjv}cveX*IX;4B zaWFIYO&&~5)I~cBp!|K~VfalEooyV;OBCl`MTUgv^ZS zWL7kOqA#CEqDIdwtbAR9fBv(ARa0Nl{5A5l##hwrO<@K*->V3wG=3#TEx$y>SqJSMjJ?rZ#rVtR=c{Jit)>H)+2% z#y+(U1S&cWC8tPYs+>LSlG33aX@zY0xJ_6%h4ZJ>aeUYPEySVs1R2nphr1Vv`o z+w|3Cc7Y#d$yehH`^EzcV~?ApNqlsWNohJ8AfyW+R$v>CCrHmK16la z!=XwS%vq{T!n7GMT~`RI3cK*Q+bMSc`#I!kDd(%-5I}b|SHS#$-K^d8I9xbi8Kt>Q zp>Ovh+@`u68tbibwJ_)22?)lwcK0D`buX(GX9j1LMXAB0y`Y)gLN;B`BKW`!dh0 zYtLn+{*{mdwRh}YrvkKo7J~;(_p;t1tMGjJQ564s8b5yz#-Bs$sacH&DBkcw8%13* z-Pi;tXmDACZ3%d-IJ4UALI5^c`mlbj^TCkgyedwTApOA|WJi}i3hUbE(w`Mx^@gujpMj7m3A4bc$# z`)5B{`t2cZyD0Xv6VY4a9YY#P`Gyz&9M<;PsW z*hu1Ek_2F73KzF=jK-A_q)DLx{kfd?wEw#J7Q&lgW_A~w-89IA&MO9I_AlcVzL<>m z=a_Dc*o*T{?Wbb93_wrxF5K>$$N0;xgz%rgY526w^y>h}thsN7>R+;1hcn*P`s_l% z63&VKYhn@WI#Ne8M?+~j*Z=iD<%KPsmM|f%gUdZez=wuK+ziVJ^f-srw#?03p8GZl z_t3(#tJl-{)zfgr{Tkx2vxGW1%HTqXfU~}xw;IB)$zHks1r~8qz}A|*#|nDOY~`SGkB}rAy@Z~Bc#2a3h|3U zX}1>B{P!?a+OMO*+#20$7m8DW(T$Rui|fef0E^z1nnhvsDX72&va%l+iUMYb=)dYE3gt} zdQOtzmLj}9Sp(;8{!L5Ij%*R3WlIN4zok{e%qCL*!?kIM?(=qYdaXRaCAML!j2?u>wq0Qa(L}Bx7 z%Ac~A_I+E5-B*@C_>q2+&-EIFZF4ZxEDt2a)Ulz8;NYo5-0+_B#XfGNdjzpKc;pq9 z6?iZMegb09Ue0|s_OfeV?gw$bjU-o#Wolf0qR@;AVie>>1?dzPA7voN;{(w;VgY9y z@=#>0DMU2ff~&VP;i%a-Guucb^jUR=Y*1JLY-JL$uFC)zIt`@H9J)y1Fs>zamQ6kcm3sa+7$W1>_WRgaDx$|BCRFB;w zp%ZsQY3v$&esdx&6?1}VuGiV3^p9lYa1gz>yb;8rYN>%_Ka;AG%nn@E#@YWYX(o-K z`@T=2M>U4%)fcs>6(G+(**``VA~taRcMr((>SGRh3!9mHtMkHYZZbwa#pHzWXO2a4 zl7#vE#>3Yg@g%>6_@fZHxO$XG3|ykJ)Aiw_Od{NEUPz`My-`!&*N-MSBUD?r#aBTeI=Lt_b`m`juU@DFQ?0%t9>>ZQg#k%*>sfMJ64%MDj+(F}P!d z1i2Z2X3~&Pu}Rdz&G0Q9s^r6@{3Dc^J$wy-p;ZB}*+VLD^FY<0Yao z**TZCCUKvw9mj}IhCkgQ6M}(F)1jmE343@(A!+~Jfxqq-l4Wm~0B_YLSXK6vZkf3r z*Iurq5%Lk({Ky`B_A4S;vksO`=|`1iVmQ+-0l`j*DRyJYH%9>#IhGI0PWs@y50d!0 zB!u%TE8rAuH}X9D9N8;uO4Y8Xkb4(esc6&)SyE&OD#v+v(KLk0!~|f#@H$9S>?JO2 z0><4cC%W2S$=|iZaB`IbuAUT$52w!tA%PV2HG4*u^SkM;5ze_?WvcVRm?dQTAg+dx9WkThYp#esTl=L$$A{8ScMW@YBY2u$K`5_ByLr!;qQbjcrA3ElI|stqq7^e zkH->~7BTcF48e5OaL$Wuhszg=0WtK(2IEX*)y=S0v<4~z6JTXPG}x7%f`)-jSZRBa z;G0j>{@4{9JanEI-+DsJ)=AJ1-fmd+PM)x~|q zdM*h|ElW_eQW^P~i_y^~4azGNpm@JGimrdaB&nT6;Te%|BjO}m^Y1A6J?R%wGJlWb zrt6{BwRnzoSxfKdP6olM5a`^vnSE|0gf`!@;l<7saO>G*5+QpMjTFw%?NWKTOKJlR zv$>0&g{{cG@W$EaX5!SP6Trtj6yCUxFteY^34&H!p!s<XbnKZq>sRN^M4C53@|@{RsK_Dk zyU6`qKLfFJqA_Mm6|-l4guvn>lgu&}$dYTNT{PqBR}eu5cA>5Z2J+3Z>F6d}S}h>E z+LUlvMlR`|cA31l7Z<#9w?y-xI1=-s3X3{b@m$1jvTyAIxR%=tUzK^}e~QjK5X!%?MR|I3zicM&#^9cL}wL#s;jx7@W#*FT5W?!9@g~9U)@LgUQn5qhRV0@pJ zc7&k*u1X@eVFmTtD$Z-ZYC#gFU&b+S8Hm?A%OtaNVCm+)oC{|W))Ym+tH!JN$|4M! z@|5t@21!^`+eTy!Vo)d90B86aq0^t&^hCo^auz4E3pe&qa17`7JWeD>6&B&NQfCY{ z{mAXW!{F`FO3d@+I<8+j$kOh&+|0-izD7jQFnkOG_gkS&&<#wZEwI&rQk!*dQ0jY~ ztW9$x>&q4BG|#zksL73pY1q=|FT?Pw*DD(M+Xs6;w_+eSU%4J0jGua}us%ZpwspJX z$0x~*Xv82r>Uod2W=Ug6GQmQXi|~)DJjH5oJ+w1RVccR0tnYqKCGjoB{*r->_YQ%D ze=7WVIuDLnb92L%DJWsbIcCadplbC6dVrffMjG5;hTa^6v${6eq_>WAx=$hfw|R8K zmM&tgwh(2v6(MVK5>NJCAd}8SfG5YWFYe)(M5&R~`dAS0@6HB+(JfFs@f13VnZn9^ zU*?=oE_wT7F3xjU4`RK!%p8OD@a0M zE2xX+5WPJu4~-t@aNQ!bXz@+Dcl3EHGe^3aWvdLZi?we zCiwRE15#5hiK^E*Z0^Z9Jogt9K+JL#IA^MZPi`9Cc8otyvpvshJY@pxgchJ!`2`osx z$K7?F5iicYGxR9}r*;g}fasl|8uE@!iwPnHnRnR4MFeC_ec?#!U;3v`mHemG4b|St zuqwVABh{AC$Ni#Yr}lQpzP}vY-(90)5y|vb#R9lvyAz`nY@us^7%W=51RI+Sh=A~P zDrh?awxv0v>am;9^CT8!3!O24K?AdS`e8;^V2noo8RVUuD9czzim_TRlSoW>7|8Bx zr9zpuki9DdKK5Af$gLtaxwsvKI!sAJV;khJ*hq>yx!J$QS-ilVUEY_UGWXOU;e#Ip zo=SU@BSm%)eozPx%*@915!@T$x;$KUnS|w^0-0#QualcFwoQ5-JA< z#<#c~v=t{R@65sNFF^BDW($du2Si$AVXe7c#-#xPv2Gb0_`-gl8DM;=hI zNiEFK!ela9I2EdBB|Yad0Vb8tg6x*}L}B_cGqGtINdz0#M6VUT`{e)+OsMW#XSUh5 zjGT3`Wn;#-;RFkLEJ%r>>30K2JC}3*cQOPgx2*==#Z6H1)*R0KCky#YU$cRmZEBecm4*nud034uVd6w{lNr&8TL_gc$I$zZBs z`ft5O-ufKCko;(}ZB`s?-*=o@cH0y0wMfJ1vfDH^)QqW({7Zid>O!C00u1oZ!`YT0 zSkZP5)>|zE!N7McRncTicN9@~>n89;{8)fABg1F>=!_=zqe;*@ps& zaC0{2dKQ7-s$7Qu`xxVN?E+TKl;9h_FUPKktH_IgPJeEjN0;iD(G&MOcmlgL=>7zM zc-3M<^QkzK`nLd0j~Sy*|27!7V~A-FZqqD51q|GJfxY;!oXX@EfI7E8Gntl;e`dFl zCFSMhRk}J%l4`U$UKD1tM)Fu?BH1V$7@8P^@b>Voi~A#dxJ6Zj2SLnH9{QUMN@_Q zlHj?211!-Jgn`4;kZ-JpaWI8ES9*!_x?j;*UkhQ$5w7dfE@q^(={Up}-6vi?9dz-Q zH>`PO8ZUG{w+H`FLgzO-AQ5>AWx<}P6P{0}?z&7G6Re>zGzkoj48fJ?9bj(~j12S5 z&@?rVrj<@5SW!+#kfjDIR>Sb{MbvJ+hr6l|<6HeKNY~|Z7{Wi8kgidhcjGdhsXK=` ze_tOP`Zr@vcpxS?-+=Fix^PeA6w{Gni^;18NTL57*m-9d@_dch3ypzz%KIEjcm-3n z&kU^EI!0Pc=G-iy1sHg+0r!_0*lk<|>5bu8{>7}Reh}?Vn)A0%} z9+jl6G1Ktn+%XcLSBELY0S^DZ1GZC~IDyuL<9+Udu!#GW#A(eyV|qxdW5B=5lL zpRsg(g*r-9N#f2bt}_|&6-=Bs)%A@?IA7nxer}(Dr&vCH65~MxZPs9s;~x^aUJy!x zXOQ-(UwAUo3t>)J1(aSggv$JxM$Kmi*n4)T;M|P;G=7^JJhqIYp}G>dXKgur+9GTu zHOU9;E?k5V5k>3?%Ym1d(#UT+HT+&~N?!Y1f*;8n*__H}n7=C)YdvMa*Sv{r>6>Zv z=GIrGyjB(Ns0fkcY$qa6;0?j(6u`u5v1s zlqPtIf$&E9NmpSKyL z9O4Y&mbF7%WxTFnIyRMU{$U2fb^A?PlzhTU^Jjl22lIZ1ALL+8)GGCLgQMsoA;4B_b z#)s-in(!4e;ofAU2d4)}bnuMh+13=rf8mUnlEEM`=XOBeYF1M46QyaKzgh z3y0F7lvjj%!*sB6buH1Dz-95R=Yr7U9W>}?BKey10(ZZ(CGG*gdH+phiSh3tGP}?IGcWPv~lDGL8R z^Mu^lOR?$71h_xK@j2%SLPH$|`{yRirgs|fQU59`Z`c8L@>RIg$Op{=1daOc{3aT+ zE)pxv7=EwRThQ?KBO!^k81z*Nw2X|PWzkAJ`b7>E-bz85;66IxWfUnqTLt;jyKoz) zq_+*5PHBu5W{;#YrFPX+O?L!s_I)SQuW|j!Mcp{1aSz>`lnV~`8W{mQA+(I0Ohq=- zV?y~pXkV{E8L56k1#9ubBZkX;wbQ7+K=Nk2B%B)Zg-81UWA&rqN8D!On<5OBx-4_* zQ6XGN>Y#g5Ji*)}fb-KRFg62Yq$qC!H!pG`C&)0kymUmv^7E9L@sD(E-bpv!4x`WA z2xc1T;qG-gY{%gQR)4!bsxF*lG;bxxdnuPD9xqPAZrOZly`h2Jo<0pi%J1S=*A%MZ z5l*kR*U_XeAL-+j|G~6HdiW#i02}xIArUbBLN&MC*owK zlOh*!5@9J13irR#@}m|I)!+`#OTJvPqs`G$#Gwm~Bxa&=LIt zg?IbY-~GQ(X>SE~{d$cTDCa6aI*4l3oWDS5H~vi`P-s{RCb81Eq3(>|! zAJ^3ll6#s%95u6Gv3<>rnsay=3~*tN7+- z1XccT5_F|1!jr|CxL>uKdo%Tdx5NrO%8MnJJC`$?X3Ejt6CAI_W;#(UjYGp^d$>F2 z9~G?rM!p_QM;qUA>fkL2OIB=#mfvbd&WAd{(>xJ+y?v1`1@m65}U1^MLW<@-!T zMI>f?yM?CpF<8xT4#5WzAf#}FjIK|hor_(uU*8Rmt}EfZSC?t%D3?j z0O*^@l9+T%&d4()nto^z zg4z3XXqH`4W!xe+dPXZAM&e9x_oq)pcIiZVzh?>*&gQ)7JJLb#k}|b!8lYC2ykK9) z88W%V8eba6!O^BoARBFlQQSQ6YEnOm?0CbxWX|xu&fh`{`(M)hjJ-^U{1SYtP>+#6 z?$h9Z$*}pzYODS-vE zC!p7~>oDt07<=xwI<9(g0IR=GAhv7G$sUdavwO+}bQ?Oz@v#o!sEReN{WOa{eYg%i zuS|uKif&$e|7o&lei$7)Jr#_$Dr59c0kAnI0X}{)q#s2MNnSb@p6hcg+=6 zO${frJ(9?sFjJ`QETl!>UbE^k8KAr=6t4+$uJZ|VKortQK=TYF=?PGKqXFtXQ}Kx4 zRBGRqjnnN<(2ELpsB~sEPIwSV9ki~(i2*_U80W$}D9Z6OCTF2(T??ICC}A{ES;gDy zP2uKMZ+JS=L?=Jx!Sm8hAZFl!$?u1##mQVIER*9{Ihr7&?vGE`#=*0q8Wc&~h0B_A zanixv=n*4B_19L?cM*{&+C|9v!vPo&9|Ng3RG{ZZF7}_;h)ttogq3<;b@7rc^e&%> z_D5wg<5vwk^kR_st=GWcsth@?d>FN@oN$Rt2z};r6wL-Ru)RSIA!1a4|QO@E%;gIU+VQIU#5lJY)>x`h|gd307y*AkDF~qo(CR#*tFuGSL+*+rKal;)=il2uhr3N&t6nKu!%l@qK9J=viP&9 z9UO|C(ZE6&K3rKyY#-{8t#=dYZED2wfi|WK`X$Nm63ES?iuabZTy<9z`m+^!*`t{QMHrA(_Sdv%-gjYqwGnr{yTI z#1fb1Bw>WO0Q%J2BNt4slZT&Q5ZWdG zuW*8yq>9-eY>PxD9H(cMajxdYP<=Na^aaxB+V@QuV^$A6N2lUrBQGM}=Z@1`kf*69 zh8Mb~!zb5C^vB|Qcsel)Sj zdxg|XynrR^qHtZsIb7_$kXZV^LA!+;(IbUV7OS5Ilc&q^Y2{1$QO*i=-h_a>R3?5b zo=MLAQ-$1bT)rrr>mCf0f<ae*hr%(oPLMR1?09 z-c7ZPRn{`lyspVAoK&ioQWvEAgpfoS$J6Ht@$~LTQ`~+fmBRUExM#_6p{x5y$mVJA zO|1ia`P__Uh|6|HaB~waAACMvn#>kg!AFfY6l<C&jwe1W9wlu_YmmN^m%(48lKGXgoX)D|IB8G+k*nJi$n@Wf$Y5s%YcRtYv({O`c54HUlQ#=X z1lHnNXKnCX)x#tGe~95CL2!=NqSbxf=-qJ@cB=}I#W8i@?vhAAc`>_7a~e%Jxu5%35EPMM!H8Bsl2)kGRqk9Lkm{oq~nHx9e5c8hrRPWJOeBJz${=-GQW;C2}Y3qC)!|EGZl9`zlAg-VFGeO*mf!h=Nwo{K1kf;y847F zmw&>(lL72DmHkB0HygT-#N)VI7j%yw!`Qb%+&eRizOwz!%024FW$Vt-hvCnNxnLa4 zZK@=--MW`6;~nfTQ1o+e+69sI1yW6GV30`55K-Th05$blHhujt{yT+K~e5J zn&1kv_esN1hso6uH%~Esk{$H3{cK3>HX~M*M*Id-cOu_kj$+w!h^fR(>g?l*n#Pmi zLG&n@lyimdkv&e@;sW7bGskK9JBtbY{FH7|DQB=@4z|9G#A=;Pc&jgo7QfuV?CB07 z*}-K`r|ELuP&2koF&GqHh6DPQaalYKkSbk|ZcF=-e;@+_oBDBztqPoa9z%PLOz=w6 zQU<17``PPHM%m1Yue@NU zf!K2UzBWk#SnDKQZF5lx>$w?Nrq%_LBJzWzHrDVt>JE+DB#!l$Ww7VB33oq9W@pb@ zL{4ekgMUS$WEynfvOVAVNAIl#%N@NmX4V%HJKGm`96Jx=+&*>A<3hScN1HoyiqJ0m zHPPetExB7lsc_L>77|5Z|J(hQaywl3S9R}UdRiPw3y+0x+(P$63Dfx9?QGK92mJA^ zm2~+-aU;KYiVJ=tUG&?RFX!0;LFZZsoAm@N|J#7dhvM-1r`14;T_Ae+CFk?-hZ$CD z(D7w5ihju>vtPzS zCivnmY)n{w#wK9=o&-^se)5i$z5iK0~PEqPiNhO0Urac^`9 z`e9HWXL@T_t7T7y3zC7vNpdYZhn^?F7blbTj~|j&Sre!f2}a4`Y--atN*=yhjI(AB z&|ALA?5bl*oI_8KV$RyN;|1m(DH$mO;cvQlQ$`X+Mr`0(;zaVN-HfJhpA8wiEMUj_cGgQf1YWw_ zMFGxB@O9;MysB6UgIte7dChF>K@XCkGlMSdKSI=8=0erZapt`U!(X(5<8jab$Ft%5 zpffnHV|7CU=-&>7uhoa)m)Iw| z+12R+P;g=nxVh$&ICWRNxT+pZ4;S!`?$M&#hw`D~KY17vyFeP(+-9v0UnCB%=P*jO zldDq$U(wx~Ltnuc{P-x5ahi~HJtijq2p7)`ZEE_D1M>RsJpP?=`S~JA9M;4L< z9CeO)ZD(Sa-N z9GiElG_K?)qetcdk#4$5T${CMvxo=zGcAwG2o#gJ3%XeQdKddRo69x2IMQ69K9FfR zi_2bCF(X|YFsU+$7OCUNXY=PYAMwsrPh)vw*D~bEJ%@d+<+RiSt zbUO$yOu634)jWDjDUIAYwg;Kg9jN9zOwv0ANLX|&&i|;4CL2duQ-94uM# zoxEOHK-?0qfc`T9DrryyLI#|pq(dHB`zDgnjG4rfn%)3~)z5r$UZf=N@k zduLlN=vdysE^$XxoE$<+Kly^?&#f4yGzoi7it+>(Brtxr&cF-GHR$UDsO6kju7QC!NXq({Q77GO7dd}K0fFM|DQh8?fY!QUqWP+0ywb?AIY>YQib z%XyNh{Y4e=o*f-|d=iSy-ohQrRLaWBz|8}37-JAa$FeP`4DDyc`TL0aPzZTjdX|i~ z9mZPG4r>3E%PXA|1^qP{^os99@b{4iQN0M}c8Va=H}5DMVdcQ{_ibu1j^w_B0xb3D zMwbV+)a!jLT$6l9OXGtv)O#5gK3z;R+#5jm)OL7tO&OM$MS)G7Bli6B#AjR{-9Je8 zp)Ss3z;hMs*(JtP2}&bNygi^Rfa_q#EXOvJJX+>f3yamM#fvS98<8Y3`?%a}^TrQtx(o-~8%aA)?1Wp;P@c+Tg&}gB(ZqGv?0!MVGg1<2^jjzL#za@MmZ7M$qy5HPYzcMLz%kzVK-Qqi(m1O65tS4ja!lELNv?KZsFA zJ|0wD1fcqAI%@uv!PPHzf#hE&qBHo7DBC0ZL|_rTd|?5%ELBL!SU4tUt-6qPKnAUMt4Kd?nFF2EbI^1ZUyHWgTc0NE@t^`B)cbi;!)8~R9jHX-!dZ< zCXB2^;UA00B(XTK-&2EcQ+uhZq8$A`Z8P-6chQ}yE8ubMJG!B(mLwXdp~STUQeXU< zyxUX4R_^t{)}=gH6?cGCs#1H6wp*W<4{3^TvdPcY4S(zU@SaOl%u$ zg^m9WlM^f4*e@RpAR+A_UNK20!8+1p_rQ57qN>cLeNPdm!h_^}{Q%O#UEn1=n^Xrh z(^4%v?oKfcT!qGnshSO~37tysXJ_%3-$|muHP%pD9)+nk=CnC_Kj}YrhpeohNHmVA1G`5hI-`l_!7naKfo_UAo{2OBWhi{tECDdOOh5C{>Hgy9pnK`>jC<32y7X|?$z z&z$qO7;-ZqSt+;@&d1`pO|af9gxG#LMf0Poz`|Dp9^F`t!`a<4Ne4~R$xC` zO~Fa?4XN6(Md&ww9=>qRL{>hJd413Xw7^d-Uy*#x+mTV z|ACwLt;50D+u6ysl~5MdL;S3kf%@Ll>~mG_JgJdDt68JGjAbHJ%chU^>At|5i-#EF zpl#UjtO=)Qh~S27C-BI+Ls!u05Sw}uO26=F9hc=Pkw1Z9202hTn#1KagjoeIj&~Nd zgz>ft1ef=v=qVcpY8+>1YRY;%9)6HCKEF>JRP4dPmOE!@KH9D_$CtMb(Jl2E80}e% zr>PF>v~8ID5&c9xR;^$k6q`^p(T^l`QzAyDJY?G+-+^%%0VMC`$i2?jyd3W_s`t;P zTF;`6-v08NevHoo_e~G!Rg-l%cK;H(4_u_rRi+xvcB&$MUO_nKWX9!_>exHAN7)Jp zfC`qt4U6wgPG>s!Y!=7u+0t0AH%PW@3xc1y1MJQH5%@xE5v(2Hnm^Iu@XOhZyfU(& znRcsjq6}cv5`}7k#Zh=eI}z6&-NsiqwvkTID#F}@qO@j;8OmnNhdn-XaBXrF&R4et z3!e>e?RN{~y~-2~lntTvg()m=41%vBopk2sLy#^VjBW?G&T8vc+R+;ZGCInzP^K1t zXiZ~o+pUHgE|ZWV7YbdOONqG!i&fGW@bQ``h@N+rL^Ad4t~n*xq8APa1qR6G>UJvL zwE#sEH;|h%XM%BVEhfnPhr08;AWJ@pyzz`h?cA5-{*)ki`8ovtT`R*?>D<}7Vh0#r zal+p4vA{=L9V ziK6N=4c#gJ>}GvIYf3-Q*~ z<`}$-@WdZa@G~%CpX@2Zpf41Uo-)IiTvw)J8K%XrRnbWzgH2v3YqUf-8*`T3gqF=K$ho#}-0;E~ zbJUDM=%<{~uoe#ve?ARQyHn}LXGK`I;y%nYS&sYjD#()fx4ii$bs=_DH`8xnf(zyu z($~(b@piXAoigDpS*rH|R^HNuJhe+~IyW0x@Wz2>#J#B%WtuT`(=)1ddXVa}uNhs* zjP8U`<*Ae zRGf(xxGQ|Y4x6wM2F;1syB@l7k}_o934GL>mL0BnWJaP_aEVxcwe_6pkcO#syB2WF~lwg$O_oe)c z##pamB*$0L`R7$|g|RGl>z+Z2bz;m==?D+E%%n$$I-mDW)KRS`@wZD#Jfj*pQzDSLC)v~ew zW}tJu6)-Cnpl!x}!YMZB!P^8pNA#ipup=Hkw3g`(yn<_ubUz9YOYg00A+z*{ zX`!$K$UIDhddYe4yy`3#c1Pj;oCem6so?riAt1XxiBvL)RJnf-6%#G1a*P`$hSAEL zBd7-@xOdoY?#|WGa+)v`k8t>ir*!|>nH)c7A061X4sSly=DZDhF#e#1F1b>`lvJI8 z;#4EBH+oA{RTW_7t|rX1JI$)pNmRcsm7%ev(x|hM<6Bx+Lo>e&wHgg!A?psa?{-lw z69KF)^5vyme8~P9af34(meQTO`q%?DibSU-2RhAlx!w3V^mMZ1yb1*{ZQX48PI?&A z-?ZcJjar6A&xc4-uO&6K=D39W)Y)Ywl)k?FfwcbdrTf%mFn3Kbu6P}UDyt_FG2a*> zw|g!&ybZ#&8-}ayE7vnCdF`34MeHF&cxQ*~5*aOREr@@|{U+k=Zsh~Tu4*lm!V8h|f_|ab# z2DtaX{HaAoqqZ}#$bAb5{dN`)o)Cx9$O=>l_)T`171EDU+?>H95v0~%<*yT!!l}Z; zOo6~HevasAIF`$K8RjLD@0*w6<{@o7n`4GLeK8nnw2BQo;zUZU4Vl~LE^z#RLu`@L z205p96i%k%LZw6Oj?!^7TVGEO3MNs@9rtN*mkC+fw~{DKbEN~iGvLw6Go;tunX=wo zk9`5f?v?o%Fm*Xz)BK20R|pIat^*lSbx_XP1Jm@^R86)MppNx<)ZE3II>#>p=}V_b zmcU7ph}@R|g=@Xhs-hb{ zf6T(qFOs0mC5b+ND2*8{N#v1>Eqqf6CatY3=a>CQjQShl@=OO(buEhIEbrt+AFZRw zgD!N}{$jq|6k%}H3&doHFEXWqF$vDY#bd>n-a{{4JA z$!El>li=xuVf^mshXvg3dI@*0l(W7I%R)l1Ot=xG-c{n}2i*Mh@OnP$BTUz;-2#Po zu@E$Rm@y)6So<0uP%z7b*<*XrrX~+6X9?iYE+q(ZcLVP&?HK8r!jx&A2DL+CxM-g% zIZ`G~&t7{(hL#Ay8mVG>-6ak;{NvI4>&}D3(Mx3BtywTO{{+nSJ3(IvFCZGnM#wDA zOY5`Gh-~;oaI$G7@%wxqPYjHcOo?=kz3GY}+&gUIIy>UArT~bpJ&2_jLi-I%)UG^0 z?QZqM*Lxv!?%e6sr6(RTi`RaqU8YaLH(CYhuM9|B5lDlDtKfFpIXv)ZB|G+43m#YJ z!a4U0%nS(uTfvJode^}^T6FDv+!5c0;<5jNYd1G={H9S%o_g0&wDV39+m$><+S9$p4&qlHJd?JTr?zq z=U3sw;=6de)rSP`Zf1Y9^^mQzpEFfK9Zbu2N{&Yt6RGXL$%iYa(fiMLlKcD^`6(@e zj#8&cV$lQCUTcDym0oo2t=r5uQ4fsZ&g~x;l9+Q5r}1aNEcW`hW=OsjM%!vcaoGP7 zhIVZsGD@l#nf8k}q&S7^8KjWNxs&is7!NHB3K)UoS0PA98-K>7LM!KjRQnKu3&r~B zpOg#Oe7)35u)$Oe)o91aZDe+;U_wK zzY)#~<=Det)nS`x6x9BH3XNAUvvqwtvAM0s$rFdtoh66$>T5kNQH8AGcfSOrn>p2bev2_Kd0EBiyk@ zh`7~PlejzXpw!sJh|P!r$1gn0Gk(T)@_Wh1jwf`yVhzo3{E04hjudsS)96Fi5cT{l z5!@k$m7=dmm*_mI-@X^EJThpeXc&1fI{{jp;(3Y#?c{oFBbhNPl@@JxAmNMiNu8h< z9*NuolY%oq$C&}yZyW0Ia7^Hro733@>+UgWAJ+sC)J>?sWP| zuWr7If9LwbwQpr`Yo#XLJ;0Ky7E&m^+?TzVw;6Un{7jFPucDE;OR#nA6q=XrgnzDa z0PW!Ew12NIIkxr!xx2*(GYxqlBjH7>868mLTmp|vqWH7Nv*91tW6Jt_ng~8|#Cdn7 zpkAjto#YpS{N7ypj@^M}-=4AVofW8ia54H@{-9F_A2Nq7h2z65P1vM=iVl?y(&M)) zNM&dkRXkwGA)Bmm*4Ox}^39{a?Yyw8GKiK~$AT8f`9ec&(RdOExed1z7= zt{xJOz$Py*xMg$^n?Bw|Qss}^j!%bu+0)>|q#-7AdkEa{XECp%m6YfoW*=`igg^5V z=*KBXAbO0_+n49FcmAGcpZR~L;?C7%)t&<+Y)2Hd?_GdC=`D=I_8`8IfjesbiQ?WN z;b410l4#Eif=P$M;l5KaeS32qTrr4+t17D@?p{3p5Y9pCAJRsqv9Ia!+Z?BJLkcc9 ze2Bgd%_QD~r?Igo8GDl}P}9W?3qz;Dr)38T|H);;(XKEoyj6;dP0_?o=OY|jzY#3P zgYo9vZZgJ?0`>S!e8D}-N!_zLawMgdH?n&s*Rh&l^tk>sZu@+kdy+eF{qbJb+9C&U zU9coU+sBD}kt9_f4Z?AzI_kK5~eq078T5nVL$~|=5k>z0a z<_B3b{XZ&}8IOFG1~eF!C7A*1XzQ$HkWw-OZ$3_EZfVQV5#MLHOz8$rcx;c8D+KB6 zm_dwtTh$OxGNv4S{MEp7#@)o`#?S?@#Wz_~Mv?3qf)<1;LX0O2` zX&W3$o5?X}=8%j#R-pQF9;{UL;*FiX$o_n1kEX5;Ail>4W$U8IqvjB_bw7mDuD0QE z4F-A&qiDBD1g;ekAvd`U-sg)2pqX0%q4sAPf#`IYdX3VVV^g7*`y8YnR)Nyn1K6{{ z2h9h1VM97g5>kd4pNE2sBEO8zDOiKeuf|~D++-|;WLR~`6@TBbM~x9X#!`j58}xmm z6}4Izt*ZmWidy*Lq8c<@amMCC3a-Yju)g3g)R`@SSA%mw`N}(*EjWWNSy75l@Cc2b zqY6*C-D`}026pEihqyZ|V|rsF?01=89l7xus7=j=Zn>HL9*od@BioCY?=_d~VY z4Yu8-AMV`V0c&1rKw@7IWn!H{Rq|k!%i|x0NlVXR-HkN5Unvs=PPn0u`c!)D;4AW& z+Y_2)1rdY8!I-|GhWt&NOmccnz)kKc8F2YYXX><}S;HLo`}Ptl_muK;cJax!M{78~ z^I29s?i?)0$R~ez6O8WLI%D7LtLUP}C(1L+NZh+M+-F7_i@BVhZ6TL&YMcb`bHeeZ z+ZA$gzBr1<3u3@&PmnLrBdvGyKzfM^{njLl)VK_B`W<}vO%p?R4nyXS+3>3DJEn82 z6qb#I$jUzQi7$_C0_jxjhE>2{G?%5whjDconp^a9>@k3cumc+_&5hSO$rz!%8` z%KP&Q4&>isW&XZ{6_={W4~dg>$NYsxSH^oleo79+ONrok)<62|uNOv0{iQaE3*kf? zgEQ__lC!R|WRe-j!@su-i&R8t!;yXL$B{w0;!qittviopA3Iq!)fDRZLK$iX-jUxk z6ggIA8q~yde_v!@G4~G~1wXCgm@4w(({Y*h;Vbje^1wOSPheNMJyipU=P`L2>}sc0kNyDV|yyvb-EBnzRxl(DC%5wC{Ckl!vG zZ_oN`)wAXRcrh$XujqxME~AQa?t1w7kUo`N>wzhCxwtiCDLvAhP3`qvIR-Q(GA~>a z;{#!5p)pncDuL=>EikRPfEtcQ(E$A&AnS94YTX;7%ctqX$G&D_w_FsvHgXO_ySv1( zFbFO#T8^QQJjuS=*2j|My8@)w$O z>je3VvQj3UM3)baQ=R(w|mR(=Wuwbx!?xzHJ6+&uYqA1A_K zDmN!iHm~-%T2I!O-NKN#_w+=^cIKJ$WU|O24rSSBs-YAM5BhRpars8F=d%zVes71< zI(6{UIqvKEf@n1+N@C<@qr^TuZ;5rS}i5KgvnsGAcuH29R!iyXVlqc zkgx4DNYDAE;nN?r@Y}wg?Odb+&}B(~jG3Xjvo>q>Z!a#aQ()Kc)_}J5bIhA}9c;AX zMWWeLO@YPpj)aDLrWYGbz%E^NqvJx?`ZeL^;~LR$pc3u7BXsnV8Oh3 z|A-a@_2K)UJ7CFvW%zag;oSy3*sd)CgX-IfK4viu(+D)`oCezqw)b56*L$qpdKjWE1*utm4B>UZAe97bAavp)QM! zv1Qd;_IA5En{fFLae4QV>g#Q!6+*}y%)ZR5q!X)alTzu6thJ#0rviK1W3lezY7p0P zN0Z2huzmee`rn@te*ND`WY^XhtSi?gZ3W^`q>{jl2m7JQEobI@NKB=h9LJzFNu|r$ zxqV*cOq4jSPJ+wg(5&1KV(TSgL#R7BG`$y+tNLO-7@7?jCk z{CAya>`otmpVk>fvImXw+BjqL<`5X~4!z98ED`uO?)|pok4Q zA7Tf!^|K&0{WXeN-9n|0-0Y?A1>YiGwc6*$DBWIPK~iJOX{Xy(Sdbq`YhGVQq39d* z!EGQd#T+yIcpUlRp9g0vJaJ9E8O-ADQ@*aE_$h2k^%vI&julZv+s~WPgp7S~UUn_D z58>`FWn~~9!u6lhcGKq^FGHc6kK1Nz;Yi+g;5}bT6r47}2aX}=r2ZGK%5A4^B_8l* zR~p&Z*GaW_T_pI2G(B{{8$w1GFjk+W=^3*tWNr0zJS)5n!h{xrBj{osKLVPcK4k^H zgUPD^Ukq^mfKMcU(sD}?c=&6a6mf3xi36Ir`b|3 zk03`Vf;ykw0*iKpkV_^>_$Wkp#oP zt3auC3bv{JV4RAV;2!~R)H_y5h2N{;`7@@l`pFT->#`EEO~K$C=mBF1Jha;44_-Cq zU@rH8;g8$G^I!jHZ<-QRoXaPQOb}!|i-y+hOX!&!27xIJIHFwu{_=mB?mZKjpb%XM zh|+}i(mTYpb{0exb}0xZf&dF%Wq21Oz3|Uorfbm*K_BKz)?>CpQ=M*{6U93f{*syQ5I`FlWsu@#T!-&# zfPaVu#2t`g`OdYlWpxY4_cuxyH&c}zJ0igG&(@=0+!M0!aSE0wOoODoljw@w3()(H z1a7vDK)2d1_S^_RQ*(I($8K0mHdM}qX*%3KcD)>YHGWDx|5lTG>gKris4a&FT-{*L z`2w~NJRl#UUg6EuHQetch+;i~;I=&)ZGsP=*2Y>Q;Vgw_L-r7%KACPBDo5!7UZXVE zJ$}DK9L1Y&QNw~zU~XlTTjp=bj|ZIlOkbv`j$z8n@}AjQA7kBYhIgmNZb|<3EVy!ljt;)&(cU zb>Xd<_4MijRVMeM0hm~Rqu*nXHvat741M=qXohMkwxx8_om`J`^Ob%0x3~bw;yegn zR8JG@7J%r+ddMq@!(BNPJ%Vh(lVfGPkZNO|%Y?%IJ(W!6Hz|}i7-Rju3)F{bS>e5o z0&t(d0oQ4}kW7UJqB{PF&Pn~qo83JLtV*x3q8}|t-%~~74+n-Yw;c&?+JYlR67XMr z982|+ap$*Fya*nl*`K&xy?+^_{m2InmM$jO?km7V?OhZf6Q!5MYq6D z#;L^l;|(01u^y#X9cC79IY^|NyXdsN_OR`c0JuNW1vA2rURCl|BXR&t~ZzVoAbrY$zvAWxCb6;n=sa4 z6g$ZdV&>9Cdo!kii&-$q6taQEhqc(nvOA!$`UtzIC5(3ZPbF^8b0~Ci3&O2c~!hLnpsK zeUfpBhJ7l4hat9bs+H?3cs{2`4gJ_>3;XHa{h!Ij-Y`tQ*+6}*(_sh4%*Et>#wQ_} zw*8C7xk5o?N$Px56SXBjgM=}|MF>)*Q{l-i1nUvb_abc0eM2*OB5#rD$lM5B%c3Fs zR59JHVU3SGyQulBAoTr_4egVJIR5rb?7hVYPtwjp_|P19T6UMWj@+fMOM9vPRe9*- zGIc*hvvH4KAEP^01uRz{N8ZW9u-fw?ThSFtCM~w4BIR{({KYUUe>V{7)PIw#_v%e& z%c?+^e+1lAUE$kgZEEhblldz<3Q=*Dv@UlQv^y7p$ro$P@;AmUIS%B_d_lOK|D1I@ zb`%U>DzGaj9m2=OE7(JwH%ZFrSLA)~eAExPL=!Wfl9*x-+SB`)88?l^g~KvvZp(QQ zA9kYJ&VNkpkQTV*aSmbMc6y?>i=1}&+E{kwGUNBA2yd_cN9g>&^w8W(G>ywfp8JeM z)8;bs=(%vywzd1{r;W14-;?bajic#U?YWW}sJ;Q}PAl=t{k6EyV*@@J&SegEHQ=g2 zDI&9OEmQm=9pi;PuxNG!EHn(jFZnVUI{i9%ws#5Q+kVayTuOty57W}YAiAZHyDPmG z)*x9{k1A(x(v~aVsQVytsOzv zQg+yW1?Z@~U?V=5;wXO(J!5)-8taJB2i-MPuksm@obaJjFL&ajBU0FM?l^oJzQKIC zZ3&|v;_&`R7dM|2r+b8#pyHEIa@%J*Ri4G&mn;e=UK00cR?Qb;u=N2P-Fh1WN1Msl z`xUV92@e&GpQGSJ7#kzs0_svVWJhWgs)zq1!+CNf@YOWnKYkmOg&)xV%QfW294{CM zQ*Jo?jpJkt2*S^-wN&HT82QcR!ip9ihxT87xW-^9E8^4IINjqNyxeOF{&o3S{QW$5 z$R5XTqg;HEe~dm7tfsL6<+N=019R}4F#Z&`!-{{S#E|{WrfCflGw-u_uwWjqd!-k3 ziI0c1DzWtQDFI`-o{jkOt2^#FI;p8V!<-KMxKCYo*ETk0nUe80tzcK{Le2h^q2up( zx+161Izn>BldT&HWpo)!l^}E@;BVzxR>?MS@PO zaFgxiwfL_61Xdm{A@W)Y+`D&y$XA`f(wD8;8edP37NhbJ3DqAr+ zKr5G8!>(Ej_J`~hB4f4`9?g}Y1zUNT?YtLUBbrIW;;H!Xk0HmB^T1zen=tC47P!v- zN_)QsWAqFW;`}6;E^;k_hb_kVwe%h7ogoNw7u2#{KO8wv0q4}Yag}UXV?`Po4iTG( z10eQo2l?r34A<2I(AsG|WE3ufy0JZ2^CAH__5hw6Q^!@a9@5{J-qH6bBAC^$UQvTH zc{p|NXPUTA9%|*T6HA>3P^g#+oumN|k8)?T>@Zxa6-YjRpU19@n~$++hnP2sjd)(% znZDrZK>zi8q8W7%hl@kW%DK64MzM-yiWgzQ$|1P_>JfRhy#hdC9@b5+B$~0Rc;Mk# z_>-kV>mqyEACJVqbK4Mr<9i?*yZt!8 z((T3*uC?@U>vr1PokLeIPGRJqZ-W1z8l=W{;YDi++_3*G5&twnZiEKnnlgS!kXD2( zLcvtzdoGs;8=#97Jn1s%VQ)m);`py(vP}Lg6C~|SbiH)RyIP5+-_{@LUeUdn(4qiO z9H!yH^nWPc6-d&!IUzQmMw6Le$@JmJj6CN@IWdt$-o4EM|KAJAJC7C2per9uDC5KZ zN4TtzfiQXXm4_F;QaEVvh1!pK()sJBGdCQbVHLNBpvkwf+UpEVc|R3Y)Gjx!aW^Gg zI>xxu$q0N>43DY@A5bUO+9TTG&7p2wmDSF|&CLi6tRQ?YKLRjkJ2TzQ%KxbbFR~74)&Q(W&@=kz`tULXF_&l+7uVKYr*&4le$%I+w zGFd;#t8l7Zn9Gp|u%=hU7?+Pe;PHSDrvJ4?De-tT^=ZZDZ9>L#+q|JkLkXwuNygHJ zt1ymFi7i%oM2&aHVO+^sR4<+aUU6rrsuMSvxUd55H!0%v2U+wZq=C*8J*f0-AzfVO zY>x3)a&*l?-fE+#bW2M*&HEP3an~2(cJmHYSfNi>R%+nj{>ectA9O6P6zU`q}z$cQFw=Y1eq_C5($`%d)pgp4Q6 z(8LWm$EYXh1pGK0K;-BZaGALjrQ|Nc&Dz$6rqLRlxz!w&+GImBUjU>?T9Nxx(}5Wa z!#8@Tupq>P$(rs6s_Qhc`o%FUyjRL`q#x0JGq1oJ;UTIiu@81~&(^G;dgR=%ESRpg z4(e$TNQw&>mo5{nldDW-`=(4K&RiJq>a1Aon;iuLM;Br63IllJZwb>-2RahZUJaHoQXWXvqVDC zgl*(_x5}SvXsxd)mQarGdiw^3aNT_AL54`@#KQ8nW@@SJfQrwAxP5FSX-WxaCJl)- z{hPcC-c$tO{?`Ev>oJSU?VQDyzIMhCyG&SgGJ!Etb;Ql25Qh@8X=}d@eSM6eeZ>fE z_+3FOxj7Smhc>fl$~6+mzXfM%d}Q847E&XdBUHI-AC^tM#6IWtPnP@sG8^Rf;!Pn* zcz10ph|P^7`6VVKd}=B&?a~6-%+thES`}tFhm&v7@uVzZGW4d^@XU`I!mRBrB&a!= zp3%3X3GWutEd_7L)CzNa@hO(<`!gAr3DpwTq6e~%6@y!A1_Z9m!FPNAH2NE)QhT)= zy367+RakZtqvub@NQ+DK_O5H>ir^u#R@DNei8_QThd}FDS4enh43gYzQ-(X&%1I}} zC8=k`A?rL9e;okp=~ryp7ftO9zmm1}4Rn=R2(IsrC#E^>_)C8}JY6b-_P#mz%lc`~@?PagGf-$r{sZG^%bru0W#JZ*GpWqj>6vwk(g=w*^d^t;ZX&wegrGN6HL z)=Y*-eoLBJ6GT0FGD%FnG`cNX@ZI98$Jn+J5Qcm*@JV&`8Ja3k@Lq8!{xGl6)n7EZ?KSx#L9X&o`?u ze3Zqbl^ol8kyztw2QA*8j~>kEl*cITafytI@I&MHdHQ$u)J6Dkvp4o7PtfC?J|MMR2z6V6vGT?T^z1*6H!btYJ`0W| z_D~qR10RzAVh-U?z9H)4mPmel*2Mdp9uq62a%}HX1rgmo8vG=HUMOouzg5{JH=&Ty zuPx;KMn7E1^yy9pItIy&+1yLg;`R|n3k`{A??(WH#0iSHA);l&sgJnWoL3_TvR zf^CIF*jb()EE-`S#olCIxa-g(JKy5=r53bl9x zK!as5-h3 zMD?=a)}J9dH(vl}y)z`)Gy-<#X48p}dH7syf@bC#)1&MK_GzM&@xT{zFr57YsP|X4 zTd|ee)fX`i;VxvyqC|KdA&b<}3U+uG&}s>5rZt~qDB2nr$NnD1!6H-ad-stnE7Iid z-xRsEjSrOcKhv?4ev)J=ZMhjD$BhOY!@XM6_`KK{ov6ve=W#|Hm;5a~)%Kiy zH>-}`_;wv1%{2w-70cl8himk=TQ^m@G83H@K9X*oM(P;;nh3Sd!Tt05arm1*h)q?) z4#)jaZFm=iQ+vsDu7J9Ft|8Wr6IRW%mTs9TfTo*u>1S0zu<;kf&m$&uZ^0^xOLNd_ zWD;xEnGf1CuF>y>hoExma+Z3fK=B$2Hg+T$mTOs(sO8hqROdXcMS67WH5`$xEy2R| zW-vlT;NJ#E5_3}>ye4X>Ixi9m>V=7@gbtpFZ->B$28fZkOOt-IFc*R*!xN7AljT&+ zc^3VtO9q#Ply@b!EZ2jhYcZkp9J=skkwuGS>1OlO>;chwaJ70sBQs8-<+ubsGDt#G z!Gk1ZaSxm=_lMp)d%)q&5F9Ds_>kOP^(_4bu=zhNSS0+ETx!2Ln6ACoNI#zpN51|9QvZz5_qI~_@}?iAr#xz8gqOnvQ^guj5;Z<4=?yMX zzP!e$nOJHX3fmTa!IA~18y%E3!c(3fUVguZ48`lylEW*giA6Ov%?^P;(0>FaPuKy!2h%~uc`3EJe1Y&XR-xgM`(!&i4R5C3 zL4&QEk#ywXg>Z2wo41162g$(AJ(1XM`HyaRyP3MJeLz#D9cH#(-h`&-eDI*bBfOh1 zMn`*QVS-04Gj;i4lDKh{?$ffvEj(+u>X1PQI~R5&NWo>#!??v_R^y115Ugm{r&T+h z$rU?GxFkQRDe0^=yw(P&`B#BKxig!pw>#nVf;5~kSqHag*OPlMSD-?uRWQ=xo33Q1xfqqtr}&Hx7mzsx}JDn<}Dezdl|>jj4^Xf z0Y0&08nNFHyo+5?aGXb2&997aqA1+Zb)?g_MAN=c4UC(~U1-idM`0^TEIkte*ge2mQwVP2lv5>R`YS4kp15C)BSERT#f%I2Q#hdOs z@y-bgm~(zT=x+^x_CtdBo?{SKW~Y$Ln&mj*GX?L>k}|H3`9LMZ4v`IF;gH_NxnZ|2 zL;k@mqES)=vp>}0>)qWrw%w8IN1ecQnRuM1-bvR*h2sm~RL-%T2Fv1PXxfZm?m1gX zd}JEoMvfdYYW_k0&{DGHSX!e);A5iHkVu?uTyUaeJ#MkC!mq}+;a>bp>aigaCIVua z0~)3HYA~MYO8%t%rQGcEdK#gR$HYariisOtCK3*j#i!3RCz&}Zg{7uuHKzZWK$BDR%^2-adv|5W7lC8NsA z@3hd>hrUS?gD#)Dq|xsLqrPG;DX-50Q=4R*$8qv-<0&B>ID3<80pM$8gpKhv6CSrBs5E;Y= z8gE~+y~obe5p#lupKstC>p~LqB#UEr8!>Mz7sG);3TI`*p)URgzFHT@xSbJe@)P+^ zX4#yjy7jlwU_2DXd*VUX#*BKLT!(AFxl$FMFZk$^J6X;#4pZ?G%5sk55M~PJ;WC9y zZR5l-$pUV7r$f84G=8fvMw?@oaZ_C*%v{<_OLAS|)R__tTltSUY%&R#s4m2lHSfrh zOF&|7oWKe7F5dHEOY&9uFj)S6NBOqNQ_VB?;NSBAqUbN(RNYfXm#_Y3Xj>8umZk;p z<)RBr`t_I{O>u>ffpbu%!w7?;esWw)Zha&Ew0K+zzSN2lX2o|#tk{j1aCzZBa|*~w zmkYRRV?O2?^3$;!d9-uyIQbS454-QofW@*w7_;<0EVc+?r#{KYo8P{mx4JrhAG=FU z!feP>{uBtWG>4a5##`8P@$9>LW1^{h{KPHk!<` zgpCJGjkLKviI#L3IkEB^S-xUA)x7?zZXb%k;kfJ6bY3O(oI&M)>B|EuU@8=73G$7|1_5SWhUs)tUgQ7fY@RG<1yJ=YFt^$rq zN1*IyH`#N8W4<>g0xNkJcCBt?MT~w@)$S7dh= z`mn_llalkZ+tRE+d-@Db= z+?@pD(UqiWeL4N9e*~SJx8b(H3^*VaP9IS*nr113Tl=<>f@9C=BlpGdoAXT$H#Cy7 zRuS-FY(F_UVFgp>S&*Opxv=z^E{%QB2?shBK=tr$e5YZ?Lg2v^DjVO4N6Ulh8E!ope`N+IqXbamWgCM@ zmzYP-Ho`*N@9emk7%rPRgWXX*kL;a3KqoiXfi(3eMgMJNcirBHMZa9(-?jnl*|`pR zW|i<@h7#;O!%w_kHxMPeRQmMOMB}~HzcAf3g_v)#pkq<%S;aZ_z-~w*XD7WN&MBfe ze>|9MNb>{1r_mrP9S%QSs)?G7HhkQd4m+>?Bn?*PZH#ccH6H_X3F3QZYEa1 zm(Vcfef{2;-kL|)M`Prw@Hvq7$b~ttZ#8~#4M%2~3w{ZXg*!ztSh<^HXH88f;r1f1 z`rtQ~Fo~?_-W{Aj=Qp{U)I=5b9Yo=cKgr$mXt#4J) zOR??Doed_C_+J+B6ncxY5ZY-3^P6+$47exnf>|Bh9 z=ZoV&d)s0>wvYvnyBpbv&DA7WD;h$7cv6j`1XwSv41-g)pwqQcRNBc0Ll+i9T;E;f z8*#$N-iZo=r!eU8XjXJlyeN2TUB_1QBaa;@;0|;bL_y6DE;K&%dc*(_7D? z)NzjCdTc-Eb1}z;uhqO;KV;#B;8a}TcL_}O4}w_aPwIB=1|4zefdnHZ`cOKFmoy;{ zYs2|rtZ@k*e_qFEOgLlc@_4K`I0%bVlaO^NhdEcjHV#^xXB$cbaO=!+YU>e=($8cF zcM8NyIV}*p{v?)ibEJpr#i*E0=y7i?u77SzetlSl=AGBc0>zVXqQnm*iw@&6k##6l zdy2#kZ6>QbmJ-%;yfUL{s3QKIiY54B+=v787H#GDK0+8MyN!6gMQY*F z%DPL;Br=O;(B*}BV8^)^F6in&z|vJD+b94<+QTufj}LwuaPFIa89EZ!f_gJVpgbd= zbx>)gqQ$>R>h*1y7F~fO{;{~BF$mA>nuU1Z1iDWfqN+B7c85gp%KZJTd(Tqf8%t*D zza-*!pLN*zYZ;^&JLA>Z_e3`R4NRM}58o{M!Mj_{BLRxHVb1YU;&jXp?^uR$c~lGZ zls=BHbN#Sm_GFOXRtm}6x1i-cL$s52$2*<3(f8T`a$YGJo?PdH^NU1i_5Cg|o%;mn zlDBmJk*73W`5@@d4TAb#JaqhYgL&5NkEz~jIE z7?Z=ta^F~HqJ_*6h{B%yKFk<@L`0h>>h-v>vZbdm+?XGRV&o7J&)0@wij>y zJkLl96SDHzfAsy-NK|=cK)>@>g4|dDzO8MgCz20=SalA_@RI4fWPMO6bzzpz{!HF+ z|6%si8Msp=2b;}iKz>^nHDjj{srz%_)#?QB8Ob824&FrFA9YmnP%Cq0X%$IV*#uEi z0>+PKaW}1}PvWB-6F3_?j^0~Kv5j7%GNqEp=f09W{9J+2v74aZYYv|L^bdV1qv%Lc zEZZNn7_h8^{WY)v%?!M_9(f6ot7s>y-F~xK(LtEKCV(tXVNYrpfn! z$GZ%;-C{#jXNAG(3$-*;F^Q^8Ki4?@zaU(2cL!2U54gST1nK3!MPIgjq4JvwnVCDe znfcuptdpD#3T6Ho6mj?+T%RA&^aIVgnfIS*jfr4I0pYo&d@jnt;_Ewe-*n;PeHOu(nf zCu+DS{xHazEdjHN|IWWi64 z9~;cge`9{Judlr#I<0}IS9=i_sw|)zswq+o$5~Mm{Pg}eJ9Pp z$d#wqedb%(AKz8bVBa8lJbNSePA8KsMHS@s1ugVGpN{hL9?+vp|FI=0g1A565{Z10 z4EH@>P{oWyWY3DiW^gpRlUzi%NSp=!Mg_9-dn|ok;tt^r@2PgBi1AgsTB=aKn^pF> z!z{HgfS~&ukPVwg^>@@UYmd4#-5r&Hj9Jx8(DyuG&K-bWk;|N4O8`ekW0>)WH>iWy z9j343E^axgiJlp+X^ie^vgYdm{RRF|ym$>2j?lv|Uj>?Eg8Es{;E&Lxqi(#kw2Pjp zeM!b%JfUmkW{?Y0PlE3qf+zh}(lWov?5F%VTrd8ZEVpvSo3_mjIx?HlHn5X{Z5@pc zUn*c|_7{5R%T;i9FD2D_H_4)H|IxPs;o$YW6VLD3OWt7)9s0-JD{okY&i@GkqmxWF zpJ8EW%o|V1X|PhRZA?iJW!L%4V?0hCrHPsEn1g3raaHwSQrdF>d|eiSK*BmOc)1hv z6moIJyhrT8CC72MlOH1!{h3P5{>N-zWKEL~B*H<3QjTBC($TOuX2t@31cFx3)#DD3x+UuWTtEy zb7q<(+^vbnr<>htb#d5i3VCJkM)Hi@iBA4%;&M)pJMSU<_wggM(rO3= zwhKV6iv@5r*&J*6kK_I@*h!on+w<$e_`V{&qZ%r6|`#EiC^|)(xX~)N&HM5?CMZ~HJa+^ zW!XU&zUTuXHA*v9D3WP9M;OP#FyMbCh`Az<$vmkDl)lnbA1wWecEA5dR~D;c@<}c` zv%m*l9^@RMk2xovav=0q`x9T&3-Iey1Id+6!Uyy_ug)X^K3M%Ab0m2fnvzY;y4Jzz z4+~-7@GUC4{0me&?4^5mY$2&F^=za>Ir-H0m0F)%0*5unNVxVr^3%ng&b%%O{j2}r z+T6`tc1{%|eGR$wc`|G^t4A4;r?BZdKWY!VVc*1WoDI%sFS!{DPOH<0+f`xwkq{C4 zXNhjlg^V})J_V~Et(+(EC?+gx#D^teR{jpSCOFtyz6vCY_SE*q*38mIQ**2lYH#_<`XG(rGbjwQKWwT^y$ zZcDZ@ze&TfXw>x1;m%Wb=-0S|Sx_NF6vUQdclQNk-elp_`f4nmQ-vE99k6B^9~BDl z0tIa&j*GmF{tM4#-HzS`_F*S^r5Q|mj;Dk9-#*S5_JFnw2RBapJQ=Py{v?;KOCyzY z2cxW7@_1!A*goKAhTnzK9!q6t`|3o4hL5rPgq7gP9wEF|K1f5Kv|^ctIGL=V3YS*# zlevNh*uLWo^gAig!CyV}KV?;->{GqFH#beg+t{3*&gCKkXB`Mz!-#ah$|ZYQvq)r8HGJ7Nsc457*IE z%@^_6wKQ^Tr5)MVITiU7tzmiOJ0?I%3U0aT!QazD#)f{!h)u?HVyMRh!6j?)$*~5a zr=ti{Q{wTj6@ODB_iWtZzCV3y3W$IAI~u6l&g>XSpsP>(qA{I%O~FZiSZ%6I3;agu z3ol71?mdB>CVh>iJ)>mufl>NkW;*7qI!C%oRSBCT0uj^|{s;sTiG4hB&Qlb>iK@|p zTS-hsj1iRb$Kh_i^2TMccF|^eYXbs~(M0RcZ}EH+cB8#Mvmz`T=S8n~pto zC3J##P?L-j`abatzE7cObAB2AROaE_KP$lCP5}A5@;1gMej@3*h<%D(-nlv&Hzf$_tzVKa$|ZiO_LTnqIP;jCMKxoTGh+m^)N38LN+Q zxwT`sM8nb>`}6g&E-p<~fvJgvQvny4BPQkIW3 zZ8xaipc*m1(m|hDJf}gfyBH^vE;_~Ah1_nsNT%#e#g%ee_^>?`w;c4Rs`9Jw?70V= zFD`@@U-BfDC&gi%NDcX$>Vz4y)_}a{4H`4q2NNUy&`hNia4rnMwyOkRSg*r1!cO?5 z&lgTkK0$5mtg!ZNA$Vwd;JmYwP`9d><5bOQ+RUBL1Rq@C&NLzTPA85!*^lrxFWN?? zH1^Zaun=FLj^WMQ>4@9CoABJgQ?fWPm@3|T#dru5K;rit<_34xOG)vf3v#Ssw|W^n z@6Bd-w=)(Mn&*K}AxlT5XF_I8GvRkMXAf-b0k;`XiTH{jvX=hj?Ow#O_eC_(pX0lH zc@qTsx+$1Gb31Oj_L0%BPbAmJX4Bv|PwD>|tD@b9Ib4f6&bcXV+&?@(-~CL&y$Qjn z7|_kDf4KuEG=gFCsY2qYaDaJL7HH^}XNBHD+02J&4)`KN6Zxmj#D$z;-WO)mGR6hxIu7tzj1J0)@stz$P zZcz=(L@M&x6;^x*q1QAxmgPA|Iw)1htaD`HybI@P_&AH3eHP*StLJcqax$@UsKVbu z-bf?1V}-K-6s(lPOS2l^Nk@mFnMPhNwZfFQ9MdH0MPq`Xwmt0qG6GMFYf1{K7B@8Ttt_Ccs=Hg_xTlB*$ zSu(vnpS*W%Mt;{`veLMaDPH#-4)0aP*Z)Zyk1x3jIdysPx8)JESx#kmf5qUt+ypiA zQzBVkL#VQT7~v(J!fc68ba;9Is?XGhALsAk(2xtFB~U*B8OWjzu{84)=!4fUu6&HPMxM* zqH{sv=?2d0SjjP{0wC^d&T4(gG0waSnUvvL6a3 ztRo_gt)!Uq?w%G+#vh9=62r0vOqebLC)7=e`due9lyHE{K3RBiK0iK9Ho>j?CS%3( z+eCXqB38cAfRWv2;A!{|D$8*J^3PqzlMh3f9S0v%e?u+Yh4HM@2llF939MGmLI4A45n69Mg~=Hu&Ag6N#lgZ`6{ z)F=sIS4#rDt)5AseSi)qTjMFu9LOlng8eI2!I}6_lBlIlGlk}1J^xuM-QP#9EI12Q z+_&oV6#&s!lOfbO5VW&)!+p7AlvVI&6IE=fxXUJ9=e&Ac_VO@dr3kxPUBUQPO)#Uh zIGk*0n`J!EXNZ4u{mAkg0(8gT7#RI~0Zy>Lm=L}7@LqS6HE#-}lfs_CjMHk+scDM! z_VcLr(QT+4xSoj0Mu6YkTG-01CAW{iC!Y^ZBf+gr@b=n*rd@OI@s2o%K>v>K^eb;4 zy6wxuYF81m>~a&is4|VJxZfcniji>S#Wl1^TSa#aOdn4je?+MY2Zs)EYoVVuX2UwIBA(?;vShcFC$o+;}LX9J?;} z(W|CT*q=KSQ$0rMqkA4`;k253b?Sy>{cU*ubTb$|`wmUCs$Q2^vu*KJ`03t6Ilwg38V#cg)#VQB`=h7 zElJzWMjy5HD0{w$`2_LECN9L|i-aKU_%t+2E2O^$gP6wI30U!XE7~pJjuu|;$rPJt zw%C-*<#F%2@xM~C{m(53SAUK=9#XLXPX}q8r$%j#ic=LiOFE{!0ImC)!231}ynI;< zHO`|6T3%3cc>{WEki_35!PwR%1uJAZ4(7yO+IDauYvhy!C3}Wwl=WihcKAW`2d45I z91?K+T|eGASBNbGgS5Ucka(@#Mg2J@_0uQi^j~NSc#p>8gNH@9I*!FditE|m&&tV> zTQOi%o(!L3BFW65Rd7PQ5K^Ceg3x6Z+V;`Dku7>igR{l)s$e_`y8Dx!Q}Bjgv_6i7eCYRb00%>S3e={A{_sHz7@9n zmXqthOEGG`0AAm;oTkMv)cwGG{DmLbK;H&?Km;F=T52c~zLp&S%$>`T|#o zIWCJe>m~6131iR`tRzzl3~;_d3XTgWq5IJ#c=ee9o;Qzx@N5QuNoS#_K?ds7ufZFW zBjD4IjdXxpV-*O=*@)IxyXm94A!_yf0R15$ z)HLmjD$TKuhMMIyD9f!6Hu1wW$TR`%Ha7u|zoF|Tv#5sRQ(Ck+8ol{$;F$~c)Har% zsO@;kj2E=CF{252P%R=D?r+sWCHE{0krgLVP>I@GRXENCVONb# zhxPT#U@US0hMq6QKPUA_`hyOp{RiJBQiV@g8)8+cTp7 z)S0sLb0Nb&860JW$tNQ#y!Kucy;p;@EPY}`Nkwn>~w}-(TC|Dm6;IyoXfAy zHCcQv0*;p?(~_p2tnJxvG~$jh84LP`CXfAKTI3$Meda#%N@5sg+Oi;T zek1E_La0@vKIrAF1Fd~h*dVLR%>CjCu_EViPMI(kx5=?en`fixVnACH2UnH)T^^#(HmX*4+y&->|KO4oP&Vk0-HK%IjBJMTmR{Qaya6BE%3z?XKWyZ3EHi8e!FS&+_O4naar{$3 zOzT}5mUHuoO@-&cj3FnZYKPRHX26J_7{;vbwvQK ztqa4TXH{gHh$kGpxP$Ha{DFK~rv=XrNke%2UeaZg3{HdBh*yIOE=%}Jt~4}5N8SbM zBz!IG42H4d^mchUQ>5EV#&`PSf7f#{W6~PV`}qk+ z9ju{q(<+i~wws*)twl;7gb{;=G}M9>xG4E`qnf-2wOQgvo^0kbKI{9H9&FaY2GuNj zPX9PI+3DfZBuV2kYbhdBqXT0yTZq2xSy&|&icapuwCU;;)Dv;04{z3xpXDaN$5zt~ z3qO!b2H$ObF68*E658?#%p#BaDn@#*|a~$JJ%U3^Js;plLlyA@sj5M$!F{>1u=S2 zd4pD$IxLl)#rBSmFrB>3@Vw|Xc{{-lDCGw9@oVDJLdR`cMdnT`@v)RGOP-{OWsCt z`G}rZp1|PD2eIAX-`PSI8HVosQucmshE+9Ye zEo-^^5?y?+g^8Gw4fmggQjeE)1PW#~ojf^&=YO@)lbZ8@cdnoMW~!iJtQfPH1LuAm zeGgOba@`pDL=3QHByF6-k4Hv!5kI5+O=T8bzfvND<0Rg$&7@ z44ErQ;p}IjqJd;clteR?>8nWt-u?dI4>&$&pXb?Y-S>4lgMQC9=2gW2S=-mFmsJ_c zu{#Fn@ilqS?7W;@KcGhV=e5a&J0(~k(GC|=KhmGuxz^>@m%MA=rozykMymFwn+OIa z;R~0G;OKmc@ZY%NBllhCyGtEa@;%vHnITqY=oKBPUWh9^vf{Jr!j*xY%|jN51ee_=2@x)=yDMmsoXD%a2ON#T4}(j+W% zBWN5nM}e{P5UD1I-KAR0@%7>GttyGGykRDE!RrYm%IB?t>U=V=XbQrXyKO_^<+IhNzqKqwM<2dsURA6QimP(+vjJ@1h;0>rrp^ zF^GP-98QmTLI=ITw)LpO1%PcJ{L*&U4keI(Nb_*6+P9k15SsGND`G5lV>1Y@&B@yM#(c-8hT z(c$uO3Da%Z3%eG=#9kBJDx(Ny8eA9h?+RMG?jD=09e|}WGjU8C(6q>v&fU>UXQwQ{ zJfk8~R#y&3Y|4O*z)IW;Q-7ECSW~VT^cEbj^ zx9I@>$=MA1vvu$?SAtB*?W3DYO6b>$9Eb`xrRMfpKwZDm{nVJA99@6{*AEia^WSNf z!&~b2`#x3$KgA0>UNL^#{*o{i6Yd^&k6qvwLcW@~QjZ7yoChxy67F|^Np?JR{5pnu zr_!;vyPgi$+{ZpqNBZ>NT(~a&kN&v+hYUWOkC}}oxIw?2c0c&UJgLj3$xltOz`6vb z77Jm`)*Zwr`7exZ4~0lc8PF+@#MgWw*p({*p#d|oZ^JzNs^*7ZC$Gn8_2ne~oEBN| zJe3r`$Y+jSI7<$t_tQsSFL6S!DLjw*hG+XcDP93`pE=Rh_b|VjZbzcpPSB7Bf zep%w-_noTU-hyUlx}kZkHU2A^Y9RQEbAdWuV3xK!(xD7F+_~v0(>i$z)A?DF{w|zL zCOc)(a2HhrsmnrOYh(=80daWXfE5|rWd@rsl!L>|^LTIVWs>3Q41xD|!G@GVGV`4u zmLz-AvxC?0MM@MI{PP|6h)=3)wOGSMYt1Lx{j+eb-hFmcmo@z5*jGMlYG``(JsRF# z26M8saV>YBx0KI>gf;xfk4+pR(HEn^slCYy6z$EzeEDh~(d`(m`S3JC0s#GR?y zA=2y#fA1>>!Z)j|!_UX4_`?lQ&$ic9p<#Xr9Y44xGQ>QPDyA7-HC~2ZQLO zoBzS8`4+fr-b#8@o|~s7+{NNGf$YDt0*9?e(kIMzp zUE9w*uG>f+^@q{7g|T$gKTZOacb4$-7ceubzA)NJ)7Z_r$)FXmfcm!>V`F{_4Lg=W zykZX0;k?SqDoq*f^*I-3tG^kChfO3xmVA~!!+1S!RJ^I>Ii2a zKRXU?Atk8oQwMfZE->|QEK&BFgbT0S1jR#L9D6q%-gNrG?AKvfHmM4>#Owo`sjvBO z+g5{&co-^tnrC43S)|f8dOztJxJ*j7Ee09r#jb=>;2U8~Joi9LHwq!{$^$gPNCnQ9j}VY~Rcy@5Y`$*?}E6D$dO> zuH{1f<}TRbYJ*`)O_=#GoBnxsgo!_-igMesP(^b+{ESq>-$zpMwaRYLS{_58J`P?y zTuOq>&@fT;Ijv=hFLn!m!x8zX7tv=d}=>pLpLm#TEIT@B~^51_`p-=Hv*4tMkF z=!GFeJax?o&fI;Ejb1abnsPafvo3VZXd^BUJx%t_oB*!ZKCVBk6`_vLuAJfHkBjuY_(P1DsSlr}2C09_Gd(Z!T7K|NE^DY`3A_Xk zj#YMz-EzngS0~SfG9?*2_FpKGonB1aPDX>nL`l$FH4Fkrk3eXY8%(3s99#P-~elJzp<^jb{Sa zy7|G)qGbHOxhIyiHEn~@W9Fi<7|)v9kp`+t1AaN;RB z=C={-`nqB1pYv$C<_~cdB%F6Q2(yL6NxfGxeZ;vhECiK{4#2h(vnpr%#^B^Q2JO=)upQ%<$YJyEkW~E~q^&2xd6nyU|J4>ud=W`TmRgaI zKX=haokeV&StzXQ%_I+2G?RNFl+3*ohWGy*AQc^d3@&Vgcdz_uM(lE&6KYN6 zHQth=y$Sg7Qw((soJp@(oWc3SNnq%95#KwC!0^VOOy1#dOxW0Z46=;@7vD#4sE~(8 zRWoStz7byBq)YUK|(_#P01u^c{&MgMB$PPO<>jsFsjF zvR3$EpEuq%6EG-Q@D-+R_s4<0{ou35A8xn>a@u576dAflrlc0Z?QnA}N$?@*MlD$X z*b6MSrGwAp6-0I93~ihsM&@1`1~&mgax;b715Xix*3vYbSz-ZJbGMP^95qc(02+AEjQz6@Fg&lbBC0qe0($0mJI!>q;HR_P~D?R z`0NzN%+_=!D<1D*+y2Xg%z6HxX)I*Wyv&t}p1B0KcRVC_F26=waUp72UC8B?{V{#Q zbU1z3hPLjy!faHu0eVZ3qt9Q?bz1K3_mw3NF<{vR^Z1J` zYtZg$0xH^np!`+-cs61sE)bhwur0zB_rHF?=IqWQ+6Grh@{$jIM8FQAa4;xO1cNi&{`cEP z=(;CfdE8MOl0;IV=*2s-M3EueX&pG9Izg*A?)$N&F}y3kg5k=R=X%Kw(ctSHK}}rV z(wm*n*=xq#^j!9PdeYk#m*h2(|CVjSEKkk@#IcuSoa2eUAf+DBQz375Eiovtz;&ZL znHuFzUgpm= zJoxf-Et}_zq?qeQ>eZaakze$j-cXFgt^qRH*Nbul#j z2>WEHne_5{=-+40$qQUVW)v5If|?p8ys3iguUkO3Tp65iOT*Mw4Kho{kQI1$2yG{< zMuS7O{DqrKN$a%baQJ~I8k~HM*|M$l!4WIC|MmqD^nOhL-VDXFvx4cFMX&Kwj}*E1 zPL{G+Q6wbk1g|P=8>Da<*yO!q^!Qu`GM#0?rm31|I{O>4_fxPd{|K{aPdO<3X9xnH zmT~XFbyRpyEPYsGfKvFDx^(8Ui?o6v%xr$;{F6(`5@B%^84!SfwnM~ul;hKVsvrg? zSy|w?qDNv5d*n=;PLu$T7L8b znL^^wqAsY+zUcEf(F~#Bd}a)1I}8$pEj1B0#(Te!h9|=4p(afC zRV{!?5AIPmievf-*V9#t61lzR2pvv*1@Z;|VAyLT>zEY^emVzu9+uoJS3(D0Nx6e! zR5T_!|3{j$595)gt|&iP05<;)>T8(?z@wCMa#@|bSAUrXRJehTIDFO5%&>z0GSfNl zjXL;BvVR8TAvg_gT)t9<%k_vC}&9OpHD`$;A|4S?mVp-QXySuRPp%L zK;|d^3f*u+2Oi$#*q^cIV5e6DJL~mrct6h&3r3z>CAFy~qVnew}fLJWKg_IOIqyDN1@Y3G^A6YqaJc^5;yZH~?Ugd!EE^E_yue~t8 z^%b4=P!>a+p1`kE2|7)z40c)P(uL){WTbTuSg#)CytOvu+^IIQUM33b!#(Jokje0P z{cF7Gc?q(7ny7utEPh3)6)Zp0LVZNIteJ)c%<8#A4R)#%AMxi@z33Mv?vB7YffexN zOBiea%?^{Jw7})?ex6EWF!h~q9db5vdCC=X7-;B&`o>;Q&vUWMpt33^J;9v2VX#9WtonE0fQWKFIjEBnk*`~*Vc zj$is$Bm&4|xv5y^%Fu+)g*d(|2wVf?_-~(%k#EXfcvj;#wQy9&35gvbVYCH{)bb%~ ziYA7#d^#Gr928@`LAiD@t+44QweoXW$v=&>G{+f+PI6qYEw-p%}+C?|{*s-GAj4|x;c@otl#PLeyX+*pSt8I1( z>4JwSu4GExIz50@Zlk9ykHD9W_sOI2t0W+wC9k;t-85T$di+5=ty}t!(JI-A-Q&@m z8#5Cfoo+EbJBx@Re-Y|(J9hQQ!B}kINEI9d;7Yp;#J<#JJ%);?t#%5^?8+tH%fB+7 zF9vusu9niOwsf#-G^0kP75H-JW>{dB4v%a95hWfE=M9BHrBNtdA)QaBrFy`W{TV#{ z17)bO)eQE|rR<)w+0;)k9}Jh4QLSTXbmETBRK4{I=WLovje|?6%f)>(qb7wuG5U?m zbfv+hqm|ChAh2(KCd^tp6NB#_WB&STkTk}Pezj3S>+;W}u4Z!?W1K@LylNvyvSN7G z>n`%=$s+SouZEQK1j!PoVj_E^iPZjg74})kL*;ozqDx-#Bu^bfDcyYXdto9fAH4{F z_Hj-=w_c_%_yT-T4`Ge3R#M$B7O?b7CdVR)=KtR7k4c^$xc}!S`Yq}MZ8@_E1gFRt zOnP5WLsYUEsVHq)YxtB%ghZiVuozZ^U8VZUoZo0iOFTMjJMhIbIuZ zqs~>#OZ94)Pp3RHba+AZE&1FN^TVq^mLO2RZAb@Iy(l}Z&?ZT zeXFqjh8Kv=9i^LBd-Juj#hDQH$cOiKCbGWpc9fH9WF5K`qgX&~>Me+{%+6!EY1MagGj|_w@_eesYwx z>+7Vd8=X)_Vn&>49w$js(w_q`L-sizyr6$@LH47`O)9~M;0QTnl zYg8bBkk_JdbYxQ^mMKV}PH+i#CWTaRNQI=rr1hwsTxk>B_{dZIIcslo&BmTs}8~Z2N7F zn|ihBiF=EHH(@#(B0NR~Lla=ZgMF-txHkq{Nt3FUTvmVM9kSAk^Q-SpppvRwmOWk{ zc?0>J#Aq|zSGr1Pa1Pk;nYW19i*LLLVOMZ%lZD@FE<%8Q8!q@~0b1k@5j;8>gYN91 zLiSfMJKh~?=DZ{-6*t&Q{WE0x^<{Liemb*fVKaVtCAs-6HnO!$2BbBhPF(wS=mkG6S=v zS;R>^ncO#+P#IZ~$`^=$?iDq;wxUH@_42-HXKHlq%Y`N(44< zuF`uxQ3!sOB*LfuaoX<{M+&lYsJX;Wnsw3i$AYrA=s#KGVbKG>h-B zDP|!UZjvXrDyMLakk7Da8HM}#KlR#@pOZZbb4b)&Z)SOwDvW9G!~^M~m}k?32QEdD zxnt|-dlPr|*Vq_!XuD5FY%W287oW*BT1QlKR}l4uoD0s@0w#>H6rW3xw)lm3r_+d+ zxFsHiUB+lnSQTX?Mv2|gV)VV7L)|X%Il13lCOfW_>a4J%FG`|09BZ^c zg1~y=VJZzb*-x`3;jh0>;Jaj6`H6pWVD>eL%-9--lh0qss49LVaS&YzZLnvEggmEE(MC$tY3aN*7jOUs{{BmUye3|qOL18JH3|%7* zn`S|Ej3x98J1~v!*TA5n8)!(+qEgp&A=9pccHVhM z?mYTnp>kzzqh@8%wjt^kr%JMyy(HnE|FBzrULwyFGsxDzlMJj=OIf>dQ@W%*pCo@% zfI`#Bm8rF>$c#_p)H3!Yw%9up5s^}Sv1K<28m>jF^yBCkkwMd?Lx{wJVUncyndiwhGJhh$)|@IBZioVB zHA;?)29WcXrda(w0L($35qdiZRmM-_zECbBeL;?1D0@b?$P^Ndu{DfZYa??-;4FNY z>W+{1@aeIy>NvQ>pQim%q0RTgxcyWi@zf2#b<@xDdzLxTOf_HH`pOg@R`-Bxt_2*I zTn{x5(qQMBHeOuq;jG#U%DH9}zJ_X^y3FPhqv z+JIQYI5B=%0o?-G9D{WWz9?@eqYHK6Qu_#9YxmKNDqsRRAoJ9_L6QbBR zfWN$+lFvnZz^ZVJ3`<`od@g4LM%2yG!D@OPyo$jf=yP{NrS8^d_2UTSMQx_lG+! z!>GvdNBC(4jH2vS3|zJf`4vH=_5F7GRO%>4i{0}qTF(2kVy+h&_GZ5(| zVz9K`57vcbp}k=+s^)A$-><5mqjZn+RoEl-2qpeLNob&)!4q&efM>4{k*#6Mw8P;c z7&)gxrL_y(TW1AhZjnTlpp;$YX8dOW9d28AV0QvH(~m}UQJ$ajNNY>|sA@IHkQ zv&DPimVF&-G)oQVvn(lF6+;Y_CL8Q@nF&vS*)XA6iM*XHNoe%l2xrqmyx|lIVfRGg z_>=#rQN%pBvqu=+({uSB6%)v8&15{ixDoGoZzg>~2`EOai20fZ?!0@14gb=JrrKk& z)@_K5D*Q-xZg8V9v(3q;i4(CjO`Nvs>Qei53$iu10qMzS`c%1uq+dEqs>aJWw}lF9 z?UBOfKenJU`8*w+cZW76?1C<{+4Ss~FZ?hnggHCnu*N2Xd*;poZ}=NCDe4w6DJZ0l z=_9Pf?2jO{Jp>(Ao&_QE$N2c(O;S@djpHI^!{^toI723Y>b{O9A3W=*rMeE6Yg3{p zZ`YH%#)CwDUn?A3qQO2N385=ub`slpnNaBQj1S0StPINrl`f?)mtI=dGBJqh>ACE~J`nf1`yj ze+}}#iO)lqa&-vn&q1AA_LNNT}fxCUjUH0Z=^L0ZT0`x_pPlh2B?Ay7>e_i6`{ z;GKTt`HlhlwCg^7%;opOgAZWs$6S2ZJOG!a^U&V8nN&@7#rXl2@Hu`GxTgOG$G0rC zUwxBJ+Zh4j6?J%4;0E`5cmQ)YaV)_pVcQ@+xdt5c$|TE zuNW|PFZIaNB~uK(9=nAnLcY-L9G7m(=iFjjmc4=AEA#XSn0>&dXa}9+98Y+ze>Zkbzvm_i6q#5UJM65~32{CvK~*`} zZ1k3y7O6-x#J7^4-IwSguLu%$^)lmSuM6Vw$LOct9VoLdnsJdUARF8Z(A8o!maXC# z!t29G>bzg{*B&3TX?r1vys!f8rVy|$*TlmIB2e|^Q})~RD0ubg6kJ*=3qJQ_=$>`m z%;3Nx*qz=?77Sd2P(f#G{2YxYi;?Dg;BljOOl699p3JS#n<0rK70WV5Jv`Y>~p# zk0u&OUq~XJ=fmj6C-P`S%rLgCodm{ILr@RrL^N4|7JjwFK+G zbHA6JSIP7xT43@`kH6J&9frKSL4BK_!#st1gt1P+mlqCl9Hk7}|5qPHvdy7aA%VTF zsR`c%HPP_)4R*N!i`TsE8K37V(C5C6-gB%5Gu=#57#t5D7Mp{{9AWslcLu08Pp*tl zW8mcETQE^C7N@2SkwCp!;OMs!-WUeMWLpUXhqa4v?$zUDTYe8)-MkL3O{f7YAI@L= zrIr{yi-bO*8kis}Vj%S{g&g#)kucU>CQ)&F>0<-Pe85oV$m0aLkl>vj^#T(-oMl9u5~~ z+F>u({b47Fqlvf`=>9SwpW7F~>DFk(O=^hCr;<#w`^a$IAVvQ}n56(jR;-bqlu^NF z1YXdcKPuTv`&=+|Rs*~WCy6W+I!#z;JN_f6>thG>pAZe3=!v;Jj5YD`ogfp-BoO60T#;PfxgWECM`)@9t zbyb_BXce=5M;^mnMMKcee-1M|pMzZPLW7-MiQx6;2P_bcfHRW=;bTK4Hs}N=ED7nO}q7uVv%P#vw+%C!X%p8mG+Xugu9qKhbp;xBm$L3FaL#FsW+~ z8t$mCnD2do#U!amp0sfcVK|_QbDjJ_D=3Jk;I2oCjAXws z=N5dp99OU6T*gno&x!cH*U+-IPCLDkEZ5iG2$vfx)#$xW-(8UGdieq}+IzBY6=eeov)l|4z{ZMVo1* zsXzLzi^7qTEoe3Q9Ai6U8P-l}C8LpE^j3g1Zs-?AwJDp)fqp4nHCr?K{!JGRuc&8* zE1I#c(GNe4xPZZpWB4F#C0+`#M4f`2_@z;vb6>B8?`vP-s9gx>+Io#lbza5x$x3kU z_jJ&deNP^7JN!<0ZZ1&TMD;D?@yJJAY_H*FQ8OeA;^QXJnse4fRVjv>fyIKy-&T6C z)|?cM7~mFVZM58$iBl>I;qG@9SrJ7%Aa(^?rMY*~lpda!>m`@cwu+Bk<1*y-sfj&HMy%@ZD-?vRI6#=5S7+IfG1ohqo4!q&?FhEL08T-&hf`9#I25sY>EIWh;6KY2l-voZF{X z5Ehgdfv1Wdo5E$U{T?N=*WJ~@YpDUA@asl-|9(kd*W*_EjLd60CJ0jzh^!JYkpTc>X0)fUEJ@hoZf)3X$qpSzLP|J=y2 z$Ynrv|8$&L?}oFe2$9liBqbZopgSIgK2P<}cB{ zc#~}2?~gGqZ}IFmO_*5r8VAX5_D^dCQ}HPe`ggA*yqD3$=#&_#Kl+<`aC5q?dYas4 z%HZ2{mEo+>mH6#SEForDba%=u_*1opdQKET%;j?8w%WLOatz3pu`G;bG8IQ3aX!pc zdg!<-mP8q_9}9`ens_EboXDh{#1;! zn%>dNUHUNlbq)$fMG}dX-f(vTK}JCz_FZd6$hm=L+<9kvq!aZ{YT^e6L!w|MKvqel z!^W@6N#=9zp3*=-^q(nINS~*3?&x87_-2^&Vg*Ev@F9Tn3xo)+fN#ojrnsUKXIgt2cJDQxUpq_>r zI8%6rLCG?0lJ3121`P$kKHvroZ{(9<(^;fvN;#xf1KHna3clYXKnx*KFrWUDV4xx2oJMrpv%L-BB$qo+b|3o>jADl& z?OZkOcdVs{eEyJ72X7j!{f&MJD?+UU{@8L}nR>-=U2W}t`d*aFy%?;;ZF$ASG;j&) zEK|TF-*n*ERa}qtggcu&+Ju1yznQVk_lP(ORDS+-oAc!+gKttCb4}EP$oWsH+>o=L zxg1(akC-jO874aTu;we8%U&dJZF10a=}C0zT*h%o12FWR84)TAhJweVTt`%%o-f@E zZvqM-_r)gs)gDjY*bAUn^+)oOW5dcC_F(F06Ekb|4Ct6}1>bHD1Qo9*WXb)NsCID{ zxcIDMw^=5Ej=CzA-zeai7>8KrNG>~MeVyi>J4?&0&(pEHx1dL4F3L#+BS$*L6Skk& zQTsFW9V zM`JQmda8<1p1m7v^`^lkzgS{Tp$4lKvj?~gY^zNL=@CsO-RcA*kC)RJ0aI8iR>rEIUrQs* zbK%XOBrpv&geb*2n!shKTaHSi^zux)+V~?~GgQW9tT=Fr+%9fjTMpX7Nl@h=g!}tB z21mVw!MR1@G+BQshSod5bn&woP%MU0b!%|K`yBe|LL|J2r0kjzXY?qNft21P*b!$3 zixdhu=7uo1#s;HztR-{f_vFfb^fMJ&9ESdLhw)xhA)b-1$HddpV0J_wCq%}Baj!G> zJH^o6&*$j9r6<`h=iie%L0AsIadhn?X z=j7Q0XLjUJad%nrB5XY^-mslx2BeUgrf%?Zg%}lGwFo^eR)a-W6SQl_F6SAiDu$wF9jp6chJ4$7J1O8 z1-jR``v5nuYwYzFM{tR_3U3qV%i1K$WV6aAYG=(M_kY5VB|2ZxN{8t)bDy}t{) zkCii~A4XW?C!u&Npam2EE<*b^h3u30TR`>tJ}fn}pwINv$UiL$R<8UBCUnK3zi$Bv zlk&!S{TZmCt%rSkM`@wNadciH%5fHuI=xY@tlDdX_rC9EdBq)M=CD0}nv;(|S~94O z&V5)ml+OFy(t=)I0+>7310{ABvd)8r=)JLl97>)D8|O`ci2NDQqSwz_y0) zT*%G1V#tsiB{rq1xb`U5$!5MVA-!cpPW~b1{CR`FXSU!85gS~^`AUr58-Rr104+|* z2L7%v`mMW&ey&o2Gyi5&#U?j&SsV%z#}?w-(N1U>n1x-D=cuf4Uxm5E04)D~maJr= zfth!fW(AJZw7f8|m}v&um|XuP@u z1UU{%{q<7D%R3iZ6F1|GRjaY1`VvTa@1jv@*QxG|jqtAOd&Q^kX)J&1d~{zq3o}n; zfzEA?gRw7^73Ca6KCRAlzT`DX%7~ycPfDp31O8JAK!YhIWRm?H z)c&)P(Y5%_&g(paCf1i3JAbU_P#^59U|`z1++v0hAU6;lqu7 zq+Rp|bF9xB@uVWxIX(ps&jrzA+p_V~k81Yo+pn;bh(P%yLHuHV3txWwL&ZZRG3(`A zTHD6;kF`Z?}U|>`MH*lFx1h5?0wN5Hm_)TWdLu=GYK-|n^Ep5A zTi(nGpeIiBSUztn$L~)pjqhI$N;#|1XDnD~v(U1v2 z_&v;<6^XxskMsW0t#OM;ZL$Q;>gcBzl4^+Gf&%m6H`?$#10V=Owq{)|^;PI7f*!>ttSkhglZ{Y-v z18YPcid^MKTMrPGrLEmplKy3Tumk5gaF0hR!L&!A28&a^neoZDTf5G$_$K2E+r#R-M>%anL_nJ;r?^A^N zE3e@f)5Xx;ZiQA=$(S&I3C6{^<2hMT=2~|r3e5jQH;TU`PT&6T!T~ef zgFvQcY8-vb<=HGpy-7~18EzB(KvcIoV96dG47)KIW)4ioUdwQBk>vI}bL7#$YCXRM zs)@VlCU{up0Jat~GF8+6c(sFpkze_MW$A^wTQytr^)Ec z^CNq&3_+2RB~DndkSG>9@pjJ?gwfyzCgeQNt;ScsvzgR==OeA#ATtn>C zn~WcBRujpG@gR2YJiN%e4OV;Z@cygOgHWnK-FIXWxieiA*y_HaU=pGS! zA;#TLK9gHUa}1o8br2&fE68T%!*Wk+lKCW!B>c|ByP}~W+89I=-#GJ|_+=b}E)#u4 zxt(11IU2X8f~nnYk77q7VVhejmro3$+A~tV|G5=NZCpzb9Vvdd&@z1 zaSeOsd@kFh?Zt|9xTB`77MuzyB`;1j!(BR`OlfGN*&<~aeDN+lr=$lnBMRXAn=2J& zu`NuccoDlwV+G8RwlXz*@D7v~S@V(48EL;`@Hm0p13b zs_7-K0;|~%YYfqr%ZiuZ73MIN3o-gY5+UNY@MtiSX#ai$PTnezIIPHX=8y1y4Cj#i zc0usD!<{d`IdKg;Y?uM(g1i*ZJ zItpHl1F!0pxVDXtK|aAC_VOO4UMyvvJbFrI{Pe&*@5Io(e*&%*c}4DoE`%v{&uMwg zSuEc0m0jf4ODCS+gljh)!%G3vsVcXJ=+)gu%%qf{eYBW-EPF*XPEzo4*a6>*)2Y^y zMI=~nki571Od7R)agn=BWyID1id_MCisLQ~5Bw(k_kRGr`%-B7Vj-;KIvOR9Wr4Y2 z$jWT1WxucZ#n$DRLw0}(=8Eid|^YDzGE+z|^CdlK->T{*5SlZ@hLIj>caVWWZ`4%YE)MDp>J*&qCmhdX#Dhp z1e(k=*k|>Vly+Ul?dPUoo?ryjn>pg;v>ImPcOR6?-H)EJu_$!NjYrFNktM*O%A#Tv zw<&_kXPf~=C=YZ>H-M=^HEeYh1(Po)K+Q&#y}eJ2j=GnUNk^WrH4DGMbY`Z(yUt}a z*uj%IHlB!fnTpW4vz_a$Oak|P3NU3s98rq+Ol{;Rg1!4r8hBrux-G24Rkuc=;kGh9 zA6pK#XO|2q0^f8v+6*|J)@hqj^ zMOpfo&7$$`vvI}KxootB73{K0Ch^at@y_f&knM2{pPD^@V_Ij>NOUV1oKeeY?bd>% z=YwSEkP|oS8|N3wdEgVDC>YBz!vD7Kz_DF9C}9;&3@aFVdbpDun84!s?x}=zw8g&H zVz{yuAyer&{ZFI{A1~=+buTNCnh(b4;*g1}J_e9EM=Wu$o^wpgjMJ{tX8LWzRNO9- zNQI(wAS?O^*|h#KL}?zSEwooUI zLv$V{aWn3tYZl;}ABQ1~$pyOJ5)PfpB3j9p&}zLg)b=`(2FGiZ7hOYkICCuZ$|3sC zUX%06>Cs*h25PxyKdQk79Jc0z>AozY7MaTW4t{{6|NKEcdoQtg?L!qUv~lj<3|jQw z5DOptg#NdA)X1uzP85DeTwW-mO6M;2(zaq~Y%hj7>kV+|$U~eM-h|=51+yrvDa}j$5SxQvxaT4JdEhwj>*;u?4Cv9 z231oVP-&qwG=~LJfy2U_`-6}C$cb>VY(M@jUI{Tx1>}%bDqL#HfM?UbVCe;OdW`-d zkL;iG9dx|P%-W`s*WqeNw0QKD`8m#Q^`6G>JPVJPn?PYo4SD~tjhb#-3Lj4k=o zU=ry}(_6S4Yf2;3ZBe8x??#E2#2l0kn_B5L`!>`a<%7f}0k9nqAkS?0a8^B>%<>Nd zJy7DEDNn-zQ5l#Z>H$P~9z@TN=NGJ51JOf`xTzK}eG@`2k6va~ z6?NEVuQ1rPsF>I{UdAT->F{5ZGIl!$!!PM-cz-L6%0K8P34zPdUqBaLd%we5DT^^x zdvaxmMFBnK8-=Il#WEAQZ2PF$IBgi|gYfmSwDmUN*B(uJ;lnk07c$7y83a`KA>Ac7 zf;(#|k@cRg1V&uu;m@K96gKYzmG(pEylNcWeI3Lcf+(=**j+@xZ~U z__4u@+Vdx1QnENIkA*_`G&{QYmKOX~Y^JH+(@iEWF^9y<{p3>TY#1&Gg3zX;P`~&( zlU!7T1-VaY!oWjNxNL~&Mka7{dL&HVs=)i3Tmv?WgEaT-bJp5uCxkmS!jO{__@9ag z?^*R2)mKaGYv#bKu`f&r$Gb}%%fwDw1JG4-rVG60qrty@Or2jRS!$UFhwf-#{CJLC zT4+fB)wL2C8&~+EK29(^t&++eHsW-fGPv#wlHX@vuyU+F)SD)up-em^Z|4{vJAL@q z6=%TWjP)SfWe!IbHSw#ul*!M+g*g9JGbq46W{*@LEb6i`nWIra^mfj`@{TmjESv)7 zVz23yN^jr|M8kuzaNK);HSvgEPHy&}MnTR$l33FV-RFnso1Hnd!EQCN4?hUL)<cj@3|BTbH`bZdY zQ|#p2DE6@JumeCr1@Zlrfy0fHAb0u_kT9NAUAHa^uZP4lp0X))@r@6pQ1lRu`%XZ= zZyIDgngLf09-!i}EV!P(9&aVNBKg)p^DOG%omwoM{Iv;u5({YUt*xkTwj3Sj*y6)Q zK>UiQ@NU_jB_E>HaLMx3+-^e+9z9=(OW&lk0rP8U@1bjS+`~jN+HI`uoe=e<7S_$i=F2bOA z31lk$g;j6+_@|6yNswGDRlUkF>~m9S@rES2Xr_o@nToWac*ay}Reg?nRC8|2RX^x4 z?QW=U9?uI;Gh|C@HPPUOI)*lD(rtUM!AI^k-08!|5|c`7Tv0{hywXv+s){x~5fvPN zIY}_&z5{{F@XN*3fZNz#a@p!V6b)s77<-mTPfJAKl|14~JgMlTe8w)ygZ}MZP5r)Q zkv&9Mppaz?p&#qf{EsH~FX$uY+uC^ zcaiCI@%a$kuwn&ftUe3oQreJp<}5nA4q+lVADqSc6mtD|C4`)fhBW>ovP#PVo^$NW z!yQ%RNA@^cYI+b(5B^18$wLs-_l=5y4v6Xwu#X$Ke5mJnI%Bykwa6=mleLAYpTqf; zJXo^r9)aE0#l5^i1B?pls5_(=oB!7y*A5N#MWWPLf-2 zi}an%U?ca+kQ6V5wuj1cd4dKKnf8qN(S9BsxE4ahjla{aa zr)m-$hgAL_S!8t(UVO`hd5hWa;Vgv>sZ@j@vO&aTE8vO&xYEgy#C0D{6qZNQ2k zn7s1@KIGpg8a@?}oTP$!ZNtPUbQ+U2&yS>q{h(h~*AZolYIvkC!u6<};G3Ndw5?#_ z`$8PMj}mnodl(Gfi+;}nvDWhw_b$IkOaFDiI!}Mdj+X;# zZtm`GUC#NinjoPe72}`jlT#h*;jq?3XnA^-&Q|2ZxY?u3cb|=Ps5p$=EDWF;I%gm` zS{wV_&!e7wFmB+dV@-oG&6wRrRH`=-^A2}-Au0lUPnMGpg`)VNI|zo~$kMytwdlFp zM3@uL!>?A$*cP8%m>cz(pQ3z$dbm{4{GtdvGL%MIu4G{2qylbk@c^EQ0lQW(iD&<& zmdp?17~|^8xD4@8nphk_PwtDxKaz%Y@AY!}CpCb%D$LNBZ_k*l-+*0? zoQM7EE(jUVhsA1KcCc$dv8yO1Hrtvw)_@7=7tX_R=Rc!FxuW21%@)|maUZAdyiLQh z@0hf%{6jC*e&GD0N|-Esg)UgqjybWWIPc*V8no*YaqoUgrnKbJ$iu5>vd=@JFKY$A z=E!5(_H%Sw&atY~r*09KJg!4It`vhBIe%Ze1Xc@W6KAu{@XAt$vaPo4uiw7R&5TCh zcBJLQzsU^aAac2+o;`2A739u1!Y`qzP+=;9vQI}~^Y9t86L+W0Mmpq$&dUX#QFoB_R)=2=gh&T ztLg~fo5-P#BxAu$Ym+;p=jqRv|H$Q5t~06Qh4Vb`KtYNgeE7Z{e$0`?&!)HNaRX1B zcTI!6e7_dWb(doB<^urS@8sGHK0MJGCL12_0V}%;XutVC8uH%-d~-yF#F3?Rd#$M8 z^`(vElfrhe7F8e(Q=j0LH!|?ygeRD*W}>=A8@8T3hw|+yT;IEziDEgHTdNN={1-rz zeqF~GVy1X{wk}wUN5H)dZz`PPMC~~z;jT|fq_L|Q?4q{9*q2NayxokA4h_L?Ig`0e zZYIs1FAQ(>LU8-=6cCj3kcDry;^`GSG+|#o`}v;`bZADCnd>&NF3}L7k<^7w;BJ=f!`s+hzkU(9 zM?rMemBWOmZB66VRoO;SKis$K5d857;yhHvv~;r}mk$#mmx`i^-=H?Fi>-hw`MIgf2 zgXS>zaj+^HPC4&DiMH)@6L%*hpU1QDILQ9qwHDf69EQShj@`|Vf~cc>6x!@Tg-?%z zx7*TzqryCN$_iBGLIL zsr^3zI@ex+)>F=8EIbapb)T?$r+zc^wIfWmKZ0`Ej-YFj2%Vb;iJ+wgH;k{KOi2}} zw{ZIxdv(rxd5xcO^_TGq?LzAC_97MSNrQzd^7y7N4C7}>qIi&NJE^n5@ zKqoWwHG2TRjkBS9)DPrNIpgQ3a<*9b8JUmY>8YD}V>_yUZ`dFaZD9Q>9khTxif?QH*NvWGVG$7u>f_=y)a%7 z%kkwNu|KshqNSlfDYQ9;huW?~hj|eFtF{>T9uviYYx+#5MLS!b{)@ytY=er6gGA?= zEU&WSFnpcAi0s`EgipVBV&)eY>SsF{KA$&6H^v2yPiQ0}7hJILbT#KTmJv+ujKvk>QNER(Cr3Fzs;50Oj_xW)q=H|t+X%nj$!{vIowb7G_@-`>8P3qv0f(#ow z&kPP6$fq;(-=f=Naqza*f%vv`{(rY$08fhR0zLMC_hCcyh}uOwZU2SD_NYKVUlNtv zmUC-uRbE$L4B5opMzS~6py+{C@c9=sOhCAA-zGj$32qP44U8q-BjNDA3V`AoFmJqqi2-EG7Yu{$v%W zB*XYs8PJ*>N)7e^IlImp*0#PP&mU_uE%A0>_9~J+9#Bn0IQEQsT^?P%dOTS@97?0l zWZ=8wirEW?0)l2%%NJ{A1dAq~&%Q z^kl7oyC(p2yi(A9_H4W>caNM6=XfxG&55EJkEq>`Cf3q1B=@1H;P5X;X8&a!u9qtb zJWDS!xuzd>f78Y&uHWCkMiWji6^2xJWOe+P8v<>n{Vk zNSI@Eez(Tnjr!Pmsg`=}X<^dUBw(Fs0-T-b2>xZwxNX}r=GV2k)YR=Y4f|~gr3TY+ z#bl0C7~zSFOr5CC$8&V<17F%HxdQA;O3A6~O1z((ANT0cn(FAUHz0JG3VK9DGp|<3 zlHRZ1>4W4pI=ev+@Np;ovY3xrTMLQvpbW?+#j#m_!=yGM4Zd8yPga?fqm{ilohlXv z2M=+4@@xQ$JzvRX{%o4xx&|z|quDa8C$uU`2!CXmvu=u2uzHy#ar2146#`A7%-$n zWVSE6x9>Qpt)@6-(G=Pj$9Y9oN8)a1p&LzFi2|u6kE+Y5bGke6C~YQX`9I0M7f5oI zHF$~x-9(bxVSoPb3SG2@Wi4V8z_q-deGT>iB_A<#Ccz zUrF^-lhK$}CYyUJ+0fL7(70~~_;Ee13uG%fe`*_bTXqD)Q-k4_-!H1hoJU;~j_+~# z9tnuhfo0j-V2E?ZmUI2LfCyn|ej19!hEeoZ?@Eb`i8^A zX_gG`5{n}@qw8s{;(fk>&s%;*L<3rzq+zGRQ_^<88azD$==v%xCPVoc6rQRiPo^7i z|0g3vaaR#B5U!;gy4-NZU?A50q~{|ak+K3M z7>N2rN4HS0GnU2){m7)=P=SOghm4Dccan?7?`c}58XgdY6R-x?GxvP#pJibB z8EL8ymy`dvfZY7M5Dz=}MjuA~tti|JFcxRkd)vimf)fZagVYGD$8jjRKO_L0G8*yC6g*r5|XDaW;&SKhe zMFOpv8tioX1Mcf%nYNOhVDO(c&f9++-fNaJGrNWucsoK{7doPtehX?`{!DU}lA-Ly z4W>Ar%fKeyr-eIqqw33@*c6gL626{+wgOeIhh+#8@;;J}IkF6X701761<>cY8#kE) zs_{CwEPpV0qjCe+UA_ptw|}rIHz;?@HH8Xkj$5MNMJ00#Vg6}lF#9wP6lL4ss>2BN z8D0$ktphse>K-co#uuV?>f+3TTAUfqxfQY(!}q<;c<`VG!pwtkc5RrkSbr!=$P%oP zdq4(aw!+PYIi!c13->9VW5YM7F}Y>>pnvN7NSuVI$%E82{9KDA`~6AgO*c_yrg zy9ZPDlu+}FNS2Cbpv;-IQ26!%>ro{R!HMo_ynfUEJ1HS$)@b=_*n%A_FT838;vj%N4vRzUjtdl^tdtW3sJ9}xHfiX9u zaBDbyGkkMk114Wx17i-7CY!>qVzW>ZRF;O2Yc=XHjl03t(JXSBTtl3c082*V$qDHY z64oREZ>2(rK0SVh^OPelmW{|do0n>ER?SUVA|pmk~caX zjEF3Di}BI1at8K>u?_V zOv3N9lOLwzsJYV}VsbGS+y0Zr7t^>*lD9VMjAhXLgjFbY$_g#wmARbVZJJ(!a3;ZSYX()IZIXnbFS`dCKi1N@NdhclACPI~XNk*!{jfLh3BShe6?ld3 zVK|p2HYM5Mb3}F9u z3+Q>b0?3^qGIBYT#NPeDeh55@aV5Es_jolvof(T2k8YB5sfX2SyZp(y3_o~UwG>7N zxLjC$FtsTVkiO;e*tPgGJ#gKMEO(tmjL+YI8XZ*1m!j>fc~GWiNKk%sAX|b1A-$ z4n*MvuGFMV2^LQe!3q0{$nfK4cCfK4U7q5@ zXUD)H%!qp)QBoq3Pjy1Bk-PYhuCGiZH_{`htdtof_$0vn&@3<(^fRvA%IuvFT-Wzs z4(#5q4^bDdVni{Z*{wKu9Q2BQU0F_cn;kolj0zc{NH4C0 zQ{PI-);q04DTA=n7uK*AjaGO~sFS(8bOyt#O$C{`g{0EzER|1Jf~a^mR5-s1#!AZB zjTzgR;NnJzTx)HTo|=N?&N<{8cMDS~C}7qtlS8&r1OgRY@r6vi$t~|=bg66e>_me#WD#f zekp?pJ(3V~9M*+W4>y`ACH%7XNxJ)r7o4D;ltgFxgn zbKAGVcyx~gz7V-e$)ZbSbA2jFnmQSuzgEN)zesp&%|iHEmSj5%;V8Fdzn98mZh98e z9k=$=ZwgH$<>*WpG?nLXUvZbV_*Qd9>mC|VJxVR7aQ@gq&i5$m0ER(%H0@IjgeFX0hy6yVH33zzw49Adw!)r>QF@&9qjR2TQTwDhaOdME`hS*t zXrsFEMD_-#e+tLlTEcKeuoQN0`bBibLNSh=$V=dEm9yXQ7|*wlFzrYiaaD1F=>ykT z@$%{LQCEt8{z)~=IWfjw&(<}mbeDo)8wn^=NfgAC1Ba+Q`H5yHi97hufS_c-bIQGDMjCt&h|p~FxVe(_Gw zraKc*pccoU`8NVPm#?5I%3CpDc?{XWeKSQ3Z70%Snn-R(I~dJ9K@zXAOw7Y=;HTFB zuamFfg@gf`)i?o{zSf4%7M9#jw-*#zu9ESe)NsOGhLw{pXS?n*<^f_FJTmuCWhxQw}L>O*>u8P8*M4IuHeF{X04pYin#s26{j4GEsc z-DgfzN4xo>Sga~!Gje1CTI$0Q=u9|?OCm0`vgI}F|u0+A}eXe{UG+S|DtPn*1; zzx#Rc(900SO@GrJ9@22!uNrIpB8cR(7|dAzh_KmNRNIB3ghK>mG5$FI{9RN&qyV3b zp3=?3_wiuII<#2JgR7c*xD5I?LY^&xCn4+MghDC~74HPSt+_N${|`}{DMrsK9ied& z$JjEHb~L*y4^x9@W2G?XTj?&KpA(#6i<>G`yFBMd0;;k$>fK1 z2+TMl#v08pA@}2|Ak$D80=NvdvX?G&Sc=2;x!*x@u@Ibjy$U2t1$5cTLL7B_Om;kW zfw4&~O!Yctkm#x5%V;jA50jHga^*>SBG(b-$e+O5wQ`{0EdsKyZjs;F$1%t09Ou|w z&*f?PcswE>TSLO=ueGKqdjB-uHMzxX@m+vFhr?*v8ScA@<9JI(hG(MNNEDmIV^ zx^^$u9X%RCBx>)lITOS15qHT#^Jyq!$w#M#Csb5-8ddDIfq&Ed$Ue^maQ~qWwxJCq zD$EIDw%J18gV$8v`VP)xo5`16f`JMggY=R$zV<6*K7Krp=H49lb9^|Sl9_`V10mQl zQbKG4{PEM5EcAN06%Lj)!R>-1;`Hns6mT3Awq1!a4zWP>ZV~+F--Yfs8)41GJo;&E zKh-w*!&s${ur)$*pgKPS73#c*pAg3$zZeQaax;w#W~;-zU^Q&?2XJzEf_ii9nX#-Z zr0cmhbz54*_HDlgQSDMZb;UAzs(L2`{1L|zZCe^_>Pu};zk)p%0~j%n-}Hwm$1tg> zCm*KN(S5CTu&m#Q%i&g|u3#aK2qwR#Tm&Q%C8RWKBK6uu@_qRpHrxY#rU4hLEw z7iNGpyen{BJ_O`~USTdH4tK)lFkd(;#ap8~s^WbZtp6yGX0V5jKNHboG>gd^8KEjJ zqP)saFKD@^KHheo1izNL0PD3Ky++F+OEi&lRgOpPb7$y+KbK+WL_R&KQHo<5xLL>pfMlKvsW|hN4!Lc? zm}`S1T6QV>I#L3P_ryYboL!O{x8iPqZSLtekIThglRXIW&{#y|%>q z3=1+#QW*?aC6i4J7x7POJ8R{UL*@3ju?5p3;QaM;@-V3!;{xOGQP@5(t0qJ!z6hLN z{iP?%;@LC8`fyb#w}Hr^SR&Co#&R~Nh~ z9RaIM*AfxCPWs)sf~vUAK=%pFXtGEN{96^^>vmb*oh~apY1+?VqX^08eZMUlPTr1x5A25iee>|=mNMKPt%Nfk+mpJ9hEys< zhwF{KBX9bi(WB#Lkg^?DsuzAy5S+~UM>QkW@ruYy=n7Q;%ccHCZ>}uGjYpC(^lvli zoM9q(ykP_UbDK(qh40e(&AOm|@)j#0{{XVxu9!%Dea%{*(ZkRVimqZdlq$*Kgx8Xw zmnp;BtSy2+J@(?GIBuSQdX4mQH-lQLPvcxoV3U6$IrI4?G^e~Kk=Jj5PnQO++awLU zpDV$UwYJz97Gs=;1aF2>ax8ldYn+}*Dr6HGkwr;--2jzv}eF$!;4oFfhan=v`Z8ijhp!D+S(uYyX@#6#zx&GRWaMSXBXk2EaK z@nU^lqES!1k@Sg`LrUuwVrnKq6>g7%gKLvuq~DlsI^K*S91g5Aco{BpJqr^!j)6hv zI->Ktj=YMEg0^KFXk2M4%sqb+x_{`=UAF6RiPLy|oVpG?q~mEcmO`-4Jo>L^4xZj_ zh8qkssbr-nUNvu^86M{_?D7QEUAv3c{A@-g(}T!gl}}$-m_oq&6Cn3O8l$xikjr6< z(4eZ6`menQyhl^fz)b?qA2<)r#|v=5E{?%%JQM$0Q%KSsqKI5dItXiu^Wuy+{zLE> zUeixx4UTQ)AoYDj3}i8O!(K8p^pBd=-iPS^O7Q;c!`4n(fW-%v!o7ztiB?nr*~Ddk zEh7SO`r!q1e{3}~(kBL+pGrV1tAJKUx%5G5CAIPmr7h$8$gsmb42@7^Do5<`T}Khw z>6OD)DjDO^yTzQhl-qT=$TO#&|Dm-@*Hg9NEX*3GLEdvb+m3hz$X)fAu0OmGS6r=S z^S2y?xfU|GJnt8@Y3LI76b&eOJBwD@O@LA`#w{7&VcOOjxWZ2$H_!XwmHA;Hw1SOK^)? z=_JD06LW|r_dQfRP7Ho$sezAV0JJ+^qnqUeAzW$;{5bf5icOIh$Uol;Esi?0a+4{w z4OtEsdJIwfJGcK@E`+wRMW7OT4##$PF$>O!;hpi87_xI3n6A}?k@j)0Ftr_LS4cB< zDP>e3dI%>jQ~6 zCIhj(1>A1$4R<&0qJQ-mthHK<20n^p?4Tu?)#`=8Y$_&t{zAvTEAXyT2rdPkhDi^^ z=`4jfI%N$~zJ3S0v-=-O@G9kpHSuANX#>9VkHx@ka-6@p7~@j>vGi>l$-DiPPLY2~ zbjosJz^DwI{Oict=VkcAJD45#a0r;Lby%>L^L-r2A(mJEW4CQ0TxZ7_YF=mJxn^#CS&O)vTjS2d)oZ40m1gK|V_kzjA$?FaFD6ae*hk4n!iz6NQCG7sC4v zJJ?p-L?+EPfyTFmsOqx;zEo7hxc+ExO0b7+Su2oleg`23L+Z`Kz>)K57N`ib%A z+7byhV_%4Mb_}QnbQ=fgO0sR{aUivOH;@Cdm~(74Sd%33Ouq{2lQ|yza)w5adqwu0 zKL%F2H{-Ck6tzsF!0&%UZr5KR7tC_Vm3Q9E$i(gN@MR!wx|e|tvgPRe{U(@AU55KB z<`J86OlBIDdcoZ+ z(v@&4b*O6KjW+UjtU|FVYB=m=hJzbZvGWDj``Wb->QxG$f^z%)?cWwE))&^I=tMBr-?Zxn98^ll8U% z_-dq(*}Wx)I1aNU;m`mP3Dm(IAIITdIS9Y(chGu|TvVKSh}a(g$;60r z3CQjwQZt0$xpqF>anJ&BjtMnQwH3G9bV0&`FeuY6LD5Yf2)wiW)7-s2_)7>Tl*JLg z`T`htVmuDC)zCGnHpD|_0W6Ji#mP46RL?w=oqn*K+D?2&%-W@iLy|HK-?~UNOZK7c zm<8D^t^tLMI*3Po0d)5%v7`A4g0+UfV9E3O+&9`78!BB$3iqT|_b|QG!RtI(UFuEe zsCGi$8h=_kJ_vayZ?g{PE)eDJX++~8!CQiOvg4~RIr!0uI%u4LdnfI1R7?hxW|z>Y zJsJBgL-`=cFnoylafH6{W6 z{JBEPp4)+dT|h4GlENe@GwN6{pErKL9|lR-k+mDnVfN8itaoV{HF+`&uG@^Y>}qE(g7$D+zq!5dg7@+aX3xahgG{CgR!ZNG)!$SW7e#MV_(Cn+><_0TZwLT z=--JhWdqdzv_H)I_MVjQU4(s?$CG@MJc!lFfg-J!bRu`C&2IAtQurTfngsIz+GiSqTPOcD`zt5*4^KTQBTa31B1oOz=mwsGgiCy zmJ)M3_<%*_hP(7bAeRY9@?mD|osCj+`kC93ff#?`8C>-LN9P(1lYzaeXp`}Wv2~jO z{U5g@2#LeoHAeX38OOj7$!3=vQYAfwgCwVY7ioK0gt0!OtYcy*?swu`b*Dg zJsJa5O$=Yri@T}Zx(kQY>gZt;X~wCAb3Kb5Cqs)pn8%_L*vGLpVs>@X*SaNS*YE}W z&+ebed+`VK(`+u{3#Wh%-{9|u%ix(>K;?_xkkRb3km#KZ?+o-n;;T1ZYt>EWX%0n zO|F{~14FFT%E?&!AfB3xgusiaSH1mD~Yi@HF z-`tBg**E?kZ2d0`toJ;_#0%AMH)Ae1)a${&{cR-IEsajFiY6Ug#%Z0C6--Z_2qQUL z@n2Y6^|b?^ncY>Luq0`Upfq|DHNX4>#usjbMURq+#=Apg?3*%*`Fo(mWHDMjvzyDL zHNaibFEpO>_)ec)2QTp_$=fp#HBS_>D-zC;302|(MFkPCi&qnDM_2MveFr(~cot@R z&SUHin&ISsgJfGLz~hHg!Nj(JbSoh2@Ue!^bA;ertOM=1?@vw@)RQ>w`{4f91@uP8 zTnKWX1V@V2;Hrt2;C8kgv}otU^-+L8#jQA)?n&n>HJZ$_nvCn$N7LU{E_n3V5pr3h zlCe4_g?IEXlWIr@KRG2lTKkJS=iVlotA5de;63m>$R49-m%;PbU&+hzSSsf~gjbhX z;m&Iw50e~} zY3Y1Ry1z1%3GLwel1*H8FfIslKX*|(+g&6`t&@Z~r1LH2N$@Tu>+@0!uELSXn=Jis z7c-~%KI-ICMV<>U5IR-iZ4U-8Rn`_9ui)?jq!t6sFr(n-? z%vTqIG*d}pra8%E>zqJ1m9Q0=2V72bPPGX*PJ`gPY4qX)0}>VxPnPthfaKBOtilm9yuZGi z+56`urt!@nbdNo`epnU@#o|%q@Idw0x0CGSYg~7*KLDepUSr!a2kxdGLzQ$Fky*Xl zsPZl$TH{TGK$D>*@t6Ou7X+GK9d_GNqD#TBqqdF(Q(Sc zxcSXd^go=+h=%+od8)d2VK2vkX-wnXg6GgMBoMyFh~lE>_AvjoD?A;}ro$PLSnhQQ zHh*!V-(CqZiP zOzDV+fwdX%ajO6;(8I=E9Pm?Vq z*k>tan4djBp8J2I(@gBpfPWn2WftP&Hht)LC5#}+^{)04^tQ|=DLwz^cT8fQ>TsRB z3p-58#dXoZ;s)!vdosE@zb7GG10*1CA?UrZhhytHxgD7hJe}V{H2d{Ytz$X)d2N)= zyj_a@Yh__d=4;l=tpz@0bf6+??{_u*WFd!otE1Sz zUxwI)#S-YuF->N^mxdze05b0L3_<+uxfmnI11n8UfZJVYrymY2yzgvCX$E*bZKirN zEXbK{Q^^V!KJ_cNB1U_!gVR1+>ZW{()=dm#7q&iOiOmQ0_r3&LH2)l2Qa?(zZoG;i zf^6JWaFmqkokL+AciQ`S7n)UVH&$Kym|m>>!OAONz!&q%nQ-T5d?56O?0M2hTepbO zAKf*WloEl`8vs)iQs~xOMP&N@kC^ZNo+wmoLaV4AQpTGP)~d^xP1kDi^li>j$MH8D zzbHYcdpw!G@DiR3ya0+@M{ud+2e!D>f~*_cj^awG;NX42*!7qyFZcEYjA0y5ygd-M zX_%0RueGBwL{5o07BR+FENG*98WO2p)prtgm}3N{KE_>p zo$%R61fj;_^Zq+!RONN$K+*nfo&x6%X)@1+e1h z)`MkiK75_kN>2Sy!tHA9#JSgzjBb#C(zJS%?(T-9Cle@KEX2zu4!A(>2VZ;+*Jo)z zLvKAErVSnubYp!7t;(7Lo*xAKrrq6Sa?A|Y*f zC+-dpq}BXh`lkFnBx!h(u7i=VV)Z{2EA9(t{si z(>eaueR@F4h_-9l!;PY3c%_m=yuH8BsWCTb!4p*+F&BkG+1q5K&j=6XaDJnes?6=w zI-GSuo6e~G$1Z(&6m^fgK*r5ns=6Qo?iK=A&B~?UJSP+3VgYrMvcQcS3bEZU3Ew~Q zWX{86@LaV7kA$a@R@rQJWThQ@$TADW*9b$qY$#c5YKcQS`DC}`Z456;WgacBppjO5 zVr~`*ORva)=*?WVH)kCVir$2%Wf>UQsZDZUti<$Z{b2U~9$VjZm#-5L3oo-3VTqbD zY2%Av_FP-aH|S(|2L@<{_cV6(o=ddTSPz=aZc{1mc4Fo=4|{)41ci5w9J@mV2i-2x ztOpYO|E6CAlaI}8#(`?8<(|&`S({Jdmo%Yli9RgPalmPzABm1$BKu#=F?wk5a`mRo zee{Nh1a5skhM#|Wk*NRn!6utT_Vn*S%#d=UVb3bbn9(V6`+NdUkZ6Tj;y1~#ST)0} zU5P*5%W(X!Y4BmiG|u1PfC?h{=%;c8H+O8n+K2~yKf!$Rb>VU?JByqZp5wlIDj!f<4 z`Xgc*^uV$X$g4X8TXd8KyliE%M6-?y6(!Sc@)Gn;#4Y%8=^|`d&v_oZxo5c^5~H2V z@T$v7@Q{m#=F<~kRq7FVHOOT`*5oO>Cpc$`>Bv%&fLXxD`9a)+IUDimI@v+X*A?_3LUKlOdq|&Kk?j(p8Sl^0B4u!`!a3LyWigd!v< zh^`rF_)be$;Mtl2&5MHRz(=k_9hFUs{zj8~Ly2VBB@g)HbdtIE+gnv7cJn{f+n_oYGC)^4!tINk6qiGK}#mAl1I1|@?eMSm(E};u|kG!5aoB zroDiwJ0=J|)qlbI!xDIUxrE^Ayb?Sv>_mD`sNfW~B-LHe;R$h#E`%%1YyFeZMt#aXbi#o~NQ3kUX1flkl2u#|&fy8f{&+V};!{I*8<*DumIax|r)YXXg z_CfH}eYeSL@lSML#6Cu{Lkp+rY+@F41;W!S1GM|ZBPO9g9*kB@;Az(^Xa6ZAL-u+G zS9b8AZl5voCzjC@Q>F?ETeZljl?Br*Cj%kG0jykRf|6=2tv4#6Sq|4I`>qU%UVeen zkSNH!zZu!-_sN^HlWE|L4EpGQ6rG17RsS2uiAbrCj5HKNQjx?xpXU;xrG%)2lE$|} z!>EMJviByVGBPp?=kpk8SfwU#q4b4&!B{VR}}8{kCBKC{?wYAbx$-cg5=h_)I&NLyn}9GM{pU8 zgl_`n+t2Bd-Ul!uR7>_=D8(&3rg(YHDD7Ta!#GSbrh9L2JFL`L&|o;ruu>| zIlY%g)(-Go{y4#%uc1)L?E^O|#ZcuV$?SfiHvK~nBjMA3yOCyllEKPSde#3Q+1aua zc5ydVoxRnP#!!tUWhNtCr~oxfbly-(DdO|lKt@pt>RmP_KsLwxgrnEuB?W;0#EDcn|$oN zwFnEj2}8SKJ&lhcC@Uh1J~7b*?R1$lB^KBxXhbCXIhVQ4Ojvht0(4xvL*}LTA;<=U z&w6!iAKU?@JC^a1JgV@bH{i^x$Ei!N2;LkCBq9Sbyd}~Hs8*mT{Fv`u+xkiko!3=^ zg6t^VTXhKJpKu)ed;6ii-wXAcb#S502~cbuB1!94L#W;WE6epBEx#Cpa>7Nd_+p5| z^83);P=T0DHiw!?1)vZvUhj8j8~mMk8Px7QMYGb-x`5ld7!ogmGBXVzJ>Vtj%(BA$ z+@1F>F<{K2WcUsjN7-aH9SK@V+6o_ z=`-pzJ(9+(*JRUNn^4o4aNXnT+T|f(xMiI;+bA}fX__~me{B`V(|e~0&l4=M@aj|I zza)WJZ3qTS){S|%{t0<4kcSO3eW7P(AiJOA3foU8M7!x{sPnr>_~>hZ4^wRDrtnO> zniPS1?#pwW74BB_yN`5+aGXoskHklQi2BR@p@$TU(8)c3=6*VhCSOIc@4O-_vN9EW z%o6LaYdj_Awx`lh9P`6M^b4*~TLP7J6JVai4EUN{#}+yq#ZM2O(4=Yh_*L@^T#lXu z3+rycyFDJ{CeuK_YWLG>%NAHvtb^`cej|MA8~RLO1GGPir_F=M@uzYk&Y2YsbJje@ z+K(5>q0!~ER??en2owU}R8y?!T2O(tzO!g@6oW?|rVD!xF8^j0|F z(Ly(xc4Z@o1>J|7LzPf*?GTK*%3|!bUu41j0F;RRL-J?0lcW7g*ehv_zuyUgy}mvz zwBJwXa9x|*hQXLMO&ptTT&UdCVSSY{Nv1vWEKC|e20**3&*H>)=is&8PbBVLG@{-Fr5zp64s+el_3=`z{@l-l&HQ-4h9JG|C3RNJAWdGe0>cX_Pip!Ke}*WfhJQ^G>MAq8{u(R zL7du@jjKlN;k5NuG}``x{4u|PbEcUfujLiKnhX`H^>0#si+5*v+6 z@m zp-#39MA`R1w^$q+y!k}F%wJE7?6ZiR+CQG(j%?($Un80xVdRQi2eo~jk2B?_pnJ;} zFfS<(tI?GLS(`5%lKnUX0D1RopTCj%)-%y4}P3AvX}{+txy zyLx>k$K(7-&-+Md{nH8U%?_GVm5s9>9fos{?@(UcG`wmo zLd^xP($va2_C0rph>{B+O_HbaIkT1XrUc^iUqN6$Nf364?Z?Xcc%pstCv@&8B1481 zu(kLS+DIP2OUt?#zpN@oxv7VDY4bC%RoIDHYc4~Gk0Q%d9D`twPW+pr4Z=akPsV9rC`e#E7zSJT>}x1Ps7XxuAg)$fF9^K!y}8L z>899Az^F!1;aCfZ8t`4Id#01sUJ1Wy9E+{Kw{ z{LQa~Su%5=C?*lUUzmsSLm8y>Z7{7#6a<+q$6>;PPc&tQFb%xuh%p7*vCcaIpZvH( zW}o3)2}T*5cX>9mEBY$P_phYP-D6ns&!g_W>wd29tOWeL7V0KA0V>{n!|NybXcOK> zOFjZD(#}Q~-@oj(Y9V;IJ`FaW3Sz#R#iIBz3k;qTK>Ehl0s4o6MVkZ)>$+ginMC*y z<;Y(1&cMsuE#CePA7-yq!`G$TFk^N$nVV#ddu|NS*5M@dmD&VfIS%E|H{*CigmTP1 z4!!t3jRs_$0Gk&Zxf{V7DjFnN5zD#!*Md*$|RC z3k*`Zx$@5}@cgw6@4A0s7hm2&&+Tkx-Z8aUvt&7!0aGW+f19BqwU<8iGRF!go6O1H zhF1Gu{%!D~d^boNBd8<*Io(o(jU#vdywKa-az9O@{BbijC3bsxq1pizV<{!~a zq?7Eg)2-!4*lXrNFt6n=b#2e3>y=!|I>A1|rUlaP*SFB0&RlPER~RWhaD$kbl{2*i zw}{W&)9|r^K+DT$^2|FL#7#QLoK=%?NK6r|ikraK(G-tfxxp0XMq=KVI5x9k5)R20 zVu+6|`nM($FKNs{gEdt&DOQeVCpE&|WR4@QznDsKEQ*glZ>aBKUGBM44F6^X zZ1P_C8+sjQ$Z}r6@=6puXMnGSw&EtmrRdN3859?VVx#+M;{50(Wsm{^G%pS7{Km5PZ_(s%ZYdNMjRzo!G~1Q!WS zfbdu$BI-N=uE@y3z&k!&=3WB)4Hwb#z7+0#tB237FM-29IH#deA+>R~MZ1Yg7}%W- z7Y{1J-4rp77uHCwIHiNso>S!b>}aA~KAZi!S`z5LLA<~BE1C1dlD(s12E z4f3TsAun+*nP@T@r=FJqahEXmQEvu!&(njw6BuL;m*Km$(I~v?7gP%`;<6X5_}|}5 zX8YXhtfTZCG<8kGPb*Zwu|5vIIkv+@G$J=nbUfWt+w8$?sMW{+e$TA`=OYaMgMUEZeJ{Q*K7+L$m+|9o2i$M2g?=$-n4y7x z)T>+%7q3etdHEsmet0g~*1Z5b%YKq)V^(Bgml}0mC)4J)OVRFDIDR-J!Cw@f zi{5)}m@r2!sKh3LedbyC`K|#j`Zv?<$M-N|^H|0>l27GiTG*E{p76!Bf;coSf&49D zSlapw%(uDGhi~(!{FC$G(b@n7jw!Ih#}TTl>ab9<9lXyyg^A0OU`*2s!D$AWK0-nK zST)W0-a-5JRYR7SKdcGt$JROtay^~P>a-VNi9`^Z|Lv!S=R*jk_n`XgM9`=nrDAjq zmQ=*zdaa3|b;tuIJPoD47F5z%$M$2i(j%$|yNG)QcPIB)f?0AiVB_o{>Sve=r#%8_ zhkXil+!;&R%=1)BxQM7r>!XjnKY8hL3XWvz!?Ir|nGFN&bfD%tH`9htX`Nz-GH9j0 z3XMSb%%u9VRa&G`R+HXrVX;T82F_JJAh0rpitAp+Kr3^y?R^Bqm^INiN)JfZzOUqL zMk*K>D>FF>Z^;$SQ*f`{f;1VrQqw&gzcl(EX-xXXwr!Kf!v;FoEp-WWhq>>CVHI4K zoX5GVXJU%)2pvf?gNkP!FdURl?YR8H{>k>JRC|#KnVuwjkF?{T@h0-KP8ePO-6MTs zr*XlJZ}d>rAF2^phIB$Z*}>htvV0dp&F6*iOhlQV_-BL!%y`1Hnf@35^+r0skiAOFnXo%z_`^XNLw-!EPyK#|1aV!!@T_R`7E^L%V!h!X zK-+KgaA?tVIC;vH-WdiMw&Ywq_s>Cr&T`bT+6F~8Cz9OtarD$IA!I*t46e!Iu<&^i z9W?L7vdjK3ah@i5^4kN7zTH6mz5aySM-hiLTVbm6L+oFNMDhGB>e)Pl|Fo=v*12ZW z1BK$?GkAucpM3=yOFpAV-gF{vozLW<5E;nRL1k-GTH|j{^5eo``==+&sIDYlyu27E zIB=}aMs;i{aHk!MB@4`-09Xkst zqg-wyr;SdUor4zraBvx@xNrBrXy64(T+_3uzF=b!Vv4X1*6mLhvfq#=J~H#xgN zifGv>Q}K*0rm8iHVHE~RgHSh?(-S z3ayGDO*IdhGa;8*4Z|b!VDxofvH5pAvcu%RZJ`OsNJ(i3Gk zmyQo_se(8@_S{QqzOM$i8B5rbjmh+$%?>h4$DRr7m7y9JLy7BFAsj7w#cc2q<+twV zLvn5*@uv^T$=nzsv1l`FI)9nE+{%Kr?PbI|P8tjrpTw-9PLQ`PB6+ue(15e^>PxJ@ zk;NK<`~~q@#ICLz$N!z@x+GIE^~GA6C6^2Vf)+$k)CkJI$UuRCEdDmr#SbF4$m5m@ z`aU^{NV9ejBaT&)IC&D-2_=hce{712Abm<#KX59M>{CV#N@4u>p zgTM{?LhuA$JMx@ZnSEr={&@m9wTt0n_hXK<(Lh#K3m`vlD_m`yPjXDZu(_=hq5e)j z{Lx8At;Ph@O*(-i5yoUtULG$Wy1@OebB-Zy2Op6XMQ;7*rMf9b_$7ZX`*Ld$6V7FT znARm^vv(*yjME zsy2XXm)n`6BP>qSipPNg5g2dWh9?^pX?n<4>PG7EznnxA4N$}R(}&rbem+@spn$e) z<-wJ0-{_Y5B$V7pxD3e}+;{jbRjCQU`u;b>`tT#hR)^#8$;3j;xH6=8Y1J*=V}cHO zo5<{ErVtqWk4RZa5aC^Q`5{fzzO;c*$N7nM&{w2xtkiwdn75@u%{Hi0(1*OXhe zGRsD;p@;SWHr;*6+v6vLLNl~r`d%OU*_G?txK6375SRruQ%}Mew|ne4FhU-duqex) zgAb~|P@10u8$P}u3z80!pN4_NbbzH<0#f`tyG7WhyHh|nJ(|k#J4ny0c#=47i~|<4 zaDLQLtay43N8_^4$V&yU>``Imx#y@kR0B58Zs63{?#zdQNvztDBgC$CDxGSv12Vq! zQ1D}TP)TE~o|8mbm zO_R$>=`152_0sHgtIKdhS^&f@bJw$QC2}s>2gJ~xiShgw|;xGdE>*|SpzBqYV|B1eCngHvsyd|qvttOJ*E-+2v zD|PIDLEprM;)>z>D0t;Jb!K##H(R)QC_k7OXW8QC)mvEayGJ0_&j=2>`GNdOeOM)1 zfhFO!DB&gmo@^rxP<0^u%}r$F%Q1AV`VT*)i(~Saf2@BRgPYfgO?20F39z~%NaF=>){X!EM18qAV4Aol zUP~>7o?C=^%}4;v=uW!P=M#+@(u9STiuiVcE2uscfL?b2$m+9()mQUKK+gdF*_26t zs&L+KEdl!6Vu0DL5lJs{^QWhNKaBlKp|`vS;K*Gea!qL-J7{wZn-@vI^V??hQ*Q-X z?8LE`%j|Gpn}6Ns$!AD5H+R=5IK%1;Q&bk;O)C>Op<$928T9#03_}(}q}&kX6)XXJ zt!X6eziYrI%%K)7!LY5!f-3AahoFiGkfd?MrF;gADAhud)m#j73Bih-K1hFRO+&*L z0R6}@ib^c;U(Nzpe`6)G4=180T?UE+`!L{+BWkVU7(n0Z$vn-ojF`OXNba~)yQ;R*HUj#BC` zrU~=5y@p5j0eDy^gVLp)B)07gN<`g5`#ZT9vwDDfK3ajX%XX6Ab|uU*U#>UcGm#bR z^d~cFOfaE+61gIKAA-i~!2Qn=aG(Oz$%*5O&UPVE8zkVSK{IXqrU4V>#3AyFD{i_I z#$MT#3sTV!(2@4Q>j&cK`)CK55}QX;eh9O>%6sY2k%h3%@(2A~Ib4%>N0npv%djIq za^cXFV|4TBdMe9#G{uHlGCxWP2Ni_yWVl$p!mFul?WNa@U`Zj*+r|jJY^C>DRI7tmLt`N*1^VC`oGK6RAAr~~1w{6rPvlu?EyU(OM|TVHs}VS!Nf zkU~hUGcJ$}#@p+Z;WT&W`k?KC%QL6r4oeX@7ViWpiSqoes33AVvx!7!W+Mvskt&6KGLb78RM89aG+9yIPtkgIK8MA#r4uRR}NKTYd|-TOBZodIiB-)ucBezK47 z6qhrP`b$CbfG4aQDdpH@GPvVN7KkhqCDRt)K)LSk)TweM{dppu`s&T0CqDAXP{}L^ ze-#OL^9z{0`_I!HlTNgR%P^L-5>>3MiTa^P*kr!8zF?j=+|*r#tdjvO{>$ZSOs5m2 zoA-#g#7YRt3x+UJg?gqv3u8o#F<{Spl9HZ9->rN>3wNrqhr&l_pl1}vV@ikmAz|37 z=a1^n31mugA4%IEj-p&g{&QLo6S;!L&U3RcP4gU$c+-yf+=AYGa2VZe4cXn=TiHJ= zy4bF18?kI+U|m!3Ft+@6g`V%a55dkW;Lg0G#C~TqDnvOD8OH@I@4719D0RaZ3$qw& z-8YQ5H6^V@Rb+eIdNTgzEu%Vd5ps?ltj#PY<2((Z7j^4-RsWcEFU2V{<1HB$a|L_f z5$1Lk4-TIdg7Tsaa@X3Ob`1n$PI(wF>C`W(l5rM(ne~&o6Gd=Q`!G=*e?d}ab8Ns_ zc}#KK8SJ*`X60ti#kO317`51rUgDGZ3#^TRZ@&=UJg;Y+lcy311zF6#GmTE$UBw>u zFd$ElRYG=57v=BKN4Fg>XbUxm9UFfW?|X;ogH5u`{=gty_isPhQYnSEl_KHSL0?=L z+J=^aYV>e%MGtfsFN2G3acdUg39l^xGSWx^r6?`Q^T_ z{M;z5km;wRUVm95u7fUnsu{_|6eyj~v9bD_+58&`#8c`#)V0mQVBx3G`SBd#fd;WL zYDmf4>-%+~a{i*b9RPxS6tfE_tzlkae~W#5*FK807My z&pjJzoe#nIr8-!fHkEodo#I(0QLsBY#!kKv0;T!huyJ!ZXzVygMAj`NsRo_6`3?3BHq*uRfAv**ma=`>f)jhA*9=f5k1 znB5*|ZM1^aNC-jqg#t24iec4-$Lu|wgBUh?k4dOahXD0P=I)x4XpqVEJ+dc}7E=$D zR;;9D`=sfgBW5W1cLmbsCi3*g7|jdeX7_h)95ee4*|cOS{?J{Hm)EOdf*T)B=0?(6 z*WB6hb&D`lZ5=G?&u5e_ms69YE!0VECOF#a;^dd3tZDreSYKI;8ZOP;oxvW|m&a0< z`h1qL(Fk~o!d}};9L}~e166$lk7&^?(?;m7!4ov7M7%!d+j6S7 zI1H>CaOQ6{p_gSwG)KCVZBn{SFf#o!^Z1(z~#^)Q;Zcbuy6&rqKI0 znViy7W##rdLqOwYcs0iv?&QBCN*U9^ZB!e}&CJ0!?HG|r{Xx%qy1`*ruG6E$_27H& zQNfpKaQ?du>bBL9MIx_=(EN1T^n5|R-!^j^5nc`7PDt~Y#%`y-x2cfF>Kb%gY9v^n zn?dM~HtHGai_W*D;X~_jnAtZ0M%MGu>&+pKE4CeDyYz`ns{muuev{jY3*a(Y9`$42 zv!gFUarC|blz!ZdZjYm|yJ{g$&8bDj*stiF-%EEDJSL*6s=)WhZAK?90&e+CqZPe6 z-1nCy2)>TPAU_#?#wpGz?m8KJx{ArwPaGfrpamvgJ^=A?$vA)KRos$c$2ghHM7_pP zSeyHn967DaGi;XTSV+sE;f@L{vRQ^po_m7-Y!OhG?}Q^KV$gJc2$#otLmaAXV43e6 zbm_E!p`f#DzG*(_?Rie7IxV8F+`J*`K_;1+@(j)A{)N@~cW9Wr9rY54Ae$sZ>7}=F zjH1L$(B7sE2geT3ZP-Gt#stBN>uXSl@q?$*{MwhRoZ8~A4^!1!b z-g-p=ZlBdk_rJE(j}_hoy*IDnKOq>*+2vor7p7{?80GRUk=2L4?(TpQgHWp zjf{{3)oPPOo<}lUZdAnrIqMhbZ~O^_<$K}=^~r_s zN*{mpqOyu1)Tu9u<40Vi_l~8aQMmcjZ2EHr z-K@@%Z@1oX@oih^V1`K9pHsx{Y6wlTP{w4V^UU8D3rSUU0nsh9!I{aKlxHLlE2IOV z$aw>#A9&5IoMsAQ#Uu2-oih68XW@U@F6gD=jvqUZlKCg*Q)j*$o>c!!{9@ZlYIg$W z+smN;5O;?oad6_RD*NnwAl^&Xz?U9Dc>0Sv-sJjf_kW&(HbxW{#~;DA&OmtMt4ED; z5l<>5V(Y7LSQ@nf4~O|s179^r)UAOF??Y)^#2RSec~ON^H<^NrGek7ilBu}g!dhw1 zpk-U)@t~nGR;+qR8fDI*wO9^4b?X$ae;f`i z&lj#k1(Q6E4H`@>x`Z(LdM5c4Ck!W&mC&wM5lpg!an-VJFith6+gE&{3;QEjgZ1ZV zYg`(6sPdayM*gR-Djx?)J@;uZQ$f5NN^uizB?312wQo#P0OgyBbYKEuM}M$xZkM2O zZ4df!F7Qyt0r)gE3E|E(m@g6w#-|DxhpTO%&*d$PR~X^inqab5D*%i2X7TUa7GTV6 z7g(tn4Byo+KySeZ!ZW`}9)mQUvg|E39$f=II-bPA%9Ez%m-4#uxO?BX>9FYGbuwgK zhqaN1A#iUQczT|}$5IP%?%lOSplA39tmLu=cE#w0Uq1w%dEzW#Sms% z%CrwI1(($sWcjHLBwb{fD2>O^jEyD`aiI%PsZA*mCZgH(;7j8EzeV(P9xgjJRdQ76$G@zWBc7S&Q1IZ zw=GH`3aU$REHW6hrDfsCt^rox$%R~3i)W;_NPwbvGIm|9B6lx6CvT4A;9z_gxnt^z zDn&vVa66nHmJFfu14^mu*9)w;uPq*~I75%6L{rVnIdIswmAB@zDGXU_(X~qivHr3W zh!;+S-Xj;`uhMDqJ=y?HtZ4&>STB6A&lP)Ox^QsPPZX)JXM;^QvL|o9U~@S)xAC+P zu4`|C)g9mIxzPZqnRbEQXnK?9IAt{s|BZuSiENPioeysno?+6m&FC>Jm)V@rNQR#; zhNo54wU5#{R+rpgaj!Js7{?H|i>5UH-WU2d)38o_!8BrZ z=>)lX=n)+1Yhk{1HPP~3TTs@%O(t}_W8ciY&V==<;H+69s9C-i{&JlFn`U{EqdZP6 z{_bG-0_&kM<~^f)QH%e5T|chf!Vp=9cr3iF3I|gg(YV};j{dz^yX}G?m(i2MyC)m! z{K{-;&7T(HJ8Lu3v~Lay8g9TLH#2N$3}GF&Skmi9PGAzp9#mN+h}_i5ZrlHqA#cLq z(=LDg149lVV!uv)nr+2gxkK=3^c=fw^#cfgb{7+lcd(&htuV!U4Hi#GC0CAQ!!!O$ zMoUxzGQNp$Op}9f(?cBno+g6Os3ER>TTHHpJ%{u@F>K=t;g6mZcqjM`{Vcr;3g|K7 zr?~^-r);k?v!R%EbTyY}ECU_x_GHyR0!tg)h^~4${P3h?V*M4G=&48h=3Joyc05qZ ze?oo)AIHg)?9g=JRPUvm`DAPJg~n8NG1SI?pk8E81X% zRv3D3i@~&gFX?reYG_|Qj~)F~iB=lfcp$0^t!%?^%7Iawc5pAAkmutxsSYstnvIK3 zrNHf|M6BNMns}sLreQm>=?Cs}Sfm%Lcs^*l9!EFbGCI&4&NQ7Kpi3|1&^pf7Qv$Z=5cGzks4oT|Si%20h4Yuo zMxuL8HQAaI#V$UZN!wB<@C%n7hZp7)&bKWk_w{Vy@RVZMzomc-{dAz$TsVKdSuQwE z-i5VEH#m-Q1h_?ipt*m}-~tH&zSOQ>*sdDP+W%cjPhSxwB3w4x>FsrJTlS5(C;8Py zL|-Ag!yyp+{3V(mDW!2-Ztj=WO>*?XAy7~*GCpIC+y(~asHs4Zj9*JS&jwPg^da{>x$@ID zrn@`|I*Av&&x?Z6f(E!+D8=?%&t%j4h2W^oF-V*sj7Pd=Q;Wf?1m?O@%^FvFdi6d` zm5W9fE*pAl)ml;|z5||^B(p-d7eV}@XfE?Nfkwaj56$i!2P+v-dUALJQ9FDR1-~`m z2U|hN)!zuMeL>{peoO3d3!#jDJE z;VzxlH%66gLx}xVUGTl)fXAyjhi*>}<2Ue#2^u!7$bUi(KD9i?XpJOjr4&=q2MRFT?z(=h=P-*_cI;5M7A#Objl8Wh@i=!gp4E8M z51rGd=69CkjNPWF^^+kdFC0ei8cF_}ujQ$I?0k5*Cjq_OBcR4_2PSfT=fmp9P7d-eEft_WN4PnHA@T;UlW3W2|Ut0AEx3Z4CSxg9SGj>Xl zIdDZbSeG)X{#b4eG`c#&6secwktiR|Zny#otR%jXy+^i)XX3+C5yWvt3#dMa+D=iS}9qQ?2)V^|N*RtWP~?U12esiJ)Uf6)M& zXH#pdYcybmJoTC23ssB*oGC14Bche~zn%JEUc__UYP6Bjfmh~uyrBwWhDm-+6X7=OC1Wz-K{_53+*#SGkG`-k0M z@|ujEImPvv)^c}>ChFQhK!yw4V7TN3EuVZ63e-x-{-Z%SvObEL|9TtF*s~H7;+ojc z9c`@3(p-F!@E%G^t>CEcemLxTtFFqY8I+61Xo_(iIi5=!M~cTCX*Jj57p0|uNziW)nm}N>aUr=D z=EKIAohN67d$|6cT#f(cO&A`pPn~<`(E@fpS(p)w%j@*WV$)dCIN2Iw*LBcSM1zq( zrOtRr{l~_5B;ZZnRgT%S~N9KKlTP^IHfX^@Q}WVB1yy9TequUh^j zZ$b&&%yMAFs*T{)j3n~0`5<}pk8?}y7w1oT;sX^5`cOD{jg0>e;d=T}@b9`46M zj@$_{zRZj|Zw&&Id;dY)Ts{1-`y!q1e-R_Uw^NOk4RpdLDSELXn%+C#jIT;{!FZVq zb8nRm4u?|c65kEl_FW*5sL85(%Y(3a3d=mZO75&EB1cEwPV{oBU=6phyq4pRU=;d}R?HR$B}ZfY_(}p)UX^2Iz6NFn zdBE#k?})dPI(Ow^6=M8m1vPaqBNzSEx%`z9ovFSU9!D0zsB=8im(oj4mKfkAXM2#GCWeWpLnyiB z0pp@|aID{V^=MO0GXZOX?JsjT^V>k!VhY+&ph$S?190TpY;`mYOC~I>^z0OQF59i&z z4tlLdV3q)|^fK2EeOk_rCFzs11+C1`+Gr>e{>!x$>WMV?kb8%YkXc`{7}YJ4@ax1| zl)CJprbmrIdbpdp6CR3+9gdjwwV&AFf7tCXMrPP^JLxtXVsoyFr=&jzeYTX5;@M@m z?t~eg?Gnl43CqB{!C!PDKN1YSiu2VT9ip8%YcTa-G}-=sA{dWX;-O|kXfHht%R>C< z>dkBLhhHE3emKZ@XWpdG6)xb7`;+0>t~+qEObgPQzjFOBcl?rZ6NTRv!`{9v)Zy&Z z`b9oQ(ABe+n7&^@Rx2^Q4ZrkpR=+lxaZ(5-RvM8f;|J)>nrCF8q7doK86z6i=k$fo z%5d||V;nWz4`IK$A>AaCSwREvnm5PS!d&{Za~sZDQ>$;(5?Cj4S&GrwJ`wzXOQ7jA zbF4qvOp+6wz~;_uyjkywiu(xu{mku^*D-j^WdclA7lYh24ltnM4Sk{C$=MKPcG|BA zAT=kK^GX~>xL-~SmPnJ^y$j)G<__39WDE8xPw9_>BGSd>8UMXsi+gr^V*MsTk`nZ@ zE`7NGO%ff%Zz<|XBpWfbtAVJGBlQR_WqQR%=+@8<7&{%o-WNIu`obmXL^;=``%hGo z*JPZwnPBC>6tL{y0jrkYKmqX)qSX3~+05}|eh8O>=yDqnR%vFUenf!r%tDk>Gy}7V zo)D6k1k%w>5MU<)d%ab#%2AZ`=M<3FK00W|AD}t8AHX!@4X8BSqC3i0P+!M|P@QcA zL3g&{sGuo45SvF=&iumi1NETlq&oa(qe_zlj*+XcC*o6~jaX>04(47mBPTrK@J`AW z9R9hA%<_ALPnwRC-hpz|G1*IvIR4eF-h&`7xPo6H5J7dGh@oGlDviHC74<#2?uuqF zJ?kui`%7O!Oz<8iB1sOrRvcrTD}-@i(gP}VzmZHgR>#~MUgUFe8zdZfK&8Y)ki0EI z$-slOfAkM6X&J@kqSfTYp;4}%x`gLvB*5}6y&--NZSYd1IXx%dfjRa9aOtce-t)+! z$=Bx8OD#x*h3BrIQ=}p_{P&GF@z7tA?;ejbksJ?w;6BOW8-m-Ui*&{DR&tN1lZ|pR zXuVw>a`V>%U(<=sJ`fLACa;HF9Tf;z{SasOjH9od24r>l)2B;}NMhH0lvt61hHp3F z-zhw370$#t{Bn$-A}BA(!~R!uNyrO9j4+f(V)2IPZ6BfAzKdW<$8DlGPYw55uES{6 zUC^xRjP4l@bW3S0$8<+*=ZDfCk9*0Xz6Y$%;6ajcdpo`k_`y^?pMgrEa`>4i3$nwF zu%pHTi}y5B>EJCGE-Xzh|CNA|fGObbwS-A6wWq;-Rj|0K1%rBv$(IEkCR#ljUFsyB8H# zhJ$REHTG^-q?YSi*s&`*IK%V;))n5MYh;t@`1?6TZrKX7TfUgo@TAD?xf>v>#te@) z)iWbgn@G~FO=PR^YAh7hrG@^rbc?w#P0^^t(%T-SQKcLVt@_bJ-wz%3y(ZIiF2J8p zAIR&5AG~*O`&rSuIdmX2mS&X>5!;t$^l1=76;3k{uw)w@vQ0+sfFQ7Y(of88?4=!Z zI6mCbB)G~w^G^yqdiT~tTq5I*b`QMa;`B=Lt3?FTgt>icq93d}@rQnk?nj0tm~FTm z+>_gAcZJ-g0ve>_HP4S{XzZ$sAfon+=>4K!Xd7rd38(SAjW zUZXYa@mJ|kbKZ&;$SQ0d>Wz>EK8!Yx!*vv-9>} z_DXy!Xoi2K%+msP`T>7*bq;~w=XhwkfOEFQuA&2-CTN-}MU8$`(0Bj6=UM;tf?e~DieIt@f5>KCqul_OnwgM zUva8QBq7_+v#Xn8$ls%U7@HSK?>C!}rQzL-*-uMMnB@U^1EB~zHK22EJ57An3=hXP zLXcrTrWRV@yoFck%+M{QB0vKrWKcuM)VO!8!0rn8vU2(ZmU9H%O~h7JhhKKodPC+pzC^7OhA6V7+LeF{2t+#w$=Z|av- z@5B2tD?xc;39adz%=Fm0lQl+{V2Rlk;8mX|4r94Qtl9}YRZn1FcqS;DbMwKe5;R-E z?Z^dHNLgPcNHm|N@kvrlb>L?jarsfLuIYE!93)ACdS}CRqXk$i5>2E3i-5G<$*{fq z7TKEkh}{3+565mU_~E5@F^&2{^{9Jb=(4?l=OtvI@ToDG-U_Q4n3D0nG7 z&iq@+{a&B1BR1bU;IQ~ZruFqSc8r@pE!RFJ(?9>_*tnL&vs4E&zJ;(Ga@XK?E?=yW zF-|5*2ta|L75i*4mu>$ulYgk_12#r(K{3H=G@9$si|UGyjQ;oR?(Z>h#&|bwkPl(6 z9i3T!yyiRo?YE20S1pIJ$D48D@Dp+?dxeb;=;MQz z;dk09Fzu{>Dd$h1*t}d;-Zq+2K@o5*y2oBh8;8wh{;*lMkt}m=2Zc5*d}+^cH%;~W zjk`o)uwfH5dl!S_tQyT}3WtXB9k2~Jx096szUua;CT}W8LPatfw#(tA7g=O`;Tn=V zV<&cLrgAJ49!}+r@I0qIMP-l4byp{gLQv6T8grUoyXtN{`6;vxYHy$87<{(O%L~nr z)D#Hf?bG>!wkH{#eJVE?-QJANe|w8O787_LQ?XE$hT)NseaU4A~EkQ zZB1N2avFPRH!}|_O)^<}eiw0CWCU|(tpknbM5?QO97mio!P?UpkNvk5j}Dw9^CAzz zWvO!VaQk(vS4!qM)oP6En~D6&;C1+X<39YOB|r*4O2VH7Td+u7m58F>*T??5bS z3ku=TYy&pgg6rHBrL)~--2LR1B2|!Ei8`W5sMX>Qb&o=@&HN=AkK&W&Lu{!f?d+a_u_D3bu23~ZhIaCl72Sv>Hv=sS z*$&scYVk_hUPwFtlJWiQjT+YXCNs z*|_=UDbnSx1iBiED!adY8`B}xG}w_yUf6qM3gPfoDsmhPsPbmw5tk^it@ zHOs-%Z4e$O6F;#oW)9dHCIRjAOBce8jGguhEe2s#3OEa20 z^%B}GlZB-w{bWN@5NN(oqnFxGay?%au&!HAa{kBGnZ{G~zHi%x7^ujFD>IX)+hhApAfC z+TWT@XTSeIMl{FMk&~KW9$rcKuT`PsGbLU>W6*3=9}iyTI*WB-WI)*-&#cpKROH2;|$H6-%0W2{*eVe{ZTIOaRui7`UHIK^`xago#5AETI4^AZaKb$L|3N6 zhTHjPGYuVA^68;Vy0OGDKvP7(udWs zY^tarZKD*5_iDk0l$|IC++3!11G)6kMnLSMFCKj-d~7fmH!;Vky~YiX-t8IBjuziCKr@U&lCQg zOI$bq5n27@1X#|l z4D)v?qiM;daei_&woaX-*`|#f*Z1SHQ2r}6SW+DzYkd&g!~jR z3auP_#O4Ox5B6e`IL1U>t2O?35KK*GM`O>7e9RQRLDl!CP!Ln3`#y+)gzy5`=ntUV z!p)n^uF^kF1&}??5Y=RTncW(H*s!#hWbf1xt|J#oF3!@WA6xs0>B>nc*wf40$+}Hz z`hPR_$wsWStOaTEOrr(H%J3<92K?0d42#{9>7;FD_(b9y^2Bmr|1l|2bK47trtc*G zDqhlqI+pb7_x*?ySq$6omG;k2g3bvX$2qE(ACNQ^N>>z^yXFaDx%hatdb|dGosmiH zu8Pws^@b2=koX}J|HA{8+h3RB&paMRrTy?+kh%)7=+NL%WbgKRS`lRrNDph zKl6$nd%SB?d|Sazfg0R@f#SMNMD5Zmc1YU@w<{OnjWgP){6&m6Ip7uQ<S)p-ZK9CCxt`QbuxIBb?Ec%!OmsISyXG5U{P)io^`eMX(hVa&*dQ3( znM`Va_>);{WZ?VG57b!x1K1fz(C1P^^rd+)HlKY6H~rE%*RM9TczVGOvvpwN)=L)n zBaQ|n!9CEGI%Hr(q#S;>ETRhs-?CFLhC$S+gWisKd@?8nS2OQn!S1(o z%@;lT(=8Z3jqJza3Sm4u90EyvPYmxmOIIv!C$oMIkkrmcWUg#6vGF{KsY%~(=y)fD z6lS5bcmmoqt3aImJ371XEM1+t2Na_wfOVG#7|q`fd+S!h1*yCEJxmSUyPa4cyK`*+ z3{#l1;~}j3a+&oi{!4e&eP+UQMVPh5Gtjl=7aLW!6I!2Lh3@(>>Zn^z3pd??*MlF3 zK%$OH7u+UJWvbNF^D16ekRVT59)Y^26z@IPIsLCyj~cpiSweO>*zH;Yar3?K9*pO@ z+@kpBfIDbPx1;;kO%UKEg$svgV71dZ(!Sl0Z1v_C=xcA%oY&&Kw%$Q{W@tL@`W8>Z zg4AL5{(r3Gc+QFIaD!%-xe}8@d3br|8FIThhRbd^JM~dE!(aH9kX~)7jAh))g{VzoZd$U@}^w~qy#cdN#*;_<) zzOE+cvsNmjJhO#>0yPoa?mSj`r7< zknWIpTzA+E8|&&Tg0^fyTc;z$=yN#r^$}o6p&1VJDbiIE$c zzSkucT=6j%c5R%4GAHw4k#HE!-F1(o)z*SaXlN+=Y2A)>%nr)F;&YkWkaBETsAG)kWTLI`^@-E z2u8KiL9!_%l2q>Rp><17)0etJi)fLUOEo?2yCVZ_ckbj|e|bM^HSyb+Gm{nBq4 zY%*TLpX%@&^XkJb|g8iXK2#pi z!w;^9=hBG_4}#IWw^;6Ug+A@CV^TG^YukmTkn;5e=RGJR5*MD*`SVn;sbDge{n|%z z+Q*^T8xty$xEB3fPv8ZuBXmnt3Y=~7B6cScio!3#ljTz(v~4bKRs95UvxZ5@B1dR# zDWnU7H-f~rAd;Z0%D(;mlW*k9`C5l<_{+yFr4>RpP$qwqCj7cW>F@L8Rly{HxAClP z-87;jlTNQVek8LhW@G8nRitLsB)W0`MBZPebsT5Dmn=~jLJ1B}+h+J3M{mz3ChIx& zM~N{MyKp;x3kIT=deirs+`P}s8apH6sj;>!Ov+QleT|uzIOT8qG+582zXG`JcGbuF7MIVYx zC*q#*B`~>LNbp@Z6wR|YKyc&*OqpRumUl;+pZIFZHk>yn;oSUp?SoyswX7Xox7eF0 zKf!UbLNh^KO$~b0qBx$agy47R5{!S+URlS4;HsmOn1GL7u!-9#`RgTfy^RU9%JDX- zTmFMiU-eqnkdLuJx9Y=CD4gmFEDYOxYWnZ4tcq2u-bP8mB^2Q^;et0 zEA0WJ&osk!^`AsjC#Wau_;#mK)KAejHSUER@@DN=@B z*gcsDR}--A|3`z%lHsuQBUq+4pI&(+34gC2B0p~EW8)1`bFG52^uUH>%!(hR8-IJ@ zra)=I*Zv6l+#1Og)hG0N%QcX-r697>pS$N*(Vhw^*mvYMmNRy^V`*IFmU}U1cbE_D zr&wabK244qiAww{cEZof$UNRV4{ij+w(z z;dyZAARlWT-qLKmNxYO(!1tpZ$}qm9-hpejPw_?No(G`PkPQ#!&j+5WG*y3@2KEBOA?N!CZzZ3*h*aYo8( z&xb|mR2zcA8!WIxWE)>PPK)b-f8=L=3Zf5x9A@9#7ACrfO<}2fGQNJK2)T|7tzIpJ z72o$_)+;@DvFasmzEgvyf3!in)DW|Cp3up}3T?V=p!CrZ%x&Q~B2H>>>n$IaDRTEH zw+rl~!^t#x?JI`msgr{xLCCf|MxPM_c-Jlpjdyi1*W@-y-7rc6-?_pazvD2G6HQ{W;{aat z*aX=!XKC7}Y@)GiH6GrqPxt<~0=nuZRLAN(Y<<-LA1}EDc;!Xf9@Ie%|I>gC z4_ir>Niht+Xo5Y8pGeMXN4O-&z`-l~I3G?8eVkH+Rnrnk+rMwj-kDQ?ub~8|v))s_ zRW|c!&OP#Fw+tQ;_Mq#I1)`a@F>P7d#h-cgH(B~1pKMIhCKjpF3CxUUnd;|UMy(BY z9-4)-<0G)Zu^6^}xAL=+skJ<;&z4WP}OfzKl1Oe>!{_<4IQk;-qPqBCQO@r52pa6W?~Rw{5%O$u+E(}g{A%&7R9 zFLc82D7fTxkS=Lev{U>DBM#j(XB+2m?ViV5aCII;yjej~RoaNg+2>^CjCfQ?ET#Wo z5j}S>4qpD~2G4gzm@9t(r}=XEA+6n{IU@wvMJ%&_SuJ})gzGoPAED1anoxaP4yhxy z0?usK##LiU(D~#7L+-DKYyPu{j5hmh>K<{MEgsS=HuzmP4 ze$72iN4RJI(&`!LZgUe)21Sqpdnxk!`gnfIHZBic&do*#WI^QOa}qkT87?*+AXe`V z!+6y@Bo=*X@11$L@t!AIl}#}}J|&yj+)$@oVfL^rCI)@pnqyE#4K4VigS$(L$Xo4$ zkbXcIZc9HT%D{bw9tDxf&Oca@^ViW+B7xmeGzAmJ)IopOQM`wuXv+2Wf!~JSC*M;y z`ANj`#AaCRDF+``bNi*8rTG5(DXg*!#RQEXbf`X@p#EpL*m(?(KA4En4lha9zc5VD zN~h!dU(;*rW#GoVD2xiRU>f{ZqeGYx+Wu0--J={6k8>}6E#A)9tYGlUl%wpcxVe}+ zKL~7~1Ruxuv0B=aIKj1)x`fE%eB%g?XU64&Gp|s!sT%m=@fOU#UkFpoJm?#=+C_m{LOWEr(T8Uu~!pMw?(l>@93aXMlN7n zCEM8HO`rNA(gTk_9xh3Hl~$fXF!Rcw8Ne#=fuM$PWF=`)3ouUek%* zzHQFMcWN=FayG6Ceoh;vWs?;Fd+@?KVfbzwjq@V)a88aXf9qsfn)ybRdWc8E0iy(* zP%Vp>?%$=OFKfx6$UR_tEs>3W(!vN_pA#yoPEry)xz#}p2p^jyNL3t&0E-WPrZ)`vSksd6b46XM$tk~BZ zI5W|adHr`5uD-_|!yjcZD zCme>0tJH^GpTpa*VH=3e6c(tDPhkpIOJjFh23Jcz4X5W!fU39aaoJ8$7`Qz~tLH6( zqm8FX{J&XvZI=Zq7>_b@xv}53kGCL!iz#YZ8GxUk9+dbj$8^b7Ci;dBxO%oRQ+0)? zxTh=k3j1khB9n9yJWikDim2jey4K5VEMz@AK;E&kJ+~cnhxaK?2 z!)|NnvxyaO;3{RBC*`0_PB@cWa|4DY{owwZx6H%cCs?B~O>~^{i+KEs#NwbNPGxc! z!=3-&=c^)u;n;D4gBQ+{r+dGm`_UX|*Kx-mr?}|&wFS85#z*>VT@G2q9TRm<6ky4U zTGZfAfgPN(=hJdW-e?6Mzl2zjEgGxAdX+C)zg6I^6E4D1Nhw(MY8>zI)E^`tlmtON zQSk0<8y);I#;SFzv%Wi)ko3Cwyhs&>jy;nm|Grkh1qtrEB*s-ql*iE<{Bo)q`HqxC zOTdYce8O9C53VsO_~w-|%1-N~Z|Xx}QsZinS$LIn&q{)aI~{4IjFw=@Q*UZ|vyDnX z1Q-3&<`g+g>A9RbeDg_?cRQ#6YH!b=uejQ`BTdKF`G(}e%`=dp^PR5uErp+_l(75E z0}`F>iXx}h;dIjk!e1{+8~1L5=ih|kV@xACI?RyzDRazI5_WK-iCwVdm@sem!Dcw` z_LexgaQX$Id~ly*AQ;Z{#`>4T$g?S&UUR|;28 zR^h#G>p<|TmWlR!PsRp$Xgn52ySOM|zq~Qc2snsMdEZDw30JSGw}p#i?!?&SCrLIA zBwpSMAS=o}8YT_Vzv`Y$ok}kW9q6G)C&bZj;hM1Kg*JREx5fhZV%jyb8pkH+;^Cbu z=#o!bSbN`1uzc1LP>T^J3+^oAS@`ZEvwc0OwPg~uQsF^n+g4D1SIrtKTfnXeVZqJB zNZ>tq1upeU@aAG zQ#A6FhUN$1g!v}G+I^%O7yKgn0Ua1p#^9#k@9|@P7K#lUPy+{j&)e`pFE6N@1CLr=2fKG=|VYj@KMqs_Fn ze2@fvN<-~Ez4Wqo7DRr33{@{isQN!X*>mqY4^9~}q3#|n8 zQA&ipJA}_Kb5Sk#LqOH?(I$aY*3Mmw8>_BzI`I^|7#v8aKXgYi{tUd-ag5AK9L0j| z=kdC%1TOb4C0`<@GYc*kAnc&bt1qtR!Tbg&HQx%W>$&LHnb|mP(r)VidJ;G&$w5hN zAQqdxQI{8+}_i~p-&EjnW9lUz~Qa4U?Q zliP}I;SDgl#tEv@HoEq)Pfku4$< zVq!pB@(TPItfHWM1cEbNz|VqmILUDGI{E|c(yXE(eo2t!rbu7T;bAIQSh@927KVRr z0Y8H)`03*e^L+(Ef)QO2ft+bA{1cAEKyM9_ux}^%<>`<83U!R$yB6wwX&LAol*flt zJISJl7hp+3I_NJD;#Ip&f{zP|C|59`4^H>7J$rQVb>jo`;Hg=X781FHHZ{fgP&&VSy#Ut6b>Lu8} zp3j=ss)J(AE!vSS#32j4$%oYv0*e+;@VB_Z#s(gO<((Vhv;G6xq9w$Zy|4xcyOmIK zL67IDzLM?|Q{k$Q|6sY!0%H3jh%rEl-k$_~)m~18Bc4N_=cHguQU;}cG8i*AgcxMM zgPXJJsSz09plS?d|Fx0r8$@8hbBNx|N+%23y`eU*pPIEva_>DA;wz`pr5g9J|C9@D z4s*elFs@$XW`SMbB6(x`TB!McQPdVr0jZRHa&6%qT-o}TJQuRYJl%b$+SEjEEx1k^ z;>YM8LuYu~SOAmf+LP1!a_FIT8oXv(WpZdF7`=XMWmTMe*f-oIP@3Lv3Z399^Re;QD#%{ zT5t{7pAbduWCG#CgfnE*t{2SS-QOUrsSp|Wd|Yp@jyktrV}5`#Tut4BVt1lQw_OY> z_TQqGJ=0LW@CM1u<;LVK?zmrll#64?gWl#iGIOF23H-4heWod3EFZUD{9zfr{?o~J_LjAKoDftZY7?+%i&j3295}CgTYN3*(j!iTyMN-9v89* zHvi%D1oF{bUH2fYxS~Qj2Ycx9_rvCK4^LuV$vGHMR>0oL1g(}I)n9b_EXkwp#2*>UNIn=<+9`|?sped>jRDJjtZONPr z;`}-&)j38)pBAI3*fR2Nx*hQAmtw4y6e)J;7XSL~R9XP!pF zNzEj@xIYiY7sWEhlMYhR{aFy!dy;+m>NB0Aa1}hOO+i#59%R4If^Tzkp-=e^DAn6x ziuw%Lqb`R@J>yX2+-}H;6BC#_KgEjW;;_rI7iQeG=V>TT2YuHr8gLQq*~j8A#g<&5yIO=I?3j(DM+~&7BU(ALZ%nG7*^B6oYQx zZb064MKYuL6)xdc1DhvnkjU%NKzC)MPg*stzki2)(Km-&Zc~7DFCXwzvLvvts{v>2 z&*M}x^6cEp;=IV+;F*{7T!xo&)bRAZ?8QS`8fr5ExO2!F*5Pn@NTxM zzL>n*Y>vG2iTrNkLy)zQJC|l?!auF0)D`}b)@_wUw!a9jFE_@Yn~carML*6pBnubL zRnQVS3EZ4ykA=rf1Ydo$U^^G3D03bo<24T95~a z%8Jt`oOXqreYbI>ISAZD70ne4#7Rq+8Zar=Jl~XfEEpBVz_CB1CG#}-IyxD)pNd7t z*zW-PTUn2Gy3ji9ks6z)mBq7#$q=-i_g(4ZDVI`<5Nw_qcPMmIpT%N<6@TZrc~ zhs9XEK~DWJL{t*EYxF)zX8b;HXpX2P4`>5C)K{mbZwuJd=I4m(yA6VjfJ^8#@*Z@) z)xzsjam4uKTFCRsCmDs~crq0!==|jpy$F12sg*~j#T;ctqRXgMwo6<|BxewH=*a)DR^9!hTAT0#`^n@*psOTVfo~08f6@SonJQ6l;eYB=JyUF z|9l;GW+@0ZYe|C0KW&gzT!Rw#D~RHn8Zsi#Vou*(gA0eAgPFJq9G^Qz+6rU@{$`T! zMPUM)QK|{m;)$fo?JDX?atd<83;4{{3k%v+$jUbgWZIlnV3a=&^uvZ}%5n~G5Sl?2 z)_QW|t1Fb(v;%9e+<}&3IW%O;HBbrL2@@i7(RF(qB)48K;;4%IHGlB|kO@^bur`m*UawV5=LnGyXIw#-D<#k&Xu zmM5sk!5(}- ztMNT>8`_Vh%{gGS`ynjrI3-Y_AQumM}b56akbI*uOL;}i-qOp(B3>BY=d0LW+^lF=~)rtwusBjO-{q1#RZtp z>Y;ySEiBqT1m{DaqK2X&Gk;z(EX*>)sJXlG%8GLAv(*G+8AtS~S`H5W+RVY%jdU}2 z4m8^w#k5MLqJd#Fd0r*VJ9x;PywaOPz?|TTL@9I{_>G-HiUL35t3>3+2dbkQgFjQw zGIy6nz~VievZ$X>`BfsYy(8Pas(d*aOAx_z`_kyc((TZ(=QM_V`-5iFI`Lz}TDI}x z8J258z~*DhpcW|sS>unBPj5Pi`amdZYKFjjIS%KZxQJ8*ZGy!PS4n)?X*zYrMnMKM z5qID1AeYt)kzd9wo6~r`sW{b>}5H z2;tDHuk`-4pWr^@I&}0tWJBIBff>m{g4r(&1kb0)!t@2A*z{BibM{;%7fnRaqIxYT z2O0=M>wm%P;`40&wqgu47Uj*HbB0da)QAs{7Sfz8_2dx9!&wW8yXAnG#qY);{evj( zS;~#K7hzdU4tU*_-lHT~?>7AoT*dZ92K?4dhgVr)U>pAf zLeu(i+NT_f>JtPuE(Kg%gu!By2>N4DCQ0BFq1*0x;f60+a4pIN*LLecxIr8dd8EZY zTRM)^i;1EBcLS6(Wa*Nv+VEIP7W4NxqKdf-&e^yQduA$QNGOL$x&Dl3zFmbuvdJtH zxrnJqbs}Oxf0(^(^(41197AYwUF)6gj3TkmPj`S*JQQ2+b#fMbbRGE+4vQVgk+)_QpSk z`t*4xw)2@P@!RCa84J>p7mk{v33%zJJ#%T~`l5?JByp#0804(nj>*2S*!Rwg zFwe$;Radx$`tc^1x>F1HO@D$3?tfXsdCp+?T2t`CDVKP~a|+{MQ|OIwVO;6XA+e7Y zQF+S<_;5#&FQKl2yD}AVMvM?#oM3=8M%gsdB@V`P1M%(d6-?p|Y5b5T1}~yIV4uPS zGH!eMscDTh-OwZRo0&16ZYI`)m%hm@i9pu-`| zrW<{SYIU)Z*?u^SvvkqUcpGbh@?*!}S33?1O2N zmnG?v3g=WZhv8H8ajbZlO_l|$!w(;J2|8Q8z@^re^x{@ifl${Sx~V${oVV7~jEEps zH`|BUZJR^%Wcjsz_C=1_b4iotoRp`kJ!BOYs7#sba=(gP5G~#VSY!p3%tuY z0+LyGXk||jbFAV3?r*&X>RZ%l!fq`(yE+3`ZYaewA6?L@V;7m|A_Ezxl36Rubr4|f zi0+~fD8F0^O~%B)W85OhmJ7tjkYd_4MOtv!MG@BCY#~n{q!KBUSlAHL3Uhotpkv-6 zni}$&Ms-ib#O`odA~uhw?wDl$?L`k?$|Z4;%pogAn8S9g+*gKDuht08SVi-16cxhW zLvc`=mk&)#^^ke7llT~iuurnW>5GOI9C)ojT_?w(&xLX_()ErlF1vvzu3iP zJ`R7VjfXl!X-8rczwTrVI4IBJISj{Rw*|KXmV1jPUs&3I#Zd59Y8WK@*Fx5bX!@xo z1v)8L;kw4dqHp8jbL#-A*}Cynd?jG-ymES}+?PpgPl4jZv*?tX#AbI*V}gHQBz2C@ zXx+md7^U+9*0?D#8C5BK#d985Fr+M)*$@g#|5O8?Cr<5AL6E(ngGmVC_9=;)Y}FfM zT$=lswlpS?R3$z18&iXGZo4sdwK6)iiSZJYXY&%u?eNb2gV1v~h?Mr;$58LxRO5ju z&zHxkm*1b6pllkGVO+jF>Fa<@nG1S8fQ}cIyI}aS?a_C_y<5XPkPTtE+sm!oMkr z(APQ+YAluz)mz#0graPv)i1(Z+J`R4SP-##>Ofg81Ej0Bdus;rQh# zRL-#y{vEwZyJLIk-k@?QzCJ{bIXxg_H)}!Lp_1PF(}tf;JM(-m>;P-oOnf7A0(+g~ z__s_a@s^nWg@CFsNZtFB^lajg;X1qV?rSdA`Mj6NpXOp3Pk+JSl!vUDei^;Fz=@l8 zhrrwE5vcj^5eN?60j;7OTp~@0#YzqAFG?jXev{12?ZRP?*HhA=cL9}FUxJ~t;qbXI zk0`CZ$E=!R&bztjI#laV6nqZN!1|m!RAK%`rsm`ffs6YxVw0RhujtF+G+q;xU7yGl zeA#FosTzl-CLvJQok&WinLupBZb;85A`{o&#=T*4nd4jq$me=Cy`sI1i(IJ*bQWDe zrtKK~G_(S7uWQWFNa1uWPzA0oHv)E-I_h&2ud- zR$71>@)@vwLMQR=pNWCt8Pv;W7uY&BlkIKk;2d!gST$w*Hui$#`JKcABFdD`w?vz$ zK&ttefos=3l3#lt5st^nH>vREC2h`u1RrJ4S{98Lv!Br4!{6xQeXmd^Hw%707ZV)+ zvk{k0n#s-7#(`3m3=xvJPo)QTQIh{0-wl4J$$xL4n56`E>P6yEOCX(+VhC0#$vCg$ zGX2V7fI9upFG~ z(YSccL#Fb_D&7Xh3_~`@)8~8s!@PnysHdtU;6;7|5i>)cg*vA*u^)r7jbRWVq9h3P zQ9#cUip9b6d8TfK)G){%{<$n6If8MxXptd7cP{#I(FKhHFT$YXQeFJc}OjLipdn654WM61X1?#_f@<7}*z2mi8XR z;gV1e&8Cet;>mE{sS-9Xabm3|S9P;nn7FS9m_t0X$*>JY@4$f|hCpYK+Vr95%2MFCFx)NFR=5Ap@ftMZg z@e-He5Qy^H-;P3G(?7I!&tdpGp0GK8j#DY#UHBSYMe{8hVM?z!UT+_OC&M@CD|;{W z))#|}#*?%??L0ePSs&Y;O@eCK5xk@rMtP4-8SR&Q33=)dDmLOcTX_$AZ8Vj*`&~mp zOfLCyqk!J4okkCz%s~BnF5o-xixkK!V*`6;1XU2z_#>v>7G zthvFe{*FM|Mah_V`!gi_s=*JxwHyZR4}Iek3Pr*j;IzYT+$mB|oy)Q?{#_R6T33?3 z{liq}m=ZZ}l84Xx3}^)xFIqkMJq?ZC0oRe!tiE2LSb1edt`njPJKTWC$Ikm2U`>H z(|Qd-$lM!*DYb!FYMsQSj?=m=kcHeWQoQAXUy1wp?`*&^6?iM+L>_6MhJeq3Se5e( z#)gaptDTO*^YnYD5_}1yj$Wa#e;RK?P6j@D%92%F70;B5jrOKi;6V;eR2v`6uXy^2 z+Gm_1cbzA2*Oq<;)Sg3#&vO#7KaO|qs5f+_y@zer^ikJ+8GRW0ol5cFl9yKPVCh-L zPICN4&UNSG{vU;8{2W~<_@@W6)YIT@k0QRw5F+`XKhdqY5kpe=D80IoRw-V>zhZh@R z$EKYaT;d9@|59kR^azXz-zMrF`%(JL4cck7PGF&WpE$_9B&(Ea7-ilQ7^pPmIE;-PGbyH4!WGax$DqXde>y2;#y-1YE(|g@K?96%{`Zxb2YaR zJc^z1+n8@dFYr1phM?H6^6z4&aPhNi5B#`SnciNQ4c#j9Aa|^c=68y~vT@nq|JM?t6S%p5@nKRz?}NVd zBrLfYOy{N#!P2;bx+YEg`_pK&4_3L1IL_KR~zlZ8iFc+M?8wKlTOTuR@ zb1HR#%Q4O6sil#P@U~|tY!^|#T%Q)(@pguv!sZ*xwtqz)Rzg1?;D|)s4-M|U7&F4 z0!`QwL0SxWf^Vn2c;jb^2>PmzlSn&R?6$uI9i<|IlR>>y&Qb!z=?>hvR0IC;O3?c9 zDpLLU3)XsTutf)-GE*PPK+mrK_}UTqL_^x>PV$aK|8)SDkuf^`dolXY+<@)B7J&T}Km1-9OJa^MU@cuYLN-@%3E!=D`(^qIrlb#gP_<+JESW+Ud`TuG1HT*2<;XF2WrGC{)GOz=K-0W)$wV{}>` z-7cp@WWt2VZ+~u2^!PIw-(605`pyDo_e>Oe=|_&`&*VAW+Q}O`ZUb`lndljFj`hoF zBUZmS4SmQE|0Wl4?z!-ewA4+98GkDv;@L8cI}?DIyb4-4e3JLZG8D@f5qQ2IB_ER6 zMb7GH=*q(-ta9c)Ch&tZ%Kw(-NqvSJ&8HT}mx0S$eO6yo z5&wq-n4YDLyY;x)$E<9e({TJ^{nr-6t*+-0E z@%QPx1f z;8}B_d76d_DEF+#!Hvogd20dLWgsb7KJ^q++JBnl$;P68i!*LjvH~S#3Nr&jA!ouc zzpl;+8oX9Qecu5XCb7)@-^UFt)0{uDi|;I_m#g37 zyu!b9)tx8w@R3TmG&+y>C3HP**$@xqL$?^EWo0Pjpn>~eeI+6Vq2%?PHuLwE_weX} z({S{#EbrKKu1ccu1Ak2k#y0T}B<02<^!w66cb1wly4lXy6Kjg{17l=<^*RhKi^l^A zb@;gBB;0-7#bsJ%@yw58lQ-p&xT&HP%$Mh5NxwIg%SX`I{z8ygSx8^)?IVT`EZ>@& zZC-J&XQTr-jA_+9@;G)K#>dPczlKk9yZab2XKaA@zEH$Py_@0q>q1yH(nRXr{Ghi= zg4Ixogf&xd;Ml}sqGUOV_PbAEPd&bb&xNjF;ktdK@}x5)FTV_#(aC(#q5G^#jR=Qt zdJEdQ(t@M=$Aik8SbRFf{r}slg7iZYy#IzGaa7?ANQheD$#3)E!s5>)WW#YPFW@p7 zikmPX?JS+E%5bCClQ=7WDopRnqNVBiV7=r!xs??F{~65WP0c+|CRR-&iBmlwP9g{N z2I3&)d@RHd9>!S<_h7~eeKH!qmeXu&(LsmtaDCfk4zFzp{^w$#qIx_!&QAk*CYgl$ z7MlCV3Q;kyaI{o1L)Wopnm+KBE^TC6RH#*PA{BbWxC&SY9Cg!|$@eo>3v<9@FZ2=2~ z9w6UNGuvx8l;WNJ5M(5R%=-Um=+pne?Z+jO82S`cnxipReuN$HQN_8RJIU)6+AuRD z0K9MlpX4d>N*=jj7gzba@jpUKd+*x!vgHU*OpKlpIQ*QR}RO1j$q{CT{!xt2+Lbs z@p5+%rmolFk+S<_d5)#PWAj@4TW5iPP0}DJ+#7f3Z^n{y+Sqy6jI?PTRo9DnX1BF9{2w1V!`mzM2KvY;EnTaq7RI(6Ss4*?1frYWY1n?i^emo zvr80~a@ZDL$3HqVn1!QzXVA}XJmd=r@sh_i)1PaSNkXR=`R~sGZZDGqQ=%sGLhXA< zVn7|4Jxd!Kr^}J{6A>uU983SNt}_j!stfzRc}f%&LZKp5Qp&K`b&5tpDoHAol*(8n zkxU^oA(c##AsHGudtE2pg%qVoN^z$_nnY3Rj(5NB`}KJ~pZ(zsd!Mz|bzT48&)9}eHTkGY4Q+lpZR`Bm6o^$u50cm*|;D`=Ij6rChcfT+o;*lrO{Y&_1>Ph)TBHU|UR zSnYv+S+-ES(3x1hmka2oc+R-wQ6EBe;s4e`Ar3)ZYP{@c_Eby7+KiI+|IDa-};pZ6dKozKz~ z?@#R4R~*t&{~Bo7r_&?ngYaqHAq=@(K!=$KYM}oUK}rhj3cq65iu>q3DGb-Nmf~}# zLI|}k#N2^-0?7+ANVSIwo4HE?tc(lEj-fS3HfF=dVmZO5HYqsV|Bbd!ccnYVgJJK+ z0X*dE0_M0B%ll67^Um#I>{s5vaWta+(`w1f-Qi&N?6ujSP50?h^(pjscmyLuFR&WY zDG+iw9FJ7Tlih25S&N!7a!0n5F8ZU!MKDb;rE(qb`WZbzRNgD%VO5P+O2YADy*6g7 zXar@qb?Dcd1P1;txY$n}LzwgYr~G-0yLy6spl1h9e}1C|xovc;pcG%~Mc^Lx z8-vqgm~VEo$jE*bL5D*Ojw`Ey`b~A-jP`QsMLv)T{`K^+u{-WMwv*=XaD{`mIYeql zE8Mm31g%~DIDdB>R7zb%EpnZGFi;N5K8(}-??&jWlswcemH>qjwZb@!&5x zL71QjkA8__nW;^fSaK9SEX7D=>vbab?|-29-b9cg)Bp#f+UU$poO;9KJUY=L_~GGN z>;Lfs>-ZoE&wQATg|fO(AwS9t-1S%xv@Xqt0Y-y2$^0Dz z{jLIQ^L;oWN`m*q>IE!NoXfKpvOvR>t5oBoBzUUCQF3kqBULX9j=H<(v+=noww_Pk zhn;}N_)AQZ=1j~ni=j7~2|jlTN1r)wsMA(IObE9%TW&oO6@OkJH-bE=20s_KTv|YS z;+l#7=0xa?%pvpMItZ)|j69T z_#z${-vaMAC7Va_PC71BPTt>4L#)vQ?Js4xKTis3h5|7#&JR-FUj>PhPMQ!QM~lvj zLdB+j_Siv1Xl&}`kXZ9zN#}g}DZGF*W|d;UNhP_UnM89V^FeHXDG~at$}{P@LsaxR zmD)~DV=&%FZXLZ(pM6`xGn|x5=gKF8N|+4}-qs=?tDT7T!98@3{RO7~*H&=Y?m+rx zD-++)4s!nIV$3!@Nc%2T(~rZ8V0H017+ATKH5=cC?Rgp~t#S!Ut18K&6lsuRv&cc) zHfr;r3iInW!Pk~?xUa7TlbTe>-AGX=vsV`kb?k*-X2vLdRYBT6DmV?;n-LowJmUk z;V;^_v^$y&$XcH~vRi|( zqIc<>$sCH1L-@?hQ6qs%gE6$G1?M!GgV^d;8eMzxrVgGi19d;MMeCxO#jJbd)x6>&#USITZrdwbmrb*n-^Kv5M;j)WMgH zR**ick7@p^#hv-o@Y~BVv$mZ;66hSZO$nht(LlQTHimkvnp5S~K=3c*x_p>$7TTDdISo{|BRy>D4Nzy?6eE^$ey4X+V z*YV#eHz9eYB0jOIh0&M2FnOC4Z;IPOUS&o!eK8^iFZ{>xlKN_5nDB?jtXjY{ALT*w zpe*)?eWF=EZlQc@B}n^s!Qc-Hr$RPj*0V*t8wHZoRB(zOeWi_y=aiz|^{^6rXYVJ0OG_bk^U*pA288_-&d|PQWqOY`qb0d`|vXjJEsnDh1c<&ND%y! z_yAX$pP=Nj42pLav-`Akh}T*!_RZ#7{y@(yGp}w#@rNm=?mE5RLZVsA3^)-kJvF-3-1j1DBVASCw3tYAG$xs zq0&IyJw<_DbG6`o$<*UiCs#3kLID~S>p*wj8Kyec0`nh9!0HNjkXdU5-$Tntl&ly^ zt{1_q=lQ0tX&vnIlJDf)j}Q_UDIiB>WN}-x8g4rLl)pD}lAzM5fP5K}LH+(zy2rp3 zN6Q{^imDh`F*ATpOYnjxR#)lV`9h?*JrV7$oT9qn3GAjbolv8pfdyIbz@;^To;+I% z{XSA)WZ=Xz?|MyqIBlG7Y%_Ml0C%y`(EA{UZsjz;-eXIc@~$*mCO3|Q zItn|DHwL z@-4K2Lw_!8h^E>R2&1XZ{O~m{wD_$d3@I6+{OTJppWAcl$+w{1a5D_Q@WO?+AHy%p zR5H(FDN!3NWi{+NNJ0Jt!O_q9WLnxL?1`Aq(`_^b{lOxT@}I=pQ@t7^APDD~D8c;l z032SH!W0Kq!`QuYDi%G9|9C*2H>*Wj;2G=;yyrn==i@I#B0d@JU*N%+Gb7~Bk3ssm z(+2&zJE3uN0^4$S6YRI1hojQ!yvN-P_}cG>)EU+!P+u4iJ?2o{&0K%I>k%{lBZq3t zn2Hl*{K#ta-Ii;ThrOz z*yjW|wcyw1^6bvu$E2~cjWO%{$<2xpTsTDw?SxdJuUihnS9%E~!+MEG+CB)=oF>ql zx{TU&KF3A*`hsH@x-nBpf#_b92A$nyz*y|T20D;VodHcZPrClmk5Y zr4IWG->~nMG~vr;0zWF}HY$Cb% z9vMYLK`Mvo5D|U>T3f2HXJ;MUoGr(5OB&@%z4m5HugF8YUJYFo{hH{{iN~dT<>49k z89a^Fl0K(PaPr+hbY@UItn0c464@>Et@ZT z=0ef@t(aXXN`z*_fy*`3WC3Qq}dOWx*am=#QODu9XE zAfq}<0ge1s;Oi|RRIW$>#j1F02-*VOT>T{Enj1*{RuX(H4rMErU50(`w$OEPBW)e| z3=78#nde0(aEeMY{yyc1l8WvSS8fMeB=16nZzkl%HpANcMYWlJEc%Qr6eJsR$W6<| z0*%jrue)Y}dgwd)_N6x_olRvX3u|GFhz1VXZ-V@lS82RX95Z;rkrln|j&k1dAo4Pi zK9ELQxMwn*NZUn=}gljX6;7m_|G??HjIf+YYUtxnAjnJQTjR7t=Ob^15Aou%#-N zY)z;Kr4!usJ^cWqSMcA=L0W5ij>Jxng7I6a=$ai&ot3PyQJ@IZ9QvVrhl1et_B=BE zh@N1%sWdk9|3jT+b5L~iIxO?0N| z0ue^~*m8XrdX`7wv=7GQTO&hv%<#c^VNyJ=JyRh;CXIE-KZS|m-n4y&D;|F}pV!p> zmuAIeL#|v7{MqA)LKR7y2DYKzwx`V5{5Y60xQ&XuKgr(b)|;GJ6X95|GDsqK9)6KT=E!jB;3x95 z(r!ICuGx*=m1$&cdj(y|^%J~8D#_SeHPXd>*B;WZsdbMWNjkZbQ(8Tzr?2fJ51SOY znb2wcwe=<#G3yw+T*3(@NA5CjP6Xh+_%dSGxP-$d<-zhBQTY6H9ko|Fi@g7m@sJ}z ziGd>T=mI~SWtWQ24)36v-kqc)O$@i(7vrrA-@)NT8)0-;AbdS9#amJ&%4ImtK>W%_ zoVq<6Z5|IX>#b(<3Jl6%LqQqi{Pi*#-YO$HJypzf**zq~$^(}yHzZU4ZilV<65z6- zo{Zd2Wb+mH(3HFtKcW%&?JCP`Fk3`U|1O7-fm(LB_5yB}(g{*9A~%iPT<+1-f?w>)67KU=ZNiY)VZ_dy)`Wk@bs$)j9_EB2?i zz)09fR@Xv6>o`QA#@99`YmN?@?taEJtHpBX+~r{qwj&yCc! z#ukKUX8^~9L}|<+J~qDi>wO$i>uAT%*L_e&`Xu}L&2|WVn2(dc+$MS?pX%|yGaHxH zQ!T$)toGbC;u)dNvzEc%!XaHci`Y3Vlmu z=_{9w^cSOP+9IM18=bkDk9!rgm^QIf;f^RyR&H`L{J_SR$*%zl4z(i55|5bI~EQlj3eUf0Q$(IOt-KHhT{izMsE-$cR zk~uC~^$sga#_9dz`Y`?ADiRR?opDWUVqK?vc$qQ60&@*KU0+8jvcis0*B6J5TY&5d^lG`JPlQNxvmpn z+5R#xSmJ?3HRDtv!;}1B!>MKe49IzP4%`OTqL#Nd?w+F$ed=nYdjDfcE7*-sISgsw z%uD=~WMP4b|0jkWn1mybYOuN2lB@CZ1Yh#YAz^hGH(zp=!IX5$d{Bq7FBvr0SCZzn zf5%NLQb0HP9LC2tlQzpd_#iNszCHr{XXl{d-6GPE^n;nF z^_O-S8Ir*XNnkJahMmSVU)J3q1wNY!!4*vflCocoSC{*Z)~&BYv$-4%iOYEE zpDRHT`$AH`Z>r$(k3D$CyqRHRrU)+A)`HDiRXjDR2Sg7YAa*Inf?465j!|EnKPA|Z z%D=lpZ^oM7L{VoNHr7U$7}OC3skNx9I8UG{bQoT{)zEs0W6Sp++8$nqwCjHHGtI-JJN58hgaVyTK4+`giO4u?5p=8yqzQKtwA zTAYj9m(QdV1H}c(k%ge7yn=ZAafPWj_OV3&3=PqoB6t~B1u9uJIB%>UOnz0<87H^k zlG6g@%-Ps9TnBRRv>~R&0|O3Qf)+>kc$m>d!_*}p>60zL<4OPq)2;C1%5HSv_DWxy zs@T;5(b%E(kn07eL-3Uu==Wwe%DJ7y;*t_vJ2+?-=M_WJWkRV-Mhc!DTS(hp#j{Xy z2x!7$WW2*^V$mv+Sz^hlIlaKlbs|k%vlI?Lcn%)K2v3v`U@Uu+tD|I~ii{47`Q3sK zMfXANLJtuuTTbJi)#BX~Z%Auy6-HQU(}$KHsQjq{9FE|WHpK#LG!+xvi8u_&nJ>`p z@>5W$7UCUS(aXehbysTI0A-f*(K}S1RA^qVRg`&xe)%!9*hn7po!8-;b++KEQVRQQ zgt&P}UnXk(Rk~sGJTU8;2c`dw5U*w0XmukVRWIMdHM>$+w~RuN(k;Nf>)%4i8ZMW+ zJA*h|-JvhInZygrtH8c|A1P5kfsgLqqM73(oEE7P4%qBub(l(cqca9GY~$$N_&!n^ zS3wJ-#Ib1S>8(5##fBs9l#Vl!dJV*gObwmL|l#*a@fpbtfKi!8l8)i5whg zprgsk_&g<;`tDrI_gW%Kqn2Kwj-s6Aca0&e^|QpvVJ^F%fKICN zkZdiBd7`1@>2g)b-`xl9g+9dKB>5yy3Q>15UdQ_{Xb4VpIIL-VVg z%KLr~?(<*FQ_$5QH+mEWF*`OuXH+-S?z{*t&gXJ8w@%~e=t|yr)fzG>=m?ih2x1LZ z9A&@zuOUufI1TX1BRFoj2V%6Yq2#9-yuI>bu*o)^3d=3P!o9UvUMU1BtHZEzzXUI3 zy}V%jkp^r@=g#G=Kd_EB!2UA}U^V|a)t`F|rd=MUVJ?Z#_P!2H%G1(~P!9B=AFuDEso#b1@14iwhxbpqyI&Zjrp40tg|1|Z zT_!V0xC6vpW3a}B(0k((FjD*v{ueY#g#;>it>GHn@+l$%Cttv3o-TG9ttU6qju83i zlR*0`Nv?<--raQ^=7*nTZ+o^-PWuVkd)MP>b~@-h6ytgAB~Y}qn}%1WGtNOl#6K+= zj70#{dp|(M=gY)qOCG95<-=m5V`S)p1)5_&dDc8gVi%~Ao7OLhw08m?X9h@9)hcj$ zSIb$Cr!o&~fAyRI(!0Xy#xIe#u8jBX1EYz^ym!2Sc L+M1LS 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

    6>=J3dOr*+R8Ng$109GR7cVk+qQB1@j@E? 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

      j(T6=R>NsAvFJwGSAwrdl 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

      @Ncs(w(om} zDqCGZq-%r4gJ1fntP?~M*L4wJ6eoi=_aW+ABAhjFKubgAk-5O6TZJ8uu6NcUH=``fzO!_%zEArn=s6zRt< zl7>gWdXT92Rgl%uiGfioq2QezOi6TLRCHJ>mQ2{~xtv5xwTH5bqpbKFC647emuxXz z2C}9XXxvS0X2FjYtmns&T8o2ALCIDEI+g>tbi5@WbkexYY5_QuE0KUZE{ySoT-;EU z52tsF<3qb%>enwsKh3=bwHf?8%}EPLmBlOi^~y8I{ntRxN0!nDj-{m8^dfHRkHfJk zX|P*l6)~;1BzYf#q0_F4Xxqh;YsPKNVOtNBUUvgV8#;(DH>+F6-zDo;`r>h+GR#Og z$y6LxV#9(fAgz2Goiox7N%!xOteRJ3M#p}7dQv2}>|BqxqQ&WhD0ey~JCwSo>?f}x zVrZDuW@vrkf>~SINTQM(-WhSgd-F^QU!^8UZmFTw!r|b_??Uoi1fl0u9wWA98}%AI zfp_Np#TA-?*zj^U>|-q1?aY1p?rk}KLguNQ!CibUN4GC=>;nBckEJX+8vS@%MS64_TW5GxZ!q)aapqrop!+b0HF zA7`;+dn)1crSEKX$!*kDsGui2Luk}`U0glAlJn*0@bWU+sd?`iYWnmmJ-#d&ZWNf- z&dYp7PZjzwZX2FrP;(E_PS%9@ODbqHB#a6tEkQML80wUgP|ofgDdEL1&MTC#jqUf|eb?aCOYc%Soas1YG{i162}0K@4qxPB!|=Zs2W!`4;scXBYD z^|pf;^*$rgF5B3go((X|RUQ_3+-5v|ZBQ*p5?nKk@M|J}9qrCBZ}~MBBbIg1@vr6J z#@$`7ekH(+iR>e*bPiy$Nn7ocjRTx1(3Wm+dQ|)E({(b#cp>JhCjI-b)ijx0W!eF3U+TZy&y1Ub;Z| zz_eQJ+E}8!{0XdIvYcio=)je@Y6$!!if^8*!*`9Z=>yk=Fz@3ddTF~gT>rA4c3K5v z{ZJu#iEwUOzaBO=_60i{_K`M4#AEU2#o)B668#4V{Mvkvs{PBwMV}flC_8|Sf5wCO zSvg=Wa|56HaQ-gsV!Bg788y~^Bx{mf$ivJa5~Y5DD#ys+$xaQt?b1$U=emP}p#paC zB60KOa<K~=kE{ek}otw1HO{mT& zeJ-oFBZi)A+y$`;b>#2UOK^97IG7(%hE3w<$?GM5*n=(i$kh=B*GR--*BOq7VuEC| zx)fc)vGtY*KF0``0$8?D3hnEqd98I zK?Yi=Tt(lWF48C`3F}RU7?aidF!$Dd+L|~_Hs;8|<=D9}`>7)yQIew)J#jc} zy#g~Amr-S1dw4f~hLkuok&XLPNxUYH^MKUTosZ^Nj0fLB3riR1>rO)ZjBTLvc?l@$ zw1Hq`IV9BCo146!gA+<~Fs{)bd|h0OIKF8?K+KeQBI+@1m{lek$nsFn2Y)PgtP z;>aQ9W%b$bcW}YKe0)7kmn=A-0B$|sEG);}fp0lOnq>k>IcG!gG3a4-PkK+iMwVc% z@Fv>k>r7-??Xf#Ti*{9=hsnXyu%JB!x~_6gk!kBle?=J;XcZ@aC*OxUJ8LZE{Fw73 z5}-x-JX-yJN5%sTP($bzjKqY)nZqe)_DPiZhKmwm?s==wm`pUNfc&CEbj~=612JZO%7{|{`<}=?Mn*;GXC)a*1x{k}U z=b+4UB`WiN68_cwOrM#Yg8du+5Vd-H_?�dX~+H4_T_1^xrtMQuHKj@t*=4JhPcK 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

      I>iwsOAtK$q#p2k#e>__SjD z^=BDuO5aP_+1jLYjstcED6pg1IYjnHEWWYSz`)D#DC$u|*^&LQa-tLp@%dopzkyso zln=KL*Aen!CuH6G#~j+Q8;S=+@VKKcIB)z(Y9Jh4icZ4@!vZ=i8jQ=e7n8G!pO{k$ zJrvxch{Q_H6FVS@?LN+UXzxCp7Du3`CX0w1yoNhI1}bvG8v=^2(k} zb)O59F@q?$tKrlm9klwF92D(LWCl0xq%lvY;(YZ-ut6snyJzZyt5PByzGwl1JZGll zup$s2WhnfS2n|uMYS!dy;k$r9BBY>3^PW$~7jYsco0d+-NVbKQ|5wgF;j%^RZ27dm zIUbfJx3cQ}sic-4kM}a|&{x-n6i?d#tzCe1@ejz|uo(E&1(cWcjufbx;fX`Gw4_HH zI|P0($Bqn8;~^Wmvho6Ho3|6aH%h?R=@4G^Ax%)$^g!Hr1qa%5A#?g8w0310yo+oshx9(c)qNSnxy6dGnex}U+vnTqgm=0v{dtqtH(_mP%A)5hkb zM`_hmdqyD98|U-`5>Gnr##W09IbDwH2kuk~9EFhr{r(vOBDE=-e zA$ec3F#d2K%>G~i2~~TcSw|bLXn4~fN9OU(U0kuCbve!2w*iEg*5Sf|*Hm=FO5U_b zzMKnQjDPEr8!Tj_jTPRXAZ(%!tgSqawHmo-;2Z*{isR`vZcqNxi`59Mp`=3cA z5s=dIfaEso0c&qdYz`KZ_Dxch_SDkI9)^a{Q2aS58lMvB?Ew*k@4w*$Nd~O{w_Xx2)9#RqP+xPMn+`({Cz1xUJ$cHp|b!i7D~u7P^R@ zi{DKAKReJbVqG-&Y!;r1Wzc%;A@NwNXySkEKXQG+TjJH>k7uWTL1%8SWj*5rH**g_ zMae)gHSi(jKUTt=o`u0dX)ZqXCtCl8FeHzN$Jt1D`jCpmOH;cSk>C`oRFSZx6z<6`V(6 zssdXpxReSNH4)z2DgsM_VXUE>$(7N?5XKiJyp*6^X8~^8beb0Kc!!oR7vbKyQ_x}d zb@bMggV08x?XEKPUwb_j;c`0*t*Qw(0U|Ho){+%p6Y<|yF*?VFJ_M5uW9Z-yeGpu{3{Bt# zJ)^iD$2xw{@T})-OL!Ccy8b-Qwwqw$e0c@8v$w@$&RfxRVm`LT<fs0{c;MJdw zMeI3x?wUUMi5)}tTX`6?j=?`SxqJJ6D%5LlCfgxAnQnD7Cwou&lgp)+5bN-Rb$!(f zKNp3Ol?qNwXU{pjnO98WcP7)?ntv=m?JIg_aD7|t-*lzc7|iB&ab>eVlCU%xdM?J6 zNZTsIE!j6@z_*B*wK|Wke*Kq;Z|NfGD>bp`&5Pr(Dyg7ElKE6z5# zOU9qw=GpGd1HB)dpWx3O%D4PV?tVIf9{U_%vVRDh;FOH=4*M~=aWb19d=3moxoms> z7@h7@O=a&20`GG;eO{gd$JWJDzj!@F-vYY6oR4cimgAB^d3b-jj9NwvGBJUP4$GG5Sy-J~D}; zn;&k2xcAWG(rHM?qd6Y7Kj`vifvvDP{_Ynu8Co|Dl~q?kh36ZB+v7FN zDa;fV!{yVzk%l?#v~ta5;{Q|}Eq=eoDP_|5vecId`3%zeg4#@b>q+9(?}N?HC9r(2 z1+?$}1#MDtkTdcGd&*KlH6xhz?U&&H`1S`|7TZyl<6Z1DGlPFMl=>Zf44M`hWY6PA z_?r>O|4M4<65&v4N(#a4z#KUG%^B>w^4RX>qKud428>@OCVmP{Ain<>R0_xwv6nnl z4mt>`n-8&j2g2CetI@bFzM0lIoh3d6x)AgB1~tC_acOGTW18a9Kxc`# zWI%N{sq)y$eNR$gtfB@#UWukV%%tH?`yV<;O`(nGsdzm?-$FLS^ub2Dtdd66g_YNnSRTginBXQ)v^4^(}>K|F%vaI#eZzA?{a z^YS|3l6nqN6?sTg*OWq=J(oXn%Eql(tH_!}Z)(;qh0zCBqvWZlWa;FmRC&fUIv}RT zzVy+h!h&J6aIz5kG$ugWj~1x98i-R%CNal7Mfk%Ty2yt^p_nl}hmOR^!+zaSvhu}7 z>X{G&fq08#JTrpkOs?0wG!;%9dxp9tXNi+{Ac?8nMKc}4C=-&2e5q7uOs(HuHp=;o6{Kz?MJ62}HMA=eoeR7rbH3q_x+a=`7 z-(W26O2UN|JFzzRD?MLTRaB)L#_?IrrI05X-vC2Hvref$C4W{d2|mN zOHGANizwJ7SPbp&X5-|X`PA}{04ct^7WT$XK<23mfbI@pRQyvog5OFuG6H(JpxEn&st2}XM_fDAnw5_1 z8wDi!nj9at2Q@xFCQ-)L=;;mgQmg>fPj`T`$CJrMr!t&cX$u8nbFZfQMB5~jSyNK*{f8AOGMa}qN*sf}YBD~KXaM8$ zLVR0w88Yd~MEmu{29>&u&@N1VcNZebGpNB@suBUI|&dF+6%<;K`l#>`q#awQ_kxbS(%aAiMzHna6 z9M=Bi_LV=*(+#(lKt)d+Se=NZ;&ZYw`Lr;6-B?w?9V282& zGti4Yjz#?A?ZWcu|fpl`?qlD%Vs z$)eW@HLt$hryf7UDCv?TLsgcHxTXMv#VP^u`pbTKm4tJmlHo`HCmLO12dA#8g3;Az z_@mWKy6w65dtV`~3gd`P2Tnu51_S)DJ`oxtu95A7eDZADVk)9Dhd;eQ2K-jY(rJ}) z)I{t(p62|XZ&gjOb?G8n()58&xbut(J{86T)83LUfeZ9;wK6?xv!C|6y=JsZeX+AM zmA35&f}Y&wGHgW-GmXDKTI|} zB`{~QK726d!+wi&ddkU&oXm@1nXBonL@zgknQ@1>4#jeQftSQj z0ztrOvdL;UBj%lt8BMRTLbaC)kV|)h=nH>lPTdbC|K%*Q`iBHeJGu}m4~5betfOBp ze`WS($br8u#|QqT2%;QsF!+=pcAkGkC0s;_XSO5xy14^R`YeObN`7FUatIF=ghAtq zg&5zrfH-O{r*nFzqe}2%fK4Wl^EVS)w=|Q~C0TSw(n{Q+c#0f(s*W?0grW2HKI(Qy zl(97Z#_H}1!c{prG|nKKG4YRw%4rX1M_?P>Q(8b9(>zfy!IV7pIYr3#ZFs?>l=XTz z1~R#wi+|$4M1H@$n^FGA=>)w-A^d;Yy=N-vOQ7Mi2NF;odjP$WY@{ z%uq{0+unUB&Ve)?Rox-_n+8}2hfuMWcx)G1Nq4CIAvO0R$@qMANOXThWIyD>f1C8N z(7ltG?0-OK#!SOaQVt~Q^$7HH50sF~G4xu|N%>U_3K!%<;;kIm?B~GTJts@E-0#rb z8XJ%*3dX`mJJIP!CRN@OieDCuGpwT>csvP#8v#H*>kX3#_aKJcEyHjBx|oSeMM3yb z7W#4-yQ2Pns?9lKQeP&6sbLwhyc9=mLsL+V5rFe5#UxqnEtBTG2-F>(fT_$Snqsho zj3~#`z5A@7zUL~fzu1q;W_r|XBBd9#3Q)SZ1Bayr$<_5H?4^x>ZF5&Mv*o4|jRhQ^ z=kG$cMzaYH)!9(RA4PZ~bQpp%cLSIw^5U774EcJA^CA9&SIe!iaKr&#`d6}-7H6~3 zW!nf{{EIwHE`lEcGVs&5kvN72(ad88BueW(912gv<0Z>r@x)tX$BJt;v9WyIGCv=L zCiaoo#!p07Lk7F8TY1^LjHttfxm3G08B6!R!7Ck&PCyuo#6WNb`83OsxbS^Y z=i~r71dc=HsKSyrTOQDb+;07OayA4RIHP%kCnLIZBAEc|Xyb4!k!}yekd1} z*_outKNo}oQXs1}A7=2K$;#^`c#Nx8Bv#v__e*QM*vOrYxPD@Ca4>k?u%Pgf^Qivw z$A9m-aqDw=a(&1K?0hBRz|mgdd6v>kvo{m10uk7(8ApSy*5dfTiHyBpF6jMR1ScK} zz*2(Gz-Ztp#b0cj#TFKv*NG$n!nO!+$8ecHm401nD zgTo&*pgJ`W5;GM@-`aLy{j^cK?;3hOH=u{Zl$dRLQFwX#R+w)qNA4bIrAjvwsF7?P z0S7VY$f{@C-bB*Ej}EvtQXh@u046)$CuPI_q-J>|uGk=m3rxN6jMa0-b^c#c*e!x{ zJk20L@F(L~Fpp-xT@0rl&E6_ci3e9 z$=Rl`w?Yc#xg2O(Pb5`-^@Ej)eZlj}oQ^h{Ens^#i&ae71lgrmpsHs&xongK&rVjt z)#44*ait8-GdWHfZ9A}lB=T@qB4n;oV6}uZQT9U{W1yeRBuLA0S+F6@ThR_3gTINj z_C4^w{hXfe>mnUD?7?x`73%Q52phtJLHu?E=!siF=?g>9St|neW2TrQABj>ma&EE#aZ+?@V58kl%ZkUh_M3zXf(Qv6Z z5L{M-(>1{e4-ZJ;ljtIdisww4Q#G;drU|MK>(kL#3C4Y$A#8o9Lf2gpfa5_1ta9)K zT+-VD`|o@v5jJjg!ghO{W-m?Oyq2Uo^)s-h=OT5^IEh4gCRF_iAR_u@XmP27{8^j? zk#(W0PM#%xSX)IDZ3nUIV>9#=>_WRqHsp(NAu}MF!1WyqK=f!ajoNe!YhrJ~krER! z_2C4*sBa+kdiMs-R9L~Q4Qb@c?J8<5dI$#1qQ=f z!?CiM-JML;Pj11eBrDt|phoNBOzCmCZ7{O=N=^RuH8eFn4EFklBDZ>naq%@EyC#R| zmH9wWbpd?Z?TYid3V2%MuGI2cELv7hCr|nJA!hwiqBdtDaSd6H^6i0`*!~Q*a~YA6 zc@6Y|fgr#C?sWc-N9!?M;XGDzyn!`^F0{F@iQHQ2%*|BiQ+}!y&p&=)2m(No=A9Urta56$5tiiI$qW-8tAvlo-z` zub?_Vl?lu82C{H5{JS#~v|SRQWKS$adsgzU?e3)4UKSELYe$gC^}-)Q7tpm3IA&rr9Tx{z3VuZ7-mB^m$A||==52~I&Nr1e`@#O7!I})cg z3zw!?(^4xrMkL`fwCyOuUx7+|)y@=ZytR}}*iw!Ewl|TV{&uszce8nQHjR{rv&WdGPuH|mp$;ZoEoiuPsBzfVf;Zd!~BfH`$Y%g z(d2#_{MZu~{bxoqns(3x^%g=a78Cmm)9HGlLBg0T5kJ8Rd>t)G{`n| zbSt51`WU0&sEwP4tcb*GGwAv5LEk3cq;opcq1kF4yyvaM%^NDn6=#NyzS+%bV-fF2 zZzX>Oe$yA98`ubE5xTT=4s5RH5vg6nWOM2>;-wG-zKS17;@3T-RVo0lFVLZ@K66>$ zwrfzb*`I{Gj3%ky(^y}n0Y-056AVApXTJ+6VikWMRjOZsMrnEw;i|?~%uvUvD|TYD z?sWR9IGs8_{!I5DSAxVTb4kgn_aqNPX!b)n40dlK>v)@CS+O#+XX;v%y*?G$*{9&h zZbS4iZD9T58evEAIOfQPl2pG$x-c$9D~d>1Js<(M;x3@6lr4S{yiC?xG&4OHyXm)ddmLm1aOhP50dtXRv@LLiv zA+!2K$^rzZ`DlAb8x^Xj@cCSJPF#XJvmgJ=%2~&ejJMZ`mv=DyaeV?mF^YLn97tcT zGJ|Wp9(ppD53R<{^ms%k9UsXDojN%j?+8GXT_H7Roo9k*;T8I&bUVJ`J5c?KemE`5 zr+3SaFr!&HG*I;=e&Sr4)~n_bXDuNzIKKi_VvOLeZLx8XYAQQ8s6}Vp>&080r%?O9 zi8Z(1-ysQqEePT3!}A~2xKX$rs$4#^&yMNfg9Twc|Fj_d(w0r2w3Bg{u!eQfWu(OD z6Y7rVpq12ha!dXQBXG0{znLi^oLtWNvfonaihE>He;Ho=I03H;1rqtlVv-v<51PC7 zG83$Fu)|aiWU{4+0lmvgEV)I^qXMzO+>f;0OT_E3h(~(4ou0urx+Imr+&xlgapgYh ztvv*+%@=mpen%oH(M6B!;hDr*$KZ*|e)7?GD#!BGA~!ka+l%&4SgLDDq%Q7cd(s{e zZA)$J{3e0Pt$gquU4T`&qIe}f7Iz*rCNftgphQv=tDWlEboWzqFh-A_7<__;n{I-u zrY}rL6@yLNTtLs?8m$Ws0=qs2*Tt%1asE%TZFnaB6qBQuUW_A8GmiEakC&%$<%HlDIN+7M^_ELEVzcB)BEV*1g6;^$h zp@&RlA*D|ZoJ=z?H`N!`2AzYoQr5h(HD*vEYY9Iun8At3x$r)q5JICbfPrN{HTZj) zF*vHjG451h>bfLo3HRlR9mqk^z8Yq6^iI$SY=V+UHW1HoPAlRbz(uiATr(g-uU06b z-E2KpLf;FMtxEBRi2>Anor4-~OK9EV=`hFsHU#s9VcVxoc;l!Qd+4PqbaHdAr$H$+ zJw1i4N!)?=`gCw)^BM9^BY=3UdO=g`Zh@b%A-kmQ1Ab7gB)1(@I7WUtiBPeG>-Hw( z-%*bD&~=s^h*QD-_ub&)td9-}LMC7n2j(iFRHn)tCL9fcU%tO+?m!Xv!EI)H{v4{K zz5_;PW{UUR4Pg$rH5C+n4BbLtki?3C(&ed?_BIUQG|LKKH&0SHJMZL z9I?8WI!E=uw`NP&U>*n#ZR6zl#7yGp?@UsQ`pDFTTq>x!37cj=B(`0A@XRN$=g$qc z!hq}dC>mnw5Rdg1Uj#4Sc9M5J3g~#Dmu%l3gvXbO!}G|cbi9?@qi@Tnif)2n)^Y&y zW*35~m;uxW3&K*#XSn-;BwT%~h|XnkWcinJwmZrc4~+zX$Ln&c{&+dAQIRKQ-bYYe zVKeget`XPlWX#;!!zQnfsX6w^j6L;!HmtAhCx07f!sr$|lpWi~OjP;+{5(VW?!1{d z*?u-jlTyX*$}W7=^omGxb8dkFuJe$ujdyDofNk_L`1muCX3nW*3eq)d&LrKYw?8V; zyXnI?t38=E*VN+eXmR*YXC9K{ry;du9pkXJ14?fGg83r?CauOXY?N*tz4Bx-ysl4# zZ=;tW>!BkQ?mUG#x0cY{t1=+Z-Al_~=fTE#PswnbJ#XQ>>Ew1}F!QSE96Xzmj&?!T zuuP$Z-CeN&YSS;tGr3(-07R5k)n)}CXC$UPGHrI*NOOu;q#g`vDk80TL*&z@U9 zk;;j0Cr>k0!qj0seBqTq&2xqLIZs()xlRszxxHYO=`y%@FO}m`u{B0{+Aw?57GRtL zz`%iH(g(*-^`ZMTcJ>z19CejyCZsXz+zY7ln>AFV{U3YlKWXIW1jF^G>O^wv5}b4% zq>gH>)O6-UCQ2h4T;Dv#5#b>!>LHFRp9GV_Bi_`=Gn5ef)9|705NbER$IgCB@DZHJ zUwUi~cCG%!)T~g4h`>sYiKa+1+ybD{csssuX~Fj9TH+-oK~}19F6@F?81!!**xgDY zGen|6<$gKLebvp1DZe7*cn8E6-=L~170KcMD%qAQhMRAkr}2h)I1<%LwySflJ&8l` z&n+L_r)6Q=>2%JYIz}6^dl}vD893Bwiy~|^Zf1(vwU=YT)K?c@{Pcr+lBu9$$fp`X zo1n7kI^D=&|DWBz0k=;`F@Bw8@cl#?DRowZdr~4Gd1;h9j0z`*7Z&go_!=PjxF6JP zt5M3$1_owIGTXvUnOCj$oUbQ{UVf&7ucK~|`2AcC>v$DYSu;Yl{HkGWvKU%=Z3nGO zd(hpe2;VN_n33LJNT1tO+S?os{6Wq^XR{APH%|l61G0ExNg!QV5yg(JF9#PxYkK^e z53Lhqz*Aur*gNFn#jDqu4FhLchj%KRQDPGt^lAb8wEK+*SF3W2r%PD=Fomq{InDL& zPoj3c98R1Ofa+e-5G*kp7rPsx@?0Bo@D3#|s-dj<$92SVY(Ac~^Tb0=O$=F=&AxVW zK@xEW->nJY9QS6JTyKn?yZrvYR}qN)NqX(nkf%FLrraMxfgLjJLb-PEb9_jxH9s*6 z)ZdV_{V~w8P6sb8$i*;cPu%Qq5FGO-V%FU~aC~VVENn* zD$!`XM!Lj?RAozGr>O%5IV)mFp#Wds-v;^T9@1}83t``<|G>BOJS@(-!qF~_*dKLf z5SijnKez`|H3ejjO$ujJ&k4cLok5VeldDsPhLX4GFQFeoKwqE=2kw_qmuQCT&hWY4 zor?l5V$faC4W8c;Wuossp!;2gae~!ZMsQ~hIY0W5s0{_;%8_WCx%2~L`|fJZg{>}7 zcBq>ESpJyW&CfxJA_ubdqzpQ|C;;Qf-=L?uoH?WNie_<{jtyy2`~yF?gL>mrI{!Fj zPj9rv&>dgl;=^+K>GBesC^SytnlH_Kw8-SPk09|ry@PZ|*W&u=iX0!;9>MpUm9XiDF6xW$A;5uiixoV=qwFG3-tmcb z(6h$t5!dkM3&&zEYn*obK01d7fnWYHQXC$DY|T;lV^~4bbP8}t@HJgO zFq>WA(TLl|)}yiiby75wbH;aX!iRic%-_eysCS>q6`M(H!dq@<|EdEcn$q#c=uGmX zVHA^sxc~h1wWMbLEC|*pr}LbviO?r6aDQ=`>*Y^@>laRw*DGezfKT(NzPv3;$XJuD z!uv5X;V9X}%j7b9*;smi0_UT0!#PT+P`a~_`1<7GgP$9rPB~^!M*3a>MiiW}5M7($iz)S*<$OyK9h*BMhoHXhWo$0o&|l30nJ) z0izYddwA1`=t!Q&3Db1Za}C0V57$Y-y>qBfa=BU9C=oPEBfR3L^u*CmR7w3DsNVcX z=9=%K=|hoZWZ)UiRGtLB$@#36Vlnm365)T!62y{IUutgY@WAiEeB$Yx3-`qj61Rh0 zbn21{@_UIR-S%3LiXZfWaPfGsy5LXsR(HUCOkp!hKCa7Vhwlba`eam*s7*cB# z#UADYm!WLuJ+|P4e z=lTC1M>g!+vjF#no};mYrO;~jn?7n};ZL#}w$JS)Zkx?O(?<}B^IyX02Ec2L(qtl- z^Wp94W^UsKe5<#ItZs`(UiKYXR+vJ+?r0^NV1r_NJW1frYb4{GK6>!aqP?qD;?)AJ z#*xaI@P6NRj(@!qRTibtBV0##r%D2`pVdU~?Q%L_LKk?Xe$)G7 zX=JzMFIYN0LM{I7Mw@lXWMAoZP%13}@hOp5`p^g;zp@2o>v=fb(nvbbd*b~i%DCF* z8Y4NGmL@k0`Y0}6ogW7X3o88yk@ney6LNrhq~3ARbF?VD&Axp|O4wbg!6) ziE0hhIqU*y>gZrhTse0puKvy}5K>K0J9tU!>CspIBQyP1fy9{AsCCsJF+N0*Zb5D`0o!eKYzu6z~F zKOjlVf4TrU&JQEnVWehOG}gV&Br}hcT;;QU1w|4(7&a{u9S?kj>XJJ0!0aJ4?&Jga zW3zE!{duBmcm?>kpT!SWzlcJRrSZm&>-f>Rjjj}kW8lztF{qW|*X z;74mbINA%hj&Th9p^Iph5P~yV0jxXegAI%)DD>i1MO$C4@- z?;su-a(F9n9%={6FJf;!mv>k!PxYxG%d9{rFV zjc_Fht9C_@O^-`)Ty`4g5gNwYjfY6|f!`!aJq60l+NtsDH#9N0o)N!tiAm-~wL(!xFrBhiNC`+#F@Iw-PLKy#_DDcha=BWherP5EHZpn$)h6S+mUHdqNVu z+?9@ZeCOdxo&V_bFkB763NjPy_9)$MXL4Do=t#-R&nv&WM5SqbJGM->;ePWoyfTE)}SY5rW=(t4}jCn zeGs}X5!}=aNY^_VpzCZPAmSujI1xu1RgQpGqdfHJaPz#AbE%7zB4}=uAs;U5p{#p6 z+KEh|9ny)AndSv^U7av|$12?aXcs+rbq>3`haaeyDD_cVh7qRE>8YqiG}P1?PIKMZ z#b&l>L5{#K*Ks17rcTr(Jg8Z!1fGwdM+&Cq6jDIf&QQLv5}vS})cae}QvE(oifBORn-JWM!p2gaaiqgTf(C#oZW#@QC0aMg_s%CI z`+PQNKXM}DH-hlcHUWC{>O5Gy_A`tI<>Q)_+Q`^GAnWK^G@COWXWmXEnJRy%xJex; z@2nx2M-8D{z#jN_Iv^8P1Y=j{VBMe)I9U|pF5?u4*fK%`Pv+3e0g@>BQ2~$bJ`a1W zCrD>^D4nAx+L*K>18=X9gXEvd1fsW*&YuJ1fmJ4bRP=(RiE7{5xTxDAqYEWsMRx(?&4e>T)&CY zXLK;Vken~r3Y(o$=_(f!vTHyFE??*-?#I8tz8Vi~RbNM5eOISfAD$q+DZfb0jv0*$ zTc)7cg9=ibF9^H#dE!u~FEcy2hbc~u0#@M#yb;O7*}v^@$AM_f(5eN$*Zc6kXd$GJ zx-gb}Twcqrj6R-WgJXwcarFHORA;Wh)815!Hcuz#Z_ZnOymT4SYkLQ8TW&(}m_Hk& z^B?*-6riB_Jyfxlg@ml-Wc9V%@GRgM3V$i31Ky)dflnkiTT-QhJDSLgXz@o z^)sWW_l4BwZZ!GC_3N)-AnJY|WX^OOa=pSa*7LwZcsS=O6{`2Ae9td2swY-(UbQl^ zJ+hQ&XnSI|#WV8jL=K7-4gKR%|YDpIT!anI>+&>V!(}+Vq|Veqod(rx?qJYGxN_LT-0!! zwBEl@+&dbWf6a!tUM~mZU$}Dlsz>zaVP8n&cwo`Jvc@9|cVO$QtMEAQ4X91K$SSE{ zCjSEENuc&mGA;cOZjDVtmq%IXrJDwKn_7qo_nhq%f6nNPPBOaodNhS+Ej~(`fdbBX zsOeY&&cy)``}93|^udyOmX*Z5{1XNZ`Bfz1?pYcf%DD?{jf?`bpRht3CuqM$G6q@x zrEfm2U}Qz@$(OxtIJ38%ZWLY5HkNa{>I4gj7%>9_1$W&1`6`$c6~W0!mP~!Gi!uRqzan-64)y7!<<+4C1dq#4$L@WhJ(d2xJHK`+orUV+Vl*%I4K5a zMQ|*%{1CkN?kAn~S{$c-nu_T$`J`}z1ICX;!zHl+`f&(}*{X3GvE3Q_UNvIuHCeo< zFpFwwOgDB6)F(v_CrFjyT+FVELKnT0xH(4vJ`gih_Oyqn=5J&oXAMnsSwVW<{)YjZ z1)%R#2knj4q$}5QjF^>+aF2E|KG{W3Z@808e&;gzd$;22rvi<4)omKn1$xQHd%9?` zRUSnx_mEY(sknU38S+aiik8dYrz&RWV0Xg_uvl0~lexRB^M1d2-}Vl2FNabQ^Er%$ zCxyTQ7N%akj)(j*;JaT4gjI&&i`?nVCGIy!F6P*DQ%9JAm;stTo{rn*ZzZipJ@uk4&q!^=R9qVSh2Vf1wX9G;nT}5l z!)u~xsYC%Jah|OwT)s(7Dv@j{`w#B%bMC6aHvD>N1+4cB$5FBObeHG_(0!oNIJP1I zcgj5=3qE>6LyayzFP6l5xf2-gJP(&`*T5RdV?>Di+48u3G*Wg2@@)u0=H_u29`L2} za_T^Ic>ui;HAe5r8#8vheev&(Q}9PShL!a;gJPd!kn;Q$8JL`EEOnv)y&R^X9iKTk z*Is}(59YJ0ouo0QOcA41yYS)U3|4r_G}dQuAE}wD#eSVxNa{Ad!M&4@>4s0oQGoSC z#Y6E>O!8qZzhpz+>03COTgzk>gp;lt#rS6S9adz82pF{-#taey7M04hky>EVEpDbg z?ID?_y9BSFup)`J-r!?4N*p(~&}hXdXqn=Lu?Y*nTBH$szL>xvktZ1PXh}mr)-aU} zo&h47QRJQ72Rt~l5r=CR89moez}cryqjOdNtr!Hxp*;EF@0FDs0|XUutqSMQ{;5g@vW4;Zdt{oL+F*43OJ+;KAltOkm9Bmq zPOsl+G7>O922$O8jjw~B!XYyyw2rx2U!{;k*TwCI%l*9#lBz*uj=4Npr4fd)74zwy zy+_FG_i?yytQ+fjZgc0G-$XoiALuO+ZmhiUADuEcmXvV2HbYQ{vguje3~>_Atuv=b z^wODZ`G-`2HyPA!Skki`7o%^pH>#Nz!981hOg&))k2C}uC5z&a|I#tKMDjbSJ|zIc zhXnD~K{vP^5<`R9R#Hag3i+q6fdM-m;Hyd+W_NXRxiw+9k{(OfRo=#fFP9Q|*PTqi zLKHfsT}0*g;`D1xI;_&Grnb?KX;zIph7}2rEvu%%oT`5$K|KeDuiqvbzS-F4*3TxN z_aH`TVlXQJ$j=QQVCEYYc)N55PP{S(*E}=4CUA|UJl_s)B_6=<-%4=dsTXR#xcYTBR^W5?bRSph@!E|8Jmh5Vc5 zQqOk|kZh)c=T;vg=E4O~6PJst?x#=zDLwp|d_lK3cg@8bx1?k{b_BQj67` zC+>YZ4Drb`HmzZFp}j$)^yo)YnR}DtF%~pbSG3^@>+QIKn@#cgaU5Bx1STlCoJ^(; z(Ld!kNodXp`U^$j9IVA<_l~kzCYBg-E{zuGo}@zqa_};5FPh6m!h&ORP|odCgSvNf z8SPMTNf$uIAHiS78r{S=_sU&uzzs26KZE(BQJ7B~G32*D#G^-timjZr4Zus9dUE z-dV3b(ZlXuoQ(I=o9Piq!WWL6jJ3sTV2d`PVXZgZarA(;H7R7xf?WDQWen0+=E2gT zGw_RKpuR{LF#7k&iS*Stq{8|B0&U@bZzx@qwG5@oXTyK1#~EXX(_BY(8U`P_%w8VZ zf@_3AQLiTtKW$zDv!8BctahED+TAMfrBfYd$`{ag3pr=!Eg4We^%A_aX2X_sIy6+w z6rLSHR`+@d9qI0ZHe(s%FWHqCc6I=i{)AzHPcz)SXb*C(QDpxQb?7$lqhe|S@KUmk zwLg>4a3Al|>FZ44$eSS=lOG4X8Q-aD{0+=MuZer+hSMk0?ZEn90^75^oz}0KV8U|O z!}~LWz!xNd!kTHIzd8@AD@=*hL?u3rJOdM1b31+xux zE2p4~vV{>Er6%PCusRY4Vz3S~}QoOC@n=kq5^4@j!Cd128LU z$EA`=aB6ZHbMam*F5GsWL{D4YV3IQz#|yl%{;drpALhKp=I7`x4>8p0_a}2QY~Wuz z!=CPn#?y~^fPX2MdmaA-E;^^VZpm*@8;XNjuT0r^RWahSY&GUK&%=h;8Ss1WN)!qG zKwixVhEJ1MiEB15{+vHZ`{&fKD(jxp1BN!>_|6MvOi{uf)3wAe@##~VaPLy!}va^0uM@j zr{&xFP|Lv%Ot-8i*24~PcCkD5bPIw=dnPfuYJ@F$i}3smIU0B%6xIsG;JK_S=H@mP zlvSxDSNVO2zOX7R$=zdQqUMeZ)(zpn_I&D*+f9!xDW+MW!-PBsW~TURjOVW><_7@s zHe^BBY-xJwR~?2}oyJ`cJL#mC0FaSFQ1Gi_u79~qoBThpF{)QEuP};ie7%N7uCpW` zFN6Wl@U-dr zoG)yiYXrR7FQ`CS9LeY^h|=58Re|z z_Ej+DHxIXKrzGN3A!#c;LpP@lb1bSnX5OR2(4-njZ*+O0c~1rDU8-g@``&zb^pt^$ zy$N8@;>rFiSA<(DyQ#Y5W_YW(oO*gLM5onz@O>lUJ}=sddaMDiudap0E(H+C+J^e? z4Y06F8a*~E5pCUS@bSMvKjrRaY#JZc57jxa4i0YM-75k7U4>{qEgNp9{-EW`gQRlT zMRf08NbAh4;hipbe)Ec>!zPRHmDB`T{HGe$&K#sgU3GYRr4Y=2?+Zsh^wOm_R>DB< zF8DlG0{IiPVaDEP?D)nCBh&f!+2&DY%zl|gD=`s1os`2Nk4IEDmeTP@@z^(hh+Wkq zV$>}r+1Tf;h8H_d;Nh$eC|vXj){k67&&Nv`ray=E$UO{BUGK@`!AQd27RVm>poC4s zedO5<1A4N2J}h!9Wf#gWB^@D`z^&MV4z6z^nv41vOWz6Fnvu(OlPPYy9EF?hg)zdp zfO^CYvYU?Nl7~W}V5T@s+{KI7(}kNMi(@{aZMMTP~|fol=MN_Yj&{m#t8`cEQeeCZ-7ko zN%HEjAm-SeXL2J1IZu`fbUvR+e_c|*%!8-ME>%|&m8lH|!A>|-Er7=(L_tL11fB9T z9T&gip>2mmV7li*7_-`i>)|ll`)x0Tk37Uzs^iQ_&WmOH`T>qQ7t_*%NnmCvg%cb< z{K>^482=`Rnqf(9mA#LIjrYaN6N3} z2A71TF?3A?oaf(z;c`2$Pb?L0{AF?8U;f6?scDSq7AIOOU{Bp=M=^~9OW>#Y`+9}V zd8l^MjW!-LA$tR)uu!TJj@L*TtMz2lhrPmZI^F})Dl6y?4Ou9#B=pIG78*a>2sZ8` zM8K*ABr?T}L;fp()cz*=A#wu*iYNiU!&JDb5<~9kFT#CAM)1_9n|w4MBJz4w4Q)U3 z=<-B+)JSL1uawL5Bvz7f_Ad1P8^#~Ae$sXmT{KTN!cF`PbnEKU-^HHv?m{OtbJl^+ zO25cUg+tKM{{X*NU!bzuC&{k7(}X{4F_PSEs4IAxZg5To!;%V8*EAh0YIrfIGm-@F zOaj^_jvA#`V86u=Hs$&xvnJD+*#5c({P{z~&ZP@BTFc|SwdYXnr#t<* z5az`8Mc8352CDZ$FuC7{wLe*kZBaf@tT7cj&%7oTM_bvpxyNw52;iT>bnra&7h&cV z5@cMwqoK~8_qe$F2v!f7IDH`xDehgS_gAa?SQARb@8mjZQ5H^Pv({F!~Obm zaF%2xQj2o3o?Isqzf7q6p^qfu4Z$nE8Du!s5o#RXGq+DElP!A!z;)G9@KgA~`q(9r z?V}tQO6M*)Hd?_k`Oo6k%&&C+gLqJu8iKIWOftKmfNrx-gkD!M>=y9{xmJd*J#7uw z{uV;a87u5wB93s<3m5Ao!l|SK$X!vHD)F0a7*hrky}ziBg1M1`T>)-_J4}LSDx3*D zP4;VCz{(A;Sxm^mFMm_8U+5-LS&$7+TUs$KP6`s&8_~@wrAz=f|BDjdNqt?-F~B*C z4NLl5pK-f|bT#jW7iA9#`$hov-(89?JC8Fq|0S`mfexr9dVssvx-;sX4R|H>9pm#x z6g1@$$vq!s+GVzveb=dG{9TO!gP--(^jA47+!#fL8jGMy))@6Xqv7uycjO%!r4RgT zL3>Rl@HKCtB789<(a)9!s;$REo_w@O-WRTCZlEvUEr9QRk1#WFKjWO81wE~)RAjjj zefHdlF^Lr?7i=WRo+t|>Yhzd+0~`Ey!Hex);m0xDZjocpY~a|LbmDSmDa>7+(s1d> zKa!m{K{wdmh7SA34X#mP_+BoCMlb!x%ijXhC;go4s4N3}uEV#EHZ=$d zT>(pjKXi1KAa=Z=Y(Pdhd%;%~ge4Ix3ir}GRbT1XA5!>LwU4;qBX+LkBs6@}g2owE z)a3YP;@p`4CQ}CJ+NGt?_e}!6^Amc%=qYuZVvB>ne6Yefj#g~l3i+aIF@E+GICaI4 zZW&7^4-S{&=Ub16_`Y#c{KuoZZk$iVkSJU@ z3r`d#u=a)|Ge=#AigEjkx!E1`oWn)dV|Ntx$6cW@A0MJz&^K11!wwz|=}{ST87QcK z!x(%^!*v-=ulPWXm!F|ie_tfw?V`p{3a%1a zCwF?kFa>rbwGrEG&1CCGJ$l&F1qv73Y1rYpoi1=wgw8+LK$<6vm>S3thwC%2*lQ^q zpQg~DtrCxx;pdoum(xKp>=N|wD8b?rt3dhJc3?l;V!fvvr^mkUM5C2H)H~o2F}i<_ zy2%5MgmV6GKiNi}j7DN``XGMdoQKkV->9sGK7IMr1K6z(8m12<(*s439A6@zMqU)8 zCcX!-bd4oyo^qgR?*(Y0LNtBuHHnEQ1t5R*bsAp120!~zsxAMAdB%H*Oyj!xj%CKc zQy_)?$y!w5EypqZkpvpPfz(vmiU_ODqBnzw$tu1ZfOA7(;R1IIe&vE0raYV{NEteA zOmLYH56m0z!hT@^qS2lP{XKT1{z(WKwAl$_aWSBHDU`;Ctz`?fEx5mz2TSNSQ2m^= z+);lvUbvq|kA*vu=%C+Rc3TK-b|k=x&s@LZZW_+Hev_tdc*gAfC*5FF!7D`7H;pK)Zd|bb((;Kd* zH$vQ1c}VVi+FCRHQ9-lqaCz#jxw!v z?T6B!Qu5-FHo`?ikSmFXJUdgE!97>S0!QiCf_qGI(iHq7SOv*(obIe=oc{UA`A$8q z;AdGkXx=#uzSP8$BW5bJ=>An$+x?L?DslU?k}mRna5H<;bsnUgOTcU?5xC$f*XU_+ z7nq`S61P2;*!TUV?ayA&qmq&6=^+B!%oo6YREC_*39OCdYS`bxzyy#S&mWUx)_Yeq*%w=>x8dSWSejuj6OWbY}V`=|(*wiW|n;;g_)v zYDT;4v5ZjbN zRwkaN7jG;_!P)mo`4Sn}7^03rH@Tio%`4C5n%+}~ya#nbZ zEjN5jQnpo~PIxQX?!xh%p@@>(mvL)^CT1+`=lqtR(blz-7%EER3;SE7+aQMdxGjl2 zQJzH$Q*)@s@wZ3?<1nE=hFXv1g00DF$o;Ee+^RSO{FB15YvTcW{Pap%d!z{hf@ZM? z7B(waLZwBc!msgdB0Oo*PB0cMv9s6yN#W_ikd{P;l}Z!K8`JNX>J zj{gMA5&S?p{_sJafifBzsbh83atvIP8Cg>Al7Wk3f^!MI{;8FF#JpR(cYp zgEGY0PaZAphj7uqqv&>#Y3%dKf(@Ui;ek_=wBlkGK6Y260=(y-IoBM%?mZ5&C%N7D z%RR8;yB>VtD}&C|R(86=MMx5AMyY2WjC(~ddH0}~%q07Wp3Vn|ms^R=?K8oUra<@9 zEX)u4ME`Q!|8qN(QG8?>D3^&Cd-7!C6nM?}`6R+#vmvTJ{~A$_N}zQqW?=8MfBNKwP6X>Yh`<-Td+NvFjOJTj+-h z0!7s1&=!dCbf6E~8Cry<&HjpjHmU+5a;VwO&w4`~~|Q~CEgknzEm z-RaL@O>7hWVsaYIYrWCP{0;hT)q~LGCb(sZDXe#&iou~N?45O|xw*_cA}Q(tGgn_H z3I_y?S2t$T#z9ZG_LL6<^8M-0$|#6#N@0R--(q!Al_6%yXX4K7tB=0z#_iht)KvH! z$(Wu9Bd208@})GM;!%Uw?mTQPH=7t7UP^>iwP?0pRKwawp)hxAK5_g@;B>t_27Xd( zG`YD7to^KTFRKgrON6+rzX{Y@E`S=D6@;CfOL<-IAi)szROhNus4dChOkSW&ry?;1DN~jHgoZ(DDEF{BKC79SajC|A(-oC31bxzaFJu$rZiu}9$F4HYUSjG zdoDTWunyagZJ=)d+2X*=`LHxT8b)jZ>-0nE*eXx*(}U|6)b`R#PmiNyfh=SV&I7R- z3T(e`7CpLe28xY{atzONXz#^k-#4|f%eu_yVP8o!j4CD>TMa{yXQYSH!eZ3MPx| z8p1{mFmK;-yt8{5TrO5Y+_-}d3wdLZcN$yA7fCmT{ic5x9mQ>TSKvUc7HzOzi~%wN zxLyAM9uSQHJ?Y=nUZ(~Uxty)N`AsH;T@^P#QaF;nn^i`h+;xJ7YnTSfdBHI4tc01td%-3^Sl z=5V~g6XfHFDCj17Q@+~uFvTJnEfo1+VMr})yfFv9-~2sAM^#Cx=8HK=Q6c@5y%A_X+koWfy&jV zO!8`YwXMx4-6)be)po%E{f~KH;b?TjF%pWi!eG_H0s2QT6L-IFp#uTiaqnk!93+EW z^w}8Yc^qLnmvbHRXvcEFa~P0UNnWVULLH-2@^tPA*wK8R+-s^Q(<%p+`D&IxR`YZa z>PcZ;-)j>K>wZ#`^nzTzc#^u81c3h{U)JR8bZiw(ny#X1Mxk~3<&7~Ulob!RN7V^hEz=V{;m=w$G-*FeL>|Rix4Y4p3`T!pqa%`vk z0cv$@V z=pWrUx_-ml{F>}Bl?PgJ0(eDd!iiyV)Q|7Rjj#LRR(vh3 zJGKJ?WftS+JZEzD@-3q9ypeu+=7f*8hQmPndf1#M)NoZUf?fPZ7HwbHlj~3I@p`}_ zC}Aa_|MhKV$L3hP)LjFj`(@zx3;|&ChH3E94_LQt7;kEd(4UU|RDTvPy0`=(3`&sv zE=>r$DS#tJPe_Gl8Wrw4g8PK`LQUE<%pK(*Cw$qAAa^f(pwL8ZC0{V#l-!xb&2#b1 z!gJXBZe6XmN|%#K*iN8QeIAd_K+$9o=;$tSk-ZlWQoUy7mT+~?ye z$6=$nI+g79>mHc=>^1EWdjPKf4q&I_!R3up$gG`j2tU`0i#}Zq^9Sdlcl|yjCJ)Kg zlXD>-Ww6LSitUu}hRbn5Sd;jSM4vLo*tM>xUVjRljYB|ns}KGZ^yGH^94{!~3(AnaFaFid>%q4)92!jYCbG2 zX~tJFtAI}_1lBwNd|>_@thb2ZvPL%?4Shlb#tDk-O(BbV7!>;X2U_b&8Oxd~aNnIs z)oqWHTT+SO7bAvX_>pW+u7<#oW*Rc*7+T1DhfH->cJ2P>AogOCE>S6DEf%ezZeLn3 zS!@gKI8lg8<~X7UuOr^;4x#Sx*0gkY8fm%1@g7HN=$Fy?G=6$CEJ@~pEmOY|w{da2 zGOmqpx5eT%pQ-5e-vyW&Q9xENmw{#rj!S!)%b7SPVxz}pQ0&x2|DjD(O(+CEb|f%c z4!WX@kQyzYH;p9ccC*`##K3xwTC6Y1#4nL;xN8rx9&=Oh)u%k@HLN827w!WahnZ~4 zwOIPm@e-!n<)XT$Fs{x=5`V7*l27ZRZ$bin{W}p)Oq_sA_BUaU#Sii^{ycpor~v-v zmGoXoFdaUtMSibI1S!Q#YU%%r2+ONdzQhsIuGi1hgjqm)%T;QbHO8J&R;G-=0utC( z0d9TE!Mmo6J-VrqX{x z9n}0yIJR3Jg6bJs6mtqdgS(Sv9~dN6|K8vum186|RTC^#Eiv=CA{;2Q!vMj(lv#e7 zvOX+L(`TX9Sp+}oQ(9t^hD@F|w(7Lw{Pok}^xJGat)PJg@&(M##zZpj!ePw0G@WBI zkHY;u+c7v`5qb7F42u;Ou=NS?xNUrb=#1PTbBxMiL@tf!acqUjCClLa49(*5VXjU?T9jk#eXAskQc z&;Ci;m|_j`)wXa0vxxa^ZIGRjPd;gvlg%52@UNv5L?v#vcpAtISzymg2Rv7Np04m#gYN7BCbguT z-1&NiD#(R_=(j8yn3aa}g|kV3iW?j$TZtQwRO5bwNZh(5fa8wOA#v-&@cUvf4xxSdLK?VpBW1@#jl&g2@o24ZO=70S(UL_njVVi`P^n-B!f}yCzv`)!dX?hzH#XQT>;*P6wcyFu z>*SoP1r8TJhLi8Yuv}*~Nc2@x(?ijyr1%iDRDO}6le@8KS2dd~E)RL}WzckX37Mvq z3&;MG0tM+U+-uv9?3;z~F?a#`T@^=}iA-jrr8sCLhtcg@=R?mXjyd-#m%Zd)PD_=g zVf}}-6xyECBY*AjT|^IQTov1}gyDxZr(OYHgAK>RD8iB6(Gxm%7}b;W+eT=+iVjLHlIA?So((!$+*ubFve#bK!3ExM+JX1b z?NKDhGP41x$7jj(3*Hda+6rlYlZ8zSABO4vdj? zcaMX-za>0M4#M)P_vE(xZ15e|r}qZUsZ?Jji8v|DF#}`JDA*9(Q?+Qm&lyu!!}YxAoh_!JMlp(Tu^yFHm9)CcQj+K^!r zNLMzO3{9}#Cl$TVk$q6epe_&3d1Un^- z1K%iJCcYIeEYFk{qBymle2du#L?H;;CuZsFu?HTa$?4a!x2NcQs(FzB?zHzCPz zbkSbA!f`E0;oQ?@7UFCfv4sguj$(iOEDkftu=>Nh2BU=zAab*m5i^Ux_{Rq5R#L_6 zJ>yKi=9N?Py(j5nAt8_odI~FdyeGBul#qYr&wAd(&%{$Q0p%rMl0!+EjHk|7JZdOP zTD69tonyBg4D+L&+asu=d)^4@0bWTM z<82uk`j+K7?N+nVX2b;F)#o7F+Q;mdH9H>{ej zj3Jg)z|VwYVR{WvRS`JXm%Du6#vd{^C!2lnB#hd(xpG~2adPt7R2=lQhUmtz1}ASH zJS^e}=RbDBDWxjbui?lqxW^bgkd^9kJLnZ>kUxC+f&cUV7FoQTZ|rZt?O%G6JeM&<+ZEtVi< zuKrk*c?|z0W;2TaZGz`pp1@P9AmXz&1upbh(4!l^GaZXJfxx5yh`(g$3EL97r&k+x z6_|lzv;!zkZ3hz70RJkx$ffM85&N81foIlk#hY$;kkJ9$pi9m*KFAL+YIZKronRV|5;v% z7u2@r;~8~J+#yy*6_;G4H&@KVYwNC}PtiOGF`XbW7dlARrwQVf7!98-WI0ZE6xi4u zha!$Q-MHTmDvjG|d2s})eNm>nrah!L{mtn78%Q@kXk+hw+D-4PaPtDWYL3hBoS3Ja zhpTr!QOQTQ$U%qGkm4w49QoFu{=kg0v?P#jocl84j&Xl$B%rC1u;$Z_?$n)XIT~8rZ95&T3F6S$vRqZWMCG`w?#AcGx zmn-NqstVzo{h9PvLXEc{2!LlrY~a}XNtC`l!e;rs#@=9E zvWM$NCS558q10IPmbJw@MtwV&wi4DZe!@tIjG}AWai(x;5|)G_(eh0v#`7bv zqN$#i5o0iPZ^Gd>A(#~U09qPOVnuNnx4)l8O$#lLyl{rZ%)$$ zr*XQ!2XHuMGx5reXA(>M$uZ+-BKStgxXr%>?)HBn({B{P#N!k2lIx&~2fKj4B|ZAp zGy^YP=_PCIFX5QTFZ$OplAP~ICIeAE_*8K&-97LWGdpT9+hzrP+R#QH2rMTi3dgXJ znIujc0tmOi;4F_bG|5Vt^J*J%4A}%C*K~qJ`bc2I=>stB)(p}dDn{a~{fLEEE;~ik z0M*1ajq}R<*i7d+;QN8gw2UL{$YDI0ZstavEIuw6!wq`>anE-? z#w(gYD9>4HF|QkRb1&lO{gd)|~?xb-xSHSJSUEu4zMeoi|C;fd+Fx_AUw(Jw6U-msE^WMKB*)O%|QluR{N)`~JF7T7S5PYom9Qm0W-Fi}{DFZtGSUHz%}W&eHl$%c2h zGeXD6<$eV=Oq@mqw;K4+$Dqs|3H(?S3Y*|4O}ep_99gjs<#_w3`pHQq_DLqB8!1s| zqiFheBiGmYeF1GpL(yfVxS{TrAew*OjvF;QNTzifrAAu7&kJOyg$)MGTuAqJh+|FZ zUi_&Yhz6J5)2^&;Qmy%b2$Vl=_}ni|)pm;-Z=ScP;n2Y$`k&$?{ndUBoExHuVtG9M zc6kw=)ZC0`>^>Xie@wwM_PkX0>tut*0e$#sBhRj~YZAJyE?-N8*`!Ks2YXnDxNmIf)~A5-|T z@!vxHx!adKRdHq|A8uw|2|I%!zZS@S6Cqo_HQ=FLO6b3W7i?;Lz`Cdq4-WD|rP>~t z_UbG-@aZS%Y`RNMwG=^}$r+M=y?{hYAI3Zz6Jqf90gC%J(mcrm{GlU`YBjBFt>Idz z{`->kn{?p%a$L4{b09lUI*H_RIaI3YL_Q}eqd=08QBqSo+zhH_MelG@Z-fw|e(DwByj9W+=O zx%C_$Nr;+$iNUbl>+pG+5b`woVw1sN?ik4Fj zzCl;me82_ z=qry9xKWczgkLD*3}0?$;225sPTphN4_cGovQwc~!59{7IERB@h4E*3ITZ1v!mpjp zbjqWnq+rV=d~2!#p85LBt?qtenRSaUsQ*K3heOCrF8`-6@Cy`7)L3t~(|E%s9WLkb zV0DiW3depTsbQJ)<=S`k;};|0N8|z$wZsGBgbv}RRy8oFPXT6Y3rM{crgg!7;NayA zN>bwB(w74X{DMsE-B3LE^aSj64?^>gvls=9Yb^h4fySRT_ekZ83o!Sl8nkiy)51-0 zpzl>{WFF>4i&G660=78e#QI5iX!E0f&z0j)64#FX@qu78Z~|6L2sQE;bKH;Fk&Jrr z57M12Pv^~ij1~dSL^-&Oei*z1GdotJ;itPal=c!8ksK5an-&7jXU`<2G!DCpgo4oJsmJAHMi4gA088jIDSiih(uZ zdnadvZZELle}>M(pUO6j<7P%yC50j*k(H8g?(0xykthvCp+YH1Lo{S%M#$bPWu%bs z+}BAOQjyY*NFkM$D3!PO`3LxXIOlop>%M-!@Au1W68~Nwx(5h$%wf4OpW5Nbo=!BX zE(0aW=O&rnO*qvm5{$feLim{hY8@sD@gNRU{s=%oKqP%FD$Lvz(ZRqi(Ij{8Epp=E zRn8#mubZ|w5tWRt!UOqTwE9&5hCGiU5=~CHp@emZ-Tp#19hV2C&}n#Vy(HM_$#8?` zECT^EcBZ_41LN(==)9Dp;JvmEj`3Ne{p=uWkbM~T&+EjAD>2mPlm)tSd~sgUTKw>P z1?=Xs`CAcduoPT~i*~clm;5L+^w%L%X5FRn-ZRNj|DUwy!+bn=EQW4(u*3d2?EL#g z8x=eBcr=xdWhIT`i??Q=>TM5k3zW&_QyuiqTTz_(Q4XXw^3#Lvb~HQW9X%8u2y1Ut z5x=im@Mp}B=1BE{YfB?}qY_GvmH1;+Tsl3rHXnMFeLzab37nrKqtw_4yee1Zsjtt$ z|Jn!f=)@1YQKJ*`On1N<-A`0bmVKr!bzw>)+#pLh2~Au7khfMc5MNM-^4@W@yLvhi zJ``WmDeIp7t^_OC-q-!SA59;B3G%EFi8QJ@Cm?QVL5{iChvM%La zxTa>XX^q(vdc+|LGXE>4sxF;WQ&58|p!J@v=-i4e>Z?Hisy3R9sz8t0C2A&i4>QgM zkQsGz@Nr_7NvOt6C|R}|t5_F!w2L_^91X*&xGl)N7)53nG?PCsxaeEn1KnaPp(ExF zRpW{Cwhrn*-A7wUaGt{xe$s>i9jzqeX*sPv;!F$0r*Qrh$C3Z^gs^_wB++*kCbsNu zY5V8|S+u;Fb11@x=NN*|03KBSuhviXSHj#L$qP zyKc{sCEGKFx#Jq5U$G>qMC#hZIG5k)GnE|~S^JUGVud^R8VPi~{XFa0JzE^h|c#mT5qs>)=% ztR|-2VN6l?eWvBf4`QOdy2)Zu8KyLEA$Qf^Hoa!gXTg6Bcm>whxR-UQysWr{mI-&s zm8)#dK|~3%c8r50Y=AJXFmKPtU-ZJSAWYnrj^%^%z^yKT&9|}4n>(dA+iN@K*J!|J z-!~Yy=qM@CenwYi*OBdQNQ95~(=&gq<-mcXW%1aU9nmD( z9uNIWXPIwZxsE16?0J z3eE4OVMoURjgU=;use?Q-&O-yYe|Wg&2G+xyR%{Hx*{SLn2l3U7US{wT>Sf8iYM_O z+W~s6i#`FH@C#XktEVN=;!oRfpehajtCog^BA@9<)^*6~F~)?3nRFp!(?YX&YW4Lt zF5=BHz52)wdHOy$$6*JRZ&?fDoi!Ld%@R%b|0ZR&9vFA!GKMF;q}!rhaND{_(yM+H zPj9jz6ZH?_MWrC>PK!d}2T4R+_Z$tCy9Mh7)`6`}EtJ=2!r@_QSU0s8eGZ%laa~Dz zhV6v^GYyCDHf)aZ5z;ju#|c-s0hme|)(5~Lj}(q!?VMTU%%3=%vfmZv=y>7h=oZ3T zu@Qo^=27$Rcf_Yt7~F4WkT{7`#-jUXqC!UUqE1S`)PU{F%?nrkLo~ zNE_BaBi|>c;%2)bj^d+y45t}*V2UlawrO(m*R265`4qDC`CX!+pa8Ag9LXn636!(W zgzDiTa{Ra#YI)panYe3lrt@vm%O?#vjbhx7+q;-8Hb&@LFr8T&sY2F?WYd4crPSx` zUem?F$1z5@iw^qyU>5(U1c&UeL3@}z6;E0Q^OF>ql_D{?D>V^C3#IYS-8r~kWe9mJ z!#C4$KioNY4AnGUFnf6dbM=f2Z)s>Nu3lga9?=HOq1k&mCAr&x{6xx^UyQ3}eW5Rc zrenigwkJ3v49&i8W*TcOp@L;bmD}oIo=FtgeO-XE+veleLoV<|q?PEFM$@I4(%83h z9Vk7BVfiu|u-R1#OEdfFz(Rla^PL^)%&7V5|OsC_v3qa<%2)e}h zfRbA(6+P36C3i01hH!w-t3x5}TQxoMwu>x%o`WM%6;PS4NX(wd@It<-viZ(rh>kD- zt!p!ovd@%+Ri?-@JP1v7=GgPx8>!bEj_=1#gA5Ta zbH$2X^TAW(G#(rffIgKoZ0@KQUn@?7^jp$+e$s+vyj%mnp6ggm6u3)Z8Jtj4#A@ma zXEoyJ96lk+laz)d?h8O;_Zi%*8;r3QHDpq`pOb36k{G(rfE&u8aO0IY^0vppQFR5# z4(i3ZnM?37e<6G*CN$}dCA`mCiG8xd==4kq7P6d$MIY|aoX0tkp_)S5PI`Z4JO8L8a{XYK;<$Twz_wg=1f5aAv6jYeCY8iEzFq|U0C zuD*Shu2c2E!@4(6^VnNz>=}c-TU)8KQX8Hs8{lM|_h2?{dCAD0yTtyS39?hc1Iu@L z&^v#vVg30HB&KSZQ|?jLbm~hs)cW3oPfmxCud)*R*!TmM|3bw7jQzHdB= z{Lx@m|MVow*_p@GaV8e(e4))Uc_5uF1Oqd}Xxo~**J$mV*;Sr4O7p6+2^%uDt0~6JLQ%M;yeBKcMF<#L!v2n`2aaoiwk{ z2K|g}>}h|DsK!)a{*Vc?JnR)HY~|o@pG|nmEE4|eJ}1-LUvtJ{s?cw5I64QrQ&r1- z=>Po$u6$DhKj-jF-}}$T#KxPZ^Bx7@-@H$-=hZG6+EdCANHBqSU)gu_nx&Xhtcyy= z;$VU040t;nNu9qh!6QAJnaGcsWXAL?V*fmeE?c1q$|0>V$I2cL@%58_PdQlEIR{Ry z=i??zu(_3)hvC0p(=cX%59_!=T=-88Y+4KV(~D>MKCU>@7DE$PQ*zc_i>xdx zL~=F{gnXT$fJB03XaY_tbw;kInQ4QwA8k3%f~{ehrcXjW&}o?@PMsnGXYRRSmH91_ zPCwyh%I5m6dXs5|5isM)3fwdP5kIgDx#JuQNbY@wCg;?Mn%M})jqO1{R+S*7=F;5u z{AZB(iFHuz&L0Bf_@lnq3zRlV72ajh>7oN+P!a(w))%#ql!SFhAvQg z9UE^geM${Y6iv3iF~c+sHBR8MC)gcqNt>d}$j#thAg)c=U*!t@4t?~py#z5D4~4vq zGwHziJM!vYI`Q7KhB5dNg)eS5!sNsU6dc@z-ai*%Tg52m)xBaGzTc-dDoo>6(fj0r zLKSe1{2|dI;vjl+9TYeVz|Q%bv39bT_)MB{He2a)7EFuAR+B&EW6nVoJw6qmT|Z9T zf4G=jVZ#>*oy)*3QiERiXPulG@92u2Es($TBt39qHt8y=#P#hdsCm(Yo)!N>wU?JM zdw%4T8O>)ouGeCTj<+>_Z^a!-B8K-DW73FZ+Rg8{HPBTB1_5M-&r-=w=xnLSL+NGcMS$ISkU`8d1z zIhAC0p05PYV(~XmO0J7>-6IppYn4XOURi{4-NsF!|cT$gA#wh828Rf^#Oy8gLW;%=W z$nkHbxS7unqoxiKYyEyu-q=m8KIM^l-jhs74-W!upOC{pFQV3JA*SF~7H)g+i-dC` z$<1}GxT>&+GcR*4xhyJZGD-w_bJ#Axf%}p0F>RRakGe%weRavye;aT&H;EG;6Am|g zGDyQcQOZp9r*ch;F{3-1nfaKXCl=lYnwg4d9sH76`jn5C>bn?~mc1fQ0ij@~Gszg8 zk;H`o@zAhInB~TKVa}KzBnC>;$z&6vP^-)Ga)sgZnr>WfV}_6W_n>{h8RW12)s(;b z6wJ6|4O`CTLD`p9+$6Gz*-%~vo&M7}BDN*u)fEG1N)qF)oU)Y2`X7e(b0{@fGLHY8 zzY>=xlO(Lm2ZB0J(jRm+N!}#LO<2Kl@tY$|W7^w6E{dP^(S4(OudH|*c`~#pCbx0k zF=rH2&A{qgUbtg21C1s;VZpM8v~|A)EpE#u^HlnX{!>al4i-VId=75E&bl>nk}&>E zFs%HS!Vz4&kz_r~$9XP5jL#rsk8*MQ--Bd%Ts($Vc2K7f1N@Y&hw;`(W~rECNZ}l4 zQ@@A`Cs)FPxKLbiWic){{lMOR`=h%cm&BB((;adXWE$@X{>WCx6Kt+MaaAcz4$@;j z2yK8*8%*(a?;U35Fkv=?aj~Aw#7m}yLuhy!mVCZ#+P9^dE}qGIeJKuDoza3h zK^5S-=n&=%p5dGbZ{pbeI|Zk0SvUGMC$K4Yg@4YjbaTc{dTHA_#O6>)f1HVSzr=XH zn=6Qj^Hh*|WC2C?0pOdN1n@S2mR{Gm=zz5#4eS!EqZjT)xPpxiyp8pcV-8cS4<` zQ(6AuN%AWwhTV-_p|!mR)cA-EDxWsP`hC>=fDJU2 zH{o^R5}4(b2(7`3In}CGcqqaiDivLzyIumbf=;4JmJD8c?2FbeLR_c*cjS+$IP^R@ zM+A*W8L!i8!DjUCd#Wr%+c<)xxf*P$59I8{LTJ=< zp6RSeNc-{~^e+7*uO7W6EAp2S=~fjaaw$;TJRN1+He=(7Sa@(K66f%RAaB`2;*^q3 z3TKLdsm)p}YcQqhk1mpj2`sDCKbj`!ekH^4!gRq`10n;CkUuwwEK!n%-*eVtsNoZ0 z7Sl)#Vs@iRUkW0tbhs?mU@!bJA5DVz+r2O1NVWMj^Ax|PlTdba6eNcIwZax#y@ zoq2=7wP7q@>bL1v3UD~ZmkzFVgjgd_Wa^V4G9-tXvW$qy@`V^s zol9RD-6i5dCEzHIC_xQ zHN9Gj#0fY1R$-=BLCOLvj#hW){dB}N^VzPwpsK{l) z4b{lT+xO^w{{*VJVl5FJpNhfO@#toePSV+V*7N~lpS>^ZCS`l84jm+jby&!Z zcim&@TzWIO2`%;npy1nJCR1-pcx$s`wV4B zM8;wGbgGY0;~z8`$u0%47jLN8rdwEN`;{0)_K~KcRJ#0hIIKP!4s-V{LbYX{P&$7* z-C9!wx_tbYBq&BS%(q~sg%C`z<&G6=A~}t{cbh)<*23;0c2}&a4Zq1rlBD(uG<9-_ z%&|_6!g?9FZQuzPnlw;m+HTl-dl;qJ&Q?d}8`7a#^;KQ3|CebUff5x;YdTz8O!2d<=}F}OKH0gGg3vpddE^s(Lx5k~A->^&On_O+0#G=!?g1{im3HSX6*GWD?93l0S@Au^bQed$w)!NVBzV`uAuA8krGUN}nm6f?lU8PF(R;eE4&Mq&7~FAB$(e>pLD~!DJ&Xz1vR}!mfbFbw#{j z>q1XV)dS~CW8~U%8=`$?CT2(a5tsKbdM(6TFxNADKp<3aFq=??KwWI+`vN-AK62id15x z4FoquaoYJNX%L$c^b{N?WsCdh_fPJyRZxmi(!GwC$sso9%ZCX}IoQr!jBDD@QiYd$ z;KZYkEGzLm?05Kr{`pCmA5@GV=1FqfZzO_|gcDP9`34Di^NOCC>P^l$T}3mjXnOJD z87S_1O-{vC5IYr0ERj9uZ1~05yN%_iLnN+CU^Du!i@<3iKbQY+8QrYDj%cJxgM`v9 z*e!LP+DoUCL%lEQrX(4Vm@Y>Te71+yQ5oR-vlpu#1;LPACRLX?4jtMfoWwPA@mrml zDHJuK;j(zTYL^f`d8>y1-LGdv8%&r;pMyj`(gkH7?O?qaJIS|dajwvDL)ct<3S3!7 z)h=!VXs&<8$rf_Mb$eZ#hH8|_yv^ZstNtg>*Z$q;9w{2J@0h&>NGJf4sz+NX%_ zOwwGT9?tQ#ABep|CoDLv3WuhPkp6U29H{G{^Bgwgr5I~+S8D}@@Qrwzy1;*YCveEO z0k_o0K&#wk8oDEo2KpP-ZM-FH0e^44CfPYZs9K;g@U z_{XaSmYL+hjgKtXW{e-i!&8ZG!IPC(L!HoBqn9Ewz zJ&(tjs~U&N!lp-5NQ?ap1smhY`)5SEw;knpA-LhdX>vnWfeOy^gZ=8!bpK{ix+rHK zc-p1W%3BifIVha`yg`|}T>|u#Sp+ox6o;P;E13OXo>6)_3ukl+plnDe%rY`z87dmE zBEoKuksL-Xi2p-f5`NGsKM1!P!Q2UGjsjO%J`d%v|cnv$K@@x*WSP!>#0U}zG8YcGzQY7 z$M8aZ5{>&=Pc$5gI4Lgtbk6cIPD_#~SMk9S=E<5E`Yl}@XHDIRe~!e#kK4Ai{`oyL z|0)CrT;r&uPbdmE2tW-g!{MXv>2ORJmQ1?AoSl}SyE}lyJlc+VA^F(J_GW{1lTEng zRrJJ8AvF9DkMRYXupq(+bM>#GSZxFz*djvqu+Q?AZOTl4doCRmyg&;sEhWxd8OF9U zmxO8SfTTkV2Gs>aoxU?;M(nV70F1vh{|G!06{h9DD|a$q*86xdEj zW}X1K9WoGVV+mfrPmwV%7cibt3VBtY7%35j0Pz~@~_4yUFN*PeAv@O=u-*eHN@UpCX&DX|n z>h=}`cV8s#tj+l%m}|q+Kov9&Eunem#qnbi>#BbJogV*lpLOYov(G<`#!P+5&5S ze4-Zu;v;F3{2AJ+UX9CwbFi@R7Or;}Ma?=xe9F!uD=w*1qmM_a_aCIk4X2Zp56>_S zw}f$vQW3ssV39%62k=s}4J5|PlPP5**nY79N+5=QlxQPe#UD8nev#;-{Q#-!85*e9 z$3#oq=PYb}4cZ@LBG!nXk55v~+Q>+WF zkacM1k+rVgP`p(KTPGjVE2-bek!MmU>63~}`~|s!)nOdnBthQ4^c0TY6-SuqtBsAS z)9Is!iR_(&I9Fs%G0S$^PE*VoIx>-k(K^LcUbYR?`b|+jWeu#{HJ4YpbS3m1zYOJX zHE??Qa=Z}{#9WaQggu|LK{>M+gU^WI!Nvd4Fa6KqtKmZQYY3))LyX`yPX&Ulc(Ccn zJ2LlZI{mYK4o;fqgF$%=eZ=i0)1vgCa*{_#xiIg=+fkEE=eQ`DE5X}qJQI!UPt$s* zMr;q8gI33DnUzN(P>oxLX^-tWyW-nuKOg)2msaNZhBQIDn>FQckikZwAo64VZH63` z;~knVh_~vjiNoYRDv}27ut@-=Wi z_uq?3Y8zWj_LtsZj(WCZ**gcUyO=^xACrYt&0vT==|N_Gj^%g_#lxk9IZ%426Hl?b z*}$j%U~P!HexrEu=dSdYJ7OryUBKhxzFelRmq7VH(`Ou~H5 z!k^4`Qc~jp;f-Gy`wO3muj5v{k*tN%*0E@r{+3BAIEhCl?wW=yDBwJwdkAjtTubhK zy-K&tu>gZ@d(c+?4yQLx5>y?xG2FFRNp-X$$nHZw5DtkwtK36iP|2sB)_~>(R*SM9QhUqvX;d-X>xY=`PBqtC=p@ zoq;D6y*S#637B^M8ND&Rl|GV{z{3~?^KR8M4nH+8L|F_9Dp(fV$`=^4!IfM!cjGvD zh(NUFA!0Yq?jrMl5x-hnoDmxbF*P4(eDW?jdGH*zU$(-1pQ>0-&@P(2@Ef&FdqZaH zg;B?@a!icK0KbZ}gh?=G_oQ6VG)O?Md;x^KSb**8Jz-`2FM5848N7D7PbH<|aOfL{ zO0^B+z{W{NlgL8m(_A?FR+=2scuuBq__#UQbMd{_Nw`>4$SK(u3;q5a;P0-X7k>Xo zR=AE)m1$k%y!Q(5_DUr8Ztf*#efMCxgEiHR5Js1;Vsv-dY$)oO1NTA@8vF;y>I;a=MTH zu9ze@a`({(YxZ#r75_1dA0CAN_Rm76Ev;ZRTbwueTbNtr@`s3C@PtL|d-U<$2PuXo4?U+of?=<3N)!$8>37_%f+da7Oz;fz- z>;OocSHV<=PO7m^8ia~OL1|nThuB=o@U<`qUZ{s{MWaMkxQv)Z+=MrCm2lVVjm*j7 z1b8*S7?cxcL&d?m#@mMM{acJWZ25Q@`nuxCA`K46JiS3uD)=$X@dSP!7h%3^`3r5Y zBN&gcMx3)Y0B?SphpmCns8oItC)uPN2Wpb=+>92S5q1O*@hp(<-#&aX9*#>=M;Y_= zK^XdH3Fo2HQGCgI8Ll4-XBnqoo4Qhxp&)4`{k%22i4L5H2VHBxRJDXWSP?+OhX$K2 z9zBa)bB^QoEI;7gSdBI|cZvU^D4Y>_2*0dor04GPgW}>k=rVXhYm^kpc@WW6sC8yRLzyRZVOqE#*G-(>7JT`^`2P2I03rEFQ_et(5KKylc35L7O zB4BU^bL~^f4k;PjadHOUIj76pf8!8r_Q*kvy;t$l$w-LaxDSWg3|WtW4Mt4HHAM)h zGXs<7NsU(qW~kq0`-E(#b;|~PXev$ivkVR9$vhH_mY@uaAaZay-8m)#WA{uz$io=S z^owayj2?B|x)6Hr&nJ!1&*=S^Ww>lm0vi^}aTU^8e&wlfQX8oVRgo2NzhEC4oH`18 zhn+DgXCay_`%3E@JkdHm1!lFV!`D$E^6o<(ELE#y&R$vt4zItH2ZP5=Rg_IocV-UN z2s(}B#sA27Unz=bX@kh@A@Zy+n0)vk2jRIrG(EH3G=AZ2vT>joQjWX9lg1G!`=CPu za<9Uh3zpPy(R=WC9f@_{Xn0(cM``< z7PxumMLK2OJ!sfH%)DEbPCaidhjYISp?c>B>b5=%zVB$Hp>J~0Vn!9&@gK{;S-2fW zB@+q1E01Ia4AX?sZpPIA9*$^vqvg+3kZ0dbep}9=%nU9FT&iKNg^Pf3-yQmTK2nYl z>*boWj2cX{qA{6GSam2By*H+lfdoaEte6T{$1b4o^=ytzT_V*AoCOXA!;X=to7 zjHAoz(EGq#hUX$e4P?Jlne@x#ZhAc1)9J_W6>D*Fq5f@eI7WA6I960|v zpH#42xVf{R)9X*CLG`^WpfDlL3%xrNRIP(yN^LEaZVv^qZ(DHLl5?EI)N=aIXc?Wn zu?z}N?Z#K5bFoH!2@PlG9EZ0hFp}pAGud3L(QLL4pkRQ_=JP51I}e(vkFf1+7ju>u zMm4hj(&2B~xZqP6s2)n9^6%Z@p34O)pKS%__lF~|x*03?hv2P)Vmy@$HPm}^fwno< z5{q~@*spRC^Kt|cs~YIBZRgP3T@kk*%p<|8{K)M?ZO-O_cef2bHe z*q+~Bp9^g7W+x6y$nj=w-j3;Sf02%YGUk#{E=q)GQ{Bh`@}w&T3j3l^u%ebz^f8)A z)hh;PelA@JVxZvAfs##!uP z_Y%X##}CAF!gMx4%GVsMA!bbVA}RQjqYfP<_6$k z38~d+7!-$B>$lVwE=h(h@6^&sE*0e_8o;2b}<+F`k4IQg`poGx6lialrFf}`vF(C*tZ?DtjX#F7|rJ5dk%&Z(%* zaNuEl0Ns6FjWjP+g}IIjaF+E|3UBl#aVL^s`uhO5I_DEvHg=re-rfL-_iK?&^ulMq z&j_*(ux3vm^|8{Y8A8*zd%OhL?tB>*X?4=B>6?jH#yU>swj4(B`4xI{wH)wmwM9m3 zHGTB78*65N#1&s%@sCg#C)PlexM(F~OKU0mJaAzSc3s39bS_DrUJ70lZA9r+B94DL zOY7a(ot?7=)qfcZfp89M7VDs0bqlDiQ^q1qejE!cU<3!EpwRUqV_<`jw)qN&c`zIA z?bhZgO$Xo`+=$-0uac9$TFBmawPaVrKT=RVMrJ(ehu=IqCO$Ias@=FU9dTbmmWVCD zR)K@i+wU)X4M*#0NHi|@-pO;{WGGo zN{Hp)$zu1f8eCz|BQh02U{@o`z33N4rOvrwd0hv-^~}PHT^!i)K!WSL=qXh$DWXYX z3dnE4GNB8ipkvw?<8-B}skbp2O>)A~ZylF--h8Q{;))O_wlk6R=2z=kL8$S9Q;Dn{&ZiNhI%1A6&pVy~tcBxHy1`ELRoiS=?htZkG87#6<1r9C%fw8HepA*C8 zK}h3j+4W!?U4!M^Wpr!NPihtzMs34ccghk;mTf;of9_!aJbiwUalVBNhs03lMjwjC z5tu^~NWS$_Fb)~Ro~pH+prIG^$LlHFnnR}O?&C^2j+|o|b77z>9mdX(p={1A6qHA2 zVs4xO4PWI5QhOD6du9Ak@5u?6Ze7bP?r?+Yw?~N1{s|~Ca%JZN0T4}hF?CEdhxP+1 z*nK>jRGII@_l7^n;=c@t^i`0rDUsM$J!m4*hR=!Ze-osdZ68LgZkgTcBhFh7(;Ln+*INsSupBk`EkzEYjGaZ9HMH!IxY9rdrDI&g}f}~MU zh}+lo6=J@PBhwO3M#Q&ZADg8rP3)o0@AP4lX9eCjdC~M?cpC0u87-D>OM%mI85*N} z;I))3c^WN5w%G}hTL&Z{h-Ds(UJ~Xixvs=tWEMF%kO74Y1!(9ZHyZV=n=G7GOq4I^ zVEtPWklAd7FXAHb-gOa7U~|2`At_{fsXAI5R6?^4S)6+J*R*q*71Qu^4e|za$m6>u z@K6BYyv!JxnbbgCvU)M(hyPtrlLDuAveo?9PqZLxmseu`D09PrE|}1r$D$suyF#t?ek5b-BQ|Bro)h zR3eAYD4`m!l*$hy`W7@p_>1R|qWg;EN$;R<|IS9!q+Xohu}pn&dvg1QE{;C6h8{Tq zOnWGa#KQ+-bq_;8$_AEm=*3(aT+LiFT?dJdtC_t^RdM#IKO9Ak)x>;W8a#}SB2N0J z$%y7vl07{JTK+61f!PxHublPmseY#8KZLo7t}~$c^Ey175D4+VF5zQqTj-aKA#*md zpT~8Vu=w;!OxZ4v9oOz-$~-&z!*d&!jh})mFL`|-^IUzHM26X(#{U}e0!O0{V59d2Q zA!>6>F?LD?s(I>>4so`770J3%Cl}!o$-6k`wl{mP8A1LC%qM>To{`G)AE>c=8^(M- z3-cS|@Vr3?%Il|+K=%fs-hw1)(Ry6J!X1hSSQk@p1k)O1jptX@!#>x1T02J@4kb

      82dzFT}-n(H`-&)-Ba{+IXLn*kQ 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%0Dv&}IgP!d>1FoB#)7AJPe5fA9yZ zYGHV@5=?DxfuAEE7}4J^;10(%2|uWSbG6cO`riZO4I>IwUyR9N!y=H2iiTsy&SIn3 zFIxL{9&uA}1!+Kf->icfnRZQ$n& z$`W_T%|$}wk@+QfzdDlnDpZWldxx0t=h7s2Ss{P%7&jmCm4oU#31m3Bk+u$OqH_=Q zG3rD2A>`5;?2*iecdPPo-V6sGTAb%Nn;nhB|GS3;E-gLQP^2roEgEbBY~F#kbYu zy__!C@3F%ZvaQ^mW)(#Hn33fpN+_t31Id{)pshei5OVvD)zg24aIHL?IQhJQG}CEl zM`l9f&YQIN`yPnu%YcUYBDk*aEBheoqjhSX5OzoMAi#1WuGkxBy=X!*b7EZs{nYc1 z^!!bRYb|^l=(Z9!FAK#(GY=Ad4Te^4-lU2o=w}iw zpiShbX*m6rIT7NnU4W6L4yZHj1o)&F@|I7m#IXB4B-qy+U$@Beyyn?J+}RJLaZ(QX z`m2uGed!>kpY1?C;y#p#o6>@@Iryvaq1E}lvtX)25zD&tu@*18$W?gFuDokNL`8LB z?ml0#{uJU%!C$!h;~JTAt`FDsYv2dvMlxU2n6!N@W@m)$M-^dXNMl}+X_+T+<&1O~ zo0k9&e+tptWiyE;*Kw@axDbl(ZNqGXah%7_muf<@)cB$kg-5Y zu&^|ibKG6Tun>KmEiD1JH22YM#-Y#@DNI9@<1l;h5-auT4Kp$n0#mk~fO3bOAbj~4 zIm66B7yY-y+Ruc{bxMVIm%Jd)>OOH!zeI*gkE3X(GRfh1EPEp&adPP{@;)UJmruOF zbUklmT6!wDyln^7%yWgELVB?Bv<;SjmxTWCn?$3}1oUOc!(@>|v{(Ez^rZ7SHqJ3`-kp#GZ8fWG>1>_AIW+HWr5kQ8b)Es1{x(JOZC2f=j(q9qk%`% zXu_2pl-jjYN8whY{ze#8`VXMGojzt>ImIg4O`;m|2XWo(Xk1}-lZ0)P0mJpxRLobF z-0ck{VwwBkWH;A|2S-6=p z5oaulr|vEc7GCS7u{Xsqd2$Z9Jaspf301`p;{q^5(H0Hoo+ld4Z*hTWJTqk81nw1x zm)T0x;&sy(7YF&b-l{+Ve;T?kkANp1jj;5xCtcTF2J5zt(LHM`;6crDoO0^|yTbGm zm7Ws^ea}^>o>3C@w&(aoPnW|zc~@dsPzovBzDn57oy*nzCd=g8NV*n`%eIrjvx8&oD>%7SNTz)F$dvs&S5>q+pt{F;0o`9s_ML_qy*mQ}c)5`LOI-&(%e zp8cR32Hs;Tuzgz^`*N8zk*8Zx=BhOYhpwfSJ`LoB7I&_ekwPbBU-%(xf_-8D^SN2Y z#TjRj$K+zBsV#XTIE|VHi=gx=kI8V0!zaRWWKjMQRr;MsZ@10E?e215q#i*$;(FkA zxugi1=0qNIV$6jCTdL>USR8J>MFLrN$^QS>$_G$~SPQt|EYSI6N` zhG*}6@3pS$JYC_y-_PunE>ZTic`Yb1kEr%1Z{ow{hC?4$(&o%6V*30t408;XioK>( zTWTWMa{lM!@yXO=T^Wh?Plso1apX)?Es?r+l2ofsg#A3g#e#NVF>VAYQlikcxQBe) z8$u3eTqk!A+H<^wY^EZ|YQd+HFok z4v*3P>Eb+_4@!_WstJvD(u>!q`?iWkY&s@3>vf-Fv-+)UU08zp5gB;a(RDQxL! zpijL@NaL^r-Bno1b)5bqD^Dx}zF-I{^R8o!P&aF8G7lw0x1i14Em(F=7&Mzdu+L;7 z=!kwYGiGvuzW&@ohG%a>+1fZ-AdqMxp%seu<-K&{FEx@VYQi`tN1?0M2wU0b4`)U+ zpzKo;*TZpzw|!w4_E-|!dX|`)y`#){z(M@rwvqgec?5D3?ozv%SMk&Oi{zHkMAQ$` zz~394;lrazc&Z>Cc6OQb-H-R-$1StDvlr6#nL4Jfg%yPVM*#aJeiBxPV;xtzLQ~Q- z>Mwi+#p8k1e*TBFJJh0>zXRcm*-&MnS`_fs!La-Fbg0Ra*apOq`9Et}!^inJZv#t0 z-6hEKtn8ObH7dZU@7ib0I|9 z1Kwv$$Cp{r@Ia|@(|!DKi0%YtCdZ2+c@Whv=(j{=W_njeAzPHdU{DB02Q~d#@A~z z=~bh7ps%`*mSyIn;EV*OsZg9*b)%HB3(r%2XFNH*j876Pez1yJ*D>a72RYCyYO2Fs z-_;h^aMCSqE_C=h|AS^HO&PB;HC9u=io~^0zr&2TNw|p&FO~u0feX~;rWbL4<%0e{ zPr=StZA4epjN9)yV|&YQvMV@}Xm6!(c9j6uwGBa|$8wx_b%a`8Qlk3vy)a}x*Bg0Q zLM0?aanS``{5&lUYq|WiK#V>rzvO;4mqOb5y%o2rh@rq9DQFt$~X(lP#f+d0cLJNWl)~Ome5wHQP9LsSla>E(M!**^&pD$&f0yiFyZpBr6}T z=3MLEbh)uRfSw52f4oCESONK{sEcx+IM?2!6?8?aJEYv==9qojoWsBzR(pnnIWLy} zVLFNB%PLZuG6T%VFF@Q|BZwOLMYdVwv$YR9=#&%Dcx+Q5?pvFH0n41o=KQZHbW#RO z=T0H_GrGM>^ z#a?EcVs+r(FG)sGqJcf~pE@`ks~{h$GwAy2UF7>>al8{Y1@eQgfbF)Ytmhj(eXrmH zy5*OUQ4oSsfdeqtsT=nAEyLYhm&|@jIt-S^kf)L7aP*lUEcVMLE89P_g|D9gFLnyr zt0qB}N)EY|IEXtEC>pP@r?$t2S-bc3Oz7JW)bQF=u#4@a@=Lc87ilf%5?xJ~I=!Yo zb1qgr$y*5)jhYbKzypCN`UvgbWTXEqTr0MVc03Iwtwmb!WhoDe%))7e-7?~`sgC?D z{>bj?K1}a+>C%lc1@y0}1DKz>%UZ2`hs9&}3G{`qc}e<2H=@jl={a*=IoUp;!vkucu)166jfj(B`SVNg^u&HR;Em9>^gAGhL3WaTj zb(;_JJtlTw@1PVe_!5rI`z4t%-yIkjTENUvy+)3?2*Ziqm0ae?8X^n~LF9NgmEPFG zMDF$Ax>ChNwfYJv(g-Ck-V5Su0k6YPQ%^N6>Lorw*xl5$hIwb4MGwN@R4pX`LL@3;){})v!yNY=(ILO za_lKdF#;0Ji69=wF@Ul<@v(Ok9W&P;?)SJ(Q~DXG>gKwQr-SiO#Bnl@%V^rTZa~Xl z24HSU(N3|Hf9B_8T>QZqS4pb!g73Q!7=Gj| zA=!JfP5Z`<;?;w1>8_2_$$-QR?E4vs)_F1How*=9wY!3@VfLsT*a!ooQyF`M@1XU_ ziCooahom3dsDIUWG@ttqs@Q+zwbmGMwweZFN~b}xU_BLHy&AmsFTkfGNf0lTK;CkG z-2vw|Cg^+v*JE?zd&Y3t?6Vo%`KSZ87wOTu3%PJkh&#L2NI|4P7ReELM2e>@0rM3v zAzb+q$yF_YZ7aCG*@m+mNAfIj&#VJaoeA{Nb^wc3McDV0pk#$Is(t1dWdr&+-Vuh{ zzY{^CMi=(zzhgGn`q6*C9r@3;Jc2#vQy^v0Nmwk%F*-yp;L{5N__i+(#rLGq(u#NZ zwo;bvz97PRS2@Sn5a&Gnw*a4?N&$!TVlpiGjLQA9pl-Xr6T?}?MA*oX7T`pQqMv%a#f`In`b?l`u#PT@{#j- zZV4jB7=li8h%C~#!KCN4+}WGOW6Ql8ukNH9E9=g!G_MwqqEkhNcZ9^dC0LTaTpW~-&bb88bE)JVj6k@0ZWQx<&{ zuAt3}*=%nypSVeFCpMd(u+?PMT)!A)u99wI>r)w|VS)4jZ0MH5(XJE>UV0cpxSWIaELE($dkAJ; zI0gwX<8jKzYWitU4aT1m$F{BOiEqtcnpV4;o*7oh4|$d_Gw3HHDzy}s3B|xy+2`!N z&neItGET^qGvK4hdA|bIgND>zYS8eFQGReA<-IdZZ^B6uX7&P_Bch0MqbiiM519T} z%lYd^I3}iIGML5xVVll8gl8W|=K4sF!8E0X72S5 zz^viedOwX}=5PgmT__5V+dtEv_FN`ddw{Xl3WCIEznOh^gkU&K3>!UeQrqcH#OnMz z#z<%--0}AykMujJT3KE+{$H5`JdjH zhV*lN?b0ziudANwPK?Bj<(gnn@|9)Iog#bQI>K=abu#021U)v7m=6BO?a*hHLj=bv z8OXWK_14_T!=!I`_hc=~B~OI=D*w;sDMJZ+53GBu=(1&Z!O=0CNs8S`a#oz8mu$Hn zdW{)q?vA73BoE{&npmgFs<^Jh1O6!6;CybE+iB+p>q=Bm@;LXdtRKTZS<-JZw{sP? z&eX#F{Q}Tx^_Gzxxd{fFi$GfU4E-~t0_T5E#uwwh(62fNXtXCLIZ4xm%sjYzF@jwB zwFV}Ho-ErN*(Ox^x{v?0p^-0s z&;-lpZh=p_%|!9PBGyVSmi_rV4SE-N!-I1JbXXt`CrFgS7i}4waCkTLMX^NwNHDd@ zqtGZl$S5qmivDt07;`fOKd(-K$wI;$Yf1-)RCBo5b}2L3zMbO$+mSWOhH#`m-Q@A# zdGvjc0v4$Y!N~`c;MS3k)P4PGU<-1HOS%B`|C)yOe+1Z@uM5$w(2+<@ZzY-QY(Tw# z6LeXX;Fh>^81b==_)cF08A9Bw`p0|N7+lWS&shxFoR9f@b`y37-lTIfUGc@Y;}EYC zPD8(Yqj&uox_?Cl2p?L2TWTcXseS{aY+{L~CbcweMHDV&k?5Ew<49~I(`tSdymQ>i zUsn&NYC;A*H`WY?4VHrt{G$~r`KBwvB9Z@iA2Ux#j(*QyMN9?VV0I5ftIB!^uWdS% z9J9bjo*B%>2RyJy&!@wRBE+@(IrdqGP>-5sdTy5j3MyWP9P5=duCNpTmYBl|v!9id z_D{q1=OL_^a6C4DP{JZzHxS9H2O*g(;&I>!ilGA$u%ApM`47k@?!Dp6jWCk8PZ98X z4lccS2v#S}K!xKX)q4*;B+v7%fL^f^Y6kUy$*3AeXbM%^-5RzlO!G}N)-nnYZ=XcVPJW{K&VwWo zEwHvBq{?(f0yJos)2}us;LiIFc4Wt1EStZHn^7D^#i>s4Z^tT{tfB62_uqg}85Cx2cZScKl&p3ZqZJ9-|}uO*TE-SNnO%jf!4 zBJ`_C0PdTkg(=!UD7cG5M&e0gd-(tp8Ty;~Gier2B6Kqx-DU%R^dOn${gh~QzaqDa z)-$iHzR@cV4G@qv7xvwV!N~!W;dFL7f#D74pyY+4&zo@P*&cfT-7=c9@(vZ|W*+ew z$B67@VJt3)qO#kh(Y3IJ4c&AN9eRFX`MnzqF-Rfx#+C4I^&lC$&HW4<<7%qu7Cd}g z9c}D}NkyPIc)r_$^^nWR?mYoBkKH7%n(lG=A`PnYbUA+g6pW*(;duDOReHHJ8=IG( zgM}aG;*;RzI3_!Vi9WIv0;Uqs^<0eM68(5+^e)LTp9eo@TmqNQK=#oXh0h1MdB~dq zNY^W)xt&tb>ly+RQxs7@a0iH9yH4C%77-td5g4#iA@fr&qjB9kejWRms10qwC~^%IEPE7qt~FfmW!xH5 zrqnn zSdsM93WNR3P)v@IrKMH#NwQx**}se<8|DR(&$^eX<7siUU%rC&P8+0?913crrm*JZ8Prq@W{s8}hsLNVBG$4R>&R+qoOp{oduapn1ufvzljB%nAcSik8v`HdE8 za4zKBLRwa9PnBJbVd7FrSp7){N&>P>^Z5&CZe2PZ;P@K3{3L3u#XbA$Q<#-K&HSZC z2%FFKLg`s9Pd>eh@bj<0<}wp7yDeR9Sg472j9x;?Xd>=tT8i!0IUe!CR(c~f8uN`B zvD3o}8dpi-kry&_qR3%-{jwOD;~Wp)V*XIU`~Cc0IZK@UvK(jH#DPvgJia*~PW)m^ zKw5U3bh^%<@r7JxQ0pC)>j{C4bJoL@sjtbiOP9!hZkiD7LQxN7kCzjHk6iY8e;65F{fc$C=}%k^Rx=ex)49%H zFl?+Os=%tc+GcYP3i5`sQa+k~mqT-Uv z>fbp@oYE%Jm=Zz0?%q3iMr$U7eN&>x6CW^6#f`+mvkSL#9OnDQ`_a3^nd{galc@Hs zWY3}NR4&I3{v;a0gxDsUCdPd|a5C0ynS+9!7w}D|3~AI5t@f~#!F}eMX!u18b~#@p zQ307;b~cv|3@(8^_qDJ+;2ym3$N<`Sg$baX$32Np(`UVap)}5e#gCzS&hJ_M0Sk_S zElbx8B$J#YFX)nOmuc*jeX#jcy-an~_2e)Tf{ z{)rECw{R~V*Bc;BTC!NVbOm(_=^}XxHdBGsY3TC0oJcrKfl_-_n(>cwWsO{*djDl& zd%QO_4VlApr+J{qN?N5BsXZCEhc(RObPl`gRJH zoHM~rkIM}Fh+%SQC?wC0L0g4B8lUyAVq@FH>P0hl(M9=p=&=@c5X|VOHD_ND-d0Oi z`>ZfeUuh|BlKO*ZUk1YTDe-LES9A8)S8qIc)QtoWrEvexKAfca7G9aZr~9X>Ko)U8 zkA6Nm5n>6YPSzOfz>tYE=VN-}c{=yCENNE$3l$nqslmVxXqd5`7}n;}6-P>GjJg8< zi35Y{Du-xb>_ak3IgDuD<0$5dkz~wiF78#~`n5k7@XXj zj+KMeG#PGpw2o?=JRG)jMe{Mjyr(0}Pq*G{scgR*cux&+Tvi zB*T28LcIJfifC*}rTv>fV=rWL{s11l6!HeSvMN(>R>DpB{dh?`m$y$dnTrxfjHVe$e>kTWwMoW==4J8ow zU_Ttb7t2U%KE?`VJI>D_2}#2OxNd4UNvL~7&c69adShytt0(qS*LY7{<5j{+Hfgc7 zesa}U5AR0D>qqh3A4GrtOtx5dAO3FLiJ}EgbkhFgL{O|4q#S~YQjRfkF^UEcbyv7; zxr@2#xfLSizhdO-PFlZYUG?DFJi;c)<4rD=^Lwfjt?ekpgzG(^Mc%RMqY*^UOcz}u zMDb5x5OhrusHQJ!P-{m6Q(KTrbhU1g2)3J*x^Rz8SS5+}DHh1vk$?vm+g1(9`?Edk zgYeZe56qSyWtuzGA!GM7;_@jJFGmT&mvtYQGQWJ&!sN9C>w-)F0w)SW4Z7chaLj?BU`&6>8wV zmDzSai8(Gz@Ls|s_OVAO{;pq!pS6`?W+jid$%m2s54PcC&kCq6D}sWie`NT92S&@i zXV!_8(g|{E%!S@Fu=&e7C~x{gBNo2E_`UOJ(8uXGV{WvmroJv|WcHH@Q$qV|Q z&qCTMW{z`OWVzvSJk{*;W!{KX(FHy8>A{&jbZ)jI9Bk>Naxd=i_ZKuU2M*6CgMk~! zX!%``<@megWF<|G6TlNuVobx4C%Avb07+S(Lt@IzF_L2zEbci?5<*qz^L}0O*lQ1- zd-RfWB20XGx*NVU?jrZbGEuHyiTACAg_8zpFyrk@c8!As*x%iR#;=dDJ^eXoRImi) zmnJe#EiS^2cPruK$0~lW&v(-Iqn6`ZY)63xZEVYaK<`dkgIPHY%f8Wvuu_0Um!?2e zjT4@Vea-n`N~w?06Lz?-2K!~E0dwvG%YHbGM{~V#z~})A%$$pT+Uqc80P*(@pfkK0 zId;b|*>$Ix)-Fq zzgeM&uJC2mB5c!EgDDmFK;%jS-qnAGk7Lu(gap$y_qQ?!MLOu?wD;KMEP|Jgc!T#6 zKrz2On(>yqGj>oIyju<}DHqsHGh<jPH|Ah)H@TI?8Cc=oe3A*_Wu@23lI92Ba z)vD{nvnp3e+dZz&zC{IhIyyq~H)YZ!Ka-s3n1dEIyKvw9<@Cp>AAKj$f*&Wei_ zGTVKBD`wt%Nq()0riW95alFvORI62({FP8cZ|}==*CI_=cRCEFK8`2)7sVjnf0Sf} z7+~z8kCd!EPjvqI!%xq9rm1^c!E?hb5^<)9aGcEQ!dbWYkTn}k-M^Bxe&1odzXk&z zbU?6hJ`Fr=f@R%~AnTb;hrhmLg>N|G>x@~PYnbbP+)pJ2#)t6sbxpP+=`(w8`bWBy zjMIgKmDoDM@d|@V!1AFKC`^7xQY%W}ZGjj%i}C5C25BsxIt{->)R@Ma-2*#P$~o@J z*^P285b#eK(`^!o-jxmTG3E>tdM^{Ld=}zdp(bpA7xX3PX2 zvivSRu&t1U{ymMIFZitcrukep`6c-~BaLlHtYb5j7lY!-mE?*ucQ(qlg0xNt+@XIR zC5{JTU(YG{kQD&kPgRNGhz#!OmPV1et*rm3GBpyIiUIzs0OSO5uE!c!xiSX#%wEQ2 zD|XYy^Af&$4Jb@Aw>2Y+?$6nZ7uDD3~eD5a68~ zx5Fckj*w4Ww)N6xR|+w|h=PSZ&cC_>jD$F@?9NnHG_n{w9i4Hn!4%Fhrj2`wCxWWl zIrQS@#GgBzxn7+M)$ir*U1`5)sJ%YS<$A?}yGzM*ohTB1Q556LrK=-mXkzHG1z1z} zjs0G;jkdPL(8xuW$Q4u_y{rb4x(|xGH5+J zo*o*S2nqvnOl{n9t}A_qzF#9nJKb{0g+IO^#C8+mOL1t`>j+b|k>+aMq>kUeK=xA3 zCvPGJLiXcy`wcPNFK`Y2dngG2sqi#S5@-G8(_I_x!o6))`1PeXF*I3$=8@vCd~`l_ zHgZQ}?aeSV1~yj@Z)_Nv*WxqD(lzt`(LlZr|NU@!g~S!eaD#~ z7T&@f%ZtVH`=-P7qkOvm^d|h-T>&F0*YMhZX(&2dhCR4n8u@{$r0QV@Ia0&<%wA@b zaq0i~M$IRw*ikoT<+?YpVu}ki%2ttpVs4lIU;(``tO|9!xv*-1GI>8w>%Ko$6`1TFG;Rxwot!30jwxXA|AV1m_94cnRMkj&9qrSuh?|c>Skp!Xa0Mp zH}@XbVG+dXWk&F4uoe=$E7=F$X>j<%BxtX%rN08C7=y{y{G7_!?2eXec+_77?2N_m z5to<9=kD{5D?Y)zqf&4pbT^bG!#D{ARocY^0JH*#$eLF;JSceXc+0fqU$*5RwVD@j?L#-#Spu1x4pr%{| z3~2NdB@P56|Y%7=s9|1eQy=m7KS8T4z=J$RQu2y>)&aSugzzKnT;(5M^ zEYrVAy?FI_Ksy{RboyYV^B)r2dd|IV6nl5K3LIM=i%;~WiFKb1UdTvCzeD$! z{eCl;Co;WsFhdyaMlHB&e>o;fr^D8^158F=HM!Npr!f)N!GqkOtu_zQ!uu+eG#Zkz z?GLDF&=GhUb_u55&!X4sd};5FC}3C0@aK*-li#Bb(2x*?s-p*?yu^og7@L5B-8Q)K zA&Mpy+`zu9A;#%;9(bxcgKO+BMx8r@>!12Za$R;&(WXTh`uJ4Un)f}V>aQwFtw~|@ zhpj+bX$3CcE)7+8_mg{%N~l*omrvV**jxOU^^5byWrE=(e6cST^V0;gh&EC(>ond- z$_6F51LSr03kY<6!3rBDVUBVmR?WJD6OYUQA-*YWit5BT@gNYDAEyRd%3w0|kzbIt zn{4}(Uir#`PpU63B=L3`Bw{=V49(3kA_A@$9D_Ee22!zd zKW2ULg*wG=G|puY4GU5Ng}DWYmJ?8EI{_E1v)EG{gt8Ol$p))hrm@Ki)-TMYvnnpZ zg_&pZL*F0TQS$(T`abjj@h`E)tsz+V+Y##{)2PalpZuOISFB`$@YF<(*?VFInfD@# zZZ0DZ-ZWaYccM;9PD^F8JaKFn{F=4 zA?{IkvGd&$##(+l-rt>za|&D8nnP_+RU3tO6rW*7$7Jv?_95QE4XnN7VmNYG7h~3O zoSDcsv{&^5?YR<&{$Cd3si0sS(vq&e_A8%eyOzLK{ug9T7NYPrIW(H0OCK2i$DEu| zTh$t54qhv`T<6U`D42bp(SK`&mE%_Q+Po+d+MY;hFz4V~_=tJ)?*h$>2*$IJM~#CN zP(kP@ScGs&>#nP)7i2;A-uXrJepZqL+PUd~Dnr6y~Mn& z)Gs*-PQ#ao+^-z6dyz5*-_ob;n*Z2>^eUp_8%$P2c@ia;b?n4fXE3BujB4H;B42O5 zCw7|A5ad}4)_eEhZ_!Bd{iF@Y1~x;tng~dyxABJBIwCSH3?0=3@NvLj(jAb2sk;-f z+xWJLj@USTUEq!vccjsA%!2c_Y8Y}zm`r@*4hjZ6Z0xc;YH)NtiER#Hc^uO)&G-na z%>78sL)YMMeh{==_k%B06(oLEHSL*llU}!+h6cq3n60jgh4=2^n&WlsPUXXRSbG~8 zJ0*!}-OEwE)D{9#f*{#Vh(1|m56`6ZVDGAl=zdJg%=@yx;tFj z$?ag*Y2pJ7VH^yNVKiiMh<@ z78~+?+74=ZG7^G}ClMLLDClAmAj;4Rx4E|v53w;e$Lb+9?vDJS+X!f*JAD0 zcDQc(nbNY|aKRuD?kt^4M_SD2_xnf}bwt8}%R;=Rj$i2PZ~BagF_-Vpi)B^UzGeGg zTfp-*snowD23M2YjB|S%>+z3I>I0N;ZEhKA_`jjcuZZHTv=iv54H zz!IfS_V^qj?B%>lh8(x{?&AgUTYe3M8m=X|oO?`h-&1P3)DNKUJh8>oZY30xI= z6Ccgl1qbe2!1Q3w6?IY^;h`fi!*O0z3#5#h2dVwP#>}@KLn1wP9cK}1z@fq55@OMpnbeHq_(Tjv)|9d z*@>ob^7m(W^H+qX2Pnc0-42jV9)N)73P{eW;4~T5E77w_gyGl}OCeqwsrf7^{_O2wp!+aBILZoFFEE z8#6B9KW7x?UJy<=&67O)*O^(LZVJ_j9BU_6uG*VS!Ie(>I6*}Xssw9cI7J^d-%W=3w&f&BtQ^jU z$I{i(mr13J6&$lJ1EtaR#F0HlFJ48)rtBwds%<3Oj?4l*T_?iZZ&3+Bn@tMP!f5vDWEqo2c(nYm?r`|U}5t&=GIeL z)D7Q_-sTLpud$>b?p;Ec^;78P{1CJ&HGr)@iZK09BzgsM*~fB8e)f!`c;S>YcXo=y z2h#>&xq2L$oznozC;O=5(l$uss&Vbl!q{`6s#Lz;oZ9;5kYukW@IA{w;Tdrp5s08a zxz2J*)m~UCC`D4<#lwH+Z&OjlLDF^c5Og;hqk)VBxEk`AHhG4LlCehf+54G^T-K{Q zt((UQL1$j(Y+PySiU_!ys}zH_ExzT16>-EoYRrx(HY zT@oPpne%;|m%@KGHRS5Yi!^XkHhufm4Bt*mWo><(=wY!&{J!oD&R%_tJl&#C`nuLq z$(yA#n(M<39=Qjya(ghUx|QNjd5kmDfn1dVHtMw{ZTq_dmMA80*=0jws^~-aXD=dw zC7i=aGYR%7saCHS%QZc|Umx~vxXV8JFM+nk^N8_*hjgmFHY^DJLhV%tndV2*tb&*> zh`C3D+xlLrdQ}e?Zl=0hVK?}m45yBlE*s}tc!BiZI_9y`Pvk93CI?2c$kdsW(4>DE zs+Cxh(4EUMbif3P1s4Ea#`QqUAKcJ!N8JK4Lqou$Z90wv5G$ys%7vj06S@fuchvU?F-L$XZJ)^YvB~3lD4}$aJ z>Gd}jv}GqBVh`2Pp0(F-Nai$tIg^CuvYW6ZTbDew@&MM{0emC=ayhFdY_`=z_;hJI zjjMdaFRv9vlcCFS@|Y3c=GzQ>xX*D*L>aO7uc=aW1}VJulpbDunT=1+WyPvxAZ$%N%#ho|p0IgG zuddz#$D731m3|7)2N~ekxDKCj9T}UqD`A1v7b#6pcHcBLm@rN~ClgHI_$ohN#G=p=XBuXqNfHn3z@}$Y@jdr>T2SE#vvY0HCcua* zI$!0ydp~GPWh)I@AdhTBB>MjRSG7$-9ro=JtDX~RkF(ER#GJ8qET0p?HW=Kauj@~- zk_%Youz)eu9ddy^vrIAQ0@u%Zww;)1tbyuzGq6Nm96o8NV70y}JozkAtz{X3M?5Vm zq2LnJ^*MyT>DEMVyGHi+3Ion7s>sudzK27<y)|E=k_- z%Wn$rzbjdUJdLImnjOS(ryv#DcZ+;95yF>v2>hKy2pbv&*(FDCvP3p@@K}Wr7k|@G zgR?m3X2e@`Ruq{p`mjCo5S^fU8^XJta1oP?VJ+h1vuYP?5`4!wpwqEnW&uP*8c=3n z9{nnD8)WVMsBUx{%07{yFZwn!@mPo*uU#=zOc;AzJK&g;IC@4V5kZ+M^gbH|JiJeT zEQ@BG7sX)MSR#(R$%S-D2~@AxLCgOsgS_H-{3Repe*NQiHxpFo`o|IAG;NT4Us=m` z#QH;-s0g#ctPocG9U?;YiBxp~1>Vt2q8k+o$F~yRXzLYnQ2IH|yS0lP^vq*+e$8U^ zT=Q6!J#C~{>@91sew^^K{XtNTVSR1|6G77<(jgJSaWhBR^%GN|BGwxYjF!^}FPu@i zL!ESHEk(&u0jx1pg69gYxUKXnh??AFV6+hPX9S_6KsZJZXwzpC7lGUiMHDfpCU@jB ztB!3h#HuOb+JvnB1k{& zLgi;qgvL2t;GX1*UUKpzB&d#Ngol8D=neAt!(zPEb%!4KE?oUQLmRL7uA|wiqSdCN z4j_K41hPab$W*lkI`7JJ!khFQ2Nrg+yQdo9Ol4oN`mBbZGE&HQ^%T;fItJobkq%lK zkhEAeQnSB-ReLH6j_cPksqH)P5nl|RyB3oirSru6hYWB~JN^`IHsWm)gL(=TZ2I_b zQs^zrTX^9iz4kzrE^@p~UWpdN$Z`WRRdWZ-zAeP-+wDfK-6?~ZrD1gXwT<+cwmb$t zd`S}oi^${e7rD<>I*yN*Mfj-6vyPnZs}m3Qcefj?k2aRX#$%Yez9A);SD zMo*on#nXZX5N2DA!5$N_&|MY(){U8l=<0*oKV1J{0=K^Vqe%R1@}MLVzj{tZ zDw9kHYC15m?ItCQF1iL0F%D8(6K`=iOKRkT()K{`bNDZ)dy90tIg(< z{nD4&-YY@mM)_gD@F-I8uog7rk4k5aOFw^3>_7$ zUMJUU`ZM$z)o6?(QcX+nucJIk`B(z{)k-)cp#a=F5lTFZspOq3(9jBS`roL9%ALAC|3i>e@Y z)_imq+YBDoX>?YB5212()GKQOgdQBD52Tt=xvH8dFC|p{rYKB2FA4_mhFJfJ1t*>~ zDqb7}mv&|1tnGr<68Yr*gQZ+g&zsyfZ~!ZA32dQWO}6O7Q0aCt-p-1bq+qc(?({s4 zG@y?bmP(=Zl44xix{9=JGsKmhUF7bO;}FU9Qs;C|!`Nq1r2DW2rhmIevcI1}XFmZr z=^zKQAARF5sM!V`u_9pZ^o$PNOoLaGc0%>p7~s-DxN9GX z?HsRpmdPrde}6XE&yfSgE5R6XE{)Ytl|jqJtKg)xKUkTm5qZ5v(s=DQowua|eC)5& z>M}j9N4A$bg#V`XZ6_ckO{n^%mllmW^n)z&sik{A7D3#wFLheHf=yaj0F%U3P@71B z#&%N}d}fRvhVPNtjV#>Fr|jV`d(mfqBBth;!-2(89nb~|p8-Q^|Jj(-lE zD+PghsUFOz+%RVE_Rlu zIDFP`V|5naW6!PXgwiU>Y6Fu!@nK}|>~&NKt+FL#nzVI4)sIfmhs)^4)fa*W0#U4=@;a^|u76R=O4 z%w@&p@$AeSsB%k!a}fp6(jR)@dLxx--?9t$Zhk=L)?C6*Lb)K&wT8z2cuU%=+Gyda zLsWcVF)sfqj0d;v!JhR?pfYA3X1A@v>ne@p#bF2R)M=(<{t(sanFqf|wCR~bFSKb+ zg{Bp%ltdW#unVoYuT!lU^x1`gLocG1CPKeQnbAh+Y|Ds4}TSF zU1kV9r$XTbV@+e9W2lmSMLdjrpseiUpw9?x^~w{~{Y7&1sUe2eCP9ZiOnrKR+g-8xi0B+eTfEhIipsZ=Fr362Y$<@@Jq zWAlXqOtS6(E3KbZhrUa|sHa+W_T&k4-JYv()LRhc7oA5|XD8mze*^9OQ2JJZN7gUp z;ok+zFeD|A?B4#&n7t9mo&j?Ra+HQ>uAOq+i1Rh{exczpsWY>N(zzojV`Bzeq61KL&HQ}`A8q%#+LF}3(X?ScR41N+s|3p=|(jiRCciG}4Ju~cHpGJM3 zrJ`fZQ8J}Q5Z$X>$bc8OckbT^b~m&66}wj8Ks5Jv({BTho_4exqNMoKS0c7}32x-r zVEJ`UQ0zJn{Z~GQ$(sbh^;9MajVp)hxdgr_TEm@?=R`KBg|8IdNaF{W!^vx-7!fla zJGxY=*X_}SrVn{+tobu?+s%`9&a6boubJdd{capQpiD;M{!qO_9<)5%2cs+8$OMaU zII0_hBmPG?50WDKNtnX7-0LK2e;}?eyl2Q z%H@5ew&=?+tJG?x6Pd$k&c9b#23W$ zZ4tSt6bN-kSRAc=0M+~R(7q}dPaJ5*z)z`EB=|Jyxk$oz(IxVv^d(g{?!hI#-|6Nb z4j>$!O4bLNV6RCS6<=42nX68aoxA-|)4G7{F>hQW-zJkv94M&YT< zbW+rG=6?*G_ajzq7{_HsB8f;u8L22E>)e-$WRw!=4GpO%g;3fddzTd%5!sXCU`|T@s#3x6`$7=oumkC zuKWv9rwc&ya|#VTQ9$dQp5m1KieRGthzfK*!?qt8MDWy3qd?C(@}WBbG|i5H#AzeA zq2vm4S{KwT^Sc1ECtjlz*B@TXzm%wLP(nk2dvNu?xlD1}O1dOZ09qzf$i?~yn&AJC zk*N4VZhw}YsD_zaB}`hCFUHz2-Tc-Q6T*zo~*W{UFQC5&67EJ@-a)SX%NhN zk-+@qcqwnsq@%dQS^N=t9xi0?)>O_7gU-Uo_&DnjuCu#K28M!&0&L{oq0C5dsSf>E z^oEG{Y=ZRFhVZoSEHx-&FmC=E=0}+~sJ-(5yADHGnOQ>kc5_amrLo9JsDtqPV%#`< zhKjsuZZw)dkq1cOI7x|K$SuODT)`O>CW674GlaTi?n9J0W5clU$0wTGWMTMv>ruRQf~CA(9mH+)3>XAOz&`sM?2o_z)Ee;tZ&6QLIk+F| zS~o&(%x=hT<``dMjdVd94{Y35i%!8K)c5>%JkuHgBNpqSLF5eN1#{f@rBleoXZs-! zAFzSGCU{b>k?R}Fp;zunn5Db{d@`4yR8l!gj4ozU60|`fHUsJ#bHLau412EyLe{*u zRQvf?2-JyZIx_7+1kN7Ouu=0H$OsI9 z_3kNHpnDiUjc4NmYe!TT3Wd)a8B|sC936BI0>$e-l+Wh{C=SGc_eB-x_H3hLV!pVd zG7yAElxZ^mLev?)50A$p*`~aeIQFcWDm0yg>b@a%;eWU3-neVj%svL5yfTJk!pGtM zp=g}nnvXMQJHe)yda#&xk&SLU&bb7Z)7Y8+=zzg-=X3LDd_aieta za6fVXWJWb!EvF9LtWoi94*gZM0i&%K;)RKO%qu@n3|(*<9>xUH+7r^)`ce+HPOb#E zRlNB1jT#2LI|ILFy(4NOK`1)wBHOit4_AkUk=Tu@FuPz39~_=a)^$Z?gDR z#1RVru*{NsUflVxjQZ##g9x7^nxA<~1-6dEYPm9u;^ssKk(;ifT0`-&p!a!!tBlc_ixQ|Zd6dbnAC9H+T)?5xQKI==foyvkk) zTB==mv1}~&f*+8p2qmfUjej3;?ZK{AaoD7qR$jv_#o{D+uj*q=PMbwc58svs(fN{jRV;! z1>E~_&N0-92aJ+YBtq4PX?<8Kcjh+|)eF|Bl<*xp3(|1GWFWQp@{D1H11|qVcb@)Gs`rhL$WR_Y(r>^NpTl z<)doyN_!ACru0?cc(@vNEm7lk0ny~L$SK@(){cA{jD)KTJ4wg-3Rs}Cs3t#{&$!W? zo2@hkVz_%MJ>};QZO-QP*HMBy}jBC-~)q>PYiuG6b^aU)7Nv|vk+6EHUygZiJ@ z@cC0ewcP1J>^`P|>+}&)U~Wy7!tOBqJ9bb}#d=)+FcV|dHbCR!2xym9s5xL7fB}}H zhM5hWL|RlAghouLRb(MnthU8J;{%Nb_Dl~U&o~#qL?!FlTKK!hL0;+Xj%#%5v;R-nzDyvKb@%V`w|P|_x>?a2@H&? zaM_It6?CxJhusmc@baWHqHQe<#+PAe^Ba2H_71EO45R$o&mllr5al(G!OY!jB@it?2u@GxJu{Wh5&sO84MqKsV>@*_sp_9yQQGhZ@0@Y)tWc%4(Qbi)ctH2GOUWjE>yA!FA z=|ytd@GNs)T>#AQcw+xR6KorcrVsmLNW$0UoNsX*j*2MP>QPD@p|hGcI#=Kx^@kKbMLQBiU;tw?Rh_{;yWrB@nF@>{DSJ)e>%19xfTT|+39j9~75m&C7T z^I+5pFlsq9tMSFV5i?EsQ)L3hEI>-Imb23mfe-i z$dv!U+P#yw%os8{i5c|8VMS!tmeUR1BG@t-4o%j8haNqo6%U%><|jT_r@j%?UMz%5 z7g@6VUmYz>I!2?7I;m9L3sPYw3n}Z);rfLdAhx`as*H3&?xjSdO~rxCu16U-y=MuW zxW0q@XJL#AlN|IS?iD@JtVu&g4WXg3ADTZNpid5PEb+21xKkx&tgyI|*<>t(FVb=G19%4S*Lx|aH>rJu9ok`oCrx+7 zOeJuaOExeTb<}QcJ8B%NfocaCI$G~ZPG_tp6XUU@U52|O?niLrc(;omeWa@%8^JKg zmyTb0m$vw=f!%ILp{+ghKV(LeZK|TbAM9(Dn)SR`gD%gm&o<@58yB*x>{0f9o@23 z52SLq4XBzCthAU>y%z%U_Bsm}h39;JNH%&UZ_QoC3ejsM`m?{74`VJ2-jkpYs+ml{R?c84WvuYi)u8*1hz zi(j}(@%tH0==*FXxGD;fEfML&W+lgU^j?V%B9<8+w7yB^pISotUe}W*^IKF)%?1rV zo1?^a7rNdpme{QFLvfCUxT^RzBo=GHi9mPer9}oYc^41=a%Ewf=N4RYrkyd%4TV^T zcl1~52O99S2j6%Hv$9L)g0~hglX=Rix{vo5*<@5qwrqYwf{hYs`Rogr-V$CFyupQ( z^fZtJB?|5ty3~G!BsS=LqDL>Ol9v;_#{Es{aP)2=-N>hd@3yv5zAfLui#pR^=j(BF z=`mJlh5<7p`vG1wiGp(m+*H;%n|ywsLhAqBBi8m&L?x^ie7bkT%~{iknxzJARy>T3 z7Z<~Rj*oeJ**9{}Fq|oE7louBpV@}&IYj(-3RT(`03J%i_+QgZa^TL)nywsuj!TtB zv)CajQvQZ0BvjI-h#ct5^{0=V6=Cq~82qm1ezVO@@F17Ndgd5}FKVku$apJ+E%!ma z$c0pZyO$TQX@rk^ny94aR8(pV=Q8#+v?@D@W8G|r`D=7ZQ$Pq@I8}%bJoDJ`ge+#R z<7&+3>*Kr_Us>5tHgI#wby)Z%05>f<0#o`+IJU0@jOi($N%w84I!tMg%WGm0=SR)q z6R6r=C&jS_P_=0nJp7{%a|~56DeE+9i~nOZ_KCuxA`jpxEhJ|bjWWC?p73#93vE3b z29_l(Tn?^t%j@PA+u7eu@zCE!>6J)*Wb5gLo3*+E zR3LeT85Cj2Y#}Y+xytb!Z^THi~V)p3Z5pEfW`D- z5*NK5kJfPxkG;~cHNJ*9=(h;(m#;vpE2dQ2u8e(9Z3vIa7iw}U6XR2-!CUQO@~n3Y zeyh1k8fug|-x_a~&Bv+4IYAaLhi1dU)VFNZ=^IqkL7l`dspQ-&8}aSozeXkp-ZD}< z#9-<#b#(O-!7Vl-HD$>fu;}Gu8ellbkawRF3@Ts3MUB2>we@?_q_&x@{L67ZzHWsT zwuzwrb_=NHC6W3^5!7nOHq@2(go!l7rlBtS*|rjotolZ8yqt$0R$M@PAxGRYVhCG% z?pDuN&trTqoFm14?%?|EBK%S4A_eh&jB=DZ9A7jHi{|~L>QM{uLOXBGq{KUtVOj#r z{A|2CGK<8X{skR1UGypOfz&_oI3DW+(}Tju>lyWCSS@6bXqR3$=^OR(hH*r&)dcLn<`-Q2OHRsQ5nR@{Uj z5S|w#FfKXuO!NCk)Ydf+H>8+S*^)@wB54InPF|s*nLE(1c`ID6(tzHcYb5Nf3F{KL z1{^=dz#GMfq-m2b70%fR-zK`~)}055eTxL+)16FIt;N8-OpD|maL4iE&7@di6;*b; zR^>Z8gQ^L>rHf_;qNL|poOk>TZP{}gcl7sDGV>*>jFw|$G=ap;VR$*V%}AuUi=MTr zqTZYOsQ(%pw6(ZK4h!C9Vs4j`Ki~7|wU&)IbC^@k*Ultr`)gs&9!HFO$#uNeuQysE zqKTL8q`|k}qA>B<9rHYA!|A7d;NxRQJ10A+%g6H=?jS~_AFYR5pWk3aOA*LUo`RFw zkBQl_OLS%1HO9DCnz6R^;M{iC$oeLC{O^k%jjmGy5pG65tFV`LPNd^~&L0!Jw}bpX z#!tmQ4A2yzOjbfQ86qQ`!60!Lez|D`MLtEe@>B~Zj^~rEJyL9--*j!>0q<5It-OE0#6GjQxYvT7Pz+>yfqS@&xIhtQj=!EFZcgr@?#6zaXAa zLWpn*3CIc)vHcx{`7e)JvN@gclA;-ir9rh_TW;Ik%b{yJ`C>yHlacAQ_c^*53+c-!9?>hSgoHx-l)oup6CL)`miWG3+ID< z->UJWMJ(29){+YiuBgPZx#ov1tET%s|{DJY-s;2d*Ht=h&L|> z7&&_H!l5$`u<>>#r9ZRi(yP_rdCb0A{HZ)$VzLu!$amImw3AGa&mf(OXVLHl*Fjvr z3#zxjW&f2KqC@_Dn!Pd{W{=o$EQ+(#CN7XD3K-F*;QP4ueKid`rG($Bub^%GANoY) zJQJ1~O?wspl6{YU5Zj_7^x@I@XiyPP-7kv4i!nJ6c_D(!uMHFbZ8KUKJXpl7+UYV6z$;USFo;-#5`u?zXJ@*_E6-l!qNx^utuW9aL3q zF8Eh9FgNnD!6HPHn7ck8CgMjydCNlZ++K?8!$5j-*EOTA9A(;|u28euQ5t6+e9e{z zaQlwe>KOgn0n=eQ^$JtO@2kWid&4mh)Y}baS^DVHwwl~GMvfb-OS}9y-sj|V>blP# zuT}Dq-BwD3&qp5%L#(0wf;&2GH^jPizsSUuK{T0c$D{Y1i01r#bS^Igd8PcQJDh-z z{DUBGt{h|)1VcsdH6kaH1SN0P@xfD|qZ)Zc*!~xNzB3pSraF_XwAm23M2=dSJ%?{A zbaCH-pENG@3w`pe7G-L!;N7%k^lMlG&bSK@r4#^ns~)lakwRD;w~g}5FTkTI$G~<; zB{=c&5#fU-@b^X}An|%sA;(x{qr6(hio<=jO0MAco;;@%AyjNRjF!A99il+#_I9w zLA071#vOS}|I1s02gU_}YA(Z)-^=h;WjdN4&n0D-_(*T|N0<;{VQAD6rw;_-P&Z5W zuPK1|JI~2P@gFvEjRWKayu#^=x1;yfqgeD>3FM0VXzQ*>6v}^0RlU-{DIpEyyv~s2 zeZll>-WPiBzeOY<^g1KK`-?RTZK7|41dVxC+#xN|=_G~m1)rM|>?S)C+}R(Ci}Q3L zX&{U~bgN==x0}K?Lk4F~S%8jj1)%KDQoI)7fB_+2iHgiKR{K&2b7Im5On(QFvwt&a zY-thk&4`D-1zX{sU<`HKJ4Pcq7@V869G$<(v0m*SbXSxnnfH&y>bc?U#JLb0vfTiC zY|X(W;4~b6-#{Af9l)~MM|l4cFTVfqjlJ*PK*gqvk&4Vhe5$QU-{;z31m`>Z`#OfT zlbi}h8y4WjEw@3>v6NX5JVMlx{J~E@6J&>kK)dM<#{Dp$0#Qk@V6zp~8+M1?AGO%s zGW_sZc#yvRwE{Cf1YsJf0pAS^NQu}%SSxOiPX)i=&xT&Qx$_jY3N#`4b7sLcx!*LW z^){Kj@{IbK11;03cQw8;m3|fUimMMkx3yr4dcV@CmpzEStRvjnv=Y~@-i_+E z=TMTar>yyNu-ue@M`PE*3;T5_eN6>NwuOPm=NueV?&Ch+7?70X?(0cwF+@5DPt3kc z&HuH~y_GW|V#8DTsvZOiY3a0VWeTmncN+hk4L;@mtM#ZcY!7-&f*6*J=o^@STOJU*a&MQ31YBU(RIwQoy*+h2+MDJ}$Sa1tpu8 zAV&d11xO}uluO8(0%d5Q^`%PZ&@Dpm{~&@)H(SO#L_Hl3q2jnEZaWc#fAmVJ=Fp^3 zq@)_P+RhD+>k@Elv<9{*%|azVC$w=-BH`M*aU`8{{T-@@e*5+8^?WIaSvpDejq^d^ zr$1<_m*T}evxwTl|EQh!12%E51xm0T5V4nY*S|Q*%<}DL_`7G&KAw7*rMDQy>TYBG z!hECVV<+I~^eQ&`4({QBE#la$%<1`#tLO#z{C1=u-h}n%W zs;{>T4)s}Lna2yFC$N>+>Sf{)!E-d4%W-^L5JvNI>*#imy=d>Z1=PM~gX*9fzFC-q zN2LL0!fre(=L5ZCB2aB80R#4auxQ3hP&hV8MUOav!pIFAeVt8~3~AF_V_nrluR@4? zm?v0^&IX0JM0|BF68B`quqD4j8LL2hrncZT2=e_PrIX5J{Ms(aarDCGULLeDyG|b2 zj2O+#o{n$AACQfnp0HU{6RKrSqQ8bXv9nzLkie?=PXPYG{w}? z#c*WlaVo_1^TN#X>C=jrBzi_ZcxZazg6K+gT9}B_??}=T?^$>u(p{rM@?PtC(Yt-CaP-!a^f$nk(1GGVLXCq{V01T4~Hp|N5qIChud zT}#H%Lr%uEXP-Ql#B)Hn(eyKtAQQ(7*RA88f^K zEh#5p%8*3$jf0=qt%pAouO0eWQ5{A@kDh^AwSJPjxQ)!2n2+qU-ORpy>9Dw^f{e-} zLA(S5)41GYjA}Qgi+&?#Y`+kH0c$un5Jj&$gpgNZww%Y#6FZu@?{P{r`5SNp7Q0^n zi*_-5EnQ3aKE+VoM-1F;D1m~BKpHa~1l{eMX{peAQmdRyb6XkY_dSR+t2*(Ka2uV| z^^Lj8@wO*)IEL(zWtea>3f2_Kfk#9DL94kmZe0Qnp4g6#4uUlr)lV?S?>$Lb*g<%9 z)nnog=k@u4h<(p#fgp zbR*}=yI8d{giH3^T+*e5vAukYnXC`TpY2sd^!Xp^JSIg0ja4x+Q4Mw#&4$V48pe+& zwJ>%|G4P#_1NrA)P-K5JE%stSqmG*={`F-1_sv8lwdFYPUKZ>Zm%;fHyzs-r9kv%r z*W_~kfw>MmgpErfZ?=iS?X~Zqz3esZ)|mkv&xFB8b(krcF$PUv#;IS?O7!#LBX{r2 zgd{;jI(L;P-YDc43saTRGkSy`N}Z(R7rdyO+9FKaqlV6R=E2gK%j{aQ82pu!1}O=f z$VlNjxMKd8J=7Kr9a)LsVHE@m<23QD+&@CcTHtC*CMnO&r`ZjqMww>a%!`|bAik-B z#O>ULMg=SI_5nc24u04X7|Bdc?q^gNNTSgG_mo|)jB~2>n7=z3h-Ho!rv4U(nH{<) zZ}A$L&HS|Ucn|3kif8=WRzls8U-Z)cK%70MK!b`SF=9`lc8rq$~ZyXi*ogNKQz(+ml)KJ2Y9rFx;H{1*&bLkYS zop=Y{JBP42@o&jrUjax6XeA5h_EVp=5%}ldPNS^Xv2gXH9W30k98rIOQLv4t0k-$3 z(eyazIqFP$pUJ`TWda}?vH@TGlg8ie@0id{E7@5@88q+P8Tp=x250ZJB*`%pZrOan zrZ=JV&5F-V>ivZ^v9m;Kn$9yI&_Ba?V#^t7*Q5dtRk8H=_OA032eZBIxYf0i;XChuJSk7;-Z6e-FBKd7Sk6*KBNecEd5-Wungx^A5)c=iLzYP< z;l-$7dTR4+@~rY3Id^v&9ktFN|0VIk<oe76gCH zzygv;Ud`Ul%_goR|EYNP+$BKwr_o$~{vPVz<>tpBCX{l|Q$t=L`egfn&Yuy?yI@EK z-Y!6%Q_;{=*bmX|yQ%OBMbfO*Kn}h<55WPcFm~WFFnwF_$-XGGG_-{l_d7ISH<|A3 zy31-5*Td?LR{A)jii)m?!ELM+=OPor(#dx6h1-o@9hJwM-Y=-2gab~^EF;HHuL0A& zRj~ZnTsk;?3dY|(4857&9Lq74-Oo9PWZnc)0sBY9a3$CMvsw?b)83I(M{(m9vL%e9 z+XPL1vH|{Hd`@>Q{6;qooFj@}hslgf$#_P!p=T400?|2%O5!5;;AjBUWCWng z8Zn&J(LriP57WGr8ra%?k>>93z@FUcHI_0usIuc4UKd!5d2goTc9Vr<-wHEy%gmr2 zA(LdJSQR{gW2G(s%&uJh3|^b~(>(?=!Enu4IP5e)O=Z^t|Hn!!=dWd_P2EIMY#pvH zZGi&QFf?4`23Pi`L9fRXn5*^_xX`!p#6NrHu9`N{v^#C+`oNAxxe35T7I!|~^sBnG z;2iZmJqNlg3b4qi5v9**WBw}>{Qe;XO4naD+Ii@N(b9@Dc>T6LnpFjmr^7;Ua=-}9 zlr*p>ITcan77Z^tu`R zH^Or^AFqX#BY1owbB979ZT4Y?_e(St_R~OTRZB))G>WXRyMd~b)6iwNH~R0mig9k! z@a-LIgy~`MIH!lzdp8{v^+j>#^)@R219f+^u|=)QOrB5`Yg4LN!UAJW&%>+9DzKc^Hp)Wy*HFPv9?fe!50 z{|7rIN~`U?Ey*kCd~!@whJ1;-N4^+cMF+VYu;ga!s#OLUaypWVZqbGx)dnQ#q$_hL z+Lq?7)k4QF-^rmbjckEK2qX0*5Vz%9L5f%n{99QB-_@_+@sJ(V^K=b0kv|K=-%gYH zc^BC|rS&xFL@`HsJA>KwLnP=5M{BdKt$zCH0}1!qiCMF3pk4eM%g;FgTxwEb*&8=f z>gx#_2UD3i{|+iXPn9^#`~*|aJf?QJfmGRnMB<$m<&{K5D-g~7AD)AY}Q-!%9Bgi+`3#b|tL1#@gn2B*xdLE&~|m@oc~<~Xa9 zKjWJiV_Rd$G_RnglF4BAei5!Mse;IU8CJ;ix{=6qaX7W}cePpfbJF->FX?)>4?N_i z!X8!wlyCTwsG`U8NKPR6&pU*MpFK}&_6paWOp3vX(lwxZTo^=i-_UtKId2DFBJ>YE zWVD5XscTOi_5XVl`ve!(94e3k!;;;k-n$VSQa`bqXZE7LF88;LE1guZWlUy@f|{cf zsSBtich(J%bDo_Hf5Cld-nxot_>@82l67SFGC4F?a0IoUwUl*hr%LPFS;JMwAydo( zC-T>m7IS5?uRM-yPuPa`Y5JskjWCtpTL4daG#G>4SM1RJ$FxfHC5bQ2fr^P@h!0Yy z5gB3RZTCa!_s$6no%+ch>qZdungWlx%rsrzOLxwFP2NBTol-wU(hu0+)qgRV?dV2t zzf30fJ;&(@iwk(^^)@a;dzsGsagUr@TZ4MJ8ko>4@lbl(&hd(ubwe+j}Jqh>ny$puQi5|{+XjTm^yp1xb3fKPhwv3u_TYGk{k$|+MY z)(Qi2uXvPKslpXA;^8dUODJ;g#Rq!^=wfGWn$nvJxs&0H^3rIG;TR8+Te#mK1xqp< z@|9{NZ2_Z0KBy2{#Cqg)kzbbcG0^lp4A+J*Q!1*+2{B|dt9iI=IPEyk(j610 zaD9&)%m{l1u9I)z+7Ek}V>8M`;eL|WeilEyHO4@p0sI-#3HNvSgW+g1xfPO351m%S z{uJt@d9d{_!d=?kv}yBU+}9Hd zx64kDJ}G1T@l>lu{BtJCHjCE$*x8S%jniN#eKq)mibChkS~_?pmWW)NMGLd6xtZ!c z=Jp{;V}rFHjHt!SYRt$c>Z*D*OxGw%1o^=C;U22=y_0MU7J#PR=a`YBS)40r3?@r+ z*taTNw&097vB=fInUev?Bfb^2NH*$iyh?6F7Z42>jvu_pgx$-*E~nizN1fT4;3jB* z4Q+$0G`|Ss#IGl6R!w-dIg6fpx)BVruA=51agbTk0b{(*@VN9gTM&O8n;lDV;kX7M z-&5wczdjt$dQEO7zh}$mkAlN+B7AR7fp^g{urEBFsFxJM&D@zFe7_hDHHBfn&`j8s zu#`UeqeFe0#*z7?0kx$Yu}eRgneFWky#4O@*WDeK9$yENrqNhy%Ke_yT!hF|CRlz& z9_jo^qjtrcWC?dB+??hJbNM`3+duw9Ud|c>3+7XEt2lOXs0ys!w9@$M%4g*Kg&cSt z_Kw*838jfu2ibFEfUb&)1Fy7p;$wCJrrx+hRx5u%;)OS=X+TGVkYT&TQ0MkX$tAxhsalKT@ciGQLnHVW<} zX?xB>=Z8$D?8+v_^6wT1S$-JizgUl5JfCs*b#FQzY>J*XFQIDPUNrj}054m`NuhWu zv6DWJGjDG|ai3l|U@Q&_a!RNk#Dj`+zQQ4nTeEISFf=-a!|4Dw>TS$reB&3=o0hr6 z&RGfKtXZ;YPANVb`ho7JXTzZ`5zLJ2C$XF_YjB!92zoC8N#3Ur!#hHje6gbkW44hf zqZs&Gp$^vbY`{pejj3C(5c9jPu-ZpYp;t}=82=k!PjC##-HK z^P*{0nhOOWeRvMneUYaD#~0IzdDC#bBndAsa)$9`iSTxbm61~55>Qz9gt6(&qF-O! zrk~Aq@nlvMdCZ+UX<2r7DvuX_YH8rd+Y*qq!UyJTm9M_(bq4OgUP=U}hy$eevz09Xl`TFFVZaL05Rsdz=!PqQ*iDtU*r$)i2ss6cA5@S0bB_pM9p#BLx zY$l7Vq#0bY&W8#YErz}Q`si9C2^Tr+-sDwbQouv0{z55g{yP$T`z1l*fjRsO-%5mg zBdFw{4K((@r{XID=^vMQ#)ldwNK(fi>f?G1%YR)2buP~?WFJGCrWavw%nTUY8U-(^ zl5zd~Dd6Q7YUr3Z$hgaSqeaUsur}pCi#Iic_g6*X5ch{4wllO5{Spn|_a6DEO7OjVuLTxoK`b>(T(m{7Ha48@=rO(0i zIs-<(81V5g9k8#JLY-zYa2gMQ!p3S~R#kzn#}t%S&%krsJ=R690#-F7p!nu=*l0B$ zT=!2!2fO#k+m?@xRg7ei~DpTjisYI2hnlfoR4nxxiSbhplY=zPBkE$aiobJcl*MI-D}Uqv7;$#kvz zbds1@iKBuAbZl7&(Uh!3L2i%#>GZv7)sHeYTdqpeLt@5Q%K5Lp$%TMpyfVo&slceU zt+c5^iX5&lWPNKg(Ldoa+p{^BzN!{PmC_99YZpxS^}1F@i_cV zi6mN@FnPWu?CDH-5Lzo(Q~hWOhMt&5f7VN*{#ULOVS0jOx+2^EBp5exoZ>)%={SyM zq;Gr$<|$XOkM_M}&omZPFLN?Cl5_WiU9w+rQr#1_xG$udvI}wAA6FRM6b%)|l!;yX z66CxS!E#nRyXQ{|K0mY+ZPsbC*SLA1_N$F}q0oyYv#pA?|2B$(i_k{AWc3Ml?>#_A4R=6}m=+$)J4zf@n8B0m zET)+ipdR1inV~uBV08O!malIoL^}<$(K2tSJvo90{u)4-MiYyr>+qxID$wBa3X>tq z=-&}Z|2?0iUPZCAd|x14#6KOEU%Y@3QB@Gfxuk+Pf760~84^=a!0s__C6((Iq3y4F zqBujHGzadZUmncGW6=?C)cGWIq)%Yshn-NWpbuAX3u3|XLgw+Q{T#nIfj;NsF@_gq z%(qz^!PsFoKJvUsS_XK*<&*{nc%36UZ*SxEi0Q^zcVB`EH$M&Pku#k3;|W7Gtz!CXJNmLxV~IRGr<%w5(0Ur>%lSVlo{9AAL!x*saVlnVq|Ao59W*Su@n61ayRrRpoaspGx^N-QF#e;HYYhbltIde1h1o*mNXQuAi z00+_sKzj8qs`fJk3&RBP-ofSMmQFrd7@WfSOLxIR@oKvL3k9-0l}$Zzg`NNL6sTO) zWTngv$e6-qIyX)VuQQinvON&IHIy*XMI3|kyy3}Gp_(bBs#Mx4jeYk+AHT|mqwGpc z7@8N2ynS=1i(NU{^C%n^$7|sIq>Hf6PaM5J1R@#vg9+|(AfI;v4|Q8`KHUjuIHN;& zNI&T-3C3juE3sYT3f?xWB%V!1M7qZl@;gMCtUxVrzy6(k958?p@himclsx-5*bT=AX*gD+1n29cp>k;{-MM)-lvIS$llP2?a>Q}?8O-_3V(Z9^-)19clvNFr`ZWqW5+MT>pX?-st`aw&u`?-nsBCbmK%wBa)*}rrB!DJuOt4m z&SJ^eVS32j8iuwLDqllmy$0jk4o2NeZRbyU7nPT~itI#+{ z8Apoc@UIjf42McVmen5kt)GR831wu+doBjJf5Y&X&Pc*JHq78E>~$!nYnx)JQ&J1? z{}8TG`JIFdIhM%E#B5e3y%j{G+%bGHx7&Z8i}pOP>Go)jf08yGkK8^3E=^pY~iChbD;P{q1emdaWM*?6F5sIn0vN(Ej2G$68!Pd4)nv$AMo9hPX#``RjDi#Ir zxg6c&Q|qu=+>mlvGqjy?5MNoukM#z<~=6CWo6nvQsK7U(gM_0Ft0_(~V%$(%Nl{<|K|&dhHkiOloBU)xE$>^yMHYLu86ykf>GVoBkD{?#7Ac@RFWleHHL#&@lY zF!aVkypq2gLpiRvpItWDyO5CeM?aE3E6y^PrjApGs9HudKZ{A46+j%#Q&`bAlWh5? z^+pFmE<@=1E96Y2GK{=>PgLxp5A}$`;djnh`Ai6T zWY0s%bVInBaT3PYPl1SlNjh&&7{oH_c&~Jip~-JkylS8fk*^=%^>1PD_X`jBRF#r# z=Nrhh$%Q0GQX5F*NAlZgIfy^5qaOs1!TXbm*gjHB)Eiu3xvD&#Jyw9WmtAm~cN_iW zw9shd%=h4wZ;ExlR^kh8hV}5EGcM7zCh6&(R4=;>N*?#Kn~&)MkN!>w`|XRn)2z|0 zu!GiVnh=j8fh1;_rL@B-5^pGA^nS!^zeWWD|f}wlu zYE+og9hwSZG8pUxY ztexohB{gg{=Xp3dkw)|_)4??KEhbCz!CIj@qgB%j$<7`gJoRG^epcK{;@7v)i+|q| zwIilv)|pmVHjz!Yt*pdDA1}i=m-EqSPbPCXe*ejDEhMz}Hhn6XMiT^iYkpU{fk#gW z+^jf{{s-rg^pIe-p3C`P_@)c~SK6qWu{DiaVn*!SltI>lhxspZ7tUEBVSJ-54Edjx zk@7Mhyl-ww^;@Ts^kYv@gnLgNKe(G(7H%LGs|q0TcL-kZ-3RT~WsGK`J+Tav!84X# zbd`l1)6=g^(#0MSZ{f{gH#3{gviVdMBHBiT-s_Mo<--6|uMn9!VY=OJ5qiv)g*cl6 zfXmh7?6OW~2e(KG`7=E^|sv)y1dZ$4gb?H27M-kbARU4oXD0*#Np z$nmX|acYedo|G?V2h5W&bW8+O#Vf&me1>uP!xNyvIm*s|{Rv~%h%pa5VI+D6YgX_U ziVq_7Z%;;MhBMlq6@wL)m1MV(9;uXkMiix1!>2G_crdsSe3aywvBqfdTz7>`|M8VN z7v@lJUes>O_D);^!+mQtO`+m?ulO|A8ynt)Rqp4$E zDV-qp`HsN16RREa}4-h8JusePd^e>CmY`TyJHqW*ZaSuvr7WdEw{bA@ocANAVax+&{p=LtSL?+@l;fmKp^VK;x z&=CV)dI{D^N>oqVBLhB?JBPvuhZ&#}WkW?BLUlXJl*zAG{GRpxK=|tgzy0xM>=M z>*UXo3y1kJO=6PlI6s#z5p8Fx4(`UF)@V4jUVt9f{Y7@zqVSUUKUh;yhwjrCp=b9;!b)eNT7Du} zNXnB(&(5N6VkU|-+JS+p7adCyClXvT?A_N=bc{|!Q#1pkhBNH$USXKJAOvN~yimX? z30}L0(7@e$Nclhp)Rgj)L&de^dgD9LmN-Ngo4V0i`rP+BnuJkbB2Y9Ru>960NOcUO zKHOQ9Z=(n$=GV!U^GE0gJs0FTK4G|MRuEjAE^0jR>mhp}c@U(R6_Afz-PJW$*5Kg` zr00vS(=T0ZWN3k4&Ft9OK#Mpp^ZQ74;lrzpl$H`*EVvqaId;Fr#tq!uOBjnv7U20O z{?I#c4^18og4OrN>dAz2ke%U6PCoGg=kyk866{H=SA;+|Z!YyHe?&eyD#KCU6g>Bk z`&@6g5l_Dg5E~LUPS(82e!C)!4VUfk+1D`gsPYJ#w=)xzXDp#lWCg(L+5Z%sheM9v z8;6@3+LV=Oi<0P@dY^MA$}Wkbp-2dk5h@v_p|nX$nwpw~>N$6cid2fq-XpYZlJGmf zf8ibHInRB6KG&r|rqAvN^()h1jAJ@cJu^&S=vQOsv%7RwQ#)ArO)(Gp^NadN&BtHk z2QYL@12-#tDRDU>XFetP7#N(Xgix(1P|kQ~HyX~POLH0bt4poM;6^r)o_dvpAG(Jb zfnu=jS0?)GpNmiPb+C5dK`bg)qrU^saK)2eQOQm#P;ROfycul@wXYW9qTXX%gTqrQ zP#FbVTa}p?Z!9dUxkGl0*WkC6oyN}dErJD~dikgK9O%e5Z-N~~lqg5=?IaO*@R z9!RO;fAd%AofW`$mJa}gj#NB9y=h+kRceOJ5US5FbR;|at ziTUhv zaprZFL042ogAaS)aJech)Mt0KDlN3x=YUI|Oo9(8B_#G~B)B?f<4i|NFKYj#_+#UDO4wli zl)m)MK<)Hwq_2c(&#|s|_t{E(lods~O_ac}u>;^*4#}fs^r^`p*Ibf{!XwpC5z1CK-C0y%}@^F8qO zo?E;r{{jp5FN8PeJjuRotgCr<0(PxkiC;|2AV@@rT=}Doy_+*(RkAE}j4C05gW6<{ zF$c|JbMW1)A=E6dqb}$9zFI|3O=aafwU7R@UbIcfKxjiH>#aZHyc;e zMVa$x_g7*$ZjjsZHH-MQgusXW@958{QyAZyg_B3VQ-c8!+!9&Ik5@Q}((Y&J(%@G# zuyp|bdO8t*y$f{F>lS|UR$tKi7eEI;Y2efrcCNWs^E*#hpkvVyToqnHbaWfYR51&9 z75-S@lUU4~X)4s#4{GAk?U6X`&QAPerh#2y!MJ=xin-D*(|eYAP;ev_@_oJG%m-m2 zq{!~8)oY-CK{IiV;Hlo=RX#K72yyjd`=B)&VQ&Fr<-Tg7-{xharcMrMgzSbHKaUW< z!Q%&%(LL7(9ia=to`b-RPWvFH$Z zoaJcG<^A|(neuT{7J>ikj zN>u(d4hMo4-{7&t2cak4AM3ci6PTCJxC>twj=Dc?z23MKZ}Jz!~VA1QQR4X9iUHe25F>d`6?WwaU{ zniKGf^>j%2{T7uhm-5feG-0zrDEunfPr|e+U}3cnK1yd@_bsRCe>a`c)i9LzVIAFo z&pEXDPCI9F(vS$3PR2|1Eil)14*2$aqo9-EvA*f>Y-%Dc+7pMT+7zgiWEdXY%G`Gk zo2Z|_8SNS4CUx8|E{AdIG-}iu$=a$p(sf$7MjRV$wXI>Q!sKms@pe|$$ zP1o0hpHe%W7G_57r6%BRl!G~^4@2GbVb1BxT#$Tsn;WxnJ@M(eL}i;3iFGW8&NdR5 zz14=>me-C>3Wm(vJR0n-8G>TcXxy;6jwl(X(cAB(@b09XaTn#2?W?)1mYg|?egM89TTyj+$ySZc3&o7JC&DjMZ-?riy zwZ)h`s+FFxdWuVBtWYyN79~3h$?f(3VWGx6n6ZK}#dJEkQ!T5(Z1frO(Ov^DTrkGs z<7dc{N!wwu+bY!Wx{H&Ya$){HO>~(t56m*pVr6J5Zt0qV8Ye60(iuwNe(@$Kh&K}7 z*BVr@M~K+A=-{`;6pF{%s98%X`Ls?9%{*@7Gp#iwL}nYvr-WhHgLLQ$-h^74+s#0rxIw8`xcS zfYZz;r2RS?s~QC8(_l=lU#!R9c^zcp@{OpHUru#ASjPR>HKLUgN^LWb;hLrh(k1y0 z+K0UH(YFF}a`h0mJEtD%3L5$Okx%K{K07psbw*2}hxDp%7Qd(_A6nMCgY3)Gc<`q+ zJ-|E?(t6)$&52N2SDg&nuf}i#>ie(nNo+$*N zN2ekcTo-|Sb3>54sDvGD%Af*ORP^Opde8PbIj}>FPWU_tCH72#kAr{6^$RngsQCw< zy>(7?d|)&xO8SD{6)E_6xS#g8FK7FND;Se|mD-kX#gjKvQP)WV`+Ds0>`oE0_O0hN$1 zESPf`>~0U!+b48!g3L#{(_|rFwFn$gHbR?8EmX4Z5&bgi898NYNS( zc`*96V5o&)WO^&={7J->x-pnzH9$(bUbESjB~EH;rw7e_$?c^s7;k@z%9LCrv&}07 zt~Pbpb@?S$TJUs2-BX&ixQF&_%ON_ewu5eT7@bit291{GU_(?OJV-f(9|f1N*8xRD%|Orw)$e<6~hVRXm7H1K%15H&_tgOA2$nm;E8RDRgv=INqv)LsRm zAp(3Bc|h2^4r06@m$dI1#UFkb$#NPAg4JtN=%1|PcxGB09(gTQyUb1px1ZOBrzuMC zeoQs{JdgHM`PUd7US0-{~@$ zKQPr7d~bi`lvmv(X|DZLX@wWj)4K@oJa&+H852^*36q!4*hwcMW4=L4610v@1GT?b zxD|O{1oz)Oq&oLHh+o+_JnP*{^~6r2jd?xUWoSgV?RrC=H;CeEg$&vuEI<>ME1hC- z7gQ^R%=aY|*v2h^*HvzCZ%Q(lu4y1gXIvvXje+poZ-k5`@o-CD9$xB7u(`)XTyfe6 z409gRtwz>V-TNQOk&*}Dl+%#gIgf6=Sx1i7UdO?p16Z>65Z*5=Bgf(*xiQV$`Rj2X);5#j-HOb%~3Ibob;rf)AEnQicic5vE>R^=lz|oGYJPHgMa*KgJj;g z?H7ray~CB>*T&JO^ib}_Qq&@SHB;-p({rU4sp-{F)GV~X?H(q`zmA4XF%ewK&Yvp} z9MEWuHymtZSx=o7Iz{>zFJdqrfA5ySsgEx+d$T3(42>YI+XB#HM>N(gX3Ve4A@st+ zOQ5Trg=;2t&^PBTse$z{T{a|578-=16D{P#yrNq$UUWg5uN20z{)5S7A^3Ea`9~7wld_J#Bu-zz{Hi;- zRh$8IDP1N-=?~FzbS(TiCQ7)qO}MNynV*-R4r-1%baVVws(-D9OCwKtrJoDQmP$9& z?|V-JrAo;j`>}+JT|u8Ko4`itb~-V0GuxLapwqRLctUY04Et2lvSEVCYx)iar=p8Y=?*o)EfzIR=;K3bg{O7xbPMYP$B20Jd?Dvjj^oCzJ}W-j?#W@X2pq3I#! zl;}?&8jD@1_t(!jn3e~A!;@jh`9d5Xh@#D^cd*Vb0d6nJ$5kwYrCEQj`lwzZoNkzk zO`RukV)R&?G#mkiWo2ytc961qt^U<@@xJ%@G5cO zzQ6CKXFnF#1dV0y+VAbCm5C?LZh1?pZ#ZGPNh;mFAPZuH_QBz{OEBH}02h^B!%Ym9 z#?zZhN#iX&7%^)F*zAfu_12(ICCy7mbm4K07xT1c(E{r|5NdUVK6sJ>%`Q_=)HRAq zXhqZM<$CbpQx+-t{RTfAu*QXTCV0Qan_e3)%+GGGz(uR?pcBh|A6WXA>iWyWvw}~& zR9h?hb?kxQ_Ch)pAcB8Mcj@!|Kaoc>HT++dK5b{U$qb#X9} z{$&aVoEl1uwZ{g%8>DQ=0Z$&-Ob4_+((f|){2|sg?X(``W$pHoo(CtW^nWAtMa^!I z^pQvPhnaA$stOhzILdAL$rCk2W%^QoI=nfYgnIG0Aml1dE%(g;A=!NLjd5`Y?>WGd zI)5UmF(5E0T0y#ZZUw*B7VxKd0$Obo$K+mHh+M($z0duyPvJRHjqj%^dLeLmMgp4G zOyi%HY{o3{tzhQk1|}Bw$u{>T#HF(YTRvaMZTg{5Hc5@F+dUq1-`K#g{70fPPYmK8 z2VtaGI*7QI;{GqUq4&xiw9L*$74KZm*U}IMMBE|A$^fUVGG!{&#l$Bt1_r?f`2>F= z(q4#9eq1Nb5@$IO~fhgEjVSx)Kzu?>`D8Sx_^%tb)}7Y&BX10jC8 zES}tL0?|V8^jL5y-L|p>BR@8=KCBgr^=t)?QM<_GpCc@5q>8t?6|p=3>9k8;yr)$& z_X7}B3`fSydhjJx9u(Ng#*F-yKp zRVVCXUH>9@JJkRzwRzI+stW6@E|A+_bK$3p2)X}zJqG-=#4eu&)cTzd-7{l4e3Kg` z7&CbaX5>lJwry5W7S43CAH-oPQ_Uy$_46;&5=iC>HEf$#O$s~I zaay-J4QQx_v1ZwLt2`G4I~Bq7m<|jUU*wWBLdf$EL8R|TAkpslN6VH3fjjF1_YR&V z(mMeHKb*tocgGVywQ_jy%ms0>x_M_z1}z#Upt5N+b)*q=&XWMT*6$A31hf)kzeRBC zMk-2Q{>-O&mEx<#a(JP2J~&J`L+sr9V8h!@n8Tl^uVZGwXRM+I?P~a<^(5CfTEEt0 z_&e()$k+PM{e;D)>4NXk;p9*0Lv$L{LE+EyV6#RQ=@?iGgLMhm+aE+0sqTiNx#e)J ztOmOBjuV6T4RmL0C4QA#2~WqBQ@Ndti^S_JnMc z;PB>geb9foo0zyCg2m$IAm}&*n@;Z*E*u_*&yUur|PNvc`k|VCd2kh(?7Q+!=RrD z+*@veTfe*~k7PY)<-_;ndqX2J7HT8^{4~i%Hir+ctKzbfg~8Li9*u%4IEi+~zPr^z zHjR-cl{WzpBxEoBbVX zUQ_^Q7<1{!1O;=aQ||bmdl1(YX@H5rGf2+YvlufvhWKnLL$l4-z(MRSm!!_zu*xUk zWAYl3bv6aV?y)m|97p_?9>bIB_i&PgB4FhTdjCN_^$>f+oV3h~thSB*Ty=&|47-Fe z@9&Y1Bhu#IHD+RTb3E=<=qEL+%ILNAI`~jlj~BFr;R^p2+|VKcqs9H9L`&E_g*lCn zt?nZ==9}TB`Y56>Kqa8_jN+TE^ z-rvskrN1FFq7`vupC`({|IYEw*GT7nHRg?J;=Zm-#K_W1uxzGOtxDTcPO7h(mi;SW zy`|B3LTC$o|0jy>*M#uD1XZGPWDPf7KbLUtSTFjU6v-ZnuNkPHf&rE%u=lJq9K0)M z-l`UamPK{cdito^#5ML%-PVgcWUmnWzgfh!Iv2EZj^R6p1$5HK2=G4A1OdfWqg#aELj%{oxbau;hQ{o%={I9m8)6`lP13Q^jVkHyw^z|^b` z5|SCiGf)(wSjR)(@+8YxB=9CN^RZ7XmiGSlf%D&egXMZpGDhk#(}q2X#5}7(Ae6~E zX+^83ir!D)4~W;!KerOPCwG#wM+G=4qQoMUt-t$#{45a=2R{OHayurK74o zl92*W@{@{?ola8JcjZx(o4=TZgbq?T+Dzs~E}}Zizf+Sv>mf4fi{R3&u_)btgZpGn z=#XPN^c4l-1pObxKl(j%tQ(K}_4?Ti?<_C+D;-+Pl1PrP1PtYc!knq)lxkcj`wMS! zUmV84+E>x!@qP=~oU28wPW(otr&{F5$Qkk`Y#MBQ&tnO56wcaZ26KIF8IR#6RR7X} zyCbQrbDhNYtIim35%Ex*5XR4YOq0vz;lGq!35)@M=2k3p317j;qu0q`zA8DWjx}o>^3YvHwq|$bWzerJ zCmSTUz~LYD+zjbynC>~AEL$`d$&P=#!?Qtd``5*|M@9pGw>#mb5D7dgsG>c4c7r_K z1mnM+fLnR-aAsmLf2GQstk|E7EeGp4F8dUp7}ddTNQfgLMvi#a^d%R%;57Hm@d90a zX%hNMXrfyl;3bbR{5oV0CdN|WaBCvIc_$985yt2d?!*ffFi!oNNPN{f1xwadkw}HZ zT+LQ#cr?_9BDwqD+BLhucP3)HfGa5B<=ANP6^q3M*0JB z*P6~r{9|19jpxY3y&8-ODGb85Yw(9u2^L!&Ao~@zpo#XsnH`@!GJnTN8IL&4ha*-f(?Q3HM9k8eC_(yT=k~DD=|{ga6Rte2z?N};NKBeC%%0sQsNZ7*TMo(KLbF(CxONIXcPqp0 zpk#>LAi!h26XEDn9Sr^Af{s)THhh1HUTcJ)(P|QUsf*#17cX&&@EvmhStK5>*@X?` z+(Ad=BNf`|M(#>2!_XwXnvhNQ`MpT|A1h38wfE+8IO+xK!a+??iIT=sL9te*z~bbkW9ve3Er( zEG*n~5;ygaq6_9a(tkZMxS-=YC0jyqP+~f|lxRTeswDDSCX}D05CayQSzkJ2EwL9a zASWg$!w884`}50j-(^j5SAGXsYvT_K*O<_}sT!~(AQJa}nu;$T>eZfprOFr=?E4Mu zg#lT+>i1jY**#%8OqCkscD~pI>qU=ohFi~}UDraC8Mg$VmL#!vuuA^(StsgJY|Jms zI7zg9h2}o%uM+5lgkn?j5BjT^x!w#u5G(ij^u>@Wj1E%aGfF*RqU{5^Uttq{tyo6% z)1|PL?HMosU5q7R>+tixl{m7!1($#6WgM<-T$Eh}tt~GYi|rPq)-$rB{g3NX}lF0QjF0ggo*BWYvHmS}l2M1|Y5rKzcnLn(6!R%7|8ZaGGxEF47`7R%gguQactbi4Eqbkp zr-=s1d%?Ox_Eq3DxCX;?*AsPx|8PWN3q3cdlAg8e1)(DeXmRv0Il@#yX=Rl(=eaz+ zGeHq_;w>R2AQAU>X_A?q1-NvTGiPs_MROu5$OQK8H+8=`#13jh)Z6J0%{WWvN86jt zFgQ&PDCE$P{Ew)&*9!szo1j<#{5akwu#d zOYzNc0o`ctMFQ-`LwW83dhvw~9{2oE6XW}pzAl>pu43$S-)@2H6y{@gyD1fj8sdp< zuV8WMG3xas6f}J8F^sX0_HQ``amj#2 z^WaBg1nEZ`9P^ao$TJ7JGW9BqHsR?i|90|k$s8OlR1I1CI_ai;pZLYnFNoYsEx0@7 zHFJtTAm(pIV_x87xEwy4Yuwq2b5dn-=BzC6+?Romon09dg@T0iOmM6zg^Ziu_L1t6J$PpipGrG1 zr_C4o4r|pG790m1i4EL}l$qx5yMJ-U@@g>ok`2acCBtCVbgJgJ4#gPP@5`x9HVf;f zwu>&|s&l6Wb$M=8;w;~A^n*6MH{Qas7{1hS4CAiwZh}${SX#} z=YJW)DRof{h_WTWh9y8U;2kwm%tQYjIkase`yH<<#)JF5Kwv^Wd~MSK%LnFI@UsY( z-B%(LeU;(kwu2a%y%W2Z#ejZX0)pKrTq71pz6^fnmF2}jZFfWJQ19J1@KY{gK4R{rEoLGE4jPX4caKe&t#TGxM&9UjU;_YJmd+j?` zR(H|BMTw+FCjuuYjp3i~Go>Y8MB&=j5D3n+fP;I61k3ZJv9(E;6t9#+$u-NXG#;~k zkn11Fd=WxsZ?OjXqqZp0wVd5?-B5LdVr}8?ne==~Ao#`Q;g|6-cu}r`>dp^A!Grm* zanVn*)5?;Tue!&-3BCvwugxK%yO?)UIs~hp))F1s64X^;kH**6<>gYhs~NiS=z0f?${X4v2XX!J9@I;aA5{KB4a} z{ZcK8I9tQKQ@)BUeZK}em&`;DZ571AM)KNNzjjN|Sxj-OgtIz!@Y9fS#lNs#*`x;g z`Nu6X`{GpmVONI9FQ?+ALpPLUE6c7A%1y23z4(pf9;E z^ei{pT= zJH~~}b69KEJ>-SOXL7jJQ%lIb{2GvpS%hny#`0CcN-(th7#;Q;q32b96S4GqzM;2( z@DdlXfxf0659w1GrD$-H-$z!8#Gp~YILtiygJ^7hP8!5x&{(>P_z9xP$QPyB)`Md3 zHERL}{;)yGp(W5`NujR%JH3$|!e6`?gEH-bSTvvn%0dHtOIa`-xm^xN7k?*e7fPsd z*t?pIpKs#I2|7?cFb2}^H&eYyme8}R8C?#Ia1u45FitpuAJsStd-nBmonkpeu)Lv0 zx$!RESJ@8X1*%lOOPJ+i#Nm*JHi+CRB>w+C)1!?wq?}8Epl~;S?440&&y4oMib*l# z^^taJp(u`y7q`Hl0T(FfZ>-UocLPS$BQQZ|9eBKF9`Np27<^pl=wTWYak?sdB0ojHseuz^G2Dg36E3hFl|p8g!IMC_tZkgPe$&fY9oUmT9zk3R8}jAw!N=|C{nsirl?Y)*4~ zI_oDDLgvwP_*PI%pJXq@o=vNOTbYh;tT%va!)$sj`Y!V>oPz1Xhw=FXPn7H_BQM;7 z$iwa%q+-t!SZXGQO|qD)ev5|i=Sk3bb1-uU(qXRzb*isunf4PH{p=+f zX}pAIN)R7i-c7dYSktM-%0xb_Sg;`QCjD5f0f#P~;B!mz$%-k`&@}jvwz+Q-RQdH5D8KUrdR4)X>X1!?{=t!uaA<#_c4WZmxCreHXfme zR2#@jOCuT}{sOPh3ZUURo%k-mjqk9_g66S|fL4HH~|qlTR*JMDd^5t{^ZWgCspZf=%puk&JlB1xY1w)Ag6a#t@sC`*WKZ_*JwYN86~S9%v*7MI1kG^=@wI;|&?yGQ zPAHYw&RheB_flTGv$Dcy z_Qg)B-cyas<4fp(s50I^RD~Jyrc$AJ_GIXiz+mG9^6FR=b~T8>`zXey89yDTsV;}Z z!xLckm1;=VnM(hho`R_#pViFxI0naUI8NGrN|E39Ex}2p5|-}^!glGyM8|m*s>cSg zd*4Fdq$vw*@0AjdiYn~-K9BBrt_VA3#_|D%Hemf$9}lbLW7F1ZZutEb@Z&sjam6<9 zi4!$e#fbK9eKBAG@NfK#($N^_{`qlB!75_4!?A!*T+l1lt!LB5mu&u-iSfd1$HNm zK8>61Zz7#$tf%6jj6VhA@o|nL6x&3Tx4x}Z_wPSCFz5l-Q+fJDIv!dzZ_tB|IV7X@ z9>1bv28OcV_67?PJpZ2>I4r+L7F|u@EnbyMej)4sb~@#E)TqA90l2_JphPW6fXf zI!=>QC;cwxab~vWu@n)8Y*>+vIVQqbcDt7vjI%;5ktf_q z&&lM^y;wL_a*8x6&1HQYYgFx40OzMiN!O_YvSqV2NmBkn$U#SPe8)+8C3O^D8`T6I zGdj(@H9K(`&L(BsFXJfdXzsp+H&(t&p+DMpQs)pAI22@p-akH&dwyHSC}uS^fH<4ZBMM@6QGn_ zq#gBd$?KOVIJdc*QBHa)z`OI{?i)dt+RQ-_X>oG(RUD44&m-%P$B}|UH(I@UG}b;% zr4m!SxC>JE@m29&@DlN*T0-eis%k~PESwIrQ@2BC0qYpNN+ET{`f&POBB>f)LihM? z$GJW)`P%)hj0?2~=WF%A+7J%?LcZ`HdZppsC|4@HWhK<^GBI0wqg~+TZbSC}my54$ z-TCGKN=@#~!BawksI0Y{Y+CJzEBk!;Z$Cs(X2o-Ay?7C^2=jo3tG0M6(FC_ivN>hp zAoSM@z&$#J@37FKaet)9O4e=jPi`jaPo!vx`DI#Ho(+-B+qv9L)mS#u30_ZLgmOoE zxJ!H2V$=LbT(;;QDpsX|N~P=3dGHt+KlTXD7aO7q4L=1d1c7MrI0P3Q|4n^FBj}_v z2S|S&VV_MQ>76+mR0nUM#VU5Ai_!pDbBmh)+{AE|=nJYvJaE>()o|o7>))@q##IX> zK#p|~r{$mE{wfxuVa^2-ySJR);)C#q{SZoRod+$tPDm^o}maKrY-i^ZMiN)}dFT))oZrmbvH&BiCpm`&oNbi(=U@iNV4ha#G@9csH z^@O1A;4tUDB?aFX<_nTtzj7bX9EbfEPu6f+TIfg|up&GUkFXAkgP;-b`t5-8;VHPs zC;=D9&4I;UU5(niD8*(@HDxA)J#_@%VAlE`0PM7b()klxhM-lh2!^Mqk zu^&$?GAeOvUN*j&`;U6XCeiBgQy?|-6J90YgXBcz>t z|NnQ8=FM9?+JY99&HO{7 zoHRcRhQKdIf~M_J++gfk8k;*BW(YqZ0~Si~Yi>Bq8=pZ}&Rk2gPEVm)_w~uN>;w$` z9!Hb2&*RPZ#gN8wjxR+EabwmhOe`$KxARn>xGxj^{codn=>Tb-QbFI={=}Uk5p1r- zvXKiHk%1lisjYP@xavd==kbsC~JU=Xu zg6iHAAkA1_gB9{97qpC=4_Bk>H*k=DKNTm9{Q{LcL-6mm2GSlmL?XortjXO^!;SMv zxSKE+7{bS)?r!=82mSExg8)jKarnq!%8+r4h1oK4BfwZwF9N^{(HvzidfjKN&6IXG9nzkg68>K67`21(`T}By(?n}bcmB*my zHFF)uu7jJ66};jR2XJ{4OZuWCA@8LRO0(TtLen{#4#r; zzR+`%9-4i88IL0(yQod|QhGBd1Xt(2ASYT5g36*#f;*Y|ctrO$aran2toUFGe&MvV zx`_r>XJaWli;DHLc`++RoEY^4+VyMUVYQ^WPR0q${Pvoz+M5aM?bnji`iZnpC5Akb z`Nw_RU`iL49K==8O6LFFmBM*9-NAOFIh-ufqX$-uH6Li`rB|B_VCTz)&|K#aa>EU< z*XT6%9{Nu1x`{!(?J|^28en|zrTE{gP@qWH661&m@jOy!0#aL`Q@4lu9N8{rScTUrD!N)5r2SXc_`f-D+e{4)ommQl;}_D+8B!415eI({ z{^QEm4uiSJG)!CBP#t3Qf!!yAi4EgZ{5g$1Rx;=~*OwUn zTMQAd$Vd1SH{QQQuU_e`g~FFnbRWh30y6;XJ9 zohTiirhx^zqw)9nPW+>E9G`il(%akT(uqf^;nTYPaCJ57?(b5h1p(8c?aw(PBA!SZ zwBF!}jvPq7D-7O?T3~NcJJCq>#4XzwK;X4{F8HP#nIL0s`#}IVvKPaLv06QxUD~@VB?)As@j%8+-IjES1Al<>MXHob~fxO z%LJQtTR3V5_~znn{==1g65ql05m|QFG0~0ud-E5@9?--QpVRziE*K0SDMLwVAiThp zw0dASJuRPxr>;q+Zd-1`enakPLG12XTpRC|##NpPu?x4BIIv?wDMh3}388xqr#iK+@|B=yf;Z z+rOop#;%7{LnV~I>}-H>-D6=z&`ENXF-Ujhus+f1UNZf802$Q#N~9{<$jnSti{i)*sYmR)39&qZSCdjc|jei21=rcPyNFog6Ka!h34>ISJb{ zbgj7_=DnA$o#}KNuB#H1FPZ{B8f-u$hdpccWa&4LUUE#X6%(A}P|P8Pj-C1#r|)2n z`H^cx$wm?<{y2d@9Y4~+k||&+#Gduj#UZrsJ$aV!qe{E10=+N7p@@O>fl*JXsQ(<|mJ}gwS5^M@MOFYgWC+boLsC05aUe%DM_dhKZG`dtkn8XzP zPbnN8IbDWqpA%R&+Y~f5CJDwobbxTy8G0S&32`r%qor&owmtqut#K)CIlTt%uMVMg zD@|zJ=4!Hj$1`rtwKWhcZ3L#(mMEUu&hLM(h-AMj?f7s8J{46%3cr(Eq>@Fnq!S@5 zFMurHFbO#WdyLU*<&Sw+p!~!{(sd&fI`4GQW$B_I|G*2g`)9!V2^pY%{S02bY|hp8 zdXarfUrEW0A(S(&!0p1aoQ{y z?5Gjt;|?uhT%kz%clK>gcI#>&>FvZ*!x=5=Tw!6P8l?RE1&4OtgcB*YY6()Fh@_bj`&ncn5zU7LlMG)p+a$4TY_$tp5k z<_39owHF){{?5&fxlYYopA&P%P2|HaWgPdnkqWiW#wxx0W^tnzlG**c@Va6eS}e*! z+3K6%p2KF>{+(2F;~yHzvMyT<(lF0z4c@zcmIkGTqeJv5vh?pVD5~B-FFRl6Ketst z<$x53U9-mnjnVXdUJ7jeTmefDtOeQc%hA{JI@@QtlK$Q7eOmY`&OR87Yt<#pOW2-c zynQey73WDUlm7^gK8(X1eN@>9%hW{bf&Vzn=w%K1ilF9`AppnWWrv0g$1 zy|yx!tUSv{dd0zjV+cOjE{{q@O3=R21Bw(blQ_4tP>^B5m&c{>IuXLOTKfi^`=y2< z=Q7bbmok=c6?H7w2&3)@!HnrfAkke#7PGrhb;e(!@=FQFxaeXDyr)`Ig=@cMC(;QD zlg%saZc(>U5@bqS8oxAsEr=fyBa44$!Sd8Xa85f66L?wtoY_I*S3Kp7?|4$5vbCt^ zex9xhJ&YfXho=yNby8g%Y&`LwCr< zR~2}Obvl<7e}T`%m#N|S0@S%a8tMT_20-V)IxMlrfi1$nYkKzGH~|VHHxu zcp(P5ZmeS$LDSau&_{=}=%N*kG_1k{oXSGzKG9q{)^j2b1YICoE=mDeX%FYeAEa}= z(oxJ$nJTYd!1lF1&?;(%hmsyJo=qUSE>tnk+}TLZ=Tpdh89{bgXOPkbpGfkNjX26- z2i}ol|M7kW{!f1}S$3ofgl#s!wo4~S@`Z8cXZD?}(OkU-Htsr$o^i*ZBjo|L{4|Q@ zG&O*G>T|BZTd{VWO%LyNFcNB>kEO05aquIqe?fp9$8mKJX2snwZM_XyI zV+f2{YfFypK|JTWhiGllCnnupe523~Y zPqC~~KW2Lz1ecMmH2g(9Y-SwY2^n4de`7NEvmTN}t@Z#+V;#AjGYlXC+fgX{9F_}8 z`7bO_uFxU75UzsR-!RufwcpQK-$AG5hv(3|Y9@8JlA! zz|NQl#6+Zt_(*DUj%6NLH+CweL6{pG9&R!5&{jWS($Vs7eW7v z=_OT*ml6N5VXzQhkdraVwA9uI$mt4hu%`@{{!2jNm`-|Z+*uN&8p@9_`J;l{C6b&v z8*oGvpNFR5v1Ch-xmXT2y3W7{Ctv8|9&`U?^XR7ijGMkn7^VmQN1{ceaj%#Vsrgh- z#@cz4JqDlYedZWR@O9>%%}*e`frWggvJ1{){7=81CwbS|6F9lXN#tt`X7R++@Ah$Aed5sh; z$a8l9%>`xrjQ6@YutSzuyV;k5-GjFoaO!CTs@qpq>SsyMR|IUnpEe}lbfQ>S^{8eI{vw7eW zn+m(Hh~ZG7D^Yr0KsMf3Og5X_aIbj<^Uc!E^!;W^F7Y#vkOsfR^h zt=M?*;B~Ps)?m|DcQkjH9+hM2UR3;sXK?k=j!Q z@^s_ghivw$3kTXA;`TnULMG1J^O0yYd`AIB#wS2L~zy zK0^dgI7q`=Jq=7_`OrxwBY5@5Qy4z{A91;)gzH?)VSGXlY<{W&eoHF^b1rs}(;HQx z*`k}shMnTgF}pJg532$;+Um#BVcB+cOJH zH4>q|?=gzM)Wk)`BG{-_$9<_w=F8HHk(`m?_KX!LUUyS@j5ea5k4NDP$p+kZw2tas zXeFOM*I~l$)#SYG9J*6golJZc0*hT|FwQ%3*!Iei_~ajKN9YT>l}fc=&R^iJIBcfL zORcGh%LJnH?;M3+aa2mIo1d}u3U_dB5wsr*hyO8j-T^heVH~e0T8N}wDx#%C>7Mr~ zGE+ub4JxT5Bg$+k+FL_uh?XL>*Lk0-qJfYi6-gn={23A9cmD6M+qvhy@AG`WpU=WI z7s;lFd#H4JG`@^IPK~EM#>b1==w9#5*lOZNT#AZd=R`>ebxkE(MiyX68lR~P&7d2` z*J5n#1FVtJ#F^6-K(p|C`UmS12fu6Vgw;{FtFV~i`oE;+(+d*A^(LRGPXiDB zJN5?GNpcC9j~O2fm?dlo^w_V1nvf~%U0>Bd>*Czp9w#{m<#vn>|!sx{r)`9S0wa4JK0$)#8maayS%gMVO+O zROq-C+|HU!MHU{wK_3N}ZTyl=P5;EU=RBm+A7s(yyf`_fe*_1gy&-=0thlpH6!08} zi2*jEzRU?SkQz_fmnrZzQVxjM8YsDWgB;b#g2_iqNF3MmZA-Re92?T%85hlOSqpKX=&|!6TW@2d#l{kHq9r|3s)_=}q(hs~q zbE_@XdFeTDjhluI$;|hjx+M+!=^e-9mR6Rif*sj&{wRyl-kY;CU<-yhCcK-gi6l!lxbA@7RU? z&Qi4VfCm3i_$XcR@+INimCT+u6zQvIJX&T$G*?wI@^8+=C;Ppum@9>b1x?%zYb~ZI z#=#l;o79xc6YaB5;HTQOv147OP}e66f%4TTfA#|it`*0Fuf*Xj8;IN24>4~lcEDG= zb2zcR4r)baLm+RI*cfvBv|C6I`X1z>Bg>g-KN;NZWDj+fGx3vlHIseyEA8i)Y%Nyr z>BL>hB-&~(4)#tXp3qOXyFO!NmA^2Fv5H{VdW)>F8KP6OE|5nP255zQFurip!HWLN zG~;9>5ww{NE0ig70!d}NGq;!xq`hrQ<;>&b)Y{s3o0KY`O9U@3`UL6 z$4`&@trp~O9Wf&rcm~{)cYrFpj+W`hAS+^k(l@tYl4~aUbdqB|q^_m!u6NO#u4UL} z)M2uuPLyu@Tme&lOPR`TDT1nc9(W}8GDfzluyYUR9GrFnpU=Js+spE6O_eXgvXTXy zchrdFS|u`BZAEm4$U)e>;3P=(H9%G^ce}Xy9NIo?pz{1?D9aJx_k=rQa(V{qy)23A zTCXD?T-_ibzKUqHZ-ZsAZQ$yfMcaP>Fiz1VQ?;ya|L=eFW?nklFXLg`{5td!RRYaa zVOXZI9d|7dXV)+hu(s0+7pZc&a(gc4F!v$Rd(ERUm-W!y(HI)1Oo!h+x2VBQcN%k_ zNA@qBfF-N-kheCNhReUFhQdPl_Ei@F%Mor?xRD$e*XDfU=WzYAO!i%XEG`NYM{nf_ z{CYhMe{lPik4ZC3ACn=be~{bzoG~ZMtTSNGKrxPxex9R-08AE*t9`w|4NGObh@0?q z@SPP5({{N7*Bv4PH5o+FApzGXsnao~B_KDX$nW3j$-7mN$a*+#rElV|GAfH*;Q&6M zw@t55-oOU9>C{0ZoFqYZj{)+m58}+b-2XAs7Anl#!A6E-OkONQb+<6u=PC_3!<#V4 z<+ZT93x729GfA7vOwq~BGKGTgSlJQ!FF0S zGQB@IXQO;M-Ow}>0-ygRo^$(Yt3ogBJ@cS0D`gWpZ&Se3zy72Kz z&R->IYOO5>kM>-JhXZ!tZCXivjvc`7i#Nh_XJM30*bR-Dr(p2SX4Kbep$C(dQ0Q?5 zDPA-UX8*m2_q5D8#}3!yYU?28J6N*sgFS}snFp>pTj|P`C-Ih~Da`j2 z!IyEC-U8u`+`gf&i(cU^gSbLJSaUI0#cjN~nC& zC#u}TpsQpz*O8J2t67aihfRhVI(qc-2CirS-wggwTLWBrzYkU^Rng~Pr$KXWF4n(@ zuI>Mp&(yI8xU<9}xO(&r2}}71E??yFK(iGrlYasgfwfdzDuv^++JJH;H!D1zK&Q$X zK;UZ=VsUjZzTJ~eyIgZwi`m7{D=?dEGvtBsAeSXOaG1Opy}{TUhvVKvBkbc{hR|d+ zXwxaeKzj%1_EDtcqFtCc_n8aIBk!XW~Iy*MN>{x})sPIS_b?V|MjQV4<}r zT-y>wRiob1SC;7z<7|mX z&~%HV;vA>Vboy4fVQdH0svY$2+)PYq+kvBp?SL<_7)H70+3#*9OHVz-mj^D;ETI~3 z6`To7%RyvwwcxE=GYW241!6|YShmua?w47EV>|Do=o?~q^RjA>M|49DHXP)vpb62Vfc!S!#DEg+E&o%l}7m$)*$m@0)7c7W==&; z$9T6qr{^(#oG>-{~YU@h~tw`f!X&9}A+}4xDFBH1{z2o4%0OoiC|e`YG%) zzDny~NTY{X4oUP2hTxzl9J3Q)iqtxGEcF4#zBmF|tN1iiB^Y&V|B%SIDpdKZhW4E2 z#)oH36jx7x2F@Y;&u#)ap1BG9bn1vu>tghud7rjTFn~2~X4Ii3lpMU60H3}t0>fZF zOnL=uy8c&C`yC91PC?aWF=xrz6%WXvmlEiHp@~;}`2ob*IS%E!i6X5e2 zEpV-i1R;eQ@EHmRUC-AnyVRSUFR8CHeM^Z9(?|6i`SZDnA&p; zSul`5Ep8`M?P!(`4XuLdA6+oi^$0lL%f;HwcknR#0UL6^kOf*-sMcmlcwWtMl+5$# z?iuT0eS$CD&M|i7{P^Vg(LwS?Z#((H@w3c-+f#9ia%gn=O}q`3z@}zZ)4G=HoGVU( zwLhuP++DB*h3;6QhTdPY@~sVBDddj1wL9_Sm<7J!cowBU-C*mI%b+L81K~r@$a`aH ztn93(IXa)2c>!18Oa51S)9nPtwtOK0A-16X^Ab2e3?f2LjZtim8t8>_E@|U~#6sc= znH8o8wn;)Ta_a&;6fujPaMTYK>||N@BOV}^c>^N$T{XFA{00xdyUB_it;GAUCu7v4 z3#8laItYBfLC&>DgYFe+e)#fmm^Ac<+apAhp$c=N`Pr17iHW8A6Z3H-l)(WxC(2yO zMSrhC^42#LLLbY5dr%g5w1m+M3l;I-i>1il+{6L#KuM5=YCLPMZ43ionG(J}uH#g9T$<#MmenHC}qMC4aZWx=lsoR>&=K zJI0mK3{io&6wX;%R7tk`%s|)Sa%@&n#d&9U;RUzvJiAguqG7uVOVp%HHQ#5#(hs&= z4i9jy=US-$-N1Z0B!}~3S5arOl>W)iVFE1|V?E{gn5zOHW6%RedSsZ3l2c&u(IrIO z%>~2Ub!lvKF!GL<=j3kAOBD)2=NjQ_Vh$<3o)Z73v;N#{g>4AS0)*k zPeT(f2E(5!0c!&_>FU|pIO$Ofy+stM`H5fDDA^1TTfs>$%jTU=IB4g^~gsI|Ts zvzT@EceNw`9+m`IJa(nn3J+1zQ<;Hp+67-?x>RIfAHn)Zln z{g%UJTb|=;u6H>)yaiX3%0hbGba?st67}5CjHN~acsY^dF1dHoyJ{Cmf>AZ2?kS5B zm+wGo#A*;;l1r$ejE*5l@x5f=A~P*fpZd3n@KHSIrWF ziEp=}dvi0r7obUuD&C;;=QEg8bc#flye0>Ax52lhtL)*l7)Gt28O?re#!SW2=pirz z6@uicb%Fr=-ai}4tgC1`cSqk^JP0a3>+nJCbvQF`4y;_ALibdd63>&D>A+`cyiuD? z>i@2xQL}O}b)hL*_AMhvW=3F}(k4_oehgKf=Fx#aNpR2hJkCi91;O#YxdP^|qjt$cR zqegVEUQDH@OM~Z7H?2|@qb{8Dc*00OU7XWR9U2v}GWI#%ZCQ_AIr?yN%|4tWuno^G z|3ZVOC_&~{SMu_9Fqt-d9E(S%VP@YClIgOT9(AxHSA9M3s_ic#^=Li3zBiTQ4~@|^ z#G5t{3df6g}G-`A50#ehXXs*;H@zW3Zak4(z6f9{EJfj^v5immYPb2inCCARx%35 zZo~5SAUf;gLmd2>FuJM5Vx_Km_7*vG07m}KdK4aq^)6tj~ukO{C+dB=EExF;L?=LamF-HuO0tmzkBWfJOt8aDbI z#5kvLMkoFt-Dn*G#{-7g=bOt&%pV_`yF4By$tII1rw?_)ialuDBM%dYW`K^Z3CA3e zL+O-5@ZrZw)O;F3Lkhdu{=2W}QOWBVl9&&|Tasye0=EkcDzqwHdx9w4c^-Bw&Cf*jhX5V6!?H=Osz;AVR>ceyeH$X}?ia?`V zBOtq40`#I+;oc3w(0#N4RN9UZ!)NATR+586F#-J9Q)tY8MV9p(CYA!b={Lb1qA@f~ zn*~3TtEh$-<-9P)Z8f@RYr}>uX{>wMFih~{{MCO<(A}ToE^giqL!lG-o~2DN+sgq; zMo&XheL4L(@em#;7$nykdKj734EXouKGpEr0nytC?mSb{_^qBO($E?3IOKd(qtaH2SNxXxU7@5cA(Bfha3rRT$Jh?|& z27IVdGbaWaeMw&0g=3BGQqwEVCG_%waL%LL1QmT8zfZ0TraE#yK_-b7yuV87ls&Lu zyAqlv-M~2wQ8+5G9zHs>(T`o*p=16Xyq>k5PFsAI*7W;e{t0d;UN`|or4yh)(FBtN zo2Wv)2RIKNs7-XRpvw#!NX3J-@MK^HY*09j?_bP^mU%B|#l0B3DxO5He3UUA8L^;G zHFD{#^MA?cjsiM2$BwMm%He{VhJD6aWVG)))qCV?B44Ql zZ~5iu_3jcKu{uL9Zk=K}(=~`J(&88}T;4Uyv4s8jX(==JdkQ!vU8FYq{?X}^IsZyR zZk?ff3tAKP@@{{0^j?T^QUn_nkI*e!rhs1r4?O}lfWFX6dN=M8{Pr3E@eW_%)Cj>MfKp19g-0)N}5M9{hWh!q=8WVa3}k#uaXwmv4fxPqElA=7bL0_x6bVp$QTY{YajX;h1!oj*=~+Z`ZZ*8pOHGz$N> zA3MTEaF5qiO!riR%HSs?`nD=|TZ)3{#GBmb&UOB4LSegsHN7-NA795tvKk%|BGiY^}vrH^tG>C4S8NUisL%9&izujd@Sdr27=>O7`6Hq-Qg(Jt^% zbHd*=2}qd6Ng@D-oX#>S(ddM6$WV-JJx1qF01CD`#Q3xi+Y=6vjLAmE8P&F}eG zS3JF!&TWW+CXZB(SCRLTCB&nN^WV{>%wLpZS3cvj zzZ7+FM(+uXw>&~h(zvW~j}*$rRARLdEUivi?=-qpQlD=KFQ#G z<19J%(3+7w!@bvsc$oOlpSWr->WxK_9yuepp*@BpTf|M@-kC_H z_6uX{v8S|)H;IgEti&E0YpS#;fa5yrfpXX+`qfq&onOaeUs?>BUsu5DumoHdHcZc} znLvoQD4r?$O3IJVz|F#kV77%e{1`}M1Mc!*ZcHJO{VZx~y>uQvP&|t7Zha%U!ru5# zNfz~A|A$}RFQ*aa+i}z1owR;G3(Dn3sL3~bFu3xNxES?9NLDhmzKUZHi44&r*S^wq z6DIHnRkx9kOP5p4MRD}g;uLZ&E0bmd*9C8~f~A|!u^V^I$CX-pi6Ac?riI0TWa(?> z&$9*u-R`3C_LiVDbP-~#l%a346ee*y%9FF3$$ytVks~)*8rl3D_Jv-;_C*5x z%3n6vSDK8)uoZFTRpfb=g4@gpu21l$S4L3@IuCsZ1845tP<;bhh92>L^~*tc_f>l02j{w%RR`AR zIvJB!2UD)QdcL+3o{Ol#YwIbbSfdy2-u!`%J8&5t*0)(@mb)z_mNu5f*htI)F;R8gx{Sx!ev=t%X?XD3Pv+dqN~o*rz?aKxn0LCSpd53GRG!wu1&ul6$m|$0S!X$uwm=*m zIy2!=jUlu?`^mAI{HTTh2|P7jgv_NvSmG?hc1nj)m03q%V^;+$vEmL1`I}Co9X`N4 zqbzpx^?$6?G9_pXRirje?L=L53l2&}!6`li0T1oz;mtevmio3ZJM1$Ym@CYf9hU(q zr$6M;ZBwe3S4u*cU4??ldR!h-w(ig6TDoV$b5g5hNno5smD3OD!-Z<77bFh#9d96g z|8=JPmJ#qS-o)bjZg};zFl;XFqsuo;gkm{v{%!o0edm)w$L8yRp+h!1T`w7|3tYjn zBcC#W=un@ZL$8>z4 z+|IsUSA(0H?5OYbn{?+&M?AP9jGPIPL8*5)@gZ}DI=_8Nv+xKm@Nr@fYdA2k7uPaD z^UGn0GS@+HyhRrZ^V!-C9-IkJz;hR(sQx=XRGA;8$5i>)(H)NhO?D*q$Yyx)b1kj5 z6z1l)Hz9H4927KHkd*3195J*bHheGWdw-rg^Ndj2fN=Von{6&TvjQfYUn32rUhu&H zKyqIg%qpwLCHs__LtW#%{Msu)#``$FVjdZ23MByv-i+$Z7_4t8#^#?3aB(}5K{Frveq$wj zdG`@?txP7TCWnyW+5osDsfT6;tvGQ`I$gX{pX_d`p(Ildy;``LlOZqUFull%ck}`$CqOTXjbx@CO@nu+#Z9TJ-roH{>|jxFSButa6BvY zVjgaIk%d-ouHa0sRmAF18Ju6mb?*BT;j=(>U9WW`M&EA()!&QYQ-uR$uG+=stE>iz z&U5GzmPr=>*1`~uYm;aYjx8-y@%`96svtF))vvR|z3X!z?H1Sb{osTpN7cbP{0Tc$ z^Os#2r3JG!OGvztEEfFd1^Gj(VYlIJ65n$KOSmlht5g99^$nqx0cS~ORwl~KGeR7C zM#U2e?R};JOFK8h>6TzjiMY+C$;80f8f}>Friu|;s>u~oL0GSvL82-i5Hqu#to{wo zC99)_6(%kyvD*V$K0Shk13k>(aw9PRb=2g(UMPLsA;fndJOiqAq4@p0FI}~fhs@6V z(6cBF`>#i0*bieku(OK{zi(%?H#oxf2Lti~_Vv*{)|Rr22kBX~MF1iGpe zpk+=SaSXgqdNME5sc-IJ<9!D_5y?58w5vF8Z$CbrewV3C72;cOsKKbyr&s|49jH8@ z3?3IE$xPQNrk{U05Oyh-XCbR7QLATOU9#n7kGIf|ET*2`HV|>4wUB z^7uqAEb!k7g^e z==1`hRbHQ3oV!P+I2^&Ay?5c4zZr~=SAmpzB{R4?7DIL}q@5iGI1g8X*pdeNRA(04 zfyd}{r;&a7b}}}*#Q@~Zfp%9_ewz6~)}NWl?BYB#*T<)Vx|uR@lNRC5nl0euqGoF4 z$#vzX$G|p+cH9wK#LT-^RcAC~7M`4>NW}`2VaT-(b{}60s!q??!JNOad?Ux|+FVck za^$d3&K%!$B|%MJ{3V9o~|csmL3g}Dx?)B%%L@BB{}%{F;4w28c&dH zs=O|i9W|Vbl4DkQhxdZ4xt>Lod@IP5zi#y1q$?;{qyRm~SEI)2WAI1T1h4Jf1GkS( zG0mGF3?7mUk)AYzUm7Y&(go}w>AEzoqxS5h`^Gp^`#2tG`bS5uPauki63Hpi9pvV; z{jgKb7Ci*>a9UzIvR#2N^VMFmytNRYc;BUQ!FgK7#kem#j7<0vsG1a)gd6<_IyNYDpF(JQ$=E3LEvv|1aExh=pXxd<#NE<|E zW6wVe5;lK3&Ua0wMt-jF>1aB!XGXB|g)@B6kYw(3OvjY?ozyDjI?4XDjTn9?!D@eQ zHgB57F@6$onnfvIevt|Do+d)R$3m2}>!C`|W+GL&L}X-BiO7uU^ileL_}gkjd6{q6 zPsjn%$|i2_g+#huWCsvxP{yS1P+cvxQoV zwc_dO1Tw>BDcNbj&0W7A1k&e)SK373a-ArwR{TUCn^X{aDSPtzV=+E}sU&IVIkbK? z6L$Hz<5%-1?4L(_aq-7fSikZR-ck9FZWb7(Uu9xZa8(;VR~O> z+@!H(y)4f{eq9=ck0QfeRbbIUrM z@&t%F$HbkyOc3ASA0R1#1#p3!22U*WT197RyE{eB)J>xX?vvSYk&Q%HV=?EgDI?OWPGD3?4Olkp zrS^i(cs)l3R3nekev9X@bz>|f_&eZ?brZ>+d3#x>fYoqyW-8}c7Y37k3G}U42$+r3 z617VXs4VxDnPxVDJRgv!+0Nf6UGsuAF7rYK?wpjJ>WDKVg;3pEoF6=?n+%$t1j_~H zsQ+OBd_U?=bhj)*v+Curs_+^VwW>nwoBg=*q8KTWTu95lK4y+bsDV8HI~~08hVJtG zLDGMP!t<5U(Bzm19|kYc+)LG9cTNG{$Ec9Uw>xR_JRMV+*{SHBD}z&BN|LLA!LTc) z7F3>z@w0P3U=ha7;Tn?$EJtKL0c~vt$D+4DG7mTl9`+z&64xvR4}zKOWC}; z;Z(qIA+h?T4{jlupzM1d=W2~&_iS4z+#`eA{rR=72jj@hb%y91x*1H9A{bA{)%ZKB zyY6qm6Kv}!A^$|Az%TKEmz6BA#a%8YltVGSim$5CvZ^U z_~tX%x+#Y^_n9QeC~cL3*}G4J#)@bX+mVA^r#7SVNF1FP^&U+14q{L#l7AQHa_nnS zJT3T@m77~dA1IpR6hF@W{6vr+XmOqDy#pd>yaHC0T&M5P>?it~KcM4zI6>ZNkofb9 znI3Z3Xx+mW;;R3O@ZTmw<)>MsNgrr(uO4sH&TbGIS4TgaJao3)iz*}@F6x;RyA>R} z%>5g&7%hXE5-qmJCjsuns?lkytLsWQ{(|AY6Oiu7f`oYiU96Kv9dCZ7CBFly)2}7y zJKo9j3#*`#0{e;KAzgT;_MMaqM$s7iJhJ&}IJHkqWA9oF(UZ!jIRAqbKDwQTx#hFS zjA>C^H@TH=*Emcc8!sm(!+D^ZpGNQZ_MwS@H0~d~fbU)`V+xCnFhN%e#~kW0=(`0; z`*oeLV~yx0UPY=>N9p~W0(ks9rviM*!Aq9y!a)NarqZPu6Mi|Nnx_Q2PD2q*9{-1n zTy5d#zAczj&)sQ%&5GBdyf?uDmOYq>CZ`tu?> zCS>9F)J4EQ!Z~YlXPH*mkHOcbG2(oC5kx;s;rZ~YDveYrD_q7U9us$?FCh~jKdM>?3c zl;y|g!kL?6^tAFA`^ha0t9N;zsnvJFD^q~F?rO4I*N0YhUxK$Anw_0fyrN?<#2I=Tn76+-CG`H!K)Xe$4|JHn=A*b8fazGA;V2q3(DM_}%R zOLX(e4D@}v6I4It!8Jhz%&pPpKQp($iNOh=HubT|_~Zh{;!6c7tLEN~Etg1EaSwe} zxC@(_r1AJT;P9m``owdPsx|xJ=9jjlEa*BuD4<~J^O*h_KY^#a?oj!XE%12KW%BAN zcdlJ{iOO$3f_kPw#N`sVV|V&MLeCU}T8;&touG%Qc30rS*&5Er>Pr;_BjH?22lGpz zlsxyp$$K)J;d~eJxcR3T@Y{3XUwAb5=l+AH{94GdoyXcqhSE0=RKUJGmz~2oY2)&? zkX<@KP@L;eTp}k!VBu|aGj^xx1LCm%cP{<>3SfLx9IXudh}Z22Ff=)V{=A+DlT!OB zv08}EnnA3vO)R8HoQE#|WsH?zG>Ulj;I*!NOpD#g`<0#zpPQEfQ#rx3y!#N;^ZS^F zhAz+)sHYlj4rKRpfM|}Rsi}S$mRM1$B@zvn%S*`V_>E*q$`$-J?-Q+FYlHq`+fmlw zHRgR>TNgFIn>POAQ=Ki!Fqd4Tt86quZ|i(AcWVh85*a23SNUT0)EXSS63fob4#xd6 zR^bqbGu9GNB&%}o5SyZ4vcy52=FZI~x&{(_rMOe%wdQT$m5tNZ`=cZ;xSZ@Ye?==f zj>bkaYy2=d4YIVCkk?Zr2{(W@jo-Q$74I#k*Tt1FVKaw3a8t&gf&$dk${Sm31EJSS zjI7rU2hYeeaA0`~Prfq&s{V`;To6S5>@8(?L0?_1#V^>nUI71yP@20+lg$vgNSMiX zxcsgV(LcBedL|T;jA$c}oWgNg3U6?CXBU$9teBb$rQ-T(17M1kP|+m-K8D?+opvHv zSGSA(?G?_>TrvxeF1n9HF0XL!{aiduIA5kp7EF_w3bW3o;LL&VB+EDleCi1*OSTZQ z_ZMw4(_-dyIpU>!Iks1+k7}rVqvIC`+0!21Y1+QGVD@Aat(R0pDcy5$@9$~Y1oPmB zS0hp3FQ(U0t;urJALLtSKXbgB$x38kZY+X2wGNdj<4S5W?33Y1BLXIa7X`%TpN#KuxYIyg4#VXV17yik#d*Mt+Fg zN)h7n+>+3F3y`x&1zElOWTo6G>UrlpjBp+rm4^c;x~UHC%}#{p zi6&tEw23yxx6t;>YjGv-I3C>ni-cKp6Wa(woKBj^H&p|g_WCd#+cU!cUD66Q!u1@_ zo#LlUf8d+^aop9Lie}qiK+~}sWJm8UOzIWjmsib%zXH3+v+aRckRwKxI9?*h&pl%o zbN2|**B{8H{)G_Ve;v0yj&~(X)mZ+2|fI`UR4}A$1|fjeVy+ zmdZrkB87?X4`xnHNyDfKh18+C}JH89Gn>E(RYE z#m<2FxZR+OKCkMcs@G?d-bfpsY!Y{ueVz)^rRGGmt{p3S`k3CJ6!@@J5Vpij1zoWY z==1wX*1mp07U>AU^)r^3_qT~S*%_MN{=&J?S7_n%CxrCboFl(7y};OaDNZT+M3+Cf z40l*fm^iDf4s%z7-p0k`Rm)o;wnzfm7X>3e!9|=3fa?i7(MJtOVU|M}m{UVmM$TiCGUe z;KEZuG~}PCX+onOT--Sac(d)v!*>ycTe>oqKTUAqrfSm1aMPYM=ODu95^nC+fsIov zaZ>wb?6i4>?vs*nUy3~39a&26E=|U>32)hw^Ksma-U+v~%M-Virl`MvCQN-OL$16L zr$Wy-mQX_j+i}i^X28|g!Z8eF_%_D-vY--B_uBv^-ZCyj#A_Fnc#U>wOT^uexOva~36C;0i*kONPqvmM9F z={2tRwzWNij^`KRm)WJP$~qxFUvmcB(#-(H5MT1E?IUwo7vP3<7ICpKr9XqR(Cle6 z?Ns#Rya~eOl;0GLd}Rg~?oNV9?uYd({u zGj!o?oH%S+$GHbzM^Kf~Au@184_)tyV);>F+L%xXw>MgYztyOQy?` zim=mg67kn6CEla4#MtmMJqA@|##1+F5gDLGQ>J05KevPXbByvk$*TOrI~KsvLmaE8u7akiN8kn5T1YiMgNr8o!5sb& zQOVGw&n{Hb%?T{mtL0qk8@(|j8EMDIZ}e{bXX@C!l(9^BDccQ6hdt@FsLRMjxakymRk)%Zje>W=q2cQSHc83=752?S%hd&}u30VG z%0-jBS*|p&yAp3D{~;ZwN3gN=6aArboVh#WFMVqu%Adi>!R*VLagEjx*}7Yb6?6JT zZajVhhXWV#xHCF)9PHf)uRa7ue8Yukpw2qRvKEraNNchLUfqP#W{}z`G(aASaJC{ z`UL;rzO%}>rEn5eY@Wm2)#rlu)a7WyxZ@iAT}*AvO1hNmgl;{t1+FiMB9CqfV_k*~ zb~MXjT&5k|X){N6#v8>?tOosKCvn;+=L~(<&CtnL>kMZe#H5+8xcfl@C>>FQf)z$| z{#B$`v-{Z<%tU;*zY^QL-5^tc1`U`z4__S={)aarbW)mH z7D>8JH{+ea8rJ)lANJ0TBe!2a zWg)?hD_F-l_c=Dre(I2LiTvoT!xpnh2(K>TJ@pcUR~#!{!&4FWYkg+I#LGcWcoT%p z=_kQ=u3`4I47}p93`)8;QiXrwIH5re=W+eFsFZXnq`VmFPcFxSd>vNW|015!6GDaY zGbGev3btvkBVyY7No|ukI{(e3eyh@;$t8kD51#|6f*5$5FAaQU?(cOC*d+U-SW>Kt z_FW^yWw|?9tFRXK_@+bZQfGYR^b+-#PJ+{woHl2;h4tE|f;PK*a7*cA{)L7h)O}Y@ zkBZL*4=D$F^X6^p&D)JZvjbsEx&?K;bs25*n&_Xd3Fx%f8hqaQ63zFy;5P9E6#eQ4 z!%XBD0}bA>h*%tp5HC>=5nNAVAH*hdxWbXlJv9nsFf$?GI( zfAa%OF*AhA75)&fs6!R@8BqreC*~915c`|j*u02iJY{@=vXw?4;7yq`UI%dZITdEXtVIbh9En*RUZPKp1R!g1SDzVTBx({VQk!w<2r0i1K zB9%zQo_~hjKQ7VCl4SZ^E}yFM7NGty34VX)X(+AW6PF+xZg(h-m%Y#8A!Spt+h-?e zdi`S+MBO0!mIpjOuS|l3s_;Mc2>2wRg2Oi4_t&ByZPis^p;9S1VZcIl(=jd|wg_iv z6hrLqeB#-$iReweLqy%SW1^Hcnx_AxH*EsB9!?{1`zM2nRo98^$Q&>*OvjtmPH^;% z99HB{z&{2Oq?H|JzwuP)HW>@dlGkRnP8rqZ);=J%dFvs3!EsnOPDuZPWAwm(r_e7r zA5O?O)72RtspfxwiF@`Rwx@WQc3GZ;hI7iC192_RIU>z3lX8cs^@qvH+wZ%D$zigv zw2C@8{YPHjIEYRs$Jw>Vx;PI1)0)_nM4UEn37*^+%h*sh#fZyF>l{Z?2$Q0zy3D~CH^dcyWLJG zduk&8X-s$BuB9UUru(6&8@wN4%nxJK;5sV*zJU4f`4p7+P)?ny^C*8!+5Z%siCa%y z7ls=(Nhm22siag2X*heOfixjgNkxi8AtE6(sZ=VO)0_qs6-9OSibkoV0SyWXNxY^q zhVOiTf$PdSzq9vR&vW0fA;FCGz8prSr^K`F4%exC<{UWv(T%Jz`#~4lUP8B^uW`FL^>6HFPCOgKJC?_>;cgQ_ncwt}nhK=&-(pPM0;_6Xd0?95 zFn#cRg!=I~}xtzXRk)j1!$bF@*e_ndht{xp?Q(Fj zP-B{%V(~#KuxnP%fv*}R#AjfP%xuyFbH9%SKFKg>urQ6tc6=k1vs`dyLp8nIw~jnCoKAoKH%jWlr{J2WtBB3B&qQ~A zAraP=2H?17*1S`(tTKbF8#)U@-?`_k*$dm|%Aw@B0=oF?GrID|4YW?}AbStYp-+Qu zgW)cI++=VV=PW&pQxjvT+V%bHk^v`N=NL=MQzz+FS01?P;LnaPZ=qKOqQP@A6CK)L z;()^t_*ZJ<3O7E^sXGsx-=;8DjVbWq&kHhN*#zyv7uU=wTZR3Hme6>+$K>al+tmw= zD)4<&TlKgf7nLasAqp2lLAB@&I8L2TG}jccI=nI{yw(9xP+goWSi*>1@F26q zHh{sR!_1@Qk~DJxFRS(S5!v*|4lawu!^iz=h{-xvJk=RSd0hz%7EZwLm@6F9OcgR0 zd&5GZK)P>WCMY@nqHM<^!|qug*mdzI5pBAR>yKSz61Q*;$C!h-VZIW`)#amSrZ!yn zR)itHJH*mE6M|j^VacuI2mR*E1DtUTmh1{DP>Ds2}rZ zVG5al>;G=SVz4fIkJi_I(ifbQqb<1xv*zrg%M5uDGlvM=&88}yE^y7)m()6&G5xp2 zaHpCk9o$;WT>Z$+?DTmt_u>-}c%n$_h%t@68BN#CJAdw3r{DF)1u@9^l;=&I5PeDRU= z_rwg09#4Z^*a2h2!z1yLIcazH~4Ok zJd|GoG02Z!bse$E^@UY43<7S z0G<~UQPENs6~l(;u*r4GV=zn?{}aF~JldfCLf+6tSq;OB%TQ6z0uDLU!itV})ZAF1 zM#~KhiaRE_+~0M)`(`P5%(14WTCP-oXDi7nL2d~6EQ{qiHVCh02(SYN_p1XVE<$JF z8c2R%$oh=Tr2k<8i5!}1`1chs=Hut#CSNS9Pq zCuyo0rg657NQ3g|fQdJ~f2I#%0O z`!n{K*%^t<4NF$y@HQIw?*uj-u|lWUtMP8_Def$81pj0$&}Y$fQZ=`nxL^0eo7PL| zy7yPAM~6GXC#wbA6rITJx=H3kKs<)tPsRChk|5lfK~|b@^H(>{SHf=xx1J``;GzPK zjd_MWC&>#}RC(cE#$vdAZ3nvL_8Sz2%m7$&9lwnIrW^l6;$rSS-l=X*wl3WX!io{# zW4DZibb7$h!f`JD^MrmX7pTeJ!;tIyvdBE!bnxWk&WLvt@IcyQJmFdehRfQ>#Ha)b zQ|JOxa+Vdl6AIor6KK+P2m}+I;0VtOSYy--&(6IgO`i{fi98=%bVc&5?E+HecHoy= z4~|dwkW;p?7*1E*_P+ZtR~rVGKPv!I(}TXBIvafExbc z>Ln2;K;oYxo~aO}H`GqS`KR9G^zRFloV0;2NiXnMpD~(0_=&Os*Ky>J7>Z5~5VMM` zs+LP_#Q5N4bR`a?=cjaa9e)ZWxe2gm42(#NcPM;FU&p+7{+v;-jAvYWkAmF!DR>}6 z3XN8ZL&47+cw6$A+4MRX-|(Gr`pAkV2D4*lKnd_K9*X=E$w2Oy)CVVLyt3iu<9&CkMh^cx(1^ z^TEMsJ;-Z!k7j2FFriytk^hd~1o)~+?Ass0On!edDwF{Cmh2*Dl4Ee$=r4m^C1+uh zM~P;dOwilyDL7!HgXgvwxP8D89$-LK?v{;2EZu06sder9} zz4w-d&X*!sh4P;JSPu?z(dZwt0%<;;372NZ~bOr4bMFTy1c{ysPBjbO9XA>|+EEf2JK> zTKGN9k37CN4cvL^Y5VC0)H`yQdD<3*8vIEJcHI1!k%1d0JYeAHTFfn2i@`sFIOf1G zNf15>@_|ZF@^v@fj}C=*by>9Vnlb0`u)`ILi`n#|d(>U^3pIT-h~_*q(a)!~+Tx!Z zcvXI;m3oqf3Hj!*`G7QCFZzn?`nR37f0Czl$HXxBeLM_!o6(X(O87YXApE>@m)uz0 zMUI!0=h1J8;fW%^CFx5yE8{=0`(T+YfoWp0gptsfbc5~gj= zpR4x;XVFD=muR7JJ)2e-LKa44;NAV)?3X(inHKv(>l_#QdmxaBZmXl=T!Pmkg_kyV zh~UX?VO%wCjHMFsq;dEbG;v<}BQu7`CmwEhdN7Keoph5dG1G*(mg(SlYM5goaDDra zTjBMq3wT?C2YhQH@q5-KYN@J*$y|R;d2I|$O!uMV^G{-&gDljK_2S=$hpo@$-?$#i-%&w;V zuNy&Dm#60U6cY%q{YM?r_F&A63HCZ)5ncV_n!(b;GqJsOJr;II;aNdrI)^6*9;uZQ zz5SbsDVI<5I9r5?{Xdx_K`U_YXc*_2;<8FD+Hm>n85pw9g4+Wc7%8NV4zqj=@2}bj z=ci1E>d{6ryZr^pdu>FlkG0Tm@4V3X*?&-eY7Y)M^U}MucgU7|jRvo)0fil9;KP-2 zvMt1oWZ7P(g$*}B?za|1`i8*qiWyM3?l`P1S2?yQs*sce<@Orl{ z#J3EQ{d~fP6Nz!*QtBap5L#50k<5<&NY<7EFx+<A2mw`-G> zU5>4~!t|B62jt7mVv=)1NyHvwT(Y_qPd!_L@#(AZsp?%a_NW^2M!C5{vJpG&=oj+h z(>*G^HiW6zw3{C4UkwYom*BdoC#i_UL(-!-MzTIXft5mDDEC^PIVIVGYq{_L;?R4< zERFNW88}0IkUKVA6T~f-ephGyxI#UT*P=T3kqx2Qba;~@e*1R|-U-Yg4RgED)+h*t z?|71DJgKODd^R-ksl&k@X@sHEs4=k$v!9id(hq9%@=K0Ep&v=}WBi%=EgdxU+69bV z>|R~j$OoN*d^O504#=o)!Oo#zDlS+-O^c`Fo(y?>C#DVChK`dFzjI{2c^mPu@&X&x zsdV5g)YvaIC5``WV;qmgKxv^Id7rQWQa@Lbt6eR$QCpuz__R|E`#sQp>^`f`4AQWm ztBm&S%lKZO5yJ5kk);5_8;OeEfq=;@Oi~b(N^oX|%CWL}LH@EMr;75Zs?u0oRfws*GFnnt! z26fKHJ&$%$=eyeUT}K`Us>ort_(${#_(nteGf}vIbJY{yjSzA6BF?Sz14meZITtc$ z_sksj`lmej*xXF2)=T39b79=;-$I&J)ZzCCe&q4o2!Bu1ljPKgq&~Tib=fL~8cOT& zqx?l|$o8RAmEA~k{xGJUP(knF1RPk>hmotl5%CONSR|~=?LrRF#RBv2AP?Yu?PrX^ zU2emEL-&Va~qisb{H7%%mZJhwZ+X4e#BV91eTn`@> zDdLdDYqCoJ8Hs!#h0e0i3BwnP?857$h0DfI{9X#Hy)SYO3mqcK?xHpErnGidG^@;S zfPV}s*v!=&mtoQw{~Ru-XIw(i?_w}15m!d-2T?F*bribZkj1i0!1%)BtlsBDE?=OE zsUg#tg_9yRJRz%4O*MggrehenUlOom_6VBr^e|gL7s2V-^Wf>B>-Z)(8{20r1k2!u zR8;*s=$?K^G$W7G75h}MRaFH3>w3rRG#+9bO1HyJ6IrTKc$@gSIAO+c3w?f4jP472 zP8)}nsP(TrIC#IOY7f_oQJcw6(??UmuPUAv|B=AB8;elja|P{)--B08KEY9OV-j$y z4>arTa8JN>dVOsmIz0(szP!A^TFRNjFrPnezY+!IFS5CL7#}WjodDCH&&kUwL!4(& z0D_&0XjC~D9+D7vZ!A)?^vgPWrRy>MI`b%gN*czlY7tcVw-7;oGi?e1nm0`!__o%P z4Bu=vzEzJ1S8SlRqr;@h)&u2FuLD@`104$%8`_g&;CUmv)yLIj>5nso z%={G`6DUi8nHI2`O1I=fl5qga=d6ScZxlHv5<*w^Bx^+-K|QjP{G8yNSy>gVg|P+3 z7v$3K3w=2c^DHo2u1t@bkHIkoIWl{XH2!UqBY!0#nFChbe5$7j#qY$>{U@f>{ARw; z{MM)FJDZym4{s(bg`{bSR6n(s;l~lhb0~Q#0=_AE!1uPlSZ`E|_TMCFl}!be6ueFU zcymsslx5`J{J3gO;UK&dbc9^}x(4c#_hJ4oQJ9i2LiVnxBq#Y>iQXG=qIfhAXLuOU zwJ9Psy6w_f^Un$6p6P(i@?>Uvln~r>X@sxMmGF#~l1E#v(T2x@@bZ`hP|g+Qz;_M? z!|Iqb5B(ud&j_-fh2X0bO4#|p9twEM4La|Crb+H6peJyGgnPC#nKOE^i`5{aty@5L zjtj)NEP>dlouK&G33{q7fsFERnCi2iQ8{uQ-)BCeHCp}{8&C$9rY?Y(_Z%-GK9By= z`A(nuf1;*=lGRstyrQqIZi64seNbz>h~BII0?ar;)03x?-q&yO8WTii%j1YiWjNQD z?V)k+{SCY%4D>6%6~U5cYp_=9C!5RNYfn_9z{uf+%ow-ZO;Wf_yWUTOU}sSf3>K+* zCvu$Jz2(4oO05Su4S&eFWDP5JC6Q|@LQ&5(5z9Zt5iR3S^rMVmO^ebPEp-V+Q(hBV z;VnjwpWys7CszV2UI=>qGvVm#NGQvjg!8*6sNjkou>F)lNhYu1yOjq zgWKKAx^3q4%6@|1J$d0(v_8I3JWp4|?;x7xTwkNX6Jw2|=yI`Du-)B=hV@Gj8!LH? zuC;@?d-mb;yf(~OA&X%#KVXjCGCEilM3;}ug9{12Xx=q<%x)=T_uC}WjMb;G&@PXf zz1;^aoApq?_7m_= z%pQ1#T_L+yfS={MrkEtXN3!R`QO2bUMalRmxQ%-X|31+3{VWgoL38KI(Mp&C-r9- zp||aL$NLbB4ea5V*@xgq(KLA577ypgzme?ak)*;^7XI_4Q()HRaOmad=D;HQbX|};JIml3NqEDOgX)DC$R1)` z2Zfm9JL~B&uNaQ&@{x{7h}NuqQ;%&0Jowd52*%2%Voe3d{5jXa^|lPCfmAz}2Q-26 zi)UlTt~4@p|0ObCvIM0>n(3MQ#^kMZKPoA|B>mTNu=0l=b($=KUk@t4I_(8byR{gt z?J{Avpa6^;-Zzj5UxvZXPcbO=5{`0gN?UsZb9^JvXoWa=H;WIwWXI`mD(Z5SFwx6pm3)doxS5OC`IMLRQuB`-n~Yx4)EgrTpKP&bsp3+YpTyj>B7td86<6c z7AW3Jp;lGeFy0hS)*KYT&6&$kp1H&ALIUuO=o!$T+k&4~^%3>!v*C+KC;hp%m|A`N z$BuN^ad+z^qG5UkuGt8YwoQ+yMO=e{``avo@w+pihWjR|oUB?T7|Kuo;WO+3oBiDaLz-{GoT?{bIiG%Jk(zUYCGmLt!K}} z?UT!i{^#Fxvi>`L^k52(B|M_y*SyiZC$-9V%^dvG8%7%h#;D)ETyllW%$e-+gs2Z! z*w0!VkJ+84rqO6MB+jTrv6V8g-*Xjs?pqHDRWfkzsvLtme$e-e7^->9j*k5h!0f3K zm>}^5j7@W3%iArmuQjPUGC-Z3Z?p^Aj#&`5N4eBk=efaajh*Cx=`FVOTO0FGQUz+4 zFU41PG+>3(G{X&vb>wS7Kj-<1G#EH~nMo~~X6VjS1ap5K#?(1W0F%AIC*uw^(B&}{ z94do%g&HU)aI4zs&<(VWKVO}aB?=0m6|noG59~M1N6G(?-skp_8#<*>G~fvAKBK{0 zX=Y&bkTsqdyM!}te)PRVTW0d5|ATL)`ha`4o|g1|gcV za7M*|o_x29TsW$T=AqT3d3+ZU`z}G+qnD7S`V%CxVUB+A?g!+_jjb^G<^z2lzW_Gn z&BrQuMAps;MwyjTX!}JNvfQSS$>8Tq^Te%cvnQX4#Ug*q8RYta&60+wDh{Qq46r8F z8JE0J1fQ}P>M5i~cm22w1&%EF=hjLOMX$z+#}U=dK|Q!~Hs^_$NC$J3qgdc#L1V>N z(EfF$C-<8dvxMv2$o6pg%+<($&T`1aG9NgsdXH}>O-YUFH7cNz4mO^?@ZazlPRq(iYPAroJ;Sib zT^p!RAQaiG#X5tNXmdi=@K#?L>p%P$yrgI2g8K?ES)0M+SSZ8$UB8((T>oZIwKn7T zH;S%NTMl;z#wdF(n>ni1%G6(Vgl{1{HPVrd^!3X*c(SgZB*;#|nTIPex$g$&5o*NK z6HDQTTO(_9yNDzOPX*)tG}L;l0&=CkxW4iNohlZ9JDW^E$G{ki-P&L~|5EsPM#?bQ zx*W&+MGdtx6YzXREJRLQg)?QW@gnPsyQf6pW`%Zy8V%gkDnvR|bwE%`7P?n*dDJq0 zGO;p?Hp>r_Jp=z}t@s8AJN$wf6dC}5vK!=yb1C`Fy@Sb00w|xx!`wHRj}^I&C|_ZL zy(8ujQ8S3wZw|1EJykSh*=IUy?J^>~iMv}JeomgdY@rstW1x{JkC{sGkfD17zw;7~ zJEIEU|IUT0j|Lq)zQc;H|6&0buC1jB z7dVD&ST>1~&&HR56->2xA8}T-BRY5H!@TZ;csW@ds<)?-i?0Pq%a=0t!0>8F<*^{? zX7_OEC4V~3PDj%QA-GpK8w$nhNl?%wx@CqWC@7?pl#PBQZ9yu2v5F`98uD=Bo+$v0 z#LlT!c<-esEs{$GgM}v{y0!>cKT!k$rSr7c-klon2!%zO=4iG5GD)7$qIsbiY@uri zDuu1VN6+_z&bLrZ?wScn4i_-xXdiWWR>R~QJ)!PV$y8_sX%2PXA+aECt&_NmS*1xB&J0%P@b?5vJOR4P1(b6Y2A0? zJH?V?6t$3J`+K2i#Vl0t9i`q6Z6QEt1?`ncrHVH{l9yhkT<)xq`u}YvAD7)AOWt0i z>o=ZaJ=zu!iM(LAS#k=awO51eTQ@RGFoehkA$Uc9BDHPr*b7ZQ$oT(85wZ2K{pT2! z=vKmb-zl)ZTb|=n8#599=0w^0HCw*yC9bo6NH;nkp|>~bkbf3x^j72o^8MLQl5LZY zR}Dr;|DF{3x?>6vch4dox!1^8Mg%76aW2ChX{f%+k*sPt1-ts*kjTbepl~#q^6WSP z{I#w`^lcB$RnWn|d>YXDBM6@i-ZRLsT#xxTYjJ=JpS@fwglCoINod?CE$LN9t(8yU z`Nw#8-nkDVfSaAR2jKoa6*S#-A6B0^2Uoh?4J@uYqiAy%-Lb=&ly2;Ts?>;xjeklr z7iq$D6$9qh!#3QawT_UTjWqPw8SeKe750U$CaZE6lSe7>xZ0tIdw&n2j@Cf+<&oWwq2FEozk)7Fv=Chy5^y$E#8PXH5dLnsM5%kHrWgv+Xj zk&gSofA<9NvCSL0c#|Z^s3Q?p>7f^kieR>!h~dCS9x6P35c$jpn0XD;;eD7o`tyZj z>*F)folr}BOx{uxavvUBq|j>leKc=w4lKNLvbsab7mSau!YO$*IJceaYDTy+y~W>u+gwSsFZWS}hMJEm{t_7*;|=-!_PsqRkbYnuw$qRWuqd=tlGjiO3F5s>^@pQVSHg);rSxLM2eLKt z1@p$90blp)Bymb8)<24-y2mETs`e1_`S2v^5O!m=xwBuYAIGvU8?7|fF(h~RWzq*zyrgQja5#{tc7o zPd<^D3%Rstrv{msJ4g!-iopK7_u%hSpyz5E3eBrIo?4+0j#w@M+qR|5w{8=>V(1UM zk9ou6*E`q?Cw`LQ_LsCh;SYIcG>^G^Ko-K+MboKmGQ=)!F_mtR#2ee4u!ZXZNOFI7 z9_6KwXHy1YCP|o?>VUXGiUy7%J zQ%o%90}RB9av7+tMA;?p0WgYX`s5#od#1qJ0LJKTCju z-9PAp2~9Y&y_h_jaR}cwD>HGNhjg9Q1>nE%iTDgR(|(f%$QId;%&-oKmd=4=Y0boG z_B1YspbQWDW^)|JeN19eFzgZwpifWpzdQWI$pEW8y%Kg|$=v!D-aIS<8a6MnIh3yTXAL9y=zZcqG7hpPD@DsnLy$kM`cD?OZ>_?VboZz2{mcEfAF zXw-Y#PN%y{)!c3GW*&%S!}R%=@PmB}ec`$j4okel;hDZ*nzjJae$;}3*)&)@?Kn0k z)=}{zyE#7KX2=k8Cw1e$VDWGj^RiSMW^S1T+r(`2^c!N%?R-sUWe-5Z!yahKOrZg$ zO3?jF5qdT3A+y(r9C$jyN}bNZ*@KB#= z`t8kNyHCteFMA5!3iLbo^K<7 zNQ$v_-xcvw;R3WwbHM0k2b4YFhjv~$l%^}ga<27|k-P(T^lpYgr4lR=U5Y6_CyDoz zc_@uWxtROIE zFYNYHVgFuS4W5PZl;0x(WL1PQM>-rg^1rF}U6TZET+UNnG7qIhLrBm+Up)DF4H`(c zFszs=^o>v=G2a!Q9F0S>&rTfMH2L^lmo(jV#7EI~&BeIm~;x3L@(pjg8;0K+pBrxbmE*fkMbBSi?NSf;|HGzBq`v zI;u}R(&FiV>i-#p-P=GPZpZ~8t<%hT_6`Kqh{K{O9Ctgk37#_*P`3Fhjj;72@tU2W z`QHy(KAc33G=3#<3D?L=Zvl8*{*=yss|K~9-cV+~gc@Fprn8h{iOk3{dN21K?D45# z{(CqZ&dmKpKja0`yJ6elbkZwoxW5uyhvtx!S(T{pLyLY|_nCa(`HB9$m&kl;_k>3A zFwlL~OzdYEVmtSLQ_1xu_^lQ2T;eiPd+HF~Hm?n|CHq<1b066L*id3s_=nk^&viX~ z_mVL&V_c9@!Ey7h)6M#qY44AJRhF4QK~u;CPkLP;_w`<23QmW#W#d%i$Yx0FQG=Bt zEktjwG5t9&27Fw#iCrq!r9HHS9I;8nAO9RsExH`-9eCk(syNtQJO))&5m>P72}}(c z0T<<^#4Kox)N%XyCaZilu&keK^zwr(?fK|6sEai&Ss-iJPlNjTahIw;8g92I8wVQ5 zA)`fTktAH>QkTtW-m8PPBXM|L)r53~tt1x{_{n{X5W0V^FOffzMa*MnGe^slXn;@^ z&5HJb+*j!s^zRShF*n410efg1*-14tE5SOPQmveLoXI(%rN+A$0j_hue3mt*0$)Yi zcj|!5bHEDi<5X580DQj5fW^2ym2tC#>Vqj*WM~Gz4o)Y7PI~y)K^BAYG%ao{XJwy{ z(dkn@G8GM***b?gRrh}_NBPznAe~^XU;Wt|<@#)hD>cK(7;dMsDg=(+;#{RF=|s0g zi}IW~g{x%csekfGTobDdKA$&%mfQ>UJUzhdUv-V%{AvtGoaRA8oh-6h$?ecu=fsoSFiBl^9L3hHcFf0>j$j$Tnxv2jnmzu521*U##qpD%a(g%a7^z3w zt@;p~G6jD&xiXhJBDB%&!qP3FajPJL8GO?)-4y>P6Q?$$%_l9eu z%-U_>R2u~Ib^bH>&$^B3>>VO(+&q{%EDm=|1aRYdA9Pp01C{EV@Pko4KtpT97p-xKFJ@5U8JWa+8S zyJYWfj%gm8fuAHZQFNm)`fn(ugWqOjM@}8h_;496Ug9!KMOl!$vjDb|=<44I_rcOo z2!8$dhx2?C((Ahwa8Gpxk-3-w|5hf#$<`DSUpbrJi+>4u1Jkg1o*F%1SAkiMYgo~& zZ)9H0Upn&s3t8!U7Y-D^#RD8C)9d9mc>iI93Pl^kbD4Z{{!{>r+wo9a&if>;Gs$t= z+VGz2J-XfW2(IHejL-LQyo{t=sHsz;oCIcYxwFd)zJ1K#zEyqERbc@a04=Ci|t+n!Qfg*4U13k9k3A6-X2)pCq|F9 zvBY0O0W|HSnYgnYKl5rL$?v{^E{|mCX{QY+vh^R6m$DNM;vc$Njmw`&pTyZ6S0}A$pCj(K2i3Q2<>=BKzMqMSMx!5~6 zJK+X~JL}OlDh^fdm+68#w`p)r0e$ceU`GfaUfgbg-6hLW|LX>P++{=Mmd3!dgk<*A zu6$}UQy1RZn!=!FG98$Rgg;ZK8FsXD{)h}KW=X0ys(&rRrzf+Jo_|I+`6rO&6@oa; zzXc>(rV&vKdoW5r4q>-0z#>P4xPd^>2ulacGJwCqjdVzCK5Sfcfdt6iMbjU-H00ML z46Ag|pJ%;^ZdVpWjM)&26_K2O@ez4H#^v9AWr#FA%~X`9l4ZJsL}S)Lcw;04t9|lG zsBi|(-seU(zs(|t=H{?^A?Hv;P98r-5V%_931UY&aD}B0_-(DH^`08w^Tv?#|1H4> ziCQoqkOhNrGvLx7FWSe~5N{6wHoxE#yy6oFPyTz=#%Fer(rtTSX{su<_MQjl_A8SF zB8xpKI(TIw3iM7N!qB{P;L@^_rshnes}psQ{oYJwzT$TJ?#-~{?mrs(WM)n8er@)C z!Cq>7e=0m&-$BLZt%L}dQYxa%^#FMHW9nNCbhSPUT||%GJXndIX?|?y;rHb0EG6Vi z;DPJoLp1!36sdNxg2ZlP@ESR+e{CP}zKQHuv?MSj4*ofom*W~h1*iN?S8^}x$pmQ9}72)s%GaPfsGNhzr! za*wCO$*84Rd_UJfBG(GWuLO}E&TrB1YbCz@M4*c-Bu>ZwL>&QUkE z+dd8*Jf-Ls@l58o@n=#il!KxmhCFpnAQ=}x9feEb>Aqm1!p)#goSx6t)q7&xuIu>f zI5L+<`G_jv_{Woa>=f6JMBcU-cwV`~kNyhi|4$8fwJ!(Nc{gD52U9An`2*i_Af$tf zw$s2bSLs_BhBZ{tgk4TDDDht^c~etQhNATh-f(k@@!%o0d6JNXt?#L2wj%^AwL?9a z&+fk=2j();u=2ew6!xv41@9S*NXtdvPnz&xa1l=1J4#wwF4N4{P9W6Ph_5QIkqtV> zX=;!fN|(=|Ln3aV5xxM<)eMr}o6dM*rWc0TxFO$f8`OQl57`NSiNls0uxc!zn~Go2 z-J$nTcxxHkwSvnMEy%+wCjz+dr4JqrOM!Il0y>hg96R_IgOU6gKDNuC%Ua^VDC!EZ zg-Dv#eW2z$qx3}AaOX7VTvTc|V;+7orQu|E^~PfJ&lBvx6ksM+WkLnE@lo-RabY==vq))U4|OeIRrMY-@(dp>>zp z1v@KA@yTuEm6#R1yFL`HPCufNkG|0>Z;moHSCgvlg|C5y1~aR(Gp1JW{C*Z>gjT?z z7+H|e3WEi2H?b2fADHpVmE_LaPEs&^H!IO;R4o}iMnnpt$c-txsjyWQ`hA~`k7HA) zXYF0wkS-7GjTqRJ;io6N>K-&?Xpmp~r-H@4!&vfmDpmdD1gXN!RnKN5W9rg%IPh== zc{?aThw^eEaXa_hAQy&awx{SQ$5j&(Yrv7KtC$T@7g1~4d@MTU3^_--Xs*X<*5gh9 z%^esf$Mlt9I-rM(oc;VU8tQ z8hVGxHsKtQAAeA7^=uINI!Z5F1>w>T9q`Mzj>((E;Z<`H=O7bCUDv7Dl=qAZ9B-vQ zU!>{9eZp9_9c8qI$2XGiqm-V{W51xzEbgEG)eQ%O?_PQ8*=z_4i0~ zWE@0EtN~prN43kjDd4asY7KJ?@jvOn>t#lzI7Wlde=*FU=~P3B6AI9-z7&6UyTHqX z`|;A}JLKauH%MC{h?a@xsRU0c)taS3REL-1HtP+T{mOyP4Vywgs%&M-N9N#l_e|#b z-eIh(_az6mWO1w<6FU9P7^Bl#&PY76hCi?PYUaFI$=p1ih2N(6QiB7^uro#hK83r} z54YvvouDoZl*Lg?S2sMpLJ8{KMxm}@8(2wmY$xwjEL(RGUg|7CjdgWIZiWQiKdTtG z*`?F@Th(ayjg9ob8@x5sE^u8wwKY@F(JFT-EP+TgA$gfew2sr?Rq!|Bn|7|rDg zUB?Hp8xz5OK@+(+5Jek4zNU&6`BeJX3XHopN@wfL#-yEjWG_!A_1E7H3;+6HsA@m? zzIZvE8|j7FTN1&g+l2DJGXRy;@2sOqKHlO+zA^r;FYa; zR5ZeI5MAN$s}@rCOAt01%Nm{#xj_FoujTr^!ZkX+BA_pDfCykXCnXNUERC;^~c(wl^ zYy6DiPE{4=80^6d%HG&->4H(lzlp)NPFB*>1#TQ!K>zezskYp`2|n|$#DULo_{mBi zmR~Ez1=AAoO=KJ8eUt~P8kVRnK1us}lEI^O8?NKcfc{Ns;PliM)&>{TfTjd^JhF_&qP zbl=It@O9@FoUhP;2QQ{j*-vZfCA&s?YyECgaUve?OU=UoYkmCEmkzK0mQa@*6=D~| z<<33&nC)Q);XQu|{)o9t9~~2hR*Q#lR63ej;wVP;6f|PP11Uq(tfs0b({{tE3}<-$ zDFD9Y?4VIGvG}7Wh>DC}pivqYXbV9H(Pi1^99unaC%9ha znC07lvNOMXL*mkGs2gphqT6QR`M0%nS@<$?j?39uPIalye5j0zyzIg6`Fy4$F@a3l z$uqaFR6vhu3JL#QTy=b>Ecn0nCBHRq;3mZkQYdAM!dy?fQgeV7aQlppPpd)U<{KK? zJQtq)jexvL-LGImXQl?QSHDRbJ{`RT3BISG@=_f=zGN}; z(z%NkMqj~se(%Yj@b`r0y*pjSb^49g29cxcUF=cLJz3upj4y7_g7)5R^lv%EQ>9a( z(6o=7%DjPJ!dAemrTplzq?cZ~HV6yi){=Ka2bt+R{qZH&S4lHG#qAKIQ1wzCl@TwZ zue6VW{QI3mwP_0c4Oo9X1|Q!2M7Kl)v$lbp8YI?&x^!BDR8SB$ zo{U4@h(U7Wg9+_Ex1A{;)B^AHz3{#`1GYCQ5S`c_!Yxm5LEl*-IHY1&EuoCT$$+~y zI?z>OrMU6F5RNTA1B*T;Fqtur$?4B?u&SM+OV%4w{H+oGa&zB~-ex?{A4H9_G}sk6 z6uw4rEUzx98kcGivK_T}a5zq7Fu9rS`t$Bh(tz|5gC=87Vq=A-yzC~21Q9orP5T1O8w67`>($^59f96*L_{r^YX2z z1BlThAMbKLoaRTw^z;LGQZSE$%5vIzJs;FgaF+vL%dMF|T-3sN zNj8GnHUJEjX zvmnt%mwt&#g6Fb&L}eh4dUA8|hv)Wa9QuOYI>8?`3+K~S>Uqq8OAB$Y$5I&deM`fQ zyy&(-bu`=XhHAK%lQkmqaSG?((Yw(~>+{xO)4u8GeDpVUbyOqQgtu_L0o<(F&OOT; zYhg)KDdn5IqMy2rkzIV3zOQ=8w!3U#70(-z@|UxiL^WaRW?Dc-ixg>?t_I|Y?d4cf zA=GPCI_>LoW6i!VAsW^*$gJo4Ve7utpf9tSm$B(TTqOLH9)G_8^S{0(dE?g-+X&7d z`rtF%pD2P6T{F;IBbMCp@kXb}Qzl#U3~{2X3jCIQL5f3LAka;X5t&{~!@i}Hn>|ig zl(Y^XI0~3OVxE-O{2y_xQvtvJpJwH&9++>+e{pi0+3g`H=!mF`3{QjDt|GHfED(b>j@p$Z= zBMW8`a_FQx7v`^<29KO~!s^Gd;N96v`|_M%$43vQ=X5ys@H1iaJu!OAB?YH&e(DD+ zf5NG9H)JLYlWP%=@O_&KIt15{Gdp!@f!r+<-D!(Z^X*aAJe@$$zzbqkpTKx5n9t48 zIpl_733c>qC+b|sPLI70yows4D{l^(*q@t6Y)h-5*)oq_u@FXYouk-g@fAnBuW@&t zjby)Y5OZzD*j*^yKh1T)AV*Vm7O#Tv$fkvhpI4~EO<$0UzQh4 zn87DnNB+UzZ`Nd0q%K68h5&gG184G@hy}~(Dt~T~#>O;IV|>Al(}k)zZLRE^Ct2N> zikJLlh&+n(Pdq*Z6JLnX;@U)v6iDNiuZZLMwvh2W1Xk9hkS3uU{LzYZ8c>peQh5z@ zsagbiB~*^Lo?6nXE)~?1eMxsqT0^iwGdZ83i>|@pnCvePy&`wX;SJ}==6qFLXKIJb zA2{L$w!uU;R1f)o@@e{JQNiKHGjL*cGW+<$A{yX-3rl`v;p^6m(EnpQVDSVPV_cB+ zHiKo>eEKz~l5SC$0)J=QfU<)<75ddl{*-gK=+4_P??EuME1gDzWOwS(X9647j3d9& zR*~dS6?p2HF23IrK?b<_MBd_GRjKAxTy!#!?qyo2S@&1I<>8}56FG*s-9NVPaSSx? z2qL_@v+3mPR!nQR3)XxJL8VEd_>;?MwcUxtEd_J%(Y;K_Ox=f4eV)j=?Ij`V@r1QZ zVN*7(WrIvs!#-VrwlU@V#X=^TyLIfs|U z65!?|?wzUT(W zbszi?!tAZrnS*_b9 z5PkM5iT>Lj#aFrbgsfi@OpncE=;^OkaM!Aj9BNn(=eSI~?Ie3Td?gQW$S5!Y++2N_ z(SwTQRyuXK57qZLVoT6AQgZADmU@-Y6$k&(=xzOEl9C^@!XTWilCZ=0v>v=b%wS0=lXn;Hg71 zK>v+CwxA;Cu@e?3jE2Bl4@y-BS=iTM25Ca#B))!-IJ#t!-IGq^#@o@f|9&wE<=(07 z8-tj-O~TkeSrhf5v4_SPWOCi9E1;p!!ynW6=oipRtn$udXmt;}$AR0^ zU)_!kB?}?o`rwijX&7tJ37|#AV8JE_Tn9w+Lgh$ zpK2nRd97^S$WylURWt<8aD~WQ>!_3D08zivOV8S<;9^gXO&KRkgBo}Yr~ERimKi8f zn1nZ1kK^nKkBn8GFIlN-18%c#Fjv~Aq0{wH=JOp_YO>vj zbj>fN1&yP$Z8QNECo01kqgGOWln-`iGTDtU788@NXXzLDN>oY+Cn=e`*jKy~cv*Lw z*nIY6vLDR{`Gs1%36~SGU*$d9yF3B+jl81^|Ewp^6dD<&&3`eySqK*-I|43UN%o0c zB;A$WOkuSHo>)2_dsf{;FBw@lP#jMRMRiHlae4CL!ZrRS+Z^DT31NWB2adjq_me6D7r350MB)_ksnfJeq}MYXoMrc6mxCM3ti434|EZ#+P&vVLl!?)CK3J-=xyB1{p?tJK8;x z7Tn^`!QvCM$Uo*E`FUHL-tL@9r_L_N55n)*SNnRH)uTojHEPKlqS8of15rzM9y)87 zGXA$}>G6%t^dtWpt24zN&OdJ@-Uhdk*U^tN*6CvRq&wt+Z4$~fWn&)aLt}+o$&?rw z)OkJ3D0+zs%A1xmKZh(K`nwB6rUz2j887jO>>6nLu>@{dZNtyW5{xdP~s3vK@><>{Zbp(C#d&oNVo8<7n6l$_& zHpkU3NA*+l@le$lvOrRoKB;sgNn@v>yzDpEQ?cv+ zLF<}!+G%qd6#}171)>4O=LECt+-b5w&Ja76hSH+#*0_0BD)BW)BpT{QBx`XFl`T=h zzlX$NtUC-Ix-P(;ZS!Hd_#+a{=`oIKA>>V53B542ijG(ce(G%@hXz#N%ZhIViYMM4DO^skPHj()PB4T&du+ z+&8=V-W$u{KbtVxxv>HTDaoj%wuPMjW{2t`7g^QH*^H|BWTv6-GcmMv0{atb+_|HT z`OV9C($loa{A(^WV}CQf|LZoZnH`Dc@#g%NZ>BWuP1UYS* zwg^fr%th8=GLz%9ioa+rezBQwDX*otRuCh50vjlVabe zD960$CG?&^E_nQUe+m!}7#q=#PwRZ+J(@~f;m_m=fk>o8{bQ&KCe`JJg9)aBW z4l?2}9*%O{sljA-*w(;fFBux4Sc@3Mg+1nS4R=U&r-8?+aQrQ#i4q!G^pCs?9E%ZSJeDtl zgyTzKnouVw#?QtzTi!CBAR9{KeF%MRIESeLOzvq z9<7WTBKq?bm4E+$TG=wZ;GsO*~kAiSc+a7ZQ)GfdlVqahC8n0pmKvf7=@a7v_n8`%P0~fJ^aT za4|N``v^A9TjpiDQ$~ z2u|28i+{dl*d?{>vJe6dQgph*;M#(D?JQH;GQcQ3O(FJr0;*|t zfrMR71)a%T!KTm;7Q9p@XN=XUNnji}-$O=eOq+^x8Y1AyqbF1(OBjvAVn~b7IBLo1HZv_2!`tLSnADk#i;q$I z*r@TjVDd%F`UR@l`?w|^Lt7F}1b3&e-gKNe6fKQI}7d!lpo2P~9BnAZoSd3l0SG(3?ZlP3&EIb)|MSQkKqRtE%odfk>|n!6+`iX^$bQ(#^#!D2jFBh? z6)uM=2|4f>91qF4YbvL-PJmkWB=%o834hPZ(Z}6i$e8tA{->ZcxWwJf=c>=9dMlOj zrG^G`@kA8V)dYjP(J#8Z@*NopRYbaykIO%6;TL;1qVeb!)r^QD2}7%);QAb1rfmv7 zdOU#+eafO!ANb*fH*-)zZxM5Q;&r_1WkO}Ao}%?l)A4R)48)OT(7#cVPTU$n%!DT6 zbhC%l{U@QXby9IjmMQ5yc#1jfUkZy{cVU2(3Fs^`X6ALcLbGuy#%^6irHi;8uw`e_ zH!Fh7<#NS=)n+7Y)l{l6Wjz$cw9*AjwxHT=SLmE@lpUHwV2JBS9Jx6_r6r`Gq$3+o z^t9u<;gc|7!9);xbB5EVt0B}>m>e?6=UCeYxNN;RQ@gza0$=E`r(U>__84`>dZZCF zj|#!aS!G5z;yfxho(9A924KXo&x?Qlp>dO&=`zt8YI-pSGn8ZDX*~-QGi)*NpcuP7 zI2x?$FOl`@-D&YUZrA9r7X&TdQ0{P_d0_qxr{6eAugva*X=9gBV)`CzlQ>Gu|7{}M zrX8fqHf`ecsk_8DUzO%rCqd~r6;hr#o^9PU47>{*e_rs7I&IzntLYRhIn_=^t+HTL zB7lyo6eB0YlE?y`9c&9tCW;A1IEK$A*jf07DZ8u$HLJ3*MWqJS^~HHoZpz?2{wg*H z{$e$w{lIi*3RrK@1D8u~jH?U<-~_-&r-~KIpJ=CkDUo!R=R< zX`-tnRho1G3puXrEBcSRb>F~xXFZTvEI^fMCzlr|j1hOH_8|>!mqp464%I#I-Da>9EOAA9FU|ul^HvCO;wVskr z-?`|p{WkL_>Li!NM`&s~Nq?>QOkUXdkvG4yNtawQ6Y*mcwcgvyY7U0ofklOinF3$L!fb;ltBE)b}7khm{ied-pmFi12|~s{#Tjjv?1IQ-^lplBHe4Cy`Yl~!+t6lU&?Xgb71iV!g=i?;Xw5*D*pB? zZSr-c=REugPb~s>j++W6oaNA_HUVlc>7j|S2)DzZ0jrj~5Fz0TESllU)IKtYMGwTm z(E0)?ebWSC>6{-G6d2>c0F$R%c9Q8f>tOn-Xxi8x2x0mY;I@c8_2`fl9G*TEWiQ85 z)uAM!7hFwhvk&50CX-s!mkj9;6dgwgnN>=-x)!YAT!t@04<>0OOW<^ibxJ_ADy zmhh^1Gn~(xhCZq;Ai1Fxt7|dZ<|(O7?PqVvC&P-S5ZD35I?;n?45duN}G%)22zIL z{O&$X^o)QlDQ0BU+8R9C_hUDgBkY})N+uq$gVN3tt{bNWCZ706WQ~+CMZy>DG|I^G z6_;t@)+RFbq9Jo6LWH0SmvP)V4~>2Q5u?9pAfhgW2jXs{^r!py=5sbway^Z$uX2gD zsTan(yTT>!Gq_|;8+Frl2T8+L)*|!`G2r+j0|vI>(jZ1BnO$amjW(Jbh~OcAs~JAU zc(Cu+0iRtx{<~>8R5&pb?~@nC)gDi(Qkh4L^(VYTsfcUR+NUYpt;bw zYz^*rR-+al(uwF5Gc2u%#C?yHz;!4Tq)G|?ag@S7yJEb>{Vi*qqtM*V8z;=J#=G6Z zkYPtj&Q51KKWjbx%YCQH3{8n+PXsk79S@s@N~xTkGj35J@b;ht1z{1vrb8*9#&^J3 zn+>4-VG#-6v;f8yJ||v5gjUWAgc-MWV0Wn=_w29J`A@deOJf`-D~e@o^OX6G{aW;m zrWe}eu7r#WX*4$xIHpS%>?ti}4VMj61;{31_5ww?;yHzF&%Xg(%X{deYJcjo_BRgv z3T?>l=j`XZMw}<5IhScyUL@3t5NfyD2Zrz0 zvTe5h)c1rJb?&=KWfw%yn+HT`UTrJ;Y>_Lbn&{v(-5y*?#o(fd7F@F(qT8)PcdfLAjRB9!8n_&vs`%NF)59h->b|2iHWluBdKjYC~w;&!2G`o z)YmkDxai3!Tz?7&%EB>b+!$HoF_m^~t|i;u-G&4IA4ArvuS<=6klzn9cmJ6#r>oB#mEZc zOuMONnFJitcmx+at3dP=r$IU!;ql+6z+|oqxMcg9xa^g{ce?kf>E=^3^pps%=fpVP z>Vr|>pqWQMJsae*BEwW9@jc1u`oZ#b-!m%C3c5w zesP(#Pd$eV8c%Y5QNV%orY!ri8Dy2kP$}CH>yFyPqL3Bne4htGPMHQeJLZv$v^pBQ zEezfF^61eUCHUgBGc1<9N~=EF;M%Rn(frC;@-yK+kq(HV%+vL>z%`w9PR)QyuO9Zl zE!|ww3U= zGMY>ZETZFn+JnCMBzP`Zh(*`?stjURg3qHE{1hmMn!Nw`d0!>DX4`9r*> zl!KY!hU~`u!WdKYf|QoplCR-yR7yAx0vsaY)h-Pxm>*yI1F9?&|1EXv${AjU)?zRNF=Gq!uTD+R$4mDtV z>nhCJqX5qh%h2?_B$Xe(jBb1u4rI=F3>`Yoh-z~Dy$m^eqV^*8YrC>(N*`zje+rTH zQ9;S?kLZOCX*Ac+ATQRafR*7&!HjwpMuOWXRea_8&-x1)p>{)Xa}^eJw1iTNu;cK4 zz>jJ)l#qh?QDAk;2sT?>9b*dtlK>SFK1k)nU0HT-;xaQ>GUBh1nzkKEQ6cQ z&f+?g)2PnQHR$BF4sT48ge}EeLFQf^{V?Yr9a310H!EGy%S;>&{58bge(U+|D;#Kj zw<3x?Sc%gNw9ztf1@3;o0FO?`n@*kl7su&(F;O5#oeT=wwpA2pZgs)+}MCZkLo?i-s*LQWmD}4u0<*pG;&3_nr zPM20VFl7CyK=c`$Nj@CRhG3o@?jMMwU*5T(xU3ae2c5@hAx4mC91Z#^TT%R)1ir9# zf=}xnk^K)Xn2PMj{DbqxlNXkkG2fl@`L};(ihVMuf%-*S?(&7)&}t!0?zhPImu)6Z zL*pTJ@HQ4!JTn>Fo(|(W?V!ewviD8PXs2!_%v{nA>pW#}K-L9`7dLAJ_Mq3ImEf5i zOLSj3qFLZ^2oRl1)V>>l@RkYmwaYMgW`CtqBD_#>r8==_6QY-5WfCLE5#GyCQsy)@c%8#_6NXY@Gb1WKpCw8Lr+{2)BwliNp|v5C z7`{%Umq!nx&-v}_r@QGyBdn7Alj?t^pdY>( zwp32#1&yzVOE*nOE0+zpFBS!p=xkJ}8D_oJXW+37P2_dt8~Q|{4E996;9rOfCF7LO zz&GzDm~-k45xvL2$lQM7-7~}|kyDXQl%mfA*5M(Ylejz84eF)RO(t8Z5t$j=>1eJp zp3Z8Z%kC#(=I{X7d1em$P`8Cx#sjxjUdG$%ER)*Ev0kLOUf1Z`FfLLI66=7dj`M-X zx~32wlmUHx3G`BtKf3-qPZjd=aQeT4&@}7{n%|;=6)a3iBAHS(iajvKpeluEqHa7t#NAM&VUwcbHrif)9B`5E)Yj z8-{>74PJxBa$%IJlg1KnXPj+#h0D&x;uDSor8}sAj&DXuPuFgg&6$j?Uz8xl`3U2l zt{}Kn5`+)bi&-OnFWup@ffR2Vh5l)^xc{vg9Sk3(0~6xN`-9t1JUSJ>+(?3@|8d0ZBDbk*x+7+#jt9><(qw7JQ8drE1_2f$q$@s`gc_H@r=`oGlrKYgzROVR z3y_NA4cPWag&5YK#RCV=!OK`rNZjE@XIxB!zRDYLSyBlHHrSF8VFpdtm}1HESWr;j zK)j}9faq`_Y~9TDKI?gs>1Rv9Z{Ia?vt|(vXox_xb1LTDF99LX)tJZe#`3;IGnT!o z;MjAF%~DB1^p3@?OYKR7_AV&fHB4$EYlyh_c`)uSBr}}Op?pRwojFj!^`V?by|?>8 zacdmxmM?`fCzFX}za-CTl^@oMyTSL7U{LC8LH@gAFo*95AFsbfbN?<(@BK(;ah@iV z4bdobVK#{^G9;wrI_R(hjuTzN=EZf=xW5#VqO$4QI{_eBCCbv7w`nxj(-2jHShDAE@2DB0u<99}*qBTelAYm%^bq@ny$y3qUXd0>Q_k;S2G&N1i7SKQkf@%Z zbLap_+Z>{`2fbLaEkN#EdWcn3U+K*tHF%Ki0vp>29Zac(S#ul7r#%R&H7t>PmjZ{1 z*OS`PPI|=t99{GwjF{;r(b-9xpmn_vT$l2P57SHF+;?TTy1NCZ$;j~RV)nt!ft6(8 zUlRb;D*U!InuK)RAgg`aLF{%jJaAVq;lC9+?aArfX!`o%*$EhqsebhL;q5H-rHjj+1MHlxP9~kaU9HJ zPWqjrw>oOE_sAr4xR3(wi7b@veU0wc#z2mggZ`ElTKuma-OZ=rG1<9z)vB57@`xpl zzHd#+HU@(two)UW0|>ci1HjdZzw z8hdQ534VKA%328}LGb!c%yh1Sc}GuC*|J*Vmb;29Y_3B6r;>t^3vuk;;mx$=ZX`@- zZ-dL03MA;ixdH>9pJaIRN!nW(SJMe z?#8h;gBLxxo}|n0w)-GB z+!iqh9ni+}r&CwLD_6(R!GdH8)*Dkgrapmi(y>4=LCU1zZZw%E$RgvEIft!|1s z53D&Dc3to|Ki2b<5cX?wYQ&Ec&W z{HY1tc8;*qzb}JS?N=luzy;TbouYx&4_WW^z4XrdQBr@hk+%A2;d|@9eCc6B_G0xO zI+^pJeDvB$rX;)eeI#gXm_lEAGO~u3H)#Eu-EP56=?T$f(?qkrbJ3#H8-KVJwB2B(bKhCUIO{H4y zoVTBI1#AwEp{qBffcPCr^uOSR9~)FbIsGg)y~t-9t6lM*mY6_exg46@)1jX?-o|aG zpCef>gtt~-ps!XWG5_U^v3qyuF?V;Y0rhAbR5|vR?hq6rt9XWLhCgQhHO14OdI2-M z4Y5|H6p9S0Aa_;?uw}ALe#hX+@Oh=t8|OL{EzYE8*O>6S<1XXMS<|q8>o^t*qH*A_DtuRV#jnbb zF??VTetao~L9?uYr|w2&cx_brpBrSjOA?1QlQBH)F0*y{P8iF{C0+-bVN3WbYCp#j zk7XO8AHq=dzTDxetkw5s*nUvj`@ z9QH0#0KxaIm@=kKtC>pF`S_V;OE^MznkrtL*vp!3iX~tFECqkZQ*7&41SX7f%%QeZ z@NUv_cCA7fD|zE6^lg2Qikwb##c7bN=z7K$dafeJ)N@IpAf4=9=LH?g>826zGoN8Wa~g0aGPT&+mbSjq5k@BQm^Cu==JY z>V)M}k8eS^=U*x_{m&mVv)z!LP?iGECXG_%m>LpjY7QojuCVg56l{+yf--G2qQ;Y@ zB0}e(Q8Sp$KK_>((OAScbgJff+$T(ASKMOi+MNKkbg(qo2k3-1WM9p8=$)L88g72z zl{p{EipPV?x_#WazXrR#VnNWFMm(jR&?vHu$rqQvmyc^m)kr;gG$c;g>Fwm%>aoph7YJf4N0ITrS5F@P5}aWvgJfP_CNBDS|?f{RHa!Gc_-{VvzLZRCsY zUI(~yaWnhhYE4p{VviOAMVQEMguBXlN)N;1) zVRyI#>T0*Z76%1-x$Y`P`(6Sim*bE-p`H|dJ&xMTRN><~eNf!s&#E5NC&iL((7V@%4jL#>&^2ZK}wCk=4Bw>ou>&WSsuLSIKyo| zqsVU(<}J^>L*?C9lhk{fw+{qNJoEz99zvIyL`EX9|umIeorc$g6|4z^cjfU4>R5|TQKLdKzNEYB0S zCrYx}ZWi#UX(_xcm4Rc~FCfuPhCW3v=xWt~(Y*V#X9u5dCK@0Uh3|3k|Ce^t@gmeWC4z0r2*BNB=VhbA{s|dO-?fBr%Y-owngJsv% zuxPd}e4ijsLVDF$_eNEk&Ny=Vgfa~u_Jgq})@)~q2QnElV90gW9}z!^U86xJgWWUX z+&&j9{b&d`S0}(g9*c|P^)WGoK~(d`6?bouy;X%&$Ko_S(D(o>q|;%!&MkWUZy@zQ zTt@BeQX%A!J}R}uz%EZAUc_t>Fn$@sZe*ij_oy6{g?*uRy+iO=g#|5*DthyyE?(2# z4Hr44(Nx3Fk(n$Ut662@5 z+zQ6e+MqG-7}qBwg3IfjjD?OJ$KQUj^u)1rmv8 zF{ghfRg*o34u68^P4~0R!R%p^=#(jVYD*Fv{;h|7>IGEMCz44OaRjw9XNbtZPJ9_I zhv7nzOjhM2(l_oT^{UDP?_Gz;SF=~t*Ho4Boq6I0ry^Ql!1=DfNMgdn>+n9TltsALpl|KbK4VB3uU@qti%E{7O*RMA^erbHJ7B?s>iU zEY;z0tTW331W9*o1W&mHvq+`qW(o+h`mt;JQwJMgd@VxHGF zj6ZdfM6IbMS`*Z<>~%bf$S;IFz8COyU?C_@drd4a&BKr09JfX2JW=PeMQySmOWCy z^&M^$kZT<;*#5WwLDY|EjLcaI!b&r#omd~1osi)<HGb;OXW| zY`SY7UGh$jR^L&kVkhN5POX_v(%u0#@2WDwV@YgPU?J8E1*4kELSnPi9MjcI*!%O! zIo47(=c&&|9ghQ?=OP-et;wZ9j64`uarqQx6!s;m)7G687;Ll+Z|bkW5^Xs&O1J`V zHb@v(+b`sLZU6+s!e~BK3Y_c$K>KhNNiO5^=H9ockFB)eo8tmVxi^mbjEjO&2Sx68 z^=G9{L_@yBYTOl?iy*xv?i4N7%fNtEUud_ zq60hZ>dE4cji96wMBF7D$%C2!7#>x_ed!y?oTygVpgaX*D^4&ExY=Q0OeIF!$@0!z z-N{_su@KiTzsJaqyUE^H$${aOlK=B2pPnfWvX;xp)3v{Fq3~b2IEsg-m5Rwjg%50l zSQfQv1UloGy8eXB*J}+waB-H9R6Zhsv7`7h2CWARbjzW@hKSG z8bGYZZ0P*OBjn{!1yMGk-21kZmOXL>FN-0fn&UuDwIzW{r#14+N3lwzmzw8|W3Bzo zV39f3F)~_6;-^OA&ZGPBdi7_{FMosMk)FcG%T{9m*E1sBV~P()x8ah#8g%8%5WEm$ z3mdnFpyZ@9`ZuQlvI2I(GwnxIMlTxgg^keX$7^7A$7J@b^L|XKnT>0cBsrg#HT^Y1 zlv-?#fRUdk;pD&@xVv&6CI!2}@nNp7bi*ntY8k^+=2xJlqdy)@swGO(Z{wep_3+d) z3#MNiFBtR6#i05M`20{FcJMTDG+3U?nWzaSM^w{Kr70lWdlsLEHBh~j1^nM{vq*A# zlu>WZ8oUy?gQhKBM0zvxnGV$ic1eXJGot?!9z3lf&#T0E0R~sZ zUlk4G#aG72nfY92!@&S#!c?nfZ`g#qnj0L?Y>Y@$u7IgEBJ@8aZ8BQD1oPEmOmc4o zg7?fPD7L!B$BNF>Ex@0*Y~Z9|Io_O7h8L8z*$k)8 zR9G^TlD>J=+4>JPbOXV)^AnIA+eQZ6!pWuaFVS|jJ{Dg)gWC_MKx_0g^6qUG+v>d# zBkx^?KWi#st#Sg``KjUu)d}#YY#daM|4c{z9)pYXx=A-LjFjkw;=ArZJjr!D?Dv{W zD|uUpzKIRZ-Wmfdmzbf(`;RDdbOwoED~=@x=M%ec#dsqAD``Idk6gXV@pflPK)tIC zch%;@I`dN;^L8R> zTkQm=PmM9$M;rP$W^D?W3m)$y!LjX(!3ooG=Gs+wK1CjXr9S7E2JXTK63+0WpbR7L zB;xPSYM?hR5ubZ>qo;%|zp*rg&X9CMPb&kEHf@9RNmoH6|IURo?>;T2SEg5xF(o7F*Du7YE4@q(_w>-^!)qaDNjkay#uMMV-=#V!g&=aQ zAFR`5IDK%K7@ihp7g)_9p=W;6n;f_7>66`P^6L`hwm%@OupO9AokXN=SP&D39rS}^ zJvp11K=P)}2B}X~%+&|?$>QWCFgoIipXQ5T-?@cgE}BS!?j_=j%^&#p$3BrJ(cSoN zawx|J;(8hLLo;OyoAw#$uRfkQJCheTrP z4o`l|%=x6y;|hCVjTSOXC%`$$jqJpSI>=;y;yl5x83)H`_%Qn{wU1neDsmg~G1o2o zURMTBcW`VzW11aAVfF4f2$z#RGjLhA6bgFnWr(xa%r_LCt zvyj5v1M#qaO+@A4=OavBMj{RRau#?Aab(s`TaI&V1Ruk0lXZ;}*x93i+Il|Jy50lb zcG%FW@4`6zwwF%o$O6V|j1+s$$A`Ou;NG}GY750gSxX1{-8EjO&;}xMHwE&ITk+}j)8zK17epy^5goj%&2?6m zvBSF4@YUG_a2b}TmD8u=^Rq$xKZnbikld3*>On3QzI2xUA4TWk&(+(;aU&#Kk`AR z^?AQPMJLzNvzB2*v3fqUV&f4SSSkfs@nL4o+#BmT_p`JN?YTaN`E>e4X?)lc33`6E zQ1>&R##~#)df3E)`-yhUy!H>*BnzP6zh3(Mj3X11!wWB--J@G`BbYqtY53}o0M-tr z(ZM;!c&#vr#^}2O-6(A4Xvqg(9d&Sx_XBb|bQS$|`5BcQEP%Zp#Uy|HCC9Ia5E+d~ zNIX%DM_KN9{p$r_wg-avLy50SE?(>p#8*!?!%kKX`$~7=e@&csxtOo<=+Hwjzaa<% z+aKd65lLWlGwH2c#u&UPmHst34#w|8316>0TsdxlSG7;U*zpmIKb^i{!E_2Z+fd?x8P&)`9cyNH#H_c)wA&Se^qQkVIoQK_d%%( z0x)!LF+5rl3U)z-B*WYi`Z)I7`bHjp6`2XGs`c#77!f!f!F}$b7s-54OSmhMOD7We zK`lWGO|BGTwdV@_>@WilN;pD{az2TYZ^YPr%kgOAaTqxNkWsqFgC1)t;p~$zWl*S^(vSc z4QG?z^ z8F*<&JdLwWN2Bp|(52@DYUh=aF1idy9l879{7LFQR6~375~#0*I0zSW-2dGi_UZmv zpy8*ADj{v;(RWjpKiL9$>KpM|olxUT%VJs|5s%Z>2V+QoHF10t4oV7fuuzK2Ubk^G zmZ61Y$+|4q;9|y({pETgZ*@V|A0BeRpo4r=ZzHpxO%e%53v%7A5t=kc8R8)b=0Rap zDcFWC%v_B;VO2EyRW)dCHz9kaRbf9cxS&rSm&pdBORWk`JSf^|dj2Dk%F~7YR2@EV zo(uaQtiww^Pf;zKhpakv5c_uvg4#MgQeYK`%lJ>x;8R?WSq2Zg>BLi}=#VaM4RwRz z=$TkB_a<|Ca}V9(Qp()*-v`nGXThO%5jN{wAPd~nK;QW)!jCa(?h{MJpBsL=Itc;YoULQ5-%0`XY0&Yyoz0 zb1D0q8l={I3h^mfhl=twnh~B; zsfTlR8jYWCKZ1Wwg3#a24`!y$sQ%_A%FP;s+fGUJ%)6NoW|&~6{%I5aqW_O*DGR~} zEekkV-2nRj{7^Rdh8W5`B-@6f78{9A5=N#6U1ZYnl64rH(#rxZsRg0z)$l+^8tRH! znup(shWH+)dzuIgo){uqxC~?s;WgizIt6|Eq%ftho||oLCmxDBK_xksC~c@<2X?l> zidF%5F8Yqk6s1zND@K@bN2YP;%R-cGOoJmsr{URmEAV#kU~i=fV|!jHc-85HRO&0T zgxfim&q>AkDW1%(!@>|yi_rJY7Gk9LVppiDd6mv%;{S_aV!-9?U3z5Y7=J|KHwK`y zP8502iu8-=EvQ(wlKpz-DLUw$!KE>+_c^yEN zr)5}}c#T|e5`&D(hUk9hC!MD8iyYi7fp6Lm5#F>!x@?aDMyep==YI&V{k#e@OKj+a z+!l7vt0uU({T$bOu^y_Iv(P*78!|1@skYJp+3mfOeQY*F-l~VMLb!2z~L&A~|*ahO>#MrCWx;Nb8I z*6mIrwq@DDz>8gLcjF7}Wc zM&&d#P>(e*sKl1F;uwD04|_7rab?|Ww0VA)ss>TBqrqy--rZHqqmN2(VjtIK;dK^% zs?I@bm`oP^DkR1v4GZO;5haCtq@Xzwj+={P;ap$xMDdj=QVFAgQJ9bMJQm@>=^LpRdTLTF!vpkO6+8RU?-9+htt{7Sm#}Z{P zQ>c($fv9u~7B%J&_1?{-Wt0KoH>r@u>rJCyOlhnSdW?cArlRJoD~wvkEwp*rhb>=3 z(c()uu79`&|1wtKp*8`_syBke#~QLft`F3rUX#TmN4c&p!j=Mm6!X`Rdvvvpnvoc>q^o~z2~+68xDv(Pe*r+r{1 zkhd9~r(5F@wJgl^kwc!G|0r)6pSkgu81#CP!^8$|pliieygwjP?D4_bies=l<4b6K(<(K}XH=i9s@2)r0 zkcdM&O#aTyab~C~ck2t@in+VR?=7Tw1F0j7rI0=|Q5^~3$2>U3&NOdt&P^W|v zn{Kg^oq6D;yn(J(I7U-1U!?Qi|E3aCu9D({*HFDy)$C|g9hHfy1Kl;!@X>b%Bpb(I z&njMOW2=sT?DB|Y#}O*?oFBU!q#OCnZqcF4^Uz__fK_*<;-3Q@)Fn9;6=eCKX=f;* z%_q@a#{|Fj8N%UOUC64+C$bLB^k%LJOydo~6W_&P(>5TRZ>@k9%XAo(=GcLqPV{DW zB9~d}Msd#lwfpxfY+UAwLa#1CN{}{HDwoF-W!cPqtwZ1(6GtCLYog_y`LM>LJ(3K;&TOb8$-o%iRXR-A54rwIM%;C@7Vepr{j6FLdv3&BMS$ZXJW9|0mw0g-; zI-J-^Dvh}e-SWpo@o*D{EL;t#j_FXL?Sr~|cH`Qgi_ukC2mAlXVAexdv%$QTB*`rk zta4T1xqm5BEX#SfT;39ydP@@dLkp;08NLhBg4q}U5J}mEs2_WYe)^?MKY#MY2f8Ql z@&gadk1Zp;XExK}8~Mys%NShr*b9!VErzbFsc_+HGYz4`^li;L_O4wjTF!bxZ>aKP ztMXTNS+fsBHb&q=ZsvEystvrvE1;KeJ-l(6kF5>C=shA#Z;E8Xz~(DhY8wTPhQ(}W z=TAoB+ZXn|@K@3=wi&0Fa4dU&C^K|+5r{Mkn$M`1(s-in4jr61g?RGvVhMM4T=mov z_}+`covr=wVn_xzZ%wR&l6bu85J_^zh0yqgCuz>+`d#dNp!U258oSQI@vv4{Oau6~x><#O>rI(28>cZ|>g*7X$ud#K&W>TXz$jRtlrb8_&}Eve}sP z`WTh&Oo7sngCNXXMyp(MX!bb4?h ztn3K}`+O((zvTHt^%!}dtz1PvO)B%;|Eyfmy9x78C4!;bzGiRD6r?Zbzha-5CPUnRe2vde9l$$t9}zLD6SUc28k|~sAG5f7 z^2W565Id8H6fHf)w1?lN|Ku-&P*NbOt#V>LKJeq(3np~_2^+i{^Z{1dOX6{@PL914 zgiXt(Kx1|Q@Yfqa&DS+d{~dX-4o*hJ|L%cbSp>w}6v5Bw)0y>GM4@qOAKmuN1hvv` z;7`sa>h@Hsv0;+SRYjS?T{{m_R$Re65FM;nQp_c$jR8p4mtt4s5PW#N27mA;Q+X>V zT$2}0HufK+v)(CU%fd}W} z&~#Z8JhQ0)E#7w8?HYmoN^cq83wco3Sq!JuDxh|IGWtq;qjqiq%%8&DPksd96F=#O z3#=u%b>l4TYP|>7S3SYi9y4e=w;OO2GK1HtKNt@&J=kr1hL~H#F^>=MnD0;iO%H4{ zf|GUe@M7^rvtw)CQJduD^}D^?f&8WABdb&UV0a&Jw0S zFDBN9bGh?}29Yg0LlyV&;_4bJ_HtS$O&^Y@H@)`5jgN)!eor->>ER6bOkbg)@p9x{ zP{#b{x)2NWB*?McGPdk?ECdd$#$K~SB)xww+G~Y@?L&2xcMFEB2OcE(tQFS8l+*1T z^B%Wr8M*&b+uZok61qez9Yix#>B<-Jz?|aP`&J`-$(>Oj+?|7WcMNm+K7PEg3$ZdP z8)RQA(z7s6GCcY0AR&u@DTP_i$l4P>^d{DWu4eac&?HH zlYf*^@2Wg5?8wBYZM=+)*Iu+g{Rr=$Ga?_Y1L>M0QuJ|uj#*ET9vpbw3iiUW#QbIh z-N~DUt`mwNBEo=nTPm}&?q{?5iaPd4d;pAbGt0%y? z#SNf?<6X+D?~U(HBIAE_7AR-EW6Eqf2ZZRuhQf{+7-n5ZHf@b(ZtdF)_O|};xYrPt zzjvp5<9Tq;5r4e(XjWt1PhBWU^~D_vQ&_R7d361;VaDsMI5%f5V2IrwIA?zVNZ<~9 z(Q_4y4`0HbEnmQ$HlgZeEshC&K{P6pnSt#}l+DpYjrH?ke;}F_O^L$w%2D)QZvid* zo(evWHE{n)Ezu2LhJmpg@cpI^>Q}=uqtTw2ST+akL`~@LMF}u2y9dQb^FjTQ7yRq> z!QNx@!0!4h>K~E}?fc);CpU{xaYiFv;_W33r&_QiVGY#ItV3Dz7-BBvjdyI8m{&eC zMDMvt7zXZkr_E&D6Se~ip#_ZiQEp4VoL zFHar^Y4vRwv1*KjU*^H%nKR+y*liM1u%Boe$eTa-#|LtCMPy@eFe_Ycgg%LiC>SdY zT~nfHq*E!;+?#~*ey2eB)mIY2I1uSH7WKRQSk;jT&}^$9nfCdl{9-uC76@fN@yw;_ z6W?g~%S;?h7RB9(P9%M2InJ;s0hhC9F-1)lZTxdk=64ktciBs*Au&WPm*RX@chu-2}nycSx%c1IHz% z5jW1|lb^pB!%IZmJK#)jmI~t0 z=s-N7D9sKQWPzoQkw;2a)df{jvn1d)bV0ei9l+oT5IXN;nz{MALR7%&Ukb z!T05$K|7e5|M0=srW`h_Er@KFD_~Ddz9&AGPV6V1=@2fF#zg)trAuwhS#kTtIQ@ey z*QFYV)}>tM{1z@_scFqd9My($me2;*Ceqbah%=HeqtL2)JkXYatWqmzFczHalO?R; z7LFtJrTW_v$fwZrq@(zq*`r8RG&_D0bu_UfKOt|aBnCAYftbIUI86=AuIs)$w#48MuOhrn+gx_2C)Z`$6PsF2%3AY zlN;Pw>r)bvmBHp{c7VTeT2&q8+f>i!aqnSE0~y?D@Yn3@o2#(Cwu~+=5`sSUeEfap z2Yg*`jPZKF3R|m_%xSBkV?2SGqW#eI;JLaNRjLYJ89LI3?AeQi+E1Hq&X|?p>JlT!hX|YKKdH$B8mu zD*lOjMOBCDVNU*f+*Li7Dm2E^+%5W~(zAlCj1oihz*6?f1&*tcT}~o87qC(nEa~6> z){|9_ZJ_1DBuV@=O3Zwxn2XF^fsE)+@~uN2Pd2tdZ^lD2zLnWTcK8kx(r5)c4Wfu` zmI}r%cBDq7<8;ocKw^@@N7dFJX3xAzz>ZJPu=#-}M4eN_0~5(GdVD)g$Z5fFj?;O| z^^KRjbB0Eq_hfDE1Hvorhx2cgG>lsH5Z){|#=G_=ieFDh*V|Db|FWFxM&V-`1pM&s z))7*1Cg5%e3NZWm&)$@&bVDeMZX-{r&j#-zddQ!_c>}YeQTS^Y<4o=nja4J`m&X$#b#n#GIQkK1`Eh+| z8)v~XYfl<7do%w0l8e{&g=4+MQzox3o!$x6q}nRsWaabO^#0RW2y5divZxOe(!PZl zdlu4yL#LSCrPH~)h&aAlok!di)3LCU9~;&@CWofD5%-=b8oGh&{^*Nistl}&fzS@F zt8D=-UF}UWUM;06#na7|O^(q6^S41N|79v&FM@5O=0yDZBnb;ViGijZo2A6%`@aa_ zs<)S^_ANainZB6Y5l!6>jnn4V5OnO@1NBq#QMqJ36`th|1&j@IY{y5!ucb+rI0=y7 zue0i-lR3Z3uO+zM$sR(_+-FyL){?hdT%eNMkvv^INSFMuB0}>Maa_C1Y}?Q!(Dc+7)PunuExKuRrq-7MIw3kCpl;w4BFSm>2QJz zz8bH^1*1=)bb|_3`FAwDe(ZxwKph=THq&Q+9+Hd!cTz2ALli5mX+lpqHGCI~uGRji zvAmDnG_REiY@PxAmPT_$4gdv7lW=)IUEZ0hQXKNxTX3$#Blw^?j3WHS4h%)srg^BqcW2gmu4{c8_4mZIF-STn7+L*&8x->h+rAcXu81)n=#Y1)r*8uX%w{+6kL$xolL zbfp>{W(>e}mj_ia{=pb1s)FNx^Z@PwGOYBpCM6yIFD7UJ$b@o&iua61JkdT60hDFkam)r2?%8%HwR`Pm-bQjK3+IF zUk3lP$idYDck%uEHWI0{9ajo}XWzTtVh-<0gF6>PQ2v?&S$IgEUAg@jgby$0`e(<9 zlRS4f{$(_22_o(t7Wiy{ zfzfskDt`S15m7!3URJG8e2ArP2bSWd@I|!hh8YCTDk9A<=g}UXCVYO<9?TuHvFX+~ ze4n)w(>gzshsATL%Wwr=RLlU6RY*%8G?7<(S!$~`!p>U9c~WMdWVJW1#?j;7X)d0i z4G$w>E0^O7-I##R4jC|h!4K5JpP@t7M%eE3p8az(l+>z6GP_pnrpNqqq37)|o!YGc zt0QO7k-_B{_uSm9hV!Y6|K|(CmUFmXcYq_G9N|x_1n1{zga<_ziNU1;kb06$xp*^Z zrE_;|i#R;IF9!nN1f%{X19Xcsp#3}LnO%Pfq{vT@?NV}}{L&v(9%WEl`HkTAED0Ac z=H~l>UZDJhztMo}Dz?R+bPDGZNp5F(1$;qJM;p}cI6?fg zKnzbkNRoElgtn_f=>9&R*}^SOoO(}@pL0);-~vP1blD7K?5JrcVY9K&B5gw2or3In~d z{V?Z%97*#CCra}p@PRZh@vY$QXx9ueSHFz$*OFkT_6^d-c3o63M5s~QXd_-pnl!s@ z;ei>WaWpWojNNzWIPC1^-1v=#AUiYzyjQVc%lQLR6K0}K>vkG??I9V_CZM1egDsiI zfQ(hrVI4tq)m;q!)mI455l5W3$VVP8-3}i=YQnvkYozICA+3KciTQ%_;jdRRly$8k z(SzLow36Em6CQf{lABp_=tstYKM03ptFX{HibgHnhAZEtql@Gf7~W`&+06_&QR0MG zmghn2mD5zW=a_Q5I zspzt+-?Z3?LVIWf(LHL-v8J(f4Zk_AJDG^wgqaMzlQerF+y#$9OsPfX4%qWu1UnZB znMbxRhLbTZkTMX2cCqPnWI_-#UOvYYRklRL;xaK5EhBqm&Y-d8Q=0HBk+iDHaNV=D z(4_3k9GCJyRbMao{LPl0$#SH!y{FN5l=Bz-Rb(SF7SLnIcG8L0od1*&YIK*lg6O(~ zDVZ(-JJ$!Xfzqeg141Xb-05DBsPCrFeq>@|m^ZF)ZlRaDJ`#rldEnQy$J&dzFmG=! zIT+~z_RoKrmAt!0g0h!k`>6%WPTbiZmsemNOccM6Uy$*CEK9Sjc9a_kjN-`9S8O6O?xOqm)-1 zdXD`h2fjpLbG95knrK0Bb2nMH-;AtP5;R}TbzAF?NSp6@0Gz)d1NTP1hbF&w^&3xeD6C7@sXiqkBtxgx{-4Z_ekOz{}e1gJ`5pKjOe;^o*2lE5rgL|;4a5L ztGJZF{h8Y^`H35oxOzVvo*U3GMY0NN3)!x=PI1f%pEBlOZufy1Vecr-5?1Z^EbOLQ7c zJ$wnmcs?>GAKO9wOs>E9QVial)sAA!M^bd)KCRnW4T~&x(wgOKQO*4yz3LS~9=0a2 z%a3Lw$jxJ4O=%#rI7imC@u`hzb+PrHyJWz34X@cu?W?#n$cY(@S&Q*+TB%?7IZ$_< z1#egDz)+2;87}pLZvmZw|)7YEh`DW=0npw}9J?wx&I&3>I zgD|h>K>x5d6ew=Qe5rqAFV}^7Td)YSrHY8++Y#njW*!uG7^2%YQCyZtphrxU+t2(U z-%fU7qQq1PysQMgXbfE5!5tMn&R~O5ED6f1rn8h&$dzMjY2NH~DxJ*( zlA=4{l4KdJjx{5Dn12lq|DWmmn8wzW&m*!A_Q9QYRdhLXjf_|LQ$;RcV;X<0Ve@1( zzJ6=Q8Wri$kT+An+F}i{UoOMeolRl~`i^0gu?^{c;D(%4mnL3bLz^}&#?dcwB*&{0 z&+V|s90?Q9*WUxPi^AbtX#*2;SYyK2w1zR!aYjGa3Fm*=0j|FaF?Za7Wd1$R+!fqK zEq^?udLRChYBi3p{1JgwzT6op>1D%}b~QNG^?`oby@F^639v337t!e^C4}|Z11se% zpi5^Htaa0Y8P9ZaarGnSn#50%`D`tiY>~uUj4QSm*};16CUTiq=;)&JY6sEd`B%EqJQi*KmEqBCC-J)?A0FNE8l95k(dK3|Gp|yK z>qC0UIY=LoJ4+AJU->JE+$KXfG}cWP$cv$^fh)Nk`2^gpR*+%2+2DIL4&4_jHENG6 zWV0`DezAZ+M!ER{@^5Np+YDxMSeF{LiIs!Zj5qV(mJPj`?+c@Qk5Oi041Co{hw=D4 zdK>P-%VQ2;C;Sx_y-p)4x=*Q_fjW3JL=oRY3nCZPPCn(o!Tr(3co<7)^r$KRmHolO z^+H;6R}FY}Ea5T$Rq$BG6Z6{L@nXgtOxIgZYB~1YS9TucZODg!XS+z&_-ykJiq*si zYiW&J0QwOnCg7_xe7qKecdSpNz{&qmPPmd3*~l{?)$0JfpW!!w!wp(BdEnH+c`ycC zp|yAhu9SH~!LFAL?CPTfH-BM6tP$QSIzta#k%r!NAIV@zFp2X|q(5~KFARx+?w(}~ z|0S>bW3CG3WR61POTCw5m(ERiCZ_~j+&Dj!>0G$2wghHK-+~=S14)1KCNAG31^iPg zAW0>j&R8pjuXj74lKDOw&;N$K>9`IwHF(f7p_E9AvXF|=RGee_4j)>4oPDd>FIXD!*Xiy&o=;_9v83^ z56v;5m~-5&l0mOG_v_yn%acZT3p%lUEpd*%iii9nshE5xN*E--fiMk}`m`EdFK~Tw z!U?$cOeX9)IG^xe(ZimWH((!5aMZ{iKc_7ui;5C3q~R<`r6*vxW+%?O{+wNM&J~)n zznD6ArJ^=;(asm$#4UO=wvQ$-@xR{DOP0!9?}kuguhlRPF$tw2 zzti>?o>-yaOTF7q;Ue;$crZTn`z5X?Qg=$@sjI1=KW{$MFBphfC-vy^LJjI2Bm|Gf z`>9NF2I#FEq%*S};Z6T3{Ls@*E>Eh__gR@_VaX{X(v(KGdrM%mR1jS!D2pR@S7E-0 z1^A!b-O%>#FqSQ-K~>is(9QACoiUc?q1$eQ`M2_hEd3-9nEim6Bb0zVs?o6hKs9}Q ze}x%;_y;P{qy?>Vz-1T{;m(3n)Oq>_e0gPpnHP5lRg&XV-x1-vXTBvWsfp>>{5JWD&U; zhe5C*jD9l6!4gX|HeF!@z5HMU3E3bAVpxJ>;c4WXLjfBnaT4~Qzk!x2+3?SlrEfOf zH1kcqf~&a8Q^AvA7$Vrk09JQ&P!DV1{z8&N2&fJH_VVf zNbV(bj_KArpgU&-_y6JM=l?2QRJ}z(dK;^?M)Z zlJU?BtkiKelvu?1C@&4*8@(1X#k~56f>_FF9F>$ zLDZiV#E&UFjqcT}@wo15unLi64tAuFm?U@dU*UJmU-zLQ@7f6aRFs*0(l>h9^1RvmsrmK69LG_)OpBZ`UJ9D8d+?U|F~a2L;W5rPzk7Sz z;?`|jai5|psXs0chTNTE`d?Sjio4DntB=7gAG^Wf>i`j-ypM%ngo&s4U-na8KIvV> zi)xPT>}A6(;N$#;hWELWFS8M*__U#Q)ELA5tYAcE)nZcG1Bkt`11C#z@b7#s@B6R} zn+>1Ruie79`I#zPH)9_2GV~5SK7X0k?KzCiHqChB@NQ7$@|uqyZRJ>xUUK_a2fcV& z0e$)BgV5gTcqxv>gTvua?_bWAIn8T0RCSHW_CydRmn34mP!oREPl3UM3-PIKDqitf zf!ap}QM|DmKlMeUx2gy(ANPmrLc#d_csRN)=)mBw*>JNciTWA~z!C?|1-*N1>5WB`;kd5K83~QX9(ca=(Qn|GX-YPtxCpQ*QrFHv3R$G&P-&T&? zm5+_zdIG~&1%h-W)&)whrW!Ywv*k-nAmMf^MDC0NX;o3?{Wf6`@j=GG@EDBS+{d{C z`S_zfuwne+3OF2fpJNc4U|@L(_QXn}=;2nXV;u!IH(a49AOGN$B|%6JNWj#cE?D_Z zmUt`ZQ5yksbY5mk#Y;@FTkH(8Ha-e#Zcjln*i184SYyebeH_2=6BcF7GQX7~g*7_& z2wnV$y}e?X@X2Q4j-V3K>Gy(Ie<&byjR5c#e8DY}y<}wXI(T*7kE#Z=fqr~Fy?Cn; zKBRZx+XD`C<8ICYXFmXI)2^fO{193j{*m|_-h~Sx+{~mkfXh}*BU=Lwq2jPArk+(n zxuz_d^7$Zmq-(&=f;#%w-;2oP&c(Z($FY&~BjLkv`cCsN36^((J4T$RO71(WlX(s% zS8|RF8)bUz=N5XyVg}^*J)z|v-;!n%9@77!9c&7>qCi#~>Ew2b6`xIDvi>FJl(CGz z&LpWEpGOwf&%xLM0ttu)jM8NzXd^dUSwIf+LXKseQT4pu%%B0BR& zh{ut3B3OGANB#(!Urx+}h-Jehj!zjn_t#SSJ?F9ZMn6V&UV@!7yFpWQoPGC(%RjYF zgNAglC}k?uSXzm7_gvamj4abKuW+2SRL`Ak8*b7SnsEe7y% zO%YL65F)$ZeI{z$^U$ z@!uIioG#u5JsVQlXPMU^;SrY?y6lJnLIw?${SQgNhxM?M^L#IowW88PyUFJ{pXfsF z`%LYNG`Z9=A3N4~z#|7S;{R<0Wd8j_UeROFzj+N=^{R`Rt~Ui9KHE&?+rnw^V_EQv zjeuD(t#D7YoB9VoV3Z~G@w7<_O8z;7a;lXyXQm{&(mrY!r~~o7sl>X-7U$MhkeSaF zVMSLM&ER;u16jvWXQ+yP`Xd3MRwv2BP3c%%AVlY_*k^WOzEI;{-9mczTr!!_!nvGc#ahQ$7h3 zR=}c>P4L#?G%a1GfwNL_@YTai(2h*P&;^HBgKv`{GU!buk9;E^k}u*lE_XNh*$-6w=TE^*o?t3! zcN#+X$brqn5ZIjUWwx++A6_3k#bu~6QSPENN$QKI-}{9r?>=F0rYbb6Jc?caz=hf* z717h4cj?$$g4R>3$$NzeeE!r0BtI6xb+cJGwdX$)GSeP9J4e~h2i~wO`8|8Ax*b|P z|B;10oJTlC3(`;V;1OOOy6X8qIy;)zd{$31T5yiTZqX@tqwg-+rPfIE*Ly;wwJ_%f z4>7ZPD2{Ve%CKU7w3)r64Aw+nW1fV^(j!mJp+Z6c6Lxc12d#5#-Yd@EM_vG;-NbtJA{}J=kHe6z7oOPa1a7WhY20=P(zl?2{pcS@&DmJS z6XC+5t?=aj4ch%V9}YxT;~sht+h)Z=603+rJ`gMu zlkxNDOn4t&O72Tna&y@zS}x#-8~^=dCC5_8Rd)fHyvIXtFE~z{ag%?fz4|DGJQjg2uA^7uL^72VUCx0A_H^sOF{n$L zgH3(bbc}O~{ijk*hQ}(%p$%CWzO$VU6;#68gi&VKhG1MS%5QGzFaxG{+L3DMjoj=% z%4`^4RKV8l8PuIW9BfsjI2UO^?kr9HfSsiA>b9;ez?Ipr<`2o7=i-FdC0tYI7lk%`{wY6I#ar@rAm}hXAslBa7 z+~Wy}manHl_rg(O=Q-Bl#ceK=|B7B`cjKw@OJwW&O{7XF3Uzr_k#n4n{hnY6Nj#MZ zEy@c(jI#7zmOK1yP{&>NoHrt&iLQAx3+66)M^~uLg}+uGOn-YuvEDgSWChprp`|9q zq&HtApDrGycVk)@sporXRKG3>P5FYE5mO+oJA!t}t)dUCWWnO@K01C>2_l0}vhj(N zW=ocYfp1g=t>~(z|22kEqmko8eFdOVh84PoWaEIfI62rh2@}?%2<9rdXN@asdHpVI zcNk!IR1Od}iO&*Os;@JHnXPNDqmoeatIet6UME-lOj&=^VxcU-zhRKu$xtsG~O|B}lay0{+ z9VKY7auIwDcW!XexdMq1&&f?&XUvbVqbbZr2!F$e(+UsZ<^KlQ-7b?jE3J%idy<5g z4(-P2>2cKZk}DG)S;fGd_4t_I79tj;)22Nslkkqq73j+@V|_$CAvseR zBF@*cf9^%#ayA$Ovu5EO&Wrx7;slBM;6*JQ{Mlo>GRb3mEuaa|N z2T0E874UY*kS08|1*0F%)HW}k?9@;uxdSaQ?Wi&4$^axjibluWQZo256?Su3WOr^i zI&F3oQJ7W%&a?Dk*GMcCGY-LBOMEeZfjAsDwny6y_Tc|T3PZ}$@z`i0Gxw4;cEA5g zRd;Wo(qk-4ci0GrwskOXmOD4(rYE7sxoG_MLY0)3u4a2`t)Oc{2Sjh2M7v2vnD(C| zIz0T&%-UH=AIT`-)q@JKF4&U!y?Y~h?~_PUmk5H1_HE=jcLK9l*}_+|e$v134gK&a zhqNXihvH^Ec(n35{gHbCGjxR5Bn3&@%XP2q$>MSw&v~)>bu0aSq7&@>9PqBa7TAx3 zz|kUqHu~jX@@3;|QuOE#JN-m9ioCiAB;N$ljioZp%V5eWG4vhOB#|94kj1+dGM>$Z zgPOC^>G~0z7t%%zh&HV1&OoC_+*w6dp4-7j(zLX8rsv{0m^S2qCG0v9;u}hut>YUi zSEzthPAs;D6;Yq1HSp>xAIO`}W#dDq<4?~d@cH14&v^x@T=YS>Gde`h?g(dW<`}@I z1>0%Ll2h35!wDin72rsgCd^jjoF%=3B(u66v`fdKX}>ZpmNDU2_I#KSlx&m@I6zX; z6Y1nd6O{avg01q)(8N2DTJj%6)zcn$rlg&H;&hLdv?oA5tD1X?O@-~!6YQy(o9N0~ zPtMV=4wqBXaLn~AxJp!0hmIk7;I9!`7a9cVXV;Jtn*#Q3Lq8Mu^#*I!z8cPbzfL#b z>L%~I!{I~OE|B{g0gsHr8XoPpggL&oXy;UkakkUp-z`7bdt(_cub{-AyT=N4^kZ8n z=lHKnq6cjvNOE5vy)t4)yG31ToIo-&BYYaR&UGTmn(t8cLmtVEo{I)XcPPJq2X%*v2CrR4>%b=C&t9p=INsw_@dQ^#c-uQ2lX4*SwP35F6X=sL@5WKo!! zxut>-Jc;qb&s#bu!}A_K8gp6d#c!Elx3ye$UI^rtEyCGv%hCVN9a3hcgARP0t7A?M zJ~H}7MmazBHLba%7?n|9@H-=&e+sm>0=RBT#sq^^aHsqc=1k-KCRH)yE zHtysGcc=bWEk)L5>Jz1Cq)|)`7@L~lYNHjHCN>CBo;w-Q2_sOE6r=vj3h>Zo7ZiLu z4UbL=K({Gn{!+TWxsuDO^iYkzKZuUmLQEV)lAJZo zJj5~ud0LBbF`pTHy~&1IFbt=Aw^>iGBbNvwgM$3VnzquXc*y zw-`&b-W!5CRulBmr(4wY>I!T-wgc;Q`QY`%AmSXn4jBn~&fi!`EtK8pn2a>oYY%W4 z&ROKvDic@|;Y7A3|7PZY*uaWE>?BhE0?5hby71MzlylWEbl|~f`g3tO@_8DglkphY zV90Bp@#!Lc{+||^_o4`rCDO^8>MWwM?g_?UzJYGP0o^jTLf?}lMoEVkw;wiuH*?N1 z5z04M`8T|c>OaykS~~~kg=9g%k1TdZ_FRy6+f0kUXF!(kf3!p`of-VVWrQO5@s&## zC|$aMe@>M3z=G5#N#@|f_qt{Xh@pMx3uebet$gI#$6Zg@8y+a)kc^BadBYf{Wu(;gxjt=+Rrat<{<_ zZpdhISenoegiAZP^!V<4Ap#EZ&tYBDv~+==Ho-7@q0@b9Kk4?34_0U|tsQ`h|a} zG%|#iH)SC(yBoU9KQfV*SHPLQ&eYmCig#n7ITn5jqN$-Rw4Zb4ER9je?VifeFgJot zcK292TYeYu z$UAB3!To=~WGyE4lYYV{O)cKsh`xHYYY zNE!N(``vb=|Hu(CekYD?Yg58tT}do#s>H+B8ma5uatwDXBpYU>pyM?u_!pRj-`0)N zO*by_<*o#x<~cW-kzEXaUTO3=h~X{w?{w|Q9GYZwmgTiHFbXJ4YYmrT3^PJzat9(3%sj)3xOF6tc`(j#F%#l&#i?sF z-^z`yt{4VwX#;%nN07E$NMQ8r1nJx(yLq=#_3*znkvO+%1Dds8f)nR=ga2ep{4Z(= z=yO>|74r&ga1rF$k4_|&3SMN9n-qS{Ya{wLZT#33XUV#*h3I7UhOB;J0BanIXHq&LX~ z_Q*Yexr;+6w=}@e{l+-!_*b+EXrvF1^pa=u?vg1-V~On7UG!w0EH-i7y{hdItVGir zBGMg>+wXoLHIWDKtMgOj)odaU_B>T6x!LY zpntcR;Kjl-c;iYGc4`a2k*H?OS<*)~=l%h^2p<>;8fN1xB~ZgE3nj~cGxK&<;K__) ztXn7r5vFso?0r7}&p`w3+B7A+y>)C+`!{lV%2E`&o(NV`Smv-uGqv*g$72U?;^!|{ zV8^v^qP#PRW~(I7arKvEl`9Xs-mJ!A(G$#}iqmjN{0^yaS&Y za{KK`p!{77K3w!+y0|J$TPlYIyp?Ucu%!?Wp9%g^je zlM_U);T^tPdjy;E++ll1G}+iSo0FJbBWs>m;8=b(6>uQ*Ly9`&Z8!=O*YI$b!#J#Q zx5YS@Jh~^knfOO_ps-#L+4%Y`tmi!;?DQ$P$a^McRhQH8l6|OH&`Qr{XTZK=n&F=N z(=i}U95llmQ8k9apL0&aWA8}#`zneZ43VNML=V8+ou&AEERQP-4jDm<#Rg;aT_DcoVoiW=j+VT6NG!_cVN#m zLR4f=0AEam9to>qy)~r4pu(7&GmFC`nRIH^+J;?nItPh8>R? za8xUyE(sT@^1%hwiQm+rf8i728qz}I3?^5vy}_Z8f-hr2;d(Urnhr&y=lQBhO2$Xu z%Fwq>+GNweWSlzjJkIYgg*yKS)V5v<)YFnkU|<3X`&~ts`PI;%uo!gq6^2`Jmds88 zBM8vc0JSCeXd}^L!gSB^tNyE`kDrCYx4n`y>hTNeoGU=TaQ=)Nx#@I6Zw;y29}A`3 z++3|y0>ehyiEP#^>^-Fm4=X;?vcjj@OV9JHW(z1dI==6(UdBw?V>+kC-4fd=;6;#=CH$@ek~K)y33&{!}Q=yh5HFS3j5N)&2lO7Ij&hA9^} zqoL#{cFl-9y*!}~3N)OEhH@&Hw+0ixU%R=SofqbcbME4aon%quR5&~DFf{O%Lwj@$ z&NNZv*wE9^ZsPzxTPH%iMv7oCVFHu!R|KEu>R`WGD>2)ZK^5|9NQ>=lvUE}b-r@4* zyTA03z^VwklUE4e)Kh4{=PyJjy^@~l{)Q$7A>ikBm+Z0YrOC?EVBIkjD2WcIi7R|@ zl3@kNH$SH_A2l&VS`;=GmjH3rhus#%G@!E)yiZN2zFBYyoo!wbkCvy*@ghAY$%bQ3 zYD(i=880gMk7YO8dqAgL7MhiW(WCy?h)3ypGWm811|ObD3m#8|2S0R?C(F_naW3Dn zN)|>HhsX+_)y$2j77+Y>99OSTq8^ncAS5{hXJuXGGy{W-cWE(y)0vHQMVA~(?sEgL z-y5*zPcF9Ti5k}|a>3Hq-b~q!d&GWS7Q{}d#S_TY=epnsHx_kL#z@-$%kg7Z|)aggynAzAHRP{GIq|D~$x zcFgDI9=3C+hsK=EL|cU~WRM?+70w|L-gJan_Y~myGF_UtX+9Wz)5R@b?IcO^6e)gv z811vpQJIG2pm6m+=1ubfymHbTT?bW&p}P%SQcm zTd-J|JIn6OK{7mnICU7qe9<20OIQQSt#9elA6*RFHU$N&7huuvX{a(Ul$p_HNNN=v z@tMj(Oe(oamHnz{{|q@CdF@Se{H*vYbagm9HY->}06qDG#Eu=myof^BH>5^)UM9 zUV3c)ar|wWgLRUeKPb6}THIU-8+ICiSnLf{amw4N%&5-O^8iJk0q41#&WbaGG=mg`@ul9=+8)ftaw z9$Zkv7VdT3?Gy2JdW|!={NhaoKD?Xkf$^*6;Aw#>YBgGg>jOVR@tXnCBmR^<<1|F) ztShB8-<^%j<`y&8kI!PljCY~l_$$_dV{plPEvz1OJ`2Ov5%jD`1u3(ZgD|u=gKJ!PeFQAJ?PebY|+3F?F zkJCkOkB~K6H<5SW^H4&*3vd1jz{5UTWaRinTEEEw1gm9mXsM#HYVRNwTGU93uYD(l zhPA{`ww>Bf{LJyImck^Z0s3Z;W7QlN1cTgL)LcD^BxYZu+B;4{=aC{h(ys}(*I&os z8_LXUK|APNlZXl&KeUP0iuU)<;r6e=L@d&WKHRd2ny$@<2A6S?sdA4E^pZutQ|DoL zfuAWDT=l<{AADWtbggPP@l(>vY~dR~~@1LVUt$6%WACW0sme&<8%U$*piENgph zH_m@+f?~@On9$Y}Wa{*MW@c#yH5E4np@<2%$U_!uoP_ak`BnCWWi$RWs$qW3$iWvf z8*sGk4s2#t;Ea}3=2MymJnAtA)dV|Mw4#f>>c1TC9Fl^{A}=iGa#aP~p49cpIr8D; zK|DQ;bG2=dfO*$vaPy`g(A@fhowrmHKW1HIAAav3pC;*Gu;odjVxfVgGL79OTuh!M zGZ1-61dpszLzQ#EkmEZIZyyfC@IZto-HnicQIe2D9E*V4LmqBxL@nbD)bsu!{5!KA z!;C&Mj;eErZ^LimKkGUUepE-w&83UYw&1T75#;uHOKu)(NQRn@(>oq#VP^ja5*yM( zbEh$we94km&{GD|4@>Cn+mYx~R05Vztm0Wx-4U@Q+Hx65v<>9ROlW{rH@oSy z$j3azdj{CKbUEzFaYy$jUG$di2U42z8gm8Ak$+_`zE&5+>ifwgEV6@=NgHuRw)M%W2>deGK&ZMq+lh!>5xMao&(1Nlrchu39UwyX6rsS}jNJ9NB_3UL4o?t~73w z@HO;PzQ^kjKR^V3Z=mZA_HaC`9As&!S_y37 z9fmCqLe<2{khr;|;G(;espgDOc#<%WjGyU*@Os~>buFXRm46YFvxpS~lkAaOnnq*`S$FMzQMpFJN(NRki zbdORYONC@1*P()5_1niTRv9OY{z#(h-C^FDL+8k@PL}rsGfQXXYI74`Kn4J{Ow#wZ}^F+^JM9Y?M3vvoh%j@CSl>D zI`*6GM9kZ0h_^#}Nq12$v2`@SxgTCpu^DRg{UnyktWAR32QE^T-hSfhHG^)jb|C)u z<#5GoM0NEgb39ynMHbILeh#-Ns>#Lmf>cePY=4%hM1aFN3K6_+Vx&k5R5~=)t=j3;oU& zWCFeDgHQ9A>WziWzZZfq(M1KT9&#?P9|<6BqX@R2Q`nVDF2O-M4`-cCAqjt`va(J) zNqE(S>c?`O^tnqoE^7?I@fRWJmJ-D@-mPONuhJ*p_HW49_xrehDaU^huV-`)O+i7BE>>mPs25Co66AV2Jau{rGv7wkk~p*fL6Tbr_8F4+Y5;@5peU z3~7D-9Vc9^V71abAX?-#Z~CM>bXTv&`VZZ(-N_txJjzCooZnO~Vw89LdmS=g3uu*h z9lJEf3oos)L8b9An%tR03g358vqDweDeez(B07-YCt++LCyNmi{n+#TNNoM<3aiqN z!CXcOhMM_!H^GH$tAEWNtX=}T!a@)hU;uO6v*?}5ZAgf%y$F^QHFqpywN#jnGW zzN;9!Yz2+A*^gPX3-G(?Ief_rCFkw`LTXhv`BE!FeoA$*r=oRP%AMtZ&ihB03*oG2 z>3X7{oCFrLW-AZZpw|QQ z^Y`Mpc^j#)f+D1>n+wKq?d%elSbQ}{6z1IZVuYUB;IV*%utaDloG+L^3&M`K;8jL@f3mBCpJY(NrZ8b4#Y-gR2u6HOC}c zwXPNXMXceGvlC2y+W-@XckV(VI%0PN# z1({@UjAwj35@T0!-mbzH{(}Q^*r4A^m^6JQYra(m{#Yf@_`vCq(zlg9(UC)wRZFSB z-BC!eucFG+T(Qcn9lANL$zbhL#$#*^jIDR4#|m0`^(z*TK+ap{VB<}Omkg7;D?{+r z_!CIw7r|m*A?Se=TIP0(1}}Pqlf|XUfOZ5tQ@;hqnWu57^gT59-cC)!Q(>!3IEEi; zW2_%hDz>cw)4rS|&^Q;2wyXrovBw;uPSe#6snEY*KLqA~Pye;U8Bw1gP{xwm=WQn%+`dOS!5BMEs?qNvvuX33N^+EJB8ubR>2QA% z>2j+FyY*FAt{KJ4%`ax9cgE0>?hJ)H#cuBLzhj;nAZP_95}({;J*!1d*M*J?vg2X#zo-%fMR@dznFaN zo`fgMOd;z2b$F9jiT2)6^u%QqIDcgwtr*aPt)dsO{!}ov5sjeP@6^zLT`;q~M6BBW zxE88r55ujcS?s=40aWOk3|miG;C7h^OuqX94m&+U!)=dX@|z{tG_Hjv4GQS}?FFf6 z2>_?(TyHtCkkwT6r}p~_>72=2raY;OUFyxN1(iQ>Y!@bq&DoNolA=8Dwt+%*VHh@o4e709i{SE={u9F+6*VO_Of(Dd+SjD&?Y znVeruHQtqv_u=sEwZtS+bWH zxyg@6ayxg%Y>y?Izb=9sPq~~ybR-BmB#>z>mr%`(a|LVMWLL{BAXj6Ph*Yy7E-tdd zxz={9f!H|Jd!a(k?LP``aZwBswew@VCHi+pFaIR3c>moMPYxI`ZN)H4zKSv2F(3aV-Uksj4p z#hM7&!TJw@^#r@6V^T&YGZcG=X_e``) z4RGzlUh;U6H%iUyqkBB{aCX;PJX-u1XFd8uBIY}?{*BjZ;D!P$v-ZP^%i%`8TsLpV zx+pw%@F_F<{dKzcKqd@*`Ur-bjnP(|>&n{^e7N*DIORAnvs)jNecaC2WAr{zc$Ug} zVN-~?P!8npX`vs}tbz4XqceR3@y(PQSZJk)bCTw>g3;P&^xd3v$e6;5Kc#G>cNsN1 zsD({Y$G|m48I(e zKINS!LE!vM8|U$4$dv+hREuvQf4Jz1hB#AqG&(9)0 znUpLrPl26*Cb(@^GQ^zgq{kiZQ>{zFcrR}@PLPd-JGxtO@Y;WDiuWK#$@oljCU3&; zvsba_ByH$6+l91Rkn8b{@W{*&e|+-1gTzOa+U6hc^K~>E4|xT#lfVx*3X83RuWtgMC{(T*b+cx8T)lr%<@@KAEpnkB6Sz;P^`eT;9xv z2LG+V8QyMabG(7M=e(5O*+z-pmpSB3kCgHL`t5WyE*o4Q=VIcSc5?X70JvFbqae+} zD@+2pIJgYIJ`tjgUsga6cV;w^9U;#~UvYc8E8utIATc?WPi3la6XS^wY3`(F^kjtr zOwXB2!jr9VVZT1~2})rmo`bhvE$~wEdh&as00<|_zI056J8}0h_PXVO#YGQQ9gFSs%FFzVT8b8yX4Iud=vIGz~xAa!0}c66mJ_ z5wgK=kgnm_1GnWjV^ZK-s(tYmE1?|>u3{$W=R5(sW1q9HcN;Pp9;U`N+*v*?aSgQ_ zzsVels36xT)^Pdg6%kc}XA;o`j?XJ_>*bzawoIGOQ@<`-#kd^7FxU z))Zsa)7O~h(+lBZ(Jdl&@gh+wd~q>z;on^FDJ?-@O~@jea)l@aOt3rX#+wRGM5E$tPdt`2cK&Alo*k}v(8+L(4<6Ri)8A3G? zd7S(*6x919tIM|)fO$v=&5!tnGMlQvDEex;;RHI2Er&>Dw~32v+vWv0Fj zhNFHF=o=;l>rT4x#!B`R)mTB??drp~mgSfYdv@Z2_#tZk?;UMx5&^UMNAN?b8Rx?o zqIc#wlWnETA@}1`s@bi=%DCu*^ZEn87v{P+ZO8FwR16qr?}gH*)o|4I4rtAJPRFkJ z!qbuuomh+B=9-0oT>r8b%}!Kc~vKt`T;&6AHY3$8MK61k-N#;;#WG<06h7 zAY2{B#LqFuQX@%7ik(6{A79~ke=T5_R!TQZePI_HBirln1<%LH;a|%{@Jgv;A8b9x z{$BEl-g48UV_bK)UrPxOUQL2{hn?i`i~#1{G6(EldXlcRY=J9IiR`K!lc3_2r14Zf zOU{)T)4u89I3S`6Cf?OdkBl;!Z1ktW)rwg8FotuCr(tzica=bW0=rB1B5L;^#c8%> ztSc?0o-21l->9Im!iO&EIo?E@j2t-kUJujiEJ;s$Z(|pw@4;R_SyQdO+np?F~)km)waZpX#K*WzTZZe;o_q!uRlJ zR3ON-){*Os6CGPEjTisQ(W2|YTvl#~N=+Ps;%F}8IkXk$&HBVR2gi`e6PHNE&;p#a z?iWtJ=7;^VT+sNo26>(wiBB!>z_WKEkhyg(`TW5f=iPgZZ;yOrE1iNddFx*`$aNZx zTilF4ze$iQ4>5kj^v2>_)D2+r0zIPkX~L%l!~0yaOk^ z48=QAU&;NY%Jgq^E?c}%8Z?|Yv6h8lE{dH)TFfgSW$)G_w3BUByd+7|W^frZ*85{^Xb@k$1t< z>?56ct&5+#iKPkZ+9X1^hDNPTgFT8fv1QT=R>SZ)DxJ@Vqemygf&JlJPCO9Z-<*Tv z(`&frORgI^X$pU_y#h>6IgK630%WHCe)4C1IGp#{O^TK)qq_D8I_YF!Lw*@f@cB)2 z*H+;5yq`p&C>MMRzfj9QD@mT_IbORgC?2WD^1xnJsV4_4{yEVDQ~2cgJML_^ zFN(e}8=?2Rg5daIB^0^G)2BWhC(-UVomD$P3(QyWhWSIpt=@{f{QZJn_^JnqJ(BqT zToNOy;fAg?b5Q4e4vkFWcsnzlNXMXKRZCqi`f-21PG^+t=W<^?>z|;QavXApODg|+ zI^>w1Ck5vNX@ZR}lWwO0vRI0%f7UYLh6<3_Gzzd;ixg#?#`-ZKh`Qnr2ef4Q`hgeN zc)QJr8<$f<3E}EvUiV1EoIX0|i7!N18&k)-Uoo(wkT^^JC5P37=#&YnQ1UB+ZdsuR zGU;&cjDZe8gQjB96e_xpwIADG~ifAQ^iFgtY!`@Q1-?OO*zc? z*#m8*`Ox{Kk@c-fyV@iKb*!8uywtqxV$sW7zi5^<`{LbZAs zl(E`xr2DCWkm?-JTfT?+cE}pW{ML~txbZk0p{g25}w0t z+V;GHtO?Zt-IEn`o%%H}s_Q2nQ=T)M&K0nGx8yRz&7EYDViK6jnPB73G&*(Ke*E$6 zE5oenqMKa?NRjk-kCaj!k;rWs>&(wD!~O-l#bZ(IS@NO=&R`AlLDLRQ>Rv^CM4FiLIRbP%H@d&N74J_YFwzj$`Cc zzbMQTtH8l{ZRW4|O4Rt4Oja%b&ekTbCaMF4u$OZJ9aQ^CqnyJqV`CCNdij_wk+h{x zRW%{VA_3B;BvS)h37niO36rIpXo__>E0X8~`8x6JGwD=T>`*Kn7&ytE8Q)B@T^Q8K zK8=~JPsqAGK_Fmy7x@oP!5op*Bznd-Qa0leImIer<(C-n>8-_2lMAsrJsc8e?1kpt zdhjl$7?!L}hA5w3(C2;}L{287;_G|Fk3W$Lm;A;@Q;xxGl`2BZ9dXY6yd*{ndmH{hnq~ez2cB6 z=q%j`yDQ$49}-+|x$6U7w6j6GOBc!cF9P_r!;z$W7T9p_emb+ zJhMftnS{%j?Vz+O8M~Y>;@N^EHo@U6spXz|o^?sWtLM)6cx^YtE*d87Uw5Lx)<v8pE?C!+c^~|!YF;VUrmcYPKR{eL9*9rh zE~;8v!CNu(jm(oaqUE6xkY05f7F&ry>76!q(cX3-s}qUx#6%!Z)4BTRTsS^H!nl+d zV%}ILtJES6%B2;=e(g&d{GfsTY%)MEW>-R=_!@k2c8G`vz2?}s7I1TPDTXMSVXjsy zZ|`s?KVA>T;i1yD~30l!%kHx6!mAZY9K4MlChJP zDLXhy9`^47?~%uJ({&RtYI=Yl74l(fPXN15zlgj})2HcUDR_{*j0FYU9^kq!EWW%M zXUh1(K7BV;#^LTU8vUYJRz!&J3J@OWk!1oc|rjEU)Z zrg}4`9<(JN`a0;fZ8gOGg%F()Ed+mlH_{yfhjDN*1EapGsJ&t*T=cvP`Y+GWOyi$? z^ME?y^1~Bjr;8YiWIQAGg*o)fym3ZE$Q8;DYs1T-Y-WdC6D<NR!4vDkXvMlCw6xZT*zcN0 z!i18kDm#q?y3fWA^&c!NEX3w6t-?o^b@WlHFRq-#z)0;G9IDl#=lXN0;l1@_ey=>6 z7QcfoN>+pz!*H_HCzALW2hzx`%gIcmHX1wi6B{qtNPGH)Fd`?0psPCZsojdInljjU zB?V4H3i_m5Q_mwING0A=`E8rvr@lXXVQ@OmO1=wrhgxBUkN{O!u^xA>2*YlTKpeBu z0@X$N6dE7XwuA3!%|QWh)P7D(Ct0A^97^1c55X3xS}xC%fyb_2;9SUY5E;LS3SPYc zFO{dz`zlMh?>SAJpOg=7PeVzR=Pb+_-A&DW=YXZrO;UUK2 zu^p>P%a9FhQP831=N2FnzJu|dRgO+I!QW>#G9zXE|YACJCsJ=-)^FUe^S|{X#pf=(`C59b<}F6 z|3_mbI0r`D6#8GnHtu=-A;+xGAoCq9>B9!7ln!tQZAu3lanU94c+E1hWIKqh;h8*lTXzTTzfSCPT8iB4NuaW7u(UA3T+7Cf^6<5P`x4)g{iG@uj8_>~hq{ z=Wiz9!7srertCq&1Derux;y*ZG#U(7Zvm~JJldzXr7HN35&W>Spqe5s@RIXz+=kDz zXkZCMFzv8*njAiJi-M4|vZ&6l1o65c@Cl-%bNft^b+{R;CtatT&-kLc(slHH*g;S3 zNrGt88R!C9INskwc}G^WH-ANfbW9TH{8Q&TRN3VBU>@dX9R$<)vp{Q)6$Jc#i7&1a z2o{uL=8HXtiA5o#Z$bhTtzQV;4VOqa7h+ms7Y2^s^Sf#$d>ACpR1vYESuoDA6Ablt!Md?B zvU+1B{F3LotV@)kM)5YaSyw^4-YR0wbOUtO@<7cqW5l{|BRWNLOdv^_a^dUE(1rEQw($6KAKh6lgk8y((RDX2!!}GJmn)_Y7{fZ<YTEOQ^qi0e5XeWR0(QVv$e=Yosq?b_!gHK_^?mnX8Hyi73g zi6ZeA*@Hb_vvICdCywx@;c0^hcw}BQ(QQhEX9-<+EWZv^J_tkFye|-tUI!<(Er!nT z6fSwCL*uJOSTUP{SJfhMJ~H_NL`v`N$CWCdXs4G3RV(zfHZ5jS}^5ftVuSL{%?D5%;q5P%cN& zY-2KXT@9j|IjtDeu^BI&QG>6~>aZm;0JDNa5qe9ZO-6xn*2o`0nBOZz |GrRIFHSV)$8_D#S+YX|(#q>fke%>rc; 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

      kuoU&>sD@Iqs>c~{O!aoH{8=|0bTRI`9 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�zYw#IWP_XsrCL*88<Wb#9ow5?urg{F+03m^V*HJ0%5hD= zR||7@%HiY%CUDRpmF)8`fYk#N=(&&IY22h2z=%JCKM!Bv#(SH&tnpvE`onqJ`??)v zEKh*w?Zr^PdlENq9U@meZeacOD3Wwdnta$I!cOZHGYr0G0dudpvHPW2GH{`Q6@0xA zte_3Qw$rJ8;h=Fo1|&X~KxBFXlhbSt9sxT(&NazKtY(5>51WU=J7YdY>s0LS`F>+x^1swJiM}-X+sQa;cIHInJqO&;G#JWL9 z;c^p?uEZJiUG`&-C58|sseMd*!F(us%(3^&CgSKJF2hjVh(U*(IPXLV`=sF)y(3ae ztnz|zMZ#z3ttv*nXBxC?l?>*yOPD9}f}l1b3Co5n=spE0{ApQ8bk9wJ;n&9S*iawx zxAhS2%85i~^}?p^2k?;R4AY*@HWZM$NP2UOVR!#05I%YfO|P{QfvqL5j?0-gH~at} zrFuv7DF(0D zDs!ECLXvhI1$*~1;9aSPWmbP#ufNV*#zzhMjoe7{!>0ynjVVNQFa|HA-lo&$#BuDq zC^QPl!dkO+;BT=DcI+}|@;(<($G&Eg8YCRVy{n+0H=N;UpY6S;zTDEpgH+c|2Nb!?Dkj zV8x;nxRFi5J$Ej$BYuGLx|J-Q9gl~+@1nX)G2PC2D34`D(8Hd3jFGk{^aSpN0`YwA z&bX7t?W~8USZi!AoWYNse*#XbUk2;@+H}f*DpmgemsYL128I@<;NPGK0=C(xTd@+P zMpxiQvtzLMkOW9e4N?EuvheS$F1+8(c@4SuU0+BCRKF`5Za!)Y))Nwtc%6VXb?4Fg zpA|ZNU&tIBvIJd_MO)DuH0VPP*_!>H6u+O3B<4LFJ{yDotqW;*el`zA?0TrYc09d) z>^tt=Webxxi^I!pqjYkc4ft@`z$xD)4W}p!f$6)CL_YL8$-m>vt}cB^U;ox-F13cz z$*W@FwtEN;FMkNuhX?RoS1iosTm)UbxfjlFU;Fn6? zPs)JxPlCXFLJU1ScbMqR=^>)6E!Z(z+F+!9DN*t}gsJaCLA*1cm~Gw%)|r6~XD-Nq z$JbqS(^7FdtJ;^zvCss`x7+ap$NLVbs{oCHP{z&p420Vi!jwnv=vv1j{5RVg0vAca zJlk5lo0>@D7uJA)l_zGbe+YZ`Q+nE%k5np&6!Yakw`v{wah>q4A_utNUI!ajR#AcK zBgp2KLwr&e4L({3_mW=GS^sK@Lri^rhM6t+kNu-xme$lOwY-oEx)6f`YHWr_oK()^FCcP^!(1YR6piinOX3na~YMFDu-i_ zCCSq7svyq275Q)e($ir9IPLl*Y_{lvt7mV+C%5Z#lgSp8^4Lf^Uq!*Oj9BWM{gUh+ zlA;-3c46U%qf{o~HQ6yChA|P$Mp>V9cD9B(KTWz6?Z$+#DeeVLowtVE5*s2lMRVc! z2LW*GHG@OyQ&I8BO)AzcjYFWKUw`luJ3)FAb$t4X`h;Y{eN!7q>o6rMr4pnrsfw{0 z(Z`pXFG!_FN`qAYHXJ`4g?}GR!fKDjK%8cfhpQ@4Dq#moAKr=AmU8`#6#$awb8t@O zJ^XH2NR@XsGA)G@@S%z;MAk>pFJnO<|GE(S{tB?E-_B$I>9tJlk(-!fJQ+6q@q|}V zn&{J8il$v>Vf)%COu1_c37xvIqcIuG1H4Y?~zNC>s%Sq7JSCsAN z-W6>tc;YumR&ZRHIRP6{K==U}U&#k+S3%OGuo@Mscao$D!K~heZ$y847Y&KwK^Mnj z34b6)Qj?|1)1pgwtZ*F1&^9cG z%aP%eyrZuHb(uJc};@qQci zwv>mMmzy9*)0yt7J`Npg&!DBg9cWI9AwuJqF;{Lbn7?!>ix{wUx)T0f#1dpKjL>9YPn*L37ruva zblli*)2fup#s7u0oo*PU?gn*M67cCl5)lnp00|*VFnYa#N$@ep&w?DwUyjtQ?(Ks` z=N)mMuPN>C@I~)7YrOKGE(%3ka5;h1R7Ky3tiGH9^A~G@LFO=Cl+Y1RK83-wU zzsSS4nUML~0baGNAe~{HlWKd6fz9+0I_@D%YYQjy|BYqgVcT+M;nm4-`?H$i&eDT0 zIM; z8cGRKq=8Bj4SVkfq3lgYgy-BBrIfU3s1%w?QK>Xk-}4W6`QbU|-1ld^KQQ7JPf9i> z<40Lt>=}669H*B=2g_dbREI;T1a~Jplf>l@GYW|4&G`^DF2%8H=iwUTm!$Ye6+dW8 zCC{Go{hMlLvGu=$r~`Vke-_t}f}&oKUG9V;1&7e#Z!s0`KS_#yd?2oSZjjg4lED3D z5$@dM0MqlP@IRDr`&r+dpib}r*jrT9=cYQ`Uv7>{Z5CAUS~Jn?IS9H3 zFGGxJ3alHM2Dvl2{mymIp!CCY67=^gg`2xbb;@4Q^3{c^z#P{4fE8}OQ4M=PE~IlW zM}SYyIjXrxoc;duI=opKj*DLgV?gN9lK@Xc-=Vo?x_QSstvXYCA*r!M2NWL?~qlTVvgafnLE6tbzG z(=D2pqI`&stRpWF;aTqLIl}jH?4TD>@Np$%e zEf`ad#?sB2a85Rlb)N~iUvVluC|XCR6h<-`=G{zBTMCY@o&o{)m(pMC2cq*(ijKdP z#&b`Xfl#tM$={uXSB`Pa_ohp%Lsu)#;l9#q_sZh5@4h&zM~TWGEyK6FZo#FyGw4N; zYEUZBgezQT`ha#F6Hz3F-}NTb$3D+UQR65ZCFBTYAMNnbu4ek*hJQ?rr8E@_nhb3R zzL~s{Sb@KOW)kILYuFnfgu(l*2z)5xkKKubb*DVxtmkuRdHE9Z43;41&ccN+zcEdx zEwO3aH?mXHjVkZ?$@_J*l~~=6p`F@?;08D|^XD(Zk2y8io5RrMYwxme^g9`qBR%By z`B}JDKpOQ!bLsE#@aD6d6ro>W9?j4Ak6zUKOdjvL17pWq$<}Z~>U=kz1Qxo0-mMl~ zJ*NY2Zhj4`>U_05{uT-N9gmvsxa1=ls6wE6{)UMLF(jcfam?{S0M zV44g{IvsT2w;vRSact#FQF!-;0GiyoKze?Q_GuVCdH$Vz zKC~E-T@8bK`EdD_Gg;$1oBZ3R1yde`(ly+^-SYXB81tkYOS*&b^=UCUDXUE9or}dW z?wiqIvmDChCGhF|`Q*an4h)Ht1B)CL*mrPq?9DWe2iixby*>#Sx4Og9cJB9b>^ptl zm=E&amPj>tI9umB^0*%V%9h#qIavt9C)B~C%vh{yng=#jSXVp*(K?gXBWP+ z8XQ;bzMLkh|K*OwweQIAybRve(pLDcdl_?%F2?U|7pcyy6D0ZTVz{NB2(eQ|A;#bs zmn9TI-2-#buR0gK+Bd-ZSvBNRZ89;o5@UMNkrr(YrdfX3FmOnhR{rDst519=_RhhX zR}p*mZ(%CL53v(IpTs`TYq&8Xoeal5pu#@YDE4fC&OVz#?q+?WE&Nlos(l4&Z1KRg zN``cO=y6tr+YY7d&vo zloj3>_~9;`QF}xAJN$9|rV5y&6-R4*L$TR(4)B+&lWp~PY5X2JlvunH`?u#}lCLWq zFh33&i^{0o**FkccL;u51TsCJ((K1m==mTQYV1>mSLEK|rNB^9QR9IBJt!m+%I0u3 zMzlq+PY?go(Lmkk1jcnbgUVlC(U5EA(D5b_y_1AmVs#}^xFiz$0;}+$hcJxX&m*_y z_~6_?RT6J!MN7?-Kx7~ZXF6)4#{JWnBPs|1uQbWXYZ;I~pusjPFJK3wH$iWyBkMgi zjh$v7Msj-O=)wUV%AL`AkK^;>Z>TA!v6Y>;28B&_?BMEiWa0Y~ z(jycNQnjf>TW2%RKYAi6m~-sIZg<#zxPS>IkBI*hF3X%dlO%aBz!`GFEsJG^(Ca5l zC#~&*+k&rYL9!@W@}?GCyR2#1-x+2>7Cii2ECm}g2l-i7CPM!8naFGGf?(|!bg0lp zCFL>tCh$IU*l050b@bD1OGT)*cr4AU;x<|(yK%vCGqjcMMP;k=gbRJB^Q=4|< z9svt{>EDD>1$+6ccXL}&|8cB_VP!I5i8e}~48z*rVq|lE4_W99eh{eL9qWQp;I?%y0nmDZC5nXw}c=Hg@Z%o7HOhfoL z97w-5H= z_@6|E+Q8eJD&#JwAr7$9uwi=#rk*tb*|giVEnbnYkhl^I1HaP?_wDI!?^`5pzbGp{ zO`6+$jKLWK+rfH9G+l7$9W~|kl2zqGWTtd6Snt}3YE`Mk{-ij_7+yvaB+MK1w}IWq zs`!zIY#F7B8)(^ao#eN*dKvAFZyOQ?P78<+kZcsd#;X=G_8Wd@iwwK za4XDrTL8Zv-KQ&=hjg}<6=w9{oS^;CX5 z3OzFX;C9_w=y@Uyhtf*8UbPoV*j<1*vt^-jxe|Twpn(jONrHycXYd}q!g#NIOKyqA z(n4y;M7lZJ&R!aX?!jnmFneQ98GmaEz zWlfF)BQ8_@dM_c_)mHGnUk6ZWC4?QWC8-S)TSni#Cjk}*;jLga|LdGQet?1t_$}WK z5fckZ`G%jgIlhp1*3QJ$${Xpe2M*-$cq{Y6XeDbkeH~;w>Vx)EUphX?9ZDu$C+j`l z()P|nROmd%zz?s-{J0xL=8F_u+n&dH_S2x$)EIV7JWC|^a6K$;_rC6R1Z>}sO%`yP zh*2Gv4HSPt3w8(b-(LxZbsgvFWQ#QB@XruZHPD486R&~7fHxuHJ@j323~g#JA>U;# z(xG#Lka{Z$%}Tez!e{pQPvUOnTEvyG5Gw35fSEc z^o{{TTxoU_wtZ5A?cO4Ir_BiL9-O4vj{o?rp>1SpYa}g@OCxt3_G6JuI4&Cq0iAx1 z4iKT-?t8^~@kTfLojdtMO@2cQuZOD4%SK*JRUx@27cl!Ae!3o!s!QpccH5siz zebFW`-y=aR>h3~A^=|wimxKEYB;i7-7<(CBG8kIznp3Cr|ei9>=fG74<(h|3aOy$+bc(&b(6&Y=%HNryd zGCK{%_TnJ$p`LpWI5N5yba5a+9{$XD3?4R5pj=Z1{|V{S?F*bC{aGiy&?o^u;xS

      }D1_v{X$Tl!U~`*j-5*Zd$>hht%K z(j9b6xl4RjzJtH#g)uSF5H#2RBm!0+srLsb)Ze?1I5-W_mwiKwbzmY!Z;u8gS7CTe z$|!F3CS%Dl>@@Wgu+h1l_VAma`%M-(mVcg@+o$l&UBY3jRRL}cy-q}zUBtishKzWxN1iR(~{`BHdCA`t#{3{l?m4NQrm5Rn|3 z0WyCA;YsyFnD})jM0|C`AQeRVYdR5_^pv(YF6Vd;XQ*>nF9i^Ryw71cUiTIXza_9U z!fN2d!g3Jb_?)qe{0MK3UxE6a29T`&5)_sy!Kzelx6kx06zYE>N|zqfm`RuE9pCe$ z$>9>Wr}_Y*OwMC|nH_t=$`}aeG52}Rz{zSiDLWd2b{f8z^m3F<deDQy?61aP%P;>rUjyooJY5Q8LI9Ir>Tm2$Zm-# zxU0~cqxx;;tyF>aQP#S-3Jsf z#=8R!_O{W)8BR3Q(gZvNm1vO5DNuNOt+|=&7VqM+`Sp!j=%J8`XGL3>bw97sM2^Rn zbgBX-T$@h*{q8`$16^S1Fiy7IJb|iPxSSy0oW8151(9-HcJbZ^P`Yy;2``F<82MgU z)uD)QQ`_L-cXQD7X$Q6;5;C(5uzz+DKeK8(yx_E+clKwg)LY8&DET-RFhXzZ37Spa zeHonfm%)U6>8LU<0c95DaT~Nkn4)isA&Wc79H%chIyH_p6yq`&ZI0xes1&a4=i$%y zt6(_nATDhV!{-B2@&1oyOk+!M%XdR?@0O>}s%PACbp96DBozm>KVQ&>&{2Mj^$@EO zG8r8$ZQ$ac1~M_)6*@-GQ_+I&j9bWkJacp^&02YkKk;=1DfpB{2NWI?l>%AJu{Qzy zZGlCFfned+KtC##;jHDasMJk2kSsB#{u4F9bWR8D-04PT;+x5@gb}*!NIU&y^_mKf zq!ahnP9~u%2l)BwAoeVZ-r72u?4CTy?5ln_maNFY7wfXf)tLoM*oFgW^|u2A7lx3F ztJcsqMvu%@(je=9ThN&^y2!tq-DGfYEO_~@0^?V&$gt@b`r0OpnB7^8Bb&C-xo7_p z_!iH+O6R;1A0ZTq?I0p@Ik436GlUp$BvJ@c^`yIo73m{? zKt-7`_Fv*}>i>nyi(Qy#ma7^M^SuKZnFE~9ykr6u+`bWpxvX)p!AzW-v>M)B^9G&H zernCz3I#jYqryNv9P(a86Ae}Qa(2gQQ)NF@_DukftPrwCARJ0ZU$Gmn9YM8928-sb zz(3hz*p{J%0oe<&)+>)39-0qRHEuw{=@c}P(}sIGk)+^=J*i#gkKYusp~Sk2FI=dK z=1%ogEO$G|%^xxTve^%aS0_B3KF+E=FeN90*Rw;)U&zSNTqwFX!d_`OKnCVq#|!oP zaOl1gbYIZ|wZzkKlr=<^=MAjGj(sTh^(>aGoQz^QZE)rpx21JW8=tL`Z^;T;2_mD%G({JV|z;RuP%*-_4ZIa)45PHtpoygs^5C z@Cy`$Pc8d+I>HO_@tciM(Kwm0^-+NBR{dmbjxYEhJcKthHxnzil6e2?r{y`}JOz%? zJJT!{AMv!Xum3%fcZ~y^{wKIWW{hU;eobGXH(A+iP0X&_GA{y7)BjeAfWbsJaJ8-{ zXJqr4oDD!EY~-+ASrg@87!BPjspiiavIf5GH`G`y|49})5H=$s$>aviYPs!#O^=IFLe4JrXjD-LQx>U0I5rS)Fj{AICDnWZs&> znN)lD5b(kXh}um6XrL#PlLX^X=F+o$DDkn3CdONjQbF>=m9JvD)GY!O06C z#77V(oV$WT!;(ZH+Y4O&t4EXSDq6AZCwu$XF3kG<0_$of(M1ckA@9>Ip4zj^9PczA z7vJOd)N;Bgb3Y2Twoc(c+8#jfoQ#L?$1>1=$O(1B25DW2G@i8dLPaBS-hWRF(f`mD zMtf%{^s)pAo%TgigG{Jf90hpoZG!DrxPMKc_lqrwA0 zvvtA~an@C17z>uf8Ji~1B}z?rax9U4vC*Q}61lua{|3`G4^6siMZlqw zOb1@Cq*nS3qL;;gHf*uu8mp< zCXIL4`hT9>o{kNqw{&y&T|KT_{*P%}I*5|Y7ZN&WF8(el!1YJd(dJ+*?!PgB&uwP2 zf>ZkGov_oOdZ`n2{Ri2P>0EbmT`~!7bY`O~ZBco3G0f1T{55JL96LG~hrB((Ahrw# zk3E2yiCvWcwu=n1yI`L}DS3AEC|~lc6?Qkf!kXu@VD@&5_4RecUn-gCsiaF?)(OIg zQUm(AKZ7n7+Cx7yoa2~{RdnpnPQ2Tl46+leoDJI#8Y1~9rN-uUX>Ofcej2q!mL(vs^Z ziMNj|cGR|$lZWTwP=g5GdVPi7n7aq8mN)UWRKxLUa|^cY?1Dg#DhM41m^cP{Xmk%|b zbPEJ8#bdd%9hIt;#xGna=gdwoyyjy8${p7!_0qx%5|@c^-VyLS5(xsE#qqeEE!uXz zAyr<-AL7Fn39HwzX8am@b=8LXVn(BuUtq5jt; zRMVXXqlyD`_pZaZc}E;1KfVX|uIpg6y8*eTCJp%o9{5=}2A!v@0*!_#sIXfR1)U_( z@TL(Hz>A}E8xpa7b2-W%^+L1h!w|km7A!>zvDq>LEF({#`QlmVR^SA03%-%X`A^8P z=wDRYvIsQptpb06R*uu+0DY4CsLz}>TI@GUgtiLfF5W1;VkC-!_ZLCk@=DA;XA0-k zQc)zmxH6RfL^+ zh48&a5H_D+0LNdm>T7P1uywM`MKN(mGQR+aEnA3PP!>4sU(#}*YX`Rp7uTG>b}NlM zc?%Q*V`*e{CABq(gV1CV{BBl@>dwE2Ls2Q&!sY(VjY?oc{$cRS;hL)*L*#HqD9$#s zp@%IW()k65cf}=e#jF$>nDK+Gn9%{->YdruT{Zl?4t+?vl1nmsr;wdt7a5(`r{Lbv zz3{8of;L-^lgNc|zI1*k6`SqDuMLf3FsTFIK|y-!(L*${6#R*L2zi5sWRbB7SGRsP58a*yDKx zmIrbD@&r+{_1mSH*A_pR)sNzU%6*4*b41X?-5R|ezmQ(z7?}8)Pv!;J5~Ka|aGTpL zlKxMgghYMCjLnnqwsbUF=v*ZSieecTu16NdX)(_~Ga#^NCf0i9po91xbh(v+ExHex zzbBg6&Z-q)KR1-k+IkdA2L?cIiv@iA+fN?(%)`OF3exR20;l>*=pK#__sOLM?|8(} z6H6u&!81u%`BV_hMwi0m)#-RZ$raE1K8}{k3;8d98bZt14%lW5=zsDJIkGnr)P~h@ z{*D7!-ZT#-y!hnE)I-p{HW=i;N6@GGv&pgV+-~HTRT%x~0^U6xNd%u)!8OeRI@Y$C z_>5XJMi2b)jd?a4I3Pn$C+8DuHja5~upX~&n+fS(g`D3Qw{Lkt@SfVsGigcNgf=2p?Rb_7A2fug1k_%4PI99sFl0__&`k&(&Z+8^e-jBDsm*5;V;TDW=Bb8pF(0gMgR{fpIOkFF<-21W% z1@2F2$=5wif>t&Y$NtAe{#*{Ra%?1fH$}7BA0pYp_G#FosfQj0vxuWp3YmUK2^UOl z03#`m)6ex74@Gp5^6G>0sUe@>>QyHM$@S9GSd1Rm$#0TX&p-B~roU zu=^VrvHb!Y1QV#%-x;GL%ks;DqVR@(21ZR8FtRP0z!cQXVOpS`9Dk z>{%1p@8B)f&orDNIDZC(?uebB=QcnKYyIg0ZU^Q3>wehi+ekJ>Eg@q=S#V8j4{TlJ||mVaywfA6UnXAbm+;r z30ne1TT-R6NSt6bRt#9fmKe?#bSp=_CS4+rXUv-VE~Rr! z-xYK5A@zSU!p%R=~c?Hbwr=qm|}QAUr0BIM#@Y1p== zf!nJpg;-%3$o=q;{p*8dPF*Bfz9k(crhcQYVmz=f`a+5%?oq=`X^2jaB3H6X@W6wo z%;uUz7+81?Txu4Bh+-;eA5WlsWp|D*_MKWh-U$U3)3I!`hFN9fR1CT!1<(2GAfW9Z z-L%e<&61R7M-QuDz^f?KnLfhyCHkRFryVAQtI<9$9}p;;M+Q~2sM{JPv(v_n*nc65 z950FkrA{$;mv$Bk?lfZu{{no@^TcX4j3kV`g1JK`p#PoItL`rW-LzVqxV{VP4u;Tk zGp6B^V}&F?>J;hRZcSf{UL@bID#OpF{iwP01V~@r#og00s9oe=8o0m+!}1#FR&zb{ zUNI5Bbw=^xIL>6+hC?WIE0r28u|t*j2!rMaV8MHFdR=e_BFg=GK zSbU4-`^ey-HVJ&36hi&m^r3k7MD_^p3!U2T&y)!ey76=>?WyI%pABhf{ah4gF3NzO z@7dIPUL>qrQb-SlE#-YY4$!2(1P34LP<~uG@%+l^{_l2Uvdc**SaKM{NAk(GZQV@J zu{`RUtbs9$Cd22n5xURv2_qb#1Y)~K$;pM@_$NjW?b4e-=rBOdCVLc_mkR}xjx%Lf zwc+jeI@ORDG>#)+=Jo$ zCUbCFnMQ+iML{3@N%gLcxM32XbWDn8_ecnnH(L%s)v7SKP?gH&T#&R4YhIq&K%#4^Kxuyo*+iyMM~-iGH+vHPr?!#G zN4OH1ym)A+I{@{s>p9;p1hrEY>C^j{Xx@*P8bpBKt8RUC=pi%D2q zk%XC3W}(DIKgf>=#|GWYWQ^19F8#hv4IT?ZowWcwIj2w7sV#v`Md2JbCIRBqGEno& zTDbQ%j2y^PYk|XR@M``?SXz<7Ua{hOYMYGlpye@`FgS~JvQ8xU!c8tCw8m^`e>O61 zJK)u>5a_$31lvtQQMMos`%gKMHRGSqGW{!6*yunq7wXYG4QI?eaGbhT)|<#);Wnd+ z`Q*t)C0uk+39a3uK*E#9s`(aE{<~>7y<;QBlwF1)*<7?-P(zL+>Eh0uP?-K{37ovy zkK@J0q-eYe-U|#-;fI`7-FpuG&YH8?$vS3_pId^MikAus_}f=2DCT0hSCZeROkDC z@H`-m74J`zZx5W|zbqlVJ>t(A`zx}=dqvSuKZkU54icqV$C$a??(ERmV)T;;1wBnk z=4xO7)4RusMmO%I7c%9{KGx*o#5=lZxb6uCHWxu(R3puFRW=jIE^I1#J5KpGtT58Z zmN_0od9g2}uqRLo6|Xdq`=$x7QQm?WJWfS}%Wq*PdNP*H3J`FshVF8&$9LLG@n&En zPc`B`?K>TY-Ni5Q%w1RZ{nKnb-TIl_OngfFTSQvqx+(McA&}mY>!yne{*l8>B%Fw} zgz+=$iHN-cQ<%hp!rB?Ackv1NHrPwz?|0*at}M{zxI=&3_E0a!Mz9cRBW=dXsH0_w zf)8FXGYnW%cs>Kg%cY28M<#VTmx^YZ0kEb`isA3I!|l29@EROpZQ2FWm|IQ0$6cXk zC+wt7hKcwgrwCVYTTb$Q#WY*$F4>ta47QhV(udsUlZR~|ybsdG!YdVECw7yc7kU(T zJUk5s>QQL$;~<{j<&3FW@5r5kRvNbLGCS|XN$@@^1|KDhnfVdixku9lAC?T#tv`2x zu;5ENX?r3#-sZMLu5N)RRy#R9>v3X#uO7Usb;!d<`E-Wa4X$Sy3U7+I`%$(t)||?N zR|11X^hgqs z_)Fv$Z`G~`YzkgxW@m_Ft+gA<9*KiYk0f$F9okPgf$1Vlxwr$%-xpK6!nZU^Aeah!`jKwY*Yx9zK>DHQ6>An|kN#a* zxFq)r@wzt=x6I?y6J>K?o?i%5Ml66mg50hr$JV-Cl1_|2n?s0eIqglcCeEkxF<|Ql zQhGE9ZijQZhp0%*DeB>qPvguoI6`+-i?>ME_tD-&6@0Ww6Aur05tn33xZt)HyH<8n zz2YzQ_L*z+iSi}XSa|?uGp#V^s1`~oEkXN3Q;7R`H(TnGi~IBzLbPTG>Ah?TdtEDl z+{$O{ZEEo7?$20vdo#yR5;4;~wu`8699E_7ZjPPXN?I;PfL(qn3EWixZ*()UVyh>X zJ#J@PODE%rf)sLY^^4}Kd`?gHa>tcfb3sWUl3v_>noep=rB$j4Fw(aM(;Q;SE{}62FC`6qIf4r_=MI+`{quih!yx!4HANRU~-hpwte`*M@Il{PUtdF`5 z*<(Xc4t7Qyqe3!y(3%j2i|3gE-4lRW(?61tMqTLd``cXIB?lV$f637&p?H=b0ZOu} zwEct{r)iXuoAyPpYN0$i{_`arUS1BKSuwcavlN=xx?#_PJ;+~_O&lbXaPx~6+9jre zjbeYP(6l1vN2L(iO~URMB1*6TTXg!+ouk z6SHuKl{xYUUXzdGO5{&X6OsIu4(p`9@#i$AGFr*Y;OygOGXJ>=P(3wVI`1Qj%iSVs zaW$yWVgXVslR4IC40j%1M%-VVYg*}Ci)ZDdsoC^+`opn^M7ae36-dE^_>;I*brmQ+ zozyaU={gLpJAoBxV-!?wl8cM=@OwM=Zp=M~d4Ao*&E6Z87!g>hQc4V`x`MIked^nm zMaxf~CmlLlAm@%Y{u$wNRw`$f8tim=%>Me*N>$cmvwF;Qh)}Hs@0&72XJaD!?SL#8l9yW8wk6qZPsJ-hW%mH4A&R^M?I6mQ2tI3&WSb0)~+U8A12{JNbc-4CIflc5zb-sH*CNvbbx2R)sqXAJ{QNV2(k5TncXR&U=9K7MNm(6?P zMkZ@=d#h?uboH5jvM0KS9&}7Vw|!rl9cRu(Lq@pesFx4ASWC8iKA_y9C4ZHzJ@%fq zDUoBke$is&B={!5V%McbI084#s$sn(R2Bxq0IH!R!si9Y$L1j3m+AnmX|tKuUG%r7oq zfTQ&3vCriE(=p;RDIbP^Nx+dwoWA!+!fg1^UwU;+kyOu@ZF$d~mA1M6!d2tk=2c`F z+2&!&&X=0VUK^N=YA>|u25n2CIK6;0Y`l+Re={*)wiABVI!6oRiiof{$BcUN5-!&M z<1@92IKaD27N~WT>8EAcJ1cc@>f_7c|5e*;cCQuHQM86v9aS{NYJ?a*SO>DRx%@NF z2yDdHqs4`BXm=6j+8u)2UFjq_wf-{QylgK%dN2)I-{g>EHVI%alMOC;mq0N|iwbM{ zFu7ULD7vYUT$c0a816t+D_FW>iwwm>r-|CG^k*-?6pZwAT>xSha01FBVG$K;$oNbDKT|7f2H2ixml+NK{Q zKt=_h)bz1JTjHp%kTNd+J(I5PZX}Xpc6j@d9llqVq5<5_cwL7yY3o)(x4vU+Rk|MM z1!q93Xb5NvE2GKDt<>LfA*h@<0m7ZactwQEGb~7AVqb5CxtCN>aZ4VWnn|1a|EPqc z>m%UA=rHTK={2#&pG4@I7%N;60jIZ&l3&kxG=GB`6;eKc{h!yt{1Zw{MDcXO$loWe zW%6WR?R~uDG|^11zaA#Ud(gvslWCW?5`4Z_4Jy99luYNm!kQk^|4+DO&ARg-VQ~z3 z2OB`rUI^oM-o}i%ndGBd6E=Oj$(MirmDnswgN5b`(ZKmHn=xG+3rfnd*PPS(C6AKz zb52s-I1Qqg-2e$Ot*rSEF&JDjmzDi?maMKf;VZA-iP;@;T#@J`4oAySVUFF9_k1pV zjyJ>$rxek2gE>anu3+w_Ou|Wx4Oq-<0Ev!ru19#598J(}2{u%0SK{^e+ME8~3NOD?X6f8;s~bZnq>De&Fr-O^~wo6ckJI`Om7uVWC|bXu7T<)xQm( zvu+02Un_*mhSz}al3}WLXeW_yGez68oUZyz5EOM5kV=!~X^#J@9y?yfh0 zBlQUo^JF4)PvJJ74a-sDS2k!^N}}L$Iq^neUC=GtcF{hS!d*7 zKr0@Pf7}3yd#%w;iQ|@(`H+Jzr;+6XKn$L6z0FrTs9AE2xj#Baq&5vv!?&VlN1HZ~ z01r8?fAtLqqHbW7(lpZaUOOiKu0_OwOfBbsON}TF#e0UPc%G-HM|}a_GAE(@~5&Q(J%4 z!s0sr712!DBpDhEly zxgvG64d)Et8F%Pi(N54e;d1`}U8MKgI~nBuZcp+oYJYH|*`y_-WY>}Z(9DkOC9JQ) zh`rxPWvvu^y50zpa|y0cX`lj6+o;{M95Oj4jM_ZogK+RS_yVh8exU^F$R6O&j1q+B zbCFn2dclMlyTkgV5`1S7Om#+-QE`_v$X1j?&6HY>!B7i#!bLE3YXSKzSV`XPS&LSB zQz5{k82We4CI-c8NM!R2oHkNVWNJg;?`ABMS4m61-1M6u8AbZl-rGws$U{B`dGQ8`nE64i}Zf8aO?t38Ly^!`w#fMiV0 z-wfqiTha0?g-tORz;*R9dhp0O;P*ZulCS~IH$*ci9Bs|I7PJorKjJaHH2`I0N!=EPB z@NwlWI<#;$Jk2R0U%TIO9PNI*;CYKKh2um!S{D~ASq7Ig;vnzgBW$K~;EP`m4Q{+n zbiOIz`$>LSbLa^8dkA5cr!2a!X{9T3pYVz`+p))02St`lz_PX<#7k8Gw$zu9u;=Nh zrb)@#7<0U1q)6nCZa}A#7pR|lGLh3dOca`ui3$H3^UWe0rF7Dv*{hF+%-W5=Emsj+ zJ$qte--af&(SS?iV4J!jEdCq^Q(gw3^runkStkks%7w^t;PTt*S5d_$l!jz@lB5Ua z;NAa)d|8sne$C@{((meGace!9GAEnb>WDzc?9b%s8b9#-kq!0EbJ5w>5%D&tJ4bMigH#SgIR}1?p&=jCc0?k;O@BRLdn0|FwJ3 zy5HZMR~QsBDs_VNXw5YA8D9WzjIXn-i~>$x=|#3|Dj{j=>p^k-M2tLGMEu^ogEWct zthv*Ell4aGKBM1V2(@9vFVcKVb>v%Qqi_8a>qc_gr4n78NpYpCZ}! z*%Ql|jdZoWQg{)=Tv$dwP9cxBx6l}l zyW)TK5>~`rf{~1DEcw_=_fCJwEW09v3kGMSw(=qP*M1K7DZi&L6KqiEvL%0a`ot6x4;xpt#3{%5^5QqbWbgX76rxl~gD$t}6nrolJBt zoP<-8W-;~Vhv3c(ACg!uigst~VJqji#C!}zk@Q(GRkRG;xDADWwo0HJqf0x_J1{f2 zEH;U2q6xca;18oSpwuNqkIs#T;gc&cV8ucx+OQ8@AI5`V*;0J=YXxjMKaWl=Xo@mwriFn6mpf8Su!Qv^_sFyNgkw6Ez^`w=NKjxs8Byez zM&|P=O2*Tr0_vo3=2w{V&yYTAl{9nd;o-i~Y4D&f61JpKcR;&$NZ#ts^pr~<{)KapFz&oX_Ud>oe%r#7__jCptkoLw%0 zi>d`%^kl1H#rL~3VQ zCfuXb9-X4rM)@={d<57Z&&jL3r@^w4^V_^a;pip-Y&!UbHs^}8yqD*`tBW;pwv`c1 zZYzg3d%kcPBqg+|o`J_F7{fHDLHOuAz-+&bB>2up;@?b2Z}eG6=(~=-)s9%csEiE| zbRznPFVesqGji^$FFp)@2F=!UAbivhtUBw7{)u$75D~>QGi&hp)R!dZpMjaEF$;V1 z-cV8&M>V7}sbi;znemBATvTF)dseBF*&g}$cZEJx!-NVyUR0@`;#s7ZTy2 zN}{9dMNd_gkP-m_{OWLv=X`O5UN8C&ywiWMCscd5O?H76r2`>Yak3QdzXx13w}Q@j zAqv$eCnGMHi7u((=#-nxyl5|@65SRUd9H=qn3sZjuALG)i#zvO=)l9s>r~>u6ngNQ zl37pDvA zRyjfWL=9GQYc$O0nuD%G|7hXPVIm+(;MWU3TzT{a=E^-s*WRV%tw94ukD7Aqq|+o+ zUjTA~>}j@KIQ=!(3Jr?th}T>J_{rso#-Cf!T8}>RQt=#(zaEGNqaTQGL_M4E&XqWQ zTFdqR0WR?#lR9;E=!kwoJ=byFXy1OS|A*k$d4EXlfCqaDoDKri=#Pby%WPEuQ&sRGZzs_xh0Ch(aH@X(@FS$VJ9A{>s@=>~= zQxF@M7-AbwkMTWejh*SfC@xz~TxQRQgw4)i@3R|X&&s1}MKB#-^^^D2{sUO$M!{Jd zVS4K-%d=BqnTJx2=p&*ChMD5 zGfCJT?Fut$=75)=n{HnIfnF4g5u`o3N1HmfGpU2ua72G?Q&e9r{^0x;OmZaothx;s z*gq$4rxEIf`(W62F?ba}CD&$5qU)9jk-F~^O*-ddNvN15wycUGeWsnDcvusfP8YGH zeyKoe!ZCajBFZehu7zjcm{6~rV*H|hg}qXB5K52#qxNlz{7Yrgyt`_`{5tJ;qPj8! zj!N;VVa9K!`%*MJlWKCkpRMreRSvB?aEz3h&BV@qb4a^y4PF(MfVuM;uxjOZ+)VW2F^bFE5)WCQJa4eyci>$X*G<>p~irU;9MQQ0#6n;>IHuG#D z`u{?%%~8ze;#cTo2IZA&}Suu&98AiW`Px!&i>cZTOTf z>?7nx6BA7V;B8``u0TWje2sGj5-))Dv zK2``ozb?$z@uE^Iq(E-14u22FnekiH2BS+d=zGoM;NHQ_#saupsfajkUY*QJ_cl@Y zae|5MZ zp+uHQ_yIdG%KK3?7b|iPK(X#J+WDGuT)I1OU7Oq3^g@Azd|nAJ{WZzPExlZ)-W7x2 zzol(Osf#<>)jV-c!kSSxn&N)T`v>mdk{% z`GB0VG+Z#}mssOYcSSD0SHX6T3!%TJGSE>S0b2hmvFGMi^j13zj&~+O-~Kg3D5e3I ziz-uT)q0#+bQf;y5N-;TvcOR|WZv~pC zxfxcz8X80se7-A^j8ofBbCg{`?)L#)Sa6LPk0A_dg~I6bD%d3b9ldrap@o+RjXlte ze>~!de(xHPel-o(Y3EV*mK2gOqo3TUyG&xE21&K&QTS3h3)I!FgX#wpaxi2FZJpMk z`Ll1VS@&mNIe#zwW-GDYWsqtH3ZwBY2^jox20zy6G0RTwN3`;RjpfNWR`VF|{2^fe zuZY+j`bwJHUc>NF6;v>^CfjNr(Tcuv@czGvcL)+nz=!|XUT@=V3V z@KiEx!dm(wIDupG?E+Jdr}gBA7z~S#A}S9O@dB17`B5A)ZY42BRet2EE+0oOA~o9k z42x&H!!fgS%yxxCaKw0!j+kDfVY+(w@4XSo>Nn$CZsy_nVmaJ0)xeemc5pv@BX}>m zi#I=uLRH35i-%ERu=Eli-wyGiWuYz%E>Wh1ip{jVhGUt;mXg;SClbw<52=md1NBg@ zCD~%guD-tn&l??u3pajRq$jqpSx@STx7R`vcHlF#7v!RM=NR=$`A!!z59vCK9WY1z z9y&RXkd1ZCBuSIw>dF_wz8N8~ViyD3$zeR6Uk|?R!^|blkuXK-0cj6hNsc88!@Nn# z0^#$b5TTd=ME*N7+;alD8xMdrw?Fkc6A58A)adj>+E^tz5xt+vz^#Sp(6}!W?DlYZ zr}KrpGcu-d#`GB0X!F3H>r9^gU5MNDM@gY|6gEeU!uqwhvEF++NqA<4A8VFksOKBs7JC4zC2$8e2yJskR1i@)NNq%WPO|{ zTo0$J{t%(u6`Y&48)fb~F_YCpP^B#ycV1oz^QUX`tJZG8w_R`8oy-1I36I=nuUuw^&F<*yl7bD5=B`&MF^`Iuh5 z?@bmx#dLUp=c`IXe7k>*;NJxt>T2Vl;d3X(lG6L)3aB6j>g zg7APi!AB!6602r}(|?AeRc|J3-)%=q?Yn5v3Q?Fm!4p(xIg(w)&Gf%mcYt$|pr=y| zx@9F8|M41VRo?^kSxwBQ;ML%>QHU?QR}F*BCGg^_r#L8?2x2u=jH=KxX5X_K%zJ3S z-?J%=2)TXbRm|c1L?PEnnD=z_nJvQ#J5YDTDv6$HXJ&H(~_HM)4tzK#Qfv3qy1OEI>0_T=wcIR?QIF?!lU&TsL;nX=Y?~f72d#)n#Q{D@tjFaHs(>xH` zxtin^h~ua}!sX!(#&4A#eyjFiVqW;rUay%b=buT}3`GK&Swf?xQ@TmY06(i=r|o{m zRQlB;@^eBG$9l-F$ z^EY)(>2?`D$M{`zV{$HAlZuIG zK*-~jShM3k$p0rt-e|Vd!*ZPL&UZ4-yZ9fDi&JXSJYa-fLELlj&19O_T*E`zT_{tV z$6I?-q)BJ(2{M}UobFA#0NR!&I3bXa;`hC|@7O#r2-HVW?Jn5zyN~PMbU{lW=O)wM z4(w!W3^abttRLS%WIgO5)_#b!3%Eji_b8Do;Ui3DKnr%RvlC>^*QUyG!o+xz5VQzB zvr7)0VZyi!jb)NLKGVyFnp!akOql@UXM^BRnk5|CVh{7?45Hi9aE?!R1>M*73mnc1 zu*<6wywn5fh~-&aO^vYTcOC{i6_Am>ZoI9qip&gL1e-QYr$&YK*ynHt{cSVIZf$#% z%(}n^{t@N+ajWsj6Ak9wkWiEM{udxRDIC=!(op>JLX5vP5zS5HQ6bs}G87G9+x0M_ z+8NFKt#W~_C)>bo?kpyE+7zsD_#fv!;rqk}sIw4$(=c=px93o8{&8qA`# zt=gQ6)Q36FWsdGV??c0LU+K-vk7SMQXQDiFl;B)&-`rq9lSh+M5`hrWzL$O|b z;pGkMcDcgcD{sjv&a)Jg$n9%x81fgoWYVA2a@6>UF*GG+LRHcUBJoBMVp<-;m6%jC zP@jMSMuYU9+5nMSHNY&7>cddUNR&U?N3)z}z}y!Tam`;J=$mQC?N?KvgzK5@4eq0o zQt#;LpfLEzq!M%WeQ@y(m&py7#uEHw@q2bD*;l`w)$a1ZI*TD%=X?pqWw_u1b|w6{ zc9|g2fxH0;c(ipEp8IIV9yVzNh2tY6Ns-6;sO<)pn&6^EG3x@?{#hf*Mx88bT-BsYJSIuQ z?eD{^{p5A%*_kO=y<-B2TFAM|eEE3mL?~5DIY&aSonTimTcQ2%arhP>ii$3hpmwXD zCJ`Rmn3>UROE>0k$WKzE@|>zio}v!xz7hWH2zs;L3=_5;Mavu&@O90ka)tnc)dmp3 zc>~pMt76qx25xe*Nyp#+=y$>H339mVTt4zq~kkv@U_P6;p~V@cQ7M8K4P z3z_8wLU_2NvvJFzQ-a4==A(4qX4W~h2_C4llY1R&;oPvGLGpT39B6wEOfJtM`F!zKm89mJH;uZDb^ty?B$>3p9 zKYJru+aLyRH=t{V%ZT!hD){470%fv3l#QB-bH8cfT$Lo?RZG#BaAjDdc^FsK&BA$( zCrNXY9%_4yP%{q=*v;i>+NPgHr%)Ep&0EjbZ75-q54N#eP#DDuRPo>`f0UoO5-Oy` z@Lkucc%Q+FXA`583*?G(A~O* z`1W)cnYyQe7kbbNN9K28^s)$&tCfP5%v@N_^&vfLJ$cWI`?x)pJ*;FGLeJ?}biQvp zI=)Bh8yCub3)VxDkr6K3+=)3ouZhct5n?4fO8T9U=)XM$yH2Ho>V%KHNhxKJc`{uv z!6p?R`1#@oxiscQjy*Wv%7&|&$9ZMO#?aGqmK9Obphrt{FpZ|8t%4^la~dVKT?Nph zdzE7*p=;AxNgAu{q6|EKBTLnikP}DfrnaMq$ny0#)KZj$%kuc zVSFm8#-x+uxEz}`xgO~9L)fyHn`xRZ;QFU+*v-vIcOJ=vyeaD#V<$=Y*Ih)qR(27W z7f12GxD@(5&lYXU*VC=ZQn+n#DFaQsQ z$&l=N90pTu$YcFHFyDC_CIqI^1-}YVd1MPduRehzPMpIm!xHwMabp9XzeB-08=C$N zh?nAW5SEW*e>R%(>5mKKeY-Y9C43|f?eoY~@d)^=s6jT@@{*cOxmVv% z83TK_SfjCX9+~hy8;ZIf;e#s?G{jRK1qX%6Bdu=ycK#}}DO41~$OgFXGzCAL2YOCx zJUqMkfh0{n0QM~*KsQbhtlD~!*aa+O)K^;IdqXG4EPaah)t&UC&<*@sx0258A0w7O z+NctD9{6!b1gz;d>T}@)`SZ7!RJ)ebIVR??`tUr2YmRWQ-k&V|G7a5$cHlGQN?#7u z(~c@DEI00fbC;#*^YFts@J|KShow`i9352UGE3{vB*9@3U!vvA?VKez2G7I_)CkL@ zTF)-g&){L4&|*6ZUW2EbFk;F1q})>L{sZl zy7`6-K7AyM*Yis0*}cu6`7{lmNIT)$@IB;#<|3%|)@!o-fB*TC9x2bBgnM69V{1Y* zmo=V1>*9l9Fy|zsxIdutb&$OL#={c_66iszWpMjTDEx49$5lfcY1KM!n30svsC6*=BpRMQEdi^*@ zNCS;c0MGfkKuX&v}u>%hPZV^FFA{Z)f)C!@ToRWW8@Nm6e-BzYS}lSwcR1-!Tr}uJMGHV|h?r zsRZE(9EXTIPuOz%+DUDTK_@o|4V4364>wCoa6CbcUfbe0CLX1ds|~s^`;1{$azL`=0>yPkCUMFlseIJxWV}njY!vtQvALy55}wT z@I$IF=tYW=x8I)##%8y`jL)J?Hv7D|bHh!vNDt-s4ZS2FXcMz=ek$+`u0r^RXFgT}jmyrs+B}1qz|Ai9Z^)#6GxG3UUnQN_5=QOx-O={E7HU5J zL)Oo;z)$7XKqthK2~*$WBL^*-5x*9OYz5@x8IBv4ycsUe>>)aA6#fo7gN-1Irt9>n zuT4E|soqDtt^SY~+}(Yxq9S-o9VK&xw-di2M{GY7N(?y;%;UgS=$y9@BjS5-gX}w4 zm@&q_d8vdMo3fc_8jI<)TekS$hAVJjsxnh~_d8x_IYTCHJx)8C`(fR>7_!ng0^B>D z(Y7p(Xw5T#OT$5w`Cf_N&Dzmn+(szu$ikLJ3wFZd_ZawSA^q{97J9Gz#dwnz@Dwoy zuitOTrZr|zwp75%%f>RUvQ99eh08JJMB<_T`P6KRJuJylpiNn0lw*aW?nWON4LCw| zr{87Ps%Fz`>9tt%bskfDDUP}-T&D#}BG7Wp8o$SvP{j+|AaL_45cjA-^K~ZF<>?;m zD7eQ6UyR}Qj3soBo)X9}5reJ|x1ri`gsdQWD6>cs4$rB=nEG_yO{)%OS9%1f7!I+L z>nvdN+uQ8Cd}|DUAjP(2g+r-pGHv)*PkY~5^X)fylOLr@c=w(%o-sdz-rPQG1(zL& zez6#X>Q>MPB>ON(ja}H5kN3~G(30MbG-Hg*n!o!7 zI^`>I%I||PIk*hRwi?i%ZfO`TOK?KVEh2xN0%I>HILjPt`0qt1vXcVod~PoDxn2q` za-EuwOP$fg;WWw3n?jq^Zm>(elA*az2CUZ;u()xK+{sRatW9@Vw+~9Nq%#m+XP<%X z--;+W8bQCa2|V*!20!=BL8q}DRNb$csx8%_qwh0FX#WH>n`sCQ!OI}K!w*F@r=a}i zJDfY=CRR8e$Ky^9sq3SIY~hlx=yTvOh*#PQd~NRtx?fu3JUd6+IN274PwL^Xj5FlT zyU#c|X)-zECWN`$XQTWbv8Hq`mp)cLo6BIoW=_f4VsPd(6bqBbko*R?TdUesGP4BL zS11D0dI(m^?WDz4CFIk}BaEZadQkij0?ng;=~360towWxN;Oaw(&^0>YS1J3lH%R7ilS&ZJ@ zUuhPXIkH(@NAA2W!T$~!aGaU|qN?bHrlr_q+t`@C!0{}z;ir3Z!(0rlo2VV6x?9g$?9DUgMANVFlqTp zP{t;hGxH2H)kG7dsx;tkk{X+#EDIxChh2P21#I?@Kwaf@{JzZ;-A{?~FP62EcA<^5 zIx7=GF3R$^JymRS%9bHnAGD#k+ZXmmWsp>*Xp+pYhxhxqETDr1bFVv{-1w7BrmndR zm~V+X3w{uup)2|y&co{=OHt!M9JK%AShsnXQI&jPJ}wV|5B%+5Ty9B2u4%IFWlb?92n&5r8NkZ|Ex?Bn(`pGyRwdSe32pJIk*e+R=(^_ehY zrGv}z4?wAA5tD1{3F}h&Q)|`JrC8D2`XXCTT9xgw#JkTD0lwW|eDQoEsFIyzt zx@gsA310D!$hP#IWbUOB>X$zs9{Z^gcd2Fg!m2j?;iCQ_AVn)y8zoSR9mv#XxS34Jax9JY77l4{Roni;$YpSd|ET2N@6VbLqkq96ikRF^THQEUM69NJS#|g_)WTZ z*#JJ}_Jqy*MeyRaHIQGVih_+EL_ujfN!^@>qpdka(kY1UIc5d_jmDz5n>kSkdc}Nt z%<;{icEe-4zi8K5Nmre_L`>8QxO{#!wjbg1Tw1P>cQV=#c_al!t|yYcE9;0`XHD3^NDTE+ai*Rm5Gqf>f)7 zHm2L0VvUbQBflV;NZY<8Ya%mI=%$KA(xE6S`ui>><~*f8SQT7j{TYS=ye%bgE$TA*#bBd%c%qHRSy>W|k3-}%F& z@xM*<;tW|L_ud7?uYRIi3%#lK-ruyPz5~`cer01k^KrswVH_V}Meg69f$5czko-#l z-`(3y9_CHP+YjGh3cA1vBQgBzT>@`huHd*UVQ_|HNnGC$K#R}b$KtpUNJ!s-%^zx! z8PEVfm}6w5Kw_%tR( zXR^vCr_!1!okUXoA}x~h$HbjmK~ZxfQ9kvVt}`%%Cu^19K)Dvg8^6ReQ#B#b@ClVn zKZMUewBwz9EI#EOC0BQfg84ZfcP2Or;p=)yVvi#(2;9zfD+cJ_oz0|Y$^a?aqzG@^ zTA9tEn<0?9%Y2!e$b9{IpU$a0hff|2(0!UKh^K8Y(b{BA@-iFgF6J@Fc$Zm-ulm8P zGM)kkt(BnbS&ZAGwqTI)M}ohr;DUi0&}qhWNuN8J6_rdDW%J00!xpA+TMs^suczBq zhmbg(Xc#2f%wLCe7}?fFt4xhKcFR+8y{wT0UQxulh(Ksc2*JH2yD;T^C4KjM z$INl@;c1mG!lg^KK<@QyI_|j+Olda}1ZhsD=C#V$nQ@mnsXYs47=+Q0o7~<1jUm+7 zXAnu#Dd6_95>f<6&;9hn1j)nDbIuo61ccz7x-K+aAB*dq^YLTG5%Tz_Dio>7lWlwt zTytTR`UI?Fla?*O9Cu47KePgtJ9R*7>roW)UW9#X7h$IYmsuPTCJh75r10h$RFVyW zu!#%swPz+AiPJ-!<=if5Rs;KC-w_OWT*Ev~$ROvgC1dxBw^;mwa}lcSCMWl=2UTD0 z&i7_6xZJ6Oj|*0S>A5yZt`m^pIlCFhQfW79Ii zV2@k_`=`AG;u^JZ$r^FK-|Tc+5t)PcRxg3H^dP#rbU(g&@gE5j9)=0IY2BSXh{c zMK^Ad*DE7IlD*5u(SKCGNeg_YC(~K~iGb;+^Egy$0C?XN#B4*rPOSl!745)97 z=aEloiCkyhANuOfW7wrNII+>FsV>(U^OFbIg>Ows_rXkRY9~)Cw^pL5elwMdkmZXV zN+WtphS0u#4fD7s4jvmzp^An-d7FKm9AmBmt#3dBTQm5;%?Aqqxzlq3Zf0SajBu=t z28fG5?{t=|;9N8>)Ms;y(P%QR&IH2jd^5;=@*kc0yPoooB*MgvX|ylyH}#MFfI8Y4Y~Vx-lr2g| z+gtTSrPT`0t8Ret;&#}Tv>Y9d$PsIe@n~lLmM!_RA1@qSjIT^4;O0;(^p7rK9)x+* zk++lK_!?W@NM9ffoOXgORy-O!r=Lj>uO$=toM%l`vmL$9DUOMb{P9Ui>i=pn|78Ej!rf=0F(0pta_7~p;Y55ZP`LBy^D!h%KDvj~R zl2QoP?Ig#lIsbu}1RXD?2v4(KFzzpru|Jpy8XxcB50$gTd6O8-v{itn749&D>m-d# zK7p1gm(j+hkWRJ;hJx%YJie5N6B5O65^y%{ceChxu*Tu?>c(H^Em(n3x1e&~dXyMm zMF&oEx7S_beD87Vu>1Z_+A!A~6~^{*cfqN+BL5|m_%xHI84DAch}Eps+MQ&Wn;CdK zj>VH6`b7G=5gdL#jo7%JBV!IfX;juE>|eDOcF)=azbejS`)dbUk(vbN%sD(eK9O^S zcaY`L!6Yg6slj8a=(Zgc-Ta~K;4au> zql79-UrGD+BFf}FAVn7&S*rx@-!Rt1ov%N_o_#LFRXPjqDtD26;|M!i!=ZN|1)kX4 zr4@gj8}GSg(6nnAf-H4sSh`0Zr~3T_=M@{7X=+Y%y1qXiZ+OZ^?Oz7ADVNB!tR8yG zY%BgW9}gw34&f2_C9oG-37v1viJ*5qnvQ>Cv5-68<^9bj1)bKMZ~OuL)tk(&vaz5$ zKiR==&UJBk{~L6@5DaLV1?MY&v9mNAm@8M~U}6{#1J#S6cyki%*eC_N=H9{DtGTd` z1hT=|(tKyP8Jv@QEmIz1O&7-MHTiD5N2;d&W?sd{;Xaie)M05n`ZsVnJipcG6dOTe zd&j~1num1jDOnKywgwK|Ss=Jxrw{87y<$hsS;71DVMOi8Ea2_p*nhKyVU9;3>`$A4 z)&_F0-{BAArtc2CE#GLD$4)BJ{f%_Y`po;j&;bkAn!wTGcyzwUc^PNh;Q37}pwT%5 zU&9FXo*FN>>Kj7uyi35AXGVhYT3jBra2dY){))bqy2X}nrgVdFCbT$WK(lj8&!WBYGgI1qJ}Mr2*2bq(>5wfh9!<8Y13 z5@bVwk28tAszEdyTm{>|6cAOx5o%W9ilvu}smseUTKQ6kyp%}6x~vQMvy6up7g~4; z#t)d3_G@^!yb`ZBSRf<)mIk@T(c}f2!0cW%*}hH}>b@s28wTdUsC+1Xn-RyfT#ke2 zemO)J0~)+xF1=E_9&?2niC&&9NNktDf*u~0jT1(n$TPUXV=Lr!2a-5tu0t$7kz^cg z#hKD&5b)_XT3f2nt^36AZfhq@jCoC{#B}_y@I703f(JTH8FWwQB=G)Q4{DDkNbJLY zT2-QnlT3Sv&A>&nV{sPG$7uo-tDPdVy&e+3_$|0$(;VEL8G)7>Te*zlGu*ar8nhl- zi*}W1>;`R0E^mwE`0VCnhJqPvt-37zUKvVVo@&sES4c}>XfkR^CKGJQvw&i>5$u8 zW=d8h9Q#Wvv8(2t;8*1XvOs7ZluNE+{MVm^ez7K!P@oMPZ@*%{?GS+I<2xubkMqeU z-3R@R4P>a+34eSM!inGia9jZ{yE(ju?%?K+>8jlSYHtRsAF}~s8}0E}i6{2RJ_MDb zCJ-;%X?}&7IJe~UBBvC#08FVH| zLfOC_HnO*uJb13r#LvIW80E|1W8G_Xw#pFfdT$8!$3jVSgF2p`m5hoR(;;>IX?9v~ zI9YJe4U`SjiS&_6D9!b{2V3hvLoW%8*0++^TH3^A?@L~mrX4U^dtsTGIF#uYLQUo* zW|QAj>b|Ccm|hJ>jf51Amm`b^1*!COyAR3bi9kp0M6y}el^L7ME{3BSK^YQUR0mm;)!uX~n`#_n z>5C4a%{U*pT`5i7LKZUdCEN_;@Eef)F&pTeLL43`rmI<17EuVwdkjJS~iLZ*5M?xF19 zfleB|LITR(TN5vzB&b-LNQ0F|1f|P8X!(~H^hE1Bv74@S7%9`_tPx(vza zkr@KqqfC-77eG_fb>4~{w_slB6L>ya0M+%JLzA1wPBHrh4hN-Zz|5>bYr#xa{l`}8r=U!TTE@1`zm7h?GmZijz2iF`HNf(zCp zgIS#!eRA~_J-$5WblI2uP){|jf+?s}5O$&2CUOh+OU6d@yOPqnH!e}~0?+yN~NN19SL6+Zi?2{&N!X>PDF1T z#kA~Wxae&s`RKuo$`ak6y7nPH%t*l~>Ww$gTaqi<(Wvsikd3r$g7_^bv1ZX!7{5;v zGm15Eb(UK=@ z$u%$Bv?r5XeN|7EcW|A#bZJccA_MiScd&=OhG3&w2bAdEgNrU%RDI)CGSed*=P$8> z=I8?Q%+3przCBNc=dt*N>pbnqxCrm8YDrk|QQ(KULrRApuARJ#7$mM@Qn`1-$w7@o zK23p+U1xDy8|Nxs^%=(^zd)PFL)4pe8lT)Br2nn%r22A-6e8ta^-gLJ!=X-gyTVU#%av>D%^DbohfYBdqFv&7qqyileGCKz-4SM zqg|Ja2hP^95te@~25;KY#{X1cLqh~^wm3mWUT0A?XK`}y#ylK$NQ4j4MtEGr1iEu` zK16ly`gB97LT&CD%R6Fj{$Of*L31pG$QCd{EB239|X}qUASga zJCulv(VdOU!SQ|-N-7;DFYLLQhG`Bazm1_L4)UNpaS`9Y6VYAq09x$dM2<-238rx_ zyN>E4BIcY;n_7IZV7VFo-kDBHPo&Y@V>ignZb{6I-w(CLBKV-|G{=gIrXfj1-Qq~1$#DpX|3mC<$I!H5D@@c>M7@pQ@Rq0yzbbB& zJ(|RMuIu}7v?c@2sg_XQI58CYUP@=`TQFi#D{+#QH9Xz%fTnlq!({UW=1}Vz!BC|F z{870}^%_fw{jq~2=;(c1o3nw9JLLp@9eaqxBULOG$^=1s0{Hw2#=^K|tXw~z_6B9( zI#F$SyOO(e&mCnirbpvq-EPRTkHNts-`IehhfsmD$bZ*!@$sa0yq(8wpgmfg^t)ex zpOGefnXDO5UX~62Tod5&A{jh67RT_ z%CMUx%}RyZZH^#o1ixAGQ4)G=259oEP>9qWrTSks;F>AhuxffU6&5lh3Lm=B*B}B@ z-Nfj|nslCg)dDo|7U9eEoQ5kydSvyNTzGMD0&O=LrLKS0VEM=AY;3j^)VF(6%9(Aipvl~1jj9}Q3I7QUE~8*4ZHznhxeW8jf6UAfU(j+; zL=pcfL_@7DQJ)-h~8cp)StU`IB9VCm<3zc!qGMjwpaKh-ZY7#bjf;1?Wg7J>UAk;q| z9pC&W(=UI+ukq8NtuvN9y_H5ZFDD@}mPP5?qIfN4JlJ!&g#T1q@koy%(_A-1tzB2c zhrQ>aOJWXqemup_`l$jtrfdK|Q)8kU5JsFD72sjkemE^tYV7Ol^^2vabf7Vz@Du7D^8b2+kx_wahyYt<0S}<#|JT?)U>gOnE&y@=L)|_ zz!4s~mA{&KU6Bj3Tz50y92Fq5_z7@t3AV``;FzPXFy|HLN?Yzs@ZV`Nt233(+;oHH zDbB=?O9$vBrzq%H)WSH`Zoz%deYoP`BoKUE0mA9+Y|}$Of$}^77TIT#*@j0!x^*#i zsGm!1e~rh-6;nV$T@z1eB;a@dMAW&xjV2i_fQ;S}&^jJU9voxow4JNq_OVZd%ZyP| z4K8=KSQEOvk3w&YGuCGXY@y^DpgJO{x&hIp6fxl+6dVj)xy@xeggT-vmibe!an8v>91T;NrlN~ z&@XyUyNvY7?x5xH_t7;H(^-wiT}4F8HWPH4o-hyZ>_e-9NLZ|lP*0CD%j7hh6gy1t zp?)rUYH+UN1KUaYc&_vPtp?7UOv3J6;8W?IjN-Fc_5`KJ?p_v`1$ z{QgCw7W8rb^xf#HwgF$bis9N9u~b&KR8abBGdxgNfxU_E$-*oj&{)UuEFNW&nhlx6 z;<_)M)yyTrSpt&$MhHuKPmz+8dDM6?lx}^hPI?!}GKziUu%FjR)q+GY>2v~obulJ~ zoKFkdgiJsyAp|yLo~3D*3~_rz0tbti?G6>M(9mEc4T&5dX;CBXK*Hkrq#B>SN0Jw5LztH7D;Qvz1+F zmh~i3rf?l3N(Dr+Y%hIuIFSs>iGYhtI*!-QN8SELSom~4>f~EOFqg+Uvt>6_dHbSM zx(w-D_)#Ev@d`6|xR;vroMQwsrZ{jVh<3bOg{e#{S@K#HZq#KmZE~C7>Ucl2*eyfX zy)py`j@<68(1Yywehkp@#2-cb@vB1+Jdj#NeoxZJh5fN~-s|sV_Z@w>w|zCa>stW9 zv7B2z<}Q6GX24`U-cC*4=)ks(90MgznKg;wdX<|e;z-R|to}0&@J<9#`XL8>^BZCG za~?f-)RCO@ET=Q)-lH?rjj%B63FrkSz$p)FGRsK;eQb^JWRN_-wro21Za%46poNoN zrb1lk6f)jkmLGJii{wdJVOjnYYUi~WW$*c6&GBrUl{OCbZfWA1VGl}6Qb|D7O!V9F zo8FU?g*3y*H2ZiyUZx$;&VIyc*;Pd6^;2;C*U0u;lrq09Zvc^Ufu9Z!@W@T>3{p3Z zT-F*QBa9(!jO)fWGb6N*mZmnhZP8o57v7vr$NaH>RCQ!Bnei`<_1yS__KX;SxkDrD zTXdOxuus8{9VK4!-ufKGP zcoGOYd9Y>qXWCsWMBL>r(S{S8ONHwX9u(yqaE9DYaL+&TzF3`Mzkepgr3^ z@#;@MD*x4xc60gQD`_`zlhHnq?8zo6%NNn#l2#~inndlg`20hqW@Jr~Jen3yLYb6q zM&T&e`P+XSO2*&7c@sTh?BZPhT-h)5k-H33gvmh69cj3!6=I?9aS8SHj^LU(rv#Fs z`{-_QE0`sfO1t+T;ykGVymNJmjN8pxd~*`vk}}7bEw_PEm(OJD{s9c0B;6FK(8P7O z9pIxwJl?ud$vFcrQ0HA2P$1XLv_yWTrZKgk!H=eO1vyxLY%b&aX$?*okfsW|XTzo? zW$5WVi=5$kkY_=UFr1B|eb&*auXqcms+&-0e`%PrZa&}F*bf|nkHd9!S6KA@3P?J% z!L@n0@cZ-)(zSXuI2gZXqo?e}`)y_1thSDJ-hYlK&BtNO7h||J&_nlY^QofYdE9sz zh*4oaF^H1Gqt)k-G|YqvMr|;~Xe#^AMTWbx;7f*fP9K#vwu5!I2ZK5}$mkP42Nt5_fvby9pd|m&E z_+Pk-c0U8*+IVT$xb`1w-S`Z9jm0779iQg;=TJYN8~DOmj1Av9MkTw{iTA=IXmsT< zyK_jLjtGU2SpFgOt!(D{_0OoNPa^eu@|P`r@rLPCE`)XWbYT1NT(Iu_Ll3SU#1F@E zVVmX!Y?oL|@Y)Djrl8(vGkGE^v|HmW@nYC~^#Kj>PNf071a@a%DBXTpl!gULz?t94 zuDzFTOYeAxro%+8A9~sD~#I$cWO28jYOo( zgPYw);C7ib9=o4M(>AH%ZS6!55}OWB;!D6>=`oqPIuc6%^Mt^{2wXd)glG40JpJ*L zFzMQIMoMxiQFt{Mg#-W5vnIx%d9)18+APTjZkK5sxd&RiF42?rdRXgS1FhU#!_7z$ zXE&yDSWGDz;UWh|1kPmKm)Epq{AcDuUOm{h{v$UXZDHMOQ!cAF3mEO~ux0KC+VI~D ze%tc~5^sHhc9!2K`)*Fb)fp4c)EbV^`*xb04ggoq`v$vbU0=Xpi#Q9ywR(O+3u5-yP`Ger? zZwhwX{ZUjum&yCnf!8OR!SvJ`do_(y^ zOtVX;QnlsvM7G=(S{9GzH_JtmN6}hv%9&Rv%uVU1qq8IhnYX>s_Ps4qUJdyy?JL-~Fo(9;n$yMqqv$;RYJA@~-d0FU zLZL~bkmh;rt0EdStdx`;vK5kO@4bi8Qqt6<&U0VKEFvo+(N{8?Rz`^5^ZO4vy`J-& z`@XKv=lwn|gB2m(nD}u$X*Dh;vED2yeSD4_-<<^Pw1V)oSh#OfORJw(Qzt7PNDYo7 zjU`Bp94cVupJMv*odpJqW|{0!us}^%M^4>;g#I7a(}i5#LuB6<8nQ4ML%k|dZQFaY zD}6c?PiZ3Gq<0Y2XHvW~Gn`58zIm9kd6>)NJSKNFeRw1F=~U_bGT5vBn=kWFg?#1Q ztq+Qopk$Rh*p=r%_d7A>Qmrr|?E4Nb(!zCw@ zA!%5{Y|idzxV>J%EG1G4Ws(o$PASfLptKWm|8dW^X8=0$rC-#t5=ywqEQmyW8y$?{{c*D44m zth$1V7vJ&@4rb&0=oqp}^b<2p>Mn5_RKR}i2K=;=%X08kKrg3??DxMxI=DT1)22MK z?e`{Yn;8TqM<5LU`e7ANtLeM}=Q`^jga} zDBgF28A|G5U#-)n*Sf38S3w|1sa?Yw*IxdQ`d4)M-*HGrt`f>Kf*9MM%zek#Oc@K9Sr7*89_7 z|J3DZvH3iZt)5_TV-@m8b~DA(8KT>>haNj*O^qHW!{bFk#Jub)Rn&h<*G;-kG=}ey zsg`N@mb*I#li9J1CU5I#2wpXu_o^{ZXFIMP25>XLEQ)R z-7Lt+bZw}4d!O~ycnM1;sNwzdCiI<7G8&}50D1LGn0@d79ku8DCDF#1#Qml;MCZ|W z%ZAtqHQgMq+8OH%h0GoqMZ&Z8GLljw!1?>aO|lw9AfZ!25V0o(wp3oE_9JdExFrKu z?TW;)*N4FMMG>91^8-VJsv)U>OL~waAXzn z9+yXkgMJf#%?i{z#+?^GQkeZ@Dihi+3!hIVV5WH#{+rfIFN*a5uVojU>RyDK2AZMv z+dJB`I}lS;lmuEwGI@6H^H<=uWGWFUqg!IW7)AELV^pP={VQpGE-8MMoPGy?A6JOsHLu`*@6AZ^q${UIQ;i7 z`H88pT;d!v$enp}ww*_XBS_v{93}^OA;fLQdbl602J0WFf@W7Fk(O!Teh>H0q}QqrnM*aQoFRQm-Y9htDiyPra4|4Lb`E zdbEgC-h9X(S04#yS2)3veOK9K9S_OoUr*6+{R(Kl#CaAR(ur!2J2Y&npzke1Aw=4g z{^2^-!H*9zktHe|FVcW6%+BLq+p`ny6epvW8o&lO8H|oMpbfjB$MC12ZL}>38*Hd?9fV%u+0& ztRV+nc&p%P?RE02NeE2}CcqY3X~A6IMxM5zIo{OeF}~VJi>~p30f^8h* zARBBKYg31^3=HG$-oIb*`H7L!V1M#UqIN%;xTmZKJ#Oz|F!dlF@ZU|NCXB-+8!r-v zfo>Xi`aPUl7>(Q7lIV$97BEd=3Hl%XMeU{v@V7|=^SG;&@*+Lql=u#;acQF!xh%a^ z>;&$TsZ8e5aO}Oko__p#5=uWFhw)fTrErW@zrKV{t5-zfmr@vTy^V=@aDRIHqBCChgik5tfVO*4WuwzZJ_H}H>{bU+C@>f=zq zTLpvELg_u<+t?r%K~1W6S8F$BNJwPC(=MTGF+8ka>3D0J_L*AeEs&l9#1W=gunJnbXhe z8%3eTuZgsD`WM=5UO+PHZbOi;Kiz*^o@U)&PKz`*gO_t0=57xn4PVwn>lYc?_0|Dv z_6*ZEANN6%*#YLh$^k~Ga4GjWezWbj4|99vqkQjUDR3db39Q4!sYOmX%rv`2S9PqX zkJ3X)dmiU!aX1HsmpJ~3r4_xgLL%t7>Oe$40?VIrUY_fejtj7dtv?^bkZUdJ z`gWhWB7YK_jI*h~uM2c0=Yg5cQ+7>C9nt57@dm#I;M5;AB=s?annwhf$IYTTWsUHD z?rApHeJvy2y@)nOL}Ci(f811ck$kzL#S zWJaapoyk|I^iE1*o~yymSJzlO5l74~mu0USSmDvdcR(ti+l?xRumh(~(S-1O6r;3I z<75^@S9zhy^5-UyAdz;`;$ z$GONiY0I6{OBabg%BPls`5z(Wq4!;jkyEV_=`R2vq~Pop;_zTrT|8)ja&8J_xY zIuuj@UAV5F3?1j;oU|*XqrH|a+El_!-Yp72qn?v7}VRR zkY6kRlBU7y9vff;f*% z#4=tyWT@G4f2TYKt1FSw=d&?9T?3P4tg-p56>8{9z-sXf`k#y@CjA{IwVw+y!Fe)n zD+~pDH8Tt-;oPht(-`Y7LFDx4HEazKg$$2GaL5@Wchc7L_j~<^8aK|P`I(dWI#+>C zC{x6UTb-m_w}dR(yasoE8OA3cBC)*vDT?N}V~W&uvP5DU?)?x>|KnVFADdip(1qg= z?^9ugL)&SPwkhqnIR}z22;;03hf(s&Ann|u#fY5dfy}xJ;(GiD${5FS`^oR@WzL7W zXNwyX^KCN(HY=l}{!d0SE(GMuMA6W_mON|nfoZP{u*XLxpgc0JvSjX zJ{z!QgxkkHJdGC)+$K@)Oo&S8WV4!8Kk#5cB!qYQQp3!J$bT=49yhiS*?Wk4KBQr) zNGvt-u%IJJ>+x}d1jcK&(9N8~O_)(e*H_3S)?b0-gVkhvqYCB!Jp+4xZNMpfmVDjj z$>erNQ{P?c#6XnbJMhZ`S zrak`>Nq^lX;60ZnQ{L;~ESE2ASgbXOPtpPPt(EMpM-6cFrxufCypibadCBp`v>45l zOZ1*PwT$*itKvenvBQ%sa*oSNEdR;yuX3 zYJvCU7!-e44k>L2F0d1Li?Q85i(ET)cU zm*H_w8Mu|xLT9PXVA9Zcy7=u~s@*$YpfEWM!*3Krq5NmE^Qr`HNm~ZfpX|dA zy$_iO-?N#-ic8F2n@S=X*-P&0N5DE06=KBH(F^MmeQ4W7seWt6sPm_s*4|#Qx4s=j?jFkzf$E3$kskM6)4q5G` zYgQ5LcV!{|oD_KVR}h!}OZef{8%9Y2z`^()6+hoj7S7xQryVwsORru-dWJpD3j5CV zpLk2={HIC!;;s`d8D)Xy(gAu&-x}9j<mDKagEVQ<_C3Y8z>HQkmPJRRugaT*a8{Y$Us*O3?P82UslXC06Z^iQ|A9VUHbwWQhXqF24=K zyjQ?`Mb2}y@Cvoq&Akg{9?{AZ)%54|CKTT33BM}LF>=vibV`|Nc3-{@Jf>w(zP3V> z%w9i?`;Q~J#f^y5x=yHqStjl>NmHO`Ts8(jl($JYL<vMQMYd?ZS99Py$JHM zZ50#_F#v;I2lPoR| zmc6|g&pEsEm->DqC)+q@PAr!z;4(KqPB;^L$94=#WypOG8@v!92V*v;XwgwVEaL7m zPBsPfn#ERJd{2&?Upo%Xk6uQbJh^=HJ9yp|vgb2A3}C}e4wJQUmvgmkB0WCyKe6~bfa#+o(6MmQ5*Nn{i2>)vq9 z|0^36_JW4|CkIC#yhgp{`Xo!=jfMt4$F!iCf{*LRL-%PN@Xm@L-=$rM%-|9TSYJ&P znF(<8kvXo@I?jf@sRe}vs<=7V5dY*NnK%6bJ@lUy`%`2tjJqm=%StF}8K1>!X=j+P zXbHYT0UYykA6#v_N)~?cCQW(2+1+35(C6$ca{>jL=Z} ztYAS|HOQVkg^MS+q0x*&lpG5Itwsqv;%Q=B-LVE^r}|=cT|VBpf0%@SO2f{D+iBP1 zToO8ZhjpJCL_*RStjkWsH!Zf*$H*7Pz3Zlvmab+>dM(?Jd?|HE&WFOnwZ^VrFgqn{2;2Mt9P zNT{0w`!$Op*5osLC0_wr16FY}q-;3)_cD5{jwPC6TsD4BAqH=nf#WaaVcGpmf>Dcb z(wCd;)90pe*$%KcyPv$8wvcL8a$S{Hj;$#hK|c9yfuCKIm@fzRQKeJqR=lW@7HXA#u|Y9+#BF!{|Lq< zv6%38jFzn7vV3#akgpv<*zso}xg|0ObqvgK{st>}lv6^lew|6Dt>oSjb@Es>w~hK< ztA&#fx!-5a7^vEB4nGa96X9D+@%FoOG;@6e=Bcj4idhrbj-U^?;7=csxH}EXb2`!J z;8U`3RwtRgyp5JL+TvvHT=_n_m(9!{54v9Zj37G>4)(9a`VCEx=Bz=h6ly_tYy;r2 zbeh32U$SGAfkT#1xyS_|wqk@@)GH7r%>~3_mn40&q?8qTFOI24EleddWbnDn0s4UJ zv>yvGL8TWFboVtWa8As{IB7lD(9=P_p4dip+pEY~X=Y?2q)w zhY~uO@dRT`AUy884UsC;N_h{-7v^>z>+0yx+feuqY^a6eEzp`K0k@~Wgn6&E1cu*U zqYSIhyQ<_yMO=T7)O9&@itc9YxTp?}0Y8~l83)MX-)ZzoKpN5LP{kx^X|^JviR7zF znZ1?>Mv2HXpnS)eiG62)S+*m@z#s;DcXiRZVwso`;e#J*ikL53U$P5)#n57+F8;NU zf|2PQJIZz^#SnC6>@agDW@8hL;a zodvjVc|9ub5JPL>9XRsF7sDQWp!;Jl;JRgI z={i-kK1X7*Be0t5by$>(;tFLWB7Hy(kJ%f;7dtmP-Z>sqn}VQRM-vo}I#NGN3n(%0 z1}1zfo%FDRERZ`-dcTQdLYxVjYlQLtdE1fUiUOQ(GZiK?2gszb3cT};>qIEIqV4Wy z_@}#{es*|5Ztwm_ruhcZkiglny-oqO;$vw{q70<>XEQaj-%0H7H8OqYYcTjCU@ffX z;0ot8xTJg~yjI-H41Jhr7GY8jz0;TAA|GMAdh{OVTW#h0c-7+OxL6F=;QAYVZrFBv z3uc85QB#$*=)8Upe7RSSX=anmj$3M?bo8Ng;C)vZPb=5@k>n(b6xSmRE$^tSbPE`uiLA7rO|H-*M z#F5)q6n{&_S4XCx>-3kz_st17C$}2Zi>kp|(ieu`#8F%6Ahzh^ZQu{qkTIVeSbI_w zV>+%daz;7i+;?lZ>F!FZrFUR6w+b3)n2H%{x%BDE;PF%I(;n(%?P}Ob+(>An0 z*rn+()i@XpIex~mwOYtlEQc*yWihn#7frdX4$H26pn@+BDEodQCaj)Bo~UVnZlEo- zk=IB5>}x##_T6asriRN_?qUyUkKskO5@ocC=(^@2YIW8dP6hr)=641%n)53`qR|4n z1O7mZd^0_iy@V%rC4v~PPT?)+4I-1K)`Q`eLlDA`jSEQIDBM#m{_q%=N{dGcQ{BY5$Pnf;wl_x^K)ZjKu=?)^39 z$+WNZug+$i+x>M2iN*`X7t|5-{kO$`20`b*v$-Xx1!N*M3iubAZh=g8U3KhP<5BmPBYDsyZeyuLM+7Ki<$YaE8K zXR{o&e!`NGb;Dd1*%;R3N7Dh*8fd;%j<*~W@k*x!eUT<0AvMczbwLFDxMhg5xp#wR z{5fz8^8$hH9vH}5PTfTtaAwt0GWv2n7;j|Z$}f3n73v|)?aS$C=yCWtgNMF1KQrwC zo9K3@EL!@fh;Gi^46!$SX@x@xjU8$w^;}-uzwR`5PcwyMj3!nLEFt;pLrC#SYg}B} zz-~EfXcnC=fJ@easQto}iUp*z<26JeRci+7JzvV|9C3lZi^{0c1Sn!y!Lgk@h^_hr zvt1&S1np4@WX#(IAOD;!U=w3d;%W$r&-g+_4)@?u({E&l|8a7CsEytg^}*<0w;?pp z78Tsiz&6cBh&$N`zX~7X{K*%wSxZuoHDd)eYUc9w{&(Q^;dEGgjKvgF6=tiX1TJ+6 zWsADS#^ z$D36T@UdPsO%Xo}KbS03=n($bqLpjKaTjtdxBX{lumcivbCgPhw$3dIQa^ zPzK(UGThqH0oR0`DBt5W3eR&V$1UY?BDX736nv(EbB@F73VS5ge$?i{CbQ#{KGR^u zPgKM5JL4tO!(;?CqFLl7RQ8^aXFg~$Uy`$6tz-l?08%RZoz{zUW5nzhnk3_MiMnTnoDhU#z6Tpm)HJugSrJjpuQ^u&^|qz z;N_WMr8@{AW~W)>$I@<++2tOJ6fK9^S6qjs%YytE zx&%&^bK!v2Oq!w~P5v7{p9U_wKz)cNO&WI=*7Yp~$2C0WOus4`sK$}E%0{q$O%3Q) zXyOO$Ac%Z@3+-M-lKPC(B+*$Oc23rVZZ~~M6jC-Dbl}sYbH@|wUKR3w%^avK`c7{q zIipAO16X0+%y(GnN!Fysz}tvW?ipCZxgkw)%V0HeZp{bvMmzHRK`2- XqRl)NV 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

      Wq^wL?O@SEnIw-kLzdVVj0JbY^=c{Cs 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

      B6oh^t;Y4P);d?ncZ7W{oQ5g+b5@RU}ZkDO;-z! z>Zg;T>>?1UyNdsPbxIzvsJPZFvaXW-4N)u2!Z{Fq_JqjLP&WkjxQWWOxetM$eL|NmrfN1u?JD$ZL$UIJdN?G zq9W=)=3ESmF5wKZ9!zVUirEXgQTNd^(!O;rl{~x;+7CD5?g&ElpOiqO>=inEubsU- zWi5_=tR*6K@7Xms{6I!!0#k6PgfiwcnM4^CCTRCKRsPqDlV9#9Z%*$b0(SSAfIWXv z&2u6;t@#K&M%zKzebBV(s5pK#H10_twU>?X-IPB><4_GQ zm!Cm`l3tTj(^5Ip?vLt=Ai(H z+tftV6pvti@EdxQn>iDX9a#2E4#+)kF84VL-T#I{SGzs^6>9<#s+Z~3-JRq`j|Y4? z;{~1BHeCPc4`)AC#`$;F(C$yp*v92;Q)Xq5*u7`zpT=7avs;@mf5r(~Jk16+=t%O~ zXY0^RUNCGr!oAb7HBlm8h&TJ44;~WI#&hA-xH$PKG2pA9V1N@omuCsK=HZRfc{uu= zrH@}I5$U=%I`gb5%!yw{rP5!JOyLXkti&zW)_*#f%<^ZS-T4Y@H(tbIk8qm81AXk6OpnazyOxZsd(*D~H_1E^mxbYI!hO4@8+_aA@SaS$d zH=d>eaivhZJ`~>;oFpS6Gub^>eDbDEflj`r#XG()hTIO6Lisl_=pt$chAUsg6TKVg zkX=heouaY1S%PTgy{9KdXX2?8eQd}VMfg~X`oxUlcTaNEoO8*9gb=SrGqxl$0qTes zywy2QT<$$0PrRn#^GA&^8kr0(-P zu*=#{D$4D_x7Z(hbK{_5X#hSwK7&q(DKLHSX%A;wY-x<)trn{!+&F?Y&{o;5oXBG)H7o!WdPlCTmpRxY34hihM%NVQs!Eo;fGJQe; zajlO8J4ta|#AWBYp4q^X`?AQ|$D?AgBlZOJP{Z#}LAYWz{mbPI^rZDMY-%!IY{)<} z$Co7U$_j-zgb|Rjii%nfc-oY(q8yvrPo7<0yhJ2MoJYmUY_)Noy#aV!_ zx4+T0e=kwi?L4fAX@>Rgp|J6|7HTh&U@GGt66Nz%Ojk`7Rgqsp3o9h~K_S6dwO*VdN`b~1632}(c^p`z2|!!j@NY4oi3cy3U%OfTM8EWhtnCo z2BfLCh2)-oN=yY~Iib2WylzZ|-8CZ2f;qEbY_=-+3qK{zG1|sXo`SrKZ?du0KM?tT zkEzOLTkOTw{iz(iTr~;wmHis+-ieZPeF9kD$lX7M@yz$D zm$CeF2o*oP5zY+A@SHNs$vmTU)@1w-%?eLu=PW*ldoDP`<`>!cVtF|Bf3*QyT_cE; z;8>>}+_~H`1m7wuK+xS}te>@wR6XAcz59OAdxa5bb5j=11jIrR#}qm|=OlK|;ked< zg!V3Y4qq=clBP9s@R#ea+&1Rwr_JApxCqA|H2g=cCC{PlqXzn#4TgW+F67MZN4WU) zG&-7koroD!qU|9oRB70UhdF*n`GFLs@SQBY6x@kY$E)E=yC%EkYc2I|EQS?nvc|7d zpVCj>!ua=|B;Bv3jOy!MK{2`;BA@lMmX~WA_q;R0bN;g#bMIq`SCUKv&aN( zpXO4X<$`>AG6v4tM1WJnXU;o*7Gt=)s$iT1*>Z9!RCnE^aYufD%+6-w{AwBr(z{8l zj=y0tex_jA-muHIIZ;VItMrix8*?t2fM3poO3*Mi=E(Zfh=Vl$>4SpF1y^TX{g;x5cL5yPulvDqU ztI@5tk;KUCp-QJV!eq5E(;{<8a!EEAb|m=Ibz&27`>plN<^KRiIp@H}p?`F$za`G|nsokFrApYuBf zH`2B-A^w{mTF`k+2-9_d98KUH5B8iJe)~gkaWA6>^TZLdR^hjo$FPXwRKLoZih0+# zF~7te^3>!Ed_3dT=rDObiavc$_WR4=iFY25d(Dr`+9ppr^eB6WP6lx)OSs&>6SnL= zM{M_B#Tq+vj-j~>T0+)>l-m?4!)5sv$DE_0zn&91E03P~+C=J#vdP(BVeHd32kh_d zC1%H`v(fn%8k6_@BO=x>QHZ+_+PV(XiN4oq)v-Pjx;Y*`{YXZas38(~&KckIIm5eq zB5++K5W~aa`gNxLeuovisW$=OAV!V?z=!xLxxs)isKReaT@(HnH}6SPUgj| z1?jkGI!oxU=^cUDP_qijosWCqi0^xv{rnRZ)4EUFxXe?g&PuqyQx^7>MVST)Pi3Tk zPb7D<*JAd7G8sPO2n*)xlK08g@Za zS$fCG2=~3+15MlANsf0DakE+gfdNn0vbxzcE#NNhURBDj%TA;NA%^hv<}Rp?GeNU9 zC7#ipSk`V0gFSzrLp|qB=uMIZ`?uy)&RJIc?%^#53>I7*dizegBORmrSl-7Jdc?cFU5&KoLAFaRIG47RpB%DXOY9 z5f9%?1;w_tP++>2B&B5GsvuF+{UysDkY!Ms;~;g-DPoViYl5NP0uZ^5jL_T=*m86X zU4s?y%J?C=X{IFB%t)bEx1Xigi$q{?R2=MeY%@7>tOR*iXF>DEB9Jjd?ckbe0tvIC+jJ_wJ>WZANIuvMunZFca1rOe3;$huP%HE%+s|hO*wRD5Vp| ze#_j8xh2`G!4Fq@|CunqcUKWM$dqv`EeZb1v@dM-jLo3Rq=I(KL#jJ=h+ZwaOKVHB zS>>ZLNX=tth2jw8>=nc30T0l8^L+d`TucOPKhd+vvmof>VY0FHH(9b>4UGgn@M2FQ zaf~$K9En17-KsDYHk!gV$BvLmim$NVU7P*1ryKJ;kwB+LkQf5EPw2pm` z3g2?z2A65wJ0^|6Q)ThbQhS&vtU?M8l(7XbI_Zu?A7Xq+hdm}biO!s91l1E}L8*^8 ztg$(ahdVdG-TMznfZ|@Lt1M)Ge>skReL?fpIU1Jam)b!(xnU>!p=-{a41XNDs`88f3$JU%64qq2T;jK|Je3q--9P^!}&P4#v4%4+8J1r8bY+5aV`MEIE+rOMBlLO(0R`XKKl5Rd&4_%iKZ~j)bvHS z+#x#jvV)k$c%vD2o?Y)Z4T=hjVVaO5xXB%&p^q|&svUsh=N<5H`En2ncnvXclEAvz z74{f^VRhT$@w;~~9Qomj)jumy&bu3bcX4~j8^4m3hIc@wAc0|XF5=1}b22u12#-mI zGP_p1LZ8JM(4W#u=NCzlW7_F-(dIH7J8Fhe>apn6`kOxLy^K2_h&C2=EX1y*>mZh6 zTFPYoV5F+Jtn7v%(AjaGtcR0Krp5_6&h^}-R~w;K{brh7R*m1JpF*~>9(F90$NS=U z$znmy&FwacC+iynYOy(FQ)xDYMJthm>!!lxY)?w8mFUGL8}M(@hLO!-Xvpz0ceVCI zhf*d~mgW=7Piyezgy*#99GKcKY5mTuNSo^=};duhkz@i=G2 zlyfBU%1Ux3e>Ob+kxcv&p0Uq6*5lG;74+RlAy^p)n0Zr>Z`QnvnVwn$mtSv%U&3)b(`6$UP5OD4KdD3D`8pWBg#`eja7~|P}ubnzxj#a0j&pA zPyYd(aW#<&m3q(vGIn@j;%aySpK#OB3>tqq7rU*^naY@OvRvB|_LuF$l=Ox4-ZWj< zrCdc^dmEW}k0xehOq1k_96~+roNlo#ncAhdlb#uw#9?hQ+gH*LRMrJgK1+b>+>ZZq zh2P*%rb2u|im1=0Zs=Kk(r zCA*(~pk-^$058i57rE(?IsZMOZHW%pX(kQgzgyt7cus?NQWhPMOh;q!Hs+ObHf40V znnLLTeUVy7j#a%wbBPcV*YcV;Z9EAY*Vmey4Q?k~r-+pg;Sr5Ldbm;dG9BJ`nihA@ z!Lh^tk-0^ER4&y7o~}?q{^B)oKJx^sZ%KrT5*<*_I!=^=PT+r+MagSz`9_oXd(ehE zOI><NV#MK81JTq}Li83u(tgm`t2k?8SSNNtOO26#`+ z&ZR-Ul0H;N9)zx{o4BdG4`n9pK_O@+K{~T>dwVsZ(-rs|waXy&&~$u}p};u&y2mOF zCeiC@_GDua#|>FNhc$h%8txk|z<$v(IP;9l^?!^*-DMFZGpU6hs@njraaVC#-5{~> zS_^F-BzUfkV8l0wY90-87z}|*c^pNtDcc$rE+qQn-$ww2=j!h zuFy5LuetpzSD3BdO-olR@Ss|EDSWHTr zor#js1M0Xc1yvp5QHXzyytp61Fz?jq4ClRY+r86dWk)StR`?Frn0LdZecKt0X>!

      r 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�jX>kfRCx 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
      p(N;lG0qZFcf%n~+_M#Jd)7_!-O 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
      V~ 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

      j8p>+o9NRx;i46R9I7q>5k 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

      9L$f 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 Q<~#! float: - """ Calculate precision for given data and prediction. - - :type data: [[x, y], ...] - :param data: Input data - :type pred: [[x_pred, y_pred], ...] - :param pred: Network output data - """ - correct = 0 - assert len(data) == len(pred) - for inp_data, pred_output in zip(data, pred): - label = 0 if np.prod(inp_data) < 0 else 1 - pred_label = np.argmax(pred_output) - if pred_label == label: - correct += 1 - return float(correct) / len(data) - - -class XORNet(Module): - def __init__(self): - self.mid_layers = 14 - self.num_class = 2 - super().__init__() - - self.fc0 = Linear(self.num_class, self.mid_layers, bias=True) - self.fc1 = Linear(self.mid_layers, self.mid_layers, bias=True) - - self.fc2 = Linear(self.mid_layers, self.num_class, bias=True) - - def forward(self, x): - x = self.fc0(x) - x = tanh(x) - x = self.fc1(x) - x = tanh(x) - x = self.fc2(x) - return x - - -@pytest.mark.slow -def test_training_converge(): - net = XORNet() - opt = SGD( - net.parameters(requires_grad=True), lr=0.01, momentum=0.9, weight_decay=5e-4 - ) - - @trace - def train(data, label): - pred = net(data) - opt.zero_grad() - loss = cross_entropy_with_softmax(pred, label) - opt.backward(loss) - return loss - - @trace - def infer(data): - return net(data) - - train_dataset = minibatch_generator() - losses = [] - - for data, label in itertools.islice(train_dataset, 2000): - # opt.zero_grad() - loss = train(data, label) - loss = loss[0][0] - opt.step() - losses.append(loss.numpy()) - - assert np.mean(losses[-100:]) < 0.1, "Final training Loss must be low enough" - - ngrid = 10 - x = np.linspace(-1.0, 1.0, ngrid) - xx, yy = np.meshgrid(x, x) - xx = xx.reshape((ngrid * ngrid, 1)) - yy = yy.reshape((ngrid * ngrid, 1)) - data = np.concatenate((xx, yy), axis=1).astype(np.float32) - - pred = infer(data).numpy() - assert calculate_precision(data, pred) == 1.0, "Test precision must be high enough" diff --git a/python_module/test/integration/test_correctness.py b/python_module/test/integration/test_correctness.py deleted file mode 100644 index 70a9861f..00000000 --- a/python_module/test/integration/test_correctness.py +++ /dev/null @@ -1,199 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import os -import re -import subprocess -import sys - -import numpy as np - -import megengine as mge -import megengine.functional as F -from megengine import jit, tensor -from megengine.functional.debug_param import set_conv_execution_strategy -from megengine.jit import SublinearMemoryConfig -from megengine.module import AvgPool2d, BatchNorm2d, Conv2d, Linear, Module -from megengine.optimizer import SGD -from megengine.test import assertTensorClose - - -def get_gpu_name(): - try: - gpu_info = subprocess.check_output( - ["nvidia-smi", "--query-gpu=gpu_name", "--format=csv,noheader"] - ) - gpu_info = gpu_info.decode("ascii").split("\n")[0] - except: - gpu_info = "None" - return gpu_info - - -def get_cpu_name(): - cpu_info = "None" - try: - cpu_info = subprocess.check_output(["cat", "/proc/cpuinfo"]).decode("ascii") - for line in cpu_info.split("\n"): - if "model name" in line: - return re.sub(".*model name.*:", "", line, 1).strip() - except: - pass - return cpu_info - - -def get_xpu_name(): - if mge.is_cuda_available(): - return get_gpu_name() - else: - return get_cpu_name() - - -class MnistNet(Module): - def __init__(self, has_bn=False): - super().__init__() - self.conv0 = Conv2d(1, 20, kernel_size=5, bias=True) - self.pool0 = AvgPool2d(2) - self.conv1 = Conv2d(20, 20, kernel_size=5, bias=True) - self.pool1 = AvgPool2d(2) - self.fc0 = Linear(20 * 4 * 4, 500, bias=True) - self.fc1 = Linear(500, 10, bias=True) - self.bn0 = None - self.bn1 = None - if has_bn: - self.bn0 = BatchNorm2d(20) - self.bn1 = BatchNorm2d(20) - - def forward(self, x): - x = self.conv0(x) - if self.bn0: - x = self.bn0(x) - x = F.relu(x) - x = self.pool0(x) - x = self.conv1(x) - if self.bn1: - x = self.bn1(x) - x = F.relu(x) - x = self.pool1(x) - x = F.flatten(x, 1) - x = self.fc0(x) - x = F.relu(x) - x = self.fc1(x) - return x - - -def train(data, label, net, opt): - - pred = net(data) - loss = F.cross_entropy_with_softmax(pred, label) - opt.backward(loss) - return loss - - -def update_model(model_path): - """ - Update the dumped model with test cases for new reference values. - - The model with pre-trained weights is trained for one iter with the test data attached. - The loss and updated net state dict is dumped. - - .. code-block:: python - - from test_correctness import update_model - update_model('mnist_model_with_test.mge') # for gpu - update_model('mnist_model_with_test_cpu.mge') # for cpu - - """ - net = MnistNet(has_bn=True) - checkpoint = mge.load(model_path) - net.load_state_dict(checkpoint["net_init"]) - lr = checkpoint["sgd_lr"] - opt = SGD(net.parameters(), lr=lr) - - data = tensor(dtype=np.float32) - label = tensor(dtype=np.int32) - data.set_value(checkpoint["data"]) - label.set_value(checkpoint["label"]) - - opt.zero_grad() - loss = train(data, label, net=net, opt=opt) - opt.step() - - xpu_name = get_xpu_name() - - checkpoint.update( - {"net_updated": net.state_dict(), "loss": loss.numpy(), "xpu": xpu_name} - ) - mge.save(checkpoint, model_path) - - -def run_test( - model_path, use_jit, use_symbolic, sublinear_memory_config=None, max_err=None, -): - - """ - Load the model with test cases and run the training for one iter. - The loss and updated weights are compared with reference value to verify the correctness. - - Dump a new file with updated result by calling update_model - if you think the test fails due to numerical rounding errors instead of bugs. - Please think twice before you do so. - - """ - net = MnistNet(has_bn=True) - checkpoint = mge.load(model_path) - net.load_state_dict(checkpoint["net_init"]) - lr = checkpoint["sgd_lr"] - opt = SGD(net.parameters(), lr=lr) - - data = tensor(dtype=np.float32) - label = tensor(dtype=np.int32) - data.set_value(checkpoint["data"]) - label.set_value(checkpoint["label"]) - - if max_err is None: - max_err = 1e-5 - - train_func = train - if use_jit: - train_func = jit.trace( - train_func, - symbolic=use_symbolic, - sublinear_memory_config=sublinear_memory_config, - ) - - opt.zero_grad() - loss = train_func(data, label, net=net, opt=opt) - opt.step() - - assertTensorClose(loss.numpy(), checkpoint["loss"], max_err=max_err) - - for param, param_ref in zip( - net.state_dict().items(), checkpoint["net_updated"].items() - ): - assert param[0] == param_ref[0] - assertTensorClose(param[1], param_ref[1], max_err=max_err) - - -def test_correctness(): - - if mge.is_cuda_available(): - model_name = "mnist_model_with_test.mge" - else: - model_name = "mnist_model_with_test_cpu.mge" - model_path = os.path.join(os.path.dirname(__file__), model_name) - set_conv_execution_strategy("HEURISTIC_REPRODUCIBLE") - - run_test(model_path, False, False) - run_test(model_path, True, False) - run_test(model_path, True, True) - - # sublinear - config = SublinearMemoryConfig(genetic_nr_iter=10) - run_test( - model_path, True, True, sublinear_memory_config=config, max_err=1e-5, - ) diff --git a/python_module/test/integration/test_distributed.py b/python_module/test/integration/test_distributed.py deleted file mode 100644 index ba2e3080..00000000 --- a/python_module/test/integration/test_distributed.py +++ /dev/null @@ -1,97 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import multiprocessing as mp -import platform -import subprocess -import sys - -import numpy as np -import pytest - - -def worker(master_ip, master_port, world_size, rank, dev, trace): - import megengine.distributed as dist - import megengine.functional as F - from megengine import is_cuda_available - from megengine import jit - from megengine.module import Linear, Module - from megengine.optimizer import SGD - - if not is_cuda_available(): - return - - class MLP(Module): - def __init__(self): - super().__init__() - self.fc0 = Linear(3 * 224 * 224, 500) - self.fc1 = Linear(500, 10) - - def forward(self, x): - x = self.fc0(x) - x = F.relu(x) - x = self.fc1(x) - return x - - dist.init_process_group( - master_ip=master_ip, master_port=3456, world_size=world_size, rank=rank, dev=dev - ) - net = MLP() - - opt = SGD(net.parameters(requires_grad=True), lr=0.02) - - data = np.random.random((64, 3 * 224 * 224)).astype(np.float32) - label = np.random.randint(0, 10, size=(64,)).astype(np.int32) - - jit.trace.enabled = trace - - @jit.trace() - def train_func(data, label): - pred = net(data) - loss = F.cross_entropy_with_softmax(pred, label) - opt.backward(loss) - return loss - - for i in range(5): - opt.zero_grad() - loss = train_func(data, label) - opt.step() - - -def start_workers(worker, world_size, trace=False): - def run_subproc(rank): - cmd = "from test.integration.test_distributed import worker\n" - cmd += "worker('localhost', 3456, {}, {}, {}, {})".format( - world_size, rank, rank, "True" if trace else "False" - ) - cmd = [sys.executable, "-c", cmd] - ret = subprocess.run( - cmd, stdout=sys.stdout, stderr=sys.stderr, universal_newlines=True - ) - assert ret.returncode == 0, "subprocess failed" - - procs = [] - for rank in range(world_size): - p = mp.Process(target=run_subproc, args=(rank,)) - p.start() - procs.append(p) - - for p in procs: - p.join() - assert p.exitcode == 0 - - -@pytest.mark.skipif( - platform.system() == "Darwin", reason="do not imp GPU mode at macos now" -) -@pytest.mark.skipif( - platform.system() == "Windows", reason="do not imp GPU mode at Windows now" -) -def test_distributed(): - start_workers(worker, 2, trace=True) - start_workers(worker, 2, trace=False) diff --git a/python_module/test/integration/test_equivalence.py b/python_module/test/integration/test_equivalence.py deleted file mode 100644 index e215450f..00000000 --- a/python_module/test/integration/test_equivalence.py +++ /dev/null @@ -1,184 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import copy -import itertools -import os -from typing import Callable - -import numpy as np -import pytest - -import megengine as mge -import megengine.module.init as init -from megengine.core import tensor -from megengine.functional import cross_entropy_with_softmax, relu -from megengine.jit import trace -from megengine.module import Linear, Module -from megengine.optimizer import SGD, Optimizer -from megengine.test import assertTensorClose - -batch_size = 64 -data_shape = (batch_size, 2) -label_shape = (batch_size,) - - -def minibatch_generator(): - while True: - inp_data = np.zeros((batch_size, 2)) - label = np.zeros(batch_size, dtype=np.int32) - - for i in range(batch_size): - # [x0, x1], sampled from U[-1, 1] - inp_data[i, :] = np.random.rand(2) * 2 - 1 - label[i] = 0 if np.prod(inp_data[i]) < 0 else 1 - - yield inp_data.astype(np.float32), label.astype(np.int32) - - -class SimpleNet(Module): - def __init__(self): - self.mid_layers = 14 - self.num_class = 2 - super().__init__() - - self.fc0 = Linear(self.num_class, self.mid_layers, bias=True) - fan_in, _ = init.calculate_fan_in_and_fan_out(self.fc0.weight) - init.normal_(self.fc0.weight, std=np.sqrt(float(1.0) / fan_in)) - init.zeros_(self.fc0.bias) - - self.fc1 = Linear(self.mid_layers, self.mid_layers, bias=True) - fan_in, _ = init.calculate_fan_in_and_fan_out(self.fc1.weight) - init.normal_(self.fc1.weight, std=np.sqrt(float(1.0) / fan_in)) - init.zeros_(self.fc1.bias) - - self.fc2 = Linear(self.mid_layers, self.num_class, bias=True) - fan_in, _ = init.calculate_fan_in_and_fan_out(self.fc2.weight) - init.normal_(self.fc2.weight, std=np.sqrt(float(1.0) / fan_in)) - init.zeros_(self.fc2.bias) - - def forward(self, x): - x = self.fc0(x) - x = relu(x) # Should use tanh but it's not stable now. - x = self.fc1(x) - x = relu(x) # Should use tanh but it's not stable now. - x = self.fc2(x) - return x - - -def generate_eager_step(net: Module, opt_factory: Callable[[Module], Optimizer]): - data_inp = tensor(np.zeros(data_shape), dtype=np.float32) - label_inp = tensor(np.zeros(label_shape), dtype=np.int32) - opt = opt_factory(net) - - def step(data, label): - opt.zero_grad() - data_inp.set_value(data) - label_inp.set_value(label) - - pred = net(data_inp) - loss = cross_entropy_with_softmax(pred, label_inp) - opt.backward(loss) - opt.step() - - return loss.numpy()[0] - - return step - - -def generate_static_step(net: Module, opt_factory: Callable[[Module], Optimizer]): - data = tensor(np.zeros(data_shape), dtype=np.float32) - label = tensor(np.zeros(label_shape), dtype=np.int32) - opt = opt_factory(net) - - # Save state to reset parameters later. - state = copy.deepcopy(net.state_dict()) - - # Evaluate network in eager mode once. - pred = net(data) - loss = cross_entropy_with_softmax(pred, label) - opt.zero_grad() - grads = opt.backward(loss) - - f = mge.graph.compile(loss, grads) - - def step(data, label): - opt.zero_grad() - out = f(data=data, label=label) - opt.step() - loss = out[0][0] - return loss - - # Reset parameters. - net.load_state_dict(state) - return step - - -def generate_trace_step( - net: Module, opt_factory: Callable[[Module], Optimizer], enable: bool -): - opt = opt_factory(net) - - @trace - def train(data, label): - pred = net(data) - loss = cross_entropy_with_softmax(pred, label) - opt.zero_grad() - opt.backward(loss) - return loss - - train.enabled = enable - - def step(data, label): - out = train(data, label) - opt.step() - loss = out[0][0] - return loss - - return step - - -def assert_network_equvilence(nets): - net_state = [net.state_dict() for net in nets] - - for state in net_state[1:]: - assert len(net_state[0]) == len(state) - - for k, v in net_state[0].items(): - for state in net_state[1:]: - assert k in state - assertTensorClose(v, state[k]) - - -@pytest.mark.slow -def test_eager_equvilence(): - eager_net = SimpleNet() - trace_enable_net = copy.deepcopy(eager_net) - trace_disable_net = copy.deepcopy(eager_net) - - opt_factory = lambda net: SGD( - net.parameters(requires_grad=True), lr=0.01, momentum=0.01 - ) - - estep = generate_eager_step(eager_net, opt_factory) - te_step = generate_trace_step(trace_enable_net, opt_factory, True) - td_step = generate_trace_step(trace_disable_net, opt_factory, False) - - assert_network_equvilence([eager_net, trace_enable_net, trace_disable_net]) - - # Use hard code number as limit, may increase if needed. - for data, label in itertools.islice(minibatch_generator(), 200): - eloss = estep(data, label) - te_loss = te_step(data, label) - td_loss = td_step(data, label) - - assertTensorClose(eloss, te_loss) - assertTensorClose(eloss, td_loss) - assert_network_equvilence( - [eager_net, trace_enable_net, trace_disable_net,] - ) diff --git a/python_module/test/integration/test_fastrun.py b/python_module/test/integration/test_fastrun.py deleted file mode 100644 index 8cce8c59..00000000 --- a/python_module/test/integration/test_fastrun.py +++ /dev/null @@ -1,12 +0,0 @@ -import numpy as np - -import megengine as mge -from megengine.functional.debug_param import set_conv_execution_strategy -from megengine.module.conv import Conv2d - - -def test_fastrun(): - set_conv_execution_strategy("PROFILE") - x = Conv2d(1, 1, kernel_size=1, bias=True) - a = mge.tensor(np.random.randn(1, 1, 1, 1).astype(np.float32)) - a = x(a) diff --git a/python_module/test/integration/test_parampack.py b/python_module/test/integration/test_parampack.py deleted file mode 100644 index c9acc47c..00000000 --- a/python_module/test/integration/test_parampack.py +++ /dev/null @@ -1,274 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import itertools - -import numpy as np -import pytest - -import megengine as mge -from megengine.core import tensor -from megengine.functional import cross_entropy_with_softmax, tanh -from megengine.jit import trace -from megengine.module import Linear, Module, ParamPack -from megengine.optimizer import SGD - -batch_size = 64 -data_shape = (batch_size, 2) -label_shape = (batch_size,) - - -def minibatch_generator(): - while True: - inp_data = np.zeros((batch_size, 2)) - label = np.zeros(batch_size, dtype=np.int32) - for i in range(batch_size): - # [x0, x1], sampled from U[-1, 1] - inp_data[i, :] = np.random.rand(2) * 2 - 1 - label[i] = 0 if np.prod(inp_data[i]) < 0 else 1 - yield inp_data.astype(np.float32), label.astype(np.int32) - - -def calculate_precision(data: np.ndarray, pred: np.ndarray) -> float: - """ Calculate precision for given data and prediction. - - :type data: [[x, y], ...] - :param data: Input data - :type pred: [[x_pred, y_pred], ...] - :param pred: Network output data - """ - correct = 0 - assert len(data) == len(pred) - for inp_data, pred_output in zip(data, pred): - label = 0 if np.prod(inp_data) < 0 else 1 - pred_label = np.argmax(pred_output) - if pred_label == label: - correct += 1 - return float(correct) / len(data) - - -class XORNet(Module): - def __init__(self): - self.mid_layers = 14 - self.num_class = 2 - super().__init__() - - self.fc0 = Linear(self.num_class, self.mid_layers, bias=True) - self.fc1 = Linear(self.mid_layers, self.mid_layers, bias=True) - - self.fc2 = Linear(self.mid_layers, self.num_class, bias=True) - - def forward(self, x): - x = self.fc0(x) - x = tanh(x) - x = self.fc1(x) - x = tanh(x) - x = self.fc2(x) - return x - - -@pytest.mark.slow -def test_static_graph_parampack(): - net = XORNet() - net = ParamPack( - net, nr_ignore_first=0, max_size_per_group=10, max_nr_params_per_group=100 - ) - opt = SGD( - net.parameters(requires_grad=True), lr=0.01, momentum=0.9, weight_decay=5e-4 - ) - - @trace(symbolic=True) - def train(data, label): - pred = net(data) - opt.zero_grad() - loss = cross_entropy_with_softmax(pred, label) - opt.backward(loss) - return loss - - @trace(symbolic=True) - def infer(data): - return net(data) - - train_dataset = minibatch_generator() - losses = [] - - for data, label in itertools.islice(train_dataset, 2000): - loss = train(data, label) - loss = loss[0][0] - opt.step() - losses.append(loss.numpy()) - - assert np.mean(losses[-100:]) < 0.1, "Final training Loss must be low enough" - - ngrid = 10 - x = np.linspace(-1.0, 1.0, ngrid) - xx, yy = np.meshgrid(x, x) - xx = xx.reshape((ngrid * ngrid, 1)) - yy = yy.reshape((ngrid * ngrid, 1)) - data = np.concatenate((xx, yy), axis=1).astype(np.float32) - - pred = infer(data).numpy() - assert calculate_precision(data, pred) == 1.0, "Test precision must be high enough" - - -@pytest.mark.slow -def test_nopack_parampack(): - net = XORNet() - net = ParamPack(net, max_size_per_group=0, max_nr_params_per_group=0) - opt = SGD( - net.parameters(requires_grad=True), lr=0.01, momentum=0.9, weight_decay=5e-4 - ) - - @trace(symbolic=True) - def train(data, label): - pred = net(data) - opt.zero_grad() - loss = cross_entropy_with_softmax(pred, label) - opt.backward(loss) - return loss - - @trace(symbolic=True) - def infer(data): - return net(data) - - train_dataset = minibatch_generator() - losses = [] - - for data, label in itertools.islice(train_dataset, 2000): - loss = train(data, label) - loss = loss[0][0] - opt.step() - losses.append(loss.numpy()) - assert np.mean(losses[-100:]) < 0.1, "Final training Loss must be low enough" - - ngrid = 10 - x = np.linspace(-1.0, 1.0, ngrid) - xx, yy = np.meshgrid(x, x) - xx = xx.reshape((ngrid * ngrid, 1)) - yy = yy.reshape((ngrid * ngrid, 1)) - data = np.concatenate((xx, yy), axis=1).astype(np.float32) - - pred = infer(data).numpy() - assert calculate_precision(data, pred) == 1.0, "Test precision must be high enough" - - -@pytest.mark.slow -def test_dynamic_graph_parampack(): - net = XORNet() - net = ParamPack( - net, nr_ignore_first=0, max_size_per_group=10, max_nr_params_per_group=100 - ) - opt = SGD( - net.parameters(requires_grad=True), lr=0.01, momentum=0.9, weight_decay=5e-4 - ) - - @trace(symbolic=False) - def train(data, label): - pred = net(data) - opt.zero_grad() - loss = cross_entropy_with_softmax(pred, label) - opt.backward(loss) - return loss - - @trace(symbolic=False) - def infer(data): - return net(data) - - train_dataset = minibatch_generator() - losses = [] - - for data, label in itertools.islice(train_dataset, 2000): - loss = train(data, label) - loss = loss[0][0] - opt.step() - losses.append(loss.numpy()) - - assert np.mean(losses[-100:]) < 0.1, "Final training Loss must be low enough" - - ngrid = 10 - x = np.linspace(-1.0, 1.0, ngrid) - xx, yy = np.meshgrid(x, x) - xx = xx.reshape((ngrid * ngrid, 1)) - yy = yy.reshape((ngrid * ngrid, 1)) - data = np.concatenate((xx, yy), axis=1).astype(np.float32) - - pred = infer(data).numpy() - assert calculate_precision(data, pred) == 1.0, "Test precision must be high enough" - - -@pytest.mark.slow -def test_correctness_parampack(): - net1 = XORNet() - net2 = XORNet() - params1 = net1.parameters() - params2 = net2.parameters() - for param1, param2 in zip(params1, params2): - param1.set_value(param2.numpy()) - net1 = ParamPack( - net1, nr_ignore_first=0, max_size_per_group=10, max_nr_params_per_group=100 - ) - opt1 = SGD( - net1.parameters(requires_grad=True), lr=0.01, momentum=0.9, weight_decay=5e-4 - ) - - opt2 = SGD( - net2.parameters(requires_grad=True), lr=0.01, momentum=0.9, weight_decay=5e-4 - ) - - @trace(symbolic=False) - def train1(data, label): - pred = net1(data) - opt1.zero_grad() - loss = cross_entropy_with_softmax(pred, label) - opt1.backward(loss) - return loss - - @trace(symbolic=False) - def train2(data, label): - pred = net2(data) - opt2.zero_grad() - loss = cross_entropy_with_softmax(pred, label) - opt2.backward(loss) - return loss - - @trace(symbolic=False) - def infer1(data): - return net1(data) - - @trace(symbolic=False) - def infer2(data): - return net2(data) - - train_dataset = minibatch_generator() - - for data, label in itertools.islice(train_dataset, 2000): - train1(data, label) - opt1.step() - - train2(data, label) - opt2.step() - - data, _ = next(train_dataset) - pred1 = infer1(data).numpy() - pred2 = infer2(data).numpy() - assert np.allclose(pred1, pred2) - - -def test_parampack_group_func(): - net = XORNet() - net = ParamPack( - net, - nr_ignore_first=1, - max_size_per_group=10, - max_nr_params_per_group=100, - group_func=lambda n, p: "weight" in n, - ) - for p in net.parameters(requires_grad=True): - assert p.pack_group_key is not None - for n, p in net.named_parameters(requires_grad=True): - assert p.pack_group_key is not None diff --git a/python_module/test/regression/.gitignore b/python_module/test/regression/.gitignore deleted file mode 100644 index 328c8678..00000000 --- a/python_module/test/regression/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -data -log diff --git a/python_module/test/regression/__init__.py b/python_module/test/regression/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/python_module/test/regression/test_MGE-103.py b/python_module/test/regression/test_MGE-103.py deleted file mode 100644 index e0d387c1..00000000 --- a/python_module/test/regression/test_MGE-103.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import numpy as np -import pytest - -import megengine as mge -from megengine.core import tensor -from megengine.jit import trace -from megengine.module import BatchNorm2d -from megengine.test import assertTensorClose - - -@pytest.mark.regression -def test_batchnorm_change_batchsize(): - data_shape = (2, 3, 8, 8) - real_shape = (4, 3, 8, 8) - data = np.random.random(data_shape).astype(np.float32) - d = np.random.random(real_shape).astype(np.float32) - - bn = BatchNorm2d(3) - f = trace(bn) - f(data) - - y1 = f(d) - - y0 = bn(tensor(d)) - - assertTensorClose(y0.numpy(), y1.numpy()) diff --git a/python_module/test/regression/test_MGE-22.py b/python_module/test/regression/test_MGE-22.py deleted file mode 100644 index b719b9be..00000000 --- a/python_module/test/regression/test_MGE-22.py +++ /dev/null @@ -1,39 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import numpy as np -import pytest - -from megengine.core import tensor -from megengine.module import Linear, Module -from megengine.optimizer import SGD - - -class Blur(Module): - def __init__(self, dim1=16, dim2=128, dim3=1): - super().__init__() - - self.fc1 = Linear(dim1, dim2) - self.fc2 = Linear(dim2, dim3) - - def forward(self, x): - x = self.fc1(x) - x = self.fc2(x) - return x.mean(axis=1, keepdims=True) - - -@pytest.mark.regression -def test_blur(): - net = Blur() - data = tensor(np.random.random((32, 16)).astype("float32")) - - opt = SGD(net.parameters(requires_grad=True), lr=0.1) - opt.zero_grad() - - loss = net(data) - opt.backward(loss.sum()) diff --git a/python_module/test/regression/test_MGE-323.py b/python_module/test/regression/test_MGE-323.py deleted file mode 100644 index 47e73f2a..00000000 --- a/python_module/test/regression/test_MGE-323.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import numpy as np - -import megengine as mge - - -def test_mge_323(): - # Regression: set_value does not update eager_val - x = mge.tensor([0]) - _ = x * 2 - x.set_value([1, 1]) - np.testing.assert_array_equal(x.numpy(), [1, 1]) - assert x.shape == (2,) - np.testing.assert_array_equal(x * 2, [2, 2]) diff --git a/python_module/test/regression/test_MGE-81.py b/python_module/test/regression/test_MGE-81.py deleted file mode 100644 index f32b3232..00000000 --- a/python_module/test/regression/test_MGE-81.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import numpy as np - -import megengine as mge -import megengine.functional as F -import megengine.module as M -from megengine.core import tensor - - -def test_mge_81(): - np.random.seed(0) - N, D = 3, 4 - x = mge.Parameter(value=np.random.normal(size=(N, D)).astype(np.float32)) - y = mge.Parameter(value=np.random.normal(size=(N, D)).astype(np.float32)) - z = mge.Parameter(value=np.random.normal(size=(N, D)).astype(np.float32)) - a = x * y - b = a + z - c = F.sum(b) - grad_x = F.grad(c, x, use_virtual_grad=False) - grad_y = F.grad(c, y, use_virtual_grad=False) - grad_z = F.grad(c, z, use_virtual_grad=False) - print(grad_x.numpy()) - print(grad_y.numpy()) - print(grad_z.numpy()) - m = M.BatchNorm2d(4) - input = tensor(np.zeros((64, 4, 32, 32), dtype=np.float32)) - _ = m(input) - m = M.BatchNorm2d(4, affine=False) - _ = m(input) diff --git a/python_module/test/run.sh b/python_module/test/run.sh deleted file mode 100755 index 7f2d9038..00000000 --- a/python_module/test/run.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -e - -ignore_list="--ignore test/unit/module/test_pytorch.py \ - --ignore test/pytorch_comparison \ - --ignore test/unit/hub/test_hub.py \ - --ignore test/unit/data \ - --ignore test/integration/manual \ - --ignore megengine/module/pytorch \ - --ignore test/unit/module/test_external.py" -test_dirs="megengine test" - -pushd $(dirname "${BASH_SOURCE[0]}")/.. >/dev/null - python3 -m pytest -xv -m 'isolated_distributed' \ - --json-report --json-report-file=time_python_test.json \ - $ignore_list $test_dirs - python3 -m pytest -xv -m 'not internet and not isolated_distributed' \ - --json-report --json-report-file=time_python_test.json \ - $ignore_list $test_dirs -popd >/dev/null diff --git a/python_module/test/unit/__init__.py b/python_module/test/unit/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/python_module/test/unit/core/__init__.py b/python_module/test/unit/core/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/python_module/test/unit/core/test_dynamic_profiling.py b/python_module/test/unit/core/test_dynamic_profiling.py deleted file mode 100644 index 53e603b8..00000000 --- a/python_module/test/unit/core/test_dynamic_profiling.py +++ /dev/null @@ -1,56 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import json - -import numpy as np - -import megengine.functional as F -from megengine import graph, tensor - - -def test_dynamic_profiling(): - with graph.Graph(): - sz = 16 - - cg = graph.get_default_graph() - - x = tensor(np.arange(0, sz, dtype=np.float32)) - y = F.relu(x) - - str1 = cg.get_mem_allocation_info() - if str1 == "": - return - json_str1 = json.loads(str1) - - z = F.add_update(x, y) - - json_str2 = json.loads(cg.get_mem_allocation_info()) - - diff = lambda l1, l2: [x for x in l1 if x not in l2] - - jdiff = diff(json_str2, json_str1) - assert ( - len(jdiff) == 1 - ), "add_update operator should produce only one opr internally" - - dest_key = list(jdiff[0].keys())[0] - assert ( - jdiff[0][dest_key]["output"][0]["memory"] == sz * 4 - ), "output of add_update operator has wrong allocated size" - - # check add_update is inplace or not - dest_ptr = jdiff[0][dest_key]["output"][0]["dev_ptr"] - - found = False - for li in json_str1: - if "0" in li.keys(): - src_ptr = li["0"]["output"][0]["dev_ptr"] - found = dest_ptr == src_ptr - - assert found == True, "add_update is not inplace" diff --git a/python_module/test/unit/core/test_function.py b/python_module/test/unit/core/test_function.py deleted file mode 100644 index c58978bb..00000000 --- a/python_module/test/unit/core/test_function.py +++ /dev/null @@ -1,169 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import copy - -import numpy as np - -import megengine.functional as F -from megengine.core import Function, tensor -from megengine.jit import trace -from megengine.test import assertTensorClose - - -def test_a_plus_b(): - data_shape = (1, 9, 2, 6) - av = np.random.random(data_shape).astype(np.float32) - bv = np.random.random(data_shape).astype(np.float32) - a = tensor(av) - b = tensor(bv) - - class MulFunc(Function): - def forward(self, a, b): - return a * b - - def backward(self, grad_o): - return (grad_o * b * 2, grad_o * a * 3) - - c = MulFunc()(a, b).sum() - assertTensorClose(c.numpy(), (av * bv).sum()) - assertTensorClose(F.grad(c, a, use_virtual_grad=False).numpy(), bv * 2) - assertTensorClose(F.grad(c, b, use_virtual_grad=False).numpy(), av * 3) - - -def test_skip_invalid_grad(): - data_shape = (1, 9, 2, 6) - av = np.random.random(data_shape).astype(np.float32) - bv = np.random.random(data_shape).astype(np.float32) - a = tensor(av) - b = tensor(bv) - cookie = tensor(np.random.random(data_shape).astype(np.float32)) - - class EqWithFakeGrad(Function): - def forward(self, a, b): - return a == b - - def backward(self, grad_o): - _ = grad_o - return cookie, cookie - - c = EqWithFakeGrad()(a, b).sum() - assertTensorClose(c.numpy(), (av == bv).sum().astype(np.float32)) - assertTensorClose(F.grad(c, a, use_virtual_grad=False).numpy(), cookie) - assertTensorClose(F.grad(c, b, use_virtual_grad=False).numpy(), cookie) - - -def test_ste(): - class STE(Function): - def forward(self, x): - maxv, minv = x.max(), x.min() - scale = F.maximum(maxv, -minv) / 127 - return F.round(x / scale) * scale - - def backward(self, grad_y): - return grad_y - - data_shape = (1, 9, 2, 6) - av = np.random.random(data_shape).astype(np.float32) - a = tensor(av) - q = STE()(a) - q_2 = (q * 2.0).sum() - assertTensorClose( - F.grad(q_2, a, use_virtual_grad=False).numpy(), - np.broadcast_to(np.array([2.0], dtype=np.float32), data_shape), - ) - - -def test_deepcopy(): - class Sigmoid(Function): - def __init__(self, param): - super().__init__() - self.param = param - - def forward(self, x): - y = 1 / (1 + F.exp(-x)) - self.save_for_backward(y) - return y - - def backward(self, grad_y): - (y,) = self.saved_tensors - return grad_y * y * (1 - y) - - origin = Sigmoid(0) - new = copy.deepcopy(Sigmoid(0)) - assert new.param == origin.param - - -def test_save_context(): - class Sigmoid(Function): - def forward(self, x): - y = 1 / (1 + F.exp(-x)) - self.save_for_backward(y) - return y - - def backward(self, grad_y): - (y,) = self.saved_tensors - return grad_y * y * (1 - y) - - def run_saved_context(a, net=None): - return net(a) - - def run(use_trace, symbolic): - a = tensor(np.array([1926.0817], dtype=np.float32)) - net = Sigmoid() - func_run = run_saved_context - if use_trace: - func_run = trace(run_saved_context, symbolic=symbolic) - s = func_run(a, net=net) - s2 = F.sigmoid(a) - assertTensorClose(s.numpy(), s2.numpy()) - assertTensorClose( - F.grad(s, a, use_virtual_grad=False).numpy(), - F.grad(s2, a, use_virtual_grad=False).numpy(), - ) - - run(False, False) - run(True, False) - run(True, True) - - -def test_none_in_out_grad(): - class Test(Function): - def forward(self, a, b): - return a, b - - def backward(self, grad_a, grad_b): - assert grad_b is None - return (grad_a, 0) - - a = tensor(np.array([1.0], dtype=np.float32)) - b = tensor(np.array([2.0], dtype=np.float32)) - aa, bb = Test()(a, b) - assertTensorClose( - F.grad(aa, a, use_virtual_grad=False).numpy(), np.array([1.0], dtype=np.float32) - ) - assertTensorClose( - F.grad(aa, b, use_virtual_grad=False).numpy(), np.array([0.0], dtype=np.float32) - ) - - -def test_zero_grad(): - class StopGradient(Function): - def forward(self, a): - return a - - def backward(self, *_): - return None - - a = tensor(np.array([1.0], dtype=np.float32)) - b = a * 3.0 - c = a * 4.0 - loss = StopGradient()(b) + c - assertTensorClose( - F.grad(loss, a, use_virtual_grad=False).numpy(), - np.array([4.0], dtype=np.float32), - ) diff --git a/python_module/test/unit/core/test_graph.py b/python_module/test/unit/core/test_graph.py deleted file mode 100644 index 5f5fbe95..00000000 --- a/python_module/test/unit/core/test_graph.py +++ /dev/null @@ -1,74 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import numpy as np -import pytest -from helpers import MLP - -import megengine._internal as mgb -import megengine.functional as F -from megengine.core import Graph -from megengine.module import Linear, Module -from megengine.optimizer import SGD -from megengine.test import assertTensorClose - - -def test_compile_multi_times_eager(): - return # XXX: rewrite or remove this test - data = Input("data", shape=(2, 28)) - label = Input("label", shape=(2,), dtype=np.int32) - - mlp = MLP() - opt = SGD(mlp.parameters(requires_grad=True), lr=0.01) - - pred0 = mlp(data) - pred = F.softmax(pred0) - loss = F.square_loss(pred, label.reshape(2, 1)) - opt.zero_grad() - grads = opt.backward(loss) - opt.step() - - f0 = compile(pred, None) - f1 = compile([pred, loss], grads, copy=False) - for _ in range(3): - data = np.random.random((2, 28)).astype(np.float32) - label = np.random.randint(0, 10, (2,)).astype(np.float32) - out0 = f0(data=data) - out1 = f1(data=data, label=label) - assertTensorClose(out0[0], out1[0]) - - -def test_compile_multi_times_static(): - return # XXX: rewrite or remove this test - with Graph() as cg: - cg.set_option("eager_evaluation", False) - data = Input("data", shape=(2, 28)) - label = Input("label", shape=(2,), dtype=np.int32) - - mlp = MLP() - opt = SGD(mlp.parameters(requires_grad=True), lr=0.01) - - pred0 = mlp(data) - pred = F.softmax(pred0) - loss = F.square_loss(pred, label.reshape(2, 1)) - opt.zero_grad() - grads = opt.backward(loss) - opt.step() - - f0 = compile(pred, None) - f1 = compile([pred, loss], grads, copy=True) - - data = np.random.random((2, 28)).astype(np.float32) - label = np.random.randint(0, 10, (2,)).astype(np.float32) - out0 = f0(data=data) - out1 = f1(data=data, label=label) - assertTensorClose(out0[0], out1[0]) - - _ = compile([pred, loss], grads, copy=False) - with pytest.raises(mgb.MegBrainError): - f0(data=data) diff --git a/python_module/test/unit/core/test_index.py b/python_module/test/unit/core/test_index.py deleted file mode 100644 index 4121c08f..00000000 --- a/python_module/test/unit/core/test_index.py +++ /dev/null @@ -1,311 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import numpy as np - -from megengine import Tensor, tensor -from megengine.jit import trace -from megengine.test import assertTensorClose - - -def check_equal(np_tensor, mge_tensor): - assertTensorClose(np_tensor, mge_tensor.numpy()) - - -def test_index(): - a_shape = (10, 10, 10, 10, 10) - a = np.random.random(a_shape).astype(dtype=np.float32) - b = tensor(a) - test_set = {} - test_set["a"] = np.random.random(a_shape).astype(dtype=np.float32) - test_set["b"] = tensor(test_set["a"]) - test_set["c"] = tensor(test_set["a"]) - - def check_id_2(np_idx, mge_idx): - # print('start :', mge_idx) - def get_b(symbolic, *args): - # print('get_b:', args) - def get_func(inp): - for i in mge_idx: - if isinstance(i, (list, Tensor)): - return inp.ai[mge_idx] - return inp[mge_idx] - - func = trace(get_func, symbolic=symbolic) - return func(*args) - - def set_b(symbolic, *args): - # print('set_b:', args) - def set_func(inp, val): - for i in mge_idx: - if isinstance(i, (list, Tensor)): - return inp.set_ai(val)[mge_idx] - return inp.set_subtensor(val)[mge_idx] - - func = trace(set_func, symbolic=symbolic) - return func(*args) - - sub_a = a[np_idx] - for symbolic in [True, False]: - sub_b = get_b(symbolic, b) - check_equal(sub_a, sub_b) - # do not support set - # print(mge_idx) - if not mge_idx: - continue - go_flag = False - for i in mge_idx: - if i is np.newaxis: - go_flag = True - break - if go_flag: - continue - if not symbolic: - test_set["b"] = set_b(symbolic, test_set["b"], sub_b) - check_equal(test_set["a"], test_set["b"]) - else: - test_set["a"][np_idx] = sub_a - test_set["c"] = set_b(symbolic, test_set["c"], sub_b) - check_equal(test_set["a"], test_set["c"]) - - def check_idx(*idx): - check_id_2(idx, idx) - - def tensor_wrap(*idx): - check_idx(*idx) - tensor_idx = [] - numpy_idx = [] - for i in idx: - numpy_idx.append(np.asarray(i).astype(np.int32)) - tensor_idx.append(tensor(numpy_idx[-1])) - a_idx = tuple(numpy_idx) - b_idx = tuple(tensor_idx) - check_id_2(a_idx, b_idx) - - def test_one_dim(): - check_idx(-7) - check_idx(-7, -7) - check_idx(-7, -7, -7) - check_idx(-7, -7, -7, -7) - check_idx(-7, -7, -7, -7, -7) - check_idx(7, 7, 7, 7, 7) - check_idx(7, 7, 7, 7) - check_idx(7, 7, 7) - check_idx(7, 7) - check_idx(7) - check_idx() - - def test_slice(): - - check_idx(slice(1, 7)) - check_idx(slice(1, 7)) - check_idx(slice(7, None)) - check_idx(slice(1, 7, 2)) - check_idx(slice(-7, 5)) - check_idx(slice(7, None, 7)) - check_idx(slice(None, 7, 7)) - - def test_new_axis(): - check_idx(7, np.newaxis, 7) - check_idx(7, np.newaxis, slice(3, 7)) - - def test_ellipsis(): - check_idx(..., 7) - - check_idx(7, ...) - - check_idx(7, ..., 7, 7) - - check_idx(7, ..., 7, -7) - - check_idx(7, ..., slice(1, 7), -7) - - def test_integer_array(): - - index = [[6, 7, 8], [9, 7, 4], [1, 1, 1], [3, 5, 6], [7, 8, 1]] - - tensor_wrap(index[0]) - tensor_wrap(index[0], index[1]) - tensor_wrap(index[0], index[1], index[2]) - tensor_wrap(index[0], index[1], index[2], index[3]) - tensor_wrap(index[0], index[1], index[2], index[3], index[4]) - - # multi dimension - index = [ - [6, 7, 8, 8, 9, 7], - [9, 7, 4, 1, 8, 2], - [1, 1, 1, 0, 3, 3], - [3, 5, 6, 1, 6, 3], - [7, 8, 1, 1, 8, 2], - ] - - tensor_wrap(index[0]) - tensor_wrap(index[0], index[1]) - tensor_wrap(index[0], index[1], index[2]) - tensor_wrap(index[0], index[1], index[2], index[3]) - tensor_wrap(index[0], index[1], index[2], index[3], index[4]) - - # braodcast - # index = [ - # [6, 7, 8, 8, 9, 7], # 2 * 3 - # [2], # 1 - # [1, 1, 1], # 1 * 3 - # [6, 2], # 2 * 1 - # [7, 8, 1, 1, 8, 2], # 2 * 3 - # ] - - # tensor_wrap(index[0]) - # tensor_wrap(index[0], index[1]) - # tensor_wrap(index[0], index[1], index[2]) - # tensor_wrap(index[0], index[1], index[2], index[3]) - # tensor_wrap(index[0], index[1], index[2], index[3], index[4]) - - def test_multi_dim(): - check_equal(a[7][7, 7, 7], b[7][7, 7, 7]) - check_equal(a[7, 7, 7][7], b[7, 7, 7][7]) - - check_equal(a[7][7][7, 7], b[7][7][7, 7]) - check_equal(a[7][7, 7][7], b[7][7, 7][7]) - check_equal(a[7, 7][7][7], b[7, 7][7][7]) - - check_equal(a[7, 7, 7][7, 7], b[7, 7, 7][7, 7]) - check_equal(a[7, 7][7, 7, 7], b[7, 7][7, 7, 7]) - - check_equal(a[7][1:7:2], b[7][1:7:2]) - - check_equal(a[7][7:], b[7][7:]) - - check_equal(a[7][-7:-1], b[7][-7:-1]) - - check_equal(a[7][-1:-7:-1], b[7][-1:-7:-1]) - - check_equal(a[7:8][:], b[7:8][:]) - check_equal(a[7][:], b[7][:]) - - check_equal(a[7][:][7], b[7][:][7]) - check_equal(a[:][7][7], b[:][7][7]) - - check_equal(a[7][7], b[7][7]) - check_equal(a[7][7][7], b[7][7][7]) - check_equal(a[7][7][7][7], b[7][7][7][7]) - check_equal(a[7][7][7][7][7], b[7][7][7][7][7]) - - def test_hard(): - check_idx(slice(None, None), [6, 7, 8], slice(0, 7), [6, 7, 8]) - check_idx(slice(None, None), slice(0, 7), [6, 7, 8], [6, 7, 8]) - # check_idx(slice(None, None), slice(0, 7), [[6], [7], [8]], [[6, 7, 8]]) - # check_idx(slice(None, None), [[6, 7, 8]], slice(1, 3), [[6], [7], [8]]) - # check_idx(slice(None, None), [[6, 7, 8]], [[6], [7], [8]], slice(1, 3)) - check_idx([6, 7, 8], [6, 7, 8], 7, slice(2, 7)) - # check_idx(Ellipsis, 1, [[[6]]], [[[0]]], slice(1, 4, 2)) - # check_idx(slice(2, 4, 2), 1, Ellipsis, 0, [[[7]], [[3]]]) - # check_idx(slice(7, 10, 2), 3, Ellipsis, [[[5, 0]]], [[[3, 1]]]) - # check_idx(slice(7, 9, 1), [[[4]]], 8, Ellipsis, [[[6]], [[9]]]) - - def test_super_random(): - from random import randint - from random import random as rand - - def true_or_false(ture_prob): - return rand() < ture_prob - - def random_list(limit, size, one_base=False): - if one_base: - return [randint(1, limit) for _ in range(0, size)] - else: - # 0 <= x < limit - return [randint(0, limit - 1) for _ in range(0, size)] - - def generate_random_int_matrix(limit, shape): - if len(shape) == 0: - return [] - if len(shape) == 1: - return random_list(limit, shape[0]) - return [ - generate_random_int_matrix(limit, shape[1:]) for _ in range(0, shape[0]) - ] - - def generate_boardcast_shape(limit_shape): - # new_len = randint(1, len(limit_shape)) - new_len = len(limit_shape) - return [(1 if true_or_false(0.3) else i) for i in limit_shape[:new_len]] - - def g_slice(size): - start = randint(0, size) - if start == size: - start = None - end = randint(1 if start is None else start + 1, size + 1) - if end == size + 1: - end = None - return slice(start, end, 1 if true_or_false(0.3) else 2) - - def g_int(size): - return randint(0, size - 1) - - def g_inedx(limit_shape): - new_len = randint(len(limit_shape) // 2, len(limit_shape)) - output = [] - # [5] -> (0 ~ 4) - - cur_dim, cur_new = len(limit_shape), 0 - use_int_array = False - i = 0 - while len(output) < new_len: - flag = rand() - single_idx = None - old_dim, old_new, old_use_int_array = cur_dim, cur_new, use_int_array - if flag < 0.3: - single_idx = g_int(limit_shape[i]) - cur_dim -= 1 - elif flag < 0.5: - single_idx = g_slice(limit_shape[i]) - elif flag < 0.9: - if not use_int_array: - board_cast_dim = random_list(10, 1, one_base=True) - cur_dim += len(board_cast_dim) - use_int_array = True - cur_dim -= 1 - integer_array_shape = generate_boardcast_shape(board_cast_dim) - single_idx = generate_random_int_matrix( - limit_shape[i], integer_array_shape - ) - else: - cur_dim += 1 - cur_new += 1 - single_idx = np.newaxis - # MAX_DIM < 7 - if cur_dim > 7 or cur_new + len(limit_shape) > 7: - cur_dim, cur_new, use_int_array = ( - old_dim, - old_new, - old_use_int_array, - ) - continue - if not single_idx is np.newaxis: - i += 1 - output.append(single_idx) - # print('[cur_dim]: ', cur_dim, output) - - if cur_dim < 7 and rand() < 0.3 and new_len < len(limit_shape): - output.insert(randint(0, len(output)), Ellipsis) - - return tuple(output) - - for i in range(0, 17): - idx = g_inedx(a_shape) - # print('[task {}] {}'.format(i, idx)) - check_idx(*idx) - - test_one_dim() - test_multi_dim() - test_slice() - test_new_axis() - test_ellipsis() - test_integer_array() - test_hard() - test_super_random() diff --git a/python_module/test/unit/core/test_recoverable.py b/python_module/test/unit/core/test_recoverable.py deleted file mode 100644 index 86735d1e..00000000 --- a/python_module/test/unit/core/test_recoverable.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import numpy as np -import pytest - -import megengine as mge -import megengine._internal as mgb -from megengine.core import tensor -from megengine.test import assertTensorClose - - -def test_recoverable(): - a = tensor() - b = tensor() - a_np = np.random.random((4, 3)).astype("float32") - b_np = np.random.random((3, 7)).astype("float32") - a.set_value(a_np) - b.set_value(b_np) - - # Do some normal computation. - a2 = a * 2 - ab = a @ b - - # Raise a computation error. - with pytest.raises(mgb.MegBrainError): - _ = a * b - - # Variable a2 and ab should be still usable after error happened. - assertTensorClose(a2.numpy(), a_np * 2) - assertTensorClose(ab.numpy(), a_np @ b_np) - - # Should allow computation as well. - ab2 = ab ** 2 - assertTensorClose(ab2.numpy(), (a_np @ b_np) ** 2) diff --git a/python_module/test/unit/core/test_release_memory.py b/python_module/test/unit/core/test_release_memory.py deleted file mode 100644 index cf2ef0ac..00000000 --- a/python_module/test/unit/core/test_release_memory.py +++ /dev/null @@ -1,56 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import time - -import numpy as np -import pytest -from helpers import has_gpu - -import megengine as mge -import megengine.functional as F -from megengine.optimizer import SGD - - -@pytest.mark.skip -@pytest.mark.slow -def test_release_memory(): - mnist_datasets = load_mnist_datasets() - data_train, label_train = mnist_datasets["train"] - - batch_size = 15000 - data_shape = (batch_size, 1, 28, 28) - label_shape = (batch_size,) - - data = nn.Input("data", shape=data_shape, dtype=np.float32) - label = nn.Input( - "label", shape=label_shape, dtype=np.int32, value=np.zeros(label_shape) - ) - - net = MnistNet() - opt = SGD(net.parameters(), lr=0.01) - - pred = F.softmax(net(data)) - loss = F.cross_entropy(pred, label) - - opt.zero_grad() - opt.backward(loss) - add_updates = opt.step() - - mge.graph._default_graph.get_default().clear_device_memory() - - f = mge.graph.compile(loss, add_updates) - - for _ in range(3): - train_loss = 0.0 - for i in range(0, data_train.shape[0], batch_size): - opt.zero_grad() - data = data_train[i : i + batch_size, :, :, :] - label = label_train[i : i + batch_size] - loss = f(data=data, label=label)[0] - train_loss += loss[0] diff --git a/python_module/test/unit/core/test_reshape_broadcast.py b/python_module/test/unit/core/test_reshape_broadcast.py deleted file mode 100644 index 87469906..00000000 --- a/python_module/test/unit/core/test_reshape_broadcast.py +++ /dev/null @@ -1,108 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import numpy as np -import pytest - -from megengine import tensor -from megengine.test import assertTensorClose - - -def test_reshape_tuple(): - inp = tensor(np.arange(1, 17, dtype=np.int32).reshape(4, 4)) - out = tensor(np.arange(100, 116, dtype=np.int32).reshape(1, 16)) - out = out.reshape(inp.shape) - - assertTensorClose(out.numpy(), np.arange(100, 116, dtype=np.int32).reshape(4, 4)) - - -def test_reshape_asterisk(): - inp = tensor(np.arange(1, 17, dtype=np.int32).reshape(4, 4)) - out = tensor(np.arange(100, 116, dtype=np.int32).reshape(1, 16)) - out = out.reshape(*inp.shape) - - assertTensorClose(out.numpy(), np.arange(100, 116, dtype=np.int32).reshape(4, 4)) - - -def test_reshape_shapeof(): - inp = tensor(np.arange(1, 17, dtype=np.int32).reshape(4, 4)) - out = tensor(np.arange(100, 116, dtype=np.int32).reshape(1, 16)) - out = out.reshape(inp.shapeof()) - - assertTensorClose(out.numpy(), np.arange(100, 116, dtype=np.int32).reshape(4, 4)) - - -def test_reshape_tensor(): - out = tensor(np.arange(100, 116, dtype=np.int32).reshape(1, 16)) - out = out.reshape(tensor([4, 4])) - - assertTensorClose(out.numpy(), np.arange(100, 116, dtype=np.int32).reshape(4, 4)) - - -def test_reshape_tensor_fused(): - out = tensor(np.arange(100, 116, dtype=np.int32).reshape(1, 16)) - out = out.reshape(tensor([4, 4]), 1) - - assertTensorClose(out.numpy(), np.arange(100, 116, dtype=np.int32).reshape(4, 4, 1)) - - -def test_reshape_fused(): - out = tensor(np.arange(100, 116, dtype=np.int32).reshape(1, 16)) - out = out.reshape(tensor(2), 2, tensor(4), 1) - - assertTensorClose( - out.numpy(), np.arange(100, 116, dtype=np.int32).reshape(2, 2, 4, 1) - ) - - -def test_reshape_wrong_tuple(): - out = tensor(np.arange(100, 116, dtype=np.int32).reshape(1, 16)) - with pytest.raises(ValueError): - out = out.reshape((2, 2), 4) - - -def test_reshape_wrong_tuple2(): - out = tensor(np.arange(100, 116, dtype=np.int32).reshape(1, 16)) - with pytest.raises(AssertionError): - out = out.reshape(4, (2, 2)) - - -def test_broadcast_tuple(): - inp = tensor(np.arange(1, 17, dtype=np.int32).reshape(4, 4)) - out = tensor(np.arange(100, 104, dtype=np.int32).reshape(1, 4)) - - out = out.broadcast(inp.shape) - - tmp = np.array([[100, 101, 102, 103]], dtype=np.int32) - out2 = np.repeat(tmp, 4, axis=0) - - assertTensorClose(out.numpy(), out2) - - -def test_broadcast_asterisk(): - inp = tensor(np.arange(1, 17, dtype=np.int32).reshape(4, 4)) - out = tensor(np.arange(100, 104, dtype=np.int32).reshape(1, 4)) - - out = out.broadcast(*inp.shape) - - tmp = np.array([[100, 101, 102, 103]], dtype=np.int32) - out2 = np.repeat(tmp, 4, axis=0) - - assertTensorClose(out.numpy(), out2) - - -def test_broadcast_shapeof(): - inp = tensor(np.arange(1, 17, dtype=np.int32).reshape(4, 4)) - out = tensor(np.arange(100, 104, dtype=np.int32).reshape(1, 4)) - - out = out.broadcast(inp.shapeof()) - - tmp = np.array([[100, 101, 102, 103]], dtype=np.int32) - out2 = np.repeat(tmp, 4, axis=0) - - assertTensorClose(out.numpy(), out2) diff --git a/python_module/test/unit/core/test_serialization.py b/python_module/test/unit/core/test_serialization.py deleted file mode 100644 index 85c30eb0..00000000 --- a/python_module/test/unit/core/test_serialization.py +++ /dev/null @@ -1,47 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import pickle -from tempfile import TemporaryFile - -import numpy as np - -from megengine.core import Buffer, Parameter, tensor -from megengine.test import assertTensorClose - - -def test_tensor_serialization(): - def tensor_eq(a, b): - assert a.dtype == b.dtype - assert a.device == b.device - assert a.requires_grad == b.requires_grad - assertTensorClose(a, b) - - with TemporaryFile() as f: - data = np.random.randint(low=0, high=7, size=[233]) - a = tensor(data, device="xpux", dtype=np.int32) - pickle.dump(a, f) - f.seek(0) - b = pickle.load(f) - tensor_eq(a, b) - - with TemporaryFile() as f: - a = Parameter(np.random.random(size=(233, 2)).astype(np.float32)) - pickle.dump(a, f) - f.seek(0) - b = pickle.load(f) - assert isinstance(b, Parameter) - tensor_eq(a, b) - - with TemporaryFile() as f: - a = Buffer(np.random.random(size=(2, 233)).astype(np.float32)) - pickle.dump(a, f) - f.seek(0) - b = pickle.load(f) - assert isinstance(b, Buffer) - tensor_eq(a, b) diff --git a/python_module/test/unit/core/test_tensor.py b/python_module/test/unit/core/test_tensor.py deleted file mode 100644 index 3ac0a4c8..00000000 --- a/python_module/test/unit/core/test_tensor.py +++ /dev/null @@ -1,91 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import numpy as np -import pytest - -import megengine as mge -import megengine._internal as mgb - - -def test_wrong_dtype(): - with pytest.raises(TypeError): - mge.tensor(np.zeros((5, 5), dtype=np.float64)) - - with pytest.raises(TypeError): - mge.Parameter(np.zeros((5, 5), dtype=np.int64)) - - -def test_tensor_routine(): - mge.tensor(np.zeros((1, 2), dtype=np.int32)) - - mge.tensor([1]) - - mge.tensor(1.5) - - -def test_tensor_set_dtype(): - def check_dtype_value(tensor, dtype_scale, value): - if mgb.dtype.is_quantize(tensor.dtype): - if np.abs(mgb.dtype.get_scale(tensor.dtype) - dtype_scale) > 1e-5: - raise AssertionError( - "compare scale failed expect {} got {}".format( - dtype_scale, mgb.dtype.get_scale(tensor.dtype) - ) - ) - if np.abs(tensor.numpy()[0][0] - value) > 1e-5: - raise AssertionError( - "compare value failed expect {} got {}".format( - tensor.numpy()[0][0], value - ) - ) - - t = mge.Parameter(np.ones((3, 4), dtype="float32")) - t.dtype = mgb.dtype.qint8(0.1) - check_dtype_value(t, 0.1, 10) - - t = mge.Parameter(np.ones((3, 4), dtype=mgb.dtype.qint8(1))) - t.dtype = mgb.dtype.qint8(0.3) - check_dtype_value(t, 0.3, 3) - - t = mge.Buffer(np.ones((3, 4), dtype="float32")) - t.dtype = mgb.dtype.qint8(0.1) - check_dtype_value(t, 0.1, 10) - - t = mge.Buffer(np.ones((3, 4), dtype=mgb.dtype.qint8(1))) - t.dtype = mgb.dtype.qint8(0.3) - check_dtype_value(t, 0.3, 3) - - t = mge.Buffer(np.ones((3, 4), dtype="float32")) - s = t + 1 - s.dtype = mgb.dtype.qint8(0.2) - check_dtype_value(s, 0.2, 10) - - t.dtype = mgb.dtype.qint8(0.3) - s = t + 1 - s.dtype = mgb.dtype.qint8(0.1) - check_dtype_value(s, 0.1, 18) - s.dtype = "float32" - check_dtype_value(s, 0, 1.8) - - -def test_tensor_name(): - p = mge.Parameter(np.ones((3, 4), dtype="float32")) - assert "shared" in p.name - with pytest.raises(ValueError): - p.name = "Parameter0" - - b = mge.Buffer(np.ones((3, 4), dtype="float32")) - assert "shared" in b.name - with pytest.raises(ValueError): - b.name = "Buffer0" - - s = b + 1 - assert "ADD" in s.name - s.name = "WeightAdd1" - assert s.name == "WeightAdd1" diff --git a/python_module/test/unit/core/test_zeros_ones.py b/python_module/test/unit/core/test_zeros_ones.py deleted file mode 100644 index 4d14653b..00000000 --- a/python_module/test/unit/core/test_zeros_ones.py +++ /dev/null @@ -1,35 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import numpy as np -import pytest - -import megengine as mge -from megengine.test import assertTensorClose - - -def test_zeros(): - assertTensorClose( - mge.zeros((2, 2), dtype=np.int32).numpy(), np.zeros((2, 2), dtype=np.int32) - ) - - assertTensorClose( - mge.zeros(mge.tensor([2, 2], dtype=np.int32), dtype=np.int32).numpy(), - np.zeros((2, 2), dtype=np.int32), - ) - - -def test_ones(): - assertTensorClose( - mge.ones((2, 2), dtype=np.int32).numpy(), np.ones((2, 2), dtype=np.int32) - ) - - assertTensorClose( - mge.ones(mge.tensor([2, 2], dtype=np.int32), dtype=np.int32).numpy(), - np.ones((2, 2), dtype=np.int32), - ) diff --git a/python_module/test/unit/data/__init__.py b/python_module/test/unit/data/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/python_module/test/unit/data/test_dataloader.py b/python_module/test/unit/data/test_dataloader.py deleted file mode 100644 index 6bb0f3e3..00000000 --- a/python_module/test/unit/data/test_dataloader.py +++ /dev/null @@ -1,183 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import os -import time - -import numpy as np -import pytest - -from megengine.data.collator import Collator -from megengine.data.dataloader import DataLoader -from megengine.data.dataset import ArrayDataset -from megengine.data.sampler import RandomSampler, SequentialSampler -from megengine.data.transform import PseudoTransform, Transform - - -def init_dataset(): - sample_num = 100 - rand_data = np.random.randint(0, 255, size=(sample_num, 1, 32, 32), dtype=np.uint8) - label = np.random.randint(0, 10, size=(sample_num,), dtype=int) - dataset = ArrayDataset(rand_data, label) - return dataset - - -def test_dataloader_init(): - dataset = init_dataset() - with pytest.raises(ValueError): - dataloader = DataLoader(dataset, num_workers=2, divide=True) - with pytest.raises(ValueError): - dataloader = DataLoader(dataset, num_workers=-1) - with pytest.raises(ValueError): - dataloader = DataLoader(dataset, timeout=-1) - with pytest.raises(ValueError): - dataloader = DataLoader(dataset, num_workers=0, divide=True) - - dataloader = DataLoader(dataset) - assert isinstance(dataloader.sampler, SequentialSampler) - assert isinstance(dataloader.transform, PseudoTransform) - assert isinstance(dataloader.collator, Collator) - - dataloader = DataLoader( - dataset, sampler=RandomSampler(dataset, batch_size=6, drop_last=False) - ) - assert len(dataloader) == 17 - dataloader = DataLoader( - dataset, sampler=RandomSampler(dataset, batch_size=6, drop_last=True) - ) - assert len(dataloader) == 16 - - -def test_dataloader_serial(): - dataset = init_dataset() - dataloader = DataLoader( - dataset, sampler=RandomSampler(dataset, batch_size=4, drop_last=False) - ) - for (data, label) in dataloader: - assert data.shape == (4, 1, 32, 32) - assert label.shape == (4,) - - -def test_dataloader_parallel(): - # set max shared memory to 100M - os.environ["MGE_PLASMA_MEMORY"] = "100000000" - - dataset = init_dataset() - dataloader = DataLoader( - dataset, - sampler=RandomSampler(dataset, batch_size=4, drop_last=False), - num_workers=2, - divide=False, - ) - for (data, label) in dataloader: - assert data.shape == (4, 1, 32, 32) - assert label.shape == (4,) - - dataloader = DataLoader( - dataset, - sampler=RandomSampler(dataset, batch_size=4, drop_last=False), - num_workers=2, - divide=True, - ) - for (data, label) in dataloader: - assert data.shape == (4, 1, 32, 32) - assert label.shape == (4,) - - -def test_dataloader_parallel_timeout(): - dataset = init_dataset() - - class TimeoutTransform(Transform): - def __init__(self): - pass - - def apply(self, input): - time.sleep(10) - return input - - dataloader = DataLoader( - dataset, - sampler=RandomSampler(dataset, batch_size=4, drop_last=False), - transform=TimeoutTransform(), - num_workers=2, - timeout=2, - ) - with pytest.raises(RuntimeError, match=r".*timeout.*"): - data_iter = iter(dataloader) - batch_data = next(data_iter) - - -def test_dataloader_parallel_worker_exception(): - dataset = init_dataset() - - class FakeErrorTransform(Transform): - def __init__(self): - pass - - def apply(self, input): - y = x + 1 - return input - - dataloader = DataLoader( - dataset, - sampler=RandomSampler(dataset, batch_size=4, drop_last=False), - transform=FakeErrorTransform(), - num_workers=2, - ) - with pytest.raises(RuntimeError, match=r"worker.*died"): - data_iter = iter(dataloader) - batch_data = next(data_iter) - - -def _multi_instances_parallel_dataloader_worker(): - dataset = init_dataset() - - for divide_flag in [True, False]: - train_dataloader = DataLoader( - dataset, - sampler=RandomSampler(dataset, batch_size=4, drop_last=False), - num_workers=2, - divide=divide_flag, - ) - val_dataloader = DataLoader( - dataset, - sampler=RandomSampler(dataset, batch_size=10, drop_last=False), - num_workers=2, - divide=divide_flag, - ) - for idx, (data, label) in enumerate(train_dataloader): - assert data.shape == (4, 1, 32, 32) - assert label.shape == (4,) - if idx % 5 == 0: - for val_data, val_label in val_dataloader: - assert val_data.shape == (10, 1, 32, 32) - assert val_label.shape == (10,) - - -def test_dataloader_parallel_multi_instances(): - # set max shared memory to 100M - os.environ["MGE_PLASMA_MEMORY"] = "100000000" - - _multi_instances_parallel_dataloader_worker() - - -def test_dataloader_parallel_multi_instances_multiprocessing(): - # set max shared memory to 100M - os.environ["MGE_PLASMA_MEMORY"] = "100000000" - - import multiprocessing as mp - - # mp.set_start_method("spawn") - processes = [] - for i in range(4): - p = mp.Process(target=_multi_instances_parallel_dataloader_worker) - p.start() - processes.append(p) - - for p in processes: - p.join() diff --git a/python_module/test/unit/data/test_dataset.py b/python_module/test/unit/data/test_dataset.py deleted file mode 100644 index d68d3784..00000000 --- a/python_module/test/unit/data/test_dataset.py +++ /dev/null @@ -1,43 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import os -import sys - -import numpy as np -import pytest - -from megengine.data.dataset import ArrayDataset, Dataset, MapDataset, StreamDataset - - -def test_abstract_cls(): - with pytest.raises(TypeError): - Dataset() - with pytest.raises(TypeError): - MapDataset() - with pytest.raises(TypeError): - StreamDataset() - - -def test_array_dataset(): - size = (10,) - data_shape = (3, 256, 256) - label_shape = (1,) - data = np.random.randint(0, 255, size + data_shape) - label = np.random.randint(0, 9, size + label_shape) - dataset = ArrayDataset(data, label) - assert dataset[0][0].shape == data_shape - assert dataset[0][1].shape == label_shape - assert len(dataset) == size[0] - - -def test_array_dataset_dim_error(): - data = np.random.randint(0, 255, (10, 3, 256, 256)) - label = np.random.randint(0, 9, (1,)) - with pytest.raises(ValueError): - ArrayDataset(data, label) diff --git a/python_module/test/unit/data/test_sampler.py b/python_module/test/unit/data/test_sampler.py deleted file mode 100644 index bc399e86..00000000 --- a/python_module/test/unit/data/test_sampler.py +++ /dev/null @@ -1,81 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import copy -import os -import sys - -import numpy as np -import pytest - -from megengine.data.dataset import ArrayDataset -from megengine.data.sampler import RandomSampler, ReplacementSampler, SequentialSampler - - -def test_sequential_sampler(): - indices = list(range(100)) - sampler = SequentialSampler(ArrayDataset(indices)) - assert indices == list(each[0] for each in sampler) - - -def test_RandomSampler(): - indices = list(range(20)) - indices_copy = copy.deepcopy(indices) - sampler = RandomSampler(ArrayDataset(indices_copy)) - sample_indices = sampler - assert indices != list(each[0] for each in sample_indices) - assert indices == sorted(list(each[0] for each in sample_indices)) - - -def test_random_sampler_seed(): - seed = [0, 1] - indices = list(range(20)) - indices_copy1 = copy.deepcopy(indices) - indices_copy2 = copy.deepcopy(indices) - indices_copy3 = copy.deepcopy(indices) - sampler1 = RandomSampler(ArrayDataset(indices_copy1), seed=seed[0]) - sampler2 = RandomSampler(ArrayDataset(indices_copy2), seed=seed[0]) - sampler3 = RandomSampler(ArrayDataset(indices_copy3), seed=seed[1]) - assert indices != list(each[0] for each in sampler1) - assert indices != list(each[0] for each in sampler2) - assert indices != list(each[0] for each in sampler3) - assert indices == sorted(list(each[0] for each in sampler1)) - assert indices == sorted(list(each[0] for each in sampler2)) - assert indices == sorted(list(each[0] for each in sampler3)) - assert list(each[0] for each in sampler1) == list(each[0] for each in sampler2) - assert list(each[0] for each in sampler1) != list(each[0] for each in sampler3) - - -def test_ReplacementSampler(): - num_samples = 30 - indices = list(range(20)) - weights = list(range(20)) - sampler = ReplacementSampler( - ArrayDataset(indices), num_samples=num_samples, weights=weights - ) - assert len(list(each[0] for each in sampler)) == num_samples - - -def test_sampler_drop_last_false(): - batch_size = 5 - drop_last = False - indices = list(range(24)) - sampler = SequentialSampler( - ArrayDataset(indices), batch_size=batch_size, drop_last=drop_last - ) - assert len([each for each in sampler]) == len(sampler) - - -def test_sampler_drop_last_true(): - batch_size = 5 - drop_last = True - indices = list(range(24)) - sampler = SequentialSampler( - ArrayDataset(indices), batch_size=batch_size, drop_last=drop_last - ) - assert len([each for each in sampler]) == len(sampler) diff --git a/python_module/test/unit/data/test_transform.py b/python_module/test/unit/data/test_transform.py deleted file mode 100644 index d438d8b5..00000000 --- a/python_module/test/unit/data/test_transform.py +++ /dev/null @@ -1,108 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import numpy as np - -from megengine.data.transform import * - -data_shape = (100, 100, 3) -label_shape = (4,) -ToMode_target_shape = (3, 100, 100) -CenterCrop_size = (90, 70) -CenterCrop_target_shape = CenterCrop_size + (3,) -RandomResizedCrop_size = (50, 50) -RandomResizedCrop_target_shape = RandomResizedCrop_size + (3,) - - -def generate_data(): - return [ - ( - (np.random.rand(*data_shape) * 255).astype(np.uint8), - np.random.randint(10, size=label_shape), - ) - for _ in range(*label_shape) - ] - - -def test_ToMode(): - t = ToMode(mode="CHW") - aug_data = t.apply_batch(generate_data()) - aug_data_shape = [(a.shape, b.shape) for a, b in aug_data] - target_shape = [(ToMode_target_shape, label_shape)] * 4 - assert aug_data_shape == target_shape - - -def test_CenterCrop(): - t = CenterCrop(output_size=CenterCrop_size) - aug_data = t.apply_batch(generate_data()) - aug_data_shape = [(a.shape, b.shape) for a, b in aug_data] - target_shape = [(CenterCrop_target_shape, label_shape)] * 4 - assert aug_data_shape == target_shape - - -def test_ColorJitter(): - t = ColorJitter() - aug_data = t.apply_batch(generate_data()) - aug_data_shape = [(a.shape, b.shape) for a, b in aug_data] - target_shape = [(data_shape, label_shape)] * 4 - assert aug_data_shape == target_shape - - -def test_RandomHorizontalFlip(): - t = RandomHorizontalFlip(prob=1) - aug_data = t.apply_batch(generate_data()) - aug_data_shape = [(a.shape, b.shape) for a, b in aug_data] - target_shape = [(data_shape, label_shape)] * 4 - assert aug_data_shape == target_shape - - -def test_RandomVerticalFlip(): - t = RandomVerticalFlip(prob=1) - aug_data = t.apply_batch(generate_data()) - aug_data_shape = [(a.shape, b.shape) for a, b in aug_data] - target_shape = [(data_shape, label_shape)] * 4 - assert aug_data_shape == target_shape - - -def test_RandomResizedCrop(): - t = RandomResizedCrop(output_size=RandomResizedCrop_size) - aug_data = t.apply_batch(generate_data()) - aug_data_shape = [(a.shape, b.shape) for a, b in aug_data] - target_shape = [(RandomResizedCrop_target_shape, label_shape)] * 4 - assert aug_data_shape == target_shape - - -def test_Normalize(): - t = Normalize() - aug_data = t.apply_batch(generate_data()) - aug_data_shape = [(a.shape, b.shape) for a, b in aug_data] - target_shape = [(data_shape, label_shape)] * 4 - assert aug_data_shape == target_shape - - -def test_RandomCrop(): - t = RandomCrop((150, 120), padding_size=10, padding_value=[1, 2, 3]) - aug_data = t.apply_batch(generate_data()) - aug_data_shape = [(a.shape, b.shape) for a, b in aug_data] - target_shape = [((150, 120, 3), label_shape)] * 4 - assert aug_data_shape == target_shape - - -def test_Compose(): - t = Compose( - [ - CenterCrop(output_size=CenterCrop_size), - RandomHorizontalFlip(prob=1), - ToMode(mode="CHW"), - ] - ) - aug_data = t.apply_batch(generate_data()) - aug_data_shape = [(a.shape, b.shape) for a, b in aug_data] - print(aug_data_shape) - target_shape = [((3, 90, 70), label_shape)] * 4 - assert aug_data_shape == target_shape diff --git a/python_module/test/unit/distributed/test_functional.py b/python_module/test/unit/distributed/test_functional.py deleted file mode 100644 index 8bbaf7e0..00000000 --- a/python_module/test/unit/distributed/test_functional.py +++ /dev/null @@ -1,467 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -import multiprocessing as mp -import platform - -import numpy as np -import pytest - -import megengine as mge -import megengine.distributed as dist -from megengine.core import Parameter, tensor - - -def _init_process_group_wrapper(world_size, rank, dev, backend, q): - if rank == 0: - dist.init_process_group("localhost", 0, world_size, rank, dev, backend) - q.put(dist.get_master_port()) - else: - port = q.get() - dist.init_process_group("localhost", port, world_size, rank, dev, backend) - - -@pytest.mark.skipif( - platform.system() == "Darwin", reason="do not imp GPU mode at macos now" -) -@pytest.mark.skipif( - platform.system() == "Windows", reason="do not imp GPU mode at Windows now" -) -@pytest.mark.isolated_distributed -def test_reduce_sum(): - world_size = 2 - - def worker(rank, data, backend, expect, port_queue): - if mge.get_device_count("gpu") < world_size: - return - _init_process_group_wrapper(world_size, rank, rank, backend, port_queue) - inp = tensor(data) - output = dist.functional.reduce_sum(inp) - if rank == 0: - assert np.allclose(output.numpy(), expect) - else: - assert np.allclose(output.numpy(), 0) - - def check(shape, backend): - port_queue = mp.Queue() - x = np.random.rand(*shape).astype("float32") - y = np.random.rand(*shape).astype("float32") - z = x + y - p0 = mp.Process(target=worker, args=(0, x, backend, z, port_queue)) - p1 = mp.Process(target=worker, args=(1, y, backend, None, port_queue)) - - p0.start() - p1.start() - - p0.join(10) - p1.join(10) - - assert p0.exitcode == 0 and p1.exitcode == 0 - - for shape in [(2, 3), (8, 10), (99, 77)]: - for backend in ["nccl"]: - check(shape, backend) - - -@pytest.mark.skipif( - platform.system() == "Darwin", reason="do not imp GPU mode at macos now" -) -@pytest.mark.skipif( - platform.system() == "Windows", reason="do not imp GPU mode at Windows now" -) -@pytest.mark.isolated_distributed -def test_gather(): - world_size = 2 - - def worker(rank, data, backend, expect, port_queue): - if mge.get_device_count("gpu") < world_size: - return - _init_process_group_wrapper(world_size, rank, rank, backend, port_queue) - inp = tensor(data) - output = dist.functional.gather(inp) - if rank == 0: - assert np.allclose(output.numpy(), expect) - else: - assert np.allclose(output.numpy(), 0) - - def check(shape, backend): - port_queue = mp.Queue() - x = np.random.rand(*shape).astype("float32") - y = np.random.rand(*shape).astype("float32") - z = np.concatenate((x, y)) - p0 = mp.Process(target=worker, args=(0, x, backend, z, port_queue)) - p1 = mp.Process(target=worker, args=(1, y, backend, None, port_queue)) - - p0.start() - p1.start() - - p0.join(10) - p1.join(10) - - assert p0.exitcode == 0 and p1.exitcode == 0 - - for shape in [(2, 3), (8, 10), (99, 77)]: - for backend in ["nccl"]: - check(shape, backend) - - -@pytest.mark.skipif( - platform.system() == "Darwin", reason="do not imp GPU mode at macos now" -) -@pytest.mark.skipif( - platform.system() == "Windows", reason="do not imp GPU mode at Windows now" -) -@pytest.mark.isolated_distributed -def test_broadcast(): - world_size = 2 - - def worker(rank, data, backend, expect, port_queue): - if mge.get_device_count("gpu") < world_size: - return - _init_process_group_wrapper(world_size, rank, rank, backend, port_queue) - inp = tensor(data) - output = dist.functional.broadcast(inp) - assert np.allclose(output.numpy(), expect) - - def check(shape, backend): - port_queue = mp.Queue() - x = np.random.rand(*shape).astype("float32") - y = x + 1 - p0 = mp.Process(target=worker, args=(0, x, backend, x, port_queue)) - p1 = mp.Process(target=worker, args=(1, y, backend, x, port_queue)) - - p0.start() - p1.start() - - p0.join(10) - p1.join(10) - - assert p0.exitcode == 0 and p1.exitcode == 0 - - for shape in [(2, 3), (8, 10), (99, 77)]: - for backend in ["nccl"]: - check(shape, backend) - - -@pytest.mark.skipif( - platform.system() == "Darwin", reason="do not imp GPU mode at macos now" -) -@pytest.mark.skipif( - platform.system() == "Windows", reason="do not imp GPU mode at Windows now" -) -@pytest.mark.isolated_distributed -def test_scatter(): - world_size = 2 - - def worker(rank, data, backend, expect, port_queue): - if mge.get_device_count("gpu") < world_size: - return - _init_process_group_wrapper(world_size, rank, rank, backend, port_queue) - inp = tensor(data) - output = dist.functional.scatter(inp) - assert np.allclose(output.numpy(), expect) - - def check(shape, backend): - port_queue = mp.Queue() - x = np.random.rand(*shape).astype("float32") - y = x + 1 - p0 = mp.Process( - target=worker, args=(0, x, backend, x[: shape[0] // 2], port_queue) - ) - p1 = mp.Process( - target=worker, args=(1, y, backend, x[shape[0] // 2 :], port_queue) - ) - - p0.start() - p1.start() - - p0.join(10) - p1.join(10) - - assert p0.exitcode == 0 and p1.exitcode == 0 - - for shape in [(2, 3), (8, 10), (100, 77)]: - for backend in ["nccl"]: - check(shape, backend) - - -@pytest.mark.skipif( - platform.system() == "Darwin", reason="do not imp GPU mode at macos now" -) -@pytest.mark.skipif( - platform.system() == "Windows", reason="do not imp GPU mode at Windows now" -) -@pytest.mark.isolated_distributed -def test_all_to_all(): - world_size = 2 - - def worker(rank, data, backend, expect, port_queue): - if mge.get_device_count("gpu") < world_size: - return - _init_process_group_wrapper(world_size, rank, rank, backend, port_queue) - inp = tensor(data) - output = dist.functional.all_to_all(inp) - assert np.allclose(output.numpy(), expect) - - def check(shape, backend): - port_queue = mp.Queue() - x = np.random.rand(*shape).astype("float32") - y = np.random.rand(*shape).astype("float32") - a = np.concatenate((x[: shape[0] // 2], y[: shape[0] // 2])) - b = np.concatenate((x[shape[0] // 2 :], y[shape[0] // 2 :])) - p0 = mp.Process(target=worker, args=(0, x, backend, a, port_queue)) - p1 = mp.Process(target=worker, args=(1, y, backend, b, port_queue)) - - p0.start() - p1.start() - - p0.join(10) - p1.join(10) - - assert p0.exitcode == 0 and p1.exitcode == 0 - - for shape in [(2, 3), (8, 10), (100, 77)]: - for backend in ["nccl"]: - check(shape, backend) - - -@pytest.mark.skipif( - platform.system() == "Darwin", reason="do not imp GPU mode at macos now" -) -@pytest.mark.skipif( - platform.system() == "Windows", reason="do not imp GPU mode at Windows now" -) -@pytest.mark.isolated_distributed -def test_all_gather(): - world_size = 2 - - def worker(rank, data, backend, expect, port_queue): - if mge.get_device_count("gpu") < world_size: - return - _init_process_group_wrapper(world_size, rank, rank, backend, port_queue) - inp = tensor(data) - output = dist.functional.all_gather(inp) - assert np.allclose(output.numpy(), expect) - - def check(shape, backend): - port_queue = mp.Queue() - x = np.random.rand(*shape).astype("float32") - y = np.random.rand(*shape).astype("float32") - z = np.concatenate((x, y)) - p0 = mp.Process(target=worker, args=(0, x, backend, z, port_queue)) - p1 = mp.Process(target=worker, args=(1, y, backend, z, port_queue)) - - p0.start() - p1.start() - - p0.join(10) - p1.join(10) - - assert p0.exitcode == 0 and p1.exitcode == 0 - - for shape in [(2, 3), (8, 10), (99, 77)]: - for backend in ["nccl"]: - check(shape, backend) - - -@pytest.mark.skipif( - platform.system() == "Darwin", reason="do not imp GPU mode at macos now" -) -@pytest.mark.skipif( - platform.system() == "Windows", reason="do not imp GPU mode at Windows now" -) -@pytest.mark.isolated_distributed -def test_reduce_scatter_sum(): - world_size = 2 - - def worker(rank, data, backend, expect, port_queue): - if mge.get_device_count("gpu") < world_size: - return - _init_process_group_wrapper(world_size, rank, rank, backend, port_queue) - inp = tensor(data) - output = dist.functional.reduce_scatter_sum(inp) - assert np.allclose(output.numpy(), expect) - - def check(shape, backend): - port_queue = mp.Queue() - x = np.random.rand(*shape).astype("float32") - y = np.random.rand(*shape).astype("float32") - z = x + y - p0 = mp.Process( - target=worker, args=(0, x, backend, z[: shape[0] // 2], port_queue) - ) - p1 = mp.Process( - target=worker, args=(1, y, backend, z[shape[0] // 2 :], port_queue) - ) - - p0.start() - p1.start() - - p0.join(10) - p1.join(10) - - assert p0.exitcode == 0 and p1.exitcode == 0 - - for shape in [(2, 4), (8, 10), (88, 44)]: - for backend in ["nccl"]: - check(shape, backend) - - -@pytest.mark.skipif( - platform.system() == "Darwin", reason="do not imp GPU mode at macos now" -) -@pytest.mark.skipif( - platform.system() == "Windows", reason="do not imp GPU mode at Windows now" -) -@pytest.mark.isolated_distributed -def test_all_reduce_sum(): - world_size = 2 - - def worker(rank, data, backend, expect, port_queue): - if mge.get_device_count("gpu") < world_size: - return - _init_process_group_wrapper(world_size, rank, rank, backend, port_queue) - inp = tensor(data) - output = dist.functional.all_reduce_sum(inp) - assert np.allclose(output.numpy(), expect) - - def check(shape, backend): - port_queue = mp.Queue() - x = np.random.rand(*shape).astype("float32") - y = np.random.rand(*shape).astype("float32") - z = x + y - p0 = mp.Process(target=worker, args=(0, x, backend, z, port_queue)) - p1 = mp.Process(target=worker, args=(1, y, backend, z, port_queue)) - - p0.start() - p1.start() - - p0.join(10) - p1.join(10) - - assert p0.exitcode == 0 and p1.exitcode == 0 - - for shape in [(2, 3), (8, 10), (99, 77)]: - for backend in ["nccl"]: - check(shape, backend) - - -@pytest.mark.skipif( - platform.system() == "Darwin", reason="do not imp GPU mode at macos now" -) -@pytest.mark.skipif( - platform.system() == "Windows", reason="do not imp GPU mode at Windows now" -) -@pytest.mark.isolated_distributed -def test_all_reduce_max(): - world_size = 2 - - def worker(rank, data, backend, expect, port_queue): - if mge.get_device_count("gpu") < world_size: - return - _init_process_group_wrapper(world_size, rank, rank, backend, port_queue) - inp = tensor(data) - output = dist.functional.all_reduce_max(inp) - assert np.allclose(output.numpy(), expect) - - def check(shape, backend): - port_queue = mp.Queue() - x = np.random.rand(*shape).astype("float32") - y = np.random.rand(*shape).astype("float32") - z = np.maximum(x, y) - p0 = mp.Process(target=worker, args=(0, x, backend, z, port_queue)) - p1 = mp.Process(target=worker, args=(1, y, backend, z, port_queue)) - - p0.start() - p1.start() - - p0.join(10) - p1.join(10) - - assert p0.exitcode == 0 and p1.exitcode == 0 - - for shape in [(2, 3), (8, 10), (99, 77)]: - for backend in ["nccl"]: - check(shape, backend) - - -@pytest.mark.skipif( - platform.system() == "Darwin", reason="do not imp GPU mode at macos now" -) -@pytest.mark.skipif( - platform.system() == "Windows", reason="do not imp GPU mode at Windows now" -) -@pytest.mark.isolated_distributed -def test_all_reduce_min(): - world_size = 2 - - def worker(rank, data, backend, expect, port_queue): - if mge.get_device_count("gpu") < world_size: - return - _init_process_group_wrapper(world_size, rank, rank, backend, port_queue) - inp = tensor(data) - output = dist.functional.all_reduce_min(inp) - assert np.allclose(output.numpy(), expect) - - def check(shape, backend): - port_queue = mp.Queue() - x = np.random.rand(*shape).astype("float32") - y = np.random.rand(*shape).astype("float32") - z = np.minimum(x, y) - p0 = mp.Process(target=worker, args=(0, x, backend, z, port_queue)) - p1 = mp.Process(target=worker, args=(1, y, backend, z, port_queue)) - - p0.start() - p1.start() - - p0.join(10) - p1.join(10) - - assert p0.exitcode == 0 and p1.exitcode == 0 - - for shape in [(2, 3), (8, 10), (99, 77)]: - for backend in ["nccl"]: - check(shape, backend) - - -@pytest.mark.skipif( - platform.system() == "Darwin", reason="do not imp GPU mode at macos now" -) -@pytest.mark.skipif( - platform.system() == "Windows", reason="do not imp GPU mode at Windows now" -) -@pytest.mark.isolated_distributed -def test_bcast_param(): - world_size = 2 - - def worker(rank, data, backend, expect, port_queue): - if mge.get_device_count("gpu") < world_size: - return - _init_process_group_wrapper(world_size, rank, rank, backend, port_queue) - inp = Parameter(data) - dist.functional.bcast_param(inp) - assert np.allclose(inp.numpy(), expect) - - def check(shape, backend): - port_queue = mp.Queue() - x = np.random.rand(*shape).astype("float32") - y = x + 1 - p0 = mp.Process(target=worker, args=(0, x, backend, x, port_queue)) - p1 = mp.Process(target=worker, args=(1, y, backend, x, port_queue)) - - p0.start() - p1.start() - - p0.join(10) - p1.join(10) - - assert p0.exitcode == 0 and p1.exitcode == 0 - - for shape in [(2, 3), (8, 10), (99, 77)]: - for backend in ["nccl"]: - check(shape, backend) diff --git a/python_module/test/unit/distributed/test_util.py b/python_module/test/unit/distributed/test_util.py deleted file mode 100644 index 04b34244..00000000 --- a/python_module/test/unit/distributed/test_util.py +++ /dev/null @@ -1,187 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import multiprocessing as mp -import platform -import queue -from time import sleep - -import pytest - -import megengine as mge -import megengine._internal as mgb -import megengine.distributed as dist - -_LOCALHOST = "127.0.0.1" - - -def _assert_q_empty(q): - try: - res = q.get(timeout=1) - except Exception as e: - assert isinstance(e, queue.Empty) - else: - assert False, "queue is not empty" - - -def _assert_q_val(q, val): - ret = q.get() - assert ret == val - - -def _init_process_group_wrapper(world_size, rank, dev, backend, q): - if rank == 0: - dist.init_process_group(_LOCALHOST, 0, world_size, rank, dev, backend) - q.put(dist.get_master_port()) - else: - port = q.get() - dist.init_process_group(_LOCALHOST, port, world_size, rank, dev, backend) - - -@pytest.mark.skipif( - platform.system() == "Darwin", reason="do not imp GPU mode at macos now" -) -@pytest.mark.skipif( - platform.system() == "Windows", reason="do not imp GPU mode at Windows now" -) -@pytest.mark.isolated_distributed -def test_create_mm_server(): - def worker(): - if not mge.is_cuda_available(): - return - port = mgb.config.create_mm_server("0.0.0.0", 0) - assert port > 0 - res = mgb.config.create_mm_server("0.0.0.0", port) - assert res == -1 - - p = mp.Process(target=worker) - - p.start() - - p.join(10) - - assert p.exitcode == 0 - - -@pytest.mark.skipif( - platform.system() == "Darwin", reason="do not imp GPU mode at macos now" -) -@pytest.mark.skipif( - platform.system() == "Windows", reason="do not imp GPU mode at Windows now" -) -@pytest.mark.isolated_distributed -def test_init_process_group(): - world_size = 2 - - def worker(rank, backend, q): - if not mge.is_cuda_available(): - return - _init_process_group_wrapper(world_size, rank, rank, backend, q) - assert dist.is_distributed() == True - assert dist.get_master_ip() == _LOCALHOST - assert dist.get_master_port() > 0 - assert dist.get_world_size() == world_size - assert dist.get_rank() == rank - assert dist.get_backend() == backend - - def check(backend): - Q = mp.Queue() - p0 = mp.Process(target=worker, args=(0, backend, Q)) - p1 = mp.Process(target=worker, args=(1, backend, Q)) - - p0.start() - p1.start() - - p0.join(10) - p1.join(10) - - assert p0.exitcode == 0 and p1.exitcode == 0 - - check("nccl") - - -@pytest.mark.skipif( - platform.system() == "Darwin", reason="do not imp GPU mode at macos now" -) -@pytest.mark.skipif( - platform.system() == "Windows", reason="do not imp GPU mode at Windows now" -) -@pytest.mark.isolated_distributed -def test_group_barrier(): - world_size = 2 - ip = "127.0.0.1" - backend = "nccl" - - def worker(rank, q): - if not mge.is_cuda_available(): - return - _init_process_group_wrapper(world_size, rank, rank, backend, q) - dist.group_barrier() - if rank == 0: - dist.group_barrier() - q.put(0) # to be observed in rank 1 - else: - _assert_q_empty(q) # q.put(0) is not executed in rank 0 - dist.group_barrier() - _assert_q_val(q, 0) # q.put(0) executed in rank 0 - - Q = mp.Queue() - p0 = mp.Process(target=worker, args=(0, Q)) - p1 = mp.Process(target=worker, args=(1, Q)) - - p0.start() - p1.start() - - p0.join(10) - p1.join(10) - - assert p0.exitcode == 0 and p1.exitcode == 0 - - -@pytest.mark.skipif( - platform.system() == "Darwin", reason="do not imp GPU mode at macos now" -) -@pytest.mark.skipif( - platform.system() == "Windows", reason="do not imp GPU mode at Windows now" -) -@pytest.mark.isolated_distributed -def test_synchronized(): - world_size = 2 - backend = "nccl" - - @dist.synchronized - def func(rank, q): - q.put(rank) - - def worker(rank, q): - if not mge.is_cuda_available(): - return - _init_process_group_wrapper(world_size, rank, rank, backend, q) - dist.group_barrier() - if rank == 0: - func(0, q) # q.put(0) - q.put(2) - else: - _assert_q_val(q, 0) # func executed in rank 0 - _assert_q_empty(q) # q.put(2) is not executed - func(1, q) - _assert_q_val( - q, 1 - ) # func in rank 1 executed earlier than q.put(2) in rank 0 - _assert_q_val(q, 2) # q.put(2) executed in rank 0 - - Q = mp.Queue() - p0 = mp.Process(target=worker, args=(0, Q)) - p1 = mp.Process(target=worker, args=(1, Q)) - - p0.start() - p1.start() - - p0.join(10) - p1.join(10) - - assert p0.exitcode == 0 and p1.exitcode == 0 diff --git a/python_module/test/unit/functional/__init__.py b/python_module/test/unit/functional/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/python_module/test/unit/functional/test_elemwise.py b/python_module/test/unit/functional/test_elemwise.py deleted file mode 100644 index c02bd58b..00000000 --- a/python_module/test/unit/functional/test_elemwise.py +++ /dev/null @@ -1,65 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import numpy as np - -import megengine.functional as F -from megengine import tensor -from megengine.test import assertTensorClose - - -def test_abs(): - assertTensorClose( - F.abs(tensor([-3.0, -4.0, -5.0])).numpy(), - np.abs(np.array([-3.0, -4.0, -5.0], dtype=np.float32)), - ) - - assertTensorClose(F.abs(-3.0), np.abs(np.float32(-3.0))) - - -def test_multiply(): - assertTensorClose( - F.multiply(-3.0, -4.0), np.multiply(np.float32(-3.0), np.float32(-4.0)) - ) - - assertTensorClose( - F.multiply(tensor([3.0, 4.0]), 4.0).numpy(), - np.multiply(np.array([3.0, 4.0], dtype=np.float32), 4.0), - ) - - assertTensorClose( - F.multiply(4.0, tensor([3.0, 4.0])).numpy(), - np.multiply(4.0, np.array([3.0, 4.0], dtype=np.float32)), - ) - - assertTensorClose( - F.multiply(tensor([3.0, 4.0]), tensor([3.0, 4.0])).numpy(), - np.multiply( - np.array([3.0, 4.0], dtype=np.float32), - np.array([3.0, 4.0], dtype=np.float32), - ), - ) - - -def test_clamp(): - """Fix an issue when `lower` or `upper` is 0, it will be recognized as `False` and - `F.clamp` will fall into wrong conditions unexpectedly. - """ - x = np.linspace(-6, 6, dtype="float32") - assertTensorClose(F.clamp(tensor(x) + 3, 0, 6).numpy(), np.clip(x + 3, 0, 6)) - assertTensorClose(F.clamp(tensor(x) - 3, -6, 0).numpy(), np.clip(x - 3, -6, 0)) - - -def test_isnan(): - for case in [[1, float("nan"), 0]]: - assertTensorClose(F.isnan(tensor(case)), np.isnan(case).astype("uint8")) - - -def test_isinf(): - for case in [[1, float("inf"), 0]]: - assertTensorClose(F.isinf(tensor(case)), np.isinf(case).astype("uint8")) diff --git a/python_module/test/unit/functional/test_functional.py b/python_module/test/unit/functional/test_functional.py deleted file mode 100644 index a3739b3d..00000000 --- a/python_module/test/unit/functional/test_functional.py +++ /dev/null @@ -1,496 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import numpy as np -import pytest -from helpers import opr_test - -import megengine._internal as mgb -import megengine.functional as F -from megengine import Buffer, Parameter, is_cuda_available, jit, tensor -from megengine.test import assertTensorClose - - -def test_flatten(): - data0_shape = (2, 3, 4, 5) - data1_shape = (4, 5, 6, 7) - data0 = np.random.random(data0_shape).astype(np.float32) - data1 = np.random.random(data1_shape).astype(np.float32) - - def compare_fn(x, y): - assert x.numpy().shape == y - - output0 = (2 * 3 * 4 * 5,) - output1 = (4 * 5 * 6 * 7,) - cases = [{"input": data0, "output": output0}, {"input": data1, "output": output1}] - opr_test(cases, F.flatten, compare_fn=compare_fn) - - output0 = (2, 3 * 4 * 5) - output1 = (4, 5 * 6 * 7) - cases = [{"input": data0, "output": output0}, {"input": data1, "output": output1}] - opr_test(cases, F.flatten, compare_fn=compare_fn, start_axis=1) - - output0 = (2, 3, 4 * 5) - output1 = (4, 5, 6 * 7) - cases = [{"input": data0, "output": output0}, {"input": data1, "output": output1}] - opr_test(cases, F.flatten, compare_fn=compare_fn, start_axis=2) - - output0 = (2, 3 * 4, 5) - output1 = (4, 5 * 6, 7) - cases = [{"input": data0, "output": output0}, {"input": data1, "output": output1}] - opr_test(cases, F.flatten, compare_fn=compare_fn, start_axis=1, end_axis=2) - - -def test_where(): - maskv0 = np.array([[1, 0], [0, 1]], dtype=np.int32) - xv0 = np.array([[1, np.inf], [np.nan, 4]], dtype=np.float32) - yv0 = np.array([[5, 6], [7, 8]], dtype=np.float32) - - maskv1 = np.array([[1, 0, 1], [1, 0, 0], [1, 1, 0]], dtype=np.int32) - xv1 = np.array([[1, np.inf, 2], [0, np.nan, 4], [1, 5, 7]], dtype=np.float32) - yv1 = np.array([[5, 6, 9], [2, 7, 8], [2, 1, 9]], dtype=np.float32) - - cases = [ - {"input": [maskv0, xv0, yv0]}, - {"input": [maskv1, xv1, yv1]}, - ] - opr_test(cases, F.where, ref_fn=np.where) - - maskv2 = np.array([1, 1, 1], dtype=np.int32) - xv2 = np.array([1, 3, 2], dtype=np.float32) - yv2 = np.array([5, 6, 9], dtype=np.float32) - - maskv3 = np.array([0, 0, 0], dtype=np.int32) - xv3 = np.array([1, 3, 2], dtype=np.float32) - yv3 = np.array([5, 6, 9], dtype=np.float32) - - cases = [ - {"input": [maskv2, xv2, yv2]}, - {"input": [maskv3, xv3, yv3]}, - ] - opr_test(cases, F.where, ref_fn=np.where) - - -def test_eye(): - dtype = np.float32 - cases = [{"input": [10, 20]}, {"input": [20, 30]}] - opr_test(cases, F.eye, ref_fn=lambda n, m: np.eye(n, m).astype(dtype), dtype=dtype) - - -def test_concat(): - def get_data_shape(length: int): - return (length, 2, 3) - - data1 = np.random.random(get_data_shape(5)).astype("float32") - data2 = np.random.random(get_data_shape(6)).astype("float32") - data3 = np.random.random(get_data_shape(7)).astype("float32") - - def run(data1, data2): - return F.concat([data1, data2]) - - cases = [{"input": [data1, data2]}, {"input": [data1, data3]}] - opr_test(cases, run, ref_fn=lambda x, y: np.concatenate([x, y])) - - -def test_matrix_mul(): - shape1 = (2, 3) - shape2 = (3, 4) - shape3 = (4, 5) - data1 = np.random.random(shape1).astype("float32") - data2 = np.random.random(shape2).astype("float32") - data3 = np.random.random(shape3).astype("float32") - - cases = [{"input": [data1, data2]}, {"input": [data2, data3]}] - opr_test(cases, F.matrix_mul, ref_fn=np.matmul) - - -def test_batched_matrix_mul(): - batch_size = 10 - shape1 = (batch_size, 2, 3) - shape2 = (batch_size, 3, 4) - shape3 = (batch_size, 4, 5) - data1 = np.random.random(shape1).astype("float32") - data2 = np.random.random(shape2).astype("float32") - data3 = np.random.random(shape3).astype("float32") - - cases = [{"input": [data1, data2]}, {"input": [data2, data3]}] - for i in range(0, batch_size): - - def compare_fn(x, y): - x.numpy()[i, ...] == y - - opr_test( - cases, - F.batched_matrix_mul, - compare_fn=compare_fn, - ref_fn=lambda x, y: np.matmul(x[i, ...], y[i, ...]), - ) - - -def test_sort(): - data1_shape = (10, 3) - data2_shape = (12, 2) - data1 = np.random.random(data1_shape).astype(np.float32) - data2 = np.random.random(data2_shape).astype(np.float32) - output0 = [np.sort(data1), np.argsort(data1).astype(np.int32)] - output1 = [np.sort(data2), np.argsort(data2).astype(np.int32)] - - cases = [ - {"input": data1, "output": output0}, - {"input": data2, "output": output1}, - ] - opr_test(cases, F.sort) - - -def test_round(): - data1_shape = (15,) - data2_shape = (25,) - data1 = np.random.random(data1_shape).astype(np.float32) - data2 = np.random.random(data2_shape).astype(np.float32) - - cases = [{"input": data1}, {"input": data2}] - opr_test(cases, F.round, ref_fn=np.round) - - -def test_broadcast_to(): - input1_shape = (20, 30) - output1_shape = (30, 20, 30) - data1 = np.random.random(input1_shape).astype(np.float32) - - input2_shape = (10, 20) - output2_shape = (20, 10, 20) - data2 = np.random.random(input2_shape).astype(np.float32) - - def compare_fn(x, y): - assert x.numpy().shape == y - - cases = [ - {"input": [data1, output1_shape], "output": output1_shape}, - {"input": [data2, output2_shape], "output": output2_shape}, - ] - opr_test(cases, F.broadcast_to, compare_fn=compare_fn) - - -def test_linspace(): - cases = [ - {"input": [1, 9, 9]}, - {"input": [3, 10, 8]}, - ] - opr_test( - cases, - F.linspace, - ref_fn=lambda start, end, step: np.linspace(start, end, step, dtype=np.float32), - ) - - cases = [ - {"input": [9, 1, 9]}, - {"input": [10, 3, 8]}, - ] - opr_test( - cases, - F.linspace, - ref_fn=lambda start, end, step: np.linspace(start, end, step, dtype=np.float32), - ) - - -def test_arange(): - cases = [ - {"input": [1, 9, 1]}, - {"input": [2, 10, 2]}, - ] - opr_test( - cases, - F.arange, - ref_fn=lambda start, end, step: np.arange(start, end, step, dtype=np.float32), - ) - - cases = [ - {"input": [9, 1, -1]}, - {"input": [10, 2, -2]}, - ] - opr_test( - cases, - F.arange, - ref_fn=lambda start, end, step: np.arange(start, end, step, dtype=np.float32), - ) - - cases = [ - {"input": [9.3, 1.2, -0.5]}, - {"input": [10.3, 2.1, -1.7]}, - ] - opr_test( - cases, - F.arange, - ref_fn=lambda start, end, step: np.arange(start, end, step, dtype=np.float32), - ) - - -def test_add_update(): - shape = (2, 3) - v = np.random.random(shape).astype(np.float32) - b = Buffer(v) - - u = F.add_update(b, 1) - assertTensorClose(u.numpy(), v + 1) - u = F.add_update(b, 1) - assertTensorClose(u.numpy(), v + 2) - - x = np.ones((2, 2), dtype=np.float32) - y = x * 0.5 - dest = tensor(x) - delta = tensor(y) - r = F.add_update(dest, delta, alpha=tensor(0.9), beta=0.1, bias=0.1) - assertTensorClose(r.numpy(), x * 0.9 + y * 0.1 + 0.1) - - -def test_add_update_params(): - b = np.random.random((2, 3)).astype(np.float32) - y = Buffer(b) - - @jit.trace - def f(x): - return F.add_update(y, x) - - f(np.zeros((2, 3)).astype(np.float32)) - - z = Buffer(np.zeros((2, 3)).astype(np.float32)) - F.add_update(y, z, beta=0.1) - - res = f(np.ones((2, 3)).astype(np.float32)) - assertTensorClose(res, b + 1) - - -def test_cross_entropy_with_softmax(): - data1_shape = (1, 2) - label1_shape = (1,) - data2_shape = (1, 3) - label2_shape = (1,) - - data1 = np.array([1, 0.5], dtype=np.float32).reshape(data1_shape) - label1 = np.array([1], dtype=np.int32).reshape(label1_shape) - expect1 = F.cross_entropy(F.softmax(tensor(data1)), tensor(label1)).numpy() - - data2 = np.array([0.3, 0.4, 0.3], dtype=np.float32).reshape(data2_shape) - label2 = np.array([1], dtype=np.int32).reshape(label2_shape) - expect2 = F.cross_entropy(F.softmax(tensor(data2)), tensor(label2)).numpy() - - cases = [ - {"input": [data1, label1], "output": expect1,}, - {"input": [data2, label2], "output": expect2,}, - ] - opr_test(cases, F.cross_entropy_with_softmax) - - -def test_cross_entropy(): - data1_shape = (1, 2) - label1_shape = (1,) - data2_shape = (1, 3) - label2_shape = (1,) - - data1 = np.array([0.5, 0.5], dtype=np.float32).reshape(data1_shape) - label1 = np.array([1], dtype=np.int32).reshape(label1_shape) - expect1 = np.array([-np.log(0.5)], dtype=np.float32) - - data2 = np.array([0.3, 0.4, 0.3], dtype=np.float32).reshape(data2_shape) - label2 = np.array([1], dtype=np.int32).reshape(label2_shape) - expect2 = np.array([-np.log(0.4)], dtype=np.float32) - - cases = [ - {"input": [data1, label1], "output": expect1,}, - {"input": [data2, label2], "output": expect2,}, - ] - opr_test(cases, F.cross_entropy) - - -def test_binary_cross_entropy(): - data1_shape = (2, 2) - label1_shape = (2, 2) - data2_shape = (2, 3) - label2_shape = (2, 3) - - def sigmoid(x): - return 1 / (1 + np.exp(-x)) - - def compare_fn(x, y): - assertTensorClose(x.numpy(), y, max_err=5e-4) - - np.random.seed(123) - data1 = sigmoid(np.random.uniform(size=data1_shape).astype(np.float32)) - label1 = np.random.uniform(size=label1_shape).astype(np.float32) - expect1 = np.array([0.6361], dtype=np.float32) - - np.random.seed(123) - data2 = sigmoid(np.random.uniform(size=data2_shape).astype(np.float32)) - label2 = np.random.uniform(size=label2_shape).astype(np.float32) - expect2 = np.array([0.6750], dtype=np.float32) - - cases = [ - {"input": [data1, label1], "output": expect1,}, - {"input": [data2, label2], "output": expect2,}, - ] - opr_test(cases, F.binary_cross_entropy, compare_fn=compare_fn) - - -def test_hinge_loss(): - np.random.seed(123) - # case with L1 norm - cases = [] - for shape in [(2, 2), (2, 3)]: - data = np.random.uniform(size=shape).astype(np.float32) - label = 2 * np.random.randint(0, 1, size=shape).astype(np.int32) - 1 - expect = np.clip(0, np.inf, 1 - data * label).sum(axis=1).mean() - cases.append({"input": [data, label], "output": tensor(expect)}) - - opr_test(cases, F.hinge_loss) - - # cases with L2 norm - cases = [] - for shape in [(2, 2), (2, 3)]: - data = np.random.uniform(size=shape).astype(np.float32) - label = 2 * np.random.randint(0, 1, size=shape).astype(np.int32) - 1 - expect = ((np.clip(0, np.inf, 1 - data * label) ** 2).sum(axis=1)).mean() - cases.append({"input": [data, label], "output": tensor(expect)}) - - def hinge_loss_with_l2_norm(pred, label): - return F.hinge_loss(pred, label, "L2") - - opr_test(cases, hinge_loss_with_l2_norm) - - -def test_smooth_l1_loss(): - np.random.seed(123) - cases = [] - for shape in [(2, 2), (2, 3)]: - data = np.random.uniform(size=shape).astype(np.float32) - label = np.random.uniform(size=shape).astype(np.float32) - diff = np.abs(data - label) - expect = np.where(diff < 1, 0.5 * diff ** 2, diff - 0.5).mean() - cases.append({"input": [data, label], "output": tensor(expect)}) - - opr_test(cases, F.smooth_l1_loss) - - -@pytest.mark.skip -def test_conv_bias(): - inp_scale = 0.01 - w_scale = 0.02 - outp_scale = 0.1 - inp_dtype = mgb.dtype.qint8(inp_scale) - w_dtype = mgb.dtype.qint8(w_scale) - b_dtype = mgb.dtype.qint32(inp_scale * w_scale) - out_dtype = mgb.dtype.qint8(outp_scale) - - def run( - N, - IC, - OC, - IH, - IW, - KH, - KW, - PH, - PW, - SH, - SW, - has_bias=True, - nonlinear_mode="IDENTITY", - ): - inp_v = np.random.normal(size=(N, IC, IH, IW)) - w_v = np.random.normal(size=(OC, IC, KW, KW)) - b_v = np.random.normal(size=(1, OC, 1, 1)) - inp_scale = mgb.dtype.get_scale(inp_dtype) - w_scale = mgb.dtype.get_scale(w_dtype) - b_scale = mgb.dtype.get_scale(b_dtype) - - inpv = mgb.dtype.convert_to_qint8(inp_v * inp_scale, inp_dtype) - wv = mgb.dtype.convert_to_qint8(w_v * w_scale, w_dtype) - bv = mgb.dtype.convert_to_qint32(b_v * b_scale, b_dtype) - - inp_int8 = tensor(inpv, dtype=inp_dtype) - w_int8 = Parameter(wv, dtype=w_dtype) - b_int32 = Parameter(bv, dtype=b_dtype) - - inp_fp32 = inp_int8.astype("float32") - w_fp32 = w_int8.astype("float32") - b_fp32 = b_int32.astype("float32") - - jit.trace.enabled = True - b_symbolic = True - - def convert_to_nchw4(var): - return var.reshape( - var.shapeof(0), var.shapeof(1) // 4, 4, var.shapeof(2), var.shapeof(3) - ).dimshuffle(0, 1, 3, 4, 2) - - @jit.trace(symbolic=b_symbolic) - def run_conv2d(inp, w, b): - O = F.conv2d( - inp, w, b if has_bias else None, stride=(SH, SW), padding=(PH, PW), - ) - if nonlinear_mode == "RELU": - return F.relu(O) - else: - return O - - @jit.trace(symbolic=b_symbolic) - def run_conv_bias(inp, w, b, format="NCHW"): - b = b if has_bias else np.zeros_like(b) - if format == "NCHW4": - inp = convert_to_nchw4(inp) - w = convert_to_nchw4(w) - b = F.flatten(b) - return F.conv_bias_activation( - inp, - w, - b, - stride=(SH, SW), - padding=(PH, PW), - dtype=out_dtype, - nonlinear_mode=nonlinear_mode, - ) - - format = "NCHW4" if is_cuda_available() else "NCHW" - - expected = run_conv2d(inp_fp32, w_fp32, b_fp32) - expected = expected.astype(out_dtype).astype("float32") - result = run_conv_bias(inp_int8, w_int8, b_int32, format=format).astype( - "float32" - ) - if format == "NCHW4": - result = result.dimshuffle(0, 1, 4, 2, 3) - expected = F.flatten(expected) - result = F.flatten(result) - assertTensorClose(result.numpy(), expected.numpy()) - - if not is_cuda_available(): - run(1, 4, 4, 24, 33, 1, 1, 2, 3, 1, 1, False) - run(10, 12, 24, 46, 46, 1, 1, 2, 1, 3, 1, False) - run(10, 36, 8, 46, 26, 2, 2, 2, 1, 1, 2, False) - - run(1, 4, 4, 24, 33, 1, 1, 2, 3, 1, 1) - run(10, 12, 24, 46, 46, 1, 1, 2, 1, 3, 1) - run(10, 36, 8, 46, 26, 2, 2, 2, 1, 1, 2) - - run(10, 36, 8, 46, 26, 2, 2, 2, 1, 1, 2, False, "RELU") - run(10, 36, 8, 46, 26, 2, 2, 2, 1, 1, 2, True, "RELU") - - -def test_softplus(): - x = np.arange(1000).astype(np.float32) - out = F.softplus(tensor(x)) - mask = x <= 20 - with np.errstate(over="ignore"): - expected = np.where(mask, np.log(1 + np.exp(x)), x) - assertTensorClose(out, expected) - beta = 2 - out = F.softplus(tensor(x), beta=beta, threshold=30) - mask = beta * x <= 30 - # ignore overflow - with np.errstate(over="ignore"): - expected = np.where(mask, np.log(1 + np.exp(x * beta)) / beta, x) - assertTensorClose(out, expected) diff --git a/python_module/test/unit/functional/test_interpolate.py b/python_module/test/unit/functional/test_interpolate.py deleted file mode 100644 index 2da981ff..00000000 --- a/python_module/test/unit/functional/test_interpolate.py +++ /dev/null @@ -1,60 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import numpy as np -import pytest - -import megengine.functional as F -from megengine import tensor -from megengine.test import assertTensorClose - - -def test_linear_interpolate(): - inp = tensor(np.arange(1, 3, dtype=np.float32).reshape(1, 1, 2)) - - out = F.interpolate(inp, scale_factor=2.0, mode="LINEAR") - out2 = F.interpolate(inp, 4, mode="LINEAR") - - assertTensorClose( - out.numpy(), np.array([[[1.0, 1.25, 1.75, 2.0]]], dtype=np.float32) - ) - assertTensorClose( - out2.numpy(), np.array([[[1.0, 1.25, 1.75, 2.0]]], dtype=np.float32) - ) - - -def test_many_batch_interpolate(): - inp = tensor(np.arange(1, 9, dtype=np.float32).reshape(2, 1, 2, 2)) - - out = F.interpolate(inp, [4, 4]) - out2 = F.interpolate(inp, scale_factor=2.0) - - assertTensorClose(out.numpy(), out2.numpy()) - - -def test_assign_corner_interpolate(): - inp = tensor(np.arange(1, 5, dtype=np.float32).reshape(1, 1, 2, 2)) - - out = F.interpolate(inp, [4, 4], align_corners=True) - out2 = F.interpolate(inp, scale_factor=2.0, align_corners=True) - - assertTensorClose(out.numpy(), out2.numpy()) - - -def test_error_shape_linear_interpolate(): - inp = tensor(np.arange(1, 5, dtype=np.float32).reshape(1, 1, 2, 2)) - - with pytest.raises(ValueError): - F.interpolate(inp, scale_factor=2.0, mode="LINEAR") - - -def test_inappropriate_scale_linear_interpolate(): - inp = tensor(np.arange(1, 3, dtype=np.float32).reshape(1, 1, 2)) - - with pytest.raises(ValueError): - F.interpolate(inp, scale_factor=[2.0, 3.0], mode="LINEAR") diff --git a/python_module/test/unit/functional/test_math.py b/python_module/test/unit/functional/test_math.py deleted file mode 100644 index 6dc5c82c..00000000 --- a/python_module/test/unit/functional/test_math.py +++ /dev/null @@ -1,168 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -from functools import partial - -import numpy as np -from helpers import opr_test - -import megengine.functional as F -from megengine.test import assertTensorClose - - -def common_test_reduce(opr, ref_opr): - data1_shape = (5, 6, 7) - data2_shape = (2, 9, 12) - data1 = np.random.random(data1_shape).astype(np.float32) - data2 = np.random.random(data2_shape).astype(np.float32) - cases = [{"input": data1}, {"input": data2}] - - if opr not in (F.argmin, F.argmax): - # test default axis - opr_test(cases, opr, ref_fn=ref_opr) - # test all axises in range of input shape - for axis in range(-3, 3): - # test keepdims False - opr_test(cases, opr, ref_fn=lambda x: ref_opr(x, axis=axis), axis=axis) - # test keepdims True - opr_test( - cases, - opr, - ref_fn=lambda x: ref_opr(x, axis=axis, keepdims=True), - axis=axis, - keepdims=True, - ) - else: - # test defaut axis - opr_test(cases, opr, ref_fn=lambda x: ref_opr(x).astype(np.int32)) - # test all axises in range of input shape - for axis in range(0, 3): - opr_test( - cases, - opr, - ref_fn=lambda x: ref_opr(x, axis=axis).astype(np.int32), - axis=axis, - ) - - -def test_sum(): - common_test_reduce(opr=F.sum, ref_opr=np.sum) - - -def test_prod(): - common_test_reduce(opr=F.prod, ref_opr=np.prod) - - -def test_mean(): - common_test_reduce(opr=F.mean, ref_opr=np.mean) - - -def test_min(): - common_test_reduce(opr=F.min, ref_opr=np.min) - - -def test_max(): - common_test_reduce(opr=F.max, ref_opr=np.max) - - -def test_argmin(): - common_test_reduce(opr=F.argmin, ref_opr=np.argmin) - - -def test_argmax(): - common_test_reduce(opr=F.argmax, ref_opr=np.argmax) - - -def test_sqrt(): - d1_shape = (15,) - d2_shape = (25,) - d1 = np.random.random(d1_shape).astype(np.float32) - d2 = np.random.random(d2_shape).astype(np.float32) - - cases = [{"input": d1}, {"input": d2}] - opr_test(cases, F.sqrt, ref_fn=np.sqrt) - - -def test_normalize(): - - cases = [ - {"input": np.random.random((2, 3, 12, 12)).astype(np.float32)} for i in range(2) - ] - - def np_normalize(x, p=2, axis=None, eps=1e-12): - if axis is None: - norm = np.sum(x ** p) ** (1.0 / p) - else: - norm = np.sum(x ** p, axis=axis, keepdims=True) ** (1.0 / p) - return x / np.clip(norm, a_min=eps, a_max=np.inf) - - # Test L-2 norm along all dimensions - opr_test(cases, F.normalize, ref_fn=np_normalize) - - # Test L-1 norm along all dimensions - opr_test(cases, partial(F.normalize, p=1), ref_fn=partial(np_normalize, p=1)) - - # Test L-2 norm along the second dimension - opr_test(cases, partial(F.normalize, axis=1), ref_fn=partial(np_normalize, axis=1)) - - # Test some norm == 0 - cases[0]["input"][0, 0, 0, :] = 0 - cases[1]["input"][0, 0, 0, :] = 0 - opr_test(cases, partial(F.normalize, axis=3), ref_fn=partial(np_normalize, axis=3)) - - -def test_logsumexp(): - x = np.arange(10).astype(np.float32) - expected = np.log(np.sum(np.exp(x))) - cases = [{"input": x, "output": expected}] - compare_fn = partial(assertTensorClose, allow_special_values=True) - # large value check - n = 100 - x = np.full(n, 10000, dtype=np.float32) - expected = 10000 + np.log(n) - cases.append({"input": x, "output": expected.astype(np.float32)}) - opr_test(cases, F.logsumexp, axis=0, compare_fn=compare_fn) - - # special value check - x = np.array([np.inf], dtype=np.float32) - expected = x - cases = [{"input": x, "output": expected}] - - x = np.array([-np.inf, 0.0], dtype=np.float32) - expected = np.zeros(1).astype(np.float32) - cases.append({"input": x, "output": expected}) - opr_test(cases, F.logsumexp, axis=0, compare_fn=compare_fn) - - x = np.array([np.nan], dtype=np.float32) - expected = x - cases = [{"input": x, "output": expected}] - - x = np.array([-np.inf, 1], dtype=np.float32) - expected = np.array([1.0], dtype=np.float32) - cases.append({"input": x, "output": expected}) - - opr_test(cases, F.logsumexp, axis=0, compare_fn=compare_fn) - - # keepdims check - x = np.array([[1e10, 1e-10], [-1e10, -np.inf]], dtype=np.float32) - expected = np.array([[1e10], [-1e10]], dtype=np.float32) - cases = [{"input": x, "output": expected}] - x = np.array([[1e10, -1e-10, 1e-10], [1e10, 1e-10, np.inf]], dtype=np.float32) - expected = np.array([[1e10], [np.inf]], dtype=np.float32) - cases.append({"input": x, "output": expected}) - opr_test(cases, F.logsumexp, axis=1, keepdims=True, compare_fn=compare_fn) - - # multiple axes check - x = np.array([[1e10, 1e-10], [-1e10, -np.inf]], dtype=np.float32) - expected = np.array([1e10], dtype=np.float32) - cases = [{"input": x, "output": expected}] - x = np.array([[1e10, -1e-10, 1e-10], [1e10, 1e-10, np.inf]], dtype=np.float32) - expected = np.array([np.inf], dtype=np.float32) - cases.append({"input": x, "output": expected}) - opr_test(cases, F.logsumexp, axis=(0, 1), keepdims=False, compare_fn=compare_fn) diff --git a/python_module/test/unit/functional/test_onehot.py b/python_module/test/unit/functional/test_onehot.py deleted file mode 100644 index 3edbe5de..00000000 --- a/python_module/test/unit/functional/test_onehot.py +++ /dev/null @@ -1,26 +0,0 @@ -import numpy as np -import pytest - -import megengine.functional as F -from megengine import tensor -from megengine.test import assertTensorClose - - -def test_onehot_low_dimension(): - inp = tensor(np.arange(1, 4, dtype=np.int32)) - out = F.one_hot(inp, num_classes=4) - - assertTensorClose( - out.numpy(), np.eye(4, dtype=np.int32)[np.arange(1, 4, dtype=np.int32)] - ) - - -def test_onehot_high_dimension(): - arr = np.array( - [[3, 2, 4, 4, 2, 4, 0, 4, 4, 1], [4, 1, 1, 3, 2, 2, 4, 2, 4, 3]], dtype=np.int32 - ) - - inp = tensor(arr) - out = F.one_hot(inp, 10) - - assertTensorClose(out.numpy(), np.eye(10, dtype=np.int32)[arr]) diff --git a/python_module/test/unit/hub/__init__.py b/python_module/test/unit/hub/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/python_module/test/unit/hub/test_hub.py b/python_module/test/unit/hub/test_hub.py deleted file mode 100644 index 5fdb32ec..00000000 --- a/python_module/test/unit/hub/test_hub.py +++ /dev/null @@ -1,38 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import pytest -from helpers import modified_environ - -from megengine.hub import hub - - -@pytest.mark.internet -def test_hub_http_basic(tmp_path): - # Override XDG_CACHE_HOME to make sure test won't have side effect for system. - with modified_environ(XDG_CACHE_HOME=str(tmp_path)): - # Use pytorch's URL due to we don't have public address now. - repo_info, entry = "pytorch/vision:v0.4.2", "alexnet" - - assert len(hub.list(repo_info)) > 0 - - assert entry in hub.list(repo_info) - - assert hub.help(repo_info, entry) - - assert isinstance(hub.load(repo_info, entry), object) - - -@pytest.mark.internet -def test_github_load_with_commit_id(tmp_path): - # Override XDG_CACHE_HOME to make sure test won't have side effect for system. - with modified_environ(XDG_CACHE_HOME=str(tmp_path)): - # Use pytorch's URL due to we don't have public address now. - repo_info, commit, entry = "pytorch/vision", "d2c763e1", "alexnet" - - assert isinstance(hub.load(repo_info, entry, commit=commit), object) diff --git a/python_module/test/unit/jit/__init__.py b/python_module/test/unit/jit/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/python_module/test/unit/jit/test_jit.py b/python_module/test/unit/jit/test_jit.py deleted file mode 100644 index b14b1dfc..00000000 --- a/python_module/test/unit/jit/test_jit.py +++ /dev/null @@ -1,257 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import contextlib -import os -import tempfile - -import numpy as np -import pytest - -import megengine as mge -import megengine._internal as mgb -import megengine.functional as F -import megengine.module as M -from megengine import functional as F -from megengine import jit, tensor -from megengine.core.tensor import Tensor -from megengine.jit import SublinearMemoryConfig -from megengine.test import assertTensorClose - - -@contextlib.contextmanager -def mkstemp(): - fd, path = tempfile.mkstemp() - try: - os.close(fd) - yield path - finally: - os.remove(path) - - -def load_and_compile(fpath): - cg, _, outputs = mgb.load_comp_graph_from_file(fpath) - inputs = mgb.cgtools.get_dep_vars(outputs, "Host2DeviceCopy") - inputs = sorted(inputs, key=lambda i: i.name) - outputs = list(map(mgb.copy_output, outputs)) - if len(outputs) == 1: - (outputs,) = outputs - return cg.compile(inputs, outputs) - - -def test_symbolic(): - @jit.trace(symbolic=False) - def f(x): - return Tensor(mgb.opr.assert_equal(x._symvar, x._symvar + 1)) - - with pytest.raises(mgb.exc.MegBrainError): - f.trace(0) - - @jit.trace(symbolic=True) - def f(x): - return Tensor(mgb.opr.assert_equal(x._symvar, x._symvar + 1)) - - f.trace(0) - - -def test_add_update_semantic(): - for symbolic in [False, True]: - x = tensor(0) - - @jit.trace(symbolic=symbolic) - def f(): - F.add_update(x, 1) - return x + 1 - - np.testing.assert_equal(f().numpy(), [2]) - np.testing.assert_equal(f().numpy(), [3]) - - -def test_dump(): - @jit.trace(symbolic=True) - def f(x, y): - return x * y - - f.trace(0, 0) - - with mkstemp() as out: - f.dump(out) - g = load_and_compile(out) - - np.testing.assert_allclose(g([1, 2, 3], [1, 2, 3]), [1, 4, 9]) - - -def test_goptions(): - @jit.trace(symbolic=True, opt_level=0) - def f(x): - return x / x - - @jit.trace(symbolic=True, opt_level=1) - def g(x): - return x / x - - out = f([0.0]).numpy() - # out is nan - if out == out: - raise - - # with gopt, x / x returns 1 - out = g([0.0]).numpy() - assert out == 1 - - -def test_json_prof(): - @jit.trace(symbolic=True, profiling=True) - def f(x): - return x * x - - f([0.0]) - - out = f.get_profile() - assert out.get("profiler") - - -def test_capture_dump(): - p = tensor(7) - - @jit.trace(symbolic=True) - def f(x): - return x * p - - f.trace(0) - - with mkstemp() as out: - f.dump(out) - g = load_and_compile(out) - - np.testing.assert_allclose(g([1, 2, 3]), [7, 14, 21]) - - -def test_dump_volatile(): - p = tensor(7) - - @jit.trace(symbolic=True) - def f(x): - return x * p - - f.trace(0) - - with mkstemp() as out: - f.dump(out) - cg, _, outputs = mgb.load_comp_graph_from_file(out) - - (out,) = outputs - assert mgb.cgtools.get_type(mgb.cgtools.get_inputs(out)[1]) == "SharedDeviceTensor" - - -def test_graph_traversal(): - net = M.Conv2d(3, 4, 3, 1, 1, groups=1, bias=False) - net.eval() - - @jit.trace(symbolic=True) - def fun(data): - return net(data) - - data = np.random.random([1, 3, 224, 224]).astype(np.float32) - fun.trace(data) - - with mkstemp() as out: - fun.dump(out) - *_, outputs = mgb.load_comp_graph_from_file(out) - - _, map_vars, var2oprs, *_ = mgb.cgtools.graph_traversal(outputs) - input_var = map_vars[1] - _, var_idx = var2oprs[input_var.id][0] - - assert var_idx == 0 - - -def test_network_visitor(): - @jit.trace(symbolic=True) - def f(x): - # this line will produce shape_of, subtensor and concat op - # after pruning, they will be deleted - target_shape = (x.shape[0], -1) - - return x.reshape(*target_shape) - - f.trace(tensor(np.random.random([2, 3, 4, 5]).astype(np.float32))) - - with mkstemp() as out: - f.dump(out) - *_, outputs = mgb.load_comp_graph_from_file(out) - - all_oprs = mgb.cgtools.get_oprs_seq(outputs) - pruned_oprs = mgb.cgtools.get_oprs_seq(outputs, prune_reshape=True) - - assert len(all_oprs) == len(pruned_oprs) + 3 - - -def test_shape_tracing(): - for symbolic in [False, True]: - - @jit.trace(symbolic=symbolic) - def f(x): - a, b = x.shape - return a * b - - assert f(np.zeros([4, 3], dtype="float32")).item() == 12 - assert f(np.zeros([6, 4], dtype="float32")).item() == 24 - - -def test_shape_infer(): - @jit.trace(symbolic=True) - def f(x): - a, b = x.shape - return sum(x[i] for i in range(a)) - - x = np.random.randn(3, 10).astype("float32") - assertTensorClose(f(x), x.sum(0)) - x = np.random.randn(4, 10).astype("float32") - assertTensorClose(f(x), x[:3].sum(0)) - - -def test_dump_bn_fused(): - class ConvBNReLU(M.Sequential): - def __init__(self): - super(ConvBNReLU, self).__init__( - M.Conv2d(3, 4, 3, 1, 1, groups=1, bias=False), - M.BatchNorm2d(4), - M.ReLU(), - ) - - net = ConvBNReLU() - net.eval() - - @jit.trace(symbolic=True) - def fun(data): - return net(data) - - data = np.random.random([1, 3, 224, 224]).astype(np.float32) - fun.trace(data) - with mkstemp() as out: - fun.dump(out, optimize_for_inference=True) - cg, _, outputs = mgb.load_comp_graph_from_file(out) - - (out,) = outputs - inputs = mgb.cgtools.get_inputs(out) - assert len(inputs) == 2 and ( - mgb.cgtools.get_type(inputs[0]) == "MultipleDeviceTensorHolder" - and mgb.cgtools.get_type(inputs[1]) == "ConvolutionForward" - ) - - -# Simply verify the options passed down -def test_sublinear(): - config = SublinearMemoryConfig(genetic_nr_iter=10) - - @jit.trace(symbolic=True, sublinear_memory_config=config) - def f(x): - return x + x - - f([0.0]) diff --git a/python_module/test/unit/module/.gitattributes b/python_module/test/unit/module/.gitattributes deleted file mode 100644 index 816f72d6..00000000 --- a/python_module/test/unit/module/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -*.mlu binary diff --git a/python_module/test/unit/module/AtlasRuntimeOprTest.basic.om b/python_module/test/unit/module/AtlasRuntimeOprTest.basic.om deleted file mode 100644 index 942fe2edff071b681433616ea0de43b30aa9cb29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32916 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

      {bSs7xyRdP-$(QLC#x1{zHk zW;bkJ(j}^)I9_TP-8bnnnlv10{tJ>)>ywsN4!ELn{sWScid2Ewl%uY(oF8&p~4t1$sh1#lh^h;&u z&i21!UL+G&iZPKeMC1{|{%lq4_=Ua-6~{@{JXHI3QpNXt?OUcc55;Sw5L&ZoY&VEh z_D!q5mhN2bn^VpIZ1(NScZ)TI*>lhvi)v(?Z_uiVI?jpKzfqa+t=22wEgp#Bp8@|X t-z^>hdK_~j{-0$mT={PC0Qhwqb?NZG^4;Qrpey0{khpZvpY6NF{~yJK!y*6x diff --git a/python_module/test/unit/module/__init__.py b/python_module/test/unit/module/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/python_module/test/unit/module/test_activation.py b/python_module/test/unit/module/test_activation.py deleted file mode 100644 index afca1fde..00000000 --- a/python_module/test/unit/module/test_activation.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import numpy as np - -import megengine as mge -from megengine.module import LeakyReLU -from megengine.test import assertTensorClose - - -def test_leaky_relu(): - data = np.array([-8, -12, 6, 10]).astype(np.float32) - negative_slope = 0.1 - - leaky_relu = LeakyReLU(negative_slope) - output = leaky_relu(mge.tensor(data)) - - np_output = np.maximum(0, data) + negative_slope * np.minimum(0, data) - assertTensorClose(output.numpy(), np_output, max_err=0) diff --git a/python_module/test/unit/module/test_batchnorm.py b/python_module/test/unit/module/test_batchnorm.py deleted file mode 100644 index cd651444..00000000 --- a/python_module/test/unit/module/test_batchnorm.py +++ /dev/null @@ -1,406 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import multiprocessing as mp -import platform - -import numpy as np -import pytest - -import megengine as mge -import megengine.distributed as dist -from megengine.core import tensor -from megengine.module import BatchNorm1d, BatchNorm2d, SyncBatchNorm -from megengine.test import assertTensorClose - - -@pytest.mark.skipif( - platform.system() == "Darwin", reason="do not imp GPU mode at macos now" -) -@pytest.mark.skipif( - platform.system() == "Windows", reason="do not imp GPU mode at Windows now" -) -@pytest.mark.isolated_distributed -def test_syncbn(): - nr_chan = 8 - data_shape = (3, nr_chan, 4, 16) - momentum = 0.9 - eps = 1e-5 - running_mean = np.zeros((1, nr_chan, 1, 1), dtype=np.float32) - running_var = np.ones((1, nr_chan, 1, 1), dtype=np.float32) - steps = 4 - nr_ranks = 2 - - def worker(rank, data, yv_expect, running_mean, running_var): - if mge.get_device_count("gpu") < nr_ranks: - return - dist.init_process_group("localhost", 2333, nr_ranks, rank, rank) - bn = SyncBatchNorm(nr_chan, momentum=momentum, eps=eps) - data_tensor = tensor() - for i in range(steps): - data_tensor.set_value(data[i]) - yv = bn(data_tensor) - - assertTensorClose(yv_expect, yv.numpy(), max_err=5e-6) - assertTensorClose(running_mean, bn.running_mean.numpy(), max_err=5e-6) - assertTensorClose(running_var, bn.running_var.numpy(), max_err=5e-6) - - xv = [] - for i in range(steps): - xv.append(np.random.normal(loc=2.3, size=data_shape).astype(np.float32)) - xv_transposed = np.transpose(xv[i], [0, 2, 3, 1]).reshape( - (data_shape[0] * data_shape[2] * data_shape[3], nr_chan) - ) - - mean = np.mean(xv_transposed, axis=0).reshape(1, nr_chan, 1, 1) - - var_biased = np.var(xv_transposed, axis=0).reshape((1, nr_chan, 1, 1)) - sd = np.sqrt(var_biased + eps) - - var_unbiased = np.var(xv_transposed, axis=0, ddof=1).reshape((1, nr_chan, 1, 1)) - running_mean = running_mean * momentum + mean * (1 - momentum) - running_var = running_var * momentum + var_unbiased * (1 - momentum) - - yv_expect = (xv[i] - mean) / sd - - data = [] - for i in range(nr_ranks): - data.append([]) - for j in range(steps): - data[i].append(xv[j][:, :, :, i * 8 : i * 8 + 8]) - - procs = [] - for rank in range(nr_ranks): - p = mp.Process( - target=worker, - args=( - rank, - data[rank], - yv_expect[:, :, :, rank * 8 : rank * 8 + 8], - running_mean, - running_var, - ), - ) - p.start() - procs.append(p) - - for p in procs: - p.join(10) - assert p.exitcode == 0 - - -def test_batchnorm(): - nr_chan = 8 - data_shape = (3, nr_chan, 4) - momentum = 0.9 - bn = BatchNorm1d(nr_chan, momentum=momentum) - running_mean = np.zeros((1, nr_chan, 1), dtype=np.float32) - running_var = np.ones((1, nr_chan, 1), dtype=np.float32) - data = tensor() - for i in range(3): - xv = np.random.normal(loc=2.3, size=data_shape).astype(np.float32) - mean = np.mean(np.mean(xv, axis=0, keepdims=True), axis=2, keepdims=True) - xv_transposed = np.transpose(xv, [0, 2, 1]).reshape( - (data_shape[0] * data_shape[2], nr_chan) - ) - - var_biased = np.var(xv_transposed, axis=0).reshape((1, nr_chan, 1)) - sd = np.sqrt(var_biased + bn.eps) - - var_unbiased = np.var(xv_transposed, axis=0, ddof=1).reshape((1, nr_chan, 1)) - running_mean = running_mean * momentum + mean * (1 - momentum) - running_var = running_var * momentum + var_unbiased * (1 - momentum) - - data.set_value(xv) - yv = bn(data) - yv_expect = (xv - mean) / sd - - assertTensorClose(yv_expect, yv.numpy(), max_err=5e-6) - assertTensorClose( - running_mean.reshape(-1), bn.running_mean.numpy().reshape(-1), max_err=5e-6 - ) - assertTensorClose( - running_var.reshape(-1), bn.running_var.numpy().reshape(-1), max_err=5e-6 - ) - - # test set 'training' flag to False - mean_backup = bn.running_mean.numpy() - var_backup = bn.running_var.numpy() - bn.training = False - xv = np.random.normal(loc=2.3, size=data_shape).astype(np.float32) - data.set_value(xv) - yv1 = bn(data) - yv2 = bn(data) - assertTensorClose(yv1.numpy(), yv2.numpy(), max_err=0) - assertTensorClose(mean_backup, bn.running_mean.numpy(), max_err=0) - assertTensorClose(var_backup, bn.running_var.numpy(), max_err=0) - yv_expect = (xv - running_mean) / np.sqrt(running_var + bn.eps) - assertTensorClose(yv_expect, yv1.numpy(), max_err=5e-6) - - -@pytest.mark.skipif( - platform.system() == "Darwin", reason="do not imp GPU mode at macos now" -) -@pytest.mark.skipif( - platform.system() == "Windows", reason="do not imp GPU mode at Windows now" -) -def test_syncbn1d(): - nr_chan = 8 - data_shape = (3, nr_chan, 4) - momentum = 0.9 - bn = SyncBatchNorm(nr_chan, momentum=momentum) - running_mean = np.zeros((1, nr_chan, 1), dtype=np.float32) - running_var = np.ones((1, nr_chan, 1), dtype=np.float32) - data = tensor() - for i in range(3): - xv = np.random.normal(loc=2.3, size=data_shape).astype(np.float32) - mean = np.mean(np.mean(xv, axis=0, keepdims=True), axis=2, keepdims=True) - xv_transposed = np.transpose(xv, [0, 2, 1]).reshape( - (data_shape[0] * data_shape[2], nr_chan) - ) - - var_biased = np.var(xv_transposed, axis=0).reshape((1, nr_chan, 1)) - sd = np.sqrt(var_biased + bn.eps) - - var_unbiased = np.var(xv_transposed, axis=0, ddof=1).reshape((1, nr_chan, 1)) - running_mean = running_mean * momentum + mean * (1 - momentum) - running_var = running_var * momentum + var_unbiased * (1 - momentum) - - data.set_value(xv) - yv = bn(data) - yv_expect = (xv - mean) / sd - - assertTensorClose(yv_expect, yv.numpy(), max_err=5e-6) - assertTensorClose( - running_mean.reshape(-1), bn.running_mean.numpy().reshape(-1), max_err=5e-6 - ) - assertTensorClose( - running_var.reshape(-1), bn.running_var.numpy().reshape(-1), max_err=5e-6 - ) - - # test set 'training' flag to False - mean_backup = bn.running_mean.numpy() - var_backup = bn.running_var.numpy() - bn.training = False - xv = np.random.normal(loc=2.3, size=data_shape).astype(np.float32) - data.set_value(xv) - yv1 = bn(data) - yv2 = bn(data) - assertTensorClose(yv1.numpy(), yv2.numpy(), max_err=0) - assertTensorClose(mean_backup, bn.running_mean.numpy(), max_err=0) - assertTensorClose(var_backup, bn.running_var.numpy(), max_err=0) - yv_expect = (xv - running_mean) / np.sqrt(running_var + bn.eps) - assertTensorClose(yv_expect, yv1.numpy(), max_err=5e-6) - - -def test_batchnorm2d(): - nr_chan = 8 - data_shape = (3, nr_chan, 16, 16) - momentum = 0.9 - bn = BatchNorm2d(nr_chan, momentum=momentum) - running_mean = np.zeros((1, nr_chan, 1, 1), dtype=np.float32) - running_var = np.ones((1, nr_chan, 1, 1), dtype=np.float32) - data = tensor() - for i in range(3): - xv = np.random.normal(loc=2.3, size=data_shape).astype(np.float32) - xv_transposed = np.transpose(xv, [0, 2, 3, 1]).reshape( - (data_shape[0] * data_shape[2] * data_shape[3], nr_chan) - ) - - mean = np.mean(xv_transposed, axis=0).reshape(1, nr_chan, 1, 1) - - var_biased = np.var(xv_transposed, axis=0).reshape((1, nr_chan, 1, 1)) - sd = np.sqrt(var_biased + bn.eps) - - var_unbiased = np.var(xv_transposed, axis=0, ddof=1).reshape((1, nr_chan, 1, 1)) - running_mean = running_mean * momentum + mean * (1 - momentum) - running_var = running_var * momentum + var_unbiased * (1 - momentum) - - data.set_value(xv) - yv = bn(data) - yv_expect = (xv - mean) / sd - - assertTensorClose(yv_expect, yv.numpy(), max_err=5e-6) - assertTensorClose(running_mean, bn.running_mean.numpy(), max_err=5e-6) - assertTensorClose(running_var, bn.running_var.numpy(), max_err=5e-6) - - # test set 'training' flag to False - mean_backup = bn.running_mean.numpy() - var_backup = bn.running_var.numpy() - bn.training = False - xv = np.random.normal(loc=2.3, size=data_shape).astype(np.float32) - data.set_value(xv) - yv1 = bn(data) - yv2 = bn(data) - assertTensorClose(yv1.numpy(), yv2.numpy(), max_err=0) - assertTensorClose(mean_backup, bn.running_mean.numpy(), max_err=0) - assertTensorClose(var_backup, bn.running_var.numpy(), max_err=0) - yv_expect = (xv - running_mean) / np.sqrt(running_var + bn.eps) - assertTensorClose(yv_expect, yv1.numpy(), max_err=5e-6) - - -@pytest.mark.skipif( - platform.system() == "Darwin", reason="do not imp GPU mode at macos now" -) -@pytest.mark.skipif( - platform.system() == "Windows", reason="do not imp GPU mode at Windows now" -) -def test_syncbn2d(): - nr_chan = 8 - data_shape = (3, nr_chan, 16, 16) - momentum = 0.9 - bn = SyncBatchNorm(nr_chan, momentum=momentum) - running_mean = np.zeros((1, nr_chan, 1, 1), dtype=np.float32) - running_var = np.ones((1, nr_chan, 1, 1), dtype=np.float32) - data = tensor() - for i in range(3): - xv = np.random.normal(loc=2.3, size=data_shape).astype(np.float32) - xv_transposed = np.transpose(xv, [0, 2, 3, 1]).reshape( - (data_shape[0] * data_shape[2] * data_shape[3], nr_chan) - ) - - mean = np.mean(xv_transposed, axis=0).reshape(1, nr_chan, 1, 1) - - var_biased = np.var(xv_transposed, axis=0).reshape((1, nr_chan, 1, 1)) - sd = np.sqrt(var_biased + bn.eps) - - var_unbiased = np.var(xv_transposed, axis=0, ddof=1).reshape((1, nr_chan, 1, 1)) - running_mean = running_mean * momentum + mean * (1 - momentum) - running_var = running_var * momentum + var_unbiased * (1 - momentum) - - data.set_value(xv) - yv = bn(data) - yv_expect = (xv - mean) / sd - - assertTensorClose(yv_expect, yv.numpy(), max_err=5e-6) - assertTensorClose(running_mean, bn.running_mean.numpy(), max_err=5e-6) - assertTensorClose(running_var, bn.running_var.numpy(), max_err=5e-6) - - # test set 'training' flag to False - mean_backup = bn.running_mean.numpy() - var_backup = bn.running_var.numpy() - bn.training = False - xv = np.random.normal(loc=2.3, size=data_shape).astype(np.float32) - data.set_value(xv) - yv1 = bn(data) - yv2 = bn(data) - assertTensorClose(yv1.numpy(), yv2.numpy(), max_err=0) - assertTensorClose(mean_backup, bn.running_mean.numpy(), max_err=0) - assertTensorClose(var_backup, bn.running_var.numpy(), max_err=0) - yv_expect = (xv - running_mean) / np.sqrt(running_var + bn.eps) - assertTensorClose(yv_expect, yv1.numpy(), max_err=5e-6) - - -def test_batchnorm_no_stats(): - nr_chan = 8 - data_shape = (3, nr_chan, 4) - bn = BatchNorm1d(8, track_running_stats=False) - data = tensor() - for i in range(4): - if i == 2: - bn.training = False - xv = np.random.normal(loc=2.3, size=data_shape).astype(np.float32) - mean = np.mean(np.mean(xv, axis=0, keepdims=True), axis=2, keepdims=True) - var = np.var( - np.transpose(xv, [0, 2, 1]).reshape( - (data_shape[0] * data_shape[2], nr_chan) - ), - axis=0, - ).reshape((1, nr_chan, 1)) - sd = np.sqrt(var + bn.eps) - - data.set_value(xv) - yv = bn(data) - yv_expect = (xv - mean) / sd - - assertTensorClose(yv_expect, yv.numpy(), max_err=5e-6) - - -@pytest.mark.skipif( - platform.system() == "Darwin", reason="do not imp GPU mode at macos now" -) -@pytest.mark.skipif( - platform.system() == "Windows", reason="do not imp GPU mode at Windows now" -) -def test_syncbn_no_stats(): - nr_chan = 8 - data_shape = (3, nr_chan, 4) - bn = SyncBatchNorm(8, track_running_stats=False) - data = tensor() - for i in range(4): - if i == 2: - bn.training = False - xv = np.random.normal(loc=2.3, size=data_shape).astype(np.float32) - mean = np.mean(np.mean(xv, axis=0, keepdims=True), axis=2, keepdims=True) - var = np.var( - np.transpose(xv, [0, 2, 1]).reshape( - (data_shape[0] * data_shape[2], nr_chan) - ), - axis=0, - ).reshape((1, nr_chan, 1)) - sd = np.sqrt(var + bn.eps) - - data.set_value(xv) - yv = bn(data) - yv_expect = (xv - mean) / sd - - assertTensorClose(yv_expect, yv.numpy(), max_err=5e-6) - - -def test_batchnorm2d_no_stats(): - nr_chan = 8 - data_shape = (3, nr_chan, 16, 16) - bn = BatchNorm2d(8, track_running_stats=False) - data = tensor() - for i in range(4): - if i == 2: - bn.training = False - xv = np.random.normal(loc=2.3, size=data_shape).astype(np.float32) - xv_transposed = np.transpose(xv, [0, 2, 3, 1]).reshape( - (data_shape[0] * data_shape[2] * data_shape[3], nr_chan) - ) - - mean = np.mean(xv_transposed, axis=0).reshape(1, nr_chan, 1, 1) - var = np.var(xv_transposed, axis=0).reshape((1, nr_chan, 1, 1)) - sd = np.sqrt(var + bn.eps) - - data.set_value(xv) - yv = bn(data) - yv_expect = (xv - mean) / sd - - assertTensorClose(yv_expect, yv.numpy(), max_err=5e-6) - - -@pytest.mark.skipif( - platform.system() == "Darwin", reason="do not imp GPU mode at macos now" -) -@pytest.mark.skipif( - platform.system() == "Windows", reason="do not imp GPU mode at Windows now" -) -def test_syncbn2d_no_stats(): - nr_chan = 8 - data_shape = (3, nr_chan, 16, 16) - bn = SyncBatchNorm(8, track_running_stats=False) - data = tensor() - for i in range(4): - if i == 2: - bn.training = False - xv = np.random.normal(loc=2.3, size=data_shape).astype(np.float32) - xv_transposed = np.transpose(xv, [0, 2, 3, 1]).reshape( - (data_shape[0] * data_shape[2] * data_shape[3], nr_chan) - ) - - mean = np.mean(xv_transposed, axis=0).reshape(1, nr_chan, 1, 1) - var = np.var(xv_transposed, axis=0).reshape((1, nr_chan, 1, 1)) - sd = np.sqrt(var + bn.eps) - - data.set_value(xv) - yv = bn(data) - yv_expect = (xv - mean) / sd - - assertTensorClose(yv_expect, yv.numpy(), max_err=5e-6) diff --git a/python_module/test/unit/module/test_conv.py b/python_module/test/unit/module/test_conv.py deleted file mode 100644 index f67a8aaf..00000000 --- a/python_module/test/unit/module/test_conv.py +++ /dev/null @@ -1,110 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import itertools - -import numpy as np - -from megengine import Parameter, tensor -from megengine.module import ConvTranspose2d, LocalConv2d -from megengine.test import assertTensorClose - - -def test_conv_transpose2d(): - SH, SW = 3, 1 - PH, PW = 2, 0 - N, IC, IH, IW = 4, 5, 8, 6 - KH, KW = 3, 4 - OC = 3 - BIAS = True - - def getsize(inp, kern, stride): - return (inp - 1) * stride + kern - - OH = getsize(IH, KH, SH) - OW = getsize(IW, KW, SW) - - inp = np.random.normal(size=(N, IC, IH, IW)).astype(np.float32) - out = np.zeros((N, OC, OH, OW), dtype=np.float32) - weight = np.random.normal(size=(IC, OC, KH, KW)).astype(np.float32) - bias = np.random.normal(size=(1, OC, 1, 1)).astype(np.float32) - - # naive calculation use numpy - for n, ic, ih, iw in itertools.product(*map(range, [N, IC, IH, IW])): - oh, ow = ih * SH, iw * SW - out[n, :, oh : oh + KH, ow : ow + KW] += inp[n, ic, ih, iw] * weight[ic] - out = out[:, :, PH : OH - PH, PW : OW - PW] - if BIAS: - out += bias - - # megengine conv_transpose2d calculation - conv_transpose2d = ConvTranspose2d(IC, OC, (KH, KW), (SH, SW), (PH, PW), bias=BIAS) - conv_transpose2d.weight = Parameter(weight, dtype=np.float32) - if BIAS: - conv_transpose2d.bias = Parameter(bias, dtype=np.float32) - y = conv_transpose2d(tensor(inp)) - - assertTensorClose(out, y.numpy(), max_err=2e-6) - - -def test_local_conv2d(): - batch_size = 10 - in_channels = 4 - out_channels = 8 - input_height = 8 - input_width = 8 - kernel_size = 3 - stride = 1 - padding = 1 - dilation = 1 - groups = 1 - local_conv2d = LocalConv2d( - in_channels=in_channels, - out_channels=out_channels, - input_height=input_height, - input_width=input_width, - kernel_size=kernel_size, - stride=stride, - padding=padding, - dilation=dilation, - groups=groups, - ) - inputs = np.random.normal( - size=(batch_size, in_channels, input_height, input_width) - ).astype(np.float32) - output_height = (input_height + padding * 2 - kernel_size) // stride + 1 - output_width = (input_width + padding * 2 - kernel_size) // stride + 1 - weights = np.random.normal( - size=( - groups, - output_height, - output_width, - in_channels // groups, - kernel_size, - kernel_size, - out_channels // groups, - ) - ).astype(np.float32) - local_conv2d.weight = Parameter(weights) - outputs = local_conv2d(tensor(inputs)) - # naive calculation use numpy - # only test output_height == input_height, output_width == input_width, group == 1 - inputs = np.pad(inputs, ((0, 0), (0, 0), (1, 1), (1, 1))) - expected = np.zeros( - (batch_size, out_channels, output_height, output_width), dtype=np.float32, - ) - for n, oc, oh, ow in itertools.product( - *map(range, [batch_size, out_channels, output_height, output_width]) - ): - ih, iw = oh * stride, ow * stride - expected[n, oc, ih, iw] = np.sum( - inputs[n, :, ih : ih + kernel_size, iw : iw + kernel_size] - * weights[0, oh, ow, :, :, :, oc] - ) - - assertTensorClose(outputs.numpy(), expected, max_err=1e-5) diff --git a/python_module/test/unit/module/test_external.py b/python_module/test/unit/module/test_external.py deleted file mode 100644 index 44f5cf21..00000000 --- a/python_module/test/unit/module/test_external.py +++ /dev/null @@ -1,70 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import os - -import numpy as np - -import megengine as mge -from megengine import tensor -from megengine.module import Module -from megengine.module.external import AtlasSubgraph, CambriconSubgraph - - -class CambriconModule(Module): - def __init__(self, data): - super().__init__() - self.cambricon = CambriconSubgraph(data, "subnet0", True) - - def forward(self, inputs): - out = self.cambricon(inputs) - return out - - -def test_cambricon_module(): - model = "CambriconRuntimeOprTest.MutableBatchSize.mlu" - model = os.path.join(os.path.dirname(__file__), model) - with open(model, "rb") as f: - data = f.read() - m = CambriconModule(data) - inputs = [] - inputs.append(tensor(dtype=np.float16, device="cambricon0")) - inputs[0].set_value(np.random.normal(size=(1, 64, 32, 32)).astype(np.float16)) - - def inference(inps): - pred = m(inps) - return pred - - pred = inference(inputs) - - -class AtlasModule(Module): - def __init__(self, data): - super().__init__() - self.atlas = AtlasSubgraph(data) - - def forward(self, inputs): - out = self.atlas(inputs) - return out - - -def test_atlas_module(): - model = "AtlasRuntimeOprTest.basic.om" - model = os.path.join(os.path.dirname(__file__), model) - with open(model, "rb") as f: - data = f.read() - m = AtlasModule(data) - inputs = [] - inputs.append(tensor(dtype=np.float32, device="atlas0")) - inputs[0].set_value(np.random.normal(size=(4, 3, 16, 16)).astype(np.float32)) - - def inference(inps): - pred = m(inps) - return pred - - pred = inference(inputs) diff --git a/python_module/test/unit/module/test_init.py b/python_module/test/unit/module/test_init.py deleted file mode 100644 index 06bc4339..00000000 --- a/python_module/test/unit/module/test_init.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import pytest - -from megengine.module import Conv2d, Linear -from megengine.module.init import calculate_fan_in_and_fan_out - - -def test_calculate_fan_in_and_fan_out(): - l = Linear(in_features=3, out_features=8) - fanin, fanout = calculate_fan_in_and_fan_out(l.weight) - assert fanin == 3 - assert fanout == 8 - - with pytest.raises(ValueError): - calculate_fan_in_and_fan_out(l.bias) - - l = Conv2d(in_channels=2, out_channels=3, kernel_size=(5, 7)) - fanin, fanout = calculate_fan_in_and_fan_out(l.weight) - assert fanin == 2 * 5 * 7 - assert fanout == 3 * 5 * 7 diff --git a/python_module/test/unit/module/test_module.py b/python_module/test/unit/module/test_module.py deleted file mode 100644 index 0766f6ee..00000000 --- a/python_module/test/unit/module/test_module.py +++ /dev/null @@ -1,464 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import os -import tempfile -from collections import OrderedDict -from io import BytesIO - -import numpy as np -import pytest -from helpers import MLP - -import megengine as mge -import megengine._internal as mgb -import megengine.functional as F -from megengine.core import Buffer, Parameter, Tensor, tensor -from megengine.module import ( - BatchNorm1d, - BatchNorm2d, - Conv2d, - Linear, - Module, - Sequential, -) -from megengine.quantization.quantize import quantize, quantize_qat -from megengine.test import assertTensorClose - - -class MyModule(Module): - class InnerModule(Module): - def __init__(self): - super().__init__() - self.bn = BatchNorm2d(4) - - def forward(self, x): - return self.bn(x) - - def __init__(self): - super().__init__() - self.i = self.InnerModule() - self.bn = BatchNorm2d(4) - self.param = Parameter(np.ones(1, dtype=np.float32)) - self.buff = Buffer(np.ones(1, dtype=np.float32)) - - def forward(self, x): - x = self.i(x) - x = self.bn(x) - return x - - -def test_module_api(): - m = MyModule() - assert list(m.children()) == [m.bn, m.i] - assert list(m.named_children()) == [("bn", m.bn), ("i", m.i)] - assert list(m.modules()) == [m, m.bn, m.i, m.i.bn] - assert list(m.named_modules()) == [ - ("", m), - ("bn", m.bn), - ("i", m.i), - ("i.bn", m.i.bn), - ] - assert list(m.named_modules(prefix="x")) == [ - ("x", m), - ("x.bn", m.bn), - ("x.i", m.i), - ("x.i.bn", m.i.bn), - ] - assert list(m.buffers()) == [ - m.bn.running_mean, - m.bn.running_var, - m.buff, - m.i.bn.running_mean, - m.i.bn.running_var, - ] - assert list(m.buffers(recursive=False)) == [m.buff] - assert list(m.named_buffers()) == [ - ("bn.running_mean", m.bn.running_mean), - ("bn.running_var", m.bn.running_var), - ("buff", m.buff), - ("i.bn.running_mean", m.i.bn.running_mean), - ("i.bn.running_var", m.i.bn.running_var), - ] - assert list(m.parameters()) == [ - m.bn.bias, - m.bn.weight, - m.i.bn.bias, - m.i.bn.weight, - m.param, - ] - assert list(m.named_parameters()) == [ - ("bn.bias", m.bn.bias), - ("bn.weight", m.bn.weight), - ("i.bn.bias", m.i.bn.bias), - ("i.bn.weight", m.i.bn.weight), - ("param", m.param), - ] - m.eval() - assert ( - m.training == False - and m.bn.training == False - and m.i.training == False - and m.i.bn.training == False - ) - m.bn.train() - assert m.training == False and m.bn.training == True and m.i.bn.training == False - m.eval() - m.i.train() - assert ( - m.training == False - and m.bn.training == False - and m.i.training == True - and m.i.bn.training == True - ) - m.eval() - m.train() - assert m.training == True and m.bn.training == True and m.i.bn.training == True - - def fn(m): - m.training = False - - m.apply(fn) - assert m.bn.training == False and m.i.bn.training == False - - -def test_module_api_reuse_submodule(): - m = MyModule() - m.h = m.i # pylint: disable=attribute-defined-outside-init - assert list(m.modules()) == [m, m.bn, m.i, m.i.bn] - assert list(m.named_modules()) == [ - ("", m), - ("bn", m.bn), - ("h", m.i), - ("h.bn", m.i.bn), - ] - - -def test_module_api_iterable_stability(): - m = MyModule() - l = list(m.modules()) - for _ in range(100): - assert list(m.modules()) == l - - -def test_module_api_hooks(): - net = MyModule() - pre_hook_num = 0 - post_hook_num = 0 - hooks = [] - - def pre_hook(module, inputs): - nonlocal pre_hook_num - pre_hook_num += 1 - modified_inputs = tuple(inp + 1 for inp in inputs) - return modified_inputs - - def post_hook(module, inputs, outputs): - nonlocal post_hook_num - post_hook_num += 1 - outputs += 1 - return outputs - - net.apply(lambda module: hooks.append(module.register_forward_pre_hook(pre_hook))) - net.apply(lambda module: hooks.append(module.register_forward_hook(post_hook))) - - shape = (1, 4, 1, 1) - x = tensor(np.zeros(shape, dtype=np.float32)) - y = net(x) - - assert pre_hook_num == 4 - assert post_hook_num == 4 - mean1 = Parameter(np.zeros(shape), dtype=np.float32) - bn1 = F.batch_norm2d( - x + 3, mean1, Parameter(np.ones(shape), dtype=np.float32), training=True - ) - assertTensorClose( - net.i.bn.running_mean, mean1, - ) - mean2 = Parameter(np.zeros(shape), dtype=np.float32) - bn2 = F.batch_norm2d( - bn1 + 3, mean2, Parameter(np.ones(shape), dtype=np.float32), training=True - ) - assertTensorClose( - net.bn.running_mean, mean2, - ) - assertTensorClose(bn2 + 2, y) - - assert len(hooks) == 8 - for handler in hooks: - handler.remove() - y = net(x) - assert pre_hook_num == 4 - assert post_hook_num == 4 - - -class MyModule2(Module): - class InnerModule(Module): - def __init__(self): - super().__init__() - self.bn = BatchNorm2d(4) - self.test_bool_key = {True: 1, False: 0} - - def forward(self, x): - x = self.bn(x) - - def __init__(self): - super().__init__() - self.bn = BatchNorm2d(4) - self.a = [ - BatchNorm2d(4), - {"x": BatchNorm2d(4), "y": [BatchNorm2d(4), self.InnerModule()], "z": 0}, - (self.InnerModule(),), - ] - - def forward(self, x): - return x - - -def test_expand_structure(): - m = MyModule2() - assert list(m.named_modules()) == [ - ("", m), - ("a.0", m.a[0]), - ("a.1.x", m.a[1]["x"]), - ("a.1.y.0", m.a[1]["y"][0]), - ("a.1.y.1", m.a[1]["y"][1]), - ("a.1.y.1.bn", m.a[1]["y"][1].bn), - ("a.2.0", m.a[2][0]), - ("a.2.0.bn", m.a[2][0].bn), - ("bn", m.bn), - ] - - -def test_flatten_others(): - def be_others(obj): - return not isinstance(obj, (Tensor, Module)) - - m = MyModule2() - assert len(list(m._flatten(with_key=True, predicate=be_others))) == 0 - - -def test_flatten_with_parent(): - m = MyModule2() - assert list(m.named_modules(with_parent=True)) == [ - ("", m, None), - ("a.0", m.a[0], m), - ("a.1.x", m.a[1]["x"], m), - ("a.1.y.0", m.a[1]["y"][0], m), - ("a.1.y.1", m.a[1]["y"][1], m), - ("a.1.y.1.bn", m.a[1]["y"][1].bn, m.a[1]["y"][1]), - ("a.2.0", m.a[2][0], m), - ("a.2.0.bn", m.a[2][0].bn, m.a[2][0]), - ("bn", m.bn, m), - ] - assert list(m.modules(with_parent=True)) == [ - (m, None), - (m.a[0], m), - (m.a[1]["x"], m), - (m.a[1]["y"][0], m), - (m.a[1]["y"][1], m), - (m.a[1]["y"][1].bn, m.a[1]["y"][1]), - (m.a[2][0], m), - (m.a[2][0].bn, m.a[2][0]), - (m.bn, m), - ] - - -class MyModule3(Module): - class InnerModule(Module): - def __init__(self): - super().__init__() - self.bn = BatchNorm2d(4) - - def forward(self, x): - x = self.bn(x) - - def __init__(self): - super().__init__() - self.bn = BatchNorm2d(4) - self.seq = Sequential(BatchNorm2d(4), self.InnerModule(),) - - def forward(self, x): - return x - - -def test_module_api_with_sequential(): - m = MyModule3() - assert list(m.named_modules()) == [ - ("", m), - ("bn", m.bn), - ("seq", m.seq), - ("seq.0", m.seq[0]), - ("seq.1", m.seq[1]), - ("seq.1.bn", m.seq[1].bn), - ] - - -def test_sequential_named_children(): - modules = OrderedDict() - modules["name0"] = Linear(20, 10) - modules["name1"] = Linear(10, 5) - modules["name2"] = Linear(5, 1) - m = Sequential(modules) - l = list(m.named_children()) - assert l[0][0] == "name0" - assert l[1][0] == "name1" - assert l[2][0] == "name2" - - -def test_state_dict(): - data_shape = (2, 28) - data = tensor() - data.set_value(np.random.random(data_shape)) - mlp = MLP() - pred0 = mlp(data) - - with BytesIO() as fout: - mge.save(mlp.state_dict(), fout) - fout.seek(0) - state_dict = mge.load(fout) - state_dict["extra"] = None - mlp1 = MLP() - mlp1.load_state_dict(state_dict, strict=False) - pred1 = mlp1(data) - assertTensorClose(pred0.numpy(), pred1.numpy(), max_err=5e-6) - with pytest.raises(KeyError): - mlp1.load_state_dict(state_dict) - del state_dict["extra"] - del state_dict["dense0.bias"] - with pytest.raises(KeyError): - mlp1.load_state_dict(state_dict) - - -class AssertModule(Module): - def __init__(self): - super().__init__() - self.error_tensor_key = {True: tensor(), False: 0} - - def forward(self, x): - return x - - -def test_assert_message(): - m = AssertModule() - with pytest.raises( - AssertionError, match="keys for Tensor and Module must be str, error key: True" - ): - list(m._flatten()) - - -class Simple(Module): - def __init__(self): - super().__init__() - self.conv0 = Conv2d(1, 1, kernel_size=3, bias=False) - self.conv1 = Conv2d(1, 1, kernel_size=3, bias=False) - self.conv1.weight = self.conv0.weight - - def forward(self, inputs): - pass - - -def test_shared_param(): - net = Simple() - assert net.conv0.weight is net.conv1.weight - data = tensor(np.random.random((1, 1, 8, 8)).astype(np.float32)) - assertTensorClose(net.conv0(data).numpy(), net.conv1(data).numpy()) - with BytesIO() as f: - mge.save(net, f) - f.seek(0) - net1 = mge.load(f) - assert net1.conv0.weight is net1.conv1.weight - assertTensorClose(net1.conv0(data).numpy(), net1.conv1(data).numpy()) - - with BytesIO() as f: - mge.save(net.conv0, f) - f.seek(0) - conv0 = mge.load(f) - - with BytesIO() as f: - mge.save(net.conv1, f) - f.seek(0) - conv1 = mge.load(f) - - assert conv0.weight is not conv1.weight - assertTensorClose(conv0(data).numpy(), conv1(data).numpy()) - - -def test_pickle_module(): - data_shape = (2, 28) - data = tensor() - data.set_value(np.random.random(data_shape)) - mlp = MLP() - # pickle before forward - with BytesIO() as fout: - mge.save(mlp, fout) - fout.seek(0) - mlp1 = mge.load(fout) - pred0 = mlp1(data) - - pred1 = mlp(data) - - # pickle after forward - with BytesIO() as fout: - mge.save(mlp, fout) - fout.seek(0) - mlp1 = mge.load(fout) - pred2 = mlp1(data) - - assertTensorClose(pred0.numpy(), pred1.numpy(), max_err=5e-6) - assertTensorClose(pred0.numpy(), pred2.numpy(), max_err=5e-6) - - -def test_dump_model(): - data_shape = (2, 28) - data = tensor() - data.set_value(np.random.random(data_shape)) - mlp = MLP() - pred = mlp(data) - f = tempfile.NamedTemporaryFile(delete=False) - f_name = f.name - try: - mge.dump(pred, f_name) - finally: - f.close() - os.unlink(f_name) - - -def test_load_quantized(): - data_shape = (2, 28) - data = tensor(np.random.random(data_shape), dtype="float32") - data = data.astype(mgb.dtype.qint8(0.1)) - mlp = MLP() - quantize_qat(mlp) - quantize(mlp) - mlp.dense0.weight = Parameter( - mlp.dense0.weight.astype(mgb.dtype.qint8(0.001)).numpy() - ) - mlp.dense1.weight = Parameter( - mlp.dense1.weight.astype(mgb.dtype.qint8(0.0002)).numpy() - ) - mlp.eval() - pred0 = mlp(data) - - with BytesIO() as fout: - mge.save(mlp.state_dict(), fout) - fout.seek(0) - checkpoint = mge.load(fout) - # change mlp weight. - mlp.dense0.weight = Parameter( - mlp.dense0.weight.astype(mgb.dtype.qint8(0.00001)).numpy() - ) - mlp.dense1.weight = Parameter( - mlp.dense1.weight.astype(mgb.dtype.qint8(0.2)).numpy() - ) - mlp.load_state_dict(checkpoint) - pred1 = mlp(data) - - assertTensorClose( - pred0.astype("float32").numpy(), pred1.astype("float32").numpy(), max_err=5e-6 - ) diff --git a/python_module/test/unit/module/test_pytorch.py b/python_module/test/unit/module/test_pytorch.py deleted file mode 100644 index d7b3ae9a..00000000 --- a/python_module/test/unit/module/test_pytorch.py +++ /dev/null @@ -1,140 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import numpy as np -import torch -from helpers import randomTorch - -import megengine as mge -import megengine._internal as mgb -import megengine.functional -import megengine.optimizer as optimizer -from megengine import get_default_device, set_default_device -from megengine.core import Parameter, tensor -from megengine.jit import trace -from megengine.module import Module as MGEModule -from megengine.module.pytorch import PyTorchModule -from megengine.test import assertTensorClose - - -def test_pytorch_forward(): - class APlusB(torch.nn.Module): - def __init__(self): - super(APlusB, self).__init__() - - def forward(self, a, b): - return a + b - - a = randomTorch(15, 15) - b = randomTorch(15, 15) - - def get_pytorch_forward(): - return APlusB()(a, b) - - def get_mge_forward(): - mge_module = PyTorchModule(APlusB()) - mge_a = tensor(a.numpy(), dtype=np.float32) - mge_b = tensor(b.numpy(), dtype=np.float32) - return mge_module(mge_a, mge_b) - - assertTensorClose(get_pytorch_forward().numpy(), get_mge_forward().numpy()) - - -def test_pytorch_backward(): - class APlusB(torch.nn.Module): - def __init__(self): - super(APlusB, self).__init__() - - def forward(self, a, b): - return a + b - - a = randomTorch(15, 15) - b = randomTorch(15, 15) - - def get_pytorch_backward(): - parameter_a = a.clone() - parameter_a.requires_grad = True - c = APlusB()(parameter_a, b) - d = APlusB()(c, b) - e = torch.sum(d) - e.backward() - return parameter_a.grad - - def get_mge_backward(): - mge_module = PyTorchModule(APlusB()) - mge_a = Parameter(a.numpy(), dtype=np.float32) - mge_b = tensor(b.numpy(), dtype=np.float32) - mge_c = mge_module(mge_a, mge_b) - mge_d = mge_module(mge_c, mge_b) - mge_e = mge.functional.sum(mge_d) - return mge.functional.grad(mge_e, mge_a, use_virtual_grad=False) - - assertTensorClose(get_pytorch_backward().numpy(), get_mge_backward().numpy()) - - -def test_pytorch_mixed(): - - init_param = (np.array([2.0], dtype=np.float32), np.array([3.0], dtype=np.float32)) - lr = 1.0 - - class Mixed(MGEModule): - class SubModule(torch.nn.Module): - def __init__(self): - super().__init__() - self.multiplier = torch.nn.Parameter(torch.tensor(init_param[0])) - - def forward(self, inp): - return inp * self.multiplier - - def __init__(self): - super().__init__() - self.torch_module = PyTorchModule(self.SubModule()) - self.multiplier = Parameter(init_param[1], dtype=np.float32) - - def forward(self, inp): - return self.torch_module(inp) * self.multiplier - - def run(step, enable_trace, use_symbolic): - def train_func(data, net=None, opt=None): - pred = net(data) - opt.backward(pred) - return pred - - if enable_trace: - train_func = trace(train_func, symbolic=use_symbolic) - - net = Mixed() - data = tensor() - opt = optimizer.SGD(net.parameters(), lr=lr) - - saved_param = init_param - for i in range(step): - opt.zero_grad() - data.set_value([i + 1.0]) - output = train_func(data, net=net, opt=opt) - opt.step() - - expect_param = ( - saved_param[0] - lr * saved_param[1] * data.numpy(), - saved_param[1] - lr * saved_param[0] * data.numpy(), - ) - assertTensorClose( - output.numpy(), saved_param[0] * saved_param[1] * data.numpy() - ) - torch_param = net.torch_module._torch_params[0].detach().cpu() - assertTensorClose(torch_param.numpy(), expect_param[0]) - assertTensorClose(net.multiplier.numpy(), expect_param[1]) - saved_param = expect_param - - run(1, False, False) - run(1, True, True) - run(1, True, False) - - run(2, False, False) - run(2, True, True) - run(2, True, False) diff --git a/python_module/test/unit/module/test_qat.py b/python_module/test/unit/module/test_qat.py deleted file mode 100644 index 6b6c5a86..00000000 --- a/python_module/test/unit/module/test_qat.py +++ /dev/null @@ -1,85 +0,0 @@ -from itertools import product - -import numpy as np - -from megengine import tensor -from megengine.module import ( - Conv2d, - ConvBn2d, - ConvRelu2d, - DequantStub, - Module, - QuantStub, -) -from megengine.quantization.quantize import disable_fake_quant, quantize_qat -from megengine.test import assertTensorClose - - -def test_qat_convbn2d(): - in_channels = 32 - out_channels = 64 - kernel_size = 3 - for groups, bias in product([1, 4], [True, False]): - module = ConvBn2d( - in_channels, out_channels, kernel_size, groups=groups, bias=bias - ) - module.train() - qat_module = quantize_qat(module, inplace=False) - disable_fake_quant(qat_module) - inputs = tensor(np.random.randn(4, in_channels, 32, 32).astype(np.float32)) - normal_outputs = module(inputs) - qat_outputs = qat_module(inputs) - assertTensorClose(normal_outputs, qat_outputs, max_err=5e-6) - assertTensorClose( - module.bn.running_mean, qat_module.bn.running_mean, max_err=5e-8 - ) - assertTensorClose( - module.bn.running_var, qat_module.bn.running_var, max_err=5e-7 - ) - module.eval() - normal_outputs = module(inputs) - qat_module.eval() - qat_outputs = qat_module(inputs) - assertTensorClose(normal_outputs, qat_outputs, max_err=5e-6) - - -def test_qat_conv(): - - in_channels = 32 - out_channels = 64 - kernel_size = 3 - - class TestNet(Module): - def __init__(self, groups, bias): - super().__init__() - self.quant = QuantStub() - self.dequant = DequantStub() - self.conv = Conv2d( - in_channels, out_channels, kernel_size, groups=groups, bias=bias - ) - self.conv_relu = ConvRelu2d( - out_channels, in_channels, kernel_size, groups=groups, bias=bias - ) - - def forward(self, inp): - out = self.quant(inp) - out = self.conv(out) - out = self.conv_relu(out) - out = self.dequant(out) - return out - - inputs = tensor(np.random.randn(4, in_channels, 32, 32).astype(np.float32)) - for groups, bias in product([1, 4], [True, False]): - net = TestNet(groups, bias) - net.train() - qat_net = quantize_qat(net, inplace=False) - disable_fake_quant(qat_net) - normal_outputs = net(inputs) - qat_outputs = qat_net(inputs) - assertTensorClose(normal_outputs, qat_outputs) - - net.eval() - normal_outputs = net(inputs) - qat_net.eval() - qat_outputs = qat_net(inputs) - assertTensorClose(normal_outputs, qat_outputs) diff --git a/python_module/test/unit/module/test_tensor.py b/python_module/test/unit/module/test_tensor.py deleted file mode 100644 index 86c5726e..00000000 --- a/python_module/test/unit/module/test_tensor.py +++ /dev/null @@ -1,87 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import copy - -import numpy as np -import pytest - -import megengine as mge -import megengine.functional as F -from megengine.core import Buffer, Graph, Parameter -from megengine.module import Conv2d -from megengine.test import assertTensorClose - - -def test_set_value(): - v0 = np.random.random((2, 3)).astype(np.float32) - param = Parameter(v0) - v1 = np.random.random((2, 3)).astype(np.float32) - param.set_value(v1) - assertTensorClose(param.numpy(), v1, max_err=5e-6) - v2 = np.random.random((3, 3)).astype(np.float32) - # TODO: add this - # with pytest.raises(ValueError): - # param.set_value(v2) - assertTensorClose(param.numpy(), v1, max_err=5e-6) - - -def test_fill(): - a = Buffer(np.zeros((2, 3), dtype=np.float32)) - a.fill(3) - assertTensorClose(a.numpy(), np.full((2, 3), 3, dtype=np.float32)) - a.fill(124.568) - assertTensorClose(a.numpy(), np.full((2, 3), 124.568, dtype=np.float32)) - - -# TODO: remove or rewrite following test -# def test_attach(): -# p_ = np.random.random((2, 3)).astype(np.float32) - -# with Graph() as g: -# g.set_option('eager_evaluation', False) -# p = Parameter(p_) -# v = p * 2 -# f = compile(v, None) - -# out, = f() -# assertTensorClose(out, p_ * 2) - -# F.add_update(p, p) -# out, = f() -# assertTensorClose(out, p_ * 4) - -# TODO: remove or rewrite following test -# def test_module_attach(): -# v = np.random.random((1, 3, 64, 64)).astype(np.float32) -# net = Conv2d(3, 16, 3) - -# with Graph() as g: -# g.set_option('eager_evaluation', False) - -# data0 = Input("data") -# f = compile(net(data0), None) - -# out0, = f(data=v) - -# data1 = Input("data", value=v) -# out1 = net(data1) - -# assertTensorClose(out0, out1.numpy()) - - -def test_shape_warning(): - with Graph() as cg: - cg.set_option("eager_evaluation", False) - b = Buffer(np.ones((2, 3)).astype(np.float32)) - with pytest.warns(None) as record: - print(b.shape) - if len(record) != 0: - raise ValueError( - "Getting the shape of a constant Tensor should throw no Warning" - ) diff --git a/python_module/test/unit/optimizer/__init__.py b/python_module/test/unit/optimizer/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/python_module/test/unit/optimizer/test_lr_scheduler.py b/python_module/test/unit/optimizer/test_lr_scheduler.py deleted file mode 100644 index e185f179..00000000 --- a/python_module/test/unit/optimizer/test_lr_scheduler.py +++ /dev/null @@ -1,23 +0,0 @@ -from bisect import bisect_right - -import numpy as np -from helpers import MLP - -from megengine.optimizer import SGD, MultiStepLR -from megengine.test import assertTensorClose - - -def test_multi_step_lr(): - mlp = MLP() - opt = SGD(mlp.parameters(), lr=0.01, momentum=0.9) - scheduler = MultiStepLR(opt, [3, 6, 8]) - - lr = np.array(0.01, dtype=np.float32) - for i in range(10): - for group in opt.param_groups: - assertTensorClose( - np.array(group["lr"], dtype=np.float32), - (lr * 0.1 ** bisect_right([3, 6, 8], i)).astype(np.float32), - max_err=5e-6, - ) - scheduler.step() diff --git a/python_module/test/unit/optimizer/test_optimizer.py b/python_module/test/unit/optimizer/test_optimizer.py deleted file mode 100644 index e172df79..00000000 --- a/python_module/test/unit/optimizer/test_optimizer.py +++ /dev/null @@ -1,258 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from io import BytesIO - -import numpy as np -from helpers import MLP, graph_mode - -import megengine.functional as F -from megengine import load, optimizer, save -from megengine.core import TensorDict, tensor -from megengine.jit import trace -from megengine.test import assertTensorClose - - -def get_input(): - batch_size, input_dim = 2, 28 - data_shape, label_shape = (batch_size, input_dim), (batch_size,) - data, label = tensor(dtype=np.float32), tensor(dtype=np.int32) - data.set_value(np.random.random(data_shape).astype(np.float32)) - label.set_value(np.random.randint(0, 10, label_shape)) - return data, data_shape, label, label_shape - - -@graph_mode("eager", "static") -def test_optimizer_serialization(): - data, data_shape, label, label_shape = get_input() - mlp = MLP() - opt = optimizer.SGD(mlp.parameters(), lr=0.01, momentum=0.9) - slots = TensorDict() - for param in mlp.parameters(): - slots[param] = np.zeros(param.shape).astype(np.float32) - - pred = mlp(data) - loss = F.square_loss(pred, label.reshape(-1, 1)) - opt.zero_grad() - opt.backward(loss) - opt.step() - for param in mlp.parameters(): - slots[param] = slots[param] * 0.9 + param.grad.numpy() - - with BytesIO() as fout: - save(opt.state_dict(), fout) - fout.seek(0) - state_dict = load(fout) - opt1 = optimizer.SGD(mlp.parameters(), lr=0.02, momentum=0.8) - opt1.load_state_dict(state_dict) - - data.set_value(np.random.random(data_shape).astype(np.float32)) - label.set_value(np.random.randint(0, 10, label_shape)) - pred = mlp(data) - loss = F.square_loss(pred, label.reshape(-1, 1)) - opt1.zero_grad() - opt1.backward(loss) - orig_params = TensorDict() - for param in mlp.parameters(): - orig_params[param] = np.copy(param.numpy()) - opt1.step() - for param in mlp.parameters(): - orig_param = orig_params[param] - slots[param] = slots[param] * 0.9 + param.grad.numpy() - assertTensorClose(param.numpy(), orig_param - 0.01 * slots[param]) - - -def _test_optimizer(opt_str, test_case, check_class, update_lr=False): - iter_num = 3 - data, data_shape, label, label_shape = get_input() - - net = MLP() - opt = getattr(optimizer, opt_str)(net.parameters(), **test_case) - check_func = check_class(net, **test_case) - - step = 0 - - # eager graph - for i in range(iter_num): - if update_lr and i == 1: # change learning rate - for group in opt.param_groups: - group["lr"] += 0.01 - check_func.lr += 0.01 - data.set_value(np.random.random(data_shape).astype(np.float32)) - label.set_value(np.random.randint(0, 10, label_shape)) - pred = net(data) - loss = F.square_loss(pred, label.reshape(-1, 1)) - opt.zero_grad() - opt.backward(loss) - ori_params = TensorDict() - for param in net.parameters(): - ori_params[param] = np.copy(param.numpy()) - opt.step() - step += 1 - check_func(ori_params, net.parameters(), step) - - # static graph - @trace - def train_func(data, label): - pred = net(data) - loss = F.square_loss(pred, label.reshape(-1, 1)) - opt.backward(loss) - - for i in range(iter_num): - if update_lr and i == 1: # change learning rate - for group in opt.param_groups: - group["lr"] += 0.01 - check_func.lr += 0.01 - opt.zero_grad() - ori_params = TensorDict() - for param in net.parameters(): - ori_params[param] = np.copy(param.numpy()) - train_func( - np.random.random(data_shape).astype(np.float32), - np.random.randint(0, 10, label_shape).astype(np.int32), - ) - opt.step() - step += 1 - check_func(ori_params, net.parameters(), step) - - -def test_sgd(): - class CheckValue: - def __init__(self, net, **kwarg): - self.slots = TensorDict() - for param in net.parameters(): - self.slots[param] = np.zeros(param.shape).astype(np.float32) - for k, v in kwarg.items(): - setattr(self, k, v) - - def __call__(self, ori_params, new_params, step): - for param in new_params: - grad = param.grad.numpy() - if hasattr(self, "momentum"): - self.slots[param] = grad + self.slots[param] * self.momentum - delta = -self.lr * self.slots[param] - else: - delta = -self.lr * grad - assertTensorClose(param.numpy(), ori_params[param] + delta) - - cases = [ - {"momentum": 0.9, "lr": 0.01}, # SGD with momentum - {"lr": 0.01}, # simple SGD - {"weight_decay": 0.1, "lr": 0.01}, # with weight_decay - ] - for case in cases: - _test_optimizer("SGD", case, CheckValue) - _test_optimizer("SGD", case, CheckValue, update_lr=True) - - -def test_adam(): - class CheckValue: - def __init__(self, net, **kwarg): - self.m_slots = TensorDict() - self.v_slots = TensorDict() - for param in net.parameters(): - self.m_slots[param] = np.zeros(param.shape).astype(np.float32) - self.v_slots[param] = np.zeros(param.shape).astype(np.float32) - for k, v in kwarg.items(): - setattr(self, k, v) - - def __call__(self, ori_params, new_params, step): - for param in new_params: - grad = param.grad.numpy() - m = self.m_slots[param] - v = self.v_slots[param] - m *= self.betas[0] - m += (1 - self.betas[0]) * grad - v *= self.betas[1] - v += (1 - self.betas[1]) * grad * grad - delta = (m / (1 - self.betas[0] ** step)) / ( - np.sqrt(v / (1 - self.betas[1] ** step)) + self.eps - ) - assertTensorClose(param.numpy(), ori_params[param] - self.lr * delta) - - cases = [ - {"betas": (0.8, 0.9), "eps": 1e-04, "lr": 0.01}, - { - "betas": (0.8, 0.9), - "eps": 1e-04, - "lr": 0.01, - "weight_decay": 0.1, - }, # with weight_decay - ] - for case in cases: - _test_optimizer("Adam", case, CheckValue) - _test_optimizer("Adam", case, CheckValue, update_lr=True) - - -def test_adagrad(): - class CheckValue: - def __init__(self, net, **kwarg): - self.s_slots = TensorDict() - for param in net.parameters(): - self.s_slots[param] = np.zeros(param.shape).astype(np.float32) - for k, v in kwarg.items(): - setattr(self, k, v) - - def __call__(self, ori_params, new_params, step): - for param in new_params: - grad = param.grad.numpy() - self.s_slots[param] += grad ** 2 - delta = grad / (self.s_slots[param] + self.eps) ** 0.5 - delta *= -(self.lr / (1 + (step - 1) * self.lr_decay)) - assertTensorClose(param.numpy(), ori_params[param] + delta) - - cases = [ - {"lr": 0.01, "eps": 1e-06, "lr_decay": 0.01}, - {"lr": 0.01, "eps": 1e-06, "lr_decay": 0.0}, # without lr_decay - { - "lr": 0.01, - "eps": 1e-06, - "lr_decay": 0.01, - "weight_decay": 0.1, - }, # with weight_decay - ] - for case in cases: - _test_optimizer("Adagrad", case, CheckValue) - _test_optimizer("Adagrad", case, CheckValue, update_lr=True) - - -def test_adadelta(): - class CheckValue: - def __init__(self, net, **kwarg): - self.s_slots = TensorDict() - self.a_slots = TensorDict() - for param in net.parameters(): - self.s_slots[param] = np.zeros(param.shape).astype(np.float32) - self.a_slots[param] = np.zeros(param.shape).astype(np.float32) - for k, v in kwarg.items(): - setattr(self, k, v) - - def __call__(self, ori_params, new_params, step): - for param in new_params: - grad = param.grad.numpy() - self.s_slots[param] = self.s_slots[param] * self.rho + grad ** 2 * ( - 1 - self.rho - ) - delta = ( - grad - * ((self.a_slots[param] + self.eps) ** 0.5) - / (self.s_slots[param] + self.eps) ** 0.5 - ) - self.a_slots[param] = self.a_slots[param] * self.rho + delta ** 2 * ( - 1 - self.rho - ) - delta *= -self.lr - assertTensorClose(param.numpy(), ori_params[param] + delta) - - cases = [ - {"lr": 1.0, "eps": 1e-06, "rho": 0.9}, - {"lr": 1.0, "eps": 1e-06, "rho": 0.9, "weight_decay": 0.9}, # with weight_decay - ] - for case in cases: - _test_optimizer("Adadelta", case, CheckValue) - _test_optimizer("Adadelta", case, CheckValue, update_lr=True) diff --git a/python_module/test/unit/quantization/quantize.py b/python_module/test/unit/quantization/quantize.py deleted file mode 100644 index 236ef9e1..00000000 --- a/python_module/test/unit/quantization/quantize.py +++ /dev/null @@ -1,80 +0,0 @@ -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -from megengine import module as Float -from megengine.module import qat as QAT -from megengine.quantization.quantize import _get_quantable_module_names, quantize_qat - - -def test_get_quantable_module_names(): - # need to make sure names from Quantized and QAT are the same - def _get_qat_module_names(): - def is_qat(key: str): - value = getattr(QAT, key) - return ( - isinstance(value, type) - and issubclass(value, QAT.QATModule) - and value != QAT.QATModule - ) - - # source should have all quantable modules' names - quantable_module_names = [key for key in dir(QAT) if is_qat(key)] - return quantable_module_names - - qat_module_names = _get_qat_module_names() - quantized_module_names = _get_quantable_module_names() - assert set(qat_module_names) == set(quantized_module_names) - - for key in qat_module_names: - value = getattr(Float, key) - assert ( - isinstance(value, type) - and issubclass(value, Float.Module) - and value != Float.Module - ) - - -def test_disable_quantize(): - class Net(Float.Module): - def __init__(self): - super().__init__() - self.conv = Float.ConvBnRelu2d(3, 3, 3) - self.conv.disable_quantize() - - def forward(self, x): - return self.conv(x) - - net = Net() - qat_net = quantize_qat(net, inplace=False) - assert isinstance(qat_net.conv, Float.ConvBnRelu2d) - assert isinstance(qat_net.conv.conv, Float.Conv2d) - - -def test_convert_with_custom_mapping(): - class FloatExample(Float.Module): - def forward(self, x): - return x - - class QATExample(QAT.QATModule): - def forward(self, x): - return x - - @classmethod - def from_float_module(cls, float_module): - return cls() - - class Net(Float.Module): - def __init__(self): - super().__init__() - self.example = FloatExample() - - def forward(self, x): - return self.example(x) - - net = Net() - qat_net = quantize_qat(net, inplace=False, mapping={FloatExample: QATExample}) - assert isinstance(qat_net.example, QATExample) diff --git a/python_module/test/unit/quantization/test_fake_quant.py b/python_module/test/unit/quantization/test_fake_quant.py deleted file mode 100644 index 0fbd9eb1..00000000 --- a/python_module/test/unit/quantization/test_fake_quant.py +++ /dev/null @@ -1,80 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import numpy as np -import pytest - -import megengine as mge -import megengine._internal as mgb -from megengine.core import tensor -from megengine.quantization.fake_quant import TQT_Function -from megengine.quantization.internal_fake_quant import * -from megengine.test import assertTensorClose - - -class numpy_TQT_Function: - def __init__(self, lowerbound, upperbound): - super().__init__() - self.lowerbound = lowerbound - self.upperbound = upperbound - - def forward(self, inp, scale): - t = 2 ** scale - # t = F.maximum(t, 1e-4) - inp_scaled = inp / t - inp_clipped = np.maximum( - np.minimum(inp_scaled, self.upperbound), self.lowerbound - ) - inp_rounded = np.round(inp_clipped) - inp_flq = inp_rounded * t - self.saved_tensors = (inp_scaled, inp_rounded, t) - return inp_flq - - def backward(self, grad_inp_flq): - (inp_scaled, inp_rounded, t) = self.saved_tensors - mask_clip = (inp_scaled < -0.5 + self.lowerbound) + ( - inp_scaled > self.upperbound + 0.5 - ) # mask for accumulating the gradients of |data_scaled|>L - mask_quant = np.abs( - mask_clip - 1 - ) # mask for accumulating the gradients with |data_scaled|<=L - grad_quant = ( - grad_inp_flq * mask_quant * (inp_rounded - inp_scaled) - ) # gradient within |data_scaled|<=L - grad_clip = ( - grad_inp_flq * mask_clip * inp_rounded - ) # gradient with | data_scaled|>L - grad_s = grad_clip.sum() + grad_quant.sum() - # dL/ds = dL/dt * t * ln(2) - grad_s = grad_s * t * np.log(2) - grad_inp = grad_inp_flq * mask_quant - return grad_inp, grad_s - - -def test_TQT(): - f = TQT_Function(-127, 127) - nf = numpy_TQT_Function(-127, 127) - - def check_inp(a, b, c, a_np, b_np, c_np): - assertTensorClose( - f.forward(a, b).numpy(), nf.forward(a_np, b_np).astype("float32") - ) - c1, c2 = f.backward(c) - c1_np, c2_np = nf.backward(c_np) - assertTensorClose(c1.numpy(), c1_np.astype("float32")) - assertTensorClose(c2.numpy(), c2_np.astype("float32")) - - a = tensor() - b = tensor() - a_np = np.random.random((4, 3)).astype("float32") - b_np = np.random.random((1)).astype("float32") - a.set_value(a_np) - b.set_value(b_np) - check_inp(a, b, b, a_np, b_np, b_np) - - diff --git a/python_module/test/unit/random/test_random.py b/python_module/test/unit/random/test_random.py deleted file mode 100644 index 2e8023e8..00000000 --- a/python_module/test/unit/random/test_random.py +++ /dev/null @@ -1,162 +0,0 @@ -# -*- coding: utf-8 -*- -# MegEngine is Licensed under the Apache License, Version 2.0 (the "License") -# -# Copyright (c) 2014-2020 Megvii Inc. All rights reserved. -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -import numpy as np - -import megengine as mge -import megengine.functional as F -import megengine.jit as jit -import megengine.module as M -import megengine.random as R - - -def test_random_static_diff_result(): - @jit.trace(symbolic=True) - def graph_a(): - return R.uniform(5) + R.gaussian(5) - - @jit.trace(symbolic=True) - def graph_b(): - return R.uniform(5) + R.gaussian(5) - - a = graph_a() - b = graph_b() - assert np.any(a.numpy() != b.numpy()) - - -def test_random_static_same_result(): - @jit.trace(symbolic=True) - def graph_a(): - R.manual_seed(731) - return R.uniform(5) + R.gaussian(5) - - @jit.trace(symbolic=True) - def graph_b(): - R.manual_seed(731) - return R.uniform(5) + R.gaussian(5) - - a = graph_a() - b = graph_b() - assert np.all(a.numpy() == b.numpy()) - - -def test_random_dynamic_diff_result(): - a = R.uniform(5) + R.gaussian(5) - b = R.uniform(5) + R.gaussian(5) - assert np.any(a.numpy() != b.numpy()) - - -def test_random_dynamic_same_result(): - R.manual_seed(0) - a = R.uniform(5) + R.gaussian(5) - R.manual_seed(0) - b = R.uniform(5) + R.gaussian(5) - assert np.all(a.numpy() == b.numpy()) - - -def test_range_uniform_static_diff_result(): - @jit.trace(symbolic=True) - def graph_a(): - return R.uniform(5, low=-2, high=2) - - @jit.trace(symbolic=True) - def graph_b(): - return R.uniform(5, low=-2, high=2) - - a = graph_a() - b = graph_b() - assert np.any(a.numpy() != b.numpy()) - - -def test_range_uniform_static_same_result(): - @jit.trace(symbolic=True) - def graph_a(): - R.manual_seed(731) - return R.uniform(5, low=-2, high=2) - - @jit.trace(symbolic=True) - def graph_b(): - R.manual_seed(731) - return R.uniform(5, low=-2, high=2) - - a = graph_a() - b = graph_b() - assert np.all(a.numpy() == b.numpy()) - - -def test_range_uniform_dynamic_diff_result(): - a = R.uniform(5, low=-2, high=2) - b = R.uniform(5, low=-2, high=2) - assert np.any(a.numpy() != b.numpy()) - - -def test_range_uniform_dynamic_same_result(): - R.manual_seed(0) - a = R.uniform(5, low=-2, high=2) - R.manual_seed(0) - b = R.uniform(5, low=-2, high=2) - assert np.all(a.numpy() == b.numpy()) - - -def test_dropout_dynamic_diff_result(): - x = mge.ones(10) - a = F.dropout(x, 0.5) - b = F.dropout(x, 0.5) - assert np.any(a.numpy() != b.numpy()) - - -def test_dropout_dynamic_same_result(): - x = mge.ones(10) - R.manual_seed(0) - a = F.dropout(x, 0.5) - R.manual_seed(0) - b = F.dropout(x, 0.5) - assert np.all(a.numpy() == b.numpy()) - - -def test_M_dropout_static_diff_result(): - m = M.Dropout(0.5) - - @jit.trace(symbolic=True) - def graph_a(x): - return m(x) - - @jit.trace(symbolic=True) - def graph_b(x): - return m(x) - - x = np.ones(10, dtype="float32") - a = graph_a(x) - a = a.numpy().copy() - b = graph_b(x) - c = graph_a(x) - assert np.any(a != b.numpy()) - assert np.any(a != c.numpy()) - - -def test_M_dropout_static_same_result(): - m = M.Dropout(0.5) - - @jit.trace(symbolic=True) - def graph_a(x): - return m(x) - - @jit.trace(symbolic=True) - def graph_b(x): - return m(x) - - x = np.ones(10, dtype="float32") - R.manual_seed(0) - a = graph_a(x) - a = a.numpy().copy() - R.manual_seed(0) - b = graph_b(x) - R.manual_seed(0) # useless - c = graph_a(x) - assert np.all(a == b.numpy()) - assert np.any(a != c.numpy()) diff --git a/scripts/cmake-build/host_build.sh b/scripts/cmake-build/host_build.sh index 8a8f1508..d522c2ca 100755 --- a/scripts/cmake-build/host_build.sh +++ b/scripts/cmake-build/host_build.sh @@ -9,7 +9,6 @@ function usage() { echo "-t : Build with training mode, default inference only" echo "-m : Build with m32 mode(only for windows build), default m64" echo "-r : remove old build dir before make, default off" - echo "-n : enable new python runtime(valid when training mode with -t, default is legacy runtime)" echo "-h : show usage" echo "append other cmake config by export EXTRA_CMAKE_ARGS=..." echo "example: $0 -d" @@ -23,10 +22,9 @@ MGE_WINDOWS_BUILD_ARCH=x64 MGE_WINDOWS_BUILD_MARCH=m64 MGE_ARCH=x86_64 REMOVE_OLD_BUILD=false -MGE_BUILD_IMPERATIVE_RT=OFF echo "EXTRA_CMAKE_ARGS: ${EXTRA_CMAKE_ARGS}" -while getopts "rhdctmn" arg +while getopts "rhdctm" arg do case $arg in d) @@ -55,10 +53,6 @@ do MGE_WINDOWS_BUILD_MARCH=m32 MGE_ARCH=i386 ;; - n) - echo "Enable imperative python wrapper runtime" - MGE_BUILD_IMPERATIVE_RT=ON - ;; ?) echo "unkonw argument" usage @@ -107,7 +101,6 @@ function cmake_build() { cmake \ -DCMAKE_BUILD_TYPE=$BUILD_TYPE \ -DMGE_INFERENCE_ONLY=$MGE_INFERENCE_ONLY \ - -DMGE_BUILD_IMPERATIVE_RT=${MGE_BUILD_IMPERATIVE_RT} \ -DMGE_WITH_CUDA=$MGE_WITH_CUDA \ -DCMAKE_INSTALL_PREFIX=$INSTALL_DIR \ ${EXTRA_CMAKE_ARGS} \ @@ -244,7 +237,6 @@ function cmake_build_windows() { vcvarsall.bat $MGE_WINDOWS_BUILD_ARCH && cmake -G "Ninja" \ -DMGE_ARCH=$MGE_ARCH \ -DMGE_INFERENCE_ONLY=$MGE_INFERENCE_ONLY \ - -DMGE_BUILD_IMPERATIVE_RT=${MGE_BUILD_IMPERATIVE_RT} \ -DMGE_WITH_CUDA=$MGE_WITH_CUDA \ -DCMAKE_BUILD_TYPE=$BUILD_TYPE \ -DCMAKE_INSTALL_PREFIX:PATH=$INSTALL_DIR \ @@ -257,12 +249,6 @@ function cmake_build_windows() { ${WINDOWS_BUILD_TARGET}" } -if [ ${MGE_BUILD_IMPERATIVE_RT} = "ON" ] && [ ${MGE_INFERENCE_ONLY} = "ON" ]; then - echo "ERR: MGE_BUILD_IMPERATIVE_RT(-n) only valid when enable training mode(-t)" - echo "pls remove -n or add -t" - exit -1 -fi - if [[ $OS =~ "NT" ]]; then if [ ${MGE_ARCH} = "i386" ] && [ ${MGE_INFERENCE_ONLY} = "OFF" ]; then echo "ERR: training mode(-t) only support 64 bit mode" diff --git a/scripts/whl/BUILD_PYTHON_WHL_README.md b/scripts/whl/BUILD_PYTHON_WHL_README.md index 07e55feb..a9510072 100644 --- a/scripts/whl/BUILD_PYTHON_WHL_README.md +++ b/scripts/whl/BUILD_PYTHON_WHL_README.md @@ -7,9 +7,8 @@ ``` 1: enable rootless docker env, refs: https://docs.docker.com/engine/security/rootless/ - 2: cd ./scripts/whl/linux/manylinux2010 - 3: ./build_image.sh cpu - 4: ./build_image.sh cuda + 2: cd ./scripts/whl/manylinux2010 + 3: ./build_image.sh ``` @@ -60,12 +59,10 @@ MegBrain delivers `wheel` package with `manylinux2010` tag defined in [PEP-571](https://www.python.org/dev/peps/pep-0571/). ``` - ./build_wheel.sh cpu - - CUDA_ROOT_DIR=/path/to/cuda \ - CUDNN_ROOT_DIR=/path/to/cudnn \ - TENSORRT_ROOT_DIR=/path/to/tensorrt \ - ./build_wheel.sh cuda + export CUDA_ROOT_DIR=/path/to/cuda + export CUDNN_ROOT_DIR=/path/to/cudnn + export TENSORRT_ROOT_DIR=/path/to/tensorrt + ./scripts/whl/manylinux2010/build_wheel.sh ``` And you can find all of the outputs in `output` directory. @@ -73,10 +70,14 @@ If you just want to build for a specific Python verison, you can use `ALL_PYTHON` environment variable. eg: ``` - ALL_PYTHON=35m ./build_wheel.sh cpu + ALL_PYTHON=35m ./scripts/whl/manylinux2010/build_wheel.sh + ``` + If you just want to build with cpu only version, you can set `BUILD_WHL_CPU_ONLY` environment 'ON'. eg: + + ``` + BUILD_WHL_CPU_ONLY=ON ALL_PYTHON=35m ./scripts/whl/manylinux2010/build_wheel.sh ``` - Please append `imperative` to `build_wheel.sh` to use the new runtime, e.g., `./build_wheel.sh cpu imperative`. ## build for macos ``` ./scripts/whl/macos/macos_build_whl.sh @@ -86,11 +87,6 @@ ``` ALL_PYTHON=3.5.9 ./scripts/whl/macos/macos_build_whl.sh ``` - If you want to build with imperative rt, set env BUILD_IMPERATIVE="ON", eg: - - ``` - ALL_PYTHON=3.5.9 BUILD_IMPERATIVE="ON" ./scripts/whl/macos/macos_build_whl.sh - ``` ## build for windows ``` ./scripts/whl/windows/windows_build_whl.sh @@ -100,10 +96,8 @@ ``` ALL_PYTHON=3.5.4 ./scripts/whl/windows/windows_build_whl.sh ``` - If you want to build windows whl with cuda, also a specific Python verison. eg: + If you just want to build with cpu only version, you can set `BUILD_WHL_CPU_ONLY` environment 'ON'. eg: ``` - WINDOWS_WHL_WITH_CUDA="ON" ALL_PYTHON=3.5.4 ./scripts/whl/windows/windows_build_whl.sh + BUILD_WHL_CPU_ONLY='ON' ALL_PYTHON=3.5.4 ./scripts/whl/windows/windows_build_whl.sh ``` - If you want to build with imperative rt, set env BUILD_IMPERATIVE="ON", eg: - BUILD_IMPERATIVE="ON" WINDOWS_WHL_WITH_CUDA="ON" ALL_PYTHON=3.5.4 ./scripts/whl/windows/windows_build_whl.sh diff --git a/scripts/whl/macos/macos_build_whl.sh b/scripts/whl/macos/macos_build_whl.sh index a10912dd..ef421621 100755 --- a/scripts/whl/macos/macos_build_whl.sh +++ b/scripts/whl/macos/macos_build_whl.sh @@ -84,11 +84,6 @@ function config_python_env() { fi } -if [[ -z ${BUILD_IMPERATIVE} ]] -then - BUILD_IMPERATIVE="OFF" -fi - function do_build() { for ver in ${ALL_PYTHON} do @@ -116,65 +111,38 @@ function do_build() { #change PYTHON_LIBRARY and PYTHON_INCLUDE_DIR, so add #-r to remove build cache after a new ver build, which #will be more slow build than without -r - if [ ${BUILD_IMPERATIVE} = "ON" ]; then - echo "build whl with IMPERATIVE python rt" - ${SRC_DIR}/scripts/cmake-build/host_build.sh -t -n -r - else - echo "build whl with legacy python rt" - ${SRC_DIR}/scripts/cmake-build/host_build.sh -t -r - fi + echo "build whl with legacy python rt" + ${SRC_DIR}/scripts/cmake-build/host_build.sh -t -r #call setup.py BUILD_DIR=${SRC_DIR}/build_dir/host/MGE_WITH_CUDA_OFF/MGE_INFERENCE_ONLY_OFF/Release/build/ cd ${BUILD_DIR} - if [ -d "staging" ]; then - echo "remove old build cache file" - rm -rf staging - fi + rm -rf staging mkdir -p staging - if [ ${BUILD_IMPERATIVE} = "ON" ]; then - echo "build whl with IMPERATIVE python rt" - cp -a imperative/python/{megengine,setup.py,requires.txt,requires-style.txt,requires-test.txt} staging/ - cd ${BUILD_DIR}/staging/megengine/core - rt_file=`ls _imperative_rt.*.so` - echo "rt file is: ${rt_file}" - if [[ -z ${rt_file} ]] - then - echo "ERR: can not find valid rt file" - exit -1 - fi - llvm-strip -s ${rt_file} - mv ${rt_file} _imperative_rt.so - echo "check so valid or not..." - otool_out=`otool -L _imperative_rt.so` - if [[ "${otool_out}" =~ "ython" ]]; then - echo "ERR: invalid _imperative_rt.so which depend on python lib, detail: log" - echo ${otool_out} - exit -1 - else - echo "valid..." - fi + cp -a imperative/python/{megengine,setup.py,requires.txt,requires-style.txt,requires-test.txt} staging/ + cd ${BUILD_DIR}/staging/megengine/core + rt_file=`ls _imperative_rt.*.so` + echo "rt file is: ${rt_file}" + if [[ -z ${rt_file} ]] + then + echo "ERR: can not find valid rt file" + exit -1 + fi + llvm-strip -s ${rt_file} + mv ${rt_file} _imperative_rt.so + echo "check so valid or not..." + otool_out=`otool -L _imperative_rt.so` + if [[ "${otool_out}" =~ "ython" ]]; then + echo "ERR: invalid _imperative_rt.so which depend on python lib, detail: log" + echo ${otool_out} + exit -1 else - echo "build whl with legacy python rt" - - cp -a python_module/{megengine,setup.py,requires.txt,requires-style.txt,requires-test.txt} staging/ - cd ${BUILD_DIR}/staging/megengine/_internal - #FIXME: set lib suffix to dylib may be better, BUT we find after distutils.file_util.copy_file - #will change to .so at macos even we set suffix to dylib, at the same time, macos also support .so - echo "check so valid or not..." - llvm-strip -s _mgb.so - otool_out=`otool -L _mgb.so` - if [[ "${otool_out}" =~ "ython" ]]; then - echo "ERR: invalid _mgb.so which depend on python lib, detail: log" - echo ${otool_out} - exit -1 - else - echo "valid..." - fi + echo "valid..." fi + cd ${BUILD_DIR}/staging ${PYTHON_DIR}/bin/python3 setup.py bdist_wheel cd ${BUILD_DIR}/staging/dist/ diff --git a/scripts/whl/manylinux2010/build_wheel.sh b/scripts/whl/manylinux2010/build_wheel.sh index 02adf235..c4762356 100755 --- a/scripts/whl/manylinux2010/build_wheel.sh +++ b/scripts/whl/manylinux2010/build_wheel.sh @@ -6,7 +6,11 @@ OUTPUTDIR=$(readlink -f ${CWD}/output) USERID=$(id -u) TMPFS_ARGS="--tmpfs /tmp:exec" -IMPERATIVE=${2:-mgb} +BUILD_WHL_CPU_ONLY=${BUILD_WHL_CPU_ONLY} +if [[ -z ${BUILD_WHL_CPU_ONLY} ]] +then + BUILD_WHL_CPU_ONLY="OFF" +fi echo ${BASEDIR} pushd ${BASEDIR}/third_party >/dev/null @@ -16,84 +20,84 @@ popd >/dev/null cd ${CWD} mkdir -p ${OUTPUTDIR} -if [[ -z ${CUDA_ROOT_DIR} ]]; then - echo "Environment variable CUDA_ROOT_DIR not set." - exit -1 -fi -if [[ -z ${CUDNN_ROOT_DIR} ]]; then - echo "Environment variable CUDNN_ROOT_DIR not set." - exit -1 -fi -if [[ -z ${TENSORRT_ROOT_DIR} ]]; then - echo "Environment variable TENSORRT_ROOT_DIR not set." - exit -1 -fi - -## YOU SHOULD MODIFY CUDA VERSION AS BELOW WHEN UPGRADE -REQUIR_CUDA_VERSION="10010" -REQUIR_CUDNN_VERSION="7.6.3" -REQUIR_TENSORRT_VERSION="6.0.1.5" - -CUDA_ROOT_DIR_=${CUDA_ROOT_DIR%*/} -CUDNN_ROOT_DIR_=${CUDNN_ROOT_DIR%*/} -TENSORRT_ROOT_DIR_=${TENSORRT_ROOT_DIR%*/} - -CUDA_VERSION_PATH=${CUDA_ROOT_DIR_}/include/cuda.h -CUDNN_VERSION_PATH=${CUDNN_ROOT_DIR_}/include/cudnn.h -TENSORRT_VERSION_PATH=${TENSORRT_ROOT_DIR_}/include/NvInferVersion.h - -if [ ! -e $CUDA_VERSION_PATH ] ; then - echo file $CUDA_VERSION_PATH is not exist - echo please check the Environment must use CUDA-10.1 NO.$REQUIR_CUDA_VERSION - exit -1 -fi -if [ ! -e $CUDNN_VERSION_PATH ] ; then - echo file $CUDNN_VERSION_PATH is not exist - echo please check the Environment must use CUDNN-V$REQUIR_CUDNN_VERSION - exit -1 -fi -if [ ! -e $TENSORRT_VERSION_PATH ] ; then - echo file $TENSORRT_VERSION_PATH is not exist - echo please check the Environment must use TensorRT-$REQUIR_TENSORRT_VERSION - exit -1 -fi - -CUDA_VERSION_CONTEXT=$(head -85 ${CUDA_VERSION_PATH}) -CUDNN_VERSION_CONTEXT=$(head -62 ${CUDNN_VERSION_PATH}) -TENSORRT_VERSION_CONTEXT=$(tail -12 ${TENSORRT_VERSION_PATH}) - -CUDA_API_VERSION=$(echo $CUDA_VERSION_CONTEXT | grep -Eo "define __CUDA_API_VERSION * +([0-9]+)") -CUDA_VERSION=${CUDA_API_VERSION:0-5} -echo CUDA_VERSION:$CUDA_VERSION - -CUDNN_VERSION_MAJOR=$(echo $CUDNN_VERSION_CONTEXT | grep -Eo "define CUDNN_MAJOR * +([0-9]+)") -CUDNN_VERSION_MINOR=$(echo $CUDNN_VERSION_CONTEXT | grep -Eo "define CUDNN_MINOR * +([0-9]+)") -CUDNN_VERSION_PATCH=$(echo $CUDNN_VERSION_CONTEXT | grep -Eo "define CUDNN_PATCHLEVEL * +([0-9]+)") -CUDNN_VERSION=${CUDNN_VERSION_MAJOR:0-1}.${CUDNN_VERSION_MINOR:0-1}.${CUDNN_VERSION_PATCH:0-1} -echo CUDNN_VERSION:$CUDNN_VERSION - -TENSORRT_VERSION_MAJOR=$(echo $TENSORRT_VERSION_CONTEXT | grep -Eo "NV_TENSORRT_MAJOR * +([0-9]+)") -TENSORRT_VERSION_MINOR=$(echo $TENSORRT_VERSION_CONTEXT | grep -Eo "NV_TENSORRT_MINOR * +([0-9]+)") -TENSORRT_VERSION_PATCH=$(echo $TENSORRT_VERSION_CONTEXT | grep -Eo "NV_TENSORRT_PATCH * +([0-9]+)") -TENSORRT_VERSION_BUILD=$(echo $TENSORRT_VERSION_CONTEXT | grep -Eo "NV_TENSORRT_BUILD * +([0-9]+)") -TENSORRT_VERSION=${TENSORRT_VERSION_MAJOR:0-1}.${TENSORRT_VERSION_MINOR:0-1}.${TENSORRT_VERSION_PATCH:0-1}.${TENSORRT_VERSION_BUILD:0-1} -echo TENSORRT_VERSION:$TENSORRT_VERSION - -if [ $CUDA_VERSION != $REQUIR_CUDA_VERSION ] ; then - echo please check the Environment must use CUDA-10.1 NO.$REQUIR_CUDA_VERSION - exit -1 -fi - -if [ $CUDNN_VERSION != $REQUIR_CUDNN_VERSION ] ; then - echo please check the Environment must use CUDNN-V$REQUIR_CUDNN_VERSION - exit -1 +if [ ${BUILD_WHL_CPU_ONLY} = "OFF" ]; then + if [[ -z ${CUDA_ROOT_DIR} ]]; then + echo "Environment variable CUDA_ROOT_DIR not set." + exit -1 + fi + if [[ -z ${CUDNN_ROOT_DIR} ]]; then + echo "Environment variable CUDNN_ROOT_DIR not set." + exit -1 + fi + if [[ -z ${TENSORRT_ROOT_DIR} ]]; then + echo "Environment variable TENSORRT_ROOT_DIR not set." + exit -1 + fi + + ## YOU SHOULD MODIFY CUDA VERSION AS BELOW WHEN UPGRADE + REQUIR_CUDA_VERSION="10010" + REQUIR_CUDNN_VERSION="7.6.3" + REQUIR_TENSORRT_VERSION="6.0.1.5" + + CUDA_ROOT_DIR_=${CUDA_ROOT_DIR%*/} + CUDNN_ROOT_DIR_=${CUDNN_ROOT_DIR%*/} + TENSORRT_ROOT_DIR_=${TENSORRT_ROOT_DIR%*/} + + CUDA_VERSION_PATH=${CUDA_ROOT_DIR_}/include/cuda.h + CUDNN_VERSION_PATH=${CUDNN_ROOT_DIR_}/include/cudnn.h + TENSORRT_VERSION_PATH=${TENSORRT_ROOT_DIR_}/include/NvInferVersion.h + + if [ ! -e $CUDA_VERSION_PATH ] ; then + echo file $CUDA_VERSION_PATH is not exist + echo please check the Environment must use CUDA-10.1 NO.$REQUIR_CUDA_VERSION + exit -1 + fi + if [ ! -e $CUDNN_VERSION_PATH ] ; then + echo file $CUDNN_VERSION_PATH is not exist + echo please check the Environment must use CUDNN-V$REQUIR_CUDNN_VERSION + exit -1 + fi + if [ ! -e $TENSORRT_VERSION_PATH ] ; then + echo file $TENSORRT_VERSION_PATH is not exist + echo please check the Environment must use TensorRT-$REQUIR_TENSORRT_VERSION + exit -1 + fi + + CUDA_VERSION_CONTEXT=$(head -85 ${CUDA_VERSION_PATH}) + CUDNN_VERSION_CONTEXT=$(head -62 ${CUDNN_VERSION_PATH}) + TENSORRT_VERSION_CONTEXT=$(tail -12 ${TENSORRT_VERSION_PATH}) + + CUDA_API_VERSION=$(echo $CUDA_VERSION_CONTEXT | grep -Eo "define __CUDA_API_VERSION * +([0-9]+)") + CUDA_VERSION=${CUDA_API_VERSION:0-5} + echo CUDA_VERSION:$CUDA_VERSION + + CUDNN_VERSION_MAJOR=$(echo $CUDNN_VERSION_CONTEXT | grep -Eo "define CUDNN_MAJOR * +([0-9]+)") + CUDNN_VERSION_MINOR=$(echo $CUDNN_VERSION_CONTEXT | grep -Eo "define CUDNN_MINOR * +([0-9]+)") + CUDNN_VERSION_PATCH=$(echo $CUDNN_VERSION_CONTEXT | grep -Eo "define CUDNN_PATCHLEVEL * +([0-9]+)") + CUDNN_VERSION=${CUDNN_VERSION_MAJOR:0-1}.${CUDNN_VERSION_MINOR:0-1}.${CUDNN_VERSION_PATCH:0-1} + echo CUDNN_VERSION:$CUDNN_VERSION + + TENSORRT_VERSION_MAJOR=$(echo $TENSORRT_VERSION_CONTEXT | grep -Eo "NV_TENSORRT_MAJOR * +([0-9]+)") + TENSORRT_VERSION_MINOR=$(echo $TENSORRT_VERSION_CONTEXT | grep -Eo "NV_TENSORRT_MINOR * +([0-9]+)") + TENSORRT_VERSION_PATCH=$(echo $TENSORRT_VERSION_CONTEXT | grep -Eo "NV_TENSORRT_PATCH * +([0-9]+)") + TENSORRT_VERSION_BUILD=$(echo $TENSORRT_VERSION_CONTEXT | grep -Eo "NV_TENSORRT_BUILD * +([0-9]+)") + TENSORRT_VERSION=${TENSORRT_VERSION_MAJOR:0-1}.${TENSORRT_VERSION_MINOR:0-1}.${TENSORRT_VERSION_PATCH:0-1}.${TENSORRT_VERSION_BUILD:0-1} + echo TENSORRT_VERSION:$TENSORRT_VERSION + + if [ $CUDA_VERSION != $REQUIR_CUDA_VERSION ] ; then + echo please check the Environment must use CUDA-10.1 NO.$REQUIR_CUDA_VERSION + exit -1 + fi + + if [ $CUDNN_VERSION != $REQUIR_CUDNN_VERSION ] ; then + echo please check the Environment must use CUDNN-V$REQUIR_CUDNN_VERSION + exit -1 + fi + + if [ $TENSORRT_VERSION != $REQUIR_TENSORRT_VERSION ] ; then + echo please check the Environment must use TENSORRT-$REQUIR_TENSORRT_VERSION + exit -1 + fi fi -if [ $TENSORRT_VERSION != $REQUIR_TENSORRT_VERSION ] ; then - echo please check the Environment must use TENSORRT-$REQUIR_TENSORRT_VERSION - exit -1 -fi - -docker run -it --rm $TMPFS_ARGS -e UID=${USERID} -e LOCAL_VERSION=${LOCAL_VERSION} -e ALL_PYTHON=${ALL_PYTHON} -v ${CUDA_ROOT_DIR}:/usr/local/cuda -v ${CUDNN_ROOT_DIR}:/opt/cudnn -v ${TENSORRT_ROOT_DIR}:/opt/tensorrt -v ${BASEDIR}:/home/code -v ${OUTPUTDIR}:/home/output:rw env_manylinux2010:latest /home/code/scripts/whl/manylinux2010/do_build.sh $IMPERATIVE - - +docker run -it --rm $TMPFS_ARGS -e UID=${USERID} -e LOCAL_VERSION=${LOCAL_VERSION} -e BUILD_WHL_CPU_ONLY=${BUILD_WHL_CPU_ONLY} -e ALL_PYTHON=${ALL_PYTHON} -v ${CUDA_ROOT_DIR}:/usr/local/cuda -v ${CUDNN_ROOT_DIR}:/opt/cudnn -v ${TENSORRT_ROOT_DIR}:/opt/tensorrt -v ${BASEDIR}:/home/code -v ${OUTPUTDIR}:/home/output:rw env_manylinux2010:latest /home/code/scripts/whl/manylinux2010/do_build.sh diff --git a/scripts/whl/manylinux2010/do_build.sh b/scripts/whl/manylinux2010/do_build.sh index bf06afd0..10286006 100755 --- a/scripts/whl/manylinux2010/do_build.sh +++ b/scripts/whl/manylinux2010/do_build.sh @@ -5,80 +5,70 @@ then ALL_PYTHON="35m 36m 37m 38" fi -EXTRA_CMAKE_ARGS= -if [[ "$1" == imperative ]]; then - BUILD_IMPERATIVE=ON - SO_NAME=_imperative_rt - SO_PATH=megengine/core -else - BUILD_IMPERATIVE=OFF - SO_NAME=_mgb - SO_PATH=megengine/_internal +BUILD_WHL_CPU_ONLY=${BUILD_WHL_CPU_ONLY} +if [[ -z ${BUILD_WHL_CPU_ONLY} ]] +then + BUILD_WHL_CPU_ONLY="OFF" +fi + +SRC_DIR=$(readlink -f "`dirname $0`/../../../") +BUILD_DIR=${SRC_DIR}/build_dir/host/MGE_WITH_CUDA_OFF/MGE_INFERENCE_ONLY_OFF/Release/build/ +if [ ${BUILD_WHL_CPU_ONLY} = "OFF" ]; then + BUILD_DIR=${SRC_DIR}/build_dir/host/MGE_WITH_CUDA_ON/MGE_INFERENCE_ONLY_OFF/Release/build/ fi +SO_NAME=_imperative_rt +SO_PATH=megengine/core +NEW_LIB_PATH=core/lib for ver in ${ALL_PYTHON} do python_ver=${ver:0:2} - BUILD_DIR=/tmp/build_megengine/python${python_ver} MAJOR=${python_ver:0:1} MINOR=${ver:1} PYTHON_DIR=/opt/python/cp${python_ver}-cp${ver}/ EXT_NAME=${SO_NAME}.cpython-${ver}-x86_64-linux-gnu.so - mkdir -p ${BUILD_DIR} - pushd ${BUILD_DIR} >/dev/null - MGE_CMAKE_FLAGS="-DMGE_WITH_DISTRIBUTED=ON \ - -DMGE_WITH_CUDA=ON \ - -DCMAKE_PREFIX_PATH=${PYTHON_DIR} \ - -DCMAKE_INSTALL_PREFIX=/home/output " - if [[ "$BUILD_IMPERATIVE" == ON ]]; then - MGE_CMAKE_FLAGS+=" -DMGE_BUILD_IMPERATIVE_RT=ON \ - -DPYTHON_EXECUTABLE=${PYTHON_DIR}/bin/python3" - else - MGE_CMAKE_FLAGS+=" -DPYTHON_LIBRARY=${PYTHON_DIR}lib/ \ - -DPYTHON_INCLUDE_DIR=${PYTHON_DIR}include/python${MAJOR}.${MINOR}" - fi - cmake /home/code ${MGE_CMAKE_FLAGS} ${EXTRA_CMAKE_ARGS} - make -j$(nproc) VERBOSE=1 - make install - mkdir -p staging - mkdir -p /home/output/debug - if [[ "$BUILD_IMPERATIVE" == ON ]]; then - cp -a imperative/python/{megengine,setup.py,requires.txt,requires-style.txt,requires-test.txt} staging/ - else - cp -a python_module/{megengine,setup.py,requires.txt,requires-style.txt,requires-test.txt} staging/ - fi - pushd dnn/cuda-stub/ >/dev/null - strip -s libcuda.so - ln -sf libcuda.so libcuda.so.1 - popd >/dev/null - pushd staging >/dev/null - pushd ${SO_PATH} >/dev/null - SO_NAME_EXT=${SO_NAME}.so - objcopy --only-keep-debug ${SO_NAME_EXT} ${EXT_NAME}.dbg - strip -s ${SO_NAME_EXT} - objcopy --add-gnu-debuglink=${EXT_NAME}.dbg ${SO_NAME_EXT} - cp -a ${EXT_NAME}.dbg /home/output/debug - mkdir -p lib/ucx - cp -L /usr/local/cuda/lib*/libnvrtc-builtins.so lib - cp -L ${BUILD_DIR}/third_party/MegRay/third_party/ucx/lib/ucx/*.so lib/ucx/ - strip -s lib/ucx/*.so - popd >/dev/null - ${PYTHON_DIR}/bin/python setup.py bdist_wheel - popd >/dev/null - popd >/dev/null - pushd /home/output >/dev/null - if [[ "$BUILD_IMPERATIVE" == ON ]]; then - NEW_LIB_PATH=core/lib - else - NEW_LIB_PATH=_internal/lib - fi - LD_LIBRARY_PATH=${BUILD_DIR}/dnn/cuda-stub:$LD_LIBRARY_PATH auditwheel repair -L ${NEW_LIB_PATH} ${BUILD_DIR}/staging/dist/Meg*.whl - chown -R ${UID}.${UID} . - popd >/dev/null - rm -rf ${BUILD_DIR} -done + export EXTRA_CMAKE_ARGS="${EXTRA_CMAKE_ARGS} -DCMAKE_BUILD_TYPE=RelWithDebInfo" + export EXTRA_CMAKE_ARGS="${EXTRA_CMAKE_ARGS} -DCMAKE_PREFIX_PATH=${PYTHON_DIR}" + export EXTRA_CMAKE_ARGS="${EXTRA_CMAKE_ARGS} -DPYTHON_EXECUTABLE=${PYTHON_DIR}/bin/python3" + export EXTRA_CMAKE_ARGS="${EXTRA_CMAKE_ARGS} -DPYTHON_LIBRARY=${PYTHON_DIR}lib/" + export EXTRA_CMAKE_ARGS="${EXTRA_CMAKE_ARGS} -DPYTHON_INCLUDE_DIR=${PYTHON_DIR}include/python${MAJOR}.${MINOR}" + + if [ ${BUILD_WHL_CPU_ONLY} = "OFF" ]; then + ${SRC_DIR}/scripts/cmake-build/host_build.sh -c -t -r + else + ${SRC_DIR}/scripts/cmake-build/host_build.sh -t -r + fi + cd ${BUILD_DIR} + rm -rf staging + mkdir -p staging + cp -a imperative/python/{megengine,setup.py,requires.txt,requires-style.txt,requires-test.txt} staging/ -pushd /home/code/dnn/scripts >/dev/null -rm -rf __pycache__ -popd >/dev/null + + if [ ${BUILD_WHL_CPU_ONLY} = "OFF" ]; then + cd ${BUILD_DIR}/dnn/cuda-stub/ + strip -s libcuda.so + ln -sf libcuda.so libcuda.so.1 + fi + + cd ${BUILD_DIR}/staging/${SO_PATH} + SO_NAME_EXT=${SO_NAME}.so + objcopy --only-keep-debug ${SO_NAME_EXT} ${EXT_NAME}.dbg + strip -s ${SO_NAME_EXT} + objcopy --add-gnu-debuglink=${EXT_NAME}.dbg ${SO_NAME_EXT} + mkdir -p lib/ucx + + if [ ${BUILD_WHL_CPU_ONLY} = "OFF" ]; then + cp -L /usr/local/cuda/lib*/libnvrtc-builtins.so lib + cp -L ${BUILD_DIR}/third_party/MegRay/third_party/ucx/lib/ucx/*.so lib/ucx/ + strip -s lib/ucx/*.so + fi + + cd ${BUILD_DIR}/staging/ + ${PYTHON_DIR}/bin/python setup.py bdist_wheel + cd /home/output + LD_LIBRARY_PATH=${BUILD_DIR}/dnn/cuda-stub:$LD_LIBRARY_PATH auditwheel repair -L ${NEW_LIB_PATH} ${BUILD_DIR}/staging/dist/Meg*.whl + chown -R ${UID}.${UID} . + # compat for root-less docker env to remove output at host side + chmod -R 777 . +done diff --git a/scripts/whl/windows/windows_build_whl.sh b/scripts/whl/windows/windows_build_whl.sh index 1e1d553a..d7fd0b86 100755 --- a/scripts/whl/windows/windows_build_whl.sh +++ b/scripts/whl/windows/windows_build_whl.sh @@ -58,9 +58,10 @@ function config_python_env() { PYTHON_INCLUDE_DIR=${PYTHON_DIR}/include } -if [[ -z ${WINDOWS_WHL_WITH_CUDA} ]] +BUILD_WHL_CPU_ONLY=${BUILD_WHL_CPU_ONLY} +if [[ -z ${BUILD_WHL_CPU_ONLY} ]] then - WINDOWS_WHL_WITH_CUDA="OFF" + BUILD_WHL_CPU_ONLY="OFF" fi @@ -86,32 +87,23 @@ function depend_real_copy() { function copy_more_dll() { # for python whl real use - if [ ${BUILD_IMPERATIVE} = "ON" ]; then - echo "config BUILD_IMPERATIVE core lib dir" - CP_WHL_DST=${BUILD_DIR}/staging/megengine/core/lib - else - echo "config legacy python lib dir" - CP_WHL_DST=${BUILD_DIR}/staging/megengine/_internal/lib - fi - rm -rf ${CP_WHL_DST} - mkdir ${CP_WHL_DST} + echo "config BUILD_IMPERATIVE core lib dir" + CP_WHL_DST_IMP=${BUILD_DIR}/staging/megengine/core/lib + rm -rf ${CP_WHL_DST_IMP} + mkdir ${CP_WHL_DST_IMP} + # workround for cpu-only version import failed, use a # empty.file to triger setup.py to create a null empty - echo "empty" > ${CP_WHL_DST}/empty.file + echo "empty" > ${CP_WHL_DST_IMP}/empty.file - if [ ${WINDOWS_WHL_WITH_CUDA} = "ON" ]; then + if [ ${BUILD_WHL_CPU_ONLY} = "OFF" ]; then echo "copy nvidia lib to whl use...." - depend_real_copy ${CP_WHL_DST} + depend_real_copy ${CP_WHL_DST_IMP} fi } -if [[ -z ${BUILD_IMPERATIVE} ]] -then - BUILD_IMPERATIVE="OFF" -fi - function do_build() { for ver in ${ALL_PYTHON} do @@ -144,14 +136,8 @@ function do_build() { #-r to remove build cache after a new ver build, which #will be more slow build than without -r BUILD_ARGS=" -t -r" - if [ ${BUILD_IMPERATIVE} = "ON" ]; then - echo "build whl with IMPERATIVE python rt" - BUILD_ARGS="${BUILD_ARGS} -n " - else - echo "build whl with legacy python rt" - fi - if [ ${WINDOWS_WHL_WITH_CUDA} = "ON" ]; then + if [ ${BUILD_WHL_CPU_ONLY} = "OFF" ]; then echo "build windows whl with cuda" BUILD_ARGS="${BUILD_ARGS} -c " else @@ -161,39 +147,27 @@ function do_build() { echo "host_build.sh BUILD_ARGS: ${BUILD_ARGS}" ${SRC_DIR}/scripts/cmake-build/host_build.sh ${BUILD_ARGS} - #call setup.py BUILD_DIR=${SRC_DIR}/build_dir/host/build/ cd ${BUILD_DIR} - if [ -d "staging" ]; then - echo "remove old build cache file" - rm -rf staging - fi + rm -rf staging mkdir -p staging - - if [ ${BUILD_IMPERATIVE} = "ON" ]; then - echo "build whl with IMPERATIVE python rt" - cp -a imperative/python/{megengine,setup.py,requires.txt,requires-style.txt,requires-test.txt} staging/ - cd ${BUILD_DIR}/staging/megengine/core - rt_file=`ls _imperative_rt.*.pyd` - echo "rt file is: ${rt_file}" - if [[ -z ${rt_file} ]] - then - echo "ERR: can not find valid rt file" - exit -1 - fi - llvm-strip -s ${rt_file} - mv ${rt_file} _imperative_rt.pyd - else - echo "build whl with legacy python rt" - - cp -a python_module/{megengine,setup.py,requires.txt,requires-style.txt,requires-test.txt} staging/ - cd ${BUILD_DIR}/staging/megengine/_internal - llvm-strip -s _mgb.pyd + cp -a imperative/python/{megengine,setup.py,requires.txt,requires-style.txt,requires-test.txt} staging/ + cd ${BUILD_DIR}/staging/megengine/core + rt_file=`ls _imperative_rt.*.pyd` + echo "rt file is: ${rt_file}" + if [[ -z ${rt_file} ]] + then + echo "ERR: can not find valid rt file" + exit -1 fi + llvm-strip -s ${rt_file} + mv ${rt_file} _imperative_rt.pyd + copy_more_dll cd ${BUILD_DIR}/staging + echo "call setup.py now" ${PYTHON_DIR}/python3 setup.py bdist_wheel cp ${BUILD_DIR}/staging/dist/Meg*.whl ${WINDOWS_WHL_HOME}/

      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