From 68dbfbf073a2de97f8c683f81ef48312a2f9123d Mon Sep 17 00:00:00 2001 From: ytreblefan <1814436734@qq.com> Date: Fri, 13 Oct 2023 00:19:20 +0800 Subject: [PATCH] =?UTF-8?q?yolov5=E8=BE=85=E5=8A=A9=E9=A9=BE=E9=A9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../YOLOv5driver_assistant_system/.project | 8 + .../README_CN.md | 87 ++ .../common/__init__.py | 0 .../common/atc_cfg/compression_nms_op.cfg | 7 + .../common/atc_cfg/compression_nms_script.cfg | 7 + .../common/atc_cfg/fusion.cfg | 1 + .../common/atc_cfg/simple_config.cfg | 1 + .../common/atc_cfg/skip_layers.cfg | 13 + .../common/patch/v2.0.patch | 78 ++ .../common/patch/v3.1.patch | 74 ++ .../common/patch/v4.0.patch | 87 ++ .../common/patch/v5.0.patch | 73 ++ .../common/patch/v6.0.patch | 29 + .../common/patch/v6.1.patch | 29 + .../common/quantify/__init__.py | 0 .../common/quantify/calib_img_list.txt | 16 + .../common/quantify/gen_calib_data.py | 57 + .../common/util/__init__.py | 0 .../common/util/add_nms.py | 110 ++ .../common/util/dataset.py | 170 +++ .../common/util/model.py | 105 ++ .../YOLOv5driver_assistant_system/model/.keep | 0 .../model/aipp_nv12.cfg | 28 + .../model/fusion_result.json | 103 ++ .../task_pid_4815_5026.txt | 14 + .../task_pid_4815_5027.txt | 7 + .../task_pid_4815_5028.txt | 6 + .../task_pid_4815_5029.txt | 7 + .../task_pid_4815_5030.txt | 7 + .../task_pid_4815_5031.txt | 3 + .../task_pid_4815_5032.txt | 5 + .../task_pid_4815_5033.txt | 16 + .../scripts/.keep | 0 .../scripts/object_detection.conf | 18 + .../scripts/sample_run.sh | 24 + .../YOLOv5driver_assistant_system/src/.keep | 0 .../src/DisAndYolov5.py | 281 +++++ .../src/configure.json | 15 + .../src/filename.npy | 1 + .../src/model.yaml | 12 + .../src/trafficline.py | 156 +++ .../src/yolov5.py | 120 ++ .../src/yolov5detect.py | 128 ++ .../utils/__init__.py | 37 + .../utils/activations.py | 101 ++ .../utils/augmentations.py | 277 +++++ .../utils/autoanchor.py | 165 +++ .../utils/autobatch.py | 57 + .../utils/aws/__init__.py | 0 .../utils/aws/mime.sh | 26 + .../utils/aws/resume.py | 40 + .../utils/aws/userdata.sh | 27 + .../utils/benchmarks.py | 92 ++ .../utils/callbacks.py | 78 ++ .../utils/datasets.py | 1037 +++++++++++++++++ .../utils/downloads.py | 153 +++ .../utils/flask_rest_api/README.md | 73 ++ .../utils/flask_rest_api/example_request.py | 13 + .../utils/flask_rest_api/restapi.py | 37 + .../utils/general.py | 880 ++++++++++++++ .../utils/google_app_engine/Dockerfile | 25 + .../additional_requirements.txt | 4 + .../utils/google_app_engine/app.yaml | 14 + .../utils/loggers/__init__.py | 168 +++ .../utils/loggers/wandb/README.md | 152 +++ .../utils/loggers/wandb/__init__.py | 0 .../utils/loggers/wandb/log_dataset.py | 27 + .../utils/loggers/wandb/sweep.py | 41 + .../utils/loggers/wandb/sweep.yaml | 143 +++ .../utils/loggers/wandb/wandb_utils.py | 562 +++++++++ .../utils/loss.py | 222 ++++ .../utils/metrics.py | 342 ++++++ .../utils/plots.py | 471 ++++++++ .../utils/torch_utils.py | 329 ++++++ 74 files changed, 7496 insertions(+) create mode 100644 python/contrib/YOLOv5driver_assistant_system/.project create mode 100644 python/contrib/YOLOv5driver_assistant_system/README_CN.md create mode 100644 python/contrib/YOLOv5driver_assistant_system/common/__init__.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/common/atc_cfg/compression_nms_op.cfg create mode 100644 python/contrib/YOLOv5driver_assistant_system/common/atc_cfg/compression_nms_script.cfg create mode 100644 python/contrib/YOLOv5driver_assistant_system/common/atc_cfg/fusion.cfg create mode 100644 python/contrib/YOLOv5driver_assistant_system/common/atc_cfg/simple_config.cfg create mode 100644 python/contrib/YOLOv5driver_assistant_system/common/atc_cfg/skip_layers.cfg create mode 100644 python/contrib/YOLOv5driver_assistant_system/common/patch/v2.0.patch create mode 100644 python/contrib/YOLOv5driver_assistant_system/common/patch/v3.1.patch create mode 100644 python/contrib/YOLOv5driver_assistant_system/common/patch/v4.0.patch create mode 100644 python/contrib/YOLOv5driver_assistant_system/common/patch/v5.0.patch create mode 100644 python/contrib/YOLOv5driver_assistant_system/common/patch/v6.0.patch create mode 100644 python/contrib/YOLOv5driver_assistant_system/common/patch/v6.1.patch create mode 100644 python/contrib/YOLOv5driver_assistant_system/common/quantify/__init__.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/common/quantify/calib_img_list.txt create mode 100644 python/contrib/YOLOv5driver_assistant_system/common/quantify/gen_calib_data.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/common/util/__init__.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/common/util/add_nms.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/common/util/dataset.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/common/util/model.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/model/.keep create mode 100644 python/contrib/YOLOv5driver_assistant_system/model/aipp_nv12.cfg create mode 100644 python/contrib/YOLOv5driver_assistant_system/model/fusion_result.json create mode 100644 python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5026.txt create mode 100644 python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5027.txt create mode 100644 python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5028.txt create mode 100644 python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5029.txt create mode 100644 python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5030.txt create mode 100644 python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5031.txt create mode 100644 python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5032.txt create mode 100644 python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5033.txt create mode 100644 python/contrib/YOLOv5driver_assistant_system/scripts/.keep create mode 100644 python/contrib/YOLOv5driver_assistant_system/scripts/object_detection.conf create mode 100644 python/contrib/YOLOv5driver_assistant_system/scripts/sample_run.sh create mode 100644 python/contrib/YOLOv5driver_assistant_system/src/.keep create mode 100644 python/contrib/YOLOv5driver_assistant_system/src/DisAndYolov5.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/src/configure.json create mode 100644 python/contrib/YOLOv5driver_assistant_system/src/filename.npy create mode 100644 python/contrib/YOLOv5driver_assistant_system/src/model.yaml create mode 100644 python/contrib/YOLOv5driver_assistant_system/src/trafficline.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/src/yolov5.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/src/yolov5detect.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/__init__.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/activations.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/augmentations.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/autoanchor.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/autobatch.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/aws/__init__.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/aws/mime.sh create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/aws/resume.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/aws/userdata.sh create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/benchmarks.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/callbacks.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/datasets.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/downloads.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/flask_rest_api/README.md create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/flask_rest_api/example_request.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/flask_rest_api/restapi.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/general.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/google_app_engine/Dockerfile create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/google_app_engine/additional_requirements.txt create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/google_app_engine/app.yaml create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/loggers/__init__.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/loggers/wandb/README.md create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/loggers/wandb/__init__.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/loggers/wandb/log_dataset.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/loggers/wandb/sweep.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/loggers/wandb/sweep.yaml create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/loggers/wandb/wandb_utils.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/loss.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/metrics.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/plots.py create mode 100644 python/contrib/YOLOv5driver_assistant_system/utils/torch_utils.py diff --git a/python/contrib/YOLOv5driver_assistant_system/.project b/python/contrib/YOLOv5driver_assistant_system/.project new file mode 100644 index 000000000..ac1f7bac0 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/.project @@ -0,0 +1,8 @@ +{ + "type": "Ascend ACL App", + "project_type": "Custom", + "project_desc": "", + "target": "", + "target_id": "", + "adk_version": "1.73.5.1.B050" +} \ No newline at end of file diff --git a/python/contrib/YOLOv5driver_assistant_system/README_CN.md b/python/contrib/YOLOv5driver_assistant_system/README_CN.md new file mode 100644 index 000000000..884c40bcd --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/README_CN.md @@ -0,0 +1,87 @@ +本样例为大家学习昇腾软件栈提供参考,非商业目的! +## 目标检测样例 +功能:使用yolov5目标检测搭建辅助驾驶系统,包括车道线识别,测算前车距离,路标、车辆识别功能。 +样例输入:树莓摄像头视频。 +样例输出:presenter界面展现检测结果。 + +### 前置条件 +请检查以下条件要求是否满足,如不满足请按照备注进行相应处理。如果CANN版本升级,请同步检查第三方依赖是否需要重新安装(5.0.4及以上版本第三方依赖和5.0.4以下版本有差异,需要重新安装)。 +| 条件 | 要求 | 备注 | +|---|---|---| +| CANN版本 | >=5.0.4 | 请参考CANN样例仓介绍中的[安装步骤](https://gitee.com/ascend/samples#%E5%AE%89%E8%A3%85)完成CANN安装,如果CANN低于要求版本请根据[版本说明](https://gitee.com/ascend/samples/blob/master/README_CN.md#%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E)切换samples仓到对应CANN版本 | +| 硬件要求 | Atlas200DK/Atlas300([ai1s](https://support.huaweicloud.com/productdesc-ecs/ecs_01_0047.html#ecs_01_0047__section78423209366)) | 当前已在Atlas200DK和Atlas300测试通过,产品说明请参考[硬件平台](https://ascend.huawei.com/zh/#/hardware/product) ,其他产品可能需要另做适配| +| 第三方依赖 | python-acllite | 请参考[第三方依赖安装指导(python样例)](../../../environment)选择需要的依赖完成安装 | + +### 样例准备 + +1. 获取源码包。 + + 可以使用以下两种方式下载,请选择其中一种进行源码准备。 + - 命令行方式下载(下载时间较长,但步骤简单)。 + ``` + # 开发环境,非root用户命令行中执行以下命令下载源码仓。 + cd ${HOME} + git clone https://gitee.com/ascend/samples.git + ``` + **注:如果需要切换到其它tag版本,以v0.5.0为例,可执行以下命令。** + ``` + git checkout v0.5.0 + ``` + - 压缩包方式下载(下载时间较短,但步骤稍微复杂)。 + **注:如果需要下载其它版本代码,请先请根据前置条件说明进行samples仓分支切换。** + ``` + # 1. samples仓右上角选择 【克隆/下载】 下拉框并选择 【下载ZIP】。 + # 2. 将ZIP包上传到开发环境中的普通用户家目录中,【例如:${HOME}/ascend-samples-master.zip】。 + # 3. 开发环境中,执行以下命令,解压zip包。 + cd ${HOME} + unzip ascend-samples-master.zip + ``` + +2. 获取此应用中所需要的原始网络模型。 + | **模型名称** | **模型说明** | **模型下载路径** | + | ------------ | --------------------------------- | ------------------------------------------------------------ | + | yolov5s | 是基于pytorch的yolov5目标检测模型。 | 请参考[https://github.com/ultralytics/yolov5](https://github.com/ultralytics/yolov5)。 | + + ``` + # 为了方便下载,在这里直接给出原始模型下载及模型转换命令,可以直接拷贝执行。也可以参照上表在modelzoo中下载并手工转换,以了解更多细节。 + cd ${HOME}/samples/python/contrib/YOLOv5_driver_assistant_system/model + wget https://github.com/ultralytics/yolov5/releases/download/v7.0/yolov5s.pt + atc --model=yolov5s.onnx + --framework=5 + --output=yolov5 + --soc_version=Ascend310 + --insert_op_conf=aipp_nv12.cfg + --input_shape="images:1,3,640,640" + --output_type=FP16 --input_format=NCHW + ``` + +### 样例运行 + +1. 执行以下命令,将开发环境的 **object_detection_camera** 目录上传到运行环境中,例如 **/home/HwHiAiUser**,并以HwHiAiUser(运行用户)登录运行环境(Host)。 + ``` + # 【xxx.xxx.xxx.xxx】为运行环境ip,200DK在USB连接时一般为192.168.1.2,300(ai1s)为对应的公网ip。 + scp -r $HOME/samples/python/contribute/YOLOv5_driver_assistant_system HwHiAiUser@xxx.xxx.xxx.xxx:/home/HwHiAiUser + ssh HwHiAiUser@xxx.xxx.xxx.xxx + cd $HOME/samples/python/contribute/YOLOv5_driver_assistant_system/script + ``` + +2. 运行样例。 + ``` + bash sample_run.sh + ``` + +### 查看结果 + +1. 打开presentserver网页界面。 + - 使用产品为200DK开发者板。 + 打开启动Presenter Server服务时提示的URL即可。 + - 使用产品为300加速卡(ai1s云端推理环境)。 + **以300加速卡(ai1s)内网ip为192.168.0.194,公网ip为124.70.8.192举例说明。** + 启动Presenter Server服务时提示为Please visit [http://192.168.0.194:7009](http://192.168.0.194:7009/) for display server。 + 只需要将URL中的内网ip:192.168.0.194替换为公网ip:124.70.8.192,则URL为 [http://124.70.8.192:7009。](http://124.70.8.192:7009。/) + 然后在windows下的浏览器中打开URL即可。 +2. 等待Presenter Agent传输数据给服务端,单击“Refresh“刷新,当有数据时相应的Channel 的Status变成绿色。 +3. 单击右侧对应的View Name链接,查看结果。 + +### 常见错误 +请参考[常见问题定位](https://gitee.com/ascend/samples/wikis/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E5%AE%9A%E4%BD%8D/%E4%BB%8B%E7%BB%8D)对遇到的错误进行排查。如果wiki中不包含,请在samples仓提issue反馈。 \ No newline at end of file diff --git a/python/contrib/YOLOv5driver_assistant_system/common/__init__.py b/python/contrib/YOLOv5driver_assistant_system/common/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/python/contrib/YOLOv5driver_assistant_system/common/atc_cfg/compression_nms_op.cfg b/python/contrib/YOLOv5driver_assistant_system/common/atc_cfg/compression_nms_op.cfg new file mode 100644 index 000000000..fa2d2d9a6 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/common/atc_cfg/compression_nms_op.cfg @@ -0,0 +1,7 @@ +calibration: +{ + input_data_dir: calib_data/images_bs16.bin,calib_data/img_info_bs16.bin + input_shape: images:16,3,640,640;img_info:16,4 + config_file: common/atc_cfg/simple_config.cfg + infer_soc: Ascend310P3 +} \ No newline at end of file diff --git a/python/contrib/YOLOv5driver_assistant_system/common/atc_cfg/compression_nms_script.cfg b/python/contrib/YOLOv5driver_assistant_system/common/atc_cfg/compression_nms_script.cfg new file mode 100644 index 000000000..51cdd77d1 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/common/atc_cfg/compression_nms_script.cfg @@ -0,0 +1,7 @@ +calibration: +{ + input_data_dir: calib_data/images_bs16.bin + input_shape: images:16,3,640,640 + config_file: common/atc_cfg/simple_config.cfg + infer_soc: Ascend310P3 +} \ No newline at end of file diff --git a/python/contrib/YOLOv5driver_assistant_system/common/atc_cfg/fusion.cfg b/python/contrib/YOLOv5driver_assistant_system/common/atc_cfg/fusion.cfg new file mode 100644 index 000000000..0436d5488 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/common/atc_cfg/fusion.cfg @@ -0,0 +1 @@ +TbeConvDequantSigmoidMulAddFusionPass:on \ No newline at end of file diff --git a/python/contrib/YOLOv5driver_assistant_system/common/atc_cfg/simple_config.cfg b/python/contrib/YOLOv5driver_assistant_system/common/atc_cfg/simple_config.cfg new file mode 100644 index 000000000..2c5b8a290 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/common/atc_cfg/simple_config.cfg @@ -0,0 +1 @@ +skip_layers: [] \ No newline at end of file diff --git a/python/contrib/YOLOv5driver_assistant_system/common/atc_cfg/skip_layers.cfg b/python/contrib/YOLOv5driver_assistant_system/common/atc_cfg/skip_layers.cfg new file mode 100644 index 000000000..bc4e553d4 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/common/atc_cfg/skip_layers.cfg @@ -0,0 +1,13 @@ +##### nms_op +## yolov5n-6.1 +skip_layers : ["Conv_0","Conv_3","Conv_155","Conv_198","Conv_175","Conv_199","Conv_195","Conv_200"] + +## yolov5l-6.1 +skip_layers : ["Conv_0","Conv_3","Conv_277","Conv_344","Conv_309","Conv_345","Conv_341","Conv_346"] + +##### nms_script +## yolov5n-6.1 +skip_layers : ["Conv_0","Conv_3","Conv_155","Conv_198","Conv_175","Conv_297","Conv_195","Conv_396"] + +## yolov5l-6.1 +skip_layers : ["Conv_0","Conv_3","Conv_277","Conv_344","Conv_309","Conv_443","Conv_341","Conv_542"] \ No newline at end of file diff --git a/python/contrib/YOLOv5driver_assistant_system/common/patch/v2.0.patch b/python/contrib/YOLOv5driver_assistant_system/common/patch/v2.0.patch new file mode 100644 index 000000000..27035452f --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/common/patch/v2.0.patch @@ -0,0 +1,78 @@ +diff --git a/models/export.py b/models/export.py +index 2097df5..a6ccc37 100644 +--- a/models/export.py ++++ b/models/export.py +@@ -14,6 +14,8 @@ if __name__ == '__main__': + parser.add_argument('--weights', type=str, default='./yolov5s.pt', help='weights path') + parser.add_argument('--img-size', nargs='+', type=int, default=[640, 640], help='image size') + parser.add_argument('--batch-size', type=int, default=1, help='batch size') ++ parser.add_argument('--opset', type=int, default=11, help='ONNX: opset version') ++ parser.add_argument('--dynamic', action='store_true', help='ONNX: dynamic axes') + opt = parser.parse_args() + opt.img_size *= 2 if len(opt.img_size) == 1 else 1 # expand + print(opt) +@@ -28,16 +30,6 @@ if __name__ == '__main__': + model.model[-1].export = True # set Detect() layer export=True + y = model(img) # dry run + +- # TorchScript export +- try: +- print('\nStarting TorchScript export with torch %s...' % torch.__version__) +- f = opt.weights.replace('.pt', '.torchscript.pt') # filename +- ts = torch.jit.trace(model, img) +- ts.save(f) +- print('TorchScript export success, saved as %s' % f) +- except Exception as e: +- print('TorchScript export failure: %s' % e) +- + # ONNX export + try: + import onnx +@@ -45,29 +37,18 @@ if __name__ == '__main__': + print('\nStarting ONNX export with onnx %s...' % onnx.__version__) + f = opt.weights.replace('.pt', '.onnx') # filename + model.fuse() # only for ONNX +- torch.onnx.export(model, img, f, verbose=False, opset_version=12, input_names=['images'], +- output_names=['classes', 'boxes'] if y is None else ['output']) ++ torch.onnx.export(model, img, f, verbose=False, opset_version=opt.opset, input_names=['images'], ++ output_names=['classes', 'boxes'] if y is None else ['output'], ++ dynamic_axes={'images': {0: 'batch', 2: 'height', 3: 'width'}, # size(1,3,640,640) ++ 'output': {0: 'batch'}} if opt.dynamic else None) + + # Checks + onnx_model = onnx.load(f) # load onnx model + onnx.checker.check_model(onnx_model) # check onnx model +- print(onnx.helper.printable_graph(onnx_model.graph)) # print a human readable model ++ # print(onnx.helper.printable_graph(onnx_model.graph)) # print a human readable model + print('ONNX export success, saved as %s' % f) + except Exception as e: + print('ONNX export failure: %s' % e) + +- # CoreML export +- try: +- import coremltools as ct +- +- print('\nStarting CoreML export with coremltools %s...' % ct.__version__) +- # convert model from torchscript and apply pixel scaling as per detect.py +- model = ct.convert(ts, inputs=[ct.ImageType(name='images', shape=img.shape, scale=1 / 255.0, bias=[0, 0, 0])]) +- f = opt.weights.replace('.pt', '.mlmodel') # filename +- model.save(f) +- print('CoreML export success, saved as %s' % f) +- except Exception as e: +- print('CoreML export failure: %s' % e) +- + # Finish + print('\nExport complete. Visualize with https://github.com/lutzroeder/netron.') +diff --git a/models/yolo.py b/models/yolo.py +index 16638ed..676aa04 100644 +--- a/models/yolo.py ++++ b/models/yolo.py +@@ -25,6 +25,8 @@ class Detect(nn.Module): + self.training |= self.export + for i in range(self.nl): + x[i] = self.m[i](x[i]) # conv ++ if torch.onnx.is_in_onnx_export(): ++ continue + bs, _, ny, nx = x[i].shape # x(bs,255,20,20) to x(bs,3,20,20,85) + x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous() + diff --git a/python/contrib/YOLOv5driver_assistant_system/common/patch/v3.1.patch b/python/contrib/YOLOv5driver_assistant_system/common/patch/v3.1.patch new file mode 100644 index 000000000..8d7b12765 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/common/patch/v3.1.patch @@ -0,0 +1,74 @@ +diff --git a/models/export.py b/models/export.py +index c5e96f1..2f7be89 100644 +--- a/models/export.py ++++ b/models/export.py +@@ -23,6 +23,8 @@ if __name__ == '__main__': + parser.add_argument('--weights', type=str, default='./yolov5s.pt', help='weights path') # from yolov5/models/ + parser.add_argument('--img-size', nargs='+', type=int, default=[640, 640], help='image size') # height, width + parser.add_argument('--batch-size', type=int, default=1, help='batch size') ++ parser.add_argument('--opset', type=int, default=11, help='ONNX: opset version') ++ parser.add_argument('--dynamic', action='store_true', help='ONNX: dynamic axes') + opt = parser.parse_args() + opt.img_size *= 2 if len(opt.img_size) == 1 else 1 # expand + print(opt) +@@ -50,24 +52,16 @@ if __name__ == '__main__': + model.model[-1].export = True # set Detect() layer export=True + y = model(img) # dry run + +- # TorchScript export +- try: +- print('\nStarting TorchScript export with torch %s...' % torch.__version__) +- f = opt.weights.replace('.pt', '.torchscript.pt') # filename +- ts = torch.jit.trace(model, img) +- ts.save(f) +- print('TorchScript export success, saved as %s' % f) +- except Exception as e: +- print('TorchScript export failure: %s' % e) +- + # ONNX export + try: + import onnx + + print('\nStarting ONNX export with onnx %s...' % onnx.__version__) + f = opt.weights.replace('.pt', '.onnx') # filename +- torch.onnx.export(model, img, f, verbose=False, opset_version=12, input_names=['images'], +- output_names=['classes', 'boxes'] if y is None else ['output']) ++ torch.onnx.export(model, img, f, verbose=False, opset_version=opt.opset, input_names=['images'], ++ output_names=['classes', 'boxes'] if y is None else ['output'], ++ dynamic_axes={'images': {0: 'batch', 2: 'height', 3: 'width'}, # size(1,3,640,640) ++ 'output': {0: 'batch'}} if opt.dynamic else None) + + # Checks + onnx_model = onnx.load(f) # load onnx model +@@ -77,18 +71,5 @@ if __name__ == '__main__': + except Exception as e: + print('ONNX export failure: %s' % e) + +- # CoreML export +- try: +- import coremltools as ct +- +- print('\nStarting CoreML export with coremltools %s...' % ct.__version__) +- # convert model from torchscript and apply pixel scaling as per detect.py +- model = ct.convert(ts, inputs=[ct.ImageType(name='image', shape=img.shape, scale=1 / 255.0, bias=[0, 0, 0])]) +- f = opt.weights.replace('.pt', '.mlmodel') # filename +- model.save(f) +- print('CoreML export success, saved as %s' % f) +- except Exception as e: +- print('CoreML export failure: %s' % e) +- + # Finish + print('\nExport complete (%.2fs). Visualize with https://github.com/lutzroeder/netron.' % (time.time() - t)) +diff --git a/models/yolo.py b/models/yolo.py +index e1c30ba..cf35403 100644 +--- a/models/yolo.py ++++ b/models/yolo.py +@@ -41,6 +41,8 @@ class Detect(nn.Module): + self.training |= self.export + for i in range(self.nl): + x[i] = self.m[i](x[i]) # conv ++ if torch.onnx.is_in_onnx_export(): ++ continue + bs, _, ny, nx = x[i].shape # x(bs,255,20,20) to x(bs,3,20,20,85) + x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous() + diff --git a/python/contrib/YOLOv5driver_assistant_system/common/patch/v4.0.patch b/python/contrib/YOLOv5driver_assistant_system/common/patch/v4.0.patch new file mode 100644 index 000000000..69aac7671 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/common/patch/v4.0.patch @@ -0,0 +1,87 @@ +diff --git a/models/experimental.py b/models/experimental.py +index 2dbbf7f..941b2dc 100644 +--- a/models/experimental.py ++++ b/models/experimental.py +@@ -114,7 +114,7 @@ def attempt_load(weights, map_location=None): + # Loads an ensemble of models weights=[a,b,c] or a single model weights=[a] or weights=a + model = Ensemble() + for w in weights if isinstance(weights, list) else [weights]: +- attempt_download(w) ++ # attempt_download(w) + model.append(torch.load(w, map_location=map_location)['model'].float().fuse().eval()) # load FP32 model + + # Compatibility updates +diff --git a/models/export.py b/models/export.py +index 057658a..b27436b 100644 +--- a/models/export.py ++++ b/models/export.py +@@ -23,6 +23,8 @@ if __name__ == '__main__': + parser.add_argument('--weights', type=str, default='./yolov5s.pt', help='weights path') # from yolov5/models/ + parser.add_argument('--img-size', nargs='+', type=int, default=[640, 640], help='image size') # height, width + parser.add_argument('--batch-size', type=int, default=1, help='batch size') ++ parser.add_argument('--opset', type=int, default=11, help='ONNX: opset version') ++ parser.add_argument('--dynamic', action='store_true', help='ONNX: dynamic axes') + opt = parser.parse_args() + opt.img_size *= 2 if len(opt.img_size) == 1 else 1 # expand + print(opt) +@@ -53,24 +55,16 @@ if __name__ == '__main__': + model.model[-1].export = True # set Detect() layer export=True + y = model(img) # dry run + +- # TorchScript export +- try: +- print('\nStarting TorchScript export with torch %s...' % torch.__version__) +- f = opt.weights.replace('.pt', '.torchscript.pt') # filename +- ts = torch.jit.trace(model, img) +- ts.save(f) +- print('TorchScript export success, saved as %s' % f) +- except Exception as e: +- print('TorchScript export failure: %s' % e) +- + # ONNX export + try: + import onnx + + print('\nStarting ONNX export with onnx %s...' % onnx.__version__) + f = opt.weights.replace('.pt', '.onnx') # filename +- torch.onnx.export(model, img, f, verbose=False, opset_version=12, input_names=['images'], +- output_names=['classes', 'boxes'] if y is None else ['output']) ++ torch.onnx.export(model, img, f, verbose=False, opset_version=opt.opset, input_names=['images'], ++ output_names=['classes', 'boxes'] if y is None else ['output'], ++ dynamic_axes={'images': {0: 'batch', 2: 'height', 3: 'width'}, # size(1,3,640,640) ++ 'output': {0: 'batch'}} if opt.dynamic else None) + + # Checks + onnx_model = onnx.load(f) # load onnx model +@@ -80,18 +74,5 @@ if __name__ == '__main__': + except Exception as e: + print('ONNX export failure: %s' % e) + +- # CoreML export +- try: +- import coremltools as ct +- +- print('\nStarting CoreML export with coremltools %s...' % ct.__version__) +- # convert model from torchscript and apply pixel scaling as per detect.py +- model = ct.convert(ts, inputs=[ct.ImageType(name='image', shape=img.shape, scale=1 / 255.0, bias=[0, 0, 0])]) +- f = opt.weights.replace('.pt', '.mlmodel') # filename +- model.save(f) +- print('CoreML export success, saved as %s' % f) +- except Exception as e: +- print('CoreML export failure: %s' % e) +- + # Finish + print('\nExport complete (%.2fs). Visualize with https://github.com/lutzroeder/netron.' % (time.time() - t)) +diff --git a/models/yolo.py b/models/yolo.py +index 5dc8b57..e3cc745 100644 +--- a/models/yolo.py ++++ b/models/yolo.py +@@ -42,6 +42,8 @@ class Detect(nn.Module): + self.training |= self.export + for i in range(self.nl): + x[i] = self.m[i](x[i]) # conv ++ if torch.onnx.is_in_onnx_export(): ++ continue + bs, _, ny, nx = x[i].shape # x(bs,255,20,20) to x(bs,3,20,20,85) + x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous() + diff --git a/python/contrib/YOLOv5driver_assistant_system/common/patch/v5.0.patch b/python/contrib/YOLOv5driver_assistant_system/common/patch/v5.0.patch new file mode 100644 index 000000000..378360bd7 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/common/patch/v5.0.patch @@ -0,0 +1,73 @@ +diff --git a/models/export.py b/models/export.py +index 11e60c7..e8e4093 100644 +--- a/models/export.py ++++ b/models/export.py +@@ -24,6 +24,7 @@ if __name__ == '__main__': + parser.add_argument('--weights', type=str, default='./yolov5s.pt', help='weights path') # from yolov5/models/ + parser.add_argument('--img-size', nargs='+', type=int, default=[640, 640], help='image size') # height, width + parser.add_argument('--batch-size', type=int, default=1, help='batch size') ++ parser.add_argument('--opset', type=int, default=11, help='ONNX: opset version') + parser.add_argument('--dynamic', action='store_true', help='dynamic ONNX axes') + parser.add_argument('--grid', action='store_true', help='export Detect() layer grid') + parser.add_argument('--device', default='cpu', help='cuda device, i.e. 0 or 0,1,2,3 or cpu') +@@ -58,26 +59,16 @@ if __name__ == '__main__': + model.model[-1].export = not opt.grid # set Detect() layer grid export + y = model(img) # dry run + +- # TorchScript export +- try: +- print('\nStarting TorchScript export with torch %s...' % torch.__version__) +- f = opt.weights.replace('.pt', '.torchscript.pt') # filename +- ts = torch.jit.trace(model, img) +- ts.save(f) +- print('TorchScript export success, saved as %s' % f) +- except Exception as e: +- print('TorchScript export failure: %s' % e) +- + # ONNX export + try: + import onnx + + print('\nStarting ONNX export with onnx %s...' % onnx.__version__) + f = opt.weights.replace('.pt', '.onnx') # filename +- torch.onnx.export(model, img, f, verbose=False, opset_version=12, input_names=['images'], ++ torch.onnx.export(model, img, f, verbose=False, opset_version=opt.opset, input_names=['images'], + output_names=['classes', 'boxes'] if y is None else ['output'], + dynamic_axes={'images': {0: 'batch', 2: 'height', 3: 'width'}, # size(1,3,640,640) +- 'output': {0: 'batch', 2: 'y', 3: 'x'}} if opt.dynamic else None) ++ 'output': {0: 'batch'}} if opt.dynamic else None) + + # Checks + onnx_model = onnx.load(f) # load onnx model +@@ -87,18 +78,5 @@ if __name__ == '__main__': + except Exception as e: + print('ONNX export failure: %s' % e) + +- # CoreML export +- try: +- import coremltools as ct +- +- print('\nStarting CoreML export with coremltools %s...' % ct.__version__) +- # convert model from torchscript and apply pixel scaling as per detect.py +- model = ct.convert(ts, inputs=[ct.ImageType(name='image', shape=img.shape, scale=1 / 255.0, bias=[0, 0, 0])]) +- f = opt.weights.replace('.pt', '.mlmodel') # filename +- model.save(f) +- print('CoreML export success, saved as %s' % f) +- except Exception as e: +- print('CoreML export failure: %s' % e) +- + # Finish + print('\nExport complete (%.2fs). Visualize with https://github.com/lutzroeder/netron.' % (time.time() - t)) +diff --git a/models/yolo.py b/models/yolo.py +index f730a1e..0fb19a6 100644 +--- a/models/yolo.py ++++ b/models/yolo.py +@@ -43,6 +43,8 @@ class Detect(nn.Module): + self.training |= self.export + for i in range(self.nl): + x[i] = self.m[i](x[i]) # conv ++ if torch.onnx.is_in_onnx_export(): ++ continue + bs, _, ny, nx = x[i].shape # x(bs,255,20,20) to x(bs,3,20,20,85) + x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous() + diff --git a/python/contrib/YOLOv5driver_assistant_system/common/patch/v6.0.patch b/python/contrib/YOLOv5driver_assistant_system/common/patch/v6.0.patch new file mode 100644 index 000000000..cd0ddefc4 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/common/patch/v6.0.patch @@ -0,0 +1,29 @@ +diff --git a/export.py b/export.py +index 2aca0f3..0ebcdf3 100644 +--- a/export.py ++++ b/export.py +@@ -347,7 +347,7 @@ def parse_opt(): + parser.add_argument('--iou-thres', type=float, default=0.45, help='TF.js NMS: IoU threshold') + parser.add_argument('--conf-thres', type=float, default=0.25, help='TF.js NMS: confidence threshold') + parser.add_argument('--include', nargs='+', +- default=['torchscript', 'onnx'], ++ default=['onnx'], + help='available formats are (torchscript, onnx, coreml, saved_model, pb, tflite, tfjs)') + opt = parser.parse_args() + print_args(FILE.stem, opt) +diff --git a/models/yolo.py b/models/yolo.py +index 497a0e9..b1aae56 100644 +--- a/models/yolo.py ++++ b/models/yolo.py +@@ -51,8 +51,11 @@ class Detect(nn.Module): + + def forward(self, x): + z = [] # inference output ++ self.training = True + for i in range(self.nl): + x[i] = self.m[i](x[i]) # conv ++ if torch.onnx.is_in_onnx_export(): ++ continue + bs, _, ny, nx = x[i].shape # x(bs,255,20,20) to x(bs,3,20,20,85) + x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous() + diff --git a/python/contrib/YOLOv5driver_assistant_system/common/patch/v6.1.patch b/python/contrib/YOLOv5driver_assistant_system/common/patch/v6.1.patch new file mode 100644 index 000000000..52be400bd --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/common/patch/v6.1.patch @@ -0,0 +1,29 @@ +diff --git a/export.py b/export.py +index 15e92a7..f381e0e 100644 +--- a/export.py ++++ b/export.py +@@ -542,7 +542,7 @@ def parse_opt(): + parser.add_argument('--iou-thres', type=float, default=0.45, help='TF.js NMS: IoU threshold') + parser.add_argument('--conf-thres', type=float, default=0.25, help='TF.js NMS: confidence threshold') + parser.add_argument('--include', nargs='+', +- default=['torchscript', 'onnx'], ++ default=['onnx'], + help='torchscript, onnx, openvino, engine, coreml, saved_model, pb, tflite, edgetpu, tfjs') + opt = parser.parse_args() + print_args(FILE.stem, opt) +diff --git a/models/yolo.py b/models/yolo.py +index f659a04..a2edd82 100644 +--- a/models/yolo.py ++++ b/models/yolo.py +@@ -48,8 +48,11 @@ class Detect(nn.Module): + + def forward(self, x): + z = [] # inference output ++ self.training = True + for i in range(self.nl): + x[i] = self.m[i](x[i]) # conv ++ if torch.onnx.is_in_onnx_export(): ++ continue + bs, _, ny, nx = x[i].shape # x(bs,255,20,20) to x(bs,3,20,20,85) + x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous() + diff --git a/python/contrib/YOLOv5driver_assistant_system/common/quantify/__init__.py b/python/contrib/YOLOv5driver_assistant_system/common/quantify/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/python/contrib/YOLOv5driver_assistant_system/common/quantify/calib_img_list.txt b/python/contrib/YOLOv5driver_assistant_system/common/quantify/calib_img_list.txt new file mode 100644 index 000000000..90d76af61 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/common/quantify/calib_img_list.txt @@ -0,0 +1,16 @@ +1 coco/val2017/000000233771.jpg +2 coco/val2017/000000292082.jpg +3 coco/val2017/000000360137.jpg +4 coco/val2017/000000562243.jpg +5 coco/val2017/000000154947.jpg +6 coco/val2017/000000162092.jpg +7 coco/val2017/000000533958.jpg +8 coco/val2017/000000492878.jpg +9 coco/val2017/000000080666.jpg +10 coco/val2017/000000544565.jpg +11 coco/val2017/000000198510.jpg +12 coco/val2017/000000110884.jpg +13 coco/val2017/000000403584.jpg +14 coco/val2017/000000393282.jpg +15 coco/val2017/000000426836.jpg +16 coco/val2017/000000286908.jpg \ No newline at end of file diff --git a/python/contrib/YOLOv5driver_assistant_system/common/quantify/gen_calib_data.py b/python/contrib/YOLOv5driver_assistant_system/common/quantify/gen_calib_data.py new file mode 100644 index 000000000..4af578c96 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/common/quantify/gen_calib_data.py @@ -0,0 +1,57 @@ +# Copyright 2022 Huawei Technologies Co., Ltd +# +# 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. + +import os +import cv2 +import numpy as np +import argparse + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='YoloV5 offline model inference.') + parser.add_argument('--calib_img_list', type=str, default="common/quantify/calib_img_list.txt", help='original data') + parser.add_argument('--save_path', type=str, default="./calib_data", help='data for calibration') + opt = parser.parse_args() + + images = [] + img_info = [] + if not os.path.exists(opt.save_path): + os.makedirs(opt.save_path) + + with open(opt.calib_img_list, 'r') as file: + calib_imgs = file.read().split('\n') + + for i, calib_img in enumerate(calib_imgs): + img_path = calib_img.split()[1] + print(img_path) + img0 = cv2.imread(img_path) + imgh, imgw = img0.shape[:2] + img = cv2.resize(img0, (640, 640), interpolation=cv2.INTER_LINEAR) + img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) + img = np.transpose(img, (2, 0, 1)).astype(np.float32) + img = np.expand_dims(img, axis=0) + img /= 255.0 + + images.append(img) + img_info.append([640, 640, imgh, imgw]) + + images = np.array(images, dtype=np.float16) + images_bin_file = f"{opt.save_path}/images_bs{len(calib_imgs)}.bin" + print(f"saving images bin file to {images_bin_file}") + images.tofile(images_bin_file) + + img_info = np.array(img_info, dtype=np.float16) + img_info_bin_file = f"{opt.save_path}/img_info_bs{len(calib_imgs)}.bin" + print(f"saving img_info bin file to {img_info_bin_file}") + img_info.tofile(img_info_bin_file) diff --git a/python/contrib/YOLOv5driver_assistant_system/common/util/__init__.py b/python/contrib/YOLOv5driver_assistant_system/common/util/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/python/contrib/YOLOv5driver_assistant_system/common/util/add_nms.py b/python/contrib/YOLOv5driver_assistant_system/common/util/add_nms.py new file mode 100644 index 000000000..8f9a912ad --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/common/util/add_nms.py @@ -0,0 +1,110 @@ +# Copyright 2022 Huawei Technologies Co., Ltd +# +# 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. + +import sys +import yaml +import argparse +import onnx +from onnx import helper + +from models.experimental import attempt_load + +ROOT = './' +if ROOT not in sys.path: + sys.path.append(ROOT) # add ROOT to PATH + + +def ceil_x(value, align_len): + return (value + align_len - 1) // align_len * align_len + + +def main(opt, cfg): + # load pth to get the anchors + pt_model = attempt_load(opt.pt_path, map_location='cpu') + m = pt_model.module.model[-1] if hasattr(pt_model, 'module') else pt_model.model[-1] + for i in range(m.nl): + m.anchors[i] *= m.stride[i] + + # load onnx to modify + onnx_model = onnx.load(opt.onnx_path) + + # create yolo pre-detection layer + h, w = cfg["img_size"] + f_h, f_w = h // 8, w // 8 + for i in range(m.nl): + crd_align_len = ceil_x(f_h * f_w * 2 + 32, 32) // 2 + obj_align_len = ceil_x(m.na * f_h * f_w * 2 + 32, 32) // 2 + + helper.make_tensor_value_info(f"yolo{i}_coord", onnx.TensorProto.FLOAT, ['batch', m.na * 4, crd_align_len]) + helper.make_tensor_value_info(f"yolo{i}_obj", onnx.TensorProto.FLOAT, ['batch', obj_align_len]) + helper.make_tensor_value_info(f"yolo{i}_classes", onnx.TensorProto.FLOAT, + ['batch', cfg["class_num"], obj_align_len]) + + yolo_pre_node = helper.make_node('YoloPreDetection', + inputs=[onnx_model.graph.output[i].name], + outputs=[f"yolo{i}_coord", f"yolo{i}_obj", f"yolo{i}_classes"], + boxes=m.na, + coords=4, + classes=cfg["class_num"], + yolo_version='V5', + name=f'yolo_{i}') + onnx_model.graph.node.append(yolo_pre_node) + f_h, f_w = f_h // 2, f_w // 2 + + # create yolo detection output layer + img_info = helper.make_tensor_value_info("img_info", onnx.TensorProto.FLOAT, ['batch', 4]) + box_out = helper.make_tensor_value_info("box_out", onnx.TensorProto.FLOAT, ['batch', 6 * 1024]) + box_out_num = helper.make_tensor_value_info("box_out_num", onnx.TensorProto.INT32, ['batch', 8]) + + yolo_detout_node = helper.make_node('YoloV5DetectionOutput', + inputs=[f"yolo{i}_coord" for i in range(m.nl)] + + [f"yolo{i}_obj" for i in range(m.nl)] + + [f"yolo{i}_classes" for i in range(m.nl)] + + ['img_info'], + outputs=['box_out', 'box_out_num'], + boxes=m.na, + coords=4, + classes=cfg["class_num"], + pre_nms_topn=1024, + post_nms_topn=1024, + relative=1, + out_box_dim=2, + obj_threshold=cfg["conf_thres"], + score_threshold=cfg["conf_thres"], + iou_threshold=cfg["iou_thres"], + biases=m.anchors.numpy().flatten().astype('float16').tolist(), + name='YoloV5DetectionOutput_1') + + # add input and output + onnx_model.graph.node.append(yolo_detout_node) + while len(onnx_model.graph.output) > 0: + onnx_model.graph.output.remove(onnx_model.graph.output[0]) + + onnx_model.graph.input.append(img_info) + onnx_model.graph.output.append(box_out) + onnx_model.graph.output.append(box_out_num) + + onnx.save(onnx_model, opt.onnx_path.split('.onnx')[0] + "_nms.onnx") + + +if __name__ == '__main__': + parser = argparse.ArgumentParser("Add NMS operator") + parser.add_argument('--pt-path', type=str, default='./yolov5s.pt', help='pt_model path') + parser.add_argument('--onnx-path', type=str, default='./yolov5s.onnx', help='onnx_model path') + parser.add_argument('--cfg-file', type=str, default='model.yaml', help='model parameters config file') + opt = parser.parse_args() + + with open(opt.cfg_file) as f: + cfg = yaml.load(f, Loader=yaml.FullLoader) + main(opt, cfg) diff --git a/python/contrib/YOLOv5driver_assistant_system/common/util/dataset.py b/python/contrib/YOLOv5driver_assistant_system/common/util/dataset.py new file mode 100644 index 000000000..49ba13e4b --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/common/util/dataset.py @@ -0,0 +1,170 @@ +# Copyright 2022 Huawei Technologies Co., Ltd +# +# 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. + +import os +import glob + +import cv2 +import yaml +import numpy as np +import torch +from pycocotools.coco import COCO +from pycocotools.cocoeval import COCOeval + + +class BatchDataLoader: + def __init__(self, data_path='coco', img_size=(640, 640), batch_size=4): + self.img_path = glob.glob(os.path.join(data_path, 'val2017/*.jpg')) + self.img_path.sort() + self.img_num = len(self.img_path) + self.img_size = img_size + self.batch_size = batch_size + + def __len__(self): + return self.img_num // self.batch_size + int(self.img_num % self.batch_size > 0) + + @staticmethod + def read_data(img_path, img_size): + img_name = os.path.basename(img_path) + img0 = cv2.imread(img_path) + imgh, imgw = img0.shape[:2] + img, ratio, pad = letterbox(img0, new_shape=img_size) # padding resize + shape = (imgh, imgw), ((img0.shape[0] / imgh, img0.shape[1] / imgw), pad) # for COCO mAP rescaling + img_info = np.array([img_size[0], img_size[1], imgh, imgw], dtype=np.float32) + return img0, img.astype(np.float32), img_info, img_name, shape + + def __getitem__(self, item): + if (item + 1) * self.batch_size <= self.img_num: + slice_end = (item + 1) * self.batch_size + pad_num = 0 + else: + slice_end = self.img_num + pad_num = (item + 1) * self.batch_size - self.img_num + + img0 = [] + img = [] + img_info = [] + img_name = [] + shapes = [] + for path in self.img_path[item * self.batch_size:slice_end]: + im0, im, info, name, shape = self.read_data(path, self.img_size) + im = im.transpose((2, 0, 1))[::-1] # HWC to CHW, BGR tp RGB + im /= 255.0 + im = np.ascontiguousarray(im) + img.append(im) + img_info.append(info) + img0.append(im0) + img_name.append(name) + shapes.append(shape) + valid_num = len(img) + for _ in range(pad_num): + img.append(img[0]) + img_info.append(img_info[0]) + return valid_num, np.stack(img, axis=0), np.stack(img_info, axis=0), img0, img_name, shapes + + +def evaluate(cocoGt_file, cocoDt_file): + cocoGt = COCO(cocoGt_file) + cocoDt = cocoGt.loadRes(cocoDt_file) + cocoEval = COCOeval(cocoGt, cocoDt, 'bbox') + cocoEval.evaluate() + cocoEval.accumulate() + cocoEval.summarize() + + +def coco80_to_coco91_class(): + # converts 80-index (val2014/val2017) to 91-index (paper) + x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 28, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 67, 70, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 84, 85, 86, 87, 88, 89, 90] + return x + + +def letterbox(img, new_shape=(640, 640), color=(114, 114, 114), auto=False, scaleFill=False, scaleup=True, stride=32): + # Resize image to a 32-pixel-multiple rectangle https://github.com/ultralytics/yolov3/issues/232 + shape = img.shape[:2] # current shape [height, width] + if isinstance(new_shape, int): + new_shape = (new_shape, new_shape) + + # Scale ratio (new / old) + r = min(new_shape[0] / shape[0], new_shape[1] / shape[1]) + if not scaleup: # only scale down, do not scale up (for better test mAP) + r = min(r, 1.0) + + # Compute padding + ratio = r, r # width, height ratios + new_unpad = int(round(shape[1] * r)), int(round(shape[0] * r)) + dw, dh = new_shape[1] - new_unpad[0], new_shape[0] - new_unpad[1] # wh padding + if auto: # minimum rectangle + dw, dh = np.mod(dw, stride), np.mod(dh, stride) # wh padding + elif scaleFill: # stretch + dw, dh = 0.0, 0.0 + new_unpad = (new_shape[1], new_shape[0]) + ratio = new_shape[1] / shape[1], new_shape[0] / shape[0] # width, height ratios + + dw /= 2 # divide padding into 2 sides + dh /= 2 + + if shape[::-1] != new_unpad: # resize + img = cv2.resize(img, new_unpad, interpolation=cv2.INTER_LINEAR) + top, bottom = int(round(dh - 0.1)), int(round(dh + 0.1)) + left, right = int(round(dw - 0.1)), int(round(dw + 0.1)) + img = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=color) # add border + return img, ratio, (dw, dh) + + +def make_grid(anchors, nx=20, ny=20): + na = len(anchors) // 2 # number of anchors + + yv, xv = torch.meshgrid([torch.arange(ny), torch.arange(nx)]) + grid = torch.stack((xv, yv), 2).expand((1, na, ny, nx, 2)).float() + anchor_grid = anchors.view((1, na, 1, 1, 2)).expand((1, na, ny, nx, 2)).float() + + return grid, anchor_grid + + +def correct_bbox(result, anchors, stride, cls_num, out): + result = torch.tensor(result) + bs, _, ny, nx, _ = result.shape + grid, anchor_grid = make_grid(anchors, nx, ny) + y = result.float().sigmoid() + y[..., 0:2] = (y[..., 0:2] * 2. - 0.5 + grid) * stride # xy + y[..., 2:4] = (y[..., 2:4] * 2) ** 2 * anchor_grid # wh + out.append(y.view(bs, -1, cls_num+5)) + + +def xyxy2xywh(x): + # Convert nx4 boxes from [x1, y1, x2, y2] to [x, y, w, h] where xy1=top-left, xy2=bottom-right + y = x.clone() if isinstance(x, torch.Tensor) else np.copy(x) + y[:, 0] = (x[:, 0] + x[:, 2]) / 2 # x center + y[:, 1] = (x[:, 1] + x[:, 3]) / 2 # y center + y[:, 2] = x[:, 2] - x[:, 0] # width + y[:, 3] = x[:, 3] - x[:, 1] # height + return y + + +def save_coco_json(predn, pred_dict, image_id, class_map): + # Save one JSON result {"image_id": 42, "category_id": 18, "bbox": [258.15, 41.29, 348.26, 243.78], "score": 0.236} + box = xyxy2xywh(predn[:, :4]) # xywh + print("box",box) + print("pre",predn) + box[:, :2] -= box[:, 2:] / 2 # xy center to top-left corner + for p, b in zip(predn.tolist(), box.tolist()): + print("p",p) + print("b",b) + print("p[5]",int(p[5])) + pred_dict.append({'image_id': image_id, + 'category_id': class_map[int(p[5])], + 'bbox': [round(x, 3) for x in b], + 'score': round(p[4], 5)}) diff --git a/python/contrib/YOLOv5driver_assistant_system/common/util/model.py b/python/contrib/YOLOv5driver_assistant_system/common/util/model.py new file mode 100644 index 000000000..0dc11f611 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/common/util/model.py @@ -0,0 +1,105 @@ +# Copyright 2022 Huawei Technologies Co., Ltd +# +# 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. + +import torch +from tqdm import tqdm +import numpy as np + +from pathlib import Path +from common.util.dataset import coco80_to_coco91_class, correct_bbox, save_coco_json + +try: + from utils.general import non_max_suppression, scale_coords # tag > 2.0 +except: + from utils.utils import non_max_suppression, scale_coords # tag = 2.0 + + +def forward_nms_op(model, dataloader): + pred_results = [] + for i in tqdm(range(len(dataloader))): + # load and preprocess dataset + valid_num, img, img_info, img0, img_name, shapes = dataloader[i] + + # om infer + result = model.infer([img.astype(np.float16), img_info.astype(np.float16)]) + box_out = result[0] + box_out_num = result[1] + + for idx in range(valid_num): + # coordinate change + num_det = int(box_out_num[idx][0]) + boxout = box_out[idx][:num_det * 6].reshape(6, -1).transpose().astype(np.float32) # 6xN -> Nx6 + # append to COCO-JSON dictionary + image_id = int(img_name[idx].split('.')[0]) + save_coco_json(boxout, pred_results, image_id, coco80_to_coco91_class()) + + return pred_results + + +def forward_nms_script(model, dataloader, cfg): + pred_results = [] + for (img, targets, paths, shapes) in tqdm(dataloader): + img = img.half() + img /= 255.0 # 0 - 255 to 0.0 - 1.0 + nb, _, height, width = img.shape # batch size, channels, height, width + + padding = False + batch_size = model.get_inputs()[0].shape[0] + if nb != batch_size: + img = np.pad(img, ((0, batch_size - nb), (0,0), (0,0),(0,0)), 'constant', constant_values=0) + padding = True + else: + img = img.numpy() + # print("img.numpy",img.type) + # om infer + result = model.infer([img]) + print(result) + print(len(result)) + if len(result) == 3: # number of output nodes is 3, each shape is (bs, na, no, ny, nx) + out = [] + for i in range(len(result)): + anchors = torch.tensor(cfg['anchors']) + stride = torch.tensor(cfg['stride']) + cls_num = cfg['class_num'] + if padding == True: + result[i] = result[i][:nb] + correct_bbox(result[i], anchors[i], stride[i], cls_num, out) + box_out = torch.cat(out, 1) + else: # only use the first output node, which shape is (bs, -1, no) + if padding == True: + result[0] = result[0][:nb] + box_out = torch.tensor(result[0]) + print(box_out) + # non_max_suppression + boxout = nms(box_out, conf_thres=cfg["conf_thres"], iou_thres=cfg["iou_thres"]) + for idx, pred in enumerate(boxout): + try: + scale_coords(img[idx].shape[1:], pred[:, :4], shapes[idx][0], shapes[idx][1]) # native-space pred + except: + pred = torch.tensor([[0.0, 0.0, 0.0, 0.0, 0.0, 0.0]]) + # append to COCO-JSON dictionary + path = Path(paths[idx]) + image_id = int(path.stem) if path.stem.isnumeric() else path.stem + save_coco_json(pred, pred_results, image_id, coco80_to_coco91_class()) + + return pred_results + + +def nms(box_out, conf_thres=0.4, iou_thres=0.5): + try: + boxout = non_max_suppression(box_out, conf_thres=conf_thres, iou_thres=iou_thres, multi_label=True) + except: + boxout = non_max_suppression(box_out, conf_thres=conf_thres, iou_thres=iou_thres) + + return boxout diff --git a/python/contrib/YOLOv5driver_assistant_system/model/.keep b/python/contrib/YOLOv5driver_assistant_system/model/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/python/contrib/YOLOv5driver_assistant_system/model/aipp_nv12.cfg b/python/contrib/YOLOv5driver_assistant_system/model/aipp_nv12.cfg new file mode 100644 index 000000000..c3b846834 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/model/aipp_nv12.cfg @@ -0,0 +1,28 @@ +aipp_op{ + aipp_mode:static + crop:true + rbuv_swap_switch:true + input_format : YUV420SP_U8 + src_image_size_w : 640 + src_image_size_h : 640 + + csc_switch : true + + matrix_r0c0 : 298 + matrix_r0c1 : 516 + matrix_r0c2 : 0 + matrix_r1c0 : 298 + matrix_r1c1 : -100 + matrix_r1c2 : -208 + matrix_r2c0 : 298 + matrix_r2c1 : 0 + matrix_r2c2 : 409 + input_bias_0 : 16 + input_bias_1 : 128 + input_bias_2 : 128 + + var_reci_chn_0 :0.003921568627451 + var_reci_chn_1 :0.003921568627451 + var_reci_chn_2 :0.003921568627451 +} + diff --git a/python/contrib/YOLOv5driver_assistant_system/model/fusion_result.json b/python/contrib/YOLOv5driver_assistant_system/model/fusion_result.json new file mode 100644 index 000000000..decc07d71 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/model/fusion_result.json @@ -0,0 +1,103 @@ +{ + "graph_fusion": { + "AConv2dMulFusion": { + "effect_times": "0", + "match_times": "57" + }, + "ConstToAttrPass": { + "effect_times": "5", + "match_times": "5" + }, + "ConstToAttrStridedSliceV2Fusion": { + "effect_times": "9", + "match_times": "9" + }, + "ConvConcatFusionPass": { + "effect_times": "0", + "match_times": "17" + }, + "ConvToFullyConnectionFusionPass": { + "effect_times": "0", + "match_times": "60" + }, + "ConvWeightCompressFusionPass": { + "effect_times": "0", + "match_times": "60" + }, + "FIXPIPEAPREQUANTFUSIONPASS": { + "effect_times": "0", + "match_times": "60" + }, + "FIXPIPEFUSIONPASS": { + "effect_times": "0", + "match_times": "60" + }, + "MulAddFusionPass": { + "effect_times": "0", + "match_times": "14" + }, + "MulSquareFusionPass": { + "effect_times": "0", + "match_times": "69" + }, + "Pow2SquareFusionPass": { + "effect_times": "3", + "match_times": "3" + }, + "RefreshInt64ToInt32FusionPass": { + "effect_times": "1", + "match_times": "1" + }, + "ReshapeTransposeFusionPass": { + "effect_times": "0", + "match_times": "3" + }, + "SplitConvConcatFusionPass": { + "effect_times": "0", + "match_times": "17" + }, + "StridedSliceRemovePass": { + "effect_times": "0", + "match_times": "9" + }, + "SubFusionPass": { + "effect_times": "0", + "match_times": "3" + }, + "TransdataCastFusionPass": { + "effect_times": "0", + "match_times": "63" + }, + "TransposedUpdateFusionPass": { + "effect_times": "3", + "match_times": "3" + }, + "ZConcatDFusionPass": { + "effect_times": "0", + "match_times": "17" + } + }, + "session_and_graph_id": "0_0", + "ub_fusion": { + "AutomaticUbFusion": { + "effect_times": "4", + "match_times": "4", + "repository_hit_times": "0" + }, + "TbeAippCommonFusionPass": { + "effect_times": "1", + "match_times": "1", + "repository_hit_times": "0" + }, + "TbeConvSigmoidMulQuantFusionPass": { + "effect_times": "56", + "match_times": "56", + "repository_hit_times": "0" + }, + "TbeEltwiseFusionPass": { + "effect_times": "3", + "match_times": "3", + "repository_hit_times": "0" + } + } +} \ No newline at end of file diff --git a/python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5026.txt b/python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5026.txt new file mode 100644 index 000000000..f425adb38 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5026.txt @@ -0,0 +1,14 @@ +281468702005088.9 +281468946315104.12 +281468946315104.15 +281468702005088.10 +281468946315104.19 +281468702005088.25 +281468718790496.32 +281468718790496.34 +281468718790496.38 +281468963100512.46 +281468963100512.67 +281468963100512.75 +281468963100512.95 +281468963100512.97 diff --git a/python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5027.txt b/python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5027.txt new file mode 100644 index 000000000..408478998 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5027.txt @@ -0,0 +1,7 @@ +281468946315104.5 +281468702005088.28 +281468718790496.30 +281468963100512.45 +281468963100512.49 +281468963100512.71 +281468963100512.78 diff --git a/python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5028.txt b/python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5028.txt new file mode 100644 index 000000000..b3a827af4 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5028.txt @@ -0,0 +1,6 @@ +281468954707808.2 +281468963100512.68 +281468963100512.70 +281468963100512.81 +281468963100512.89 +281468963100512.90 diff --git a/python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5029.txt b/python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5029.txt new file mode 100644 index 000000000..89ef253a4 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5029.txt @@ -0,0 +1,7 @@ +281468946315104.6 +281468702005088.18 +281468702005088.23 +281468702005088.26 +281468718790496.35 +281468963100512.43 +281468963100512.69 diff --git a/python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5030.txt b/python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5030.txt new file mode 100644 index 000000000..49b7f3587 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5030.txt @@ -0,0 +1,7 @@ +281468702005088.8 +281468718790496.36 +281468718790496.41 +281468963100512.44 +281468963100512.58 +281468963100512.94 +281468963100512.96 diff --git a/python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5031.txt b/python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5031.txt new file mode 100644 index 000000000..bd1abccea --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5031.txt @@ -0,0 +1,3 @@ +281468702005088.7 +281468963100512.51 +281468963100512.63 diff --git a/python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5032.txt b/python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5032.txt new file mode 100644 index 000000000..d5cc53f3f --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5032.txt @@ -0,0 +1,5 @@ +281468702005088.4 +281468963100512.42 +281468963100512.48 +281468963100512.55 +281468963100512.93 diff --git a/python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5033.txt b/python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5033.txt new file mode 100644 index 000000000..bbc7a1716 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/model/kernel_meta_temp_deeda1690571e6461e61ca2c86060d3e1f651225b6b384463fbb56b184d95274/task_pid_4815_5033.txt @@ -0,0 +1,16 @@ +281468946315104.3 +281468946315104.11 +281468946315104.13 +281468946315104.14 +281468946315104.17 +281468702005088.20 +281468946315104.22 +281468718790496.29 +281468718790496.31 +281468718790496.33 +281468718790496.39 +281468963100512.47 +281468963100512.50 +281468963100512.61 +281468963100512.62 +281468963100512.66 diff --git a/python/contrib/YOLOv5driver_assistant_system/scripts/.keep b/python/contrib/YOLOv5driver_assistant_system/scripts/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/python/contrib/YOLOv5driver_assistant_system/scripts/object_detection.conf b/python/contrib/YOLOv5driver_assistant_system/scripts/object_detection.conf new file mode 100644 index 000000000..e0d0ace37 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/scripts/object_detection.conf @@ -0,0 +1,18 @@ +[baseconf] +# A socket server address to communicate with presenter agent +presenter_server_ip=192.168.1.2 + +# The port of presenter agent and server communicate with +presenter_server_port=7006 + +#the ip in presenter server view web url +presenter_view_ip=192.168.1.2 + +#the ip of atlas200dk board connect with presenter server +presenter_agent_ip=127.0.0.1 + +#view entry label in presenter server view web +channel_name=video + +#the data type that send to presenter server from agent, 0:image, 1:video +content_type=1 diff --git a/python/contrib/YOLOv5driver_assistant_system/scripts/sample_run.sh b/python/contrib/YOLOv5driver_assistant_system/scripts/sample_run.sh new file mode 100644 index 000000000..b6dd5e5a2 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/scripts/sample_run.sh @@ -0,0 +1,24 @@ +#!/bin/bash +ScriptPath="$( cd "$(dirname "$BASH_SOURCE")" ; pwd -P )" +ModelPath="${ScriptPath}/../model" +conf_file_name="object_detection.conf" +common_script_dir=${ScriptPath}/../../../../../common +. ${common_script_dir}/sample_common.sh + +function main() +{ + echo "[INFO] The sample starts to run" + + running_command="python3 ../src/DisAndYolov5.py" + data_command="" + parse_presenter_view_ip + if [ $? -ne 0 ];then + return 1 + fi + + running_presenter_python + if [ $? -ne 0 ];then + return 1 + fi +} +main diff --git a/python/contrib/YOLOv5driver_assistant_system/src/.keep b/python/contrib/YOLOv5driver_assistant_system/src/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/python/contrib/YOLOv5driver_assistant_system/src/DisAndYolov5.py b/python/contrib/YOLOv5driver_assistant_system/src/DisAndYolov5.py new file mode 100644 index 000000000..f1306770e --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/src/DisAndYolov5.py @@ -0,0 +1,281 @@ +import sys +sys.path.append("../../../common") +sys.path.append("../") +project_path = sys.path[0] + "/../" +sys.path.append(project_path) +import datetime +import numpy as np +from cameracapture import CameraCapture +import presenteragent.presenter_channel as presenter_channel +from acllite_model import AclLiteModel +from acllite_resource import AclLiteResource +from yolov5 import Yolov5 + +import torch +from tqdm import tqdm +import numpy as np +from pathlib import Path +from common.util.dataset import coco80_to_coco91_class, correct_bbox, save_coco_json +try: + from utils.general import non_max_suppression, scale_coords # tag > 2.0 +except: + from utils.utils import non_max_suppression, scale_coords # tag = 2.0 + +import yaml +import json +import argparse +from ais_bench.infer.interface import InferSession, MemorySummary +from ais_bench.infer.summary import summary + +from utils.datasets import create_dataloader +from common.util.dataset import BatchDataLoader, evaluate +from common.util.model import forward_nms_op, forward_nms_script +import cv2 +import trafficline +import time +from threading import Thread +import queue +import threading +import serial +MODEL_PATH = project_path + "/model/best.om" +MODEL_WIDTH = 640 +MODEL_HEIGHT = 640 +OBJECT_DETEC_CONF= project_path + "/scripts/object_detection.conf" +CAMERA_FRAME_WIDTH = 1280 +CAMERA_FRAME_HEIGHT = 720 +turnflag = 0 +cfg_file = project_path + "/src/model.yaml" +header = b'\xA5' +footer = b'\x5A' +imgQueue = queue.Queue(5) +disQueue = queue.Queue(5) +def main(): + """main""" + #Initialize acl + acl_resource = AclLiteResource() + acl_resource.init() + #Create a detection network instance, currently using the vgg_ssd network. + # When the detection network is replaced, instantiate a new network here + detect = Yolov5(acl_resource, MODEL_WIDTH, MODEL_HEIGHT) + #Load offline model + model = AclLiteModel(MODEL_PATH) + #Connect to the presenter server according to the configuration, + # and end the execution of the application if the connection fails + + chan = presenter_channel.open_channel(OBJECT_DETEC_CONF) + if chan is None: + print("Open presenter channel failed") + return + #Open the CARAMER0 camera on the development board + cap = CameraCapture(1) + + # #保存图片 + # fourcc = cv2.VideoWriter_fourcc('M','J','P','G') # DIVX, XVID, MJPG, X264, WMV1, WMV2 + # outVideo = cv2.VideoWriter('testwrite.avi', fourcc, 5, (576, 1024)) + + with open(cfg_file) as f: + cfg = yaml.load(f, Loader=yaml.FullLoader) + while True: + pred_results = [] + #Read a picture from the camera + image = cap.read() + if image is None: + print("Get memory from camera failed") + break + #The detection network processes images into model input data + model_input = detect.pre_process(image) + if model_input is None: + print("Pre process image failed") + break + #Send data to offline model inference + result = model.execute([model_input]) + # jpeg_image, detection_list = detect.post_process(result, image) + + padding = True + nb = 1 + if len(result) == 3: # number of output nodes is 3, each shape is (bs, na, no, ny, nx) + out = [] + for i in range(len(result)): + anchors = torch.tensor(cfg['anchors']) + stride = torch.tensor(cfg['stride']) + cls_num = cfg['class_num'] + if padding == True: + result[i] = result[i][:nb] + correct_bbox(result[i], anchors[i], stride[i], cls_num, out) + box_out = torch.cat(out, 1) + else: # only use the first output node, which shape is (bs, -1, no) + if padding == True: + result[0] = result[0][:nb] + box_out = torch.tensor(result[0]) + # non_max_suppression + boxout = nms(box_out, conf_thres=cfg["conf_thres"], iou_thres=cfg["iou_thres"]) + # print(boxout) + for idx, pred in enumerate(boxout): + #pred的维度决定了目标个数 + # save_coco_json(pred, pred_results, image_id, coco80_to_coco91_class()) + jpeg_image, detection_list,dis = detect.post_process(pred, image,perspective_transform,WARPED_SIZE,pixels_per_meter) + #发送距离信息 + + chan.send_detection_data(CAMERA_FRAME_WIDTH, CAMERA_FRAME_HEIGHT, + jpeg_image, detection_list) + #将jpeg图片编码成opencv图像 + jpeg_image = dvpp.jpege(origin_img) + pic_data = jpeg_image.byte_data_to_np_array() + pic_data = np.array(pic_data, np.uint8) + cv_image = cv2.imdecode(pic_data, cv2.IMREAD_COLOR) + # cv2.imwrite("test.jpg",cv_image) + #找出车道线返回斜率 + if ( not imgQueue.full() ): + imgQueue.put(cv_image) + disQueue + if ( not disQueue.full() ): + disQueue.put(dis) + # print(cv_image.shape) + # cv2.imwrite('test.jpg',cv_image) + # outVideo.write(frame_with_lane) + # print(line,center) + + if len(pred_results)!=0: + break + + + +def nms(box_out, conf_thres=0.4, iou_thres=0.5): + try: + boxout = non_max_suppression(box_out, conf_thres=conf_thres, iou_thres=iou_thres, multi_label=True) + except: + boxout = non_max_suppression(box_out, conf_thres=conf_thres, iou_thres=iou_thres) + + return boxout +class serreadThread(Thread): + def __init__(self, name,serread): # 可以通过初始化来传递参数 + super(serreadThread, self).__init__() + self.name = name + self.serread = serread + + def run(self): # 必须有的函数 + while True: + readdata = self.serread.read() + print(f'Received reply: {readdata}') +#图像处理线程 +class ImgReporter(threading.Thread): + def __init__(self, queue,perspective_transform,serial,disqueue): + threading.Thread.__init__(self) + self.imgData = queue + self.dis = disqueue + self.perspective_transform = perspective_transform + self.serial = serial + def run(self): + while True: + distance = self.dis.get() + print("distance=",distance) + if distance < 60 and distance > 0: + senddata = header + ('T+').encode() + str(abs(distance)).rjust(4,'0').encode() +footer + self.serial.write(senddata) + # continue + time.sleep(0.2) + continue + img = self.imgData.get() + # print(1) + line,center= trafficline.findline(img,self.perspective_transform) + # print(line,center) + if center == -1: + continue + data = int(center) + print(center) + if data < 0: + senddata = header + ('C-').encode() + str(abs(data)).rjust(4,'0').encode() +footer + else: + senddata = header + ('C+').encode() + str(abs(data)).rjust(4,'0').encode() +footer + self.serial.write(senddata) + # self.imgData.task_done() + def stop(self): + self._stop_event.set() +if __name__ == '__main__': + DIS_CONF_PATH = './configure.json' + config_file = open(DIS_CONF_PATH, "rb") + fileJson = json.load(config_file) + cam_matrix = fileJson[0]["cam_matrix"] + dist_coeffs = fileJson[0]["dist_coeffs"] + perspective_transform = fileJson[0]["perspective_transform"] + pixels_per_meter = fileJson[0]["pixels_per_meter"] + WARPED_SIZE = fileJson[0]["WARPED_SIZE"] + ORIGINAL_SIZE = fileJson[0]["ORIGINAL_SIZE"] + perspective_transform2 = fileJson[0]["perspective_transform2"] + + cam_matrix = np.array(cam_matrix) + dist_coeffs = np.array(dist_coeffs) + perspective_transform = np.array(perspective_transform) + perspective_transform2 = np.array(perspective_transform2) + pixels_per_meter = tuple(pixels_per_meter) + WARPED_SIZE = tuple(WARPED_SIZE) + ORIGINAL_SIZE = tuple(ORIGINAL_SIZE) + + + # Open /dev/ttyAMA1 with baudrate 115200 + ser = serial.Serial("/dev/ttyAMA1", 115200) + t1 = serreadThread("串口读取线程",ser) # 创建第一个线程,并传递参数 + t1.start() # 开启第一个线程 + #图像处理初始化 + imgReporter = ImgReporter(queue=imgQueue,perspective_transform = perspective_transform2,serial = ser,disqueue = disQueue) + imgReporter.start() + + main() + + + +# atc --model=yolov5s.onnx --framework=5 --output=yolov5 --soc_version=Ascend310 --insert_op_conf=aipp_nv12.cfg --input_shape="images:1,3,640,640" --output_type=FP16 --input_format=NCHW --optypelist_for_implmode="Sigmoid" --op_select_implmode=high_performance + +void USART_GetChar(uint8_t nChar) //串口接收到一个字节 +{ + + if(USART_FrameFlag == 1) return; //如果上次的数据帧还没处理过,则返回 + static uint8_t frameFlexLength = 0; + if(nRx2Counter==0 && nChar == FRAME_START) + { + USART_Rx2Buff[nRx2Counter++]=nChar; //保存到缓冲区 + } + else if(nRx2Counter>0) //接收到帧头以后才继续保存 + { + USART_Rx2Buff[nRx2Counter++]=nChar; //保存到缓冲区 + if(nRx2Counter==2 && (frameFlexLength+3)<=FRAME_BYTE_LENGTH){ + frameFlexLength = nChar; + } + + if(nRx2Counter>=frameFlexLength+3) //接收到一帧数据 + { + nRx2Counter = 0; + if(USART_Rx2Buff[frameFlexLength+2] == FRAME_END) //如果最后一个字节是帧尾,则数据帧完整 + { + for(uint8_t i=0;i 30 && trunSignDis < 40) + carTrunTaskFlag = 1; + } + USART_FrameFlag = 0; +} \ No newline at end of file diff --git a/python/contrib/YOLOv5driver_assistant_system/src/configure.json b/python/contrib/YOLOv5driver_assistant_system/src/configure.json new file mode 100644 index 000000000..ff9b3dfc1 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/src/configure.json @@ -0,0 +1,15 @@ +[ + { + "cam_matrix":[[1.15694047e+03,0.00000000e+00,6.65948814e+02],[0.00000000e+00,1.15213881e+03,3.88784788e+02],[0.00000000e+00,0.00000000e+00,1.00000000e+00]], + "dist_coeffs":[[-2.37638057e-01,-8.54041989e-02,-7.90999421e-04,-1.15882426e-04,1.05726054e-01]], + "perspective_transform":[[-6.55424099e-01 ,-1.76820457e+00 ,7.23865500e+02], + [-4.82392786e-02 ,-4.50233267e+00 ,1.00204237e+03], + [-6.29738946e-05 ,-5.82573558e-03 ,1.00000000e+00]], + "pixels_per_meter":[3.28,3.28], + "WARPED_SIZE":[600, 600], + "ORIGINAL_SIZE":[1280,720], + "perspective_transform2":[[-1.15384615e+00 ,-1.44230769e+00 ,1.03846154e+03], + [ 3.55271368e-16 ,-4.61538462e+00 ,1.84615385e+03], + [ 1.97372982e-19 ,-4.80769231e-03 ,1.00000000e+00]] + } +] diff --git a/python/contrib/YOLOv5driver_assistant_system/src/filename.npy b/python/contrib/YOLOv5driver_assistant_system/src/filename.npy new file mode 100644 index 000000000..da17fe3cf --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/src/filename.npy @@ -0,0 +1 @@ +$*-)%'-0.3--./-.-+*22,1006)1031/242/,1,-1152112441-3/21-7644463227430/2411/6277.20-30570312631333.2602567:<;<6/2+331/210.)%&%%'&)*((+*0/-2.0,14/0143222.(//./*,)4=CFA2.&"&!##% "!#'$#'&%%''$%''(*'()($"$$#$$#(%"$'('&#+&'$)(*+(%*'&,%&%&'&'%$+(%,*3*6CISQTR\SR[TVQVPPJFJCD4420,+,-24.++0-/0/++0-/585643))'&')&))*%%!)('()/*'&+(((%*(,*+(,*,,-/--,1//011533518.5242/1-*--,/00692767:5<>A?ED?FEIJJNBII:?????EFGIPFCLIJPSRWJPVVRXZVW]ZbbQUdaqru{~ö~v{~yxsutonom`ch\]^\^f]`_hha]ZUPcS[QaPYODBFAGMJKOTVJDHJB=FKMEJPQbmsy}~ytmRQ>9ABEHFFIJDFCH>F:EDBBB;977:>?B>8:878=8:>>?C?9A@>AGSR]YYRVCFB?A;9<<>;8=?=<;;>9==B737;>C8>A5AFD?@=03738=EBBNEEKGFDE@@B;@?=BCDNDFIDLSTOQXUSUVWUZ_OU]`UZ`WaX^how`agPcj_jaep^mkglsdWLTMMLPJMBEFEHKKNFSPHCKLE?MFJIJMLOTNVOSUU\[[\ZdqxdUhYISG^}po[dchgkgialdghmshed`aegfjakontbjonpsik`ilfdcjgljodx~}}sq~zzorwswrkojmhdZcedkthclqgknonhieihpjjekdfhngslvvqmmijhh`jigknmuqnxyvhNTRPKFLGGNW96E6B---0+.//-/..10,,-.,0/002/-/101/--020/0/242102214./02./1143442213/3-2234//041132013/2/202553664122134465477?8;6731.5/0-..-.(#$&$$'&'()*.,/.,/-00-002023001234./015:B=A7-&'$$#$#""#! $$($$&''$%$*))(%(,)$$$&%$"$'$&'$&%'')%%$%$%'&&&%&&$&$#'((('(&-)),+4INOSOTRSRVQVNQMNLGMOC<3/-0,0/,.+0.+,00.0,..1597856-))('('&%'&)&+&&%&*)((()*&'****)()***.*.*.1../0286303-5.4774-..,--10133346679<===;:8:6679865:=>C=<;3567>7645<9<88998471;669=<:8=>;>=BBFE?A><>@?=>CAGDJGDGJLMSVSQZQRX^Y[X^USXZXX[RY^cgxr_R_\\hYf\ookkbdirhTNNNLJKLHGIKHILAIFMDGIKJJHPIIGMOMRUMLOQZX\]Yb`^kqyy\OSO\mjghhjmqgnfkminhnelcieililgeijilnmkkkdphic`geigjint~}|t{wtqwsqvrltlecadfejeefhfhllgllhjfihgklbgigfgelmqszqlikkbkjlie_gpsx|}mYXRMKIFFIEEACE8<,/(-,2,2-.0,----+-/10../1-0/1022.2.0/12//2,0--.0.20.0004/441277032.202311004.2020333244423464721312/04576798:95523..232310,*)&&%#"%#''+**+1/0./20/2.110210350112-06:?BA82)%#""$"#%!$##$&$"#$'#(&+)))'(*%("$%##$$#$%'($%#'%%%&&(%(*&&)%%((%&''&%('(,)**,3KMOSQUTNUOONRULNGIHNE:4.),*/-.0,-+-,0/--,.,1676237))(&&'(&%&)(',)+&+'*(()()'*'(+-))+*.-++.,.+-002.46420*1.3157212+/-/,21/539422<;>G?AGDEJIEMJHCBAD;C<@ACEEHHKSKOMPJFKNKMNTROTTUacfjqpstz||~}{~Ÿ|yuupqqnnhkd``ZaVZ]V\_bcgca_WZPPRSQOPNMHEFPTTY\WZ\XOMMJIJQLNUhnopprlt||}xmc]YLC@DABFEFEHJHIDE@IEE=><;9978?<>>:7;:<:8<>798:9:;B;AD@DERQWW_JQG@@??=8>8;:;>==<<<=@???;;@:<=:9::<7>::68:755898:=89:4:846:776::9;8799BDC>7?7?=:77<=<@A?=<<>==??;=CAGJKIMKOSPNUQVW[XW\VZWXXYUW\[[]\_s|~{{z~}zzx{y|w}{{}y|x||x{x~y|}y|~}||zx|y|}yw{wqsa]W`Xbb]hajgligfgtgTHLNIIOIFFGKNHGGMIIFIJHJGJJMHIJJLHFMMRQY\Y]^[bclx~}}v|t|q^TSOZqdchjmmmnplmlfiknemegdhjagheifnmpnmomkjlmlblh`gjghqy{vrvswtuumtvtoiiiidge`dfhcghelikkhcegihglkdgchiehhkpupkoekhmkhhmjpsnx{oaVMPNHJGGAJG?:;;21,+,(+/-2,-.1/-./.1--3./00-,00.,//4-3.00/211/1/.0/2/43.320331111222143/611/35/12445711432235651125122076887988?:5/2/3633/./,+&%'&%%%#%%+(((*,.-311-013.3202231323//58==<;.'''$#!%!&$ $&%%$#"#$(#%%)'())))&($#$#$%'$%"%&&&&&)(&'&%%%(&&&&%&&%'((&((++()*.,1DJTTSSVTVMOSPUPSMJIND95/1./---,1001,.-031/+/84961:/)*)(('(&(')))*(&)(+)()*'*.(*'+),**0-(///+001/2/13554043601632..-+*.03334486<:;>=>BGABFEIGLCHEBBC>@?=BEDKHJNLRJFLAGJOISRRU[Vaedhqruqpyvux|z||~zptrqqpghie^aU^WY[XXZ]``abdWQOMLOPMIKLOORPUWZ]`\^ZTSSRMIURN_lspskjmrz||~tk]WSNEFBCB=BDIHFGJFJCHGEDB<=9:5;6;9><<;6;9:7<=9==>@:B@?JAIMDOS^XQUG@D?B@BD;@DBC@B?B?;<@E?@DD><>BCFCAG?AD@@ABB=DCCFDF?@G>C@AFGEECGCFDGBB@DAEB>?GIGLHKLKQNTQTRVYUWQ[\]\[RU\ZX[bdZ[t{zz}zwwz{yx|zy{y}~qxxyywwsyuruwvyztypvstooroolno]^`Z]]abg`daifdehueLQKPIMNIJGGDHGHLHDLMLLLNNNMKLLHPLPNTRRR[]Z`\Xddmv}~z~|{y{rvxlnpoioZLNNMX{ofgeejmqlpqohilkikhbefhggckhimmjllnkkgnlj^jhecjhbjlz{~zztuvsnukoqnjfdkghlgkggfgihejjjmlmfgimqlfbledjjglmns}uvpkhlinljhrpunuz_YZQILI>?GB@BE?>55,/-&,,.+/.-/,.,-/,110.1,/001-620101-/500-,04..20210/./330410321132233212137.32142554420411135:868252/3/61159::=?4723/17323..,)''(#&%&%&''('((+++/..//.-,.-/00313111147:>>7-)%'&!#$$#$$"#$$!%!"%%"&%(($&*((&$# '%$$&"#$&'%&%&(+'&&&%%(&%$%%(%$&&(&(''&,'(.+0DJQMPWRPTRNQSRKQHKKMC;2.-,0*-/,.-+-/,,+-(-.0686658*)$&&%&)))''$#'()')),(*+)),(*)*-,.,-,*-(..../*+002864030-/-153./--.*./-22-0.677>=A@FBCDAHLGAAAF>DD?=>HACHIMPQTMHOGJUMMTQVW]cedgkoplmnsrvovpomku}zxwvtqkmkhea`^c^]\\VWXYY\bb`aUQOMLLLHJPHKKRQQ]Va_bd^W]^WXS\T[jtvvypfiluxuzqb[RQECF@AB@@HEHFFGCFICF@@A@;993:;<<;7<3788:8=<7;;<>;?EDGCDJLRT]WORHD9B=@@@>>@?;A?CACFBC@?CBA==@ADFA>>?>B@A@AD@AA??B?ACDDBDEHBEBHGFCEHBGHECIHFJHHCGE>DMDGGHJKLKOSSTYUZRUQ\[ZV\[^[Y[\ba[^qwyyx}zu}yywvxyvxwwztyyyxuux|vuutnuxuvppnsqqloomqoa[^\^c][ghkoifiddoeSRMIIEJJKEJMJJIDFJEKLDILIHLGGLGJGJKUNPSS^V[Vcb]mx~}z~~|{~{{}}{~}|~|zx{xrxuqrtlnjhgh`bbQJMKPY~lfldjkgmmikgiilmomjhbgigkgljklomoroommrmhohjkhkhikoz}~xxuvvpxnnnqnmhifigfc_aigaihfhjhiejfiijjlhgggbegihtxxslqqmknfillonu{\^TUUEIDDFDCAEIF?941/)*&--/,.0,,/-....23.04400.4.4/12.2,1/03030.,/33.23/,-12111436545241141051300239444432325654856643677633556688<>9444255.,20/-+)'($%$%#&%%%$('))++,--.0003020/051//11,10972/&$&$&%&#$"#$"$% %%"&%&'#&*('+(''%#"&#%$"%#$%'#')%$''&'&$')#'&$'%$$(&(%%'$((()(+2CLJTRRQRRLTQRULPIJFMB:403-0+//-,/1/5-.-,-.+0087649/((&%%$&&'$,%(*()(('''**&***(%**)*+***,*++,+///1-03533226.2/0742//.*0.3/613677:<>@A?DBGEGBIAGB@=C<@8@G;A@ACDFCE>FEECAB=;?;?<986:<6::C>AC?A=C>@ACEE>AAAB@AAC@BADDG@@B@=D=>=>E==>A<@@>B@B?DD@C@EB@C=<581+'$000/0,//0/-0.043/01.2010001.-13/1330010/03/1./201/422/30323345333403111/34-13440253163214764754526343266;9@9;:3545110302/,&$(#%###%#'$('%*'*+*1/121/22-2+24652303430001'#!&%#&&#%"%"&%$$&#%&$&*%(&(()*''###!&#$%$##'$&&$%%&%&($('$+&$&$$$((('&'&*)+(+,0CIPSSTTSTTSPSOPINIJHE<3-/-/+-1../1,-+,.,-/-1588;84/&((&()('&)'&(*'()+('(*''()*,*+).*5.0(0,-+-+-+*./0341231232./462./0.--//513564599<>AAEFBHHE?>?@:@:ABEGFPHLMPNMVQKXVWXabdeimqnnjgehjmclkihhintw}{{x{~xrtqpqokia\`]]]\\[YWV\X]Z^]b[SVOIGKIKIFLKLOWZZ^cebe]bciekhhqz}|v{|~}uih`TNEBBA@>ABADDFCEBBEFBDD?BC@>>D??85669:8;;;;9?@CDEHHIKJIPRYZ\STLDC?@@CECC?>?CG>DADA?ABB?>BE?B?A@@?@??>B>A?>@>FAB>ABCBD@EDCFDFBBFFC?BBBDDDFBFDCEDFHFEGCCCEHFBIJNFNKKKOOQTNPOUUUWTXYXUWXZSUVRXacW_\uysyuwxzvxvxvwxtvtvsyztuussporurtopqrrpsoppsnnknkhoaY]YZ``ciccjjggmho_TRPKNNONLHIMGLJFIJJHQIDHPRMKJJILGJMMLQSVZY_^aaemw}wsstuvtrtprprtsousnurwstuurronqpqssmoqlrpqporknnmohlmnrmnlnnqurlkkphpkmpptsvoqokmoqlpnsnqrppsrtnponpommirimiklpliltomjptrvwuxwwyyx{{x|{|{~~~~{~x}vsxppm]NPNRWhdicdiemjohfojjjlbheee`dgdjdjhoonqfpgghjjccdcfiijjmx{}~yvtyuttwsunnghdjhflbfhfichcflklkieflhjnihhcfeoiglrwpmmgglnrlkpwi_\WVOID<:;?ABDKE>9:0.*0(&%%--,-/,.../-1.0///-0.3302/001112/./21320,.1-21//43.330//45443822413/34.665051436532/52044565755467023568:6;>?;62261120/./++(($#%#%%$&+$&&%%&&*+02.-0.102..//22205121/202*%$'#%%$!#%$!$$#$%&%'%&(&'&%*+(+(&$&""!!$"#$%$##$#"&%%&''&&)%&$$&%'''%(()),*((+2=HIYSUPSQOOMSQSJNJMLI:40,//..--,00,,-.1-2..34766:2+%('''(''%&$((($''**++(')()(*)*)+04/,,(-.+/*/-,,/.0563614431/2431.0/-.2012343378;;BC@CDDIAD?A>B?C>:@AIDOEQNOTTVX[U[bb]eimkqgibcejigkghklknyruvvts|zoppongkcca`b[]_UTSUUT[UXX]aa`]YOIILHOFKIOPWX_ededf]cadmqozy~}yj\UMCDB?@===>>@DDCFD>ECCAA>?B=@A?==9599:88;;=>BEDCIMKKORPTVVWQOJAA@GC@@ADFDDCBCDJ>DFGCFAACEBFGGCFHGEIJFFILACIDHFMKHICQELMLJRMPRPWTXVTRUZT\R[MQ\ZU`Za][]\v}usvwqtqqwsuvuuvrsqrxvstwusruirsqprqsnoonljojmngekk_[YWZ\_fjafgfigefndSPMLFNGGECFHGJLHFEJCMGIDKMLJKIHGPNMLJIOTXYT[]`bjp|tmonoouttnrwsspfoppmponorouplsspmnqnpmnnnoommkphoopqmjrjojklqkkfklqjnoolfojsminjnkmgkgimhmfjklmkqfjieehhgcfbc^hbf_eabaadda`\aaacdZa]WZa`Y^^]`[_]]^dd`ab``cg_^\^_d^a]]\Y]OKJOJY{dbjdggfm`jidlimqjmhdbd_`gfggjgjpmpllglilgeefdffgcggx{zyrqxurtnsspnlgdmfhijghhd_jjhpbhggfhdjkoifghkiihqnuqqlmjglkkqyqbY]SQJGDCG?@HAAAH??>61+/++'&%2+,11-2./--///1/-,2//1.02.121542222,2111/1-402.3124122002153445/13040401005226755403732532465576:5546974;=:?:031427/011*-+)%$%&"%&&$"#&$#%&%'*./,./2/41020-211363121-1.)&$#'+$$%$$##"##%$!%$'($&%$)))+.('%#$#!'#'&&%$"'((%&%%#(%+&+&&'%#('*&((&()*'*),/AIQPPRUSSNUMMQQLPEJHK:7,1,-/.+,.-0./0---./-0489392,*'&''&&(&'*%*'&&))+).'&,(((((+*.*/-*0+..*-,,/1/-,..1846//3+12650-0/4,1+213444139==CIEBCEABB@B?>DFDEB@;::;<6788::??GCGDECECCBBF@AC?B?DJ@CBBAD>B@?CB=>F@BCFAB?CHA@@HA@AABAEC@CCC@DDEBDEICHCGDJDIHEJJGJIDHDDJKGDOIHGCLMKHKLMPPRSRUTTXNVXVZXVVXUWUdba`^]bsuqtstxqqsprtruqortttoowqprrpqqqpljnqpmrprqollljijja[\TY`XbfffhkjhievcPIOOLKGIHKHJIJFGEGOENIFMFHFMMNJMXJJMOPQWUa]_^\cksrotunnruqngmllpnrpoqinoosnmqltomnmlkimqnknlnkirhnhljimommmmkjljongkkgkmjijkkjhkghlnmonljkojhnkifhcfheecedc_aaaaa[`_`eaY`]ZaZ_^_X[[aY]cVV^[]VUSXNYSWPSSONSSTOPNPIOOPWLPLUGFLNKO~|cckejemhfilikfkokjijjcfedigkhohinknhfjkkibdkfdfegjir{~zwtvzupqptsnjljdkhhgfgjjjdghggkljheedighickekgehmqwpolmlgrmvn^_^YXKBB?BD>>EC=JMDDGL;0*(),''+/1,//-.,///-.15.00011/02011017120//-/013211330-21442554202537333243317/0140037536322437726578474834235986<<>:712117100.-1(&$#$%&"%%'&$$$"%#$&'+,*-/1135/./313/3033/231.,('()'&&##$"#"&""$$&#%$"'(&)+)+*('&$&#%)$%#&'%%%&&#&$$**&'%'&#%$&*%'*)%')-*()*+-=HOTQRXQWOTNRQOMLGNGI;40.0.,-,-/)/--/--,0--/4964:.-)''&%(#'&'*+')(%)(,*+),**+*++**+),-*.)*.,,-,/-,/.2045342251157661.1/+,-00212466?:@DCCFCFF@I<@C;CE=AC?=A>@I@DGDE@DDBCGD?CCAC>=><<878<;<>?FCDHEMESKQUXZ_QTSIGGDE?FDBBBB=CBF@@FDADFCBEBDGAEBHDBDEIE>DEA@CB=CDCBBCAB>C?DC@DBGGFGB?DHGGD?BCA:GGBFCEBCEJGEFEDF@EDDJIDFKJKEKGMMOLJLTRRRTNXTUTUWUWWWXXW[bZ^c][cxrqriornsoqqpronponopkttlnqnposoknpmmokomjmkmmhlhif^WYXXb]edcgegkfdipdMNOMIOKMKKDIKOLDECHOJGDJBJHILPIMVUVMJNMTZ\^___dlu|vrnonnonnnopmmqlpoknommsplkplpmlggjgniklmkmlfhnholiqkjlliijhgkcnemmindngiehjiceeiiheceijieknkdjcec^f`g[af^ac^^Y\^Z^^Z[^\`YX\UX\ZW^]ZZXVY\SXVSYXSWRTUVQLONTSMVOPIPOMMKNMJKEBRNQycjibdcfoffeiehionjqhgcghhjhifnmnmggfgdhkifffddgfjfjwz~~x|szwrnptpinkjcbmfibakfefdcffkkgofecikgfgj`jnemm{yttgmontxphc]`_RUC;FA8C=@DC>FMGD9=>*&''**(&00/.0--/1//.-1.-,2001,.00.10220325/04103/250/11222.00012153677144243340223402434523;5836463995658276239:;>>>;61446:130).+($"%$#%##"%&%%($#%$$%+***--0,46/0/-./026126304,/+)+)(&$$$"$ %%$%#&$#'&)((&,'+(*%%#%%$%#$&%%%'$($%&%%'%#'"$'&$'%'&&&&$%&)+)')'-@IPSSPSTTPQNVRMMNKOLG930/-.-,,-.-,,-,/+,/*.34>4576,*'''$(&%'&%(')''''')&(('()*-*(*)*)+*,,)++-/-/01,/*/0/6052403453840/--//.//.1743:6>A=IDCGGCD@>@=A?<@>A?D=?=8;;99?ACIDGGHMKHMNNVY\SXOMJLLGHLJLILFJGJJFBDDHH@GFLHJGBJCGGDEDFICGDHKFG@BF?BFCLCBBDDHCHHAEBFBDHEBFFGBHB?@@HJGIEFBJHICILDJFGDKEHKKGIDFIMEILPMPMTW[XZPTV]XX]SYUVZZbZ`ba[^q{tpxippmqoqppoonlronnjnmpoknnmpnjookmqlqkhnjljliki`\YYYU]abecfajlgfgshNJQNKMMHJLFJIHEIGGIJOKHVJKNJJMCMOQMVOSP[[[X[_]efxrqqjuntloqompkqmlnmkrmqqlnimgliijmjijiqjnggnijkhelighhmkdhkfllgljhngjgjhfdghhghegdigdskrpmpkmhkgca_a__[\eWe`W\a\a^]aZ`VZYYXWYYVYY[[[XYUXTPZPUSTPOJRJPNMQRPKJQEPCFHKJHIFJEEIPIRqegje_hilgchifggkmosfjjdiaifgdhhrnlkffhkgedadfbedgdewxxyuuvzmypwqvosred`kchkcfgekhdijjmlfflfjieheodjmlnn{wytntw{vgb`^UUJEEB>><=A9<@AE?DDD495**.('%%$2,/+../.,.0/-02/03./0/011/216331121/51335.301212/1/533012533783134322656412052224622036535588435815;67998=;;=632/30320-,+)%%!'#$$$$%%#&#%&&$$+*)((.+/1.11000--/0/52641/,/.+,)&#&$$# %$#&%#'(##%&&''(&-*$%$$&$%$$#'%%$%&(&%'$&%$#&%$'&%'$%'(&&'%()()),++>ETPKPTPUSOOPPMRJKNFH>2.-,..,-0-..1-+-+,-/-5585529*'%%($()&&$&&()&(&&*%'(-'((((()((*)+)++)+(,3./.+-//.-/52401310237421+1--.1./3;25647>D@FDKFAEAHEBCCCD:FDAAD??;><;;:=AFGCJHGDDGSNRVWUUUUMKMMHLKIJJKHLFFHEHLDMHJLGKLIOLJHFGNIOGHKJHNJLLOOKLKKFMILIKJNJMKLJIJMJKMMGGDFOGIKNPGNPONONMLMFMIOMMOMJNMLMIEHJJLQROMRWSVZWTXWWXUUZU]SYV]_cc\`Zat|mlsomklrptknlommnlloljjknkmmillhmjikkhnoglkjiicicg^\[ZZ^^]jdgfigdfhvaTONKOLGIKGDILDFDCHDFMODAHLGILQEMHKLIJMM[U_\^_[agrnulnmipomqkenipnooljolkmlmbggipfeijimkkegffieghfdgcefdhdfjkickgecffhgbcciegda^fdehddcdjaUSX_`[[Z[ZZ\]^\[aabd\^`\\[Y_WUUZ]WWTTWVUVXWTQVSTWXPPPOSLGMSLMPHJFNIOIKGJGJIJCHDEH@GGNWs|hdd_gcdjaagjikjhp{sljhcg_ibmlmoomhlfkikiblbdjffhl|xzwupswuywvwtwrpgfgdfgijfheicidiejjfmijgihefggfenpt~ymprzvf[[ZZTNGBC>B>C@:?IFD46-+)# &%$$2,.22-///,.//-1/01//0/221.005610101/3-/44220320/2//.5000.2435733551344621/244441547610734566782765467464;>@8?5/211321-/,()&&!$%$&"#$"&%&$$$&$$&''*)*./.1---/.+/024250/0/00.-(&$)"#" $##%&#%'#"%!)$'((+*%&$#&$$$##$'#%&'%&%##'&$#%%%(&&('$&''&%'%)()(),-9OLOQVTTRSLPPPNUGGKJI<5,.,,0-,.,-+1.+--+./.0377433.)%-(&'$%('+'&(')'&&''$'&)'()*,*(,,.++-*,*+/..*,/-0..17736428334;74-100/-0113044889?ABICBDB@@A<>:B??A@A@GLJTNRLNPLQMNTTX]Ybab``fccffft|u~ppeicgc]\]^_achg`\VUTRWWTOQOLLLLNMGJFIJLOILRX^\_becemlmqoy}{vvgaZWKOEHBB@AGFFCFECDA??AHCGDBC?DAAD@?>;??@?CDEDFHJHLLKIIRRWYQUGKQJLMOJLLJHJIGIJJKFKJKHKKKKNHOJKHFHLKOIFHHLMILNNLKMKPLMKJLOFLOOSMSKLMLMJLNKQOPQRSSROHKNQULPQRLPPSRUNTWPLKGLOMMILMQRRTSTWU[WYVRWSOUS^[ddcdf`^^o{ktfnkllilnjolpqjlnjkkphmglkmikmioimfmkilmilkfmecge]Y^ZW[`^hdjcjffbfy`QQOLEJGIELEHGDGLGEGHKOGGGJGJFFJKKIQMINNST[U`ZYfkryumjnlmkkjifmijkmfigmgmikblogiekejheghgkheadddgg`gicchddg^eecdfcdagcadceddhge`d^`]aZfdc[TJECT\ZPXY[ZW\YZVZ`T__[XWUUVWUSWXTVSTRTYUPTRPSUUPMUKSRNQQNNRKMLFKIGGKEEHHCJCGBFCCAEFCRLo|ja^cbecgfcghiekgr}pkdbkddbegimnljiihfghcie_eheekkvwxzxsvzvuxu|uvmjhkhhfcafcjgiddcinljgihgglgficijjpty~vsw}iX[WXWKIGEAFFE>FD7B@>G>B=DCF9-*((%&%&%%1-///--./.-000.132113110310.22:22401341455211/0/20325/1000211647464544432030202314-34450367467596552666988A9=4611231011,+('(#%%$#"#%$#%"$%$$&%%%&*)(+/-01,0.0-210216010310/-+(%(%%"%&"###'&$$%'(+''((*+)%$##!$%"&#'$#&&%&$%"'&%'&$#)$&%&%%'&*&)%)%)'((3;MOOLQRTLPMPPOQROFOKI@0-*+/-.,.,.-/0/-/+,/,.3:3870++'*%#$#%&')&&&#)('%()&)((('*&+*)*,)(+.)-/--.+./-.1/--.0390396/68:5//...,./253570558<>::B??A=A@B@@CHGONRLNJOLMROPQUT^X`b\^]^_]^_kvxy~~|upnddc`_^_c`daiggh_SQSUXRWUPPNGJIJHG@AEEIHOPW[\`fihgdgllvux}}xupi[ZLPNOFFFAKECGD@JCCB>?ECBEDB>EGC?B>=DABA>F@H31)(('$'$$%$+1-./-0,/310.22.1./1/427233230232221104452.225/.4/1020400270355524642321/020620211358334666453443724476:67@<:632//1111-+-'&&%)## "$#!$"&$$#&%&&(%)*(/+*.+-2100/1/-212303/0.+,&%%$$$$&$!$%##"&&&'&((),)*%''#""$"&"&$"&%%)'&%#%"'$$$)&(*)%%'%%&('')),))/9IQMQSVPMONNQQLRJMPME@33/+2+./+--,0//,+--*,0285142-('%!%%$&'$%$%$#&'''$&$)''((&&))))*)+*,..+-/3-1.++.+.,.-274331444442/0-/.,0/21132469:?BB@EA?B>>=;C;?AC@@?GCDJHHIH=CDFDLRUXQRMMDHHNEFHFHJIHKEGGGJMIKJJJJGLCHILHIFLHHLJMFGDIKHJLPIMGLQHQHMNOMLOLNKIMJKKONPOTRRNNSPNSPNPQORNQJMPTRNNROOF@JKKGMKJORQRVSOVUVSVUVUXVPTZ`fjihjd^_t|nzstuqomuwyxyzzyqqikojlpkrurqyqsloipmmjgkielhkjoja[XZRZaZ`ebdggjgbeo[IKLNLDGFGEIEEIFGGDIMCEKIMIHHDJKCQILOJOPYV[^]]YZet{qjkhkhjhfjeahhfjcgjeihkbaegj^hhcbjecf^fc`dbceabbh_d_efaf^aabYeba_``^ZZ]aZX[ZR\TUWPK]_^QLTLIKRKSVTRQPSUSUSXSRWVUURR_[TZTRVTNURUXNNPRONROMHPMOMLJLIGJGKABBGFJFIGCH@FHFIFPOONQPSSOOQSLOJKMHJ=30./.+-0.,+-,+.//.-*.02737950'&'&&&%$(&&&#$%'&))%'((')'()''*-+,++*0*+.,..*+,+,11+,..5453435011990/..1,//.1443478:;DC?DAC?C>:?<>?C?BB>?ACFEEA@H@BA@B>A=DCDFFMIGBDB@ACMMSVJRIFDE;?A:;@>??B=?ABACGIMIBAACDFD?JFA=?CDFEJAGDAEIFHC@GEDGGJBFFHIICEL?IFGFJJFMLLICHHHKKTOMJOMPQJONUSSQIPOMGGHLRHOKLQRSUM_SQRVYWO^UOSOZRKKJJOMTbgrrV^ZVXWQV^dkmmod`TQ[XWWTTTZddorkk^afliepjqsiolossti\YUW\^^aeekcgiggfwaMLNJJHFIDKDGBEJIGFIMNPbekfeddjhffejhheffecg`hcbcbfhiohilldjbafbh^jacjihhferyuzwvkuosrqpmlkndgg^dbhdffgdg`ihinohkdegijijmgppvoYOJOMHBAFHFIDGJ?KCFIIIVFQ[Q<99*++$#'#$$+##/./-01.1-/,/3002JJJJILMMMJKKJNJMKJJJOJMLKMKLLKKMJNLLJLKIJKKKKLKNMOOLKQJNOIKLJMNJMKKMJLNLNOQLQLOKKMNLMNOQSSSSTQMJJKMJJJJHFCA>>>===>?>>A??=??@=?@?C@??BBBDEEFHJIHJIJIJKILILJJHFIIFF?@>@B>=?<CACDGC@?@>=;?<=<>>>?A@@D>@@?@BC@@BBCCCAAACCCCBDCEFGECQ\_fdbhhfffdgefe_ba_bYIIJEFDGCEFGFGEDDFHFFHJNSPNOKGC@AA?@>A@?CB?@@@C@BCCD+&+'&&)'(*)*++)+,).)-.-...-,/-/1/21531443404751//0),//1320625=<@>=>=B?@EABBD@@CHJIIHHKKLILOLMQPQUVYW[TTTU^ediu|}x~|̽wqgfbce[\[^_]]bhcjlkpjgdfd_^_XTTVQOLADIJEAEHGRY\bdgfca\^bdgs|xxpqigb^X_VRTHMJEDBDCDBG@A@FBBCDA@B>BFA@?A>?>=CEACCDEBDG@BF=LTPXHMHDC=?>B>=DEHODB?@FF@C>@>>9;=;==E>A@B?>=><:=<G?DEBBB9=A@DA@CDBFBCBEaihbfa`lhfgdhkfgghdig`jbccecedmfdhmjideeedfhidjgeldinu}|vurrtqsunphifdddckcfghjgkchfjiklgggglhkoqnou|j\URKJDDEEIIABKCMQQZQWZOQM=;0-%*%&'"&'$$&$-01/11-2./,3230/IGJJJJKLMJJKKJLMIIIJKJMJJMMKJJLIIJLKIJLIJKJJKNMLNOMOLNMLMJOKHKMMONQNKKMLOPRQQPQRTQNMLQSSQXXWRMJLKJGJFJJCEDAA@@>?>?@@>=<@@?@<@CC?BBA@A??CBFFEJKIHKHHJGLJJJLKIJJIDGD@B>?BAC?>@?ACDCEECB==>=>A>@?A>>>@?@C?C?A@@CAC@ADCC@BBBCDCCCACDEEGM]acfiffhfeddcff\db^d\QEJHGFGEGFGJGFFDFGFFIIOQQLLLCC@@>@=??>AAAAACCECDCAD+#,''&''*)**,*)),)*,...,0/1./*,-.0037637565045/1/-/./,134292595A@B=<:?=?=8EDCFEC>GF?DGFHIMOJKLKNNXSZYYVYRRP\Zcbdkrru|}Ȼ{{toffedbb^`W]b\^^]biknpoojfd`[XUMVRKMGJCGGHCIJZ[\``iec`Z``ekyv~qnlc[W]U\]VWONHHFDDGBCBBACHFBAA@;C>@A?@B@?A><@B?BFDFKDFFBFFJOTZLKOBABA<;:;>?DD9=A=B@>@<:8:==<<>@@B@=???>;;B<>?HADDCD<:;:=@FEFFEBIBDFEGHGFBFFCECDECEEHGDHFDJFEFIFJMDLNPSPSOPWYV]PWVXSOVWRQIKGBIKMVeblhPTRPPOTOOSSVVPMRNNMW]VQOJLOIKKHLJIFKHIHELFNLIEEGMLSUVVT]YdaehhddfdbwdPLKKMLIHGBGJKDHHEEDGMFJELGI@FEI?HLOKKMNU\XYX_Xbko~kfgdghcccd]ffegifjjceedafffcgfbafbkdfhdhfdgaa``g^fd]chb`]c_`bad[\[UQ[WXUQWYWYKHPJPUH_[YUMHLORMOIOHQLUOMOVQPRTORPRLPLPKSSKJJMLNPOPONNMKIJIFIIII@GKBCBBDBBC>D;?EB@>D@AC@?@>ADGII]kk`a_aekdeaffeajcdcabhaeenbefleihiebfbecedccebhfjgjmwyyyuoosslknlmjhgcc`fc`fiahmkcnnefjgggekiehjouwgZZJGJGC@IGGLPT_YYbQXSKJB;6,'$'&&%$%("$ "./+.000--.0,0/..IDFIJJGHJJJJMMLKJMJLNKNKKJLMMKLKKKILJNLJIHJOLPMPNOPLNMMLNIMMKNNPKJNOMNKONLNQONPQPPNOLQSQQVUXTMLJJMHHJLIEDC@A?==@?=>A@@?BBAA?B@@C?CFDIGGEHIJMJIIJJPLMJJJGGGBC>?AA@?@?C???CCBACDHDD@<@??<<<@>A>??=BA@??BCCA@AC?CDABDCCBDEGDEGGM]cfhfkiefefhfgfc_c_`UQJJFFIGEICFGJHEEFFEJHHORQLOLECA@@A?@?@ABBB@CCCCCADD&(*&((()+*()(.)(.)-+--,-)-,.,-.,+,337523503.3781.,/+-.001141498?AC?BA?>;=>?>?A@DBCBE>FCDEFHLIKJKMJKSNRPTZWUVW\^gfkqloutw}{һvmgifcbc`ca_aX[XV\acfnpllgh_X^TQZWRMHIEGHHGHGVU`bcddc`dYV]eu{qh`ZPPVOVSQUGLFHHHCEBCBFDAAC>C?BBC;EDD>E??<;>A?FADBDDCEEEGMPNRVOKIABB=<=:4;9<@A@@C:355;<094=B?C<<<<<<9<><<>BA??=A>><B@DBDC;983;C@JBFFDB?>@=FFADDGEFDGGBDGCCCBFGDJGFKEOHNJNPRVPVUUUUUYSXWUSXRSWHCDHKHFT[_cpfQPNPLQMQTRNTQPLMPNLRJIMLMJIHIVOHJJKJDGIKIDFCEEDKGMTS\VP\W\a_cigdhgfk_RQLMJLEMGEDCAFHGECFEHMKFNCIFKEJKKJJQINPQUX`\\[`kt|wTPRSQJNOMMOOHRQRNPRUPUUUT[X\WW_YYY\VU[_`\][VX[Y[Z`\X\X]W]ea^]XX[XYNOXTUSUPUJMIFEIKKV^^NHISLMSGJRLMMRHNNEMYOQWQPLPQMTKMMLNNGLOOKHGIEIIJLJGHJFFEGFH>GAA?CC@AAA==F?@>??====>><>@<@?@?>A>A@@CABAA?>@?CACBEEIIJIIIHJGGHHQKPJJMJIHFH@?A?A???B>>AC@A@CEECC@?>>=?A>>>>=@=>=?>BB?BBA???C@C@BBACDCCCECEDCHFOZb`jfffgficdedeaa_bbYLIJHJEGDEDDHFIGFFCEHIJPPNNNICBB@=@AABCAAAABFEEEFCEH())*))'&)')))$*+.+/)*)),(/,,-//.1/+22741224104820-.+-0125253573;>?F=@ACCJBHEIEHLLPZSONJ>:C99=75<;<@<=:@867.37033<>?CBBA8<:9?::=>;:B=<>;?=<=E>BDBBDHBFD@?A?BCCEFEIEFEJOOOQUVTVWRUWYXVTO[RWV]GFHBGJLPV__ohNONRVSPJPNIRPMTJLPJLIKGHMKIJCMHIGIJIGIIGEGFHHEFGBMQRSNR\W_befflbieim^TJKNJJHHJBD?FDEE@DDFHJDIHCLJHJHGJFLKFMPSUVZX]]aerzySMKGHFHFFEEICGE@@ED>ADGGECCFHBGD>GBDFECFE@HEFFHLBAED@CFAEGC@EHGJEBFEJAHAEGGD=?ADJJMPV\MRPSMRRNKDIJEOCMKIRLJIPPRNLOMWRORPHMOPOLHHBJDOKLFADFEKGIIGKDA?CBG?@@DAA:@>?=<>?=>?@A?@=>>?>>@B@BAACFGGJKIGJJIHDJGLJMILJJIFCC@@???>???@@@BABCDBA?>@?<@>?A@=@@?>C????@@?ABB@CCCB@BEDCDCFCEEADICOY`bhbfgjfgfgebd`^`c_ZMIFFJEFCFJIHFGFGECEFJHNQOMPKF@BA@@CA@ACACEAEFEDEDHF'&(,*-)(,*,,*((,+(*((0(-,-0,/.,1-.+1-653116331764./..-.-24520776:>D@@B@BC<>?B=@B???BE?EFBDBGJILNMMPRNPYTWZ\]jerv{yttsspnvwy}xnpkaehc`^VYYXZ]ecclqlfheW\SYPOSTRPSOLJHEGIRW`ac_efch^chnty{th^Z\SWRTPKMLEDDFEBAAD?AEFCCAB;??>@@@?><99<;=?<==B?FFKDOPSWXTMJB:>>==@59:=9<:<;;9866:6474998@;==49:9;;<=>>==@>=:<=998><<@=><:977988>>@A@AB>@>D@CC@GB@A=@<<@<CED@A?JGGIGLUX[QKOMINTJ<;A<;C@?=>FA@?E<<@?A@@BFAJE?@@ECGFHHEBEEFDEEADABDCAFG=?CB==9;>;=::<9;?>;==C>CFGO^h]b^_Ydilhigediehecddgeiea_cflfhlgcbehefdjefddheigkpr|zvttrooooqqlliff_hdf\hge_dcgrnjenolmnnsgX``]e|xtjcWOXX\cY_`]]ZX[XUR=?;8/))'"$'&$##! !#/,03.222/-0-0,.,IFIIIINKMKQMLHMJLJIJJLMMLKLHKMMMQMONQKMNLJLLOJQMMNOOQONPPQNQQQQMOOMO WXQQJIJGKJHMJEH@A>>>=>><<==><==>???=>?>BEEFAJHIHJKKHJHJJNKJMJIHFCCAA?@>=??<@CACBCCC@?@@>?>>?@@AAABA@@AACCCCDCBCCAE?EBDEE$%('ffgifffhff)&%$_`ZNIJEIGHGGEEHGIFHDEFHHHMOEDAB@A@??BBBDGDHC/*&+'%'&))'*.+,,)*))+-)---.--,+/.0,..14623844846100/-+2/241126749>;<>>A?A??@@BA?AA><9><=;?;=AAEFFFLPS\WYPFD?>6<8=:<9<=;;;?=<;98@=988;;;;6=9:<=?=;@==@>:9::89=;;9>?;;=;:>=;?B8=@@:<8;=6:<9D@BGBGDGERLOUOTTUNXZVXSQWOSPX^HIGFJLHGPQW`pcMRPOOLNLLLMLKLQQLNMJIKKMJHMJKKJIGFJFDHECIIHGAFE@CHTQRWXZY^bg`dfccbancOHNJLLDCFHHCCFGFFHFFDEGIKHFJ@JJBQNIMGNOSUV[W][cfpwyROMHFHGG@EEGALFLJJD@DBCBDGAC@E@FDCDADBBDB?@FG@CDD=DB?CABBDA>C@C@C=@5C=CBA?=;>FGAADKT[[RJIQORNMB7=>A??:;;?@=;;;:?88==><8:997:>9:@79:6;<=46747688864665:74534456555277698:;CIFHLYlfi^`[bhcheefhkppedg`dbfdb_`jbfgljbbbeefdf``fgffcnmttxvywuqmvpspqsnlhejficdcjcigigklkknmnvwkaUXYYUautvwu_]a_^]b[`_ZT`YWWVEDD74-*&$%#(##"%$"!"2.-/.-//./1+5../JFGHJJIKILMLMNLNMKJKJIJJJPIJNMIIMNMPQMPKLMPMLQKLMNMPMQNPSMLOOQQQSRPQNLOL QT!!VTQONJJKIKKKG>B>?@>>=?===<>?@?>>==@?BABDCFJJHLJKGIIHJOKNJJGJHCB=???>=?@=@?@BCDA@??>??<>=>?>=>?A@B@A?ABBAD@@>ABCCCBCDD%$')cgcgdgfi'*ecca&_XQGJEFIFEFBEGEIFIIGIJGJNOOQCBBBBACC?ECCDCFCF@&(%&%%'&'''*/-/1-.*+)+++,,*,+,02..-2,.3744550456430/,,0/11342544;<>>=?@@;?CC>;=8=;=BBCFDF@CKJJFNKLQSSXV]ejmt}}xxrnjsqz~»wqqjfhia^]]`W^\`hhiggff_^ZZSUTZVZTYVOKRKLNPS\]acfjgkjkpnu}{ulg^]`ZVOPFFGBFDDEFIDCFDEED>CB=;?<@=?@;><9=:=>;?=D?EJINQUWXWQCDA?::;;;:>89=::<>8<9:>:>8;:=<>:?=;>>9=>@99=>;@=<<:;;<=?9;;@;@@=>=C<=?ABD@@A@=A=:B=BAF=AE?@=C=EC@B@?:@CGHDCEDPMNPUTQTRUW[WZUOWPUNdVGJDEIFKJLM[^qfVSUXVQROOOPROKMOLKPONNQHMKOMIGJHFHGIDHJFDGDDHCHEDMQQTSTZ\_]daefdgdfpbNHNNKOIJBBFGEIGAHFCGJEEJMIGRCMGHNLKNLPKUU[VX_^]ksxyQFQJJH@HCGHEBHBDLCHCD>CBFE@DB@?F@DF@FBGDCCB?A@?CB>?GAB@@<@??;@CDEEJNV]YOPKPOSTL@?>:A;==?9::=98>;8;<<6:;>;8;<96;8:7:874;794<253734/149/;62263461331642550;<=GDHHVm`d^]_]dklgfhdnkh_gicifc^ddjghgfigcffhhdfieacbccjioryx{x|sstpkonsnfec^b`f`egofhbmhhoqmomut]WZSWTPOZz~vtaaeha_gY][^LUJLHSG78,/+%)&'%%$$$%#!!!2/03/10-..0.-0-0HHHGJIJHIJMMLJJMMNKJLJNLMNMLLLLIKKMQQPRONNMOQLMMMPNMQPNMOKNQPQPPQOQRQNNNTU""SMKMIGJFMIJE>A@?>=>C=@>>=?=<><==@=@@?@?A>@AADDHJHDJJKJKMOOKEJGDCB@@@>AA?@C@A?AA???=?==?@@A@C?EBAB@AACB@BCCCCCACECELLV`_dfkheeehif&*f__b'&ZREHGEJFDGDEFDGJEHFCJEIMPLJBCBC@@C@CBDCDFFED()&('%)')(*+32201031.,,*0/-*,-+/.+./,/2723443.355200//-)-211338887=?:?<>;<9==?AA;=9?=>E>@CLHJUSUSWVQJC@A;=>=>:?9<>==?<:<:9?;@89=>;99=9;9=@6>;<:;=<<>>>==:@B?A@:>DC>==?DDA@B=C=AAD>DDBB;@BBADA>CEDDEFKFMKONMRTUVUWUYTWSUSWTYF?DCA=?DBFN\^taNPOQPOLJOPJJJLHHCFGGJFKHHFGEJDJGCEGCDCEHDJCBF?FDCHQPTTW_[acedhfdfchlbKKIFGH@GHHFDFFABEB@AKKFJLJCJH@EJKHNIKMKVY\YVZ``goz}|RGMDHDCFBCDGEGD?>?ABCD@AFADBCC?@CCC>@E>B<A@<=@D<>@B<>=;@??C:B;FHRT\INSMJTRL=>:>B:=>>6>=6=8=78;:6=8879?:889:54695;4683/86566852223;:5247/3//473500229478JBAGYnbda]`_bepmmnkhgfcgc\aecce_e`hliklaf`gjigljbadbchiissvx|vxtrllmnlkmfbbahfefklgdmklkqnrrsaZTVPPHBLJ_}zwyjbh`bc[]]b[LYOQU?5<4-*(%$%$%#'$###$!..21031,-/.-22-+HGGJGKKJLMIOOLILMLLJLMLKJMKJLJILKHNOMMMMMQONJMMOMONKNNPRTQONNOTNKNQLQPSV!"RNKKJKKIJFFC=@@>><=?<=@@?=>?@AA@BCCFHGGIGGGJIJJLKJJHIHFCA?@?=@@>E@CBBCA@?@?=>?=?>>CC@??B@CC@CAB@BCABDCCDEDEGPRV_`efdffgfac(&fdab`_%\QJGIHJGFEFHEFFEHGFDHGFMQNKDCAAB=?BBBCCDECEF)*&'&'%())-/265522/11,-+../-+.-,/.0-+./593442345374/.-,,,2122375857=?=:<;8BD?;DAB@>@ABCAB??>=?:>;;=;;?@;<:=>:;<8;=<::9=<=<>?99;<==<=::=:<8@<:<=?=><=>>;@=B>=@??=@?B>BA=@B@====DACFJHJIHLKRTKQQWTVSUUTYUTOVQGFDIKDIKOQWZ_qgSSMPLQKMNIIJLGILHHIEHCCHA@=DE>F:>>>=>BFQURSW\abecbhffiacn_NPPKMFIFCHEGGCBCA@ECGFHHHJNLDHHJIKKMIOOVY\WZUZbfozNGOEEF@DIABEEBCA?AAD@EABC?AA=C=BAD@?>A@EEBB>BB?A@CA>C?<<<=>CB@<=>:<>A9<9:;9;>A399CCGHStc__]`ehkvpmrje`_^]`aecfc]h`aibigcdfjgdfabb^ifdfhlrszuzvqvoormkokjfddfhcaedkefljmonw}xc]VNPRKIGIOK[xu|uvlc_`gb\`]Z]OQ[WD?=71+.+'(&$#$%&# #%""10/00.0---0/1/2-IHGMLJIGJKJPJJJILJMNLKQMMKMLLLLJMLQMNQQMPQNOKMLKMPNPLKPLJMLNOSRQSQMLQQTTY" LIIIJJJJHFC?=<==<>=??===<<=>?>>>=>?>?=?>??>??AACBEJJEHJGIHJJHLLJJJHGIGBAB??>@AE@CACA@>=??><>=?>?@><@??>??>BBAACCCDECDGKPXT_ffeg_gfgdh''fc_ba_&#NJKDEFFFCEEFHEEDDEILOLNDC@=A??DCDEBEDAFD)*'(((&%(*+/2522.42115-0+,,+--+,.*/,+-.055666533634//.0)*,114433858;<>:6=>AB>>@>9:B<CDIEKKPMIMIOOSRSa`f[daaemt{¹~wxrvpmkohhdbhhac`ac_d]_babebdbaZVWLRSSPVQROTPUUVPTWX^_dckelisrvy}unc]^UVSKGCFCBCBDFAC?CDABG@B>A:C;>CDAAAA>F@?B?@EFCKHKOQTZUTRNFE?B=<==>=>9;<=A;9;A<=;@>?;>@==><:<;<:;?=:B=>:=9><=>>>9>?;A=>?=<;>A>;>@=<@?>>>==@B;ACAC@A>AA?A<>@BA=GDDAEKNKMMNRTQZTUXSW\PSVTRXeOONSQUTQZ\^XXdoh]\]Ya\ZTWWUZNTNOMONJMILCN@MJFFCAEECC?BAD>@HFJCLNIIJ>GCHFLKKJIUUYZZZX^^hqy}|NCFIECA?CBBAB@@?AH?A;BBED@?=D>AC@CCB@B?D>;B?AA=AEA?B@@=@B:A@B@EA>8;4;7:8;47:794<4<697579<878788613674538654744630631214233515.0/.652>7?557?@AGSrdd\Zcev|qql_cdcadgfddccjffhbdcgdkjlfeace`fgfhdgv{}xw{pnrnlonojibgegfgdhjiefijkqybZSWXMNKLLHOFMW~x|vue_de^_]`\YVVQYGG=2/0)+)"'$%#'%&"""%" 30/42//11.010/3.HIGJJKJLJLKKKLJLKJOLLMJLLKPJOLJJKLLJLNLNPOOPONTMNMJNLLLPNLMLPNNPOQNOPRQRQNPQTUW !MKJHJJKIIGC?>><>=?>@>>??@?<>>>@@AC@??AABCDFEFIKIIIJJIHJJIJJJJFEAB>?@A??ACD?C@A>@>=><AAAA?DBCDEDJIM LUU^cafhfhhdhb''eb`a]a%"SJIEGFDEDHDFDDEGDGFMPONQKGFC@BBBBC@CECGBEE'((&)''*%324452/,*/6370--)&,,+/.-+.,,.,/4:86467;<9;50.0/)-//2214987:;;:98C@C@BACCB>=AA<=B==;<=>?>?;<@=A?>A>><:?:;8;?;==>@=:B?@>=><=D=<@@@@A>AC@B?>BHHKFENORMSYOSTOUW]SXTSTSQ[^WVWYX[[\a`__[_sÁkcdbZ]YUVUNTOUSPRQNPIPKOKFJMPNNHMEHFDFFFGABBGCCFMPOTSVW]dddchbiecgoaNHJGGGFHDHHDDCEBBAEEIDGGFMH@CIFHIDILOJLPYRYXY\_dpu}wHCC?<=8<8=7=::::;?=:8<=:9=;;<;8=:::9=?;<:5;@::?@CDBGHOQZOMNTIMPK?:@5>;97:69/***+(%'#%!##!!&###"3-00/,1-/,,/./21GGHHKLJJJLJHMMKNJJONKLKNQKMKLLJJNLLOKNNLRLOPPJSNLLPJLOOLPLMMNMOPPPQNOQQQPOLPSSW"!MMHGJKJIGJC<<=<>=>=><=><=<<===><<<>==@???=?@?@AAA>CBFEFHIJHJINJNIJJJJGGGEC@?@A?CAAC@>=AB@>@?C>B@BCCCBCBCBABACBCFDHMNP!P !%'fehgieegg))fca__`$$QJIEEDFEDHDEHGDGGGIMNNNQGCEB@@@ABCFEBBCC(((+()(-(253686/+/.1052.-*)*+-+,+,.000,/27;47:;<;;9750,-+-3+1330357:9=68:?9=@;FB><=8??>@?DHNQRUVTNONTYS]eigbb]_lmvxyrpnoikfcf_bdacdbdc`]][WZV[\ceegfa]`RTPOOKOLJQPMOWZ\_edgfnkomttu|ynhd\YYQKIFCIEF@CGAAB=@===>B?@A;?A=@9=@=D?=?B@?>?=A@<@?A@A??>?:A=>;>BD==@?@=BBA>BE>?C?D=ADAA:FCFCD>A@@CD:B===8:98A98C>7=<<:;<:>;=7:9:9;;8;<59;7989=8<=89?99?7;76:5789=7;=B:A=>EAMGILYLOOMKMPO;975691:67899;348457:636=447<7:9486503375654804635-3246.2129200-8/1137453668=@EJRuag]d^gkruox{oab_f`bfcb`aabig_efhhakldghjkhhcdfkffhuywxyzpqosendnmjgagfefhekjlmtn\VYTGMJJKMGKJLEKIWz|txtvcceb``ab^VWTLFB15+,)%*)''&&"!$""!!!!/,/.12/.0.-,30,.KIIIHJJGNJKNMJJKKNKNJMKIKLKKMMLKKMKNJNOOQQQMMNONLKPKMLMPVPUQNQNQQSUW!KIJLJJJHGHC===<:<<<><>==<@?B?FAEFFGHGCJIJHHMJJKJEKIFFB@A>>@BBCA?@>@AB?>A@A@A>@B>@@BAAAACBBBABCCGJKQQQ QU_'(fffgkffa'&ebc``&%%PJFDFCDFDEFGHEDECGGEDJONJGFFICCA?A@ACECCCCHC)(,+*,*0/560679/,../+01-*+,+,,*+-.1003./5427;>C@><;;:1//.1-00425558685::<:5:A=C>9?<===<>A=GGQQOQSMQMPTX`fdh`b``ccr}}~}ztrmjihef_b_^ggcgebddbZWY]\\cgfdheec`YRLNIGGLJJNPT]X]aacgkkhimqsx}xif[OWVSMJGDDEFCBA>?DBBFJONLNTSRWSRNIEE@EDECBG>BB>CB>C?D<@B?ACC@B>@@D=D>>?<@?@>?=B=DB=B?A?E>AABCCB??EEEGA?F9F?CBADB>D?=BC=?>D@>?=@DGABDGIJPTORVOTUTVWVUPOTNQalceechedoluwse`^kwwnoecba__c]`[]XZVYTXUTZWWVSTTOIONNRNKMNQFHMMTZSQOSY_Z__bddfg`eocSKHFIMFFCGHFGEEDACHFHIJFGGFHGDKIKGKGMLJTUXTY[]bhpyzQHJDEEFADDA>B@BAFA><=A>@??@>D?@@BC??A>@=?AA?==C><>9;=:;6:998:>?@=B@@C@FEHKNMSLKOKMK54:35844469343454551633./144131410/302/62202///1+4,.00240/..//-/1-123/45404;=@AFUxe`\dakaqmdpmmh]ad\ad^b`bacgieedfgjchfaljcfgcdbfhgisuyyzxurskmomjmjgfilfhkfooo~kaTSXRNJKEGHJKIIILLIV~~y{utkbca``^[SUMMIC:/+**)#*'%%$##!#!"""" /0///./,-//-3./-FIIHGIJIJIJMLNJMLKLQMJLNMMLNLLKLMKOMKLMNMPOOPNNQNNPPOSMOOPPNPLQPONMONQPRQQMQTWX!!NJJJHJGIEFF><<><>@>>=<><=<9<<<=<=<<<<>>A>@??A?C>DEGIFIIHIIJIIIJNLIJJHJECC@ABBAD@???===@?=?=A@AABA@@C=AC@AAAABEFLONMQQWQX]`()fcfhbeef%(a`b$b%$QJIFCFFEFCFGFECDFDFEGGJMNQKOEFDDCCCBABDCCBDC+*,**/-.3494=6:0.0+*),)*,,)-..+/----+-117468@AEDF>?<:/0/-**.12441457679:<7:?@@BAC??>;B:;ABFIOOTVSLPKMQUZ\bheb^^_[hssx~}qvnkohggehbalhchgha__WYY_bbcffdkehdaf[XTJHCGKKLNQWZ`bgehhkonmqux}ufh\WXRTMGFDDDEBAC??@CB?:@<@C>=?CEFRONPGPQVUSVYRTXRUVHUPUefihihiikrruw}i[`s}ynrpnoehgcg^e]^^]YV]W\XV[XX\VSVVOSNRRVRSSNLNRPQPTQWZabcgddd^dncHILGJGHJGEDEFIFGB=DEDGGBGGFEFDBFJJKFNKJNUTV[ZZcemvUPQIHMGEJDCDGA?@?CB?BA@@A>??@=@@7BACIFHEBDEB>@?F;E>ACDEC@ABF>B=?=A::>;A>AAADDKNDKMSPJVPMJG=;=>>?=::88687:=;3633181324135152154062/..+1./03/302/,/.2.1-,*(/-./1042-/239?@;EL{d`[a^ddegalilm^_c^`hc]gd`efbgceegdfejbgehghc`cedempzy{}xsopomjlnjkhffofmrnnyr`OUPQTIFGJKMNGNMLHHNOY{|tthc^X^[VXVWTQJ>71+)&(&(&(&%"#" ! ""$.,0.110.,.....-/FFIHHJIJJKIMPJJJILNOMJNJJKJKKJKOLJLKPJOINLMMJPNNMNNJOQNQQNNQMOPLOPNOOOPQQQQPPMMRVV!HKJJJHDHFEE<:<>@<>?@=@>=<<;<<=<===>=?==?A??A@C>CFCEDGGHFEJEJJHJIJIHJHGFDCB?CCC?B>?>>=@?>=><;AA??;>?;;=;=?FDLVQQONQOPNSVY`bb]^YWTblnpy|zywqpohglifihfjkfbeba`_aX`^bhhdegbhc_\\[VJOCJIKLOPXY]aecihkkmlpsv|yji`YVVVNKFAF@>B?D>A?FC;BB=>;D?;C>=>B>>JDCELHNMMROSTPHSMFFJFFHIFDIGGHBKGGFGEIJJDGFAEFGFCIDEJEFHGBDDCCFECDHGIAIFCECGJIIKFGHLJDJJGDJLJIJGJFJMIIICED@CEFBI?AAKJIIJNOMLOSTSOTSXUSUQOTW^leimpmkjnywwwxbX^t{|ywsjoppkijiae^_^a_]^][^^a\YYYUTTZRVRQMMPRVSMRVZ^]\ae__dgbgmeMHPHCHGHBDH???BDADDJEKJHIHHAEHCHJGFHFLPQYTUWZ[dfs|}u[POLMNLFCEEGB@=GEED>EAD>E:=?A>HKJLBI=CEEB=DCFABBB<=>>>@C@E>?;B@C8AA<::FB?AABAEHFGMMMMNPLTOL?A>??B?>>;;?57678557/33111605305/-/4352024/13/201014/.30--0/22-2+02-/1;.,686CC@FN{}bcce_diyebidkebb_cbbeccaa`jgedcfjgglhheollifcfadfqsz~~|vurromljkkkjjgqipo}vgWXTTKNE?HKEEOKFLNMGLM]i}{vsf\]dcU_WUPQIA961,,)%()&%$"%#$!"" # $$/0/24002,/,000.2JKGJKJJMMILLNMOKPILMKLNNONNJKNNLLLKNPLPLOMKTLORNMPOQKLPJMNQMLQMNMOOQOQUPQRRPLQRXV KLJLGJ==<<<<=?=?=>==?>>?>?>BAACCGFGGGIIHHIHJLKMKJIHGIFDBECCDCB=?>=A?>>>?>>?B>CB?BAAAA?FFKJNNOQSRRQTWce&(fkhjgfebdgc``a`%%UKIGEFGEFFDFHHDHCEGGIHLQQONLJHIHEFBBCDGEDCEFG./.21,111=84:97/1.+-.(-)/,+.-*+,.+/05<899:>?AAD<@BF>B93/-*,-00541054:6=8>9<;?AACC@@::>?>;>EQOUNRTQUNLOSU\]bZ]^]\W\`gjv}|vuonjjlooijjdhega`bb]]\`dgkmjhkidccc`\ZWTPKFDDKOLT^_`edgfkonmprvv~}qie^ZSPPQPMHEFFEG=C?C>>BA>A>@=?A?@@;;@;8?<CBFMHPJNPUTWOXQPWSVTRRSOST`njklsoopsz{yx}g`]r{wtyttspljkhfefdecb`\]`aX[YY[]YWSPTRTTSPSTWVSTa`bj^ie`daocMMMEIHIAHJGEGAHH?G@HHJJKGBIDDHDGHHLIMIPS[RRYYY^fiy~}[LIIQLMLDBFEBEACDFDEDEHDEDA>@C@>FINKN@CAEB@E?E@B?>A?>?@C@J>CC>BCA@C3GG?ADAC?IACBEEHLNKHOJNNOMODCB?CAB>B87=6;848133443521101/45312533.-104200-312/0./1.+/200+,2*07//0/46643>@D?Kwuefae_atmjo_ped`acc\ddaeb`gd`lffmbkmfiejeiebcceempqxx|zuplnimqmjhijgnny|dTVPWOGJHLEJHGINHVSYebdghq{zxtsf]aYZUVRS`YIB71.'+($((&)(&&#$$%% !$10/.0/-..-+.2-,.GHHHIHJKGLLJKJJNLLMNMNNMLMKKJLJLJLJKMMMPNRPNNNJOPJMKOLLMQOPQJNPPNQPQRQQMPQURX MLJJJJGGKHLC=<>>>==<<<=;=<><<=<=<<<=><=<<<>=?>>===>?>A>AAAFJHJIEEHEHGJIJJJJJLGHCDCCCDB>==>?=?A>@B<@CCAA?B?=@@@EEJKOPPNRQTX^_'%jgfgfe_ddcbc[b%%fQJHFHFDCEBEGGHGHDCFEFJKMMKJIJFEJCBCGFDECCCF,/0/1.2227798756841.0-*)++*+)++,--0.5?D===BDFA>@@:=;;75./,.).0/624348696999=<>@C?@=:9@@?>=:==>AAB>>=;@<:;<:<7<>7AADCHHHQNMQOLMGEGEFEGBBCAJGGFGHGDGEDGEDFEFHCGDECCIBHDHGDHFHEFFHEHHFEGIEIGDHEJOFJGKHJILJHKCJMJFGNLELIJLEGFCAFECGDCEEBF??GLPNJF@F@@@CBBACA@AE?@C@C@K;E>?IGC?B<<<<>><=<;=<<<><<<;=<>=<<==?A=?@ACCHIJGHJGIJJIKJHIKKGIFFDD@@>@@=??>=?=>=>=@?A?A>>>>?>A?ADCLMONQQNQSW[a('ffgkgccecbc__`#%_PJKFFFCDECBCGFFHDFGFEJMMQOOJHEFEFBACCGFDCFI*3/////439::937;477931+,--,,-/-./0-58C?:730.,+/./1655148;:97:?==@A>=@>D>>@@AGIJHLLMKMPNNPRUUWZY[a[XSS^euƽ{qkieeilhjgid`_d^]XY[Z^]hnlimiijde_b^[\]USRUPNPUPW[`bdbfgjkolptwwzumeb`ZQMMNKCCA@GBAA>DC?FC;>?;>=;<;B@?=<;;9:6=8<==>?DDGGILJPTJMJEICICDBHHFLBFENBICDI@GJEHIEBFAEBFEHEEEEAFCDGEEFFDGIDDGGCFDFJFKGHEEFHIHGHJJIFMJGDHFEJHEKGHCGD>?=EBGFJHIJLMKPLVPTNVSUTQTPQRgjjqouurrvvvw{{j__p|zxxppqpoqljmklmf``_`b_Y_^UVZXSSQURPQTQWY_^af_ee``boaPIOHIFHAEDECDE@<@=CBECHGIEBEEDHGJAMFNGMKURZ[XX_cp{yOLMHMIEKIJAFDDFECCIGIACCAHEGCKLMSRBDEGFEDFIEKIA?>;=;753434316624014:342136507061.38121.-./0.-//01//+/0.,0/000/-1..202?@DHLp}b^b`_ruqifohdca`\_[_c\e_heg`eeinivsjkfohdagadc_lkrz{~}yvpjojpnooplwlYWUNNMFDED=DDAEJGKac`bbaebjco~xswtaWS_XVVW\^K<7+)*,%$%$&%$'&!"!"#!"!"!/0120.//..2/0./0JIGIGJLIJIHJKJJLKMMMKLNNNMMPMIKKKMNMLJQLPQNQNNQNNNQQRONMOOPOMNMPQORQOSRQNQQZ!"QKKHIKIJJJIEC<<<<<;;;<=>=;;;?==>>?<<=<=<=<<==<<==>==?><=>?>BCGEGGIGMEJJJJMJJJILIJFEHBA=?@>A>==<=><@B>?@@><@?>><ACINOMRQOQQTU[%'fgfdgbacc('b]__$_`TKJHCFGEEDEDFDGEEDKNMNPOKHJJHFECC@CBCGDE./-.///2279=8056889;:84401/0310213-69=:>>>@CBDCDBC?@>>=5/,--.0./4516:7;<;898;9@<@<<<>A?AEDCFKDNLMHLLJLJKTYYaY[]SZ[ZWfwʺunhfddgdfbcedb`b_\XZ^]\iomlkgkfbfac]_]XWQVTSSLQVVX]aadkgllnkoou}}srib[WQNIMJDBD@D;=;=>A=F><===::@<=>=;97;89:;>???@ECDJFGRIHCDA8;=?A@@>B?CAMNMLDFBECFDED@BBDA?@B?BCBA?BCBF?CAACGCEGFCIGIFCIIGGHHFCDECCEGEGEKIEHIHFDFHJEFDA@?DBGHGHLMQSOULZUSVVUUQTPSSVmjonrvutsutuwzzyo\[w|xwvrpponljngeje]b```]]\^VWb^WQTURORPRTY_\\ebc`ca`ncGKLGHDCDA@BGEFEB@@ADCFGFEDBEBHGFGJGFJKJQSWSUU^caltzTOTKMLLGHH?IGHGJCDDDICDAEBI@GRRRMIBCFGCEBDECBGDADB?CCAF@F>?DLBLOMRMErWG5DE@@EE@H?CNPMNJLNIKOHOMUYZJMG@>;9;854674443634/56066632623.5325974141/./00/+110/+00-////0323/0/4/3;?BFLr{ab\]`o|qlcelkdbac]_a`d_`cgheccdlmz~nkbhaefadcgcnoxz{}~wvpqrtlrqpt~q[PTTPKIEBAJGD@D@EIO_hh_a]_eakki~|ztqmSZU[UZWSVD@0)'+$$#(#'$&$&#!##! !!!&!00.11.10211/000.JGFHKLMJOPLPMLNQNMMNPLOKOQLMNOPNNLLJNMNPOQQNNOQMPMQQQVPQRSPNQP! QSKMIJJHJJGGGF<<<<;=<<<=:9<;:<<;=<><<<==>=<;<><<>=>=@?@<=>B??CDCEHHHJIHIEIJFJKJHGIIFFE@@@=?><>=<=?=>@@>=>AAEILMPQQPSPVV_&&feefdfdgb'(c_[&$_`VLJHDGGCEFHEFDCBDDIMLJKQJHHGJFEDECCEDDDGI20/0-1-2158=<7789<89C>841111110/265574:B=@?DCAHBBDBCEA>7643.,--22538:9:=87;:<@?@??>:@AECFJLPPLIKIKKIONUVXZYg]bbW[Y\]hvzȵzlhgeadeabaa_e_`]WZUYbgjrqoohgdaeda\[ZWYPXUSUROTW^\^`bjfikjnopu|~rtlc[WTNFIDDACA>?<>=>A=@><>>?:>9?:=:9894989<9=;?@BAIJMSHHF@?8::99=@;@@?DQQMMKCB@>A@B9<=?;<=<>;AC?A?B?B@<<7:=@?CAADENJG:?EBB?C@B><=@A@AJE@BA@@CDDCG@DB?A>BFAHGKIKJQPMUUMUUVSSLUNPOPelmrojwy|uqtvszzzr[^o~}zrxqnpijlhcfc[]_]lb]]]^T^_VUVVSVRNUSZZ]ae]ahedinaGHHDIDCCDBFFCCAA@@EGFFHEGHDCA?CFBDHEEKFSXSVXWY\cnx}xXOOILFGCCIJGGDJHTMMOIDGDCG?BBDEBBHBE@BBABAD?BA@DEGLNKQIFhWD>HFADCDCCFHFNPLPOOKKQJJIONHKMB6B<989578.133150225202320477/153549<5001+.1-1.0.0.,,/+-210*/0/02237149CBEIqw[b^]deymg^kfpgg\_]`cb_badbdgddiii{yhljca_bbcgbcjqy|{}xqpslqjqtur^WUPUKGFB>DAJECEICML[idie_acednrvy|yollSUYX^[UV<:5('&)%'$%%+''%%"!'!  #!"!5+00./11/012/101HJGKLKJMLNLMMKNQONNPNLMMKQLNMOPOQNOMQSQQSMQORNQNOQPPQTPQTQPVSQMJJIJIJJII<=;<<;<<;<;<<<<<=<><<=<B?>==>?@=BCCEDHJGFJHJGGIHJJINIKJ@>>?>=>@=?@@CA@A@@?=C@CCFJOQQQOUR! !$'ffeghegfdfd(&$$`__`WJLEDECFDHCGEDCEDEJLORQJHFFDCCEGCEFCJH/3/../.2288;<:88;;9:8D?94213443555769;<;BB@IGEFDCEDEFCB@<<<.//.1190989;:8888=<<:9;A?=CDGGGKFIDDIMHHFNXXXY`U\YZYX]\^adr{}ŧ|mkcabddbb\\Z`[Z\\[X^]hmjmomlffe`ba^`^Y`TXTVUPYVUZ]_bghiinjqkvsyyvohd[XQPLKCBB???@>A:=ABB?=9>;9>?AA=>@<@>67576:99>?>?;;7<A?CEEADEQKGA:>>==?<:9?AEDEFEEDBCCF@@EFCCFE?EC?D@FHFKMLMORQSSRTSPSURTSUVmgqnmvtx|zpryz}}i\bs}}yzuwnrmhjjdd_^[_`k\[]Z\\XXXW^\WQOOTYWW^d`bdbdWer_LIJFHDHFDDGCFFBE?EDDEDDCAHHCCBFICGJMGLGLTWPSX[\aowz\PIOJHHNHIDKDAFEAFECASJIGLRRSIMFGGEIIFEKH>DEBB@F>ECC@CBB@EHLIHMKKQHAf[EHCA<>;:795834042.3225322/421862/32634:934.23../.,0.////..*/*0////1,221227>=DKhy\^a_aajdck`jig^Y`_b^^`acefj`dhignbkfmgieddecdeimmsyzzwwwqprvztbX[UWKHFAIECDFJIBHHJM_ggdcccceegjrvwyvuolTVZS`YQQI93)'*+*'%%($%%$#! %$$"$#%"$2//00...*/01///-FHHIIIIHJJFJMMJMMLNLMONLONLNOJNLOMQMINMKLKKKMJKNKMLLMPNQRNNMLPNLNNNONQNQPQLOOSTRSQQQRLQQRUTUQKIIHIIGIEGFD@==;:;:;;:<><;<<:;<<;;<=>=><<<<====?>>A@?ABCECFFJHGIJFKJJKIKJGJEDDCBA=>=>>><<><<<>?@BAEC>>A?>??=B@@CAHIQOPQSQRVSX__dgd_fffdcdfeff_^`__TJIFCEDFDFFFFCEECBFGEJKPMMNNQMRNIFICCDCEDBBCDECEEHI.2/-.-..134=9:9<=:<;BADFCFBDHBDGG>@><62-//418495:8<<;:;>:;@:<<=?;?=?@A?>A;?>=;:;:<>;<>;=8:8875<4;:<<<9=DEFHKLHHD=9<99;8???@@CJLQNOGFDBC?=@><:=:9;=>9@?;:ACAA@ADGIHI>::;8;?@;>AE>CCA@AA@@>ACEEB@@AB=BBEEDEIHIIKGTQTQTQTVSQSNSQN^nmkonqtssutty{{i[br~|zxtqqlsnkgh`b_]aa]]^_\Y]\VYWSWVWSSOKUT_`ecb`ie\dqaQLGDFGBE@@HDDHEAC@?FFFCEDGDFE=DIFCIKMLLOPQWWZ[Zcju~uWQJMIKCHGCGHFDDBCHFDDIDJIPQSQGIIEGHFFHCDGEFDAE>GD>CCF<;ADHHHIGIKIJJE`UL;EEAEGAACGIRQWSLLIPMMNIIFC>HEC=<4;86;81/122324344//122513.0062645724.220.,,,.,0.-//-/.*--1/..-2/1/6=:AAHiy^_b_\iifgh]he`b\]\`[a``l]ejbghfehhhinbgdc`ccfidlqzuy{yxsqsttvdPVTTPL@EF@D;<;;;>=;><<?=>B?BCCDEEJJHIHHGHKNJIIGGCFCCA@?>==><<<<=<@AACEDDD@BC>?==>?@A?FKKPNPOSPTSSZaefgefibdfedd_^\^_^XVMGFEEBCBBCCFDCDCCCGEJLOLMLKMKPPMKJCCCDCDADEECDHEID,/0-.-/0/48:979<=@<>>=@B@:585:9<76478<?=873/2-011278:77977:7::::<;A@EJFFDJIEFAHFKJKOTVZ[Z[WS[Y[\`b^epz{~}}ί~sokgbacgc_bec^`_[ZXYVSWcbaiomnijfc]a[\Y[YVQOSSORSUXY`bfciihgilont|~vrhe]XPKKHE>A@A>AB??D<=@;@><;:<<>B@<<>=?=89:395<:9?;<=:9?:>BCAA@:@>>?>BACDA>@EHIDJELMGMNRRPTPVTUQUTPQNTfhlkpotvuurtry}~iWbs|{uwwuxqoqjmigghddb]``a`\\XY\XYTYVRUSMRMOUWX\^c_a`ibcqaJIDIFDEGDDHDHECCCCEFEFDMC@CABAAJEFDKGIHMPPURQUV\hsz}WHILJJCCGEFBBGCEFHKKHHJKMNNKMNAEFCFHHFHJHCJHDCDDDBCB@ADAAGHJEJGJLLL?]XJ=GGFFIAJAENMQTWNEKQFILJFD=EKJE<:<>94352/14343/341027/35441639326456.2//10./,+(0,,-/.0//../-/31.04/1:@DAHfr\_^^Ze}ec`b`i``d_]Z_[b^]abie`gijhhhledjihcfcbddddvwy}~{yvvz~f[UVOLEABD>D>CBFBIFIQY\\`jdgcccdf_fkmlw~vqyrd[PRXXKLG=<,&%&$'%%#"""!#$ #"!!#"$'0/-/.//.-011001/JJHFJHJKGIKGIHJJHGHNOPNNKOPOOJNJOOLMKLNJKQMMLPLMPRKPPPPPQQSOLPQOLOPPQNLRRQQLQQPTPTTQQPQMRYTQQJJKIGJFEHGDC@=<=;<<<<<;<;::;<=;9<<;<;<><<=<<<=<==<<><==<>@@>?>@CCEEGHFDHHGGIIJGJJJHGECC@@=?@<><<>BCCCCCDDCBA>==>?>=B@HKMPQRQSQSUR_`fdifhkfcgccefa`_^__XJFFEECFFBDCECCCCCCEEILPMOOLLOMVRLJFCCDCCBCDCCCCADD++-,0,-1-4;;;77;?>=@D@<7695447577>==BEDGDE?6612212-2078:58<:8:8:;8=<@CCHEHBEDBCABFFGFOMUYUVTUU\YTZY`]an{}y}Աwwujifbdhfaecd`ba[XUWWYY^^_hejlfiff`_`Z]UWTSNORPSRWXa^`dcidgeechjo|wupn_]XSMKCCCC>@?;B<=@A=?;;:=<=;;;;:9<57;5::>8=>ADIDNMGKF?;;8<68B=?>8=HQQOIAE>AACAB;:9<:<=>?>BBDB@=?:?;=>AH@@BGDGMNB@HCB=A?>DC@DEGBCCEA?EAADEBACB?AAAAB@DFHECD>EEHDGHJPLPQUUTXVbip~yTKMFKIGDJHIIHFDACGJHBLKMTOLHHG>EFEIHLHDCFEHEAAEB=;830/101),,.*'$$ ! !! ! !" !"! !% "! "!!!#"$$ #"!" !#"&$#$%&)*-,.-...++00010/2...,*)'$#!$$&%'&'#'))(+,+''&$" !&"%''21159689:=>9ALRNSPPORNPMNNOKLGJJC@3/+)**,**)*+)&')*0*,049524111*4<:.-'('((((*)))*)+,/*.,.11134989988:=?>?<=@8;8:<;>;<;??<=;8879658;@;:?@>EAKLJIH8>>;<9:;;@C:BNMONKFAB@F>>><9<=;>;=AA;CC>A??:>ACCAB?DDEABBDBDB@@?BCC=DAEDFGGIKNMJKRSYWQTUVUPPQISRbiiomnmlutuvvwutxuygV_uzywrqolnoiighcdbi_`]``a^b_\^UUXXTWTUONNQRPUV``bg_fd`aqbMJPFFEGDCE>BJHCCA>CEDGFBFHCC>@EEHGDANBIIUSVOVU\enuyxRLJFFFHFJLCGLDIF@DNDDQSKPKJECJHJEEHFIFAFPGC@FEF?@AB>BEFMLKMKGEKHKMGLNTE@MMLIGE@CIQRQTSMMJNHIIIDHADKE?;89:766663424.20201.2.510225145526750.,141001.0/,+/*0.-.--+.-04-./152<>>CB`n_a]\abroa_fg\cd]]]`^][]bcececghijkilihddeecbdfflnuv{}m]TRSQHFCAA@DFFBHALN\Zc`ace`kkghcb`a`cmmkgnx}vwrpd\OQLRH@;.1*&()"##$%"# "%## "##"!$## 20/.01,.100/0/.20///501/21//002/40656167365474575234492934373763665378869556456585456659776747:8:<8:7786=;=@951/./-++,+,,$  "!"!!! " " !! !#!!" "#$!#! "##" "%#'$&'*-,,,--,//.0121-1/+-*)#%$##%'''*%$')')(*'%#"$# #!$&)03579=866:<;>LOPUTONROPRQROILKMLJA50-*(+*)*(+)(()().*,/33403010/51982''&'(()()'(%(*+++,*-0330378<<479=89@BECCGD?B?;;:<8@=;EGAJEEDBC@@B@C@CB>;66664510/164988:6:76:99==CBJFEDEDBC?E@CHDFGMNPSTV`__`\[\afl|}ç~xyrqmkgggefdeba\]]XWUTQWVSWachihgcdcb\_\WUQKIINQRPVV\_bbbga`\WNSX_nv~ztni_\SPLGFBEB=@><>?B8=997866587?:;><@DEHGJIH;?8?7;??>@;9DLNKOGCABDD@>:;6:8;<<>?AB?A>?@;9:>>BBCDAE?CHNDEDGEE@C>DAEBBACECCCCBFCA?A@>B>?@C?CGFHCHFOOOSRTKTMQZRTSVQNU\ggjkjjnjsvvzvyvuywwg`^p}z{vrvrsmmmhmfjhfeagdac_^c_`ca[U\^[XYVUVNTMNNR[\dacb]a`Z]q^QLLFFECEA@?BH@@BA=CDBC@EFCDFEBBCDAGAGDFPQQTQSXajku{|YKMNMHEIEIFJKDGFDHPNSQQNMGHHMMFLICDAKIFKICIFCFH?@ECBDFDHFEGMEIMMKJEHDNE7LGBFGGEFINKPRQKKJMKIQMGEI:75:48:7640031/02/31/.0034205541171-./4../-+-,-.+,+.-..-/,+,,//0.031??A>FXnYc^[\_mpe`nmabd]_\```_[`dbbjfc``gigneidbbe^Zefdfip{{o\RMTKMICC@=ADBDIKKPZ]b`af_bfdhjhadc`dhhmolomxwvrr`RFNUG<7;2,*''&%'$%$%"#!!!! ($"&"$#'$0120/0102///1/2./2..11//31/111/4232382791345235326435744342564766;7766;6769796664664885159687686;A9587859>=::1/1//0.-.+*(& ! ""  "!! !"$" !!"!!!!"#!%!"#""$"##"!$$%&+*,,,-...2/2.//141/+,-%$%$%%&(*')#'(%&$%&&$$"#" !%"%.2475499:9>>BKPPRQONPNMQRSLIFIJGF?3/+()*$&+(((&('+*)*.0694231..-215<8-(''&&&))*(&*()))+*,/1/+2487<:57;89=>A?>;:===>6;<8??:>>:?::964<777<;HONMLEEC@AB>@=:;<99>@FB@=BB>C=8;><;?ACDJF?IKKCHEDDCDCAA>?A@>DADC@DA@F@@BC?F>ABAE?EHGDKJNQRRPTU[NXXRPUTOWV^egigkiintustsrttutj]^l~}}wutswtrljihjhlgedadecea`a^_]_VVZZX\ZWYXQQMPLMUX]`abe``^boUJGGIEGGGAD@?ADCBD;@?=GEB@EDD???DDFHCDJEIROSVSV]jeszYKKPGCKIHDDKGFHKHHLPONNEIKOEIEJBC@HHCKKJMHGL@CIAAEFCEKHBHNFNJDEGHQFFGJEED8<:748;<740202.020,-.2/003512442/55400/0-.//.0.,*,-+3/.-,2..2.1//.-027>CEGXm[\W\V^epebecc^`b[Y``\cbcheefgfgekfkkjplhah_^hggnpxyxaTNKDQFEA=?@EBCBFIS]]a^`Z_gbecfkne]agbdfihmliktyxwmiWKLUIA:41+''&(#'#!#*%%# &&"$%$#$'&%'1.30121/210252//,./112334/020/11181186544245252626322446343015579;766786;567973:47786666322286666<=98673743/,--1)-(+($! !! ! ! !!!   ! ! ! # $ "&"!"#""#!"#%&')+,--.-/-..-,//00/,/,*'$$%')&('&$$#%&&&)(%%#!!! %#)02457:8:<8=??MLOORPOOINMQPMLGHLJJA401,)*()&*'+(*%+*++,.353431/,1-044840*(&)(+)+)(('(*),..-(++326667599;698A?B@DJE:=>??BDB@EIELBIKIEFBAF@AA>5359685241101666897889:8;9@DBHGEGFCKFJFGFDHDFJLMSScnpnlicYXakpu|~{ֹ~|}zvrpknkgdfbb`^b^]U^YWWXZZ\YZY]]cahec^^[Y[TRFKDHFRRRT\\]`de\XRNJLDJZgvyqnx{{zmheYVQKJJDD>C===>@?=??=@?A?8<<9>9=;;@:=A96;:3648:>9:=>AADHNHJG@99889?AA;:@AADHDE>IMGDDEEAFCF=BCA?@@D@CCD@B@A@?<>@D@EA?FBBFBEIKLONQRPRUSXWROPNNRYhcmhlmlkmmrsppnotrytc\_m|wwvwururspqnkiegfiebdb`b`^aXZ^^[ZVYXUXSVVOOONQUUX[^``fc`^bg]JBCHFAFEAEBBFDD;B>DCDCCBDEGKA?EBID@GFIJNROQTZW[eirywYJNJIDLIKFDAEEDGHKRTMQMOIKKHJNPIFIHHGHIDDBHFABC?BC>EHHIIIJFJHGJDDHEGKIE>PEGOJJD@IQKRTWRePJLKCEEDC:FOF<869425611-1-10312433012/32315655362341,/-0-.+,.++()0+1,+.,.,//3,.-169A<:=>9./0/100,-(*'%" !#!!   ! #! ""# !"!"!"""!"!#"#()*)-+..,11.000/01/10-*('%(&'&(%%"%'(+((+'&!" "#$%*/146558;9<<@>OMRNPSQMLLNMNMLELJGEE7,,),,)*)&))'*,+*+(+.64357/1.*(*412:4+'&(&$&&&'+(),+//00,*.2439;74699999:;?@BEKGBBA@@@EBCHAG=?C?DBBADB?C;33567;764002.747;9:=5:<=BFIHED@EJFHIHIFGHJOMPT\hrwrnsd\Y^innru­~{yrvummkhhcad_`^[^`]T]WZ\Y^VZ]hcbdeec^]]YUPOMJHJIQOQQYV\\`\U\WOIJGIT_iw{pfdkuz~yxlkf\XTJJGBA:;@>;:8<;:=:<==A=DLTDGD>=;;;8>?B??@GOOLNCACC?@<;<::;<:>?=C@@@?@<<9;:>@E?BBDHCABBCCB?@>C?@>A?>BJCEFFFJMMMHRVQUSTVRQQLPTM]eekhjjlnotsrpqovyuuuh^_q|~yusrwqpopjpfkjgidgceaa]g^]]\X[]WYZXYYVXWUOMSLQWVW^a`afcc_]XNJBDHDBAD>B@@BAE@?>DCCBE@GDABBAF>DI?EGFJROOSOXXZ^kszvXJHOLGIHFDDIFHDKOKMQKJKGKJLJDLLLEHFKFJPJFIHEBBF?@GFENLGJHHGIIJIDJQKKHPJ>EJDDFMMEFLLRR[FWGCEJMICEG=CGE:9<=948515320011-.21/21404/0043342824//.-/0,,)-/-./030---/*01../,0.238A@BCRvb`Z\]^cpZ]^dgic_Y\]]]^_efafgjdidhldjjmkecabimijncUVUQPHGDG?>F?AHICNTY]e_ac_bc`ac^lctcc`b`aahklgk`jn}yxkfSEL<80),*(+$'&" "&""$%#'!$#&%&%*%$&"121410400342.12//53/20/0.-11010102246588:52436539354154747635642668475;99:968988;685977949579788><;98686;A?>74.0/0..*,,*('#"   "!! ! !!"!! "#"!#$ "! ! "#"#"#%'+,-..-///..//200.2//*+%*%%"$$%"$&(-*).()$%!"$%(,1545::79:;:??HPMPSUPNLPLPORHMJJLOF6,,+-**,)*')((*(**)+,5163232-*-)-325:1()*('((('((),-0./,...1537:8579;=5;7???><@E>C=ABF>EAEDFGCFBFEFGIJMJNGGIKPMUVYku{uypj_X`dgikoyźy{wtsvojlhgfece_ca\\[X\UZ\\Z]XY`\daeea_^\WWSKLIOHQNQSWVPZSVWWUUMGGFEJT]my}rfUV^jpxzzwpia`\UIJEIB@A>A>:=?BB?><;>;;9@;;;=>>C<<KQRLL?A=?@@>=;:;:;:9;?B>@AA>A:9=>??AA>AHCDMNJFFEECE:=?HCADCBFDBDBCC@DC:AAC@DGBCDCFEIKILNQIXQROUTUTPPOORXfaflkmmonloxossrywqqu_[_q~}y}ytuspqsnjrkmhkmigfdb`_`[YT\`\[WZWTXXZXKYTVRJONRVVVZab^dae[XOIMFCFGDBBCACGDBE>=>DEBEH?HB@AB@D@EH@CEFKKPUVSZSXdnrzwQLKMIJJEDIGJCEFNTHRIKEHLHHNMFPIFGGFEIQHOFEKEHAGD?HJHIKGFAHHKGMHJJJJHOSODMGHHHJ@DFILSTVTHHOFFPICAC?EDC9?98:7523420.,0-1//2.6141044/66654401512/4.10-/+,*..0/,1,1-131*..1--/;=@B?RpbXUTW^_e^\g]ecc^`Y^^Zdebdaecieg`ifdhkghgggejoovl[ZUSPLKEDEDCEE@CEMSUb^]b``abfb`baakiobff_`hjimkkdglmqxsbTHC86-/,*&'%+'"&#*"#%((*%*'$$&%'""%#0-22113/.1230./.../023202112110153025824566664737847878716232.35568475:8799677965745:5;686;77899::::7=8;FKQPOOTQNKNOPPHMHKJLF3-,+*+('$((((''&)).,1344514161-.+,--:75-'((),**+*,-12/+./..040587188=7655879>99=>A@?>A>FBG@BACEGBA8==;96878676;:>31/00052996687;>A=ACDCEED@BKJFKFHBIHIOMRX_hmsttoka]acddkmtvzȭ|{|ywqspllgeeilkgdg`[_[Z_]\`_]\V^afeeac_^\\WUSPMTNQNQPVPPSSMRNIIGJDEFFIS]jqy|uvneXZ\fkovytogc\RTIHGAFA>?A>?B?=@>>@@=<9;::<=@;<==>=::8;498:;A;B@@HQGKK:97;:8?=@?ACNNPLNFCDA>C@9:9<<=?@>=A?@@>>?;8:6@;DA?ECCEOKFDBDIEC?D?C@>DC>CB@CFEA=?>@<=@BCBACEBCDDFKLJROSOUTUVSPUQNSN]d`giilkolhlomutqyvqrua^_n}|yvxstuquqmonmolihfcefdbaa]b[`\Z`VU\W]XTXRWUTNGMMRRXW]^^a^_f[^RPLGFBG@ICB?AFF>=@B;?BB=?>FAHHECFFFLOQNRTPYajq{}PFNILOJFIEAEGALRTPVDLLFPILJHIFGGFEJJIMGLJIGDEBJCFELHJMJKIILKSIGLOHNLFWM?JGKJKKBAKDLOLLKFEAKCLLEA@EBHC756<43642200.31222/2+10,142./33.4/0///00,0./--/+,+--0.+---+-,,+,+*.2.56?@DUx_`a]Y^_]_\b^bf]\\_\__a_dffciidffhdenlmihcefgun]XQSNPKGO@EA@B?AHKZ^]`bd_c^cccc`\`begmmcbacedjhlmlhjip|xxveRY;57-+(''%#$%"%%$$*)&++((%##$$&##! 3021320.2.///1-0/-/133113/31111-334475136995244442358474851652665595775:9477759745688679467588567:;?:;::@>?A>GEBDAAABECB@?>=713766347<86/-20/55:854:88=;@@>>=CD@>GKHDDCFBFBIFSSQP[hstrqhi^`d_ajkqjv{{}ʿɻ|vwrtrpkhgignjii`]aZ[W^^]a`]^_[_bacce_`[UYXQRPOORPPQUMKLGDBEBGBIEEHEGLKOajnh``]YZejhqtxtlfc]RTNLIFBCC??A=A=>A?;?896;?B;CFSOKJ8=<=9:E;C=?ENKSLJA=A><@?8<<=<:@?BA>:=8=<@?BF@F@DKRLCGFCIIF=A<C?@>CBBCFCEGHLHRNRSQQTNTSNQQPQTageghlkkpmnqspuusvtomoa\ar|xxuvttnjvqomkllljnigdbc^`^``ZaZZ]UW[T]UOVUTQTRNJMNRVV^`]_^`a[YcSGAC?HCD>C>AEE>GCC>@?C@CABCE?AA>DDELFDCEINKRSMSY\frzyNILFKMIHGEDGFLQOKLKEIJLOGHLGGIEDFIIGILMMDEMLBBGCJMQHKHGIOIIKPLHMMILDCTFADEHKKNIEHKPPNPLBHGMJGHCB@AEEG;54;72211/1235134/.0/1011210104.21/0,-./+12/1,/),)++0,.*.)././00/-1.33:0')&&'%$')%$##%)*'+)&**$%%%#""!22201020/132.4/2,.0/1/01200/3/21/01442414466333428736465764655344645968487:676683577764=8=9:8999;98:999:=B?<54,/0/+/0.-.'$! ! "!!  """!  "$"# ! !  """""#%#"#''*,*,-/.1/.-+0137/0/,)*)%$%'&"''*''$%% "'$.1577768:7:9=;;BHLPNRSQQTRQPOOJEEKKKE9-,+*)'&'*')(,*)**-,-53154420362,.--1264/,(())*'---./.+,.0.24343958::67348;8878979@@BDB@F;?;<=40-64;8;6>98//.18365;:5;88?:CCC@A?A@BGFBDDDDCCJDCLIPMRemrlnka`eadjmljox}þzzutpllhhgklbbbg]\]]^a`_]Z_[`\Z]`\^__^\Z]RSUPSOQMQRRMFJB>?ELFGJFDBJFFFL[[Z]VRX^_hqpvtxsned^UVLLGE@@@<>>?;;=@<>@9;;;8;:?9:>?==>=@>?>;888:<8;?=>=>DSMOI><9::9A:<CCD@>;=6::><>=@A=BC@?A>BCD@C?CF@@A@@@E=?ACBCCDBJJPTHSQRTPUZSVSSQROP\afgejikkjklpnruvvrtqqra^`p{yzwvqtsrqmpjlnijhgdfeg`aa^`_aX]\Y]YZZYT\SRVWUVXQNLMPNW\Y`_c^b_]`fZGGLFDBGEB?>AC@B@@=?CEDBFCEEABHBDDEDBDAEIUPTTWSW`htywPLNHJKGNIIEJQROPQMNHLNQRDJPIJLJGI?JGHIJCFFLIELMBILMHNHDFOIHOQNKHJJICADE>HHDJHJEGHMJQQIMBJGGFMHDFB>FFE998896350/320/0/2/02.2-//./..40/*125..,---1-0+0+*,-,/-0,/-0.,2224..249;=>1&)&'&+$##$$#$$'+,-+&&&%# "! !5643323//20/-/./0111334///007.2.423354752647849497774965342554355548757564:49455517555388::96688;<<;9;:9:E@:540-.,.-.--,&&#!!! !! ! !!" "! !" !! !$ ""##! %!!$%'&)*-,.0,..,,.12430+,,,,('(')$'"&&$##""#&*/32665:8;6;:;;:>GJPQOSSQPPOMRPHHLJJGH9-'*)))('&*'))(*)*+)-6642261+0/31/.,0,292+)(')*)..12/-..-,-0222765456:;97;;:782799=@BCCDCGAB??B=D>@4441.,31782/049576865748::A@DBECADDCCCJECB@JDDDFFJOO]_hgikd\geghjhqvƱyvrnnjiigflffkh`\bhgfgd`\XW[TVYZZZ\Y\]XWWTUQSRTOQUSKDGBAAACACCADCFEDHPXZ^\[eoqtw|}z|xsnic_ZTLFKJB>>@@=C>9=>:8>=;;9;<8=>:=><;:9=C?@F=@DHD@ADED??A=?AAA?BHCFDFDIFMKMUQOSUVUTPTONQLW_cdedjgkkjjlqqwuunlmpsua_^r}wyvvrxrqpnlekiffhagbeba`_^a]`[\^\]YYYXS^TVUYSRWSNQJQNS\^``e`a_^`fTIHGHAGDBCA>IBB@@@>?>DI?FD>CBCD@HGG@CEFFMSPNLNRT`go{rRKJFNMGFHKHSPTLJIDJNKNMNILPJILILKBHKOIKDCHDIEMJBKLIHIKGJIMJIGNGPRJDBFJI>IFIKIPHAGTGHQLJHBKGGIEEBB;@D@:;766313003.112././,,/1./+0211,/2,02///.*+--,+*(*(.((,-+/,+,+-,1../2/9;=ABJv[XY\TZ]]a^c`\]]\[[Zda`eeafffkghgkjimmfmx}iXWOPXMQOQMJRLNJHEM]`\^c[^a_`^c``\b^gdcdgiphce`fdflkmnijejlq}xnO?5*&%')&)&%#$"%"#'$)(&$$$! !$#"!7511431200261330120021112/1.1222521764455674503552255:7763364135288616<;888996<6776796:886::5:<:8><99=8;;=;:300./--,-+,.#$!   !!  # #"!! !""$!"""#"###$#%##!%*,**-1,..+,./013/12/,+*&)('%$#"$ "!$$(-/3565397:6<::<=?HPPMSQPQNPQPQPIHKKJHF8/)+('&(*%(((''+&)*+.25/145.+..0/.-+./3/35.)(,-+.//2/.,,),./1012273259:;<:;;9::<7;=>>AA==D>@:?;=9?A52/.//05;A<;AA9//0255:894375;8=A@FFAHDFFCDFBAFD@IBDEEGGIPSccggedbdhklow}~ǽڻ}wusqnmhhdeifea^Zaciaac^TUQNMMPRRSSSRT^V[UYYVTTSRPQPRMNJJJGGEHILHEF?CGOVT_lcjry~}{wsol^`UNLIEFE@AA<;<>=>>?=><8:>6=7:<;=><>?<=>@==::96699=;@A@JXONN=7:7;8AB<@?IOQKLBA?@CC<;99;<<@@A?D@=C@=@A;9>8JKLFAGDEDF@ACCBBC==EF?CB@BBC@B?A=D?@BDF@FEEGNINVOMRQRPVTUQMNO\dcagfkhhijkllrsptrpoprtbTZqz~wztvvwqollnjfcjhmeecb`_e]b``\_XYYYWXUTUTTSXXVUTNNMIUSU\\`[_ccdc\TFJHCK@GB@<@=AAE=A<@DBCEECDACDAB;EE?DEF@DISNQQRSYZprx}{sUMLJJKGDIINTRMGFJLLLJNKPNLIIJGDHDIELKKF=BKIHKRFDHQHFGJIJHIJIHIFGNFHDADC>FGILLKFAGMHFPLGEEKHHDDD?DA=FH7=5479322/-01-4././*.+,+///00-.14/-/0/-1)++-.-/,/-,*)//,/*-+++-3-0/./;<>CCPrWT[WVY_bbc\`[_`]\[Z[aahfehhcnhjmnidpmvm\\QXWQVSXMOPOSLQJJXV_`i_`\`b]_^d`_\b]cb_gkhnfc\bbcgonjdhhhikq~vpQ?4***'%%%%#!%$&&%("%%%#%"%#!###$%013652061/11202/-//024/6010.4505465466466555626647565642652322353508:9:9776768666768:88:<6:;88=8>9>;7<69<=;;8=>??=>A:><>@=>:535*--61:ECCGHDDGHH@ABEDE?@F@EGFLUTZ\][[`eepuzɸrpkkfdfbhab`[\W]Y^^cadb]UPNJHOJMLLLMOR[WYWVQUOSQTRSQSKNNKINMQONKH?@A?>OUVdiou~{wrmg_^SPHIHD@>>>=>>8?>7;=;<<;9;;;?<=>=;986<;<8>>AJRMLKBD>?B=9=6>:;A>?BA?FB@@>?=:?=9;EADE@HHJHFCFEAFBA>>ADBADDCB@AA?B?@?A=A>??G>EFFGFJHLOOPQPUSPVQSQNPKY]addeefdiimjjqptrvtuqovub\`q|}vusprjmhlcefjfffef^gYa`_aZ[TXX\]YXUSXUXWXSVRROKPNPRUX[]^a_b^XZRGCIEEA>?A=CMOGC?==DCGFDEGDNHSXVR\]lry}~rTNKJNLLIPUTSOGEBENPNMOKMJHILDIFGJ@IIKEIIDLJGJKJJKPLHLDKFDHLFKGHGGIIEBHL6KJMLMJFFDIGOPTDBFBFIGF@BD;=D>5:9677230-/-1---...,.,.++..--5314502/0-,-.*-.++,-.-+,,)*.+1,.,.-11.0.BD??HNuXUTSV^\loe]\Z[[]ZZ`_echbfieklijjmlm{m^V\XOVVYSUSQSQRSN[VY]^c`cegc_[bcdb`Z^adacbbkmof]dgckjllljijcmhpylY@53,)(#(&&&#'%#(&&$&%! "" !$ "%$%$#416242/23/202113,100.402210032-11237593554:66355269857655464345174668;:978899:8:95:777749:7:779<;;:9:<97;;@=71..30...)+*$$ "!  !$ ! !#!"!!!##!#""&!" !##$&()+*0,-/*-,,,/,101,-+(%""$%(,.0/3676666767<8>=<=DLPUUTNNOORKPLKGDJJGQ7.,--&*'&(,'(*((+((+*334423,**)(/+,0,/-015621-+-/,../--..032312124177:;;:<7:><:<8<5:<9A>AB=C<6A<:83,./11757==;=<@;71401558:56589:=>BEAA=FBCBICJOOQUXUY]^gluxµ|uqikmcdacde_`^_][]Y[_d``]YSLLIGGHKJMNNSUVYUXWTRLOOSRUVOIOPQQTVYUOJLDE>>@HLNS[hp{}wuoga[SMIJDB@B???>?==?<>9=?7;<@<9:79<9@>:=;B@A@>6:876::=@AAKRKIG=:8:=:?=A?@NOROFCACBF>?;@=<:==8>@DEEAJJICEABFFCEAB>BB@;;@@CB@ACFAJNEMTQOPOWRYYORPKNNX`edecbhfiffhlmmpnnnpvty{eY`n{z~xsspmqkhklfniegiead]a^\^_^\X\[U^^ZYVXUTSVVRQTURKQLIRT[]^ae\ac\aQHFHDFC>BF@?JQGM@C>@CAFBBAFDCI;CBAEBBGEFFPOMVQTOZajs~}xSRMSNKHHVVNHIDIHENSKRMQQQSXTLIKHKGGIGCCAFEJKJLIGOQMGEHGGIJKIIKGHLFDA?HE;IIHCJEGIIJIPMSMGOMJIJGBFCAAE>973347622010/.-..2-*,,-.//-,,,/.053110**+-,+,,,-/-*+-,,+--...+-.2/01/BL@>AMtYVXX]Zbsf^`YV_Z`^[aZc`ghhgbnkokhlqnXSST[[[^XWVRLPPUbf^[]\\d^dd]_`hjijdae^jbaieknka_gbdjlnojeghcikqqQE=0,*&'&$&&&!#%$')&"%#&$#""#%#""!!% 2313420/1/1-/0/.1132220.1/111.12/2255:48687866644866668683555364625:7<=:;599787976676967886<:79::=:?:9=9;?@;5/013,/-0-**&"!     !! ! !! " !!"#!!"!# #$"#!"$%)..-.-+/0,-///0142.-,)&!! !""%),,1523343466778=8><>7DIPNQORNROQMPOMFEKMJG8.**+*+&''*'))'*)+()/456120,*+-*.-051-,--1298.*.1,0--,,+--13520032254;@:::8>:8>@<:;:89@@>E>C=9876/0/.//4826@>?BHE<52.347579748:;9=>>JBGJIIIDDAA@<@@AD@BIKBHOJRSUTX[[msyyrtqpmgfcf`eba^c]_]`YaZ[]TWWSRPIFFDGCQMNOTRMYTVXWVSNPRQRXQORTPXX]`_SPN@?<<9;;=>H[em{z~xwrng`ZYHJGEE=@>A=;;<<=<=::=888=79;:9<>:??@A>@AB=::7869<;>A@GPIFE;:74?CA@?=;;<@>>AF@D?@8==8@BCDFAJLJDDDBDDDC>B=@ABDHDADAAAH@B?AABBA:CDD9G@@@7@>DCCABB>B?@BEEEDCDCFNIOOQTXY`hrzyQJINGMIQVSLDBHIINUVPRKOWURSMIHJHEFGHGH>CGLHOIPJINIJGEEDDGIMNKMLKOJGEBHI=NEGEGHDEHMKRLULFHGECIB@?@<@AF3853523/10.0-.0--3.,/+.-1-,1.14/.5///,*-,*-',,,.)0),-,-,+.+*,-/...//18A==CJxX]WX^[`mg\b]_Z__d\]^^ceaefjoojqq~o_]S_VYXYZSSQ[]eceaa^acdb^a`_]dfegeaa]ffbefkpce]a`akmrjfkimlpsyvlUF3+),$(%#!#%"""'%'+'%#$!$""##$'# #15115101101/120-1.41510200161-4/32654767869763=626646557836543648227478;:979985787767878:959797989>=;;9;=@<870/-1,02..*,)"!#   ! "  "!!# !"#!!"!!""!""!$%'!""$$',,.,1,/.,/-,.-12121-.'%%'%(*,/0222444957796;>8<==<896<=>=@=?;;98.-0//52787;BB?DLC:4/44466798698>@?BAFEJJGIA??=@B=B?AB?DEEDFOORSSRWZ]lu~{z}z|zyxxuwsqmihifd`ba^^]\X^[a[VY[Y\OTKMGIGIHNKKLJNQYSXZTVSRSOPRQROQQOUXZ[QROIE;><><@@?CJY`nmwtwwsqmf`]UUKLHCBA@?@>=?<=<>>9A<=<>=<88<<9<<:9;?;AEA;<>997;=<=A?DQIGD@;7:9EOONOEFC?@?=<=<<9A?@=:>==>;@B@G@FKLGDGAGDGAB>A@D@AB@EEA?@DB>=@?CACC?EFDIKHDNKPNRSNWRXTSSPOOMKZdccdcedfgjhhihlrtnfntuxzw`[Xp{{vtsqmpoikojidgkeghbaa_a`aY\]Z\XX[X[YUWUSTTVXRVWNPMOLNTV[_^db[_[X]RDFEFDC?@=?AE=<>??@BECFEEB@CGFDEHGFCDDKSRQSRVWeetx}}xRJQNLMS[ULDFFFIMOOMPMLJQKKMKBGFCNHGIEEFIHOISKLLNMMIJHIGIILJDFHJMKHKEBHG7OILHNLECECPMLSICICGHFBB?DB@?E962325722/-3--/./-.,2-,.1-0/10-/623**,+--)-,,,*,+0)-+**+-+*,0+,,../.,7F;EBK{UUXTY[b[]Xa^YV^^e_gdiga`fagrrp|ynr]TYQ[ZTZXY`fgcbcbb_a_]d]b^c^^`dac`fdbe_efolegccfdlqplhkpmlsyr\KH?2)('&$##"#"#$#%"))%'##!%!# ##! !"434323120243.2201212513222.3224//,42383768537076257568887276455065286776<;9;687;5886697:89;:797:8;=9>9:>@C?:8//,--,..-)*&#! !  "! "  !!!# !!! !!!"#""!"%##'()(+-+*3-/.--1-11/..1,*''*,--.1/34234597687<9;9=8>EONOSORPONQNSLKHJJONK@/-*)('%'('(())*')&*,233/0-..,+**+,)+1/.-.022:2-2/,,1+-,*-//350374546588;697;8=:<;:::<<>9;==96312-,/-604625A@>DHF>4/372866:;9<;<@?AFIFDF?AA=;@=@=C?>@DFHONHPNSQ[^bryyx{zu{wtwvvuxtrnihigicb`^]ZX[Z]Z[\WWYVVMSLIECFGGHLHLNPSWSYWVRMOILPPSOVKTRMUTRIKGF@<<>=@==?@BMX]`eeghfaa\[UPQKGG?>>>=>A=>=;<>==:;:4:;;:::=<;>::>?@>D:>=B5:89>>?E?CGDDB99:;:;@:AAKPPLIBB>=:9<=;??A@AD??D?@=<898??CAEEDBCBACEGNFLRMOORRVTVQQQQMQZ^_`efacjkehgjjirrou|swy{v_^Znx{wurlljkjjtpkjjhabdcc^a[`a[\][_YZWXVZUWYRUWVVVUUSSMMIIOVW^Y]][c`ZXRAICDD@;BAD@B?ACC?;?:CFF>N}^[VT[]^_W^]]b^_]b^bhfccefjgoyx]Sal_\WV]^digheegeadc]``Y_ba^`]ebddd^ceeb^hijkc__chjoopijhpn}}r`Y@A;)*'&$$###"$"$&$"%$"#"# %!$$'#!! #"423245.1/131/.0403011633/.23/1310-53484:684563577768798865565442444597676;8::6:;7774=7899;78;4686<:=::<;?>:?3.///-,10*+-$ !  !! !   "! " !!! """!"""#$"$%(&+,.,+--/-,1.235.//-,+*+-./-0/044451572<:;<<:<;AEIMPRTTTQOOPPNILIJHJIA/+&((%'%*('*('+)*,+-1424121.+*'(**+*.2/,-/1.5;31//./+.,.-2/025264787;683188:99::3:99789=787473-,.-.0.43324=>CCLLC72351978<:98<7><@CEBBE<@==<=?@BA@=@AFEEDEFJMMLORUZdluw~}|wuyxruvsvqqpwqspoljeefddbaaca\]Z]^XXTWSPRKMIHGJJJLIKLONJMRNOTOQLJMLVSUMRNEBHHB@AFA>=9=<=8??8<;=>:AAA;?=;?>7;<:;74=>A@>AGPSHJ>BDC??;;9:<>;?@=@>>A>=;7;>=A@F>CLJDCECCBDD?>A?A?CAAAACCCB@?>?C>AAEEDBEDHHGOJMKQQRPSTJUPTTQLZc_d_beadhckckesnpptnswwx_WYo~zuupsmnljlmjkhicgfcceb]`a]_\_]^YZXWYWYRUXUTSURUUSVLMHLOSUV[```abbXVPCDG>BFCDA@@@?@A@?=@;C?C=@?BE@ABE@CC@?GGLJQPPQUUZbgqu{[LSQU[RPKHF?BBIKIOHNLKQKIIJB@AABCB@DLKKKWHRJGNFNMJDHIEE@EEHEEFIHIHFE>IU=LDIMJMEGIOGRPPJ>DDHEDGH?BBB@=<273102610/0///.+/).,..,++,-/00/1--+)**)(.--)*-(-,)*,+-)-+*0+-0211-24:O;AAPyVXZT^^]Yc`^``b\[bddhikbfglsyaTPQhn\]afxzvthhgd_`cc^_dageb`a\^ebdac_cf`dgmhigefhnpuqrhju|kk]`P8;/++&)%'%#'&!$%$&*%""#!"$%##$""#" ! 513526314.3.33031022334/1052.22030333487766467867677:97<4679265535638769;<:;:699:99698:<:<878;89699?>9;:A>;?30/-.-.-.**)&! !"!  ! !!! !  "!! !"#$""!!""$! """#$"$#&&*+--+/....+/013310....*.+-1212556736?7888=;8:=@BLLVTUWOPPSQONJMIIGNJC2,++))'('()('(,,*))-/41711/-,++*,*--,04/+/.-/8920/,+-+,//10/.022447067<3436:6565288<997676922.-.0095015566=?>ADC=DD>=>=@FLQOLF@>AA?>@BB>?8;>49AC:@?<=;9<;<>87:788:;:?=<@=:?BB<>=9<99;<>AC?EAAE?:;<:BADB?ANQPILCCD?@B<=;=;>;@B?@CEBB@BA<===<:;:?=AINGBCGDGBEC>BCD?B@E@;BBADDHF@HGNPQSUUXXiww~{XJRYXRNMKFDMEJILLFJNSIKNNEGBBE>E@H@AJMKKTLONMLJMMLFLFDLDGIKKJCIFCLIBCFKDPHLRIKGADLEPRNJBEDDDEIDBGABA=>378241/0..-*)/.,0))-,-++1+-./.01+,.&-***+,*)*))**)**(0/-.+-+.-///1/4>K>=@L~{Y\[WW\^]```b\bbbcggiflgeo~}cPMLPIdjbhq{zwofedba^aaaa^]_]]^_b^hbeaaaccejgnkfhdckonsmmwyhaegZC?31-&%$$"%'$()'((($%#'$"$"&##$! # "2206412120212022213236;46/5403210/745:57577428766766497457<7553754647574885886::<989:<<=9848;8:7:::>:;?:?B><51-,/.../+-)&#      ##! %" #"!"!" !"!"!!!#"!%##$'&)),0../-,-.-/,111//2.0+3/21/20344346789<8=::@?BLQNPUNSNNOMPLDJINKJ@1-,*&'&())','(*+).**33//../.2.-,.(,-.,040-,+-/05,-,.-)/./+0-.-00.0/2365643206317646<8563420--...13030-5367?>=GJLK2255999:58:>?;C:<;89;;A;@CC@ABE@=8796:<8;75<7<:9<>:;=;9:9=;98>=:97?<:>8=<=>A>?<<6:;;9;>A@AIBCCA<78:?=AD;?IIHJA@BEAB@:99?;>=>A>C?==?@?><88::8;69<=FAFBCCEHBCB>@@>C@>CC@ABA;?:@=>9??BBB?GFDFIKKPPOROSTPTRPRXROV^\\_a`c^hbhghikimmnsnsorvwv`X^n~plsonnmjhjjgkfddbdeb`c_`\c``_VYV[QWSYVWWYRPYTUQOMRPKJLUWRY^]_]_aaW\NCJCF@B?C@=>@CA;E=?=CBDEDFGJOONQRWQbfqv}~~|zZT\VQJHKIIEGFEFNGGLMIGKFKFDEFB??AIEKEFJKNJGOKHHLJJEIHCHFEGEDGDEFHGGD;@L9CKLJGPLCEKKLSJIJDD@FDF@@?<<:?7734322121.,-,-,-)-**+,)*/--./.01,0.+-*..,,---',++,(,)-,,.--,0./0../26BBACK}ZXZ\\\]\W\]\\cZafa]dfhoz}eQNIKJFHZrmtvvoqldac`Y\^_^b_`abbe^`^bcce^gccbagjieeeblrwxw~vejwldPDA?0+(%'%&#$&(.)*,+*)+&(%#&"$##$"!!$! 654423131234432313031800514314214233470;388457668857799586696847749274776<66:889;:8587=:>8;74;88;=<;;><9?D@<63-+.--,-+-'& ! !" "#!! "!! #"!!!"#"!!"" """"$##$%&(*+--/0/.-...302000/.+2./011134662898:<:99?@CHUQPUQRVMROTNLHJJNOIB6.,(****),)*)(+)&.*.132201..1/0*+*))..-.1/.,-.2710++-**,,+.++./,2-/0239899437435344476/34.0/---.1320418666AAA@::;9??DEEBHCGHGGHFHJKLILOQPTTRU[YWZW[adlq|umntqttsqronlllkdidb_bc_bdahbff`^XVXQSPSPNNIKFDFHHHC@DAC?A>A?>F@EAAA?EC@;@>>:79:8?9??BA=C>@A8@CMPW\XWZND;896:9:9988::;;@A:?<:=@8<;7:<;<9;<:9<9>A<>>?CAEHFEC==69;?><=:9?C@:6>>GB@<9::<9@DCCABEA?AB=9?:8:<<9<@=@E?CCBB>=?;>?BDABDECFLJKMROWTUSPPRUMOMN[^]c^e`d`eedbfbnekqnprtqpsrs^[Wlvnklkjlijjggggnggbfgdddb`^\b^_Z[[ZYVWYWWVWRTUQPSQPSPMHJRLN[YZ\```a[_SCACDEEBA@;>A@>>A=@>9B=A@?C@=>?>B@?BCBA@GKNUQPQWP_imy}y\]`JJFKJGEEFBEBLEGIIHKHEKF@B?=@@?FIIFNOMLNIEEJHFGLICHIDFIGDAGGDHHDFEBEL=EHJGILNFOMPJNOLEAGHDEFC>A>>B>65530/00.1/./.,*-)/.,,,*./.,//+.0/,-//+-+)*)***(/-,++.*+0+-.,**+/0/017??>HM}ZYV[\]_YZY\cZdechbggkxmXSKJJKHDC[uuqspigdbcbb]b_ec_^a`^b`a`bacah_dcgdlkkgjfegqt|ogc^_WJ>540.,&$$&'$#*//,/2-.-*&($ "%"###"%!93377411435440020536563032232332322553568888786:@646778674675974645499767988685<849::7<89:7:98889?=?=>5:>@B;33/+..-****)%"  !   $ "!"$ ! #  !! !!"""$"%'(%(*,--.,++-1-011012./-/2/0-24344676:::;;::@@@KNQSQRVVMNOPOMGMFGLFC5,+(-****)&))(*(()+-4264140,0-/++*+),+,(/01+,.4141/-,++)+.,--./.1-11115526451--/114155012+--.//34241143327?=:BKKG<77;<:9;;>=;?=B?AAC=:==;>>@@>@AABDBEJEEDFHIMJMPNNMPUTRZ[Z]_^\bipysmtpswrqonminflkkfa\e`cijdec`]W_TUUUQSOMKIEJBDEFCEDDB?=>:=@@@BB@>=<<<;=@<98::985<77:A<==>:<=;@>=?=5<;7;6:>:<;;>>=;A@??==:=:;:@=BDGGBB?=969;?A>4239744;CD?BC<9<<><@C@AB==>?<@;>98:>;BDE86639GCHCBJEC?>BBAFC>=?@@>@>?@D@JECGJKKLNTORNUWURSNMNOS\]]a^dccccciljeghhhkmprqruux_\Yrttpnklhiggfjf_a`db_`c^^\^ZWZYTWVXXYWVUVVSSTURTONOQRQJMKNISZYZ\^__^\[XNFEB>FB>?CE=A98BDHB@>>@@CBBDDBDJJKKQ[RW^jp~~}a[OGEHIJCDBCEHCH@EIEEEFHMF@C=@??DGILHJGKOMJIGFIIJIFDJGHGFIIEIDDJFBDB@CM;HIIMJDUFOIGIONPH?BECGGB=:<;:>@C:420+/.,-*,*%%!   !  !"  !!! """#" !##$#"!!##&',+/.,0.//.201011/31011.//1324756:9:8;>;=<;;:9;?;=;:;;@D@==;7;;;;<;=?B=???BBBCCCJFJMPNMJMLLUSVWV[\]Z]bbr~qqpssvosvojilfigbd`a`bej]cgd]`[aZZVPQPOENJIHBC@?@BBBA@@A>?<<@?@CA>?<<<9<;;:;97;7<:8965B<=<8;:>@BHRSVQNF?<8867726898<9<;@@??>69@AE@?CH@B@:7:87=6542467508<=<><:;;7@=?@><@?AA??>><9;8:?<==38532B>CF>HC=@??<>>@FF7>@@=99:;8;;A>@?C>FFKKLHOPQRNYSPSRPQLTT[b_a`aifcgehglknppnmqqrtvuwzaU]pyqonooojjgigfeeccca\c\]]cZ_ZZ\YZVYWWYVQUQQKQRQROPPMLMGKPMUW^^_^c`aZ]eVE>B=C?C?D=?=A<>@@@>A?A?BCABA@A=?>E>AEBFFUNNVUVWYhnz~{{\POIKGKHDE@DADAB@DBEFE?KCECA>@@EIKOOEODLKGKNJKGEMGHEKDDFGBEDEAHGFFIHBFK;JKPGMDTMMLEPLMKFE=CCGFCBAAC?B87253240./+-,,,-)+/)-(0-,*////2051.1-1./)-*,,++(,)*,)*++*,*),.*..///0:>=?DI`Q^YZ[_dbZ^dcce`bmrZLKHFEDHJFGHJ_tlvnmkgb^a]dbc]^b^c``f[ada[`aaeabeefejhkhqvpkn~zn\\E:6?10+&)%&$&$###$%#$('(()('%!$# #!#!!055474013344//3420365263-0.2331140154375898174936652878645986:3377356587:::=687<883:78=>::;5<937;8@@8;>7?@?<50.+/,,)+*+'## #!  !!# "! !! !## "#"#"#! !"$%'(),,.202/-.010/1442401//26365::;9=8=:==;CAGNPPUTUPPPMNMIFIEJKIG5-+*(&))&()'(()*)*+-352711,./1.0.*))-((*+./60-,.0494-..--)(+,(++-020.2/15543,**',+*,*++-,,-./5722250333574;=;EJNGA;=>7=>?;:;999:9<;;83:798<<9>>BB?@DBCCCDDIMOONNRKLKONVW\^W\Y^aep{yuovssppookklghhhkfeb`hh^cli^XX[UVVPTNNLIGHGDAC>AA=CA@==;;9<;=@DAC?D<=<=:<:;8;<:>;8<:7==?I?:4>>8>?:7=>;8>9;87:6::<<8><<7@=>?:9887878;9:688<<;@;>?@@B=?A=A:<>?ACBADB@?8<:9889:;;:>8:79;<7<<;:98<:=?AA@<995:867<9<::;:86<:;>=>?:99<489>889:6;9384552=<A@B?7>@B>ABBA>?D>C?A?C@>FAGILMOPRQ\[itz|~vWFMFGGKIHDADHACCCECDHGAGHA><>BHGGKJKIILKKIKIKKHHGGHFIIDHFGHFD@BDDBHD@CL2CIHEJGGEELFKLKIGGGHD@FB;>ADC>;34/43411.,,-*,(),0-+)+,+)-0,/.01/110/.0,'),,,)+(((.*+,,,,*.+**+,+...6<7B>G_ZXY\\[dfb`gcegeyuZMJJLCCCGLHGIHJ]zixnkkhddb`^`_ba`]a^^^^ea^ca_eeddiifjojmsqhmvujb[BE=8-2/-)&&##"&%'%%&"$*(+'($$$%#"#!""!# "73786505761111201232512510316432-15815377553:459697:97676:75663758445489:;8;;67989:7966;68:59:8:9==420-.--+,,,(%#   "" !  # ""! !! " !!!""!#$$&%***,/-.,21-4032232212.052/4658:<999=>=A@JORPMQVKOPPOKJIGEMHKE8/,**)('(((&'('+'(),17432/+.,0..2/.,-*'*,*,.1.0.+013/0.,/+,,**+,-/1023/065535+.*))*)))*+,-,0/2212/15423651@=9GJJGA:758:9;7889297:=9:77;98;:<<>C=DJEEBAE=<<>7>;<:6<8;;8;;=BDJKKA@D@B:=86967;989;673587><::>6=><8;54::886?<<77:7>:=?=?>@B>?=9=?B@BC@IDEB@???BBF@A=C?C@AC?>@@>A>?B???>>AA@>@C?>;A>AA>A@>@<>?BCAC@C;BE=>?A?<>9<F>6;A;7:=@A>GEKIPNSKORRSVQTLOQNMRXZ^`^`]_e_dcegffgdhhhimmgnnrmj_Y^mpnlkfjdhb`gdeefc`___]_Y\]YY\V[TUWYTZTRRTTRTTXQRUVQSNINJOOQ\Y^b]a]c\`iVI>AB=>C:>?D=9<;:=?@CELRPTQPMQQMMOIJEBKHOC>1++((&,)'))'('&'*(,271312+++.,--0/--(*+*--*,13/.00540,--****+**,1/0/11554721****)+*****/00004500020004562A?;FKKF==9;:789868635555448:=;;9=;@BDGHGJLHJJLGEHGLHMJPNMHIJNNRQWXX\ahm~ytrqnmropnnlkioijnmgiie[`][`Z][Z[XWQTXSNLIKJGIGFABDILMLLBB:CBFFRKHIKD@?=::799;=9=75<=<;:CMSPPHJBCA<@:9:;6868954679>;;<<=79:><9;9<9::9:788898:<6>:=?>>A>@@EA?A@>CA@@@D@A>?@CA@@CC=ABACD@@@A?A=>;E;D@?CC=@@;@>>9>D;?C?AB?ABB@B@EBBB@EE?C@>>CA?DDGAIGKIPLSMSPPVVSRRTQOTU`\[a^bb^b_``cffghhgimlpojplrpl_X]i~smmijeeda`dbac_^_XZ^_][Z\UVSSXTPRRU[RPZNPSMNRKPPQMQKGJKLQQZXc][_^d^_iWK@AB@=@==B?;C@B;>7?A?E;C@??>@;@?@E>D@CEKRMPUVRX^gqw{~oSKJJIHJPFGDCFAFDEEBDIEABE@HFDGKKHHKJHHNFCHGMKHCHBGEBCGFHGJFBGKJGIFE@9BL7GNKGHIE@GLLKJOFFCIGCFB><><;A>:6132200-,(.1)(,))&***,&',).+1/./211/40/*-+.**),('(((*+/*),,+,+--/./2EE;@DKe_^befddgkikt~cSJFBC?<:?:@CEJJMT[iwowrphbeba]hba`^[bea`fZd^e_ecefehgkntupruwvpl_dN:=;:@>AA=:///...*,,&&%"      #!#! !  !"""%!#&(,+*/.-/0133.342460030//14375;<=<;<>>A@APOIUVVMSQQOPFIJHHJJE92+()*&'&%*)'&(),,*-3704.3-,*,*/)//2-+.**,**,.50..,.23--0+++++)(&)',,+..1./+(&*)(%(*)(+*.//0/2/00353456402:@>CKKG@;:;898566627464463679<>;;;9AAEHKINLJFHHCHJKMOLMLJHJLILMTZ[[]bcm|wtumpmrnspnljheggkljhid`\XWYZWTTPVRMTRPLKGFKJHFCADEJNTSODC:CEKKLKLIFA==<;8;898769558;998ANXURQNJ>EF>;:6;7757335758;;;?;:=:=<;::7978788795565866<8=;:;:?B<@B@>AAAB@@@??B=>AB>:A@B??>@CC;?C=F@>;@;B>@C>@??BB@?B@CAA=?BAB??B@A??B>6D>;A>B<@BBAFAAIDHLPNQSSUPWSULLQOMPT\\\^Z`b]`aaaacigkhebglnoqporqjcU]jlmlfgffeeceaf`ec^]]]\]W[YWZVWVXSVTUUSTRSTQPRQONJPJPKIIGMKR\\`__\]c]_iXFGBBD??=>?B:E=?>@:>;?>=A?@>CJ@AEEBGQQNRQQRZgow~~tQEFEBGFFEHEC@A@>FDECAECFCGIFAIGDFFEFJDGHGJCGEEHHFDGGDGC?CDHGFIFDDCDB9?N9FGLLFMJEFMIJMOHIAGEBFD?<;@;??:352/1+./,-/(*+'()(**(+()**+-,/1422.-,*('(+,*)+,**+*)*%+,(-**.*..-101GB?BDLaa\ecccjm~{jVHIEB:====>@@CDPW_^`mvnomec`dgc^c^_aab`a`efcd`b_cihinqlymlpwmnrmjbHDE635/++&*'*&(%&,&%*,.4477APaYC:-"&%$!#""!""259732131225123345373734436131171563574478:57857;;5;;<8:;87877576955869;7:?<48:=9<8769:7<:97:::<4<;B@GQPRQPVQPPONMKJEELMIM64,)(+)()*(%)*(+(*,,632920.)'*+,.+-0---+*)*'+).21/.,.14230*--,)(''&'*))'*')&''((*''&-)+,./652423012/114305;@:GHOF?::886;<:85386674637:9@9<766>A?CCHFCEFFCAFEJNRPNMJLMLGIJQU^[[adi|xxrpjlllkkjjikehdijihd`]YXYUSWORSTSQPOLHJJFFFIDFEFORPZXTKHCFGJUQMKHD>7=:=99798776876;<8>?GMPNQLNDAA:;8796755334667=;:=;<8<7=?;>:;<::547464:85<:97=>>=>A@@>A>?B?;AA@D?ACBAA????C?=A?@@AA@<@>@=@><>?><>BBABAC=ACBC@=B?ABCCB;A@B@A>A?<>@C=@@ABD>A?=?B>DFCFKEKOLTQRTTSTSJRPPKP\[Ve_`a]a\adffbddggglhknkqrqjpkVY[nrlnmggbcedf_a]_\a_]^[]\[UY[WZY\X]ZUXXWWUVPQQNQUOQITJNLFILSU[^cb`^eY\jXG@A@ABB?=AC>B@====;@D>B?E>D=@A;@BD@EEECNLPNMUTS[co||~~~xSFHGBDFECCAAB@?B@AAAEACJDNEBHBHDHJJHKCKEIGFFHKGIEHDDGCGEGGEECADDFEE?@@I><:>>944204/.,-,/'+))(,,**'((-.)--,.2042.*)***('',),+(('((()(*++----.--222QC;AALdU_^^g`pjYDAB@:;;87<@G=?FPYZWa^fsmnlgeddf_`a]`f]\faeadedceggighpv|okn|rtzpnpnZQH911.+)*(&$#&&&&%$#(.8OKT\^ke^\?9( $"%! ! !$53875351061211/000241343326430276235494:9886<8698788;?:?:9<=<:589677477:;8=88::8;;677:><:<:8?::=:=<;>=;;CB@:41-0,-+-+-('$  !! " ! " #!! "!!#!#"!"$%&%++.../00010022641.,..2567;89;<9>A@==JNOUSQPQMRONOKFHGKOI<0,*)('*)*)&)*+,-,*-2435120,+++,1./-+.,*)(,)(.*//5-*-0342.,+-,,''&&%&'*&*((('*''%+'()+,/1033/2221632435733=?;;4978269:9;?@DGFKHLSMMNHJKJHKOMVX]\`bg|}~~xrlmmmmmllnkjmjejjcbca^X]YWSTSVRPPPOSHLJIJJNMHFBAFSVWVTSSJGIKKLKHBA:8;78;77;852435@AB>=?B;<9?<<;9<:998996435634554996:<=?==?>;C?@>=?>?AAEDCBCBB?@?:@>@CACCFC@=>@??C@@>:@@ABA>FBC?BB;ECDA=B?F@@BB@AABB??=BDCAC@ACFACBGMILMJMQNTSTTTTSOQMSU`^V`[cc`aabbadedeieeihjkmpnnopjb]\lujiifcbbcccaa^a`\^\^^_aYY_[WVRTWZTRUURXTVPPRRRRRNLNKLNINLMX]\cbcba__f[H?D@D@9@==9=;=>>>AA?AB>D?@DG>BFFCLLPSROVZcbs{~wRIDCBFDGE?FDHCDCEC=A@CDMILIFFFGIFIIFHIKJIMGEDGIFGHEHJCFDHGCEFCCDDDDA>BG@4-3.*&+*)$&!&'$""&*-<@BGLQ`ZLP;2.$#!! 96464064444532422233:4645345437:315568465789:8:899;:;9;?897995::6676558>>;;;<87:=;574:;6;;@:<8>9;:??><;962/.,-,*+1'&$!  !    "!" #!! ""#%"""#$$'$)(),+1,/3//3625440120-45899;9>8AA@@BHNOVRSOTQQMMMHEFKKKHA2,)(('((*()()())**.1434103/,+(*//100.2/-)***,*--1/.*-500.,,,*+*()'&&'''((*'&*)&(,(++,.3/31.2211/521433621;=9CIND?=86<96884243/2313438=88<7766:;<:=<@AB?@@ERLMSNOOLILMJMOSRWY^_`_o|y~|wpkjjjmklnnmjjkggffcb`[^]]^VXWRTNRQNPKIGOLTUTVVNNOWZ\^`TPILLHJQRJ>>;47:4=446864569@DGOLCCABHQPH?99:FDD@:344415;=;=>:=<>;=<::8;9<8<:6323417;33576:;?==<===<>;><>?A?AAEBB??@DA>CBDEACCF?BCDCAAD>CB@?A@B@DA?BABBB>?BE?ACB?>BE?A??CDEAI=?ECCC?@?@>@BEC@>@CBH@DGGJJILLTLQTURTORQLSLT_ZZX^]`aa_\``babechhfhjfkmpmmonmaW\lufjfgkedfbcc`_^b[_\__[Y^XZVZYVZ[XXUVVX]VQPNWRRVNPRRIJDJJNQU[_\`[fab`p\E@DDDG?A@??B@A;>:==CC<>?@=?@;@B@ABDABBCNPOPOMPUbdrysNMBFIDCFEC?AB@FD?FEE@CKNKLJCEEFLCIHEFLHIJLIHLJJEHDJNCDEHEDDFIFGBDAJB>BD>GJFQPKGBHIHIJJFDAAACBEF<==:<>7-202/2--'*+.-*++(())/+)'-(+//.32.-,/,*()*+',+&)()((+()'&.*-,,)..1..?cD?AAL|c[`^dwwYQEE==9=:<>7:<:@LTV^da]Xa_g|lkkghcag^fd^aihc_dfeijilghqxuinovtstrqonkgXUC:550/,),&'&(' (%$$&+'(-)34:DLFJ<6.% ##"  "!! 7895475422544252437646633746756:466645356579:==7576:;789687:9:8:9988879:::@9?;:69<989989>:<:>=;8;:??B??=400/0/.-)+%'%   ! $! ""! ! !"! !!"!"###"$$##"$$(&(**.-/012/4011600,/-6358999879:9==>FLPOUNPMQNRMKHJFILK?5*),))(''*+&(())('/55/0-/31/0(*)+.6/10//**)+'(,,/.0+)011,,/,++(&)''%'&&)'(&('*)++(--.2/..0011312502243450>D=FIKNA7=79:76:634536451472::;9879;;?<=;@A=??BBDIKLQQJMJKILIDPNPQUZ^aai|z{~~xrmkljnnmommmkihhhggddacX_\`YXPVOPQQKIFJKLPSZ\[VSTU\^_`QTJNNIIGFBA@>::;5=:8375688;CENZONPFFPM^RPH>?ILPLC>838479<==?899;;=7<:;:9<665612142693:457<:>=::7798==???BEDBGCFFCDGHGJEIEJFFIIJEGGEHDGHHFEJHFHEHEC?DEBFEGHIDIFHGFDFEECGDDDCFBFGHLB@EGE@FCEBDCEE=IFFHHJMKPTPLVUWUNTRQSRK[Z[Y]]^aa]`b_`bdccfeiffhdkmmnkpmi^SWnphifcebbe`_`^X_]Y][[\ZZ[YZYXWV\Y[QSWTUVNQVMTQSRQVPQKOKLLSUY\^]_]a\_^mYCDCDBBB>A==?>A?:;;;?>AA?@=?<@??ABBFFGEBIQPROQQY_isw|tWNIFECAHJFDCF?>GCBCFEHLMOKJEIIKIEKJDDGLIILIGEHDFMBLMHFBFABDBEHGEH@HAhA@CBIub^bqw`MDDB?799@@BB;8?FKZ\^`[a^Z_^hjlgjfe`bc`eZ`gdfdehgeogouwgnuytqpprqpnoa^LPE;/3,*))&'(&(%#'#''%%%%'(((/2433.)(&!#! !!# !>65744153505234023355536372463654769636697778:86::9;78;8:86;9757:<77636:<<=9;<:9:;99687<=>8:7:;:;7==?==BJJD>7:7:84684765022112467:974<79;<9=:;?;=BAEDJMQOTNIIIIKFHNJKVTXW\^gxsw{ywnngedgiilpmlnmjjgfgabcb[_^_QXSSLPKJGIGKMOT^_c_\^]^`a^[\ZPLIDCB;;9::6<5877477HMXVP[QJQ[afba]XTQYYRMJB68.9778:8798?8;56679776431123351479867::>>>84767?;?A=@=@?C=CEDAEPNNHPRZ[bn{}}uVGDGDEFBHBFDCFA>B?BCJIEDMJGEEGLMELFFJMMGHGHGFHDGHCGDCGCCEGHCGNAGJADE=>F7FIFLHLLHDGIFGHHAGCBDBAA;<@8>C552000-1/)+*,&**')))()+)&).+00//1.-+*.*)')**((*)')()*+-)-+)0.2/*1.00FiA=;CJs`e~cTH?A=89:<8::@ABDFRUb[Z]\[Y]\`k~flffcfaaf^__e]cdfbhjhom}uflvtwusrsgtuto^RIC?H:/-)'''$'($&$&%#%%#%$$*(().),'$&%#$ " ! !"857447637947862612557524554897651464867489784989869796:7697989854:8661;7<9:78::<;<:<79=<<<;<>8:987>?B=9=BA>A300/-.-,**)&!     ! !! ! !"""!! #!"!#!"$$&((-..01215-0/1/.-+-,+0235778676:89:?CJMNOKOOLHIGJJHIC00,*(&((()(''))(((+352/10-0/-.))((,,10../0.,2*,()+/6..-6/,/,--*+)))&%$&('()&()(-,..1/0//.10/020/05-01.7327??DKHEB796736863444423/14557>7;876>>C:BA@?@AE@EHKORSUKLLGJIHJMNJMSQ\VX_uutwxtvtnobcehghronshggcfeb^aa^^_\ZZVSMPHLJIFFHONQVhfddjg^cb^\ZPKD?BFJJJGEAC@;<357959779>KOYXeXONS\bdldfcfabc]PF==854663667479799859:9889361346488::77>=@@976587;=9;?@@BABEFHHJAMIHFGGKDCKGHLHDHFFHHJLICHFHLKIKJIKMJHMONJKGMMLLOQMKKOKNIIMNNMOKNLJH@HQMTPKGGABHJGJOHMPPSSOSVVNNVNSSUTWUYYXUZ`W^]]\\`_aa_`^aedcjgfjekl[WXokbc_c\Z]_Y^]]\`YZ\Y[Y\[WVZT[WOTVSVURPORRRNNONNNKNIOKOLMLPUUZ]`_\^\[`cWHBDCAA?AA>=>@>>?=:<>>?=;CA@B?>;?CC@CBF?INPPKMUU`jrx~~~~{vOBIEEHHFG?D?@B?CDDGIJJKHIKGGHFHGFIBDFJIFHHGACGDEJIGFFEHHHEHFGDCHCEB@<=E>D?CC@9@>?9=452123.0//)*(&&+)),)''*'***+//..3/+/*.)*)(+(*+++,+(+***)(*&).+/-.*52NgF?>?OqxePFC?A@;796:9<;>ARMVV\^XW^[[W___dgnhbgd^_b_i\`\abdhjllsclvwursrqotskcbQIH8834/-,)*'$&$&$%%'%$$%'$&((((&&$"##""#$#!757376672576032546778385474654614575895377757;87;6:;<57:8:86;98968536198;:>87;8<:=9957::;>=;8;>:9:<==?<=@D?=50--,.,+**'&!!  ! ! " """"! #$#'!##"#$'$),-,-/.0.1,,-//.,,-,-39666885658898@GLNNNNLIJGKGKHB3/*(%(*()()('(')*+,232//-,,*0),*((,+/71.12-,,+*(+++-/*.21*+-.+(+)+*)((''&('((*),,*,1031011//41000004535439>;CNIGA626;;8951646214157389<<<<:<;9>:B=?=?ABFIFNMTUQQMLNHNKNLLLMLMV[W[qopx|sqpnkecdfccihiihghhhdfbf``^\]ZXSTRPKPHGIGFEGBLV\_cgh_gfX^VPOJJEEMGKHG@@?:876788::=;?CKMURJGGKSX^hfedfba]VPF>B<45932/5264;7554497769;57886:6449668::>:9:3:48;;@FBCAD??F>EDBJHDGBDGC@EE@BEDGEHGJKLHKHFFKLLIGDKGNKHMKJLNLHEDLRSPTNE7@JKJFFINNRPTRQUPSQMOKNPSUXW\XXXXZ[\\XZ^Z^a][]^^``aibcg`ffYXZlm`cbb`^\\][]\V[YZUXWYTZVYXUYVSWUVUNKSMNNRNOKKONNQOGKJLNLNSVY\]`^^aYdjZC=??A>;<<@>??=?B?;;;?DI@E;B><:@>CBBADDALOKQOLSV[dow|~~uRLNIEDCDCCE@?C=?BFGGHGJGFJBCEGBDIIIDFHJHKGJCCHCIIAJFDBBIJEEIDIEFCF@B=AG>EHGPPNGHMHHEJIE?@?DEAGD=?;<:=8455-0-.+.+,+,'()+),&)&)***./--.0+./***+*)(('*-+++))++*)//++,.0---6/Ua=879;;<>ENQWQ^\`^^_\V^U``]bfggccddc`\dace^bghnrimxstrrqnqtlpd_LKTUJN91.//***()'&&#%''###%**(*(,,(.&"$ " # "! !$!4459645875:846613638829475677534454665768866488798;899789<8::87786756:88=99<<;;:;;;87;898<;:7:<9;99=@?<@@E@<62.1/,.-+)*(&!!! "#   !# ! """"$&$#$%$''*0,003.500//0-,,*)+-.443476:59:99<>=CHKOKKKGGGGPED51'(')()((((()(+)(*56131--&(+-.1*)(),3/-0/2/&+(&+,(*()38=2...,/,-()%)'&&('%)'*+--//1121330001/11300455253:=:AKOEA798;5885293634556948AAD?;@<<;;@@??@@?CFJPQJUSQQHLNPOMNMMMOPRTUYXjiiqvtsqnkgab^\^deiffgece`^_ca^^]^\ZWTTRKJFEKECB@CIQVUaeeafb^^_Z[NMJLOHOMNMLDC@:96762787:;HSNMF>>@GJU\_`fab[URLA><:97:2711554522/2035946689476439:646;;:=<;=8449:==?DB>E@A;;9:98>9=LMKMC;>>?==96967>;>A=;=<>=@>=;:=<;C?BEJLEC?C@?CBC><=?9=@B?DAEBDDFMQRNRNE6EHMHHJMLLQQWTTVTSONMNMRUTTXUWVV[Z\]]\\a^_`^`d_c`ecggcefjfZ[Xnjda`]bbb]^\ZZY\XX[\XUTWUVVUTQXSRRQPPRJMNNPQPOOKOHKHMLKMFRMVY]Z`a]^ZajTE>@BB@BB>>ACA=:>><;>>CB@ABABHE7A:9:>:524-2/..-,*,,'+*-)*(,')*))./001/.,1+-+**')(+(*))((**),++),*++.//046ZlE=ABHtkSOGG>ACEC=99<<:<;5;?<>979:8;:<9:;;=:::=>>>;@CGC;40/++*/.,'(('     ! ! "! !" "!%#####"$%)(),-.-314./-+,--),*+.032947568957::>ECEJLDBAHFQFC40()&)(+'(%)('))'**753310.))*,/..*+'*.--..11-'+**((,*).:?:2./)*+*(.'('''%)&)*,+2,...3--1./122120//30353528;:BJJLD:69:6784544320345669>>=A;=879:<>=>A@A@BHLLPMOOQSPLKMKKNQQLNNSOSW`gfnrprqslmda`^]d_bdbac`^b```_ZXYYTZUXTQPKIEDFFEDCINPX[_X]ecga\[XPTULMKKKOEHB??777755;6;;@LOHJL?=<::?CKLQPOKI>895875432431/10030022215168683451477:9::;@<<;967686:;>AHBB@@:<88><=??MJHL?;A=>:9;7797=<;AB?=><>@:;9:;A@;?>><8A====:A?:;:=>CGGFICG>EAHDKLOOPMTPPZWQTTNPNPTWPTVSUTWZ[_a_]Xa]]c^]^abba_abceghi\[Vip\`g`ab_]`]^\ZX\VYYXSUUYUTRUUWSUSQPRNLMRLPOOMNMLGIHLLMIMMOV`Z^^a]ZX_fVB@;E;;C===BD?@>;=<7==<@?C@A?GBEHPOKLMQUZgpu~}~~~~xNDGFDKDBAB?@A=BF@4@7498;2142/1.//,)*.+***')''())-)/.,3-/-*0(*()+(,)*(('(&'))++),**+().-.057`mEC=CKzlXN@E@A@?@F>?9;ANTVWZ\Z[\\^c`Z]^^XY[`^egfehgd`beaceinqngmyurqrrunoml_SNPYjqpeWDD22.+()('($#" #$)$&%%'&+).22/,(($$ "!!  " 887366879597754514275<864566:7634437236:7:8877987789;:86388;899:8576:687=<<:;788>:<:76:=9>;;::=;9;;==AAA@FD:4/--,.-+,*,#!"       !!!" ! #"!!!!!#"! ""!%&(*--22.3+/,+,..+2--,..262779768:;8>??BHLFDGHJJFE7/*&*''*'*&((')+)+)/64100/*-)(*-/+)'((+..-320.*++)))(',3:=21/,+**)-'%&'(%(('+*,.....1/010/1/00-000//243437<9?KIK7:5:76543447540316358;=;;<;976<9>=<@<@CAGFJONMQPOKLJMJMMPTSOJMPRVZ`[`fgkljgkb]`]]cd^a``_abgda`\YZVXYRSVPKNLMBHFG?@>DBFFGPWVZX^`_]ZRSPKMJOLNEED:=:56947978969<;>BC;A87423/0426421332/0,.-.-/03436741722999;89;@:<;::89858:?DJDF??;6<8;<<;DOKGJB=><;8<:3988><<===?>>?>>99=:<<>?<=:@=>>=7;=8=<<=?>GA@GHHFHMKQLPSTXSSRKMRNQSRSQUUUWSZ\Z[Z[[[]_b^_dh_agdacicfffYXZrpccfa^a]^^ZaZZZYXYWYYVUVTVTUTUTOONOPKQIOKNKOONKLKMLIIGGIKPQZ\_]^_aX]jWBF?BACAA=?B@>@;>;9:FEGHJLFNNIHFDECFDGEHFFIEMJHGIEGFGJGDJDI?FFHDIJKLJFFDDCA@FDHIIHJGEGFGGFKHDBB>@@>D;7<=::>:103//-*+-,*)*)-++,(''&(**)),*0.0,,,+)''+**+(&()(&'(+&*,+-,.*-+1+037bqDA?Fb~n[IGFBEFCBCED@>DNT[X`YYT_]\]_da^_a^ZX[`aj}`lifdbgfghceqkgqttuppxssuoj^[FM]imxjd_O=85.++%&+&$##"!"'%!$&"&%&'+,-.,&(%#"$! !  88=8:5885:6:4567355666788669488367593447686:98:867:9;:;99;;<888:7968368;>;::8;<;@;8@78::=><=<==;<::<;>BCDDCD@EEFENKE8,)***')((&)(((')*.232.141-.,(+..+)&)*)..-01.-**)(&(,)(,5840-.--/,,*))('%(*+.-,/-.00/0//104/2/2200/3335637B5AJGG:86:738>37724404405487<@<:77:5;:;:9<=>CDHHFOOQMQLKJKIIKPPOPNNPONUQ\\acacnce``]``\a`aacb^baceVb^\YWXXRSWSPUOMICDB>A;?=@76835627657512431/231400/*+++,,/1//21219/120026887;9;:<9>:;:83:8?EIHCC@89<977=;?OMIEB?=:;8:84;8=9>:<<;?;<<=>7::8@>79;<8B9@>=?>=<><;??>?=?>;@89?AF>?@?AA@CA;CD@?@ABHKMLOJQPT^aty~{~~~tJGGIBCG@>DFFEDGHBDGIGLDEIJADFAGEDECFJHJJIKFIEFIJEBDIKACAHFFGGHGEEDFA=?E?D9=:<4;91/20.0/*.-,,))++++&(*)(**,'+-/1./-*+***&&+,*(-((,&2''-+(+*+.,-018;GntI>B[mUJ>@?B>@ABAA=GHGMX\_ZY[Y\ZZXZdf_d[gZ][^a[l~glieeagchcv~{dgnxxwqutruoojaSKO^oxqjtq`XLL>/-,("$'$#$"#""" !%%###%&''(%$"!!!" 98;:9368:996556695574;497385385559639488;689789:7:8;:88>;::8<5;97;:74699;9<;9;;@;<:<987999;;:<99:9>=<>=ACCD:42--/,--,*)'"   #!  !"#!#! !!!$ #" !!#!%$&'+*-./1+/,)+011+///,0356;::>=>@AACDFCCFCBFHIGG=,,'&&%'&'*)+)((+*,2120.1.0.1+,))+))()&+/20/.'()))'*-+,*1241).++*+--(+((('*+-*-0/+..//1/111133122223244345?:AOIH<968824:45947663533475697665;69:;:89;;?>DDJKNOPNNNGIFEHOOMQPMLQRSUVZc^b]fZ\Y\[`feebdcc\`ab`cZb\TYXXWRRXVRQPNHGED?>=B<@BABDEKQRU^\VPQQKKQPLF@=88967688641689@@CAHIFLK<734332769=@422331131240...+.**,+/,-02/514142157867:<:;=<<<;74<>;<;::7696:<@=>>>C>EGGC?;DB>AA:=8:9==@>><=<>9?:<>>C@FC=K?AFJJKNJNOVSVUQNNLLMPXVVRTVT\W[Z\_]\_a]a^\_aa`aabg`ddcbdcW^[j~tacbb`fba\aXb`^]XZY]YVXTXUWTWTVXQVRPORLSNOONHPMMLMKJHFEKNPP[WY_Z]Z]^kTB=B@<><@A>@?AD<>CD?E@@>BBJIJPRPPMPYcmv~}~}|tJIBH>>FBBEEJJHNIGMEJFIEIILIDGBJHHFIFJGHIJJGJIGLEHGDGHDEDAGEEFEEEBFJ?;>G>DGHLGEGFBIIKDGDC???BAGA6;:9599..1--0,.-*(*)),,*),'('(,)*+/-.0,.3,*,)*+&)*-%(*'*))*.+-+//-,,.+254MmuLAS|lQKIEFA?;=B??BDHU[WXVZWX`Z]XZ\]`jaebc\YV_Y`j~lkegcdgiqzgipwzyuvsrqpthaQPKbsxspfrcffOC?2//('%#('$!#"$#%#"#"#"%#"($""!#!!! !  # 999:6957748766556068776;987647668887:787<977:7;9889=;;A?::<<;;;95864844><<<=9=:><<:9898;;;:<;=<=;<;;=>@>GBF=80/0/*,,-)*'!     ""! #!" !!##"! ##!#$%%%)(-+,.--*.+++1,.--+-+076:<<>@?B@DAFADCFBHHLKG:-,)'%(*&'(''*(&(--31430/-/-0+*()*+,-*())*./+*+)*-+(+'*++//-.--+,3/.)))&.)-,/,-,0-0///11,/1/4002///045262:>:@LHL<768886754879=:9465457552258:78:989;:;=?@EIKJLUNLLADHCFJIPMMNNRPQUU[_aa_][VXZaacfgcc``\\^c^`\^ZY]S^UWWQSSXPNMHFB@BA@@AEBEDEHMQRSTWRNOMMPKEB@;6835854533557:7449FTRKRG6333335586676/535021/.3.--(**+-+,-./-..20.3124756;;;;??>9>:59:>ACDEEE;>>6;8==?KOLKD>>;>=<864679;?>=;:<:@=>9<:;8=88>==>>>?=7=<=>@@:=?B=9=7?>?@?>@B?==?>A=E?DBDIPJJJNTR`jmtz~}qKCCDGEBDF@CGJFKIEJHEKGHJKJEBJDHJIEJIHCIKJMFFJIIHJGGHDGFCCEBCEEDHFFGE?@B;CKHIDKCHCEKFFFF?ADADBD?69@79C93472/2.-.-,()(+,*(&'&&()*(+,,10-,0,*'((*('*'*(&'*'%')+,).++.,,0144NstPJvlOJFIFA9C::=9<;FQWYSYZ[^\a`ZZ__`bg`fc^ZVW]WikykifebnrzjdvvtrtsovmooiaJFQfrvlonnml\qdQC=1.,)'(')&#!$# %"!"%%%%%#$&""##"!$"!$! ! #;=87797:<5746643838:8684788553755:6::48977685:;<95==8>;=9;>:;;9898:3683=;8=?;<99<=;88;8>9;;9<<;::79=;>??>AC?7./1-,/-*)'% "!! ! !"! " !!!# !$ !!"#%#$()(+-/-)*(**.,.0-+-*-12479<;5:;9<9=<;<8>9>:=5+)(&$''%&(''(%&($,11001.,,*+.+*')+00/+(*%+./*()*))++*(*+*/,-0-/.0-.)'()++++/*-.,/-0/,00.-/.12103/.,211437=9@ILK>767955555:6:7=96440440232559:9>588:<;<=BAHLMRNNNIFJHGCFDINGFJKMNNPSZ][VQWRNV][cdbdd``\b`_]`^\]\YW^YY_XTTQMLEB>GBBBEAAIDCD?HDMRSOYXPSMHNJHAB=554844226548743364;NDAIF;34422578=79966360.302.--+,*+-,-,-00-./0012/2242487:;:@;=9:69;;BD@D@B?<<78988;HOME@<@;A:65776<:9>:<:==:=:<99?8<=AA?GKF=@=AA>:?<8><8=8=<=;;>;<<;<:A<@CA?CFGDNIRSRQSRPVQLPPRIQVWTVWXTUYVX[Z\]X\^\^`_]`_a__a`ccba`_a[XYkt`dcc_a^ba`_]Z_W]UVYZWUWWPWVTTOOQRNOQMNONMHLPOPSKLIHFHDGKKVTX\`ccYYZaXA<@F@;?@<:=@8<;;;;;>>>?@ABBJJIQQPMY_bnt}|y~}~}rJC>@=ADDFDELJLGLGIJHGBFAHIFIEEJFKDGGIJKJJOJMMHGHHHHGJGCFD?JCDDHCHBFB9;H;FHHNFGECHGHEBDGB@C@A=A=6;:7?;783322./-,**)+'&)**()(+)('*.++-.--+++(*-+(*)')'(***%*))-,./.0/,-6AHawuWdtQFFCI9?=?<<8>BMMVRXYXY][[Y]X^Z]Yad]_c]UVW[[kjrgefkw~qehsnrsstunqurkdPKVftyuonlmllifoPEF3/,-***()%#$%# &!$)(*)()+*,(&%# ! ! !7;:6:2477677675274878=5897697795875:76>776788>=>77=;:==@:;=>=:=;=9996976;;:=7<:<=<8=<69<<<=<>?==79>=?:;=:66248164644=68:997::=84235666666;75826778AB?BA8321210586576634032321-0/,)/+,()1//100/1/.10433256:7>9<8<787;8?E>;=8<;>9;HLJFC==:<8788:6<<:>8;9:=<=;9989:<;=>:9==><<>>698;8;<<=:;E?@>@DBCHLOMHNQR[cpyz{}sJ??@BGDEIHFFHJHIGKBPHFHDGKHIEDCCKGIINJJIOLMLKLJGLFGJGCEFIBDFFEDBBFECA9F8EDGIJMGGEGLJJGDDAACG=BC9?=;?99:121/-1+/.-****,*+*)'+,++/.(--300,(,)/**&*))'+)+'('.-++(-1/103Sz]LKNKF7;?::?>HJRNRWW_VW[YZ\ZY]^__dd^\]]X[[Veidwjkvvfgs|stlxrqvrri^QJSixtoqsonohdodWXI=;0/).-..*)&$#"##!#!%*(+--*-,-)'$$! !$"! !! #::9:74746789776575888:69378:7853586586;9:896:88:;9=<===<:>8:=;=99<:8659=:9>=8;;;:<9:95:9=9;<;A>8:;:;:<789;;==7553465567;8:85241258495635304/282553133201130/0/,(,)-,,..02121/./-0./1.4149:?9=;7:98:<<>@?=@;<:<;;;=<;8617:<:<;=9996>?<<898:<;A>BIE;>B=??@:>=;;5<9;>?@;=>9>;=?:@A@C@DEMJPNKLQ^epwz||~{~~~rK@EHEJIHJDIEJJMEEGFFKHEHBI?FFDIFHLGGGKKOJPKJFIHIJGFGCGHDJADDCGHGA?6<7947;9699:7:>:8:986::76:=:;:>:<<>?@BD>=30..0,--+,('"  " "!#!!$" !#!###"!# $%#%'(*((+**)+*,--*,+),,+'&%&'&'(&'&&&%+''%&(%'%&&('&(,')''(*),/12,.)(''&(%*)**'),-,.+'%''&(''(*())(()),.,/2-.-,+)/+0./00-,,*...-.,.1//3.010103/23451:?==ICK<34788:87364655;7242442184;D;:;>:99:96;ABEKHPOLNNKKIMKNKMKFHFKJHIPRTTZVXVVNNOUUadebaa[_^_aY]_XWZ[ZUZZUTTQPQLTVZb]cZTJCEA=AB?DBGKORUTMNMJHECD=<675556878;95661471500724221-2/033443011/2/031/001+,**,+-/-/01//+,(-.-.-11266=9@64:596:=<=???;>6>>;>>FMKLD>:>=:7874898;>:;55>8<;>>;;88>A>CBGHLIPSTRRXWTOPOOOQSV[XXWYVZVVTTRWUXZ]\^][]`c_bb_^b^`\\a`ZYU]oooiggce`_b_`^[Y[\[SVZUYXUUUUUUNTJJQQNPNMPQLIMLLJJIKGDKFHMSR[X\[_]^Z]gVC@?=>==@98=?===8:7<:@;<9>BAB?>@BBFPLMKMNV``nv}{}}~~|~~nF=C@BDDLJJLJIFMIHDIIHEFIEGIHHADEAHJJPIHFILKIEFIFJIJKIFMCIFBCCEGBGFEH9BFGJPQPSVSYWTVZTYT^ZZ`ZYhm][\]Y[Y^]ocasumkwxynrvuppqr^[GI[pwpsoqppmjkh^UFEVadFF;9*'$$)%%& ! !"!!"!$"$&()'.+"!"!"$!# !!" "! :<8<;:7::6644696774978:8687787769568898<9576;9988:<=A8;<::9<<;<:89:88979><@?=;=;A:>::7;;<>;:=?=<=:;>>>A=CF?;3///..1+**(&    " !$$ ! ""!!! !# $!!$""!""####%$*(,***+),+++-.,+./,*%'%#'%%&(((&&')%%'(%&&#%%('&%(()'&*(+5100/+*(&*%%,,//+&,(-0+,)%(')*(()*&)&&'),--/1...),),+/-,-.+*+/.+2...//...022/3000210319?<=KEH>6376535548323321134003146;>?FH>;7:8:8:;@?GILRNNQKJFLHKIJILPJELGLMOTYZ^\VRUJPQX^[]a_Z]_]W_XYTYXYXXT[VPSTOPMMPXdjfc^YMJCHA>@>??HJSQSRMOPMJHGC=;8935532439648442332542/2.1303/3558685615333113.-0,+-+.-,++-./0/)*')(-/,011145769887768><;?<==9:@:8::GOJKA<<>?<:9556:9:<9::6=:=::<86787?8=ED=>9<<=9>?<;;<;88<;:;;<:;<9<;:<=A>:<:;7=>:?B>>=:=?A@BA@BEHMLLOLPU]fntzy|~~~}}~||rRCDELJKJJHLEIGKNLLOJHIFDHCKJGCCFFGFIIDDJIILMMKLMJLLJMEFCG@GFEFHHJHCA=7=>DFFJBFDDHJFEEEBDB>B@BGC698;5:9;21/11+-.())*(,*)+(*)&*'))*+,00..+-,()('*),()()'(*,(*0-334By_RSRNJF=>>HNQSPRUUUUXYZZUYYQ]][]dhxpla^^VZZ]`ka\qogesutttpvssqtgYHM]ruvqmomnsjhfWSMX[gje\PF71&&%%'#%%% !"#$# !"#"$#('&%%"# !!! !   !:=998;8:7889655954:83875698:::8788889677885;=>=;;:><<:;?798=:::;<98969966;<===<<=;>=7;:>@=:9;=98?::@=@AACFC9201.---)-()"!    !! !!!!"%!"%!#%!##"$%&"(&),**.+++,),,./-/..))&$##%(%&')(&%#&$%#&&$%%&&&$)''%'*(+02.10-)'&&#%),/.-*)',0,-)&+(),'))(&(('()')*-/0,/++.--,**,,+-,01-0,.,00/.-11----.0-04216@;:KGH?677652<33433303//564244579>AB:893;:84::;?EMLOOKMIJCEDIIKLROQJIHLQTYZSZZZRSPSRWXZ\`^[Y\[_]ZY[\\XXWVXVSTTPQKNKX]_a]WQKIBD><@?>=DGQOTVNRPJGECD?;>:4545566677:4:643150210029>A;;C8>;>GHFIA=<89:4857389=8>9:7:8>9;<586:@>CFGEA?B:==>:?:;EAEFIJNPLTRVTUVPROINTRUXTWXXWVWUUWVX[YT\Z_^daZba_aabaaca^^^_[YSSjnkeog^ceq_^Y^]Y[WYTYWTRRVUSPPTQMRLOHMKLJOKOKLOLKIDGICGHNQQZ]_^Z_][\jVB?@<=?>?<=;<:=<9:5===??ACAABCADMOMNPPW^ety~~}~~~pRKDGOHMMJLOEQHKNFHOJIILJGGFKRDGEBIGNGHKKLILJNKMIIJKKKFJFH=GDFIFFHKG@?9?@BGGGELFAFCIFECDF=?=>@@G6:<;7>:8/3/---,(')'(',)()'&&','+-,,/000-*+)+)''((&&(+&(**+*+0-433`wYRXVPHH<=MNPTTVSWUUTSXXXUZ[Yd^Zacn[^ZXZZXeg\cprakvsutuqxusrn`VHS_twrqqtrsnlndZKDNcyrvkfTI70*''$%%###!!!$ $!!!"!&$$&#"#  $" !!!   ! 7=:99;8:79:;87787898<::576;:8:83:8;857=;79=78;:87<@A?AF@941/++.,+-)(% !  !!#!"!#!!!'"""#%###&%&*(+++++)('+,2..-**)*%"&#($$#''&&%&%&$&&&('''&&,&('%*&+01.021($%&%$%'**--%&(+,++(+*)+*&)+(''%(''')*+*,.+,,),**,,,,-+0/.0-/..-./0./1/1021.+31249:>JIA;757;654464231/3.22234128<>>B>:9949699;=:DEJNOQOIJDEDFFFMNMJJQNLOTMXXV_[ZWTUSTTW]b_\Z[]Y\ZYZYXU[[UVWUUURNLHJKPTXRLJIFDCCDB@E>;?GMOMNRRNLIED??@:;61211547<:73965544122446>GMJFOIF@@A:841-2210/3--0*00..-,,.-/.,)-*)))*-+-//..001447;:59<<<;6=:6<>:>GLJCA99<9?56388:;87:6;889;:;88;8;=:@IGA?A>=A?>8>:8A==<;=9B>>@;A=<==>==FD>C@EGNJLIRKR^ekywz|x~}{~}{~}}nJBGMJMNMMKPLJKILHHIHLJHJGIIIMFEHHKLODLIKILIJQFOGIIKJLHJFJADIFJDHFFF>;==>=9;=8:<;:988;=>=>=>;:9;:?><;;:><=?=AJQWXWWULIC>>654432//.*-+0////,,-.1*.,--,),+*-+.0///1226676:;<8::;;GJFF=:=<8:774775<=:;698;;:=;58;9@@=?HG<@B??<;@;<==@::<><:<8:97:;A@>?>=C?BELIHTPTUTVYURPSPJPRSUX[Y[W\XWWVVWTXTX[XU\_`dbb_bhbda_ba]\bcWXZl~rnjklhkb]\[\_]\ZTWVUVXWWTUUUVPSORU_SLNLLMQJLJJIJKIHEBBBFMQQXW\_Z`Z[[jO?AB?;?>>>7>=7>9:=?99?7:>=B>?<><;;@?BAB=HMMMMTTS^hnz{|}~{|{}~}~~}}{tQJMKIJMOJPMLKJJNJMHLDJFLEGJJPGFEFIHHJLIOGMOMJDLIEMMPLIIKHF=IGHEFDIFD=:A@@LDKFIEDHHIGDBCK?B?>>BB39:9:<;4.1.,-*-1*%-(()'')(($&''*).)./.-,+,+,+#')*)(,*(',+*.,..027i~[][[WSTUJPQOV\][WUTSXTU[X\^\^^Y_]\`ffW`]ZWZZ_h[]b~k`lvqtsqosmonpdRKQhnwvqqnlpnkm_SIGYetrlfkq\\\B1/.*&&#"!%##!  " !%$#$%%$!# ! !!! " "%! !9;:9;3<8;:;659779689<;7756976:977;278:99887867498@=?;=A>89><<@<::;88<9979;@?::>;=;B;=<:9<<<>KII?3377655825020///13423367B=?=B;67576689;?;@<:;<:=<=;;<<9BA@DLHOPQVVYVWTRRMQPUXVXXXW[[XYY[VVRRXVWUWS\^]___ddg`bbbaa`_`ZUZUi~qjjkkiifbceb_`]XWXXVUXZWSRSMQQPKNMUMNRKLLNJNNJROIHFGJCKEOQUUYX[^`]V_fSBBC<==9@>>?<@?;?AAB>AC@CC?47:5>98611/0..-0.)'('+()(++**)+*,,,.-./0./+)+(&,(+)*+*-,''*,//255g}yr|u\_^iTI`jSJMRVY[]WVVWUU]Z\^VY]b]b^``ffX_YZZ^_ik^licowurotoqpqph^RLViw{nspnpsnlhcWKKZjtqphmniigeI;74+()$&&!%$"!  "#$$"%("#"#!" "!!  ! !!"5:::<7;9:9;;5598<9;<:>8::8:969859959548<8895:979<:<=====;<:>?;;9@;:8:876;>>>>><=>;>9>:?7;<=?=<==:A==A?ACCBA:7...-*,)**'%"  !! "!!"$"! #"#%! "$%&&&'(0*,.,,-..0..-0+*%+&"$%$&$(&$$$$#$&%&($)%%&'&''.-1.0-/)%&&%$$&$%%+--**('()),,,*'(+**($&(#%%##(**))**,-,+,,)+,-.0../..*///0//./-/,../1-3<7>JID=47272111/0/002.321355334?<@@@66766569:9:=46;=;99:;:667<9A=D??;?===?<9889958<:8<;999:9=??=AAA?IFHJGMOPTQWXWULLOQNUXUTUYVSUWVUVTVT[WUZT\Z\]^]^^``m]\aYb^]__]URSi~plkglniebdbb`aXZZYUZZXXTSXTUQRPOQMLLLOIIKNLNLKJIRJIGDFBIMMVZY^\\_ZY]dQ=B@AAC?>?9<:<>:<=;=:<=;=B:???<=>AB>A>DCLJHIOJQV]dpuv||~}~~~|}|qRJONMKSOMMOJKMLKLOJINKCHLJMGMKHGJG@IGGLHFELGOGMHHJHUUOIEGBDIDHHFGL^]QVGD?JHEFHBBCINNED@EE=>=B@>8>===685/2/.0,0+0))')&))''&*,%)*-,+.20/)--**)))()(.***(*.*,./.205cwbdnchfjHHv~YITSV[X]XVRPPU]\Y_WY[bW_][\eb[caY\^]fv}ibnyurwpkqmoik\HM\ssutsokonpjgZQEL[qtioomonbcXXQ>810)%%##$!##%!!!! % $$"""!  !!!  " "!  =;:<<7:9:;::96;646:8775778<:9<96855:97:;7997687;<9>=A?@=;>:=>?=;9<9:8:789=<:==<9<=?=<;9:9==:E?>?EEE73+1/.-,*.*'#     ! "#"!!"&#!""$"&()*-&--+/,.0..---/-))$$%#")%""$#!%"&&$%''(%$&&%*'.1/--,,+#$$#%$#$'&').)-'$'&'*/,*))+*,*%&&%$%#&((+*),*+,+**.-//-.+/,---,1,.11..//..03441696;GGJ76827213000/1.2043316446@;:665255799;@@FDIIPLGCEC@EDKGEJEJNOHUUTNKJKFOQPXps`Z^_\Z[^\][[ZXUVTQQOPPNHJIFDFDBBJDEBEEA=>::?>>DLPSOQNHDB?98;7;>=A==;298752727637766452-54:=DHJFKFEC@E@:83//12-./+0.+)*(*()+(,)****)(+*(.///034454989:@;<98<>9;7FIJE>;<==:8659798:8=46:;:>::77728=9>FB=<<@<@D@>EIGJLOLNTSYVWTSPOPTSXTTQYWWTZWYVVWVXUSYTVU]Z\___ccjab`_d]````WWZn~oglklgebdgecc`V[UUVZWRUUROKOMKQLOJKLNLLLKOJKLKGHMHIHHEHHMLVXR\a]^ZU]hM?>B>=@;==:;<<>:7999<=>:><:B<8:=?AAC?FECIMONKLQRZgpyz|}}~~~~|}z}~|rYMMPNFNKIOOPIHMJGIHHKGHIIGDFKGLKJJIFHIKEHHJEIJHKIHJHLMELHEBIDAHLDXrlhdG;ADEGKK@BABIJIIJGD@D=79:::>9;8:<8>::6;;<;6;88;:;97;998798878;9<:7=;;?>=?:<>=<===:>:<;87<6=@B;=:@A;>=<:;>;==;>@@>B=??ABB?CG?;3/2.+-****)%!    !!! $!! !!""#!! $##%$""$&(')**../.01011/,0.+*'%%""%%%$$#$$&)$&&(''%&'%%&'+.3..,,(%&%###"$#$$&*,3+&%%',-)))'**)+(''&####%''*)**,)**,-,-,,,+-/-*0,2./1.20/0///05/26;<@ILI:5515204513231-4/25475;9>><;>=6465696<:=>;>=C;ACHNMPQMLFCC79;:>A?BAAF@DC>?@=54655684444166145278>>@:=>?>:81..114211.-+0,***)')*-*'(()-++-.,/02255798=;?;A;:>>=>?@@DCBFHHHPNNRSSURVPQPPOTWWZWUZ[YY[XWYVWXXUVWXYU^]__`^cbeca_^b^`_aaSUWj}ytxwvqrpiggibb``\SWV[OWRSONSQNRRLPJLPOLMJJMNJLKLKGNIIHIILQ\\\\_Y_^V]dM@AC>>?::<<>;9>;9:6:9>@A9?==@?CAB@ELNOLSPMNZemq||~|~~}~{{|{~~zzpSPMNLLMJHJHRJMNMJLIIIHFOMJLILKLEGKGIELJGGIHGFEGJIJIINJFFDFKC@CEJ>Stse_H9AJGFFIBCA?FFDFGDB>@;C>=997<7986/20/0*,-*0(((&'%''()(('+((*,02..0,,++-)&)+**(+-.,*))-,-/3MM]|{ijr|`I\SPPUZ[\Y[SXWVZ\ZYWXZa]`]`ai\\b\^p{fenutxoqqqqmmfXLQbkuutlnrolqkf\OJWmrwomkqkghefeYSI76.*,(%'!&""# #""" ! !!"!&!$" !""!""   #;>=6=;<;:>?;798977<=:58:8798698:988:75<=99::::8:6;;?9>=:=@8==>@=;??C>=>;<=?=:A=>@=8=@899=:@@KEINMOHFD:89<>??DFEHILMHGMLIG@<44;5304100211.,./062498::54/,-//0.23-.,,)((()*)'),'-*-*-+,--00/22549:@=;>@@;==:>5?>F:;>=<>;;78788:?665989:9897846<67@A=;=??@?CA?:;9;9:7=9;7;;:;9;@=>?=BCDFJEHRQOSWUTXUPRPMVWSNUXYXW]X[[VXWXUWQYWYVWX\Z`^]e`ba\\_`b`\d^[RYklmjllnmppmjlgge_gcbej`a_^`_``_]VY^[]]_WZRTTUUXYYWXQKFDIFKPZW[[[_`XZagOAE;@>=>;9?;>=@<:=?9CB@>CABHJFNOONR_huvz|~z~~y~|}}|~qTQOPLMKHDKJNIINLLJPHMKJHIHHJMJHHNIGFDGFIEJEEHHHDJIHLIKEHICECHFJKDI[TDEB<2;599>7520---,+0--,-)%%&%'(&(&()*+-+..,-+*0**(*(+)*,**)((+)*..0328Xn|tknwX^`STWT^]\XWUW]Z`^aX_]a^^aX\_c`cipyagmuqtqporrokcWQN`qvohoqosnqkfYNIWjqsllekddekib[AB?C2=)/+)'$%# " !!! !! !" !""!!"$!!  "!???:@88<==>97;798<<<<789<:9:89;98866998778:;<:<89<<>;A=>>>>>=?@<9?;<:98::>=>@::;>A;<<<==>><=;@?=@=@>>=C?DD<:51.-+,,*).'#    ! !!   " """"!$ ###%&(),0-../0///.//1-**'$'&$&%%##%&&#&%$%$$%$$'''+041.-.)'"&###%%$#%$#')-(&&'(&),)((+(*(&%$ !$""$"%(**,,*+),-,,+,,-/.,111./////.1*4..///6<:8MCG;6641343212211-.52134:98899366154457<<<8=DCDIHOKFDCACHJDLKKNOPSSSOOPOHJHGKQTSUXTXgtzi_\Z[]^[^YV\aaWYSRQUOQJFJDH@?@=?=><><=8<=;<>?HGMILLMCB><8;>?>GBGJPPRTYWX[]WXNKB:5011230/1/-1,*214146932//)+..-03--.,*,**))+)()+*+,(,,-./.1.35955:>@??AA>C=;8174636;?>??9565;8=<;<8;:98998798;=95978;=?A??C>=9@9;:::@>:9:=8;;??A;??CFEHKIKORRSVLNUQQNTQVWXU\WZ^[[WZZX]ZXW[[[[XXX[\_`]_eef^__^^][X^]YVZogbd`aa^^bfaa``[\a\[[[]]b]`_a\[]Z]]_[Y][Z]`]_^aZYUWPHGBHIMNTV_]Y[\YXf`MA?BB==A;;;?:<9;97<8:?>:?<;@:=;>;@C>AAFBGQLJMOMV[boyvz|}}~||}~}oROSQPRPNMNLNOINGIMNLNLHGKJKNFKJLMKKLIIHJJNJHNLGKSPNJMKIIFFFGFFLGIKMG@A@=AICGHGACDEEJMEBCA@A;:=<494899<520.,+-.0*)+)(()()'%%'$*)+,+/04.,,,*,+)(&)$)''**)),+,/.0.37u|zvzNhfNWVVZ[\YXXZ_[\[_]__a_^`[ac`guve]otsrvqtptrliSLQgsyroqokomqheTGLalrsmnlphlqhcZQDRJ^KE42*/,('%%" """ %$%!!##  !"!!#!"#"!! !! A7::9:9?===<;=8899:::;968:;;8:599586;689:8:;;<:987;:;@?>>9;?>==;<=<=76858;?<==>;;=>?=:=;A<=@>@BDGECDDF=:@DEEHGFJMJPSUORTLFJKLKVSSX\rxa[\^\\[\ktkd]UUOOOHIKHDA?A<=:;:8;697=:;<9@>@LHMJGEB@>839;5>:@?DJKS[]efjgha^YOC81111///1+,-)+,./1-.1.-+)-(,+-/.-..*-,)-(+&())+**(++.,0--/43589;=?;<@;6;;9401.203=>?;<566;9:A<9:9=:7::86548:=<4.027?>@?===9;?:?;7===::;696<;>A?@??FGHIJLNRQSVNKRPROMPSWT\[[^\`Z\YZUXWVW[ZWcY]Z``[_eaccfc_^`_]^[^[VTYh~h]d_````]]`_\bY\]][_]\[Y[ZZYY\[\YY[XXZX[^][Z[_U[XYSBFJEHHMSYZ[XZ[ZV\gL?>>@<=>98:;<:;><88<<<=>>8<>88<8>@::=799A=<;96:::6<8:::8;;797889;8698:::78;=:6:8;<8=>AAA=;?:<>;>=><:8:8:;<<>?:===>=<6;@?@?A?A@DBBBA?:100,*.+)((%&!!! ! !!!#! !#!"#""$(*-+-/*00,./.0/.--,(''&%'$&&$%#'$%$'%#'%(''+/1/.//0)&%#"#%"###!$'&(%'&$'%(')*()'&)&%$"""##!#!$%*-+*+),+*+,00+.,+--/.*-/.-3/.00-/115@6:HHC=3413/12/31./-121020264469677952444597>;9=;<==?<<>;9699;898:67;9@@B=@?@:=?;<;5;89:7897:86;A>BABHGGKJNKSTSWQRUNSOMVYYRZYZ]V`WbY[TYZZV][WY^]`b^\]cbabab^b_^Z^]]]VRWm~k`g^d_eb`^_a__]__]`^^_\a[]Z\[\[YZX[\Y\XZ[\[ZW^W]]WQIFEDIEOSRV_Z^^YU`cPC>?@<@<<9=:@<;=;88:=;=?<;>?:<;6>?@?A;BEJLNLLMOVZemvy{{}}}|~~~~}}~{|zuXYVWTSSUOSNPRJQNORUNRQPQPRQONQLMLNNLMOONNOOPKQMOKMKQLMKKPNKRLLQNLNQNJGKIA?>68675396FFB?>@>A;=;>38667=<80,)0,,,/)-)+**(+$))'('((,.,./00+-,*'.,)(*()+))(*+0+*,-.317tyv}zEhbRXTY[\ZZ[UZX]\^][\`^acdfsodcnrqomrrqsnk_RLSiqqsppsppqmf^NBQgn{rjonnnjlkdZSFNWgi_]L:-%&()'&%"!!!!  "!!#"$%#!!!  !""   >>>=;@9;::>>;=;7==:;;68:9;;8988:68669999<;><;:6=99=;><=>==>8;<98:?>@=>=9:<=@>@<>??>==?BA?CBDC:40.-,-+*)('$   ! " "!"! " !&!#&$'(*-,*-/,..-1/2..--')&'%$%#$%$&$%#$%%'&&&'+12///02/)$$!##$#&&%&$$&'&'('&'&*(('&&'%#$#"!""$#%&%&)+*.+-,,,,/.*-+./-.,,,2-./..-0,0103>::KFE>22/32/3033.//145311/2216986:@466096:::;9?=@GEFAB?A;<>DACDJMMLRTSTSSLMONMY[bhiÿnc]gr|~t^SOOKJHKDEAAA@???;<66:998:98;CHLIJHHB>8632344323579ADOV_e{}m_L:00//..,0.+.--011./-,-+,*(+*)),**-&,))+)'()&**)+),,.0.-,/0387<:B><==:>>;=>=<:=@<@>:8?;;;>;:=>=@@>>;29?>@D@CGKHMORPWSWSUTKNQVZ\XYZZ]^[dY[\_]\\Z]^ZW[`Z\\^^^`]_a]a^cbb]_[\^UWYj|jdfbga`_bd`^_[ac`]c`^^\ab^]_]^\^^[]]]]]Y[VW[\^^[YYWLDFGJKNUX^[[[cX[`bM?>=9>C@<8=:?;;=797:=<>?=C@==99;=?;>=@;<9:9;<9<:5969:;8487;7877;9898;99=:7;99><=B@9===>;><9;:>;:::77<:<==@????:?>A@A>ABD?:50,--+-(,*($ #!!  "" !"! #" #$&&((**0-*-+*1-1/0/.))%$%%$$#%$$&$%%%)'&))*.10-.00530(%!"#""!$&&$%#%&%&&''%(*'+)%'%%$""#"!#"$$"%%**.*.++**(+)+)-,-*-,..../-.-//.21079A?@987:9996:9>EGGNKLE@:33213326551548:ER[itz|si_P=1/1/-0+/+/,/-/.)1,--.,+()**+)*+-))+,*,)('(&*)())+++.+.1.0598;;=;99:6<><9<9=<99;89<=;>9C?><;<>@=;;>@:=A@B:?>A=>A=B=<@@A:@?>>??B:18?@BBDFHJFLQRRQWQQOQKORWVWVUXX^^U^XZ[_Z^[Y\[X[Y^^ZZX^aaacb]_^__^]aW]\XVXj~kcf_baecfhfg``b`bc_``]bba`b\]a\\ZZY]_[`\^]Z[[]YYU]ZIBFBEJORVZXY\]VZZhL=A==@B>7889<@><;789;=?>@;:;<:>;;>><>@A?EGNNMHRUWfruz~x{}|y{~|z|t}}zr\\TOSUVROPRPRMPLPMOPMNMMPLPQLNOOQNOMPIKIKKMOLIQMMKOQNLPKLIKFHJIJJIHKFKHG?55312,41/38A?9@?=:<8>;3465;8942,01--,(,'++()&(%'*(&*&,+(,,10,-+/-++))(++&,+**,*,)'+/0817uyxBhaQWTT_]Y\[V[ZXa\b`Zdduqb`qnpopotksog^SO[kxvrmoomvijeZRJVfupmjpntgofh_WDEUgimlfhZSQ;,+*&&%&(#" !""  "!""$# ! #    !  !=>=;==<=@:=:;:9:==;<:?:88==:78:::98689;<;<>;<;:;8<=>==?;>>:=8@>=;>8=;9889;?=;A?=?C?A@A<>?@?=;@@>;@>A<@CCGED:3.+*.)-++(($"#  ! "!!!! !""!"##!##""#$&',-.,,//+.*1/0-/--*$%$##$#%"##%$#&$&&&)+-1////555-(""%"$$"$#$$#%"%&$''&()&()'(%%#"!#" ##" ##$&()),,,-++,*,*-,,//--+/..00/../15095<=<996569497939:;7988:8=9<9?8=;:9?=<;==7A;<9;;:@A=>;>?=@>DA>>?92;A@;EDGJLLOQNQSWTYROOQOVUTUUVV]\Za]\[^`aYVUZVXZ]\ZZ\a^_fd^Y\a]]^_\ZZ[WWYn}eacbdc^_`^a`]``d^d^cb\`][]^_``[]_\ZYaVZ^]\\\VYZV\\UDEGBHLNUXXZ]\[ZS[eOA?=B<<;:9;;8>;>:858=:===>=<<99???=<7>:447757;52,,.0)+(,%())'$(%&('&()'--,+4-,/+*)*('(&','&')()(.)*,/,/25vy|FkdU]W]^aY[[ZVV[_ddddqo`glomkmmnljqkVKI[qvoposoopkmcVJIXiqnmolnmjmgiZNDDZjnphf^hhV@E32''%&$&$$   # ! ! !!" !#A??:??8;998=:989;;8;98:98::<;:;=>98>=<=><;<><>:<:<;?=B::96<;@>>@<>>B??@???@=A=?@>??>>@@<@?CB?850.+-,,)')&"  "! ! ! !"$! "$#"$&&'),+*,+,--.//0,.+*'#"$&"$$$$(""&$''(&)-00-/26673-&#&"$#""&"#$"#$'(%'%%'(((((%#####!!!##""!!#%%((+))++*-,++.,0//+*.,./+-..0./0;38DBD:3313/13310.0/236200/01/0567:;:867728:9<;==@ABBGEA?>?=BEEBEEDHLQOMKLFLJPSXY``^beb^Z\a_ZSYWUYW[e^^cbfd_cZQLJFGD>AABCD?A:=;:A::968565@CEIEB@>654131-10310.221487>HKPKJ>9120.*-+./-0/-0/-,*-*+/)**)()-(0/-,)+*),,*,(('''))+*+-+.-/0347;9=:<<:<877550956545::79;9686<7897:858:87:8<8:;:8;<9;::;;<<8:=::;;;98;:=:??=<6?>>=:;<:67<<=;<@?=<02-00-/1/.5:8>;?=<<=:<724856994*,-++-*(*(*)(()((('')))-+,.1//,+),&(*((++)*(**%+)*.+,+088vz|HsiX^W][_\Y[[YX\\imuj^fqqpnlnmlpkfVOLansokknnrnnm\YCM\oulmhgoopmhdSJBJ\lnjhjd_fb\C9+**'#$$$$#"!""#""!!#   "!"""#&!!   ?>A<=>:;<=9<<;=;;=?>:8<<=>8;99:<<68;=;9;99<;=?;<>???=;<>>>?:C<898>9=@<=A>>A@@@CFEB650-.--+)((%&"   ! !! !""!""""# ""#''*-,-/-0-.-01.-,-*%%%$$$$$'($$%%$')()/2-,.226352+$$##$"%""#%#%"*"&'+))'))*%%#! " "#"""#$%&'++-),,-,,)*-/.++-0.+/1,./,-//5?7;HBD92-100241/2-10-121/1..001697964204:99<;::=@@DFEF?@?@?@DBDAGBEEGMMLKJEJGLPSV\YZ```c_^^\UVWXWXXVUKQRU`^Y^RRPGDEB@@A@@<:=:9<<<:?<::676=A=GIMDB;422213,22,00-334477:8897312311/2//0/100./-+),(,,',**)*+*,.+.+),*++,)*('+)**)(+*.--21255:9?<:;78;:87<4977:9;68878688<<98857848996:;=89776;968@5:;98;;<8=<7:9:;<<:=<>:6<=?@DEGHNISPRUYRVSTPQUUSVSWVXY]YWX[^X`\^\YYX[_^^]a^]]cd`acce`^_\_\c[XWXUlzgdfebc_\_`_[^\\a^`[^]\aZ\\VW\WYW[YYXXWW[VZX\WY^Y[YTBCHDEFQRT[ZZ_dZWbgIB>@9:<:;8<==;76===>:>>?<8?>>?E?@@BCHJLKHNIS^`lvx~|~z}~~~~}|wmYZVSQSMXQROQOPNSOPROOMONPLMMMJINMKNMLQJLOLMKJKHJJLNMMKMMIKJHLLGIGKFDEEBD@/22420///.7=;8;;;<:>8:375658623/,.-+.**)(*'()'&&)+&*((*.,+.-.+.*()'(+)*))(+().+*(,,,-/59u{}HzfSUXX]^^]YSY\\fwk_dlnooprqpkieZIJiluqjrnkmlle]VLO_qupkkomqmmk`UJCOalrmjffdjed]Q?7+)&#&$$#'$! $ !!&#$&#! ( " !! #! #!!"!" !B?@<99>=>@==9;;;=9><9?::;8:=:;=8=6=:>8;=;;89;<;::>:>?;>?A??<:@<=??<=8;:89;=AA?BA@D@B?B>@>=B>>=D>=@;A?@DBEDB85+,-++,*(&%$ ! ! "#"# !! !!#%$(*-)-+--+*.*1.-+++&%)&$&"%$$$%$#&'&,1/10/13=8350(&$$"!%&$#$"###'%&'())**)'&$!! !$##% !#$$##&'**)*,,-.-.,/.-,,..1-/,./-0311;78EGG;3/344/01/1/.00000--+/03336453253457:9?CEFDCBCAAC=@A8@E;D@EDCCKONMJKEDINVTWZY\a\]ac`\YVUSSSRVTRROPUXUTSXPPKEFA?98444:A@BKG@?95312/5-//123.301161232342121/0/20/.0..-.)++,*))*)*())()*,*+-+**)*())))$)%)(+*++---/0366;==>:::;8:5667;8;:;785789799985:<79<:<:;:8877:=::8698<9==:8;8:79=<=;8GHMQSX]X]WVUU^aK@A?@@>=@::;:789756<=;><=9B:=:9<?=BBILKLHMQT]emv|z|~}{{}y}x|zqYVSSOWOSPQOSOQMNNPQNNONMOLQMPMILMHLGJLMOPLOFIMJQMGMKIOKIJGJKHKHLLHHGFGGF@63/4/.0/.-8B:<;<==;<;=062827830/+.(+,+-+)'())&)'**)&")).-),/,-,*')+(*(*)&(+)'*')+,--2.65v{EdSVYX]_es\U\euzjbckqmkkkjnlg`WFPdoyjqpommlkk\SGUfplpjnmognjdaRHCRepslfgldhdfbnZ?65&&%##"##""" " ! "" " "#!" "#! !!!# ! !>?>=;><:<<==?;=9::?9;<99=@?=;?=9:<;:<::;>@==;=>??@?<=@B;=8=AA?;@>==@@=D><;@@@=BDDEC95/-./-***('$  ! !" ! !!!" ##''*'/,/,-,,-.0//0.*')(%'%%$%#%$&%&&-10221028:231-)"$!""!$""#$#$##%%%'&*((''#!"! !!!! """""#%&)*(+,.0-,.,+,.-+.,-,,.5/.00.3986DDC>14442/.1.110,..,-./010,254766403568?@CDFC@HEEBCA>=@<>A@DC@@BBFMHLKIIIKOSTYW[TZ\[__\ZXSOQNQVTROTPPQNPQQSJHGEB@?;@8;::8598?8<<;>:5:8>?>CKG?>663.532220003/1/324/02213323400021./2./----++)('()++,,++*++,+*))'*'())')*%'(&*+-+,.006196;;<;::96865;9745788::;7;6987;6866;9;9;:::879::795<6:?:><<98:;=5=<:;>=@@<9@@CEBHHHNPQXW^WTROWQ^^VUSWS[ZU]VXVYZ[ZXZYXYY_Y[a^]`^[]c__^`a]\__^[X[]XXVl}icb`b_^^Z]]]\]][`\a_\[\^a]^[[YR^\Y[[ZZW[XYXXZU[VZYPHBACGNPPUZZWW^WZ_dLC=<==B;;8:9;8<<:47<;==;@A?A<:;;<>=B=EJJJOMOUXbot{{}{|~~}}|~~|y|}rWSQTTTSSRRQTNSMOMMNORJQLLNMMRLIHLKMLPLPMPLMLJPKKJMIKJKKKHMFHJKFFGLIGHEFH<11312.//2/7B<=<<;=<;>975676<<28-++))*(')+))*''('&''*%(''/+1/-.-+).+(,)(+'*)&))(+,-.../28t}HhXYZY_cqv[gswd_nutnpmlmjjfbXGQfstoknikljiecLKUkttoolknopjl\SDJXmtrjhifgjffcbVOF61.'' #"""##!# " " !!! # #!  #! !! !=A9=:>9:>@>;>=::<>;;=:;;;>9;::=:<;99;::;76;<989;B==>>@A??=A=?@?<;?<>;<:=;>A>A=;<:<:@:>=@;=@?;:869588:;<;855897;:=AC@;:5404333030211/.30100323313/11/0.00//01,.0,--+(+)*)))-*(+),.)-**'')''%%)((('(**+,+.-013;6:?=;<7<7:85:67796878985475777788::9<99:8897;=;8:::989<=;9::;:<7=<;;=>=;@<>A9:B@EECFELORUS]XVRRJRVneWUTXW[[WZZVVVXX`YXZ\ZU_WXWX\_]]Z_]^[d^^]ZZ\_[[UVTWl|__a``]d]X]YWX[[]^__]\^]]]^^^`]Y\YY\YX^YWYVZZ\X[WWYSJECCDBOSRX[X\][Y]eMC=?:<>:;7=::<@::658<@A=A<>>8;;:?A;@A@B>KIHNQPOU[arxwz{{|}~~|}{z}|~|rXWUOPROORSQSPSNJRLNMMIONLLIKKPKMNKMLNLLHKMFJJLLLLHGHHKJMJLHMLMHGIGIHGEBJ<312410031,8@8<9;9:::<6446:87872/,+.,(-'(+'+(&$)+((&)&**&+,.-++(****'))'*'('&),,),,*./30;o~}JhVZ^X`ajpr|ibmpqlllninrjbSJWbutrlljpgjghZKPWmqommilqlljd[KIM]numoiicejfhgh[WM@:40%%'%$ "$&##!#"!! !!$!# !#!" !!# !!!@C>>;=;<<>@??9=;:@9>?;=>;>>::;=:>:8:=98=989=8A<9=;?=C??CAAD>B>=>;9>9=A>A@FHHC84//,-++'()'"   ! !! ""!  "!!"%(),,+..*+,-/.11.-+-&$#&%%%%%%'%'+0/.0.069A=?::5-'"""#!#""#$&#%#%$&''*()%#" !"""!!#$##$$"#$%'(*()-*--,.0..2*/+2-../-.05775CIDC/121300010/./.-.0-0/041227:=6?:74556>BFHGDECD@@;=<;=::53252/31210-./0/0/1104/4421021/1220/.+///.,-.+)++*())*'')),)+*)(()'''&'(((((*+),.*+,/43688;=;:8<877142504447587778999<9<8:9;=769:997:>9969;<6>7:;:9;::<9=?C>==A=@=AA5AF>@GHMKMPRPV[WXTSQTszdUX\Z[_ZX[YZYXY_\V^]\WZZ[\\\_^\fbf[^[YX\]bZZW]][\UYk}H?BCB=DB=B@A?==@?@??BAD@A?=ACD=DCBFGBCIEEIJMPKMKNOI@BDDHHQSWZ\[^YZV\iMB=<=><<<4;66;>:;967@>6=:?;=8<9/00412.1/05;:<<:<<=96:66566497/,//-.)-*(((*)&#'%((*('&-*(*,,/--+*+*&)$''*)(&'&**.,,-0305p}FjT`ZX`fxufenmmmmijlfle_MJYmtqononiklicWHN]nuvihjkmjmfjXILMftqnimigodejefaSRUND4.% " $#$#$#"#""  " !!  !#!%!!!  @B@A@;;>>:=;>>?=??;>;<>>;?999::==9;4<<>><;8=:<<:>>?<=?AFA?A=>==C=@>>;9;==>EDB>DA;?<>>?BBAB=84.'$##!"#"$%&#%#%%$&%(%($!!  !""#!###%#$#$&%%))+,+(-+-+1,.0--+/*/,-/1/5789GAG>340724/00/20..++-002322237=?;CA<6627:==@@BGEHEBALLGKLJIHIOJMMQ[YZ[\XTTUVOQRNTSTQORKQJTSRLNNLIJED=;;6;4:87665846775416457:4785/34453712100./-/--112756365.12010.*,-++.+..0/**++).*)*((+',)))+)&'&*'$(%(+('')'*,+*.//39:9=?>8;9422,./--..0101.0.107553544749743689654665<:;:==;;;9;7<>;97;79:::9;:<<@@>CHGKNPQWOVWWURSQ`dW^^\[`Z[[d]b^]_`]]Zc_Y]ZW`[ac]c`\]a_Z\Z\]Y]XZ\[ZWYpzMCEE@?<>9893/0//01//1200/.-+-.-/3,/-.,.,+/,0-//;<=>898<;4474563////,,,++))()*&&%&%'%$&#**))+-0-*((+'&'')()(*()',((,/..147o{FlX_Zbxwehjskimilmolh^UMYgsplgimknim`QEOeotjhkklllkhcTGCRkpolgjfdhhmkjk[\^kxlQ:/#$#$$#$#%(&$#! !  ! ! !#"! $ !$ #!#" ! ! $??<;@>=?@>=;=>?=?@<<=<@?=A:>;<<;=9::=;;<;?;:;::<<=?=@@DBCAC@??>;CCEB@=B@BA@?C>@<@=<<80,%%###$$$%$$%$&#%&%%%&$#! !##!"$$$#$#$"#"'&+,(*.)+),*//./--*.-03/-245;FAF@3014421340430.,..103/13/17=?;<8535357788<>9?FABC9@@?AABHCGGEDJMIJNIHIJKJJMMVTTYZYSOSOMNQOXRNPLOJMMPQSQVQKKJC><=97<68957856335446344421/12/14524320010///,0-.01575778521//,1/,/+.+.-+,1-*),*&)',*))'*,*))+('&)(((''(&')&)'++1)03-6648=;>>8965/0/./,),,/--.,-00.230/326431--1/521.10/748758:84642422453345244678;?B@DNGMJPPRRXXWWVQR}b][^b`c__a`ad_dbb[fa__]_^Zba^`eaa^]]\XWZ\U^^\]YXXQYn|SGFABA@>BD?@;99.0211031-11..0-///0//---,-0,+,-,//0>EIKKNNMSZdmsvy}{{{~y~|~|xzt{{{~f=7775654758337754788<5:89:>?>E=E>FDGJBHDEDCEA@BCCHBGHGEFHEFFFGFF=225210/010:D;;=<<<8<:;924845611-10.**+)+*+(*))''$%%#&(**(*,00+-&)*(+'&('%'(+()/'+)+10//4rLm\gtvgjpokkjmijjif[QP[mnnnomknmkhbQJN_opjjknkjijf\YGNZppsighkhffkhhec\iy}|yc931')%!$# ""#"%%##! "" !""!"""""  #! ! !!!! ???;=>>:>A===>A;>>>=:;;:>;<9:=>;9?><>9==@???;=>?=B?>=?AB?A>A==<:=>>@A>=@B=ECBCF>A?C=BJFGD53/,./+-+'*%$!   !" ! &"!!#$ "!#"$&')+/*.-,.*-..-,-+**(&&##&&&()3/2/-/7BB;??CDGGHIICIGIEHIGHBKDIILLRVWZSSQSQRPPTRNNNOJMNNMMMOJHILIEA><<88:59687485543242044011-0/224433354221//./2,/0245234411/./,/---++,,,+*--+,-*)(())')'(('%&(')('(%$&')()(()'+*-,//1557;??=::974410020.4//01/.51013365646555745584699398:8779546686:378876133422=9?>>EFHJNPMQRTbUSWTQdg^_c`bfacabgigdebccdbcb^_^`fihedd`b_Y\[Z\U]]YZ[WVWTnPBJ?CFAB?A>A<>;53023022/22.0.0/-.10-.//-+/-/-+/-119>C@?@7:;??CRHMMHPMVZcmuz|y{{}|z~|~~}|y|}|zf9-1-10/,-,,*(+)()*'&'))')*$')'','*'))(',&-()+&-(*,,+,*+*).)+/0/-020565364+,()-142/.:C6:9<=9><>?@<@??A;>><<<;:=<:=:<>=<<>9<>@?=A;;C@D@C??ACAA?=@9@<;<=???:@?>?CCD?@>AA?>>=>>?>@@>A=?GCE@600+/,+-*)+&%   !!!! "#!!$%%),+++-1-),-0,,,*)+('&%&&&(,00/,-.7=BA??@:@=:3.'$"$#!"#%%%%)"$&%#% # !!''))')))('('$((')**',,/)..1/-/,,/.//..1569CFC@61/11/0.0/0.0+-00.//.00..026563023558:6=;>=CACIIIGFGKIHIFKJIEBJFHGKNNTSSTMPNOMSPSUOUNNOLOQMKJHHIHGA9>;98:9@7:7688466/0,43010./106/55643113/42100/.16127646321--+/-.+-/,+*,+,,+++,)*)&('%'$'&%''('%$%)%(&)(%('')*,+,)/-1476:99=<>66553420104212222645663959:8:8=>;<:>><=<>==@>9=@=;9;9?A<;=:=@:<<<;2:8>@@HFHIKNRTTU\ZUTRR~i[_`df`gddhjpiehfjhfda[__baiiffhcdb]Z^\ZZWX[VZ\\SVYl~ZNOPPOIK?NIMGHF:202113401/1.04/+-./-./00.01/.-0.0.9<=?FCMOTWUY]ZX[W_aJ>B?;:;;;98:9<=6::78:;A;=<=;<79?=<@=;BDCNKOLJPLU[dmwzw|{}{~~}}{{|{{}wg>41.--.1+.+)*,.++*,,+()*'**'(*'*)(*)*'++&)*(*('%')&'*((*'&'('(*'036534.)..,((*8BDB<@?B@A?A;==?<9;=<<:;:==>9><=?<@>@?>>:??@?A@=@<><=CBB?:@C@A>C@A<@AA<@?>?=@A?BCCCFC84.0.--,)*(($     $!"#! !#''+0-.03-.,,/-0,.,+)%'&''&),0/-,./6AC=<>A>=9;53/&"&#!$%$%$%''$%%$$ " ! #&)+),)(')),++***(+,*--+,-/-,./-.-./.14;99DGC9243010//-/0/0/+--./1-//..110/0414477595;<:=A@>?@A>><=@?DDFBCEGGIEFB@CDBDEHFJOLOLQSMOPTRVSWVMTPLNGLJLKOGEEBACB@=;:>=<;??;?<==?=>BC<@>@DCBIEHHQJRRXYYZVUV_k]bhfgcgdmlmmkikirvtce`acggkkjijfdcaX\[X[WXVUVXXUSWp}yfZb\]]JJD^`\Y\M:7612123123/+040/-.2,0.00.-1/-/...-:A>AAGHOUWYYY\\WU_fM=B=<=:;778;7=<69>:6;8=;B>;9<8;;;=;>==>DHHMMILLR\flvxxz{v{{y{{z{||}|zv~zg9520.///+,.+,*)**(((++*-(,+*))'*,'('()(*)*)&'&$'&%,)()&)&'$(&)*)>BG?>C9=9=;=:;:7540332432--.-,*+)*+&*%&'(*%%&%%('*()-.',+((('*&($&&''''-',)-,,-03:oOouvvmlnlllkigbUJU_spfmmggiljgUJMamrrmjnjnrlnfYOIXmpsnkjihjiiik`\_m{sVG=6(#&###!!#!%"$! ! !""!  !!"! !( BA><>?>>=>@?@=@A<@@AB;>@=9;=;??=E@;<>:==9??>?;=>CC=@==:>;<<>BA=@B>@?>@?B>?><@?ACDEE?:2,.-+.*'()'# ! !  "! !$"$'),++/,*+,/,../-**'&'&&(),1-.,13:@?;>:73.'%#$&()*%$&'%$%$""#"""!  $"*)))*,*,)*)).*+-)*(-,+/*--,.-+-,*-../956BC?<611-../1/10.0.../.-.0+,.-11/0.205689887;:8=<;;===:?>>@?G?CGBCGIGFHHAABCEIDHKIHLMPQOSQTQQPQPKMJHNIFIIGFDCECBD@<=6;DG:@D@77343322./222.-,../3166532.432302/0/.-./+/-,0-/,/-2/.-..*,))+*,))('')))'(''%&&$'&%'&(&%%%'&&''),%*(+)*.-028579:9;979530//.022/54323235689577;899;8:8:=>8>;<=9<;<><@D@??>?A@B?BDELHPMQVYWYYWTRsm]ahhhihllopuwuhe`afjegdhihhgcb]\]WZW`[XYXXYUYm|b\\]\^KJE]__T_S?>521022141.0.010,1/-3020,/2./.0-/17=?B>FKQSUWZXYYYS^dIA@9;<9;98;<::=7<=:;:8?:@<::@98;;?=>=?@CCKONONNV\anwu|{|z}}}{||~yxz{yzzf:33311.4--+,,*-,*),-./-.+(+.-)**,.+&*+),))++++*+.(-'(+')*,*,)&('7E@DEE===>>'1.CDAB?<=?=6:;=8688103414431----+)**+''()%)(''$)#&(())*/,-.)-*(*(&('')))&'*)..,//1038lm|pp}|qllpqmifaUNRfpnnollmggffQIO`lmmnnjmppil^WGJYjswkmkjhiikegbZbp|xnbJ753$##" #!!!! "! !! " #$ ! "!!!!!!;BAA@=<?BA@9C;>=>>:=>>>@?<>=?;<9=9<9=>?>>@@@?>>A@A>?>==9;@:???>C?DED@AA?C?@:?C>?>?AA@BEAGD9/+-,++++-(&"!   !!!   !# # !#$&)+--+-,+-,-.-..,*&''$'-00/3-148>987<<:895374-'$(**.2+('&&%''%$&&+..)$"!%$)*+))+.0//,-,**.+**-1+2//,,).+.0-/.1/7<6CFBB103/0000.0.-0-,1/1311/./0.2014422356688::7;:?;ADAEFDBEGFBDCACCDIFCHJDDKKONKMHKLJNTROLJILHFIEEEGBCEF>=;?:9KH;=IE7624114223322//-..0239763/000/32-0..0/..---..1-+--000/-/+)*+)****(('&%*'*'$&''$$&%&()&''&'&'&&'&'))(,+-/.04498:;<7;874112103401411254366646978=796:889;:=:A;:=9=;>=:<::<:;><<=@B;EDFCDHNOTTWZTXXVWYkdflklllnnqz˴kcbafhce`dbhgjb`Z^[W]W[\Z]XXYSVk~`\ZZZ[PLEY[]Z`QE<:1221431113/11110202510.0-.0.0/-2;>ACB@GIQUWW[[XZU`dI<@;;A>8898:;<<:88378=?9??>;<<:<=>>7>ACCA?=::=:=;<6994143155300+-)/,.),'*(&&(()('&&&()('*.+-*(+)$)'%&'&*((%&)*+**0,-24:ktq}otlomjZOLRekmjnkljeeebNNTeornmjjjnhge]QDN]mropmgkkkjiie][bunofR><5+%&#! #! !"   !!#"! "! # !!"#$" !"" "A@C=>=@@ADC=@A@B>>=>:@:@=<:<<><::>;>>>@@C>?==?DC@@@?AE@<=?A?ACD>@D@CDG@@=@A?@@=CAA@CD?ABGFC=62.-+-.++*))&#   !!  !#  $#"!$()-+.+,.)*--/,/3/,'%'+,./-0.*/+.-/10--.-02,0+,***)/.,,+(*,+,'))).031**(*)+,-*,/1122/,//00,-+-/2632.,+-,,--/.029>6BAC>43341-.20.2.,,+.0.1.1.162102112314668768=9>9<:>?==@B?=>B@@A?<<@?CFEFLIJPWUT]YWZSXcpfhnlmnqt{ţkefdeggd`dceaacb_``VZ\W\\[\WXSYl}wc\_Z[YZYIY]Y[`OGE>947334231043434013650/22.13033.49?A@DGKLSRW[YZ\VT]aFA?;<;:>::7>==9:8578:=>9>@>@>B;AADELQLKOVWclyw}z{|z~}}}|}~zx|y|yc=65230..4*/0.20--1+3-,-.--,,,/*0,-+-*/)-+*+)..*-'.2)'()+')*+'+-'=BBEDDCEBBB*(4@D?E@=:;9@;=>7986/2671592--+.+.*+*)'*)()('**('***+)(--,+))(()(&%(&&)&&&&++-+*-,0/38f~tumpropfR[ktolmiilhffXOKPfsuhjmnkjjleVKDUcpjllpmjfliice^`nzpnZ\R<(()($"$$! ! !""!"# " !"## !!! "!!###"&"!!" !!! D>@@>>ACD@@=AA@>@@?=@?=>?>??;;=@<;>?>;<@@B@>=@<>?<>>?A?@@A>@AA@AAC@??;;<:>ADCAA@A>?CE@@@?@??==@?@=@>?A@CHCA851...-*,+)&#" "  !! !#"&,*,*--0-+,./-0**++(**.2,/-++))(+,,,++)-+,*)*+(+*./+0-*+-,+*,(..-0/,./-/-.+*,,+0../-.//..-,..//012453-0./3/.3277;;8944510(,01/./,..2/11.110.2113/..32565868887888;<;8>=<@?@DCEICDFBBBBDEGEEGDBGGGHHGKLIJDFFJIKMNKLNHDIGFFEGEDC@A?@=8::;=434543360002423/2,.,-//025433000//1/1..1/,,-.,,+,,+,.,-/,-,*,,)'('(,(''''**(&*)()&(%&&'($('&%&%&'''')'),+,..01489;<999755132206/-/4225682788:=;<><==:;;@;B@=4572322215301.111222////1/311108=<>?FLPPUXWX][YS^^IA>;96;6:8:9:;:::;98?=>?><<=;=97=>?;A@BBFIKIHMGV]dlvrv|z|}}|}~||y|~{yyh85700/0-0-/2.0//.2*1,.*0*,*-.+..+1,,,-+).,*,+)+.*,*&)*-)&*-*'*,'8I?FEF@IAAC+.4>D?:@>>;979?453615560-*+,,-*-,**,()**)&*%%'(++(,+*+-+')'%%%)&((('%)),*,-+-2137k|runpqopyptjnkjnhhle[LGYfqlnijilmkieWIIVfnolhljnikhimc\aq}yxje]WTH5%$%" !" !""!! !! !!  #$ ! !! !&$#""!" !!!# !  BB@=B@EABB@@>BAABA@AFC>?B>>@?@>><=??>>>>=<@>>?@=<=???>@C?D>>>>BB??=?>CDA@=?BA>?>=>?D=@>@@GBC93.+/+,+,+)'##!      ! ! #""""%%(*++++-,/.//.-,-,*,+35.0.,*())*)())*)0)+,*+,-.*.(*--/*0*,,1.*-.../.-,,-+//---/...-,-..1,0,11212./10/02010/10542333330/0002/10/--/10110//225311.-112236856887:<8:=;9;>9@DFFEEBGDBACIDCA@AACFFCBIGHJGDHGIGGHJMKLJHIMIJGBEFFEFCAA=;;;:87858534136/53664303../-0/1230344/--..//0/00-*..--,+,*'--)-,,,,,'*,,+('''&)++)*'&%%#%(&&&'$&')&''&&$&(''()**.--264:;;<8=;:8101000013220106441478979954:9:9=;=:?<:==:?<@@C@>@A@DADA:DJDEEC>?BCCCDHKNKTU^[[ZZWVdywmnnttpxuzwy{}|vuuqppljjjifc`][Z^^]bZ_`^ZWWTVV\VSRWo~|aX_[`^W_E[][Z]T@BC<576856641333331///5523032630302==A??EHQTVYW]Y\XU]^J==:==<:>99=;;=:<;79=;==;A<<:9<<:>>?CFIIJNKNT^hpuzz}{}}yz}~{|yy|e;1545220//-...+,+.,1./.2+/-000--01-++-,*+,*-+,,+*+-)')+,(-+&)*.*8JAGFEAF?FC).9=F@A>9A>;<>=977:;451531453.0.-/---,.+.,)'*('('(*)**+-+,*-)&+')%'(&')'%())+(+++-5/:>=ABB?<@?BCB?B@>DCCBC=B?B?=>8@A=;@?@A<>?@<=;>?>CCCBC@CC@DB>>>>AADCAB?EBBAAA@B@?<>;A>>BABBBBGCA72.-/,,+-+)(""##  !! "!# " "!$"# %&(,+*,,00.0/3,0-+.+32..-*&'())*)*+*-)*,-*.-+.*-,.,+*+-----,--,*-------.+,,---,.,,0.+,.,.031./1/0//0/0021/.0202142/.00/111121/+.-/.11/0.1311121022067666995:7;=9:=;=@;;@FD@GDCEBDDBCFBDDCEDCB?FIIKNGLHHFHFIGHHHGGKIKKIHDFHE?A?>=<::89465755043441575332-/1,11/03411211.*0-+30/1-,-,,*++,)*+.--.,/+,*,+())),*&)''(((&$&#'&&&$&''&%&%&&&$&'&()('*.-0/448<<<:;769540)-00/23/,1-//2/1222103.12524748457:699998=8=9:=;?=<=;BCGCD<8AC?ACFHJNNSTcY`UV[[q|xppsvxy{}|~z}yzwrvsnnjligga`a\a`\_[_`^]\ZWXWYVSWVk|_a]W^[VaH\_Z[ZTEGFA@566454313323530/.0286020/100117:@BCDKMV[VX]ZZYY\bI?>>>;<9=95978998576:>>?;>;A::<9?@?@A>=7<<<862157594613/-01,.-+*+*++))'+&,,(()+*+,+'*(%&''%+(*&%(''),+,-/,203>=BB>CB?@B?ABA=A@A>C==<:=@;?><;A?A??>?>9@>A@@ACA@@=AB?BE>BAC??==@B@AAB@@=BA??>AB>>;B?B@BIEA64/.+*.*')(&$!    !  !"!!"!"!#"!#&')**-*0,+,/.*.,-0-30..(.('('*)*++++*)**)+*,,('+)./+,,+.-)+-*+*-./-/,,.-..1.-*.-0//-010.0/000../0/.31/20/12/010131.00//101/1/0+///-.-/.-1.2/3.3322774::99<@87<9<9<;>9>ACCIEONQUY][^TWXfwz¬wrvx{{}|zwxsrljokfbbab[bb[__]_[[ZZ[[XXTRVVn~x`[]_[[[[G^ZXY^O@HE?>3:277314333640002249513.0115349:A@?EHKQSRQ\W]YW`^H:7;<9=5<9899::;<89;=;9?>;==BIHIJIQLQ_`jq{yz|{z|}{|~}z}yzve>3643.1-4022/./0/.20,21-/+122,*10--.-,,-4,-,+*-(,+*&)'('(*(')*/-4?EE@B@AB@<-//>BA9;;2/12:6;76.1../0,-..**'++),**)'*)*)**+**,''*''+(*))(%'''(*+,+0,-,16h|zljnkmmjkgf`NIK_imliijlifjdXNHVcqqllmihlolfjb^cq}mondmsszxg?8/*& ""!   !% !  !" " ! >>?A??>A@@@C>CBAAAC?@A@@?B@??B?>?>?=A@?=?=@>>>><;?>?=?@EACAA?BCFB?CDB?>?=>B?@A@?CC?AC>@B??B?@?BAB@??@A>FDE>920*.*,,))&&" ! ! ! !"! # !!"!"!!# !   !!!!!#""! &&&))*+-..,.+10,.--1.+-)/((*(&)(,+)))*)-****+*)./,0++,+,,,0-,.,.-.-0+,--..0/...-00///./,10..1.-/1/00.012030.10-0/4141.012//1/-+--/.-.---1101224333697;<8:>A79:;9<;:;=@=@EHCECCD@?>AEFFDEF@CFBBDCHGJHHBHJFGJHOHGIHEHBEHFCEC@=;<;97:7854657314015542543321.//10120/,0.-/.,,,,,-.0,.*2++,*+,+,+0/,)+-'*((((+)('')((&''&&&&%$#$$&&&&&''&%$&(&*+)**/-/.1558=7<;>7062--*2+.//-,*,+,--10/2,./,.-//0630004/435221235444312442347599><>ABEGJJOUU]\^YWY\pwz{svw}~~{xusmojghc`ceda^b^Z\VZZW[XXZVSSWj}yb]^Wa[W\G^\YXcTBFHDB;56585454447720140451343334537;<=A>@ENUXV[[YUZW_bF;89<<=9:9898:567679=<89<9?<><:@<=@>@?D765351/52/2.0.0..01-00/.-01/,./.+.-,--,+,.**--*-**&())'+*((-,+.5FBG?EFH@C@024>C>@E?D?89;<==7873287997652+.-.,+,,.*,,,+**(+,((()*'+,+**)(''&(&'(&)&('))*&))*.//22g{mgnkpkjgVNHVaopijijlkje_XKIPhngkidhliliib]]ewxqkdlvxaC90,)" ! !    !! !  ! ! !  $!"  !E;BBAA@A>?>C?:=@=>@ABAB@C@DEBA?AEE?D=<>>A@ABBB@@BA:@AC@B@A@AAAACBE<82-+/+,+,)(&"!!" !!!""" "!"""""" "###$#&&%"""   !!"! "" !! ""$'((().-*,+0.0..110.---+'((&)*)+++*+(,**+*++),++.,.+++*)0*-,,-,--.-,0/.,..0.,0/-//0.//.1/.301/10100142.21040120101..011100/.-..-000/-.00/103564255588999978;>89:<:>=CAEDAFDDDCDECCDAGCFIDIHHIIIKKKFHGDHEJGCECCBA>;9;789:7564311220335463364432221122/-0.-,.------..+,*,,++*+*)+++.-+-,**()(&')'('))''($('&)'(%%#%$&%&#&)'%&'*+,*.)-,/.2/48=9;:;8572*+-.,+,.-,,-----,/..+-.,-,.2241.302./6421/222412422440/3544<>:B@BDFLLNTV[\[\VWcty±u~~{yssqmjigaa_`\__\bc[Y\VZYWVQVUZn|_\_^`\][C\[]X`QEHIDIE;67643286665201114322128014.5:>=C>=KLQRVYX_YVX]cE@:988;;988::<8664765<7:>;>9>;9??=>A<@BCBLKJMPOS_bowxy{w}yx|}{|~}{{yyzwye<48322026101.5.///05//-./10.0,.-,-..-.',/-/)-),*++*/*()+((((*,-)7CCDBF@D>C?,45?B@E=?@@6;=>=;98;22429752/0.-,-+,-+),('+,++,('()(&%(*+.+'*'(%%&''('(&%&(*-*+-.,-1/1cnmlkigWOJXdpnnoilllheaXFI^nqtmljiihmhged`n~uogghqeM55,($"#!"  ! " !"""##""# "#"!""! #!"!J>CA@A??A>CF??DBBD@BBACB>>?>=@?>=>?>AA=A@>>B?A@B>==<=AA@@??A@DACE?GDGB?;?@ADABC>CAACA=B??@B>@A@BA@>ADDECGF?31/--*,-),()"" ! " #!!!!!"$!"#"#"#"#"#$&"$%&&%%$$&(%%'$%%"!!!    !! !!""#$'(*).,-0.,+0/.0140+-+*'($')&+-,*).*/0++*+++.,-.-,,0.-+-,,++,.--,//-0-/+.-/.///0-11011.0--21211022202.11/2310102200.3/310--+,./,0.,----,1/514257985958;587:;;;=<<;;?ACBDAAC>@>BECAEAAEFFFAGBECEHFECEIFKIKHIMGFGEFDEGHFDA?>;9=8;5965463323013255535211332.03..0/-.-.-,-+1--/,---+-*++*)++++.+,,,+,*&&'&)'*(()((+%($%$%#%$%'$'%'&&)'&&(()&*((+-,00147<;<9:933/+-,-.+,*,.*)+,,.+/,*++.+./.14412204/31131.1/044343240225247;=;B@BFLPPSS]]ZXYXclrzzw~zutroligeebca_`]ab\XZZ\]YYUSRVj}za_\X[]Y[EX]X\cVFFKFJGA69865422460442.41655413451459>DDCFLOUUWXZ[ZZa`bD;;<<=8887=<9?>8:767;;<;=;@7>67:;:?==D?D=103=@>G@?@=:;7:=9::>3345365411-,-./(*+()),))*,+)*,(**)()+,*('&&%)'&'($&''+&)))**-,-532e~~molkfi^_nmlhnjhfghk]LJL\nqkgkjljimlkc__r{uhidiqycS=.0'%%$!! " !   "!!"!""!!" "! ! " # !  GDC@?@?>BAAC@DFCDCA@GB=D?@>>??<@=B:AAA>D@@>BAC?A;=C?DBCB@@ABDC@DBD@@@@?@@C@EA>B?FD>?AA@@?21..-*+*),)*"!  ! #!!#""$#"""!!&%"$##%&#$$&&')&(&(&'&''()%'&&"!!    " !! "!%!"#$'')*--1.-/0/133.++*+)'((*)+,(+,+*+*+.***-+*0.+--./-----1.-/-.-/-.,.0-0./0.40,...///0/1./.21./30002/341101342,1..+3-200/.-+,1.03..0-,.545154615:579::586:9:;;<<<:??@AABBA=AAECECDBCEAAEDEEFAECGJGIMOMSWRQPIIMIJEJGJCBAB==<;994:74343211.11025528423132./330..0.-/,,+*-0-.,.,+*/,**+'*,,,,.--+,*)*'''')&(''(%'$&&$$$%$%$&%('%%')&&'))('()+),-.104:9<;:7<95;;5>;78478;9<9<>A=;;:=>>;:==>>EIJMHMMS[epxv|zxz|~}~~~~{yz||}|i<35755138.02311../15/00-01/+--+0./+.,-2--+--,*+,-))(+**+(*()+,,)7CECGE>>@B=.10=D?CBDB7987<:;:88655-4446//0.+/)+)-,))+)*'*(*&')*(-(*(++*$)&&('&'(%('))(++))(*+.025e}plnknvukhihiehijeZMKSbroijdkjipihga\gznkigjzzpi^C.*,&""""   # !" !#!" !! " C>@B@CAA?@@C@BFDFDGFEB>?<=@A@?>??;@>=>A=B;@DB?AA>@?@B@DFEB>?B@@DBFHC@AE=@?BD?BBBAADCCJBF=71.+,-)*())'"!!  !" !$!! !!##$!#$"$$$#$'%'''%(&(&&&&((%(*))&&#!     ! ! " #$&'***+0.+./-.44-.)+()(&%)*++(*()+*+,.,--..+.,./.0.+-0-..,-/.1,.-,../-0/1..2-////-0--.////0.1/3201/00./2332/2-200/6.3001-/*)--221///../153962276689:7<:;::;<:;=<9@>??BAEDBCCDDEEFA@DDEFCGDFCFGGGDGMNNSRQTLNOKKPIKJDIBB??:>><:7661254322210345414411/2/00////.,./0,.+,+---+,+()),)*-+*,+,+.,0/,-*+'&&'(&(&'(%&#)&%%%%$'&%'$#%%$%&%)*('')),+,-.1.28<:<89631,)-.*0/0)+,,(,/,/,---1*,,,/.050/,-/1/11222110151322111044587;?<:@GGOIUWVZ]_T^`jtw|ôۮ|zxqqnfeebca_bcYaa_^\XTWX[XTWl~x}`^^\Z[ZYGU\[_bXADGEHHK<5860532336/212143043-/56226A=@?CFIOSRXWV[VWS`aJ>?>;>;;8=;98;;96264:<@;C==;@=<9>>==???DIKGKOQNT[alux|}|{}{}}{}|}yz}y}|we=55543//8301/501//,./20//0-.,-+-).-,.*/)/.+.,**+*,'%&*)((-+,(,.)7DED>A??B?>.11>@@@BB;B?AC@>=>A;?<>??@>;@?@@FDAC?@D?BBABA@B@=>B@A??DA@DDAE;DD?@?>BB@CBA@A@>HFFC81--.**)*))%"  !"   !!" #!##"$$$#&#&%!&&&'''&'%'%')(()*)&*'')%#!    " "#%%$((+-,,-.--21+,,)''&'',***)***-,+*+*+--*,-,)-.,/..-./--0,0/--.-/001-//1-3//0-/.02/40111/201.01211343112323434././.3/0--..-0.,,,,.-1./121133933987583998;<<;>=<=?BBC@ABCDCABDCB9;732,*,--+.,++**++/+-+0,-,+,*,1/240//104432/103061411502205644499;@>BHGNNMYX\]WU[bpwwõ}xtqojchb`beac[`^[\]YYZ`VURZk}bV\_[Y\]NXZ]]a\JDEDDHHB497278434942320443540334466:=@CDFIURTVZ\_YWS^_G:@:<889=>A@;<BDGB3-2=C;?89A;;::>;@;:<;4=663000.2.,,,-*+,*.***((&)(((*,')())))'&()%&()('&('%&-)-**-/.116b}tjiojjjhkjge^SHL\hpnkgnjlifif`bds|nkghnu|zum_LF7-(&$$"#!!    !!!!  BBDB>B?@@?C@B@BFAH?FD@BAAC@B??==A@@A>@@>B@;>?@AB>@A=@>CAEB@AABDA@CABEFC;?;@@DC?CBGCCA@?C@CB@>AAAA86-..-.+-++&$  ! " !!" "#!####$#$$#%%%%(%%(&)%'*))((,&,())))'&! ! "   !!#"!!!"#'(*-*+,.,,10-+(*&(('')*+-)**+**++,*+-*,/)/,/-,..,,,.,,/.,*,./...//-02////01./../,2024300/2/33/01/411/022113/0./3.2-/---,./,,,+--,0-00333456669669:74:5<<>:=?<<9=BFFCGBCD@BBCFBD@EGDDEFEFFFGIHJINNTTRSQPRRONNDIHC@?<>:;=8;766614.33235/580211.31300/1-1/,..+-,,,--,+--,.,,1*+**'*)**(,*-1,-+,*(&&%&%('''&(&%#%%&(%&%%%#$%%$&&&%#&'%(')*(*-.17:==<98723,**---+,,*(),+(++.+--,*-+-0,44////-213//2/.0//./.221./222577<:<86?:98=9;;96;5::89=@<=>:<9:;;?98:A@BONJHPKU]_lstyx|}}yy}~x|y{{}y{}zy`=4851420122./1/2./01/0,1../-,,..0.....0.-.-*.*++*)))''++(%+++1+(2@CADD>@E?D2.4BB?B@AAD@ACFD@D@CECCA?F>?@>B=@A?AABA@@BCA@?@@?@?@=@EBCDACD?B@@??=AD>>>@A@@EBECECDCA>DC@BA@>?BC@ABBCCCDD=80--+-,+))'&!  !  ! ! !!###%$#$###%$%%%&'$((&'*).*))*++++*(""     !! !!! $$!(++,-./.100-*)(&')*)('**(),,*,--,,--./-.0./,,01./..0../.-../,-//1-100.3.-0./.100111-12/04.121010063423262,2..1,2.1+*.---/./.0,.4231310256747697683:9;@:<8<8>:BCE>BA>FAC@B@@CCBEEGFEEIEDCDIKKLLMNOMPMMLMIGDD??><:;:86746633/230/1-422441.5.10/-0,//.-----,-,,.-.-,,.++(+,-*+(*+)+.--,,,+)())''*%'''$&&&($(%%%%$%$%$%%''%%%&&)&'*(**+//146?<;7<813-),,.,*,,(*(),'-..,--,+-..0022.0/122/2.1-10/33-/.11101112776<98=:5987<;5:=>B<;>;>??FDAJJMILPS]anuy|w|zxx}{zz}||{wv||a;485151/1120/4.-,/11-1,//.+++,,//-/,+/+-+)-,+)(,)('))((&)(*'+.,)6BEGFB>G>AD013:B8777<=>;>6;8544360300/)-*+,++,-)-*()()')(%++(*)))&&*+)%'&%$(('&(*+*,1--.+/01_{}~tljhidiaWMLTjjklilklihkkc_\g~~rimgmt|xvpaSG:FBH:,*(#$!# !    ""$&"%   !!    >ACBCAC@?A?AACEBCBDBCCB@?>B=@?A?@E@AB@BA@CCADFB?B@A@A@@?DDB@@?B??B=D>BEFBD@GEAC?@@DBCC?BCFHGJE<:00/-//,+*((   " !! # !!!#$%%%#"$!#$$&&'''&(''+*)'+*),*,-+*,'%!!    " !"!#!""&&))*,*0.16/-0*('&(''(*(,*-)+*-..-,+,-/0,+,///,.-..,1/../0/0...211,11213/1010431543301034424.0413/3024125021.-//1-.,./.-.../-..-1125233357887887774799;;<8;:=9@A>B@AAC>:B<@B@D?AACCEEDECDHIIIGGJEGKJMJKJHMHECCE>@=><<>86736547133013252633/00422.0-,--,+,+-..*.-,-.,-+++**(,))*+((++-+,-0,))*+*(()&&&(&'&&'"'%%%'%'(&&$#&$'%&#$&)'''***0-266A:?:>>;90*-.+,))-+-**,*--,,/*,.,,//2///.0/111122./1-/,.0..00/1133397<;CFEHJKQVX[YV[`UPh~yƺҳ{{uqnjf_adda`_\`_]^]\]ZRSTk||^\^YZZ[WF]\\ZfYGKECGEGGB97044136612410573131046232?@??@FGNRUZZ][\UU\`E<=<<;:89989;:;;7988;>>9=><><;7<<;=?>;ABAIJFJLPP^ajrzzz|u~xyzz}~{z~|yyzy|a=686351-211-.0210/00-/,*02./,,.**,,++-**)+).*+')()*+*''*+)))+-),3EA?E?BE>DABF@<@?AA@D=?BDH@BAACECCBDCAAAC;A??B=F?CHEEBEABDC@C?ACD@@CCECFIDA:2-.+*-+*+()   !  "" "!"%#$###"! ##$$%(((*,'),)))+)*),,-/.++&## ! " " !!!"""$$%')*).//2.)'('%$#!&%*)&()+***+,)+*+*,.*++).-+,-..-/-,.,.,-.0,--0/--2-03411/2040/4/221440/04142318388744403103.02/2.-*-,+-/-/-.33244222146988:868988:<8;89;=<>>=?DA>>=B>@@ABD@@CEEB?AFBECFMDGEKHELJLEIGEGFEBEE?E=@<;>?99/)0**/+)*()-*,**+,(+-..*//,/20../01/010//--/..1101///233359:;:@DFHMNO[UVXRXZSQjxzƾЗ{ywqnjmfcge_c\\[\^`\\]\VSXjgZ_b_Z][E]XZXaZIJDEMFGJE=956122660133/332240083225:?>A?ELTXUXXY[[[Zb_J::>89:6:;<;=;878<:=9=;<=8<=>??@AKLLPLMNW\bmvxw{{z|y{vx~yry|yxzyxbB194/51.3010-2/0-00/0,.-0-*-/..)...+,+),)'()))))+(,+()%'+)'*(.*..D>@DCA@>BA.)09DF@>9@:79>>7;<99288524553./2.-+--+,,-+*)+))'&(('&*),*+'',*%)'(&&%'((&))*,*+,,-.108\z}}~vipkhj^bpqnemkijnnif_`ew{wqjejt~~vmhVIENV]sv}mI2($#!"  ! ##!#  ""# ## ! !>D>BC??@BBCDBDDED?HA@@E>C@@@?A=::?BCE?@??@@ADA?A?BA:D@ACBECA>CC?BABBCC?@AAADA?>DBDEBDBF?AFF86,-+-,+)*)&"     !!!! "! !"!!##$$#"#$$%$(()(*(',+)+))+,,.-.,,--(%$    ! "!! !"$'*+-.22+*+'$"!! #!'$&()'+**+())+,++**+.*,.(-+,,++,+,--,-,.,,*+--0--,,/.-..*2+//,--.+/3.22.100+1/2321/412003-.1,,/-+-,.*)//+011254153288;9;7856789<9;<799=?@DCABA?AABED@CBDAGBCEBEFBHGKHFGECCBDBA>@<99:5543434431121/1.0.2-/2.,.+.,*,++,,-*,*,+*,++**),*)++*+'*',+)))+,+*)++**,)(*)()('(%&'%&'$$##%&$%"#%"#'$&(()%(*+/,.68<:=8@C;;/*.-+/,)*(*(**+*+)**-,,,,/-01/.+-.-21010/-/-./0-20./0/125678:=BBFIOPQZYVVTZWOLmy{}žݽ|zyoqnogfjg^cY\_]b]`\\_OSWnz}{_]b_]Z\[G^W[Zg`GMKGGCEGDA853/4243/4/1332255/.652228?8ABEKPSVW]Z[XXT^_G;;<:9=9;86<7::9;69;:9:>:;=;:986;<<:>>A@HHFKILJTYaovyx}~~}|zzy{v~|yzywyvwa736302.1421/,20..-/.,.-*.-*/-*.-*).**+),,+-(+(+)+)(&')'(*+***/))*C@ABA@@ABA1.5=D??=9<7868;9:79=127643102+/-.*+++,*))+*+)(()((&'('*()+)*&%%&&)&%$&''''*,-,1-*/.-06\u|}~~ugjdktvniiglgjlggh^djyvsidhiv{vrl]OMIO\kyPD4&"#" "! !! "" "" BFABACABAC@DDGBDECBABFB@??A=@A>??>>>BBA>@ACA@>B?AC?AAABDCAD@CDDBACBABF@C>AA?DAEADDCEAGAADCDCABEEDDCDBCEDFC;52//.-.,)(()!    !!""#""$#"'&')))(++(,*)*(+-*,,,+*+,,,+'$ ! ! " # "#!%$&*..01/+)(!$ "% $$$'('*&'((*))(*.),+0+,0-*-+++,.+*,,,-.,,---0.-/0.0020/-//100/./2/0-.0-1/211104/10/422.04/000.-+*.-+*,.-/.0142257459:58;69673::97<=9::;6=B???>=@=A8?>?>AAA@@ACDAE@?>??>==;:633446351010/02.-00//.+--+.--,+--,+*+-+)*,+-+++,,),+)'+,*++(+-*,+*)),*,(((()))&'%&&&%$$!$$#$%&##&&$)%')&'')*+-,176<<<>FBKOMVWXVTU_WRNhyz{Ϟ~unpmiilllif]_`]`Ya\ZZTWWo~u^d\]]XZ[G[WXYkX9B@FE=C;@@955443424220.470422036045;A=B?EJNRWVZUYZ]S]dE>?;<<;56:38:>;<4768:78;===;=:<8=<>@==B?KIGILKMS[chtz{zxx{zzzywzxyzwxzvsxc=44343/32.0.,5/---0/,,,+6.,.-,/,*+-+*.**)+*((*(''*(+))'*&&+'',-*5?B>CC@?AAA3/09E=??9;:7;8<:<9791-8623223)0++*.(),*+)*+-)*'*&,((('(()+*+(%''''%((&&$)((*)*,0/-0.31`x~}ufhfhffijjfmhngf\bmssffdrzz}zndXPIFR]v|V<.*&$!#"! !"" $! ##!!!"% GC@B@?@BDBBBEDEEDGFBDI@BCDC@BA?>A?@@BBA@AAB>A?B@?A>@?>@?DBFDC@B?@D>B?DCEBEAB>AFDCA=4/--/+*++*))""   ! !!#"" ! !!!"!#""$#%$'')))&)(*,.,,*+-./-,-+-+,*'" ! !!! $!!""%'+*33/-+**(,(**,-,-+,,.+,.*-,+-,,++,,+),**++*+,'++*(+(,(,+*),))+'**+**)++.-,+-.-,-0//2-..1../-/,1./021//21421-,,-.,*.-.)103233645475988;5::887:;::<::7:9>;E>=C>=>9@9;A>??B>=;;::56523020220/110/0.*.--/,/*++---++-,+.,),++-+,/--,+,(*'&)(**,+**++)++*),)*+)))))*&'%#%($%$##$$%$$#$%%$&%%&(&$+*,.++49<;@;IGB=5,/+-)+*)))+,,.+,,.,*,-/0/11.*/000/010-03/+/01/011//0//234779:86:8/4013321-021401122.233449?A=ADJVUWZZT][[Wc]F;>?;;=78998;<977778;;;9<9?:?;<@<56:8:;;463/9416543+//,-.+'-+(*+)+,)(*)*('&*)++,*)()(()&'$%&&(+,)'*+-,++/1;1Yz~|~}~wfjjfcigglejf^Ydt~smdjgt}{{xvk`TMINWo{kY4-(%##"    #  "!"JDDDB@BABCCDGBCCBBCADE>DBBBEAB<<@=@CCA@D@CC@?AC@@?ABB@BADCDGDDCE@ABAIDEBD=AA>?CFCCCBBAB>BBADA@A?CC>CDEEFHC?62../+(*,)*&    !  ! #"#"!!"!" !!!"!#"!#"%#$)$%((&')))(*+++,.-)-..-,-)&%# !" " !"""%##"'*111/*,*)---.0/233146557347965645655463693476274335133323450.1.2.0-/..+0,,,*+,+*,()*(,+,-+++()++*-,++,/0010.,---+-/,0+/200233447<75768:257579:987864;:>:@><>=<<<<===;>==?CA@?BA?BBFB?D@@EEDDGGCHABEE@A@;><<=;9;545543/01.12/20.,/++-,++-.+,--+,--...+,,-****-,-++++))'()((+-+'**)*+('*(*)**&'&'$&&$##&$'#$$%&'%'%%&$$$&%%'%&*)*,,/637A<9IHC>:/*+*,*())+))++,+-1-***+1.10+-/12//0/0,10+.//.-/0/.../1373:<<>BEDIKRWZWSWdlUQPd~}´Ü{wuunqnlihhhdga``ba^^[UUWm|z}]]`^\[\]G^Z[Vh[A9<9;:99:;;42434542121244/1323033239?AB?GFOTUU^[ZYXW`dJ;=?;=<=;;:77999:78589=:>?>?==9:779:8:582/6703316..++-,.),**,(+('-)'(&(&'+)'(*)'(%%'&)%#&&)'*++*+,*)',,.1/]ty|}|~~~~vidhgmiklda^Ze|}uni`bj{}sqgWNHMWa{xka^D3+'$###!  "&!#   CCCBE@AB@D@DFADCDFEDCBDA?C@AAC=>=A?CA@@BCBDCACD=CB=>?ABAEJCG?BD?@DDDECGDC?@=:BAA@AABCBD@BADBB=B?@EACECFEF@=66/,-/**+(*$!   !"!!!!#%$!!#!!"#""#!$"%#"&#&%''&'&'&')((**+,+*-,-+)+))&%$  ! ! !!   !"""$%''),.+-)-,+-/0.30213447568558:7889;7769898;;=6;7<=;==959:978;:==8:8;9996<9<7;969997969576585977652323/0,10//0*+-,+*--*../0//20256429775786:556866866457;;>A?;?===8;;=;<=9?B?;>C@@ABADCCEGBBEB?DC?BAAAB?>B=:<;<8886524512120./////-/--.+,+,,-,-.0.,--+.-+,,-,----0*,*+(*'((('*(****))(''+)*('''%&)$'%&$$&$%%$#%%&$$&$%$%$&%%(&#')+))-058=>:DI@@7,+,**)('),()+++,,,--',,,.12)-,-.00/0.,-2,02.--/0-.-0122157=;=<=?BA=><@CDJOMHFQY`lxyz{yz||{x{y{{xyzwxwyvb=13364..4-..+,,-+.....**-,,,(***'*')'***+-*,.,()'+((*)*('+)&**+'1AACAD?>>@@1..7BA@>:>=687668758334835201-.+(+()(*+(-(-+%-('((&''+*)*,()'&&(%*$$''&'')*+++-*)+)10,X~u{~}{}~~}|zhfgbmcb]X]n{~tmdcglyy}vn\TNJOXm{sjaUQ;3($$$ !"  !!#!!!!" " DADBD@BAEEFEBCDBCGADDDDCCEA@AAAABEAFBCA@DBAACBB>BCEFCDC@AIACADGFBECC?AAA?BA@BFAGBCA@AB?A?A>@@C@FBDEJC@43/0-..+)*)&#!! $ "!""!%$ "!!#"$"!"!"%#$#$#$&$'$&%$&"$%"$%$&+)*()+**++),)+*%&!  $! #!" !"$#$"%$'',34-,,+,)+//023374654578966898:;<8;998;<<:=9<==>8<=9?:=;8<9::><=;=;<=<<=>8334.10/,,,+,+**,,.0./12/3325479879;;85677;5:;8:;8:<=>=@>9;;;;:<;:;?:DFD>AA??BC>ECAC?DBC@C?A>CEBA;=;:98:583333-011-2//0.--++-(,+-/./.,./0-,+*-.*-)/+*,,+.*+,+))('(('+)'))***()')%'&'(&$&%$&#%&''$&%"#"$%$##$#%%$&$%(''(')-+./889?:CH>A5*+**-)()*-*,+,+,*-+.).-,.4+*--1,.1-0,.,-+/-.,,.--/.-1112549<7;;9<897:68:6898=;<8<=@=88989==<==;@GGJLOGJU]citu{uuxzyy{zxxyyyvz|vwx[8363,2//310/,,+--*,/-,*,,+(-(.')')(,*),+-))(*-*((*)'%&'(',)&(*++1ECABDD?A@?0+1:C>@D@D>A?HDF?AD?F?FDBFEIFHB@B?@?BAA@BABBCAEADCA@D?BACBFDBDGE<61-/,,+,()(%$"   "" ! !"!! ! """ !""""""!%%%$#&#%$$&%%%%%%#$"$%#$%%((')))*+),+*+)$"# !  ! "!  " ##$##"%$$$%'&)-11--*,,)-./1335058564886:8:89:79:=::9<8>::::;9;;8=:>:?;>?>==??>?><>A?C@AA=?B@A<@>@?@B??=6:5/14//,,+.*..-/1-/./1223485:=7<:979::847::866688=9A?A@<=::<<=:<:;=>>=@>?=A@AAACBCAB?@CADBAA@<>>>@=;;;89859434400.3-0.//,//++-+,,-+-//+2-,/-,,+.-.+*--,,+-,*/*(')')***))+),-*))('')''&)%&'%&$&&'%%$$#$"$$%"""$$#$%#'%'''(-)-/05:><:CC:?3+-+/+)()(+,,,*,-,,***+.-00,,.,.-+11-0-0*--./.,.,-,+110544:<@AEEGLUTUWQWiSQRdx}ŷȪ{ywxuspokglihcdfe\e^`b\ZTVm{{|c_Z[_[[YM[[ZZgM8EBGD?@>@<54121.23232330202/-1312308A@?BFNKVUYVZZ[VTcbF@=:=;;;889889<68655>:===798::?;;>@AADEOIJLMV\blutxxxxwxwyy||y|z{zxuww\7243111+52..//.-..,.-+/,-+-),,&*'*,+,,-+.+,.)**(''&&'*)((-')%(&)-B>ADD??A?B2/1:@B@@>?9;47878986415:23310./-*.)))('(&*()''('+*'(')+()++'&($''&(!&'*''(),))/*+,,,21Z{z}{}~}}~{jjZYZbx|xpmdfps|yuncZKLOYn~{tqqnldaWN7-'%'""   FBCAA@CBBDEDECCFBCFBCC@@A?C@??@@?FCCAD=AD>AF@@CACEAA>D?DCGG@@>BBD@@FGIEDA?@A@CAABA>CFBAD@?FAAC@ACBFCGECGHI:8-0,..-+)**&#! ! "! """" !" ""#""#'"#$""#"""###$$'%%%$&$%&&&$$%$&$%%&&&&&&&&$(%')'))&%$!!!  ! ! !! !" ""%#"%%&&+..00.+-,./.18655355738498;9:8::=:;=:98<;8::7;::?<@<<><:A><;B<@@;=>==>=>@;?>?A>@B>?;A?A???ACA@@?BB@?=>?488:=96:<765:9??>>==999<@:;;D:><;?@?@>:>==;;>>IIKGJIOPSfotwvxvvxyyx}zzzxyx{uzxw_928313/+311/---,,-/-,+*),)+'-+')(*(-+),./+)),-))+(''%*$&()''()+),A@A>C==B=?9,58?>>?9<>7887577<;523551342*,0),-&)'&('(*%%*(%,&&(&))'))&'&($$&%&#(&&(&))*)(-.+/002.\wz|~{}}|||~|~|][\j|vqhcbhr}{yti[QGLT^vyyunnkb^YVO56-'(#! !CCEDBGCAGGGFBCCCBDF@CDH?;@E@C=>>>A?BAB?BFCEAB?CBCDD@?@ADADCADEFFED@CGDIDB@@>?DBBDCD@DBBBBAHCCABDCBCCEDEKJIA7/0-,,-+)'($"   #!"#!""!"!!#!""&##$&$'&%$#"%#""#%&'(&'%&(&&'$$'&&%%&&''''%$$&%%'&'&%'(('#   !$!!#"!"!$""&"%&%''+-/0-,-,+-.375566659467989;6<8::=:;:79::<:<<:<:<98?<<=;=>79@;<=>;=??B>@B?@??=CABCBBA?BCCEB>>7632210.-...,-+1111.2/3246589>9=>>>;988569689878589<:AAA?;;:;9>:=>@;;;==>@?;@C>@DGCFEBC@?CAE@C??=?=>=9:88826;11/30.1/0/,++*+)-++*+*+*++-.-./-/---,-.+.+,*,+,,*)))')*('')(*(*'*(('''('&&)&%%&%$%%$##&#$%$$%%%#$$%""&#%%&$(+())).48<=89@:74,++*(+**,,).+,**))),+///,.-/+///.01.-0,,--,+,--.-00./2754;:@@DGMWUQTLPkRPNczzĹⰥ~}|pvuqiklmkheccfcb]`_YSRVj~|wwa]\[ZXY[AWWXTdN06998>B;463122/235240002403./3151-4=@BBCGMVOSWYY[\[VccE??<<:=;986<;==:75666<:8=:@8<:66;;=<:;;BGIMJIKNPTanrxuvx|xwwxyy}|yusrrusv^:43/320.///**-.,/,.+*.,--+.'+*,.),**+,*+*,)+,,''*&'(*)&&&((&(())-BBBAC?9@=A4+1:=>=>;;:67787878:54232452200.++.&')''()+('&)%(&(&%)''*)()*+&'''&%$''*&))&&'(++,.24/[}e{|}}|~}~||}~vybsqogeeiw}zxwmg\RIJXjzrrqji`bVMC>7/+(&&'#!  DABCCBCEEDDFCBDCC@DBBBC@@BA>A@>AB?CC?@BDGDCB?=BC?BC@AC?FDEDECC?D?FDDIEFCCEBADDABBDFFFACBCEEEG@ABEBEEDFEJKF>71//,,++***%%!     !#$##!###$"#$!! "$#$&$%&#$$#&%$((&'&)()('(&&''((**)))*)'&&%%)%%''%&'%'%&"!  !  ! !" " " "!""##&$$##$%'**.0-+,-,-.112253864655877:=:98:8;9<;<99;:;=<78<;<=<>==:::=:>=>=?:A@:@??@??>?@@A@>?<@;A@@=A@C@C??EA?=9:602//-/-,.-+--,,113122268;=@?==:878888758657<>??8??>?>B?>BC?DBBE=BBB?@C?A>@?:<:999944633041/1,,..,-++))(+**),)()()+,.-/-+,+-1++,,-*)+(**(&'(((((**'.)()('&'(&(%&+%&%%&$%$##$$%&#"#$'%%%$&!&%$%$''(+*-+(/45=8:>@864,,,,*)(++*)***,+++*++----,*.*0./////+/-,-*0*..--//,/14744<>?@GPTSWVX[ZWXbaF=::<;;>998;9?=99568:=:<>=>8;7;6<><>A>BDJJHJKLNTWbivxwwwwzvvwwwztvywxxzxvX<45451110,1--,./-.,.())/.(,-/,+.+-*,++,+,**((0&'+((()'%)&*(*)*((-=A=A>C7..;?@=?7=6785989<97767752-1/.,0))*)-*(''*((&&'&&)&%%))()(,((('&%'''&&(%&**&(+*,)0/4./Y~xy~||{~y}{|z~}}~~xpl{yppbgekx~~yum\VMNOaqvrrpkfb_QPE?930.(&%!#! !DDGCFC?DFDCHCDGECDDFB?@AB@FA?A>ACBBAACDBCAD>BABAA?ACB>BBBCCBCD@GAFDCCCEBC@BB@=BCCFDGDDGBCCACD@DADACEHEFHDM?62--,*,,++)&$  !  ! ! !#!#""#"%%&%#"$$%#'&%%&$)$$$'&&'$'())*)'()*%((***(-,+*,))*%'((&$%&$''&(%"!   ! ! !!"!"!"""#$$%$$#$$%%(+00.++,)--142175566986887:7;8;>:?===<<;;>;9<::8<>>=>>=?>>>:?==?:=BAAA<@@AA>?ABB@@??A=BCAADAE?@BABB?=7474155..,+*,+,../32515578<><=?@?=<8<<7899897864759;;?=;:=::89;:;?@>==<;;@9AA>A@CBBB@@C@DCA>?@BA>@?>=<9775513441001101/,.1+++)++*,(+++')*)+)+-,++,-*)+*-,.,++*+(''*(('))(&**((&)%&%&)'"&&%&&&#&$%#'#$%#$#$$%##$"##$'.$&%%*(,,).4:<><:9172+/-)())'*+,())*))))*,-'*)*).,,,.1,-/.,-+,/+-.++,--,/0/355;9AAEKVVRWRTmiRQO]z~Ǻ¨~~zxwrmrkljhgedfcd_`]\TVTm}z{{^ZYW[[XZFZYXUfJ/5923120232033.5331./.1/52,00.23/23:?=A?FNOVXX[[]]XZb]>;??<@:8:7;8?9::99499;<<:=;;9799<;?>>@A?FFGHLHMX]eetwvxyw|y~w|{yvyzvwxzxwY<<22201,.,,-/--./---*)*--+-***)-,.--+*,,-+-)+.'(()(')*''%)))(-)*.@==>A>?<@?5,+;;=??9:688:73783:53584532/1+.,,,'*))('(&''&&'(&&%)*&&))-&&)&'&'&(#%&%())(*)+,*./1/0U{s{~}xy{|}}z|}}z~}vtisw~zndcedp~}xyspbSTHPUk{}zuqpped_YQMA?764/,*%%#!#  !   EEGBCCABCEDFCDCBCDDBF>BCC>A@>CABABBCECB@>BC@@?@FB?@DC@ABJDDCECECBCFFBHGFBDBAE@@E@DDBECBDCEDDCDDCDCCEBGBGFE>92..,+****)'#""!   !!!! "!! "#!$"%%&'$##$%$#%$''&%$'%&'%&%'&(+)&'*&)'())*,)+*+)),(*)))%&&&+'(,)'$ ! !! # ! ! #""""#!$$$$"&$%'&(',/1.*(,+-+/41576676;879787;<:9:9<;9;;9;798<<;;;==>?AA?9;?>;>=:AAA?B=F<<>CA@?>CDA?@@BC>??ADDBAA@:762003-.+---,.--/2144786989<=?@@?;98;:;88:87973668?=;=8:8:;799::==;:>;=>?;>=;<=>CABD=>;>BB>;D@>??9;:7<87:734222122.--/-,/-+-+*****+**(())++,,,*-+,&,*+,,+*+)()*('&('(*(%(((*(('(&&$&(#((%'$'%'&&%#%$($$%#$##$$%$$%$&%(&&'((+(,/87;<8965-+(()('(&()(,*')(')*(,*+*+**/.,---+*-.(+(*++),,-*,,/-/1288;>B>DHRUMWP[sjTPSZu}úҧz~ttwpnrlihfeecbab]]\[TSQj{|yy^XWVWV\TIXWXTbJ28831230473332/.3211100152111043/12:==AEIHRYV[^W\ZWVb\B;?=?@?9:4:688;8488999:;>9<:98;;<;=;@==AGDLJLHMP]cgvvyyyvwvuwyuzxvuyyzxvvU64622.2.1,+,-,.,-),/-,,)*,+-+/+,'+*),),--.+.1-**('(#%*(&'&+&'(()->@@@B=><<@2**;>:=;;=:45927:97650554253-3.++*,**'%((&%(('#$""$#$''&,()&(*'&''%*$$'%('(()--),+/-1.Nzvulj{y{{|}|~{{|toov}|{wmhbcgs}xuo\WKKR`r~vrqnleeXUND=>982373-*%!" !"  ! DDFFBEBDACCEAEACC@?@A?AC><>@=B@DDB?B@@CC?@C@EDCB?BD@BEDDDGBCBBABCA?@DBBDGDBDDEDB?@AABAB@BDGEJD<6/-,/++*+*''""!   !   ! ! !  ! !!$!"#%!$%$%%%&&&'#$%%&$#$$%%&$'&''&&&&'((()*)**)*)+*+,)))'&$(,++%!  !!   !# !$" $!"##)&%$&%%%(%&+-3--,,,+-.332343677<9<7;9799;:<:=;>97::9;<<=>;<<;:@;><<>=<<:?<>@<<;A<===;>>;??>?B@CB@@=BCC@AB??::653/4/0.-1,+-,./213588897=;=<?@<===>;;;9898487;9;;;88369997:78877=:;<<999<9=<=?@@?BB>;<;;87;564155220/-..-..,-++**+)*)*+))()('+*,--++****)).*+*+0)*)%)'(*)'&('+)&'(%&%(&#$&%'&&'"(%$##%&&"##%$$#""%####$$$"%%'*))*)+16:<47700.*),)')'(%*'))(*('('%*(**(*)(**,,+-(),***)(.)*())(++,-0268HHQTVZZYYUVSc^H;<@=88::6::<:::7655:=<>;8:=76:69<=><:>CHGIFLKKQ\agqtyx{xywxwxuxwwuurwwvuZ6333000--,-(-*+)+*-/,*+,-+)+++**)*+).+)+++**+,)()(*&''&&&'(&()'&);:<@@B?><=9*-8><=;6:6555264978204:3251+/,/)(+'+(&%'&&%'&$%#$"$$)'&***('&)&$(&%(''$(&&'+)*++-0,-0O|ukTdy}}~|~z{xokjx~vrj`cco{vsukdUTHMPk}xttunlccWPD><55644414.()%$" !  ! FCCCFBFKAFDDCIGCFDIHCAABC?AA@@B?A?=?DC@DAAA@@CBCAABBDB?@FECDDCEAGB@BBFBDAAADEBACBDECHECEDBDBBBBFBHEBAGDHGC=64..*-*+*+'&## !!   !" !! ! !! ""#!!!! !"$%!%$$%#$##&$')&'$$&%'%&%$$%&&%''(&&'%&(&('*&&&)'&)'(''%&()++,'!"  $ ! ! !! " ##"#"%%%%'#%$&%&*-0-+-*-*,11344656577787969766;<9:8<:<8;8;<;<<=<=@;><;=<==A=A@><@?@A?>>C@==>?<@BAA=A=A>A=::98866578::;=6917658<;77:;869:799<;??<>?9;=A<8;97966538512/4/.0-/1*-..)*,+*)(,)))))*.-)-,-.*)))+),+-*+,)*)$*&(''))*)+*+')('%&%%%%($%%'''%'%#%%$%#$%!$$##%"#$$%"$&%'&()'((,23;;:;655-.+,,)),,,.**,*)+,.+,),)-(+*+,+0*0/-++,--,+-)-,--,-,1/2525:;?GKSNPUV`ktiUSQXou}Ĵ𷧣x~}|vssrmnjofhfcgb_abZ[YQRUk{{|\Z]ZYUWUDWXUVeG17634243032422-032/210020050.32141/8>=BDFJPRUX[ZZVYXc[B8;?<97;;5;::=?:9676:=;<<;9<4899;>==?=>AHJFIHILPY`lpvvxvx{{yyyvuxvtvtxwwuZ613610+.-,*(,+-(,.,--++,--(*('*)*-,(.+*++)+)++))(')((*'++)'''(''*<>A9=5,+5?9>:4=<4476658<64-160231/./,+,+*+('%(&''&($&#%"##%$))*+%**$%'%&'+$)')'%('),*+--,.-Mxuxnz~{{x|uohox}~~~upgf`krzwuha[LJU^r|yuojld`[PKC9:59511330/.)''#  !  ! ICBDHBHFDCCDFIDAECCHFBB??AA@@@BAE=C=??@@@<@??ABC?B?@AB=BCCCEDEBCCEDAEDAF@DAABCCBCDEDFCGDCCDCDA>E>DC@DEFIGH=31//,.+,+)+'&# !   !  "! "!!" """    !"!#!##%# !!!"  "" "$!"$#$$"$""$#$$$$&&&''(*+.-+'&&'()'''%((&'''%%%%&'()+*-&#" !! !  "#!!!#"!#&#$%%#%'%%$&(('+-/.--++*02227565778788787:8:786:;;=;<8=;:;9;=><>?9>9=<;<==><9<@@>?=@A?D@AC?E?ABA@DBBA=;455331./--+..0.1245668;=9;@?=>A?CD?>>;;>::8:;73366;;>?675856598;9;876::8<<;9;:=<==<>@A>?C?=@;A=:99967477551514/30/.0,/--,*+)(+))')')(*,+(,).+,.)'*+,'-,)+**,***,)(&-)))()(+(+*&&%&&$#%%$$$%&#%$$$$%####!$$"##"%""$#%%''')((()+52::9;947.-,.-++--,)+*+***+.--,-+.,+/--.3..-0,,,+,.0--./,+,..2133438>BGNSOOXXdhqiSROYpv|Ʋɨw~|}uprofkijffgceccc_ZYZRSQh}uz|\[XZYVUSIXXYYaF365222302/2004.33440+,0011--.0//3/1?57789<;:;;<8858==@=@<<@FJHIEIMUYcnswvxzxxtwwztwwstzvwvwr\934300-./.-*+-0+-,*-+.)+--+,+**+**..,+*).),+.+*'(')%%'(*&))(((*))>B?@4)(9C<><9;737766679440354321.*,),)*))*('*'')$)$%$$% $&&'+*,%*&'%%$##'$''''(%('.-+..-,/Lxt~y{|xyxklpz~zplc`akt~{w|l_\MRSUjzvvtmpk_bVLD@8;99366214,0,,+'"!"  !@DBFDEFDGGECEEGACADEB@>A>@>?>=;>;<8;?>?>=;=@A;A>?????@B@@CB>AA:>@@?B?ACABB?AAB?@6434032.0,,,..--102579;9?=ABADBDBDBB@E><;:7886524566::977663649<:59968;:9::;:;;;>>CA@=B<;:?;;8<8:97634404/1/2/.//0.+/+,*'())++**)*+*))(*/--,,+(**,+,+.,-,+*''()(,((''*)+'(&%%%&($%$#$&$$&%$%!"#$##&#"$"!#"##$"%$#&('())())438<9983300,+((*.*+,++,+-**,+,-/.,.0./--///-,,.,/-,,.,/.,,0/.2315888=ALPPPPUcgspoPMMQjw}Űئ{{z~}yxrrrlqlihgecdce__[][QTXlyxxZ[[YZYWWGWXYUaD24640200334023-4232.2-/101,100011.5:@?@>CLPRRUX[[[UX^_D?;==5;::6977==:=648::=::>;886:8<:=>:>>?AFEJKHIRTbjsvuwxyvzyxx||wvxyruxtx^8330//-,/,*0-+.(,++*',++0*--))+,)(+,-+-*-(.+,+*&*&)'''&((,&'((*+,:>9A@==>=>3.-5@::<488644567:464/5422021./-++*(((''%%)%%&#$$&$#'$((*(+&)%&&%%&&%'&%$&()++*,*,,/04Oxvzz{zohis~~|uogadaozz{usk\TMHUduyumskfec[RNDB9:575542-1-+**'(&&"! #$    ADDDECEA?DADBABDE?BDD@??@>>A=@@?B@DC?ABDC?AF@BC?@?EDABCCGBEDHGGABD?EHBGEDDCBABCBCDFFCEEFDFFGBFCDFBEHCDGILE>51.-,,+))*+&"  ! ! ! "! #!""$!""!$" ! !"!!!#""%!"#!!$$"!#"!!""#""#!#$#"$##"##$#$%&!###%&&'&(')*)*,----362/0-,*+*'*((()'&'%'(&%'(&+--+&%"  #! ! """"##"!#$%$&#%%$%$&%&&'+0/-,,+)--02251366877:8858897;>88:9<@=:<=9=8<;;==<;>;<;<>>=:>@=::?@>>@@>@A??@@A@@>@CCA?D@@CAD>E?<66321112-.++++--3144:;>:?BD@BIFCCFADBBA>9<7777445586<=:<6944757566::6887::::9::=;;::<=>=<>>=;:?@?;:<<6:846323300./../..,..-)--,)**+*')(*()**-,-+++-***(,,+,,,+))&()()')))+()&*&&%$'%#'$'$%($%%'&%#"!##$"#"$#$"!#$#"#%$'('*((**+/499776334.-.*)*+*+.--,,-,-+--./,..0-/2+,..///..0.*.,/-0/-0/002336:??CLNQNUXbbotjRKPQjx{İ䬞}zx|~{wqpnnljhigdbcaa`_Z\YSWXhw{w\WY[YXSUFVWZW`E06424131314/131425./2.00/1-0.01/2.2=9?DBDKOUYZYZWVSY]]@<<9==<=99:;9:8876788<<9;=;=99:8?>>?=?@DIFKELMOT[`kvwtywwvy|yzwzyyzzxyuxv]8/311/,.1/.0/+.,*,-.,-,*,++)-*)*(+())+***(+,).+''&(&&*&(*+(&))+'+@@A>?=?=?;3-.5B>:=568:78657627215603212/2.*-+*)*'%$$$#$"&$#%$%&&)()'*))$'&%%$%'(&%%&'(*)+***//15Q{uux{|iky|ysm`]dgs}ypseYRLQVarztknpjhb\UPF>89:8645110-+.*))+''"$$ !HCDF?@CC@CBCBBC@DB@?C>?AC?D@AA@A?@B>BABABA@BBB>BB@@B>DBBECFGDDDCBDCDGFBHGBFACACCDFDECFBDGEEFFCDCJDDDEEHJJG;701,+-(+*'($#!   $!"""#$$%$%#"#!"! !! !$!$ """!!!#$!&#$"% %##$$$%##$$#(#&$%%$$$%%&(()(()())'*,.,.-1996411,-*+)))((')((&(%%')*+..,'#! !   #!#"!""!"#&$$$&'%$'%&(%%&+//--,,*+,0-4663544::4:569897:>4;9;88=9<:5:9;=9>:<>===;<=;:;>>=:<<=>?=;A=>???@=A??A@?CCA@@ABA@A@=AAC77471122.,,+-,,./2698;AA?GFGIKEIIMHGAFC<=<:::765664879;98855586774676<;6;9::>;9==<==>=>=;<<::<;;=>=;;:766775124../1./-.*.*+)+)*+-***(+*)),*(+),)**)+**.+++-*,*')(&(&('())*$'''((%$%)"&%%"('$$&##%$##!$#"#"%%!'"$#"$$$$($%')(-*+.386666201-.+,,//-+/-,+,*.,+.+.-.-,0,-..-/0../,--.-1*2-//1/,2.45947>=IRMLNUa`agsjPOOPjuwî걟|z|ux}zzxsnokhjkihee`_ccb^]\SWWj}xw\VWYWXXSEVVWV`H.822301303.0/0.002002.00.001-023305;=@?CKKRTVWYZ[XVZ_YD=:;998969:88;;58494:<<;;=;B6=9:<=<;:>?ACHIGHLNPYblqwt|xxywyvwuyy}xxzxtuvZ713/11-.1-/-.+*,-*+.,,++,.+*+*****,))-(*,*+,.,((((''((&)'&&%'((#(<9=<;><5'&2<=;;8643447479396-3311203--,',),-*''&&&$'%$%'$%$''''()*)*%%&$%&&&)'%(#&&(*-./++,+1Kxsx{zy}~~zwxmf^b[gy~wysgZWKFMZoyutsifiaUMFC<;;466532/1-**())(&'''"!# ! HFDF@BBFCGCDB@BCCECAADB?@?@==DABCCB@BBBBC@BBBDBDCC?CCDACBHHHDEEAACDEFJEFD?FEBDDBCEDGCDEEDDDCBBCCCDGEDIGJGF?50.-//*,*(*#%     # "#"$$#%#&&%&#%$"####$!"#!%!!"##!"#%"$"#$%"##%$%$#%%$%%&$#%&&'((''''()*)%(+-+04:;=;A6521/.)*))''((((('(((*-+--*$$!!"" "! !!!$""#""!#$#$%&$$'"&&$%%'''%+//-+-+),-010315386999:88678::<9:59;8=::;9==;<;;<>=;<==<==;;>>B=@?>?=>=@A@=A>>@C=B=>@>A@B??@@?B?BAA=9755421/+-.)--..038=:ADCJFKIKLHKHMLJIIFC=A<<=9673237::<88:76656657775:98:8:8<::;;;<=9>=:<=?<:<;<;=<;<;:;;4544/1/../-..2,,.+(,))),)+)))*(++(+**-+*+)*,(,/-),+++'(&&&&)+)'&)()'*%'$"'&$&&"$&%$$&$%'%$$##"##"$#"#$$&$%%%&%&(**%,,+.368654300--(-+--+,.+,,--,/-././../0.0-10./.2.//.2//..20/1//0/3379=A@KQNNPY]_coukPNNTitz򼞞||{vx}zvtoilhiggdfdd_`_`b]]ZSSTj}yvvZ\\]ZUXSDXUSW_F/85324025320.2-0.3///0020/-1.-.43.58:;A@?FFKKJONVYdjnquzwxzwxvzvwv{ywxywrv[;15011//231.+,+.,++.,,,)-1***(*+**.,)++--*-,--***('&')&&'&&&)'+',6=>;??:>:>6'-9=?;>:6854465:6876/26205411-/*,(&%)%)%%&%%&%%%#$#%''(*(*))&'%%$$&'&)&'&'&'),+,,+)--H{trru|~|~yshc^_`r{|xxskh^OKNRczxuqopkj_\WKD>:<557642412-0*)'&)('&%$#"!    ! !DBEGGCFECEAF@ADDB@DC=A?@<>@C@>77320/++*'(('('((((,*+++---'&%#!!!"#$#! ""!###! $"#$''%(#'''(&)&&&).-.,+-*+,.4253635584;699;876899:6<9898;>?<<====;>=:=<;9;@9<;=<;<:=>=<<<:C:?<<@<=A>=@@@?C>>@AABBAAB=874431//0/-,//.0167;=CFGOPTNOOQPPOOMKIGFFC9<;9976566:8985542646456789:88:9:88:;<=9<;<@=<>=9<8;>>?>>@:;AAAB@@A@@@DB=BA@CCFEFDCABDC@ECEIBHABCBGFHCIC@FCEDGFHFCFBCDEAEBAGJEFDHCDFEBDEEECDDGFBILC>30./,--*+))%$     !#"! !!!"!"!!#"%$&$&$&&%'&%&$#%##"!#!"$#!##$&$%""#"$$"%##&%"%&&'*()'*))()***/25><>;@<974450--,))'))()')+*+*-//0-+%""!"!!#$"#!! !!!%"!#'#!$&&%&&&')&)('$((//,,,*(*-,00203336648577666889:65:<7:98:::;;?99;:9==<;:;<:99=:;<8=>>>@>@A>@B?A>?CA@=:6421122*.-.0.-147<@AHONQPQRQRTSVRSOLKJFAA@>>:96653578866415245434539;889<98:8==8:8>58;==<7<;;<9;;<5769862252000./01/,/..-+)+))*(''&'**(+*(+)-+))+**()*,+..)),')'&&'''()((')'&%('&'%%#&$%"$%#&"#####$#""!$#"$!"$%"%##&%&%('&)(-14988662/)*&)(((')*,))))(*)*'*)()),-*,-,-+-++*-*-,--.-/---/0222469<=ENJMIVRNa^npgNMLM`psw}ŝ~~zvspvstsmhchgieefcb]b_`\\^\RQTl~w|tXXXZWSVTGTYTU^?07124/12040.1000//.1,-/11.-2.1.3206;@?@CAKTSUZYYVZVX`[B9:=68;899787=766476<88977;<;8898:=8=><=CGHKIKNSXckorwtwxzwvwyvzvx{yvwuttX9//1-2000-/-+-,-+./-+*+-,,.),,,+*+*+++(*)+++-,*(,#%&#&'%)&&''+((*=?<;>=8><>2)(8<>;;5771436384662.2332/2/--)))&'('%$(&$$")$$#&"%&%+&&)(((&$&'$'%$&$')&'&&&'&()),.,M|mqz}~yqke^^bgwywvpe\ODFVgv}trpkeh^URNGE<986544240,,(*%'%($'##'$&%##!"    IFGDCCBDA?DEBE@CACEBC@B;BA>@A?A?BBABBDCEBDDCG?AACEC@DADABEJHBFDFGHEHDHHHEBAAAD>FDDEFGFGFCBDDIEBDFACDFFFJGE=62-,-++,*)*$" !   ! !!!!" ""#"&%##$#$(%((((&&'&$&#$!##"####"######$%$$%&''())&)()()(*)+*,/16<;;;;<;<8421/1-/,)+**,*,*++.0121./)&""! "! !"! !""" ""$$%#$%#%$&&((')''#().1,+'()$)'*)+,+./-////12230124331273142279564767777:68775:::;9;:8:7:=<=<;<>9@<@:=?<@@>>BAACAD?BBA=;94;70240-..,/02236;ADJNRUXRWXXYVUURQSLJKHBC>>:9765457;576418114452356999;;7;9:;>=?>>;<785898<:9:5795554100102//-0,.,,+*(*((('*'*((*-)+'*(+)))++++,-,,,,*).&''(,)'()%'(''(%'''($%&%%&''"'$$$%%#'&&&#####%#"$$&#$%&%&'(*)(),469;7832..+))-,*-++.*,+,.,.-,+++,)-(.-,--.-.+0*1.-*/--),+-0/27788:CNPNJMUBMf`iuhPLRMapry~xמ|}{yurutssuodgmhhfegcc^^]_`]]XQRVjzzzvYYYWWTSSHQWUWaC14554200/310/2/01101/,,0-1./-/00,/3=>?B@EHMUWSWVYYVUdXA78:4986<74:994:567;9>;989==;968:?=;?<>AGLHIJIPRV_qv{yvwzuzwuyyzwwxvuytxv^92301/./20./.-.*+*.+.,,.-,-+**.**+)(()*,,--)++&%)(''$&&&('&&&''()<=>?=@<>:>9,.3==;:287-4656:59834251220/*0+(**%)'$$)(&$%+$!$&%#&''''))%(%$''#&%%&'(%&'&&*$'))+*++I}pqx}woic\\cm}~zxuphaWHGIVl}uqolmif\VMI?=9946853421,,))&'''(&#''###'%#""!    GCBDC?BBDEGBAC?CDEEDFA>?=>>>;=;;5653.1/.//-.-135<@ELOTX^\\]]\]__[[YURNOLHC><><57576485954524327443849777=:;;?@=9<@?<>>?:<:;8=8:=8:8;;:735553222,/.01+.-+++++,(((&')')&)+(,+****))(***)-+*,,,*)('(((,)''&)''%%'%%#'%&&'%$$)###"#%$$!#""$!#%#!&##$$$"'#$%&&'()*(,366826201/++*+,*,+**)***+,--/50+,-.*-,/..///.-+2,.+0/.+/-//20255:=GMLOIRO9JajkujNJLK^ouv{{u}}z{xxsrptqqpohgggggcfbb``a^`\\VVTVjxwwYVZYXVVQBXUTRZA3442422101210/-/36/14-.2/1/0,-/1./49BBAEELOTVVXYWSWU`WD==9:8796=3788:<466;9>;;9;;:9788=>>;<==?IGHEFEMPXbirqvwvwvxxvyz{vywyvtqux`8/1.410+5//-...,,+-+,/++.-*(((+,)-+*,,+/.*,)**&'%'&&(*()'(''&**)'<=?B=@:?;>:),4<:=<57372476469435454130/,/)*(()(%'%&'&+&'%!$(%(%'(&)*+&&(%#&$#$'(''$%)$&(,'+(,+,*F~pprpi_Yaitz{vpmcWQMHP^wxqnqnkgaWQLC:939;794603/,,+%))*''&'("%$*%&$%# IDDF@CCAAEEBBDCBBBAAD@@?;>?>=@BB>GA9=><>A@DAEHPUWYYXYVZ^\C;<6797;897:;?;9273:><:9:;;>978<<:<;;?>?KGJHLFNRZakqnwxtwwvyvzwvtvpwxvuuw]502..0.+10.-1,.(,-/.+.)+.-+++,+*)-*)-*-,,-+,-,)'&(&#%(%'&&'%%&')*8>?==?;==>6+,5?:99576435556;9452235052../+*)'&'%'%$'$(&&%&%##%)('&))),)*)''&'#&&')#'(*)'('+%+***H}rqzrc]jz~{tppj[UKEGYg}yxuqnhdc]NND=?8885:44411,--())'))'$$#$%$#$#$#%#! ! !HIDCBBCBBCDBB@BBB@BAA>@?>??><@EC>=??CCDACGFHDDECAEECDBAGIECAC@AAF@FGEFIDFDCAHDFEEBFCHGGJLG;52-,-,,**))#!  #!   ! ! !!!" !!$## ""$#%&&))*(*'&(%%$%$"$%%%&&%&&&'(')&()/*(+,./2244:8::<:8738356::7895661/0/1/3125/1/.,+))&&%!%%%$!##"!$#'&%##'&''%&%&&'')-.+')(%#$%%%$#&%&$'&''$'(+(,&'+*)(*()*)*(*().,+),+***,*)*)**++,,-,()--.,*,..-*1+1+.,-.,-0.1.+-1//0.,//213200-..//15>EMTV^_dbad^ababba`]VYSRLJECA<<:985867465310144-44344469669<9:;?>A=<=>==AB;@98;877=;788;8643432012-.0.-,+*,*+))((**('(*)**+'+,*)+,),))++++,+,+)(''%()&((((''%'&&##$''('%%%"$$"#%#%$##$$""!###$"###%###$!$$')()(*.367344..))(+&*)((*%()((((*)))+&()+))*(*()(+**(*)**)*)),,-./13799FOKNNPU;:P_cithPNKHWknmy{jt{zxzxxsuttssopqonkfjffaeccd]a][]^\\WOQSn}|yqYZZSVUSRGPTUS[A36421//.1/0-./..10./0-0011/1////22/<=>?ACINSRWX[Y[WYbZ@:7878678658;;987967<:<9=:;::897;=?=<>@>:?8>5,+4=9??90405513749454456/20+10,(((&'')'&%#$%&'&%%#''&&'()())%)((%%%'&)'&*'&(*&*,%(,.*F{nqy|~{{wpof_PHEMYmwrmloje[WTJ?=>986434522,+*'%&%'$"##! !#""!"#!  E@BDC?AAACC?BBDBADA@??@@?>=<>@@??CA@BDEBFGFADECDDDCEDDGFCGFJIGFEFCCFFGFFAEEDC?FDEBDEGEFEHEFFDF@DEDFCEFFKMJ;70-,./+*+(+$"  !! "!   "! !" " !!! ""!"###%$''&'(),,+**))(('%&%$'&'''&&*))*,++/1121286667542354648748799<:573135/5645300/-,+,*&&$%#%'%&'&&&%$&#&%&'''''&()*.,*&%''$"#"$#$%%)(%%&)#'*(&(&)&'(()+,+()()).*--,+,+)+))-+-***+**-**+,*,-.-+,++/,0.0-.--.1/.00,..00,0-,1/0/00.-./13:BHNX[`fhhhhcdccedab\[[TRPIIEA=:99864745635/0321125:8755576969=;;;><9?>>>A?:<:;9786;::;776:535112210*--*--,,*++*,+,+,**+'(+,*,/,,,,(+(*),,+,(+)(''&'('(('&(%&'%''&'%)"($%&&%%$$&&%%$####%#!"#"#'$$$#$%#'%$'$&((),015:673/-+)**&)(*(+))*)()*,(**+)*(+++**,,,)(****()))*+)--03538;?BPQKRRWS=;;6;94=59<;?:;8689:>=8=;<=9979@=B:>=?CHEGMIIPR\bjpruwvxrzuyvwywwwytxxwtV71/101-,///.--00,-,+.0/-/.,,*/,.+-,,,+--+,(+-.())(('&&%%&%'$%&%')8D>@A@8;:?7*,1=<:942014556768889441//20.0++(+'%&(%($((%%&&#(#$&%&()*(('&)&&%%%(&$%&(%((+%(&'++.+D}pv{|zwsqgaROCETj|}ssomjc^YTPD==:57244100.,-))'&$# ##$! ! " !"'% !$!!  "J@@C@?AC?DE=EBA@?CACD@A@=???A=CA>F@BADDDD@D@DECBEBABBDBBEGGFHDEEEGBFGEEEDCEAC=BBAAFBGEFGGHFICGEDBHHEFGGMIK972+,+-*-*)($$ !!!#"!! !!" " !!!""! !!! !#""!"!"#"$$$(%%(')),-,*+)*'('())'&(')(())**00/03357562054353155866465;;<:7775265643410/-.*)('%$"$$'%$$%$#&$('())''&'&'&-,,'%$"    !" #$#"##$#%$&&(%*&'('*)')(,*+*')'')(('*+**))+(,-(,,,++*-++,+-+(/,/.))/.-,-.1/.,,+0/31//).-/43;ELTZ`bjikgidddbhfb]`^WXSPKIEB?9564315424220-/.0/14333334484678<=>@@==<;:;;8<<;6897876631334252011.0./.,,-++++**-1,++**((('))*,))+)&+()***).++*('&&&'()')&'$%$%%'%$#$%&%&$$#$"$$$$#$##$!!#""##""##$$$##$#%(&%''()/226540/-+)++('()()*)**)))(()(-(+),*+)(**)-,+,+*()+(*,,--0.3378=FMNIQOhY8:MebhreMJGCTgjlyvcg~|yuxqvsssupnmpjiolflibhbc`dfb_`^cYY_YZTRRTk}zyvVXZVVQTPFSSSR\>3/32215//311/3/011-./-.10.---0.31.1=>=@@FIMUUUVXTVUUfW>:469777;59:7<6<8686:7;:@:;?7?89=<=8>=>BGEHNLLOQYalqstxzwvtxzurvwwtwt|uxoV5341//----0--0-+(-,,-.,+,,..*,(.-,+*,+*)()**-+'+%&$%'&%&%&%%((&((:>>@>A?=<@6)-27<=;351/3155559765/41/0/-0,*)()&')&&)%%&"%$&#&$%('&'')&&'&%$$&#)'&&&'%)%%-')('****Aypubt~xsqme\NFFOXm~{yqqhohd]YSJE=9;8889850..*+'&&%$'##" %"" #!!" !!$ !"! ! ! G@?DC@@@DA@?DCBB?C>=B?ABA@====@ABC>?A@DADABBBGBEDA>BBBD>BEHDEECBCFD@FGGIECCBB?BBEDFHEFGGHEICBBHCDDDFCEFJGF<71-.,*)+()%%" !!!! !"  ! # !"!!"! "! !!$$##$ """"""%$('*)*)-+-+0-/.))+++(**(**++-/./00/01.13445332403224626:9<;888544544423/0+,,)(%%#%%&$$%$$&%&'%'%''')&%(-+*$$&!  !  " " !"! #"%"!##"""#"##!$$$$"%%&%%%&#'%$''&%+(&'*()))+*+))+**,-,,-,,,-++,/2//00/-,..55;INX[dehikghi\fdd`ca`]\[SRMMEC@;85564573331.//03325543588883879889;99;<=:???9;9:;97;97653644134-1//.--+,-,+***++,,-,-+*(,**)+()*),,)+')))+*+-*(*('%'%''*&)&'&$''%%#%%$$%$&$$%&&&$%%#$$!#!"!##"# &##&"$$%$&(&'((+&0366741/.+**(((+'**)())*)**-()()**,**+,)+(+***+*)()*)*)+-.113:6:MQNQQZY7:HeckteLFKGQells|rf`{}x|yzxqsrtrolrmolliilkgija`acbad_`][Z[[\ZVSPRVfxwqVXUVXSXRDSVTNW<5281223/.2/.+1+--2/.///.-/-.--/0//1:=DJRQTVX[W[WZ`V<:49527898788:6985756:;689=:697=>??:>>>>EFFJMMKQ^ehuwuyxwytuzwxzxyxsuusvrW5121/.0./.0,+/+**,/,+-*,,.-**+)*)*,*.+,,/,**+)(&&%%(%%()%%&$&&&)%9<;???==;=9()29:;>5633645585773506214/--,,)*)'''%'&%&''&$#$$%$&&()+())+)'$%'%'&$$%%#'%%(#*((((),>xotMnslkj]VKDJSgyztmklec`\QMHA587::6;00/,*)*&((%##$#$" "#"""  #"#!  "##   JA>BA=B?BCB??A??@=?C=>@??A<>?CACBDEDCBDEDA@ACDFDB@ADCDFCEEDBFFHEFDFCF@ACBD@FGGGDIEDGFCDCCDEFGDEGKKG=5/./+-*+()(&$ ! !!!!" "    ! !!"  !" !#!$"#!!!!!"#!#"$"#%&&)))+/+20111.1,+-,*,,),-.1/.001042441/47341/3000458<=:<:79653345520..-,)'*%)&'#$%&%&%&'&(&)'&'%&+.-'&$%$""! !" #" !$#$ !"##"#"#!!"##$"!" ##$#"#"$#$"##$"$! "" ""#$"##$"%''(&'&$%($($&$$%%&'*/01012/.-,.49BKOU`ggjjifde`ca^cdcaa\XYVRMIDB?878379:843/.-./2235456668587767778::<;@<;=::;<;<;:;::86:4113230.1/0.-.,+,)**)).+*.*,,,,+.+-++*)),-,,)'*(/+++-()+(&&''*'*()&'($%'%##%&$$#$&$$$%$$$$$!#%#" !! "%%"##"!"$#%"(*(('**'.15342//.,+(('+*)()))(**-)*-)))*((,'*),**-,++,)*)*(*)++/,0135:9DPRPORu^:9K`direGFEDNbhks}obdwuuvus~rqqmoklolljliegiihga[cd`^a^\Z[Z\XX\WTPQUhyyqUZTZTTXP=RWQT]C375/0///03/..-,.-////-+1///-+,101//6=@ACDJSPUXXY\YUPbU>7;976766798:;996568;9:99<=:9:7<<><=<:?>HFFIJFGM[bjtuvutuuxutszwyvquxrvsxX322///+.0.1,*1--/-0.+-)+(3++,**)+,)+)++,,,*..(*$%&$$$&&%&(''%%&(#6<<>?=><8;6',4:99:6724566488560//52/01.0-*'+'$($$&$%''&##$###%''*))')&'''"%$&%#&%$&#&'(+(,+))'))?}rtgjvfUPHKLZq{tmjjdcdWTKE>;;;5774531-1+('(%(####!%"#! """ ! !! !!! ! !"!! DGBBB@B@CBBABFADBACA=>@:=>;>>@@@?BB@?AADDBEF@DCBAEECECCDDBFFCDHCAFEHDIAEIDFBED@DFADGGFFIEGEFGICCDEFEGEFIHK=32,,-**,)+(%!"  ! #!!"  "  ! ! !!! !#! " """!!"#"#!"!#!#%$$$&%'%),(,.11326213112/,,.//3/3/2121.23234431220110548;9>>=<6755846602/0-,++*,,(&'%&'%'&''('()('%'*,-,)&$#"! ! !"!$##"$'$$%$&'$$%&%&$%$%$$%%%&%%&&'&%&%''(%$%&&%#'#'$&"$#%#"$'%#'$&&%%%$%$$&"&#%&#'(+,1322001,/078EPU^bdeegjiefae_aeb]^][[YXSPJG=9:58455671221-.-/224458783366858887;9=<=<=;<:38;:8:76;866421/3013//++-,+,-+++')*)++(*)))*+++,+*'**,*))***,*+-,)++&($(%'')'&%&("$&&%#%$"$$$#!"%$%&##%##"%"$""""$ $"!###&##%%&&&'('.2948502.++)*(*(+*+)(*('-*,*,+(*)(+))**+&)***-)+())),((/,/2528=IQNLMT`?7KeemtgEILFLehmr|nc^rpvsqriqonkmjhkigghceefffd]\``d]b[\\VX]Y\ZSTNNVl~u{rTWVXVTVSFQSRSV>1310100,100.//-//1.,.0-20-0.-11.020;=@;>=DEFJLKMTY]iqtwsrqrvuxzx{wwsyuswsrP613/,.014--,---+*+.,+,+-+0++-+,**+-,)****(*+.)+'&)%&$$&%%&'&((%)'39=@=?:::>9(,1;;;:586246576445442:/0-1.-,+%)&$&#%&(&%'%$&!##$"&'+'(((&&&'"&%&'(%"%(&+'(%)&')()()?wr}q_RFHT`y{tlkeg_\YRMD<:56664820-2+*)($$%#$#$#%## $ #"" !" # ""!#!! "HBAAADABBAA@ABABC??=??=>A=<;;;;=@AAC>?CDECBCACADBCEADBACDFDFEEHCCHGGJHGGGACDECDECDEAHGHGCEDDAHACGHEFHEKHJG=53-,-+,,**('"!  !$#!#"" !    " !    "" !""#!#!!"#"$!"!"$#%'('()*+-../.26578575302410./23522324223311322255679;=>?==;75599333.0/+.--,+**'&'&&%&0+(&)(&%'*./*''&$!"! "# "%$'%#&%$&&&&%&(&'(&'()))))*)+*,,*,-,-*(**)+('(')')()&&)&('('')(()+)('(()((),(*)&&((*)*.03422..-..4=DU^`dchhfhhcda`Y_^b[`^\ZUWSOIC@9;4544:859/2/.1/1/.3204246564677:;8:=@=A<<<:;::=;99998866413131/24./+,-+,+**,((*((+)**))(+++-,*+)(**+),*+).(*0+)*((&%'')()$(&(%%&%%%%$"#%%%$"%$$%"%#"$!#""!!!"$#%""%##&$#&%((&(')*.247751.+,++++*),*+*)*(),*+)-*)-)*,++*)/,.+**+++()++,)-+0.674;=IRULN^dC=LcflobGFFCOcfllxrc\nnjnnrlkihghiefdfbeacbe`adY]]Y`Z^[[ZXYZSZUTUQPTi~t{oVSTSSRRPBSPRPW>33-2..-,/0-,-.-..0///./-,..2*.120/3:=>B=GJTTSUZZS[TX`O=<<9:<89839988886:99689;8;:7<7898<=<>:<@EIHGKHJR^ekqntwzswwuvuuwv{zwzxoouU81441/022,,+.,-0**,,,+++/0**-*-,(++**-),*+,,./*'&&&'$&&((%'(&&%((8::>@?;;878*+3<<:;68635246667423/030011+.+*,)'(%%$&&&*('%"'$&"$&&(-*+(&&&#%#'%&('$%%&')'(+%((-**Nyq_]UMZk}{srmgj`_[TMF?8:88479655/-(,&%$($##"#$%"!%$#""$#!" # "! "! %KC@CBBBDAC@??@>>B?=A?=;>>@=>??<@>=AB?@AGACFCCHAD@CFBDCCCDEEJBFJEHGHBEGFDHEDCDEBBFEEFJHGDFEIBDECCDGGGIDKKMI=63.,.,,++'('$! ! ! ! " !!    !!!!!"  " !!!!"$"""""#$#$#"$%%$%$&'((%,+*,-1174597:894875526678873324313145425668;;B?<=<8567874340-/00-..***'*(&('+&($'($(*+-)&''%!""!! ###$$%$$&&&&))%'*$)')*+'*'+),*++,)--./,--**()(*)***()))+(()*'*+(*)*++)(+)+-+,)*+-*.+*,*-13//0+,,/.5BDV\beggedecc\a^\_a`Zb\Z\[XSQKCB897244555624,-,.1231317268684989?68::<@BAA=:>=899786876666230301-2,/-,.--*,,,*','(*&''((&'((++*-*)+),(*)+*/+.,))((&')*%(*'%'&&'&%$$%%$%#####$#$$$"$""$!$"#!! &$#&#!!##$#$'%''(&&*(+34744100/*.(-*)++.,*,-(,*,'/)*+)*+*-*-+.-++,+-+),*-**-1.3363:DORTMUgeB=KegmmdJFDEIcdhs|n_Zojknjjlehgeecedddaa__`_ba`Z\WWZTYVXYWXWRVTTTQORhxyoXUUYXTONBWTWRY:0/31-0/0/1/,-./001..+*2./0+.,--//117?=B99:;=?<;==AFJEHFKOS^chrstvvyzxyxvwruxtvwwquxT6/3122//..,,.--/.,**+,+,/++)--*((+)*)*)-++,,-0'&$'(&%%$$%&&%%&'(&8?8BAA?=DAC>AA@?=>>>A@=>?DCA@CAGDEEDEAGEAGEC@DEGHDIFIGGCEGEGEGEEDDCBBCAEGIGFIGDDDED@CDBDCEDIKKF?52/+/-)++-*$#   # "#" "     " "! ! "$ ! ""!"$#$"!"####$%#$%%)''&*++)+,*1)/427:;<=<<;98:;679543542610225655878>=;>;9476444895535121010/,-,**(,))%(('(*/.,+($$#" "#!!#"(&'''&'&&'()')''''()(+))+*,++,-**-,.),+++**+)*,+*),*)(,),+*,+*,),*+++.+.+-,-+).-0-+/+-1236.0/,108DHW_bihfd`bc_[^ZVWYTUZ\[ZXWUQMHD;:6645576322..10124563855658567789:=@B>=668;9=98754673222341.0...1.++-()*(&)(*'(,'(*+*(++,+(+**-,+)*+,+.***)&(%()'())&%&%%&&#%%%#'!####%####"%$#&"##%"# "#"!!###$$#%'(&&&$$&+046740...,,+,**+*,(+)*+--)+0*,.,,,*,+-,.-+,,+.+++)+**--05695;LWWPQZdmB:OfbmpdJFCFFaihoyl_Xmijoigihgfiefdbefaa\]_^baaY\XZ\WXYXWTTURVVSQPMVn~w|pTVXUTQPNESUSRZ?./3.0.0002/---,./,-.,*/20-.3.0302/08?AABGINQUSYZVVUZaP<789794;<776:<865:899=>8:=:=:;789=:;9;=>CEDGDKNTYajpstuwsuuvvvvvwvyxwtpwrT34/1/1-/0/./+,+,-./-,.+,-,-,.())*,*+*,**/,*+-)('%%%#&&%(%%&$$'$&(2=8>>;><7;8(*/8;9;6553532753523/05/2/1/-*+')%%''*'(''&&"&$"$%%&&(),(+(''($%#$$&&(#&$&$&%''&**-KjYs[uyslkgfecZSME>;=9;495350.-)*''%$%$)$$#$#"%$!"!!"# !!"#""#"#!"!!"!"    B>D@@@?D?B?>>A>>=>?>>=@@=C?>ECEEBF?CDCFABAEDGHFDCGCDEHFHDEFCGFFHCFEECDADC@EDDHDCKEFCEF@CGIFFGHNMI?81./..*,(-+#%" " #""!     !#    ! ! !" ""$"""#"$###'&%&&)$&&(*'(*+)+)-.//66487>=>?B=>:;8867745144.2347776697958;997879887685712522,.+--+/**'&'()+/0+()''####$####%$&&#)&&(('*)('''))*****++*+,-,,+-..++,-*)+++++,*,,,*(**+)**)*,(-***+.+-+--*.*.-0-,-,/14/000--./8CLT^aidda_]Z[YYSRTVUSYXWUVWUPLFE:66634366541/-00,253332043375669998:=;>>?@>=>;:998988:567746211310..-,*,)*,**)('*()')*))')(*)((*)+,++.+*-,,+-+**)&%#&(&&),($&&$%%%%%%%#"#$"%#&#$$$$%$#!#!""!"%#$%#"#""#$"#$&&''#'#*.7;630/,+-.+-++(,)).))*****,+.+)*,,,,,+,-*,-+.)*--,*(.+339:7>K[[WWb`pD6JecjpaHDECD\cflsn\Zghjjjijigkjbfcbdb`]\[]`c`^Y[WVZXWVUYUTYQTQSTRRXq}z{qX]ZTWTSRESSTTY?,/3111,0/0000/,-/..-/2-,.,0//,000018=?@BGNPRWVYV[VTS]M<987898;95779>6856798<;77:?<:89:;9?;?=CADEDFIIKRWblqptwz{vwxxtuwzuvwwzuwvW2122.0/.././,/-+.-.,/++-*+1+,),*)(',*-*),+),+,)'(%%$&%&''%&&%*%&'7>=<<:=<57>,,4<:6;443222566525/316231.1)*'&)(#('%%&'$&$&'&#%"!$&*))((')%$&#%$#%'$"#$%&&#$&%**7kJCzlaqyqlkgd_ZWPH?;=:>98=7;/1--))%&%#%''"%#&%#&%$'#$#"#"!"!$!"!!""$!$!"!" !!!  C?@>B@@?@?>>:?>@B?>@9<=:>@?=B>@:>;BA;DBADD@GBC@GD?CHECFCF@IDFFEEG?DCDDFFFCEECCDDBACBGFGBEEAEDCCBBBCFFEEILE:50/.,.+*'))$$" !!!!!!      !   !!"!!"!" !""$#%%&$%%%&&''''(+*,,*)-//0011767=B>A@B=D<<:8;65245356255864848777;:77:66:89::8968723033-/.,')&'*..+)'('!%" $"$##%$((%)&&&'')&(()**(+)+***0,*+**+-.0+*,/*)()'*-*,)+*.)))(*(+,+****)+(*++,..+.,-/-....-.0100..,,-.2BJV_cga_VZVRSQQOQMORNTRQUPSONLGC;;533258121/+-..2123267144345456:9879<;:=9=9<99<;687694556043122/..-/-+/))+*(((()')(&('&()()()***+**+*+,++*,.()**''&%&'*((*$%&'&$&$"#$$%"$"""#$$$#%&# !$!#""""!!$###"###&&'(%%&#'')12135/1-+()+*)(&%'%&&%&)%(&%%('(%)&)()))*'),,.+*-*++,,*2048;BQTYRfierA:H`aep`KEBAB]bfjqjXTbdghkgdgghgddaac\]^[\Y[_Z]V\UYWUUVVWQVYQUVPOQNSm}wvoVVRPWWSP@QUSRV<343//1,/000/0.+1,---..,00,/,.,0/..2;>:A@FKMVPS\TWVUY`UC986199878778:66;687:;7;<:>9:577;;;:=:<>BGHFJHJUYdhrrtvwxurvvyquwxvyuxuttT513221/.*.,),+/.+,,+.**,(-+*,*)(+)&+(+'-,,',./')&%&#%$&&%#$&%%&%&48A<=899::8701)-')%($%$#%'%#'&%%$#"##!'""!!$ #!"!"% # !"!$!@CA?A?=B?B@=;A=>?>@?DCBCBEBDBCE?DDFGGBGCHIDEBEGABEEDBEECFFBECAD@?FDFDEIFEEFLJCHAEEHCJHLE;83.+..,*,*(&#"  !!!! !!   !  #"  !  !! !"!"!#!$"#"%###$$'$&%%)%''(**)*+,*,//.0-.0032567<=?BCCECB>;;9;89374465284995999;:<989;9;;==?AB@A><@>;;86/,)',+0.++)%$%##"#!$$&%&&&%((&()(&+))(()(+*--*/,*+-),+-/.--,)++('*-**+++-*(*+*+-+-+')),.,++.---,))/--,0-,,-1012/.-,.-6EMXcdeb[YWQMOGIKKIGIALJHOLNQMJH@>9758257353//,.00..3112/141353887879=:::<;==789=9:989876640432100/1-.,)*-,-++)()+')((('&')&('(*))+),*,',)++*,+.*,&&%%&&('&(%''%$"$%$%$$"#"#$$#$!"$$$"""# #"!"" "$"$$#$"$$%&&&%%%%'.064611.+*))(%%$#&#$$##$$#$$$&&'%%&'((***&*.-+-/**,,-,-2269?CPS\WskdwG8J`bgqaLEECAYbckmk[Sdfcfkefgdbbbcfdc\\]Z[\[`\]YZVYWZYXQSPVTSVQOPRRSk|wxoXVSWTQULBTRRRW9117.01031-,/./*.,..+,+,./.-*,..-315<<>AAHJNTRUVVWXSScQ9857275:5735;9957459;>>:<;:8=;37:9?<>@=@BKCEJHIQVafosttuusuvuwtwvyvxtvruuS61/4/0/-,/..--0,+/+-/-)-.+*-))**+.-.)*(/-(+),-'&$$$$$"'&$&#"%#$&%368;<>99995),27;65/342343/443400112/.+(*'(%'%%&&#$'$%"$&&%$$#$'&')+*'&&('$#%$""$)&&'$((()),*+lN,Bz^etwtj^WXIGA<@9<8;:4611./,+&'%$(((%%&'#$'%(#$$%"$#$$!%#!!"#$ # "  !#! AA?>@>?=;;?7@<9=;=;@<>B@?EBAAIDECBAAAAEFDDFCEIDHFDFFD@DDEEFAEFCDADECCDDEGFDGHCDJDCFCB>CCGJKG:4,0--.,++*(&" "!#!"!#  !!   !  !!! !! "!! """!##%"###$$#%%%$'%$'''&**-,*,--0-1000/00245385=<9:<==;<><<=>C@DCEDFEHEDFCC?;;3022.,'(%$$#"##""$%%%%''&)'((*,)+)*)**)*(,+-*)*.(-+,./---+,()+,,,-)).-,,+*-+.*+-*,)**+-+/,-./+.-,*.1-,-./1120-,.-+6CSTbaaaYWNIEIFAC@==@?E@EKIMNLID=;37441353523/+-0.1//00.0222477889978<98;7<@EHLQPSVXYYXVdQ97579598698889854869:<=:;=:8;9:=7:89<:>?AFFIJFIO\dnrrqvtuwsuxxxwtuwywupupV6225.0.-/1/0/0+,.,,-.++,-.,,('**(*+))*'+.'-+,.(''$$"&$%&&%##%%%($1;===?:>8<7-*0972681242220248541065-0+&*)*'))%'%$&'%%&#%$#&%$$%&&(+)&%((%#$'%$$!%%&'%%()()-*.pN)Cxaivzp]UNDGB>>A?A:8432*+,&('&(%#%%%"$"$%#&""#$#" #"!!$# ! $"! #AD??@>?@<@>;=@=;>;:<;>>>C?D?CA@DACBBB@CBCBECECDGCHHDDCDCCGEECDBCDEBEDDHFFEGEEIJCDHEFDCDAJFGGJB85,1-.++)*)(%#! !#!!!!!  !!!! "! ""!! ""!!""!!""""#"$&$'&%%''%'%)((,,--/,..,...0..00340347858<>CFFGKGEEA><><::99<==<<=@BCDCJCIMJGFDDCBD@@?>89:641/-&&%&###$$&'')'()&'((***++*)*))+*,+.+**.*,,.//-)-++++*/+,.-)4)+,**+.-.+-,-,-.+/,+,..-,,,--..,--/00011.----3APUaa_XRLJGA@=<<=9>=?BAADGFFEEDC;586/3867323.+-,-/..00-/123565585;896;><9;:;9:::9:97<965624001/0//--/1/..+,,)-()*&(&&%$&%(')*('')++*()+)++-,.+))('&'(%&(''%(''#&$%$%""!"$&$$$$$$"#$""""""!!!""""#!"$$#$##%#$&&&&'&'.1076//0.+*''$$%#%#!##!%#$%&$&%%&%)%(*)++'*,+.-.--+-+,-.04:;;9879;22200334478546/11-,+')&+&*('%%$&&%$%&%!&#"&#&%'''+)'&&"$#%$&'%''%#&%%'')*/.\f0HxehpzsYIA=?A>??>:46,-,&((((%#&&#!"$!#""$#&"#""!!"  !I@:@BA>?@C;@A9<;@>:=<=>AAA?AFDBBCB?@CCDCABEEEFFHKHCICAEIDGDEFBBCGDDDDGEDFFEEFCDIFEFDGGGGHJIF=8../-+,)*)*)& ! !!"!    !!!!   ! "!""#"!"!"###&"%#"$!$$%%&#%'(()*,-.-/-//--,-0/0.-22024577468<:CAFEIKLJHNGCAA@=:@A@FICFEFEDGGDIIKKMLFDBA=??@@@@?9?=;<99741(&%$"#"&('(&*(%(()(*)))))*))+*,/.--)+',-000.,/,+*+)+)*,,*-.*.++-+,--.,,,,,,.,/-/..,-,../0..-/412.10,+,-2?NS[^XUOKA><=8787995889;;>?B?@A>94535377313/,,/.*./110-/421577795769::;9;=@:9:;<7899785551223100001/11/0/+-+**)+(')&%&&%&'((*(&()+))))*)++.**)()'(%$&&''(%%%&%#'%%%%%#$$"####%#%'%$""#"$#"#" !!"""""#"##"##$'$&&&&(.01642/-**'&%##$%%$#$#%%#$###%%%&&))*)()**'++++)+-,*+-/.1/9>EHOw~ecJ4F]afm]FC@A@Sbbgjm^Qejigfemfheehedeebba]c]\a\\\\[ZYV[YX\VVSVTTTQOSTm~qwnPUTRTTSPFRPUQS7,4/030-01-/.-,*/1-+..*/0-++,,/-.,10<=A@BBJJXTXWWUUTZ`Q>52546477:57=<:;:75579;=8;<>;;85:=;A@GGCHHINR_flpssvwrxxuutvttvvxusqtoP3.2//-+2..,.-../,*--*.+,,,,,-,,)*(*,')*)(+-*.-(&&&&#%$&$%$$"#&&('1;8>A;?A>@><;;<>?=<@<=>><<=>>?@F??EDCADABBFDBGDFBDEBEDIDDDIBEHHDD@DFBCBACCDFEGFFGGGGHEDFDEIFEEKKJPH860.,-,.+*(&%"   "$ "!!" !   "" !  !!!!#! " !!#!"%#"$###$%&#'%($'('**,..,-.0/111120/*.0.1001656797<9=@@GGLNSRSLQOLLLKJNOPRQNOPPNIMONOJHDA@?AD>@>B>=7<;A<==;:7/*'&%#$%&(''),(((*&**)))+***+*,--.,++,*-...-...+++.-+-0/,--(-*)+,-.+.,-.-.-.///0.,+-./.0010/0312210*+,*2?HPVZRODB9:866678695586799;BB@=;885/4064626.,,+/1100..1/4.0587777889:;>;?><6<;;;7:66596::4120100/0..0,,.,*-+*'')'((%&&%&)&'')(*))*')*()).*,+)-()('$$#$$&&'$&$'%%$#"&$#$"#"#"%%"#$#$#"!#$!!"" !"""###""" ##%%%&$&)),/0641,**(('&%" #$$#%$$%!#"!%%%&%*'(*+*)).(..--**,-*.-..34;@?BDJKPOXV]WXPWbQ<6668:635948799653437::<;=:<;:79:<<;=<>BGHEKHKEU\^lpsqxuvvvtvxywuttxyspwsS3430/0//.10,+/,,+-,-,++-/,*+,-.*)(+-()()*)**,*(('(%&$'#%$%%&$%$)$27:=<=997;5(*/<8<<43323620256650231*+(,)*))'('()''$%'##$&%$&&%'$%*'+*&$#')##$#!%%$"##%!%&$))(.Iq^niqtgD:C?>620*,),)%%%&'$&$$$" !! !#"!!!!! DBC?=>>B??@>A=>=;@8;@<=;?:?<===><<;?=>?A@CDFDFBEA@CDFGFCCDCIFIEEDJ@CDFBEHBFFCFBCAECBGDHEGGJLDHCBEFCGGGFMLI=910-,,,+*((% # !" #"#!" !     !!! " ! ! "!! !"""!#%%"$$##$##"#%(%'''*,-.-,,,.3122352101/..//2/2232554:<=@BDHONRSWVYYRVUV[YZYWYSUPNKJMJHIEDEADC>?AA=6=9:;;;=<8:5/+)$##%&&('''(('((*))(,++*+----,+++*++/.04,+..,+,.3+(-++-.+++**,,-*.-.++*+.--2...//-..110-/102012.*-.*3@FNRQOF?:85658133665365989=::=:985443023/01-.--../1/1//102647689967699?<@>><=:::99745952122220/0.01-.--,.,**()(((*(&&(&&&('('(+('(())((**,+)**(''%&&$&&'%%$&(&$%!"!#""#%"$%#"%&$$$#$#"%!!""! ! "$#%#$#""""$$&&'%'%'+-0210./,)(&%$"#$&&%'#"%$"#"&%&'%)()),*)(,&*,-,-),.+.-,146;FHlx}mdyQ2F_`^iYECB@=R^]foeZM`ggdhhjkjhiihgfdaced``ga`]c__]]]`]_\SV[YRWVVQQWirwnRUQUTPRQASQOQO:-30/0-.,/.--,+*..,-,--,//,+.,.0/0-0;?@C?DHQSVXYYV[TU_M;5565549789867964346<;69;:<;8989:@A>=:;BFIDHGKKO]bnssrvuupuuwuvvxsprsusrsT302/./.110.1+,)+*-++-(,(+**'*++*((*)*&*((%')+-'&'%%&##$'%%%#$&!&%29;<;<6@8>=(,2:7;<451/326735122.30-++)(*)%()'&&%('(&$$%$$"!$'#%$#&$&'%%#&%#$'#$&&'$#&$##'$'))(-O|{gmr|~whH>:50)(&*(%(%&$&&%%###!"!! """"  !  !!CD=9A>@A>@@=A:??==<<===<<;>=:=<==9<:>A>A@ADCDCBB@DCFEBBCDECDHGHGGHDAADGFBEFABE@CAB?AD>EGEGGGHDGEFDFEHGJOKJ:60.,-.,+**)' ! !"!#!"#!! ! !   ! !    "!!"$"""! "$#%%$%"%$##$#%)')((---,+../1268756443/21//204/115789:=?@CEFHMOPTZSXXZ\[^^^Z[XUPOHHGEAFDBEBDA@ED@B<@6KYlauR5A^_^iZBAAA=R^^`ni[M_fegkjhlkjkhiegegdec`_fad_c``^__^^][\ZYXUXUTPQXj}xzkSVRTTQSPEIKSSVZWWTRTfO<84857777799;896365988:=<<<<8767<>;;:??@CKIIHKNPYbmrrvuvtuwvvrvwxwtuqrrtnS404--1,.--,0+++*--+)-*-*+-+(+,-)))+(*)&''&&+++)''&&'$&%&$$$##'$&&189;9<5?769')-5:;9442/334143434.0/.-)*)')'((&%%'(%'&''#%%%&"%"$'%((&)&$'%$&$$$"""$$%%%$$&$%(&)(/\nja^\Uc\A942'&$)&&'&$%$%"$""#" !###! "@C@;9=;<@9?>@=?=>?;<><>>>;:>>>@@<;=>>=BB@>BDEDBBCECD?EDHBEEFFGFGACGDAHCBGEIGAI@C@AAEGHFGCIFHHBF?FEFHKELNIF:8/0-/,+**'(&!!! """ !!" !  !! ! !!!  ! !! """"!"###"##!!#%"%!$$%$%#&')),)+++,-0-/0243897853400/02//1/223449:>@FIJOMINNOMUMQTPSRTXYVXRQNPHEHGDHEFDBFDDDGB;<@@>><;<<7.)''!%$&&%((,*++((*,+.--*()-+,,*+)),+,.04-0-.0.,--,*,.,,/+.+,+)//+/,+,,,-././-010//0-.1101-1233121-+*+2?DAKJ@>61220///./002347644779:878732223310/.,..01712220/4436797967769<89:9::89:5776:7574432013133///.,,++*+-+,))&(%'&'&$)%&((*)).*)**%)(*+-*(*)(&%$%$'%&&&&%$%$%&$""!"#""##"$#$"""!#"!!!! !""! ! !"$ #"##$%&$%$##&*-223001+-&((%#$%'$##$"# "$#$&#%%(&,***()))+.-/--0,,-//033=P{marU4=`[ad^BB@B@N^^bpmZQahhjjlhkmmljjhgfeidcbcfbedbbb_``^]_]Z\\\[XWTOLSi}vy~lUUUUWNVOAQRNOT9-30//+-+/.-.-02)-,++)*,,)-,.+//2//0CDHPWSWYYZVUWdO484633789855<::66587::7;;>=9::7<<<;:8@>>@:?>;@>=>;>;=?=<>A?<6,)&'##&&')*)+))*,),*(+,,+)+/.,-),)*./,-.1.0-/.--+,0*//.-/-.,,**./,-,---.,.,-1.000010-.1000/050210/,+,,0:B?IC<7/00,0.././.000144156558:779567666020.-*+-122012017625246:9;777789<9:68;8876946643334401210////-,-*,,**('&&$''&(&&'''(''))+(((*(*()*)*)*''&%%'#%'%)#%#&%%$$%%###!##"#"$"#"""!" " !! !" !"!!" "!!!"#$%$%$"#$&)+.231-/+.'(&$$$#(&&##$&#####$&&('(()'*+))'++/-+*-+----012A`pn_uT:Cb\bf^DH[ZbmmVM`iikijjklmmklliikjheccehefdda`_ada^_[`]\[YVUNPWj|uvhSVWTWQUMCPRSQV<030.0--//.-.,.+,0+-,(),/,+,/+.,/.,0:<=>?BFPRVXWYVVOYbN564558:78:88:879837<7;8;7><9746<9?IFFGCIPQ_biotwusuwsvvyvwvrwvsrsstS23010-//,-,.--*,+,,,+,**,+''))))))*+-*+,+)),++'%''$%%"$$%%%##'"&$0:;8;:9997756.76:7370.23/3448312/1./-,*((&(($((#&#%&$#"&###%%#$%'')(&$%##$#%'#$%$%##!#!$$%&$%&%)Osxku|x{ohJ6*&%''%($$%%%$$'"#"#! "$$$ #" "JDD@@=?>@BA?>>=?;>@?9>><;:>>8??BA@AB@CDDC>CD>CECBCCCDAGFGFFHDFDGFFECGEBFBDBBEEDCHIFNJFGEECDBHGGLMKG56210./,.++''!!! #"""" !   !!   !$ ! "!!"!""""#$!#$$%%%$$%&$&'(()++/,,1010010147=9=;<43111.13263/5576;ADJNILFIDEDCGEEADDEGJJNOPSVVUYVPNLKJGJKMLEEFCADDBDBC;4,*&&'%%)''+*+*+***+)(*+**),,,'*,+)+..-..1.0-----,,.*.-.//0/-+-.000..-.//.,.//011-./0-/0/1000440301--,./9;;A:<3/1,(-,,0-,+/01.44223768785776734613/0.++02411212//434455:988677;89<957:77786649858321130120/0//1.,.***)(((&)((''('''(((*(+**()(*))**+)((+(&&%$&($'&&&&#&$"!$""%#%$"####"#""""! !"! ! "!!!"!"# !!"$%$&&&%$&+-.031//,.''&$$#$&$%$#"$!#"##"&&''(+,)),(**+,.,./.0////055Kp\tU2B_\]caE@B<:D]`ai~kTQ_jkmkkonmliknmjkkfigggcedd`gdeaad``d]]]]Z]YXRTYjztumUYSVUOTMDSSTQR89;=;>;597<;B>?=@CFJGIIKPQZdkrtutqvwvutxyzwvsxwprurV3/1////-1/---/)++(,+*,-*+,))'''&((,*,*,,,,+.0)($%&($&%#$$%$"$&#((2<98;:89539().=797752//6/36173010/,-,*)*')&,&$&'%##(%$&'%#$##"#$&%(('$'$&%##&$$%%%#%#&!!$&#$&%%*Qmz~~mqd>+&)$)'&&#%####%$!"$#$!! !  $$! @B?=?=?>>>=?=>9=<::<<<<==>>?>=9@>A>?>>?CCDCDAB>ACEDGCBEFEEGHFAGBCCDCBCCEFDBECDDAEFFGFFFIKGHFFFGCGEILMJG@701,--+,+))$   !!"#$!!!!!  !  ! ! ! # !" !#!""!!"##""%$#"$%$'$(%$&(**)(++/-.-1,10278;<<974211011120142665<@CB?A>>?@>BA@@D@A@AF>CDDKNNPTPVWURSOQLNJHBFGECECDB?=3&&%&%$''')),'))**+)+))***+-.,+-*,+-+--0.00100.+--..0-0+0//------./...-/00.0..1/-1011.,0.12/1040/0/-()*.4379641/0/*,+*---,-.-/223/582655656564662220,,.-.1.0./00/1003285788887:8789:;:4856664364323113211003--,/.,*(**()&('&((&(&%#''((()'*),'))'*'(*+)))&&$%%'%%%#$'%&%$&##!#"##$%$##"""!!" "! "!!#!""" !#!&!""%#$$$#$%',0120/.*)'''%&#%&%%$"$#%###%$%%'()))*+,,+)../1/0-.+/00047Oyqvupvxh^q]6>Z__dbAB@@AD\Z\i{jWQ^llnnnompnmlmmikmkkfiedfeieg`gecd^a`__^]]\^XOMRh{wviRUPUTNSM@PPPOO7.00+*0-,-/.-,--.-,*+(/.,.,+**-//-,3;>?ACBIQRTWXWWUSU`M;465325446598;5694958<9:9;99;896;;=;=>=BLEHIKHJSYchnrutrvvuvustswvruwwsuqM1/0,+01,3,,**,&-+*+0.,,+,),+)+)+)*+'''()()'),+(#$#$#%#$$#$&###)'$.:76796;759()06566424-0244234663430-,,(+'''('(%''#%%$%%%%$!!""%%''&')&&$%$(%##$"%#$##%"$%(&('(')Qlx}wzwplg\1#$&'%$$%%%###$#&"" !##!#!!!!""! FEB=:<8=;;:=?8?;=>?=;>@=>A?@B?CBAD@DDEDDDADFDDDEEDFIEFFBCIGGHEEEBDCGAEHHEDEHFJGHIEHHEGIHJMHG;42/./.+++)(&$ "!#""!!!    " !   ! ! ! ! !! " !$$$$##%$#$#%$&&$')**+)-+.111404212898<875431121230222579>;=>;;;:==?A@B?@<;@YZXeviXE\mlommnpmqpllnlolkifdgfhffgfggecfba_`c]a\Z[TOPUjzsvgSUTTSQQLFSSONU6/01.,-+.,.+,,,,.,*,.(,,+/,,--,-,/,2>=D=?BKOSXRXYYXWXeK;58853656:397>745686:=:;79<;856;<@=:<9?>EEHJGHORYaiosvxvvvxtuuwwzwwsuwrsrM11//.0/10/.,-.*,*))-,+*(*()**+*)*)**()*,**),++'$$$'#%#$%%&"$$$%(%+:56;:;:7<:+,/:776543122131./62-10.-.+)))*''(&%(%&$#%$&&&###""&#%%'''%%##%%'&&'$%$#!!'$"%&')%'('Rol{swtsWWk7(&%''*&&&&%%$#!"!  ! !!!!" "#!! ?A@?>>>=;><=<:><=@=<::A>:><=>>@?=?>;9>@??ABBDBBBBBEDCBAAEDBEDFFDDEDCBDDGDIFFGDCEFDFFFGCFHGGFEHGGDEFFIGKJIH;501-,--*)('%"! !!!" !!! !"!      !!"" "#"!##""#"""##$%$$&&&%)()*)*-,1655032059583676230/1102/325659;;;<<:<989<=?>>?=@@@>A<@@?AA@C?CHHPPTSNMKJIKEHIFD@E@3)&&%%#&$#')))'*+)+-)**)*,+.,.**+*,,+..+,-2///,2+,/,../1..02.--,+---,-,.0..00,0/-2/.-.0/10.00/2/10./)*)**.//22//-.,+-----,,-,+,2./13334869724300112/..,+0/*./+2-.+/1040/025577789979:774954989684161033210.0.1.,-.*-+))+*'(*'%#)&&&'('+((*(*&'(()(()(++*(%&%'#"%%&#$%&&&$##""$#"%#!###%###" "!"!" #"! !"! !!!# !"!#$$%#$%$'),-320/,+*'$$#!%%%$$#&#""#&"%%&')&)(*))-*+.011/.0.-/.122Aqc^k_3<\^^agAA=>>GVX]dxo^Icpmponpnmqpoonmikjijfeihghcgfhcbebbc`c_c\^^XOUUh|uylSTWRROTMDSOQQU60.10.1.,/-,--*+-+,,.*+-.,++,,./...0==?@AEFRQXYWXYUSSaO93438466564:;=:54565<=9878;;;89;9><:<>>BGJIHJLKOY`jmotrwsruuwutuvtwtswuvtL2./.0-).).,++*,-*)+-*,)*+*)+,**+)(*,'''))*)(*+&%$&&#$!#$$$"%%##&'0988<8;;974)*+<;7:2421/20045246032/,-+*(,(''*%'&'%$!$$#%"&$## %"%&'(%&#&%$(##$$!#$"!$#%"#('&$(')WgX~}pusfvh<'('*&+&$$""#"""#!! !"! !$ #! !! "!!!   A@><<;;:><::;=>:??=@>:=B?;<@<<=?A=??>=??>?AB>HMNONNKKLKEKIJJFE=,'%$$$$'%%''*+*)*('*+*')),))+()*.+.,,+(+.02.20.0+,.+0,1/00/11./.*+.10..+..-//.03///./-/011/30.0-21.0*-+),/.,//.,*++*+++,+,--+-,-01/2152557884/041/31-.++01.00....-./.10245858879576:<;86:88749675230220230,/.--+*/)+**()('&('&('&%())))(&)'**()*())*'+(&()''%'$#&%$"#$#%%"$!!## ""#"$'$%""##!" !  "!"" " !!" $"""$###"$#$)+-2130+-**'&#$%'%#$"##!#"#"%%#''&,),(-*(+,/02.00,.000.3Dua]ha;BX[`_c>BB@?BWW[cvn[G^pooooqonsmnlmklmijkhjiggigfhechgdfab`dbba]YOSUk~tziVWTVTOULENNQRO6.1,-./(,/,,*/+++.--,+,+++*,+*.,,-/2;A>?AFFMRVWVZ[ZTV\O74442467976<<>;87689899:9;=;;899:<9:;:>BEFIKJIMM\djopsuwttwtrwyprsstvtrtpL2/2./,,1,-.*))**)+*+)-*(,+*-*,*()(,+((')))**()'&#$%"$!$&#%$$$#$%%.:9::958877,(.;7493661020205425143-.0)((+(')&'(#%%##(%"%"%#"''%')&&'&&'$%!%$"$$$#$#&$###!#"%%%%.P]I}rZSFHJIJB'&&'+')'''!#$####"!#!!" !! #$#"!#! H?==8=:<@=<=<=>>>@:=?>@B@CAABDCCDCC@FCFHFIFGGFDEDFFEFFCCFFCBCECFDHAGGIKGEHCDFJCGILMQD=4/.+.,,-*,'$"    !$!$ ! "! !  !  !!  !!! """""#!$#%$#"$$#$$!$#$$('%&))*10.5898663513565765651202-23339;=<9:;986::=9;<:<;=;==:A>=B==>=?=CGJLNPJGHHJLIIGD@;.'&%$$$&&%%(+*****((*+++..,+.+,.-,.,-,/-0500/.01,.,-*,..,0.0/./0--.0003.03/011312/220.0.3/010.4700//,+,++.+-+-.,+,,,,1*),*,--.,,0//1/215665442033.30.++-0.//2/+0/.011333222454658779:C?<:6999958555/4/3002.+,,,,+,+***'((('()&%&$(&'((&*)*)-()(*)**+))(%&(&%%%$&&$&$$$"$&#&#""#"%#"##%""$ !##""!! !!!#!!#" "#!!"!"##$%$"#&$)*/30-2.-+*'%%#$&$$#"$#"#!#%&$%'((+(-))))(+10710.0.-0238Guc^id6;X\^]]B=@>8EV[Wauq\FZqnnpqnnopomooknlljikjhlhjihhgeffigfebdac`^\OPWnsxiSVTUSQSLGRPPLP7.1//.,,/,/.--+-*-+,,+,*.)(*-*..-.,.7<:?AAKLPURVTYVTSbL85334465987:9:957366=:8=9999<59:9:<;;?;AGGHHKJOQ^ciqortururrvzuqqqtvtxqqqM3.11/./0---.-*+***)*,,*)+)'))+/)&(*)('((+((*+(%##%"$$%$($$%#$!"$')8;;9?;>7>6,)+9885236,240/-/225321,-0(()*(('&''$$##$&$%$#$"$$$$&&'&'(%&$&!&$$##%$#"$"""#$&##%#*0YV_vhsgihggS.)%(%&&$#(%"&%#%!!" $! $!!""!"$ !A@A>=>::<<=<=>>??@A>@>=?;;>?=@@<=A@;=;???@AE@BC?@EBCBDCCACCBDEHCFHGCHDGDHGDBCDFBC=CDFFGGGFFKIHIFCEFFFIHGO>:21-+,+++'+&$#  $&' " "  !   ! ! " ! !! !! !"""#"##"#$##$&$#!##%$$(&''),..43565336435664421220212114269=><:97788;::8:=9=;:8>;;<=<;>>@A>?>>>=@ADFHHHGHILHHJDE<2+&(&'$'%$%&'(+++,)+.))(++.-,,+++/+***,,+14340..3//,/,.-.-/./...----/./10,//.0.1.0001-01-2102/047140--*')(,*.'+-+,+..****(,**+-+/...-0./8799267/2403.--+-..1/0+-,--.-.01535264685:6;:?:;7>::9695532222131///..+++,--*')'+%$)''''(#')(*)+((*(('*&(((*)))*)''(&&%%)%')"$$&$###"#"!"!"""!##%#"!$# ! !! !" # !"!!!" ! ""$%####%'+-.1--/-+'($&$&%$#"!#$####%&&&&)$&')))+*(.214021020310;Iuc[ej<6\]`_~]?@=@<>W\V`tnXJ^qnposoommrnpmjolomkjkkgkijgigfdfheccddca^aXQMUl~qvhQUQQQOOIBQPNNQ6-0/--.,,./,+.,--.,+(*,-.+),+*,,+,*/;>FMMTVVWXYXT[bK8:05486568459:95:6559:<:8>><8689;;=::=;BDGEKFINP^egspquuututtsuvptuxvwvpqM1,/3,-0/.,,+)+%+*)*+,+()**&()(+)(*+*)'**(+)'))'$##""#"##$$"$#!'('*7;69<57666**-<6892.3120//311002/....'.))''%$$"!!#$$#"%"!"!#"%$'&$'('&#$"$$#"!##"%$"###$#$$%('*1Xkx]Ds|xuqrn^>?KTZL6'"%##!#%#! "  $%$"! !$ !"!!??B=>:<:;99<;?>>=>?=6==>;>B?@A@A=@<=FCFAGDGGGKCDCDFHHGGDGGHCE=CBDCFFHGJJIKJJGFGHFJNHRF:/2...,,)(('%"! "  "#"&$!" !  !     ! !  ! !! !"## ""!""$"!"$""##%$"%$&'%''('*,-.0367763953355642333/211264589;=7;8778:<:<89;:<<<9:;<<<;7;=<=>A?@@@?AFDFFHEFFIEHHGA8,%&&&'%'$&%&((+,++(,-*+**,-.,+)+),++*-/.-0.0/0/41..,*+,-//-.0/.,-,.-.+-/..1.-0/423111/01230/3/253135/++**)*),,*,++)*+)+,,*)+-+**/+-,./.2:35:676/11/./.*),+-.//,.0/00/1141255756425667A;=;B:87788442./1/1/--0,-.*.,++*)((((*((((()(&()'&('(*(()(()*'+)))(*''(&'%&&%&'$'$$###$""%!!""$%"#"#$%$#! ! ! ! !"!""" !!""!"##$$""$&*-.11//-),'($%%#%'$$#""!%$#%&&(''')))))*'),03422/1//2267DvbXff;8]]\_~_?A>?>=VXS\rqZJ[roromqosnoopomjnnnkhjkjmklgjgggggebddcdb_bZQSVj{uyiRUTTQPOKCPPSSN9/-///-+*.,,/-+*,++,*)+*,,,+*,-.--+0><==<>>=<=@>@?;;?B??AC??>??=?;BA@?CA>EFBEBDB?BD>IDFCFIDFDFFGCCE@EDBFCAD?CFGFFIIJGFFFCFEFFFKOKE720.,*-+*'(*%#  "#$"""   ! ! "! !!"#"!!"!!"%""##""" ##%%&&&'('()*++.2559765545745556331013344399<;;9:9:9:79896:88<79;:98<;<;;@>@B??>@@@?DDCCCEEHFFFE?;5*'$%&%%(&&')')*,)+*++*,-+-,***+,--..+-.-/-4332../--,,,,+,1/00./+0+...--0/-00,/11.2010./104213/138583.++)*(-,)(')')((+++*,)**,*,,-*+--.01769;95001////0-,.-./1/0,+,/./0422476364775:8:9<9:>787644333120/32//1.-++*,,))*()'&(%'&)+''($%()('))(((*'&''())())'('$&'%%#$$%$##%!"$$!#" ""####"##"##!!!" ! !!! !!""!# "#$#&%"$%%)),11/20,*)(#&$%('$$#$$$$##$%%%'%*()''*+(+/0322425/001/9CrbYcg9:Va`a{_>AA>>=9:86;-,*94471441112133/20.220*+*)''(%('%%#$#%"#"#$&"% ""#%%&''&%%&%%$$ %!$##"#"$#&'$"$#%%6\wxdXsYZmmiaU/(%&+)'9J_aL3%!%$"!   "##  #! ! ! C?>;?9;=98A:?:A>;?@?<>@B=@>@?AB?DCAFCEFDCFBEECEGDHHDDIEFDFFFGEEIEH@AE@CDEHBFHHDDFHGKEFGFILIE=121,*,+-++(%# "%#!"! "!! !   $  ! ! ! !! "#""!"##%"$$#%#$%''&%&&&'(&',,.134966956756334312/02212<7:;=;:98779::<:<<;<=?;;:7::<>=<8?>??<=>>>>?A>?B@B@EGDEEA81'&$%&$%&%'&''(*,*(,.,)+-)-+**+*.*+,-,/--/.2000//0//-/..-.0-.1//-0.-/11.//121442411012.00030/0.02320/+,)*&('(*((-),+,,(*')&**++,(,**-+,//6:;;732/11/,.,+*-,.01/2-/-./201.314636676996669795647885523330///2./..,,+,+))+)(()('*&))&(-*'((')()(+%(')(')+)())(&(%%#&$%%$'%$"$#%$"##"#!"#""$##$"#"###! ! !! ""!"!!!#%#$"#&!((/1202/,/++#&"''#$!#!##$#$$&&&('&*)*+,**),026444302/00:DrbZdm>;W\]_{eDBC>=@PXS\op\KVqopqnrpoqoqonnnrqnikjmkkeikikjekkkdfdecddb\QPShvrvhTTVTQMNM@ONNNL710/00--,,.+,+))*,-.+*)+.*+),++,+-,/==<<875;A89=>?CFFCHIFOV]egmrurvxvssvuruwvusttswoM2,2/,**.-,))+))),--/,,)*+)*'&)))(,,))'())*'())(#'$$%#"$%%%%$$$&&%+99:9:9:966++(772853321521.0.1/4971*+*(&(+*&'%%%$$&%'$####$"%$#&$''%%%%'(%$"#"'$$###"&#%#"$%/=Jdxub\\{wQZmmjX+-',(+')%(2HQF2)!#!!!""#$#  $!"B<;;;9:89<>:>>?D==D@==<@>A>@@>@A;?>=?>?:??>ECAEBEFFHEAEDDEFEFIFGFFFIEGCEHHGEDHDEA?C@@CJECHJEGDGCCDDHGKMNHE<510,-++,+**&$"!  !!$##! ! "# !   !! ! !!"#!!! ""# ## #"#"#$"$%"$%$$#"%%&$$&'%&(),**-121676:<997:3342444434359;:?9:::9:97:=<>@@A@A?;=;:;:;<=<>B=?>>B@AA@BBDB@D@9.(&&#%$(%&'(''&++,-*+,++,)--.,-+.-.//*,-/--2/10.020...-,0/0.30/+-,--1.1....0/01111102//00130122,113/1-+++((()))'*',))+)*'*))*)*,*++,+*-0.56388510000.20..0000/12+,,0-020444414357378978;93575547322513112,0100/-.+**))*)(&'&''$&)***&('&&'((),'+*-**+++*+))'(&%%'%%&$%%&$'$"$###"$""#$$##$"'#""" #!  ""! "! $! "$$&&$#%$"(*.12/10-,+&"&#$%%'$%####$#$$&%(((+())(+-,-2674444/2/12=Hw_Zgl<6WZ`a{^=CB>;=QWRZls[KWqrnqnspqnqqorsppprlmnmjkjjlmkjilgggffgdfdd]LNRl{}sviRORQSMQKATSMPS801/....../,+),*).*,,,,+,(+)+.+-,0.0;==@BGJPSUXYWX[QXcH8858445988977;;781688;;7:<@=>668?=78<;=AEHJJNLMW^fhmurqrsrttvwtuuxuvruqtkR2-20--,+--+)**)((((()+()+((&&(&''''((&'()%'&')%$%%$##$$#"$$#%$$'#*8><=87;855,+*698654320104-3033:94+++,(())&%%!%"$&###$%##"##"%#&%%&'%&"%'&#%##$"'"$"#%$6K`kgdQQ[qf_`{xkZY]eT.)()+'(%%&%$&*640+($"  ""$##"!##! #  ?=;;=:;9:=>9>?=?B@@>?A@A;B@=B><>>=B@A>A?ADFCDEGGCCDEDFHFJIGEEHEDGGFHEEFEEDDBBEGCGFHHGFEEDCHHCHILJH:6//-/+,,)((%"!  """###!!  !    ! ! "!! ! ! !"!##$"#"!##%$$"'%#'&($('&%'(''+-../14667:89453431314224276;889<997<8<=<>>=;7=:;9;=;C;@=D?@?>@?A@>@@BB@B:4)$$%$&%&'(')')&(+*++,+-,-*-,++,---+-/-+,-,-2013/000-././.-/./3,-+)-+/01.010/.//013231-2/0100463/531.1-)*'&+(*()'((*').+***(')(*)*+**+,,/.345:931-1/1/0././.20//00..0/12312334443765775:8;88:6845764531113/1/,..-/,.*,-+(*''&'&%%&%&'%'&('(((*+'**++++**+*))''%&'&%$&$$%&#$$#""$""%#%#$$#$%%&!#! ! ! !!! !!!! "!" " "#&&#"#"$'',23201/-,%%$#(&"$"#""%###$$&&'')(*(+0,**.569446300013;Gv`\fpA7W\a`wTC@><=>UTQYhv]LUvrqrrqrtqrrpornopmmolmllkllmnlkjhifieieeee[MQRjz~tviTVUVTMRNBNQQQQ200,-./.,0.-,*-*)+(+)++,*)*))+).+--0:=>@CEMNQXWTX[WWZcG;776618579445;96304978;:9;?;9<:<=>=:?ACBGIKDHKIQ[dhpttuvtuvrruvvswtqstvssO2.0/-/*//-,/++))),)*+*((+'('))())'(+'$()+(*''+&#""$""#"""%$"$#%%'+:;9<88:767-,+5885394211./,/241/./')*'&'&(%'%###!#$&""$#!#""!#"&'%&&#("&)"$$$%#"##%"&%>caSA2)($?\qc^_z~qrc\bN1)&%,'*&'&!$& #'%02043.++')%!!"!!!>=;;=:;?8@><>==@<>:?D;>?AA@A@;?@<>=AA@CBADFCF@E?FAEDDEDEABDCCFEIBGEFEEECBEEDDECEHGFECFBFFFGIIJE:21,-++)+*)*&%! !#!" !    "!!! # ! ! #!!"""!""###"$%"#"$%%%$'&%&&%)'*++-.12559985463201315565686:;9:9758=;===>?;;>;999:98;;:9:::=:<<=?@A=><;::=??>=??<;@QTPUgwZKTuppppqosqrqpopqprnmolnjlkkjkjklljlfcghdaceXRPSjz~rt}fQQSPTNQL=NPOLO50-+--..++,(,)++*,+,+)+**(()%)+,)-)/;<=@DGKRTTTVWZVXXbH:554436486595<65442788;889>99;57<<:;<=;>?>><<<@=>??>B=@@?=>B>=??>:@A??>?@;=:==???ACBFDGC@DFCEDEFCEG@DDDCBFGGHGHDGBADAEFIGFJJJGGECDCGBDJJKB=1.,-0-,*()%$#"   !"" !      !!#"! "!"""!$%$'%'%&%&&'&&''(&(,+,-/278894411320363773576:::7:9;79=;>;:8:797;89:8;<;<<;>>??=<;7;879>:==:52*''%$"%%&%&&'%(%))*+++*,**/,+,*/.+-,0---,.-.012/.12/1,,..-/,0.02-++/+00-/.0.-//0024.01110/213313000///,+*(*()''((%%(&')($((&()*+)*,,)-,//+-33654201..1-,*++//0-10-+-.///0010504245566997<6:96657565342///2/10../,+,-)+'('')((&&%&%%($&%%(((('))'(()((*)')),&'$$#%#""%$%&&$$%"%""!!"!"!&#"$#"!"!!!! "" !!! "!! !" !!####%$$"&(+.0231..))'%%&&&#%###"##"#&'&&()(,+,+*)*.3455621/1100:Iz`[_xq@7P]Y^sT=@A=<:SWPSjz\JWuosprrqrrrsqqqonknoolmkkmlkmllnjghhgheggdfYOPPf}uvjWVSLPLOO?RPMOQ6./-.,--.0+),-+**,*)**+****)))*.,/./7<<@BFIMQRRZWWUVV^E5424/54689677;66667999;89:<=;89;;<;<;;<@DDLFHHFQ\gfpqqquuvtttsrrnrrpsqrsoM0.///.-,.*-,*-+),,+)+*)('*))(+)(((''(&(**(+%'*#$$$!!"""$$"#!#"#$$*797:;8997:,(+567713201/1-.//-0,)**+*()&%'&%#$##% $"!##$#&#""!"#$&&#&$#%&%$%#%#%"#",ZY/$%%&%('&Abtd[]uxqsrsmX.+((*+&%'%"!""$% ! !"!!&')%)'+++**(' !!!""=:>>@@@<:><>A@@=??=@=A;A@?@?>>>BB?AAA<>A>>>=@=>A?ACBDEFFCCHDEDFIGGFAHAEHHEDECFGHEBBDFDIEIJGHGFHDEFDCHGKJH@=00.,/),*')''#    "#""  !    !! "! ""!#!#$#$$$%$#$$%$&$%%&'&''(*(-,+.02544523254156877646978;:7;6;7::99;9986:7888;::<;<;<=:=>=??>>;<;:;<99<99;84.+))&(%$%&&&(#()'*,,+**())*.*,,,,--*+/.-.,,--2331/001.+/.-../0/,/////,1/+.0/-00-3022122/002/12322//1/0/.+')()(()''&'''%*(%)'&(('*&,)**,/+,/3558961//.-/.,-++-.//..--/,-501033834866477638978857564444331132311/..,+,+(-(*((*'$*)'%%%%#'')())&&)(&*(('))))*((&(''%#%$#$%$$&%##"##%$!""!!"##"#&$#!#" " !"! ! #" "#%""###&####&().03300++(&#%''&%&$&##$#"#$%'')*(**))+*,/517534621/13:DvdW_woB3S\\_uW9?A=<`pbafwzrsqpl\2,&+)*(&%$%%%!"#  !#%$&""!"#%&'-'*&%#!#!!<:=?A>??>?>==@>?@C=?=?;A@A@=?B@B>?<@E==>>==<::A>CBEDAAFACAEECEFEDDEFADBBHDEDBGFGI?E@BEFEEFIJGIGFDIDFCIIGH?842-,/,*,()(%$ !!""!"  !!  ! " !!!!!"!"" ! !"""#$#$##$$#%#%&&(((+)*,-././12324115861446776665675;7988966989789879;<7<<8:998=<<=;<>>>?A?A=<9987;98:7620+'(*'(&#&'$'((&'()+*+-*+,)+,,,,,--,*,,/-..-.032112122,*/.*/-00///0/-,+*0/13//./0104040000/103/220.32./.-)'(&'''()'*('&%(('&%()(%)'+***,,,/.14766531.0.-.+,,,,/./,./*--,1-021202355787584997786774462722541.21--/,,,))+,)*,*'''*'($($%%%&(&()''()')()'(+)(,)('()&#%$$$#%#$#%$#!"#$#""""!!""""#"""!  ! !!!  "!!"#"#$"#"$##%(+112313.+&&$$(&&%##$#%$"#$$(&(((()**+)+-.24875;=510.3>HweT\uvK8Q[Z]tP:?B==?QUNUf|_INurppqsptqtttqpoooomnnommmnnqojkkkjkhkggfhf\KPSmz~wyaPSRSRNQKFPONIT4+1-..+.+.+*,,+*,-+*+,),.+*0**,.+-(1=??@@HLQSUSX[VYS_bG94655665868299:86979::9::>>>=:48?<;:>?;DGGHKEKJVXdjprurttuuursuwtqrstrqqhK-/,0-+-,-.*(*.+,,-,./*+)(*&+)()'''((+''('(&'))%#$$## !# #$#"#"#&$)8867:>:<99,(-584:2134/00/1/01/2164-,)'()%$%'$'""!###$'$####!!&##')(&$&"$"%#$#!$":cH#&$&$#'&%%&I_q`^ftzttsts_0+*())&&$%##!$"""!"$%$"" #&&$&! B=>A>@?=<>=C===@=A>>==AA?=A?>@>A@?@AA>?DBA>=@=?>=>:=>:8:<<9:754.)**.,+(&%%$''*)(()**)+,,+**+)+,+).,,,--*./.0.21232041-,--,1/20013./--*/2/.-/0-/021524211112/42341-22///,,('(('%%&%($&%&''&,&)''&(**(++*---1166994/0/0--/-,-.,,/0-.,-1.0103343251644556947834556554441.01/0-1...-.,,,+++),()()))*(%'&%%$$(&*(*')+)+)(**()*)-('*&'$%$#$#&$$$$##$$%"""$"!#!"#$""!!" !"# !  #! "! "! "!"#$$#$#$%&(+000200.+&'$$'&&$$$$$#$#$%&'&'&(+**++,+(13475:@@22241@IydVbuyJ6S\YWtP>;?B=:PZSQc~]JMxtqrsttusrqonrrqpppnnmnkolmjmknjjkijihbgef[OJRhx~lxgRQRRROPKBTQLRM1//2-,,/*0*,)*+*),++++++*,++)-).,--3:55788:<88;=@=;688=<;>:="""#"%'%%#&(I]la_fx|usrrl`3'((,+,&&(%#!!! $ #($% "!"@@@B???@A@=@?>>>@?A@?>BB?AB=D>@>@ADA@A:A??=B>AA?EABG@EFEHFGDFCEGECCCBEDDEHBIBFDCBCFEGDFGFIEHDEGD@EFHKGB;/0./.++*)((&##   " "" $!!  !!   !   !  ! " " !#"!#####%#$##&#&$$('*')*+,,.00-/0/1132578553366458597::987686855446858878899<;7<999;<99<<<>:=>?=;<::;9:99;9:/-)(+,-,(%%%&((*(%'*)-+-.-,+)-.+,)..,.0,/+..-0/01342/2/.,-..,/1/330--./+/01/0/2//010432101/02020533033.2/+*)(''*'''&&%&''&)()&)&')))((++-+/*/25997831/-0/,--+*+/.00.../--12009344853348:=746554752472436202131./0-.,.,*,*%**)'&)'(%)%&%$&$&'((*())*)*+*')*))+('(&#&&'%$'"%$%%$$#$#"#"$$#"!#$$""!!!!!!"!!" !! $!#"!!"!" """&$$&$$%%*'013540/*''$#&'&$$%$$&$"$#%&%&(&())*+),-047:8AF?30152=IydXaoyK8S__\qSAA>=A@?A?BA?=>>A@@?>?DACBB?@?A?>?=?BBEGAFGFHEGFEDDFDFBFE@BGECDFDGEJCEC?DBBEEFHHHEEFFCFDFJHMD:.0/-.+,+(')&"$!! !  !%#!!      # !! ! ! !""!! !""$"!#"%!"###$$%%%%&)'))*)*,*,,0.1/*11357:=98:76868868897565256533:557447665986;9;9:9=899;;:=:;;A=:9957679;>75/,()-+,,*'&&)*+*)')*(++/,.+,,./,/)/.0-//-.000.013130230/.2-//112.2/.-/.-/2/11../312024120211.214640202/0/+,*')'()(&%')%&'&(&%(*(&(,(&'))-)-*+42387330.00/.-.+*-1/-0./+0/-/-.,11445/4222634666555568654441./0...010-/++)+*)')'&'%%)$(&#%%$&&&'(%)))+(**)((*))**''&&%###$&"%%'&$#%#"##$"""""###"""" ! ! !!# "#$# ""$$$%"#"$&%))02/310.*'%"%((&&%##%#""&#$'&%'&,**),+,/05:B>HJA51.13=H{`Uco~M5R`\\mV:;6;:?89:52;A:@<;>==@?>=>@>C>@DB@CBAAB?A?>D?=@?B=@@@B=@A????=><@AADDDGG@CEF@FHFEFEFDDDCHAGBEGHHBBBA@EFGFEGGHGFFBFFEFIHGKC;5-.,.),+('(%## !" $" !    !    ! ! ! ! """"#" """$$#$ "%$#%$&$"'''')))*,---.-.-*/0344583676674978:64533323345264473566756:7=8;;99;9:<<=:<=?>=;:8<86;::9884.,)),.0--*&'%()')(')***-,-,----+,*//-+//-.-/1-12243.22/0-//10011232/--.-/...0/00305434133/41052334//03/10,-*')&)'&%%&&'#&$%&&)+)()*)*,,,/+-/.11596633/0/,./,*(,-./0--*00//230.434342/4158565445777654513/0/01120/0.-++*+**))(')$&')&%&#$%'('(*'))+*)****)-**),(''($%$$%%%'$%%#!%"" !""!""$##!!"!"   "!!!""!! !!#!!!"###%$##"%'()11/321-*''$#&*$"'#$##$#$$$&&''*,(-+***-13:XESKC31,33;Hz^QcnP7P]W]rW;@@><:HSNLa_KNrsrrnrurptrsrqrtnlrnonokojmkolmmmkljhgfgfe^QLUjz~|vveTUTPQNOK@QOPPN6+,-+-+*,---,,+*.*)+*)+**,*.,***,.+1;>?=9:98A@<>9>?BEILIIJLU\ajorsqpuqsursspqqttssqvjN/0-+-,*+-*')'(,)*(++*-))+*(&'))'*%(('(++*((*&%$$## !$ )#$! #!"$$#(5:;::95767.(*6825214/20/./-21,*.))***)&'%%$"#"$%"$$%#%&$""##!$#$%%,&%$#$%&">cE""! $!"#%&$'%&'+S]h`cdt|vrrpoa8-*,<1((#&"#!#$! #" !# ((&&!!"  !>==>>>A=<==>?AB@@??B?@?B@>>>@@?>@@?@?BACFB>D@?@:;;8988;:8:864-)**,//..+''&'))+)'*'*+-,,*--*.+,+..-..1/.,30/23234234.0--0/2000/0/..-,./20100.22101122520004205440/.0/1/,++)&()&(''&%&$%%%&&&))'))())--.--/.2245543110/-/.-),,0/13500.-//04/1603222.33565469473632433443110/-0./0.+*,,+*,*()'(%)((&'%'&&'&'$')''(*).++.*,**),)'&%$%$&%%$&%%%%$$#" ! "##"#!"""!" "! !"! ! "!!!! !!" !$#"#&#!'%&'+.30430/*($&%'''#$$$##%$#$%%'((**(,+),,)04D`JQLC42/55@><7JURN_~~aJMwusspsuwttvrqqqrookpononolnponkilklhfjiifiZMMTm|~ztt~fMSVTTLLI=PPNOO6-./,-,)+/,***+)*,***-+*+-)+((,.,+,1<>=?CEOPQVXSXYWT^cF94946348;883;<:94255;:;;<=8:97;;A>=?<=>B>>:@?=@@@DBAB@?>>@>A@BAEGCDFCBEEDAGFDGHJF=CCBFDFEHEDGCDD@CEGEKFGJIDEEDGDGCGNLE;3,.,+,)+*)&%#$""!!! ! !!#" "! !! " "! ! !  #!!""$ "!"#"" !#!%!$#"#$$%#'&&%%'')))')+,+,,,--,.//32555548757536442/2244334323468673747846889;;9;;999:;::>>9<;=;=;8:@@CHFGKINPaakoquqssqrrsrsttrssrnonlI0-0.-+),++)'+(+))+*-,+()-++(&)')*)'''%*))('('$("%%$" $"&&#"&)%%)&)97;<:99578.),4655232/5/-./.-2-(('&&+)((%'%&%$$""#!"##%$""# " $#%''&%$$0N_F)!$!#%"$"#%#%$"#(%*Tcecb`x|uuswna;0+,I6*&%%#%####!! "!#&'%#!!!#"!!$ "  A???=A=?<=??A>G@C?;AA@>B?@B=@@>BBABDBCCB>?=;>>B@CCEBDDCECEFEGHGEHDDCHDHEICJGEGBCDFFCHGIIMDGGGFEIFFDIPND;2//0,+++))'#$"!" !! !##!!!  ! ""#!"   " !!##!""!!!" !"$%$""$$$#%$%&%(')))+'*+,*+*,/+.0/21453544:45423323/41633425444418536657675;;:;:9;9:::9><:?8;8:;9::97;94350.+,(*.00/.--*(*'*)+((++-1,-,.--.--/.-/,/./.././633343442///014//1.13-/00124132/1033154723112023443/131/,.,+*('''%'&'%(''&%'%&%&'(('&)'*))),,-01463632//..00.,,.1/23011./..//225453311/.143455587364562453200/-/,0,-,+-*****,)*('(&&'(&&$&&'''(*)'))*)+)+**)+('('&%&#%%#%%'&'&&&%#$"!! "!####! #!!!! !! !  ! #!! !"#""$$#%$$&&%(,-1032.0)(&$%(&&&$%$%"""$$&'&')(++,.+,-+4IShORPF91364<:GRMQ[ycKIqsqqstvusttrqsqsoonnrnonnoommpmmojljiiigef^PNRiz}~zst~hRURPOMPJ@NQNKP5.///..,..,+*),+*/,*)+)+,,*(+')-*+)/9=@CADJPQVZXZZUU[bC635631459757:;>86499:;=78<=<;:97;=>7>;?@FCHKHGLTdcjpotrqvrrqurrvsrqtutpnpH.-0/,*)***)++)++*+,*+,&+)+++()((*)'(*$()&(%"#&%##%#"#$!%&$%$$#%%&'58<9:87737.)*266421126//1/001)(&&%')&'''&&&%#!!#!##""#"!"!%%#$#$%''$'6R`K-#"$""""$## %""#%$%%)P]dcffv|utttqe;/+2J8,&'&##!$$$##"##%)%$! "!! !!" ?=>=9?=?@<@>@@BA@@??>>EDDBB@A@ACA><@B??DDHECBEEDFDGCDGGHCDECEFEEFEEFEAB@DBFKAFGGEHDEFHGHIINLME<2,-,-*)))('%#"!"! ! !  !!!!""!!! !!  !! !!!  "! " !!"!$!"$#!$$#$#$$$'%''(*)()(*+*+,+./1,130744341622012131041151436735456786758989;:7::8>999<7::9><=9;987897732-01-*)')(/14/+0-)*)**,),)(+.-*)++.-,-1..0/1/../-1-641443250011012.01/12.31102332-11142243205/231101462-/2-,--+)(&&&)&'&'%%%$#$&&%&&&((')(***,,,-/15853301/../+,+,../-30/-./0.02342451/100-/41144543246442321001-0/-..,,,-***+)(*''('''&&&&&*&((()**)+(*(*+,*,,))+*'&$"##%#$%&''&%'#""$""""""$"""#"" ! "!"! !!!"  ""!"#$$#$#%$%&(11343//,*'%%(&##!%"%##$&"&&('*++-)+,(,+9OShKPPB;3232;>@@CIOTUTSVWVR_ZE97555437978598<8647:;<<8:;<;79:8?@=<;<;?GHCIEGOO`cgorspsttsrprrtrqrtqrppsJ,+.*+,++(+,++****+++,+*++,-+*+++&*(('%&&&'%$$$$$#$##"%"%&'%"$##%'$579:<;974=***4570201/73/...1/)'&'%'(%($%$%%$#!$!!!"##"#$#!%#$%#'%&+;S]F.""!$""!!!! # !&!!##&(.QXfbhfq{qstpoc72.3E:+)&$$"$###!!  $%)%""    B<==>B?;>;?>@@B@A??C=A<@AA@>A>>>>@BCDDCFF@ADA=>>AACEDAEFECFBFECDDIAEEFABEDCDFHDAEBACA@DKEHFFGGBFEDFDGIJLKD841.-..)+(*)&#$%!" ! !!  " !!!# !!!!! !"!!!! ! "  " ""  !!! !"! ! "!#"#""$"$#$&&'()'()**,*,--/.01024475544012330//10244141424544655887975989=89;7:;:;:8<===@;9;66:7755720.+0,*,&*(-2611/.+*)),++.()*+,+,++..,00/1/.1-.+./3366545543.//,.101113132320.20351330403434672113223841//0/.0+*')&'&('(((%%&&$%'&&&&'*)('*))*+,-,-248577321/,-+,-.-.0/0/--121514143211/0//,.//074564157231211001/11///./),+,))'*,&'(''&%%&%&(&()))),+-(('*,(**)))*'('$%$$$$%&#&&'$%$#!"#"" "!!"" !!!!"!" !"!! ! !"## $#$##"""$%'(124420/,(%'%((%$$%$$#"#$$&''&((*(*++,-'=OUfNRLF600317Jz`T\f^8L\XWlQ7>B>=MONPO4.0+,-.++.,**,*(+**+(),*++)*)),-,+*/=>>=AAJMOQWWZVXSZ_G2476454576;7;<;97768::=9<;@<58;9<>=<<=;>DHFIFJRN^chnrqqrurstqrurrpsqsrnmjE1,+*-*)*)+),,++*-+/3--+(*,,))**('')'%%(%%%%%'%$#$"##""$!!#"#&$#&('569;98:849+),665420524///,/12+&&&%('()&$%"$%$#$$##!##"%$$!$$$#"$'6UaG-#$! !""! !!%$" "#""#%&,PXg^egq|pppppf=914A:,()#""%#$#" " " "#&)%##!#! !$" !!DC=<>>=?;><=?@?@A?DAA?AA@>>A?AB??B@?B@@CF@BCC>@==>D?@BECCDFDECFDFEFCBDEBCBBCAHDCEC@DAFFEGHDGFCBHDCEHFFIKJF84.++*+(*(+($&$##" !!  !" # "! " ! # !"! !   ! " # !! #!"####!"!"%#$%$$%'('((**)+-,..*./-001231444302/31.314443553335545626565899986:79:7:7:6:9<<=?::79798275461,.01-++(*(+17750/-,,*+,**()+*--,++.+-//+/-/..--10.346336523//20011051241/0/021215226/102656431222044723/1//.1,-)(&&&%((&&%(&&%$''&'&)*)++,*'**--*/0286:5310,-/+-,)-,101/+/.//353241200/0/--../03452245423612103200.//1./+.*+*)&)''&'&''')&&''%(()-+,--+-(*-+,.+'*''(&&##"##%)''''%&%!"!" " !#!#!#$ """ !!  !!  ! ! " ! $#$"%#"$$%').32532.,)%&&((&%$##$##$%$&(&)))+*+,+,,*;NUeMOQH8/2439@:DSNO[pcLJpsqsrptqstttpsstpoppolpklmmpmlmkkjlhgkfheg\LOQjw}|ms}cQTSPPLOI@QONMN5-,.-+-(-+,+/-*(*)+((*+'),+++)++(++3;<=>BJOQRRWXYXTO[^E536336455787=<;7456;;::8:;;:799;<<<>@=?AEHGHKIOSdejrqooqnlrrsrussrstprrrlI.,.+-0*),)-),(,*+*-,)/+*)))'*)''%'&$'%&$%)%'(#$#"!""###! !!"#!&&&'578;89<7:6.'+3735111/1,0.../..$%""(!%&&%$#$$##"""#$%%"%$#$"$# !3V^G.&"!" ""! ! !"#!"$%!!$$&/Q^k^`eo}ospqqcB828@9,'($#"$""#"" !"$(%#'*1-*('%"9@<@A?<@B?B?A>?=ABAB?>C?BAABFDAECAC@C=>>@BDFECFECBBBBDICGGCAEADDGECEGEECCCBBDCGBGIJGGFHFGFFGIOIC:1/.--,+,)('&%$#"$!"!#!!!#!!!"! ! ! !! " "  " ! !!!"#!! ! !""##!###%$#$%$$&%)%)(('''+.,-1,-.,/./2342432213/30/3303123113536745587957675979<9?=<;849:69777732+,160*+)(+,-36930.-*****-+*,+,++-,.-,/31,/-..1/1210555532331/42/33/3464103/12303532325326135644244575441223-0,+)&&%')))**(&'%%%&$'%&(')+*,(('(*,..176;;563...-,+,+,-0.//./120841225101/1.-..0001343558527531100/-/-/---0/-,+,,**(''('(')'&%'))**,,+*./)*(')+*-+.,)()'&"$$&$%*'%&'''&$$$# !!!#"####!""! "! !!  ## # " "#!"$&#$""$$&&(-14452-)(&&$'(%%$%$$'#&"$%&&*()**.++/*)@RTcQPIE6455388:9<;<<<>AB?;8AROKTofQFlxrsqstwstsrrqqqpqnqqkmojlnnmhkkjkiijigfeeYLIUhx~}{st~}`LVPNPJSG?MMLPR5-.-.))**.,+*+*,(-)()'')+****(+/+*(09<==BHHQTUXXYZXQX_G1253356783::8:9744589=8;=;;?987;C;<8<@?AGIIFJIIRZegnnqrpsprlrqqqprnqqrvtlN.+0+.-+**-**+(***))+,**()%''%#%%$#!$$%%%#%$$#""##$#""$ "!"""$"#'%'5764:75656)&)3244027/84,0../,,'"$$$#$%$(#%$$##"$""%"""$## "1Q[F,!$%$$#%$""#"""!#"#!!("!!$$'&$,O^g`eep{prpplc?410I8.&&&#$#$###!'-;DPZ\UF@2+'#"#$&!E>BC>@A?BBBDA?D@>E?EA@>?B@CBDDC?CB@DACBA@BAAF?B@>;BBBFCEGFDHAEBEDHEGEEADDDDBEDBDDCDF@CEEDJFFGHJEGGECDIILLB:30-.,-****(%""$"!!! !""!"" !"$## $"! "!! !  "" !"!" "" "!! !"!!!""$$#$%&&&#$$%($&''('((*+*-,,,--..///00///0/3/0201/1213333253545535445786989:>:=;A?>=B:A<>8<:996576631/-+(-/0.)+*,,*0255:73/.-,*..,-+-,-,-,/.,0-..112...00/055557310000./321224553///-1242/5333/32321534543448431032/..(,*'('&'&&''))&''%&&&&''%(((*((,**,057877530--,-,+)+..--/0-1,1-031421643.1.---,1022538353572424322.0//..02.../0,,-)(%)(('&''()***.+-+*+()**')()+**+))&'&$#&%#%&''*)'&$" !!"!!##"## !#"" !!! ! ! !!! "!!" #!%$#$"$$$%()/21933.*'&&'*)()%%%%$$&$$%&'&+))*+++,++@TUjVPOE93653@Iz_L^ah:I\UVjN;9=@99AQQHRjePHjuoprqswruprrpnoploonmprnmnmpnlklljckiggdd[NMWi{|~~{vu~zcPSUOSLOHAPOKKL3-31,,-*+,(+)+)+++(**'*),),')'+/,--6>>@BBEIOPPYWU[TPY_K5474231:;789;:<=8968==9:<;=<9878=9;<;<=AHEKJIJNR\`koporoprtoqosoosnqlmpqmH0,,+/-)*++'**(')*+'**(')&&&(%$&%##!#"$#'%#'&($#%##!#"%" $"!"#!")%'2673554876.&)63574051<2/-./+-)$"%$%%'&%&%$##$"$##%%#$%#"&3TZD*%$$%%%&%%##%$!%'"!"!" """###!&%0O^egbco|ttnpoeA915I80+## !+0>GMX^XJ@4)&&&)' #"!"""!CB<@;@ABAC?@BACD@C@BBA@AB@BA>D@>BA@B?A=?FEDA?@@AA>?A?CABEBCFDACGCFDJGFADBFCDCFCCE@CBBCGCEIHKHKIHGDGAFFLJK>;31.,.,*,*&&&"#$""!!!!! ##""#"""#!"! "" ! !!!!$!! ! ! #!" "! !!!" """"$#$""$&&$%$%&%'$%&%'()(*)+*.+.1.000011000/3.32/001/021.1553314743542645:79879;;><>;<;>>;;=9:9874785680-,,+-22/.**++,/177=:110/.,..-+*-++-,-//.///,//1.00000267544445/.000434456/43322-10345331424228675355623:42211/1--*+,&&(&(&'%%))%('%%%&%'(()'(((()*)+043987622//,/**+*-//.00-1-//0/13112410/--.-../01423623520103011+000121.-,--+*))('('('(%&&*''&))*+)*)()***)(*'***)*(&%%%$&&$'&''&''&$ #!#"!#!!"#!!!!"! ! !! ! ! "!"" !!"#"#$#$##$$%'(-13540--)'($)('&&$$%$#%&$%&&(-'*+.1+,,(APVePQMC76433=H|[O^_g=L]XToN<7?@;7@TWIPjkRCmvoptrrvsttqrqropnmonnnmnmmmklljjlljjhfjhhYSMQiw|~~|rpaPOPSOMRG?NNNKK4,-,,-,*))*+*,++,**)((*,*****)+,+*)3<=>DADHOPPUXXURWaZE554560598;77==997757=;9:<;<:7789;>;<=@>AA>AB@@@?ABCA@?DA@@E@DA@ACEFBCAFED?ABCA?>?>A?BBDCCEFDCFCFCFHCHEDECCDAEEFCFCBACFEHGLHIHHFEEFCFEILLE;50/,-++,*($&$ !!!!!!##!!! ##"""! !! !!! ""!!!!""!#!#! ! " " !! !##$""" $$$#$&#$$$&&$'%'%&&(),**,,/,0/.0/0010///-1.00//1130021243341636447254378886;;899;<<:>>9;:77::5979544/-++*-/10-*+)),/2478976200+-,+,-,-+,+,..,/0.-//1000/11/386648531224/351132341430003535514446533534:74448874111/.-,)(*'()&$$)%(()))))&(&&&&&*'&()')+),/63:77740.0-.++**++000.-//.///253364540/+,-,./11325333544622.00013210/.,++-(+*,*'*))(()(&'&(%('*)*)(*(+*-++))***)((&&%#$$$%(''&$'&%#%$ ##!%#! "!!"!!!" "" ! !""" """# &%%&$#$#&').32483--*'&&+)($'$%%$"&$$&('))(*+,,+,,)BNUeNRND73246>Lz]P__hBGYXOl|O;;@@9<==;?D@@==@?B=@A@?@@?D@C@B?CAB@C?@CGACECFCBFDDCCBBA@C@?E?DCCFFCGBDGFGFHJEGEECCBFEHEEHFCCDEFDHFGFHEHGFECJDGIKNC:5/1--++)((%$"#""!" !!"!!"!##"#$$""!  !#!"$"" !!"!!!!  !$!# "!"#!"""%#"&##$##$#%%%(&&$&&()**),-0.//0/30,.030-001..1001.2-31422103526267536656757:<9;;;=><>;<:<=5;69:4:244.+.1*./21+*,,*)02479;;95011.+--/-,.+---0-.//1/2//.0/0/14476675241110364533434122283734324516655767834556862010.../+*)(('('%&&()(+(((''%'''&'%')('*++--33187953./-/,+),++/0/0,.+,-/103/1524-1/-,--.002444667944531/1102..00.-..++-+*+,&*)%)))&&$&''(**(**+*(++*++-,+)))&+)(&$$""#$)(((%&#!"# #""!"##%"!$ ! !!! !  ! !!!#""$!'$'&$$'%)(*.136840/(&&'**)&&&%$%$(#%'(''()*,+++**'?RTcQPNE96378>Ly[Q`^kHC^\XlO;8A=><@MPLPfiVEiuttprsurssprrqoqqnlnmmommmmllmlkljkhhegfd[JNOfy|}xnw}~`QSRQMKLK;JLMQM0.-,***++*,)()))*****+2'))&()()++),4:=BACFKQTUVYUVXR\]C7534433:=8:7>=?86997;;99:8=?<87;<===9<@DGEGEIHJO\ajnrqhnsoqprtpsqoqklkrpdD1..-,.,+*--*)(&&%''$'(%*%(%%##$##"$%%"$&%"$"%""$## !##%" ""$#$#!#4373475805,&(0542213.0./.+,/-*'#%(&'*'(%%%$$"!$$$""5OZE(#""!##%$+$&#""""!" !$#$$$"%"#! !#$%'0R\ifadk|swxzzmf\Z]G91)&'$#"##!# !" #$%%"!C@@>AABABE>@C@AAAADBDCDBECFDEHAFC@EFDCHDABAB>?DAB@@EBDFBDEFFJEIGEGEGEEHFEDHIEGFACGCHHHKKHHHFIIIFGLKLB83--++++)*('$#"!!!!!! "! !!""#"!###""!!"#" " !! ""!!"" "%" !! !!! !"!""!#$##"#$$$$$$#$%%&''&&')(*,,-*0-./.1.01./-//.0/0/13./20211062101322545564775875458:;:99=:=;=8:87979:4552/-,),)..2/++++),02337:<97122.,+-//./,/..//0102.0021122216633487551023472511145035162866434427549676734857853243///.+*+(&&&%'&&&&'((((('&&&%')'))(')(*+-06699552//.-+,+,,-../1../011.03/5444202++-,-//246443352325401212.0/0..--,++**,'*(+'')&'''&&(()++*()**)+*))*,,)(***'&'$$$$$&)*),&'&"#$"$!""""!! ##!!! !$ "" ! !  "###$"##$%#"'%'(*.44761-+'*(%,,'%$&%#%#%%$#'((())+,,.-)'?RUgSSQG:2/48:Iv\R^_ziCC]ZXlQ;8>@?9=NOKMelTFertqprtttqrqttooqppnonommmnlmkmklhlkkjhgffYQNTgzy{~zrw}dPSSQRMPIANNMQM9.,-++,,*+**)(*('))**+(**)*,*,+))(*4;;>BCEJQRUYY\WVT_[D433636:8>77379<7563<@<:;<>=?:5:;@?>:<:@AGHHFIIHQaakkostsrrprsqlsrqqoqpqskH-.,,-+)*,*))*)'&%#&'&($(#%&$#%$###%%$$"$##$$$#$###!$"""##""#" '&$$3656673937-&*1524007-0-..+---*(%'%(+&('%$&'##"# $4S`G*'#! "!"#&$%%%$$"$%"#"#%$$#&#$## !#"""1QXihgr}}{smlcG31/J:20+'&"!"#$"""$ $%$$#"!!" FBB?@@<@@@DCB@H@CBDDCABD@BBABADDCCCCGCCDEACDB@EB@?BBBAFDC@EDAEEHEEIEFGDDCDEBEEFGFGGAABEEFGIIJLGHJFGBEJHILB;5.-+,**+)&&%!! ""!" #! !"""$""%$$$"""!$#"#!""" !#$"#"##$!!#!!!$#"!!""" "%%!%$$##%"$'$%%%&%%(((()*+-.---.0-/-//+-,.0.30./01300.1220242405325556477454:567887>?7:=:::99689:6977300/+-,,,011-*,-),/25667:>;54211,//0/-.//2//-.0003210243122546789474531412323545645666277245377797867865747983325///.)*(()'%%''%&$&()))')+(()'((&)*(***,-0078986430/2-,-+--0////-,..02242632311///-/,.00452563464624513233400././-.++++*+(+)*''(&%'&)()*+)*+)+++,*+*++***)()($&%%&%%)*()($$$##"#!!"!""""""!!!!!!! !" !!!"!! "%!"## "!$$$&##'$()*-23641/,'*(),*&%((&%'%#$'''))(*)+),0+))>WRfRSQJ:5057;Jv_P`^spI@\WWkK:8@C@:=SNGK_mVBauorqrtstqsrqrrrrnnmooolomnnokkkljjjgkfffdZJKOis{~~}{pp~aOPPMUKQKBMOMLN6,,-++++*,****))(+*)**(+**)'+),),+,1A@CIQQT\XWYVU\\G43352757896:<>:77769A?><<>===9<?@@@???@??@B=D@DFAC@BA@BCB?HBEAEEADEACEDDCBB@@?@?AAA@CDECCEFJGI@CFEKECBDFEBDGHDEGEBAADDGHIGEJGIFGHGFGJMMD92-++)*(()('&#! "!!"!"!! !!"##"#$#$#"! "!!"! ! ! "!! # "!" !!""!#!""$!# "$$$$"!""%#%$'''')('(+*+,.././+--,-+-,+.-////.--2.1011..22242321367526536386788:<99==;9>;;7898955843.--)*(,,.1./*,(&*.49858:;976031*,,/.,./-110/0.2/322.121/13655568542202414342534145546484224635987768677878858400/.-0*)'+&&'&&%%#$&%(%&#()'%')'&'&')('))-039;:8843///*+*),--./11/../00/210302.4/./..+000.40345426842400112410///---,,+,)+))'))'('%&''(*++++,,++***-*,**+*)''*#$$($&&)')*(&#""##$#!!!!!#"! ! !!! !" "" !!""!"###%%!##%').32:42/**)'(-()''&$%#%#$"&&&')*)+,/.,-*@OVjQPOE73145:LyZN\arqH;YSXlL::??>;>PMKI^pVD]wnqprrrppqpptqpomnnoommpnmnknllkijfcjfffaWJMQivz}|~|zpr|bNSPNQILF?MMSLN5,-,+*)))+-'*,&))+*)*)(+,)++)(**)(*/9:=B@CJONTXRY\QO^\G54250368787<:9;63649:=99:=?@:85;>A<;:<>?FFGJJHKQgilrqqoqqpqrsponqqororotmI.++)*()),+()(')'&(%$#%#%%&%&$%$"$$#"#$""###"## # "$ !"$! "$! $$#&-454:62514*#'141701/-.//..-/-)%##%&'')&'%$%$%1V_C+"!"&$#$"$"$%%$%&&&%#"$!"!!!!%/9=LV[a`ZOKZZ_c[[Za`cifh_?476O@40*)%(%%$!!!!!  !"''"!"" BD@A?;@?DAA@ADABBBBA?BCAACBEA?CEDFEECBDCBBCDEBEDCA>?@?CBEB@DFCD@BECFFECCDFDGFDEG@FADCCDDFCFHGHGFFFDGEEIMKC92--+,*)&('&$" !! !!!"! !!"%##$"$##"#!" "! !! !!#! "!!"$""! !!! !  ! ""# !####$"##%&&"&'&')(+'++..+,./.,-,,--./...1//.-/..003313301116/2126345373629667:9::;=<==;999=<9;78702-++)++--.2.0-++*,.13446;?<>7231/,--/-/,0.100100.332100/..56646754502-1/23433565342245424352435665:7686476:8665/0.//--,&*&#(%$"%#%#'&''$&'*&,*()((())((+-306874322/0/,,+,,.01//,-,/.13/11/23312....--0-015032351436334.43/02/0..-,+,,*+(-,+('(&(&'(*.)*,*,++.,++))*)+**,++)&(%$%&&&&)(*(($%#"$$!#!! !!"!!! !! !! !! "!"!" !!""%%&"$#%&'*/335500*)'('.+)'$$%&%'#$%&&'''(),-/.-,)ALYgNQMC84359>KzZN\\mtK>XUSiM:5<@>9?ONJJbnVBZtooqrntrrrrrqoroplomnmolnmmllkkjkjjeeeediXLLShw}z~{tv}~`PPQMOLPG;QLQNJ4-/++++')*+)()),)+*)%(((*)**',(+(((/:=@?DEJORWTUYZWP__C65514647:7689:96567:<;:9;JS\``UI@:.&'%#.PVb``^Xe]T`_h^?974J=22*')($##&"!   "!""! =@A@A@@@?=B?>F?C>AADBCCBCACBBACDCFECACD@HFBDEECD>C?@CBCACDCDECDEDFFDGDABDCCEEDEFFHEHEDDDHDDJFLHEFIFEFGLLNC751.)-))'*(%$!! ! "#! ! !"!#"""""" "$!&###"!!!""!"! " !!!! ! !"! !!!"#"!!###"#$$#"""##%&$%'(&''))&,+/..--,.--,-,/---,-0.-,.0/2/310210023503302322214452467599=?:=@><;9878;78562.(+*)))*..00,--+,*/156885=><:7430.//3--.112021300230203001646585655200/1346523444354643236665745758458636665663/10.1.,*)(&%'$"$##$##%&%%$&&&&&&(''(('((*+/267764210..,-.*-.001.-...-/,.0021./222.//2001-3422542423432612400/0/---.+,-*,)**('()'''()'),-..././/-.+,,**+),(**'(%$%"$'$)&'&'%%"#"%#!!"!!""#""!!  ! !# ! !!!!""" !"!&%%$%$%&&(-32455.+)'%'-(*&&%$$####%#$%&&*(+//0-,+ASTeQOMD76144;HuZH_^ouJF]XUmO8:<>?6?KOKKajWGZrpopsqrpopprosppnlpoomnnkmlmlmfjiggjgehefWPMPku{|ts|~dSQPPOKJC=PLHNH2+++++0(+,,++*)'()*(&'(()'*&))'**))1<===CCLMSTWVZZTR`^>64312375<959;:886458==>:;8C@98:9<8=;<<754K523,(+&(&"#""!" #"$""" F@?@?B?BB>@A@@CEBBCAEDEACCBACABC@AACDHEDFGCBCDDDDA?CEBCDCCBA@CBCCFEDGDGGGGGGHDEFEFBCFGGBGJJJGGGGEGIEEFIJL@:20,),+*()''"#! "  "!"!!""###"#""!#"""# $ ""!!!!!!""!!"!""!#"" !""##""!#"""""##$#(&&$#%&''''(***,-.,*-+++,++,-,,-,-./,014010002121021/.24213545373544789<;<=?==<<9;768894421-+)*''+*,010.-,,,+/3487:887:<<43//.//-0.-0.,/131122310412065787774252212305445454243565431644658559748677665996,33/-.++)((%'%##$#$%%%&%&%&&&$&&'(&(&)))-+.37999474000*,,,,-1130.13/-1000/121240,-..//-0/23226254443312.0010210,.+)+,,*,)*,****(())+))-/2/24200..*,,-,.),,+*('&%($$%(((''%&%%$""!""" !!#"!!  "!" !! "!! !!!!!!!!#"$$##%%&(()0248720,''%((()$##%$%#"$$%%(&&**..11-*(?TTcWPPB96243B<8=JKJN^nYH^tnnoqssqsrrnmpmpnnnmmmonmmllkjjkhhcgegffeZNNOgw~y}}qrzeQPOQQLQDAJMJMF10,.,+,)*+**)()*+,-('&((&)('*+*,+))1<=ACAHIJSRXXWYTR__@13520375?;38>@;63578><;<;>@>:88:;=;;:;>CFEEGKIL[gffmpprorrtvsnpqmstqqmqqmG*+++,+*,(+(''('&&'%%&(&$&%$$$%$#$%%$%$#'""$"!!$ #""!""$#!#!! !!$#%4655331525,'&/324132.3,-++,-+*$%%%&*)'%%%%#@????@@ACAADBCFAABCEB>F?AAAECAEIBBCFDCFEDHGFGC>A?DDDABABBEDD@CEGFGDBDEEFECEFGEECBDDEEHJHIHFGFIGEECHLG=62/.**())))'""! ! "!# """!""$#$$#%%&$%"""$!$##$#%"!!!"!#"#"# !"###"#!#"!!# ##$$$"#$'$%$$$%%%'))(-+--,-/,,,+*+)+,-++,-,,1,.0-0.00/0//332312122240455364445858<==B?=?;;9;95963551,*,)*))*/,.3.,-*)*+/2366797;>;:653/..-..-.0//030023/43/4000475866:743213172555565122134575365546275;6886635979:413.,/0.*(&&%%%&%&#$$&%&%%%#$%&&&)%*)((+*.-026588553022/,,+-011200//00.1/00/133411-,,./.1214524352343425.10/10.//./,-.-),++-+,-*),,,,++.358:;?6640/,+.*.---+)*&&%'%%"'&()(&&%$""#"##!""" !! ""!! !! !!!"##" !!"#%$$##%$'('.127511-)'%'.*(%$"$$$%%($$&&')),-/0/.**?RVcQNO@88343=88;<;>;97;B?><;;863G<7/.-())(')&"!"""! "#!CCC@CB<>=>@?DD@CADCCBBBDF@A@>?CFCADDDFEEBGEEHDFFB??C@?@BAA@AABACCGFGDGEIDFEEHGDEGDDDDBBDEEIGFIFGDFGIDFJKJ@94)-+,(*''(&#" ! ! "#!""""%##"##"!$#'%### #"!% $"##"""""" "!#%$##!#"!#!!"!"""###$#$#%$$&%&'(((*+**+++,-/,.+,,-,,*/--,-0/./.1/33./0122221/13/252535343454679?9?B@A?:9:86558160.)())'(()+*-1.*,,++,*177:8;8:::=993011+-/-0//.,410142210414168677465544410727665653231447333586257689679996776774030/1+,+('&&&#%%#$$$$&&%$&$%$&%'')+(+)+*+-0258;:585311.,-,00110/2/0/5.21131523100//+/2,.0/361723425634304001-3/.00-+---/-.**/0+-.,++-/137@@DB><7201,/--.,.**)'%#&$%'()''*%'&$#$$#""#!!" #$" !! ! !"!!# " !! !$!##$$""#$&'(,12351.-)&$(,+*&&&%$#$#%$$&)(',,-/-./+*AOWdRONA56153;Jz{[M][qzSA[[Wl{L88==:::INEI\|sVBVvmpqqturqquqrqqqonoolonmmmonihikfhihffegfYNNKhz}|~~ynt||^POTSNNNFBNNPMJ/+-*.*))*,**)'+*'+(('&()*)')()),*+)/<>@>?FIORSWXVZZS[YC5434355:;8678:945577?<98;;A>=;6:A?=@;><@CHFHHINX_dgmkptqrqpppnrnnqnkoroonH**,).))('$'(($&&%&*%'&'$"##%"#$#&$"#!#""!" !$""#!"" " #""#$##"## /0133/0022-$'131123.,,,,+(,,+)%&)&,+(&%'#&#Id**07EQY[_]QM>3+'#&"#%$#(!#&""%!#!!# "#$!"!$!"#%!7UYc^TZmynpmll`=831E>9..+)'*(%'&##"#!!"#!! GBB@>A<>C??CBADB?CBFBDE@EACCCBFCDDECFGGBGFADFHHEFDCBB?CABDAEEBFDDEGGHGGBBDFIGEJGFGBCDBDEGHGGJDFIGJJJEKJJM?73/.,,)*))*'# !#!##!!"""##"$#!#$%%$&&$#$#""#!#$$!"#"!##"##"#####%$"$#!"!$$#$#"$$$%#"$&&(')*),-,*,--,+++,,*,++,,-,--011.0.0/-1030342133223033234234444478>=>ACA?>=;86966:44.+(*(*)((*)+.00--,,(,.35387=9989=>>7212./--/210/3301111/131056686776785552462498663443151872466587979<5::69788785323...+**+'($&%%&"%%#$'%&%%&&$'%(%))*.++++*/356;;635300-+--..001/22-3:-//10132500..00//,1.0133536544332501000.010/-./,/-//./,10.//--,0669>CGKHDB<722/11/0.-,+*)(&)%$&&))(*(('%#""!#!#!$#%#"!!!"! !!"! ! !" !!!"!!" #!##!%$#$$&))/86651/+*&'(++)(&&&$&$$#$%%('++,.202-(+DTYcVTRA78345:Ly{ZG]`oVBY\Rh~J88<>>=:JSKH[}uUDVropqqtursqsrpqomnmnqnqlnkmmlkhijhfijhidegXNMQiy{y~~}wot{~}aSPWQOKOF@=@>DJQPSVVXYWW][D65243579;998:8976778<;6:;9@0*&"!!  "%!#%%%&$"$"!##"!#"!!!#%##%%%$'%4S[fbV\mzllrmgeA541E<62.*)*'&&($#" # "! "  ?EB?????AABABACD?@BBCDB?<7231..0/31/-10233322/2326768:5765964531323632756223334935586675787575896968634210-/.**)'('%&#$#%#!$&%'''&%&%%&&(+**),,-,-36799675300-*,*+,2.0/./.0..0/01041220....-++002013352324301300/.3//01-./..30/2010///0/.0358<;CIKMMDB=996543.10./--*'&*((((**++)'%$%"#""!" "!"#"#  "  ! ! "!"!!""$"$$%#$$#&((-257631+*(&)++''$$%&$%%$$%&&(,,,-0/1,++COWaTNUB53132@>>;MPJIWzuXBWsprpsrrqqrqpnoqpopnmnonpllknkklkijehgggfd[MMTh{~z{yot|y}bSORONLMDBLPLLJ0,+**)+)*))))*(,*+)()%),))()))(+),,09>=BDALQNUXVZYXT[_A654613479758?@:8645:F@;6:;@:979;:;89:;7ECJHKNLNUhjilopqssqorqprlpopprqjsgJ,+.((*'**%(&&&$%%#&$%%&&&'"%$#$#&% $ " $ #"##$ $!!!##%#!"""!! %""#0421432302)$'.1130/2)/+**+*),,$$#&&((+%&"#'#"  #!" " !!&##$$#&$$"%"'#"" ! !!!"$"$$$#"5WScaU[kwknollgF85/F>330-(&(%%)&%$"##!" EA@AABBA@BB?ACBCCBA@EDBBEEECFECGDFEGIEHFEFDBGEDGGCE???ACDBACB@DDFEDFFEDEGBFFDGHIFFEFDDCGIHHEEHEGFFIFGFLGIB84-2+.*+*))&" !#$#"## !# #$"#$#"###%&$%$%%$%$#$#%##%####"""##"###$#"$""#$$#"#"$%#%%%%$'')**+,+).))+--,+*-+-+/.-.,0///.0--000.0/0/1/.11543533238525575549;894131..,,*++*(((()**+)&$$"##$$"""!!#! "  ! "!  "!"""! !"""$"$%%#%$)*-24854/,))%*,)&&%%%%$$%%#$'),*.,..0/-*,AQXaTONB53445:KyvZFWWiY>YXRixH;8=?>;9NTLJUuuXCUwpprsruqqsrrrqrnqpmnonmokmnmkihjiiffedgkfZOJUkxz||}yps}~~`SPPRMLMC?INLOH-,/,--))),))+*'(((('(''-()%&'())'+*2;?>CHGOPRWWTZW[R\^C64522463686:=?:74789>?89;7B?989<@<==<>;DFGEHHINSbclkmoqrpqnrpotpqlrqpolplF.(,+*)(*)'$%&&&%%%%(%%$%&%$%$$%$&$"#"$!!#%$$"" #$ !"!###$#"#"! %"$0223521533+'*/1201/3(,++/*)+.+%$')()')'&%$$$""""!#!"!!#! " !#"#$$&'%$$#"#!#  "#! "!%"$*&$8XRfaT^oxqqokmfB660K<460,((&#(')%%#&"! !!  KCEABABABAAADA@DBACCFACCBEDADDEDFHEGHHDFDBEICFIECDECA@EGDFEBBDEBDIFJGHGDD@FGHGFJHEFGGDEDGGGDCGFGGHGFDGLLJB82.2,,,*('(% !!$"#"!###!"##"&$"#$!%&$%&&%'$$##"!#$$$##$##"!#!##&$%"$#"""$#"$#$%%&&%%&%(*+**+*++*,+,+,*+,-+,*-,,/0/.2-1.22-//.01511222342342565344542677:8>=DCC@=9<8867531(''*'(&&)+*)*-0/,+,+++.16977;788:8:?;=5620..230203244200/146416;56575353560533544375555345566466667876:979688768894440,//.-*((&&#&##%%&'&%''%&%'''&&),-,----,,-57<8885000-),+)..10.*+-,0.125421222/..)*,*,-0/13366566621/224/31134606;5::73452242201103379>FGGIHCDK]YVTJ63540./-,,+,)**)(+*)*'&$$#"! # ! !!! !" ! !"! !!!!!!! !"!""$$#$$$#+(013563,,*('*.,)'(%'#(#$&%%%+-(-,.0/..,(@SVfRQND72636>MxvXJ`[gX?YXPizG:4>??<:JNMJTut[GUuprqsrsrqrssrrspprooppopmmmomlihjikijfiig[PLTiy}{~~ylq}`OONQOJNC?LMGKK0./*++'**,)*)'(*))+''(()*+()*)**+-*1=<@?ACKPQUX[]ZYQ\ZG65105275;767=?9:7689:<>BA<97;A<<:@BBEECFBBC?BBFAFBCEEFGDFFFFDIFFHFGCGDBAADBDC?@DFFECFFIFKIFCGEEEGFDJEFFDCAGHFGFGIHHHIGGFIJNKC6/.,,,+)*&(&$ !""#"#"#""!#!####$$#$%$%%&'$&$$$#%$"$$$$#$$%$#$$"%&%&$$$""##"$##%$%(&%&&((*)*)++***((**-.,++*,,+/-,./---/..-./0-412/0232262527512244444775:;9>@@?B>:;868:1/+''&&''&&)()*))-1.+++++04359:;:87<88;>A;;302..2/203013210.0652176858:8465560464973667443243578579797:78778877789:883.3201/,*)*'%&#$%#%%$%%$&$'%"$#'&)+..-0,--+,/2578674321-*,++00.-.+-+-/0/10115232/--*-+*,-.343226673446442102558887>>9?BFLOPSXYZ[YU_^E11332487;978;?88166>??>=<>><9878<@DGFHHJJKUcdlmmqsqnpsqqrsrtqorrqprmH..+)))()&''$'&%$%%&%%&%&%''!#!!!$%$##!""""""!! !! ! %$#!!!$"""+/213215.1-&(/102-/0.,.+),+,-(#'$$'')&%$#"$"""!!# # "" ! $!!$$$%$%#$!! !!#!"""!"!$!#"%!$:XWa^\_hvnmnjj]A571H=58+*($&'&,))$#$$ #!!!@BADCFBB?DBDCDDBBEIFED@DABFDBFCEBFEDIEECHDIFDEDDBFCDEEB?@AECBDDDDEBEIKFEFHHEJGFEIHDGEHDFFGJJGKKFEJHDGJKKMC63--,'(')))$#!! !$#"#"!#""%"$#$$$$#%$%&(%#"$!$$#$%###$##$#$"$&$&$$$$"$"###%#$##$##%%&&'*)**,+++(,*)*,**,.,/-.0--/.--..-,/..0.1/1101333126413243455425459;::7674/*'%&&('%'''%'))+02+,+)+,1457:99<9:;;9;=>><332/2.010333423/-051238977787957503424744445363433576866585737;4:<7967889:6052,0/,+))&&'%%%"#$##%"&#$%$%#()+/,,(/.,,/0257876;65.4,,*+--/1.--,,+,0,30044210.,-*+,,..001.34534132312124498<:;;A=?>D=:89100/0/11043578>?CA@DOl|}rT;75401--*+,,),++,-()+(&&%##""""!"" $ ""! !!! "!"! " !!"#"$#"%$$$%'(0577731,*)%*.*'*'&(#%%#&&%'(),-+,00.,*+=RRgRTRB445349KvzVM]Wg\CU[QktE:7<>A;9HQNMWtv]GQsnoqrqsstttvrrqporqqppmonmolkkikikhkdfdegYMQShx{x|~~yrs|~~dOQSPMHOH@OKIJC..0),*+'++*(('(')*)+'('(((&&&*,+)-*3;>>=DLLSRTUWZWXUe`@33242058;9;;;B<88358;?<<=?:;?BEEFHKEJR^ahmlmorqqrqmpqptmqnsppplH1,,))'()&'&$'$&#&&'''&%$&%($####$! "$" '! ""!! !""!"  $#"" !#" !,3364303050((/114//3.+-*'+,*+'"#&&(&,%#%!"#$#$"#"%"#!$# !!!!!#"$%$%'#"#"!"!#" " ! "!"!';TZ]\WXjxnnmonfD363I<77-()',#&)('##%!  DACCCDDEBDBDBCCC?DBDDFFFBDFAAHBCAFFFDCDDFDDGEDCFDJDD@EA?@CCCBEICFAEEFEFDEFGFBHFFIHFFBEFEDDHIFHHIFJHGJMOPN>81/,++,())'#!  ! ##!"""&%$$!#$###$#%&''(%$#%$#&$###$#$%$$"#!#$"$$#$%$#$$"""#$##"!&$%'(+))()*++,*)**+)),)-+.,+..-.....//-01011113431343142405334557369778:=@A>==:87530+)&#&&('&'%&%'&')*./-,,++,-145699898:9;;;@@?<732400/.11282/.-/5123756749;557524402447764545342368786555699:9;=796:766:6202../-*)*'%$$%%%%%%'$#&&#&$%%&((+--02/-++--4697884320,(*++.,0.-.---0/-/3/53110.-,*-.*,-./304454413412244369<<>>=@;>=?99550.31/-/3131156;9;==JawgG43321/0,,+-*,+*-,**(%($%$###!"!&# !#!!"  !  ! " ! !" #$#$$"#$&'*-226622-+(%++-)(%%%#!#$#%%%((---./-,-+-APOcONLE62234?Lv}RGZVf\@RXMjtK;9:==<9GNJHQv{\GOqosstrtutqruosqoooroponmqnnjlkiiiiiieggcdYLMSky{}y}~~xmq}~aMNOKMJLE?DGBORTTWWZWWb]>032120378758==9687:;=<9:;9JA9:4;G>;=;;=AFDGFILLW_`eomqssrqptoststmpmnoonjF,,,*')((&'%(*%%'%%&(%$%('&$#"##!%$!##%!! ! $!!!! !" ! ! ##!-/043211.2/&%-/1///4+()*+,*,')&#$(()*&&#!""#"""$" !!!  " "#"#"##%!"!"#!# !!  #!"! "#=WV^][]jsmomiieE41/E<72*+*$$$&)'%$#" !BBDCCAAAECEACADAEABD@CDHGCD@CFFEDHGDGDGGHBDFGFDHGGIEADACBBDDDEDCGDFHHGGFECDEBGEEFBHGFBEDHFJJJIJHHGHIGILKP=61/-+,+))'($ ! ""#"""!! #"%'$$#"#%&$&&'&&%&$%%#$##$#$%%&%&$#$&#$&%&$&#""$%##$%$%$$%'%')(()(*+(*+,-**,**+++-+.,+.,-.-/0./1-//300/11141231525566487667966:6<>;@A??;42.+($&$%$#&$&$'()'''(*//,**+*'/13:8:88979:9<9?@AA86221,1212/31/0,1232448784587336443/757777555533378:8:56679:7::886:7887884.22/0./*)*&%%&""$$$$"%$%'$'%'&'((++--*.,.-,.25:5<881.-++(+,1/--1,+++.-0.01-3111,-+---,,-.-0154231345357;57=<:>=<>;<77643010/,-..06:>AECELS_tsY?523000-1++*,(*++)(*()'&%%$%"#!# !"#"" #!!!!!! ! !!""!""! "!!##&$#%$%%'),135972/-))%*./)&%'%'#$#"(%&*)*+,//01/+*>QQhRSQD73/46;M{|YG^Yc[DS^NiuI<8>@=?9GRMHRu_HMrrsrrsstttrusrqqompopppmolmihllkkkjhiihcd[KLSk{}}|yxnt|}~_MROOPKKF>MLJLI2.-*&+'))/)(*)))'+))((%'*)))((,***(3;>;;DGHQVQVVYZXQa]@2/310235?;5:;==8458:<::989C?:96==BDDLIGINSXcjqmnossnmmrtqnqpqqpqmqmH.-)+*)&)''&(''%%&%%'%%'%$%%%&$%##$"#""$" !! !"!""  !!"$# "##",,14240125+#(/21//04/-+*(+)-*-&"!()))(%! "!" ! " #" ""!! $$$"###"!#"$ #"'"!! "!!!#$$#BVV_Y]_dtqokhicD74.K@80+*'%%'&-*%&$# BBAEBBACAACFDAFD@EBFBGCEECEDIBGGEGFDHHIGEDGFCEGHFGGFCCAD?@BBB@EEFEDEGGFAGCCDEFGHIJEFFCGHJIJJIJJHEIFGHHKOH@91.-*,+))'&'#   !!" #!!"!!""####$$$%&&(&&(&&(%%$#$%%$$$&%'$$#%%%&%&$%%$$#&"#$%$$&%&%&%(*)+***)*),+*+-+-+*-,,/-//+,-,.---.,0-//4012/121244475654876488978:>=;41,(%&$$#%$$#%&$&&&&(%'*-+..,**(-356779777:;:<9;;=<:7322./044305120245245:56469634731433434698463563678876778::9;9997683;::85231.0.,-)**%%%$##$$$$$&$(&'%''(')+'++,+*,,,168;7<4611..-)*,.1/14.-,*-./.1003113,/--/,*..2/355636566758;9<9=88:;:<::;:65653321220105:AR_jnnnru~tcSJH<33-.++)*+-.***&'('&$"%%"$"""""!!"""!! !  ! !#!!!"!!!$ " "$%%$&(&((,059524+*(%'1/*&&&%&$#$#$%%)*)++,..2.+';RSdQOOC442259Iz{SE[Z`^FP[SkvM97>???7ENNGMr^JRrsqstvtvuututqqpqqpopoqnmimpljhkmhjfieefg^NKUgz|}}~}~uov|~bNRQOMKPF?KOHMG/+/()**(+*('))+')()(*&$(((*('(',+**09A>>CGIJSRWYY[YP_YC64302274<95;9=:7479:<=>:<;?@;7:=:<==EFJHFIJOVabioopqoorsnopnrrpppnlmphG+,+)((&)('&&%%('(&'%'%(#$$####$! !" " !! !" #" "!!" !""!""$!,01030-5/-,%%+1121///+,,*,*/+,$%(&)((&"$"!# !"!!  !!  "#"$&&&""!""# %$! !! !"!##$""BTY_]Z_hzlknilb?540G?31*)($$)$(&%%#"!!?>?BDHBDEE@CDDED@EBHDGEDCIFDFBFDDFDDFEAEGDDFCHKDHGFKCDBBBBBHDCCADFGHHJHFFDDBCGFGFIHHEFEHHGJLIIIHHHHHIJGNJA812,+,+*+)'&"!!!!!!!""#$#"!#%$$$%$$&&%')'%%$##$%%%%$%%%&%&%#$$$$&&%#&#%$$%#%$$&%(''()*)+),*),).*)+++-,,..//+-+,.1,.,-.././.1211204331854565787579:::9:;>;95/&%%$$$!#&$&$%&&&&'%$%)*-++,+))&-346378797:49:7;;D@A:431//0331441/.25328676569;55462453457678579455443569:659568::9;;89798983330.02--*')&%$%$#$#$%"%%)))('''(((+,.-.+,,..37977973/1-.--,./,-,++,*-..01/131/1..,,,+,-,,0/6664759;77;>>@@>A<<88969<864746426233344;BT^r|oic]PC41--**-,,+*+)(%'($$$%#$#"!!!!!"#! !! ! " !! ! !" #!#$$%"$+(0176810+*'')/,((%'%%'#$$%&''(++0./.0--,>QQfSPNE74236:MwwSEYW]^GQYRlxI74=??<;GNJGPr~^FPsrrptususrtqsrqropoppnmnmknkjkhkhihhhfgffXLLPe{{x||}~~wkt_OOONMKKE>INHMG/-,**)*+,))')))')*(&*&'+)((',''++,)/=<>@ADJMPSUXSXWP]\@27422382996;;E;65676;;997;B<::98>?=>=::@CGHFFHHTcbinqosnqrqtpqosqtpsoonqkG+),)'(&&'&&&%%'(&$$$&&&%#&"#"$## #"#!$!!"! ! ! !!!!"  !$% .1.1010412/%#+1210/0-,.+(+).))$"%&%%()%'#!$! !"""!#!""   "%#&##""# " !#   !!$##$"!#%BWTa_X_fuonmlkbB53,C?51--)&')'(%$!!C?BACDEACBCDFBDBFCGHGFDCCGDEFEHFEIHFDFFDHEEDDGEEHGGIABCACB?D>DFBCDHKJFFGIBGEFHEHGGCFFCDFJDFGIKMKJGIKGILPIE32/-,/*)(%(% !!!!!#"&!"$"#%#%%%%%&('('&%%&%$#$#%(&%#%&$%&%$%%#"'$#&#%%#$&$&$&((')()-(('*+*+(,*+*.*-,,---/-/-.--,-,.00./001141303223532565789:=>=<<<;<<;=975.)%$$$$$"#$!%$&%&%%%&%&(..1*,+***-113785869978;7;:@AD=61432143/32.2147123568:86:4158236355767868:786264::9776;9569:88:;8879694431/.0-,*'('&&&$$"#$&&&(,'(**'())+++,*,+/.,-13988;3515+.*-+-0/./*)---//.0.012110//+)*--/-//2756966979>=?BB>?;:59;8;>:;873634666;7757Ocu}pbN=/0,,-,*++*+()&&%#%$%#%"!#!!!!!" !! "! #" "!# ! """"&%"%#"+*,06854.,))'(+**&%'%$$%%%&%&'*-,-.,/0-,+;RRdPNN@40036=KvtSAXXZ^AOXSnxJ98=@A>:GQLGPpcOPvtutrsvxuwwwwtqroqsoqsmikefhiielbghgfhccgXPOTivzv|z|xnv~~]OQPOMJLD>JLIKI-*,-*,)()())*()()+'*)%(**))''$*,),+->>>>@CLIQUUVSXVTa\C-362/258D?;9:A<78774>=<<97C?;998G>;?<>?EFGIGFGOTgdflmmmpppotqssstrntqplpiG-(*)((()'%&%$%'%%%($$%'%$%$$!####!!! !! !     !!! !"$!.002.//20/,&$,320..--+*+),(,*(#%#(&%((#% " !! !! ! !!"!%"###"" !"! !  """""#%@TZ][[_grpmolk`C84.C@80++('&((&%" !>B?AAAABDDEBFAECCCFEFEDHHIHIDCJFJEGKIHJGFDCCJGEEEFFGEBABADAIDBHDGCFFGJJFFDGFGEFJHHHJGCGEHGKIIGHIGFLHHHIQFC9/0,**,)(%&"! "!!$ !#!#"#""#$%%%$%%%'&(((&''%%$%'%'#($&'%%$&$&(#%'%%&$#$&$&&&%&''()(),)*+*+)**+(+*,*,,,--+-,/-/.,-.-.0124213/33334656577888799:<::<<<><>9;;80-(&%%%$$&$%"$&#$%&#%$%%%---)-,*)),//23:5868866<889<>><;541.01513112/25433968;:6865785322344654678557555786697:;89?<;;8=8;6;:83321/,/-*)&&'&%$$$#$&&''*1))-.)))(**,+-,**,-/297<6;63020-/--0///0,-.02///4/202100-,++*,,+-1245589:7=8:=>BECA@88979<<;=;8936378;778985@Oj|ndH:4,**+)-.)**)(&&##$#%$$"#! ! !! ! !! !!! "! "#! !"$""#"%%%*+.23714.,-+')-**%$$%&#%&&&&)*+*--//.0.,*BA==BRNNOo`MNbgggjiijfiehhhgieed_\_VXTPUUWZ[cfkgdefdbdWMKOh|~{z|~yqv}}~~_KTMOIHND@KJING/),***)()*+(*)+%)*&&''%()('*&)),+++2?=>@DGKPRTRXXYZWc]B2523/278?7:9>@;55878E>A78:93+,&'&''#&#!BBAACDCCACDBCBEDECDFDCEHEDFGGEGGKFFIFHFFKFEEJDFHFDDDFD@AAA@EDBEBDEHGEJFGCCEGDHGIIGGFDGGDGGJKJJJGLIKLHKKMLC7.,+*+*')%&# !""!$$##"!!##$"%%%''''))'(&%&&%&(%$&&%'&$&$$%&%#%%%%&#$'&#$%%&%''**)**+)*)*)*++-,+,-*--,.,-//.1..///002.33/111313566456789667::8:===9<::9;975,&'$&%$#&$#%&%$"#%$%#$'$*+.+,**+)-137465667569::89::>>A;63102314122017833:687;89965763533448558:9645676889586:8999;:;;;9<:<:943401,/,+)(*(($&%#$#&''*,.-02,**('*+++,+*+--2257<9;752-.**++210.,.,+*/11120312131/++,-.--/11848;9<<=<:=?DC@B>:9<7:<@>>>><97296797:;9;=;IbsrhE811.*--,*,,+((%%$$%$$$$"#!#!!! !"!! ""!!! ! ! ! !"!#$"$%$(,024787.,*(%(-,)'&&$'#&$&%&%%*+,,,.00.)*?RPcRNQB65234:;7<<;6585;EB:9<:A>9:8@IDEAFGITbdhpoqqqsqpksmnomopqkjmqjD,.**%%*(''&&%%%'''*&&%%'&$"$"" "# ""!! ! !"! !   !#" $ $"#*0/1.21442/%%1.0200/,)*(*((')(%#'%&%('%$" #   ! !  " " ##%%"$!#!!#!! $ " #"""##%$(FUYbZZXezoqmnhbC<42@?::/')'%'#$$"! FDCCACE@FCDFEBDCAFCGFCEGFGFEFADHJDGEHIFDEGIGFCEIHDECHHCBCF?CDDEEIFHIFJGFCFGFHDEHGGHFDEFHLHIJHJIDKHMKGKKQLF60/,*.*+*%&$" !" !""$"#"$$&##(%$''')&)&'&''&%%%'&$$$%$&%%$%%&'%$%%$&#$#$$&'+)(+)'(),**()*),-,-*,.,-/-1/,2-.1-./0.102010/35153233566788;98;8:8;<9::;9>;9786.(%#%#$#$###$$&$%%#$#&%))--+*))(+-10145686566<758978;:A<:563410034,02585385;97:<754574454668777:7748666919676::798=<:>=<98:;:6241....*)(%%&%%$$$'(''***'++),)**())+,+)-,+-15469>7922.)-,,002000..+/20231104301/,.0/,,+.1158;@;==:<9=?FEFFA;;=;;GD@CBEDOJFD=:=898;;;;;DQg~tbH430--,,,++0,+'(&&'$$%$##$$##"!"!"! " ! !!  "! " !"!"""&"&,),025570-,)&)/*((&#$%%%"%$#'%)*+-+/.1--*@SQaWORF63124:MuvUEWYYdIN[ShmL=;:C?C=GOJMOohPKMRQQZUVTOSSPORPPNQPMGGHJFEEFQXVdiiefgfgee[LMSfw}}{~tos|aTPONOENE=KIIHD/-,*+)+')()))*&('%(%'&'%(''&)'(()(*2:>>=AJGPTQZWYYVWZ[A21412056@889>=:9794:B>9?:=@B<56;:?@IDHJIGLJT`bhlooorpnrjtrprqpnsqmkoiD0(()''%*'&%#%'&%#$%%#')%$#%$#"##!!" # ""!" !  !! !%" !! #)/./12-11-1%$)./30.1).).))',))("&$%%)(%$!"""!""! !! ""!" !# %%%$ !! ! " "!" $ !"""&GRTa^[\gxojpkjfA74/C=81+'*'&(%"!@ABCCCEEBEEBDFDDGHBGDDEGEGEFEEFFIFIJGEJHHKCECHGGKGKIIEDC>B@ECFFFFCJHHEHFDBEFFGIGHFGJEDCFGKHJKGIIIGKHKOJOLC5/.-..++)*'%! $"#"!"! ! #$%"%$)&'')'('&&)%&%&%&&$&&'%&$&'$$%#%%$#%'#%$%$&'&()))))***)+',+)+-,,--+,/.-,.0100...22232313111123245678875;8989::;9=:<><:98.)$$$$$$#$$#'$$$$%$%$%$'(+-*,*,'+,-/2455455668678868::;==53321/134/145764;4988=97958566:478498878858658;5;7775:6:=<==:::96:<953131.0,)*(''&&%$#%&''&*-++0)(*()*(**)*-*,--+567:;;7320.+,+-10325/0-./.+/2/204110/1.*/./..038B;:9?AHCEED:=>?BDCDFFHS[hqol`TJ?7776:>=?WuqV@2050..,,--././))&%&$$"##$#!#!# #!"!! !! ! ! !! ""#!!"#"$$#%&$')*,1247211**(*,*('$%$&%%#&%&)'++./,.00,,'>PQdSPRF63032;JuxUEYZZeHM]RcmH>;>AFGQRRVZXZYV]V923213487><98??=964:9@>:=;;@?<8:>?;>;79;>=>?=>B=;853)$$$%$%$%$"%%%#$%$#$$$%(+,++**(*,-0.43664644857876998:>>95321-1352224664;3689:<6876576376558:6:88658858;88:868699<:;;9<88:;:80520.0,*((&&%%$%$%%&('%)))*()))())),*+,-.0-.24598<9473-*)'+-0102.-..-1//20314142/1-/./0-/05:?B?;AEBDCACBKKKLGDBDDFGHHGFHGGECKGIKJKKIKJKLJHIKPKB82.,++()*)'%" !!" ""##!!"!!#$#%&''(('''&()((''(''$&(''&&%&'$&%(%%&)&%&%$%&&*&(+((+(+*+-,--,+//,-../00.1/.31///.0-1/1/0/20001685566798:8;;;?AC?>?@>=?990&%#$"%&"$%#&%##$"%%%%#)0-))+-(+,0/2545555254667:7878::>=873213324456664:::;::?89884654368678387786577868:<99:979;;88<8;<:9<444/0/-/)(*%&$%#$%&$%)'(*((+**)))*+*+,*.+,-0/2269;>9640,+*)*,/113+/,./01202126321101.0/--/54EH@>740-(('%'%####"$#"$%$# !! !!" !!!! !#!!! "!#$$$$#%&$+,/67832,*)(+0+,)'&'%$&&'''()--,-./1..+);PQdRNQF61221:Fu{RCWWT~gNKXVfqN>9:?CA@GSRNQlhWPZ]__cgdfeea_c^\[XYUPRGGHIHICTVW_cfifgcfbbVMMUjv{y|z|~}}unu}|`OJKKJJOD8GJMGE.,++)+*()*(*()'&'(%'$&&*&''('),++++4>9775==J?;:;@B@=9;=J@=>><>DHHFMGFMQgchlnlqrommqropnnpnqonipgF-+)(*$&'')&#&&$%%$&##%$$#" % #!! ! !!!!   !" ! ! !!#" '1.12001..,'#--02../)'(.*+(+**$""#%$%$%##!"#!" #"! ! ' ""$$$# ! !!   "!"! !%FRV`^S\evikjlffG421C@841*(&$!## AAC@AGCABEDGFB@CDBADEEGCDDDFFDGFGFFJGIIFHFFGHGJHEIDGIEEAA@BCEDBDIFFHFIJGFEFEEGCIGFIJBDCFGJLIKMJIJIFKJIKLMA72--++))))&$!!!!$!"!""""##%$$%%&''(''((&&)))%''%)(((&$&'&%&%'%%'#$%%%'''(*++,+,,++-,,,../0/-21.-../0/--///..00/010+/00002355466:67876=;=9<9@>A>@>==>=<=961*'%$"#$"!$#%$##$$$%%$&(-+*)&('',-/13343435436466755698=<;<66311223365447;8:99>568673465258777:8647788967669:8;379;;:=97:;9961711.-,)''&$$$%#$''$&''))++*(()(,))+**.,*-.+0467;<;710.,++*/0120*/,/.1/01/222120//00,+./198@BEDCH<8:=>A@BA>??>BCHGJDFAAQoyo[SlwdQ813>DDJNTYZVPB1.0)'%%$'"#"#""!"#$ $ ""#"!" """ !!! "! ! !"!##&%&%&'*-/39630**(')1+)'%&%$''&''&'*++*,-01,/+(=RNfQJNC41326=HuwQ@UVY{iOI[SdsO==@AEB>FQTNQig]T_abehkiiiidce\_^ZZRQKIKJFEEFRYUaeeebaedaaWLKRix|zyy}~~~~ykq}z~}aMLLNMFMA;HJLGG.*,)'*'(((*('(('+&$("''()')+(*)(()*4=@>@DDFMPVWUXXVR_];05111138:68899858587>=>=9>?=:5:@F>@<>;<:3343-2/3685568:;;;<>94965558546665898:6768779<:888::9:>9<;<8:=98:647210,,+)''&%%%$&&(&('&()*'*),*+/+*-+)+,,.+..458<;;6631+)-,-0040/.,-0302022044311/--./1546:>DGBGD;?B@FF@D@>=@AIY[[YOICDAYv}~ubHEP[^ZdjoorldWB;.*)''&&$%$#!#""#$!$#""!#! !! "   !!!! !!""!$%$&&'()--240.+***&&).-/.,)'()+***&+-+,.,0-.-*+>@EB>CRSPTkk^Xbginvvtrtrrulhfc`bWUOKKKHIGGNXR`ffhddh`_g[QNQiy{xv{{xop~}|_JOLMJEMB>FKGII,(+()*'')*)'%&(')(%&$%'()&&('),*(+(2>@@=4666:A<9:7:<>:799@@>;>:=CDGICELMS`fjlnonmpnpqrroppomponlpkE.(')('&'%%%&'$##!#"##$$!"!!"!!""! " !! !"!!! "  !!'-01/011-/-&&-1..-,.+*,+(((*)*%&$$$&'%%$"! ! !! ! " "!"""!" !! " !! #! !! ###&76-%&"#!!">C>BCAEBCCEBAGEEDCFEGGFCJEFGDFEEEGCFGKICJEGFIHEFGHIIJJHDGBCDFCDGKJGKIHFHIFEFIGGGHGIIDECDEIJLMKHLKHKLKHJLLD831+,+(+)((#"!!"$ " !"#""##$%%&''&&&&(''''*((%%&$%&$%%&&'%%&%&&&%%&&)*),*++-,,,--.-00//.-/0-/00/01/11,.-//,0///0/.41505244277698887698:5997899796586:6544240(&&$&%$%%$&%&"!$#%%%)/+**''$"',-102021253445687677679>><<652.1/256738;>9<8;:849655796657669:9974557789:;699:<9;699>::<;9<88232/1/*+)%&'&$%&')&(')(''()(*+**(*+,.,,*+,./766=;<7510,*+,,.0/0/---/012/12224313-..05078:;BEFCDDB>@BACAIB==AFRXcnqofcVGLay}mciwuleknvtwwoZ?2+)))&'%$&%#!$"#"#"#""!$!! !!! " !"!#!!!!"""##%'&&').-.++)%*-*$&')''))'((*+36;920....//1,,,8PRbNNOB63332?IvwQ@RTYufGI]RfrL<::@D@BDSSOQiraYhoqsz~yzyxyspohdc]ZVVNOGHGDRSQdfdgfcfcbc\MMPkwz{xzz~~}wnw}~{~~ZMRLKLHND@IKHHG-,.','(**))'''&''*&'(&('(*&)&&+(***3;>??ABJPQZWXVYWR]WC11012167@<79=?=79888B><=<<<=:7:;?=;<:;>CFEKFKKMX`cjmpqnjqomnnopmqomnnknqmD-,+*(&'&%#%%$$$$"$$#!$%$$!!!" !!" ! "     !!%-41/-,/0-/'(../01+.+++')&)))'##%#$*&&$%!! !  ! !! !%# !###"!"!  !! !!!"$"%?WWd]SZcvmglkh`C613AA9/.''$#  BBHDEDDEGGHFHHHFCGFHIJJHHJFGIHDIBEEEEJFHHHEHHJHFFGHIFGDHELGGGCIJKIFKHJLFIIDHIMMJC90-),-)))'&$!! # !!""#"!$!##%%%%&%''('%&'%'(*&&'$&%%'&%&&&((&%&&$"%'*)+-*,,+,+*,//.-,.---../0....,-/0+.-//-...1/21212133:73454687776857655779678446675234164-)%$$$$$%$$%$%$$###$'+,(*%&""%)-11325/3153442445:5879;;A<96420/024527;999:<;:6999778877898:;:87566778<;;79<8;:;<=<>;9<9:<8253./2/,),('%$%%+%'(&&((('+**+)+*)+++,,/*---.146998722..-*,-//100././0003314330151364858=<>D?ABDDCAFLGFGI@ACILZfpr||sicl~{nXFBFZjzy{}mk\?.+*')&'(&&$$"#""#!!## ! !!!!  !!" " !!##$#$#%%%%),.-)+&&)**(&&&#''&''&%%*09:8;1,....+,+,>QReSPOB621.2;HuvR@UVYqiJHZTcrJ<;9@DD?CTRPTiua[ntx|{ysjebXVTNMHEJCSVRceccegefcbYLMQky}z|z{~}~~zju~x~]NOLOKDPG@EKHJE.*)'+)*(())(%&('')'&'%)))('*((*)*(*7?B?AEFHPRXWYZXXW]Y=43312/6=E:;:<>96677?G?<;>:A<:96;?@<=>B@A@BB@CCDEDCEHDDDBHFEEGGICFFHEFGGJJGIHHGIFIFIHJEDHEGECDEDGGDFGHFFGIGFHDHEGEFIGJHHGECFDFHJLJJIMGJJILOL@5/.,,,+**(($!""! """!"##$$#$$'&'&'((&))%'''(($'%&&(%%&((&)&&&$&'&(()+)+)***,++--+-),++./,,+,-..+,-...-,,..110221302534346646846473452695768:598787784564452.)&&$#$#$$##$$#%$$%')(+))&"""&+-,302122323546557599:9=A@984812025632<;:==:<<7:;:959967::7;99;99575?789:9;<999;;:;<9:<:::;5322.1.-&))&&%&'%%&'''(,())(*+(,/)***,*-+-..25659;:333/.-*.//210/,///0/45534184652662;:>==@DASUXqlLK[QduK:::?>D>DUVRQjtmgwsneeZUPLMJGHEOTWaecddcde_eZOLQmw{z}|}~~yls~zYIPIOLFLD?GJHJE.*,*****)()'(((&(*)('&'')&&''+&)+(*5??@?@EMNTUTW\XVZ^\@3422135:?9:9;?;7466@K><9:>==<9:=C>?@=?BAIHJFGIPYdhhinsouqsloqoolqlplonmqiA.''()'''%$%!$%##!"!"""""#! # ! ! ! !! !" ""! "# " '.00/2,/./-(&111..-0*+)'+((**)##''&''&#" #    !  " $##"""! "!!" " !!!"#%:LT]^XVfsjmnjgeH:60;62.+#$#!!  A?@?@?C?A@AEEDCBBICFEGEFGIGFIGHFHDDEJGGCHGHIIFIGLJIIJKJGFFFECIDFHGGFJHGFEHIJFIKEKGIHGHEGEHJMMKJJILIHJKJNJ<8/.,*((((&'"! !#"#"!!!#%$##!$$''&'('&&'(&%%%'&%$&&&%&%$(%&'%$%#$$$''-,**,*))+*,()(+++**++,+*,--/.-.-./-.+,/,.01./002/3823433658847735566769773865977766578750)(%%'%!$##"##"&#$$),**%&'"$'.,10310/023645755767876:>@79201034756;999<9>:889:66666:768:68796655:6<887;8999::;<:::::==;3510///+)'*%&'$'%'&(''(''('')**)*))+*,/*)+*-1556:;;5450,-).//2003./101333746785479<95;=;;=ACA@CEA?IOHDEJFGFLSNM[n~yrmit}ne_H?BEFKC<1.)$#$"$#""$%$##" !# ! " !! !!!!!"#$"$%#%$&',.,*,()..$%%"$%(#$%$$%''+454+03-,-/-+**:PN`QLHC81/15:EutO?YRYnqPFZQeuJ;6:?AA@DSSMRh{qmzolf[UUOLJHLJSVW`effedcc]bYMOViw{{~x|~~wmt}z^NMLMMFKC:IIHHE,-)))*'))'('('*'(('(*$(()(,)((&+%'*3>=C?CDGNQQY[YWVYbZ@2222263;A@9;>>97776?H>;<<=A<:69A=AAA>DAB@AEBEHEDDEEDEGGEEEFFFFIIEHGIHILDGLIJGIEMJIHKEEFCFDDGFGGEIGGGGIHFFJHIHJIJJFGHGHHKILJIHNJJMJLRMF>8-//-+(((')$!!!"!" ##""#$%$&&'')%'&((''&''''&((%&'&(%'''%%&$%&&*+(*,***+)(*))-,)+++,*+,.*+-.1.+--../.,+./0.2.//1232741469877756747889967767766:7877787;>?;3+'$&&%$#$$#$"&#%#'*))&'& !%*/120/22121254575766<47;;@B>@QOOOg~rrΚ{rhbZWKKJJKFOWRaceefecbafZMNSjw}}|{}}}~uku}|[KOOKLFKC>KKGFE,--))*)*()()'&),()(((%))'&(')'(('*)6<@B@AENNQOWZWXWS]UB1200132;?=68=>88556=A;><=>B:977>>>B>>B@D@DDBECDFEEFCDCEEFFFFHFFIEGDIIIJDIKGKKIKJKIIMIIJEEAEB@FABJJGHGJIEGIIJJHFIJHHHHGIKHJJIGOIKLJKKMO;5--,+,*'*&&$ " !"""!"!"""#$$$'&&''%(%&'&(&'&&%%&'$&%%)&&&&$#&%(&((,()*()**)')()))'+*+)))+++--+,-../-,..-,,0-,1/000021556569:>9:;:79:99:;<<;:?7;977888;<=A@DD;.)&&'&##$$###$#$"'))&%$%#$+.-/-0/12134553585574769>><8841313579:8:7<9768874786789:9:65953387==:;<5:::::;>;<<;?::::;753.01,+)(&'%&%%''('&$(&)(*)+,**'*+)+,),*+--/1769:847651/1/.0110..--0236868858:;;8>8>X^\\RGGBFABCAGHDINHICKJNRPRT\u|nfdlkjgbSK4''$'%$#$$$"$#$"#"!!! !" ! !" !! !!"""$$$$%(++.+'"!%""###$$#%&%&&&&&*1862-,.,-0-,/(:SM`NKJB53221;GstO=RQTjrRJSUevG<:;?CAAAQWOTg}wf`WTMMKHIFQ[U`gegecebbcZJMSjy||||~|~xjw{}~aIKLODFJ==GFEJF,.**''((()(+&(&&''*&&&))%('&%,)')()8>AA?AFKOTTRYWZVSa\A04102459>89:CB<45:59A?99<>A=:58=IFC:;AAFDFFFLOJ\ldjimnopoqrnnonrmnkpmjllk?*))%&&&&&&%%"!"%#$!#!##""#"" $# !   ! !"   "!"$--0/010../'$*..0/,,.&(&)((*''"##%&%$# $ "!  "  ! "!! !"!"!>TO\]TUdpikkki`F72.64/-%## @A@?>@?ABFDB@@EBG@FEE@CFDFCHGECGFGEIGIJJEHHGIIJJLJLIKKJGFDGHDEHFKIJGGFKHDHFEFEDHJIIKKFGHGIMLGIIKHIHKEJKRI@:/++,(*')%&#  ! !"!"!""!#$&%%%('&'''%)(('''(%(%&#($('('&&%%'&'(*)*(,+,*())(())+)**)+()+-)+,+++.,-+.-.,,.+-0-0/1410414899:<<===><<;;:=;;A;=>B<>==9;;;>=>@?BED90($$#&#$#"#"####%)(*'&#$))-..101/2223344655569<8;>?9843622068:9;8<;868;726695:89=995815467;:9896:79<8:?<<;:=;<;89542/.1-*(*'$&&&%(&&(&&*)((**+**+)))-**(,++,+/2868=959740,221322200/02024434576:6;;::Riko~y_GGGEEEDIHDFHAEFJMTOINORc|wz}}}ykbYM5*'&'$$&$#%%&$!#"""$"!!"!"!!!!#"""!! !$""#!"%%&).BFC8)$%%$$'#'"$'&#$#&&)*3568/+,230/,/):QQ]NGLB820.28LsvP@SRUhwSFTVcvI=7;>B@?CPUPUhضvr`\URNJKJHFOUTbgdefdda^bXROQjw{|{x}|}~{~{ns~z~~^HQKMGINE=KMGGG.))*)()(&('',&'%(&(%''())(&&')''('(1?CACDDJNRURVXYZV^Z<01531146:989:;95685=;ABABAADBAACABCDFGAE@DIGJGDDEDDFIFFFJIFIEKINLLKJMKGMIICGGDCFGHFHFGHHMHIDEGGKGLIKHGGKHHFKILKLLIJKJHLLNKD:-+++**)(('% !## "!!"!"$#$#%%&&&&&&'''('(&&'('('('''&&&&&&$#'()))(+&+*+*)))()(+')**,+)*+*(),+,.0.,-,+1--0../..1014323557>????@B>A?=<=<@=AA@DABE?4*'&%$$&#$$"###$&)((%&$ "(',--13/.2267856454737776=>B::6210257<8989::67=;687689;8:;569888669;78;6<99;8@>=>@<=:<<=9412/-/+*)''&)''''%&'''(&()**+)+())**'-*++*,-.0379=<67880493/223200,//214434588<<=;;:^mZLFCGLHFDHDAGGHNOIO\OPTi~zyusylj|ueVL=)&''%"%%&%$#!$#%$###""# ! "!! ! !"!#"""!"#%&)0DFGM-%&&#%'%%$(&&$%$&)',4>:<84)/86413/8KMVJF@=841.19LrtM?TRQiyOGZP^uF:89>?BA@QVSSdv̸ysj`UUMHCHGDOSS`gfdecab]_VQQUmy{~{}~~~~vku||bMNMNMIJB=HKGFD,(*()())),(()'''&&%(''$)((&&&&()'*+0=?DABJLKPVXZZ]W\aY?432/155:@96=@A>;:<;?C>>>>=BHDFLFHLXdghhmnsrqlnpmppnkqkknmnujE'((#((%%%$#&!"$$!"#!#!!$!$!!!   ! !  !"" '.0.02-0+0,&$)../.+.*(*('*'('(%'%$#%%$"! !!  !! !#$!!" !! #  " " !!!#>QN_\QTdokiihk`C5.-/+*#!"B?>ACCAAAAACDEEDEDBDFCFDFDCAECCFFHHIHFKIMINJHLJHLILIFEFDFDDEIJHEILKIFFBDICHFLIKKJHGGHKKGLKMIIKJLJLLLM>6.-)+))((('%! ! ! "###""$%%$$(('%&&&%'(''&(())&(#&(&'$&&&*%'*&(&++')*))()+)**)(),****')***+,-++--./,..-1//11//112434446;B?ABAD@:6362154:68:7;<7;<8675679::8;796895:;<<9;;9<<7>;=<<;;buXKILOMIJJHCGMKPQNTSSPNYr{tmlfg`dgddgc^^Z^_bhsro{~~{n_K;,)&$'&#%&&$#####%$#"#"!!" # #!" !"!#"!"!%&'*/0*2)((('('%)'(&&(((%(&(1;998=2-4:52355559@D;:6592/;ItrN;SSTe~NISPbsH;79>AB?@GVQTayle~sog__QPIIIEEDNVU]deddccd\dWQOTjv|z|z||~wsv}~ZMLNMKGJC@KGJJF.+))(&((**(()'(&&((&'&%&&*$*&&,)()'3?22600447998:AB;8764;EA;><=F?799=??><>?>FEGEGGJPZdgenpkloqnollnnlonoomplsi>)-)%(%'&%$""!"%!!%"#"!"!"!# ! ! !!!  ##"!%./021..-,,*#,,..-++)'))%(&(')"$&#$&%$"##"!   !!! "" # $  !  "#"#BTV]YSWdplmheg^H6.+0&%! AA=?@>>B@BC@A>ED@DDBDFCBDDFHCFEHGHGHHHFJIHHHJLJNKJIJLLJJHEIGFFIEFHJKKIJJIGBCEBIFLJJHNHFJGJHLJKJLJLJLKMNMK@:0-+-*+((&*" ! !! "#"$$$#$#$%&%&&%$'$&&%&(&((%(')('(()&'&#%%')&'))))+*((()*))*+)+)*+*)))+,,,+,-,.*.-,0...-..//0.3431543568>?BDCCEDFFKPUY]YXVWSVZ_YRKHFFCA@@=9;99:74310,/0+)&''&(%&&&%&&&&((&())))()(')*,+.-.,,,2566;:765/,1001465410./120156:88>>???B>iqUGOUKKLOGCCHGGJHUTOSYP_uzwg`YPNE>IJZc[ac`daTQPC@IFDJQV_hnrtw|~vfWB.+)('('&&'&#$"$$##!$%%"!!!""" !!!! " "!! ##!$$%%)+//.-,*,+*+)%*((())''&'((399:;8<60;766//.)(3@D=7674>B?>><;F>9;8;HCA?:@A@@A>CACHEEDCEBEDFCDDGGEEHCIICHGEIKJKKOJLKKKLKMJIIGEHFHEFGFJILKKIEHFEJJJGLKHHIGFIJMOLKLLMHLLLMPHC6.+,*)+)(('#"!! " !$!#"##$$#$$&%&'$%#'&%&)&''&''))(''(%('''((&''((+**(())*)*)++*))*+**+*)+(+*+,-,-.,,-.0--1.30203324556366;@?BCBBBINPU\^[_`^ZZYZ_a\YPNHG?C?>@?@=2,(%####"!"!##%)*$$#" #(+/.1/0132442645647687::>?@=BEKOLUYX]YYXZ^\?0233345:>9<8@A;9878;C<<>@CEHHJHMJTaeimronnmmorpornnhmlmnnuhD.'*(&'$'#%#""#!!!#""#$""$""! !"!   !  "!#%,.../)..(+'$*-.-+,+(+'('%('*)&$$#$'%&!#$!!! !  "!!"!# #!  !!%%HQQ[WJU]sfeidh[?1-(%" ! ""AB<>@?@@=>DCBECAABFEDAB@DBEBFGFEEHIGGGJHJGKMJKJLLKNMLMKLHJIJGGFJJKJLIJJIJJGFGHGFJJIMJHIHJKLOKNMNLKIKKMPOI@70,**++)()&%  !!"!!"$#""!$$%&(&&%&"%('(('(')())&)()(((('%&%''()***+)+(('*+++++*+*+++**+**----0--./.-..0-/.0212333575546789:?ADHGMNUZ^[[[^]\[[Y[``aWXTRKKBAB?CC:2'%$##$"$#"#%&**&#$$ !$'*-/0./12466537767696:99=??<762436699;8767896865679888599:7797::97879;;=;:<=;<:::;::9561/+./+,'$)((('&('&%)&%&&(()'(+*(**+*-..////.358:;8872./158?65112-257589:8;@>?D?C?J|`NOLPVNNQXPQPORTOO`XOQUXYblm]JD=?QXOHJSbp|safbbjj[G<:<;ACKZflsvvkgXC,)+'('((&&%%%%%#'%&042,-*#!$ ! !"!!!!"!"!""!$#&"%(*-//.-,-..-+*.***'*)*,.++37:=<:8<<8762*&'&((+.7938829FtsN;NRS]SJVMewJ865>=?B?=>CHKKVUY\ZZZW\YC0653142<;;:;C?<8879>I@?=;@E@49:<>=ABEFHHIHKKVb^kklloosmopolmnnmkpnllohE+),*('$%""$##"!"&#!""%"!!!!! " !    !!%,-//,,./(.'$).--,)*)$(('')'&($#'$#%%$!!#! !!  ! !! #!!#  !"(IQR^ZPVYskglfeaD0.)'! C>><>;=?=@BAF>@?@ABACB@BE?CCBFDGCFEEFHGGKHIONMLLKLMMJLGKHIJEGHGHHLGJMIKLKIIJGJJEKEKIJGKGIKHKLKLPOLLKKIPNK>50-+-**'(&&!  !""#""""$$%'%&%%$&&%&&&&'))*)((()('')'''$('*&**,)++)***+*))+-*(.*+,.+,/-,..-++-.1./.././-0.13744947766573999=CDEQUY`]\b]^[\\[]\^bf^YVUSSKMIEE?B8-(%%%#"#""$%#')'$%!"),0.4123535334865578657:8DA>962252588:;77997567399999887988799<8;::9<<=8<<<<;===><<<:15221/.+)(&&''()'''&(()%)%'&'(')**&))*-..0...*438:;;:55./00013510104037=6<;?H@@AB@A[uVZepvyx~~~zzy{wfahUKWNAAAJRPHCI]d[RVfvzyvv||shXH>AD?5:AL[b`YUE0*/,*)*)*'''%%&$#$&17A<:90#!"! ! !" !" !"!"#"%##$&*+.-/1/.0-2--./--,+/+),.,-1559;:877:<43,((())+1880/54=IozKBJNLVca`bd^c`[WMKMixzzyz~}|}~wor{YHIIJHFGC=FHEG@.',)(*')*'))'''%()(*((('(&'%&(((((&/>;79;8;@??>A@I><:9:C?=?@A>A>C@ACCE@ECFEEFGGEHHGKJIJMOKMLLJMJLKHFJIJLJHJILGJIKIIKGILINJMKILJHFHKMOKNPMMNKNLPOI?7/,,,)()'(%%  """""!!$%%$#&&&&%$%%$%$%&&''()&'*')'%&''&'((*'*)(**()),+),*(++,*/+-..+.1-....././0.0,.-././.23545959863576889>AEKUZ\`__b`]]\][_^_`cc^[ZQSQURTNHC<.'%&"$"""#$&'+'$$"" %)../10123554465778686869>B@<84433658:877798667986689978:9:788::8998=:>9==?@;=<==;=;;8942-/.,(*&''')*((*(((&'(')('(((')(()-...2/+.-467:@<7420.022785212.2358>79:BD@BIB=FnnjeUKVOBAL^aROTjxlabx|}yibQGKJE:9;DDCB>2,*,+***+*'((&&'$%(0=AMMG?/!#!!!#!!! ! !"$" #$##!#%*,//04101.1//,.-,,,,+)***-3459:7797;><7/*+*+()/541../<@`xL=ONP[RGRU`yJ<67<=>>@JOMO^y^W]efhpjihjcba[ZXTSNKDDCCB?C;DHLLXc``aa^a]]VFJQgzyz|{|{~~z|}wls}{|~^MHJKJHID?GHEFB.)*)**%++&('&')&('&+&(%&'('&&(()*&*3:??BCCMPWUVW\[UZia?314.5049<87:@B:8567:=?;?>@G;;;::E=?@<89<=>A?@<=?C@A@A>A?A;@B@@CBBEEEHEGFGHIGGJKJLKNLMJMJMPKJIJJIIIJHHFGIJLKIFFJIKLLKLLIIIGHKLJKMOROKOLKMKNM?5/.,+-'('(&## ! !!!!#!"$#$$#'%&%%%$$&&%$$%'(('')())('&)')))+')*(*((*))**)),,++).+-.+,-.-/-/0//-0/0/0112/0114537766767:886:9;.$#!!!""! ! ##"###""!#%(*-//20.0120//.,-*+,**+,*.0/14864679:=96-)21(+./-210*038UxwI:QPQYSDRSaxG<899?=>;FRJJ\x`YV\]bfdf_a]ZVUORQOJHDCA?B??>AILMS_^bb_a_^[TKKRjy{|}{}}~~{wmt||ZNJMIFFK?:FDFGC,+*))()()'(&&'%'()&&%%$((&'''&)()&'3=<>=?GNTTTV][]XY^[;7023345<==89C>7;757?DA>;>AF>9=7>D>=?<<:=?<=B;B>:>=@???>?><>>@B@EBEACCFEDEIFJGKIHKLIIMKIMMLKKKLJLCEFHILJMOJMKJHIJGMGKKMELJHLHKJMKLLLOLKOIKJNN=5-*+)++*')("  !!!"!#"#$"%#%$"$&#%%%$$$%$%"(()''(&)''(()(')('((**())))++,*,-,++-,--,.-12.0-/0.00.130312124112055386668775689=@JRWXW[]][_a`][\\[`_bcbb]Z\SQSPNMM@4'&&$$" !""$$(&&""!"'*-12126544576765388:;8=:?C<8735476::4777763463343574857324578::8998468:9==;:;@=>;94640...*+)'&'&&'*&''('(($%(('(*&&)'***./02//0.2568>8561/..-/233220/212495=:?EAIH?FmuZR\TIXttfas|{}|efpzqieZ\]\UGGGB933/.03;DDC@@=31,((+8@JT`\M@0&#!! ! !!! ! ! #!""##$&(*/0,2---,,,-),**+++--,+,-/43643344867884,+.-+*,--1.-/.+0BisL:PKOWTGNUdzG73:8==@:FOKD[v]SS\ZZa^YTXWUPMMOKLIFBD@A?=<@@ILMV^_^``]Y`]SFIQkxy{y{|}}|~~~~}xms|}|~[LIMLJFKA=HGIGC.+*)')(*((''''&&(&$&%&#((&'&'$'())$1;<=?DHJUQQZ\V\WX^ZC5621547=G<89BA;:879=D?<=;?B=98;>D@8=;=?EGGLFIKNTejinnpqpoponlpjnnlolnpjngC')('&"'$%#""!$""!!$ !!!""" ! ! ! !$,/-.000.*-#$'.+,,,+(%''&('&)&$#%!$"%$#"     ! !!!! #! !   ,HNO]VQSagfhicPL6)'$<<<;==::863516885564.,.*-''(&())**(***+-+.+.-.--3203213323735339//.-,*)&&(('')&()(((*&%'((*''(''(*,/1001..-252=>;8800.,10334131361546879@B@EC@ZiRQf`T]yogqbTj|}yzxxz|wzz}sa[[a_adaVINPE954-27AHQSQQNFE=;0/@GO_b\OG6&#$!"!"" !" $"$$$&(+.0..,.+)()*).,+.-/0.+,,.05333217774878;6-.*))*+.-)-/.,--6UqH;MPPTUIPRhyG948;=?A=;@A@IMGW\\_^`_ac\QFEWlvz||z}~}~||~vlty}aLJHJIDG?;KFFBD-*)')())))%&%'%'&(&&('#'%''&&')))))2A;:9;8D@=::<@<>>;?=BHFIJIJOY`ihmoplrlmojklpsnkoonjnui@((('&%%$$##%##"!"!" "#!#"## ! " !"!  !" "! !--//2./-**%!$0-,,+*(%''(&&$'%$"$$$##$"#   !  ! "##""#"" %"! ! ! ! ")EPRZXSQ`h_lfYB5/'$>><;>=<<<;?=<;=@?@?>?=>>=?>B>BBADCCFIGAGIGHHHGJKJMMOPKLKKIIJHEGIFJJJMJKKLJKFHLKLLLKKKMJKNKJMOLNMMMJJMLNOJ<7/,-,***)('!  $! ##"##"#%$%#&###$'&$%%$'%%$&&'''(&&)'+*++*)()+)***)*,*.,.*.,-++/,2-...././-//11/045142303425686889767568:;;CJQTUNMPPVWZZ[_ZZ]ZZ`_ce^[YUPPMIC=5)"&#"$$!"!!$$)($#"  !&)0.11/0345386656:8987;7;>@A;77472655/+)#"!""#   ! "#!"!" !"!#""##"#$#&#""$(,+*/0/.,+))''&'&'('%'%'&('(()'++')++++,0/042./-374:=:761.,,10346230222569::<=?ABCTyzvYJVjjd`uos|tNWmnstnlg]_f{xsvrechknkbUMWbbhfcRKUOB7666>KS`lnmeZVPE@HOMWdd]SD;*%'%"""#"" "! !! #"##%')+./.-,-*+)*-+--,.-1..-,---2213026:=9;99=;0(),''&-)*.0-,/,-.SrF9JQNYUFRSjyG:259?@?>@J?9;9=DB:EIFGLKJOS`diinnlopoojpnkkoplnmnkpgC*(,&%&##"!!!#!!!"#$!! !" " !!!"$-/,//+-,.-%"'-++-)*('%'&(())&#"##$$($"  !  !""$!" !"  ! $DNSXYQUZsf[fX<,,% !! ?=;9:>;=9=<;>@=?@@>@C<@?AA>??AAC@AEDDDGHHGILILMLJNMNRLLLNMKNKKIIGJHIIJLMNKNIMKMKMKMJJILJKHJLOLNNMMNMNMPNG<70+---+,*&'# !!!!!"#!"""#"###$%&$%"#&$#%$%#$$%'&'&)&((''%'())**+.*++*+,,.---.,/-,.-1+./.0/20.0-01.-41232445646558988775657:<=@FMQXURLJQSVXWZYZYY[[^]c__\SRPIEA9/'%%"!#"$!#""&((#!! %,*020/43434456747879;::7CHC953410/,(%%!"     ! ! ! "!#&'+././.*(((%'(&$'&&&&&((())+**+))+*--/31453/..446:<<8752-02316743512434:9=B??@=KrobRJVsuoeztv||}`JdgeqzrhaYRSipuxrogTWZ^_`][QCL^gjkc]MTWQE9978CU\gptsnif[TXWWaga^PC:*$%$$"###!!!!$" ! "#"%$&((+/1/3-,,,+*,,,-/.,1./.*-..-0/11388<<<;;:98*'++(&('',..*-/+**cnG5NRPTUKORfzH865:=B?;BMKGUuyYQMONNNQPMMNNGGIEHFG><@?9=:==7JJJUY[\^\\^ZZRGJSjy|{z|}|}}|~uou{|ZHKJIHHH@=EDGF?-*)*()')((((&&$+'((&&&&&(%('(('(&%)0<>=>EEMRUTYW\ZZW`YD2330024:??:<:F=;;:?HB=?>>CKJIHGJKQXgfjnmpjmpmnlppoknomlkkjxpF*)(&%'"#"!$##!!!"# ! "!  !   #&*,,/.-*-,-%"(-+3.)*(&$(('&&%%%#&!#$&#" ! "   !"! """#" !!  $BJLSVNR]ora[H4)* ! !" 798>;;;<=>>?>?B?ADACCDB@CA>@A@ABD@BCDAEDFDGJFMLILLMNPLMMOILLLMKIJJFIKMJJQLNILJMLPMPJMINJILNKMKNONOOQPSQRLC60/,-,*+('*"  !"#""""#$"$#!""#$"%"%"$%#$#"#$%'&%&&($&&&'''**++,-.-*+-+/./-.-//-..2/11-1/10/0/./00102235586887599:8898;7:8;?@DJLVVTOGGJNSOVUVVZ[[\\\\ZYPOMGB>5+"#!$"""#"$$!&('$"" #()14024556555757:75:67;6>@?=;5/,)$"! !    !   !! !! %&&-2/.-,+()'&((&%$$$%&()'&&*)))*+*().031313/./157:=;764/+-014865421136798=?@?CIos\PKNo}rlw}~{WL^dlxn_INhirwnhQOXVbjleWVLH[imli_WRTYMB?985:KVamnqopmbdc`ggf_WN@,&&&"#! " !"!"!!"#!###$&'(*,0..,-,,,**,*+-.,--0/,0--,00/2246889<<;?=9+(+,,&'(*+*))(*,(5RD4OMQS\HMRhzH3737:@>;DOLHSrtYJJLMOKOMLOIHFFGEBDC?=?==;8;87HLGRZ[Y\]YYZ[RJIPhxx||z}~}|}~|}znq{|}~}[JNFIFII>;DDBI?/+()(*')()('((&&'&($%$$%'%)%''&('*(3<<<>CEJPWZVXZ]Y\dX@0423408=@?:?@>@::78=>>@<@;F>;87>?A>;<@BGGHIJGIMYbhemkpooqnqloktlokmnlnnwrA()(&'&"####!#!!"$!" "# !  #!   !" $"#&../1-),/+,($)-+0/*+)'''&((')&$$%&$&%#""" !!!   "#!#!$! ! "!#COKSWSQYjj[K8*&"$#'*(%$"!"'!"==<:=;=?<@@>@=@?BC?CB@A@>A?@@9.-++)))''&$   !!"""####$%#%$%$$%#%%$&%$%$'&%&%&''&%$$$$%((),*+,-+*,--././1/0..-0.//./02201.///.//10214855678899::><><=<;==AFHRTWUKEFDJJPSNSUX[\\YXUROGG@?9/("#!""!"#"!#!&''%"  $',1/33530043444654767:78;=>90.&""!       !$'&,/../+*)&'&%'%'&''&''&)*'*)+)',)+,,/423141./14469:6553/.02376332134589;<>?@Ffn^SRR_|ypvywzKBOZdeZRQSQQM`dvrlbFKW[nqri]XNBTgiqo`ZUQU[IB??2-;HV^gkpmlkggihhgeXL?1)%#""!!!!$!#!##&!$$####&'),-.0.+*+.*,,0..,.--/-0/0/002333544799:::==:0*'*,()()*-)*(+*)+8=8KJPT~]GOSjyD95379?>>CKMANqwYHGGKMJMIJIHFDDBACDA>9:9<77977DLCRZ[X[ZZYUWOEFSixyzz{z|~|}}y{~~xmoz{}{{\GFFHGDI>;EEBB=0)')(($''(((%&%%%''%&%&*+$'%&&)('(&2::>?AHISSXSWVYXXf^?//12/169;957>=87679>A?@;@>L@<99<@?=<;>@BFHJHIJMUaegjomlnljplqinkomjlikmphB*&'&#$$$""#!""!!!" " ! "  "   ! !+--..*,.)*( '*--+*))&('%%&&'$"$"%"&%% !!!   """!"! " !    %DNLWXQOXiZNC2)##"#! %++2/5565.52-.+)**&(&&" >>;=?;B?>B?DCDCBEBAACA@@A?;@?@@??@BEDGFIGIJJKOONMMMJKNKMLIMJIFJKJLGPONMKJKLJMJLMPMNMLLNNNQRSNMNROONQML?7-))*)*'(('$ ! " !"#"#$"$%$$#"$#$#$$"&&"&%#$%%$%&&%'&%$%%%%%((+(')+)..-.0/////0,0/.1//.,0.//0//./01230254498697:>4+##"!!!!""!!$!&)&$!! "$)-1533441342446859659777=872''(&)'+'(((())*+,2;JOHO}ZELOdtA5225:A<><=>@EDLGFLHOY`fjimmqplnpkpillnonokpkvE-&(%$'"'#$!!$!##!$!!# "" !! ""!!!   !  #)--00.--*,&"&.+.)/)*''%&&&&%%&#!$"%%% ! !   "  &BLOQULNY_R@93' &#%((,,*+.3778:<;9?=<:==>=76,4&A?<@==@?@=B?A@ABABCCFADDBC?@A>B??>?ACACDDCGHHJKJHLGIJMMOOONLJJIFLHJMMIMNLMKKLIIIJMNLLLOKILMNNOMPKKLLKPQNL>:/.+*()*'&'" !! "$""""##"#"""$$#%#%'%%%%$#$#"#&$&%%''%%%$%##%&'&&('(+,.,..*.--/,---...0-1-0120/.//40200444546;7=ADGMJIIE@>@<=@BGMSXSSPHA??DFHNOSZZSRTREFA>5,$""!!!!#!" """%&&!! ""')-0037234455339588786759:5)"#    !!#&)...-,-'%('%&'&''&(&&&(&('&'*'+*)*//0073330.-.5247;984451/234751203476:<>>Hc{[T[^]^s~o{uOXnvxsb`cjhc`ZQLB2NeotriYYZW\]KDFC5),5DOZjlpniihdheeg]RC5*$%$!# ! ""!""!"#"$$%%',*34042102-/0123.,-.-/.000.00+3289:9;6;;:=@:<;1)(''('''''(()++-29KMMRx_DJQ`qE4747>@<;>GJCOgxVGAMIIKKFEEFDB=:86:786366?DCOYYWYZWYWUNFHXfvwyy{}}}}}}}}~ukq~{~[KIGFICE=7DFDG@*')'&(*)''&%(&&%'&%&$%%)&&%'(&$('()67:??AFINOTXXW]WS\]<1520125=G967@B96:84@DA=C?>:>=BBEHGIIINV^bfjonmojonnpkjjjmnmkmgwmD))'%'$"$#%$ $""! #!!""! ! !!   ! ! !!!*,/0,,)-(,%#(+)-*-)(%(%&'%'%'##"$$"#$"" !   !!!!!)DKNRTDMS^E<1'$#+1032125274:655199<:::>C?G>EGDB<72>=;><;C@>ACAD@EBCEFFGCDEC?DA@ABCA>?CCCG?DDGIFIGIJOMLNJQQNQNHOMJKHKHLMKJNLMIMLIKLKMOMNJOJJKMLKPQSRQNMLNPNO?:.,--*)&('%#  ! "!"#"""! ""###"%"%$%%$%#$#""$%%%%'&%&$$%%$#%%%&&((&(),++,*,,-1+-..-.-/-0/.//220//001/01251447:>DFKQVXXPJHBACHJJORSTTSNGGB<3($##"!!#$!" ##$&))#"#)+/12545145555546;4867772,%# "     " #$(+..0/.+((&('((()('&&')%'('*('()',..1063432/014349:;75550/4336423255;7:>=Fd{XMTWXS_nzyXj||r||zrdZQBNgrvvlYV^X]_SAEF:,)*8GO^cpoljgeffhf^UK@.&#$#!$"!""#!"#$"#"##(%(*+//,.-/58>;94310,/--00/1....-3777899448:;=AD@<5('')*()&))*)++.25HLMOz[GOLcnB665:A>>7754516736=CDOUXTRXVVVWNFHUhtyyyyzz}~~|}{~vls||u|}YKGHHGCE?9CB@G?/))&')'(&'&')%'%)#&$$$#)'(%'&'&+(('1<===CFKPQVUXY[WT\Z@0021/37<=;:;A?9;69;:C>;;<<>>@FFHELJIOU^diinnpplokkjlklkklmklishG+*(('&#$##$#&#" !!#"""!!! " !" "       ! "!).--0.)/*-(!),+.,*+)(''%&#$$&#!!!$$#"!! !! ! !!" $    *ELLRUPRTYD0$!  &+195<642/03.1--4,0252.56::C>BEFDE@@?A@;EJDMvzTC?IJEKFIIGIEFB??>?=9769833855=CEPSVVWXVVTVNDHQguwx{{}|}}|{||}{wor{~y}[FEGFDDFA7CC?A<,'()(&'('(('&$'&((''$(''(&%&&&'*(&)359;=CJHNUVUZWWVV_U<3..1.16?A;:8?@77576=?=<<=?C=;;39@<;<>?@ECFFILHNVd`imqkklonpmnolnpqokjjgqgF)((''$"#"!&"#%"!!#$$#"""!!" "! #"      "*0+,0.(.).(!'-+.)*(&&&(&''%%&$#"#$"!! ! #! "!    -EGKXZKDJA7-# " $/48C=;021-+)&&'%%"$$%&')).3766?>=><6A??>@@>@?DACDADCECEADCCCEBDCCBB?CEBDBCDEDFFFIHJLNKLMPONNKMMOLIIKILLILJNNMOONLJLMMMNMPOKMLFKNJQOQQPPPOQOMI>50.,--)*'(("!  "!!"##!#"###$###%$#$$"$"##""#$#%$&&$&$%$%&#$$&'(')('(((*+-*++,.-,.,-+,0.-.,0/002/0/00324269;;AAAABAEJLNPPHAACEIHILNPLCCA=;1&'##$!""#""!#%$'&!  "')-///313246545656767845+%%&"         "#%&*.--,,)''&&'('()('(&%'&))('(()**)//138434100.1548;::721.22466743233374Geri[^Z^`^[WQGMLKONJd{osimwkUYiqzvh\W]]_]YHKJ@5,)+-1%$$##!"! "!! #!!#$%%())+./-,+*)(')*4FL;.*,-,.-,++,,00056:8<=543267:<@AA7-)&'&&&))(*+-/1>MLPv_JKMhhC7276:=<>8CICK{vQBALHIHHHFHIHFC@CA?@:967376255;ACMUUSXWUUSYN?IThsx||zy{|z{{y{~{yns|z|XHIIFDEE=7FDBD?/)*'))'%&&(&'&&'&'(('(%'&#&%&%*)'')56=<9EHJQVTX\XZYW^[A201//23CF:99BA58866BE><;;?D<:=8<@=ABAD?BCBCEEEJGCEEEFDCCA@BDBFDBDHDCEFAHFIJGIKJJMKOPNJLKOKNKJHHJMMMMMNNNLKMJMLPLQNMKNJJMKOOPQMLPONPPH?61/,*-,*(''$#!! !!!!""#!""#"#%$#$%!$%##$!#$!""$#$$&'%'$&$$&#$#&%'&(&())(**)(*)*+-*,)*+,/,,,.-.../00/121195779:8:>=;<?>?=@>=?B>@E@BGLKFBCCDEFIHFIC>:<:;/*#!#"#$""#"$"$&&#!!! "(,/.1422146244567695853+&%%  !       !   ""$'+/--.*)(''&'*&+(()&%&''((**)))*+*,1449676220.13488;5931/0337835323356Ad~|iZ[]a^i_WKIEFGHGGHGCEbyzpotmtj[_lt{tf[V^`b[ULJFJA0+*+.;ERRYZ]\dbdddcZTI<,$%"##"! !#!!"$!""$&&(*,1/.-(+-(((''.ATE-*-+---+,,-/01533698553340468;<:4)&(%&%'&((*+--7JMNu`DGOcfC6534?=?;7DLCKuwUF9869265346=ACLTVVXWTYUWLFO_fux||xyz{~|}{}~~wkp{|y~\HHIFHECA6FFCA?0(*)%(&&*'&'&'&%&'%('%&%'%&&%%*('()489::CHINTSX\W[WV__B0412330;>688=<99796;=@9=8<=@@<<:?C@GHGJJHMV]fdlommolljkmmpkpkmkkmiuf?'%('$&#"&!$% $"" !!#!!!    # " "! ',-*,-+-,+("++*.-)&&%&'&(%&%&#"#%#!$%!!"!"  !  "!  ""5LILNHA@;0*#  $,4?B<3*'$  # &!#'$&(?C@@?B@A??@ACDCCECCECEFDGEDFCFEFDEECDEAADCEGJJLIKKILLIRQONMLMMJIJLKKLMJMNPPQMLNLLLNKLOMLMLNOQOMOPSQSNLQOH;60--,,-.+(($#!! !"!!##$"! """$%%%'%$%$$###%#""!#$%#'&%'&'$%&#%#$'&%(&(')+*))))(*+,,,*,.,+,/-./---./,/0222678678976946989;:79789;::;:====@@??ABAA=DDCB?=<;8:1/&#"##""!#!#$%(&%""!!#(--1103324566223656663*$$$!   !    ! !! !%%(+0+-.+(&(''')&'((&&%')))''*+'*+,*,3058895311125769;892011465555655669Ihx|hamrwuk_QDHIGKHCA@=`{xzi}|myshcfuy{rdZVdce^USSJPF,(+)'-:@GONNOUY\aca]\MB4+'&%$##"!"!"""#$$(&((,-02//*++(*)*)''=VA-./-.+.,0-2100/.144865343423856=6,')(&''((*)+,4IKLq`FISagE53/67=<=8CJAJmvW@;JLJIJHIJGKHCA@A@=9767843245=EALVVUUUVTQRMAG[fzwxz{~}{}{~{~|z~rmr~y{~~]HIFHECD=9BBCD?/(()')%&&(&'&'%$('%'%$&%&%%'&''()&'07:>:@I@::<;C><=;;BEHDKGIIOS`bdhlkmqmmmmmmminjlljolvrG*))&%'$%%###!$"#"!#" #""!" " " ! ! ! !   ! "(+--/+*/+.*#(,--.*''%%%$&"'%&"$!"" "$! ! !  !""   7ELJOIJ70%$)7:>702($!AAACA@>CACCBACCDGDFFFFDDEECEGAHGFGFEACCDDCFHFHLGHNGNNLSNPLMQONLKMJJNNNMMMQOPJJMMHLNOONMLNJNOQSSSNQMNOOPPF@;..-,-,,*'%#   !!!!! !"!#"!#$$$$#$%$%$####$#$$"#%$$'$&%$$$$$&$%%$(((''(((*))()')+++*+*-+*.+*.,-/-/0003443546443646346766457488997:7:8::99:9;7;::??>>:<;76520)%! " ""#"##$'&#  #$*,/11/014321455556855,'$"""  "! !"!"  !  " !"""$(+/.0-,*(&&(&())))(&'()()(),,--+.+,2368986522.12588;6764/253576424557:E^qwmdcht~nTFJFIEFCD@>U~{pjsytphfhvy}obW[efc_USRNWG/)('('*18=;<;IGNUVZ^^RI@5'%$#"!! !!!""#%%(()&,..2-/.+-+*+-*,)+@M7010.-./1-130/10/12564314114555994)+%'&))(**+,2IJNtbBGO`nF83379=<<4AGBFiuRC?KIKIIJLIIJIFACC>?9765454646B>BLRUUVTSTUVKAEYf|xx}{{|z|z~{}{{tkp|x|~}\CIJKHCD>8BBDE;*+*'''(())%&'(&(&&%$%$(&)&%(&&))*)+/7;<@BEMNUUU\^\XVbZ@0//2/138=767<;:;:5=9@>=;==F>=;9:@=>9>=?CHFKFGLOU`ejlolojkkiljkkiphnkhlmrmF)&)&'(%#$%#"""!" " !!!" #!! "  !! !   !""*+,00+-.(,)%(++)**'%&&"$%%&%'"! ""!"" !!!" !! #4BHASK;1+!'-8<9/-(#A=?B=@DhzTBAIDIHJGKILIEBB@>@@8665631441=C@PUWSVTVVUXLAHYgq|y}z{{{{~~}}|~xkpy}~z|}~\HEJGD@F>7BEA@@+(((''(&&'''&&'&(%$(%#'$%##$#')'&((-9<9=?CKORXWY[ZYT_TA/-32132=>897=B:9849??B=<89AIA<;@=@EFFGFIJJTaehljjlknrjnminjnijmljjooC()($(%#%##!!!!!" !!!!!!     ! #!&+,,.*,,)+' '(++))''#%%%&$$&'#!"""!!!     7==?>?CCCCF@ABCEEFHFDJEDDFCDEGGDFEFDDDEEGIIKHGLLKGPMOJNLPONMONJJMOOJPLMSPPKOPPMNQLRSSOKKMLNOPOPORPMQQLH<640-/,-*))&#   !" "!"#""##"##"$####!%$!"##"%#"!#"!"#"##%$$%$&%$##$#$&'))((((()+))*()*+,.(0(,,,.-..-20.1/1000232232342234352537453045645565867748865776535411-&##!"%!!!$%*&$"  ! ! %'+,03202141538857752*#$#!%!"! ! ! #"""#!  !!!" !!!!!"!!" ! !! "! #'(,.-0++)*+'())(('&(,))&')++,*++-**-1246:57422--266;9:730.255646343676>:;7@DADc|UE>HIEDHGDEEDFA>>?=?5436331357=@AMTURWRRSPTM?FNhvyz{{zzz||{|}z{~uls|{|]HDHFFCE>9BCA@@+(*('((%&)''%'''('&$&$%$+%('%'('&(%.9>?=@CBA?CCABDEFFEDGFHDDEFEGEFGFHKDGEDDFIJIILLGMOMLNRPQOPMPOKQMMNLQMOTNQQLLPONROPRNOLLMNNQPOQQQMRRSNG@630+.+,**)'&" """#"!!""###$#"$###$$%#!##$"##"!#!!#"!$#####%$$%%%%%(''&&%*()*()))(),*+,+,(,-+,,--../.2.11.10/2111111121112213334443353323626355583345544211.)%$##$!"#!"'&$!! !" !$&*.-1005331532979:<8.+++(((&#&&#!#" $#$ #" "!" !! ""!""!!!#""""""!"#"(')..1-,*))*(()))('&)((((***+-++,-*./123865401..045;8:843.2566995658;:DYisrHGDGFHEDCAB@Dguooeyww{l``dis{liht}yj_S]hjneXNUSSXA.**)('*++35;BE?;857C@?DEBEDCCC=?=?;=5453422517=AAGYVQYWVWQXKACNgsvz{xv}zz}~|z|zylo~~~{}XFDFFCCE=9@??A?.-($)()&)'')&((%&&'$'&())&''&$''''(0:9;:DCLPRTWZWXXV_Z=410//23@A88=A?96367=B;<>>CGB:;6@D@=<==@FGEHEGHPVb]iinloonnnjkiklgkilomjrlC&''$##$$%#"!"#!" ! !! ! #!     $*-+/--)-+*)!&+*)-((%('%$'#%$'!! ##"#"   !!  ;EEIH:.#  !! "-/243'#A=:;5/)'%$%"##!#"#'''))(+-/604.0/11/0.-00/0GB/,-.0/0//00/314454522345766898:5422.)(*'(',,):LShh@IP_kC421579;>6?F>A]yVA;F?;;;86232313537>DEHTSSUVUWSVNABMivxzzz{{}y{}|z{}~}vms{~}y}}~~YDFGEDBB=9CDC@>-*)&)('%'&('&&&$%'(&'%%&%%'$&'()+'$15:;<@FLPUTW^YWVUe[?12103249=<:9BE>5655;H;;>:BL?:98;@@><;=?BEGMKJIPU[`gjjjiiinlnnpnlljkkgilroG.'(&%$%$#"! ! ! ! !!!   "!!!  #)(,,(()++))#),*--+*))&$#%$&&$#! $#!#"!   " ! ! "CDCFAGAGGDFHHHGGFEFGGHGFIHFFDGFJGEJMLLMKNMNONOQOONNMMLKLNNRONPULNPNOOKOOPONNNLMPOQPOQPQSPSRI=631/,0,*))($!! ! !"#"$###"!""$#$#$"#$""#"!!"#""!$!%$##$#%%###$#"#%"$#%%%''$+('((+()*(**)*)*+,+*,,-../..///.00010.13./5/130121112313223434556666754453/233.01-(&#""!!"##'%"! !!    "#'+/033;BDFJLNLNMMKLMMLKNNNNPQSSUVORTVSTTUSPOSSPMKLIKHCFB>1'#%$$"#$! #&((./0-./)*(*()&),*,++(&()(((*))(*')+*,.04351000.-/368855/013358857?7;U~xleYRGCDEFFGGFDCCEECOwmqj^smlxuicjt~uhZL\hlnj]NTVRXV:*+*(((&'*3DPZfe\VKB<1/3774.&%#$"###$$$$&'),)(,0/523./.115/0010,+AG4-012/1,124153384464523458866573512/,'*)((,*'5KQihCKSdjE3022889=4CE@?Z{WC>DDDEEEEEFCAC@?=?<6334402525<@AJTSPTVTOQRJBFMdwxyyzyy}|~{|z|}yxir|{|~}~XJHHIGCF<8A@AD?*'(''%(&&%$&&'$&&&%&&%$'&&'%$'()''&.5;>;BHMOTUVXZ]VTgZ@3.01234>B=99?B<7995<@:;G>;::>?===@<>FGIIGGGIR`_hljklmlkiiilgffkkoliiomH+(*&#%#%#!#""!!##!   ! !   !  !" ),-*.-.+***"'+)+,((%('%$$#$#$%"""%""# !  ! ! ##   !;ECD5' &(.1015"??====?@@@@ABD@EGDEDFGEIFFGGIGIGGCIIIHIGGECCHIHJJLKLNQPQQQPQQOPQNNMRPQMPMORUNQNMOQNOPOPPSMNNNQRSTRQUSPQPJA502000/,**("  !!!"##!"" #""$#$$#""#$$#"##"!!!"!##!$$$$$$$#""!""%%$%&#&&'$')'&'('(*')((+((**+*+(,-,,-+.,/0.0..////0.01251020323/112355634554748535532402001.)%#!"##!#%)&#"!  !"&)-5;@CHEJLJKKMMKKLKIHGLILLJLNNNQQOTRTTUSXVUTWVVVVXYXY\\SKB;>9:355521/2-/.--/.+(()),+)).+'('%%()()(*(++)))+,.-/01003/./13776:72113355543;98]{eUJFEBAAADBAEDEDHCCFDDGJiuk}yWYzxb_r~sbXes{{ocKSbnpodURVZX[M4*)*('&&''1=DMX^__\UMA;0+)&$$#""##"$"$%&))*'('+.133202112212/5/0-:G=..-,..035523945968542553579::85;?>9?8(&'((+(/ENemBNNgiD310378:=4CG??ZyWE@86426325239?>GTTTPTTVTRLBENfvyxy{z{{|{{{|}}}xip{}}{|~XFHGEJAJ=6?A@A:-*(&*')'''&%''%%)'%%&$%'%(&%%%&(%''.7;<0300102>;;87??;6577=<<>EA:97@@@><>@BBBIDGJGNSg`fekignjlpnjlljnjjhlnlrnH,'%#%%%$!!""""!##"""#"!!  !!  !       '),,+,*,)**!')**+()&''%&%#%&##$!"!!"" " !   " !"  ! %7@:2+!!!%,063.( @??=C=>>C@BC@BEDEBACEIEKHGHFHJFJIHIGHIHGIFGFHGFIHLMLLNLKLOPOSORMOPLOOOLQOQRPPPNKOOMQRQORSNNNQPQRRSSRQRQTK?6.-./1/,*+($! #! #!"""#""##$"""#"##""%"!##""#!&#$$#$%###"$#!!"#$$#%%%%%&&''&&&&))'))&+)+*')*,*,*-,,---..0/-.//.//.01143121053452424534546695753546142221/2.)%#!#!"$%&%!  !!"#)2>IJHJGHGJKNLLKOKMMMLLKMLMMOOTQRQTRTTSVTTTSTUUUVWWYXXY]\YV[\[XXYWVTMH?<50-/,,)*)(,+-,+)&&('()*'(*)()(*)**+/-+10.-0/2./5657680/04147754769Ur[TX`gaZMAA@CCBCDFBECEFILJH[{~fnaGmlRXm~tbU]q{thT>XhltkbUPYXZ[D-)('(&'(''*/=A?,)&%(&)&$&'%''&&%(%%($%%%%%%%$%%()'47;==BJLORUYZUWUS^]<131/.14HH=99A>:7778<>?::;?EB9;7@CC?=>=@CDHFKJHMSiedilkonimjljijjijihlljurI,''$%$&%$%""#### !"!"! !  ! !" !!"   "(+)))*++,)(!'-.*,**($(&&%$%'&%#"!$#&##!!     #363+' #,.250&!D?@<@?>>BBCBBDCEBFBHCCEEEFDEFDFHIKKIGFFHKFGEGGHIJJKKLNKNMQOQRPSQOQPJOLMJROQPQKQOOKNPQROSSNSPQSNSSSRSRRQPK<4100---+,)&$ ! " ""$ #"""#"#!!""!"#!"$""""!"#!#!!#!#"$"# "# !!!"""%#"#%%&%%''%&'(((&**))*'****-*.*--,-+,0-2//.//..1011001101013421641314446/432245123001/0.+' #"""#%%%%  !!!!&2>EGDHJHKHIKNMIIKKLOPJNOPNPQOPPTTUVWUTUYVVVVUXTXXY[[YV\\]VV]\\`]]][^WKG>6201+)+((**,-*))($'&))(())())()),*)--,0/0.00-/01776782012143571639Lr~f[bl~xh`OCABDEDGGFGFEDGJHIPlpaiGe{xQEQ_oxqSDPdu{o\AG]llsi[KT\X[S@-+)''''&&(((/5>EHOSY\\RPJB:0'&"##""##"&&&)*()*/.16454141212225362/KI4-/..0211010347654423030048CZ\\XQLIGPK7()*+-*+'%&(%'%%&%#$$'&&(&&&$%&%%&&&$&%(%%1::>;CBKMQVUUYZ^U[[913/2-45<@88:B?94556:==;<<:>;@CGHGGKKKVffhmiomkkkhmlklkhljgilk{xI+((#$#$%"$##$"!%"#"#! !" !# !" ""   !! (**,,**(-**%(,-,**'+$&'%$$&%$$&!!$$### !!  !  %170% !&*-14,$F>?=??A@>@BBBBEFCFBACDGGECDDHEEGIIJMJGJGFJIIGIJJJIIKLMMJMQLPOQRQNOOLLPORWPOVTONOQMQQQTPRRQNRPQQTRQPRLRUNL=72/../-+*)*%! !"#!"#!"#""""#"!"""$#"" !#!"$"#""#"&"$!"##"##""#"$#$%$%&%&&(''&+)&)()'*')**)**,++,,++,-+.-.,../.0110/2/113/134302323223261324454130/00,..)("##""#%'&##  !""'/=IIIIGIIMJIKKKKKHIJLJOKPOQSSSQPTSTXUUUVSWTWXYZWXYY^^\]`[]YY\Z[[\[[^YTLF>8301-,++*,*--+*'&''&'&('**())(*)****.-.-....+.-55888542/2755673536>Zoxrf]`l||_>BCDDDEGFFBFFGHJDDfv\|rE\{_CDIP\nvwp\N;?[nxpR;P_lopbOIW]X\S8++*(+)'''&&"(((*2;DMU\^[XPC8/)&"%$$%$%%(**+-)*//15222034332514244/=N20//124:<99:@C::998>>=DGHEGGGMNUceggfkhlmninkmimfkflkiirqD+&'&($$$#$""%#!###""""!""!""! !      !$(,,+-++,.+('(*,++'%%$''#($&&$"% ""#"!! !!#"" !$14&!  !&$#&+/34)" C>>?AA@>=BE>FADD>DBFFBHDIGHGHBGJIHIIFIHKIHIJIFIJFMJKLHPHNMOPPNRQMQOJMQRORQTUSQRNQQQRSRSQQONRPQTSTQRSQTOPK:82./-.+,))'$! ! "!!!!"#"# #!"""!"""!!"""!! " "!!"!""" ! !"!"!!"#$#$%$%$&'&%&(&#'&&)'()()(-,*,*+///-+,.+-0/0.//-00000220012002.21201/1211224430243/002/..-/+$$#!!$#')" ! "!)7DKIFIJKLLKJLMLLLLKLRORKNMOQPPQPPPSSRSSRUSUVXVXVXXWYYYZ\[^ZW\\\\]\\`ZZQHB7004,+)(++*,,)(('((&&(((+)(++)))+**),---,/-.//255998621133566743596@MNWROOSdwXAC[nyykKFRT]_\MA9*'###$$$$%'--+,),//154653664311/2744,8ME30202331.212/0..///001.251,/,-/-*''&')3-'(,)3G\xGJSkhB2-0068:=6>FAATZ@9ITOORPQOPNHFDDBAD942242/313<=@IQRQSTTURRLAGNevzzyx}|}||~|{z}wnpzw{~}]BIFCBAD;>,&''&('$()&(&%&''&$$*$$%&&%'%%$'(&)07;;<>KPQUTVXZZTX`Z<330/102;<;:>DB;7758:@:;=>DGB887?EHEHMNKNT[aeklkllkmmkjijnlmglmkowqJ*%'$(&#$## !"#! !!"!""!!!"   # #"  "*)+,.+*++,'"&),)*((&%&%%'&$&$##"$"##" !!   !"$''&" !#.+$ $),!"',340/#!FA>@?A?C@BBC>ECCDDFBGBEFGEJKFLIGKJHMIEKJIIJHFINKLKNJNLMNOOPPOQPQONPRSNQQOQOQQMSUTSQRQNKQROQRTUQRSSSOL?72,,,,,*++)'! ! !!!!!"#! !" "!! !"""""""! "!""#!""!!!! ""!#!"$""$##%$%&%%%(&&%&&&((()(())*((,+,,+,+*)....+.//0/0.0.0000003/0124443313354343523442/1/0..-/-,)%!""#%'%#!! $!+;ILIIHGJIJIIIKIJHIIKKGGJJJKLKKKJLJLKLJKMNLNOLPKKSPRQPTWUTVSSWVVYWWXYRSHDC622.-+,)+()***((')''')(,++*0+.+,)*-+--//-//.1-0/67985403736:66654879@IU_k{zH?B@@EFFHIGHDEDBD?Cr|`wG]fGTcbld_ZWQUNTW\_[PIAYn{ykJ;Xfmol[HJ[Y`Y?/)+*)(*%'&('&(,14660,;@CJUVQC5*(%%$%#%$&*,,,/.*+05@T]gehijdc]ZWVNOFESO912/3.1//42/0/--../.--+,,-..,,*+-+*)(*,.*+++/=[{FIPlf>0.3188=<5;E?BV[E:OPNOQQQSQORGGHDDA:321302233?CBJOSPRQTSTSI>BLetuxzyz{{||{{{z~}vhr{{|}~}]EDCCB?C76AA=??,&)''&'$)((&&&''&$%%%&%$%%%%&$%&''(07::ADGOSUWZZ[ZSSY[=240/027;;;6;AA<85585@=;=?C>>;98?DA=;@>>>@?CBA@D?FEBCECAEDHFHFHGCGHKHCOKGKKFIIIKHIIJJKNKKMKNQPPRORTSSQNPQPPPRPMTPOMORORQQPPPORPQSPSSQTRQSRM@72-,/,+,)*($!! !!"!""!""""##!""! !"$!""" ""#"!"!#!"!!#"!!##"#$$%#"$$%%%%%%&$$%&'&'(''&(('(+**++,,,*+*,*+/.0//..0-011012/.0/3213351320422432543221////-/.-+&""#"%'%$"!!!$!$!1;KOHLFIHEFHKJHKLLKNLJGFFHEFIHJJIIHJFKJJMIMMLIMLKNNQQNONPQTTVTUVWWTUTSNF?A50.0/-*)*),(*)*)()')**--,../--)+)),+,--/0//-0.12478887/32575885767;@Yr~yc<=?=ADCDFHEECB@AABYyopEg~bQlww~~xsqmrpwsmfYJ]m|ymS@WfkqlaINZXbYF-)()'*)%&($'&)37:AC=655:DIIB:2'"%#$$#&&(+.1-/,,-09Lityn]L?6//11/10./---,,-+).-+,+++**+****(**,,++*.1TyFCOkj=2-2-79<>6;D;>Q^D7OQQSSUQSNRPFFIEDC8721411210<@>HNRQURTUTULBCDJTTXUWZYTVW\@1//./06>=<::<@;76889A====B@><98@C?;==BBEEKGMJHJZfdffjmlkkkjjljkiikkmmiknpH/**'&&"%#!#!""!! ""#"# !  !! ! ! !&)+,-()-*+*"'+*-+*)&#'#$&#%$##"!"!"%"!#    $#"&#! "#(#&)+86>4.% A??8121.+)'(&())')'())))*)++0-,**)*+,/,--.--/1,2.026:7754042644;55467JSSMC=:12:<96.&&%$$##$%$+1110+,024KgpnZ=2.-00.0,,+-++,+,,+,,,-,+++))(+,++*-,*5/MwEGQki?1-/.38>=6;D=@Q}[A:KQOMLKOMKILCAC@?B973260.321:A>EKSSXQRTSVG@>Jfuzxzyz|{{|zz{|}}}wiu|~{|z}~~^FGDECAF=6@AA@?('('')%&&&&'&'&%'$$'$%%%'($#&#&)('&07;=?FJNOUZWZ[]WS[Y?/-...208=:8:EA=6749>@::9>>>;<>@@FGKGJGJJZ`eekjmomlkllmmliilklklmmjE*'%&&$"%$"#"%#$#"""!"  !      !+)+,,))*))(")+++*'(&$$$#'$$%%$$"#!#"##!   #%!$""! !$!!$&,67<3-##A?>;@?=@A=DDABBACBEBFDCAEFHECBFGFHIHLJHMIIIKLHHHGIKIKGJPLMONQNQRTORPSSQQSVSRUQQPQSLUPOTSQRPQRRRQQQSPPTPPL=601-,,*--+'!   !"!!!!!"""!"!"#"""! "# "!!"!""! !! !$""!"""""#!$$#"$$$$#$#$$&''&''()'''()&)&(+)*)))*+-**--.-..../2210/0--213023122352414322434321200./.-.+*%##"$'&$!!! "%3ALFGGEGEICFCHHGHIMKHHIFIHIHJIJHHKJMNKMHKLNLKNMLMNJKOMPNRQUTRXSWUVXVWVRLC?73010-+*(('+++-**)+((()++,-(*+*)+*-*-/..-20,,01.4769;84366796663858Tyk_PIG@@?==EBDFEGFDFCBHZuz\jl\x|^TdozdJO]ipogXNXZ]`S9,,(('&((&''(*0=O~^A;@DFHEEEFBAD==>9:?434,301343??=ERPQQNPQRRH>ALdrwv{yy}||zz|||}{xktz}}}{|{[?IDDBAC:5B>E?<-''&&&&&'&'&&'$''*%'%&&('$&$&$&('()4;<<=9;:9C@7'!=A>>?;>A?@BE@@@EDCEB@CAEG@FCFFEIDLJLONJLMIILMLLJJILJMKKLIMNLQMOPQRRMRPSROQTSRQQONRQSSSTSSTOPTQQSQTVQSURRI>61/-,+*+,*)$# #!! "! !!!! !!""!" ! "!""" "#!" !#"" "!""#!%$"$"$#"""$$#$%%$$&''%&'(&&'('(()))*++,).*+.0,/-./...///-0.10/11330213223043045252/0/.-,/++)%""#(&"" ! "!!!%4BJHFFDDEGFHFFFGIHHGIHKGHHIFIGIJIKLLKGIILMNKJMJKKONOMLOORSSRSSSYZY[WYWTNBA5121.+*)(((++-+*+*+)'('))(*))(*(*)+).,.,...///01269=<84778485464468R~t`SWPPKGD?@9/+(&%(%#%#&%%*2;;;<3.03;Ol{=-..*.,,++)(*(()***(+'(+,,*,,-,,0/265t|F@Otm?////32::76E<=L}{]@:>AB@B@>@?>?=;:8:92140211422;=@ELNPOPROOVJ=AJftwwxyz|z{|z{zz}}|xhqw~~{z|~~[DFAEAC><6??<=:-*''%%&)%$&'(&$&$&$$#$&('%%#&#%'(((2::;?AEGRRTWXZZST]Z>110-212:?7;8ED:6864=A:98AB@CFFFIIJKKWZ^bgknjillilrjilmkljkleqoF*'&&#$$$!"!!!!"!!"  "!   !    &(-***(-(+*"&+*+)'&'&&&&%#&'$#""$#$#$!!   !!! ""$" &.1' B?>=?LjrqmqzaVanyyjRQYhkpi\UV]\_VB0*))&((%''%')+4@FMRUXWNID7-)&%$$'%%%%(-CCBA/1047Rl~;//-.,,+-++,*,*+(&++)+)++*+****+/450RuG>K~p=2--./67:99D?>E|~XC;@>@?B>?AA?>;;7;9:3201/103319A?CONPLRTRTTI?>Lfstvxxwwzy|z|xz|}wgux}~}}}}YGEGDCBC?7=>A?<*'%'''$#$%&&$$%&%&%#%$%%%'%&#$&&''&07;<@CFFSQSUVZXUU]Z=22030236:;<8B@87576<<=;;:@A<9<;?A>A@?;FIECIHJGKX[bfglllinmjlmjlllkijjihumH,(%&#""#!#$!##"#!""!#"! ! !" !      ! ((--+,+,*+(!&+))+)$&&&(&#"$%$"$""!#""" !  ! !"""   ""$#-9JE?6/$??>????@ABAA@?A@>@EA?CCEFDGCHEHHJILKSMJLKFKHINJIFIJKMMLLKLNMOPMTTSVTPPRMSUVTTTSQTRQUQSUQQSRSQTTNTQUSQSPSM?63-,..+*,('$" !!!!!!" !!!"!!"! !" !!!!"! # !!!!!"""""!$##&$###"##"%%#%#&%##%%)('''%('''('(()*+,),(*)*/--.+,,,///00/.-0020132/3331/42211311000.//.-..-*&&%(*#$"! ! !(8FKDFFHEHFEHFKIJHIHFHFIGFKFJIIJJNILKJIJFNIKIHJJHGGOJFKJLJOMMNHNQNRRRRRKIC;51/1.+(,)),(,.)+(+((&'''*'''*+()''+(+-/-.021...0076:@;8<:29;:6445548Pcs||lYQ\ks{}~{tiXKB?=@>BDBAD@;KkrvyqtdWcnvdWQ\gije\YYY][P;/(')&'$('&'(*(,3:GOQ\YXKB6.($%%%$&%(+2KROF0/426Phwl7//-+,++++,+-**+))*((*+))()-*---/,/.WJ?Ns<1/../46989CB@HwX@;@>>B>=?BA??:8:;;7472200-/148@=BNOQQPSQQTDA?Jgvwzyz|y|z|{|{}{|~xirz~}|~|\FB@FB>B<6?=??<,&(&'%$$'&&'$$#$%%(%&%%'&&&(&&''%&&09=>=ACGTRVXXXYZS\\B010/1.58:789<;68967<<=;=@?.2'C==??;A@D>A@??BCABDA?A@FGGDEFBEEGGJIOLLKLILJLKJKJHJKLMLMLNPLQPNTWTWSQPQNTTWSQRSRRPRRQTWTVSOPOQTPXPQSRSRSJ?72/0./,,+*'"!! " !!" !"!! "!"" "!!"$! !!!! !"#""%"!$#$%####$#$#%#$'"'$%$''&''*'%''')(')))'))')(*(*-)-..,,-,,//0..//.//0111402040..02101/..-,.*-+**)($$%'$""!" ! !$+9HKFGDECEFGFHKHKHGHGHFIJFHGJGHJLGKKKMILMKKLJIGHEBCHHFIJIGJHJHHJIHLJLJLHC@;4421..**))-+,,-+),*&&('%()(*)()+()+))+.-..22./.63574;657768996355536;EHLJEBFXn}eNB?=A?BFBBB@Fe}rxojvq[]dp}qeXX_hhkaYZU[_[L=,%)('%((('('&%'+6@HS[aZKB3%'$$%$%&(*Gjfde9-34:MdxL00/-+**)**,,*()(*)*)()***+**+-+-,,*9I><2A=>>9+(&%(&%$(%&%$'#$'(&#$&%%&%$#&%'((*(3::>>AEJQSSWVXWTU]Y?1001/.3;<:7<;<8755899@8<<>F>98<;;B?>:>AFFHHFILHU^adbcgkjikgjlkihkhjhllf~pK)&*#$$%###!! !" """ !  !!   $**,**(**)'"%(+)+%'"&#$#%&$&(&$$"!!"""    " "! $  %.2=@C?01!@9;>?;;B?>B@@A@@>>@=>CADECDEFGFGIEGKKJFLOKLJKMLKHKIFHIJLHJPMSPPVRUTUUSSQSRRNTRUQPQOSVRTSQRSSQTUSTTUSPSUQJ@72-1.,,,*)'%"" !#"!""!! !!#!! "#!!!  !!!"!"""""!#!#$$#"##"$$$#$&#$%&&$&$%(%&&')()(((())''('(***,,++*0+..-,/,-/////0/000/2/2.23./.1/00/10--/-,+/++)&&&&$" "" "!0<8331.+),,,-0-+,)(&'((&'&(')((''**+',),,/-.1/.0/.368689366678634234587;@EITdtoTC=>?@@B@=?Bazhwl[jxm^Zen{oaVU[dfg_]SZ^]YO;,+(('()(''),.3/,28GINHE=1''%$$%'()-`}F.437Obsh2.-,,)+*)+-**)))*(()''&+)(''),+--+'*A>Rp;/-/0159:;9?=>GvTC:=@?A@AB?B>>:=:9943/12-00204:>>BKLQRORPPQGB@Kfrsxyxxx|y|xy{{|}~wjtx~~z{~~|_CGEFD>A:4B=?>:97499<@<9:>;<777@>?DAFIIJGIPU^ajhlkkjnokkhgkjijimmmlsjI,('&%$$#"!!""# " " "!  ! !!  !#+*,*,(*,)'$%(',)()'%$&$&$&%&$!$"$"%""    !! " !! $#,5FQJ95*>7:;;97;9::8=@89<=>?>?>?>71,//,,)))'%#    !!!"!!! "  "! ! ! "!"!!!#"#####!"##"#"##$%%%%'$$'&('&&'')'(%'&%&&''(()()++.-++-+.,++,-/..0/0/.////200000/0-/0///0/--/-.+,,*,)((&#!! !!!!#0@IHFJJBECEEFHIFEIKHJHDGHFLHKJKKIHNHIFOIMJJLKPLPMRKNOPORRSOMQQLNLKNPRRTIDC=62110/,--.-,-+**(%&%(&&&*(*)*+'(+)(,)---/../--0/3377665586:;742314498AADCU{|dpjbSXs~kY`ct~~l]OS[fef_ZXY]]YF4,(('''('*,48<=7318=B?;7*'%%%$%&%',dD3449Pcm;-+.,)++*+-)*)*)))''((%()&&%&'&'(()+6=Rn;0+.013::75EA=DsSE5=@=:;78:9500./////29=;DILOQSPOQMG@AIcusxxxvz{y|{x{|||~vjux}|~zz~}~}|}}^@CFDD;@86?=>:;-*((()&&%'&&#%''('&%&$$%%%*$&&&%'((48=A:=>8:;>B>9AA>B?HFJHLEM[ddghnkmjillillnhkkkkhjinkF+%''&$$$"#"#"$"!% " !! !!  !     !#,,()+)+))(&%+(.*)&%#&&%&%&$%#!"###!"       ! !  %19AKP>3+ IBEG?@A?==?;>:<<=:9:=68<:=>=ACHEEMIIKJMLMLNKKLKMNMKLJKINOILQQRTQRVWWTXVWTSTUUVQSUSQSUSTOURRPUTSRPSSUSSQPI<83//.,,***&%#  !##!" !!"" ! ! !  ! ! "! #"####"#$#%$$$#%%###%%$$%%&&$(%&))'('&$(%''')*)(*'))))**+,-,.,-.+,.-,+.0/-/-/.,0*--./,//.3/0201..-*,-+-+*)$#  ! !"#0>FEEGFDIHGCIIGHHJJLMMJKHHHJILIGLHLLLKOLQINMNONPNQRVPUTUSTUTUTQQQMOOOPOIFC>65/301/.,--,+),(''(')(('&)(')('())***+/,0011/.0/345796666596642122259B_rj_NC<==>=?B@@Hk|~agvWS\h|_WWauylWQS]fge[UTZ\WSB2(%(&'&(-2?DJJFA6-,/33.&%$%&%&&'',eD3768MfsN.-/--)++)*)+****)()((&'%&&'%%'%&(')+4Of;---0226796CB:Es~VF8:??B@@@?>@>999<;9812211-1/19=:CKQQPQMNTPGACOdvvvwxyxzwz|{z{|}~wmpy~}|}~^HDG?D;><49?===,&('&*&%'&%%$$%&)%&&&'&'%%&%$%%''((/7<=?BGLQVU[WXWUOYW>30/.//48:8::>;;?::;:?@@;>A@BEHGGIMLIZ_aejimmolkjlgjmlkijkhiiuoF*%(('$#%##!""! $" ! !   ! %**)++)+*+*#$,++*&'%"&$%'%%%$#"" !#$)#!!!"!  !   "# !  %.4:MA9("dc_`_^]XXX\QQPOOIFFFA@ACJIMHJMJONMMOMLLOLKJMOMMLKNLLMMNPPPUOWTVVURRTRRSYQWUUUSSSVSSRVNRTUSUVRVTTVSSOLB6./.--,++)($  "!! !! !!""""! !!!! !  ! !#"!! "!"""""$% "#""###$#"###$&$$&%($"&&%)''&'$&&'')(*+''('+**+-,,.--.+/.,0..-/01-0-,/,.+)/,//../0001..,--,,-,*'%# ! !!#"'4CMFHGHEDGEEGGDEFLGJLKLIIKHIJIIJOMLMOPPNQMRQMSRQQPQRQTQVVUYZYWTTTRPTQNSLGB>63140/-.,/,**()&%'(&''(*')()(')*)))+++.+-0/./0.02346767588=6654123367Ekq[OE?===><=A;DBCW{i|_UxnQWm}p[OWjwtbNLR`ficVSTWTUJ5*%'%((*+4AGQZTHC6,)($%%$$$%%%%&%,^A0878Jesh1..+,***+))+*()(,()*(&&''$$$%'%%')*,3Pg:/.++/35966AA8Am|TD85>>?@=CB@@<:9<;;76231.0-1/0;=:DNJPPSPONOH?@Keutuxy|xyyxy{z{||~~vhsvy{~|\DAFCABD;4?>==9*&'($'&$&%&$$&&%&$&$#$$$%&%&$$)('()1=AAC@CIQUTZX\XYS\X<1-../28AA;;7==96868;?<::9>D<:68;@@;>?AFHJGMLHHRTa\gffhjmkhkliigklkklijgrnH('&&$$$$%#"" !""! ! !   " #(),**,*(,(!$),+,''&%&$%$$$%!!!!! ##$"!     "##!  %-7:B>8:, vyqtxsrpqomhkkgf_``_[XXSQQSU]_c^\UWRQNKJOIMNLQMMPLNKKMJJLOMOQRTSWWXWUUQTSUUSWVWWTVTTVUXTTRTOSUXRXTTSVRSPE<5010+-.-)*(%!  " !!!"!$ !! !$" ! !!!""!""##"##$##$#$&$"##$#$$&$%'''%%&%%''((&'(&%''()')()*,**++-.,-,,+-----/,/2.0.+-,.-,/*--./.003/.,-./,++--+*%"#!   !!(2@LHFHIDEEFBDGHIFGGEJKJLJIIHLKNJNKOPPMROQQPSSSUVXWVWWWVZWX[\ZVYUUTWURPQJC=?71141//-.0.,**+)'*)'%&'*())()('(')*+++.0.2//0--./455683499;7660216389;blRDBGIE@=<>>@??BCDaqe{S_~WMjzgPMar}ykYJM[cdcXSMQVXQB0))(('++4=BKTTROC<5.'''%&#%%#''(-ZwyC179+.,.+,),))+*)*(((()((&''%%&%'&'*))+,Ic21-,..34968A><@hSH9:@;<@=A>=B<:9<97>61300/-003;=>HKLPPPONMLE??Ifuutxwzyyzzz{|{{|xhow~z|~aC@BC?=@:6>=?<8+&'&%)''%'%#$(%%&%'&&#%'&&%&$&')('*1>=>B@GJPRVYW\WSU]Y>4/./0.28;9:7;:75755<@<:<;BI@<8>??AGGGJLJKPRc\gjlkikklllnlojihgkjkiniG*'%'&&%$$$"# #"!  ""!"!!  ! !!$''*(*()*)+#'*+**($&$&&&&&&'%#!%#)%" !     #!!'28DF<3(#~~~}~{|wzwxutsnnife__\_`kuuonbYUPMQONLQLKMMJLIOJLJLJNNOQMQRRURVXUTTQRQTSVUXSVTRQXUWWUVVTSURTUTSSWRPMF<3//.-,+*)+'#$ !!!!!!"!#" "!""" "  !!!! !! ##"#!$$#%$$"$#!"#"#%$%%$%$$%&'%%$&'&&%&&('%'&'('()+)++,+-,-,,.,-,.*--.-0,.-,,,)*,,,-/-,+./...0.0/-,,,+*+'$!#"""!+:GJJHDFDGDFDFDGHGLJIKIHJJIKKJLMQNNRQPQRTTWX^Z^`a_c_a`acacb_`_[^YXWWVWRTLHC?720101/.,-+++)++)+''&())((&'('*)''*)+,.,-.1/..--/144<67767687411243667MnwkRNUcmqq`XF@>;?;:5:689411.11+0.2CGLSPRUVX\VQYX@2-.0-32;::99<=847789;=7;<;G?;9;>AA?@DIGIILFQV^`biikjmllmljgkkiigijimuqF+&(&&$%&##"!"%!! !!!#!!"! !!!!      %'(())*)*()!'+)+))%#"$%$'%'&'%"#!#"""" !  "$$ #+=;?B:'~}~{{z~y}yyzyywusqnifcb`]_^`idkb\[QQMPOLRPNMKLMKLMJLNJMPPOOORSVUXVXTTUSRWTUVZWURRSTVVTVUVTSSUVVUXSTSROH>21/-..,.**)#  !! #!! "! !  !"" #!!!! "# ##"""#####%"#&#%$$$#%###%#"%$&$&$&(('&&&&)''((*++*+*,)*,+),*+-,--,./,,-.0..+,-+,,.,-,-----0+///...,,,-,+($#""  !"",;NJGFFECGCHEEFEEHJIJHIJIHJKLNNQPSMUUUWY[^^`c`aba``ccbb`ebgdfdcca^\[ZZUUPGCA9514.1//./,))()$())(()(((*'&'(,(()())+..002//-,//367=6447779;652333334@NZbndVFL_u{r^?AAD?HKXncruIisGc{xoSAWgr{seE2*'&&%$%$''(&Dwto|E098;Heqe1-,,,+)+)+&(,-(*)*)&'&')%%%%('$&&&''(xZ30,.0.14;87C===e~ZH9;?@A@AA?><;;9::98500-//,/11;==AJOMNMSOPRH>DMftvuyux|z|{tzv{|{~~wjox}||~}^@BCB@?@95?6012-248>999>;<9788==>:=;@EC9<:>AAA><>BEDIJGMEMY[bfillilniklkililkhlhiloqI/'*#(#%%##"!!"!!! "!  ! ! !$()*(*)*+)*%&*')'('%$%%$%&(&&$"#!!$"##"! ! "     !!-:84:3#hopprqlqurtrrtrvpplkjdba[]YYYY\]__ZZQLOOQNQQPRNNMONJLNLLLLOROOOSTTVXXSWQRSWSTVQUTQSVTSVSWWUTUSUVTTSQTTTSI=6400..+/**(%! ! !!! ! !!  !#"!!!!"!" """$!"""#"##$#"!%"%#"$$$$%$%$"%#$#'$%'&&&'''(''&''(()+*+,+,.-,)-,,,+*-.+-.-0+-+,-,,,+--,*++*..-.1/1..,,-+**(&#!" !#!,?HJEEEFDCEFFDGFHNKHJGGJJMLKNNNQLVTX\][`\__a_``^ba_`aaedeceeffhheedd`^YVTKB<9514012,-.)())('))+')*))++)((***)+++)+,/.11/1/--./335452588:;53812536788>>?;H]vwLDJR`otkn{O_xKf|{oS?Yku}oeK;P]alZSBHUSYUC.))*(('',+(+.9FGLGB9'&%$%%%%#&&'AjfbqC4858Lcq}wD8;:;?@EGFNT]`3+)*(&'%&&%%&%&%&'''&%"qR2/100/24;77>?:>e{VD::=>??A==999979621/0//0/28:=?LKMKMMJQQE;:;.'(''%&&&((%$$%%&%&%(.))&%$$%$&)('*4?BBAGIIPPVVYYXXX`Z=101.10489789B>:7573?=;8==@CD8;99?=<><@AGFGLGJLJU^bdhmlkkmkmhklhmjkfgkifzxQ)))$$#%#### "!!" #!#""!      $*+-)*(**)+$$))**(&%%(&$$%$'&"# "#!#! !#  !!   !,;>723%\`bddccakeikillkmlfjf_a[[ZTXTUZ^ab]YXPPQSKTMPQKMOOOMOMLNNKLOQOURVUWVVUVTVSTVXVXVXOQUTUUTVXVSSQUTSUTUTQUSH<6.././-.)('&!!"!!!# " !  !! !!!"#!!$" !#"$""### ""$#$##$#$$$%$###$##'&%$&(&''(&'&(%'('(*,**+++++)++-*)*-*,-+,*...+,,*.+--+-+--/-,..0-.-,,+(*()$"# """0@IKFFFGHCCEBIEFGLKKIEILKMMOOOPUVX[[]]\^[a`baabbaaadcbdedgecdddgegfffd`]WNE=:226/22-./*+()))*+.)+-,*+*))'*)++*++*-,-.00//./+-.11326649:=933<12235799;>G[ppmy}vlXWz\_{wjJF^ov~m`I9TbblZR>GUW[[O>-*-*+(034730-79<961($%#%%$$%'&)>gd[pD035;Mcpneejghiiihmr~o4'/,$()%&$%%&%&'&&'%('2xT8/-.//16:94BA<@=>?<;89887;60/0/1..50:;>BIKLKONNMOF;DParuswuwxxxxvwy{vz}zhpxz}~{cDFDC?>?76:<;=9*)&&'*('%&$$%'$(%%%%&'''($&$&%%('&)4<@?BCGJQQTYYX[WV`X=/.//02399::9?;89567;B=;;;@=?8::>@?@==>@FJFIKLNOXbdhkijjnnlommlkmjkljjfcrlL+)'&%%####%"#"!"  !  ! "!!)*))*)(())%$)&+'&$$!#&%%$&$%#" !!!" !!    #%&/8<92-$WVVYZZ\\afiilkkklejifdcb\XZZWXajile^XUPSOOQPQQPRRONQLKKPNMNPOMSRVWYWUUUSSRRWVVTUVSRSSQTTXXSTUPTWWVYWVQSNJ>801-.0...))'! !  ! ! ! ! ! ! ! " !"""""!"$"""#$"##"%#"$$$$##%$$&%%%&&&%&(&'&&(('()'*()*)+*+,+,+,++,+****)*-,)*+*+-,+,+,+*-,-+./.31310-,+,+,+)&%"    !!6EMJEHFCDEEEDFFHHIILKIMHNMMMPSTYX]aa]_^`]``a_cbcbbabdceeefececgefeeffefb\TG?=115//10./++*+*+)+-.,+**+&)))('+))++)++,-/-00,0,....33577995<757.1-2825:;AUnoyqXooWs{}r^DK_ozyi[BD[ddi^SCJV^gaWQE:/++18=:DD;0//10-*#$$#$#$%&(%'E41/,-'&('''(&&&')-JM70.//004:85@?:@dZD89>:D=>??=?::6779760.00/,/007<=@LMILONONLH=@J`urvxvvwxyzxx}zx{{~~xhlw}~~}a97==<;;-*&)')%&(%'%%%$&&'$%&&%''$$$&&&*(&(4:9:6576=;=;9CB?;::?@8=;?;DIKFJLKJMU]_ckjmlnifjkkmjjkglmkohppF+)&($%%$$#$%##!    !  !'*))*(+**(#$)(++'&$"#%&$%'$&% ###%$"#  !! #$,58972) g_[`]\_aajnqrsspuntonnnklgigdfhqqrmhbYZOUTQRRPQPORPPOOMLNOMQNPSUSUXXXTRRQVSXUTTUSSTSTQURXTSSQSVWTTUUVTURG=811//,/--(+% ! !! "!"!!!#   "!""!!##!"!#"!"""""#""$"$""%#"$"$%##%#%$$%%&&%#%%$&&%&$'&'(+'()()**,),++**+)++)*+)+*)+,+++*,)+.+.---,..-,0341.--+***('$" !"#3BLJIJGGFGFFHFHMKIIIGJKKNPNQUVZ[W_Y``_^a^_^a_`abadafddedeffejdefgffgdehbaVMG<6271///,/,*,+(/+-*')+)(&%%&'&()(((*)**-/.00101..+.022357979720/-/1442587Ee{isyzs}iay_ZsznTF`luseX>RaghiZLFP[gqod^UKE?89>IJURH=7.&('$##$#&"$%$&&(0Z]V_A248:M`u~}ZTUVTSTSRSWXVXMGLMSLHRD'*('&&&&&*::HP7/--/234783CB;AdUC8:==9?:;78968511110,0/17;;>LOLMPKLJLG:@Nbuuvutwwyzwywz|{|y~tin}zz}~aDFAB?>=;6==<:;+)''(()%'%'%%%&&'&&''$"%&#&$#$&%&''19>>==9:B<('('&&%&'ER@HJ51/--244::2>B:>dWD<9;@=?>?=;=;89:87<721/-1-2106<:?GKJLOLNNRF>AHcrsvwvzww{wzwz||}~wmp{}~x|_ABCAA?@;6:;=98*(&&'%($'&&%$%'%&&$$%'$%&$&%%%('')'1=;:?AFMORUV\YYVSWY@./0-/428;89=A?;4844=?>9=;?I>>78<@>=?:??CFHKFLMQVacjghllmkjknmljjijjgljkrmN.%)(&%'##"#!"#! "!!!!    ! #)&+(*'*&(($"*)*)('%#"%#$&&'$"!%!$!"#"!  !   !"&0>>;+#!b[]`\_``echkmpntuuyz|zz}|yxuyuspqprlosqljb]\VXTTTSRORQNOKINQOPURSWYUXUSTRTSVUSXTSURSVTWWVWVXTSVTVTUSRSPSJ?84.///,+,))&#  ! !!! !! " !! ! !" " !! " ""!!!!""!"$#""#""#!#$"$$#"#$$&$$&%$$%&%$%$&%%''&'&,***,**)+)**+*+***)))***+++*+.+,-.,,,,+.,,1.,./232-,-+**)('#" ! !!" +:DQIIGAHEGCFHFJHMKJJLNLMPLSX[[Z\\]\_a``__\_^]]`^`^_^`^`__abbbcedefhhfffcbWTJ@403220/-,****+'((''&%%&%&%$%%%'&')&)))*,-,,,..1.//31225256563///.20137679JgylLDSb}tgq|hqx]eyucPUftvrfVHWdhid[QGR\gtuuprpjc[VHCBBFLPQE>2)&%$$####$$&$%**8<;I8/27=Kbt}`888;87665475574453<21.)''''(&&GW=MvK3/-.///38;6?A:>iWE;<<<<=;<=:<:99879:3/.-01*../8:;BKKMMPNJKQF>EMduutuxwxtxwwxw{{{~~uhqu~|||~bABA>>=<;5;9:<;-'&''%)%((%&$'&'+)'&%$$%%)-'%&*/40+2=;<6:<;867945==<=;=@IA:97;?>9<<@DHHIHIKKIV\eejilrnjkjnljlllhhijjgroJ,''&&'&&#$#"! "   "    !)'),(*+)'&##*+)*(&%$##"$#%$$#"%""#!"!!"     !!  !%2=:0&aXWWRUWXVQWW[Z]agclqtrvxxzyvwutqnopnuwzzxtne``[VUTSPQQQMOPPPNPRSQWVVZSUVQSUSTXVVVUTRVUUUVWWRTPSRSPSRSWPRL=:2-./-,,,*)$!   !! !"!!!! "!!! ! "! ##""!!"""""#!!$#$$"#%&"$'$%#%$#%$$$$$%&&%(&&'('**)))))*)*,+*(*))*+*+,)*-)*(*,-,+//-0/,0,0.-134-.-*,)())%$! ! !",:HNLFIDCEGDDHCIKNKNJJKONRQTY]\\\^_`\]___^\]][]WZ[[Y[Z[\[[^^```bdbedfefgedWQMA2.75301-0+*())''&&%%%%&%&&&%%&&%&('(*+)*),,,..//.133432446541/-./13338555:KY[c^LDSk~}[[svgsradzzgNRckx~yjXJS`ejj_RHHYapvuttqplkjcTK<27CHHEC6,##$%%#%$"$$&')+1415-4489Map~n9284534346465834505/+)(((()'&3p^=ItL5.//01/3395>@:?fUD8;<;??<==;<:66868850/00/--/.69=AJJLMMNKLND<3>8::;,%&'%&&%,('%#%$%'*&()%$))+.%#((13,*36;.20,,/2597:9==:6763>=<<==@A?<:9GFKGILLMX^cemnmjgmmljkjgkjjgihgdmgF.*'%('$&"#!!!!"! "   ! " "!"()*)))&(%&"#)+*(%'#$&%%%$%$%&%%""$!" "    !'*8:5, rhbWRNKMGJIFPLONQTZX_^hdjkmqpppkjfknqv|ytlgaaWWVTQTQQPNRMPQUTVTUZWSTSOTRUXTXXQTRSRVTTSVOUPQRVPQOLPPOJ?91...---++*&#  !! !"  !! "! """# !" "!!! #!"#""#!""#$#""#$##$##$##%%"&$%%$%&&'%%&$'%&$''''(*(*()*+)+***))+,*)****)*)**),,--,,,-.,.-.--237300++,)**%$   ! !"$$1:;6(#$"%$"%##$$$%((...4004:7Gas~F+4/11../...13134.0*((&%'&+('Hzb:LqG40....22795<>:<]WB58=;;=;>=>;?79:87871--/-,/,06;=:HNJLKMLNMD>BJapssvuxyxvxvw{xzz|ykmx~}}x~~}`E=C?>>;;499;99.&&'''%%%&'$%&(&&)%%'%%($&'##$)+)('67;=>AFNPQPUWWSVUZWB+00.0038=<@B??<>>FFJJKJOQZiccdjmnknomkojimhkhhjjm}wP1&''&&#&#""! ""#!  !"! ! !# "  #)**))*'(&)$$)+*($'%!#'%%$'&)'%#$&"!! "! !(280/( yocXRQNKIGIIFFHBGKHIJNPUVZY_Z_]X`aeqz~~ywpjg`ZXUSSQOQUTSTTVUUVWSQWSVOSTSTUROQPTRTTUQRROTRSSOPNORNJ=72/1/--,**(%" !  ! !!"  !!!!! ! ! "!! !!" $$!!"!"""#"#$'##&"#$$###$$%$#%%%#$%%$%&'%'(((')(')))*)*),*())(()*+-+*+)(++)+,+--+.-+-/0,..,0/4400-**))&$$! " "$1@JKIHICECDDGFGNPWTNNONPQRTX[Y^]`^_b_^\Y^ZUTUSRQPNOLRNNPQOPRSUSWZ_a_bbhhbcVLO@;KJCDE71.+-*(%'&%%%%$''%&%%$%$#%&%(('(*+)()**+-003295313334521,/-/123245765888Hi~gM=BD]yhatmZiy|oSRdoyyl_JL_eeigZ@3:DScnsuroqrlklf^PI>2.0232-'$&&%%%%%%$'%%((./.30045:KanX169;<8?=9=?=6062,)'&(*&&'))9Qwd@KoG2,-.-.01362;?<<`aE:;@;<<><>=:?99987751//.--/.059<>LJKJPKOLJE@ELfrstvuxvxzxzy|z|{~xglx~{~~^F?AC@A=93:::9;.(*'%'%$(&'&&$%&'&$$$$#'%%%$%$(''*)46<<=AFINTUWWWWVTZY?+-../26::7:>?><98<@<>;=?CIJHKKGOLTabgghkmjgmjkkkmhgjlkghcphE*'((%%$&#$#"!!" ! " !   #    !!#((()*+'+)%$$(*))&$%$$%&&%&(('&$&$""!!!   "%./5-+&umjehfcgacb^\[WXXSPLQKNLQFQPPSXYequyrlh`[SUSUXVTVUVUVWXTSRPSTUVTRTTQOTUNVUTRSQSRRROMQSRPOJ@8301,.+--((#!! "!  !!!!! "! " !"" ! ! !!! #!"!"#"%#$!$#$"%#!#%####$$$$$%%$%&%&%%'&&'')('('(+******+(')(**),+(++*+)*,+*,+./*,+.+-.-.*-./1541/,+)())&$!! $ !&3ALNJIIIDEDEGDIKOSPPPNMRQRYZ[\[__^_\^Z\YUSROPROOPMSLPQPPPPOOPQRRSV[``aegcfYMOABPNMNN<0.++(%&&%%%'%$%&$&$#%%&&&%'&*)'(&()()*)/./226714446643200./0/042253698HP[elnspnmokb]TTJ@3/)()'%$$&%%&$%$$&%'&(*--11256;Fbo}i41<=>;><::7851*(&&'*&*)')'+,Puc@IoH2/-.0-324:5:?<;bbI:==9:?=>>9;875962../.,-,.8;=?GJKJOJPLLF>?Eeusuuuuxvxxxvyxz{|xlrx~{y{{|~aDC@B@>;81;<=<;+''&%''&)&%%%&(%&%#"$$%&'''%%%$''&)1::>=CFKPSUSXWYVUVV@/..--058::78<>946:7:?:;<;:8=@=@==>FILHHKIKLU_agikmklikninkjhiojjgkfvuN*)(&&&$%#%#$!"$ "!!!!$ "$#!%!"#" !#    ! (())()*+((($*,)*&%'$#%"&'%'*&((%$$# #"! $"   #)10<1.& }zxvtsslmiicdbcghns|~yrmeY\\XZWYZXYWYXUSVUTSUZSUSRPSVRUURQRPQQRPQSQQQPQG?3140,..,.)("   "  !!" "! "! ! !!!"" "!# !" !#"#"#"#"$"##%"$###""#""##$"##"##""$$$%$$&&(''&''(((+,)+*')()))*')*))))+-()*+*(,+.++++..//1.//6440--***))&!     !""'4GMNHGKFFFFDGFKHIMNOMOQOOTTX\\_^`^^^^ZYTOQQLTSPQONQNORPROQOPPPQRSVUZ\cdccd\SL>CPRNMR>0/+)(&$%&%$$$%%&'&&$$&&''&&(&(&)%**(*),/024336244435430/+.-/1432455479=[wjVls[L@CABMSOOQkxW]w~`Rlx^Q_k}xfPFXjlom_N73./,6AKR\agllkmba]YUUNB:+%'$$"#$%%$&$$$%%%'),---.0037Lcny|F5;A>>B?9640+)*))(&*'()*++.-KpiAGzJ///-0.122519A;9ZjF68;<;@=?=:?JIBLN;0-*(''(%&'$$'%%$%$'$%'&&&%%'&('('*('(((+-233262236374310-..020224446566Nhru|kI?>>F[\Y\_UxkRd|wUZvjKXoyznU?SclotgU>312/--26BKRU]`c[WUOKJQMF>1(%($#%%%$&&%$&##%%'(),./.155F_oU8>=@<;89:687950/./--.314<<:JJIKJLMLJF@AK`nssuvwxuyyxvxzyx{~~skmy|x}||}`CA@??=<74::899+(&)''$&$&&&"$%#$$%"#%&&&&%''(('')(/9:>=@CINRUWWZYTQ\[=/-/../3;77;6:=987279<:<;;?>=<:;==?>=,'*'$#"$""%#$!  #$#$"&'*,'&)+$""!!#!  !)-))*(')*(&#)'(%'%#$$'$%%&)&#%'&&&$$"!"##! & !$&!"!!! !#+38<2.*!RWbju~~zyvsif_^YSXUVVSUUUSSQQSPRTTRPPPONUQOSPSQSREC71/1/.-,,+,'"# !!! "!!! !!#  !!# !"! ! !! ! !!#  !! !""!" !"""!!""!#""##$##""$###"#%!##"""!"""#"$$$&$$%$$&$'''&(')++')(*&''((''')''*()*(*******-,,,----,-//3476/.***))&## !##)7LMIHFDEGHGJGEHGGLONNMLLKOTSZ\\]`]b^[[OPNMNPOOOMOOOPTOOQOQSUSPQQRQSUVZ_`dcZQK@9@ADC>5-+)'&&('%&$%&%%&"%&$&%$%$&''&)'%((&''*+.,22447322545332--../1/111323643>GUTVP:7Mfw~~nRGC>?A@@>?C@MjleiyPoxRQtdLj}sSHdt|tfCDYgq{tdN=:757-*+*17:CNPQOJD?9@FD==3(#%$$$$$$$$%#&$$%$'(),..0369I^qj;=EB=-+(**((()((,*-2/*,-.+,LljD=xB20*..-11384<@=9TgE46;::??8<;<<:9676620-110.-0-3:9AIKIJJLKLHC;BKbqtvuvvut{xywwwvy{}zkox~}|x}y~`AA@A==C?9==979,)((%&''(('%$'%'&%&"''(((+&)'''(&*%-7<:>AHGORUZY[[ZW[\A100,-.4989::?A67655:>?:<=A?=;:<==>@EEIGGFLLRbbefikifiiinqkfjkjjolckmiF.)('#$#%!#$" !$" !#$##$"'')$#(& ! !&!!  !())+()((')'"'+*'''"$$$$$%%+''&)'(&%%"!%#"! !$" "#'##!!&-4:KD4&"KJLRXdmw~{vvuwtvtvsxx{||z}}{okgYXVTTTSTPRRORTLTTRRROQRNQPQRPRSRPH<731///,.1*)%#""!"!""! ! ""!!"##"##$""####%""#"$#!#""!#""""! ""!"!"#"  " ! !"!"!!"!"#!!#"##"""###"%#""#""#!# !#!#&$%''''''''()%)'(*&'))(*((&(&)''(&('()'(+(**)+)*)+,+),,-++,0/.4653.-++()'&#! !  !!#.;IKHIIGKFEFIFFGJIJNMNLNOOPPTY\^\]^`^]ZSQNOQNNLOLQPPQROPNQPTQNPPRSTVTW_difgZQLF7=60,)')$&'%&%%%%''%%'#%$%%&&%'&'((&,(')))),-/0247123213311,+,-100014564757679897>TpoJAB@@A?<@=>=U||mzQh_ElrJ]|kEPhy}mW>K[lv}m]LC@9;<::99575550/01-,,-,5;;?JHKKLKKMOE>CKdpvvwvwyuyvwxyxwzzznqz}}~~ycC@BB8=KKJE:<77-&'%$'''&.&&%''&%'($)(*())%&&&%$%&$09>;==FKQRTWZXXVTYX?2-/.,13:;:;:EG88577<>=;<=?AA<:?;???9==AEFKIIGORO^`edjliilmjghjflhjhjigilfE/+%)#%#'#$""""#"""""#"!#$&-#""!   &()*'*+))&&#()((&'$&$%%#'(*'&),('&''$##"##"! !$%##"'%%&" "&,:9B>0(#SLHKILQZgp||woqjlkkggdgjjjjimklnmnprwsqwuvzz|z~~|~}rd_ZUXRQRQVQNRRQRRQPPILOQQRSROOPRNF<74/00/+-0,*'&%#"""""""#"!!!"#"#$#$"#$##"%&$($&%&&&%$%$#&'%%$$$$#$"!"""""# " !" !!"""""""!!!"""##$#""#""""$###"!#"!!!!"$"#$&&'''''&&&'%&&&%'('(()(&*&'(()))'')''&'((+'(,)*)++,+-..,,+5-.255310,-+(')'" ! ""#%1>KLEFGEEDFCHEGFHFEJKKKNNNMQV[[Z``_a_a[WRPQUPPOOMOORMOPMOQPPOORPSRVWUYecjfc[QJE;:><97-+'&')'%''&%$&%%&'&%%#&%%&%)&*)(&)''))**+,./145243334221/-,-//223303445636586;E\pnL>B@>?@>??>DjuUjd?dxLWy~bCWm{|lP9Pdm~|l]DEHCJK2,,+()*'**<::>:2**+(('"$$$#&%%%$%$%$%%&&'+*+*/.35;HbpY:D/-)()+)((()')((('*+--.*8MjqE;pC11,.0/.21;29><:N`A78=:<<>;<:99767666400-/+*,-/1;:BJIHJJJJHKD?DLaovtwwvwxyxxwwvyzzyinw||}{z||~{\A?B=50:677:;98-'&%&&#$&)%'&((&)''''(&&*(%%&#"%%%$/::?>=FKSTRX[XZVTZW<21-.-068:;::;:99788<=<;;<=>::89=A>?>A>BBHIGGHMPX_adgeflllmjlljjjiiiihijldD*(&&%%#$"#"!!#"#$$ ! !$& "      "&+(())(*))$$&*'(&%&%%$$$%&*)')+'()$%%#$#""##! "&'%%!"%&#%$"! %,2798;A*]VTGDEEIMX^lt{zqlhgiffggfecdeefhgbddgfdfidjhhhjiimlojroot|zhb[ZTTSSOPRTOQSRQNNNMKOOMRSQPORPD>:0/./.),,'*'&&$$#"#$"$###!!#"###$"%$$$$$$%$'%%%''&&(''&)&'(('())''%&%&%&&#%"#$#!!#!""!!" ! """"#"$""#"###""#"""""!!!"#""$'&&)&%'%&''(''%'%))**++)*)(,&(')%'((&(*(((((&(+)+*,*.+*+,,/,,032520.**+*('%! #""&1@IKHGGEFDHFFJHFGHJHJHJMLNNPRUX\[_^a_aa_ZURQQOQOPQOMPPPNRQTQTRQSRTWZZ^bahgc]PLD<;<=:5.+((((&%%%%$&(%$&&%$%$&&$%%'('+*)))&()()*,-1133032331320/--/0./33352262654553;@UlhM<=?@>?=;>=D_|Ws]?ivLXz`DWo{zjL8Oaoz|oaHIOLST9,*('((('-;9>:9;=;<6566683/0-./,,,.5:;AKbqssxuvtyvzwzyzzy{vhqw}}{|~eC@@@8267957888+)*)(&#'/1(%'&'%*)(*&%'$#%&#$%#$$$%18?=>?GKQVVXZYXWU[Z@1//../7;>969<=;7866=?@A@JGHFIMLP[_feijgikijiljiiilkjijelhF,''$$&&%!%""!#! "! " !    !  !()&''(')'+$!%)'*)%%&%&%%(&(*+*+)&('%($#! " "#''%&"#%$%$#%!   !"(4:ED;8*#!"e^]VRQHCELKS^gozytnljeghdhebfcddedafccheef`fbge`dcfdccdbchfiuz~kc_XUUYRPPPORTRPPPQOMSOONQSSSQNI>621.3/-/,+,'&&%$##$#$##"#$#%%$$%'#$$%&%%%%#(&%&$&'&'''(+&)(*(*)*+*+,,-*,)*)(&'&$%"###""###"###$""#%##!$%$$#$"""#"!#"!"!$#%&'&(%%'%'(''('''%)'&'(&))*&((&%&&&'(')'(&((*('*,,*++,,,+-+),,/01530.-+*+*)(#  ! "!#"&1CKKGGGHGIDHGGIIKIJKKJKLKPQPPSTXY_a_b^caa][TRQSTPQPQOQQSMPUQPSSSWXX^`ceceeaZROD;9:9731,)*('('&%$&%&$%&%%&%)%&%'&&('*'(%(&')))++/01356413232/0/+,../.3224246/43211149CSgjjdY<>MOKC>>=<<@UvtczLSurJc~~aCQht}rT4J]kz}qeOLSORZE/*)')'()+7AFLFD:0&$$$###$%$$%####%%$$&%%&)*+.0059F`n{JA1-,*,+,+,()'(%''(*)+3,.FLbrIOdD24;9:<=>:=8:73358510-,,1+--/598=HJKKJLKKIE<@Jcpsswvwwz{{xzuxz{}yjow}||x{~|}|a@?A>2/8668876<+(*))''*3/(%%$&$$$'#$#$$###"#$!###$,7???@EKMTTXYWYWVZX<1.--/068999:;:;;455:C9<<898:B@<<=AADHHJIHIKX]adgljijjkllnklkijighkjjgG-&('$%#$##"""$!"!!!! ! !!%!  !    #(%*(+))*''&#)'*('%)#"%&$''('%'*+''('&&%!"!!!$('(($&%&$+%%" !%08EB8:33:;0(*$#!# !!#edc^YWMJFCEHMV_isywroljiefddeabebbdedadbeb]badbehecdccfbcaddfdsuqe]]WXSPNOQQNTQPNNKLNQSOTSVQQPH?400///./--+*&&&&#$##$#'"$$$$%%%&%##$&'&&''%)&'*'(*'()**)*+),*+,*,*-,-0+.-.-/-,,)((*''''()#'#$#$##"%#"""##"$$"""""""!!#!##$%$$$'('&%%&&(')(''(&')*)(%*(('%$&%('(*'('%$)'*(*',)**,+)-*++,-/1333/0,+*++(%#!! !#$(8GKIHHIFFGIHFFIIILJKHIJLMONRPOPSY[]_badcbdc`\WUTSSQQPNNSOSTRSSVZW^acddfdfgfXRLD88=8631-*)(%&''&#&$%$&%%&&&%"&(&'*')(&)&'&&()*+-03325424414301,,./-201/241211130//.23;;>EDCCC]ge`YJ=?=ATt~ergCb~hMriGMgpu`=DVfwysjTEOQS[T:,(('&)*'-5>G?=:-($#"!"##%%%&$%#"##$#$&&&(*+.-/57E`mWF5-,,*)+*'')''&'&(()),-4GIgtH;mC20,01-/0.653=>;K_B66=;<:;>=9;:95575340-0..*-+.598AKbsvuxtvxyyzxzxyyy~zgox|{}zv}y}z~_?>AA4.62567856,()()&()(&'%$$$"!!$!"" "!""! " ###",7=>@@FLMTUUYZZUS]Z@2-.,.428;<8=;:495679=<=??>EA;;9>CEFIGKIHOU`cceollkkljhklgikmhfgjjoiD+%(('')(##"#!!"$"!#"   "  (())*'+,(($"*(-'&'&$#"%&'')'%''(%%#'%$"# #" #%**-*''%''*& #   %,3;A@>?CMYWD>90/2:44-*/'$& dffedaZPQKEDGGIR]gpuzupkkffddeddceeeeccadbadecddadbdedfccdefecgis}pe_X\UQPRSRNOOQPPRPOSSORSQPSOG?62/1/.//,,+*'((&&&'%$#$%$&#$#"$#$$$&#%((&'((-))(,)+))*+,-,-/-,/.+-/--/01,/./-/0-00.40.1..,-,,(+*)((%%&&%&$"&$#"#"#!  "##"#$$&&''()''+()'&%('')(&'%&&$#%$&%''&)%%(''*(('*(*)++++*,***--/044330-,*,-.-$! !!!#'9FNJIIDHGDFGGKGIHIIIHJLKKMMOPRQSWXX]a^`bbdefeaa]\ZXTVXRWUWXW[[__`beffeheedgYQJD<>B?:71,*(*&%&&%&'&)$%$&&&''%&&'%)''&('*''))**),,/335325221220-+-..,.0/301344/00.//0,.258:9Ik~}rltfC6=SrefxNVwy\auVH^m|{kP?K`jwtn^PJQSVXI6,*&+00-,)2:867+%$##"!#"$%$%##$"%$#%$&&)**,..166Dao~c=--+'))+))((''&)''&&)(.?MIezG9i>0/,///.11625<>EMarvtxuyxxvxvxxzu}{jqy{}}yy}|z}d@C?<5/24445766,)'&%&8/)&%# !!! #!!!"!#"$#!"""""#%/:;=?BHHOVWUXZYRUWT>3/1/004;;8;;;A75656;:<9<>CA=99<;C=<:@=BHKILJIHKW_adfilhkkkijighjhkkceijkhD.&''%&''")%!!!!!"!!#!   !   %'''))))'*'%()((%$$#$'%&&'%'%(''%%%&%&$##!"$"$'(&(%')'%$(&%%! !',4>HKMFR^XOVTEEA=C8B=@C?@;:1*'hhjeedd]\QMGDEEKSYddlt~{ooliffggddfcceeebeebaccdcabadcbfbbdcbbdddkn}ni]ZWSRPTQRSQPPPPNNQORRPQRTQG@6220/.0.*,+)''&%%$$%'%$$&&$$$"#""!###$%)$''%+%('(&(++*+.-++..-.//0/14//3.111/3120102233321.213010/0//..,+)'&%&#%$#""  !""!!#&$#&&''(('%%$$$$%&&''&%$$%%&%$$%&$$%$&''('()()''))'('++()*,/16675/-,-/00/+#!!!!""$$%+:HLJKJHJFHIFEJGIJIIIIJIKLMNQRRPVPTTWY\^_bdddeefgcfeb]`_cabbbfcfddabafeedd_dXNGCACEDE<5.*((''%&&&%&&%%&&&%&(&'(($(&&''%''(&()**,//255411411230-,-...//0103/001120,,-110346>[tkB;Qqc^y]Jom_v}eHUhusaHAWdlsnfWJMRPRTC1)*4536;-+,-,)#$%!#"!#$"$$%#$#""##$$%&)+)+/.036D_ot>,/,+++)-*++'&(''''&&&4BKGf|P:o=/0-,2102/583<=7I_=36:8::<:;:8665245470/0/-/,..358?JIGGIKKLIG@DKdsqtttvvwyxxzxxwz||zkowzz|zz~~z}v~}`AB=?5,22324878+((&()4+%&%!"!!!!!! !!"#" ""!!"$/<=:<@HGPUVVXY[VUWYA1,0./037;968=>;:8489<=<<>?C==:<GMLIIJHILKHH;@@IEHSQFHSL>:4"ehihggiacZYPJFDFIKSV]got}~zqmihggheibcd^ce`dbbc`dddecaabddddibefgefit~|ld^XWVTSRSSROPPTORSTSUSRQOGA52010/0..-*+(('%$%&%()%'&&&&%%$#"###$$#$%&%&'$'&('((((**),**,+,--.--/-03/01120203141317333334334575732342300/1-,++'%$#! "!" "#"%'%%&')&%&#%%#%%%%'%&&$&$#$%%$$%%%$$%%&&'(%(&(((*(&('&)**,.245430210302,("! !! "!$$$,>LLGKGKGFGEGGJJHJIIIIKHKKLOOQSQUTRPXUW\]`cbeeedfcefffefdefggedeffceeecca`^\WOGICCGEB=6,('(('')&''&%%%'''%%&&)&''%&&%&&&'%(((**,-0136422323320//--,/-00/0203/0/,0/,+.+.401=\rx~{O7KoiVyfKazbkw\N^gw|nZ=F]irrlbMFJORVR@-,7=8AC8)'&%$##$$%$"#""#"$##"#""$#%&%%)*+//257@_o{M,1-/.,*,(-0-')'(%&)%,;BKEizK4xk<2..-/0-/0372=>6EYA86<8<=;;89:657474532/.-,---.687:;;<>@>;<;;B<@CCEGJJLJQYY_bidkjkljlfjkkflijjhihleC.&(&&%&#$%"$""!""""!"!"!    !'+(+)'*)'*'#()((%%%&"&$$&&%'%+**('%'%'"#"! &''&(&''&,&'&(*" #7;GAAB7?ADOKFKJBGEGHFLLJLQSUI;"iiijhihhgbc\WOIBFFHPQZ_ckw{}yskmhdgjdeeeegdecbd`baadbafbcbd`bceeedefnw}toc`[ZWSVTQQSPPQPRSNUQTSPJA830.3/1...+)(('&%(&('(&''%%&%#!#"#%#%$&%&%$&&%'''%('')('''*),*/*)*+-,+//-1110-/01/02137352233544826666566578667664/1--+**('%%$$$##%%$%&%(%%&$$%(%&%$%#&%%##%#%%%##$&%('%(&('()')''(&&')*+,345554636620.-'"# "! !"#$1=NKHJFHCFCGGHIIHJKJHHILJKIOOMPRPQPQTRTWX\]_bba_bedbdfhfddfdedbbebaea``b`]_]UKLEA>AD>72+')('&&''%'%%&&$&&%'$%(%'')&(&'&)((*)(**.-0334134513110-.--,./1022.10211-.-+,---31/5NhllwsT9EktQlqGZyeczjQR_ntgH>S^lsrjXDGNUS[I?>?:-'##""#$###"#!&$##"#"#"#%$%&&'(*+-//46A_ly[1.,/0-,+*/74,&&(&')(7@GLIi|S3qd:01-,-///.552;B6FU?:5<99;<:7:85455437.2--.,,,,-2:8>FHJJFIKJKDBDKcqvvwwuytzxwywwx{}|{}yllx~|}xz|}|{}|d@@><2-031-5;65+&'%&*/*()%$#!$"!""! !!"!!" ##"&&1:;;@?FHOVSVY[WWV[X@210//1299488BB99676=@=:<@@@@;;8:A>AA=>BHFJIIIILV]_dhklhilijhlgljkhgjilhkiF/)%'%%&"$""""#"!"!""!"  !!(,(-+*'*())#+**+'%#&!&%%%$#&'**)'&'&&%#"#$"!!&&%&((&%#&((+''&!!" #/:D>:8:<=CDE7;;:A=DCC?FCMMNXP;&khikgnihfhfd]YTNGEEGHSU_cgnz}ztroikfgfhgbfccffaebcgebdaacaaccbchbceehs}mj_[\WSVRRNMRRPUUVQSWUPK?:23020/0..**)()&%($&')'''&#$##!#"%#"&$%&%&&&'&%%''()())'(&(')(++*,+)+,,*+//--0///00//,0/0.1234425376888886869879::79966531//.-***'&"%#&%&%##$$$%$%&$$#&#%%&$%#$%$#%%$&&%&%&&)'&''&(%%%'(*-067:;965342/0-*## "! "##(3=RLGGFIEHGHFHIJHHIHHGFFJMKNMONRPPQPPRVUVWY[Z[_^beeffdbcccdcbcb`\]_^_]b]\\`^TPLE>?>A<92,))'&&%'($&%&&%&%$&&$'')&')&'&)(())')(***.0247/63112120,-,..,./.21.3-00/-0,*.+,/0.,/2GPMNJ9;_~W`{RPtq_ry_KWeq|mZBBRdnpjeN@GQSZTI4199:<81&##"###%###%$%#$"$"#$#%&%&&((),+-/247C^lzk5,--.,/..-=K9*')(''/A;DKIbxR3of>=?FA<:9=DA@>?>DFFJFIJKLU__figkkjiklmlhilmihigjgkhC,&'#&$# #"#"!"! !!"!"! "   !))(*&()+&)##'%+)$%""#$#&%'&(&*)&'''$'$#$#%""'&*''(*)%%#%'&%"" #246:7@>::350(*-2399;=IOLNRMD2)!njkjhiihjkhgfa\YULEGEINRT]_inu{|smqlgefgcgdhfebeddgeccgfdfeecdddfegdcry|vqea\[VRMPOQPSUTRTTRSOGA82334302//,*+)((++))&)(')&%%%%$#$$"#$%&&%%&'$%&%'&$''''''')&()*-+,,,,--.--+.--,.+----011//1.011020245587879575686:6786:;;<<::96653.-,+*('&$"%$&%'''%%$&%'%$%&%&%#"%%$&$%$%$%'&%%%%'$%#'(),-6:==;<7203/23,&#""!""$%)6ANJIHIGDEFGHHIIHLKLHHEJGIHOJNNPRQRVSTVVWVTXX[[\``Za_\_[_^Z\^`]^\[]\]`]__][\XNID@>@B=821'))*(&&('#&%%$&%%'%(%%&'&''&&&''(+)*(**,,032732230113/,/...-.0.//.20-/.,.,*0+*)-+,--377::6IkcSw[Ef~t]k~oYM\fwwhR>GTennlYDAKTUVR?-+1,/-)$!#"##$#"#"$&#$#"""####&%$#&')*++/036B[kzE-0./*--.06PO3+((')5>>DMCb}U5ja810-,.10124627?6F^C74:=:=9:<9:84345535./--,*-,.398:GFHFGEFFHH=ENdqsuyxvxxwyyvxyyyz~}yjlz|~~{~}~}~zaA=@A2*.1006667-&&&'(&&&'&!## !#""!"! " !! "##%$%0<<;>CEHPWTYYZYZS[^?5..00.5999:9;>;<778==<<=;CB<==7B>BB>??ADEGHJGNMR_`djikjkiokkjjfiikmkkkfjhE,&,%$%""" " ! " !!!""  !!#  &+(*')()((%$''**'&%$$#&$%%&&%()&%&&%#"#"#"#!%&(&'))**)%!  #()-3220.*(+%""%'.,09DJJLJNE6."ohnlmnlklkkjehd]]WPMIGHFQRW`ckqw|xtnlhdfdifedefgecafedcedddfbfggceggglt~yphc[VSPRSQVSTTUTVILA=:43330101-+,,(()))(*&()''&'$$%$$##"$#$&%%&&%%&&')&'&&((((()'*'(.++,++,,.,--/./.---*0--/1011011/02/202/1131334345264487899:>9<<;9<;==97925./+-)()'')('%&"&&')%'%$%$&$#&$'%%$&&$%$%%$#(&'*,/236;987531/012,*$!"!$#$%)6GNJIJFGEIGHIJHKLJGJJIIIHJLMJLNRRSVVVYTYXSVXXWW\]\\^[ZZYZZ]X[\\[\[Z\\\]\\^[^ULHF>=>@;951*-''(&')'%&&%%'%&($%%'''$'*'))()+)(*++*+.-12242422000.,-,./-//0./.11-0/,.*+*)++,+--1123695Hey~uOjhE\{}W\x}fIKYmv|m`F;PcE3187:=;8:8899:55355..1.+*.+.679?EDEHIEIFFC=EN^otst{uvwwwyxyywz{}~{koz{|{zy{{}~c?;<>1-/../5668,$&(&(%&%%&"$#!!#"!"" ! "!!#!""%&"-:<:?AHKPTTWZ[ZWQX\=20--0/5;=:;;;=96738<><=><@EA;;6>@=@?=?BAGLIMHMNU[]dehigjihikghhklljhiehlgF.#)&"%##!" ! !#"! !!!! # !  "!  &)(+)(),()#%'**)%&$$$%%''%&&$'$$%&$$$"$##"$#')))+*))*%)$$"!  !!"$%$""! "#&&-8APJHKI@4(ppqporopmjkjgmjecb[[QOIIGJPT[_ejq{{yrqkigjfjbfggbecfccfeededeeefdheghiv~xquxzvlc[[TXVRUUXRTSSMKC<953310000-.1+)+*(*(*(*()'&&#"###"#$$$%&'&&$$'%%(&%&'(+(('*,)'+()(,+*-)--,0.---/++-+/-////2.01312//30/1101122411211267555558487:8::;=?=<=:9<976331/.,+)%$%%#'$$"#$$$"$$#$%$%&%%'&%&%&(()+-,.+06364420/0//--&"#"#$"%)9IOJJJGGDHFHGIKJMIKKJIKKKHLLLPSNRTVSRTSTVUVSVVY[Y[ZYYYX[ZYZ\XY[XZ\X[ZZ\][]^YUOLCC8730,*'&(&%&%$%&%''(''%&%&&'*,)**))(')*****+,./27414141.0/--,.-.-0101/1...1.-,)))&)+,,,./24555=TmsrnpVSyxIJo_MmuV?PdnwiU8DR^rmkXBBJLDKF4)%&$%$"$"#"$""$!#$##$$#""#$$$$$%$#&()+.-,34@Zjwm6,0/+,/,/2BVI8-6L*:@ABF@`Z7]k;32.-./0/1763;>4N_D72=98::;;::86464444/+--)).*,7;=?FGFFGHIFFCCBNcpxutvsuxzxvwuywx|zvimy~|zzy}|~~y}cB?7686:8=?<@;CEFFGMHNHNY\]cdkjlkkiiijfggiihikigkgI+$$%%%%#"%"%"!!! !! !! !! ! ! )'*'(&()()&#())*#'%#%&&(%'%&&'##((&'&!$"$""'*))*))(&'&'&'%$   !##"0@AILGGW=0"vtwvutqsrqqrnsqlnjgdZUPNGHLRW[_egoq}~uqolhigggefehdgdefeffffhdefceddehz~wqkgpuz~ztde[]WSWSXRQSROOC=674221211./.++)*)*)*(*((&%%'%"%"#&&"#%$#&%'&'(&'&&&&'*&*((''&)()++,*--+-,---.,.--///./-2/2300113122120032112531011243422221246556689<::;<;9;;=;=;:7601-)('%'%%$#$#%"%&%%$$&%&$%%&'&('(+,,.,),2754211/.1.-,)$"!"! #-;HPJGJJHFIHHHHLJGILILJNIKLOKMKRNQPQSSUORVUYTVUYVXX[YWXYZWXXYYW]Z[][[\^^a^\\\XOKH@=>D8743++)('&%('&&%&&%&&%$%%&'*)+(-)))((+))))))+-0121/522/1/0,--.01,2211/-/.0./-.-.+*+))*-20123356;HQMJOBay_@[}tH\wzgJE]kxp^D9OZgnm^N=@>T-8?@@KD]V7Ti920.,-/-/04428?3MbD44<77=9999864437584/,--),.+/398=FGHHGGEGDAA@Larwxvxuvxxxyyvz}y{~zloz~{zy}}}~~}|cC;=;3,-,./2:54,')%%&$&%$%""" ""$#" "! "! $ !$"#'$07==<=>?A><;>?FA?B=?BGJHKJOJIY]`idhhkmkklilhkhiihghgijmG+&%%$'$##$#"!"!!!! !#" ! !!!!    !"&&))(*'+'*&")'(*&&$$%$%&#&%%$)'&$'&'%#&##$"%()()'(())($''$" "#((09HRJEBO;5'zy{xy{x{yvwwuvrrrpnnkc^[QOMMQXW\adipv{vmjohjhhfiefegfdhifhegbeeefeegjz}ume`dhmwz|~wod^[WWUVVRVUQSF>673343/4.0-.,**)****(()()&''$$%%$%&$#$$&'&'()('&$)'('()''('(&''(+*+*-+*-,.-+-.///0...-00/111302/211142113333411122244433421234154656687688678;<::?<><<;950/.)))&%##$#&%$&%%&(&$&'''*()+-,,)&)+235300-/0...)'"""""#.>JOMKIGIGJKJKKLJIJJKIFKKMNOPSQSRVUUST[TVXVWWWWYWYXY[ZYZXYZZZV]^\\]^]^]^\_```ZNMFA=>@6730,))('(&('&'&&%%'&&%%&)()))),))+(*)'*)*+)+/01411020120/0--,//000//-.0//*-,,+*(*,**++,.11534535=9;8B_uwIBj]@h{qR9SdqugR:AYbjk\N95226-'%%#$!"" #""!"$"#""#%$$$#$$##%#%&%''(+-.0347B[nzU,./,-*,0/2B[_<+9/8;77765127431-...,.,,12;6EK_mtvvwstyxyzyxxxzy}wjowzz|}{z||~~}}dD>@95)./,.6665+%'%%&$$$$%!"#!""!#$## !! ""%%"#$%.9?<;EFLNTUV[\XUQ]V>4-.,-/5:;9::;>96578;B=;;<=>=<<>;<@@B>@?BHHGILHMW^beciemmhmliijihhjhiigilgF1''$%(%#$%$! !!" !" ! ! ! ! ! !',**())'(&#))))*$%$$&%&")%'&(('"%%&'%%#!)&'**+(('('''&'" !!%(-6@PIFB=,*# ~~~}{|}}}{z}wu{wswvqohcaZUSZY^cfhhpt||unkmijhefffhfhhdggfdbfhfhfgbr~{qd^Z[]bjnu|~}xnj_[WZWUUTWPIA:554642410-.--+**)'()'(((*'&&&&#%$$%$#&('&'&('('''%*'%(((')(()))*),)-.-//-////0./00/2/00111110011/02022000312212225226325223432533355334667386999;:=;=?@<882.+)'&'''&&%(((''&(''(+)-+*)(%)-247320/00.0..+# ##"&2=QSKJIJIILIJILHHJJLJJKKKLQOOSRQTTSTTVV\XXWX]Y]Y[]]YZZ[Z[^]]^[^^_]^a``_`^```^XPOH@>?@;:41-*+(,'()(&&&'$&'#&%%((('(*'*)**(*+)+***+)./3464250121..,++-+/,--..///1,/-0-,-/*'()+--2.0435598899:Nav~xsa>NtxHKot]8D]lzul[=9QTTXWG8-)''%%$&"#""#!$$#""##"###$###!"$#$##$$%&))-*./216?\n|j8/1..+-,-008^B*-/<>=CIJWX?Bj:/.,./0./2680;=:QfG86899:6868751353312/.-/-.--/495>CCCJFHFEDB@GIeptvxyxvwsttxwwxy|~{mqu{|{{{}}~|zz}dC9B:4,/,..4564,$&%%&$!"!"!"""!"%!$ "#""""#$$$##%&19:=@?EKNTSXWZ[XU\^?5./..179<<;>>:;9967<=;?=>AC>899<@B?=A>B>=732/-,)*(''()('%)'(**(,,*)&%'(-04330//1.0,1-'"%""%4BQOIJHIHHLGNIKKMKMOJLKMLOUTUVURTSRRTUZ[\__][[_]^]^__^\^_a]^^_a]___```_b]^^_^ZQKG>:=?=6700,*(((('&%$%&%'%$%&&&%%'''(((+**+*)**+),*,,3226262/111--*,-/,0.///1/0/,/,.)/-+'+(**-,0215656968789:HR`^USI:Yur@Rstc:>Xgv{h]>2@FEML<0(($&$'$$#""!#""#!!!""!#""$!###"#%#$##$%&'*,,1/246@\l|}B-...--0.-.'21+-/;=?DIIUWA?a80/.0.2./23609=9LeE5679:;::<76414544421.-.-..0.573;ACFGHFDDCAAFFapusvxtuwywzyywxv|}yjnu~{x{}}|~g?>>:2*..--4646.%&%#%&#$!##!!!"! !""#!! ! $""#""%&0??<@@GLKSUTV\]VUZYA1,/-./489796B;?:866@@::9;A@??;@BCFHGHIMLS_befjljihmjmmhgeilhjijhmhE.$'&'%%%$$$"#$!"$& ! ! "#! !""  %')(('))'(' #')*&#%$#$#'$%&'%'((%%%('$$""#$%(&(*+))&(&)&! !%.=KQLSXK8*{{wxttrrqrrrtvvv|{sqnollkllkkihhljhijhiivtna]Z[VYUW[``fqt~~tkd]Y]XUUHB=9557444413--/-,**),*++**(((()(&'%&&%''%()))*(***)*+*+)()(*)')))*,++--0-.///03/1310.1/.21302311032144441325224243411634535245021432127544654675678;9898;<>;>?BCBDA@?<:94,.+*)*,(,+)+**()(&%'))*.564320/.0--0*&$!"(7BMPNIIJKIKKLLMHIGLMLKIPSX\ba_aabaa`ccbbcccbdgedfedddfdadcdcbdbabbcbdbbd`^a_][SLK@9LfF:49:87766876145432/0../0+---535?FBIKORVT[\ZZT\U>.//0-037;:98A?=6888<>?<>@CA=<8=>CC@?ABACIKGMKMLW[adfjkillhkgiikieikihhhmmE2((&&'%%$&#$##$!#&"$! ! !"!#"   !"   %(*+)(&'&()$%()*&#%&#%#%#&'$$+*,)%&')"&%$&%%)()))*)&&&'   !$3IPVOL`E<0#~~}|y|zyzz|}|zy{zxz{vvvutvsqtpuyuma_^]]XVWWX[X`elux{qgc^ZZSM@=:2866343221,+/+,+++,,++)())*)((((((&'''))()*&*),,++**,*)')))**++,.//1///000/22231////003133202332230152223457365644425532374362643443616345586835<9:<;:;@=?@BDDCDDDCEBBB;8631.,,,++**)*(*('((*,034432/1/1-.**%$$&7DNLMMMKHJJJHKLJKMLKLIORZcjgliknnklnmomppollooppqnqoqopnpknmolnmmmkklkghjhgfd^VPLC>?@=74..)*(%)'&'(''''&'&&&%$%(((**'(*(('*(+++-*.,136595411301-,*.,,0--/.10/-/,.++,)')()&(*+./132556593665446575455?Wht}olX:^twc@3M[[kmh[M:(+*+)%&)%&$$$###$""#!! ! !!!"!"$$#"#$%#$#%$$$&*()*..1337@Zn|j9020/.,.,/-,10**5=>4(-,.+5;19-'%%###"#"! !!!#!"#"" """ #"#""!#$&/8<>@CFIOTTUXZZYTX[>4/-/..48<=<<>;;68468?=>=;?FB::<:A?>=;C@EJIIIMHLU^]fjihjhjjlhlhhkihjeiifiiF,%&''%%#$%"#$$% %!##!" !!!!!!"! ! $'))+&&''(%"')'(&%$&"$%%'%'''+)-)()'($$%$%$#'()(**)&%##""$(?>A@DEEDFBDGFIKFJGFCA:8931/.)***)(()(*+.365330//.//,*'&$*:MQKJKJJHJLLJJJLJLMIKMMQ\gmjmmoopqqoqqrrprsopqssspsssrpqtovtrstssusvusttvuurpk`XME>A?=54-,((&()(&)&(((('%(((('')*)())++)*)-*,*,++--0458:44300///,*,+/-.-..0//20/.*-*)'+''()*)/+-1424315211320302626581.,-100//4465?8MlJ:6:55996:9964543534,00-,-,*,389=CIAEFBFGFEADL`rtouswwwyxuywuyyz|~~ykns}|{}~~{d=?==2+.+-,4347&'%$%$$#%#$"""!#"! "!!!""!####"#%$".;?@>E@JNQUVZY_WSZZ=4..//.49:?;;==:7645:?>=<:BGC9::=A@@<=?AFEHGGGJLT]_dhkjkfiomkjlgighjhjfihgE.'&("$$$###&#%&!%$""" ! !!" ""! !"!"%" !!"" $()(+&''&'%!%'**&'%$$#$&&%%$&&(,''(&&%$#$"%%(++),,*('"  !%)9HQVUHO;>,#}{~{~~{z}|}{|~~wvkkfeac``b]`\Z`YZ_Z`giou|}wlf^VI><::578642420./,-0/./-+1.--/.//.,,,.,,,,,..--.-.0/.00//1-,-,-////0-/12012/-./1/22136311334427636446263332444549:88978::98=:<:976858566754536588:<=><=:>;>>?B?CDBFBEIKFIKJKHILLKDFEA:96/.++(()(*+-/7544121/1.3+)(#.=RPNLJLKJKIHJNJIKMKLLKQU[ejjknoonqnpqsqspqtpspsqtstttrsussurvruuuvutxuvvtswvrlaYPA>@A:42.,)*')((()())'&(&''((('()*(())*)*)**+)+)*++/28756552..-,*+)+,.,+0,//0100,+*)''('(('*)*/1/11131/2213442023223213529:824/AS_p~}|vgYN3.34366.*'&(%%'&%&&$#$##"!$$$!!!#"! ! !!###"##%##!!$##$$'&&*)/.0530@WhwW:742/--..0,+++*2<=AFKTaA7S850-,/1/117519@7KvM74988:9687763442652-.,-,).,-:88;DCEIDCEHEF?HEcsvwwvvwuvuwuyxwxz~{how|~|~yx~{||x}eA?;<1+0-.,2688*'$$#"## !"!!""#%$"! ! "$! "!#%%%->>@>@BINTUUWW[US\W?3.0//057;<89;<:;:59;?=;=>@HA;=<;C;?>=>DFIHIKKKOU]abbhhjimkijkkiiekikjhkjjJ*'(&"#%####""&"""##%$!  !! ! !! "!!"! !""!  #'&*')('&'"$&$''''##"$$%&&%%')&)*()&%$$$$!%'(')**')*%#!!! )5DORV[OOH3-#{~z{z{zy{~{|z~}}~zxvrppmklljhhedfb_`a\]aemtx}~ztj`QA><;:=7574331220030-0,.0/./1/0.0/0//-/2/121052412435466432125454323445555111111161543443/1336546784:3432215456677796898<==;<<<:<:;<:99;8899::<==?@><=A>>>A>E@JFEDCEGIIHJJNMKKJKFLNLJFDA;801-,*)**-3658662../1-,)'2CGGQ}`C:R<3/0..2-12753:>9IvtH34989989A=<=75644327Rp'2.1367=DDGGBDECA@BHJ`qvutvuwuuwvuwtwxy}~{hmy||{v{y{|z|fE>;;4).)--6675,%'$%%#$!" ""$#$"#$"""!!#"# !$"#''&0<>;<>@7:48;;=?;=B<@<@?AGHJJKNJOSV`edjhmklihkkkjggggjghfkhG+')&'$$$#$%! ""%$$#$#!" " ! ! "  !! #(&)'(&''*&"%&(('$%$#$#&'(&'))'(++(%&%$#%#''&%((*(,,"  #&( %6@UZZWSF81% x{yzywzzxyy|z|}zyz|||{}|~{{{~~~}~x{zutsrplkieb`bgjmx{|~|qbQJA==;;89:774641403231110101/221201110041441545547::6:9788778799687:99;99869:6999888;8785464547697::67836235567676379858888:>;=<=<=;:<;;<;;;:;<>@C>??=<=@B@CEACCBCGFGCIJGJJKKNLGIJJJIJKLJEC=752.,-14785564210.-+*4CNPKLJJKLLMFIJLJMNRONPPWbhlnnmopqorrpqqptsqtrvuvtttuvsutvsvuwututttusxuvwxvxvmcZSD@BC;85.*,**)))**)*)**))+*)&)*)),*,-)+-+,*++*+)0/,2236755410..**,+,.--.--0.-/.-+)+)*&'&'''(*-.-00.//.0131.1001010/12211002.10.,0/01889<;=?>=@A>F??>=<96621/.-)+,(')%''%%%($%'$ "#"""$##!#""!"!!$"! !###$#"&##$%"$%#$%'&),10/456?Ujt}F79673/010,/,+.8><@DGN`A7O820/-020.25426@;AmmH4776586:==>=6463183?ai*-/.579@HJEEDEBBBBCDHclorttuvstwvtuxyvy~~whlvz}|zv|||}~~}fEAA;2,+,+,3746,&*''$$%"#!!!$!%!!" #"#""!!######$$.:>?<;4:6=?<=?@:;=;8::96745545572432222257444483766777;888=9<<:=<9;9<:=99<:=?<==<=<:;;99;<=;<=>>?8:;;:89::9>@<=<9:89:99;9<:8;:6798899=;;<<>??A>@=?;=?=??=??===<=A?A?@BCH@EEJGFCFFFHIMLJIKGHHHFLIKMOJQIGB<92778:984531//1..5EOPMLKKJLKKKLKLLNNNKMNQ[cglonoqqtssrprutsqqrtuwsuqwtwsutuuutwvwttstwvwyxyyvxunfZSIEDD??7/.+,)+(-++**+++++*+**)++,,*+/,-0*-,,,+,,---244765331.-.-*,++-+-../.0.-/.,.,)'(&((())++,,.000012230.00.//0./.2101/,0,-./-/./02224525545346244574321/-*()'&((&#%$$%%%$$$#"%"!!"!!!!!"#!!!!""!""#####""##""#"##$##%&+-220462=Wl{T5676620.3//--/:=@@HHNeD5J70.--.00/43518?<?<;9>B?A?><@=BD@AC@DBDC@AA@B?B@B???A>;==>@;<=<@=@;?A@A>A>?>=@?=@=???BAD=B@?A@D??@>??C@BDBDDACDFB@FFFBA?ACB>BECCCBCDDBDFFGFJIHGEFGJJLMNLILJIGJLKLOQLNKIJHCE?B>:643532401=BGGQhI6F940--/21146644:9CycD85<<;<=;::<;78965:7522521413:9>AEJHJJJFILGBBH_sruvtwxvxtwvwwxx{}}}xjmp}~~yw}|{|}|{dA@>73*)(+,46661+*+)(,'#%##"""!"!$!#""!##!"!#$$%&%-7;?ABENPPVXYZ\]VYY@0--/+.2:::=:><:7979==@;<=BA>;;7@B@>=>;DGGJGHLKMT_cijklhilklkfghfikglkifihI0$&(&%%$#$ "#!"$"#""!! "! ! "!"! "# $#"#""&)$*()'+*)#((*('$%#$#%%&'%'&''+)'&$$$$ "%$&&(&%*&$19/)! %2BRIWMKG2&wwvuvtwqvuurtvtuwvyxuvxvxxxyyyvwuyxxyvzz{{|z{}|{}}~qlfc\XRPGJFC@A=E<8:<::686985>9;=>?@ACDEIKIJJGLKLNNONNMMOMIKJKLHIJHJHIHGEGFFFGGDHJGEGFHGGFHDJFFKCKIKGKJFJIMGLKKMLKMLNLOPJMOQOTQNVRRQOTRTVSVSTTXWUVTWSXWXTTXRTTQNNSMNNNHLMKOKKMHKJLKMKIGMNNKOMQONLHJF@A:8722328@MSRLLKLLIMJKMOONNQQNOMSXafhmmpopqqqqqqsssrssttttvtttrtstuswwvuuwvwvxuvxxzzyzysf\VIBB@>:3-.,-/.102153034643531444457647622443412432448769852.,-,++)**,,.,/,,,,.,.,,)((''**)(+,-+,//--.-/.0/0+/-/-.-0.-.0.../,++*.,.-.-.-012.11.2//00//-..-...+*)(&(&'&&%%&%##"$"""!"!!!!!"!" #!*!$!" ""!#$#"##""!#$%&$&()-.23445?WixyA17785510.,24/;@;AHGMjJ8B;10,,-1.003636?:C~gK92<;:==<=:<85:=>@EJNJMH?=>95<9>AGMKLNKMMPJBBI^mpvtvxwuywuwxwuyv|}|winu}y|z{}}z|gD<>;6,-+)+6577.-+-,.)&%$##$$"""!"!"!##"#"!"$#$$$%/8@>CBEHOTUVX[XUV\[C0/1-.138=:9;B@<69789:><==BB><<9<@@D:<>>CIKHHIKJO\_dihlinlghmkmmfhgfiecfhfJ-)&''$(#$#"#"$#!####$$!!!""!" ""!!# !'()&++())*($')*((#%!$&$&'*#$%&(*+))*(%###%'%&&%(&'"/<8.( $68FQR^LB:$ ttssvuupvsuursttrwxvuvtxuwwvtvttvuuwvxwwxw{wwz{zz{{{z}~~~~~~{xvrnkhhaaXXTPLLCEA>>;8=<7<:;=?ACADDCDKJLNKKMOPQVTSSSTUSPRQUPSPSTPQRPOORSRRUQSPPQLQSQTQXPOUSTPXVVWWVWYZZUXWZY[[[\\\\_]^``_baab`bc`bcedbddfcaabdbbeddeeifdcba]aa]^\ZVXTWZUTRLPOONMMOMNNOPQTOQPQRSQPSIFC?<95:DQRRJMNHKJKMLOQPPNRRLNOQQ[afknnpqqsuprpsssrqrtustutsuututvtuvtvvwwwxxww{xx{yzvpd_UIAA>:84-.,/1287799;9;:;6:74396885747945454663977698:79:97200,,+*)*.+.-.,.,-/.--.**(*)()'))*+)+,..0///00000,1--0....,-,-.,--++++,+*-/--/-00.0+0-0-/..,.*+,,,)()'&%&%%%$'&%$#&%!#" !"#""!""#!"! # " ! !$##""$$##"%$$$$&&&(),1/1241?ThwR3:77443.--003;>>3,,.*)3556/.+*'+*&$#%%###""""$""%#""""##$&'%$/;;>ADBHRTVV[Z[XXZXB2/1/0/26;8:9><;5958@?>==<<@?<:<=?BBB>?@@JLMNJJPW[begghgnkjklikiiihihjijkdG.'%%'%&$$####%$"""###""!""!" ! !!"""" !! %(()'))(&)&$&'(*($$$#$$$&&$$$')+,*)))$%$$&&$&%%)%# .@;80-!#)47SU\ZO9*vpqrusppsqosuutruxqtuvtvuyusvuttquvxwwsswuxuuzyxyyzyuyyzz|{|z}z{~|}}{{yxuqsmpihd_aX\QPNKEBCDDE=BBAD?ADDEFFEJMLKORQNPRNOORPOPPNRSSRQQQQQRORUUTTSRRSURWTZVUSXWWYUVYZZVY\Y[]Z]`]^_^]_^\_]c^[a^`a\ba`aaddgbacfbecbb`bacdceefffeghghgghjigkiefhbfc`_][[\WWXWTUPUNSVUVWXSUVQIEAFNXRROMLLLMKKLMPOQRPQNMMOQRXadlmmommppqpqoosroqrptrsrrsqrtrsrutwvxvxvwvuwxu{{yxria\KD>?@A;?@<9::6587999;7;:45668:98:>?:;>=;:>:753./-*****+,,-.,,,./.,-)*)()*)())*++-,-/0.0/-00..0///-...-./*--,,++*+)+,,,-,.-/.-,+./,/-.+-/-+,,+*+&%')%'#%$%&$#$$&#$$#"""#!"!##""! !!" #"""!#$"%$!####$$#$#&'(,/02343?Uhtf9;:87433.)/./6;;>DJLorG9?811--0,2205855:7KsgE83<:==?=;;877742/00311001248=BHHIKKJKNOMJF?>F^p{vwvuvywuvwvuwux||xlgu~|zw|~{}~|{g?==;4-+++*4769-&&%%%%"$"###!"""!!!! $!"!#""$!%$$%1=:GB>>;953546:?ACC@CC>A@?>==979<989<=6777358999:<@9:9:99>:;88//-+,-***,,+,,,/,-.,)++'(**(((')+*+-,./1./0./0//--.-/1/./.-.+*+,),+)*()**+.,0/,+--,+.,.,+-+,-+)'+'&%($'$%##$"##""!#""" ""##!"""! "# "! ""!!!!"$$!"$$#$##$$#&((,014544=XjtyD98885960,*,,056A@LRooF:952--+,.1//6847:8LugH98?>?==;;;:973431112033343457=BJGMPQLOTOMJ==E^nurytvyxwyxxwvxwx{~wkkw~|}}us~}|~~}x}fE@>?4,**++3539*$%$$#$#%"""""!"!!"!#"#""!""$##$!$#,<:>BDHHMNTU\^YXVZZ>5.-2*/19>:9=><=7778?C?;=:;@B==@>999?7:9:>668986::9<9:=<9;;:<@;98830/.*-)+,+--,-+/-/.,++)(('))'*$(*)+,,0-0.-.0.,-,0,..-.-,/,-.++*,+()*)*+++,--/0/,/+-+++++-,/,*+,((&%%(#$$%##"$""$""$#!"!# ""#!""!! !!!"""# !"!##"#$$$"###$##&&)-.-4233>SiwP899:79:6/((+-05=BJRmuM;971,-,..11.5725<6L|dI86<<;:<;;:7642210.00//122343688@AJLPOMQLPG<5+*+(-8747,&%$#$$$$#!"!""!!"""!! ###"#$$$!'%.<=@?AFHLSUVZ[ZWUYW@2-,0.29<><8:@<>8759A?ACJKGKJLT_]ddggijkmglmjhjkllhgckejK1(&'"$###" !!$!""! "" !! !"  #!!  #+'*''(&'*&#%)('+%#####%$%##$'+"'$&'$"&&&&"&#" #8=>@;90'!$*8EO_fWN:, mptpoprnpqoqqqsqrrqtrsrtsssqprqqrqrsrsstrtpsssorptvrttututuxtvtvvzvtxvxvxwvwwwxxwyxxxyzzz{{{||~}~{x{uvxstupppimnpvzzsh_TPFIGEEBDEHLKKHFCDEECEHFIGEACBDECFGGFDFCGHGHFIFEFECEDEDIDBHCJGIIHKKJKKLLJKLLMNMMPRRQURTRTVSRVWTTVSWTUVWVUWWWWX[XZWVZZ\XY^_^b_bbdhijjosqsqpppmiihfgbeadbeec^[VQMLLKMLJPNQOLTPPUXXXYZ]]][\[[Z^^__]^``]`]]`_aa`bc`_ddbeadedhghfhifjhie_ZNF=>>?>;?=@EFEGGFGHGDAAC?B>=9><;9:9;8676777::=:;>;9:<;9:89<74201.,+*,,-,,/-.*,.-++)&)'('))'')'+,.+,-/---,,,.--+-+.--,-.--,-**('*))))(-,,.0.,+-,+*+**,-*+**)&('&&#$$$%$"!$#"!"!"!!"# "#"#" ! " " !#####"%$$#'#"%%$&$).124356BVsoRA=9/0,+-011/6745;8JcI7275655402/-/++,*.-,.,,-,-/--/-226:;CGBEEB<>63.0*36443,&&$$$$$#$"" "!!!#"!"!"#"%#%&%#%$$,;@@A?GIQSTWWXXXTY^B1.---1679>;;B<=8868;?B=><<=@;;:@BB??=?@BEGIKPIJQ_\fgijhkllgjjijijdehijijjN.('&$""!!"$"  "! !! "!! "  !  !! !'()('&''')#$&&('###%##(%&$#%&'%$"!#" " " "#6CA=:@>3+ !$);DScZ_M6,"xpsopupnpqrnoqrprqntosqqrurrpppqqqstoqqrrrrqossrsruurqustutvutrutuututvwwvxwxxxxwutyzxyxzvxx{yxxwxzyyzx{|{z{~~}||yxyrvrosuyx}zundcZWUTTQJKHONPNIFDBCDDEFGEEFFG@EDDDBDDEIEDHFFGIHFGHCFEEDEDDDEFHFHJJIJJFILIJJIJKLNJMMRTNROTPPPSSRRRUUVVVSSTVXXWWYWYWXYWXVXWXWYY][Y__`aahhhmlorsqsussomjkjhfkijjbSNKIMNNNOPOLMRTWXWVVY[ZZZXWXZ^XZ]ZY[[\\Z[\\Z\]\\[^`]___ac``b`bafedcf_[XMG>@=@ABCBCFFHGIJJFFDADA>=@>:;;94968856678759=:8;8<9:898:9=:;:610/,,,./-----,----*))*&''*()()**+,--.,-+.-*-/..-/-.,.,,.,-)+(&)()''*)(,+-,.,+,)*+)++,+,++))&(&&$&$$%#$$#"""""" ##!!" ! !!! !!  !!"""!!"!##!$"$"$#%"$$$%$)*-136335:Vftp@5877573433/0.256>U}nK=88-1,.+.2123546<7JdG6360//+-*++*+*(**-+*)+*+,-+,*+..-2479<:@@97658=>B=>?ACC:=<=?A@@@?CCIIDGJINU_ZdieighijhihllkhjifiggmmL3'&&%$!"! !  #"!!!!!  !! ! ! !! ! $'(()&()')'$#&('&#%#%$"$$$$"$&##"#!"!  #9B>@?>FA5' (+6KJYQ^J8*#trrqppqprpkqpnprnsproqopqrrsptqpoqsqrrrsppqrqppqpsstpqqqutttsttusssuuuusvtvvsuvvwutwxvwtzxxvxwvxtxxywyvvxvyvvvywvwzywyyz|zz|x{|~|~|{}yxutsonihbbbb`a\W\TTRQMHEDCCFFFJIFEGDB@CBCEFCEAFEEGHHHJGGEEEDDACDFDAH@CBEDDHIHGJIFGHFGIHJJJMLLKOJOGGIGHGLJHIJJMOMQNRSSSTXVTVVUTRSSTUTUVWYZ\][Z]``cbfiiloqsvuwwuurpqqtpjQMJNMMNMNNLNLONSSSXWVXYXXWUXVYWT[WXYUYZWZXYZZZZZXZ\^^^^^[_^``_]b^``d\ZSLC@?ABFDFGGFFGIIFFBD@@B?=>A:79<=96::9;;:;<96::;8:;;6::;<9;><=>982/0-./+-1,,/./,,*+(&''$)(&)()))+----),-/2....,0/,-*,*,.*+**-'''(*%))))*+*+,*-.******,-,+*)(*&%%&%%&#%""#""#"###"#!" !!!#!"! "!!!!#"###"#$$"$"&#%#$%&&&'*.224348=QfnP6:955632544312416Fv{Q=97/1/,./5422754;:L~dJ53/+))**,*+*)+()*+(,4471+,,-*,15444676=>@>>=C^qrqsutvwwwwwvxvvyz}~ziityx||yx{y|{}yzkG9@=;;32.57869*%(%$$$"%$$$###"$###"!! !""$$#%$$&$/@?BBEIKKUTTW[[ZXY[E2-.0/04:<<;;@@;7879@B?B>FEEEDCEEDJDEEDC@@?>@=B=AAADDHFCDGEAFCAA@A@AADBCBBAA@<>9?=<;<@=>>@?DCGIIIFFNFOKKNNNNQQPQQTRSTVXXW\Z_]edcdfghlmrruvxyz{|wlQMKLNOOONLKMKOQQSTUVTVVWVSVUVYURYVVVVXYWX[YW[YZWX[Y]ZZZZ[[^[_\]a_``aZXRMBA@BDGFFFFFDFIFDGD@=D@==>?=<:><>:;::<<8:;;<9:<;;=979;;9;;;=>;9:;38870,,/+....-1-+*('(%('&('((**-.--+0//--.00)10-.,,**-,)))((''%)'()''())*+))*))*))**+**)))&%&%%#&$##"###"!"#"#!"$"!!!! #!!" """ !"!"$#$##$$%#$#""$#%&&(*,4434358Ngo_79576755664241344,B_msrwvttswwwtvwuxx}|~{gfu|||}yvzxy}|{x~kB<><;773058778/$&&%!&#$!&$$%#"#""# "! !$$"$#$$$)$.9::9A=<7849:@A:>>CC>?=DDGJFNLMU]ddgikgiijfjjgihkhffhkkmlL0'&&%$"!" " "!   !#! "$ !!"(('')''%($"#)(('#####$$%"$(&%#" """" ""  $?9<@;>DA;550$# %8ESWWTK6(sppnprqtqrrpsorrsrnsrsoqqptppqrppqmsqsoprqmoonoprpqqtrsrssssosqrrurrussrquuutusqxtsussqtutuuvuutvvsuvssrrsrurrquvvuuuorwuornrrpnuprusrrtqpqqrsrrrrsqrrsqqtssttruqstrprsporopomjgdg\[[]\b_`YZXOGGDACAA@BA@=;?@@AGFGEEFFGBEDC>AAA>ABECAA@?=???<<:9<9:75987978986::65<:64865798::879;><=;>A;:B@AFGIHJMNOSNOQPQRORUYY^`^b`efgdjhlmosuy|wgQMNMOKOONLLMJNKQSRVVRVUUWRSUSROUVUUSWUVVXWYYZYYWX]W^Z\\[ZZY\][]^`]aa[UQL@>CECEEIFGFGGDHBGED@B>B>A>;?>><=;=:9<<7;9;@=9<>:=8;<::9=::=@::><7:217;..//-..-.,++*(%('&$)(&(*+----//-1./1-.-.-..,-,,-,,)*&('((&'((('(&*)((*,*)+')),*))((&$'$#$#%%%$#$$$#"##"#" #""!"!"!"#"""" "!"""#!""$###%"$"$$$##%&').3115319RiqpB6777743422/2022110==C948/2*,.110509459;IcK92.+)*()('&(()'*'')*16;5)*-+)*08::9-366:====Cborqsuvywxzvwuwuwzy{~xilu}}xwyz|~~{|kC>9:;985/36426/'&&&$#$##'$$#"!#"!""""!#"#!##"#$%%-<=@BDCJRSTZ[X[YSZZD2.-.,/4:<:;9?>9685::AA><@??@GEHIHJKKV^bdjijjjehhjlihfegggfghljL2$%##&"!" ! ! ! "!"! !!#! !#! " " "%('('&('('"%','(&$$$"$#&%#"!#"#%#"!!!""  ""'=9?C@DHE?<@:.# !*ERRTVRC3'pnppssrprqtpsropsspqprqsssprqrpppqmqqpnpqtoqonsnqpqosmqopsrtqsqrqstqusurstssrrtsrsutppprstvsusssttttsrsruvqtsquvruqruopsqoqnqrpmqmlppprrqqsnnlmnmoonppmnpllmmmnnmolkmnjikmmieoilkhgfikqwy{xqog\ULMMKJGEFFIMMLNJKMJIIHGIGGDGAAADAAB@@?=;;87967886776587878666768778<3;68689;9=;;;8;<89;::==>?>?>@=@ACFGHGKJILMNQPSUU\Z]acedfeigihhknfYQIOKNOLPLLMLNNKILLNQKPFJMLNNKNLKIPQRTQSRVRTSVYVVU[VXY\ZZZYXZ[\]\]\][ZUSL@>FGCGHFIGIHIGIFGFCADAD>><<;:;=9;>=<<;=@===<;;>=:;:;=A^pprrrtuutwzxvwwwz|{klv|~}yz~z{~zyz|h@><@;99836:477/+(&%%"$#"$###"####"!!""#"$#$#""%$$/;CA>ABHNQQU[W[XQ[YE1.-..036<9;:;>787678A=>>@BB?>9:;@B@==A@HGLMHHLOU[adgkiljgljhfjkgkehfhfihiP,$%%"%#"##""   !!!#! !!!! !! !"! !! ""  !()'()*)('("$%+'&$'#!$$&$$%%$"!"#!""!!    #:@AEHFGD?>CJ@2&#(/DVXYYQ=4$rrsrqpsosurrrrqsqtrrrnqrrrporqqoqnnlmqtprolqkmnrqrossmuqqsqursrsoprrptqrttrrsssrttttrtrrrrtqstvtsruqustssuptossqqqrqspqqrqooonononnqpnppplqnlmmljkmlnjmkjklllmklkljkmjhhiihigkhjfeimx|zug_WWUURUW]clinlle[ROJEECGJGDA@>B@;>=>::8:;8679597565666677565766766687:6888;86;::<9;<:<=>=<;==9@<>?A@@BADCDCAEDEHKJKMTPXY]__cefffcdfc[NNOOMMQOOMNMHIIGHHJHNIJHKFHKHHJFHHIKNMLOKQNNSRRSQQTSSRQUVSTSTRUUYWWXXUUOM??DDGMLNLJJJJEDDG@@BA@?=>>?=>?>@;<<==;=====?>?AC@C@<;><;;==<:9638?<6<1./-,.,.00./0.)*)'*(*)(*(++-,-/-/00..+-,,-.+,++++++))(()')&&'&%(&()(((()'*)+''((,)))'(%$$##&%$#"!!"!!"" ##!"" #""#"#"!#"#!"!$"#$!!&!""##%%#%#$$''&(*/5455068O^r\88769646331/001.31/....22-+.+12233738;7L{kK51.+,)'''(((()(')(&,9BK2)+),),-131.-.065;:;@GZpqqvstuuwwxwtwyvu}|~zijwz}~{yvyzy~z|xznD;?>;;69166665.+)&&%$#%"#%#"!#"" !!##"#"!"$#$$%$#.=CC@AEJSRURZX\XUWXC20-..3489<9;>A97868;=<;==>B?;7;;DB?@AA@FGHJIHMMUYbbhihmijkjlhkllkfifchgjjJ0&&$"##!" "!! " !!!!&#!""!! !# !" "!! ! " !%'('(&+('&#$'-&'$%$#$&'%%$'%%$%#!!!#!!   #;EGEIEDD?EHPC3+!!&-DI\PaSI4%orpsspsrttrtrrupsrosrpsrtrqpsqtoqorqqqtmspqpprqprpnpqqstssssqrqrqssqrrqqqpqtrsrrsrrssssrssrpqrtsstrqtqqtppsprrsqqrrsqnqopnopqpnpnnpmopokolllkjllmjllhjhjjmjkjkiiiiljfghggghfigghggffr~ujc`^\[afor}uqhVMEIIEFCA@==?AA=>CE@EAAABADBACHJNRQTX[^^aa`ae_XPOJLONQPPQLJMJINGFGIIKHGIDHGEHEFGHIKLJLLJNKHIMLOMONKNPRPOMOLNRUQSRUUWXSMIFEHILSNOMKKJIBA=;:;78:7:;;<;=:<;;;99:;>>=>B?@CDBCCD@>>=?>;:<9;;52320/+.,-,--../30/+*+*'*(&*))(+++*..-/-+,.,,**+,)+,(++**'((%)'%&$$&&&'''')('*(((*('()*)'&&%$###$$"#"##"#!""#"!"""!#!"!!#!!! ### #"!!""###$%##""'$#$%$$',04336338Tfso=75663334310/-/14/021-.01.0-,0102355598GmM50-**('((*'&&)')(*+/BPU9)(**)*,1/1-+,,2788:6HZnxrvrtvvwwuuwuvww{~uklxy|}}xz}xz{xzw~kC<@=9<77/66528,('$%$$"##"###!%"# !#""#"# "#!$"$$#.6C>BBBHKQSTWXZZVW[C6-//+/18;;9<>@;:558:>B?>>AED;8;;DB=??ABCGLGKHINUZbbgghklilklhmgggiidkhcmlK.$&$"#$ "!  ! !!"! "#  " "" "!!   &'(('%'&('$%%)(&##&$"'%'#%$$##$#!" " ! !!!:GGED?EFAEKYR:1#! %(1>NaZnc=*stttsqqruusstrqqrtnrrtsqustrusqpqqotrqtptrqsqpqsrprspprqsrrrpsrqssrsnroprrrrquqqtqrqrrtrttrrrqrrrrqrpqqsqnqnrrqopootpnnpompoppnmkmmjmnlmpjnlmkkjkjjkjkhfjhkkiijgfehghggfffhfgfeddedcjt}oedca_fqywiXROQKGMNMW[WYQQKA?<=?::8:9:9::7<:;<98;:<;::9:88:89;99;;;;<;=:?<;@>>=<==>==;@?>=@=@A@C>@A>>?BB?CEGKKMJPNSSSUTOWUXVSPROOSORMPMOMOLLHGKJJIIGFHGHFHEDIELLOPOOQPONNKPMOLONNRPPLNNNONPMPOPRUUVSOKHFKIMSMPNLHJDB?885644258876687848977:9:>?>?==B?=?EA=>=?=::9<76552310///...0102/2/-+**)&))&&*(+*,,+/+,.,-,,+)*,,.,.,+.-**)((&*())&&&&'(')')()+('()'((())(''&%&&!#$#####"" " ##!$ ""!!!$!#!""""!"!!$""""$$$$%#"&$$$&&&)(07567439OerF576432332//-..10110000//0,,-/1124674<7>zpO<3.++)))')$&'('()'(),).*(*')))+-,+-+-.166;:?G_nustuvvxuvvzwwwwx}ztjmt{{{}wv|x{||{xmA>=<<874046354.)'&&%$##$"&!""$"! "#$#$#"""#%#$&&$*8@?B@FLKRSVX\\VUW[A7///-158====?A;7577<>A:>:AJC@<:9DC@>?>?BEIGKKLLTZdehkifihihihjikhghjleijjL,$%""#""!"!  ! ! ! #!!!!!  !! !(*)((*'')(#''(''$#$#"$%%"%%#"$"&"!!! !  !   =CCCFHCG>=CRU96#!#'5EQ[`eJ1#stssutrtututrustsvqrrvqsuturtqrpqtsrrqsvuorrsqrqsrrrtsssqtrssqqotqrtqsttrsqtuustturqsrrrsqprtsruqqqtrsusoqrrpqppppqqpmrpnmnmonomlllkkhhojkmljilllhlkhgijkhijhgjhhfgefgfeefeddefe`ddcgivqf__\Y]aryhe`]WU]`fv}{vwmhRQLGJFF@9:@?>=;:;;9<9;:9<;:::8;;;9;=<9<===;<<>==>>@@>AA?@?>??>>>??@AB=A?@CB>DBFFKMLNKLOVRTUQMPLPOOPQNNQPRPSPNOMKJIKNKJLHGFGHFEGFEGCJKPPONRUPTSQUTUSSTPSSQRPMQOORORSRSVTVRLKFFLOLRKNEEEE=<<633332112344335416824545989::;<==6<9979389965533320/.,,/..+.0/3/20**,++(**(',,+,-,*-*,,,,*..++,,-,*++,,))'()','''()&&&'&(')'(''()*&(*((''')'%%%##"####!# "! ! !##$!! !"#!##!"##"!"""###!#"##"!#"%#&#$&'(+.2235459QdtY4761/310202/.0..01/0/1+/...,.013556597=tpN;1.-++**((&'*+')'%')(%(''((*()**+*+,+-/53<=>F]ppusuutvvyvzuwxwu|xlkr{}|}xxzxy{|zy}oA>=?;;;3065353/)''$""#$$!$!!#!#!!#""""##$#$%$#%%&-6=>C@EJMRRVZ__YWXY?//.0//37;=9:=@;7676;>?<<>>D@<;;=@E@@>=AFGHGHLMOS^cabkihlikkmiilihghikhiiiL/#"###"!! ! "  #+ # ! "  ! !!")')'(((((($&)'('!$#$"#$$$""#"%!!"!# !   ! ! " %;=CCE@DF;:HTL11# !(=PPO^bI/#txuuvuwvvuystupsrvrsswtuxuvttvsttutstqsvxrstsrutrspuutrtpsutstusutstuturusrurrruutwsutsqutsstrqursrsrqqtoqprpoprqsrnplmnpnnkoknkljkilkknkikklhhgiijiijijkgfihefficgecefdehedbebeabcdddixuh_^YX[Zgr~oda_^dkv~|a[VXTNPSYbec`XQFBB=>?9<;;;===9=<==<:<==<<>>9;>??@>?A@CA@@B?==@<89:6264645/(%%%$&"$"!""!"!"$#!! ##"$###$"#%$-8;>@BBJNRQVVXYZTY\E41.-,/39<>;=EC>:975>>@DHKJGMMOX_dceklkmjghhkiieiihhideelO/&$##  #" !!! " " !  ! !'(*(+)('()$&(()'!#&$&#&#$"#%"!!!"!!" !" "    &:B?ACAED=;HUN5." $.@LX`UL<'tuuwvuvvutvtxutwustutwuwsuuuvwsttusurstuysursqutuvsuvvtustvtsussqutqtuwuvsvsvuvuvqustquuutrvtrtwsswturrtsrprqqqqsrnmppqpppnknpmnmmonnnkjlkjklkjjjkjjhfgljjfegiigfcgedcfdgfdccc_accdcbbem{wgc_XXXVYcuqbc^a_av{qedc^hlt~um]SLKJGDEGGHIE?A@<==?==B=?=@@;=>?@C=@A@>?=<<@=B?@?ABECCBEHGKMKMNMKMNPRSQROMMLQQROSRQSPQOPSOONPPMKJNKOOKHKIFHHDFGLJMOPPQQQUTRSRRQUUUUTTRRRSSTVYYVZUXYZ]ZRONHDKMMNMED?D<;984030//23104../-+...0./0//0-/.0/0/00.01.1000/0-./-,.,,,,--+--,00-.+***,*,*('*')*+++.-+,,+*+-*-+)*+*,.+*)*'((*'%'&'(&&'(&&)('')(&'(&&('))''''$#$"$$!"!!# "!#!"!"!!"""!"#$$##"#!$#!$##$'!###$#&&%$%#$$$%&#**/4788539Mdr}G452211/2....0.//-./01/..//-10131756:9?ouM9/-+*(+)+'(')()'''')('(&)(*+()(**),++..1588;9?=<;87;>EB<<@?CC:;:>DE@=A?CDEJKIIOJVY^cdhhgmlimjlkmgfihhihffkL1$###" !"   ! ! !! "!! ""!  "   '')'&)'%')#'&('&$'$$$%$$#"%""#"! " "! !! !&9@AABAAD@>CKB4&$0@MM^]V8)swtvxsuuxzwvwvtwwvxvtxuwuwvtuuxvtsuxwuvwytuuuuvwrutswwuvuusvtuurvwvssuuvtvsvuuvuwssswuutvuvtttwtusqxuwrswsrssqtrrrssqsrrnpnoqolopiplmlmmlmllmmjjigijhjjjiijhifhggefiefeddcea]b`fedccaddhp~znbYYYWTWZdzvia\]Z[fyrjjhgrtd\YUYZ_hpwqh]SMGCDFCEGFDC@A>CA@A@ACDDFA@?=>>=A?GD;===CDB=>BAEEKHKLNLRabfcikojkhjokghhfiikhhjhfM-$#"!"" ! !" !#  #!   "! !  !%)'((&%'&'"%'')(%$%$#$"&"&#"! "!$! !!!    $@?@ACBDC>>)uywzzvxwyvxxvvxwxxywvwvyuwuxwv{vvtuxtuvwxsuuuvsxrwywyxwwtuvxvtxuwwxttwuwvxuxtvuuwsrtvrttuwwvuuvvxvtusyvttttttuutpsutsrsrssppqqmollollnlmmnmlklmkkiilljkkhfiijfhfjcefgeedbdegedadcbcbccegft~|q`ZZXVVUXXixzmb[]\Z[fyvjhgff|voicgqzwg]XRUV[dmle`VNIGGFHBADEGFDB@A@B=ABD@CC@BFGHJJKKJNNOLLJNJIKLRQNPMNMPMROOPRRPQRSPOSLNROOOSPONKKGJGIIIDINILKNPQQOPQSRSTUSUUUWVVWSWTZZY[^X^[[[WPQSQLRTOKJD?=>7:4831/..-1--.*,./-,.-/----,,..+2/0-0,-/0/./..-.-.---,,+**+,*+,-,***)+).*+,+,**')*+**(***,))*(*,,+++)-*+)+))'(((''%$)'&'&($&(('(((&()'(%&(&'&%%%%$"$$ #""!!"!" !! " !! #!"""$$$"#!####$##"!##$%#$%%#$%$%'%%&(*36928558Pcp~h<764021/...0+-./-,/-.-//-/1.3264786;8:tvP91-),(()--,,&'&&')'&%&'*()(%+())*)*+,,.655;:@Zmrrttuuvtvtusu{vv~|{liqx|z{yv}z|}{zw~jF<=;<76:376673*%&&$"#"$#$"# !!! #!! #&#!$"%%%'%*9;=@AEHMSVU[^aWS[\M8.//./4:><::?><8;88;?@<==@A?:<;=A>@>2*+)()*+,.-)*))&)'&))((())'*,,)*++++-/436<>?]oqquvuvuvvvtwwwxy{~}xmktz|{}uvy}{z~zvmA;?>:9;7154465-($&$#%$#"$!"!!!" # !#%#"#"#"$&%*6;:?DJMPRXWX[^WTU]L8+....289::;@==:968;C?>?>@AA==A@CFDKHINHMS[_dfjkjljkhjijgiijeifhhhnR0#%$##!!  !! !    " ! '')'))%&&("$)'*'$$(#"%!$ "% !" "!" ! !   *9>>?>C0'!%'/JN^dgS=(#yy{zxxwvxzyxzvzxyzzxywyxywyxyytxxvxywxyuwvwxxxvxzwyv|vzwwwxwyzvyzxxwwxvxxvyzyxxyxx{wzwwxyxyxzxxyvywyxxvwwvuywvwtvwuuvvvuwsrorttrstrpqrroornoopnopolpmnllknmkmlijkhghhijhkhgcgfecgdfdfdgfdho}tf[VVWXXWXW[r|{pdZ]YY]\^q|~og`fcbk}|qgghirwoln{wohjo{rd``fr~{pfXONMOJJINLKMMLLKLHDDCCHKQTPMKHNLNRNPOOSPQPQPPJNPLONKQNONNLKJKHJGIKKJIONOPNQQOOPONLRQPPQQQTRSSTTUVU\ZYYWZVT^aXV[SIFF=8:86713301/0../--,-,,,+,.+.,--,-,-.+0/--./.-,---/./.,.-,,--,*++*)),,-*,(+,)**-)*++)*,*+-)*()+()('')(((()')*(***)()&'('%($$&(&%$'&'('*'(''%'()')+'%&$#$##"###"""!!""!"! #!"#"!"""&$$#"""#"$#%$"$#$&$$$$#$$%#%$%&),0656545;Qer~U3753210/.//.0+,,,-,-+*00../2032743:94arP:/)*((**)*++'''*''(('*''()'()*)'+)())*,-/2::?]jurtvurwuututwvz{{|}yolty|x{xwxx{|{}yjA<<;=996166564-*'%$$"$"#$#"#""$!!"#"!#"!####"#$%$*7;==ADGPRURV\_[UY]F50//,/2;9:;==@;7987C=@H;?@Xirtsstutvuuyuuyvxz|~vlhrz{||ywx{yz{yxkD=?9:959/74735+''%%"#$%%$"## !# "#$###!#$"$""$#&-5;>?EEHPQUVZZ]XQZXE2./0-15<:<:9@A:97439B=;?;@A>>:;=BB@>CA3@:6*'!&.KZ^`eYC6#~y{xzwzzz|}|yz{zzyy{yyy{{zx{y{xywzzyzzy}xw{zzz{y|{{yy|{yy{xzzx}wzyz|{z}{{y|xzz|}{zx}zyz{{|z}{zx{yy{xzzw{yyzy{xxxzzxyxyxxyuvwwwuwwvursrrutstqrsqqqoropnmnonmmlmmnnjllkkmhjmkkljkihghihhgihjjrx{}|zm`]WZUWWYY[^hu}xk^Z[[]\]]dx}vkaefde`sujjjllpwprps|utx}}|yyj`\VRHJHDBDEEEIQSRRPJNNNNNMNSPNQQQQQOMMNMNNMMOPROQQLLMMKNNQNLSQRQRTOQPSRQRQTTSRTUTQQPJNNOUVUZ\aa_``^W]YKCB?868631250./0.--1,+,,,--/,++--,+,,-+)*-*./.0111--.0//,..,,+.,)+,+-****+*+***))*+)*)*(+*)(')('&''%'&%((%(&&((&()+'()'($(%%&%$&%&$&'('((&((('&''('(('&&%""!"!#! """"#!"""" !#"##"%$%"#"!""""#$"%###$$$$#%#%$$$$&%039;;8558K^nzu@23222/..-0,++--*,.-+,,-01123/0.36:77[zP:2-,.-..-0*1./----,.,-//10/2.//013648978@:<:9<67074552/('$$$$%#""!""!$"!"##"$##"$#"% "%%',87>?@ELNMSPW^ZZQV]H6/0/,049<;:<;@<7486:?=<>>AEE;:<;@DBB>?CEJLKIMMNV\^cegijhihkgfjijkfijeffilQ1&$""! !! !"!!!  %'$&$'('(+$%('''%%&$%"$#$%"$#"$"#!$    #  " &>6(#!$+FYX]TT56"{v{{zz{y{}y{}|{{z{zz{{{z{{{zx}{zxzzyzzy}yx{{y}|x{}{xzy{zz|x{zy|z||zy}w}{z{{{{{|}{{zz{|zyzzy|{{yy|||||v{zz{z|y|yz{xwyyzy|yyyxvwvwvwvtvwvvusrtvuupsqsrqpspnrnompooponmmmnkjlljmlklkjjkiijkjilpxxx{ulb\WWYVY\UZ\`qy}zjb^]_`\__`mx{pcfcbhaly}moinolu{oqonx|uvt|tneaUOGCCDEDHLPURQQMOMOOONPQPOQPQNQPMMLMNPLPPMQQPPPMPOPOPNQPPQSTSQQSRRRTRVRRTWSRSSOOOMQSUTV[]^_b_`^XZXH???7675./23/,/.,--0.--,+,+--*-.,,,.+-*+-,--,.0//2/./1.1/,/+*--,)*++.,*,)*++*+*++)***+()+()*%(%(%(%%&&'''&'&'''(')((*&%&&&&'%$$%#&&&('&((&&)(&'()()''&(%$""""#!" "! #!"# !!!!!$!"##$$%%#!$""#"####%"""$$$$#&$#%%&%'(05=:>8348PcoyO141/0./.-,./+0+,--++,)-0/2110.,046;5TwO810+0//.-0.2110/-/+/-.--./1223113335679;<=;??^nqrttuututwtuvuuw{|}yliqxyz|sx|z{||~z}kG=>;=889116655.%'%&$$%$###"#!%!##!""#$"#!"!$%$$&'-88<>@FJNRRRV[[[XT\C2./0-076<;>?=@;:967>??<<@?EA;9<>BBB?=CDDHHJKGKMUWadbihkffggggmihjgjhilgjjM/&%$#""!!!! "   $&'&((*'*+#&'&%'&&&$"##"#(###"" "!" !# !!!!!! *=?CEB<4:+,$"'5RUW[[V,$~{{||}{z}{{||}zzz|{y|zz{|zzzy}yy~z{}{{|z{xz{z}yyzz||{zzy|y{z{|{z{|}|z{y{|z{z|{~{y{zz}||z|~{z|z{|~{||{z{}|{|{{}zz{yy|zzyxxwxvxwwtvwuwxuvuwttuusvssrsrponrnspqqpopopoooonkkjimmlllhnkmkjlmpwvwsla[U[ZZXZZZ]\ktx~~|ob\]]a^`_beu}}redddhein}~plmnlklwvsqru~zvuswqfaRGGDDCAGKOUTRONNNPQQMPQSPPRRPONOLQNOROQTRQOPQQPPNMRLQQRQRQSSSRSSSRUUQTVRUQPNMOOOQUUWYZ`_cbfcgaZXOD@>:568513/1/.-/+.--.++-,,+-,-,.,--,*.++1..,-0//-1.--1/1/+/,--+,++*+**,+)*+)))))+*+((*)()'('&)%'&&#%&&(&'''&'')''(('($%&(&'%%%&$%%&%&&('''')'&'&*&()'$(%$$$##"!" "!! !! !""$##!!!! "##$#$#""""#$####$"$$$$%#$###$$&&'/3479412:K_lue6431//.,-,.,+-+*+**,,+...3/2/2..1194QqM8.-)*,*+,,++,,,.,-,,**)()+-.,/--/,.1111437;:E[jprrsttvwvvvuvutz}zngsz||tuzyyzz{xyjF;?;::77156531+&'('%%#$#!#!"!#!"#!###""$#"""$%#$&*68?ABEKLQSSV[[VTT\B3,.//036=:;=<=<8:7;==D?<>?A?;==>A???<>EFGHJLJKNUZeeeihgmjiikgjigkgig`edggP/%%" "!! !   ##(''''**'#$'%&'&&'!$%$"#$"#$ !"!  !    )7>96..%#!!(*AVUZUG@)$~~}}z}~{z}|~~~|||}z{z|~y{{zx{{{{{{{}||~|z}}{{}{|{{}|~}{|}|~{~|}|}}}~}}}z}||}}|}}|~}~|~{~|{}}~|||}}|||||}z{zz{yyx{wyyxxzxx}wwwwxywwxwxvwvursrnqnprrsrsrpsoorqonnoonqlmpmomolmnlllmotvurjdbZ]ZXX\Z][_aquyz{qd]^^_ac^balv{~ugbbcgejno~wpolmonr{xsrtqv|uwxw|uplZNGEFCGKKSWUPSNOLORQQQPOQUQPQPPQOOSRQPQSSRRQTQTSROQORRRRTSTWSTSUWSUVSTRNPMMNMPTPUU]X^abdfficgbUWNH>=965632101/0//0/.----.,//-/,,,++,,,.-+,--/031293680..11*/--,,+,+).**+-+-*)*()*+++,(*())))*(()'(%&'&&''$%'&%'('+')(('('&%'%#%&$%$$$'%&$&(*((&''&&(&'&&%$%#"#""!""" !! # !" "!"!#""#$$""""""$"#"""$$"&%$$$%#$$$%$'&*/2315127KakyyB43410--.,,+,-**+**--*-./110/0///052PsK51-*,-*,-+.,,,,+/.+,-,,+/,//-/./0/111202269<<68142352/'%%$"%#$#!#""##""#"##"!!#!#$##$##&-6:?>AELNTTWWZ_[SY^F5000,/57=9>9=??;=7::AA=A@?A@@?><@@=??>AHKHIIKJRTX_dlhjjmjlmihegjihegggfggN2$&#!!"$ !! !  %%)))()&'&##&(&'#$$$$"#"%"#%%!# ! !   #,,+%$!!'7ANRYQCA)~~~}~}~~}}{}}~~}}~}~}||~|{}{|{|~|{||}|}~}~}~~|}~}}}}~}~~|~~~~z}~}}|}{}~}}{~}}}~|~z}{{z|{z{{zyz{vzxyywwwyxwzwvtuutqsqrtussrtoqqrsqprptqrsrrqqpmoonpnolmnrqrnle`\]\\^]\_[^[hnrvvohba^``aabdiovz~}tmdeeghhii|urpmnmokwztqtqtzxxzyyyvrc_LGGBFGJVVVTRPRQQRLPQPRRRRRSRQNQRUUTVUVUVWTTSVSSYRVSRTUWUWSVWVVXUVTRPNOOOQTTUVRUTSV\chikjifg_XTMF;:754200200/0/..//0,/0-+--+/,,,,-.,--.-./.,0006;30<:1300,-,-.++++*,+*),)*+),,**+),,'*(**&((''(%%%''((&'&&$&%&'*+(&('(('&&&%#&$#$&%&'(''&&(&&'('&''')'&'%"#!!!"!" " ! !"# !!!"!!""#$$"#"#"""$$""###"&%$&$&%%$#'$&'+.2233248Gbi|M111/00.,,-*-**+**)-,--*.-.,/1/1//05VqI82-,+,--/-..../).-,-+*/./.0/02/1.334654267:>A\lqpwttvstusxvxwwv|}~vjlqv{{zxuyxy{yx}nG:9<=;58.45444.&%#$#$$#"""!"!##""""#$###""%##$$$&,5;;>AGJMTQTYWZYU\\G3000.1379>?<<@=8<;;;@>=@??C>>:==BA>?=?@EHKKMLKOT]bafhhmighkjljjkkjefigegkQ4&%!#!!!!!    "$()(&'('$&%$')&'%%#""#%$%###$""!""!! !   #!.5@NLYP:752223///10.1/./././-/-,.-...,-0./..-,/0,.0058>?D:0.0/---..,/,*,**)*(**)*)*)**+),)*'(''(&&'(&'''(%&$&$(%'%(('))''''((''%&%#%"%$#'&&%%''('''&))()(((%&%%$##""!#"!#! !"!!!!" ! "! #%#!!#"##$""!#$#$$$$&%$"#%%$$$%'),0217417I`qwB131//-/,+,++,+)*++,,**))+),0//+,/./223231/,-.1013/21../.,--+.1003/0312316679:;?>8>AZnstsussvvwuyvxxszz|xnlrx||zwwyzw}|zw|oE9<=?896126543)&&$$!!##"#"'#$"!###""$"""#"#%#$%%&*4:;@AGHLOQSX\\XTR[F80/.0.38=:;=?@@<;;;=?A?>>A@B<@==@@@=>C>CHIKNNJLV_edfijgglkkhkkijihiiigdhlV,&###"  !   #%)%'()(')'&#'()&$%#$!$"##%(%##"!!# #!     "  #(/;NWWTA.,"~}|}~}~~|~~}}||z}zz{{zxwwuvsuwwxxxyxuyuvvvuwuvwvutwuturrrrtqsqroqnggdbacd_ccba`_cfhghhifchcccffeefhkoqqqohjijlhkklosuvrqoonsstssuy||{vvwusww{|||yz|~|yumaNFHPRXXWUSUSTSUWRTUSRUSURRRRRTUUYXZYYXTUUZYXXXY[YX[YX\[ZVSUSQRRRTWVXXWXZYZ]\]]_a_cdcdggfcZUPKC>74422212.0101./-1./2/...-0,,./0,/.-/.,,/0-/.014:428;10..-,,-,-+,,))*++*''*)++,*+)*)*'(%%((&((&&''&#&$$$'$)&''&()'')&'(&&%&&%&$$%%%%&'&(&)'%&%''''(''%%($$#"#""!"""!!!! !!!#! #!"##$$$#""!####%##$$%$'%$$%%%$$&&')*2355336GdpL261/.-,---,,)**)++,*)*)'**+1*.,,..-/1/00/13../0/2./0/,/---0.-.1120012/346586<;?A9=?=<9;8;?A???CAD9<8>C?@A<@ADGHFGKKMV\[ffeklhggfhhhlijiigfgieiQ/%%"#$$ !   $(%'(''&%%$&*'&)&#""##!#$$$"!"!#$ #!  " !!! !"+9@LYUSB-*!~}}~}|~~~}{{z{yxxuvxxyzzzzw{uvxxyvwxwuvxxuwwvtsrtrtqqsqjhcacadecedcebecbedghefeffeefeghkiilmnpnhjjilimlnpqrsusnrpqsqrssyyyyxvuutwwz}}y|z{|}}zxteZKGOUZWXTTUTXZVX[WVTUSSSTURTTSVTYXYXZWWWYX[[[[ZYYZ\^[ZXRQWXSRSUTTYUYZY]]\^]]_b_a``ac`egfc[URKA<9:732224/01/00-.00.0/..1+.+-.+--./-.-/./.-...04;568?/-/--.-,-++,*)+)****)'**-,,.,)())')*(*)'&&&%&$%$#%$#%$%%%('('((&'%&&&$%&$$$$%%&%('%'&&%%&&&&'&&''%%$#"#$"" " !!!!! !!!#"!! "%$$$$###$%###"##%%$$$$(#&%$$%%%%),0233457H`ly]432/2--,++/-**++)(+()**)*)++*,,-/0341/22/,/..1./-/--+/-./.+.2-00/01240134578;8<>=<@Xnrsruutvxvvvuuwxzzz}znkqxw{}wuxzxz|vu~mG9<;7888/38622+$%##$&%###"#$"$##"#"$##"""$"#%"&(&,9=>@@DHNPRVTXYYRXYI322.-028:=<<>?<=78=8?D@?=CC??ACGGJMLKNLW[`fbdfihjkkhgidfkhiifmijjO3%#%"!"    #''&'&'%$&##('&'%#####"#$#%##"!# "    #$" ""  %2CJTZWQ<-~}|}yy{z}}}|{|x}|x{xyzxxxyzyzzyxxtwvvzwvmmifcecdeeedfgfggbededeedjijkiijikkilkjmlikmmlmnloqrqqsqrssqttrsutvwyuwvtxwvy{{||}yxy{{~~}|{xmgQHSY[XXYVYX[[YYYXZVTTSSVSRSRVSXXXYXXZ[Y[Z[]Z]Z^]]^\XXSVSSYTVWTVXSRVWY]_^___]^`_aaacdcfdc\ROH??;993521100/./0/001/.00.1-0,-.-../--.0-./,-/00//96654-.,-,/-,--,-,))*+(***+,,,,/32.)((()&&'))))'&%%%$$&#&%%%%&&%(&'&&&&%&&$%$!$"###$'&(%&&'('&&%&'(')&$%%$%##&""# # #!" !!""#$%####"$$#$#$###$%%$#%#$#"#$$(%*+1234337H]nxo>0210-/--*,,,+,*)**+(+*,,++,,.1/0120/-+.,*./.1-..00../,,/.012-201112204437679<>;9;A[osqsvsvvvvuvvvxtx||zlntyz{|utxyy|zxw}oD:?<6:7625871,)%##%$$$#!%%&%$!#"""##"$$!#$##$$#&$*9<@ADELJJLPKW__dehiiflkjihhfhijiiffeieO0%##!!    #'&&()%'&'""&)*)$#$%###$"%##"! " !" !#!"!! !!!#%+;875733222/0100/20110/02///00120201.12012/0/000101,2/./-..--/-,+,,(++)**+-++-4-.'8.')('(&(('%&&%%&$%%&$%%(&&#'&('(%%'&&'($&%$###%&%%''(&'''(&')''(%%&%$$$$#!#!"""! "! #"! ! " !!$##%%#$$#%#$#"##$"&%#$%%%%$$%&&')-/522238I\lvI221---+,,-,+*-*)+)++,-,,../00/1010-,.(*(+-/////..0/---.0/0/0/2/132349447567;:=<7>A\krquvuvrruusuuvvw||}{kipx{{{vxxzz{z|xzqJ<<;8:971756/*)(&&&&%$$$($&%&$$#$"##!$"##$%%$($'(,6>=?CGIRRTXP]\YT]\H7.0//.3<><<:><=BCA@;<>@BCCDJIKKKMV]]dekjjggghgghihfgjfgefhjQ2%&"! " !   %(''$&&&$'"&&%'&$%"$"###%#%#"# !#  # #""""   #(1>@FHKNPRUX\aXSZZL700/1.3@?;?<=@=9;=7=AC?<>@AB>=<;BB?>@BCCGIGJMLNUZZcehkijiiihhhefhhhgffdflT4$&$!#"!!$"   &'%&'$%''("#%&'&%%%###$"$#&$""!!$!! !  "$ "# %+4DO_RWP94#}{}yy{wrqupqrvuvtuqrrqqpkhkjgpprrstqqtrspqqrrvuywwvwvtuutuxyy{y{zyyyxxz||~~~}~{|}sic[e_]X\\X\Y^Z\]]\ZYYWZ[XWU[Y\^]_`a_]`dbfebc_Z\YYU[Z]]Z[Z[[^^`aaab`ccdcbca`ccebeehdhfdac\USKGB@@=<6:;:=:>=9;;8;999:9<;<<;9:<9::9;:;<;;;75554364420/0/05431130//,...-,-+/.-+/531-)()'&'&'%$&&%$%$"$%$#$'&&(*&&)(&%&$$%&$#%&%&'$&%%&&(&())(#&&%'&&&&%'%""$#""#!"""!!###!$!!"!" #!##"##$$#####$$#!#!""!!&#%%##$$&''+)1224567IXgt{j6212100-*.*,,++++,--..//00/1-//,+*(()**,,1122201/2-/01/02/00//2333547748589:;<=>;:987824530)&)$($$#$#$%'%$%##$%$#$####$#$%%##$$)3=<=DFKNSTTU^^XUW[L22-0//0;<;<<>D:9997:=@@:B??<@HAB@ADDIKJJLKRSY^ajiiihjlkjijkihgfeggigkR3!%#!#! !  %$''(&&&''##'#%&$$"#$"#!######! !!   !"#"!$ &1=QZ]\WL6-"}}|{}{t}~|{|zzyxwvrturvywyvwuwvuuvssw{xyxyz{wvyw{}~~ymk`gba]^Z^^adb``_^_]Z\Y][\XZ^^\\]a_aacceebb`_[][ZX_\]ZZXYZ[\`^a`bcccbabb]_bdbdcdefced^a[ZTXSNNHGG?<@B?<=:;BUhnsrttttwsxutuvxyy{~wlirwwx{uuw}zy}u|sH<<9;<971452.)&&$&#"%#$&&$#""$#"$""% "#%#$$&$$&%%/7;>?BFLQSTV[U\XVY\I//-00/6><=<<>?;::7:?AA>8==CCD>AABCKJLHMHLT^cchhlkgjkdhjjjhhgghgeefkU4#$$!!! ! !  $'(''($&$&%$)'%%%'##!""#$"#"!#! !" !"   %-5COX[^L?+%!~{~~|}|~~}}~~{|~~|}|xzxxy~~|~~~}~|rpijgc]]^`cadabda_^]^[]__]^\cbaebfbcffegfhggba\]_aa`_][YZZ^]^_aeccbaeabdaecfgggggfffcb``]Z\]ZWRLGEDB==<:99:86:45355143312403332438865;5105022631113.14713462344534420010002.0-)+(&)%'%&'''&$$$$$&%"$"'')()%'%''%&&(($'&%%%%$%#$%%&&$%'&(%#%%&&&(&%%%$$% #"!"! !!!" !!!!#!!!""###$$$%$%"$##$$%#"!"# ##$"%$$#&%$')+-1/2456JgvĸT1310/./0.*,+-*+)+-(,+)*,,+,*,)(&)(*/+-0/10//.-./00022,.01013113653336686585<<;<9@Ymqrrvwutvvxtvtrxyzz~wmiqyzz|xww}z~z}v{uL:>;8:68044.'($%#%%$(#%%$$$$#"$"%"""##"$%$$$$#$%&,6;A=CEKNPPTYX_WTZ[K61.-//8<<<<;A?<>967=@>>;@BAD=8=>BED>AAAELFGJJNNU[c`ijkgkljigihghggigeeddjU6%$#!! !  #*'&'(&&&%%$&&)(%#$#""$"#"#"!!!! #    $47?LQX^S?1("{~~}~~~~}|~}}}~~~~}}}~~~~}}~~~}|trnijh`_`ab_e_abadb_^^`b_baddfegdbdiijijmhdeca`eea\_]]]^]]]][^a^bddcccdgdffghjfhhifiggdgjgbdd]RHFE@=:885365225/3/20010.0/./1-/10/1142110/2-/././/.3.122311/11//20/0..000/13,,,)*(&'%'%&$%&$%&%#$&$%&$'')(*'&&*'+($'%#&&%%#%"#$%$$&''&'&'&''$)&'('&%%$$%#"$"!"!""!" ! !"!"! !!"#"%&%&"%#%$$'"""#$""#$"%"#$$$%'''(),/01538GbtȲf923/./..,,--,++,)+),)))+(**)+)))(*)0-,-,/20..01/03101/120//21344346474555;68:::=C[krssxutvtvuuwysvww||xoiqz{|}xyx{t{{ywrK>>;<899133-*'&&%%%%$$&&"$$$%$#!!$""$#"$$"#"!#%&%*5=?>DKMNTUWXW\XUW]K7.--.-5:<<<;<@=:8::=E?A>ABEA>=?<@@B?BBAFFMJKLKNXX``fdhhfjljkliggfggeegfhiU4%"%##    #)'%(&((&&%#(&)&$#&$%$$"####" #    %)0DKTYQG3('"t}~}~~}|}|}~~~}~~~|~}}~~~~~}}}}~~~~}~~~~~}{{tonjfebeeeacdacbbbcdecdceeghgcbaededaa`a_^_cd`][ZZ^_a_b^aa`bbccccfhfjihjehihiihhlefjmnjlh]SHDA@;:9553104102.//0/..-/2..0,-+0+--,-.-/,/..0--/10.30/0.3/0//-/00/21.-/0/0/-.-+*)&('$'&'')(%$&&##%$#%#''''+((&(')&#%'&&'$#$$#$$'$%%&('''%&'%&'&(&&'$%"#""!""!"""#"" "!!#"""!!!!!# $%%&($%##$#%$#"#"##$#$"###&$&'&'+.002236I`oʲq@120/.--,,*,++*+,+)+**)+*())'()))*-/+-//./,,,-3024/,../00.-0.02323444474567588:?GWlsqquwuuvtuutvuwxx~}vqlox{}{wzw~x|{zw}pK>:;;894240+*&*')&%'$&&&$&%##$#$!)#%""$#%#"$!#''$*7==D@FIPSSWVX\XUYZF6/01/15<==>?>?<:997?A?;<@>@@>@@GLJIGLLPV\beekhjifjhiihjklhiifgcflS4#!#"""  #/()'&(&%'&"-)'(#"'#&%"#$%"#" ! # ! "!"$&0>JV\\B(!"}z~{{|~}z|~~z}~~~|~}}|}}}~}}{~~~}}~~~}~}~~~|||z}||}z|~zz}}|||}|~{|}~~{wmiddefdffdgiihhhgghgfbbb`b_aa`cjkossked__``cba_abddccbaehhhhghgihkgfijhilijmnjlk_TLGAA<9:676523330001/--..0+.--/...1,///././.1,/,--,./.10,/00-../.--.-,../10.0/.-+,)''('&'%%%%$'%%&%#$%%%%(')*(''&(''(&%#%'(&%%#"##$%$%(%%&'('('&''&&&(%%#$$#$$" !"""!#$!#!""!!"!!""!"##'&$''&$$$#&%$"##"##"$&#%#%$'&%&(./.3249Kdn޺G-2//1/.+,-**+)+,***)*++&))')+),,+,../..0.,,.-1030///-010/..01012.013054245556;9DVmstssussusuvswvvxw}}{mksxx||uxv|y|yy{qJ=<<978523/,)'*%($(&%&'&%%$%#%#"!%#$$"##$$$&$%%'%,7<>ADIMQPVUU^^ZSZZF8121023:=?<=?><>;::=D???AABD>>>>BBA???@HGEKLKIQR[^`fijkikmjkjfjfjeiifhehfQ4&#""""!   %)&**(&'%''$%&&&%%%"%""$#$#$#  "!!#%&5IMNHE:"z{{||}}|}}}~}y~~}~~~}~~{|}}|}}~~}}|~~~~~~~~~}{}}{|{|zz{zyyzzzzw{z}{|{{}{||~~|ukkjgijjjjhlfjiighcbb_]a`_bmupghghhhjfhkgfddbcedghghhkihhjkklknjkimpqlkh`TMLB=>;;76683635322/0//0-//,/.-,,,/2/-0--10/0-0,--,-0//0001..0,-/-.../.0000,.--++)(''((''&%%%(&%%&%'#$%&$&&&(''%''&''%&(&%%$$$##"$#'&%)&'&&&)(&$&&'&'&'%$%$"!"!""# !""!#""#!!!!!##!!"$%%%'$#$%%#$###"$$$%$#&$&$%&%$%$)*/02556F`nyӳU21//2./,/,**+*(++,,)+*)+*)+)+)---.-//.../-,.1/241331---.//-..///.0../01010324<;ETospstsvtwvvuuwvyv|}|xljruw{}uyyzx~|zx{tG>=<;5><@?@IKOTQWW\YVVXXI512..0::??>>@C>=<;;?A@?=??BB@<=CDFBA@BCDGGKIRJLRW`fgkhjlijjijkffghejedegpW5&$%#" ! "  #&(%(''&'$&$&%&%$%$$""#"!$#$!!    "!+35ANS]H:)z|||y~{}}|}}~~~{}|~~|}~~}}~~~}~~{~}~}~}|~~~}~~~~}~~}}~z{{|{v{|z|y{{}{z|zzyz}z{{z|||}|}~onqqrttsqnomkkijkikmigryzvsrmpopprsu}rtrqr}uztsvy~ywpbUNKFC@:9567565002302//0./0-/0//.-1.//.1/.-.-...-+..1..0/..0,.0,--,..,/.//0.-+-.*)))&'))('))&(%''%&$&&$&$%$%$%%%)%&')('%%%%*%$##$$$%&%%&&&*('&(&%$''('$&&$#$""##!%##$"$$"""!#" !"!#"""$$'('(%&&%#$"$$###"$$&$$"#%&$&'(,*-/3377E_n~忮M023/1-,/-./--*-+-+-.-*,.*++/0-..-./,--../-/0/..0/.0/123200..000//-00/223269;;@=FZqoprtuuutxtxwtxyx{{{xlfrxzz}xyyzy|}zy|qI;><>;;=2+++)('$&&'$&&%'&&%%$%#$$&#%$#$%#$%$$%$(%,4<;ABGMNSTVX]]XTV\N7022208;>???DC@>989CEEEFKMKMMQS[acfjhjkjjkihjjhijkffddflZ7'"""#! "(*'''%%%'%#$&'%#(##"$"#&$%#!! !! ! " !    ! $'/19UX[S@4${~{~}~|y}~}~~|z|}||}}}~}~}z|~{~~~}{~~~}}~~{~~~~~~}~}~~||||}|}{{|zzy{zy{vzyyy{yy||{~}z~}z}}~qprswvtusmqikjkkklqpt}|}}whVOKGA<=96866131000/2/10/1-.//-.1-0.././,/+0-/---,//.-////-0/..20/.-/-././.,.-..*+*+)()&((*('&''&%%$%$$$&&$$$%%#''($&'&&&&%'$%&!#$&&&&'&&%''()&&&&(((&&%$$$#!"""""###$$$##"#$" !!###!#%#&%&&%#%$$#$#$""#####%$#%#$%'('*++.0237IcrֺtC315210011.1--,/,-./---+0,-.3/,.0,.,-0/0.//0--.-0.,.0/03112100/01023124477:;@>?>@Zorstttwtvwwwttwyy}z}wmkrxyz|yxz|z|~{w|sJ=>==;::1,*+'''$()%'&'%&%&%&'$%#%&$&$$#&'%$&#%$''-4><>AEIPQVYYY\[T[[L9121/06<@>A>AE><9>C@@AZkotuttwuuxuvvxxwzz}}xomsu}|}ywz||~}{y~rO>=<=;970.,,**++()''&%'&&'%%'%&$%&$##%##%%$%#&((%+5=?;CBNSTWYWZYZWX]M91-11.7;@>BBBC??>>;=@AE=A?C?<@=@CDEEABDHKFKMGKOTX_bjiikjigheigihjfjfldffo[6)$&"""! #!!"!   %('*('*+&&& $(&&%$$#!""#&"%%"!! ! ! !!!  !   !"!$(0<=KZQQ8$~||{|{}{~~~}}|}|}|{}|~~~|~}}}}}}~~~}~|~~~~~~~~~}~~}}~z}{}}{{{{|{zzzz{|zxyzyyzxxzz{{}~||~~}~|{wvtnnmnjkntmZRMF@?:<:666723/0/0//10//0//.//.0/,0/1-0../..-/...0.//..+12/.0-...,0-,//0/-///-.+,*)((*(((')&'%%&$#"&$$%$&&%&&'&%%''&&%&'&')&$&$%$$%$%%'&''((('&('('('(&$("! #"##%#%#"%#$#"#"""!##!!""$$$&'$$$"%$#"#"$###"%$$&%(&%'%%''*,.0648EYeq|켯[643233/3.2/.//./....-///1023/1.1//,/0/1/0/-.22221101//..-/1.02/--0.-.///023316=?DYnrutuuvsxwxxxvww{{zxmqtx{|}zz|}z|}ywK=@>>::61-,++)**)((''((&(&%&%%&$$$&$$%%$$%&##%&)&*3?:=BEKQVZWW[\YWY\N93031398@A;C?E??;;;@BBA??@@B>@?ADFACBBEFLKJKKPPUYbbhhjkiiijhgiidghhceffep_6&$##!!!"""!"  $)&'&'%)$$' $%&&&#%"$""%"#"#"!!!! #""""   # "&.7=CL[QU9"{}}{}|{}{~~|}{|}}~}}}~|~~}}~|~~~~}~~~~|~~~}~~}~}~~{|~||||}|yyzx{x|z{y{zy{zwyyzyz{yzz}|{}}{}}wonllpx½k\OIGBC:9966432242101011.0.-1/1/./1-./0+-/+//--/,.//-/0.0-.0021///0,--,0,/-,.//.***+('''+*&('('&&&$$$%$%$#$$$&'&#%%$(&'''&&&&''%%%$$&&%&'%&'''%&&&'&%%$%%#&####!#"""##!$#$"!"#!"""#"""###%&%$#"%$##%$##"$$##"$$$%%#&&&((,./0439FS_kvxzt~Śz}\=66445=C?D99962//2.200///00120/2100110/124122442452//,-++13212///120//11212523;@><72/-+,-*))*(()**'''&%(&('''%$$%$%%$$$$%%&)&,3:???DMUTTXUY\VSY\H5244207:<@>A=C=;<=9>A@@A@?AB=B>>FDB@CAEEJMMNJKMWZ^bfgijiijkfhjgggfjhjgdbkZ8(&%#$"   ! !&&'('&'&$&"$&%$%%$$""####""! "" #!!$ "! "  ").9?GLQWW?#|z{|z{y{}}zz~z|~}~}{|~}~}}}|~}~}}}|}~~|~~~~~~~~}~~~||}|~|}yz}z|{wwzyzz|{|yyywz{z{{x|{||z}}{|}~ĿlZRHDE@>99864353421///.0/000/.0/.0/*0,.---.-0201100.-/0../1-+1/-0--,.-.-//--/..--+,*(((',')'()''%%%$%&#'&&&"$&'%%&'%&)(''%'%&&'#%'$&&'%''&&*(($&&&('(''%$%$$$%$""""!"!!##### $!!"##"#""#&%'%%$##$$$&#$###$%##$#%%$$$%&((-,,/347BV_nwwtr{~w~vyw{~~x~xw}yrolbJ;;96CVV`l`TUUA22214:@CA;;>:3234254345566845421/2///1//1334510231/10-033001846>AE\mssvsvvtwxvxxsxuz|{~{oixz}~~yzx}{}|yzRBCA<=<6./--,++*(*)()(()%&('&('(%&'&&&'&&&%'(&**'.7=>=AFPTVU[WZ[VUV`P;041//:;@@??>A??:;9??@AAAEED>A@=EBC?CBFEJLLNNMOPWbfhhkjhkjjjkjhghjggihfegV6%$#"##! #"!  ! %')(''('&(%'&$&#"#$$$$#"%#"!!! !##$&"$"#""!!! "!%+18>DKXSC/" y{|~{{{|}}}|{}~{~}}{~}~|~}~}}}|}~}~}~~|}}~}|{}~~~}~~~~~~~~~~~~}|}}||{|{yzwyzyz{{z|yxzzxy|zy{{|zx}~|}}}}h]RKGD>=:686625120.0-/.../0././0/21-0/.0//,0/.,./--.,+..,/1./0.-.+,,/-,-..-./+00-*+*(*()((*''&&&%%%$#%$'$%$#%#%$$&&'#'''&&&$%&%#$%#%(%('(&%(')%'&&%'&%'$%%#$#""#"#"!#!$###""#!"#"#"#"#$$%&$$$$$$$#%##%$##%$$%%&$&%$%*)),+.1277Hj}yz|ztyzvbanW<;:>OQOOglRWeS9531EMR`h`O``H<6958?JHRHC>F83213-32330133331744130110/3.2133238<>7520./,,+-++*)+())(((')'''%&&%%$%&&'&&((*()/9;>@@GMRUTYYY[ZWX_N84403496>>@A@@=>=:9?BBCC@BCB>BC?@AF??GDFLIHYMPRU[_cgkljljhkijmejljfedfaddV4%%#$## !#!"!!   %'&')(&&$($$(')$$%!$# !"%#!# ! ""#$%#!#!#   $&6:@IP_S8& w}{z}}z{}|~{|}}}}}{{}}||~~|}|~}}|{~}~~~~~~}|}~~~~~}~~~~~}}~~|~~~~{|z|{xxy{y{z{yzxzyyxzyyy||yz{z{{|{~}~}~ÿkWSGDA?<=:86423422///--00/0-./00112-.0-,/1////00..-,-.--.//-1.-.,..-.-/..//-../,.+,+)+)*(&(''(&'%%$%$$$'$%%&%%&$$&%%&&'&%'%%'$##&$$&''&'&'(*)*('''&'((&%&'%%#"##"$#$##&#$""!!#$!####%$##&%&&%&$#'$$#%$$""#%$#$$%$%$$%&')),..288Wb`WA?HUMA@`mPBZ_C34:OJIQdaNYnY@58:>LQRleZMfKA2324EIJPFFGG?79:87=<=:896622343359=:J\nuvvxwxwvttvuwuvz{}~}qou{~xQACDA?:220/.,0..-,+,)(*)(()('&('')%('&&&'%&&&&'*,0::>?DLLUWWZZ\Z]U[]O6643336:>A<@@?ACEGCAADDIOKHOMMNW_bchhljjeikfjjijkkgfghdef[3''$#"#! "  $&&&&'%"%&&"&''&"$%%$#"$"!#"$! !!#$$$%#!!! #(9ENQWdM8$x{zzy{|~{}}z}|}}~~|}}}|{~|}||{~~~~~}|~}~}~}}~}~}|~~~~~~~}|}~}}|}~~}}|}}~{~}{|~{{{}}|{{xuxyxyyyzxyxyyzzyw{xzyxxyzzyy||z{}{}}}}mYQKHA==:98744244///10././/0.../0-.-/.-,01/-/3-1/,/..,./.0//1/.//00,..-/1/-030-..++**))('(+('*%$&$'%&'#'%%%&&&&%&&&$'&('&('&'%#%##$%&&''(+)*+*)'(''%((&%$&&$%"###$#$$%%%$$!!"!#"##%$$#$$%%%'&&$%$$#"%#%'$#$%$%'&$$%$%%(**-,1299W¾wtxmkglqf]dcs\\fgVKDDJMF?ScXHa[I262GLJNe`VO]R=677HMLU^TOPNA6456;?DKGK[hvtvxvwuvxvuvwwv|{}{qny~YDCAB@:45341-0/.+---**+)')((*')))*))(*)(*&'&')*+'/7;BAGKMYVV[ZXZ[W]`T<532347=BC???>@?B==975533.0.0./-.../,*-+***,),**)(*(*-'**+(++',<;@CFHLRVT]\]`YX[aP=521237>>=;F?GFAEFDCAACCCDEDFDGIMMNOMRVY_edkjlijgjkljhkgmihfeegh\9%&%###!!   #%&'&&&'%#)"&''&&"%#%$""###"!"!!!"" !!%%-3HVUPS1)!|}z{~y}}{{}}|}~}|}}{~}~}}~|~}~}|}~|~}~~~~~|}~~}|}~}~~}~~{~~~}~~~~|}|{{|z{{z|}}|{{z}{|{~|}{~}z}~}}~}|}{|xwyvwuy{wyyy{yyzyzyyzzzyxwzyxz{|}z|{~~~}~ƿoZTKGC?::7785741320-/././.0,./-+0/.//../.,-0///10-0,1,/--/0//,/11/....///.5/1/51,,+,,)/())'')''&%%$&&$%$%%%''&&&%%&&'&(&('&'%$'$$$%#%$&')()(+(')&)'(+(('&%'%!$#""#$"$&"$#"#!"#!#""##$$#$#%&%%$$%%#$!###$#%#%%%$&&%&&''((,+,234>^yqmj`TWclfglpupeh`_ehkfitv~saGA574423201//1,,,,,--,,*/*-*-*),)())***),*+-9@AFCLNRYZYWa_\\[\Q?744358@DGJKUUZ_[\[\X[gS>535438=CBCDAEBB<@A>BGCHDDEFDDBDDHDFEDHFJNNOPTPXX`ceighekiljieihfggfeiblk`:%&"#"!!#"!!!!!!#$&'%(&'&)!"'$(##$##"# ! !$$! ! !##3DSKST?2)&y{{}}}~}}~}~}|}}}|}|~{~}~{~~~}~~}~}{}~~}}||~~~}~~~~~~}~~~}}~~~~~}~{{}{x{{{zz{z}}|}|{}~~~}~}~~~zztvsvwyyvxwwvxxwwzxyvyxy|yw|y{}z{{{|}|}}̾o]OIDBB98994766432232/1.//01.-/-.,00.//../0/../..0.,/-./,...1///0..//111/./2022/,.-***,*')((%&&%(%&&'%#%%&%(&&%&%#%''&''('('''&&&%&$'&&')%&+*'''&*((()&'&%$%$$$#"$$!"#"$"$#$##""$"%"$#$"#%$&%'%'%%#$#$$##$%$%%%%%%%&%))()+-.32A\unaVNGA==613///.0,151//++.,,.0.+,-+.4<@EEHMNXYX^___\_[^U=78869;?GCADCDFAA@CBHLFEGGFHCCCEFJFECGFGLPORNSMZ\cfghmkikilikmijgihddahfj\:($"##! #!  %&''%&%$%'$''#*%"%$#"#"""##!"!  !!#+9>KTQZB,!"!!" !|}~~~}|}}z}|{}~}y~|~~}~~~~|~}~~~z~~}~~~}}~~~~~~~~}~}|~~|~~~}~~~~~~}}~z{{~{~}{|}}{z}}}~}|~~}~}}}~~|zzzvwu|zxxxwxwxwuvuxvwwxyxwxyzyx|{~|}{}{}{ɾs\VKDCA;;67763133413112/.0..2/.//.0,-//../.0.0..///-//..002.0..//.../1..//0.0/0.-.+,122/0'()('&%&$#&$%%')'''&'&%&&'&((''(&'&&%'%%)'$*''*'&()((&)')'''&&%%#$%%##!!#"!!##"$"!%!$%"#"% !"&##%&$%&$'&&#$###%"%%$%%%%&&(&'''((,-042A\y}tnj_XQROHH8656./110,.,..//0:?DCFIOT\W^c`a_[]bY=95937>?FDCBGHCCB?ADEIGDEFHNFEHEGIGCFGHLLQLSNQQX^`pklnllkhlihlhjlihhlffeh`='$$#$"#!"!   $&&'%%$$%("%(%'%!%%!"##!"!"$#"&*27EOSDD7(""&&++%$% ~yy{|||}~}}}~~|~|}~}|}|}~~~|~|{~}}}}}~}}~}|}}{~}|~~~~}~}}}{~~|~~~~~}~~|}{|{|||||z{|}{{y}||}z{{{y}}|~~~}|{{xwyvywyywvuxwvuyyxwxxxyyzwxxyyyyy{||}y{|~~ȾuXPKE@D<:8874433/1004211010/2-//./1..+//-/,..10,.//-.10.2.././10110.00/-...-0//..*-.0)**<+))'''%('&&%'&%')(('('&&&(''('&(%)&''%$&&&())'('(())(+&')'&(&(''$%$%#$#$"#%""#"$##$#"$#""$!!#!$$$&&%'$&%$$####&"$#$$%#%'&'%''()(,+,04AVrwtnqldbcc`]WW\TUUW\c_[Z\]_Za`^_cb`eYD<8898>ADDDCDNCDF@CBFGHFFCEAHAEBAJICHIHLMSRRRSQX[ixxutnllijlgpkieghjfdgdg[:)%&""!!!! ""!   $&%&''%&&&#$%(%%!#$#"#"##""! !!#)38AMOXKB*#" #&-/;FG<1$"!!|}}|{}{}{|}}~}||}}}||{z|}|}~|~||}~~|~~|}}~||~~~~~~}}}}|~}~~~}~}~~}}}{}|xyyxz{{|zyzyyxxxywxzyyyyzzxy{{zzyzyxwvtwyvwvxutwyuuwtuxwvuvywuvxzyx{{yzz{{~~~ȼqYNKGA@<:756555322213120/1.110/./..//,/..+-1./..0/0-.-0.//.11000--//../0/.012.../.,+6/*54')'%(&%'%'%&('&&'''$&%'$%&('('(')'(&%'&'&$&''(*)')'(('('('''')%%$""$##%%$#$$"$"$%"$" ##!##""""%$$%&'($%#$$#$$#$"$$#%'$%$%'%%''&(,,,/2CQp|~~}~}z||~||~~~}z{|}{||z}{|}{{y{ywywwzyvxy{wwuwtvy|~~}~snffa[\``^``Z[XVQPSQXWWYZY]\[VWYX\YXTOTVTZVWTUY[cn||ztrokokiijhihhhehgi]9&$$!# !!! # !   %'&''&$'&'$'%('$"#$##$$$$"#!""!  #(),2,%#!""!"#)->967577514241011/32-310./21-///..0,-..02.0.0.0.0/.0.2/0.11/00..002-//,10//-,*/2./))+)(('&&'&&'&'(&)'&&''&&&(&'''(&'((&&%%%$%'''()('))()(*)('''++)&%$!#$##"!#"$###$$$%# #$""#"$"#%$$&&(''($%$$#$#$$$$$$%%$#$%%&(''*+./16>G^kptvvtrrsmppoonkfhkimlikkklhjneijkgjhikhmgfhjghccejfcfgeecba__]Z`bgou|~}}}~}|}}z}~~~z|~|}zspjmikijgjgighfgd]7&###$""!" "!   %%$&&%%(('%$&%&$##""#""$%$###"!! !"!$ ! "  $.547J:62003(-*48MSZd_NJK2% !!%(3AaxuuyyfR?4%%~{yx|{}|yx{z}|{|zy}}}|~~{}}|||{~~~}~||~{}}|||~~~}~~}||~~}~~|}}}}}~}~~}~~~}~~~~~~~~~~~~~z}}||||wyzy|wwwvuxuvtwsvuuwtwwxxvwvwvuvrtrrtttwuvwvwxvvstvxwvvvtutuvwwyxvyx{yzz}}z~~~~ǿjYMIHA<;96743311111020311412-1.-0.-/./,.---..01/0//,-,2-../10/1/////2/../-..1/00.,-))+')'(**'&&&'%&$($'('(%&('')(&*'&)'(&%(''&(%&''(')'(''*)(&'**)(''(((%%%#$$$$""$!$##""$!###"#! "#%####%'%(%&&$%$##%$#$$%%%%$$##%$%''%(*+023=FIU\]]]Y\XZVVVYTVUUTWSSRTRRTTRQSOQROPRPOLKNONNNMNJNKONMIOMOJMGIGEGIIT_gotwnolp}xwvsrsxz~~}|~}~~}}~}|}~~}z{~~}}{~~~~{|rlmjjkhgmlhfigehe[9(&%$# "#!##   %%$'$$&(%'#$'%&&$#"! """ "!" "!!" !! !!!! "!$&4:GMKOI>;?DP@A;=MZ`faZZM@." !&&-:H`hpyxwbfQC7+%|yyx|{|}}{{{}|}|}~z{|}~~z}}|}{}{||}~}|||}}~~||||}z}}~|}|}|}}{{|~~~}}~~~|~}|}}|~~}}}~}}}}~}~|}}||{||{x{yxzxvvutttuwuourrrststttrqsrqsrsrsrsvpstvwuwtvwsurtvuuvuturvtuwwxwxxwzyy{|z}z|z}~~{aSMIBB?:97864541320331210120.1.3-2-.0/.2-./-...00-0..-//.-/.//00-0-/,...././0/10,/-+'*)((*'('&(&''(&&$'(&(&%'%&''''''(&)&%'&&''%&&%%$('(())''()(*(''(''(&%%$#""$"#%$#$"$"###"" #"#$!#$$%$%&%'%%%$$%#$$#$"%&%%("%%'$'&'&'),--15=@?EDCAAGA>DBBADBEEDFFCHHDGDGDFEGKHGIEGCFHFGEFEFDBGHCHEBECADEFBDBCBBCCCOZchcW\gnbpa]\hruq{yxzv{w{|{z{}|{}{{|{}}z~|}~}|}|~~~}wtwxskllkllhkigkjlfjgh]>*#%!#!#""!$$! %%&'%&%%%'$'%%$%#$$"!!"  !!   !"    !! !"!!" !$+;BNTWQEEEMNLYbYUXeeigg[N?.&# "(*-=VcapsbnbXWZV@9y{zy}||~}}||{~|}{{~|}|~{~~}|}~~~|~~~||{{|{}~~}|}}}|}~}|}{||{}|~}{~~~}~|~}}~~}~~~~~~~~}~}}}~~~~~~}~~~}{|xywzvwvxvtyvuuttvswqprtrprpspstsqorqsrsrusswxwwrsustttsvuvssttvvxwvuwwwxwzvxzy{|z|~~~}~~|m_XOIDD@>;6773443311/21.111232/100-//10000000--0/..-/..0.10/2-1121.0+--0.1///.3/10-/.-)*)))*()'(*'%&&''')(''&%&'&&&(&()('()')'((('%%'(&'('''('''))&')')('(&%%$#"#$#$%$%###""#$#""##$"!#!#%$$&%%(%&&$$$%"%%%%%&%%%#&'%'%(')')--24<=?E>>>CAA?B?@@EWmsldn`sol[UZZbd}mmnoomnpsvyyz{}|z~y{z{yzx|w{yz{{|y}}|z~|~|~~}~~}}~}{}{}~~~~~~~}||~|{|{~{z}|||z}{}|~~~xurpropokknmlghjiefeecehi^>*"%"$" "!   %&%'%(%(&'$%%$(%$# !  "!    ! !! !#"!  $17KX[[WMEBLKTKQV`bkjkmjjV@7$!  "#).*?_lf^cd]QHLVYHF|z}|z|}}}}||}}~{|{}|{{~}|z||}||}|~||}}}v}}y|~{}|~~{~{~||||}{}}}~~~~~~~~}}~~~}|~}~~~~~z}}}~|}|xyvuvvwxywxwxxwvsqrrsqprrpprqporrpqqsrvvuuvtuvvvsvuuttxrrqttruttutuvwwvzyzzz{{}{~}~~||wzxwuttqonpoliiigijdffbcba^`Z\^X[ZVXVWWTTVUPQMNKKGFGJNMMLPJEC><;5893302432120030344420/110///0/2/...-./00./.10/10.202/0/..+/.00110....0/.-,-++*+)*++''(((&&((&(+&((&(('')*'),))***''('('('(''(((()')))*()(&&&'(&'&%%%$%$$$%$$"##!#"##$$#"#$#%!#&%''%''%%%%#%$#%%#%%%&''&($$%$&'((*)-06=9=<>?@CECCEBDDA@BHACE>DC@CC?@?>BBA@E<@@>A@=>?<>=:><;?;<><*#$"%%!"!"!!!  &$#%$&$'%'#'$"% ! !   ! !!"#$$(2DQabeZNK;8<67BNF]`cmrnmeX;6'  "%)1/Jesj\f`XRPVZNSN|{{zz|{~||||}||{}{z{{{~~{|}|}|}|}|||}|}{}z|~}|{}}}|}|~|{}{~|~}}~|~~~~}}|}}~{~~~}~~~~~~|~}~~}z}|vywuxxz~z}xzy}{yvvussoppnqpoooooppoprrssrututuutstsrswptururstuusuvvvvwvyy|{{{}}~|}~}~yjgbWSOIHIHCFCGFBDDHDBBCEFGFEEKEFFDDEFFBABFEBDCCABF?CFACF@CAA<=<;89;:?CEGKHEA==;89543224201001/574294.---.-./00../1/000/./1201100/01/.//-1-.020.0./0./0./---+**)))*)(())(''&*&()'&'%))*()*')')))()((('()''()'()(()()(('+*(((')'('&$%#$&$'%##""$$"$$%##$$"$#$#"##$$&&'%&&%''$#%%%%'&'%('%&&&'%'&&),/07=;::<<7<<:@8;:;<@<<>=@@@A>;A>=@???@=:B:<@=>?=;>>9<;:<:=?:<:<;=<;;<8<:9;98F[]i\ecg^WWNPPPCjuwo]TVZY]]_]_cgedfihhjlmlkljlollnoopopntrqsqtutsuutywxwvyzyzzxzzy|{|}{{}z}zz{y{{|zwwvzxzx{{z{yyyzxzyu{wuwyywxyywxxtzxvwuvvwuwvvwwrzx{y|x|z{w{wyx|w{xw|zvux}x|}{}{zyyztywtttnoopjkjjmhegfgdfghfdgjggkknuvzyz{~zqnmgllhjgfcf]>)$%$$"!#$!""!  #$'%%&'%$&##" !!     !(48Oajh`RB<2/)+++1?Q\Ygrok`P=7$ #))E@BB@BCA?AE?DCCEBABBDCED@AABBCDABD=ABD@BA?ADAE=?EAAA=>@>=:::7498:AAHJFD>=<97752233100000018:66>4--/,.20/.11..,0021/-/1/-//./.003/0.-0/02..21./.10/,...-*+*++(,)))('&#*&'%(&&%%'((*)()'*))*+,+())(('')'')()'()+(*)&)))*)())((&''%%%#%$%$$$$"$"#%"$$##"!%"""#$&'&)'''&%'%%%%#$$'')*''%&(&$%&&)-12:<<;9;<9:;;;:9;878::87487775;:6575:679CDFFUOMOPIFC=?;HV^idbheb[QIGHHKJLROVUTXSZZX[a`_^ab``ddcacbadcgdfedffkkjnlmmnopmouspprrpqvsqtrrtwuxwux{uzwzy{zyyzywwwuwyuvwuvwwuyvxwvyuuuwvttusrrstwstrusxuvtvtvsuuwtuuutvvtustttrrxuussrutsrtputqspsoopppooopopnmonpplmmlqmqrokrvvxy}}unlhjgfehjdj]B+%&#!"%"# "  ! &%'%&&$#%" !  #+3?UknmgO?-''$%'+*1;>R`ng_QH4* " "$(3BUhpssqfKGIIFBICDzyz{{z~{z|z|||~zy~|}}|z}}{}||}||{|}|}}}|||}|{|{~|}~~}}~{~}}}{}{~}|~}{~}|}z}z~}}~{||~~}~~}~}~{~~~~~~~~~~~}}}~~}||z|{yzwuvvxyz{||}z{{uutprqqttttqqmlkmoqqsrurrsusqttrsspqqrrpsprsqtsuuvtuvxxxxwwzz|{||~}~~~~vi_ZQMHFHDHFCBDABCAB?A?>?>B??>@>@?B@BE@C?BCBBCBDBCC@D;>?=>?=<;7:954758797>EFEDGF@@<485432311211/010=:7:=50//.-././//1-010//0021.1/1/.021/1.0-0/.01/401/./20/.-+,,)****+++*))*(+''(*'))'*)()(*('*)+,)**)))'('('(()()))(((*,))')**((*()(&(&&%%$%%&&%#"%#####""##%#""#"%'&'''&&(#$%%%%%%''')(&'&'*(%$)'*,36;>?;8814553566657754388:977888678495776766947585468436644536534352443617456787;866033:BB@CCGA7;5;559;;@?DBBGCHLINMLMRdia``^^^`]`\^_a_]`_]]^^`aa^`b^_bc_dbdgffcikfkhhjilmlpmqonosorrqsnrutvututxtttrwvwvuxvutuvvstrussurrssttsrtspursvuttqprtrurtusrsstpqpqnronnqrptrmurssrpqqsqrqrtsuwtttsrwuwvtvvqustuurvqtsuw}{vrolmiigiggk^<*$$%#"$##   !  !   $%%&$%""!!!#,>Oannl[Q=+&$"#"#&)23>LTMG<0&   #$',=JTossljdF8978=;EGyzx|zy{|z{{z|zzz|zwz|}}~|{z|{}~{~{{~y}|~{|{{x|{{|}~~}}{|}}y}}}~{}|}}}{}}|}~z{||{|||}~~{|~}~~~~~~~|~~}~~~}~~~}~|}~|}~z}}{|uxvvvwxzx~{{wwuvuwtutwvvtspqnoptnprvtrrqtssspptmoqrrtrqsqrusttvvuutwuwuw{y{y{{|}|~}}~|mdXVSTUVOOINJGGHDFAC?A@@D>>>;?<;<>>A@ACDEGDJILPONMKFCAA@@><;=<;:;;<;999<:::977453335479CPUUDBCB=:4945524111020.029<4::301/.01//-./-.-0.0140/1-//01.1.0//.0//0//3-121.//0//-/--*,,)+**())*(**''(**)*)((++,+**'*&(*+)*))()''))')((())))))**(*')*+)(('(&&&'%%%%$#$&"####"###%%$"$"$%#&%$'%&%&'$&%%%#$&''((''&&%+'''&(-)379=<981032/14173025251552655354474564655665737634335444133211211010222234/233337;9843554/00.33466;76755433665574857:9;<;@@ABHvmtwilhaaab_`b_a`aab`__]\^^_[[]^\\]Y[\]`[^Z^\^`\^`aaa``babddbeekhhimkkkjknljjkolmoolmqqpqrnqmomomqqrsqtsttsssqvuvussqstrsqpooqqrspqoqlnlnsoqlnmsqrmnpolmpnnpmmqqsrrtprttqurrqtutquvtysvvtz{|yvqpiljfjihjcB+'%%$$!$!! "! " ""%#(##  '*$?NenjhQ>0&!#! !''+09=88-(" !!$',1@MintumhW?2/0-2-51||xy|z{~xz{}}zz{{{{}}}}{}|z|{}}z|}|~||{{{~z|{||{}~}}||~}}x}y}~}{|w{|z}|}}{}{z}}{z{|z}~|~}}~}}~}}~~~}~||~}~|~~~}~}}~|}|~}~}{|{~{yuvuxxuz{{||~|||zyuwzsvxxxvxuptrqprrrtroqqqqrqquonoponoqqrrrrqrttusuysuuvuwxxxxz{y{||z{}}~{|v{z~}ulf`bblyhOPLKIHEEC?<@?>==:<=>;;=?;A@AEGGNQRWWYY]baURIGC;=>;:::9:879879665474353431636KGCG_PE@?;8667424521014.1248:3882...--/...00,/..../0..00/100...-0/////...1000/00/00/-0,-*-,+('+(*+*)***+*+)*(+++(.,+,,*****+)**(*)''''''('''*&)+'(('-+,)*)(())('&'%%&&&$$%##$%##$%#%#$$%#$$%$$&&&&%'&!'%$$$%%&&&'('%&%&&)'&%*)025752301/0//1230332330272312254321354302333512000/10/2031320/0/02/110,00110342032/.00///,-0-/4210333564;558764859689968:7:89=cWli_b[X]Zceaccceeeab_`^_`^`^`a^`^_a]\`\]\Z\[[][\[[[\XY\Y[[^[\Z[[Z\]^]^]^[Y`^`bbb`acaa`abfcfcdggfijjkjjkgompqnnokrsqrsssqqqqtrtpsppmqmnminknhknnjnnpokjjkkjkkjppommqnosqpqnoqprstswuxyvz{}xskiljgihgjcA&%%%"$" !"!    "&"" !" "(1?P`jf[E<*%! !#%$#$%((*,&% "#&,6?FhfomhY>40**&'&'&|z|z|xx}z{{{y|}|{}zy}{{{{}{}y{{|{z}zz{{{z~{z{||zy{yz|~{{|{}|{|{zy}y}|~|{}|~||{z~~z||||}}z}{{}|~}}~~{~~}}~~}~|~~}~~~||~|~}}z}{|}}}z}|z{{{uxwxxwz|~~~}|{zxwwwvwx{yxvstvptsrqtqqpqqpppqmnqopnnpprooqotrrsqsprrsvuxvxxwwxyyw{{{}||{||~}~|~}|{|z{wtuqpniggde]^]XZWXXZ[`hfokg`Y[owTKLJKHFBA@@>@@<<;:<::8::;?@CFHJNSWXZ[_a`[RKGB?;>;79977:77634654563311/03/144GNCGSI<@;9:755453212112/0/1644332/0-010/./0110.//00-/.1/1/.../00.000100211111024/10/--,*,++**&,)**,,**,-/,+-*,/*,,,.,+,+,*-,**-(,,'&*'&(&('*+)+*(+))+),)*+)()'(*$$&&%(&#%'"$$&$&$%$%$'&&%$%$$%%%&'&$&%''&%&$'%(&''&'(%'''&'&(*013442.,//0-//..-10/010220214.20.10211545310212.1/000..-1000000/10//1////2211/-.100/21/-.-.0/-20124112245414534948456767767379HP^XYXYW[Z^cccdabbdbdcaccba_^__^_a_d_`b_ad`_d_^\`]\]`]][\[\^[]]Z\\^YXZZYZXYWUYUVXXXXWXXWXYUXXYXXUX[Y\[Y^Z`Z_^]]c_bg_ihfijjjhkijonjonlknpmnmloklnoppnonnmnlmkomomqsoonoronrooqoqpuqwuvzxz{}~~zrnnlhgghih_A(%'$#$!!! "!!"! !$"! #!%/;TXid_X>0#"  "!"!""!! $&**5?Wdelng]D0/&&%#$#'ywy{}y{{|z}z}{z}y{}{{~{}|}}|{yzyz}~{|{}{{{|}{{}y{z||z}{|~||z}|{z||y||{}{}}~zz~||||~z||}{|{}}}}}{{||{~|||}~|}}~}~||}{~|zz|{|||||}||z{{}x{{zzy{wzzxz{z}~~}}|zzzwxxxxw{xyuxxvuussspsrpqpnqmqonnoponomokqonrmroqnqppvrststuxvvuyx{{yzy{{z~{|{z|z|yy~}|}{zyxssqpqmlmjjgfbc\[WRNGJJJFFFGHKIKPPUXNOKJPwxZOIEBGD>>=>>:<8<=9:9889988:?>?@EIJNPSPYXTOIC=9:86456667453013232312100/0//..4>@>C<;;8<6643330222211..01342000/,/10.0-0-./+-.-//-/-/1-,1/0301/0--./../0-0.110..2..-,+--,+*,))++,,.-1+.-+//.--.+-..,*+.,.,,*+*+,+)(&()*'**+)+*)-*())))*))&'&&&%$%"$%$%&'$'#$$($$$%$%%%%#%&%#&'''%%''%')((''&(')(%&($'''&('(-//31/10-+-*,+.---/..0/12///1/-21100.11////./.-/////0..//010-00--..//.0////20/./,.-0//1./0./0/33888:58653411233113326164323217=;989:8798684446675677898;99794:<:;;78582632352532543432420211/2--///-05896986:665224/2.011100000110//0..//---,.0-/,..0..0,//0/0,/,-///0.-./1..01/1111/.-./.+-**,,,*+,*--.-0,//.0..0.//1.---../..-,--(,,*(+)(*(*)(*+,,)**+)++(*)'&(&&&$&$'&$&%&&&%$&&"$%%$#$$$$'$%%$%%%%$''$()'%%&'))')%&(%'&('')',,,///0,---+/-,--,.-/0./--..//./.-01///.11--..-0+////.-.---/-+.,+.,-/.,-.-/0..0.//-0/00000//1147>??@BA;;<899725542312/0024579AHRX\\_^_\___b^_a`^`abcb_ccadbc``dccdfadc^ab`_a`acc_gjjefadd`a__`]_Z^]^\_[^_]\\Z]Z\]aZ^][_[^YX\WXYXZYWTRVTUXUTVRVQSRRRPQURUUTSUPVUPWPVTTTTYWY\ZXY_Y\[]`^``_]b_aeagheliilfljnrmoloqmpvuvvwsxvtxvusonhkhhffga@*#%$$###""" !! "!  "%'.HYahbW@+%!"$!'+0ET]]mgwcD/)(&#"!!!!w{x|y|z}zz|{xx{z}yzy{z{{{}}y~|{{|{{|y{y{ywyzx||yz{|y}|z{}z|{|x|{{|{|z{z||{{{{zzz{xy{yzzzy|{z{z|w}||}|~zz|{{}{z~||~~~||~}{||}}|}z~zy~}}|{|}||zzzzy{zy{|~||}||}{~|z{{{|{yzyyxw{xwvvtsqplopnolnmlmjnmklnnnmmmlpmmmppnpoonnopqqonooqooopmpknnkngljhedebaa^]X[WSSPLLEEIBEFB@=A>AA@GQ^fjtq|~}t_IER³pdWLLFBE@?><@=>8>=9998755574677886377797764667876445675053236432141132021411112.//--0343::87462420/2010-/10/00.+/...2.0-/-,.,,..+/,-.0,0.,0--/-..-.-.--/.-.00-..//-/.././///---.--,,+./1/01002/10./,/../0-.1/2/,.-.---.++,**+++*+.*+,+**)*(+-+*(&(&&&&&#&&$#&$%&%&'%&&&%$%$%$$%%%%%(''&&'%&(%&''))-+)-)%'+((*'''')*+.///..*,*+-*-,.-//-,,+,-,0-..-.++,..-,-.-,.,-/-/.,./*-++*-+.....1.-,.,,/./.32//32121110//128@GLNKLFHCBDBA>=>::64212547:=ABGNTVVXYY[ZY[[[[ZY]]``_^^`^_aabc`ab_^ba]c``a`a_`bdcbcqpouloqmlnlinnhihea_^\`[^\_[[]YY]Y_^Z]X[X[^VZUYY\YWY]WWZZV]WZWXWUVUWXWVVVUVSRTOTQRPQPLSNQQQSQSNOQUTURSSSRUTWUWXZXYYWZ_a^_Y`_baddgfgeecfeceelnkmhlflggjb?2'($$&$&#!$ "! !  !! ""!"%(,LZfmhS6*$""&+7NTX\efr[C.($$! !vyyz{w{z{x||zx{|yz|{zz{z}z{{wz}|{{{{|zz|{zxzy{{}z}{{}zz{{}{{}y{|zywzy{x{}z{|y|w{z{|yxz|{{}}{~{|y~{z~||{{~|~{~||~~}|{|{z|{z|||{||yz|}y{yywzzxzyyxz|{}}}}{}~~|}}}{}|zzyzzxxywxvvtsrpomonpmmkkjlknllklnkljkjhklkkmjgljkfihjiigfgchcfccabbb_^\\VUVURSQSQQQMMLJIDGGEFCBA?@?:?<>=CLVapy|pP@=?KelojZNKMLKJLJKDAA<;=??:=;8<48856765556535484:6686978879986979888655546554242542513241000-.-114=33541201/0-0.+,./-,...+++.--,-+/-,,/-.-,,.-./,.+--/-..+.,-+,+/./,/-.-.-..-././..0//1/1..0./-//.//100/02202/000/1.41//.-./0.-/02-+--.,+**,*-,,*-,,),)+++,,,**(%*''%&'(''&''$)&'%&%%$%%$&%%$$%%%%&$'&%((&((')+-,-/,+()(&(&()'+++100-.---+,-,,,,,,-,+,-*-,-.,,,..0.,,-,--.-,...0./-/--+-+,----...+-,/-1+./.+1355641411/24103DPVVYTUMKHFJECE@A@??=;<7:9=>BCGILLLIMMLLMOOTPQROMNQRTRUWTWY]][\[\[\[^^``]a`\`]ac`dbhjoqinrkonkmpttutmfabecacbd]^^[_^\_XZZVYYXVTUQXRWVUV[[ZXZW[XZ[WXXXXXVVWWWYYXYVVXTXWUSRUUSSOPPSPPQNRRTQTPQPRSSPQSRSUQQS[QUQURWVVVUZVZ\ZY[]`bnkjnnjhhgfjeA+&%$&%$#""" " ! !      !"$&/:PQce^W1$  ""&%.7DMDNQWinYJ5))#&! ! }wyzzyy|||~}{z{{zzyzyxwyyxyxy}y|yzxz{|z||{z{{y|yzzy~}z{~w|{}{z{{}z{}zzzy|xz{zzz{{zz|{|||{{z|{|z}yz|{{|z~||}|~}}{{~{|||}{{{}||{|z{{zy|y{y{xzzxyyx}z|}}~}~~~~~~~{{{||{xxvvxyuwvvtsvqqnmolojklgiijkgghghgigfhhedeefddbdbc`c]`]aY`[ZZVXTYRTQRPSPOLKKKMJIJHLHGHEFC@D???>><889886:9?KV]hikpttu~ul_????>BBADGILPJMJJFHCB@B?>?;A@@BCBACBCDBFAEBDFEGCGEDEGHFMINLONPLRPLTVUWVXUVYY\\Z]\`^\`__ceghhfjjppmkfcbgebece^bh_c`c^^_`cc_a]]]`^\X][XVRVSOQUROUPRTVUUWVVWYVXX[XZYXWYVUXYTYXTVWVUYTTVTXVXYWVXUWVVWZVSRXVXWUVVRYWW]Z\[`bbgfjjlpopmjjikkgjfG*)'$)#$!"!# !   ! !!&"2CRV_[UM,!!!"#*8CIJAIH^gqgW:*)#$" yxyy{{z{zyy|zxzzxxz{z{yy{z{z{z{zyzz{{{z|{|y|{w{z{{z{v{|{||~}yz{{y||{|yz{z{|{zyz{|{zy{|z|y|z|{|}|~|~||{}z}}~|}~{}{}y}}{}{{{y{z{y{|}|zzxw{yzyyxwxvzyy|}}}~~}~}{~~~~|{{{wzzvx{vwvuurtusqronqpmkjmhjhggefgcgcbaac^``^^_\a\\Y[ZWXWWTURPQTQOLLOJKJMIIJGIHJJGGHEIDBFCCC@>?=<::876536047686957=>??BDCCM]jvwtk^P?>==?;DESOONNJJEFBDAB?B?>?>=>;<897878658854756644917645637898<9:;89;6875557335213200000.0/1//0,./..03311/.--,--*,+,(*,,,.+**,((**))(())*((+*,+,,+,,..+-,+,,,+,.+.-.-//+/-.40..1/0//41332232210353283432/232512432131.0204/1/2/10.0.4/021/0/1.-..+-/..--/./-...,,,***)*)())*)*)(()('''&&$&%#(&&%(%(''(')'(*(')+*-,.0/.-++-)*)+)(,,./1/./.,-*+,)+,**-+)*+,-,-,,-0.+-,--..0,-,---/,--.,-/--*+-,-.00-/0-..+--/1-32554633234/22345;?MFEFJBC?===?>@C??A=<>?=?<>;@?>>?@?>>?@>@=C@>?=A>?@>?==AA@A=?<@BBBAEGGGJKGKLNLNRQOTRUTYV][\\\V\Z\]__YY^____]``]`acbebaabbgdjc`de^hagb_][_VZXYYUWVTSPSNQQRTQMTKSSVQTRUSTRRWXXWVWYYZYVUVXWY][]]W\YZXZWZ]\_\`_^\[^][bdeffhnokmoopqolijjifjkcC+()$%"!!"! #"!!! !  ! &*2BOWZ\IC)#"  "&05AEGFOI\^gncK2.'(%# "ywxwxxxwy{|z{wxzy}z{y{y{zzx{zyzxzw{{z{z{}zxy{yz|y~z|{z|y{{|{||zy|{z{z{zwzzy|z{{z|xzx{zxzy{||z|{|{|y~|{}{{{}z{{{|{{z{{||{{{{|{y|zzzzzzxx{y{yyxvwyyxx{z|}|}~{}{||zwxyyyxxwwuuvrtsqsmnomkmjijhgfecddccb^^a\_]\ZZZWWSOQSPPMNNNMMGGLGJHDJEGGHHDIEAHAFDACDCCB=@==?;?::8:766645201//.110/3245445334638MX`lojcZO?>;=AEDLFDLGEFGBD?A=@=<>;78;8;=@??<:=>====;==<::@>A;>@=??A?>>;@??@>>A==A===>==>@>BA??ADDAFFEHJGOKLNPUPPVWTWWYW]__b`^XWTVUVVYVVWWXVZZ^W]]b^d`ae`][`^a`^[_[Z[[XZWWXVWUVVWVTYPYTTQQUUSQRSSRSSVSWUWYZZ[VTYY^V[X\Z\]^__b__c^c`afeeggjnimorotpkjikfjjjkbD+*("&###"!"!     !!!!"!#(=RX\[YA9)! $##)6?DJONVZ]hUXB?,+)("" {z{uywwwyzzzzz{|y{zyxyz{y{y{{x{{{zzxy|zzzxwyzzzzy}x|{zz{zy{}|{zxzzz|zy|yzzxywzzzzz}z{zyzz{xz{|z{{}}}z{}{|{{z|}y~|y{|{|{zy{zzzzzyy{y{{|yxzyxxxxwxywyz|z}}}}z{yxzuvsvswssssrroqponkkijiggedbb`c^]^\YVXVWVVQSSLOMLMIKIJFEHEEECCFFEBBGDBCCEEBCDBB@D>?>>@>=99778765521001/.--/-/0.////01144344446757ES]hjkf^SKC@=B=@BJHFOICDEDCC@=A=>@CEGEFDCD@ABC=?<7541578:66955;6974775677776687897644534134211/121455524445576455320/-../)+,+,,,)-**+)+)**)())*((,*,+*++(-,.-,*+*---./-/002322201132314334338344265643428367686742413342410312222232210121//00011/1/1-///.//./10/.31///.2./-,,,)-+)+(*)(*)**))'(('(&(&)(()((((()*&*)))*)*++-./-.)*)&)-*-,.021021/0,+)++)(,--,../---,-,-.-,...2,--.///..-,//0-/.,--+--,+*/--,..-.+0.--/38=:?::97?>?>:A=@AAAEBCDC?BAB>DFDBBC>BA@@ABB>===>8;:?=??>;??;>=>AA?@>@><>>=@=@=??>>=??@?D@@?A?B?B@AA>?@@=?>=>:;?688978362142510///.,/,-,.-)+./-./.1/1.141456678:8AD>?>;8=;;@HCFGDCCDFABB=?<>6:24333133345<879<9@@<=?;?8962221-0+,.--,-,-,+-+,+-++,,+,)+,),*-+-,,--,+-,-.,-/01110322330534456765667967453565343547658764625531531343435222324241112321220001-100.001000/.-3,0000.2,,,-,*,+,),*))(*(()'*)))()*(***+)(**)&**'*(()**).-,,,)+)*+.,---0//3631//.+*+-,+--,-,/../-,.,-+/+./.+,.)(+,,+---//.-//--,.,//,/...--.-,0-08;BEBFFGHGFICFHGIIKLKIKLKMLKHMJLHKLMOOJHKJKIFIFCDDGBCA@:<==>?;A?=?>?>>A?>?A=@>=;==<>>??@@DAA>A@B>@BDACB@CDDDBEGHHJFLJILMPOOPUVW`_ad\XRIE><;=79:;;>=>?@DDBFGKINKLPPVTVUY[YWXXUYY\ZWYVZ[ZVU[Y[ZXXZ[Y\[WY[\X[XY[X^^\[_^^[b`e_aabbdfegdcfflhheghkgloptwwzutqpngkiF,&%%#$$!! ! " #!! !  #  !!&0AXY\[eL5"  ""&(,37CMPIKLGOTZU[B6-,).1zvv{wxxwwwwww{wwx{wyxyzwzxy{x{zzyxzz{zxyyy{xyyxzwzy}x}wzzxzyyy}x{wz{wxxzxvxwzuyv{z{y|x{xyyzy|xx{yz|{yyzz{z}{{zzzzyyyx{ywwxzxyyxyvyxtvwvvwwvvwutrutrqttrsqqpnnjpjkgjffeffccc``_]Y\XZWRSTQPKJMGICFDBCBD>?@=AA?B>;>>===>=>==<<=;><8998:77657641030/012-*-,,.-,**,*/-,/,,-.2-.12132545778:=:?<=?A@IGISTTRTMPKIGF?F>A?<>9=<<<9=9;=>EELLUW\[^SUZUUUMHBE>79;=@JMFOQLAGEFICCFH@HJNNLOILDEGREA=;46131322/6?<;DF?>OHCKF?=@A<<964170/0/../.0002-/./--.0//--.//---/11///.--.0.0103043635854753385>==;8::::87;<898<986969683655656454234225264477976344321/1120-/00/00.11212211221202010.0-,-.,,,),)*)**(++,+*()***/**,))'*)'*('(*()++--,./0,,,++/.--./1/13412/..-.+.,-..-+.,.0/+/0./.-////..1./0/////0/2-1/-10//1001.0214001047>@HIIMLMJMLLMMNLNRPQPPNRSRRRTSTVQTTSSUUTWUUTROQNLNMIIKHDDC@<>AB=<<=@;=@>>CBAB?C@??@B?@???@?=>A?@@@C???@@F@AECFHIDGEIDEEFFHDEIJJNMSW[\^\ZVSOL>?833/.,0111257:99::HGHLLOUWWUYWWYUXXRXRURQRSSUVUXXXXVZS[XTWUVWVWYT[VY[Y][[````[`acfdbcfhimjjlikjjmoqtv|y{zuuokkI.)"%$""$#!#!!#!#$ " "!",7CNWWTQ@," !"&$&*558:227JDLOS[M=<8;FHtuwuuyz{wy{wxxxuwvtwvxzxy{y{}y{yxwyyzyxxzxzxzxvxwzxywxxzzxyyxx{zyzyyzx{{{y|xyzy{|wwwxwyxxzwywxywxz|yyyz{zz{x{y{{z{yuvyyzwwvxyyvxvwvwvutsvussqpupsorolnknmjifefedfa`^_[\[ZWXXRRQOOLNMKKDFDC@B=?=@>?@;?@;=:>=<<898=979;6:7667565532/120/0-//,-,,,*,*,,*+*)+,---.,.,,1..32464665:579;?=@AB@DDHGCEHHLKJILJOKNLMNLJCFA>=;<99::<9:@::73421431332540210321212/0//1011.0224445311/3635569;5=??@>><<7:68665756586557686A87:<67637343/002///1/004221324134552/3544/./.--,-+++)**+()*)(,++++)+**)*(+++(*,***,),-./-01310//0/+1...101235434060000.1134.202301322524485333546644487647475554688:86557:;:8=9:>CHKLMNONMNNNMLNOPSLQMPPVUSSVUVUYXVUWXYW[WVWZVWURUVQRSQPNLIEEDBE>???=:<==@A=F@AA;DAA@B@?@>?:=<===C@=?JQOMKJKKO^cxvwxx{{wwuxwvwwwxxtxvxwywxzwzvzzzxxxwywxywzwyuuwvwxxywzwyxyzvxyzyxwxxxwzyxuvxxtyxvywwxywxywxwwzxzwyyxw|zwxywzyyxwwwuxwvvwvvstwruurssrrppoopnokkhkfgicgdaa`_[\^YZVVRTURPNOHKIHFDECDFBB@>=<;;A;=;999;989:6886685516722401/2,///,,-0+*+))+*,++*+*+*++-+),.+,1../0012425587;=;>?EGAEADDFJEGIJJKQOPTSUT]QYX[UX^Y\ZZWRKAA=;<;:::;:@EAIZPJ]cVVOOPYdPSY?BF;7>FIK\ZOTOZWHG[QBRQMVMS\UWJPVPKQPH?7355302231JQFCSYDKQI@BBB?=<:;8757344688796672332314223042563657:97769676897;;=<<=DDGIKNLMXd^hzqkl]WVTSPFHGD@@====>99;7667468265:787>:4:<567353641222////1/1032430333133532/277630--,,.-.,*)++++(*+*+*+*(+*)+*'-***,,,-,.2031567:753223032124240656896:6797:8;<:68795::;=9=9==;;<7;>:;?<A:>>==???@@A>?@BB@CAACIIKKHLJMJJLNNOPRQUMSRVPYUVXWYVVY^[[[_\X]]_]\Z\]`W]XX\YZXVSQKKHHFBBEBA@A>=?=;@>=?;7=;AABCBEB>@A=<====;A=>>>;;CABAC?ECGEGHDGIGGGFIEDGGJLMNWVZ[c[[ZUMJDB5300.-7;@D@INPQV]V\\[YX\S@=:9?==HMJMKMPLRONNVRUTRWUXVSQTVRRNQRNRNPUPQTTVTW`dgiigjkkkjlkmkkjlojjilngC,($$""$"!#!"$ "    $ !  !%14FT\^TYC-  $"#%'+.39>DHSQPRY``bgddzux{uxvwxsxwvwwuxtwzvxuwwvvxxwyxzyxyxwyyxywxzuwxuwwwywxvwvvwyxwyvyywxyuvxyyywyuxyuzxvyxxyxxzyuxxxyvuwvwvuzxyxtuwswvwwvssvqsoqrqnojmlmjmkijffedcac``]YZZ[XUUUPULQKJIHEFEDE@DCC@@@=>>?:;;;<7878889777455344313000,+//..+-++'+*))(***())(,+-*+(+*+-,--,-.-.063136688;::?BEDGFJILNJMKMLNPQRPXV^`]`eecmigmlilhopnkng^WHCA>><;==;>CCDJXTNXXPPPMFZbMTYBAD<79DCIVURRLQIJKOGILFDMFKJKPOLPGPQB?@:454124443;B=DIECLFECGC?B>>:::9795543657;58998557:7656345456696979;<9<9;8;=8:::;=A@CFIBLIPNM^d\h}ovvba\WURPNICFAA?>=<<::9586684365473657::988967645432200.0../1.114/0031332214:6:>LIJJE8.0,....++*)+()***,*)*++,+,,---.+-0.2/153899:==:=:67867776847577:9<:CABFDGBFDECB@BCBCCDGGEEEBJEHGGIFGHNIMNNPKLOKLNOQRSRSVTVWX[XXY[Z\[_^]_Z]_\[]a^a_^`b^`dbd`]][SUSQNLFGFCDBCCCB;B;A;@=:<>>>>:>>@?>ABE?D?AA?>>=?>AA@<==?:<<;?<>?DCCCFDFKFDIEFFFDGCEHHHRNZUVX^YXUURHC:<@>=><;;899:776564354/4.0300/-.-,-,,,*,,('+))''(+&('))&(')('+**,,-+--,,/0012336389;=:??ACDDEEJLNMNQNRVUVWX[Y^^^gfihkjnnsuv|||}~||}~{socRPJEDC?C>>BHECSRVYYUQNRQWWRVN>>B;:=FBFNIMS@JFJKHAFG>JDFJ?IFHGD=@?:=<85754547369:A@BD=F@@B?:<:<::;752344242486176426355356654154457777889797979:798;?:>@?BHHJJIQOXh`mxigWWWOKJIBD@;@==89:87466573544646552412445344423350/2/2///14102/21//020406FLWX]WLJIA31/-.//./--.+,++,-+,,-----,1//2111165475:<=>C=:9<<899=9;::98996:=>;DBCDGHJDBFCDFECCECGGGJEMJIHHHHCEDFGGFILKKIHKIJOKLLLKMPMLMLKGLNNRSTVVYSVZ^^[ZWY[`_b`a__a]]_dbabaab`bdgfgigfedeb`[[YUSJKJGDFEAGBD>@=@>==::=?=?<;;=@<@<>E@?C>=@AC>@=:<;><>=?>?BA@FDEAEBDEECFEGHKGIMPSVZ]^]a\T[VOPMMRW[Z_\\[ZY^[C654427;@GFAEGED?=AB@EGEFFHLGDIINLPPPUSWXXYX\[[]]_cecjiilkkjjkhjjlgjjjcecfG-()$''#"%##"! ! "   !'7LP]`VTJ4'  "#!###$)+.19>PQWXinwxztjd^yvwywxzwutwuvvtutuuxwxvvvrvtvsvutwsxwutuwvruuvsusvzvvy{xtvwuusuvuuwxxvvwuvvwwvvwwvwuuuvuwusrttwussttsprqtnotpmommikjjjideddcba`]dZ]XZ[TUSTQOONKLIMDEEGHEFG>@@A@?=<@<:9;<=888767643422/.1-/0,+1,.+++,*)))((''')'&''''('()')()*)*),*,+*,.,-//231355777:>>?B@?DEBJIKJJOONQRUVVY[\bbbfdhjkortuvxvywoljbd_[[VWPVRLSRRWUOKIMNQRQMGAC=>9=;;;;:;?@;==@>><;87;69765866627566586;:4;6;:>@A=@?>;9:73543112553333433315465174566546666679785699677576:4:6@<;9A@EGJHFA?>=>;=>::9:7:8998863554856542436552325323335433334211312735896461010//0/53JOTWY^YLGL?75./020././-./+,/,//-1/010002555544:7698:;:77<7899<>@>?BCACCFFJHFCBEDDABGHIJKGHIEEGEHFEGFHHCFOIJLKJGGGFILJHJLOLJLQHLNNNLLQPTSPRSRRPQOSNWUYV]]Ya__aY\b``ccecab`\`bcccaeifiljnorpkqopnposnmleccYSMKGGDEAB@D?=;;=<<:=<9;;>;<:=?>>>@@?A>B@?B;?=?><>=;;=;?;:5977<8=;>><=A??EEBDD@EGDDHIKNUW_ba\a\ZZ\[_[\Y\VU_XA7433/5>BEBCDIAD>@>@CIDEAIDHDB?CDEFGEIENPOXSUXUY]\cgcdfdgfgflljhhjkhjgchjeG+#(%'&$ ###"!  !  "#*ETZ^f]OI/  !!"$$'*439FSTagnvvwpqi[Nsxwtwwtuttvuxysruwwtwtsvuxvrwwuutwuswxvuyttvwvxvvwxuyywvwvxwxvwvwvwvyuvuvwstvxuuwuvvtssssrqqsqqqqpqomlpjkhjkijiegdbbbdb_c][[ZXSTSQUQNPOOHKIHFGEEBC?DBDA@=@;<<>@<<9<7877784662423221-,++,)+*++,*+*((+)((&&'&(*)''((&(*(((((*-++-,/)/0./24166679:>>>@@FGJEHKKONKSRSTSVWV\]a^bagilkpqqwxx{zz|}|~}xutqmmhfheed_\YSQSNNMILGF9:=<:<>>=A?>>7:;99;78;;7=;9?;;:;=:8A<=<<;==;9;;>;>>=@?>?@=DAEIIFIGB><=:75554366552326437665744342635516531655865785575646;8698:88:<99:9:::9:::<94944867:989886==>;6656688544756634654;7/524432111010/0/2/124544355265858664<9>8<<<:9:95;=?<;=<;:;98;=>BABDCDEFELGKLIJIIGJGFJIKKMMLMJGHEKGHGGIFHKNMNNOIKMKJJLKIMOPOOOSNRNQRTQTTQUUVVRUVZUORUY^`dbbbefbacddfiglkjkkkjkjjnnpsqtxyy}~||{}ztqkkcXSPKLKLEGEFE>A?<;><;?;::9<;==<;9:=??A?<@;F>??9?<=:<:@>=:688;5:7687;9<<<<@>B@GDHECIDHNQQSYZ]`a`_aaa_ZZ]ZF922217@@HFACHAFC><@CFFCFGFJCFDEFGFIEDKJJSMRPUOYZ^bcggffgchhjmklkjljjjghhcH+'($%"$"" $#" !# !    "!"'4H_fbgcM<1#!!!#%',0<@KPW\kotyurpj[LEqtvstvvvuwvxsuutvxvvvwtxvvvvwtrvwvvwvwuwwvswwusvuqvttutrtuxxttwxuuwttstuuuvtrssrrnrqppqplkmojopkilekgcc`d_ab``c^ZYYZVVSRSPSQNMKKLIJFFEFECDFACAAAAB=?==<=?:;86787783453121.--./-.-++)+**()'((')&)(''(&(('((('(())(*')+*,*,..-///.324765;<<<>@ABCDEFGJJIKMPORPTRVY]]_beaeijjnoopstx|{|~~zxvqqmhhe`a]YUQMLFE?=ACCBACCFBEA?@CDDECJKKKNLJLLKLLRMMKROQRSMNIJKOROPQMRTRUSS[WVXTPMLHGAB?=:;88783875278357552545662755636546455;79:67896887:97;9:9:6;>=;<;9>>A<6:99887;7779:98;:D?@AB;9<<:435636474453326244373567588568456:79:6;>:?=;8<4799:>A@@?::>;:A;=BCDEDEDDHEIHJLLOLOMFMIGLLQQOSRONKKJJLNNMNHIMKNRQPPTQPPNMLKQTPRTPSRVSUSWUX\ZZ^_[\[^[^_]^dhmkqpoqpqqsqqtvw{yyyxxwyt|yyz|{yrpfc_XPNNHFDDDD>?==<:><=<:;:=9;>;;=8;><>B??AAB@B?=>==<<:<:;8;8::8758:67778798=?9CDCEDEEGILROSX[]]c^_Y\R?;>:7:=CECDFFDBB;@CBHEDFGFFCDECFDIHFFFHLSOSQVPXW^fegiikmjfijihijkldjkeigdJ.'*&&%#""!! "# #!!"! !   !"  !""$)7OajljdN6)"   !!"&).7HK\\]goquuri`UC<8trurstsvtttvouwtvvtssttrtttswwtqwsvuwtqxsttsstqwvvusssutxsptqqrrpqtqqrprqpqooqomljkmigikhgghcdcbbd^e]Z^Z[X[XUUTPRPONKKLKLGIEFFEFADCDCBBA?B>>?<>;;::88:887653122101//--,+.,**)+(()((''('''&''%&&'&')&(,)(+(((*&),*++..--0/2017566;78;;;>=ABBCFGHHOMOPOMRUTXZ]]\aaefhnoorswywzwyy~~{xwsniihc^\YSQUVTVYXUSSTQPTRRUSYUZ[Z\W]X[]\`aaaa__``a]_]ZXXY]`^[a_aabab`e_`c`\TPMLJFF@B?;:<96:68557948697844554:868967586664;69887:76899<;9;<;;<9?@ABF@>ABEDD::=:<;:;<;=8;<<@GACAE@;>B<9>;;;7:;954:AFBAJCC:939554;57::;999:899468969;GFJMD;:6757676877566255:6543228568;:7;78:99:7:;=;<<==>@BAGFHFIHIIKHIQQQUQRRLNLMNKUQSVURTUOMNLLQMNPNPLKTQRSURPMRPQTSUUZ\]_Y^Zc`cgiknotrsnrqnqllsruwyy|{}{}~}{}}}zxuolgbYUNNMIFFA<>@>;<=:;<<<=;<>5=:8;;;:=<:?;=?>>=A@>@:<;<<76;:;:97;6765568847;<8;<=>C>CGDHIMKPPUSRQNIKICEEKFHGEJECA>?CBDGDEHHIIBDDDFGCEGHGNSMMRQRTW[figilkkljimijjgkgghkegigJ)$%&)$###""" !  !  ! #  "#$&)7E`jifR=0" "!$!(06CXfkgmroswrpcK81-+urpststwststtstqutrtswtssvsqrrvrvsttttsvtsqrtrsssruqrqrnrsnonnlpmojjlklnljjhjijggdbce`]_`_^^Z[\XZVWUTPQQOPNNKFIJIHHGDFFFDCEBEB?@?@?@=<=;:<;<8887573311222200+/-,,***))(('$%%&%&''&''(&&&&%&'&(&)(((()+****,,-,,++--/02344868:::>?=@AEGFEFGJJIORSUNXXZ[^abcecignkqqvwyzzz|}~zyxvsvvqpmnghhcgj`gegfgiehjdiilmlpqrqooptprssqqoqoorlomklkikmnlplnmnqpnqmlmb^TTQQMIIFHAB@A>?><>9:<:::<::9::896:7:967899:::7;68:9;=:<==8:<<A====;ABKOOG>CBCBAED@??G<:<9;99:9:63;FEGKKF><779894966857::9:89887788;;:E@<;;;986<7:9959=:=;;87:88<;:==D@>9>@AAB@AB=?BBGIFHD??:<<@A@BB>?<;:<:??DFNKQKINLLPMJOTRUUWXSNRURPYST[Z[ZYVXSSVYXXWYZ\Y[Z\`aegbffgdjfhkjlsorqtutwvz~|zwy|{~~yrnj`]YQLFNGBB@==<<><>:>?9969:9778::<<>:?>:?;==>=::;:98:5;99;875=98865344859;9?=<;>;><87987757524/23./--.,+-,++')&&'(%%,()&&$&%%$$&%')*'(''(''*((&+((+)*,,,-,,,//02423877799<<@A>DDCDDFKFIMPOSTVZX\`\abbfeijjpouvwv{xy}~|}z|yxyxuyyyxxvxussstrstqrtwtsttvvwzy|z~{{zxwyxzywutsuqrmpnlpooqorrnmrprurpsnmied_XUQQPKHIDCBEA@><<@;<><=8<:<9<=;8;?:>;;=BEBEB=>;@DGCHDA=@=BDMPSXZOEF@EEDDFD?F:;;999:78<868=AJKF@<;6<:8::<:989>=;>9888:98:?:99>;><:;=;<>;;AAA@DECE?=>?BC>A@A>?CDDF@>@@?=@B@?@=::9;87?AEGLNRNMRNRQRRWSVZ]\]^[]__^icbffiiiglgfehkghljljgklmnmoposututtsxxxx}~~~|urlha]WNJKFHAAB;?>=>@>9=?>@@=;77773557896<:9:::;;=:<<@9>:;=:;:;=9:;<9:7:66765368;9=9<U]ZVVI:-$& !##*)*9JS^ffkoorwvi\C;+&&$trroprrpssuppstqtrtpspsqooqqqorqqqpqqoomokiikiglkiklfghgcedfbcfea^_`__\\]^YZUYTWTTRQOROOJKJJIIKEJHGHDFCGCDB?BBBA?B>?>=?@ECDEEHIKKMKPNTXVZ[]\dgiikjnmrqtwswyyy{}~||~yw{}|||zy|}}}~|}ysyxtvuwvwz|zz{~~~|||zzyxz{zzxvsuussqpporooomqoprttrqqrtnpmkeaZYUSQROLHGGHBEDECD>ABA@@??DACFDGEED@CB@ABA@@HKOSVWSNMORSOZXTQSQNIEOXVUZMO\^`]VQMHGFIPVeb^_jbGE@HBHHILNLHBDIJLLNNKHFJJJMNPRPLKQMHMKKMKIKIFFG=?;?<<<;?<9<<<>;<<=<=>=??>BEGHHHHA@;<:==B@@@A@A>@=?@B?A@>??EDEJ@=;>=8>9=;;;8<7;A?B@A@@<;9:899988844001/0.0-1/,,0+,,)'(''(%%&&%$$(%'$&$&%%''%'&$&&&'%(()()(()+)**-,*-0.5.123333568568:;?>?ACDFGFJOMORSRSUY[]_bdhiljrrosuwwx{z||||}~}|}|{}|}~~~}~z{zzzxzy|{~~}z{{z{zzzzwvvyxuwrrsqoqqpoonrtvuttutrvsokf`XUQOMNIKHJGFEDFCECAAB?EGOKSSTTTSPLLLKKHKFNMU\]^b`e`^`_Z]jgfcdec_^db`_jg`gksnghdX\ZVbh|s}mUDFHJRQRVZUTTWTWXXXWY^Z_]]aaahji`^[^[[XSQNLHCBA;<<:?;:;=<=<<9;::?>?<=;=;<>@A@CDFDD?B?@?@=@=:?BECHLJOSSX]X][a]`a`a[[^`^YYY\VX\`delmkmnnlilhghljljkkiiglJ2''%&&$%#"!""!!  !  "!  #      "    $'5D\^bjZ?'&" !""%&+>DQZYVgjmov~sZ>.('$%"pnoqrrnlpqmnnjpnnkjlnjjkiinkhkhecfegdebbcb`^^[X^[[^\WYW\WQTUVRPPONQLJKOOHMMJLIHFEFEECEEDADAF@@@?>A?=;<;=:=9;9:87634031/-/-.-.-,,-+)+*('((&''&&'$'$&&$&%'%%&%'('('&(&'&*)('(%('))+**++,---334319475787><>?:@;;;:9:;:::9;;:=:<>BD@HHJJKB<;>BCBD?BDHJDEEFKHIIKPOOVXX]]abcfhebfggdbbifefinrttwwz|~|~~xvsog^[OJJDEDCCBBEDB=8:4755625666445554533575688977:9;=>A<><;<9;==9;<::9977574556;::>BCEAGEIFHIDDIFILMORXSV[`_``ecedcghcgchkmooopmnkmhigjjlkkiliijjJ2&(&%&## #!! #!!! ! "! ""!""    !  ! "++7FSW[[Y8'%! !!%#)(1DLXb^_spnu|~s`G2&$! ! miikkihkjioilejhilhijcifadgdbba^a`\^_]\[[WWW[[XXTSUQQLPNMINNJJIHJHFJFIHFEFDEFDBGDB@@C@B>>=>@<9:9;:<9564953450331//3-++*,+*,))&&&&('''(%%'%&%&$&&%$'&%)&'&&'&')('+&*+))+(,*++-.-..1131034477988:;==>>>?@CBBBCFGKOLLQRSXVXZ\\c`dejikmpvttxux|{~}~~~}~|{{z}{|}~}|}yz{{zxywxwuvprrorsutsvvvywyyyzwuppjgfcc]`XZ][[YVTXTUKRSNNSPY[\Z]ZSWTQNQOONKRSZ]bgjedacdeedddggea`[Ybbehedgfhkded]UT[aeiqwsmb[WGKJLLPQRXTTVWW[ZY]\^Y]`]^dheeegb^_]XYZXSQMKFAA=>ADC@EGDCGCGCJFJJOPLOMLOOPWXVV[\YZ[]]]]Z_]_bb`bg`eggeelnpruuzztyztvyvuuyvxxy|yssjbZULJHD?CJJH?>75735464044466545432654055575889::884:?;9<;6<>7;:;997986;6787:8>>?AIJNTXY[USOOGJMMOPRUVVVXZ]]aefgjjkjpprqqnlnmlmlhiiihgjfeghM0&)&$%$#""##!!$!% ""#! !!"!!" !     "!   !#,2:NSZ\UC'!   !  !##$),7K]`[bhnkp{~s`O5)###"jihhkfeghffeaeeaac`_c\_^\\_[\[]YX[SSWSUSVTONPQMOLKKHKILJGJHFFGEGEECGDCEC@AAAC>?A@>=><;=77:6;73575252.1-0..//.,+-*,+**)'&()&'%&&&%'&%&'%%&#&&&$'$&$&&%('())**)))+,+,/,---.01303134879999=<<@<<>BADDADLHJJJMKNOQTTUYX]\acceglkjomrtuvzyyz}}~}~}}|}~~{{}z||}||zyzywwxuvsuuvvtwxx{zyx|{{|{{|{yuopnkiiggdhgigbfegbe``[_bchfbfd``\VUZXXVVZ]\`dhjjomigd]c_beca^]afcdcccbdaafdc`ZWS[\ejltnld^WRVWMQPURSMTXX[[XZZ]\Z]^`caehhggd``^Z\^^_[XXWXZYWOPSV\_\`^d`bb_cccehikifjgjfmjonoponprqknpokonqpusosqvwvy}{{zwrnjg_[RMNFGHF?=84644503134447423346423345253345557877::<;@@=;:<:757:6:6:99:59686@ACKPX\agigb_XXSTKRQNRRPRVY\[\[`cdjjmpqtpnmmqljnklkkmginjQ1&(#*'$$$$"% !! # "#!" ""! !#! "!  ! !!!    "(.8FTV]X=+""  !"$#&'+1=Tb^Z]fhnnzpbQ9&%$"$edcedd`aa_`c^^]][^[Y\YV\VVXYQQURLQNNOLPKMJHIGHFGFHEECBDEBEADEB@@?@?:=@A?>:?9:77988974:4342.1.11*-,+)**)(()%'')'&%%&&#&%'%$%%$''%'&%&'%&(%&'&&%)*(+)*-*,+-.-20/.2244436865:99;9:??A@A?CEAEDHIMKILOPTQXSXWY\ZZbbeicilnopoututwy{{~~~~z~~}|{}{{zxvvxx|w{{|~~~~}}zzwxywwyyvtuqooniliiignkmqmmkkgfegjighflmoqxw{zzxuqsntrrqruyvuy{vwtumnponpilbjdfdllnknkebedba]b_dhgikiheicfeeffgidhnnntqoiigkmntlmhklmnjjgikknlqosqssrwux{}{z|wwwxxz|}~~|~}~{vnmedXUOJILB:77556344432241.315474124656654363264:885:87;6:989:8687998;785957469<@FK[bikjoqkmkl_[TTRQNPST[XX`becjhgkjlhimjlhikkkjifkiM1%(')'$$&### "#! #" ""!"  !#!! #!""$"$""""" "%"""!    $%,9@OUWXU9'!!#$$%+.:@S\][_mjmqzjRA0&#"! [\[\\Y[XX[YVWVSVRQTSOQRLPPJMLLJJHEHHIDGILGFFDEBDCB@BB?@@ABA?>>==<=;;:9889766965451403/01///.-.+-(*+'*''(&'%%'$&&$"&%%&%%&'%&&&''%$(&''&&'(('(+*)()+,*-.001.2553957688:99<:;=9::875877:>>DLUYjprzyqofbZ^__fihhklilnoipijmlnlikjmklQ5%*(%''&"#""!"#"$"#""%!!!"!" !  #$&$##$#%%'&$()%()((%''$(%''&&%%#"!   !!!(2HS\YT>8*!! $"#"&,-;NY]Y\__efmrdU=+$# !  ORPNOMNLNJKJJJJFJFKEEGGHEFFDDBA?=BDC?CA?>AA<><=>9:9999:7757654731320/01//.,/.*)+(',()'(&&&&&'#%'$%%$%$%$%%!$&'&&%$%('&(('('')))((',(+,,./1/10343465:6;8::>==@B@FAFECFDDJDHJLMHMPNOTUSR[YYba_cchciijnpptrusuvvw|yy{|uqpic_ZSMHF>;87135553632/12/?BADFEPUW\UVWMNLF:=5313235.6356855:888;;7=<99>9;8;>:?8=8>?>>??=<<<99:77897658353113051//./,,+-0)***+'('*&(#&&#&&%%%$$$%#%%%'%&'$%%%&#%&%%&&''(('**++,+++--,-.11103275855;8;9:;:9A;B=;>><=?;B?DIPUW]affolpojjmnjllmnkomnijhkO1&)'''%###$$#%"##"## $"!#!!" "" "!#"!$"$'%&$%&#$#%%#"$"$$"!'$#$%&#&&%'%&%&'#&&"!      "#&,2ELTR[C.!!!&((-:BU]YVagehhj_M5(#"!!!EBEDBFCCABCF@E?B<@>A?A?=@<@;99:99;9994655642232/021020,--,*0*++**'&'&'#&'&&$$&$$%$"$$$$'%##$#$%&$&%%'%&($)%''''()()**,+,.*0-1-04164726699;9=>=A>?>DDDGIFHHGIMLKNKPRWVVWW[[XZ^^`cbgfhgnllnpoqrsuxvxz|}{upjecc___[]]W[[ZYVXTJEGJLPX[_\`^^`__]_F;474468=;:8783325423342:789889=9@@=>>=B??B<;A?C>ALNSV\ojllkknjmjlkljjlhikR3&)('&&%$#&##$#""$## ""#!! !!" " "%"##$$%$&&"#%!$%#####$$"#"#""%"$$#$$"%%&$'%$%!"!!!!!       !$%3GMK_Z?+!##"((0@Pa\U`eefolg]A+%"# G@BDA@A??A@=??=;;;;;9;9:88735543131400/1--/,----)-+)(*(%*%'%%&%%&$$$$'$&"$##$(#$%$&&&%$&%%%&$&'&&('((()'(*+*,.2120/0/2453755;7=;<;<<>:;96464443654766476689::<==>@?@D@@JVbglkklmljjjpihkinkO1%+&&'#%$%$'#"!#!!!#!#"$!!" !!! #!$$'&%$%##"#$""!#! !!!""!!!""##"!"!###$##$$%$##'$$$# #  !""  ! ! !"&):?KP]_O.$ ! "!&%-0;JM[WYbgjosmfR<$"#%;?A?;===:<9;;;:8:794<645575342//...--+-*,*-)(*(((()&(&$'&$%&$'#%##$$#"$%%"&#$%&#$&$&%%''(&&''$()***(',,.+,-*./202505526458;<7=<=@@@AAAEDGFFHJJININNOSTTWXUWY\Y_\ccdhfijlmlnnltssvuwy{z{||}{sqokgic]bYZYQIKJNTXZ]a_^`b_\]_L<66;49@FGGEHCDC?;;=:77656798:9:9>:789=88;<<==>@ABDEFHPZ_fmmmklnlkimjlkiikV4/.,%'%$%%$$$#$%"$#%##""!"!!!!##$%%'%&&$&"#%"#%"!!# !! "!"!$#!#!""!##$$#$%%%$$#"$$%%&"!"#   !  !  !  #)/<=>7796;9?@A??=?<==9?=?=@?=BDGQ]ckeljmnnnmnmllmmjgkU7((&'&$$$$$%#$$%$$##$!""!"!##$'#('&$$$$!# #$!"!#"$# !! !" #"$$"!!!#$$##"%#&##%%#'$%$##! "#"! !  ! !! " !!"!  (-?BCDCFRH/) ! #!"$)+/AGNLJbfijstplN?2$&$! ;5:4733562351700010..-*,,,**)&*(%&&&'%$'&#&$%$&%$$$%$!%%&%##"!$&'$%$&&%%$#%'$'%'((((*&-)++-./+/-3/150535686:;:?<<>?A>?@CFDJFGEHNKNOQMNMSQUWWZXY[^aabcfhhhkjkkorpstuvwwvwxy|~|{tqookjjgdaefcbgaea`cRD7::78@IHKIGIJHFFAAFKJEGEACB<:;;;:=A>EDDGFE=H@AA@IMN[`jmmpkmnlpplllkljkkmS5(&(&(($$$'&##$#"%#$$##""$"#$%%%%'%###" # "!"!!! !" !"#" !!"!####!##$&##$%$'##$"##$##"%"!!"  !!!"! !" "! ! ""!(/;:=D>@IA?. ! $#$$)-7JQNSV_ehjpxnYA/%%" ! 500/31210/-.+.+,,++,)((('(&&%$&$#%$$#"!"$"%&$&###"!##"$$&$%$'&%#$&'&%'&&%(+))*)(,**/.,000214425374679;9:9<>?C@?CBCFFEIEHNKKKKNTQPRTUSV[[][^]bbaggfjkkmnpoqrstuxwxv{||~}zwsqolmkjkihiabaQC;::99DGLMLGJJHCBFBGILJIGGHHGCC@A=BHKRSPSPPRMSUW_dfmjljqphkmkkmmlijlnR5)&(%&'#%#&%%%$$!###"#"#""##&&%'$$$"""! !!!     !" !# ! !"!$"#!"!""!""#!!!!##%#"$$$##$""  !     ! ! ##)0;<=:98;?0 "! "!!!%%+5BXVSX_biektqZD1("#" -*-.-.+)))(+)()((%%'%&($$%$'$#$$$#"##&#$"##$!$"%$$$#$#$$$%&%'$#&'''&(()(*()*../01.03244366787699=;;@>?AB@FCBDGHHIHGLJPNPSVUTRV[XWY^\__bccdhhjjlommqssvssuxwxz}~~~}z|xssnpnhih^RCEA@@FIKLKLMNJJGIFGLHEJLGHHEGICEHA?@<;?CHMOSST[ZaghhnhkkolllnmpqlljgjgihW6)))((&&&#%#%%%$"$$$#%#%###!&&$'$%$"$$ !"""!"$ !! !  !!! " !!#""#""##!"%!##"""!"!# !#$$"#!! # # !#  !!! ! #%  !$'08:84436<$&"!!""#$-3CQ\TUZbigffsjT=(#$#" "++()*((''%'&%$%#"$###"%#$%"!#"%#"###$&$##$%%%$%$$$'%%&&'%&%&(((***++)*,,.,302044336:79<9====>=>A@@CEBHDEFEIKJLKMPOMQTSSSZZZ\\`__afdgfgkkhnmoqpuvuyyxz{y|~~|ypqnhhb^VTKHRJNONLKIKFDFHKLHLMJLKJGHIKNKHAACBACGJQSWZ[dijoqnnmolllslllnnimjlmhY6))*')'('%%$$%$&&"#$%$#%%&$&&%$%$"%!!!!! "# ! ! !# ! !  !"!!"!""!"!"!"!#""" ## "$#" ! !  " !  !! $!"!!!! $ ! !#%&,04345=83%!  # !%(*0???C@BEFCEEGDEGIIGKGKNKLOOROWZWX\]]_ceffgghllomlqmqttuwy{z||~}~~xyoohg`^d`]YVQSKMIHGJLLLMNLNMHIIKLLKNMLJKMJFBHGOW`bkjonkospmnklplonmmnmnkkV6*%*('))$'%'%'$&($$%%#%%&((*&#%#%"# !"!!#!" ! ""  !!   !! !""! $!"" # !! "!$"##"$""! ! !!!! !!#!!! $"!! ""! "   !&567:20.,&!   '"#%$%&(17NVXZ[Z\anm}vZE+&#!!!!$ %"##%$"'$#&"&$$"$#""#%"##"#"$#%#'%&%%%$$$%&&*()(+((*)*,*.,/1/13226325968:9<<=;A?BDDCEEDFFJJMJMNJLHJNPPNQRQXZT[Z\^[`cfeijkllnpoqttruuwxz{||}zzxqpmkikfc`XVRSMQOQKQQMOJJKHIKKMLMMLLRROPGHMT`fhimrqjpposnqpmnonnnlkik[8.+('''(&&'%&'%&&&%$%$&)*()+&$&#%#! "!!!!"""!"  !! " !" !"! !" !!" "" "##"##%#!" !! !! !! !   !"!!!!!# "  !   "')248@6-,+)%$%# !"   #$'')+4ARTVYZ]ahmtyaA($"!" $$#"""$#"#"###'"$###$$&&$%$"&##$'$%&''''&*))*++,*,0--./0013345677569:<:;>>BBAGFDGGGFJLHJLMPMNOQTPSUSTTXZ\]__c`_cgkimnonrqqsvwuxyyz{|}|vtqsqnmnegf]ZYXPQKTPOOOJMQPNMJLMPSWTUPNRV\ejomrompolnopqonqkljlngn];,*(()&'%%&%%'&&''&('&''&)''&$%#$" !""#"# !!"!"!!""#" !! ! ! "!! ! !!" "!""!"""! #" " ! "%   !""!"   " !%%&(14<<@:5.---/-%$## "   !"#+()48MXZWXZajlrwt_T:%"!! $!!!"$"$"!"#!$$$"###(%''%%'%$%%$'%%()*)+*-/,-00-1012/13787767;9;:;>>@AC>BDCEDHFIILHMIKOPRROMVTVUXW[X]_]`]`behiglmlmnttwvyyxz{z||}~~}wzwuttpokjb^^YTPRQJOONLNOLPQTWUWTTXWadgmlonnonolopmlmnhmkmldl]?**)-))(%(&&%'&'(%&&'&&()*'&&)$&&$$"#!" #" #"#!"#! ! # "#  !!!" !&!! ! """!! !" " " "!!!! ! !   !! ! !0/88?C>:998790/*!"   ! ##%',/=JWaXQ[dfkis{iC:-#! !!! #!!##%#"##%##%$&%$(&'''(&'&')'+*)++/..,-112332556:866:;;@9=@>?A@ADEGHFGEJFLKKMQPOQQTRQRUWW\^^^]_cbfffghmlnopoqtsxx}x}y|||{{wvsrqjkfc_UWVOQROMQQXUXWYW[Zagimnspqqqpposnkmlmnoomho^>++++)))'('((&&)%%&#'+(,))*((%$*$$&"$$"!! !#"!#" !" !#""!#! !  ##!! "  !! !"  #! ! "! #! !   !    ""*&--358>C@:::340,)"!  "! " ! !'&02KTX[V`knomrwtX70'"! $!!! #!$#&&%'%$%%%'%'&)'()'))+--,,.-/.-060430755::99<=>?>>>C?CDACFDEHGEHIKJLOOPNSRTUR[VY[]^bbabbdbegijhmnmqruuuvxuxz~}~||zzytqoigfbbVWYTUZ]][X][\eehnmpnpspooqprrqmpnommjoZ=,-.-+-*'**&&&&'&('())*)*)-()(&'('%#$'$$# $$"!!%#!! # " !!!$! "!!!"!!  " " "  !! !!  !!! !   !!"! ! #!     ##%#&&)+3;;5=@9=963+# !  """$)04ARUQV^lnmisyzjK3*)!# #" "#"%%%&'&'&()*))*-*,.-,/.//1.2/331486;88:9>;=>AA@BDCCEGDFGGJKHIIMLONLMOWVWUYWUZ^]]d`dfehiikkknnrstyxxyz||z}~~|{}utuqomge_[^__[][\^cjkmnnpqrprppsonrppooonom^<./*-+-,**+(()&+)'(*++++++('&)('(($$$''$"####"!$""""$!!" " """"! ! ! !  #!!!!!%!  " ! !  "!!  !"!"!"" !    ! """#'*,/1;=6=;3))     ! ! $&%*+0;TRO\^hnnppsxrLD1&"!    %'(&)+*+(+)),+.--.1/2232266869757:;<<=::><@CABFCCFDEHFIJKPMJOMPMTTMVVZXZ_]^bcafgefilknoorsvuuwwyy|{}~|uvspppikiiadfaiomnrqstqprorpnqqqnnqnpp^>/3++)*,)()&'*(,)().-,,*++))&)&)((()%('##'$%#" "# "# #$"!! !!" #"!!" ! ! !!  !!""!! ! ! " $"!"!"##" ! #!#!#! !!"! !    ! "##&)>C0734+." " !!"!$$#&+17EUWUZbklrptnkdD8'+"!  "(&++*,0/-3,,21/135335688:<;:;=<<=>=DAEDDEDEFHFKMJLIILKQNQTQSUVYYZ_[_`b`cddfgllmnopssuuwxzz{|{~~{}}z|yvusoqortwsxtpssttnqmpopooqmmp[A1/,/,-+*(+*++.)(*,,*)+*&()*))))*)&)')(&'''&&%%'#$!"" !!$!"""$ !" !""!"!"#  "  !""!  $!!!! "!#!!$"   !   !     "#%***.31.+" !! # ""! !$#%,05?NUW[`bjlussobJ2)%##  -*-.210207065788:;799;;=>=;@@@F?EDABDFEJIDKJMKOTPRSXQSXVZX[\^Z]]accghjjjlmpnstvwvy|||||~||zy|{}{}wvuuturquqtqqpqnmps\A2/0/0--+-+)*)-,*.),.*+)*)*)***),)*,'*&'*$('&'&%$$!"!!#$"##""   ! ! !# !!!!!  !# "   !""!! !!"! ! "    !$$$')).+30#!# !# #!!"!#('*.4@ISPS_deipsslaP<.$&!"!  10125465889<::==?>@>@@?A?AFEADHEIEJJKJLNOLQOQRUUWVW[XY][aacdfgiikikkmqrtutxy|{{~}zyvvtswrppsqoqtcD131-,--0,,)*+()++**)*.)+()))))+))(-,(+(,++((()''(%&'%$$$#!""#!! "##! !! !! !  " !"#"!"   $!!" """! !" !      !"%%'.*04+!! %""##!#"%(.4FNMWV]ekpqnnm`Q9-*%$ "!!2489:;;:>=>>=>?ACBEADCBFDDFGIJNLLJONPRPSRRWWYZ\]_b`dadgfhkkmjopmqruuvwz{}z~}|xvvrorrtcD44000-00--+,-)*,.0--+-)-+*,,+'''+)(-*-+)'*'())(*(%)(&$$%#"###$$$"#$#!!$! " !!!! "#!"    ! !!!#! " "!! !!  !  ##$*,.2//% " # " $!&%)/:CVUOU^cjpnlnmkS<0)$%%$"# ::B=:??>@?>BBCDFFGFGGFHJHLKLOQOQQPUWWZYZ]Z]]__deegikjmknlrqtuuxuvzz{~|{wwrtgJ8=762//10.,,,),-///,),,**,,+-*)),+**+(***)*+(*'*&'*('&"'$%&%&$#$%"#&" "#!"!"! !!!  !! !    !  ! ! !!"!   % $!! !!  $!""').1-,$"$"!#!!$'$(-18EQ`X`bckhrotpeX>-($"#"" !  ">>@>BECBABBCHHKJDJJIJJPMRUVTSZV[_[__`_aabfgfilhkkmnsputuwxx|{{}}|yrYFB;::4/21-3110../,,.,+,**,.+///+*(+++),+,+-++)))(+*''*&***('&%'#%&#&%"#%#"$""!!!"# " ! !!" # " "!!!!!"! "" " !"!#!"     !! %$),/,(%#!!!"$$&'&*.:ER[e[bjnprvxmeZI3(%&##"   EBDEGEFHHIIJNILKJOONQNPWZV\Z[`b_cdghfikkllnmqrqtrvwzwx|||~ykaVRHKB=;733400216.11,+,,--/,+*,+)'**++***+/+,(*))+(+*&&*'*)+&('&$%$&$$#$%#%&$#""!"#!! !"!  !  !!  ! !# !! !"      !! $"""*01.,("!!"####%*,3?Nab_agijmqqrlUG4+&"#"" !! GGGIMGMNMSNMORUXSYVY\\[aa`ccgfhinipoprsuuvwx{{y{|}~xkhfb_YTPIG@?6:54622/.0,/,,,+1,,,,,,,,*+)+)+))'+*+(*+-,*-++)+&*())*'(*%%&('(&'&##%$#$""#!"#"!$""""  #!##  !  "#  ! "!! !"!!   !   %"#(3996.)&*&%$&%%)-9L]_\_`jmooswykT4+$%""$!# !IIOVPQURUVUZXY]\\`^`ebfgkjlnpnsruvrx{y|||}|}~~vvomif`[[YSOKFGA<:293/-,1,,0---,,+,0,+**--*-,-*+++*+*,/,)*)),*()*+*+()*(')''(&%%$$%"%$#$$"""$!#"" !"!! "  !! " !!  !"! !!        !!"$%-4:@9<8+'%$$&&'-1>S]\[`hsiinvztXJ(#""#" % UNTVXW]V_]`_acddgigimjpppsuttw|y{~~~||{wrkhda_[UXPPGB?;55230//-10--.-2.*/,,*)/,.*)+*,,+-*+,,+,)*,-*,),)(&')'+(')&%#$$%'&$#%$&"#$$##! # "!! " !! $ !! "!" !! !"!"    !    !#!%+-0::?MC=84&&%()-6HMRP]dlpoprynfO8$$"!!# !"!_Z][^]b`bfdihkllqrosvtuzx{}}|~{}|uqnkhca]XYQPJL?A853261//..0+--,.,-..++-.-+.+.+.,,,-,,-+()+*)+)-*&-'('*(%&%'$&''%('''#"$%$"%&" #"!"  " "  !" "#"!#!"   !!#  !  #!"#%)/@IWX\ZYM0.)1048NRXO`hjmqtuvi^B&&$!!# ! "  _abcgfhjhnnorstvxxw{}{zxoomji`^^[[SLHF?;:96523000.//../,+.../+)+-,,-*,,,,/.).+)')(()*'''))$''($''&'&$$&$&&#&$#&%%$#! !#!""!!!!! !!"""#$!#"##!! !""  !!! !   !  #!!!#$&)'9DQ\[qkgK?1209FXRTZdgdjuzzqPN:((#"#&! "#"fikoopnttvvzzz{~}~}ytvprijcc^]XPRLIC@<;6421/1/0..1--+++-+*,+*,+,-*,-,,)'+&'(+(+++*)))('(&'(&$&%$%'$%$"&$&%!&"!#"!! " ! "!""!""$# #" """! !! !   !     ! !"$%&+7EUWepjwpkRB,-'%# !!  ! !y||~}upqijcgba\S\LOHIA>:=644011323./.--.-+,-+-+/)*(*))*-,*()'(,''''''(()%&'%'$'&#&#$)##""#"" !!  !!!"!!# ""$"%" "" $!!! !! "  !! !!!!"  !"%&$*)0?GO_c~{uiee^ZZXZX`f^lgG4+$$!" #"  "  ~xyrttkideW_\XSMKHHF?:;663200.-------+*,,-+*,*.*(+()*-'+'(()'&'&'$'')%&%%%&$%&%"$%%$$ $" "!"!!!"" $##! !#!#"$#$#"""!!!"  "!! ## !    !!$$#$$%.;LSdfaliaeicUFWXZ^ieh]?0%%$###"%#"! ~zxsppjac_\[RUQMIBBB;7631124120/.0//-+*-.)*()**,'+''(()(&'''%&*&(%$%(&$%$&'%#$$"!" "#"!"! !!!"""##$# $"#!"##"#$#! !#"!"!   ""!!#%'(->;82/5@ELKVVaj_`>3,('$! !!!#"  !vzumjhee_^][PUTONHCE>=9634033.//-0,-*++++)*),/)'))()(#&'%&*''&&('&$$#$$"#!"###"!""$ %!#%#!!!"#!#!""%###$"!""$" "!" $!# !! !     "  !"!!!)()*-+/1+)**((24=DHMN]euvSF=,$#"!!   "   }}yuqmijdcf[a]YYTLHGD:=7;9461///,.-,,-+.)/,)))&()))''%%(''(,*()$$%'$%#"#$#$# "#!##!!#""!!$$!#$!"#"""#" ! #"## "! ! " !! ! ! !! !    ! !"#  ! "#'('&))&(('().<:937./.0,1+++,(**(,**)'')(+'('(&(($(&$$&&%#'"##!!%$$&#$$$""$$$"!$"#!" "" ! $#!"""# # !%## "!"#! !"!  " ! !!"  !  !  #"!"!$&&%%%'& !$-?@RWZ[IR[VfiRG>4/-%!$" !! ! ~{|{xvrnkjecbZ_[QONGE@;<:;8514100/-,+,-*'+*('()&)()'))('&'&)&$%$#%#$#&!"$"&##"$$!##$#"! $!"!"##!$$%$#!$ !!"!! "!#$!"!   !   #   !   !!%" #!#$#$####$" %+3EMVQKJKFZp`lXOD;*'("!#!"  #!~zvtkjgg`g^^ZZUSLHBD@>=8553.//./0)/-**)+*-)(&()(*(''''($&%%%%%$#&!!&"$##%!#$%"#$%"##!%!"$$"$##"$!# "#"!%!#"""" !    "!!!! ""! !#!%# !$"$&$%''+7:AEC>8C]d^fhf]JG50*-#"""!" ~y{unpnjiec`\`URPQLGB><79:650/3,0.-.-.*-*)*,))((*((''#%'$##""%%#!""!%$&$% "!"""$$"!&!#"##$$%&$"# #!$!"##"" !! ""!"    !    !!  ! !!!"! !"%#" ' "#$&)-021;@FAAKSIGVP]aW`ZQB>6($## "" }xvrnojjeada[[TPKKC@<=9:7/21..04-.+*++)+')*('''()(&'%%(%&$!"$#&%&%&###'""%$$%"$#&$$%$!#""$!##"!#$"!"!!!#"#""" "!!$ !      !"!! ! $   ##! ! !!!##! " !!"##%**)8@;9GJSKJN:CEPV`dafS<+'$!"  zzstqnmjgdbe`XSTQIGD?<>;<444001./.,,*-)')+*&&%'(')'$%$#&%##(&$&'#$%#$%#%$$$#$&$"$#$!$%#### $$$$'#"$"#!""!"#!! !#  !" !   ! !"   ! $  "  "!"!" "# !!  #$"""$%(1047<:?IHL@?EGJU^`aVM>?2**%$"  ~|wvsrnjgcfa^_\UWROHAA?<677643.0/0,)-*++*))+&)(&&'&#&&#$%#$$"$$#$##*%&$%$ "$&%""###'#$$!"""" ##"#"#!"" ! !!! !!"   !""# #"  "! ! " " !#" " "  "#"!!"!!"$$$%%%'*-51/98>B?FKMMMLWW\`ZJ<:6-*$"! ~z{vopkglacc[^ZXUOKFG?@<99774/./.,+,.+.,+(*(+)'&('$$"%%(#&&"%%('%#$&%%$#$##$!%$%%$ "#!#"!%%! %##$$#!"$%"!! !!" "     "#! !!! ! !!!""! !" "#!#!" !#"!%!####$%$'++/+(63AOLQIS\]ZdZSSNLD2%%$#{xurpkfjbaaZ_WZSMOICB8;8844302/0../+,)*()))%$&'%&'"&&$&%)*$&&&&($%%$%'#&#$$%#"&"#$ "!"#*!!## ##%"%$%#! "#"!"! !! !!$!"$! !!!"" !!!  !! "  ! ! #  !!# !  !!! "#"! !!#!%#&%(*&))0/15:EBAKPQNHPT[^dXP38,+!!{xqsloiif`a[WWWUMHBE@@=449130110/*(-**,))*((*$$%%&)*'%$$%&'$&$"%&%''$##"#$&#&"&##"!!"" #!!!"$#!$""""""!#!#!"" "  ! !" !!"!! !   !! ! !!!  ""#"! #"!!#!! !#"#&%$%(%&+-.:AKNOGGORVPSDKNK=?.(}|zoppmhc`cZ^ZVWPRMAGA9<:733//-/0,.,+(('''()''')%(%$$'$'&'%$#'$%&$%$%$%$"%&#$%$!!##%$"#"##$!"$!  !""! !! !! !   !!" !" "! ! #!" !!  """ #  !! #"$ #$&##&%((&(/67DJJLMVJANIJXNIK=5~{upqififaa\YYQXOOKJD?@?755302./*+,))*((('&&)'()%$&(%&)$'%'')($&%#$&'#&$#&&$%#'%%$$!!$ """ !"!! !"#!!!!!! !!!!""!  %!"! !! ! #!!" !"! !!"!!"   %  " !  $%!!"$"#$$((%+.*,068;CI>>UNRONM:AA~{wsuromkfbd^\^XWVQKIGCB?5975301++.*+*(*'*)'((()'&(+'())(')('&#&$'$''$'#%#!'$#&%#$##""$ """"! !"""##! # #!"!!#""" # ")!$"% "!!" !!"#! ! #!""" " " ! #!"!"!!  " "!!%#"$&#%'*.-1039BBSNEGKJN{{xsrqjhib]_]XWYVNPGGI>;9569320..+++)',()+(*(()&((*(((&&%'&&'#&$(%(%$%&###'%#$#%#""#!#$!"$"#!#$# "#""""#"$$!!"" $"" % !"#! "! """ # !!! !!! "#!" !  ! "$#$$%!"$&((*(,018AACHDMK~ywwppnjgcf^Z`YUUOLKKCB;<89300-0-,*+*,.*.,*-)**)(('''(%(%'''('%($$$'&&$'(#$#"%%&$&$#!$#"$#! "&"" !!#"!%!#!$!##""!%#!! %!$#$$"#" !!! " #$"# !#!!$# !!" ! !"#"%"##!! #" "#"#$$%&&$(*(,40=B=HF{wsuqkejfa_]XVUUOQLGJD;=77753-.-.)--0.**+**)(')*'(()''('('"%%(%%$%%%'"#&$$##$""!$#$#"$$#"!!$&# "#"%#" #" !!#!!!"$%#$!"#!!! !!#!"#""!! #"# !##" " !!%! #!  !!!! "%#%#$%%)().3-1//~~wutrpkifbb``aVWTTNICB<<986441500/.--/&&)()&&)&(''&&*%(*''%%%%%%#%$$$#$#%$%#&!$"$"""$!!" !#!""#%" "# "" ! !"!$"$&!""$ "&##""!#!"!"!# !!#"!!  " !  "#!! ! !! " !"!"!#$ "#"&&#%(&*"!|ywppmkhgca^[[YXUNLCE>?>974035.,/+/**))',((((%(&#)))%(('%&$&%&$&&%%%##%$"'#&%"##$$##!"" $#!!!"# !!!!"#####$ "" """"!!!$##$#" !"#! !!#"# ! $!"" " "!!!  ! !""#!%" !#!&'%#&%%! ~||zwrqpmkgc^a\Z^WSKIFC<<=:6454344.2,.-*)()*()''*(*'&&(('#%#$'+(&%(&#$&%'%&"&%$"!""!$"""!""&$##$"%$#$""#""#!""#!# !!#"!##!"!! !!"  " !"#$"#" ! !! !#!!" ""!%!"!$!!$"#&%$""}vutnlmgdib][\URLMHCB:>9;743732/,.+*+**')+'*()&&%&&##%(&$%%%&&'&$'&% "'%"$"#"##$"#""#$%#%$'#""#"##"#%$##!$$#"#!$ "#"$$"""#!""! """&#!!"!"!!# !!$!  !!#"'$###!! ! $~|~vruphhkdcc_\SVSMJFGD@=:9653542-1-/-++***&'(&&%$$)%'&%)%')&*#%$%%$'%$!%$%#&"%&#$%&$%%###$#"&$$$$"$!""#%#!#!("#$! "#%#"&"! $#! !!" !"#%!  " !#! !"" !!!!!! !"" !~{wvvlljig_a]\VTVQJHBD>>==87533/3/.,,,-))+(&(&&%())(%'+&(%''&&'#$& #$##&#&&!$&%%&'###&%$##$&$"%#$"#"#"#!"## "# !$!"" "!!# !"#!! !!"#$!$&#"" ! !! !!! |{ttvnmgfa`a[WSQPPMGIB@>@99;44/3,,-**+(*)'))()))())+'&((%('$%%&&$#'%%&'$(&'&##$#"$&"#$####$$!%!""" !#$%"""##%"#& ! !!# !" %%!###$ !$&## !"!" "!  ! " !zvxuplkddff_]\YYSONOFE=<=864342//,-+*-,)*(((((+**++(('$&$&&)'%&&&'&*''%%%%%$$&$%&&"$##&'$#! $"$"$"###%#"!"##!"#### !#%$%"!&!!#%$#"!!&!  !! !}|vroomejc_e[][YWWTKFGA@?B:9433/0.01.---,*+-)&+*%&&'%*'+*&%'&('(&($'$''%#%&&&'%'&&%$"$##$#!!$#!""#$%!#"$%"%!""""!"$&%"%###!# " "" !  ! "~yusqljfdeca^_YZUQPLMDFAC;87873.3.02..+-*+*()*'&))&'&*+(,)((&$)''*(&'&%%'&&%$$$$""$$"$"%'$$$$"%!&&&$"%$$%$#"# !!$#%"""##$#%!!"# !!$!   !"! }xxvtsmkge`c`]`ZTRSPNND@>>88@2583532../*++')'(''&*))+(%&&')(%(($%)%&%#%&!$$""&##"!$$%$$##"%$"$'!$#$#"$"!$!"! !"" ####"## !""!$!"!$!" "!  }y|ystkjkgi_d]_ZXXQTLJMFD@A=@<97812-0.,.+**+)***('*''*(*&)')&($'$#"&*(%&$&)%$$$$#"%#"&#%#$$#$%&%!##%! "$!#%# "$##!!!!#!"!"# ! # "!!" ###~zvvuooljdaabXVXXVONLHJIC?:;95440022.,1/,+,+0++((*+*()%))+&&)'((%'$$''%'%&%%$$"(#%"%%$"%######$""#" !!""%%%$($$$"$#"!"" !#! "!! {zuwtrlmfgcab`^]ZWWTKEGGAA==>:6@5/312...-*)*(,*,')+(()'&*('%)&''&)(%''$%$#&(%#$%$%($%$$!"###""$!!$##!"###$%"# # !!"# #! !"!!  xwxvrqkmehcgfVbPXUUPPNLHD@@;;=6523634,..2,..+,*,/**.))%+'''&%(%$'%#($%%''%$(&(#$!$#$"!""" "%$$#"%"% &(&# !##""" !"! #!"! yuptmiidec`_^_]\]SRTNHHH=A>C;6866342/,/+.(,))**)*+)()('()')%('&$(%(%%%'')'##& #!$"$%$##$"#!&%"#%$$!""!" #!"!"$! zxxtpqlihkfdd`^Z]YVTSPNMHCCC=B?;;92626/1--,**-(+((&+))'((')'%(&(&''$$%"'''$%&%#$%#%%$%""#& $%$&$%$"" ! "!!"$! "" y{xwtqmkjhfcd_`d\[ZUURLNHGAD8>>::45641-/.-+**,.-+,,++&(&*%'&)&%(%%'(%%#%$##&&!&#$"%#%%&$$##$"$###! $"$"!# !""''$~~{~vyytormlgkcf_^acYYWNNOLGG?A<>>::6:552+-2-.//*/)*)'**)&,+'+*'(*()%%%$&$&#%"'$%!%%&#&""'$##!$ !!##"#!"$###&*}y|yttunojhi`c_]b][XWRMQKFF@?>:;;<601013.--,,,+******'))*))'&&'&''''#$$&$&&(&$$$%#%#$%#!%!"#"""#"! ~}wwtlojgi`fe\\_ZZZSOIIEDF>><=9:8663.///.--,+.,,*++(,)&*)*')&'%&&%%%$)'$$$!##$"##"###%!&$$$###~|wxvoopohghdeb]\ZVRSPGKJGB?:<:;896352.2-/,-),-+),**)))&(('$%&')&(&$$%&($#""&$&$#("$$$&##$"!}yuuqrnmllede``_][\VONHKEB=?<>><64425//2.-)+,*-**,-)'''(''&)%%('%$)$#$#$"*##$"$$"$"$"#~z{yuuopmehde``[[WRROQKJGE@@8<::986163/2/2.-/+.,,+')*-(*&)+&)$)#$(&$#$%#$#(#$'!$##|{ztstqkkkhfed\Y[XZVSLNCH?DAB>>@?6;66230-1*+//.(,,+*.*(()(%'''''*((%%(""$$$($~|zywvurpihebd\\^X\YTTRPLHEF=@:?:?>77405,2.+10,./,+)*-,,+''+(%!%$$&'')"%%~}{uuxpknfkfecd^[^UXZQNKHHGD<@<<98<27164.0./,,/+-*,)*((),")(&'$&%$&%~{ywvqtvrsnlhecibj_bZTVQONOMIF=?9=>77772720/,+,,,()**&)'''&$(&(%$y~}yxzutjrkmkhgcdcY[XQVSKME@CD?A=944:4133/0.+).*,(*+&'%')%&~}{sssqiiigicbb`YWXPQOLIHEH@>;?:97634212,-*-.+-*&,&'}{yyvwqslkiffde^][UYPMRIGFEF?9@<85663331.*..),*(yzywvsmqligd``_\]YVTRQOEKAHE@=9>87372001+*)y{{w~tsoiigkbhb]\]SUNRIKIGF=?=@:?88413~~|zywurkojgca\a[\PTSRMMHHH?~}qxuvksjhgc_]`]XXWPNNMz~{svvqjljfgdb]^X\MT|z{xvwrmrjkigcb\`~{yxvupnlkhc~y~wvtu}{}y}¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ÿ¾þ¿¿¿½ÿþ|~~~|x{~||~}||{~~~~}}}~|||}||yy{zy~~}~}}}|}|wz|yyzyyzxwz{y}{yvxxxzyvtswzywv|~|}y{|}~||}{|}z}||}{|||y{}|}{y|{zx||yxxx{wvxwxwvuuvxwsuvtqqtuwutvtwxxwuuwwwtuusstuwywutuvssutsuttpnopsqrsrqsuwtuutsrppnmlmkmprnnrrprrsytsqrttpotwvuuvsvwtssqqonnplmutxywwwxxw{|z{|wx{zywvwwuvyxvttuxxwvvx{{vuxwvttvtuuutttttsstqsrpnqpoommljhiklmjhmnnmkmknkhhhfimiegggggghiegkijiihnpmmpqprnrrrrqpopputv|vtussnjronpighigihhghjjjnkejjnjkjkijkjijkiljjlkkkmjiljfhjjikkkmokffiijmlkikkjkmmlmikjlmkkjnkiljdcdhgknnplmnkjhlkiikciiorojkjhfdedgfdbded_^efhgfiijieefighgfhijjiiehjlmpuqghljfhjifchkkmlllgrppnrtu~~}~~}~~~}~}~~}}}y{|}}z{{{||}~~}}}{yyxvvwwwwxzyxyy{{ywvxyxxwwvsvx{zwy{|}{|~}~~}~~}~}|}}{}~}}~{|}~|||||}|{z{}|||zx|}{{{z{yvvtuwvvvuyzxwwxxuvvuwwwvyyvvvtuuvtttstssvvuttwxwsqustuvtrrrtttstvvttuwutsqqspoonnnmmnkkkkprsswtsrtrorwwtuwvutwusssrqpqoprtuvwvvwwxyyzyywvwwxyywvxyzxzxyzwwyxxvuuxzvuwxuvvuvtrutssutssuusruttromjkmmkklmmkiijlmkljijjgeffkccgefiijhhghjhigjkmqnoprpopppppponprtqtutrttrrsvvrrolklgefffihhjnmkikljlljikmlkjlkmkjkjkjijkliijfihijiiijklkkjllmllkkljkjdgkjjkikllmmlmllklklmlllklmlijkkijikigjnkiggffdeiijijjighjheefdcebgifgedhflljkijhgimornkdehfhghiifikilmjlkoqrrwxv~~}}~~|z}}}zyz~}~~}}{ywzyxyyyyzyyz{zxvwxy{xvvtux{zxz{|}|}||~~}|~}}~|~~~~||~~~}|z|~|zz|~{zyxvvwxsswww|y{wwuuuvvvuuvtuvxxvtsrutussuvussusttstuuqqtsrtssusqstvwvvwvwvxxutrqrpponlklkkhhkjnsrqussuurruvvutuxuttsssrtrpqppqrttwvvwxzzxvvyusutyzxvxyxyyzyxy{{{yvvusuvvvuuwxuvvtstutqrqssvwsruwvpmmmkkmnklnmkiiikjkkkkjjihgeggijiimlkjjikhhjkkmnronovsoppnoopnpqstutututsuvuuspsrpmmhgjihhhjijkjhjiikkkihkigkjjkkjiihgikkkkfiggiijihgikkigilkjkiiijjkjdgjkkmllommomlmomlklkiiljklkijicfjhiihinnkkkigjilliijljfijhfghicaeikighjhglmjgiijhiijlllhiifkjijiilkjkonporqlnyzv~~~~~~~}~~||~}}}}|||}~~~~~{|}{{{zyyxxzyyyyywwwxxwwwxwvttwuwzz{{||||}}~||~~~~~}}~~~~|}}}~}}~{zzz{z{||{|zyxyzzvvvxwxyx{uuvstuuttvrouuwxvtstvtrrqssttsssrrtrprrrttsrsstrstrrttuvutrttssqrsrppnlmkkljjnoqqqrvusrststssstwwvsrtrsropopokmtvuxwvvxwzyxwvstxxuvssvutwxyxwwwttvvtrqvwutuvvuuwyxwuronorusstustvysppolkmllllkkklkkikkjjjlkihgfiikigkjgehjihgfkfgmlotsustrrpomnpstuvtvwtuutruuurstqpommkhklkljlmkjhlkjiijijmolopnmmjjkjihfhhifehhhhjjkjihdhjjjhikllklhgfifcfkmjkkpsommjikmkkgnomlnlkijnkikklmlklljjhhjjgiikihhhgfimmiegcfghhghjjhjnkkhkmmjkkmkkmmljgijkkkkmppnppqpqqprtwv~~~}~}~~~~}~}}}||||~~}{|{||zzyxxxxxxxwyyyyyyyxywuswxwxwxz{}~~|}}~}{~{}}~~~~}{{||~}}}~~}|||{{|}zzxvwxxwvvvxwwvxxuwvttttsrutrtuwvvrrtuuorrrttsttsrtwwussttstttttsstsrsuwxxuuuuvtqnoonmlmljkijnnptsrstutuuvvututvusuvwususoqrqrrquuutwuvuvxxxwvuvwvuvvuwupuwxwxwvxwwtuutwvuttvwtutwwutttttsssspqroopooqoklmkljjikkkjklllkkklkjifimkihhijkiijiiiijhhkkpptvttrsrrrssrrqvwuuvttutussqtuqpommljmnlknoonmmnnmhkjjefnnmmnrsnmnolkilkjlkkkjgkkjiigjlkllikjjminokjkljjlmmlmptnlmnllmnjionmolmmlnonlkgiihilkiihhhghffhghhihggmomiidghhijiiimjjjhdgkifhhkghmomlklllihjorsusrsuuttwyxx~~}~~}|~}~~|~}}}~}}}}}~~}{yyzzzyyyzyxxxyzyxxwyxvvusuxuvvtvwz~~zy}|{||}~~~~~}|~~~||{|}}{}|}}|{zzzzyzzxxyzwwwutuwyxzxwwvvustpptttssttsrstsqprsuvrqstttstutuvvvvttutsttuutrruuuwwustrqpooonllljkghkmnrrrrsuvvuuvusuvttsttsrrursqprsrstvwtutuvwwyyxxxwvwxzwvzxsuzxvvwuxyxvvvvvwxuuwwuuuwuvtutssrrsrpmqppomonmllkkjihjikljjkkkljjkijiihkjjihjknnnjhfklonmlmnoqqppqspqrpppqqqrsstuwtvuutrqonnppljilmllllnmlmnmmjjnokkmmmmmmollkkkmkmnoqqnmmkkkjiigijnllikllkjnpnmpnnoooopqpoonpqqppqpopprpopomnpljjifdcehhhighihgghjkkikkljjiiehfffegiggjlkjhd`ehfiikkghonllnonlmnnprqswrrrpouxz{y~~~~~~~~~~}~~}}~{|}~~}{y{{zzy{{zz{yyyyywvwuvvvvxwvvwxvw{z{||{|zz{{|z{~}{|~}}}|}}|}}}|}~}~~}}}}{{{zyx|zxwz{wxvuqrvyzxzz{yvuvutsvxstuuvtrrvsmmrttsuuwxvutttrptutqrttuutuuuutttsrvtsrspnnlllkklmlkjijkmorrrtwvwwvwxwtsqswyqprprrrolpqrsuxyvuuvxsvxwvwvvwzvuwvwutuxxxxwwyzyyxvy{xwxvwxwutqstusosusqpoonlllkklnmljkliiikkilkjjkkjjkkiijhiikjigkmmllmmjoqmlnnmnopsqpnmnlloontusqswvwtrstrrprusoprnklmjkjkmpqolnppoopromnnnnolkkkjjlljkmknromokljjlmlmmknnknjjhfjjljlnkoqrqqspmopnnrqmopprrqrpnpmkkiiiggghhjiimkihjkliihjkkikiiggghiihihfffikigijhfhiiiijghklllmnootsrqpststvxwuvxxyz~~}~~~~~~~~|}~|}~}}~~~|{{zzy{{}{{{{xxyywwwvvvwvyxvwxxvuyyzzy{{z{{{{||{|}}}}~~~~~~~~}~~}~}}}}{{zxxzxxyy|ywxvusvyzxy{|zvtusttutquvusrqsstsqssstvtuuttsssrssrrtvvuvvuwyvvuvutstsrssqmjilmmmkjljiiklnopprvxvtuuvxwtsrttqpqqrpqrrrrsutwxwvvxyzwwwwwwuwwwvuvxyxxuxyx{ytxx{}ywwyxwvxxwxvtqrrprsssqqyutsrpmlnmonkkljggkkkjljjkkiijkjiijjjkkjjjnqrporppqqllomnmoopqonmnommpruxsossswusutsrrssspllkllmijllmpqnnookkopokmnqpmqpmmllmopmnmknoommlmfkmllnnlmkknnlhfkmlknrqqrrrsrpmoqrswststtutssrqqpomkkkgghhgggjkgebgkljjkjikihikgegfgefgffhgeffgfgifijklmpkgllkimnonqrrrsrrruxvvwxxy{}~~~~~~~~}}}|{yz|{z{{{{zzzyxxxxwvwxyzyxyyxxxyz||{{{|}~}|{{{|}~}|}~~~}|||}~}{||}}zyzyvxwx{yxyywywwuxwwwxywttyyxxuwvrsvsrvtuwustttuuuuutuz|vturmnsttutsuwxxxwxxwwvvttuuqnjklmmjkmljjklonmnpqrqtwxxuvwvtsqqsqssporuvustuuwwuuvwyxyywyxx{}{zvvzz{}{{|{}|zyyzy|}ywxxzxxxuwuttvuuttssttsssuroqssnlmljjkkkkkjkikkiijljhhiiijlljmmmopmpsronmmnlnnonmlonmmmopqrqrwwtrtvuttuuuutrrtrnnjilkhmmjloqppmmlposroopqqoqsqponnpnmmlnoqoonoonoopqmmknmllklmknpppoqpnrrrvtssssvyzxxvsrrsrqpusqqllljgikgdggffdfedgfgggffhhiikhhiheeedghighjgjjjihikljhkmjedejjeknqqqsttrsltwvx|{z}}}}~~}||{{|{zzz{{zyyyyyxwxxwxzyxwxxxxxyz||}||}}}}}|||}}}}}}~~~~}~|}}}~~~~|z{{yyyxz{xy{{yvwwywxwwwvstxzzwtwuwwvttxvutvutuvuwvrsstwvtuwuusqsutqquxwwyyxwuwwwuuvurpnmmnnollkjihhmmmnqqsrtvvxwxwwuussssrrrqstusqtvx}{wwxzzxwxwyyz|{{yvy{{||{||zzzzxyxxyyxvxwxwxywwxvvutsssurqpqqrpklrqppmnijkllkllljkkmkkkjikkkjijkihmompqnnpqnppmopqppoqqnlmppqssrqqvwtuxvvttusttuvsrpqpljlkikmhkmnopoopsqqqrsutrqnrruonqqpqqqqrqrrppssrpppmnnmmkmlmomnpqoqrpooqqqoqrtvyzyyxvuvyrqrsurnpnlhgjkmhejmighjhdfdgdeikijjjhgghjjgfhkkjhkljkjjkihlmkjklkmjilkinpzvopostrnsuu{{yxzz~~}~~}||{|}|{zzzzzzyyyxxxyyz|zxxyy{{yz{}}}||}||}}}~~}~}}~~~~~~~~~}~~}|{z}|{yxvxyxxz{xvwvyxxxxwxvuwvttuurtvututtttuuttuvuurqty|z{xywvvrqstnqutvwvyyxvwwutsstpnmnmlkliijkjijlmmoqoqrsuvwwvwwtvvurrsqurruusqqty|{xzxyyxwxyxxz{yzxxz{{{yyzzzyzxyyyxxxvtwyyxxxzyxwvvuvvttssprtrmjkopoopnlmmlkkkkjklkkkjjjjnmijkkhijmroooomnooroooppqrqtrpprqqqrtssutttywtstutssrttrqqrppommjjlkjmppqqploqlmrtuurrpqqsqsqsrrqqoqttopsrsqqppqonomnnlqqpnnnkoqroorqoqsstvttvuvywwvwvtsrpprqoiijkjggghffgjmkihjijljjlimmiglmklkjlmnkjmkekkkllmonmlmlqmjllmmlqklnnoppmuvx|~|{|}}~~~}}}|{}|{|}zzzz{zyyyxwzz{|{{zy||z|||}}}|}~}||}~}~~~~~~~~}~~~~}}~~~|||{{z||xwxyyzzzxzyyz{zxzzzwwvwxwwvuuvssursttustvvvuuurt}}~|vuuuusrtsrsvuvxustuvvvwuvutqnnpnlkkkkjkjmmnnooursptvyuvvvuyxvvvuuuvtttssopvyxyxwuwxyz{|yx{{zz{|{{{|{z|{||{|{yyyyyvwxzzyzy{{yzyvvwyutsurssqqlloonomlmmkkkjfhkjkjghikjijjlllmmlmnrqkgiknmqsqooppqoostturrsplortvuuuuutsttttsrusqooqronlkiknnmnoqspplmrqrpqqqssttssvywssutqopuursqrrqppoooonmoomoprsrpoqssvwyvyvtvuwtrqrtxvvxxxywxvrtrmjjmpmllmljihjiilkijhijjiglkjkkliijjkkmkjnlghiihjijjkllotpjjkmmkfloonmotuyzzxy{~~|~}~~~~~~~}||{{}{z{}zzzzz{zzyxx{{z{||{{}{{{|{{}}}~~~}|}~}~~~~~~~~~}}}|{~~||~|z{{{zywy{{zzzwxxz{ywywwwwwxywwyvttsuututsuwwwwvvvtswvuutsssttruuqqtruussvxyyvwvvttrqqpnlklkhjjkllmnqotststwwtuuurxuvxxwvxzwutrtrruwzxwwxy{{}|{xy{{{{{|}{{{|{|{yyx|{xuwxxwxxxxyyyzzzxxvwxywvuxuurrrqnqnmmmnllkkjjijjjjiihgjihhhhiklklkmlnkjkkmlptqpqorsortstxroqqnooqqrstuvstttutrswsqqoqqonmkllonkmqqqopmooqrpoqqrsusssttttstsroqxtrsrrsuursrpppooqqrutwttsstvywwuwusstuvvtwwwwxxxwtuxurtpnlnnpqupmkljhjkikddhhghjkkliklklijikkklkinmkkgkjjkmjkpnquskilmonihoqwquxx{zyyx{}{y~~~~~~~~~~~~~|{zz~}z||{zzz{}zzzzz|}}{{{z{|yyz}z{}}~~}}}}}}~}}~|}}~|~|~~}{|~~}|{{{zzyywxwwxxyywvuxzzwtqtvttsuutuuuvvwwwvvvtsqrsstrrssrsrssrsttuuvv}{xvwwwvsqonmmkljikijjklmqpsttwvutttsttuwxusssrqqqrrpstwyywxzz{|zz{|{yy{{{{{{|{yz}}|{|z{{yyvwxvwxxyxwyxxwxxvvuwvurtrurmmllllmlkkjjlkjkjjijijjhfgjkjhhhgfhilnonlknoolnonnnqsronqrssrqqpqssronqsrqqtuwtttqrppqqoononmmmmnlilmptpqqprvqprrrtrrnqutuuvuvustuutussttrqqqpqqppouzz|xtuuuvwuvwwxwwwvwvwwuxxxwwzyxwwuwusrmlkjmnnmlmnnmjihjhhkijmoojjlkilkllllmnnmklmjkmnlosrutruuqmllnmljlorpsuwwyy{{{{|||~~~~}|{{|}~|zzyxzz{{{{{{}~}~{yy{}zy{|{|}}}~~}}}}~~~~~}~~~~~|}~~}}|}}{~|yw{zz{yxxxwxy{xuuqsvvutuvvvvvwvvvwusttsrssssurrssuqtvvttvxwww|~{ywvuvussqponnmkhiikllnnqsuwywvwxvvwvwuwwusqrrssrsrsuvyyy{{|||wx}~|{{||}|z{~|}|}}}z}{~~~{yz{yz|z}{zz{{ywvuvvttsrsptqnkhjkknlkkjjiiklkjikkkkikihhgffeeffgikkkllnmllmonnmlknomqsustusrsutstvvuxwvuwvuvxxvoprspqooolmnnomjnopurrqpqsrqoqsspqpqrrrqrsssqrsrsurqqtrpqpqsrpomsxuutssuuwwvvy}|yyuwxvwwvwwxzvvy{xuuwtrtmijlmklknmmmmlmlnhlmmkknmkljjikkmlmmqnmnponkikmpprotwsrolmomonnploqqwwwwxyz{{|}|}~~~}||}~}|||zzy{|}~}|{{|||}{zz{z{zz}|}}}}}}}||}~}}~~~~~||~~|}}~z{{zy|||{zxxyzywwwtstttsqssqsuwwvwwutsrssssussssqpqssssrsvuwyxyzz{zxywtutsstrrojlkkieklnooortuwvuvwwvvxwuuvussrsusttsruvxx{}|yz~|}~~{||{}~}}}|}~{yz{z{{zyzyy}{yuuvwxwtrtuspplhjkijjkjkjjijjjkjjjjkkkkhhgedeeceffhhikjlkikkimmonkhlrrvtxtuvtuvvywutvxzxvwwvuuvvwssqqoomnmmopmnklppqqstroqrqppoqspnptxwsqttqqpqstrqpopqoqrtpstrporvvxxyyuxwuwxy|zyywxxywxxxyyyxxxxywxyurrkkljijllmknmlnnnmjlnnknmjgklkjjjkjkillikoonmnlnstqtqtttsomnmoonqokqquuvwyz||{{{}z}~~~~~~}~~~~~~~~~}|{|}{z{}}~}~~~~~|}{zz{zyy}}}}}}||}|||}~||~}}}~~}xyzz{zz{}{y{zyyzyy{xssvwtsrrrrsxvvvuvutrpqrqostxxvuuttsrortuwz|yyz|z{{z{xvwutrqnmlkjkkkhlnpqpqstsssvvwusvvuuuvxvtvvurqstusrwz{~~~~}~}}}~~{}}}}}~}}||zyzy{{zz{{|zzyxxyywuusutsquvqjjhhgggijjkiijjljjijijkkllligfefedfedfghhjjjklkjllnnkikqtsvvvusrstvxvttttsututtvvstuturpmlnomnmlknonooqqqqrqoompnoopqoqruuoqrqpqsurprppmqsqqstusqorqqrrttwywwvwvvx|yvvyyvvvwwvvuvxwwvuwwywspkkmllklkffonlljkljijiiifghgjihjhhhihhkjjlmoopnloqqnlponnpniinmknqpqnruuwz{z{{{}}|~~~~~~}~~~~~~~~~~~~~~~~}}~~~~~}|z{}|{}~~||}zzyy|zz|z{||z{~}|{|}~{|}|||~~~}~}~}z{{y{zzz|zyyxwwwyyxyuuuurpoprtruuuttuusroqroorwywvsstuvspsusv{{yz{}|}{zzwvuutrpnllkjijkjjmopnpprtstwyxvtvwxutwvvvuwvsrrststxz{||{{z|{z}||}|}~}{}}~~|}~}}||}|{|{{{zzyyyyzxxx|zwttsqrtprupjihhgefhjlkjjiiklklkhjhijkjigedceccdcfffgghhjmjhkklljiiqrrsssrsssrtusttutrswvttwvtsrrqpollmmmlmlkoopopppqoonpnlorpopoqtqqpooroopqnpppomlrtpqrosropooqrrsrttsuvttwvtsvuuwtssuvwvxyyzxwvuttsstpmmilkijfdhkkkhhighhghhhhhkjifihgiljkmllknqprrrpqppnnnkloljklkjlmmopuxxxzyz{{|}}|~~~~~~~~~~~}~}}~}~~~}||}~~}zxyyxz||{{|||}~~}||}}}~}||}~~~}||}|{{{{zyxvwwtvvvutsssrtsurrturtusutuusw{|zvtsrqqtvutrstvwxxxy{|zyyzwwvutqponnjkiijkknooqstvxyxxxxxxwyxxz{wvuvuuuvwtqruwy|zxxz{|{|~~~}}}}~}|||{|~~|zz|}||}|||}||{zywxwxxxwxwsorqrtomdghghgefiimmiikkiijkkjihijiigfbccbcbcececdefegfehjhhnnjptvurrssrrqqqrsvusrvvxwtvtvvuuvrqopmilmlmomlmpoooopoopqqprqpppqprropoprrrppqoqopopppqspqopqqooqposttwyxvwz{wtvxwtqqtusuwzyyyxwxvvvwrqonllonghhfhkmikkfeghjigijhgggiijjjkkmmmnoptvsrrqurpnmoonpnllmnooopprwxxz|{{|||~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~}~~}}~~~}{zzzzyzzz{z{||}~~~}||}~~}||}~~}~~~|}{{zyyzyywvvuurruvuvttutsststuttwwtqstuu|zuusqqqqrstrrsuvvvyyz||{{|xwtqsqpmmlggghhhkmoprsuxyvvwwwwwxyxzyxwvsttsttsprux}{{}||}|||~|||}~~|zz{z||{z{{zyz{}{{|}|{{{xxwxyz{zywsutsqnlgigehfedfhikjlkjijjkkjijiiihgfbcbacbcedbbddeeffhihjjmnknrtsrttrrtssstuvtuswvuwuvuvwwvvsttpmimmllmlkllkoppmnpqoponnnonononopoprvurqqprpsppppppqrppppqpoptuuwzyvw{}}usvuuurrwwxuvyz|zxxxy{xytolkiijjgggiiijiikilghljjkjgjliiikilonmjhoqqorqoonooljimmklmiikjllonrssvvx{}{y{{|||}~~~z~~~}}~}}~~~~~~~}|||}~~~~~~~~~}zyyyyvwyuuvw{{{~|}~}}|||}|zz{|}~~~}}||zxy{{yyyxwwwvvvvvutuussttvvttuurrqstx~~|vtqqpprrpqtstuvvvxzy{||zyxxurssrqnnmlkhikihlprrtwwvvvwwxywyywvywvvupruvsssqqsux{}|}}{z{zz|{{}}~{zzz{{|{zyyzxvx{}yxyz{{z{z{zyyzyxxvtssqrplecfdccefgihjjikkkkjiiiljhjijifbda_cgecbbcabefehighkmmonprqrpnpsqsststtssvuwttuvxvtwvrpqxtnnnopmmmoppnmnpqpopqmmoomnmmmpomnnnnoronloqqnpppmnnlmpmnnmopqqtsttvwvvx|wtvuuuuttvvwvwvy|xvwxxyvwwqnkihkjihgeeeiihjihjijjiihlljihhmmmpoomoqqpproqokjmklllkmmllllkloporxxuvy{}zyzzyz{~~~~~~~|}~~~~~~~~~~~~~~~}}~~|~~~~{zuvvvwwwvswxz{|}{{|||{z{{}||{{}}~~}|}|}|zy{zzxwxxvuuutvssssrrqrssssstsuttwxutttsrqqqqqrqplossrsswwyzwwwvuurqssqpopnkkkihgloprsttvuuvwuvwvuvvvuvurrtstttsqptvz}|zzyxz{yz|}~~|z||{{{{{{y{zz|zvuxyzyyxyzxxzzzyyxwvxutvuqnmiebcdabefgjhijjjjklkjigjjjihhgcabaabcfifecadfhffeghjkhnkmsqqrpqssssssttvsqsttttsuvuvuqsvusponmnnlkmoolmmnpnoqljllmnononnnnnpnonlkkkmqrlnoopppqppponmoqqrsqrtsttusstrvuwvtuvvwwtxxxyyyyxwwvuvrkhjjjhggfcdcefeffehgiihkkmnmmmnlnlppsrpqqqpkjnmljjkjllllmlllkijpqsuwxxy{|{{z|}{{|~}|}~~~~~~~~~|~~~}~~~~~~}}~~~~~~~}~~~~|zwwttuvwxxzz|{{{{}}|{||{{|zz{z||}~~}}z{{{{{{zyzzwwxwtuuttuttutsrqrssrssuuvuxwuutrpporsqttrqpprqqrtxxxyxxxvvuusssrpoopmkhiiknqqsuuvurtwxuvvvvwxxvwvuvussttqoqxxy}|z{||}||||~||~|{y{{{z{{xyzz{{zyzz}{yyz{zxyyxyyxwwvtsrpqljidbac`ceefhhkjjhhkjiihijjjjjihedcabaabddbecbcfeedgillgllmrttqrsutuuusssrsrsvuutututvussusmllmmmlljlmklmnmnopomonlnnmmmnpnnnonlmnmommqspnnmoonqmmnnompqpqrrrssvrstttqssrtssuutuvwwx|zyyytuttsolkkkmijhgegfefhfcfkkhjmlkklllkkknnppoopstupnmonmmllkknkikjkmkmpqqtvsuwvwxzzy{{yz{z}~~~}}~||~~}~}~~~}}~~~~~~}~}~~~~~}~~~~~}yxyyywxxxy{}{{{}~}~}~}|{}|{z{||~~~~}|~}|zy{{zyyyyyzwyzvutttroqtvrrrrqqpsrprtwwuuxwtqqrqqqqrstuutssvvvwxxxwxutsstrqsqrspnkhhikqtsrvtuvtvxusrvwvvvwutuvvxutturswyzz{}{||{|}}y|||}~|yy{{{z{}{{||yxyyx{|}zz{{|{xyzyzyvuutqpkkgdebaccaaabejilihikkkjjjkijjkijhfeccbabcbaceedcfifgehlljjlkmopomppqprtuvuquvttsvxwuuvxxsqpqronmkllmmnlmmoonpooomnpmnpppqpqrqopoolonnmnlmqnoopponmpnmoomprqttuvtrsrvuutuvvuttwvwwvxzzywx|xwwvtsrojjhkjhhigfigjmifhjliihgggillmknqpsrpqsqomnkklklkllmqomnonnnppqpoqvwxxxyzz}~||}||}}~}~~}~}~~~}~~~}~}}~~~~~~~~~~~~}yyyyxyyyxz{{{||{}}}}||~}{yvx{|}~~~}}}}{|}||{yxzzyxywvuttsrrtuusqsvurqrsrsuwutvz}{wsqqpqsstttuxvtvwuwzyzyxwttttrrutsrrrqqlloqqssutsttuvutuwwvvxxwvuvuuttuutuwxz{|}|zz||~}yxz{|}}z~||}}{|{{{|ywyyxyxxyxxzzyyxy~|vtustqrljigeebababdbiigihhhhiggihhhjiiiijhgcefcacbbddiebgjgebhgjhijjkoppqppsrttttuvstttuzxsprtuuttstrnnnnmllnoonooqtsqopoqsnpqppppqpoqqnomptponlknlppnpnonpnommnqtststwurrsvvxvvwwwvtwwvvvwvvvxxwxutuvtsommmmnjhjjihggighjkihijiijikmnpmprrppqpljhhhilkkmonnonmmnnonnmnqnsy{|yyz{|}~|}~}|~~~~~~}}}~~~}{~}~~~}~~|}~~~}|{||zz{z{{{|}||{{~}}{xyz|}~}~}}|~}|}|z||}{{}|yyz{zxywvvuuvvttvuqnrxvstutuvvussvxwutqoqqstrssttwwsssvxwxwyzytvtuttvvsrrtsqoqrrqssttuuwwvuvwwvutvwxxstuttssstxtswz|~}|}}}{z|}~}}|}}}||||zz{zzy{{zzwvxxwxxvvwy{wsssqqppmljhgeccebaacihghhikjgijljiiiihhgihfdecc``bbfdgffjjiiiijhhjmmntsspostsurttsvvuuuvxvttsvutssrrpomjknmnnmpnoosrqqonqqokqsoorqpmlpononqrqpnnmmoqopppppnoonnppqrsrsttvwvvvwvwxyyxwxwxxxvtuwxxwwwwxxtqqqlkmkkjklkkjigeljijhhkljikmpqutnpqnkonljjhegkmmnrrppomooqomnpqrtyxz~{{|}|{}||}~~~||~~|}}|~~~}}}~~~~~~~}}}~~~~~~}}~~~}~~}|zy{zzz{yyz|{z}}}~}}{z{{|~~~|||}{|}{{}{yyz{xvtwwvvttusuutqrsrtttttuvwvttssrqrrrrqssqsusrtvxusrvyywxxxxyxvvuvvtusrrqopqpoqrtttuvwwywvyyxwwvuvvtuvtttrstttuw{}{xx{|~~zz|}||{{|}z{|||{{{zwyyyyxxxyzxy}{yyywvtrutqqplljihfedffeddhjhhhiiiiijlklkkjiihjhddecbbabdfdcffhmljkjlliikjotrspqttrssqrsttuttuuuuuuuvw{yvutrronmklmkkmnpnnfhlmnnmmmlkloomiloqomnprqmmponrrpnmmpomklikpsrqqttuv{ywvvvvvvwzzxwvxzzuvyxzzxxwxyxtqolmllmjiknplgjeellkkjkmmjikmnopmlmnjknmmllmnnmmonmlloolkoopmnoopsxx{|{||{|{|}|~~}~~~}~~~~}~~~~~}}~~~}~~~~}~~~}}~}}~~~|{}~~~~}~~}~~}~~}~~}}}~~~~~zxyxyzxwxxy{|||}}~}~}~}||yy|}~~~}}}}zz{z{{yyxz{xttvvwwuuttusrqsstwvttsstvutsssporsqnorqrsrrttutsuvxywwwxwxwutuutttsqqttspqpopqrqrvwwwyxyxywwwuuwwtuututttsqqvxz~|yx{~|{}~|||~~~}~||{{zwwyyyyxxzyywyzxwxuwutuspqomkhhgeeddeffdgggghiihhhijjiijijkkjgccebbcdbdea`ffinihllklkhmoprsrsqqsoorqsstuuuutuwwvvvvwyvrqqonmmmmmkkilmnlmjkmlmmnnnkinpnllmnppknpopoopkmopppoqqoonnlomoqppusqswxvuutwwvx}{xyw{|xvyyxzzyxvwwxtqnknhhjjgllnkgidafkkjkmnnlllpollmkmmlmmrnklnrplinnmmnmommmjmmoonquwyz{{|{{{|}}}}~~}~~}~~}~~~~~}}~}}~~~}}}}~}~}|}}~|}}}~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}{yvsvyz{{z|~|||~~}{|~}|||{{||}~~~~~}}}|{wxvxz{yyyyyyxuvvwvvvuuuussssrrssrrqstusrqqqstutqqsrsssttttvxwwxwwvwwwvxwuutstvsstuuttssrssssuuvwwxwwwxwwwwvututsssttsqssx{{z~~}|||}}|z|{}~|{~}~{{{{}|{zyxyz{wyzywuuxwwwwvvuvwrnmlhgijhefggggkkkiiijkijjjkjjklkiikmg`adeccdccccddgilmihhjkkklnroprrqptstssvvuuuvustuwxwtuvssrknnkllnkmmklklmlonnqpqqonlklpqoqqpoqomnonoonolknopplmqqqqmmonoqqttrtuuuutwwwxyz{z{{z{zz|{wwyxwvvwutqnnllljkkkjlkmlkijmmkijfjmnolppkkmmkmmklopnnnmjgmlmnnnpoknonlkknqptwzzzz{{{z{{z{||}|~~~~~~~~}|~~~|}~~}|~}}~~~}{}}}|{}}{~~~~~~~~~~}~~~~~~~~~}~~~~~}{zxwwxyyzzz{~}~}~~~}}~~~~~}{~~~~|}}|{xwxz|}zxzxxxwwvuuvutrttsttttsqrrqrssvvsqrsrrrqrqqrtwsrsstttuwuuwywxwxwwwvtsttusqsurqtuuttvutuvwwwyywwwvxwvuttutsruvuuqruxzzy|~}{{|||{{{|}||||||{||}|z{zzyzz~{}{yxvxxvvyyxvvtspmklkijkigdcffegjlhgghihhkilkjkkhihhigbdfdddegeeefiiilljjkkjijlquqprrporprrruvuvuvvvvtuuwurtrssooookklilkjjmnkmponooqrqnnooqqpomoomnnopppooponppnpnlonoollrpoqqtvutvzyvuxxwuxxxyzyyyyxy{wxzxxxvxvvtqppmjmollllilklnnooonopnkmnllljkmmkmpmmlklmlnkjmmonmonmlnolihnptuuvwxz||yyxz{{{{{}~~}~~~~}}~}}|{|~~~}}~~}}}}}}~}~}}|}~~~}}}}~~}~~~~~}~~~~~~|}|{yyxwy{ywz{|{||}}}}}}|~}}}~~}|~~{|}|ywyyzzzxxuvvtuuuvvtrtttttsqqrqrqqqsvutrsrppsrrqorwwqqqrttttvuvxxwwxyyvwwutuvuuuvvttuvvtootvvwxxwzywwwvvvwvvutvvsuuttssuwxx|~||{|~~~}}||||}|{{{zzz|{yyz}|{{|zy{zyxxyxustvuvsqmmljiijihgeffegfjkfhiiijhjjkkkkjiijjhhhfffhfehhgijihgkliikkkklosrtrqrrpsprtqvwtuuuvvwvtsvvttttsqolillkikkklnnmnppqoopproonoqpniknoppqrpqqqqqportqqsonljjkmporxuuuvsyzzvuvxvuyyz{yy{xyz||yxyxxzyyvurqpkljnroljjkjioqoppoorrqnmnmlklllmjjnnlmlmonmfjrqqlmnomlmklqmopsvxzyyz|||}{z{{{|{|}}}~~}~~~~~~~}~~~|||}~~~~~~~|}~~~~}~~~~~~}~~}~}{{yxwxyxwzzz|{|{{~~~}~~~}|y{}~~~||}}||{|yvwxyxxyzyxxxyxwxy{wttussssqssrrqtttvuvtrrporrsrrswvssomppqsqtvwwvvwwvvxuttutttuututuuttuuvuuvvvwyyvwvuuuuuurqsssssssttuwyy|}{zzz{|}~{||z{{zyyx{{zz{{yyxxyyyxxxxyyxwxxxxwvvuuqlnmecfefgeegfefefifhijkjihjkjjkkiikkjhffechjkgfhhgjjklkgiikliimnptrosrstqsvvtsuutuurtwvwxutsspqrpijnlmkgjkmmlmnopqrrpooollnqpoomnmqqpopqsrppomorqqqpolnorporqqrrttuvvxz{xvwvvyyyxy{yzzz{zwxyyyxxvtronjkiilkkkkljlornnrsqqpmlllmljhhkkkejlnmomlkigkpmllmlmlllnmqurswxwyz{{~}{z{y{||}}}~|}~}}|~~~}}~}}~~~}~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~||zxwwwvvwxyy||{{|}~|}~~~~}y|~~~~~~~}~~~~~||||}||zzzzzyxyzxxxvvwuuuuuvuttstsqrqrsrspqsrssrrqorrsssrttsromprrsrwuwwvvwwwwwwxwwvutttsutrsuxyyvuvwwwwwwvuvvvvuvutusqrrsrsstruxxyzxywxzzz{||{z{zxyzz{zzzxxyywvxx{zyyxxwxwxyzwuvxyvsnolggihggddfeeggfhhgknljjkkkjjkjjjhhgfffffgikgghhgilmkijjjijllmnqsssqprtrtututtvvvwvuuuwxttutppppollkmjeikjhnqopqsrqrsonnpponopnpooommqnnpmppopsqoooonnnponooopqsttvvx}{yxwxxxwwxwyzz{yzyz{{{yyywwsnlhmkhjkkllimnoqnqttrpollmmllljklklhkllmoklmlnjknomlkmljmonrwxy|zy{zzz{{|z{|{}}||}~~~~~~~~~}~}}~|zz||~~}}~~~}~~~~}~}~~|~~~~~~~~~}~~~}~~~~~|||}~|}|{|~~~|~{wwvvwwwvxyzz|{{{{||}}}~~||~~||~~~~~~~~~~~~}~}{{{z|}yyyyyyxvwwuuuuvtttuttssurqqrrrrutrssoqsrrqstttuvuwwuuuxwvxwwttwwvwuuvuvvuvwwuuttturqutuwuuvwwuvxwywwwwwvuuutttttssttuuuwxxxyzxzzzzyzzyzxzzz}}zyzzxyyzyvuvvwwxyxyxxwutuutrrqpmkkjjffeffedehedilkjikkiijjjhhijjjhhggghgghggijihgjijhijlliknnnqtrrpoppqprrtwutvvvvuuwuvtsqqqnsqqomllmnmmklmqsmmompqrrpoollnmmlmnnnppponmnqpqopqsvpmmklmknnnoqoqrstvxxxxyyxxwwwvwwxxyxyzxyyyyyzxtsrqpnmlkjjlmlmnomsrpqqqrolhijhhhfgkjlilmnpomlkmmooomnkllmnrrpruwyzxy{{zxzywz{{||||z{}~~~~}}~|}}{z|}}~||~|~~}}}~}|}}|}}~~~~~~~~~|}}~~}~~~}~~~~{~~~}~}{~~~}}~~|}~~}|zxwwwwwwxyy{{}{||{}}~~|}~~|~~~|}~~~~~~~}~}~~~~}}||zzy{{yyyxyyxvwwwvuvuuvtvtuuttsssstssutsttqrssssstvuuttvwwvvwwwyyyxxy{xwuwwwvwuuuvuuvusvutuuvvvwwxxvwywywvxxwwuuvvuttussttsuttwwwxyyxy{zwyzz{z{xxzyyyyzxwyxwwttvvwvvvxwxxvwvstssqoljkigfdceefghgggjmnkjjkjjjjjhhijjjghhjiggghefhkkhgiijjkllklnmmlqrrsrqrstrtuvwwxvvxwvuvutssrsrpprqnmkjmmnnjkllnnoonppnomopnllmnnnnmpnnppoomoorrpqstqpjkmmjnpnqrprsttvvxxxvwyxzwvuxxxyyyyyxz{yxyyvutqprnnmjlkmnpppqprspnmprpmhijjlklmlkmnmmknnnmlmlllkllilfmrssuuwxwz{{||yvwxwz{{}}~|z{{~}}}}}}~~~|~~~}~~}~~~~~~}~~}}~|{||}}}~}}}}}}~~}}~~~~~~~}~~~~~~~}~~~~~~~}~~}~~~~}~~}~~~~}}}||~}~}~~~}}}~|wxyxxwwvvwyy{|}||}|}~~}zz{{}~~~}~~|~~~}~~~~}~~|}~|zzz{zy{|xxxyxyxwwuvvuuuuuvuuutttuwvuvuutttsrsutsrrstttuvxwuwwwyxxz{|}|ywxxwtvvvvvvtssrrrqrsvvwwvuuwxzvvuuwxwwwuvwvtssstutstssuvvwxyyzyxxyyzzz{xzzzyxwxwuxyzxyxxwwvwwxtwxxywvxuvrlklmkjigfhhhjgfgimqkffiijjiijkjjjjkhjjkighggiiikljiikkkjllmlklljnoqssrsrporssuuwwxwwwwwxwvuvwtsrrqqmmlmnlkjhijkoomnnmlnnmnomljnnpnnomklnnnnoopmmponmokggghpqorsqqssstuvvvuvyzyuttuwvxwxxxwxywvvuttsqpsnkmjlnnmpqooqspomlmmlnlllnonomlmmpomjlmonlmljkmlmjkmosrtvwwwx{|||zz{{zz||{||}}{{}~~~~}~~}}}~~}~~~~~}}~~~~~~}}}|{{}}~~|}}}~~}~~~~~~~~~~~~~{|~~{}~~}}~~~~}}~~~~~}|}}||{yyyxwxuvsrwwz{|||}}}}~zz{|}~~~~~|~|{}~}}}~~|{xyyyxwy~|yywvxvutrrrsttrtssvvvtttuwvuuttssutssttssutuuvwvvvuvxwvy{{{|}|zzyywwvvwvttrptrssnnqrrqtuuw{zwvwwwwvuuvutuussttuttuuwzyxxxxyz{zzzzzz{{yzzzzyxxxyzzxx{zyzwtwy{xxzzxuvwvvsoklmljmjigfghihdgjoiceiikigfgijijijjjjjiiiiiighiigijjjjjknolmkkllorrqqrrrrtsrtssttvvwzxwwvssrstrrsoqmljjkihjjmnmmlnnoommpqolmmkkmklkillmnmopqpoooopnnnollmomnstssttuwyxvw{|yxywwvvxyywxxvwwxwyywutsqppklkmmloprtspopomlklkkmnmonkmmkllllklnmnnmmmmppoonnnnqtvxwvwwxyzzzz|zz{{{|{{|~||}}}}~}}}}}||~}}}}}|~|}~~~~}}||}~~|}}}}}|~~}~~~~~~~~~~~}~~~~~~~~~~}~~}|{|{ywuwvywyzz|~}}}~~~|||~}|~}~{|~}}~~}}~}{{zxsyzzyzxyyvtvvttuvuutttsuutvxxyususutsutsssrsstvvvvvtuwwxwwux{yy{{zzy{zwuvwvuutttssttpnrstsuuwzzxwxxwxwwvuwvuuuwurqssrrry|zxzzz|{{{{{|||}}{{{{{zyy{|{{z{}}zzxxyyxywvwwuwvtrmhhkmkjkgggeffgceggijiihghfggefggkiijiihfhhjkihiiihgikllkkmnlklnlmsurpqrsrptusvuutvwwvywwwtrsrtsqrqomkllkkhhkknommnppommmooljlnmlllmljjloqpqrpoppoorrpptpntusqqtrtttvvwxyy{{|zwwxxwyyywwvwxyywz{wustsqrlnooqnooornnnkjkjhhjlqrmklkliikmnhiknkkkjlghmmkkmmmkpstxxyzyyy{zzz{zz{zz|{}}~}}~|{z}}}}}~}}}~~~|z|}|z|~~{|~}|||||{{}}||}}~~}~~~~~~}~~~~}~}{|||}zzzxyyz{z||}~~~~~~~~}~~~}~}~~z|}~}}}}|zzzyyzzxxyywwvwwutuwvtrtsttuvuutssrrrrsrqtsprssttuvwwwuuxwxwxzyyyy{zxwxvuttuvuvtrsttprtvvvuwwxyzywyxvxxwvwwwwtuuusstsrswxz{zz{{}}}||{|{|}}{|}|{{|||{}|||||{yvwxzyxwwwwvvvrroljklljghfffgfebadgjmigghggeehffgihijiifhiiikkiihhjnmkoonnqmmoolmostrqqrqoosuvvuwwxxxw{zwwwvtssqrpssqmmmkjjlllmnnqompommnqppnonlnonmmjlonnmopoomnoqqpmmoprpoqtuspsuvxwwyxx{|zzwuvxxyyzwwxxxxyyzxxwtssppoppmpplpnlkkmmjkkkjmlklllmmljilmmllmlkjjkljkihkkoonlptuzz|{||}|}||~|~|~~}}}}}}}}}~~~}}~~~~~}||~~z}~~~~}}}}|{{{z{{{|}}}}}~~~~~}~~}}}~|z{|}{|{{}|||}}~}}~~~~~~~~~~~~~~|}|~}}||}|{{zz}{yxzzwvwwvuuwvttsqstsuxussqrorrrsrrrqrtutssuwutxuuwwzwvxxwxxyyxxzyvvusuuttsstsquwvvuuwwvvvwuwwxwwwwwwvvuuuvvvutvvvv{|{{}|{|||zx||}}}{}}}|{||}~|}|{|~{yzyywxwvvvwyxrqpihkkihfggehhgedfdghhhfhhihhhhgfjjhjjjijfhhiiiiijkknjhjkllmmnpppnoqprtpqompsvzwvxvwwuuwwwxvusrsrrqqrohiljjllmopprvtqononponppommmomnmjknmnmmoppooprqoommnooopqqrstuuwwxwxyyyxxxwwyyxxyvwxxyzyxyyvwuppoooqpnponomlhgjlpnkmmmllopmmkmllmlmlklmjhjhihjiiihnqqpuuxzzzzy|{zz{y|}{}}}~~~}}}}|||}|}~}|}|{|||~}}~{|~}~}}}}||||}|{||}}}|{|~~}~~~}~|}}||}}{|}}}}||}}}|}~}}~~||~~}~~}}}{||{yy}{zxwwxxwwzxvvx|xvvvuuvvvxutttspsssrrssqruwursuvuuwwvwxzxxxxwvxyzxxz{vvvvtursuttuuwxxyvwwwxxwyvvxywxxxxxxwwttvvwutuwww{~}|~|z|~~}{||||||}|{{}~zz|{|}}}||{{zxzxwvuvuqomhikkiheghhhggiiigjliiighijjjjihjjhgijghefiiighklllkjjjjijlmmmmoooqqrqqpppqruttvvuvwxwwwxzxvtuttrqppnkjkklkkmooqssromoonmmnpnnnmnnmnnlpompqqqporrqppooopopnnmprsutuwywxxxyxyxwxzzyyyxwvwxxz||yvtsqppooonpomooomlnmiimnljhlnkklnmliljkllnmkjlkhjinljhklmostvxwwz{{{|||zz|z{{{|~}||}~}}}}{z{~}}{{}}}{z}~}~~}}~}|}}|yz||||z{|z{{|}}}}}~~~}~~~}|~~~}~~~~~~~~~~}~~~~}}|{|}}}}}}}~}~~~|}}}zz}~~~~}~~|||{z{{yzyywwwxzxvtvvvuvwuuuwututtusrprsrqrstrrrtuvtttuuxzvwzwuxvutrwxyyzzzyuwvvywvvuvvvvwwxvvwvwvwwxxwxxyyxxywwwvuwuvwvvyyx{{{|{}~~||~~~||||}~|{|~}yyx{{||{z{|{yyyxvtrtsmmkihkmjgggfggfgghjhhijhihiijgijihijiihjhijiihgjjjjigeihjhijlmnnmqrqrrqrrqpnsstsrtvxwxxyxxxwxxuuusqqonnllkkjihimquuqmmklmkilmnlkkijlopmklnqqpooonsspooppnnnpoopprsssvutswyyyzyxxwwwwwwwyyxyxyzxwvuoiklmmjmkomlnnoornkmnlikkmrmjjlkknnkkkmmmnmlmlkklmjhhlpnnquwxx|~|{}|}}|{{z{}z{|{}}}}~}~~}~~~|}~}}}}}{}~~~~}}|}~~|||{{{{|z|~}|||||}}~}|~~~~~~~|{~~~~~~~}~~~~~}||~}}~~~~~~|~~~~}}~}~~~~~||||zz{{|{||yxxzzxwwvvuvvuvvwvvvuuutrrtsrsssspqrstvuuvvvwutvvuuwwwvvyxyyzzzyvwwvvuwutuwwutuvtuuvwvwwyyxwxwvwxwuwxvwvwwvutvyy||||~}|}~}|}~}{{|}||||~}}~||{|}{z{{{ywxyvsprqnllkijiiggggfgghjjkiikiiiijjkiijjikmjhikiiiihgeikkjkkihijjjjilmnpsqssrpqqqnmqrtsrvyywyxyxxxwwwttusrspnklklllkkklmopllmmklmknnnmmklmnnpqnnopponpqrpqqqoponnnooonptvstwwvuwwwx{yxxwwwwyxwyxxxwwwwvwuojnmnomkmponmjlnomnklmlnmnollmmnooljhfjklloljmmlkllllpqqqrtxzy}}}{~||~|{|z||yx{}}}~~{|~~}}}}}|{}|}~z{}}~~|{{|{|}~||}~}~}}||~}|}||||}~~~~~~~~~~}~}~~}||~~~~~~~~~||~}}}|}}~~zywyz|ywvuvwvuywwvvxwruttqrsrsrtvsptwxwxwutwxxxwuwxwwxxvy|zywwyxxwvuuuutuvwwvuvuvttwyxxxzxxxwwwwvxyxwuwvwuuuvvwx{{{|~~~~}~}}}}}{{z{||{|}||{|~}~}{|{zywxwwtrqqpmmmljjijiihijjihikjkjjkjiijjjjknkhiikkkihhgihfgjjjmnmklkjlkiklnprootvrppqponptstvvxuvtsttuwyxvvvvrpqplimpollmklklnnnmmonmlmqnnlospoppqpnoopnnnopmnnppsqppppoqoorsstuvuuwxxzzyyzyxzyyzvwxxxyxyyxwvsppmklnnmoonmmmlnnnmllklonopmnnnonmlkmjlmjnnmnpooorplnpqlmsvxz{z{|{|~||}|{{|{{{|{|}}~}}~}}}|}||~~}~}}}}|}}~|}}|}~}}~~~}}~~|{{||{{|}~~~~~~~~~~~~~}~~~}~~~}~~}}~~}}~}}||}}||{zzyxxyxwuvwxvvwvwvwx{uvuvtsurttuvttuwxuutuvuutuwwwwvwwyxy|zxxwxxwwwusttwvttuwwvuuvvuxxxxxzyxxzzxyy{yyyxwvuvvvvvy|}~}|~~}}}~~~~~|}}|}~|~|{}}~}}}}|{{zzxwxvqrqmmnlljiiijihjljhfikijikjjhihijjknjchjkjjiiiihhfehjjklmkmklmmklnnmnmmrsqpopopnosutvvxwuuwvvxyxvxwuurqqomlnnmkkkjjjjlloonmmmkjnonnopqooqspqonpooopnlnnnoppoppnqrpssssuuuutwyxzxwz{{zzwyyvuxzxyxvxwwuplljkknmlomnmmmopoplmmkinommklmlkmjklmkknmmmklnmmmnnnooomqvvyzyz{{||~||{{z}{{{{|{|~}}}~~~}|}}}}}{|~~}}}~}~}~}}~~~}}}~}}~~|||||{{}}~~~~~~~~~}~}~}~~~~~~|~}~}~~~}~}~~}~~}|{||{{{|zx{||zzwvwwtuvvuvvvvtuwwvuttsstuvwvxxtttuustssuutuwwwyywwvwxwywsuuvvrvwssstusstuuyxwvuvvuvvwwxwxyyzxxxwvxzwwvwwwusux{|~|}~~}|{|}~~~~~}|{|{|~}z{{}}{{{||{{zyzwvuroookllkjjiiiigghhedeijigiljiijjjjkjjigjjigfijgghgdhjijlmnlonmmjlnmmkikmqroopqopnmsttvvyxuwy{zxxvuvwuvtrqoomnqnklllijjkhjmnmnllmnnhhlmonmoopqlmommomlmnlnproopppppqrsstststvvwyyxvy{zzywxywtxyxyzxzzvuqlnnonmllmnpokmqonnkkkkjnlikkllmmnjkllklmmmmljloliiinnnqqtzxz{{{||}}z||z{{|zz||{}~}~~~{{}}~}|}|}}||||~~~}|{|||{{{~||~}|{xz|}|||}}~}||}}~~}~~~~~~~~~~~~~}~~~~~~~~~~~}}~}|}}||{{{{{{zy{zyxwwvuvutuuwyvtuvwvututvwuvwxwxyxwvtvxxwvwyzzyzzzyxvxxvwwuwvuvutrqrrspqruwww{{yyxxxxwxxxy{|zxyyxxxwwwvvwwwvsxz|||||}~}}|}~~~~}|{}||~{z{|}}||{{zyzyxwvutqnljjihiihijiifhihijjiklklkjklkkkkihijigggighghghghjiijlklmnkjihhkkjklmpqpqsssrqpstw~zyyxxywvywvututrstsqomnopllmmkjgklllkmpqtsnkkkmmlmlnnpqnnnoprqqpporrtrpnqrqrrstsuuusutvy}}zzwy{{xwwuy{{z||xzzwrqppqtpmnmkmmjjmopooomonommnnonmmmkklmlkmmmlmlklomnpqqquwx{{|{}}}}}}}}}~~}|{~~||}{||}}~|{{}}}{{{}}|||z|~}~|{{|{||{{}}~|{{||}}}{|}}|~~~~~~~~~~|~~}}~~}|~~~~~~~}~}~~~}}}|}}|~|{|}||{{{|{zyxwvxwvuvwwxuvuuwwvuuttuvvvwvy{|ytqvyxxwwwyxvx{{xxwxxyywwvuvwvuttrrrqqnoswxyzyzyyyyxzyyxx{zyxyywyxwxxwwwwvuy{}|||{}~}|}}~~|~}|}||{|}{{|||{}|{zzzzyxwwwtqlkighhiihhhjjgfeehihfghijhiijhhikihjijihjjihhhfhgijhikmlkklkjjihjkkljnrsqqrqoqqpuwwzvxxxyywuvwwwtvtssssoilmmmmlllkihklkkklmmnmlllknnnmllknmnnmoooqpnnnqrturqrrqsrswssustvuvwzyxyvwzzxwxxxxyxyzzyxy{vqronnnmklmllmpmllklnlijmnmonnnlmmjhggjnjjklkklkklmoqpppsvwxxxy|{||||}|||||{z||{yz{{||}|z~~|{|}|{|{}}||~~{~}~}|}~}|}|}|}~}{|}~}}||~~~~~~~~~~~|}~~|~~~~~}~~}~~~~~}|}~}~}~~~}}~~}}}}}}{~~~}}}||{z||{|{z{{{{xuvvxwvutvvuvuuutuusstttuuutuustspqsuvwwwvxvxwxwvwvuuwwuvzzwwvvvutrsrqkiouvxxwxyzzyz{{zwyyyyxxyxxwwxywwvstvvx{|z{}~||||}}||}|}~~}|||}{|||zzzyyyywtvuttpnkihihhhfgegjifcbaghjhghnlhhffggihihhgijkjijjiihihhkjilmjffkigiihijklkmorssssquusvvwxwywwxxwvwyxwwyyxsqqnkkmnkhjjjjihihijjllklmmnmkllmlgjlmlmlkmmmonnnnpsvuttrrqrrqqppqqsxxvxxwxyxvxyzzyxyzzxxxwz{{wuspmnnklmjkjjklklljmklmnmkmkjmnkijlkfdgkomnpmmnmmkmknnnsuvxyy{{|{||{z||{|~~{{z{{{|{{z|}|{{}~}~zz{{{z{{|{|}~~}~~}}}}}{yz|~~}|{|}}}~{}~~~~~~}~~~~~~}}~~~~~~}|~~~~~}~~~~~~~~~~~|~}~}}}}}}|z{{{{{z{|{zxwtvvuuuuuwuuuuututsttsrttssstssrrrtvvuvwwvvxwwwwwutuvwxx{{wvvwwvvuuutqpsuvwxvvyyz{{{||{yyzxyyzxyxxvwwvvssvuv|}z{}~}{|{}}}|}}}|||{{}~|||||{zzz{ywvvvvumlkhhigfggghgihgggffhjghikjhiigghghihgfhhhgijjihhjjhhiiijifhjihhgghjlnmlotvtrsttsttuvwyzvwxwvtvwvvvwwytrspnlmlkjlkiiklklmllmmllnomnonlkmhmopnpooooomnorpqqswvusqpprqqrsutrwxwxyxxzzxxyzzzyy|zxxwvyzzwuroopnnnnmjjlllmlhjmlmmlkkpqmkiiklllmkmoonnonnlijlmmporvvwwxy{{{{|||}}||}||}{yz{|||{|}~|~{|~{|{|{|||||||}}~}|z{}|}{|}|}~}~~|}||}~}}}}~~~~~~~~~~~~~~~~}~~}~~}~}~~}~~}}~~~~~}}~}||||~{z{||}|{|}{ywuvvvttutvvuvuvvuuvuuuttrsursutvutvwwvttxyyyxyzzywuvvxxzyxxwvxxvvwvvvtuwwxyzywy{zzyzy{zyxxwyzzyyxwwwwuutuwux{|zz|}||}}~~~~~}}}|zzz{}{{{{}||{{||xzxvvtpnlhijhggghigkfhhhgiikhijlmjjjhhiiijihghhhgihhikjjllkijjjkjhjijjjkkhmnonqrtusssrststuvxxy{{xuvwvuvvutsrqsrpnllmlmmnmlkmonmoolmmlmlonpmnnmmnpqroppppnnnqpnmrqvvvsrqrpqqrtssvwwuwxwxz~yyzyzxvxyyyxvxyxusqonpmlmlmkmmlmpmkmmmlolllmpmlklmonmlnoroollmmmkimmnppsxyxyy{}|{{}}|}}~~}|}{{}|}~}~~z{{{{{}}}|}||{}|{}~}~}||}||{||{|~}|}~}{}~}{z|}~~~}||~~~~~~~~~~}}~~~~~~~~~~~~~}}~}~}~}}~~}}}}}|}~~~~}}}|~}}}}{xz}}~}|}}~{zwvxxwwvuvvuuvvuwxwwwvvussutqrutsuwvtvuvvwwvwzxyxxyxwxxyyxxxwwxyxyywwxywwx{zyyzyyxzz{yyzzzyyyzzzyyyywxwwuvwwzyzxyz||||}}|}}|||}|zz{{{zvy{}}{y|||xvvvtromjihhgdghhggghihhjiihhkloohiiiihhhiiihhijijijjllllnomllnojfmnlkoqolopnnqrrrsuvtsstuuwwwwxxxxxzzwxuvwtrqpqrlkmkkmnmlmmjkmononmnnlnlmooppmjnqpnppqppoqrrqqpqqqqrsrqsrrstssuvvuxxxy{{yyyyyxuvxvwxxxyxxusplnonmmliikkljjkjlljknooomopqoknqpnmjmomnmlmnmmjglnrsuzz{|{{}}}||}~~~~}|}~|z{}~}|}~|{{{yz~|}||||}|z|}}~}||zz{{|{{}}}}~~}||||{z{}~||{|||}~~~~~~~~~}~~}~~~~~~~~~~~~}~||}~}}}|{{z|~}}}}}}|~~~~~~}}}||}}|{xx||{z||}}zzxwxwvuvuuvvwvutuvuuuututtvvuuuvtuvuvvvuuwyxwyzy{zyxxyyywwwxwwzzxyyxwxyvwxy{yyyxyyyxyvy{zzyyyzzyyz{zywuwstxwyyyxxz{{||||{{zz{{zzz{z{|{z{yz{{|yzxustutpnnmkiiggfgfghhgffgeggggghhkkhghgfhhhghihhjiijkkjkoonopqqqqrpppqqrprsssttsstusrqstrrtvuvvvxxxyyyxywxvttsusrpomlmkknljlmnmloppqppqpmnoopoqroknopmpqoqqprqqqpprqrsttsqrsstsstuuvwwwwzzzzzyxywvxxuwxyxxxwvqpnnllmlkkjmmlkjlkjljmmkmmkllkolmnmmkjllmmpmnqponnpptuwxz~{{|}}}||}}|{||{z{{|}~||~~~~}~~~|zz{|}|}}}~}{}}}}|||{{}}}||~~~~||z||{||zyz{|~~~~~~~~~~~~~~~~~~~~~~~~}~~~~}~~~~~~}}~~~}|z|}{|~}~}|{z~~||~}}}~}}}}||~{{z{}{|zz|~yyxwxwvvutsuuxvvvwvwvwvuuuuuuuvvwwxywvwxvvvuvxyyxywxwwwwwwyxxyxxxxxxxwwxvxwzzxwyy{zxyzyyz{yyyxywwwxxwwxwuuwvwwxywyzyz{{zz{zyy{||{{{{{zxyz{|{xyxyywwvtsqnnmpokheffeddgeeddfedgfghhjkjhggghhghhhihhhihhiiikmoommpsuuvtsssttssssvvutuwsrqrrsssuwyxzzuuxxvwwwvvuuutrsronommmllmmnmpqqpsruusssstvusuwwwvvxzvuvtuvxutsrqrrptvusqnotvtsusuxyyxwxyy|}{yxxwvwuuwz{yywuustnmkkkkjjjkihjkjjlklmlklmpmlmnmlkllljmljknjinpkljnptvx|{}|{|||}}}}|z||}}}{{|~~}}~~~}|y|~|}|{{}}|}}}}~||}}{}}}~}}}~~|{|{|{{}~|{{|}}}~~~~~~~~~~~~~~~~}}~}~~~|}~~~}}~~~~~~~~~~~}}}}}}}~~}}~~}|||~||}}}}~}}~}~}|||x{||~|zz}}{{zxxwuuuuuvvuuuxxvvvwwvuuwvuuvvwwwwxwwxxxwxzxvvzzxxvuxzyxxxyzzxxvxxywxxxyxyzywxyzzzzyyxyxyxyzyyyy{zyxwwvvvvvwxzyyzzz{zzzzzzzyyzz{zxyyyxxxxzzzxxxuvutsrqpnnlhfefdccbcdcdeffghkiiiikjihfgihhgghhghijjjjkklmnnlkkqwxxutvttstssussuvssttpnqssstuwwxyxywwxxxzxxvuutrqpoonnmmlnooompqsrtuwutxuuvvvxxxwxwxyyvuxxvwzyvttsrqrsvutsprstsrtrtwxwwwxxyz{zwyxvvvxvwxwtuwvtqqnnmlllkkllkkllkmomlmnmoppolkommklmllmnllmlmmoonknquy{~|y{z{|}}|z|}}}{}}{}}}~}~~}~~z{{y{}{{{{|}||||}|{|}|{{{z{||}}|{{}}|zyz{|{z{{||zz{|{~}~}~~~~~~~~~~~}}~~~|}~~~~~~}~~~~~~~~|{}}~~~~}}}~}}}||{{{{zy||{{|{||{z{|}~{{|}}|{{|}}|{{}|z{{|{|{y{z{zwvywtuvttuvvvuwxwwvutvuvvuvtwwvwwz{yxyyxxzzwwxywuwvvxxyxyyyzzxxyyyyxxxxxzywxyz{{zz{{yyzyzyxyyzzyyxxxxxwtuvvvxzxxyyyz{zz{{|}{zzyyzzzzzyywwzzyxywuusrrpnommjfceedccbbgdceeeeghhhhikjihggghggfhgfhjjjkjhjkkjkkifltxvtuutstvvuuttvxttssrpmqrsttuvsuy{yvwxxxwvvwvvtqponmljkllnnnoqqsssvutuvvvwvwy|zyyyyxvxvwwwwwwxvvrqpttsqrstsrrsttsvvvwwxxxxyxwwwwwxwwwxxwuvwzuplkmklllkjlkjkkjlmkmgillonmnllmnnlljgjllllmprnoonlkrxyz}z{{{zz|~~}}|}~}z{}{{}}}|}~}~}}}}}z|~{|{|}~~}|{z{y{{{z}}|z{|}{{|||{}}}zz{{{{zyxyzz{{z}~}~~~~~~~}~~~}~~}}~~~~~~}~~~~~~~|~}~~~~~~~~}}~~||}}{||||}||||}}}||{{z{{{{wz{}||zz||zzzz{{{{zzyz|{{zyz{{zzywxxyzvuuvvuvttuvvvtvwwwuwwwvxyzx{|{wwzxwyzxyxxyzxwxyyyyyyzzyzzzzxwwyyxwxxyyzz{|{zzzy{}|zyy{zzzzzzyyyywwuuuvvvxxyyzz{{{{zyyyyzxxxxxxyxxxwwxxxwwuusqqppollkkgcccb``_accdfhgghhfghhllikihhhhhgggdhhhhjifijkijjhhmqtvwuvuuuvtuvuuuusssssqrsquxvvyxwxxvuvtwvvwwuvuussqnnllkkkkjjjlqqstutuwwvutwyz{xx|{xutuvxwwzwvvuurtuwvtprtssrtvvttvvtuxwvwwxyyxyxxxxyxyywwwvxurnjkklkjijijijjjliijiklklmnnkknlkjiikljijjlmnnmmoqqtwy{{z|{{|{y{||}|}}|||}}|||}}~~{|}~}}{}~{|{|}}}}}}{{{yzz|}|{{{{{}}}|{}}||||z{{zxyzwz{z{|{|~~~|}~~}}~~~}~~~~~~~~~~~~~~~~}~~}~~~~~~}~~~~~~~~~~~~~}}}~~}}~}||{|{|{|{{{|{zz{zzzz|{{z{z{yzz{zzzz{{{zy{y{}{{}~|{zyzzyywxxvtuvuttuutuwvvvwvuuvwwvvvvxyxywvxvuuyyyxy{ywwxwwxyyxyzz{zyzyyyyzyyyzzz{z{|{{{{{zy{{yxwxzyz{{zyxxxyvvuvvuvxxyy{||{{zyzzzzwxyzyyyxwxyxxwvvwvusqponmkjihe`baaaabbbceghfgghhhgijkhhhgggigffgfhjhhhiijkmjjgghmrssuuutututtvvttutrsrqqprquwvwxwwwvwvwwxxwvusvwuttrrommkkkjllkimqurssuuuuwvwyyxyzzzywwuuxxwxwuuuuurtuwrqstrsrstuutuvstxwvwvwzzyzyyxyywwwwwwvwttsmkknllkkjikjjjljihijkjjklkkkljkikhgjllmmnmnmkjimruwx{zz|||}}||}{|}}~|||{}~}|}}}~|{|}~}}{}|||||}{{{{|zy{{xxyz{{{yyxx{||||{{|||ywxxzzzy{{{{}}~~~~~~~{}~~~}}~~~}}}}}}}}}~~~}~~~~}}}}~~~~~~~}~~~~}~~~}}}}}}}|{{||{yy{xxzzzzzz{|zzzzzywxz{{{zyzz{{|{||zz||}{{zxxwwwvusqrtuttuuuttvwvvvuvvvvvvuwwxxywxxwxwyxxwwwxwxzyxzzxxyyz}{zz{|{xyyyzyz{|{{{{{yxyzzzzyzz{zz{{{yyywxwvvttvxyzzyzzyzzzxzz|{zvwx{}{yzyz{yyyxxwwrpnmkijjhhc_^]__b```acddeefgiiijiklhiijjhgffghghhiihijiiihjjllnnrstvvutuvttttuvvuuvsrqrtqtxvvvuwwvuxxzzyxxwxvwusqppnlmkklllkinstuututttuuvvwvwyxzyzxxuvywwxxyvtstqprsrqqrqprsqqstvxxuuwyzxyxxwxyyzywtvwwwxuusssnoponpmlnkljkhilkjjlmmomhjonoljjmkijmooopppppprtwxx{|z{|||||}~}}}~~{{}}|}}}}|}}}}}|||~{{zzyyzyyyyyyy{~{z|zzz{yyyxz{{|{yzz{{yxzyz|xx{|{xz|}}~~~~~~|~}|}}|||{||{|}|}~~~~~~}}~~}~~~~}~}}~~~~}}}}}~}{||||{{|{zz{z{}|{yyzzyxyyy{zyyy{{{zz{{{{{z{|||{|~|{zwvuuwwuussvvuuvvuutuvuvvuvwuwwwvwwxxwxxxxzzzzywwvxywwyzyyyxyy{}|yy{}{yzz{{{{zzzyz{{zyxyyyyzyzzzzyxyyyyywvwwvwwyz{zz|zz{zzyzzzzzxxwy{zyzxyzyyxy{|xsropllljieba_]]\[^__`cddddeffgghhklhjjjjjhgghjhiihiijjijijlnlnpqrsstuuvuuuuuuuvttsqrrpstqtvtxyxwxyzyyyyyxyzwvwutrpomjkiknnmooqttuwustuvtsvvwxxxwyxxvvxyzxyxyyvsponnstssuvvtttrsuvwvxvvwwxyyxwxyzyywzzxxyzyvursqooooproonlnllkkkllkilmmmkjnnjkjlnlkmlmnmoqrrqpruyz{}~|{~~|||~}|}}~~~|}}}}}}}}||}}}~|||{yy{{z{zzz{zz||{yyyz|zz{zy{yzzyxyzzyyyz{{yxzzzyyzz{}~~~}~~}|{}|~~}z{|{}}||}}}}|}}}|}|~}}~~~}}~~~~~~~}||||||{{|{{|{z{{|z{zzzzyyxyyzyz{yyyzyyyyzyyyz{{z{{|{z}~~~}zyywxwwvuvuttuuvxvvvvvvvvvtttvtvvwxxvvxyyxyyxyzxxwyyyyzzyxyyzxyz{zxz|zxzz{{yzyyyywx{{{{yyzzyyzyyyyyxxwwyxwwwwvvxz|{z{zz{{{xz}{yzzzyyyyyyxyzyyxxyyvrpoolkjihfbaddceli`a_bdccddfeefhjkihjhhhhiihghjjihhhihhkjhjllmoqrstuutuuuttsttrrutrssqstqqttuwvxyzywz|yxwwwvvvtutqookjlmmlkklnqswuutuvwvvwwxxxxxxxwxwwxxyxvvwvrpqoorqqpsuutuwuttvwwwuvvwxxxyyyyyyxwz|yxyywuwvsspoomoommlmllkjkjkikhijlljjjjghiklllmljlmlnqrqty{}z||}}|}}~~}||z{|}}}}||~~}}}}||}}~}}~|~}|||||{zzyzz{{yxz{|{{z{{{zzzz||{{{{y{||zz{{{z{|{{z~~~~~~~~~~~~~~~~}~~}~~}}}}|}}}~}||{{{||||}}~}~~~}}~~~}}~~~~~}~~~}}~~~}}||{|{{z{||{{{{zyyxyyyx{xxwxy{zxzzz{{{z{z{z{{z{{{||}|{{{xwwwwxvvuuvvvvwvwvvwwwwvvwuvvvuuvwvwwwwwxxxwyyxyyzzzzzzyyzzxwxz}}zyz{yzzzz{yy{|zxyzzyyzz{yz{zz{{zyzyvwyxwwwuruwyzz{{{{{zyz{{zzy{zzxxyzyzzyyyxvvtqpopmjjijjgbis|}zvlcdcbbdeccigefehjiiigfhhhhfhgikiffhihikmkkmlmoonptwusrsuustttttvtswuqssrqsvvvuwvyyy|zzyxwwvusqttqnommlkkkjlmnpsuutrsvwvwvwxvvxxxyvwwwwwxyxxxvsrsrqqsusrsqtuutuwvvwwvyzxxwwxwwxxyxyxxxwwvvwvwtrpoonmmnmmnmlkkjiljkljgkljmljkllkknonkjmminopqwwwyz{}}||}{{{{}||||{|~}}~}~~~~~~}}}||~|~~}}}~|{{|{xyz|{{z}}{{{z|{|{{zz|{z{{{zz{{{{||||}|{|{~~~~~~~}~~~~~~~~~~||~~}||}}}}}|}{}}}||}}|{z}|{|}~~~~~~~~~~~~~~~}~~~}~~||~~|z{}}}{z{z{zyy{zyzyxwyxzyz{z{}{|||{zzxwxzy{{}~~|||ywwwwwxvwxuvuvwwvwwwvvwwvxxwxwvxvtwxvvwxyxwvwxzxxyx{{zyyyyyyyyz{zzzzzyyz||{|{{{yyyyyzwxyyxzzyz{zz{zywvxxwwvutwxxyz||{zzzxyzyz{yz{zzzz{yzyxwwwvusrponnmkkiiffv~{kdbaa_bc``efgecgiihhgghgghhggggfhiiihhjjgjlkmmoprsuvttuvtpsxwuuwxuusqtsrstuwwxyyyzy{yxyxxvwvustrppnmmkkmljjjoqrsssruvvvvvxxwwxxz{xxxxyxwyyxxvtsqqrstuvttsvvutuwvuwwvxxvxxxxvxzyzyyxyxyyusvwvwuplmonmmmmomlllkjjljigfkmomklmllmkmjmmlkmnqoqquuxy{{||{}}|}|}~}~~}|~~}~~}|~~|}~}~~}|{|{{|zzxyyy|z||{{{{z{zz{zzxy|zwxx{~yzzzyyz|{{|}|}~~~~~}~~~~}}}~~~~~}}~}~}}}|}}}||||{zz{z{}~}|z{}}}~}~~}~~}~~~~~|}~~~~|~~~|}}||{zz{zzyzzzyyzz{{yz||z{|{{{{{z{zz{{xwxzz{z{{|}|{yvwuvvvvwvvstvwuwwwxywxxwwwxwvtwzyxyyyzxyyyzzzzz{yz{{{{{zzzzzyxyyz{{yzyxyyyzzzzyzzyyyxzzywyyxywwzzyxxwyxwvutswyzzyz{zyzzyyzzyyzzyzzxz{{yxxxvwvutspnmlkhhiihn~~xk`_\[^``bdfddfgijiijihggghjhhhghhiiggigflljloopsttuttuuutuvwvutusqsrqrrtwwxxyyyyyxyzxyywuuuuussqpmkljjlijmmmqvuuuwwvutvuuvvstvwwwxxwxywvvxvvvssrqqqtuurutrstssvvvvvvvwwxwxxyyxxxxyzxxxxxxxssrolnnnnnmmlmmjhhhjkjighlmjlllnmlmmlkkmlopmopqrvyyy{|||}}}|}~}}{}|}|{}}}~~~}}~|}~}~~~|z{|||||yzzxyy|}z{zwx{{z|{yxz{zyzzzyyz{zz|{{zz{}}}}}~~~}|}}|}}}~}~}~}}}|~}|||||||}||}~}||{||}}}~~~~~~~|~}}~~}~}}}}~~~~}}}|||{{{z{{z{|{{{z{{{||{{{|}~{{~||{{y{zyyzzz{{{}}|zzwwxwvvwwwvwwxvtwywvxxxxxywyxwwyyxyyyyzwyxyyz}zyzzz{|}{zyz{zyyxzzxyzyzzyyzzzyzyyyz{zzzzz{zzzzzz{zyyyyxxxywwusvxz|zyz{{yz{yzzzyzzyzzxxyzzzyxwvvtsspmkjkkhigen~{f____`bbbcdefffghhhikihihhihiihighihgijjklkmonpsuuuuvuuvvutvuvuusqttsspsvuuvxwxyyxyzxxwvvvwzxutqonmljjkkklmmpuuuvvwwvwwwwwwwvvtvwwvvxwwwwwvwwtsrqrrtvututsttstuvuuwxwtuxyxwxwwxwwwxzzxyzyyuoolhlmonnonnomljjkjjhgkmkjiinommmmknpnlmommnortv{yz{{||}|}{{}|||||~}|}}~~~}||~}}|{{{{{||{|{yyxy|zxyzyy{||{zzz{{|||zyzzyxzzz{{{{|||{~~~~~~~~}~~}}}}~}}~~~|}|}~}||||||}~~~}|||||}}}~~~~~~~~~~~~~~~~~~~}~~~}}}||}{y{z}|{zz|}{yyz{yz{{zyxx{|{{||{{zyzzzyz{{{{|~~|yzxyyxvwvvwtvyxvwwwxxwwxxxyxxxxxxxxzz{zyxz{{yyzz{{zzzzzyyyzzyxzyyywwxxyyyyyyyy{yxwyzyzyyzzzzzzyzz{{zyxxyxxxxvtvy{|yzyz{z{{xzz{{{z{|{yx{{zzyxwxxussoonkljghhfn~~p`^^`a`dbbddeeffghhghjjhhiiihiijhjjkjijjjlllnoprttttuuutstvvvuwutqruturnquuvwvvwxxxxwwxwvvvvvtttpnnmlllkljkmpptstuvwvwwwvvwwwwxxwwwxwxxwxwuvxwtssstvsqprstpopqsrsvwxwwtwzyywvvvxxxwuxxxyxxxurqmkmlmmmnmnmmomkkjkjikkkklklllmmmnprqmnponqsuzxzz{|{}|{}~zy{{|}||~~~~~~~~~~}}~}~~~~zz{zz{{{{yz{{z{}|{{{{z{{{{{zzzxz{}|z{zz{yz|{z{|{|||}~~}}}~~}~~~}~||{{||}}|}}~~}||||}|||||||}}||{||}~~~~~~~}}~~~~~~}~}~~~~}}}|{yxzz{z{yyyz|zzxxy{|{z{|{{{|yxyyyz{{zzzz{{xy|||~{yywwvtvuutqptvxvywwwwxxxxwxxxxxyxwxzyyxy{|zzxwyxzzzz{zyzzzyxxyyyyyyxwxxxxyzzz|yy{{zzy{{{zxyzz{zz{|zyyxyvvxwuvwy|{yy{{{{{|{yzz{{z{|zy{|zzyxxwxwvtspoommhdhiho~tc[\_^^_bcfefheegkjiihhhgijjjihiiijiijjhjlkjjjnorsswxututtuwxxxxwwwttqqrrstuwvsstvwywwxxwxxwvuvvtqnmkkmmkklnnossrttvvtvxwwwwxwxyyxxz}zxzywwywvtrrrtttssrsurrrrpsuuvvwwwxzzzxwyzyyyzyyxyxxwwyyvqmlkjlmlkkjlmnonkljjjjkmllkklkmopmlnonoprrtwx{{zz{{}}||||||}}~~}~~~~~~~~~~~~~~y{zz|{{yyyy{y{{{|{~{z{{{zzxz{zzz{zy{zzyzz{zz{yy{zz}}~}}}~}|||}}}|}|||{|~~||||}||||{|}|||}~}||zz||{}}~~}~}}}~~}}|}~~~~~~~~||}{zz{z|{zzxxyzz|zyyzz{{{zzyz|yyzz{{{|yy}{{}|z{{||{{zxvvtvtttrqsuuuvuvuvxwxwwxyyyywwxwxyyzzzzz|zzzxzz|{{|{{{{zyzyxy{zyyyyyxzz{zz|zz{{{zyzzxyyzz}|zzzzzyxxwuwxvuwvy|{xzzz{{{|{zz{{yyzzzyyyz{zyzywxwuvqnnmljgijho~zg_ZZZ\^_`cedeehggikihjjjhijkkiiiiijhijhimnmnmkoqsrrxvuvuuvuvwuvwvuwvusssuuttuwvvuuuvwxvvwxwwwwvvutonlklnlijkkortuttwvvwwyyyzxwxxwwwyxwxyxwwxvutsqrstvtrsrsrrrrstttvwvxxxyyyyyyz{yyy{zywvxvwxvvrmmkilllmlgjnopnlkjkmklmmmllllmkljloolptuuvxz{z{||}|{|}}}~}}~}~~~~~~~}~~}vxyzz||{|{{{z}}{zz{zzz|}zz{|}||zz{yyzzz{z{zz{}{z{|{{|~~}}~}}}}~}~}~}}~|||}|||}}||}}}}~}|~}}}|~}}|zy|}}}~}}~~~~}|{~~~~}~}|{|zz{}{zzxyyyxy|{z{zzzz{zzyzzxyzzzzz{||||zz|}|zzyxwwuurqsssttttttvwvwwvuxxxx{ywzzxy{{zz{{{{z|{z{{z|zzzzz{{z{{zyxy{zzywxyyyyyxxy{z{zz~{y{{z{yzyzz{zzxyyyxwwxyyy{|{zz{{{{||}~|||zzz{zyzzzyxxwwxutsnmmlliehjjp|h[Z][^c`adeeghiiihjmgijjijijlkkjjijkhijjjnlnmjnsstsuvutuvwvvvwvwvw|wsssrrstuvwwxwwwuuvwyxwxwxzyxuuqpomljkljkklnquutvuuwwxyxwxxxxxuvxvwvxxyxxxxwutrtttvsqsttssssstwuuvwxxxyyzzyyyzzzzz{yy{zyxxwwuoookkmmpojkkkmmmmkljkmllmoqnomnpnprqrtuuvwyz||{{{|}}|z}~}}|~}}}~|}~~~~~~~zzy{{{z{||zz{{zzzzzzz{||y{{{}{{z{{yz{{zzzz|{z{zzxz|{}~}|~}|}}}}~~}~~}~}}}||~}||||}~}||~}}}|}}}}|{||{|{|}}}}~~~~~~~~~~~|}}|{{{zzzzyyyyyzzwz{xyz||yxyyzxzzxyyyyyz{{~{{||||{zyyzywxusurprrqrrsttsuwzwxvuxxxxyzxyyz{{zy{{{|}||{y|}{{z{|||{zy{|{{zz{zyzzyzzzzzzy{{zyzz}zz{zzyzzz{{{zyyz{zxwwyyxyyzzzzzz{|zz}|{{{{zzzyyxyyyywxvwttonponkiikkp~q`[X[\aa`aegeeffeghiihijjjjjjklkjijkkijkjlllnmmnssuwyxwvvwwwvvvvvvwzwtsqsutuvvwxywxwvwwxzzxyywwuutuspnlkjlojilmlouutxvvxxxxwvzyyxwvvvwyvxxxwxwyxvtssrttsrsuuttsrsutsuvvwwxxyyyxxywvwxyyxxzwwxwwsrpnonmmmrpmmkllmkjkmkkknnklolmoonqrqsvuvxz{{{||{{{}{y{||}|{|~~}}{{|~~~}~}|}}~~~~~~zzzz{|yz{zzz{{||{z{{xyyzz||{{{||zzzzz{|zyz}~{z{{z{}}}~~~}}~|}}~~~~}|~~~}}~~}}}}~~}||}~||}}|{||{}~}|||}{{{|}}}~~~~~~~~~~~~}}~}|{z{|{zzz{{xvyzz|zwxy||wvy{zxyyzz{z{z{|{}}|{{{z{yz{{zyvtrrqopokoqttutvvxwxvvxxyyz|yyz{|{z{||}||{||{|}{{{{|}|{{{}}{{{|{{yyzy{{zzzzz{{zz{{}|yzyyyyzzzz{{{{{{zzywwwxwxyzyz{{zz{z{|{{z{zzzyyzyxzzwxvtwurnnonmlkkkjo}wga__]^___`ffggggfgikjihfiiiihkljjjkjkjjlkjjklmoorsuuwvvvuwwwwwwxwvxxvtrrtsrtusvxvxyyyxyy{|zzxxxwwzxsqmhiijljghlnsvwuwvvvvvwwwwvwxxwwvxzxzwxwwxwutrsuttwsrrstttstuustwvvwzyxyzyyxxywxxyxxxywwwxwtsnmomkkkpnlkkllmnkkonlooollllmnopqwvvwvwy{{yy{|||{|{{}~}||~~}}~~~~~~}|~~~~}~~~~~~{y{||zyz{}}{z||{|{z{zyzz{{zzxwyzzzz{|||yxxzzzzzz{{z}}}~|~}|}~}|}}}}|}}}}~~}}|}~~}~}}}||}|}{{zzz|z||||{}~|||}~~~}{z|}}~}~~~~~~|~~||||{yz{|{zzzzzzyyzzzzzz{zzyz|}zzyz{{{{{}{||}zxz{{{zzzyyxyusolkjmkimptuttwxwwwwxwwyxxyxyzyz{{{|{|zz||{z|}~|{{|{{{||{|||||{{zzzzz{yyzzzzzz{{zyyyywxxyzzz{zz||{zzzzwxz{yyzzyzzzz{{z{z{{{{yzyyy{{{{zxvvuxuspnllkmlklhh{yf]Z^```a_`bccadfhikmmljhghjiiijjkjkkjiiijijijkkmpsxxuvvvvvwwvvwwvuvvwvtrrqqrtutuxwyyzzyxzyyyxxuuwvxuqpllllliihjnqsuutwwwwwvuwwxxxwxwvuwxyxwxywxxxusvwxuwusttsrrttutvxwvwxyyzzyz{ywzzzyywxyyzxvuzzumjnikoknlillmjknmlnnlmopmlooptwvwzyzyxzzyzzyz{{z|}}}~~~}}{|}||}~~~~}}~~~zz{{{z{{z{{||{{{{yzzzxz{|zyzzyyzzz{{~}{zzzyzz{|{y|{{z}}|~}}~||{}}{|}|}}}|}|}~~}}}}}}}{{}|{z{{{zz{||{|||{|}|}}{z||}}~}}~~~}~~~}~}||z{|{{{{{{{{{zzyxz{|}zz||{{{|zy{||zz{{{||{y{{{{z{zyxvvurnkkjjkkmoqqqruxzzxxzyyywxyzzzz{|~||{}}zzz{{{}}|{||{{{|}{{}|{{yzz{{{yyyzzyz{y{|{yzzzzxyzzzzzz{|{{zyyyzwvw{{y{zzzyy{{{zzxzzzzxyxxxzzyyyvwvvwvrollmllkjjfctla_]]^_`a_acddcbdefhkmmjebeihhhiijiiijjihhhhiiikmpsyztsuvwywvvwxywuwwwvtrrpqsuvwvuvxxyxzyzxvwwvvvvvusppmlllkkmnpnmpttuxvwxxwuvwvwvwvwuvxwwwxx{xwxwtrutuststuuttrruvwwtvxyxxzz{{yzzwyyzzzxxvxxxwwxytnllhjonnnlllnikmmmonklomikorsuxwx||zyz{||}}{||}{{}}}~}~~~~~~|}}|{|}~|~~~}~~~~~~~~~xyzzyyyz||z{{|z{yvyzyzz|{z{yyxyzyy{y{zzzzzz|zy{{z{z{|}~~}~~}}||}}|||~}}}|{{{{}}}}{|}}{zz{{|zz||{}}|}|{{{|~}|{{z{|||||}~}~~~~~~~~~~~~~}}}||}|}|{{{{}}zzzx{{{||{{yz{{~|zy{zz{yyzyxyzz{{{zzzzyuvsoljhiihjknsttuvvxxyxw{yxxxyz{zz{{}|{{z{{yz|||||{yz|{||}}zz{{{{|{z{zyyyz{zz||z{{{zyy{{{{zzz{{{z{||zzzzzywvyyzzzzz{{|||{{zyyyzyyxwyxyzyxwutrqqppnnnllkijhfc_`_^````bbbcccdefhhhikliiffiiihhiiihijiihhjjjklkknsutttuwwxvvwyyywvwvtsrsssttvvwywxxxxyyyxvvxxwuuuttuspnlkiiklllmnosuvwvuvyxvtwxywwuwwwwwvvvwwwvwwwutttutstuuttutsuststvvtvzyxxyyyxyyxwxxyxxwxxxwvtommmmllmklmnnnnljknomlkknpvwwxy{zz{}{z{{|}}~}}}}}}|}~}}~~~}}}~~~~~~~}}~}wyyxwwyz{zz{{{{zz{{{|||{{{z{{xyzzzyvxyzyy{|{zzzz{{z{}~~}|}~}~~~}}~~}|}|}}||}~~zz|{yzz{yz{{||{}|{{{{{zz|{{{{zyz|{z{~}|~~~~~~~~~~~~~~}}}}}}~}}}|||{}|{{{|||~}}{{|||{z{|{{{zz|zzzz|{{|z{zxxvtqnjhgihhhkmrtvxzywyxxwxxwwxyxz{{{{||}||{|{{{|}||||{||||}|z{|{|{zzz{zyyz{|{{z|z{{{{yyz{{{{{yz{zz{{|zyyyzzwxxvyyz{zz{{{{yzyxyzyyyxwywxyxwywtstsqpnnmkkkijig`_a^^`aababcccegggjkilqqkhfgiigfhiiiijkjiihijjkmmmnrttrsrtvwvvvwxwvvwvwuttqprsttwxxyzzzzxvxxxxyvttuusrsqqnlkmlklmnnpsstwvvvwwvvvxxwvwxwxwwwxwwwvvwvvtqtsttrsutttwvttttttuvvwywxxyyxwyyyxwwwxywwwvvwuommmjlllknnonnnnlkoonoqrrvywyzzyxyz{{{zyz|{}||{|}~}~~~}~|~~~}~~~~~~~||~}}}~~~~xzyzzyywxzz{{{|||{{zy{|{{{zzyxvwxyzxvvvxz|zyyzzzz{||{}~}}}}~~}}~~}{}}}~~|}||||{{{{zz{|||{}|{zxyzzyzzzyxyyzyzz{}}}~~~~~~~}}~~~|}~~~~|||}}}~}}~}}}~~~}~~}}~||}}}{{{{{{{{{{|{{|yyyurojffhihhhjmrstvyyvvvyxwyyyxxyyy{{||{}{zz{{}z|~|||}|{z{{{{|{{{|{zz{zxyxy|{z{{|{{{|||{z{{z|{{z{|{zzzyxz{{|zxxwxz|}{zz|{zzzyxyyyy{|zywxyzxvvuvtuspnonmklkklidbb`b_`abbdecbgiiilllnqsmjjijjihhjkjhhjkjjjjkklnnmnoqutsruwvvwzywwvvxvvxvwropruvvwxxz|zzxwwxx{{vvuwxusrpnnmmmmlmmnopsruwvwwxwxwvxyzxwvxxxwxyxxywxzywusstttsrvvtuwvvuvxwwwxyyyyyxyzyyyyzzyxwyyxywvxvtomkihjkjmnlmonnonprrtuvwwxyz|{{{{z{{{|{{||{|||}}~}}}}~}}|~~~}~~}}~~~~~}~~}~|~~uyz{}|xzzywy{{}}||}|{|z||zyyzzz{{z{{{zxzz{{y{|zz{zz{}~~~~}}~~}}~~~~}}}~~}|}}|}}|||z{{z{zzyyz{|zyyyzzzzyz|{{zz{yxzxyz{|{}~~~~}|~}}~}|}}~}|}}|||||}}}}}}}}}}~}}}~}}}}}{{|z||{|||}||{zyxvrmjhhiiihfjjmqquxxwxxyyxz{zxz||y{{{|||||z{~}||||~}|{{{{z|||{z{|{yxzzyzyzz{|}}|{|{z||{{zz{zzzzzz{||{{{zyyyyzzzyzxyzyxwwz{yy{zwwyyzyxxxwvrqqsssrporutrolkikhdbccccdbfffedfhhfhjkmoqokiijhjiiihjihijjiijijilmlnqrsuutuwvuvxwxwuvwvwxxwqrtsuwxyyxzyyyyyxxxywwywuutrrplmmmmkmmlloqtttvuvwwxyzxwyxxyyxxxxxyzzwxxwwwsrrtttsruwttssvtvvvwxvwxxvwwyyyzzxxyyxxxxyzwxxwvnnmlimmlnommnonoonrtwyxy{|{{}||{|||||{{}}}{{|~~|}}~~}|||}~~~~~~~~~~}~~|}~~~~~qwx{||zzzzz{||{|}|~}{|{||{||zyz||{yy{yzzzyzyy{yyz{z{|~~~}|}~}~~~}~}}}||}~|}~}~}}}{{|||{z{zyyzz{yy{{{{{zzz{{zzyxzyyz{{{}~~~~~}~~~}}~~~~~~~~~}~}~~~~}~}|~}}|}|}}}}~~}}|{zxtpjjhhjihhgjkmpqvwvxyzzzzyzzxyzz{||{||~}|{|}~}{|}{|{{{||{z|||}{{zzzzzyy{zzy{{||{z{zxzzz{{{{{z{zyyz{{z{{zzzyyyyyzywyzyxwyzzzzzzyyz{zxxxwwvqnoqroqnnqssrmjlkkgddfebcfefcdefhiijlklnprolkihhhijkhiihiihhijikklnmnstvuuvutvwvvwywuvxwwwwurtsttuwyyyzyyxxyyyxxyxxxwvvwtrolmmmlmlmnopsstuuvwxxyywwwvwwxxyvvvxxxwwwxyxvwwxwutuvttttsvvwxxxwvxyywyy{{yyzzxzzyyzyyxwwxwupoonnnnnnnnnppqrrtvwy{zy{|||}~~|}}{|}}~~~}|}~~{|}}~}}|{|~~}}}~|}~~~~}~}~~~~~xyy{yyzz{zz}~|{zzz{}~}|||yxyyz{{yyyzzzzzzxyzz{y{xyzz|~~~~~~~~}~~}}}~~}}~}~~~}~}}}}}}||||}{z{{{xxz{zzzzz{{y{{{{{{zxyvuxz{{{|}}}~}~}~}~~||~~}~~~~~~~~~~}||{zwtpijhhiggjhfioqsvwvwyyxyyzzyz{|{{|{z{|}~||}~}}}}}{||}|{|{|{zyyyzzzxxyyzyy{{{{~{{|{{{{|||||{{||{{{{|{zzyzyxwxyzyyzz{z{{{yz{{zyzzzzzyxxyxvutrrsvsrooprrtrlljjhfeheddecdfdfhggiiiklklljkiihjihiiihiiijiiijkllkjmnrvvvwwwwwxzwvwwwxwvttsprtrruvxyyy{yxwxxxxxxxxxvwxvvtpnlljlkllmopsuv{zwwzzwwxxvwwvwyyyvuwwuwwwxzwvvvvvtststtvutvvuwwxyyxwyyzz{{yyyz|zzyyyy{{yuuxtsmnnmlnononpstuyvvx{{yzzz{{{{~}~}}||}}~~~~}}}}}}}}}}}}|~~}~}}}~~~~}}}xzz{zzyz{z{{zzz{{yyz|z{yyyyyxwzyxyyyyyyy{zz|||||zy{|}~}}~~}~~~~}{||}}}}}~~~}~}~}}}}z|}||}{{{yxyzzyyzz{{zz{zzyz{{yxwxxz{|z||{||}}}}}}~}}}~~~~~~~~~}~~~~|z||zwsnijjhjhjjjlmortwwxx{zyyyzzzz{|}||zy|~~|||}~}}~|}|||{z{|{{zvuxz{zxyy{zzz{{{{{|{|}|{{{||z{{{|||||{{|zzzyy{ywwyzzyyzz{{{zz{||{yzxwwvxxvvwuutsruvsrnnruuutlkijgdbddeedcdggghhiijkmmkllkkiijjjkikkhikijjjkkmkkllmpsuvvxzxwvvxwvvwwwvtuuupqrstwxzzyyy{ywwxxxyyyzywzxvwspolmjjkkkpnqssvxwwvyyxwxxwxxvwywuvwxwvwvwwxwwwutsstsststutxxvxxxywxxyy{|}{zzz|{zyxyzy{|ywvvsononnonnnrttvvvxwxxyyyyyy|{{{||}}|}~~~}}~~}~~~}}}~~~~~~~~~~~~}}~~}}}~~{yyzzz{{{|~}|{{zzyzzyzzyxyzzzzzyxxxxxxxwyyyz}z{xzz{|}~~}}}}~}~~~}}}}}|}~~}}~~~~~}~}}}||||}|{{zzyyzxxzzzzyzzy{{zyzzxxxxxz{z{{{{||}~}}~~~~}}}}~~~~~~~~~||}||xtolmkjkmmkjlmprsvuuxyxxwwyzzzz{}||z{||||}}~~}~}}||{|}}|zwwx{zyyyyzyz{{|||||{||{{zz{{{{zzzy{{{zz{zzzyxz{wwyzzzzzz|{zz{{|}|zzxyyvwxwwvvstsrvurrooprssrmkilheeeegefgihgegihhikklllmkjghjjjkkjkhikjhhjkmnllmmmptutuwvvxwwvvuuwvutuvxvtssvuvy{{||{{zxwvwwxyzyxwywuuutroonmonkpoqrtwwvwvwvwwvvxzxvwxwutwxwvvuwxwxvusrprtssutuutvxwwwwxxxyzzzzzzzy{{{yywy|zz|yxvummnnnonooqttuuvwxxxzzyyz|{|{||{|}~}}||}~|}~}}}~~~~~~~~~|}}~~~|}~}}}}~}~yzxxx{{{{{{|||}}||}{yxxxxzxvvwvwwxwvwwxyywxyzzzz{|yxz}~}}~~~}}}~~}~~~~~}~~~}~}~~}}~}}}}}|{zxz{yz{{zzzzyxyzyyyz{zzxxxwxyyx{{{||}}}~}~}~}}~~}~~}~}{wtpmmlnrrpqqpoprtuxyzz{yxwxzz{|}{|}~~}}}}|}~~~}}|~~~|}~~}|||{{{zzz{z{{zzz{|}|{{||{{||{{z||{zyzz{}zyz{zy{|zzzyyzz{{||{|{zzyzyzzyyyxxyywvvtonprssqprtstsppnlmjhhggfgffhifgghjiikkjkpoijijjjjiiijjklmjijlklmmppmosuwvwwwwwxyxwvvwuvvutttuuutuwwyy{{{{yy{zywxzywwwvxvtqmlmkmlllompqsuwvvvvwwwwvzxwwwxwvvyyyyyyxwxxvuuupststttsstutttvuxyxxyyyzzyz{{{wy||zzyxyyyvurqompqppptwwxyy|}|{|~|z{}}}}~}~~}~~|~~}}}~~~~~}}~~~~}}~~~~~~|~}|}~{}{z|~}}}|||||}~~{zyxwyz{{wwwxxvvwwwwwxzzxwwyxwwzzzyx|~}~~}~~}|}~}}}}~}}}}~~}~}}}}}}}~}~}~~|}}||{zzz{|zz{yxzzyz{yyzz{|yxxxvtvvvuxyyyy{{||{{{|~}|~~~~~~~}||}~}zxwroloqrrrrsssrqvvxyzxyxwyyz{z|{{|{|z{||||}|~~~}~~~|{|~~|{|||||{zz{zzz{yz{{||||}|{{||{{{{|{{{{||}{yz{zx{{zyzzz{{z{{{|}{zzzzyyyyyxxyxvvvtsnnoorsrqqrsrqpnmkljgffgeeffihefghiihiijjmlkjijlkkjgiijjjkjihjhjjjnlmortvvxvvwwxxxywxwvvwxwuruwvuuuuvxy||zyz{{yvxyyyzvtxxtplmnnnnmmnmossuxxwuuxxxvvxxwuuvwvwwxxxwxxwxxvvurptuttutssssstuttwyxxyxwyyyzzyzxyz{zzzyxzzwurromqrrstvwy{zz{||{}}}}}|}}~}~~}||}~}~}~~~~}}}}~}}~}~~~~~~~~|}~}}~|||}~~}~~}}}|z{{|{zyzxxyzywxxxxxvvxyyyxxxxyxxxxxz{{||~~}||||||}~}}~~~~}~}}~}}~~}}~}}}~}|}{z{{}|{|}}|zzyxxz{{~}{yzz{zxyzyxxwxwwxyzyvxzyxzz|}}}}~~~~}~~~|zwunkqrsstttuwuusvwxyxvwwwwy||zz{{|}}{|}|{|||}}~~~}{||}||{zyy{{z{zzz{{z{||{|zzzxyyz{{{||}~{{||{zyzzyyyz{zyz|{{|zz{{{{yxyzyyyxxyyxuvvsnjlpnrssppsvtspmmjnkgedfddeefgegghiijjjklnlkihjkkkjijkjjkjhijjimmklmmmsvwvwvvwvvvwyxwvwxxywstuuvvwwyyxz{{yyzz{{zzxyyxuvuusrppommlllnpruxwwvwwxyywwwyxvuuwwwwuvwxyxwwvwuvutuxzutsstsssttuvvyxxxwxzyy{zzzzzzy{{zyxxzzxwrmfglooptxz{{{{{||}}||}~}}}~}|}~~~~}|}}}|~~~~~}~}~}}~~}~}~~~}~~~~~}}~~}~}}}~~~{|~}}}|}}}}|z{{{{zzzzyy{ywvwxwvvwxwxxxxxyyxuwxxzz|}~~}}}~~}}|}~~~~~~~~}}~~~}~}~~}|}}}}}}|}{z{{||{{||{{zyyzz{{|~|zxxyzyyzzzxxyxxyy{xxyxxxxz|{{|}~}}~}}|zxvnmsuuuuutvwvvvwwwwwxxyxx{|{z{{|}}~~~}}}|zy{||~~}~~~}||}|{zz{z{z{{z{{yx{||{|}||{{{yyyz{{z{|~~|{z{{z{zzzz{zxwx{||||{{{{zzzzzyzzyxxwxyxxvpigkqnrrqopvvssronkmjeegfgghfggfefghhiijkkmmjigjijljjjkjjjjehjijmlklmmmqtuwwuwxwwwvxxvwwyywuuutsuuvyyxxz{zyyyy{|zyzywwvxvtsspoqonnmklmpruuvwvvxyyyxxwwwwuwuuxwwxxxyxwvwutssuvwutsstsrtuuvwxxxyyxz{zz{zyyx{zzzzzyyxyzyxuregoqouwy{{|}|||}||}}}}|~~}}}~}}}}|{|}||~}~~}~~~~~~~}}~~~~~~w{{zz{z|{|~}|{{{{zyz{zz{{yxyxwwwxvwxxxyzyxwxywxzzz{|~~~~}}~}}~}~}}~~}}}{}~~}~~~~}~~~}~}||{zz{{{}{zz|{z{zz{|}|zxyzzzyzyyyyywvxxxwwwxxxvxyz{||~}~~~}}}{ywtruvwvuuuvvvvvwxwwwwyxyyzzz{|{|||~~~}}~{zzyz|}~}}~~}|{{{zzzyzzzxyyzz{{{{{{}{{{{zzzzzz{z{}||{{z{{{|{z{zyvux{z}}{{|}|{{{{zy{|zyywxxwxuohhlpoqsrqqtxvsrpnmnljggeeffeefdcdfghgiiiijjggijijkihikjiiifgijikjlmlknrssvwvyxwvxwwxwvwwvwuuutrtsuxwxxz{z{{zzzzzyyzxwwvvuspokmnmnmjnnpquuvwwxyxxxwxwwwwxwxwxwxxwxxxxxvutttvwwuutsssrttuvvwwxxyyzz{zzz|zxz{{{z{zzzyyxxywmhnqmswxx{}|{{{|}~~}|{~}}~~||}||}|||{}}|}}}}~~~~|}~}~~~~~~~~}}~~~~zzx{{{z|||||}{zyz{zxy||{{yzzzyzyyzzyxxxz||zz|zwwzzy{}~~~}~}}|}}}}}|||||}~}|~~}}}}}}}~}}~}}|}}|||{{|||{|~|{y|{{{|zz{{{z{yzyyyzyxwwxxwvuuxwuvwz{|}~~~}}|}}~~|yxxwwwvwxwxzxwvvxyxwyyyyyyyzz{|||}~}~~~~~}}}~~~~~}}}|zxzzzzyzzywxz{||{z{{|}{{{{{{zzz{||}||{{zz{{|{yzz{zyyzzyzz{yzyxyyzzyyzzywvvvvwxtkiloooprronrvtrqnllnkjhgdeeddddgigeffeffhjjlkijkjigiijkkjlkkjjjlkknonlottuuvwwwwwwwxxwvvwwxuststuuttuvyxyyyzyxzzzyxyyxxvwvqnnklkmmkjlnpqttvvuwxyyuwyyyxwxxwwxxwxwxwwwvxwvtuuvvtsstttssssuvwwyzyxxxxwyzzyzyzzz|zyyyxyxwxujdinooswyzz}}||}}|~{z}~}~}~}}}|||}||||}~}}~~}~}~~~}}~~~~~~}}~~~{yw{|{|{{{|||{{zz{zxy{{zzy{|||{zz{|{zxx{|}{|{{yy{|{|}~}~~}}}}}}}}~}|~}~}}}~}}~~~~~~~~~~~~}}}}|||}|z{}|||{~~{|}{{{{z{|{yzzyyyxxxyvxyyxuuvvutvx{{}}~~}}}}}|{|{yxxwvwwwwxxyxxxxxyxxyyxxzzy{{{|}|}}}~~~~~}|~~}}}{}}}}||{yxxyzzzzz{zyy{{{zzzz{zz{{{{{z{z{|{{{|||{{||{zzzz{{zzz{z{{zz{yzyx|zyzyyzywxzyxwtihkoqorusrqtvutrolkokheeeeeefeehhfddedgijkklkkjighhhijjijjmmjjjjkkmnmlotuuwvwwxwxxxywxwwwwwvtwuttuuwxwywwxxwxwwyyyxvxyxvwvrpmkklnojikmqsuvwvuvwwxwwxxxxxxxwvxutvvwwwxwwxwtsstvvrssrsssruvvyzyzyxyywwyzzwxyyyxzyyyyxyyyxulhinnlrwxz||{{|{||{|{|}~~}}~~}}}}||}{{|}||}~~~}|}~~~~}}~}||~~~~~}~zzz{|{{{zzyz{zz{|{zzy{|zyzz{|zzzyyzzzzzzz{zzzzzzzzz|}~~~~~~~~}}~}}}{|}}}}|~~}}}}~}}}}}~}}||||{}{zz{{}{z{{{zywxzzzzz|{zyxyxxwxxxtvxwvvx{{}}~~~~}}}~}~}{z{z{zxyzyxxyzyxxyyyyyyyz{{|z{|}|{~~~~~}}||{{{|~||}|{|{{{zyyzyz{yzzyzyyzzzzyyz{{|{{{{{{{z{{{{|{{||{{{{{zz{z{z{z}}{zz{|yy{z{{zxyyyyywvupigimpquxtrrvvtutpnoqmiefddcdgffhiggggfijiionjhijihhhikiiihjjjkjjjjmmmnqvxwxvvwwxzyxwwxxxxwwvtttttuuwxxxxvvyyzyxxyz{wwywwxusqlkmmlmlkmlnrvxxwwxwvxwxxwxwwwxwwwvwxxxxwvwwvtturtuvsuutttsuvwxxwwxzxyywwz|zzzwyzzzy{zyyzzwurnmoooomquuy|{{}||{|{|}{{~~}}|~~|{|}}}|{|}}~~~~~}~~}}}}~~}~~~~}{{}~{{z{{{|z{z{xyzz|{yyzzyzzz|{z{zz||zzzzzzxzzy{{|~~}~}~}~~~}|}~}~~~~}~}}~~}|}}~}}|||{{||zzyz{|z{|{{zzyz|{z{||zzyyzyyzwwxtuwvuvz||~~~~~~~~~|{z{|{zzzyxxyyyzyyyyxwwzzzz{{z{{{|||}|{|~~~~}||}}}|}|}||||{zzzzzzzz{z{{yzyzzz{{{||}~}{{|{||{{{{{{|{{{z{{{{||z{zzz{{||zzzzzxz{zzyyxxyxxwwwupiihnsqsutprttsssqonpkfcdcdbddecfgeffefgiijpojhjjjkjijkiiiijjjijjkklnnmpuutuwwwyxxyywwxxxxxwwvvvuuutwwwxyyyzy{zwwyyxxyxvvzvtpommlklljlnnqtvvvwwvvwwwxwwwvwwwvwvwzwwwwxxxvsrrtuuttssstssuvwxxxxxz{yxxy{{yyyxxz{zy|z{zwxwuqnopoonpvvutuw{}}}|}}}|||||}}}}~}}{}||||}}}}}~~~~~~~~~~~}~~~}~~}~}~~~~~|z{z||yyzzz{yyyzyxzzzzxxzzzxyz{zzzzyyyxyz{zyz{zzz||~~}~~~~~~~~~}}~~~}}~~~}}}~~}}}|}}}|||}}|||||{{||}|{|{{z{||{{zzz{{z{{{{zzzzy{zwwxuuwvvxzz}}|~~~}z|||{zyyyyyxyz{zzzyyyxyyz{yy{|{{|}}}|}}|}}~~}~}}}||||||||{{z{zzz{{{zzxxzz{|{{}}{}}||{{|{{||{{|{|}{{{|{z|{{{zzzz|{|}{{zz{z{zyyyzywvvvvtpgginsqrtussuusuurpnqlgfdccbbbeeeeefffghjkjnnjkljjkkjkkjjijlljjjlmmnpnlpttuuwwxxwvxyxxyxwvwwvvtuuuuvwxxy{zzzy{{zyyzyzxxsvwsronoomllmkllosuvvvxwuvwxyxwxxwwxwvvvwxwyyzyxwuprttsttrrtsutuvvvxywxyzzxxy{zyyxxyyzyxz|zzwsrqmlllqqonty{zzyy{|{||}}}}~~||~}{{|||{||||}}~|}}}~~~}}}~~~~~~}~~|||}~~~|zz|z{zzzyzz{yyy{{yyz|{zzyyyzxxz{{{{|zy||yxz{ywvz{zz{~~~~}~~~}~~~~~~}}}}~}}||{{|||}~}}}|}|||||{{||{{|{{{{z{{|{{{{{zz{zy{|{{zzyzzyxwxxxvwy|~~~~}~}}~}~~~~}|{zz{zyzy||{yyz{zyyz{{{yz|}|||}}||~~~~}~}~~~{{~||}{|||}}}~{{||zz{yxy{xwx{zz|{y{{|||{{|||z{}|||||{}}|{|}{{{{{zzyz{z{|{{||{{{zz{zyywvwvvungijnrnqwwvstttutvpopkgeecddccedddehihhiklkmmlllkjjjhhhhillkkllklnmmmnlouxxwwwwxwwxwvwxwxxxvusrvvrsvz{x{||zzyyzyyxxxwtvtvvurpommmmmnklkpstuvwwwvvxwxyvuvxxwxwwwy{yyxyzxwwtrststttttsvvvvwwwxvvyy{{zzzyyxxzyyxywyywwrrwvutporprsuvwy{z|||||}||}}}~~}}|~}|~|{|~~}~~~~~}}}~~|}~~~~~~~~~~~z{{||zz{{{zz{{ywyyyyzzzyyyzzywxzzz|{{|{}|{{{{yxwz{{{}~~}}~~~}}~~~}~~~~|}}||||}}~}}}~~}|}}}|}}}}}|{||{{{z{|{{yzzyz{{{zz{{zzyyy{{yxyyzzyz|}~~~~~~~}~|zz{zyyzz{zyz{yyyxyz|{zyz{}}}}}}}}~~~~~~~~~}}}}}}}||}}~}}||||{zzzzzzxvtwxyz{z{|||{{{||||{|{}|||||||}}}||||{zz{{{z{{{{|||{{|{|{ywvvwwvvpgihmqmquwwprttutsponlhedcdebbdeddeheeffiijnokijiijiiigijlkjkkkjkklkjlnpuxxxwxxvvxwvvvvvwxvvvtuvvuuwxzzyz{{zzzzzyxxwxvvuvxwtrmnomnonnmlqvuuwzwwxwwvvxwvvxxxxwwxxxyzxxyyywuttutusrsttuvuvuvwyxxxy{|zzyyyyxy{yyzwyyvqtxzzwupmoppqtvvxyy{||||}|zz|}}}||}}}}||||{{|}~~~~~~~~}}~}}}~~~}~~~}~~~~{{z{zyzzxxxzz{zyxxyyyzyxyyzxxzyzzwz{zz|zyz}{yvxzy{{}}}~~~~}}~~~}}~}}}~~}~}|}}}}~}}}}}~}|}~}|}|{|}|{{|{||{{z|{z{{z{{z{zz|zzyyz{wwyzzzzz|}}}}~~}~~~}~~}}|{zz{zz|{yzy{{zxvwyzyzz}~~|{{}~~}~~~}}~~}{{|{{|}||}|zzzzzyxyyxxyzzz{|{{{||||}}{{{||{{{{zz{|{{||{zz|{{z{||{|||}}{|{{zyxwutvvtmijhmroruusortuurqopqmfdefccecdfeedeeceghijmpljiijkihjjijkjjiiihknlllmnqtuvwxyywxwuvvxyxvvxwvututuuuuyzzyy{{{z{zzzyxwywstuusqnmnnklmmlmqtttvxwwxywuuvvwwwwwvwwxyyyyywyzzwsrsutstsuussuuvuvwwwxy{yyyyy{zyyyxwxwwvuswvvwwvtpnqpppuxxyyyz{|}~}{{}}|||}|||{}}|{{}}~~}~~~~}}}|~~~~~z{|zyzyyxxvwyzyyyyzyyyxyyxyxwyyyzxyyyyzzyyyxxwyyy{|{~}~~}~~}}}}~~}}}}}}}}|}}||}}|~|||}}}~}}}}|{{|}}||}{{}{|~{|{}}{|{{}|zzyz{zxzzyzyxzz{|{}}}{|}~~~}~~~~~~~}}~~}||{y{{z{{{yzz{zyuuxyyzyz|}}|||~~}}~}~~|~~}}}|}|}}}|||{zzzyzyzzzz{yy{{|{{{{|{{|}}}{||{yy{{|{|}|||||{{{z{{|}|{|||}|||zyyywvsquwrmigfmroqssrprttutroqrneeegeedbfgdddccdgiihioqkjijllkjkkjjijjkjijlnoopqrsuvvvuvwwxwvwwwywvvwvuttvuuvwwxwxyzyzz{|{{yywwyvuutsrqolmnnllkjlpsuvuuxwxxvttvxvvwvvvwxxxxyyxyyyzwursttxxtutsusuvuvvvwvvxyyzzy{{{zxxxzxwssvxxzyxwvpmnlnpsvxz|{z||}}}}}}}}~~}|||~}|{{|||}~}~}|}~~~~~~~~~}}~}}~~~~~{{zzz{zzyyzyyxxyyyyxyyxywwxwvxxwyxxyyyyzyyxxyyywz{|{}~}}~~~}}}}}}}}|{|}}}}{{|~}}}}}~|||}}}}~~|}|}||{{{{|{{|{{||{z{|{{{{{|{{zyzzyyxyzyyz{{||~}}}~~~~~|~~~~~~}||||}~|{zz{{zz{|zxyyxxyyzzz{{{|{|~}|}~~~~~~}~~~~~}~|~|{{y{zzyyyz{{{zz{|}}|||||||||}||{zyz|||}|{||{{|||{{{{|{{{{|||||zzyyywrorturmighlsonsuqoqsrtvspqqniedeffdcdeddeefghihijpqkjkjkllkjjjiggkkjijkmnopppsuuvwvwxwxzzyyyyxvuuvvuuutruxxxwxyyyyyy{z{zzwvxwuuttrqoonnnnmkknptvywx{yxwwwvvwwxwxwvwwwxwxxxyyyyxvrtuvvvtttsttuwwwvwxwwyxyyzyyzyyyxxyuqsuwwwyywusnkqronruwy}|{||||}}||~}}~}|||}{|||||}}}}}}~~}~~}}~~~}}~}}~~~~|~xyyyyzz{zy}|zyxxywywwxxxwwxwxxwvwxyyyyyzyyzyyxy{yyyy|}|~~~}~~~}}}|}}}}}}}}||}}~|z{|}~}|}}}|}|}||||}~}||}}{|||||{{|{{||{|{y{yyzyyyxwxyyz{{{~}}~~~~~~}}~~~}}|||{{z{}|{{{zzz{{|{z{yz{||{||}}}}~~}~~~~}~~~~|}~}}}}~}||zzz{zzzyz{{{{|||}||{{||zz|||||zzz|}|||||}~|||{{zz|~|~||}|||||zyzywrmqttspkhhnporxxtosvuvuspnmkhecbeddcbbdeeeefdghikomjijjjiijiiijjgfhiijkmnooqrsuvxxxy{zxxyxxyzzxwxwwttusttuvwxwyzzzyz{z||yxwvuvvvvrrqmklomkjllqtuuvwvwxyuvwvvwwyvvxyxxxxz{yyxyywwuuuvvutsuussuuxxvxxx{{xyyyzyxxxxxwttvxwxzyxxxxtqlnpqqrttwyyy{|}~}|}{{|||}||~}||}}}}}}~~~}}~~}~~}}}}}~~}~~~~}|}}}~~~~~zyxvyz|zyzy{zyyxyxxwwxxyxwwvxwwxyyzyzzyyxzzyyyx{yyzy{}~}}~~}}}~~}}}~}~}~}}}}||}}}}||}}}}|||z||}|||}||||}}{z||||~}|}~}{{|{{{|zyzz{zzyz|{z{{}}~~~~}~~~~~~~~~~}|{z|{{zzzzyx{z|zyz{zyz{~}|{z{{z}~}}}~~~~~~~~~}|{|}}}}{|{z{{zz{{zzz{{|}}|{|||{z|}|}~~||||||{||||}}|{{|{{||~|||z{{|||{{zwpmqvwvojffnqopuytpswwvtsomnpke__bcccddecceefeeffhmmjijkkjihijkjjifhjjkknnoooorvxxzxxxywxyxxyxxwwvvvtstuvstvxxxyyz|yyzzzzyywvvwwutqronmkmmkllmrtvuvvwwwxutuuuwwxvwwyyxxxyyyyyyxwwwwwttuuutuvuwxxyxzzzz{zzzzzyyyyvvswxxxvy{zxy{{vpnlmmnqutwyy{}z||||}|||||}}}~|}}}}{}}}}|||~~}}}}~~|||~~~~~~}|}~~~~~~~zzxyzyxyzz{xyyyxwxxwwwwxzyxxwwvxyyxzzzxyvuvxxvwwvwyyz}~~~~~}~}}}}}}}}~}}~~}}}|||}}}}|}}}}||{{||}}||||{zz{z{{z{{z{||{||||{|z{{||}}{yy{|zy{|}}~~~~}||~~~}~~~~~~~}{z{z{|zz{{yz||{{{{{|}zz{{z{||||}||{}~~~~~~}}~~~}}}|}}||{{~|yx{||{|}||||||||||{|}||||}~}}}||z||}}{||{zz{|z{||||}}|||||z{|xronpstrmkjinqqquwuptxxxvsojlohcbcccabccccdgfeffheglkllkjjkjjkjijihijjikmnmmpsqqtvwwwxwxxxwxxxxxwwwvrrustvruwvxzyz{zxxyyyxyyxxxxwtsqpomllmmmmnnqvywwwwwwvuuwvvvxxyyyzzy{{zyyzxwwwuwwvvwwuuvvvvwxxy{yy{{zzzyxyyxwvwxxyyzyyz{{xyxwsnnnmkiotsv{{zz{z{yyvsyy{{{}~~|||}|}}~~}|}}}~}}~~}~~~~~~~}~}~~}}~~~}yzyyyyyyyyxxzyzwxxxxwxyxyyyxxxxyyxxyxxyxvvwxvvvvvxwy{|~}}~}}||}}||}|}}}}}}||}~}||}}}|||}|||||}|||{||{|{z{z||{{zyyz|{{z{}~}~{{{{z{zzywy{{z{||}~~~}}|}~~~~~~}{{}~{{{|zyyyz||{zz{{||z{{{||||}}}|}}}~~~~~~~~~}}~}|||{|||zz{zzz{}{||{{z|{{||||}}{||}}}}}|{z|}~{{zzy{{{{|{zz|||||}|||{zxtppqtwuommknspquuspuvvxvsrlnmeddddb`aabceeffeefgikpmjkkjkijjjiijjikkihjlmnnqrortuuwxyxxxzzyxxxxxwwusuussuuuvvwwxyzzzyyzyxxxxwwvtsrqrokjmmlllmlptxwxwwwvvuwxwwyyxy{yzyvx{zyxxxxwvsttuvyvuuuuwtuvwxyxxzzyyyxxvssuwxxxzzyyyyyzyzyxtqpliijousruyywvvuuwvvyzz{{||}}}{|||}~}}~~|~}|}~~~~}}|}~~~{z{z{|zxyywyzzyxxxyyxxyyyzyyyyyzzxwwxxzzyyxyzyxyxyzz|}~~~}~}|}~}|}|}}}}||}}}}}}}}}|||{||}|||}|||}{|{{{}|||zz{zzyzzz{|{zz|}~}{{{zzyxyzzzzyz{|}}}}~}|||||}}}~~~~~}}||{{||{{{{zyz{|}{zzzzz{zyy{|}||~~||}}|||~~~~}~~~~}}}}|}|}|{|{{{zyyyz{{}}{{|}{{|||{}}}}~}}~~|{|{z||zzzz{{zzzz{zz||||||||{yywupqrvxupkkinrnqwvrosuwxtromojddccedbabddgegihhgfhloolkkjkkjjiikmlkiiijjkmnorpprsruvw{yvwzyxxzzyywvuvwutuutvvvwwwyyxxyxxyxwwwvvvussqqqnnnnnmlmmpuxwvuvuvvwxzwxyyyyyyzzyyzzzxxxwvwwwuwvvvvttuustuwwwxwxxwyxvuqosuwxxwyyyyxwxxwwwxtpnkjkkmonprvx{yyy{{z{|{z{|{||}}}||~~}}}~~~~~}|}}~~}}~~~~~~}}~}~~}~}~~~~~zx{zzzyxzzxy{zzywxyuvyz{|{zzyywwwuuvvwwxxyyyzyyyyzzz{}}}||~}}|||}}||}|}~}}}|}|||||{{z{||}}{{{{{{{|{|z{{{z{{yz{{zzzyyz{{{zz{|{yzyyzzzz{||~}}~~}z|||}}}~~~}{{{{zz||{{{|{{{zzz{{{zz{|||{z||}}{|{|~~}~~~|||}|~||{{zxzzyyyzzz{}~}|~}}}{|}}|||~~}~||}|||||{z|||}|yz{|||{{}~}}}|{|{zvoprttqohjloqqrwvrqtusttrqmnkddcbbdddefceeefhggffilnmljkklljihjklkjjhikllnpsqpquuvwxyxxyzyvwyywxwxwutstuttvvwxyyyyyywwxwyyxwxwvusrrqpoponlkllnqtvvvvuvwwxxxxxxxxzzzyyzzzxxyzzwvvvvtrswwtuustuvuvwxvvwvwwupsuvwxwwyyzzzz|zyyxwtsqkgghjipttwxz{|{{}|{xyzz|}|~}~}}||}}}}||}}}~}||}|}~}}~~~}}}~~~~~}}~~~{|~~~~~uxzzzyxvxxxzyxyxxxyvvxzzy{zzxxxvuwvvwvwwvyzyzzzxxxzz|~}}~|}|||||}}}}}|}}|}}}~~}|||}|y{}}||{||{||{|}~zyz|zyzz{|{z{{wyyz{{{zz{z{yyzz||{{{~}||}~}~||}|}~~~~~~~}|{{{|{z{{|{|{{{{{zzz|{|{z|}|~||~}}}}|z}~~~~~}|||~~|{{{zzzzzzyzz{z||~}||}}|||||||}}}{{{|}}|||}{{{|~}{|}~}}{|}~}~~~}||uqqpsvrohlpqrrsuwsqtuttssrnongeddegeefedfhffhhhhhinplkkjijjkjiiiijkjjkkkkmprqpptuwyxxyzzzyxwwxwwxwvwvutuuuuvxxzzxyywvwxxxxxxwwvutsnnmnpomnmnllpvyvwwvwxzxxyxxwxyzyz{{zzyzzzz{yxwwvttsuvtuusuvwvwyzvvwwursvyxwz{xxzz{zzxxwwusstvsnkllonswvxy{{|{||}{z{|{|||}||~}}}~~||}~}}}||}}}~~~}~~}}|}}}~~~~}}}}~yxzzzzyzzz|zyzyzzyzyxyyxyyywwwxxxwwvuvwvtwyxxxwxwyzzz}~~~~}}~}}}}}}|}}||||||}~}}}}}}|}}}}{|}|||zyz|{zzz||{zz}}zz{zzyzzzzzxyyzxyzzyz{|{{{|}}|}~{yz{|||~}~~}|{{zzz{z{{z{|{{|{|{|}|||{|}~~}~}}}}~~~~~|~~}{}}}}|z{{{|{zzz{|zyzzy{|}~}||~}||||}}}|||}||||}{{|{|}{~|}}}|~~}~~|{|{zzzwrpprsrojijnspruutuvvuuutqlmlceddddeddfeegggggfiihnolllljiijijljjjjkijllkjnqqoqtuvwwxxyxxyyyxx{xwxxvvvutttvwxyy{xwzzz{zyyyyxyzwx{uqrqnoponnlloptxwvwwwwwxyzxxyyyyz{zzzzzyzzzyxwwvtssuvwuuvuvvxwxwxwxxwruxyyxwxxuuvonprutswyxwzxrppsqpqrv{{{{||||{||{||{}||~~~}~~~~}}}~}||~~}~~~~~}~~}}~~~~~~~~~wxyzzyyzz{{zyzzyzzzzwwwyxxxxxxwwxwxvtwyxwwxyyzxyyxz{{~~~~~~~}}}}||}|||||||||}|||}}}}}{{}}|}|{||{yz{{{{{|{zz{{{{{zzyz{zyyyyyyyyyz{{{|}}}~~~~}~}yy|zyz{}~~}|~}}}}|{{zz{z{{z{z{zyzzzzz{{|{{|}~~}||}}}|}~~}}~}}~|{|{{{{{{zxyyzzzyzz{{{{|~}|{||{{{||||}||}}||{||{||||}z|{{{{z|}}}}~}||{zzwtsrrrrpjijnsppttstuwtutrnlnlfdbbffcceeeefffgghijjmmklklkijkkkkkjjjkihkllmoopoquvvvwxyxxxyyyyyyxxzxwuuvwvwwyyxwzxvxxxxyyyywwvwwvwtopmiknnmmlloqsuwvwwwwxxyzxxyyxyzzxyyzzxyyyyxwwutuuuwuuutuvwxwyxxx{yuouutvrrssrtvtuxxzzy|zywwwsrrqnpqruvxzyz}}}||{z|}|}}|}~}~||}}|}~}}|}}||}}}}}~~}}}~~}~~~~}~~~~~swyzzyzyz{|{yxwyzxyyyxyzyxxxxxwwxwxwwxywwwwxyyz{zxyyz~~~~~~}}|}}|z{|{{{|}||}||}{{}}}|||~}|||{{||xy{z{}{||{{{{z{zzzzzzxyyyyyxyyxz{|||~~~|{{{{z{{{}}~~}~~~~~}|||||{{{{{{|{z}zyyyzzyz{|z}}}}~~|||}||z|}~~~~~~~}}}}}|z{{{{zzyxxxyxyzz{zzz{{{}|||||{zz|{||z{{{~||}~||||||z{{{{{z{}}|{}~{zyzzvstttvtokjlouqpssrrvvssrrommlgc`adeceddfgigghiiiiipolljkjijjkjiiijkjihfiklnopoquwxzyyyxxxxxyxwxxxxwvurvxvuvxyyxxwyyzyxyyzxwvwwvstroppmmlnkkmloquvvwwvvwyxyyyyyyzzzyyzzzxyzyyzywxutuvuwuuutstvwxyyxx{|wrqrrvuvwxy{zyyzzyyz|ywwxyvromhnqsvvxyzz}|}}{||}~||~}~}|||}}}||~}}}~}}~}}~}~~}}}~~}~~}~}~~~~~~}yz{zzyz{zz{yxyxxyyyyzzzxyxyywvxwwvuwxwwwwxwxzywxyyzz{~~}}~}}|||||||{||}}}~}~}}}||||}}}}|~~}{zy{|{z{|{{z{{{zzz||zxwxzzyzzz{zzzyxyzzz{|~~~~~~~|{|||||||{}}~~~~~~~}}||}|||{{{{z{}{zzzy{|~}||}}||}~~}}}}~~~~~|{~~~~~~|z{{{zyyyyxxutwxwwvxy{zz{{{{{|||~~~{z|{||{{{{|}}|||{z{zyxz{|}|{{|}}|}}{{zy{xtusuuvokjlorqptvusvwvtsrqmmnjgedfeceffedfgggghhijnolonkjijlkiiijjjjjjjjlnpqqnovwwxyxxyyxxxy{yxvwxvturqsssvwwxwvwzzyxyxyyxzzxxutusrqolkkmlnoooquwxxwxwxzywxxyyzzz{zz{{{{zzyzyxwwvuutttuuuuvvvvwwxxxzz{z{zyyzzzxy{zyyzzzy{zxyyywtmmlorrruwzz|~~||z|}||||}~~}}}}}}}|~}}}}}~~~~}~~}{}~~}~~~yyzzyxxxyyyyzzwwvxyxyxxwyxwxxxyzxyxwxxyyyxwvxxvx{{zy{~~~}~}}}}|}|||}~}|}}}|}}}}}}|||}}}||}|||||}|{{{z{{||{zzz{{zzzzzz{yz{|{yy{zxy{|||~}}~~}}}}|{||||}}~}~~~|{|}||{{zyxyz{|{z{{z{|}}}}}}}}}}~|}~|}~~~~~~~}}||{|zyyyyywwwutuvvvvxxz|zyzzzz||}|}}{{||}~|||{||}}||{z|zywzzz||{||{||}|{{||zwrstuusoiijntrptwusvxwwusqmoniheeeefeffffcddegghhjopmoomjjkkjiijhikjjjlmmopoqqrwwxyzxyzzy{zyyyxxxyxvusqqstwxxyxyyzzxxwwxxxxxxxutvsrrpkfjmnnmmmpsuw{yxyz{zzyxx{|z{|{zzz|{zz{{{yx{xvttwvuuvvwwwwxyxxyz{yx{{{||}}zz{zzxxz{zzzyyzzvrnnmprrtvwz|}~~}|}{{{|z{~}~~~}~~}|~~~|~~~}~~~~}~~~}~|~~~wx{yyyyzzzzz}|zyy{{zzzz|yxxwwxy{yxywxwwxxwwwwvwxzyyy{}~~~~~~|||}~|{|||{||~}}}}}~}}}}}}}|}|~~||}~|{|{zzz}}|{zz{{zywxzz{{zz{{{zz{{|~~}}~}}~}}|{{{{||z{|}~}~}{}~~~}|{|}|z{{{|{x{||}}|||||}}}{|}|}}||{}}}|}}}~~~~~~|{{|{yz{zyyyxxxwwxxwuvwxxyyxx{~|{{||||{|||}|z|}|{||{z{|{zyxy{{{{||||}}|||{|{yxvsrtwxtojhjntsruvsrvyzwtsqmpqkigedeefeffgfghikigikqrmklllkkjkjiiiilljjlnmnlorqrwwxyz{zyyyzz{zyyyxxvuutvsquwxyyxxyyyxxxxxxwwxx{ywvtqnmljlnmnmnoquvwyxyzzzzzxyxzzyz|~|{z{{{|{zzzyzxvvvvvvvvwwvvwwy{zx{{yy{{{{~}||{zzyyxz{yzxyzzyusqpqpmmrvwyy|~}|{|{z}~||}}}}~}~}}~~~~~}|~}~}}}~}~}~~~}~}~~~tvzyxyy{{zy{|{yyz{yyzzz{yxxxwxyzzzyyxxwwxwuuuxuuyyxz|~~~~}}||}}|{||||{|~}||||||}|||||}|||||z{{||||{{z{{{{zzz{zyyzxzzzzyz{zyx{}~~}~~|||||{{{{zzz{}}}}}~~}}~~}~}}}}|{{}|{zzz{|}z{||{{|||}}}|||}}~~||}~}}|{|||}|{{{{zyzz{zxxwxwvvwwvuwywwxxy}|{{{|{{{||||||{z|}}|}}zz{|{{{{{{z{||}||}~}{}}{{zxwwtrvyupigiouqpuvtsuyzvvvtoppkjjieaafecdeffhhjihklqqkijkklljjikkkkmnlklnmmllnopvvvxyzzyz{zyzzyyyxywvuuwuqtwwxyywxyyyyyxwxwvwuvxwvtrqqonlnnmnnqrttvyxyyzzzzzzz{{}|{||{{zzzz{{yywwyvvyxxyvtuvuvvvxyzzzz|}||{|}|}|z{|}zy{|z{{{{yxwsqonmqqruwz{{|||{{{|}}||}}}}}||}~}}~~~}~}}~~~~~~~~}}~~~~~uyzzwxy{zxuxxxyyxyyxxzyyyxvvvxxxxyxwyxxwvvwwwxwwxy{||~~~~~~~~}|}~}|}||||{||{{||}}}|{z|}}}}~~}|{|{z{z{{{zz{{{yz{{{z{{yxyyyyywy{}~~}}||}zz{|yy{||}}}~~~~~~}}}}}||}}}||~{{z{|{{|z|||z{|||}~}}}}}}|}}|}~}z{||{{|{{|zzyxxzyyywusssutttvvuvyzzyy{|||{||}|{|}|{{{||}}|z||{{{{{{|{}~|}}}|||}}||}{xvtuuvwuoiglqwtsvyvttvwwwvsmmoiggggecefdefhhhgihghkqrmlkkjlkjjekmmmmlklmnnklnooqvvwxyzzyy{{yz|zyxwwxvuuuutuwxxyyyyyzzzzxvwyzyvuxxvtrnpqpnmmnonnosuxzyzyyyzyzzzz|}{yz{{{{zzz|{yxwwxvuvuwwvttuvuuxyxzzy{||z{{zz||{zy{|zzy{z{{|{zxxsmknopqtuwz||{{z||z{z{|}~~|}~}}}~~}}}}}}~}~~~~~~~}|}}}~~~~~~yyyz{yz|z{yxyzxwxyyyxxyxzyyyyy{z{{yy{zyxuwwzzxxz{yz||~~}|~~}}}}|}|{}|}~{|}|||||}|~~|||}||}||~}|{{||||{z{|{z{}zyzz{yxxyyxyyyzz|~~~~~~}~}|}zxz{}zy{{||}~~|~~}~~}~}}~}||}|{{||{{z{|{{{{|}}~~}|||}}}|||}|}|||}}|z{|||{y{|zyyyyxxywvuutssssrstqpuxxy{{z|}||||~}|||}}}}}}}}|{}||{{||z{z{|~}}}|}}}{||z{{vrrswxuphhlourrtvusuuvtstrnmnkigfefeghkmnmjiffgiikpqnklmllkkkjlmlljkklmllmmopprvxxxxzyzzzzy{{zzyyyzxwvvvtvxxxzzyywyyyzxxwyyyxxxwusrnnnnmmklllmpsvyyxyxyyzzzzzz{zyzzyz{{{zz{{{zzzxwwwvwwvtuvwxxyyz{zz{||z{{|{}}|{{{{|{z{|{|{zyxvqopsrprsvvy{}|{||}}||{}}}~|}}}~~}~}}}}}~~~}}}~~~}~~~~~~~~}~~{zyz{yz{yzyyz{ywx{|{xxyxxyyxyyyyyyxxxyxxwwvwxxyyyzz|}~~~~~~}}}|}}|||}|{||}}{{}}}~~|}}||||{||}}||}}|{{{}{yz{zz{z{|zyxzyxyzxzz|~}~~~~~}}}||{z{}|zz{|||}~~~~~~~~~~~~}|||||||{{{|{zzyy{}|||{{||{}}~~|}~|z{z|}||z{{zzzyz{yyxxwwwxwvvwvtsrrssrqtwwwz||z|}||||}}}}}~}|{|}||||}}|{{{{zzxy{|{|}||||{z{zzywsssvvtojkkpssqrttttuuttqrpnpligffgffhilpokiihfhjmttolllllkilmmmmlkllmllnmnprqrvwwwzzyzyzyyy{yyyxwzxvvwutvyyyzzy{yyyyyyyyyxzzxxwuuurommlllnmnnqvyyxxyyzyz{zyyzzzzzzzz|zzzzzzz{yywvuxwvwvuwwwyxwxzzzz{z{z{|{{||{zzzzz{zzyz{|{yxxrqqpnmrrvwxy|}zz|||||{{}~||}}}}}|~~~~~}}~}~}}}~~~~~~}}~~~yxwwxzyyxtvyzyxywxyzxxxxyyzzxvyyxyxxxyxwwxvxyyyzxyzy|~~~~~~}}}~}}}||||{|{{||}||||}}}z{{||}|z|||}{{zy{|{z{{|{{{{|zzy{{yyyyyz{~}}~~~~~||}}{||{||{||zy{{||}~}~~~}}}|||}{{zz{zy{zzzzzzzy{z{}}|||||||{yyz{zzzxzzz{{zywwxxvwvvutuuuwsrrqrrrsvvwxxz{xz{{{|}|}|}|}||{}}}|||}||{|{{{xy{}|zz{{{{{{{|zz|wtrsvttrnlloqrprrttuussutqllkigfedecegghkmkjhijikmqrollklkjhjkkkmmlmkkmlmmnppppuwxwyyxyzyxxxyywxyywtsussrrwxwxxxxxyxyyyzz{zzy{yyvturppomllmnmmpuyyxyzzyzzz{zy||zzzz{yyzzzyyxxzwwwwwxyyxuvuwwwvxxyzyyz{{{{{{{||||{{{|{{{zzz|{zyvtsqsspqsuuwyy{zz{{z{|}|||}~}}~}||}}}~}||}~~~~~}}~~~}~~~~~~~}~~~~wwutuwwyyvwyyxwyxwvxwwwwwxxywuxxxyxwyyxxwvvxyxyyzzzz}~~||~~~}~}|{|||}||||||{{{{}}}{|}||{{{{}||{{|zzz{yyzzz{zyzzz{z{yyxyzzzyz{{z|}|}~~~~~~}|||{{{{||zz{||}}~~~~~}}}|{{{{{yyzzzzzzyyyyyxzz{}}}|}~~~}||{zzzzywyzyxyxyxxyxvxwuttttssrrrrsrrtuwvvwxyxyzzz{||||||||}}|{||||}|{{z{{{z{zzzzz{zzzz{zzyyzwsttuttrojhnssrrsurstrsutqlljjhfc`dccffhjmmkjijljkopmklllkkjkkjjkljkkhkklmopopqvxxxz|zz{zzyyzywwxxvtturtrrvxxz{yxxzzyyzy{~{yxywwvsrqppnllnnmklpuwxz|zzz{{{{{zz{{{{z{zyyzzz~zyzyyxwwwvwvuvvtvvwxxyxxxyz{{{{{|}~||||||{}|{{|}{zyxurrrrrrtvvyyz{z||{|||}|{}}|}||}}}}}}~~}|}~~~~~~~}~}~}~}~}}}~~~~~~~~~zxwwwvvxwuvwxxvwvvvvvwwxxwyzxxvtvwwxyzxwwvvyxxxxyyz|}~~}|}~}|}}|{|}|}}|{|}}|}||{|}}~}|}|||{{||{|}{z|{yz{zzzzyyzz{zzzyyyyz{yyzzzzz{|}~~~~}||{{|{{{||||||}~~~~~~~~}}|}{yz{zy{zz{zzyy{zzyzzz{{{z{|~~~~|{{zzzyxy|{yyyzyyywwwwvuusttusrsttsrrtuttuvvxyzz{z{{|}||||||}|{{|}}|zzz{|zzzyxzzzz{zzwwxyz|{xtttuvtqlhjpvvrsutqtttusrplkkicdabb^_cfiknokjjikjjnqmkjjllkkkkkkkkjjlllmnnprrqrvxwwxyzxxxyzyzyyyyxwwvvssrswxx{|zyx{{yyzzz{zyyzxwvtronomknommklquwxz{z{z||{{zxzyzzzzzzzzzz{||zyyyxwxxuuvuwvtwwxxxyyyyz{{{{{{|}}{z{|{|{||{{}}{zyzwpljkoprtuxzxz{|}~}||~}}}~}}|}}}}}~~~~~~~~~~~~~~~~~~~~}~{yxyyxyywxyzxywxwwwxywwwwxxxwvwwxwuuwwxyzxwxwxwwwxzz|~~~}~}||||}||||||||}||||{~}}~}}~}}}|}}|||}}||||{{{{{zzyz|}{zzyyyyxxvw{{zzz|}}}~~~~~~~}~~|||||{}}}~}|yz}|}~~|}}~~~|||zz{|{|zzzz{zxxyzzzyxz{z|{|{|||||{z|}z{yyzz{{zzxxywvvuvuttsttutvvvtsttsutttvvvwxxzz{z{{||{|}|{|||||}}}}||{zzzzyy{zyyzwvwyy{xywtstuvtronmpvursvtstvuwstrnliefhmmliedgkljjhijjklknpmmlkkkjlmmlkkkkkmmllmmoronswwwyxyzyxxxwyxxz{xwvuuuvusrvvwzzyxxyzxxxw{{yyxwuvwuqopponnnmnnnquwxwyyzz{yyz}|z{{{zzzyy{yxzzxxzzyyxwvvvvwwvwwwwxxyz{{|}~|{{|{{{|||||}{{{{{{|{zzzuomlnnpruuxxxy{{}~}}~}}~|}}}|}~}}~~~~~~~}}}}}~~~~}~~~~~~~~~~~~~~~|yyxxwxxwxyyvwwxvwxwvvxwvwwwvwxxwvvwwxxy{zyyxwwxyz{z|~~}}}}}}}}||{|z{||||}~}}}}||{||||~~|||}|{|||{{{|}{{z{|}|zzzywyyxxx{zyxyz|}~~~~~~~}}~}|{{}||||}}{z{{|}}~~~}}~~~}}|||z{|{{zzzzzzzz{{zz{{|{|||{|{|}~|{zzz{xxxxyyx{{ywxxvtuuuustsrsssssttsuutvvtsuvuvuswyyzz{|||{{|{|}||||~}|{}|{yyz{z{zyyyxxxywyvxwvvttttsmooquspqstrsttutsqnmjrwz}}}|ufgkmljijjkikknpnmlliihlllkklljjjlkmnmoqonrwvwxxyzyyyyyzyxzyxwvtuuvurrvwvxyxyy{yxyyxz{zyxxwwvtrononllnnpporuxyyz{{|{{{|}{yzzzzzzz{yyyzzyz{|{yxxwvvuvvtuwwvxxyzzz{}}{{{{{{{{{||{}|{||||}{yxyvrplmmorvvxxyyz{{||}~}}~~~}}}~~~~~~}~~~~~~}~~~~~|~~~~~~}~yzyyyyxxwvwwxwxxxwwxuvwuwxvvxxxxwxwxxwwwwwwwxwwxy||{}~~~~~}~}}|}|||}{|}|}}}}||||}}||}}|||}~||{{||{{{||{|}|{zxxxwvwwvtuuvwvwwxz|}~~~~}~~}{z|||z{{z{{{||z|}}~~~~~}~}|||z{{zywy{{{yyzyyywz{|{|||}||{|}}|yxyyyyxyxxyzyyywwxvvuuusrrrrqpqssttvsttsrsuvvwxyz{{zz{{{{{{}||}}||||||{{zxwz{{zz{zyzywuuuvwwwutsvutpnknuytstusnsututqpljijhhd^^`_`fklllkkljhijmnlklnmkijijlkknlkkllllnpnorv{zwwxxyzyzyyyyyyyxxwtusttstvwwyzzy{{{z{zyyy{zxwxxursqppoomnoomoqtwyzyz{||{{{{|{z{{zz{z{zz{zz{{zyyyxxwwxzxvvwxxxxyz{zz{{||||{{||{||{{||{{{||z{zyxuturnnqqux{~{z{{{||}~~}~~~~~~~~~}}}~~~~~~~~~~~~~~~}~~~zzzzyxxxwvuwxwxwwxvvvvvvxywwyxxwwvwzxwxxwwwwvuuvxzzzz}~~}}}~~|{{||{{{{z{|{{{}|{||zz|}}}}|}}{{{{||{{|}|||z{{yxxvwuutqpsrruuvwzy{|}}~~~~~|}~}|||||z{|||}|{{z{|}}}~~~~}}~~~}|{{{{zyxyyzzxxxwwyxyy||{z|}}~}}||{zyzyxwwwwwwywwxvwwuusqssprsutsststtvuutsrtvvvwwyz}|{{||zz|{}}|~~|{||}}|{{zzzzzzzz{{|xuttuvwvvvutuuurkhjqvssuutptuuuupplihfa\[Z\``afjjjkkkjkiijmllklmlkikmlkkkllklljllmooppuz{yxxz{zzyxyzzzyzxwwuvrsutsvwwyxyyyyyxyxyyxxxwwwutqsqnommlmlmlosuvvwwyzzzy{|{{{{{{{{{{|zyxz{{{zzzxwxvwxwwvwxvxxyyyzzz{{{|||||||||{yz{|}||||{zzywsrqppprrvy{|{{|{|||}}~~~}~~~}}}}}~~~}|~~~~}~~~~~~~~~~}}}~~~~~y{yyzxxyxwvxyyxxzxxvuwxwutuvxvvwxuvzzwwwwwwyusvwxxywy}~~}~~~|||}}{{{|{{|zzz{|{{zz{{{}}}|{|||{{{{z{}||zzzz{yxwvutttpnorqpruvxyz{}}~~~~~~}}~}~}|||{{|||}|{zz{}}~~~}|}}{{{{{{{{zz|{zzyyyzzzzxz{}||}}~}||{{{zzxvuuwzzyyyxxxxwvvusvwvtsvwuuuuvvwvwvwzwwwuuxzy{|{{{{z{{|}~|}}}}||}}|zyzzzzzyyyy|ywutvvvvwxuuvuwtlhiputstuspwwvvvsrlkie`^_aafgfjmmmnkklkiiknnnllmmkhlnmlkkklllmmmnnoppquxyyxxz|zyyyz{zyzzxwvtssututvxxyxxyyyxxxxyxwwwxxvtutsqkmlikllnmotwxyyyzyz{{{{yzz{{{|{z{|{{{|{zyzyyxwxwwwwvvxxwwwyzzyy{{{{||||||}}}||{|}}}||}||{yusronrqstwyy{}}{|{||~}}|~~~~~~~~~}~~~~}|}}}~~~~~~~~}~~}}~~~~}~~~~|{yz{z{yxzyyzzzzyyyyywwxutwxvvuwxwxwx{yxwwxwvwxwxywy{~~~}|||||}|{||}||||{{|{{|}~}}}{{||||||{{{{{{zz{{z|{yxuttsrrnorrpoprruyz||}~~~~~~~}}~}}|||{{z{||{yz|}~~~~~~~~~~~}}||{|zz{{{{zyyzz{{|{yy{{{{z|}||{{yz{yxwwvwwxwyxxwvtvxzyvvwvvutuvvtuuvuvtvwwxwxxxxy|zy{{{{|{zx{}|||}|}}|{{}}{{{zzz{zzzyzyxwwxwuuwxvvvvvtnilrtuqorsrwyyvxwsnmmigeggeikmmpoooponmmjinnkkklmlkklmkjklllkhkloopsssvxwxxyyzyywxzzzz}~|ywutuusprvxxy{yxxzywvwxxxwwxwvttrqqonmljkmnnosvz{yz{{{||z{{zyy||zxz||{{{}|{yzzyyyxxwvxwvwwwwwwyxxzz{{|{{{zz|}{{||||||}}|{{{{zvsnmooqttwyz||}}~~~~}~~~~~~}}~~}~}~~~~~~~~~~~~}}~~~~~~~~~~}~~{{{{|{z{{zyyxvxyxxyyywwwwvvutuuwwyxvxyyyxxyxwvvxyyxx|~~~~}}~~~}}}~}}}}}}|||}|{|||}|{{|||}|{{{{z{||{zzzzzzyxtrsrsrqqsrponrruyz{||}~}}~~}}~}~}|}{{{{|{zwy{}}~}~~}}~~~~~~}|{{{{{zzzz||yyzzzz{zz{{{||{}|{|}}}|{zyxwwvvvwwvvustvvwxuuuttsssrrrstttusuuvwwvwyyzzyzzzz{|zwvz|||~}}}}||||~||{zyzzyzzzyywwwwvvvwwwvwwwtnmpssrqtsswxyxusqnnmjjijjikknpqrrnmlljlkjpqlkkjkkkkjmkkiklkkjllnoppqquvxzxyzzzzyzyz{|{{ywwvvutppruvwvzyxwyyxxxzz{yxwwvtttqponnmlmnpqorvzzyz{{{{{{||{{{|}|{{||{{{{{{z{{zyxyxvvywvvwwxxvxyyyz{{|{{zyz{}zxyz||}|||{{}{|{xtomoqpstx{{||~}~~|}}~~~~}}}}~~}}~~~}~~~~~~~~~~~}|}~~~~~~~~|}~~~xy{yxxyyyyxy{|z{{yzyxwyxxxxvvvwwvwwxwvvvvwyzxwwyyyyz{~~~}}}~~~~}}}~}}}|{|{|}}||||}|{||||||{yzzzzz{}{zzzyzzyzwsrtsrqqqooqqssuwz{}||~~~~}}||}{{z{{{{|{|{|~~}}~}~}~}|~~~~}~~~~~}z{|{{zz{{{zzzzyz|{z{{||{{|}~{|~{{zxwwvwvvvvwvuvuwvuvvtutsstttrruutstvwvuvvxwwwwxyxxwwvxyxvvyz}}~~~}|~~}|}|{zyz{zzzyyzyxwuvvuwwwxyyxxyzwttttsrtqqw{xuutqpppnkllmlllmoopqomnniilmpmlmmlmlmlklmnmlmlljklnpnmprtwxzyyzzyyzyzy{zyzyyyvuuutvwwwxwxyyyyyzyzzyzxxwxvtstpnnnnmloopsqtwxyy|z{zz{|{|{|}~|}zz|||{|{{{{{{{zyxwxxxwvwxwxvvuyyyyzzyz~|{|{{|{|||}||{{|||{zyxvsqqrsvwy{{|||||}}}}}~~~}}}}}}~}}~~}~~~~}~~~~~~}~~}~~~~~~~~~~~~~}}~yyzywwyywy{{|}}{{yzzywwxutuvwwvvvxxyxxxxxyxxzzyzzyxy{~~}~~}~~~}|~~}~}|||||}}}|~}||||z{{|{{{z{{{z{{{zzxxyyywtrsttsrrrqrruvwxz{|}~~~~~~~~}}}}||zz{|{||||{z{|}}}}~}}}}}}~~~~~~~}}}||{|{z{{{|}{z{zzz{z{{{{|||{}~{{||zyywwwuvvvvwvuvwwxwvwvstttuusrqsvusrtuvuutvxwwxwwwxvsuvuwxvuxz}}}~}}~~|}}|{xy{{{zzyyzxxxwvwwvvuwxywxy{yvuwwusuqry|zvutsooqojnoppqqqqpqrqnllkkkmoollklmmmlkmnlkllllklnmnooopsxyzyyzzzz{{zzyzyxxwvvvvuutvxvwwxxxzyyzzyyyyxxwwvvsqononmnlnoqssuwxxxz{{z{{zy{|}}|{}{{z{zz{zz{{|{{{xuwwwwwuwxyxxxwz{{zzzyzzzz{z{{|}|{{||zy{yz|zzwvusrtuwyy{|{||}}|}}}||}~}}~}}~}}~~~~}}~~}~}~~~~~~~~~~~~~~~~~~}}}}~~}}~vxz{xxwxwyzyzz{yzzyzxwxyvtvwwwwwvxwvxwvxxxwxzyyxwyyy|~~~~~}}~~~}}}}|}||}|}}}|||}|||}{|}}}z{||{{{z{|zzz{|zzxvwywvtrsvutsutrtuvxzz{|}~~~~~~~~~}}}}}~~}|zz{|}~||||{|}~}}~~}~}~}}~~~}~~~~~~}}~}|{{{z{z{|{|~zxzz{{zz{z{{{{{|||{y|}{xxwwvvvvvwwvvvwwwvvvuuuutwwusstutsssstuuuvwvvyyxvwyvwtsvwwvvxz{|~}}}|}||{yyzz|{xyyyxxxxwwxwvuvwyyzyxzwuuwusutry{zutwwppspnprqrrqqrrturpopnmmnrrmlmlkkkkkkklkkkkkkmpnnprnnqw{z{|z{z{z{zzyzzxxvwuwwvvsvwwvxyyy{yyzzyxwyyy{ywutqqpoommlmmnrqtvxyz{zz{{{{z{{{{z{{{{{||z{|{{|}}{{zyzxwwwwwwxxwxxyyyzzz{{|{{{z{{|}}{|}}zyzz|zyyywuvvvuxyz||}|}~}}}~}}}~~~~~~~~~~}}~~~~~~~~~}}~~~~}~~~}}}z}~}{{}~~||}}zzyzyxvwyxyxyzzyyzzyxvxzxxxxyxwxwwwvuvuvwxwvwxwxyxyz{~~~~~}~}}}}}{|}}||}}|}||}}}|||||}|z{{{{{zzzz{|{{yyxxxxxxvtttutuutrstwwwz||}}}}}~~~~~}~~~~}}}}||z{{z{|{{|{{|}~}}~~~}}}}}||}~~}|~~}}}~|}||||||{{|zyzyyzzyz{{z{{||{||{{z{zywvvuuusvustvvxxuvuuuttuttuutsuwvvussstuuvvuuuwxxwxzzxuuvuvvuwyy||||~~}|}|{|yvwuvxyxwz{yxwwvvvvuvxyyyz{yxvwsqwusxxwuuxvporrppqqqppruwuvtsqnminorqmlkkmjjkkllkllkjjkkmmoosrqtxzz{z{{{{{zyz{{yyzywvvxuttuyywxyzz|{|{|{zyzyzzzxwtsroomllkkkppotvxyzz{z{|||{{{{z{{{{||||{{||}|}|{{zyyyxxxvvwxwwyyyyzz{}{{{{{{{{{{{{{{||||}{{zz{zxvvvwxyz{{}|}}~~~}~~~~~~~~~~~~|}}~~~||}~~||~~~~~~~~~}~}|~~{}{|~{zz{yyyxyxyyy{{yyyzzyzyyxyxxyxwwwwvvxwvvvvwwxy{|zy{z{~~~~}~~~}}}||}}}|~~}}~}}~~||||||{{{{{|{z{|||}}{{zyxwwvwwwxwvuvywvuvvwxy{|}}}}}~~~~~~~}}~~|||||{{{z{{{z|~~~}}}}}|}||}}||~~||}}~~}~}}}~|||{{{|{zz{zzyyz{zzz{{|{{{z|{zyxutuurttvxwwwwyzwwuvusuuttuuttttuuurrtutuuvvvvxwwwx{yzxxwvvwuuwy||~}|}}|||||{yxyytwyyxz{{zxwtvwwusuwy{{{zzxwtptuty{xvxxunotqqpmoqrsrrssutrqnnlnprpmlljllkklllkklliijjnnmnqsrtwxz|zyz{z{zzzzzyyyzzwvwstwtwyyxxz{|{{{{yzzzzyvwywtuurommnnmnppnrvyyz|{{||{{|zy{{{zz||||{|{||}|{{|{{zyywwwwvvxzwwwyyyyyzzz{zz{{z{{{|||||}|||{{{|yyxwxxyzz{}||}}}~}}~~~~~}}~~}~}}~|}}}~~~~~~~~~~~~|}~~}}}~}}|}~|}}|yyzyyyzzyxyzyyyyyyxvxzxswyzywvxxvvwxxvvwyyxxyzyxy{xz~~~}}~~~~~~}}}}~~}}}}~~~}}}}}}~~{{|}}{{{{||{{{||zz{}|yw{zz{yzyxxxwvwvvwy|~~|}~~~~}~~~~}}}{{|{{{zyzz{|||||||{|}||||}||}}|}||}~~}~~~|{zy{|{zzzzzyyyxz{z{|z{{z{zzz{zxwtqpsuvwxwwyzzzzyxwtvvrsuwvutttstttsrttsstssrqtwvuwvy{{|yvvsruuwx{{}}}|||{|zy{z{{zzwvyyxxxwwvvwxwwwwvwxwyzywwtswvuxyyzzwwpprqpomnnqrrsstsrpooomlnspmlkillkllllkjkkkkkmmnonprsuwxz{}{{}|zzyyyyxwwwxvtttsuvxxwxyz{zzzyyzzzzyxwvwvuutrpmmkknmmmosvwxyyy{{{{{{{|{||{{{{||||{{{{|{{|{zzyyxwxwvy{zxxxzzzzz{{}{{{{{zz{|{{{z|}|||{|||zzxyy{}z{~~}}~}|}~}~~~~~~~~~}}~~~~~~~~~}~~~~~|}}~~~}~~~}~~~~}}~~~~~~}}xxzzzxxyyxyvxzzyyzyxwwxvsvwxwvvwvvwwvvtuzxuutvuuwz}z|~~~~~}~~~~~~}|}}}}|~}||}}}~}}}}}|}|||{||||{|}|{{{{|||{{{|}{z{{z|{z{zyyxwxxyz|}~~~~~~~}~~~~}~~~~}}|{{{{{{yyzyzz{{{{||||{}|||}}{}~|{|||}|||{{{z{z{{z{yzzzyyyyz{zzzzz{yyxyyyxwwvuvvwxvvvxzzyyyyywwxwvuvwussssuutstsssssrsssstuvvvwz{zyxwxwvutttx{||}}|}||{zyyzyz{{vwxxwvvwvuwvvwvwwwwxxwwwvuswvtwxy{zxvnlrrqpmnortstsuuurqponmnrpnlmlklllllllkkklkknmmpprttuvy{zz{{||{zyzyyywwwwututtvuxwwxyzzyz{zz{yxyzyywwvvwtusmlljmnmloswzyyyy{z{|{||||||{{{z{||{{{{zz{zzzyyxxwwwvvxzyxzyzyz||}}}|{{||{z{|{|}|}}}~||}}{yxwwx|}{{}~}||}|~~~~~~~}~~~~}~~~}}}}~~~~}~~}}~}~}~}~~~}}~~~~~~~xyyzzzz|{zyyz{ywxzzzy{zywwxzxwxwvutvwwuvywuvvvuuwxzz|~~~~~~~~~}}~}}~}}~~~}~}~}}}}||{zz{|||{{|||||{||}|||{{{{{{z{z{{{zyxxyzz{|{}}}}}~~~~~~}}}~~~}}}}~|{{zyyzzyy||{z{{{yz{z{{|}{{{{{{{{|{{{{zz{{{{{|{y{{zzyxyzzz{z{||zzyyyzyywxyxwvutuuwzzyzz{{yxwvwvutttttsuvutssutsrsutssuuvxwxwyyyyxyzxwvvvxy{{|}}}|{{yxxxxxwxwwxwwvuwvuvvvvvvwwxyyxxzywtvvvxyxyzwwpnrrqpmoqqstuvvvtqpononnqtqmnnmmlllmkklkjijlnmmqpqttuuxyyyyyyzzzyyyzyywxwwvvtuvvxwxyzyzzzyy{yyyyzy{xxvwwttrmlmklmnnptxyzzz{{z{{{{|{z{|{|{zz{{z|{{{yzzzzyxvwwxxvuwyxxzyyyy{||{{{{{|~||{{zz|}}~}}}|{}{yvuxy{~||}~}~~}~~~~~~}}~~~~~}}}}}}}~~~~~~~}~~~}}~}}~~~~~~~~~}|zzz{yzzyxwxxyyxxyyz{yyzxwwvuwwwvvwwwwwwyxwvuuvtvww}~~~~}~}~~}}}|}~~}}}~~~~}||}}|z{||||}}||{||}|{|{||{{||{z{{{z{z{zz|{z{{{||}~~~~~~}}~~~~~~}||{zzxuttvvuvwusuwwuvuvwwwwwxxxxyz{{{||{{{{yy{{zz{{zz|zyzzyz{{{{}|}|{{{{zxxxvvttuvy{{zxz{{{yxxwxwuttttttstuutuuvursvvtvwvvwyxx{{zzyyxwxwxyyzz{{{zz{{yvxxxxxwyxvwvwvuvwwvvuvwvvxyxxxx{zvswxvx{yzzwwtprqqqppqrsssuvtsrpnlnmklnmmnmnlklmnkklllijlmnnpoosuvwyzzyzzzyzz{zzzzzzywuvvutttwwxyzz{}zzxwyyzzzyzwwvtusqommmmkmnonrvyzyzzz{{z{|{}}||{{||{z{z{{{{z{{zzzyyyxyzxwwzyxyzzzwz{{{z{|||||}|||{{}~}~}}}|{{zyzz{|||}~}}~}~~~~}}~~}~~~}}~~}}}~~~~~~~~~~}|~~~~~z{}{{{ywzzyxxz{xxz{zyxzyxxxyxwvwvtuvxwvwwzxvvwwxvvxy{~~}~~~~~}}}}}}~}|~}}}~~}}}|}|{||||}}|{{zz|}|{|||{|{|||||{|{z{{zzz{{{z{{|}}~}}~}~~~~}}~~}||{zwwwwusstussurstuvttsstutrsuutsstwxxz||{zyyyz{zz{zy{}{yzyzz|{|{{{{{{zzyxvvutswvwy|{{|yz{zzyxxwxwuuuuussttttttsstsuuutvuruxxwxz||yyyxvwwz{z|}|||z{~{xxxxxxxwxwuuvwvuvwxvvvwwwvvvttwwxvtvxxvz|zy{yvrosqonmppnorsstttqpmklmmopmnmlmlljlmllllkjllmpqooqttvxzyyyzzzyzzzz{yzyxxwvvssrruxxyyxyz}}{zzzz{xxyxwwuttsrpmlkkjlljmquxyyyyyzzz{{z{{zz{z{{{{|{|{{{zzzzwxyyxxxzxvuyyyyxxzyyzz{{z{|||}||||||}}}|}|{{{{yvxyyz||~~~~}}}}}|}~~~~~}~}}~~~~~~~~~~~~~}~~~}}}}~~~~~~v|||{{yyyxwxy{yyz{{z|zyyxvxyxywvuvvwvvvvvvvxwxwvwyywz}~}~~~}}}~}}}~~}}~}~~~~}~}~~}}}}}||||}}}||||{|}}{||zy|}}|}~|{y|{{{z{{||{{|~~~}~~}}~~~~}||||zyvvwvurtvussrvvutttuussttttttttruvx{}}||{{z{|{{zzzzzyxxyyz~}}|{}}|{zywvstwyyxwwx{yx{|{|{{{ywwxwvuuuusrttttsrsuuvvttvwuqtuwwxyzzzz{{{xvxyyyz|{{{z{zxxwvsutuvutuvusvwvvvvwwwwvwxwwxwxvuuvvtxyyzzywtostooklopptvxvturpnlnnorsmmmmlllmmllmlmmmlmnopqqrtuwyzz{||{{{{zzzzzzyyzxvvvuvwxwxyyyywz{zzzyyyzz{xwxuttrpomjjjjkmmoswyxxxyz|zyz{{{{{z{{{{{{|||~zz||{yxwwxwwvvwwwwyyxxyzz{{{{||}|||}~|{{z{||~}||{zzyyyzzz{|}~}}~~~~~~~~~~~}}~~}}||}~~~}|}}~~~~~~~~~~}~~}||}~~}}}~||||{zyxz{z{{zzzzzyxxxxxwwxwwvtuvvxywxwxyxyxxxyxw{~~~~~~~~}~~}}}||}}~~~}}~}~~}}~}}}}}~}}||}}||||}}~~zz}}}}~{|{{{zzzzz{||{|}}~}~~~}}}||}{xwtvvvustuuttstutrsstsrtrstutstvstvvz}||{|}{{{yzxxzzyyzzyxy|}{zz{|}{z{zyxxxyxwutuyyy~{|z{zywxwwtvxvuuuvuuuvvxvuwvuuuuttwwwxyyzz{||{{zxvuvz{{{{{zzywwunknnnnonptsquttwwvvyyxy{{yz{yxvttwurz{{zxxxsostpplknrsuuxuttrnomnnoqommlmmllmnnmlmmmllmmpssssutvyyyzz{{{{{{zyzyzyzyxvtuuuuyxwy|zyz{{{{{xxxz|zvuvussrrpmijijlmmptvzyzyyz{{z{z{{{||{{||}||||}{{|{zyzxxyyyyxyyy{zzzzzz{{{{{{}}}{{|~~}}||~~||}}{{zzxz{|{{}}|{|~~~~}~~}}~~~}}}~~~~~~}}~~~~~~~~~}~{}}}~|{}{||{{z{{{yzzyyyzzywwxxwvxxwvvvwwwwyzxwz{yxyzzxyx{~~~~~~~~~~}}}}}}~}}||~}}~~~~~~}}|}}}~}|~~~~}~~~~|}~~||}~|||||}|xy|}{{|{|}||}~~}~~~~~~~}~}||zvvttwwtsttttstssrrssssrtststutstrtwv{{{|||{yyyzyxz{{zzzyyz{|{z{|}~|z{zyxxxvvvvw{|yz~{{|{zxxxwuqvzwutuwwttuwwwvwvuuvvttvwwxy{||{{{zyyxuvxz||{}|{zzxvojiijhfggikllpstvwyxyxyzzzzyyxwwttwvsw{zyxwxurtuqonnpqtuuwvtsrppnmlnsonmmmkklmmmmlnnllmmnorsqqtuxzyz{{{z{{zyyy|zyyxxwvvvuvuvwxz{z|{yz{zzyxxzyxywwvvssrmmlmjkmnmqsuxyyxyzzz{{zz{||}|}}|}}|{{||{{z{zyyxxyzyxyyyzxxz{zzz{|}|{}}|{{|}}|}}}|zz|}}|z{|zz{{||~~}||}~~~~}}~}}~~~}~}}~}~~~~}~~~}~~~~~}{}{|~~~}{||||zz{|{zzxy|{z{yyzzxxxwwwwxywvwwwwwzxwxwvxx{|xxz|~~~~~~~~~~}}~~~~~~}}}}}|||}}~}}|}}||}~}{|~~||||}}|}}}}~}|}~}{z{{|zz|}}|}~~~~}}~~~~~~~|xuuwwvvtttsrrtspqstsstttstsrttrrruwwz|{{{{yzxz{yy{zyzzzzz{z{}}|{||{zzzywvtsuvxwx{zzz|~{{{zyxxwwutwxutsuutsuvwvutuwuttvxwwxuxz|~{{zzxxxwwxyz||||}{{zxvojiihgggggfffgnsttwxyzzzzyvvyzxxvtwwsvyz{zywtquwsststttuuuvussqolmoptrnlknnjhjllmmlmmmnonnopqqtuwyzz{{zyz{|zy{zyyxyxwxwvtuvvwwyyz{{zz||}|{{zxxywwwvrolklmmlmlmmoruxzyxyzzzzz{{zzyzzzz{{z||zzzzzzyyyywwyzxxvuxyyx{zz{{{z{{{||||zz{|||||{zyz{{{|{{|}}}||}}}}~~~~~|~~}}~~~}}~~~~~~~~~~~~~~~}~~~~~~~~~~~}|z}~}~}z||{||{{{xyzzyxwxzzxxvwxxuuvvvxwxwvz{xwvxyxyzywz|~~~~~~}}}~~~~~}~~~~}}}~}}|}}~~}}}|}}}~~}|}|}|}}}}~~}}}}}}~|}|{zzz|{{|}||}|}}~~~~~~~~}}{wtwwuttssstrrssosuustttussrstssqruvxy{|}|{yzz{{|zzzzzz{z{zy{|}{{|{yyzzzxwvvxxxxwyzzy{|{{zwuxxuuuvvurtvuttuuuuuuuvvwuvwxxxxxxy{|{{{{{|zzxvvy}|||{}{zxumjiigdfgghgefggoruvxxyzzzywxyzzxxwxvrwzzzz{{upsvtuvuusutuvxvsrpnlmnosrmkkmmkijmlnmllkmoonpqrsttuwyyz|{{zz{|yxyyyxxxwwxxwvvwwyxyz{{zy|{{z{{{{yxxxvvtspqommllllmmnqtwyyxzzyzz{{zyzyy{{{{{{||{zzz{zz{zxvw{{zyvvvwxyzz{{{{|||||{||{yz|}|||{z{{|{{{|{|}||||}}}~~~~~}}}}~~~~~}}~~}~~~}~~~~~~~~~}~~~~}|{~}}}}~~~~}}|{zzyyxxyxyxwxwuwxxxyyyxyxxwxxxwxzzzz|~~~~~~~~~}}}}~~}|}~~}{{|}||}~~~~~~~}|}|{|}}}|}}}}}}}~~}}}~~}}}}||{zz||||}|~~}~~~~}}|xvvvvvvuuttsssssuusssrrttssrsssssttvxz{{{{xvx{{{{{zzzzz{{{zzyzzyyyzyy{||{zzxvttvsxz~|{}{yxvwwwvxywuutuuutuvutssuuuttvvvuvwwzxw{|{}|{||{||{y{|}~}|}}}yvmijhedffhhedgigkqwvxyyzz{{{{zzzzzzzxuzz||{yyvtuutuutvvvvxwwwuttrpnooqplkmmllklmlkljklmmnnopqstuuwyzz{z{|{zzzzzzyyyxxxvwwwxxwxyz|}z{z{{{{z{~|yyyxxwuurpomkkljjkmoruwxyxzzzyzzzz{zz{}}{|||{|||{zzzz{zxxyyy{zzzyzyxz{{zz{|{{||}}}|||}||}}|}|{|{{|}|{{|}}}}}}~~~~~}~~~~~~~~~~~~}~~~~~~~~~~~~~~}~~~|~~}}}~~~~~~~}{yz|}~~~~~~{zyz{xwwxyxvvxxwxxxxyzyxyxwxwxy{|}~~~~~~~~~~~~~~~}~}}||||||}}}~~~~~|}}}}}}}}{|}}|||}}}}~}|~|||||}{{|||||{|}}~~}}~~~}}~}}|xxvvwvuutssrsstttttttsrrsrqrrttstuuwx||y{zyzz{{{|{{{{z{{{yzz|{z{|{{zz{|zzxwwsqsuuyz{|}{zwvxwuuw|xwuuuvwvuuuuutuvutstxwvtuwwxyyzzz}}{zzz{|||||~}|}~}zwmghhfffddfebfffiowxxyyz{{|||{{{{z{zwvz{{{yyywuwywvvwwxwwywvvtssrpoqpomlkmmljilnnllmmmnmmmprprsuuvx{{||||zzz{{zyyyxxyxwvvttxwwyzzyxxzzz{yy||zxxxxvuutrqollmllmklkpvyyzz{z{zz{|{{{|{||z{{{{|{{{{{|{{zzzyyyzyzyxzxyyxyxy{{{||{{{|{{{|{{{||}}|}|}}||}|||}}}~~~~~~~~~}}}~~~~~~~~~~~~}}~}~~~~~~~}}~~~~~}|y{{||zyzzzw{|{|}}{{{ywwyzxwxxwxyxyxxyzyyxxyyxxz|}~~~~~~~}~~~~~~~~~}}}||}}}}~~}}~~}}}~}}|}}}}||||}~|~~|~}}}|||}|}|{||||}~~}~~~~~~}{zwwwvvwwvtttttssrssttssqsuuutsurtuvwxz|{{{|{{{{|||{|{{{z{yyz||z{|||{{{{{|yvsstuvxyx{|zzywwywuwy}wvuutuvuuvwutuvuutuuwywwwwwwxyxy{{{{zxyz{{{{|~}||{yvmiefefgededeffhkpvxxxyyz{{{|{|}{|{vt{}|{zzzwsx{xvvuvwvvwvwxutsrqqqpooonnollllmnmmmkmmmkmppqrsuuvy{{{{|{{{{{yy{{yyyxxwustvywx{|zyzy{{zz{zz|}zzwvvuwwsqpmknnknpnlpvyxy{z{{|{|{{|}}|{|{|||}}{{|}{z{zzzyxxxzyyxzzyyyyzyyz{||||{{|zy{|{{|{{}||}|||{{}|}}}}~}~~~~}|z}~~}~~~~~~}~~}~~~~~~~{yxwxxxwyxyxx{{yx}}{zxwyz|ywxxwuwwyxwvvxyxyyzyyzyw{}~~}~~}}~~~~}~~}~~}~}}|}}}}}~~~~~~~~}}~}{z|}}}||}}}|}~~}~}}||~}||{|}|{zz|}~}~~~~~~~~}|{xxwuvwutsttttttttsstttsuuuvttsttttuvvxzzyz|}|y{{{{{{{{{{zyyyz{{z{||{|{{|{yzxyzyxuvxxy|ywwvxwuuvwwvuwuuutuvuutttuttutuyxuutuwwxyxzz||}}|{zy{||||||}zulifgihfecceddcceirtvxxyy{zz|{{|~|{{yy||}||zzxrvxvwvvvwwvvvwwutuspppppnoonllkjlllklklmlllmnoqsssuv{yxz{{||{{}zzzyy||ywvvvvwxwxz{|{{{zz{|zzz{zz||xwuxyurplmolkmonnqxzzzzy{z{z{{{|||}|{||||{z{z{|{{{zzzxwxxwxyyyyyxwzzyy{{}{{|{{{||||z{}}}}~}}}}||}}|}}}}~~~~~~~~~~}~}}~~~}~~}~~~~~}~~~~~~~~}|}~~~~~~}~~}wwwxwxxyzxvxxz{{zz~~zy{zzzwwyxxtuwxywwxwyxxyyxxyzwz}~}|}~|}~}}~~}}}}}}~}}~~}}}}}}~~~}~}}~~}}||||~}{|}}}~}}}~~}~~}}}||}||||}|}~~~~}||zxxvvvutvwttsssutttsstsrsuvtrstttvuvvwz|||{{{{zzyzz{{{{{{{{{{{z|{||{{{{||{z|{zxwvssuwwwwwvtwwvuuwxwvuuvuttvuuutttutttrtvuvywwxzzyy{|{}|{|}|}}{}~||{vkhhhihffeeeddddfgqrsvuwwwxz{{zz|||{ww{{zz|zyxstwvwxvvxwvvvvvutuuropqqqonnmkkkkkjkkmlkklnmprrttutwz{xz{{|}{|}zzzzz|}yvwxxwuwxyz}|||{z{{z{yxzyzz{yvuvuurollnnmmopprvxzzzz{{}|{{{|}}|{|}~{{zzz{{z{|{zzzyxwyyxxyyyyxwy{zz{{{||||||||||{{{{{}}}||}}|~~}|}~}~~~}}~~~~~~~~~~~~~~~~~~~~~}~~~~}}|}z|~~~~~~~~~uwzyvwxx{xwzyzyyzy{~||zzzyxwwxwwvvyzvwyzxvwwwwwvwyz}~~~~~~~~}~~~~~}~~}z}~~}~~~~~}}~~~~}}~~}~}}~~~}||~}}}~}||||}|{|}}}}}~~~~~~~}|||zz||{|}}~}~~}}~}zxxvttssttussttvvtuwttttttttttuvuvuuuwz}~{{zz{yx{zz|{{{{{{|{{|{{||{zz{||||z{{wustvvvvuuuuutwxvvvvwvvtstutuuvuttuuuuuttvxvvywvxxxxxxzzyywy{{|||~}}~zvmihggfgfeeedcefegopsuwxvwyyzzz|~~{zuv|{zz{zywqvxwvvwwvwvvvwxwurrrrqpqsolmnmjkjjlllmklllnmnqqstuux{zz{{{|{{|{z|||zz{{yxvvvuuuw{~||}|}|zzyyxxwxxxxvututrqooplklmloosx{{zzz{{{zz{|}|z|||}|{{zz{|{{z{{zzzyyxyyyyyyzzyyzzzzz|||{}||{||||||{{|~}|}~~}}}}|}|}}~}~~~~~~~~~~~~~}~}}~~}}}~~~}}~}}~~~~~}}~~~vy{ywxwwzxxyxxwyzxy{}~|zy{zyxwxyxxxxvuxyyywwxxxyy{}}~~}}~~~~~}~~~}}}~}}}~}}~}}~~~}~~~~~~~~~|}}~~}}}}}}|}|}||}}}}}}}|||}|~~~~}}}}|||{{{||}}}~}~~~}}~}{xwvsvututttuttuutuuuutttsstuuttutrtuvx{{z{{{{z{{||}|{||||}|{{{|}|}|||}||}|{zwuxxwwwvvvuuuvvwvuuvxvtuututuuuuuvuuvutuuvvvwwwwxwvvutxzyywx||}|}~}|||}{yulifecefgedfdacddfnsuvx{zyzz{{{zz{wwvuz{{zyyyupwyxwwxxwxxwwwxuutrrrststpmmmllkljlklllnmnnknqrstuuwzzz{{}}|z{|{{{{{{{{zxvwvuuttz{z{z{~|yyyzyyxxxxxxwvwtrpnoqnmnmnqquxyyzz{{{{{|{{|{|||{|{zwy{{{{{{{{zyzzxz}yxxxyzyy{zzz{{|||{}|{{||||}{|{{}~{{}|}}}~}|}}}~~~~~~~~}|}|{}~~~~}}}~~~~~~~~~}~~~~~~}}}~~~~wwwxwwvvxzyyxxxzzxyz|~|{{{yzxyyxywuvuwwxyvvxyyz}||~~}~}~~~}~~~~~~~}}}}}}}}}~~}}~~}}~~~~~~}~}}~}~~~~~}}||}~}}}}}}~}}}~}~~~~~~}}|{|}}||}}}~~}~|{ywstuuttttuuustuttutrsttuustssstuuuvwzz{{{{{{z{||{||}||||||{{}}||}||~}{}}{zzwwwwvvvuuttvxwuuuuuqrstvvuuuutuuutsuwvttuyvwxyxwxwvyz{{{{{}}~}{||~zyumigfdfggfdegffgeeipuvwxyyz{zz{z{zuwwvzz{{zzzwpwxuxyxxvvwwwvwvuttssttrqnnnlmmmllmlllmmmlmknrsrtvuwyzzz{}||{{{||}}|{zyyvwxvvuvvyzxzz{{zzzz{zyyxyyxwvwwtrpnlonnonoqptxxy{z|{{|}||{|{||{{{{zzz|}{{z{|{zxyxyz~xwyzzyzy{z{{{{{{z{{{|||}}{|||{{||{{}~}}}}}~}}}}|}~~}}~}~~}}~~~~|}~}~}}~~~~}~~~}~~|}~}~|xwyzwwvwyxxvvuxyxwwy{|||~~~~}|}||zzzxuwwuvusuvwwx{z{}~~}~}}~~}}}~}|}}}~~~~~}~~~~}}|||}}~~}}~~}~~}}~~}|}~}|}~}}~~}}}~~}~~}}|||{||zz|~~~~~~|{ywxvttttqqrsttutttsttsrssstssttuuturtwyyxwz{{|}||{{||||||{{||{||}}{}}|}~}|zvsuuuutstuwxxxvutuuustttuwvvtuuusqsuxutvwwwx||{yyxxxyy{|{|}||~~}}~~~zyulhecghfffdfefffgffntuvvvwyyyyz|}yuwwwzzzz{{zwouxvvwvuuvwyxvvvtutrrrsrommllmnmlmmnommmmmonoqsuvvvxyzz{{z{{||{||{|~{zyyxxxyvwwz{zzyz{zzzzyyxwyzzywwwttqonmlimmlmoqsvyyxzy{{||||{{{||}{{||{{{||~~{||zyyzyxzzywwyzzyzz{zzzz{{{|z||{yz|{{|{{|}|{||}~||}|}}~}~||~~}~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~}~~~~~~}~~~~{xvxzyyyxxxyxxxyzzyyzzzzz|{|}}~|{{xxxxuvwvuuvtuyzz}~}~~~~~~~~}~~~~}|}||}}~}}}}~}~~~}~}}}}}|{}}}}~~~|~~}}}~~}|~}}}~}~~~~~~~~~}}}||{z{|{{||~~}}}~~|{ywwvttuusrsttuutttrrsqqrttttsuttuttstwzzywyz{||{{zz{|}|||{{}|||}}}~|}{|~}|{wuvuttuuvy{zxwxyxvuxwvvuuvuusuuwutvwwvvwvsvx||yyxyxwxyxyz||{|}~}~~|zxulgfeeffedceedeeddflrtuuvwyzzyyzyyuwvvz{z{zxwurvyvvxwxwwxxwvwvuututtuuqnmllllklkknommnnoooqrsstvvy{zz|{{}}|}||||||{zzzxvvvuvuy{zzyz|zx{{yzyyyxywvvvusqqonnmlllmopswy{zzzz{z{{zzy{{z{{|}}|||||}|{|{{zyzzxzz{zy{zwwxzzyz{{{{|{z||zzzz{{|{{{||zz|}}||}}~~~~~~~}}~}~~~~}~~}~~~~~~~~}~~~}|~~}}}}~~}~~~~~~~~~~~vwwyxy{zyzyyyxxwwwxxxyxzyyyyzz{|}~~z~{ywwxyzyxyxywxyyz}~~~}}~~~}~}}~~~}}~~}~}|||}}~||}}}|{||}~~}~}~~}}}}~|}}|}~~}}}~~~~~~~~}}~~~}|}~}|}}||{}{{z{{||}}}}}|}}|zwwwwvwwvttuvuuvvvuttsrttsrsttutssqsuuvxzz{zz{{{z{{{{||||||||}}|~~~|~~~}}~}{||zzxxuu{{xyyzywwzxwvvvuutuwuuuuuutvwvvvvxwuvwwxyz{zwwz|{{|}|}|}||}}|{ywunhfffeccceeddecbefipvvxyxz|{zyyxxruwv{|{|{yywrvxxwxwxxxwwxxyxyutqrssspljklnmkmmmopmmnooooprtustuw{|{{z|{y|}}|||||{zzz{yxwvvxwyzyz{{{z{{yxyyyxwwwwuutsrqnnonlllmprtwyzzzzz{{{{yyz{{{{|}|||{{{||{|{z{zyzyy|{zyxxvxxyxx{zz{z{zzz|zzzz{|{||}|}{{{|}}}}}}}~~~~}~~}}~}~}~}~~}}|}}}~~}~~}}~~~~~~~~}}}~~}}~}|}}}|}}}}~~~~~~~~~vvvvvwuvvxxwvwxwwuuwvwwxvwwvwyyxxz{|{zxxzywvxyxxy{{|~~}}~~~{}|}}}~}}~~||{|~}}}}|}}}}{{||}|}}}||}}|||}~}~}|~~~}~~~~~~~}~~}~}}}}~|{||{|{{|||~|}}}}}|{yvvwvwwuuttvutuuvvwvutstvtttttttuussstwxzzzzz{{|{||{||}~}}~~}~~~}}|}~~}}}~|zvvxz}{yzxxwuvyyvuuvutsuwvvvuuutuvvvvvwwwxwvwxz{zyy}~||||{{{}|}|{{zyxtnhfgfeccccccdfeeedhpuwxyyz{z{zyzxsvww||{{z{zxwxxvvxwwxwuwxyywwutrorssqoljmonnnnnopomnpoooqqtwtuvwz{{{|{zz{}||||}}}zyyxwuvxvwyz{z{{|}{|}{{zyyxxxwwuvutsnmononnmnprtwyxzyyzz{||{{{{|{|}}|{|{{{||{{{z{{{zxyzyyywxxyyyyyyz||{zzzz{xyzz|}|||||}}||}}}~}}~~~~}}|}~~}~~||~~}}}~}}}~~~~~|}~}~~~~}~~~~~}}}~~}}|}}~}}|{}~}~~xwvwwxwvwxzywwvvvvvvutvuwxxxwxwuvxx{{~~{{zzzwuwyyywxxz}~~~}}~}||}}}|}}}~~{{||}|||}~~}}|{z||}}||||}|}|||~~~||~~~~~~~~~~}|}~}||||}{{|{{||}~}||~}}}{zywuvvuuuututrtttuuuutttstvusuuuuuvvuvwxzzz{zz{|||||||||}}~}}|{||}}|}}}~~|zvvz{yyyzxwuuuxyutvvuutvxwwwvuwwvvvwwvwwwwwxwyz|{z{||}}||{|}}}|{{{zyywphffefeedcccbdeffghmswxwwyzz{yyxvsvwv||zzyyywtvyxwwxwwxwwxxxxxxutqrsrromknonmnnprqnmmoopppqtxuvwxzz|z{{{||||}|{||}zwxxxwvxxwyyxyyzz|||{xzzyyxxxwwvvssqooooooonopswxzyzz{|{{{{{z{{{{{{||||{||||zzzyz{|zyz{{yvxzyyxyzzzz{{zyzzzzxy{|~}||}||}}||}|}}|}~~~~}~}|}~~}~|~~~~~}~~}}~}~~~|~~~~~~~~~~~~~~~~~~}}~~~}}~}}}}|{}~~}}~}~~~xxxxvx{yxxzzzyxxxxxxwxxyz{yyxxxuvvttvyz~~zzyxxyywy{z~~}}~}}||~}}|}}}}||}|{{|||{||zzz{{|{{{{|zzyyzyz{{|||{|}}}~~~~~~~}}}}}}}}|||||{|{zy{{z{{}}~~~{yxvvvvuuvuututtvwtrtvutstvwttuutttuvtswz}{{{{||{{{|{{||||||{|}|}|{|{{{|}~~~~~}{|zy{zxwyzxxxyxxvuxxwvusvwvvvvvvvvwwwwvyxwxxxxxyzzyz{{}||||~}}~~}||xwwnfefffecdedddfeffeeiswxxyyz{||xvuuvvw{{z{{zzyvwzxwwwxxwwwxyxwywssssstsolklnnmmnpqpnomlpnnqprutuux{z{{{|}|||}|||||{ywwwvvuwxwxxxzyxyyyzzzyyzxvwxwwvvtpmnonmlmnnppsvxyyyyz{yy{z{{||{|{||||||||}~{{yy||}zxyxxxyyyxyy||zzzyzzzzxyzzzyz{|{{{||{||{||}}|||}~~~~~~~~}|~~}}~}~~~~~~~~~~~~~~|~}~~~~~~}}~}}~~~~~~~~~~|||||{{|||}|{}~|wwywwywwxzzyyyzyyxyyyy||{yzxwwvvwusvxy||{zzyxzyxy|~~}~}}}|~}||}~~|{||||}}}||||z{|{{{z||{{{{yzzzz{{{zzz{|||}}}}}}~~~|~~~~}~}}~|{|}|{||{|{zz{{zz||}||}{yxxxwwvuvvwuuvvvuustvttttuutttsssrsvttwz{z{|}}{{{{|||||||}}||}}|{||||||~~~~}||zz|zyxzzxvxxxwvvxxwusuvwuuuvvuuvvwwwwxyxxxxywxz{yy||}|||||}~}|||||ywvmfddcdedcecbcdefffhlqvxyyxy{z|{yxtvxx{{{|{zyyuuxvuxxxxwvvxzywvusstsrsqpolnnnmmnnoononmopqqqtutuuxyz{{{|{|}}||{{{{{zwxywvtvvwwxxyzyz{|zz{zyzxxxxvuvwusqqpppomoooprwxwyzyzzzzzz{|}}|{{||||||{{}~|zz{{zzyxyxxyzzzyzzyzzyyyzzyyxy{zxyz{}}}||}||{|}}}~}}|}~~~~~}}~}}~~}~~}}~}~~~}~}}~}}~~~}~}}~~}|~}~~~~~~}}}}zy{|{{}}{{}||}~yxwwvvvstwxxuxyyy|zyxxyzyyxy{zwvwwwxyxyz{|~||{{{zyy|~~~~~~~}|}|zz||||}|||||}~~|||||z{|{zyz{{zzzzyyyyyxyzyzzyy{zyy{yz|}||}~|}}}|}~}|}|}|}}}|{}||zyz{{|{z|}}{{zyxvvvvvuwvvutuuuuttsqpqststtttttuuvvvuwxy{||}{|||}|||~}}}|}|{{|||z{{{}~~~|}|{{{{zzxvxyywtwywvutuuvvwvvvwuvuusvvvwvxxvvyzyz{|}|}~||}}||||||zzzzyunhfeeeeeddddcegggffjorvxxxwxxyyxyuvyy{}}{zz{ywwywvvuuvuuvxzyxwvtssrqsrqppoommnnmnnnponppqstuvuttyzyz{{}||||}}|||{{{yyyyywvwwxxxxwwyz{{{{zxyyzzwvwwxwuspooppoomnntvwxyz{zzzz|{zz{}|{{||}}|{||{|{z{|{ywywxxxyyyyyyxyz{{{{{{zyzz{zzz{{|}}|||}~}}}|||}~~}~~~~~~}|}~~~~|}~~~~~~~}~~~}~~}|}~~~}}~}}~~~~~}}~~||}{{}~}}~~~}~~~~zxwwxxyxwwwwwvxyy}{yyzyzzyxwxxvtvuwyxvxyz{|}}}{z{z{~}~~}~~}}{z{zz{||||}|||{|}||{|||{{{|}}zz{{yyzzzzzzzyzzyyz{{||{{zyz{zyzzxz|{{|}}}{z{||{z{{{|||yz{{{||{{{}{{yxwuuwvuvuuuuuuuuutsrpprrprsstuttuuuuuuwwyz{z{{|{{|||}}~|||||||||||z|~}}~}~~~}|{|||{zxwyzxvtxzxwuuwvuuvvvvvvvuutvxwxwxxuuyzyz||~~}}~}}|||{{{{zzyxvphfeefebcddeedffedfhmrvxyxtuvwyyxwwyy{}{zz{|{uwzzxvvvwvvyzzzywwtsrqrrqpomnnmmnooonnollooprsvwvtvzzy{{{|||{{|}|||{{{zzzywuvwxyzyyxxzzz{zz{{{yz{yvutvvsqooomonnoqprvxxyyyzzyyz{{zz{{{{{{{{||z{{|}{{{zyyzyxyzxxxxyyyzzzzz|{yzzyxyyz{|{|}}}~~~}||||~~~~}~~~~~~~~}~}~}~}}~~~~~}}}~~||}}~~~}}}~~~~~~~~}~}|||}~}}|}~~~|zyyxyyyzxxwxxxxyzzzz{yzzywvtvxwxyyxwuyxw{|{{}~~~|z{}}~|||||}}||}||{}|{{z{|{{{{||{{|||~}|{{{{z|{zz{{zz{zzz{{z{{{yz{{zzxwxy{{yzz{{z{{{|{{{{|{{|{||z{|{zzz{zyxxvuvwwvvvvuwutttvwtstsssqrtrtussttttuuwxyyzzzz{{{{|{|||{||z{|}~}}{|~}{}~~~~~~}}}|{|||}}{z{zyvvxxwuuvwvvuvvvvvvvvwwxxxwxwyxwwyzz{|}~~}~~}}}||{|{{{zyxwphffffeabceffffefefggnwyyxvtuyyzzwuyz|}|zz{{ytwzywwxxyxwyyxyxvvtsssrutonmnnnmmmopommmmooopsvuvuvyz{|{{|}}||}}|||{{{zzzywuxxwx{zz{{{}zzzzz|yzyyxwvvuuroponllnnpoootxvuwxzzzzz{{{{y{{{{{{{zzz|{{{|{{zyyyyyyyxyyyyzzzy{z{zyz{{yxwyz||{|~}|||}~}{z|||~~~~~~~~}|}}}~~~~~~~}}~~}~~}}~}~~~~~~~~~~~~~}~~}}}}}||~}}}~~}}zz~yxyzyyyyxyz|{yy{{z{|{{yxwwwvvwxyxxxyzywy}}}|~}}~~{y|~~~{{{|}{{{{{{{{{z{{{{|{||{{|}|{||z{zyz{zyz{zzzz{{z{{{z{{zyzzzzzzxyyyzyxyxxwwvvxy{{{{|{||{|{{{{zz|{zzzzvuwwvvvvvvvutttwvwvuuuvvtrtttuvuttuvvwvvyz{zyz||{|}~}||}||z|||}}||}}}||}~~~~~~}~~~}~||}{zzyyxxwuxxvvvvwwvvvvwwvw{zyyy||{{|}|}}~~}|}||}||}|}||}|zywnigdfedddddeeeededcfjovwxxwxxx{|xrr{z{~{{{zzztvzywwxzzzzxxxxyxuttrrssspnnnkmnnnonmmnononnrwyxwwxzz{||}}}}}|}}}~}}~}||{yyvxwxxyy{}|}~~{{zyy{zvwxwxwwvspoopomnpopplsvvvvxyyyyyyz{zzzz{{{{{{{||{{{{{|{{{yyzyyyyyyyyz{zyy{zzzyyzzz{{z{{|}||}}~}|{|{z{}~~~~~~}~~~~~~~~~~~~~}}~~~}}~}~~~}~~~~}}~}|{|~}}~~~~yzwwy{zyyx~y}xyz{yy|}{{zz{|zyyyuwyxxxxyxxyyy|}|}}~~~~}|}||{{{|zz{{|||{{}|z{|{z{zz{zzzyz{z|zzz{|zzzyxyyzyy{yxyxyzzzyz{{yyyxxxwvxxtrttsvwxywxyzz{{|{z{{{zz{{yyxvvwxvwwwxvuwwvwzwvvuuuuvtsuvtuuttuuvutttxyzzzz{|z||~~|}}}}}~||||||||{||~~~~}}|}~}}}}}~|{{{zxvtvwvwwuuvwwwwwwuux}zzzz|}|{}||||}~}}}||{{||{{|}~}zxvpjhefgeceefffeffgfegiltxxxxyxyzyyvtzy{}|{{zzzrtyyxwyz{{yyxxxyvwutrrsstppoononnnoommmnlmlptvxxxzzz{||{}}}|}}}}}~}~~}|zyyxtwwwyyxz{z{|{{}{z{{{xwyxwuwxsonnoommpnnooswxwvxxxxxxyz{zzz{z{{{{{{}|{{{{{{z{{z{{yyz{zyyzzyyzyzzzzxxyz{||{||}}|||||{||||}{|~}~~~~~}}~~~~~~~~~}~~}}}~~~~}}}~~~~}~~}~~~}}~}||||}}}}}~~~~~}zywxxyyxxxwyxwvxyzzyyyyxxxxwxyxxwxxxyz|{|zwwvuy{{{|{|}~}}}||{{{|{zzzzyyz{zy{{zzy{yz{{zz{zzz{zyyyyz{{yxxyyyyyyyyxyxxyxy{zyyxxvvtuvwvwuvwvutttttvxxyyyzzzzyzzzz{zxwvwwvvvwwwxxwwwwxwwwvuutuuutttsttuuvwvvyxz{{{z{|}|{{{|}}||{{{{|||}}}}}~~~|}~}}}~~~}}}}}{||{{zz{zyyvxxxwxxxxxxz{||}}||||}}}}}|}}~}}}}}}|{|}|}zyyshdcfffffeeeffdeffgghkqvwwwxxyyyyuqyz||~~~|zzuvyyyxwxyywxwwxxvvutstssqonnnmkjlmommmmmnnnpruvxxyzz|z{{{||||}}}||||zz{zyxyvwwvxyyxyyyz{z{}|{|ywyyxvtusqqommonnnloqqwyyzyyzxxzz{{{z{|{|{zzz{}}|{z{{{{z{yyyyyyyyyyyxxyyxwyyyyyyyyyzz{|}||}}}||||z{||||}}}~~~~}}~~~}~~~~~~~~~~~~~~}~~~~~}~}~~~~~~}}}~}z|}}}~}|}}~~~~||zyxyxyyyxxxyvvwyywtvyxxxwxwwwxyyzyy}}||zxwuvyyyyzzywyz{}{zzz||zyyyyxwy{zyxy{yyxxxxxxyyyyy{{zxxyyzzzyxxyyxyxyyxyyxxxyzyxxwwwwvvwxvuuwwutstuuuvuvvwvwyxxxxyz|yxywvwwxwwwwvxzxwvwxywwwvuttuvuuuuttssvwutxyy{zz{{||{{{{||{{|z{}||}}}||}~~~~}}}~~~~}~~}}}}||}||{|{zz|zxxy{zzzy{|||}}}|}|{|}}~}}}}~}}}~~}}{|}|{zyxqiefffghhgfgffddfgghgjptuvxxxyyzyvuz||||||{zxswyy{yxyyxwwpsuwwussstrrqmnnkklklnronmmonmnnptuwxxxyzxzzz{{|}}||{{{}{zyyyxwvvyxyzzxz{zyxyyzzzyxxyzxwvwuqqpnnononnonryxwyyyyyzzzzy{|}{zzyzzzz{}}|{{{||||yvwzywxy{zywxxxxxyzzxyyyxyz{{|}}}}}|||||{}~||||{|}|||}}{|~~~~~~~~~}~~~}~~~~~~~~~~~~~~~}}|}}z}}}~}}~~~~yyxyxyzwwvtvwwvvwwxwwxxwwwvwwvvwxyyxy~{y{|yywxyyyyxxxxwxwxzyxyz{zywxyxwuwxxxwxyyyyxwwxuuvvuwzzzxxxwxxxyxvwxwwxxyxxxwwwwxwwwwwxxvuwwvuuuutttrsttttuuuuvxyxyxxyzyxxwuuwwwwwwuvwwvvwxwwwwwvuuuututtuttsuuvvxxxyyz{z{}{{{{|{||{z|}}|}|}}|~~~~~~~~~~~~}~~~~~}}}}||{{}~|zxz{{{zz{||}|}}}}}|}}}~~~}}}}}}}}}}|||}|zxvpmljjjihiijiiiheeggffinruvxxyy{{zxtz{{||||{{yruyyxxxxxvwvsuvvvutttsrtsoomllmmmnqoonmonmoprsuwywvxyy{z{|{|}}|}}{z{{{{{yxwwwvxzzyyz{zzzzyyyyyyyxyyxwwurpnnnonnmonnpuwxwxzzyzyyyx{|{{zywxz{{|}}{zz{{{z{zxyzzyxy{yyzyyxwxx{{zzzzz|||}}}||}||~||}{||z{||{|}||}~}|}~~~~~~~}~}~~~}~~~}}}~~~~~~}~}~~}}}|{|~}}|~~xyyzxyzxwxxwxvtvwvxxxxxzzywwxxxxyxxvwyxzzywxyxxyxwwwxxxwwxwxxwwwwwwwvvwvxxxxxwwxzzyyyxyyzyxxxwxxwwwwxyyxwvwvyxxwvvvxwvuuuvutuuvwwtstwwuttussqssstttuuuvuutuwvxvuwwvuuvwwvvuuvuvxxxwwvvvvutttssttsuvvvvwxyyyy{{yz{{|{{|}}|||}|||{|}}}~}~~}~~}}~~}~~}}|||}~{|{z{{|}~}}}|}~~~}}~~~~~~~~~}}||}}|}||zywrpmmljjjjjihihgeegffgjkouvxwyyy{zwsz}{{{}|||zuvyyxxxyxwxxwwvvtuututtutpoklmlmlmmmnmmoonoqsstvwxxyzz{|||||||}}}|zz{zxxxxwuvsswyyzzz{{{z{}||{zzzzyywvvsroppoonoooontyyxxz{zzzz{{z{|}|zz{{|{{{z{{z{{zzyz{yyxyxyzzyyyxxxxxxxzzzz{{{||}||{{}}~~|||{{y{{}~~~}~~~~~~}||}~~~~~}~~~~~~~~}~~~~}~~~~~~~~}}~~}||{||}~~xxzzxyyywxyxyxvvwxzzzywwxxxxxyxwwyywvwxzyxvvwwwwxwvwwxxxwwwxxwwwwxyxvvvwxwxxxzzyyyyxyxwxyyxxxyyyyyxyzxxvwwwuvvvvwvwxxvuvtuuuvuvvvvuvwvttutsrqqqprrrstttttsrsuvvuvvvuvvvvvvvvvvvvwyxvvvvutttttttssuwvuvwyyzzyyzzzzzyyz{~}|}}|||{{|||}~||~~~|}~~~~~}}}}|{||}{||{|~~~}|}}}~}|}~~~}~}}}}}~}}}~}~|{zxwspnmnlllkjjjjigfghgffiinsvvwyxwyytsy||||||||zuuyyxwwwxxxxxxxvuuutrrturomjkklkkjjklliklnooqstwwwuw{z{z{{||}}}||||{zxwxxxxvuttx{z{zyz{{{|}|{{yyzyvwwvtrqooomnnonlppuzyxy||{{{{{zz|{{zyyzz{{{{{{{{{{{{z{{{zzyzzzyyyzxxzyzzzzzz{{z{{|}||}|}}|~~}{{{vvx{||}~~~~~}}~}~~~~~}}}~~~~~~~}~~~~}}~~~~~}~}~}|{zzz||~~~~~~vyyxwxwyzzy~xyzywyzz|{xyxtvxxwwxxwxxxxwyzwxwvxwxwwvwwwvwvuvvwvvvwwwvtwwvwxyxxx{{{yyyywxyywvwzyxy{yzzxxvvwxxxxwxvvxwwwwwwxxxwvwwuxyyxwvuvuuuuuuutsutttuuutssuuuusrruvvuvwuvvuvuuttvvuuwuuuuusssststtvuvuvvyz{{z{zxzzyyz{{{{{|||{{|}}~~~~~~}|}~~~~~~~~}||||z{|}}||}~~}||||}}}}~~~~}~~~~}}}~~~~||{xupnjkllkkjjjiiihjhgghhggkpsuvvyyyxtqy{}||}||}zwwyxxyyzyzyyxxxxxvutsutusonllllkkkmmonlljnnnptvwxwwxyxyz{|}}|{{||{{|yyxwwwwwvwvx{yyzyy{{{~|yyyzyyxvwwvuronnommnoooqptwz{zz{{||{zzy{{zzz|{z{{zz{|{{{zzzyyyxzyyyyy{yyyz{yz|{{{zyzyy||{||||}}}}||~|z{vuxz{|}}}~~~~~|~~}}}||~~}~}}}~}~~~}}}~~~~~~~~~~~}}~|{|zx|}~}|z{zyyxz{zzyxyzzwwy{xxzzywvxxwxyxwvwxxwwwwwxwxxxyxwxvwvwvvwvwuvwwvvtsvwvwwxxwyyyyxwxxxxxyzxxxyyyyyyxyzxwxyyxxzzyzyyyyxxxxwxxxxxxyyxyxxxwwxwwxvvuwvuwwwvvvvuutsutsrssvwuvvwwvusuuvwvvuvuvtttrssssstuuuutuvyz{|zyzyzyyxyz{z{{{{{{{|}|}|}~~~~~~~~~}|{{{{zy{{{|||}}}~~~~~~}}}}~~~~~~~}}}}}}}||{yxrpmlmnmmllkjjkijihghhgfjpruuwvvwvvuz}~~||{{|{yyzyzzzz{{z{zyyxxwwwwvuutnnmlmliklmmmlljhmnnpuvwwwxxyxxz{}|||{y{{{{{zyxwwwwutuswyxyyyyzyy||zyyzyxwvvvtrpnllnmnnnoprsuwy{z{||||{{}|{{{{{|{z|}{{{|{|{{{{zyzzyyyxxyzyyzzz{{{{{{{{zz{||{{{}||}}}||}|}}zzzzz{{||}~~~}}~~~~~~~~}~~~~~~~~~~~~~}~}~~~~~}~~~~~}}}||{{|z|~~~}~~~~||}}zz~zz{{yyyyyxxyyyyyxxxxxxxzyxyyxwxxxwwxxwxzyyxvwwwwwxwwvuvwwvvvuuvxvwwwwxxxxxxwxyyxxyyzyyzzzz{{zz{zzyzz|{yyxzzxzyxxxxxzyyzzyxxyyxwxwxwvwyywwyxxxwxyxwvvvtruwvvsswyvwvxwvusuuuuuutsuuuutsssttsttuwwuwxyyyzzz{zyz{zz{|}|{zxzzyz{{{|}}}~~~~~~~~}~~}||z|||}{{||}}}~~}~}}}~~~}}~}}|}}|}}||}|{zurompommmljikkjjigffgfegnrutuvxxxzy{~||{{{{yxzz{|{z{{zzzzzyyxwvwwutsommmmmkklllmmlkklmnptttvwxzzyy{||}||||{zyzzzxuuvvwutuux{ywvwyxxyyyyyz{yxwwwvvusrpopononqrrvxyyyz|}||||{|||{||z{||{{{zz{{{{|{z{zzzzzyxyyzzyyzy{}{z{z{{{{||{{{|}}}}~}|}}|}|{zxwxz{{}}}}~~~|}}~~~~~}~}}~~~~~~~~}}}~~~~}~~~~~~~~~~||xwxx{|}~~~|zy{z~zzy~yz{xyzzywy{yxwyyyzxxxxxxyyyyxxxxwwwxyyxwvxwwwvvuvvuvuwxwwxxwxwwxxxxzywxvwyyyzxxyxz{}}zyyzzz{|{zzyyyyxwxzywwxwwxxxz{yyxyyyxxyyxxyyxwwwwxyywwyxvvwvvvuuvtuvvvuuuvvutuvvwvuvvuuuuttsssssrstsrtwxwzzz{{zy{{{{z{}|||}}|z{{zy{{||}|}}|}~~~~}~~}~~}|}|{}}|}}~~}~}~~~~~~}~~~}}}}}}}}|||{yzuqpooppommpnnnlmlihiedgijpuuvxxxwwxzz}~~{{{|{uv|{{{{zzz{zwwzyyxxwwwvvrnmklllkklklommmmmnnpsuuuwxyzz{{{|}|~~|||{z{zzxwxwwvuwwxxzzxxyzzyyyzyy{{|yxwwwvsqqpqonooorruuxxyz{|}}}{zzz||{{{{{{{{{{{{|{|{{{{z{z{{|{yyzzyyz{}}}|z{|}|{{||||}}}}}~~{z|}~zwywywy|~~}|~~~~~~}}}}~~}~~}}~~}}}~~~~~~~~~|{|y{{}~~~~~}}yyyyzyyy~yyzyyzywxyyyyxxxvwvwwwwwxyzzxxywwxxwxxxwxxxwvvusuuuuttvvvyywwwwwwvxxwwwxwwwxxvxwuwx||~zzyzyy{}|zyyzyxwxxxyvuxxxvwyyzyyyyyxxwwxxxxwxyxwwxyxxxwstxxxxvuvttvvvuvuuuuutvuuvvuvuuuttttsqrtsqorsttvvwyy{{{{yz{{{{|||{{{}|{yz|{xyz|||z|}|}}~}~~|}}~}~~~~}~~}}|||}|}}~}|}|}~|}}~~~~~~~~~~~~~}~}}~}}||{{zzysppoppponnonppmlkjhgfffgipttwwwywuxyyz{{zz||uv{{{{z{{zzzyxzyy{yxvwwvroonmmljkllmmmmmmnmmpsuvvvwxy{z{|}|{||{z{{|{yywwyxvutuuxxyzzzy{zzxxwxxyz{ywvvusqpqqpnonmossstwxzz{|}}||{{{||{{{{zxxzzz{{||||{{zzyyzxxzzyzyyzy{{{||zy{||zz{|{|~}}}}~~|{|}}}{xxwwyz|~~|~~~~~~~}}}}~~~~~~}}}{}~}~~~~~~~~~~~~|}{z||}}}~~}~~}}}xzw~w}x~y~zyz{yyzzyvx{zvxxyzxxxxyyxwwwvwvvxwvvvvxywwyyyxwvtstvwuuvuwywwxwwwxwvwxwvxvuwywxwyxwwyzz{zyz{zz}|zyxxyxx{zvvvwxxzzxxyz{|yvwxwvtvxxwvwxyxwwvwwwwuvwxwwwywtuuvvuuvvuuttttuwvuuuuuuutssqqrqqrrrsstvvwzyyz{{|{{{z{||{||{{{{{||{{||}|{}}~~~~~~}{|~}}~}~~}||~~}|{|~~{|~~~~~~~}}~~~~}~}||||||}{xyvqnnoopqpqppooomlkjjjgehjovvvwyzzxxzzyzzzz|||ut|zzzzz|{{{z{zzzyxyzzwusonnopnlmmmnnmmmmmnopsvwxxxyzz{{|~~}}}|yzzz{{{wvwwvtuutwxyyyzzyzyzzzzyyyz{ywuvusrqqpnooporssuy{|z{{|}||||}|||{{{{zz}{{|{||{{||zzyyyyyyzzyyzzz|{{{{|}}}|{z{|{|~}}~~}~~}}||{yxxwwwy{~~~~}~~}}~}~~~~}}~~~}~~~~~~~~}|||}|}~~~}}}~~~wzyyyyzzz{yyzzyxyzxwxxxyz{yxyyxwuwwvuuvwuuuuy|xwxyzzywxxvvvwvwtvywwyxwwxxwwwwwxwvvyyxwxyxyyyz{{yzzzyy{|zywxyxyyxwwuvy{{zyyyzzyvwxwwxxxxyywxywwwywvwywwuvwvwxxwwvvvvwvuuuuutuuvuutvvwuuututssrsstuuvwvvwxyzzz||{{|{{||}|zz{|{z{{||}~}||||}}}~~~~~~~}|}}{{|}||}}}~~~}~~~~~}~~~~~~~~}}}||{{}}ywwuqpoonnprqoooopoljjihghhhlrtwvx{{yyyyzyz{{{zytt||zzzz|||{|{zzzywyzzwvtqnoopomlllllllmnmmlmtvwwwxz||{|||}|}}}{{{{{zzxwwwvtttuuwxxzyyz{zzzyzyxxzzzxvvusrqooooppoqruwyzzzz{|}|{zz||||{{}}{{||{||{||{}{{{yyyyyyyzyz{z{|{{{||||~}|{||}||{}|}}}~~}}~}{{zyvty}}~~~~}}~}}~}~~~~~~~~~~~~}}~~~}~~}}}{~}}}}}}~~~~~~~}z|zzzz{zyywxyyyyz{zyyzzz{zyxxyywwxxxwwwwuwwwy{yxyyyyxwwxwwwxwxwwwxxwvvwwwxwwwxzwvuwxwxxxxyxxyz{zzzyyxz|~zywwwxxxxwvutwx~x}xxxxxx{ywwwwwwvwwvvwvuuvwuvwywutuvuuwxxyyxvwwvwvuuttuuuvvvvuwuttstusrstttvwwwwwwxzzyz|{z||||||}}|||}~}||{z|~}|}||}||}~~}~~||}z{}}}}~~~}}~}~~~~~~~~~~~~}~}~}|{|{||zxxupnnqpooponmoomkkkjihffhhmsuwwyz{yzyxyzyzzxzyvvz{zzzz{~|zzzzz{yxyyyywuroomnnnljkllmmlklkjnttvvwx{{|{{{|}|{}~}||{{{zxwxxwtsvwwwyzyyyy{{{yzy{zyyxxxxvvtsqooppprrqnsvxyyz{{{||}|{{{||}||}|||{{}{{{z{{{zzzzyyyzzxxzzyyzzz|}}||}}|||~}|{||}}}~~~|}~}{zyyyvy|}~~~~~~~~~~}}}~~~}}~~~~~~}||y|}}~~~}~~~~~~~~}}wz~z{zz{yyywwxxxxwwvwwyzxyzyyzyzxxxxwwxwwwwxxxyxxzzxxxxyxwxyzxywxzyxwvwxxwwvwxyyvwxxwwwwwwwwxwxzzyxyxwxy|~{}ywwxyxxxxxuvxyxxwwwwwwvutuvvvwutuutttvtpqstttuuvvvwvvwxxvvvvvvvttuuututuvuuvvutsrqpqrsrsssuuvwwwyyz{yz|}}}}~}||}~}|{{|zz}~}|||||}|}}}~~~~~~~}~~~}~~}}}}~}{|}~~~~}}~~~~~~~~~~||{|{yzxtnlmonmmmmmmnnmlllkihhgfhkqvwwzwwyzyyz{zxyzyyvuxyyyz|zyzywwyzzzxyxxxwupnnnmlnnnnpomlmljkkovvvvvxwyz{|}~}|{}}||{{{zyxwxvutrpqvwxyzyz{||{z{z|{zyzywwwvtsqpqpqpoppqquxyz{{{{||~~}}}}}}}||||||}|{{{{{zyyyxxyyzxy{zz{zz{|||||~}}}|~}|{{|}}}}}{|~}{z{zyyxy|}}}~~~~~~}~}}~~~}}~~~~~~~~~|}}{xx{{}~}~~~xzzzzzzzyxwwwwwvvwvwxyzyyyxyyxyxyx{xwxwuwwvxxxyyyywwwvwxxxxzywwxwyywvwwvvvvuvwwvwyxwxyyxvvwwwxz{{xxwwyxy{zywwxwxyyxwxxwyyxwuvvwwurtuwyywvtutssvvroqrrsttvuvvwvvvxxwwvuttuuuuututvvuuttursrqprssssssstvuuvyzz{{{{||}}}}{||||}|{|}}||}}}~~}}}~}}}~~}~~~}~~}~~~}~~~}{|~~~}~~~~~~~~|~~~~~}}}~}}}{|{zzxsnnlmklllljkllkkjihhiggfiotxyzyyyyzz{|zyzzzywvxyxxxyxwyxwxywxxwvuuvutommmooonnnomllkiiihovuvvwxyz{{z|||||}}|||{{|zxxwvxvustxxyx{{yzzyyyyz||zzyyywwvsrpqooonnpqqsvz|yzzz{{}|{}}}|||}|}|}}|}|{{|}{{|zyzzyxyyxxyzyy{{zzz{}|{}}||}}}|||}}}}}||}}}{z{||{{{}~}~~~~}~~~~}~~~~~~~~~~~~~~~~}|}}{wuwz|~~}}~~~~zzyxyzyyxwwyyxxxxxxwxyyyyyxwyzzyyxxxxxyzxxvwwxwwxxxxxxyyzxwxxwwwxwwvwwwxwwvuvwwwwwxwwxywvvxxwyzzzxxyyxxwxyzxwxxxyzzzzxwwxwurrsvvussuvwvvtutspprsroqrrssstvtuwwvvtvvutuuuutuvuuuvttuuussqprsrqrsusttsuvvwwzz{{}}}||}}}|{|||||}|}||}}||~~~~~~~~~~~}~}~~~~~~~~~~~~~~~~~~~}~~~}}~}}~~~~||{z|wqnmklklklkklkkjjjiiihhiiikrxxzzzzz{|zzzyyz{{vwyyxxwxyxwwxxxwvvvvuuttsqnnononnnnmllljlkkkosuuxxyzz{y{}}||{{|}}||{|{xxxxxwwww{yyyxyzzzxy|{zzzzzyyxxywtoqqpnnmmpsqqvy{{{z{|}}}||{{{{||||}|}}}}}~~{{{{z{|{yzyxxxyyyzz{{|}}}}||||||{|||~}}}~}|}|||||}}}|}}~~}~~}~~~~~~~~~~~~~~~~~~~}}~~~~}}}{z|}}~~}~~~~{{yz{{zzzywxyyxwxxxwwwwwvxyxxxxxxyzzxxzzyxwwxxwtvxyywxxwwwvxyxwvwxxxwuuvuwwvvwvvvwvvwwxwvwwxxwvwwxyyzyyyyyzyxyxxxyxwwxwvvvutssuvuttutttsrssspoqrrppppqrrsttuvxvwvwwvuuuttttutuuvxxuutsssrssrrrrssrrqrtvvxz{{{|}}}}||}}|{{}~}}}~}{}~~}}~~~~~~~~~~~~}~~~~~~~~~~~~}~~}}}{{zy{vqomklkllljkkkjjjkkiiijihhipxy|yyz{{{zyyxyyz{wxyxxxwxyxvwwwwvvvuuttuutqonmooopnmonnmmnnnkostuxxxz{}{|}}}}}}~~~~~}{xxwxwwwvwxyyyxz{{zy{{|}|{{{zyxxxusrsqpopoonqrrvz||{z{{{{||||||{||}}||{}|}|||{|{{{{{zyzzxwwxyyz{{|}|}||}}||||~~}}~||}}|||||}}}|}}||~~~~~~~~}~~~~~~~~~~~~~}~~~~~~~~~~~~}{{~~~~~~~~~{{zzz{zz{zxxyyyxyyyywwwwxxxxxxxxxz{zwwyxxxvxxwwvwwxxwxxwvwvxxxxvvvwwvvtvuwxwuvvwwwvvuuvwxxwyxxwuxyy{{zyxyyxyxxwuvxxwuvuuuwuvutuwvvttttsrsrsrppqpppoqqqqrrrtuwxwwwuuutstvwwuuuuttvvtusssssssrrsrqsqoopstuvy{{zz||}|||}~|y{|}}|}|zz|~}}}~~~~~~}~~~}}}}~~~~~~}}~~~}~~~~~~}}}}|||yyzuqommmklllkjkkjjjjliihjjhiimsvyzyy{|{zzzzzxyxwxxyxxvvxxxwwuvwwvuvvututpmmnmmmnnmnmmmnmlllosuxzyxy{|{{}}}}}}}}}}~|||zyyzwvvvwxxxyyz{|{{z{||{z{{zyyzytqrrqqppolnqpsv{{{zz{{|{{||}}}{{}}~}{{|}~|{{{|{{zyzyyyxxxwxyz{z{}}z{|||}}||}~}|~}|||||}|||}}}}|~~~}~~~}~~~}~~}~~~~}~~~}~~~{{{||}~~}~~~~}{{{{|{{zyzz{yxxxyyzxxxyyzwwyzzzyzz{zxyyyyxxxwvxyxxxxyzxxxxwwwvvuvuvvvvusvwwtuuvwwtuvwwwvuvxwxvuwwxyxxwtvyxwwwwvuvyxvutuvuttvvuuttssssssrrrqpnpppqppppqqrrstustuvtstssstvxvtsqsstttutqrsrprrrqrsrrrssrtvvz{z{|}}|||||~}|}~|}}|{{{{}~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~}}~}|||yyyuolklmkkkkkiikjjjhhijhhhhggjpvzzzxxzz{{z{|{yzyxz{xwvuxxwwwvvvvvuutssttrllnmmlmnmnnlmmmmmlpsvxxxyyz{{{||}||}||}||{|z{{xwwuvxxywwwyxxzzyyyyyyzzyyyxzxusrpooonnompqsx||{{{|}|||||}~~}}}}}||}}~}}|||||{{{|{zzyyyyxz{z{{{{|||||}}||||||}|{|z{||||||||{|}~~~}~~}}|~~}~~}}}~~~~~~~~~~~~~~~~}~~}|}~~~~}|{{|}}|}}~~~}~~}|}|{z{{|{{{|zyz{{{{zwy{{zyyz{{|{z{{z{z{{{zzyyyxyyyyzyzyyzyvvxxxwwxxxwwvvwyywuwwvwwwxwvvvvvvvvtvyyxxxxuuvxwvvurusuvuvvuvwvuuvvtuttsssrssssrrpppppponppooqrsttuuuusststqqttstrqsuvuttuqprqqpqrqqsrrrrrrsvwz{{||}}{~}}}}}}}~|||}}{{|}~~}}~~~~~~~~~}~~~}~~~}~~~~~~~~~~~~~~~~~~}}}}|||{zzupnjkkjiijjjklkljjijjihhggijqxywyyyzz{zyyzyzzzz{zzyvvyxxxvwxyxuutsssuromlnomloonnmlmnonmmprtvxxyzz{||||}}|~~~~||{{yzyvxyvvwwyzyyyyz{zyyxwxy{zzzzywuspolopnoopprpruz{zz{||{{|||}}}}}~~~||||}|}||{|{{{yxyzyyxyzy{yzzz{|||z|}}|}|}}}}}{{{|||}}}}}}||~~~~~~~~~~~~~~~~~~~~~~}|}~}~~~~~~~}}yy{}|}|}~~~~~}}~~}}~~|~}}~~}~~}}}}}||}|{}||}{|{||}~~{{}}}}||{{{z{{{{zz{{{{{z{{zyzzyyxyyyxxwwxyyyxyzyyxyyxyyyvwzxwwxwwvuxzwxyyyyxvvwvwvsuvvvtuuuututttttsttussssrqppononnpppqqststuvtruuuurtsrttuwuttssstsrrrqqqqqpppqrpqtttwx{|||}}|}}}~}~~~}|}~}~~~~~~~~}~~~}~~~~}}}~~~~~~~~~~~~~~~~~~~~}}}||{yxuqmkkkjijjjljiijiiiihhiihghjntxxy|{zz||{z{|{{{{zzyyyxxzzyyxwyzuttsrssspmmmllmmnnnmnonnnomqtuwwyyz{|}}}|~~}}~~}}|z{zzyxwwwvxxyxyz{yzzz{zzz|{zy{yzzwuqpnoooqrpoqrsv|}|{||}|||||}}}|}|}|}}}|}~~}}|{yzzzyzzzzyxzz{{z{|}|{|}|}}}}|}}|}~}}|{|}}}~~~}~~}~~~~~~}~~~~}~~~~~~~~~~~~~}~~~~~~}||}~~~~}}|~|~{|~~|~~~~~~~~~}~|{{~{~|~~~}~|}}}~~}|}}}}}}}|}}|}}}||}~||}|{z}}|{yzzzz{yzz{{zz{{{{y{{zzyyyyzzxxyyyxxzzxzyz{zyyyxvvwvvvvusuuttutstsrsssssssrrpqppolnppqqprqqtqqttsruurrstsrqsuvuttssuusqqrrqrrpoppqqqppqswy{|||~~||}~~}}~~|||}~~~~~~~~~~~{|~~~~~}~~~}~~}}~}~~~~}~~~}~~~}~}}|~|zyurliijihijlmlijjhihgghghghijmtxwxyyyy|}|z{{{z{{{zz{zzz{zyyyxyzutusssttnoonnonnnlmmmmmonnnqttuxzyz||{|{{|~}||}~~}|{y{zyxwxvwwxyz{{z|{yy{{zz{}|{zz{ywsrpnnmoqppooty{{}|z{|}}|}}|||||}|{}}}}}~~}~}||{z{{z|{yyzz{{zy{z{{{||||||{|}}}}}~}~~}}}~|}~}}}~~~~~~~~~~~}~~~~~~~~~~~}~~~}}}~~~~~~~~}}}~|~{|{|}|{}|}~}}~}}}}~~~~|~}~~~~~~}~~~}}~}~~~~~~~}~~~~~}}}}~~}||{{{}~~}|~}}}~~||{{{{{{{{{{{{z|{yz{{z{|}||{{|{y{{||{{z{zyyxwwwwvuussuutstsrttttsrrsrsrsqrqqrrqpppooqqppqrsssqrtspqqrstsrqrqrrrrpqrrqrpppoprqoqsuxxz}||}|{}}~~}~~}~~~~~}~~~~}|~}~~~~~~~~~~~}~}~~~~}}~~~~~~~~~~~~}||}~~|||||yvpjhiihhijkllkjihihgfggihhijkqxxyyyzyz{{zzz|{{{}{zzyyyzyyzz{yxwuutussrooonoooonlnnmmmoommpstvvwxz|{|}{{{||}|}|}~|zyyxxxuwwvvwxxyzy}}zy{zzz{~}zzzyzxtrpppmmmnqqruyzz|}}||}~}}~}}||{}}}|}}}}}}}|||{{{{zyzzzywxzz|}~}zz||z{|{||{|}}}}}~~~~}|~~}}~}~~~~~~~~~~~~}~}~~~~~~~~~|}}}|}~}~~}}~~~~|||}z{{z~{~|~}}z|}}|~}}}~~~~~~}~}}~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~}~~~~~}~}~}}~~~||}|||||}}|||{z|{{|{{|}|}}|}~}}}}}~~}{z|}{|{zyzzywwwxxvuvvvuvutuutuuutsttttsttsssrrqqrrrqsqssrrrsrsrrssrqpppqpqpooonnopoonpmmptttvyzz}{|}}~}}~~~~~}}|~~~||~}~~~~~~}~~|~~~}~~}}}}}~}~~~}}}}}}~~}}}}~~{zztpkiiihghgihhiihgiojfhhihhiimrwvwwwxxyyxyz{{yy{{zyyzyyzxxyyz{yyxxyvtuspqponmnnnnnmnnopoonptuxvwz|{z{{z{|}}||}~|||{{ywwvwzxxy{yyyy||{{|{{zzz{{{yxzwqppnommnopqqtx{}||}}|{|}}}}}|}~}}~~~~}~~}}||}|z{zwxzyxyzyyzz|||||{{{{{{|||{|}}|||}~}||}}}}}}}}}~}}}}~}~~~~~~~~~~~~~~~~~}~~~~~~}||}}}{~~~~~{|}{{z{{}}}{{|~~~~}}}~~~~~}}~~}~~}{|~~}}~~}~~~~~~~~~~}~~~}}}~~~~}~}~~}~~~~~|{|~||~|~|||}~~|}~}}}}}~~{|}}|~}|||{}}}|||}|{zyzzyzywwxwvvwwvvvu~v~vw~vuuu}u~uvuuuuuutssssrrsrqprrrqqrrrrrqprqqqqooqqqomopoonnnllmklmpruwxwy{{|}~~~~}~~}{~~}{}~}~~~~~~~~~~~}~~~}}~~}}~~~~~}|}~~~~~}}||}}|{zsmjiihhghfhhihihgiqrgefhhggjnruvwwvxyyyxxxzyyy{zzz{zyyzyyyyyzzyyxvvuurnoonnmnmlmmmmlmoooopstvvwyzzz{|{{{|}{{}}~~||{yzxwvuwyxxyzzzy{{{}z{{zzyyzyyyxwwsqqoqqppqpqnpx{|||||||{{|}}}|}~}}|}}}~~|||||||zzzzyy{{zzzyy{{z|{{{zz{{{}|||{|||{y|}}||}~~}}}}~~~}~~~~}~~~~}}~~~~~~}~~~}~~~~~~~~~~~~~}|}||}~|{}~}~~zz{{z{z{|{{|}|{|}}}~}~}~}}|}}}|||~}}~~}~}}}~}~}}~~}}~~~{|~}~~~~~~}~~}}}~~~}}}|~~~~|z|}||}~}~}}~~~~~}~~~|~{~|{{|}||~}~}~}~~~}~~~~}~~}|~||{yzzyyyyxx~xww~w~wxwwwv~wwx~wwx~w}v~vvv~v~u}v}v|v{v|v~u~utsttsrpsttsrtsqrrqqqrqqqppqrqpprrrqqpppqqqponoqvz{{{|}}}~}~~}}}~~~~~~~}~~~~}}~~~~~~~~~~}~}~}~}{~~}}}}}|zysnkkkjfhiihhiijiijmpifgghijknrsvwvvwwwyxwwxxwxwxxwxywxxyyxxxzz{ywuvuwunmklmljklmnpllnonlmortsvwz{{zyy{||{|||||}}{zzzzwvuvtvuwx{{zz|{|{z{{zy{zzzzyxtsrrqonpoooppprvyz{{{{|}|||}}}}}}}}|}||}||||||}||{yzywy|yzzz{{{z{}{xz{||{{|{zz||}||~}}|||{|}}}}~}~}~}}~~~~~}}~~~~~~~}~~~~~~}~~~~~~}~~~~}}}||{|z{wz{{}~~~~|{|{{{|||{{||{|{|}}|~}}}~|}~}|}}}~~~}}|}}}}}}}}}~~~~||~~~}||~}~}~}~}~}}~}~~~}|}~}~~~~~}}}}}~}~~}}~}~}~}~}~|}}}}}~~|{|~~~~~}}~~~~||~}}|}}|{{{{{zzy~yyx~y~xwwwxx~w~w}w~wvwwv~v}w~vvv~v~w~v}w|x|wzwzw{wzwzw|v}v}uuuttrrtrssssrqqrrqqqppqrrqqqrqqqqqqqqqqqpppu|{||{||}~~~~~~~}{|}~~~}~}~~}~~~~~~~~~~~~~~}~~~}~~~~~~~~~~~~~~}|{zysoljkkihjkjhjkjiilljhgiikkjjmpsttsrsuwxuuuuutvvutsvxwyzyyxxy{|zywyzwwvpmmmmlllllmnmlmnommorruxxyy|{ywy{}|{{|{{|}}zyyyxvuusutwx{|zz}{{zy{zzyyyzyyyxutrspmooomnoonpvy{zzz{||}}|}}~}{{|}}|||}}|{|}|{{|{{zzzz{yzzz{zzz{|{{{z{||{|z{|||||~~}}}}}||~~}~~}|}}~~~~}}}~~~~~~~~~~~}}~||}||}}|z{|||{}~z{|{{|||}}}||}|||}||}}}||}}}||}}~~~}}}}~}}~}||}~~~}|}~}~~}~~~~}|~}}~}|||}||~}}~~~~~~~~~}~~~~~~}}|~~~~~}~}~~~~~~~~|~}~~~~~~~}}}~}|}z}{~~}~}}}}~{{{{||zy{zyxx~y~y~y~x~y~yxy~x~x~w~x~x~w~w|w~vv~w~www~x|w{wzxyxyywyvzuxwwxw{x{x{x}vtsstutttsrsssrrqrsrsrpqqrrrqqrrqrrrsrqquyz{|{||~~~}~~~}~~~~~~}~~~~}}}{|~~}~~~~~~}~~~~~}|{{yqnnnnmmnnnlkklkkkmmliillkjjkkmqqsrppqrqppopqtutsqqtwvsttvvvxzzyxvwyvsromnnmlmlkkmmmmnoonnprsvzzxxz{zyx{}|{z{{{~~zwvvvvutusttvxzzyzzzzzyzzzzzzzyyyxwussplmoopooqqtwyyx{z{{|}}|}}~}|{{|}}|}}}}}}~||||{{zz{{{{{{{{{{{{{{z{yy|}}|{{|}}}|}~}}}~}}}||}~~~}}~~~~~~~~~}~~~~~~~~~~~}}||}}{|||~~}~~}~~~~~~}}{|}|||~||{{|||{}|}~}|}~|~|}}~~~}~~}~~~}~~~}|~~~|z|}~}~}~}|{~}}~~|}~~}~}}~}~~~~}}~{}|}}~~~~~}}|}~}}}~}|~}~||}}}||~~}~~~~~~~~~~}~}}~~~}~}}~~||}|{z{{z{zzyyzz{~z~yxxy~yyxzx~w~w}w~ww}w~w}x~x}y{yzyyyyyyzxzwzu{t{v|x{u{u{w{yyzxzyzx{w|w}v~w~v~v~uuuuutuuttsssrsssssssssstutssvy{{||~}~~~~}|}~~~~~~~~~~~~~~~~~|}}~~}~~~~~~~~~}}}~zsopponooonnmnnnnmmnmllmlllmnnopnonlnonmlnnmlnopoonnqpomnnmoopoppqtqooonmmmnklmllmnnopqqppstsvwwyzzz{z{}|zzz{yyz|yxwvxuuuusuuvwxxyyyyzzyyyxyxwyvvxzwurqponoopooopnuyzz{{||||}||}}|}}}}~}}}||}}}}}||{{|{zz{|{{{{||{zz{{{{{z|{{||}|}}~~~}}}|}}~}|}~~~~~~~~~~~~}~~~}~~~~~~}~~}}~~~}~~~~}|}|zwwz||}~~~~~~~~}|~~~}}|||{|}||zzz|||||~}||}||~|}}}}|}~}~}~}{}|~}~~||}{{|}|~|}}}}~}~~}~~~}}~~}~~~~~~}}}~}~~~~~~~~}}{~}~}|{~}~}}|}~~}~}}}~|~~~~~}~}~~~}~~~}~}~}~}}}|{{|{{{{{{{yz{{~zz~zy~y~x~yyyy~y~w~w}w~wwv}v}w}x|x{y{zzzxzwzwzx{x{x|w{v|v{v|w|w{x{yzx{xzxyxyyyzzzy{y{x{w|x|x|w|w}w}w|v|v}v}v}v|v}v~v}v}v}v}v|v|v|v}v}v|w|w~wxwz}|||~}~~~}~~~}~~~~~~}~~}}~~~~~~~}~~}|}~zsqqqqqpoopoooponnnoonnnnlmnnnnnnonmmmnmllmmllnnnlmnnmlmlkkmnnmllnommmmmmllmmmnmlnoooopppqsrprttuwwwwwy{yxwwzzyvwwwvwtttrsrsstwyzyyzzyzyxwwwwwvvwxxwttqppopooppropvyz{|||}|}}|||}~~}}~~~|}}}|}~~}}~}|{{zz{|{zzz{||{|||||{{}|{|}}}}}}~~~~||~~}}}~~~~~~~~~~~~}~~}~~~~~~~~}~~~~~}||||{u{}||}}}}}}~~~~~||||}~~}||z{|}|}||||~~}|}}~|}{|}}}|~}}}|~}}~{|}{z}}~~~||}|~}~~}~~~~~~~~}~~~~~|~|}}}}~~~}}~}~~}z{}|{~|}}~~~~~}~}~~~~}~}~~~~}~|~}}}}~~~~}}|{{|}}|~|}|{{{zzzyyz}z~zzy{yx~x~xv~vwww}w}w}w|y|{zzyzx{y{y{y{y{y{x{w{x|x|x|xzy{zzyzzyyyxyyyyyyzyyyyyy{y{yyxzxzxzx{y{y|y|xzxyy{y{yzyzxzxzxzyzzzzyyxyyz|z}xwxzz|}|}}~~~~~~~}~~~~~~~}}}~}|}}}~~~~~~~~}}}}~|zvsrrrrqpnppoonnonmlmnnnnnnnoonnnnnmmmpoonmnnnmmllmnmmnlmoonmmnlklnpomlnnnmlmnnllmnnonnoppponlonoomoppnmpppqstrprrpppoproopsrutvz{yxxxwwxwwxwvuuuwusrrpnpqoonmmpppvz{|}{|}||||{{{|~~~~}~~}}~|}}||||{{{zz{{{|{{|{{|||||}}~~}~~}}}~}}~~}~~~~~}{}~}~~~~~~~~~~~~~~~~}}}|}}~~~~}}~~}||zx~|}~||~~~~}{{z{{||}}}}||}~~~}}}}}}}}}}~~}|{||}|~}}}}|}}~}||}}{{}|~||}~~~~~~|~}~}~}}}~|}}~~~~~}}}}~}|~~~}}~~~~}|~{~|{~~~~}~~~~~~~}}}~|~{|}}~~~~~}~}|~}~|}}||~}{{~z~y~yyzyy~y~z{zzx~xxxv~v~wx~w}w~w~w~y|z{zzzzzz|z|y{x{y{y{y{y|y|y{xzx{yzxzyzzzz{yyzyzyyyyyyzzyyzzzzz{zzyzz{z{zzy{y{zzzyyyy{xzyzyzzzzzzy{{{{||{}xvwyz{~|{~~}~~~~~~~~~}~}~~~~~~}~~~~~}}|}~~~~}}~~~~~}|}{z{xutttsrrrpqqqpmnoppnnppppopqqqopqqpoqoooonoponnoopopoppoppopnppomnpqpononmlklnomlmlmoonnmoomllnnmkmnmkjhhhilkljiijhgkkjjihimoooqrqrqrpnprqpqqrrqrronoomlnppppnnrrpvz}|||{|||}}}|}}}~}}}~}~}}}}~}{{|}}|{z{||{{{{|{|}||{{|}}||}|}}~||||~~}}~}}~~}}~~}}~~~~~~~~~~}~~~~}}~~~~~}|}}~}}}}|z}}~~~}}|{||zyyzy||~~~}~|}}}|}}}}}|}~}|{|~}}|{|||||}}~~~~~~}}}}~~}}~}~}}||}}~}||}~}}}}}~}~}}}|~}~~~}}~}~|~|~~~~}}|}}}~~~~~}~}~~~~~~~~~~~~~~~|}|~~~~~~~~~}~}}|||~||}||~}|{|z~zzzyzz{{zzyxxxx~w~v~v~u~u~wx~y|zy{z{zzz{z{y{y|y|x|y|y}y|y|x{y{y{y{yzy{x{x{y|z{zzzzyzzz{z|{|{|z{{{{|{{z{z|z|{zzyz{y{y{zzz{z{z|{{{|{|{}zxy{{{}}|}}}~~}~~~~}~~~~~~~~~~~~~~~~~~~~~}}}}||ywxwvvtuurrtwutrqstqoprrqqqrsqorrssqqqponlmmlmmnonopqqqqrqpppqsrqpprrqqrponnnoqonnoopopppoomlmnnllnnnllkkkjgjkjggijiihhhhffgkkjghijkjjijlkjikiihjkkjkmommnoopqrrqpw||||}|{{~~}~}}}}}||}}}}}}}~||}}}||{{{||||{{{}}|{||}|{{|}}}}}|{|||~~~~}}}}~~}}}}~~~~~}~}~~~~~~~~~~~~~~~~~~~}}~~}}}z|}|{}|{}~}~~~}|}~zvxxuv{z~~|}}}}~~{{}}}{}}}|{||||~{{||||}||}}}}|}~~}~~~~~~~~}~~~}}}~}}}}}~~~~}~~~~~~}}~}~~~~~~}~~}}~}~~~}}~~~~~~~~~}~~~~~~~}~}~}~|}}~~}~}~}~~~~~~}}}~}~}~}|~|~||~|||{|~{xzzzzyyyyxxwwuuvttw}x|{{{|z{{{{{|z|z|z|z|y|y}z}z|z|z{z{z{y|z{{{{{||}}}|~z}{~{z{~|{~{|z}y~zyyzzz{{zz{{{z~{~|{{{z||~}}}}|{z|}}}~~~~~~~}}}~}~~~~~~~}~~~}}}~}}~}{zyyzxwwvvutvvxxvuvutuuuttututtuuvwxvurqookkmnlkjiikopqqqqstsstvvtsrssrqrrqqqqprqppqqrqppttqqqqqqopppppppppssoponoonmmmnmnmmlmmmljijkkikjklmlmolmmnooopopnnpooqpqrqrv{{}~~~}|~~}~~~~~~~~~}}||}~}}~|||||{{{{|||||}|{|}~~}|~~~}}~}}{||~}}}~~~}~~~~}~~~~~~~~~~~}~~~~~~~~}|~~~~}|{z{|{|}~zyz||}~~~~~}||{zzyxxvtux|||{|}||}{{}}|||{|||||}}||z|}~}|{|}}}}}}}}~}|}}}~|}}|~|~}{~|~~}}}~}~~~~}~~~~}}~~~~~}~~~~~~~~~~~~~~}~~~~~~~~}}~~~~{z~|~}~}~~~}}}}~~}~|}}}}{|||}}}}|~}~}}}}~{{{}|~z~{zz{zyywxyxyxwvvv~w}y}{}{|||}{}z}z|z|y{{|{{z|z{{{}|}|~z{{{{{{|{zz{zzyyzzz{yzzz{{{z{{{yz||{||{|}}}}}~}|{z{|}}~}~~~~~~~~~~~~~}~}|{yxz{ywxxwvxxxyywxxvvwwwxwxxxxxxwwyzxvvursqmqrqmjjlnnpqrqrsrsttuwuttvutttvurssstrrrsssrrqtuursrrqrrqrrqqrrquurqpopqqqqqpprqqrqqrqqppqpopqqrqrssr~rrqrrqqponopoomnqqqrx}}|{~~~}~~~~~~~~~}||}||{|||||{{{{{z{|{{||}}}~}}||~}~}}}}~}{~~~~~|}~~~~}~}}~~~~~~}~~~~}~~~~~}}~~~~}~~~~~|yz{||}|~}}}|}~~~~~~~||{zzzyxuqqu{y{|}{{{|}}||||||~||}~~|||||}|}}|~|}||}}}}~~|}}}}~||||}~~~~~~|}|}}~~}}}}~~~~}~}}~~~~}~~~~}|}~~~~}}~}~~~}}}~~~}~~~~}~~}~}~}~||}|~}}~~~}}}}}~~~~~}~~~}~}~}}~}~}{~y~z{|{{z{zyzyxxyyx~yyxzyyzz~z}z}z~{~{~{}z}{{{zxzxxz{{}|{{{{{zyx{{zzzz{zzzz{{{{{{{{{||{||{z}}~~}~~}{|~~~~~}~~~}~~~~~~~~~}}|}}||||||{{yz{{{z|zxz{zyyyz{yyzz{zz{|{{{y{{yxwvxwvvvwwxxxwwyxywvtutsrqtuwyywyvwwwwvuwwuuwvwtuuuuttvwvttvwuutusrrrrqrrrrrstrstrtvtsstsrsqrrqqqqqppqpqqpqssssssrsrsrqqporv{{|{||~~~~~}}}}}~}}}}}}}}}}|{}|||||{|{|}|}}~}~}~}}}~~}~}}~~}}}~}}}}}~~~~~~}}}~~~~~}~}}}~~~~~~~~}~~}~~~~||{|{|~~|~~||}}~~}}~}}|{|xwzzyyxxx|y{|}{|}~}||~~~|~}||}}}|}}|}|}}}}~|}|{|~~~}||||~{||}~~~~~}}||}~}~~}}~}~}~~}~}~~~~}}}~~|}~~~}}~}}~~}~~~}}|}~}~~~}~~}~~}}}}|}}}}~}}~}~~~~}~|}}}~~~~~}~}~~~}~|{{{zz{{zyzzzyzyyyz{zxwyzz{z{yzz{{{yvyzz{{|}|{|{|{{yzzzzzz{|z{|}}{zz||{|}}}}|}{}~~}~~~~~~}}~~~~~~~~}~~~~~~|}~|||}|{{y{{yy{~|zzz||{{zz{{{{z{{{|}|z{||z{zyyyzzzzyy{zyzz{{yxxvusstttvwwvxxxwyxzwvuvwyxwvwxzyuuvxyvvyzxvuvutuutuwvsuuuttutrsrrssstusrsrstsrsrrtpprrtttuvtsttvwsolnrrv{{{||{~~}}~}}}|~}~~}}}|{}}~}}{{||||||}~~}}}}~}}|~~~}}~~}}~~~~~~}}~}~~~}|~~}}~~~~~}~~~~~}~~}}~}}~~~}~~~|}{{{yx{|}}}~}}}}~~~~}}|{zzxxyyxyyy}{}|}|}}}}|}~~~~}||~{{|}}}}~~|~}|}}}~}|}~}|}|||}|~|~~~~~}~|}}~}~}~~~|}~~~~}}|}~~~~~~}~~~}}~~~~}~}}~}}~|~~~}~|}}~}~}~|~}~|~|~|||~~~~}~}~~~}~}~~~~}~}~}~}~~~}{{z{{{|}}}|{|{z|}|{zyz{zzy|{{yyz{{xxz{||{{}{|}|z{{z{{{zzz{|{|~}|{{~~}~~~~~~~|}~~~~~~}||~}||~~~~~~~~~~~}|}}}}}}}}||{{z{|}~||||{|{{{{|}{||{|}|{zz|~{|{zz{|{{||{{zzz{{zy{yxvtutsuuuttuvvvvvwvwvwxxutvzzy{wvxwxxxzzwwxxvwxwvwvvuvyxvwyutvuuvuuuvvstuvwutvvttstsrsssssututvxsqoprqv{zz{|}~|}~}||~~}}}||~}~~~}|}}|}}{|}~~~}~~}}}~~~}}~~~}~~~~~~}~~~~}}~~~~~}}}~~}}~~}}}~~}~}~~~~~~~~~~}}}|zz{||}|}~}~~~~~~~~~~}}}|xxuwyxwxzz|{}|{~}~}|||}}||{{|{||{|}~~~|~~~}~}|~}~}||~}}~{|~~|}|~}}~~~}~}~|~{~|}|~~~~~~~~}~}}|~{~|~~~~||~~~}~~}~~}}|~~~~~~~~|}}~~}~}~~~}}|~~}}}|~}~}}~|~~~~~}~~~~~}~}}~~~~~}~}~~}|}|{z||~~|||}||||}|{{}}}}|{{{{{z{|{zz|||||||}}}}~}|~~~~~~~~~|}}}}}}}~}}~~~~~}~~~~~}~~~~}}~~}}}|{}}}}}|{}~~|}}~}}|}|{{}}||||||}|||zz|zyy{{|{{zz{{xyxwvuuttssssrsttsrpsussuuvuuuttuutsusstuuvvuwwuvuuuvuuywxxwwwvvwwxyxxxyxvvxwttvyyutuutttsstuvutttrrrqqorx{|}{|~}}||}}}}}}}{}~~|}~}}~~}~~}~}~~~~~~}~}~~~}~{|}}}~}}}~~~~~}~~~}~~~~~~~~~~~~~~~}~~~~~~~~}~}}|{zz|}|}~~~~~~~~}}}|yyz{{yxyy{z|}~|z}}|{|}|||||}}~||z~|}|||{}}~}}}~~}}~~}~|~~~~~}}~~~~}~~~}~~}~|~|}}}~~~~~~~~~~~~}~}|}~}}~}~~~~~~~~}~~~~}~~~~~~~}~}}}~|~|~{~|}~|~~~~~~~~~}~~~~~~}}~~|{}~~|}}}}}~|z{|{z||||{z{|}~~~}{||||~}{{{|}}||}|}~~~~~~}~~}~~~~~~~}~~~~~~~~|}}}|}}}}}}~}}}~}|||||}}}|{}|}}{||{z{{y{{{z}}|zzzzxxxzxwxwwyxxxwwvvwvwvuvuvtqtttqqsqpqqrsuttrsssttuuuuuvuvvvvwvuvvvvvwwwvwvuwwwwuutvvwwuuwwxuttvrprqrqovzz{z{||}}}~~}}}|}}~~~~~~~}~}~}}~}~~}~~~~~~~~~~}}}}~}~~}~~~~~~~~~}~}~~~~~~~~}||zyzz}~}~}|}~~~}}~~~}}|z{{xyyy{zzxz{{{{}~~}|||}||}|||{||z{{|}~||~}}}~}||}|~}~}|}~}~~~~~|}}~~~~~}~}}}|}~}~~~~~~}~~~~~}~~~}|}}}~~~~}~~}~~~~~~}~}~}}~~~~~~~~~~|}}}~~}|}~}~~~~~~~~~~~|}~~~~}~~~~~~}{|~~~~~|}}}~|z|||}}}}~}~}}}|}{|}}~~~~~~~~~~~~~~~~~~~~~}~~}~~~}}|}}~~}}~~}}}|}}}|||||}}~~||~|{||}}{{zzz{z||{zz{||}}}}||{yz|{zyxz|yyxwxwuttttttstttttstuusrsssqsrstqquutvvusttuttvttuuuuqssvustvvtuvvutsqprsurqv{{{yz||}}}}~~~~~~~~~}}}|}~~~~~~~~~~~~~~~~}}~~~~~}~~}}~~~~}~}~~~~}}~~~~~~~~~~}~~~~~~~}||zyzvz|}~~~~~~~~~}yyzyz{{yzzwy{{yx{{|}||||{|||}}}|yz{{|~|~||~~~~}||~{|||~~}}|}|~}~~~~~~~~}~~~}~~~~~~~}~}~~~~~~~}~~~}~~}}}}~~~~}}}{}~~|~~~~~}|}~}~~~|~|~}}}~~}}~~~}}}}}~}}~~~~~~~~~}}~}}|~}}~~}~~~}|}~}}}~~~~~~~~~~}~}}~~}~~~}~~~}~~|}~~~~}~~~~~~~~~}~}|{{}~}|{yz}|zz}|{zywxxyyzzzz||}~}||{|{zz{|{{{}{{{xyxyxuvvutsttttvutvusvvwuvwvvwrquuuttttutqrqtusqqtsrqrsrorrssstsrrqnkmprqqwy{|zz{}}}}}~~}}}~}}~~}~}}|}~~}~~~~~~~~~~~~~~~}}~~~~~}~~~~~~~~~~~~~~~~}~~~~~}}}xy|y{~~~~~~~~~~~~~}}}}||zyzxwxxzvyz||{{{{{~|}}}|{{|{|||{y|}~}|}~~~~~}}}}||}}~{}}~}~~~~~~~~~}}}~|}{~}~}}}}~}~~}}~}}}~}~~~~~~~~~~~~~~~~}}~}~~~~}}~}~~~}~~~{}~~}~~~~~~}~~~~~~~~||~~~~~~~~}}|}~~~~~}~~}{{yy{~~~~}~~~~~~~~~}}~||}}~~~}|}|y{{yzzyywwwxyyyyxy|}~}|}{{}||||{|}}|}|||{{yyzyzywvvwwuuvustrpuwwyzxwxwvvwvuvuvvvvttstusstuuutttrssstsstrqqqollmnlnuyy{{{|}|}}}}}|}}}}}}}}~~~~~~~~~~~~~~~}~~~~~~~~~}~~~}~~~~}}~~~~~~}}|yy|{}~~~}~~~|||{zyxxwwt}}|~{~|||zyz||{|}}}}|||{z||}}~~}}}|}}}}}~}~|}}~|~~}~}~~}~~~~~}}~}~~~}~}~~}~~~}~~~~~~}~~~}~~~~~~~|~~~~~~~~~~~~}~}~}}{|||||||}~~}~~~~~~~~~~~~~~}{xwxz~~~~~~~|{|~~~~~~~|}}}~~||||{||{{zz|{zzzzzyzzyxy|||}|~}}}}|{}}}}|||~}|||z{yzzzyyzyxwxxwwwvwvvwvvuuvxxvwxxwyy{yxxyzywwwwwvuuvwuuttssrrrqqppooppptyz{{||}}}~}~}}}}}~}|}~}}}~}}~~~~~~~~}}~~~~~}|}~~~~}}}~~~~~~~~~~~~~~~~~~{|~~}~~~~~~~~~}||{zyzxyy~yx}}|{zz{||{||}~~~~}}}}{y{~|~~}~}||}|~|~|}~}~|}}}}}~}~}}|~~~~~}}~~}~}}~~~~~~~~~~~~~~~||~~~}~~}~}~|}|}|}|{~{{|{yzzz{zyzyyz{}~~~~~~~~}}}~~}|~~~~|~~~~|{}}}~}{}~}}{|}~{|}}{z{{{||{|}|}}}}~~}}|}}}~~}}||}|}|{|{||}~}~~|||{zz{zywxxywvuuwwtuwxwyz{yxyyzyzzz|{yyyyxxwuttsrqoopqpnooootyz{}}||}}}~~~}}~}}~}}}}{}~~~~~~~~~~~~}}}}}}}~~}~~}|~~~~~~~~~~}}}}~~~~}~~~~|}{{||~~~~|~~~}}}}z{yywwyw|xy|zyz|}|||{{||}zz}|{||{zz{||}||||||||}}|{~~}zy{}~|}|}~}~}~~~~~~~~~~~~~~~~}|{{xxyyxyxxxwwwvxwwvvuvuuuwyxxwyz{}}}~~}|}}~}{{||{||}}~~~~~~}~~~}}}~~}}~~~~~~}}}~~~~}}~~}|||||}}~z{|||}}|}}||{||~~{z|}}}}}~~~|}}|}}}}|yyxwxvvutuwyxyyz{zyzzz{|yz{y{xwwwvtroopppppqpsuzz|}}}}~~~~~}}~}||}~~~~~~~~~~~~~}}}}~}~~~~~~}~}}~~~}~~~~~~~~~~}~~~~~~~~}~~}}{xz{|}}~~}}~}}}|}{xxw~vxuv|{|}|}}|{|{{|}||||~||}}|zz{z|}||||||}}~~~~}{||}}~~~~~~}~~~}~~~~~}}~}{||{xyyxxxxwvvyxvuwvwwvuuvvvvuuwwuuwxxywxzzzzyz{zyz{zzyyxyywxyxxxyyzyyy}~~~~~}~~~~~}~~}}}~~|||{{{{z{{zz{{{||}~~~~~~}~}||}{yzz{||||~~~}}~}~~}}}~~}|{z{|z{zyyyyxxxyyzzyxzyxy{yz{y|zyxvvvrpqnnooqrppryy{~}~~~}~}}~}}~}|}}}~}}~~~}}~}}~~~~}~}|}~}}~~~}|}~~~}}~~~~~~~~~~}~~~~}~~~~~~}}|{{zz|}~~}}~|{y{yvvvwxyy{||}{|}||||||}}~}}}}}}||||zy||||}~}}}~~}}}~|}~~~}~~~~~~~~~}~~~}}|z{z{zyxxyyyyyyyxxwwwwwvtwxxvuvwvvvuuvvvvustutsvvwvuvwuuwwwwxwwzzywuvvvwwxxxxxyxxxwy{z|}~~~}~{~~||}}~||}}|}|||||}}|{|}}}}}}}}~}}}}}}}|{|{|{{||{zxyzyyzz{{{||}~~}|}}}|{zy{|}|}}~~}~}~~}~}}||}}|||z{|{{|}{yyxxyyxyxxyxxwxwvwutssppponopqoptzz{|}~~~~~~}}~}}~}~}~}}~~~~~~~~~~}}}}}|}}~~~~~~~||~}~~~~~~~~~}~~~~}}~}~~}~~~~~~~~}}}{z}{|~~~~}}|~}{yxyxwvwwwz|{|||{{||||{{}}|}}|}}}}}||||{}}|}}~}|}}~~~|~~~~~~}}~~~~~~}~}|{{{{{{yvvxxvvwyxwxwwwxxvvwvvvvuvvvvwwwuvvuvuuutututvvwuvvuttrtuuvwxxxxxuutuwvuwwvwwwwwvuwwyzxyy|~}~}~}}~}~~~}{xz{y{{{~~~~}|~~~~~~||~|||}|z|}}~~~~~~~}}|{|{|{yzz{{{|{}||{z{|||{{{{{zyzzz{{xxzzyywy{{{z{{{||||{|{{|{|{z{{yxz{{zzzz|{ywxyyxyyyyzyzz{{{|{|||}~~~~~~~~}}~~}~~~~~~}||}|||~~}~|||zzzzyxyxxxvutpsttrrqononnknpoqsvy{z{||}}}~~}~}}}}}}~}}}}}}}}~}||{{}~~~~~|}}}}}||}~~~}}~~}~}}~}}~~~~~}}~~~~~~}~~~}~}~|}~~~}}|zzz}~||}~~~~}}~~~}}}yxzwwwz{|{z}|||zz}|{|{{}||}~}||~~}}|}~~}|~~~~~~~}}~~~~~}{{zz{yxwwwwuuuutuuvvsuwvuuvuvvvuvuttttuuvttuuuttuuttuuvvvuvwvuuuttututsuvuuuuvustuutvutuvvuvvvsuwwwuuvwwvwxzwv|~zwvyz|zyyxxvwsvxx||||}~}}}{|~}|}}~zxywwyz{|xwyzyyxxz{}~|}~~~}|}}}||z}||{{{{yyywyyxwwxvwwwuuvvwxxwz|{z{{{yxzzz{|zxxyxyzzzzxxyy{yvxyyyzz{z{{zz{{yy{z{{zzxwxzyzyzyyzzzyxwy{{yyyzyzzyyzzyzyzy{}}}~~~~}~~}}|}~}|}}|||}~}}|{{zzzxwvuxwvuuvvttsqpqqopnpqoquvxyzz{|}~}}|}}~~}{||}}}}~}}|}}||{{z{}}~}~~~}}}}|}}~~~~}}~}}~~}}|}~}}~~~~~~~}~~~~~~~~~~}}~}|z{||}}~}~~~~~~~~}~~~}~}|{{z{zxxz|}{||~}}~~}|||}||}}}|~~~}~~}}~~~~~~~~~}}~z{|{zzyzxwwxxuvtsttuursvusvutttttutsrsuuuvvuttuuuvvvuuutstututuuvvvssttrsruuutrtstvtuuvuttttssttutttuuuuuuuutsrtsolqsstutuuussttnrtustvtuvtuvvvxwwyywwxyxxxwyxvvustvvvuutssqrtuuvuwxxxxyxxywvuttsqpsssttttttttutttsqrsttutsuwyyz{zzz{{{zzyzzyyxyzzzyyxyyyyxvvvvwxxyyxxxyzzyxzzyyyyyyzyxxyxwxxxyyxyyxyzyyyyyzxxzzyyyyzzyz{{|{|~~~~~~}|{}}}}||}}~~}|}}}}{zzyxvttqrtvussssrppqonqstwz{z{||}}||}}}}~}|||}}~}}}}}||{{}||}}}}~~~}}~}||}|}}}}}}}}~~~~}~}}}}~~}}}~~~}}~~~~}}~~~~~}}}zz{}~~}}|}~}}~~~~~~~}~}~~|~{vuwzzyyyzz{{}}}~}|~|||z{|||y{~~~~~~~|}|~}}~}~}|||}|{{{|{xyyyywywtssuutttstrstttuutuuuwuttttssttstvuvttuuuvuvwusrrttussutuvtrqrrststuusssrrsrrrssstuvstttsstttttrtuutssssrqprttsrrsrstrsspptsstttusstttuvuvwwvwvuuutrtspnnrssssrrpnqqrssststtututtuuttttqqrrsqprtsuttstutturstttttstuwxxy|zz{{{zzzzz{zyy{yxzxxxxxxxxxwxwxxyyzyyyyyyyyzzxxxxyxyxxvzzwxxxyyxyyxxxwwxxxwvwx{zxxxyyxzyyyyz{zxy{}~}~}{}|{{{{{{|}|{}}~||~~~~}}}||}|{zwvwvvvttsspprpnqruvyy|}|{{||}}}}}|}}}}~~}{|~~}}}}~|||}~|~~}}}~~}|}}~~}~}}~~~~~~~~}~}}~~~~~~~}|~~~~~~}~~~~~~~~}}zy{{}~~}~~~~~~~}}}~}|}ysqtzzyz|||||~{~}~}{}~~~|}~~}~~||zzz|}||{{{zzyyyxxwxvvwwvuvtssstsrrsrstssttsssttsussusrssssstuttsstvutuuuuusstutrssssrssprrstuttssrrqrrqqstttttvtutqqsttqsustsstsssrrsssssrrssqstssqsrrsrqrstsstsrtuuuuuuuuuutrrsrnoorsqqqrrqnprrpprsrrsttsrssrrrrpqqpqsrqqqtvvtqssssrqtsttsqsuuuwvx|zyzzzyyyz{zyz{{yxxxxwwwvuuuwwvwvwxxxxyzyxwxyxxxwxyxxyxwzzyyyy{{zyxxxxwvwwxxvwwyzyxxwxwxyxxxxxyxxyzzzy}}~|{{yz{}{yy|{{z|}|{|~~~}}}~~}~~}|{zzzzywwvsqnpqpqrtvyz{|}}}}}~~}}}}}||||}}||}~~}}}|}}}||}}~~}}}}}}|~}}~~~~~~~~}}}}~}|}~~~~}~~~~~~~~~~~}||{{|z|~~~~~}}}}}zwwwyzz{{{|~~}}}~~~||}~~~~{|}}{yyxvxxxzzzwwvstuusuttuttssttusruuttttsttutqrqtsttsrsrrsrqqqssssstrsstuuuttuuuuttsrsssrqqrqrsssrsqrsrrrsrrssssstsustsssrssrrrsssrrrsqrqqqqprsrrqqqrrsqrrrsrpprtsstttttutuvttstssrrrrrrrrrppqqprqppqsrqqppprssrssrsrrrrrqrssrrrtsrrrrrssrrsrrsrsstuuvvwwxyyyyyyyxyyyxyzyyxxxwwxvuvuwwwwwwxwvvxxyxwxwxxxwwwwwxxwxyxyyxyzxwwxwxywwxxwvvxyzxwwwwwvwwwwwwwwwvwxxxyyyz||}~~}{wy||{zz|}~~|}~~~~}}~||z{zz|xxtoqppqqqptwz{{|}}~~}~}|}}|}}}||||}|~~~~}|}}}}|}|}}}}}~}|~}}}~~}}~~~}|}|{}|}}}~}}~~~~~~~~~~}}}{xz{zzz||~~~~~~~~~~~}~~}||{yzzxxz{|}|~~~}}~}{y{{zzyvvvvvvvutssurqttqrssssrssstrtrtvtttsststusutuutssstsrsssqqrsrsstttsssstttttutssrrrrpqsrststuussqqqrsqqpqrrrsstttrssrrssssrssutssssqqpqqpoqrqrqopqrrrqpprrrrqrrssstrsttuvttrpqtqqqrrrqpqqqrrprrqpqqqppqppqrqppsrrrqrssqrqpprrtsrssrqrrqqsusqrrsuutuvwwyyxyxyyzyxxyyyyxyywwxvuuwwuvwwvvvwwwvwwxxyyxxxywwxxxxwxxyzyxyyywvxxwwy{zyyvuwwxxvwvvwwwyywvwwxvvuvwvvwwyzxwy{~}}}~~}zy}~~}}~~~~}}}}|{zxuvsoopppppptwyz|~~}}~}}}{~~~}~}~~~~~~~~}}}||~~~}}~}|||}}{}~~~~}|{{|||~~~}}||~~~~~~~}~~~}{wzz|}||}~~~~~~}~~~}}}}~~|yzyyyy{|}}~~~~~}}}}}{||}|{{zyywxyyxwy{xussssststsrqrttssssrssrrrqrqrssssssssrrrsttsqqsttrrrrsssrrrsssssttsssstssttusssrqqrqqrrrrrsttrrrssrrrrrrqqrrrrsrqstssssstsssrsrpprrqqspnppprrrppqrrqopqrpqrrqpqrssssstttssrrprropqqqprtrpqpppqppqqpqqqqpqssrrsrsrqrrqqqppppooopqrqpqrpooqrppsrsssrtuwwyyxxyyyzyyyyxwwywvwwxwvuvvwuuvvvvwwuuwxyyywwxxxwvxxwxwwxxyxwwwwwwwwwwxxwwvuuuuuuuuwvvwwwvwwwwvtuvutstuuuuvvvxvwxyzzz{|}}~~|{}~~~~}}}zz||zywussrtuqqqpopty{~}|}}~~}}~~}}|}~~~~~~}~~}}}}~~~~~~~}|~}}}~~~~~}|~~~~~~}~~~~~~~~~~~}~~~~}}}yz{|}}}~~~~}~~}~}{zxwxvyzyx|~~~}~~~~~}zz}}|||zzz{zyxyzzyxwxwvuvuutuutsrtttrqsttutssuttssrstrrsrrrssstsrrrsssrrsssqqrsssrqqrrsssstsrrstsrrrttsstttsrrqsrqqqrrpprsusqqpqtqqrqrsqqssrrsrrrssrrstsrrsssrqqsrqpppqqqpqrsrrrsqppqqqopqqqqrrrrrrsuutrqqporrppqppqqqqonomnoooppppqpqqrrrqqqqssrrqpqpoopppopqqqppqqponpsrprrrrsttuwwxzyxxyyyyxxxxwwxwxvuvuuvuuuuvuvuuvvuwwvyzxxwwwwwwxwxwvwwwwwxxwwwxyxwwwwwwvvvvvvvuvvuvwvvwwvvvuuututttuvuuuuuutuutuuvxyyz||}~~|~~~{{{||zywssttsqrrrpstx}~|}}}}~~~}{|~~~~~~~~~}||}~~~~~}}~}}~~~~~~~}|~~}|}~}~}~~~~~~~~~~~~~}}||}||}~}}}~~~~~~~}{zxwwwzyy{}~~~~~~~}~}}~}|}}|||z{|{{zyyzyzxwvwxwvuttttrqrsrqpqrrrsspprttsstuttsstsrrrrrtturqrssrrrsssrqssstsssttrqqrsssssttssqssrrstussssssrrssrqqrrpppqsrrsqqrssppprrqsssstsrrsssrrrsrssssrrqrtrqppqqqqpqqqqqrrqrqqqppqpqqrrrqqprttssrrqopppqqppppppooonnooooqrnnpprqqrrrrrrrrqqqppooopooooppqqqqpopqqrporsrrsuuuvwwxxxxxyxxxxxwxyyzyvuvvuvtuvvvuuuttvvwwxyyyxvvuuuvvwwwvwvwvwvvvwvwwwwvvvwwwvvvwvuvwuvwvwvxwvwvvutttrttttssttutsuustuuuvutuyxxy}}~~}}}|zwttrqqqoqrrtuw{|}~}}~}{|~~}}~~~~~~~}~~}}~~~}~}|}~~~~~}}}~~~}~}|}~~~}~~}~}|}~|z|}|}|}~~}~~~~{yuxz~|y{}~}~}~~~}||{}|~{||{z|||zxxxyyxwvvvwwwuuvtttusrsrqpoppppopnnpompqqqrrsrssrrrrqssttrsssqrrstsrrsrrsrsssstttsrrrrssssrsssssrstssssstutsrssqppprqrsqqqqqqrrrrrssrqrrrqrssssrsrqpprrsssststttsrrrqqqqrqqqrrrsrtrrrqqpooopooooppqprrrtsrrppqqqoonpqpppnnooooonnoonopqpopppqqqqrrqqqpppppppooooopppoooqpqqpqssqrsuuvvvxwvwxwxxxxxxxxxxxxwwvvvuuvvutttuttuvvuvxxwvwxwwwwwxwvwwvvvuuwvvuuvvvwvvvvvutvvvuvvvuvwvvvvvuuwttsrpstuttttttttttsttsuvtsrtwwuuxyxzy}|}~~}{{zwxwuqpqqropqruwy|||}}}~}}|{|}}~}~~~~~~~~~~~}~~~~~}~~~~~|}}}}}}~~~~}~~~~~~~}~~~~~~~~~}||{{|{zy|||~}}|}}~}}{|||{xzutwzz|}|}}~~~}|||zyxxyxxxzzxxwxwuwxvuvvvvuutstssrsrsttqqoorsrppqpqpppnlpqoprstrqrrrsrruusssrssrsqrsrsqqrrrstssststsqprsstrrrrttssrtuuuuuttssssrrrqqpqppqrqppqopqqrsrrqprsronrqqrrrqrrpsssstuusssssrrrqqrqrrqqqrrqqtrppppponnooooomoooqqrqqrromnoomnoqqoqpooonopoooomopprqoorqprsttsrqpnnpqpooooppnopqpoppqqqppppprrtuuwwxwvvwxxxxxxxxxxwwxwwuuvvuuvutuutttuuvuuwwwwwxyxwwxxxwxwwwvuuvuuutuvvvvwwvutuvvuuuuvvvuuuuuutstttttsssttsssrqtsststtsttrtttuuutuuttuwxyzz|~~}~}zxxsqrsrqpruwwz|}}}}}|~||~}}~~~~~~~~~~~}}}|~~~~~~~~~~~~~~|{}~~~~~~}|}}~~~~~}~~~~~~~~}}~~~~}|}}}||~}|||z}~}}}}~}}|zzzzxzvuz{{}}~~~~}~}}|{{{zzywvvvtuvvttttqqpqsrqtsqssssssrqqsrqqrrqqrqoopppopqqqpppqqqpqpqsrrrttssttsrrrqrsrrrrtrqrrqrsqrsrrrrqpqrqqqrrrrrsrrsuvvsssssrssrqqqqrqrpqqqpqqqpppqppqqrrqrqqpqrrrqpqssssssststsrrrrrsrqqrrrrrqrqqrqqpoqpooonoonnnmoppppqqqqqoppppoonnoqpmlnonnnoooooooppppnppppqqqqpoqqppppooppooooopppoppqpqqopqrqsttwvvvvuwwxxxyyxwwwxwwvutuuuttruuutsrqsuutuuvvvvwwwxxxwxwvwwwwvtuuuuvuuuvwyxwuvwvuutuuuvvutttttsttsstssrssrrrsrsstssssstsssstttttrqssttttsuuwxxy{{{{||x~wtrtrpquxvy|||}~}}~}~}}}~~}~~~}~~~~~~~|~~~~}~~~~~~~~~~~~~~~|||}~~}~~~~~~~~~~~~~~~~~~}}~~~~~~|~~~}}}~}}}{{|{z|xwzz~}}~|~~}|{|}~~~{}}||z{ywxxvvvuttssttrsttrpoqqrqprsstttssssrrqpqqppqqpmkmmoqqqqqqqrrrrsrrssssstuuttuttsrrrsrrtsrsrqpqsrqrqrsrqqqrsrssqqqsssrrsuutrrrsrsrssrqrrqqqqrrqnoppopqppqqqqrqqqqrqqrsssssuutttutssstsrrqrrrqqqpqqqqpppppooopooooonnmmmmnnpponopoqrponmnlmnopmnnnnmnnooopoopppqpppqpppqpppqppppppqqpoooonopoopqqqqpopqrsssswwvwwwxwxxwwxxwwvvvuutttttttutsstssssttsuuuvuuvuvwvvxxvuuutuutuutuvuttuuvvwvuvvuuuuuuvusuutsstsssrrrrqrrrrqrstrrsssspqssssttttsrssqstssuuttvwwwxxwx~{|}zx~w~xwvvxvy{|}~~~~~~~}~}~||}~~~~~}}~}~~~~~}~~~~}}~~}~~~~~~}~~~~~~~}~~~~~~}~~~~~~~~~~~~~~~~~}}}{|~zz|xz|}~}~|||zz|{{||{|{zywxwttuusrrrrqrrrrqqrqpmnpqqpsrpqrpnqrrrrrqqqrrpopomopqqqrrsrqrsrrsqsrsssstuuvtstsqrrrsrrrsqrrrqqrrpqqrrrqrqrrqrrpoqsrrtsrstssssssrrttrqqqqqpprqpooponpppooqppppoppqrqrssttsuuuutututsstsrrrrrqrqqrrrppqqppponoonooommmnoonnpplmoooqqomlmnnnmmmmnnmnnmnoonnooooooppopopqppppqqrqqqqqpppomonoopqpppppqqpqrtttuuvvvwwwwxwvwxwvvvvvwvuuuttttuuttttuttsttuuuuutttvvvvvuvuutstuuuutttuvutuuuvvvuvuuvvvvuuttuuuttsttsssrqsrrrqqrsrrqrstpqrppqrruusrssrqrsssssttttstuuuvw~y~y}z|}{}{{zxyz|}~~~~~~}~}~~|{}~~}~~~}}~}}~~}}~~~~~}~~}~~~~}~~~}~~~~~~~~~}~~~~~~~~~~~}~}}}}~~~}{|ywyzz|}~~yxuxzyzxyzzxtturtsqqrrpnoonlkjnonnonnooopooqppoooomnoprqqqoqpqprqonoprrusqpqqpooorssssssttttssssroqrrtsqrqrqrqqqrsrrrrqrrrrrqponpprqpqrssqrrropqrrrqqppqqpppqqqqoonopopqqqoopqqqqqrrrsuutrsuutrsstsssstrrrrqrrsttqpqpppppopooonnonmlnmmponnnnnnlnommllmmmnmmnnnnmmmnnopnnnnoonnnppnnppppopqpppqqppqppnmoqqppqprstrqrsqrssuuuuuvwwvwwwvvwwwwvwwttttstussttttsssssrrstutuvutuvvvvvuuvuuttutttuuutuuutuvuuuvuuvwuutssuuttsttsttssstsqnpppqsrqrqrrrsqrqprqqqqspoqrrrqqrrrrrrqqusstuvxvxyzzzy~z~}~}~{|~~~~}~~~}}}~}}~}}~~~~~}~~~~}}~}~~~~~~~~~||}~}~~~}}~~}~~~~~~{yz}|zyz{wuvvzyxy{|}~~xwwwyz{vussqonoonlmnnnmknlnlklnmkjnllmnppooooppnoponoopprqpppppppppppqqssqrsrqoopsssrstuutttstutroppqrqpqpppqpoqrrqqqqqrqqrqqppooprpnprrrqqrrqrrsrqqqqqqqpppqqonlmopoooopqqpqrqrsrrrstttustttsssttrsssrrrrrqqpqrqppqqpppppponnoonnnnpmmppooopponoommmmmmmnnlmoomjlnnnooponnooonmoppoopoppopppqqqqpqqqoonnpppppqqrpppqqqssttttvvwvwwwxxwxwwvvuwvutttttttsqttrqsssstuuuvuvuvvvvvwvuvvwwuttsttutuuvuttuvuuuuuuwwvutttttttssssrsssrqrqprqpqsrooqqrqqppqtttrqqqrppqqqqqsssrsttstsqrstuuuvwwuwzzyx{~~}}}}}}}|z|}}||}}~}}}~~~}}}~~~}|}~~~}~~~~~~~~~~~~}}~~~}}~}xy|}}|{zzxwvxwyxy{{~~~vtutttuttqsqqrnnnnlllklmmmnljmopliknnnopooppnopomoqppqrqpppoppqqoppqpqqpqqqqqrqrrutrsssuutrtsssturrqqqqrqqsrrsrrqqrqqrqpqqppqoopooonoqpqpppsrqqrssqppqqrqppqpppoooopoopqonpqqrqqqrrqrtsssttttttsqstsssrsttrqqpppqpqpoppnopoooopnoolmllnooppoooooommmnnmmmnnmlmmnmnnnnonnnnooommmnpppopppooppprqppqpqpoomnonoppqqppqqpprssstttvvvvvwwwwxwwwuuvvvustussstssssttttttttutvvutuuutuvutuvvvvvutuuwuutuuttstuutuutttututttrsurrrssssrrrrrrqrqrttsrrrtrrrsrrrrppqqrrrrrrrstrqrrruutttssrrstttttvyywxwy{|~~~~~~}~}~~|}~}~~}~}}}~}|}~~~~~~}~~~~~~~~~~~~~~~~~|}~~~~~|~~|~~~~|}~||zwxuyyyyyxxz{{y|~~~~~tsrprrrqrppppploqplmlmnnnoomknonmmnonmoonoppooonnprpopppnppppopppppqpppopqppprrrrtsssrrstsstssssrqqqrqqqqrsssrrrqqqrqrqqrqppppppopoopqrqqpoqqqqqrrqrpqrqqqoooppnoppoppqqppqqqrrrrstrqsttttuuttsssssrssrrrrqpppnmoonoooonnpnpooonoonnmooppqpnnnoonnnommkklmmlmnmnnnoonnoooonnonnnnooppprqpqpppqqpqqpqqpoopoppppoponppporssssstuvvvvwwwwwxxwvvvvvtttsssqsrsssttttsttsttvuvvussstvutuvuuttuttuutttsttssvuttttsttuuttssqsttsrsssrrqrrsrprqrsrqrqrqoprqrqqqrqrqpqqssrrrrrqoqrturrstsrrstustutuvtuuvvuwxxyzz|}~~~}|}|}~~~~~~~~~}}{z|}}}}}~}}}~~~~~~}}}~~~~~~~~~~~}~~~~~}}|~~~~~~}}}|yywzzyz|zvx{{z|}~}}~~qpnoqponoopoooopppnlmmmllklmkllklmmmmmmnoonoppppqrrqpqqnnnppppooqpqponnoonopopqqrsssrrrsssusssrrqrqqpqqqqsrrsrpqqppqqqpppoooponnnpoqppsqpooppoqqqpqqqqpppppppoonopqpoopqqqsrrrrssssssttuttvusssstsrrrtrqqpqpopooponppooonmnoonnnoopqoononnnmlmnonnnnnnnnmnnnopnmmopnnpnnnnnmooonmoopoqrroppqqqqqqqpppqpoopopppppompqqqrssttttuvvvwwwxwxxxxwvvtttttsrsrqqqrrssttttttuuvuuvwtsuuttuuuutsttutuuusttuvuuutssssrstssssssrrrrrrsrqrsutsppqpoqrppqqrqpqqqqqsrrqrpoprrqqqqqrrpqrrtsqqrsssrtussuuttsstuutttruvvyzzz|}|~~}~~~~}}{z|}}~}}}||}}~~}~~~~~|}~~~~~}}~~~}}~~~~}{{zzwwwxyxx|{z{||}}~~omnooppoopnnnjlmmnmmnmnmmonoommlmmnnnmmnoonpqqpqooooooopooppqqpqrqqpqppqqprrpqrrrtsqrrssssuttsrpoqqqppqqqqrqpppppppqqrponmooonoooooooppppoopqqpqpppqponnnnnpqqppqpqqqqsrqqssrsttssssttttttutsrrssssrrssqpponmoonnooonnopoponmnnonnoonnmnnoonnmnnnmnnnmmlklnmnooonnnnnnmmnnnmnopqqqpooqqqpooppqrpppomqppooonnnoppnnpppqqrstuuvvvvvwwvvvwwwwxvvwttttsrssqqqqqrqsqssttuuvvvvvxvvutuuuuuuttttssqrsrstusuttuttstttttuurqrstsrrrqqqstrrqqqpppqrrqppppqqqoqsrrrrqsrqqqrrppqppqrrrrrrssssstsstttsrrssrturssuutstutttruzxyy{~~}~}}~~~~~~|~~~~~~~}~~}~~~~}|{|{{zxwzzzxuy{{{{}}}}~~}}~nnnnooonopnmnmmnnmmnnnnnoonoooonnnnnnoonoopqqppponoonooopppqrqqppopppopppooqprrrrsrrsssssrrqssrqpqqpqqqqpprqqqppqpnonnopnnnnomooooooolmooppqqqppqpoqponmpqppqqqqopqrqrrrqqqsrssstttsstsssssstrrssrrrrrqppqonoppnlnoommoonnnnnnoononopomnnponlmnnnmlmmllklnmmnnnooppoommnonmnoppppppppppqpopqqrrooponpponnooonoopomoopqqrstvwwwuvuvvvvvvuuvwwwvuuusrsurqqqpqrsrrstuttuuuuuvwvuutttuuvutssttsrrrssttttssststtttsssrrrrrqqqqrprrrsrrrqqqqqqrrqqqqpqrqpprqqqpsqqqrrqrrprqpppppoprqqrrtvusstssrssstssrsssrssrrqpoqqrsussxy}|z|}~~~~~~~~~}~~~|~~~~~~~~}{xryzzvvxzzz{|||~~}~lnomnonmmmonmnmopnnmonnnnnoooopooooonnonnpqppnnppopooqppppqrrppppoppoopppqqqqssrrttsrrstsrsrsrrqqoppqpppoppppppnnonomnoooooooonoooonnooqoqqqpppqqqpqrqqpqpppppoppqrrrsrsrrsstutttsrssssrrrrrqqqqrrrqrrqqppppnomlnopnmmmllmmmnmmnnnoponnnoonmnnnomnligjlllmmnnnnopooonnopoonnnooooopooponponpppopoooppoponmoonnnoooppoqqrrststvuuuvvuvuvuusuuuttttsrstrqrqqrrqqqrstvuvuvvvwvvvuuuuwtrttttsrssrqsssutrrrsssssrrsrsrrrsropqqrrrssrqsspqqqqrpqrqqpqrqqqqpqqpqqqqrqpppqqpqqqqqqppqrrssutssststrsssutsssqrrrqrrqpomnoppqspquuvwwxy|~~~~}}~}}|~~}~~~~|}~~~}|}~~~~~~~~}z{{||y{}{|{z|}}~~~~nmnlnnmmmnnnnnnonnmmnmnmlllmnmmnoppnnnnmmnonmmopppoponpqppppqpoooooponopooporqqqqrsrqstusttssrrrrqpppppqqpqpopppnnoooooppoooopqppppppnopppppqqqppqpprsrqqpppqppqrstrrrsssssssuussrqrsssrssrrqrrqqqrqpppqooponnmlmmnmlnnlloopponmmoppooooppomnoponnnlmnnnllnnmnnnnmnppoopoppoopppooooooonnnnomklnoomnponnonnnonmmnmomoqpprstsstuuuvvvuuuvttuststttrrqssrqqqrrrqsstuttuttuvvuvuuuuvvsrstssssrrtsstrrrrrrssssssssrqrrrqpqrqqqqqqrqorrqqqpprsqrqqpqqrqpqqpqqooonppqpprqoopqppqqpqqrrrrrssssssrrrsvsrrsrqqqqqprqpqqppqpqqqsqssttvxy|z~~{~~~~~~}}}~~}~~~~~~~}}~}~~~~~~~~~~~|}|{|z{{ywxz||~}|}~~~~onnmnmmmmnllnmmmnnnnnnmlnononnmnoponooolmnnnopoorqpqoopqpoppqqqqpononlnopppoqqrqqprrrrsrrssrsrqssrpppsppqrqpppponoppoooppooopppqrppqpnmnooppppqpppqopqqppqoopqrqqrsssssstssrsssttsrrssssttttrrrqqrqpppqpoooonmklllmlkmmlmnmopqonopooonnmoonnooommnnmnonmmnomlllmnnmnnoononooonppnnoonoonmnponmnnmnmoppnmnmmlllmnnlmmoppoqrsssuuuuvuuuuuvtsttutsttrqrssrqrrqrsrststtstuuwxuuvvvuuuutsttsstutrssssrqrrrssrrrrrttsssrrqpqpqqqrqrrqqqqrqqpqrsqqqoopqrppqpopqnoonooppqpppoopppqqqqqqrrqqsrssrqrrrstrrrrrpqrqnprqpqsrrrsrqrrqqspmostutuvwxz|~}~~~~~~~~~~}~~~~~~~~}||{{zyyyzzz{|}}~~~~ommmmlnnmmlknonoollnoooopononoonnopmkjlnonoopoopsqqonoqqpqqqpqsqpppqpopppqqppqqqqoqsrrqqsssrsqrrqoklmpqonppopqponnopolmnonoppoopqomooonopoppppqpprrqqoppqrqpqqqrqrssrrsssrqpqqqssrrrrsrqrrsrqrqpqrqppooqoonnnnmlnonmlnllmlmnloomnnlmmmmnnoonnnnmnnmlmnmlklmmmmnmnnnnonnoonnnopppooooonnopooonoomnoonmonooooonnlnnnnmnmoppqsrssuvuuuutuuuustuusrttssusqrstrqsssrqssstttuwxwutvvvvvuttuuuuutsssqqqrrrsussrrrrrtrstsssrqooqrrqpqrqppqqppnpqqqrqqpoqppoppponoonoooopppooonopqpqrqqrsrqpqqpqqqqqrsqqrrrrpqsqqppppqomoqppppqqqqqpnqpppqqqtutux|{z{|}~~~~~~~~~~~~~}~~~}}}{{zxwxzzzyy|~~~~~}rmmnmknnoonnnpooponooononoqoooomnppnlmnonnnnnoonppponopoopoppppppoopqqqqqqsrqqrsrqrsrsrrsrrqrrrqqpnooprpoooppponnnnpnmnoooopoooppooppppooopqqrrqqqrqopqqqqpqqqrrrrsrrrsqrrrrprrrrrqqrrqqrrqqpqqqqqpponoonnnnmmnmonnnmmlmmmmmnpoonopomlmooopoonnnnmlmmmnmkmoonmnnonnnnmnpoonnoqqpooopppoppoqpnnoonnnnmmnnnononmnoponnonmloqssssutsttutuvvtttssstuutttrrsutsrtsrqrrrsttttuuvuvvuuvuutttstssutstrsrrrrrssssssrqqrrqqqqqqoopqrrpqrrqrrqprpppqrrqpqoppppppqppqonpooopooqqqpopqpqsrqqrrqqrrqrqrqqtspppoppqppqqpponnqpppppnpponoopppoppppqtrpsvvuvwx{|||~}~~~~~~}~~~}}}}|{zyz|{{xx|}|||}}pmmnnnnnmmponnnnoonopooonoonnnnononnnpqonmnoonoppppoprqopooooqpppooqqqqqrqqqqrqrrrqrrqqqssrqpprqqqoppnooonooommnnnnonmmnopqpqrqqqpppoppppqqppqqrrrqqqqqppqqrrrrrrrrpqqqqrrrsrrqrrqqrrqppqpqpoppqpooonnnnnnnnnoooppmmlllmnmnnnooooqpoonoponnooonoolnmmnpomnnnooonnnoooooqpnlnooooonnonopononnopnmopononopnnnnmllmnnnnonnpqrrqrsssttuuttuutttutsssrqqqrqstsrrsrssrssstttuutvxxutuuutttssstttstsssrrrqqrrsqrrrqqrsqppqrqpqqqqpoooppqrqqqpqrqpqqpoonoppopooqpoooooppooooooppopqqqrqqqpsrssrpoopppnopoqpqpopqpnoonnnooooppopponomoppopoprqqpqqoprtruvwwxwz}|}}~}~~~~~~}}~~~~}{}~~}}}}}||||||{|wuy{{~onnmlmmnmnooppppooonnnoomnononnnppnnnnoponnonnoppppoprooponnoqrpooppsspqqqqqqsrrrrrrrqqqrrqqqqqqppoooooooopoonopononnpqoopqqqqqqpopppooppppqqqppppqrqqqqqrqrrrrsrrrrqrrrrrrsrqqqqqqqqqppprqppppppnoppmlmnnmmmnmmnomkmmlmnnpnooppqronononnmnommmnnlnnmlnopnlmnnmmmnnnnooqspmnopoopponnppopooqqoonnqonoooonnnmmmmnlmoonmmpqpqqrsssttttstturrsssssssqqqqqqqqrqqqrrrqqrtssrtuvwxustuttststutsrrssssrrrqqrrqqrsrqpqqpoopqrqppqpopopqoopqrqqqrrpopqpoppponopqqonnnoomnonnnmmoopqrrrrrsrrssrqrqpqqqoppqrrpqsrrqpnopnmlmmlnonoqooonnoopoompqpppppnmnpqprtuutvxyyy{{~~~|~~~~~~~|~~~~~}}~~}~}~}}{|}~}lklmlmmnlmoopnoppoonnonnmnmonmmoopnnnnoopnnnmnopooomnpoppoopopqpppqqrtrqprqqqqrsrqrsrqrqqrqrqpooppnponooooononnoonmmnnrqpqrqpppqqpqqqpopppppppqpopqrqqqrrrrrrrrrrrrstssrrrrrssrpqpppppoopqpopqomnnmnpmjlmlllmnmlmnmklllmmnpnoopppponooomnllnmmnnoooooooopqmnoonmlnoonooponoooooopponmonooooqpnnomnnoonoonoooonnonnooonnpqqrrrtsstuttssttsssstssrrqrrqqqqqqqqqrrqqqrrrrpstuvutututsuusrtuttsrstrstsssrqqqsqrrqppoopqpqppqppqqpqppqpoqqqqpqqpoppppqqpooqqpoomooomooononnoopqqqqqrsrrqqqqqpqqqpoqqpqrsqrtrppopnmononllnnrromnnnmnoonloqoooopoomnoomkpopqrqsrttxz|}}~}}~~~~~~~~~~~~~~~~~~~~~}|z{|}kkllmmopooooppnnnmnnmmnmmnmnmklmlmmmmnmmlnooonooopopopppnnononopopomopnnoqqqrqprrqrrrrrrrrrppppppqqoooonmooonnmmnomnoooonmopporrppqrqrrqrrqqqrrrrrrqqpqrrqrsrrrqrrstrrrsrqpqrppqrrppponnommnnonmnnmmnmmmmnononmmmmmnmlmmnomnpopnnnoqppponlmnnmoonnmnnnoomospoonnopnlmlmnooooonloonnnnonnnnooonnnmnnnonnopooponnnnnnnmnooppqrrrsttuutsttutstssqqrrrrqqrrrrrqqqrrqqrrqrssttuvuuutuuuusrqsssrrsttsrtuttsrqrrqqrrrqrrqppqporrqonpqqqqqooppqppppoopppqpompppppoooooooppopppnopqpoorsqpoqqqprqqqooooopopqrqoponmhjmnoonmopoponllnonlmlmmnnonnppomnppponpppnoprqnorsrsvutw|}~|}~~~~~~~~~~}~~~~~~~~}~~~~}}~~~}}~nlmlmmnnnoonpqqnnmnonklmmmllmmmmmnnmnnmnmmppooooopoppponmkmnnnonoppppomknqrsrporrqqqrrrqqqqqpppnmppooononpppnnmnnmnnpoonnnooporroppqrrrrqqpqrsrrqqsssqrrqqrsssrqrrrrrrqtsrqqrooqqqppnnoopnmooonnnnonmmmlmnmmmmlmnmnnmmmnnmmmmooonlmonponllmnnnoooommmmnnnnponoooppommmooooooponopnnpoooopppommnnnnmnoonnooooomnmmnnonooopoprrrssstssttsssssrsqprrqrrqrsqpqqqpqrsrqrqqrsuttvwutttsssrqqqrrqqrssrqtssrrqqrqpqqqrqqrpqqqpppqqomopqqppponpppqqoooppopqononnooppppooonooooppppqpqqrqqppppooqqqqqpnkmonmoronoonmiiklnmlmmmmmlkmnlommmmnnnnlmnonmmmnppnmnoommoopnnoppoooquwxxxxyx|~~~~~}}}~~~~~~~}}~~~~~~~}~}}}~~~mmkklllmllmnmnnmmmnnnllnmmpoonlkjlmmnmmnlmnnoooonpqpqpoqpopononppoooonmoqqopoooqqppqqrrqqqoppoonlmonnoponoqpnnmnnmlmnonmnnnppppqoopqrrqrrrrssrrsssssrqrrrqqrssrqrrrqrrssrrqqpprqpqqpoooopooooponmmnmnnnlmnmlllmmmlmmmmnmnnnnmnpponpoonqonnmnonnoooqponooooppoooonpqoooooopqpppoponoqooooooonnnnmnnnnnonnoponmmnnnlnnnonopoprsstsrstttussrqqsrsrrrrrqqqqqpoqqqqrqqpqrsrsttrtvvtuuststssrrrrsrqrqpsrrqqqqqqqqpoopqqonopprsrqqopqppppooooqppoppponmoonoommmlnnopoopppqpopppqqpqppqqrqqqopqpopqonnnpqnmnoononmnomnmnnnomlmmkjmmnpoonnlnonoonppnlmmnmllnmnonnonnnlmoppqqqrqruvuuvx{zz|~~}||}~~~~~~~omklmmmollknnnnmmnoonnnnmnnnnmmmlmommmmllmnnnonnpppprppponponnnopnnnoooopqooppppqppqqppqrqooononnonmmnponopqnnmnnlknnnmnonoopopqooppqppqqqstsrrrstsrqqqrrqpqssrrrqrrqqrqqqrppppponnppoopppoonomnonmlklmmnpomllmmnmmnopooooooooqnmoooonmlmmnnnnopooooopopnoooonnnmooooonoppppoopqoonopppoqpponnnnnnnonmoooqqonmooomnonnnnpoprtrsrrrttsssqpqpqqrqqppqppqpppoqqppqqprrssstttsstttttsusrrrsrqrrrsrrrrrrqqqqpqqpppopqqponqssqrqpopsrpnooppopoonooopnoonnnonomlnoqooopppnpopqqqqqrpopppoopppqppqrpoonnoonnnnmmnonmlllmmlnmlmmlkmonooonmkmoooonqpnlmmnihjmlnpommlnnnnnomnpqqqsqprsssvrtwz|{{}|}~~~~~~~~~~~~~~~~}~~~~~nlkllmnnlmllnnmmnonnnnnnmmmmmmnnllmmopnlnlmmnnnopopppppppooopmoqqpoooonmnpoooppppopppqqponmnooonnoooppnoopqqonnnnmmnopmmoppooopqqpqrrqqqqrrrrrrrrrrrsrqrrrqrrrqprqqqqrqqpqponoooonopponnopoooolnnnmljmnnmnmmmommnmnnnoonmmoonmooonoooonlmmmmmnooooooppoononoonnoonnoopooooponoopoooppppoqrpomloonononnopppponnooponnmllnpoprttrrrsssrrrqqrpppqqrppqpppppppppppqqoqrrrstrrsssssrrssrqoprssrqrrqrrrrrqqrqprrrrqppqppooqqpprqpnoqqpooqqqpmnnnnooopppoqonmmmmnnomnmnppopnpqsrrqqqoppqppoooqqqrsoponqpoppnnmlmnnnnlkmmlnmllmnnmmnnmlmmnmnnmmopomllkmjgllnnolifimnmmmommoopoqqoqqrnpqssrnopstuy}|{|}~~~~~~~}}~~~~~~~~~}~}pljllmmmlmllllllmlmnllnoonmllmnoomlmonnmmlmlmnoqqppqpqqooqppoqqpqqoooonloopmnnoppppqpppponnnpoonnoopponnnmmnnnnoonmlmnnoorrppqqqqqpnpqrrqqrrrrrrrrrrqrrqqqqqqrqqqqqqqrqrqrqppqpnnopnnooooooopppnnoonnnmmnmklmllmlmnnnoommnnnmkmopoonoooommnnmlmnnonnooopooppoppppoooopopopqqqoooppooonoooqppnmnnooooppoooooonnonpmmmmmoooppprrprrrrrsrrrrqopqqqqpppprqpqppqqqpqqrqrqqqrrrsttsssssssssrqqrrqqrqqqqqpqrrrrqqqrqqppqrppssrrrqppopppppponommnnnnnnonoponnnnonoooppmloqpppopppqppnoqrppqqpqqppppqpqpooonooonlmmnnonnmmmnmmmmmlmnmnomoommnnnonnnmmllmlklmmmmllmlmmnomomlonmknomknnlnormmmnqpqqtuwz|z~~~~~~~}||~~~~~kjjkklllllllkkjimmlmnnnoppnllmmolmmnnmonlnmkkloommoppppoopqpoonopoonononoppooopoooonnopoopnonmppoooppopopononmmnoonnoopqprrqrsqqqqqqpqrrsrrqqrrsrrrqqqqqrqqqpqpqppqqqqqqqoopononnnonnnoooooooonmnnnnonllmmlmmllmmnmnmmnmmnoomnnnlnoomnnoonmmmnnnnoonppoppoppopqqtqopponppprpppppqooopoopppoommooooppqqpooonoonnnnnmmnooooqqqqqqrrrqqrqqqppqrrqpoppppsqooopppprqrtrrrrrsstttttssrrssrqrrrrrsrqqqqrqqrrsssqqqpppprqqqpqrrrqqpqpppooppomnoooonopqpoponppooonoqqppmloppqpppopppppprqppppppooppppqrqononmmnnoonnnnmnnnonlmlmmlmlmmmopnmnmopponnnnmmmnmkkllljjlmlmnmmnmnmnmlkmmllmllnnkmnnpopppruwwwwx}~~~~~~~kjjjklmnmlmlliikponklnooonqpmnoomlmoopmllmmmlknnmnoproooopoooopqpnnmnoonooppoooolnoqqpppopqpponopppopoooppooopoopoooopprrqqqrqqpqrrrrpoqsrqsrrsrrrqqrqqqpppqqppppqsqqqpppopponnnnnmkmoopopopooonnnnmnnnonnmmmnnnmmnmnooonmooomllmnlmmmnonmnnnnmmoqooooopooqppoppqpopooppppqqqqrqpqqpppprppppoopoooonpqqonpponnoonmmllmopoopqpoqqqrqqsrqqqqqqqpnmnoppqqnooooppppqrsqrssrrrrssrrrrrrrsrrqrrqqrqqqpqrqqrrsrqqqoopppppooqpppqqpqpoonoppooooonopqqooqqqqrroooopomnnppqqprqpoooopopppppopoqppppppoooponoomnnlmmnnmmklnnnnonoommommnonlmnnlnnonnnlkmnmlnljkklmjllkklmnkgjmlmnllmljlmkkllnooonnnppstuvwvwxxxxy{{|z~~}}}}}|kkijlllnmnlmkikmnmmmmnllmmnnnnnmnnmmmmllmmllnlmmmnnoonoooonopoooooonmnmopopopppponoqpoonopqponnopqonoooopppooppqppqpppqrrrrsrqrtssstsqrrrqrrrsssrrrqrrqqqpqpqppooppoooonnnnoponlmnnnnonpppppqqpoonnlmnnnmmmmmnllmmnmmnnoommnpmnonnmmklmonmnopollnommmnoooooppooqpnmonponoppppoqqqppppqqppopoopoopqqpppppoopoooonnmmmnnpoppppppppppqqrqrsrqqooponmlnoppoooopqopsppqpqqrqrrsssrrssrrqrsrpqqqqrqpqqprqqqrrqpqrpnpoooomoqooprqoppppooopopooppppqpnopqpooqnnooonnopopppooppopprspppqpppqqqpoppoononnlklnlmnmnmnonmjmnmnppnmoooonmnnnnonnonnnllmklllhiliiknpommkjklmmidgmnmlkhhhgjmmmlmooononoqqqqpsttsrqpruvuyxyz|~~}~~}~~~~~~~|~~~~}~~~||~lklkllmlmommklnnnnnnnonnmnooonlmonmmnkkkkmkmmmmmnnmmnnponnnnnnnolmnnonnnnoooooonoqpooonnmooopppooqonnmnoooppppqsrpqqpqqrqqqrrqrssrssrrssssrrrssrqrrrsrrqqqrqpoonnnnnnnmmnnnnmonnnnonmoooonoomlnnopnllmnmmlllnolkmmllmmmmllmnmnnpnnmmmkmonmknnmlnnnnnnnoppppopoopppppppooopqqooqqqpopqqpopoopnooppoqoppooooqqmmnnnmmnopoooooppprqqqqqqqqrrsqpooonnmnopoooppppooppqpqqrrrrrqrsstrrrrrrrqqqrqrpqpqrsrqqqqqppqqqponnooonopppqpooqppponopponoppoooopooooooonnnnnoooooopoppoopqpqppqpponoqpoopqoonnnmllmklmnmmomkkmknomnooomonnnnnoponnnonmlmmmlmlkkjjjjjnnnmkkmknmnmi`cjnliilnljlllnmnmmmnnmnqpmonqppnpmmopqqrsruxz{|z|}}}}~~~~~~~~|z}~~cknlklkklmmlkllmmllmmmmnnnnmnnmnmmnommmmmnmlmmlmmlnonnnnmkmmlkmmmmlkklnooomnnnonopnnoonnponnnnonmnpnnnononooooopppoppqqrrqqqqrrrqqsssrsrqpqqqqqrrrqqqqqpopponoppomnommmoonpommlnommklooooonmnnonnonnnlnnnmmmlmllnmklmmlmlklmmllmklmmnnonmmmmnnnmmnnnppoooppppponopopoonoppqppppqqpppppqpppppppppooonopoopopponlmnnnooonnmoppqrrppppopqqprqpqppoppnnooopopqqooqqrqpqqqqqrssqssrssrqrsrrrrrrrqrrrtsrqrrrqqqqppoopopponoqpnopqnnpqpnoqqpoppqrqopqqoonoonooonlmopqommnnnoonnonnoopopooqqoopqpnnonmmmillmnnnnmonnnmmmmnomnmnmmlmkmoonmqponmoonpommkklllopnmjjnomlkkighjjilmkmlkkklmnonnomlmmmllmlmnmnnnmoompppnoorrsrquwxyxwxy|~~}~~~~~}~}hlmlnlkklmllilklmllmmnnmmnnllnnmlnnmmmmnmlllmmllmnoqpnooonnnnmnnnmlmmnnnonnnnnooppmoomnoooonnoonnnoooopoppnopoopppppqqqqqrqrrrrrrqrrssrqqqqqqpqqpppqqqppoppoommnnnmmmnmnmlmnmmmkllnlloponoomnnnnmnnpomnnnlmlllmlnnmlmmlmllmmnmnnmlnmnnonmnnnnnoonnoqqpppoooooonnnnooonmoppqqqqqpppqrrrqppooooooonnnnoooopqpoppmmnonmnnnnnonppqpooponpqpppoppooooonnoononopponqpqqpqqrqprrrrssssstsssrsrssrrsrrrssrrqqqqqqqqppoppppoppppopppnnoqooosrqrqpprpnopoonnnpooppnnopooppponoonmnnooooopqpqrqqppopomnnmnnlkjmnnmlllmnnlkkkmnlllklmmjilmnlllkklnoononnnnmllllkllkjloolkmljkjkjlkkllmllmonmnmnnmmmnmnmnnmonmnlmnnonnklnpnnpqrruvwuttxy}|{}~|~~}~mmmlllkklllmlnnmllnoomnooonnmnnoonnmlmmlllmlmnnmlmnnnkmomnoopnmnonoqoonnmnoonnnonnnnpoppmnoonpooooppnnpppooppoppropqqpqqqrrrrrqrsssrrrrrrqqqqpppqqqpqqpppopnnonnnnnommmonmlnnmkkmllllnnnmmlmnnmnmnnmnppnmlmmnnmmmoonnmmmmllnmmmmmmnnnmnnnmnmonmooopooooonnpponnppnoooooppppqrqpqqqrsqqqqppponnmoqonopppnnoppoonnnomnnnnnnooonononoooppppppponooonnonoppooonnpoppppppprrrsssstssssrrrrrrqrrrrqrqpqqqqrrrqrqppoopoopooppopnonmnoonoopoqqppopppomooponnnmnnnnnnmmponnnoonnopppppqqpoppqrqppnonoonnoomlmmonnnmmoolkkmmmmnlmmmnmnnmklllnmnmlnmlnnmmmllkkikllkmkkkknljkjkkkkllkmnnnmmnpononoppomnqommonnnmjioonlmlllljmnppoprrsrrvvusx|~z{~~kjhiklmnlklllnmnmlmnnmmnmnnlmnnnlkkmmlmmmlmmmmmmmnnmnnonlnoonnnnoopononmmkkmmnnmmononoooooooopqonppqonoooopppppqpppqqrqsrrrqqqqqrrrqqqrrrqqpppqqpqrppponnppoommmmnnmmmlnnlmmmmkkmmmmlonoooonpppomnmlloqnmmnnoonnnppoommmljklmmlmmmnonmnnmmmmnnmmmnonnonoonoonnoopppnoopqqqoqrqqqqpqqqqpqpooooonnoooppoponoopooononnnnmmlmnopoooonoooppppnppoooooooopooqpppooonoqpopqqsrrstsrstsrrrrqrrqqrqqqrssqqqrqrsrpqpqpppoppqonppopooonmnnonoooooppoponoonoooponnmmnnnnllnnnmmmkjjmnnnopppoppppopoonnnnnmmmkjkmmnnomllmolmlmmnnmlnnmmmmnlmmmnommmmmmmomllklkkhgjkklkjkklnmjljklklmllommnlmoommmnoponnmonnnnnlonnnpnnmlmlmommpsromollnprqrovywuuvz}~~}}~~jiikklmonnmmmmnnmmmmlnmmmnnmmmmnmlmmmllmnmlnnmmlmllmnnomlmlnnnpomnnmmnmnmlmmmmnmopnopppooppooppooopqqpoppoqqppqrpqpqrrqrrqqqqqrpqrrrqqqrqpqpppqpoprpoonlmonmmllllmmnlmmmnnnnmlmnmmnmmnoonooqrqonomnmnnonnnpnmmnnnnmnmlmmmmkijllmmmnoolnmkllmmlmmnnlmmmnnnmmnonnnnooopppqqrqqqqrqqpoopppqooopnnoononoooppopoonlnnonmmlmnmmmmpppqooooooooooppoprqooopponpqopomooprrqrqqssssussssrrqqsssrssrqpqqqrqqqqqsrpqqqqpqqpppqpoqqpppoonmnmmmoooppqqqqoooonnnnmnnonmmnoonmnnonnlkmmmnomnoponopqqpppoooonnmmmllllnllopmmlnonlmnnmmlmmmlkkmmmnopomlklmllmkklmlmljjhijiijlkknmkjiiklnonmnnlmmnqnmjmnnnonpmmomnonopnnnonoommlnomllmomnokjmnoppnrrrtsrru||yy{~hklmlkklnnlmlllkmmmlmnommmlllklmlklklklmnljjmkllklllmnmnnoomknppononononnmmnonnooppppopppoooppqrpoqqrrqppppopppqqqppqqppqrqqrrqpqrrrrrqqqrqpppppopppqpooonoponnmmnnnmnnmnppnmnnonljjmonmmmnoooonlkmmlllnnnnnnmkkmnlllmnnlklmllklnmmnmnommjlnnnnnonmllnponopqponoqooopqqqqqqopqqqrrqqpqqqppoooppopoooopopqppoonooppnnnonnopnoopooonoopopppoooooooooonooppppppppqrrrrqrssrrsstssqqssqqqrrrrqqqrqqppppqqqppqpqpppoppppppqpoppooopqoooponnoonoonnmoopommononlmooonnmonomlmnnoonoonoooopoqooooponommmmmmmmnmooomllnnonnlkmmmmnoonnmmmlkmmlmmmnmmmkkmmnlkljhgkjhijikkkjjkmkkkllnonmomoljlmnnlmoomlmonmlnomnprpmnljjllmmklmlmmmllmnnkdnopqpqrwvursuxy{{|{~}djlmmkklmlmmklmkkknmlmomlmmmmlmlllnlmnmpomlkmjklkommmommnmmmllmnnnmmonomnmmnnnnnnnnoooqoppqpqqqqooqqrrqqqpqqqppqppqppqqqqqqqqqqqqrqqqqqpppooopponopooomnnkmnnnnnnmnnmmmnoonmmmnpmkjlmllmnnnonmnnmnmmllmmllmnnmmmmlmllmllmllnonlmonnmklmnlklmmmmmmnnmknooooorqoooppopqqpqppqpqpppqpqqqqppponmnommonpooopppopoonpppomoponnoppooonnoooooopppoooooponnmmooppoppqppqqqrrqrssssrttssrrssrqrrrrrqqqqqpqqqqrqppqrqqppppqqppppopopomopppopoooonoplkmlooooponoomnnlmnnmnnnmmnnnnnmnoooopppoooonlomnpomnonmnmlkmmmnponmkknnnomllmmlmmnnomljlmmkkmmmmmmlljlmnlmmljhjjikjjkjikkjkjjkolknlkmllmmonnmnnnonnnnmlklmllnonmmlklmlmkkomnnnonnonnlimnnmnnlrropoqqrxwvsww{|||}~~~lllklmnnllnnmmnkljjmmmmkkmljlmmmmnmmnlpspniikkkllmmmnmlmmnmmmnnnmmnnnmmlklnnmoonnnponnpppopqrqpqrqqppqrsqppqqppqopqppqrpqpqqrqpqqrqqppqqqpppqpoppponoonnnlmmmmnnmnnnmmonmnmnlmmnnmlmlnmmmnnmmlllllkklmnmmllmllkllllllmmlmmlllllmmnnmjklonmmmmmmllnonmmnoomnnommnppoopomnonpppomppoooppppoonmnmmnmkmmmmnnnnnnnoooonmmnomooopoooqonnopooorpppooqqpoqpoppppqqqsrqqrrqrqqrststssssssssrrqqqrpoqqqqqqpqrqqpopqpoqqppppopppponoononooppponooooooonnnooonnnnoonnnonnnmmmnnoppqppqppopqqpoopponmmmmmmjklnnmlkkllmmlklmmlmmnonmmmmmlhlnmjkllkklmlmnllkmmmlkmomlkjjklkkmmmoljmmkkkmmjilmmlmnnmmmmnmlmnnomnonmmlmllmmlllnmmmmmomnljkmnomkklnnnnmmpmmmljjnoqrrssrwzw||~}~kjjillmlmnmmmoommmlmnmmmllklnmnmmmkmnmonnmkklmlkkmnmnnlmoonnnqomnnnnnllmmlmnooqpppqponqqrqpqrqoppppoopqqpoppqpppppqpqpqpqqqqrrrqqqqqqqqpoopopoooonnmlmmmnnnmklmnmnpomnnononnmonnnommmoollmmllkllljjklllllllklklllmlkkmmmlllkjllkkkkkjjklllklmmmmmnnmnnnoonnnnnnponnooononnooppnoqppqppqonnonnnnomklnnnmnoonoonnnooomnnoooooooponnnnnooopoopooqqpppqqqpqqpqqqqqqqrrrqrsstsssssssrsssqqqqqpopqqqqqqrqqqqqononpppqqpoqqponmopnnlmnooopooonnnopnmnmnnmmmnnnonnponopmmoooopppoppooppppooopponmmonllllmlmmmmmmmmmmmmmlmlmmnmmnlmkhkkkkkllkklmmmmllnnmmlljklkjkkkkmmmmmnmlmmmmmmnmlmnomllmmllmmkkmlmononklnmlkmnmnlmoqnmmnopnnllnmmnkmllmmlijnlllginnooonppqvytxywxvx}}ljjjjijjmnnmmnnlnommmmmmlmmnnnnnnnlmmmllmmmmlmllllnnnlkjlnnnoppmnnmmmmlnnoooppppopqqoorqrppqqpopqrponpqpppppqqqqqpppqqqqpqqqrsqpppppqpqooppooomkonnonnnnnnmlmmmnmmnmnnnnmmnnnommlnnnnnnmnllmllmnlkllkllkklmmmlllllljjlllnlkjkmlknlkkkkllnmmnmnnlmnnnnooooonoonooooonopooooppppoopqppppopononoononmmnonnponnpponnnnomloonnonoonnmmnnnopoooopooooppopqpnoppqqppqrpqrrrsssttssttttssrsqqqppqpqqpqppqqpppppomooqppppppqqppooppoomnoooopqponnnmnnmnklnonnooooonopononoopooqpooponoopqpoppoonnononlnnmmlnlmmnnnmlmnmnomllllmmmmmlmlkjkllkllmmllnnnqonnmlijmollmkkjgkiijlononlklnmkjmlkklnmmmononnnmlmomjmollmllnnmlmoonlmnonnnmommnmmlmmllkjmlkljjjkmlilllossosvwvttvvkijihijloonllmmllljlnmmllllklkjlmmllllmllnmmklnmmljlnmlkmmklooonmmnnnnnoopooomopppoopppqppoppqppppponopppqpqrrqqpppppqppppopppppoopqpppoopopopnnnnnmmoonmnnmnnlmmnmlmmlkmlmmmmnmlmmlklllllkkkmmkjnnlllllkljjjlllmmlkklkkllllklmllllmllmlmmmonmmmnomnonnpnnnoponnooonnpmmnnooopppppponnnoonnmnqpnnonmmnopnonnnnnnnnnmnnnoooooopoonppomooooopooooqpopqrpppppprqqrrrrrrstsrstttssrrqrrsrqpqqqqqqpqpoooopqqoopppooppppqqooooqpponnnnmmomnnoomllmnnonnpooonnonmoonmmmmnonnoopnnnooooppppoonmoonnnorronmmnqpnnllnnnlmmnnonmmlkjkllnpmkklmljikmmmmnmmlkkjjkklklkjihikighkmlllhfjjjjjljkkihjlklmmkmonlkmmklkijjkkikmlpplnomnnmmlknomlmjijjjikjlllliiikjhhklllloljnsusnordhkkhiklmmmkmpolllkllikjllklmllmmlnmmnnklnmmmonmmmlmmnmlmnlkmlmnmmnnnmnoopoooopoopooppnoppppppprqqoooqpooppqqrqppqqqpopoonopopppppooooppponpqpnnmmlkmnonmonnqommmmllmnmmmmnmmnmllmmkjjjlmllmlmnlklljlmmlkllklmmnoomllnmllmmnmnnllmlnmlllmmmnmmnmnpmnnoooonmnooonnoonnonmnooooppppoonooonooooopooponoonnnmnnnnmnononnmonnnnopoopoppponmnooooppopqppqrsqppppqqqqrrrqrqqrrsstssrrsssqrqqqqpqqqpppqponnnpqqppqqroopqqqrrqqppooonnnnnnmnlmmnonmnoopoononnnnnoolnmmnmmmnnmnononnnonoopopoooonponnnoqpopnonoplkklnmlgklllmmlmljijmmlnnllnmmkilmmllmmmkkjgjlkllmkkjklkjghlllkkgjljlmljkmkkkkllijnnkkkkifhjkkiljkkkmmmomhmnmmmmmiipnklonkllljmmmmnokkllmkkllkjkmmjkmnlklkiihkjklkmmmmnnnnnonmljlllmppnlmlkllmnlmklmonkklmmmlmmnnmnnnmmlmlmlmonmnnnooooooppppppppppoqpopppppppoooopppppppqqrqqqppoppopoooppoooonooooooommnlmlllnnmnnmopnmmlmllllllmonllmllllllkklllmmlmnqnmlllmmlllmmllkllnnllmlljkmlklmllkmmnolmmmmmmmmmllmmnnonnnmnnnooponooolmnoooppooooooonnnoooqonnnooooononnnnnnnooooooononmmonnopoonmooooppooopppqqqqqrqpqqqqqqqrrrrrrrssrsssssuurrsrrrqqqpppopppppqpoopppppppppppppqppppponppnmnnppnmnomoonnklnnoonmnnonnooooommnmljkkmnnmmoponnpqppopoopronopoonnqljknnnnlkkllmmmmmlllmmmmllmkllkmmlkkmmljkjkkkklklmikkjifhklkijknlkkjklkjhmmlokiijklkmmjmllnlkkhjkjkmlijmllmlnopmmllkkllkkklmnonmmmmlmmlnnkknlmljkjklmlkinnklkikkjjmlllkmnnnnmmlnnnllnnlmmmnppomlmlllllkllmlijkljjmnmllmmmnmnmklnooonnnmooooopnppopqopppooppppppppppppoqppppppqqqppqqpopqpppoooppoonllmnnonnnnnnnmmnnmmlmmlmnmmlmmmllmlmmmmlmmllllljkllmmmmmmmmllmmllmlkklollllllllllmmllllmmmmmklmmmllmmmmlmmnmmmmmnpoonmnnnoooooooonmmoooqpooppponnooonoponoppoppoonomnnnnnonnmnnnooonnoopppqpponnpoppopppoopqpqqrqpqpqqqrqqrrrrrrrrrqrsstusrrrqrrpqqppqqrpppprqoooopqpppqpqrqpqqppoopnpoonnopooonopnmnnllmnoommmmopooonnmmmmmllmmnnnklnnoopoqpppqooooononnmknqmklnnlkjjnolkmmmmlllmlllklllmmmommmnlkmlkkjmmjjkmlgjjjijkkjjkklmmjijllkilmmkkkkkkjjjlmkmlmmkllkkkklkllkmmmlkmnnommnklljhjnmllllklmlmoponnlmmmlkkjjllkkkhlmjjkjhljjklkkjkkkkmmljjmmjlmlmllmmmnommmklllllmllmllkjjklmlkjjlnnmnnonoopppoppoopopoooooopppppppopqqqqqqpppopqppooppppppoopoopppoppnnonnonnoonnommmonnnnnnnmmlmmmmlnomlllmlkklkklmkklljkkklnmmmnlmmliilnnllmmnmnmlmlmnmkklllmmlllnnnlmkkmnmmmmlllllmmllnnnnnnonopnnoooonnnonoooooppoooqqooooopooonnnoppooonnonnmmmnnnolmoppoooooopoopqppoopnnooooopoopoponnqqppqqqpqqqqqqrrsrqqrststsssrrqqppqpqrrpppqpppponoqqqqqrrqppnppoooppoloponoooooqqonmnmnnmmnlmnmmmmopnmmmmmllnonnnmmmnnoppppppppoopoonmmnmmmomlnonlkkmoplmlmkkkklllkjklkllkmnlklmlmnnlkikmkjklljkkkkjkkkklkllnkilkkkklllklmkkljlkjlmmlmommmkkkkklllklmnmmmnoqonmknmhjnommmmnmmljlmmmoplmlllllllnmlmkjllkjijktmmmljjjjjjkkkkjklmmmllmmllmnlllmmllmlllmnmmmlmlikmlkkmmmmmmnmmmnnnonnopopprqooopppppppnopqpopqqopoqrpopqqppqpopppoopooooopononnmnommmmmlllmmnmlllllmkkklmlmlmmlkkkkkmjklljjiijifgijklkllllmmmklmmmmmmonmmmmoomnlkklmlmmmmmnmnmlmnmnnnnmmmnmmnnmmmnnnnnppppoopponnnnnonnnonnnmopooononooooooooopoopoooonoonnnoononooopnnoooooppopooonmlnooopponoppooqppppppopqpopppqqrrrrrssrssssroprqqqqopppppqqpopopoppppprrqooooonnnnoonnonnmnnnnonmllnnnnmnmlmnnmkkmnlllmmmnmlmnononnooonopopoonnnnnnmmmlmnlmljmmlmmmlllkllmllmlmjllklllllkjjjjkkjmlmlnmkkkkkjjjjjkllklmlkkklnlllljkmmljlmoonlnommkjkjkjkjjllkllmlkmlmnjmooonmmnlllmmkijlkjkkkklkllmnnmmmmlmlllklonjjhjkjjjmnmmmkkjjkljjkkjklmmlmlmmmmlmnllmmlkllklmmmpmllmnlmlnllmmmonmnmmnnnppoonopopoooooqpoppppooprpoppqpoopqppoppqpqpopopoonnmppooonomllnnljmmmllmmmnomllmmljjlkllllmlmlllllmlklmmlkjjkijllkkmmlllnnnmmnnmllmmmmmmlmmlnmlklnnnnnmmmnmmlmmmmlmmmmmmnmnnmmnnnnnmnoqponoonmnnpnnonnnnooooponppoooooooqppqqpooooqpooooooonnooooopoppppooppoponoklnnoopppooppopppqpoppppppqqqqqrrrsrqstsrsstsqqrrqqppopqonopppppppopppppqqpoooqoooponoooooooonnnnnoononnnnmlmmmmmllmmmlmmmllllmnnnponnooopooooonmnnmmmllkmllljjmllmlmmmmmmlmlllmljkmmlkklljijjjjkikmnmmkiknlkkklkllllllllkklllnmkkkiilkkkknqonnnpokjkjlkjjjikmnlllmnmkllmonmmjjmnnmnljjjkjllmkikkmmmlkmommmmkimklooligehjhjljkmlkjhhikkkklkjkmmlllllmlllkkllllmmmmmnoommlmmlllnpommmnnonmmmnnnnopoppoppoooooqqooopqpppqqpopqqpqqpqqqqqqrqqppqppppppppppopppommnmlmlllnmmnlllmnllllmllnnkkihklkklllllnommllkklkkkkmllllllklmmlkllkllmljkklklkkmnnpoopnmnonmnmnnmnmlnnmlnpomnmmnooonnnnonoopooonoopnnoonmnooonnooopppononnononnonmnoooooomnqqppqoopnmnooonooppppnnmlknoonnopppppppqrqpqqqppppqrrrqqrrssssrsstsrrrqqqqqpooqqpnnopqprrqqrqporsqpppqqpoppoooooqpooonnopooonnqpmllmllmmmoommmmllmmmoonnoqpoooooooopponlmnllnnmnklmmmmmmmmmmolilmmlllmmljklkkjjllkijljjklmlllmnmmmmllkkjklkklkmnklllkkljllljjlmlkmmmllmllmmnmmlkjllkkklkkllnkkmmnpnnmpnlmlmnnmmmmonlmllmnnnnpponokmmjmmnmmnnmlkjklmfkljjjkkklkkkllkkkkjkklmlllkmkkjilllklmllmllllklkkmnmmnnnnoopnlmmmopoopooopqooooppppopqppqqpoopqppprqqqpqqqpppqpqppooppooppoooponmnnmlmlmolmllklmlklkkljllkjkjjkkmnmlmmmopolkkklllkkkllmmmmlklmmmmlmlllklkklmmmlmmnnooonmmnnnnmnnmmmmmnpommonoonnonnnnononnonoonoopopmnnoomlnnnnooppqqoononnnonnooomnnonmnnnopqpoopooommooopooppqqoonnllnnmmoooopppnppppppqpopopqqqqprsrrrrrrrsssrqqqqrqpopppoonoqppqqpqqpppoppppopppooonnnnoonnooooonmmnnnqplkmmlkkjkkmllmlklmmmoonnnonnnnopoopqpnmmoommmnnmklklnmmklmlmnlikllllmmmlmmmmmlklmkkkllllkllmnnmlmmmllllmlmmllllllklljjjikjjijlmlkllmlmmmnnmmkkkjjkjjikkjkkknmlmnmopnnqpmklkklklnmnmlkigimnonnnmnpoonmmmnlkmonmlllkkihjijkkkjkjkmjkllllkjmonmkkkmllllmmmmnnmmmmnmjlmlmmnnmnnmnmnnnnnnmnoooonopppqqpppppooppppqponmoppoopqrrppqpopqrqqpppppqponnmkmnmllmmllmllmklkllmllllljiiikkkkkkjkmmmlmlmnomllkjllmljjljjnomlllmnoolmnjikkllmnmllmnmnnoolmonmnmmmnmnnmoonnmnmnopnnpnnnoonnonmnonlnppnnnnoonnmnoooooopoorpoopoonnnoonnnnnnnnoppooonnoonnnnopppppoooonnmmnlnnnmoonnoppopppoopqppqpppppppqqqrsrrsrrrsrqqrqrqqrrqqpoopppnppqppppoooppoonnoonnnmknppnmmnnnnmnnnmnnmmmmmlkkkmklmlmnmmnmnnnnnmnppnnmmmmopnmlmnnmmllkklllklmmkmllmmlljkkkkkjlklllmmnmllmkijlkjiknnnnnnmnmkkmlllllllklmkjmlmnmmllljhjjihklmkklmlkmolklllkkjdjiilmlmkklmnmlmmnmlmmkilkmpmlmliheeknolmmnpollklmmmmllmmmmllkjpkihjkijjklllkllkllljklmkiklllmllllnmnomnnnnnnmmmmonmnnmnonnnoponoppoppoqpppqpppppppooooqqqrponopqpopqpppqqoppponooopnopqononnnonnmlmmlllmlklmlkklmlkjkkkjikmmmllmmlmnljklllllkmnlklklllmkkmjkllmllllmlllkkkjllmmmmmmmnnonmopomlmmmmmnoonmnnoooppoponmnnpqonnnnlnnnnnnnponooonooooopooqpoonooponnnmnoponoponnoonmnoomnnooonoopoonnnopoonmnnnnppoopppoppqppqqqpoooqqpqqqrssssrrrsrqqqrrqpoqqpppponppnppppooponoppppnoonnmonlnommnpnmonmnonnmklnmlllllmnmmmmmnomlknmnnnonnnmnmlmonoqpppoonmmmnnlllklllmmklllklklmmljikkjllmlllllklklnkjllmmmmnoonlmmnnmnmmnllkigilnnnmmmmmnnllllmmnlkkmlklnnlllmkmkhijhmmomllmmkmmmlmmmmlljmllmkjlifkkiklklmnoppomjmosollmlnlllllikkjhghhijhikmlmlklmlklkjkjjlmllllmmmmmonnnlmnnmmkmonnnnnnoooononnoppppqqpppppppoopppoopopprrponooqqonoonoppppooonnonoonmnmllmmmnmnnkllklllklllkkkkkjkjkkkljklkkklkjklmkkkllllllljikklmlmljklljkklkklklkkkjjigjlklmmmmnnmnnnopnllmnmnmlmnmmlnnnnnooooooooopppponnonmmlmmnnmnnnnnmonnooopponnnonmmmnnnnmnpppooooonnooonnnoopooooonmmoponmmmnnnnoooppppppppooopppopppqpqqrqrsrrstsrqpqqrrqppqppppqpnoopppppppppooppnonlmomnomnmnmmmoopqoonnmmkjlmlkkmllnmmmlmpooponmmmmmmlkjklmlmonnooonnnnnnmommkklmllmnmmmlkllmljjkkjlklmnnmllmklllllmmlmmmnnnmmmnmmomnmmmnnmnljkmmllkjjllmlkillllklmkjlklkjllmlnnljkhlkmljklmkklljlnklkkkklmlllmmkkllkjkmnnonoonnmnqnmjnmmkljilkkkkkjjjkkkklklnkjkkkjkkkkjjjjklkkklkllllmmlnommnmnmmnnmmonnnoopppoooopoppoooooononoooponooooooooooooooooopooppponoonnnmkkmllknllmlllkkhkkjjkljihihlkkkjjkkkkjjikjlklmmlmkllklmkihijjjklkkikmllkkjihkkkkilmmlkllmonooonnnnnnmnnnonnmmnmnmlmoonmonnnnonoonoonnponoomnmmnnnonnoponmonlnoonnnnnooonnnmnoonnonnnnnnnnonnnnnoopoonooooooponnnnnnnnnopooopooonopoopppopppqqqrqqrrrrsrqrqqqqrqrqpqqqppppppooooooppoooooononnnnmnnnmnmmnonppnopomklmmmmllklnnnllmnonnnmmmllmlhjmmmjjlllnnmlmmmnllnonnnmlkllkkkllkjjkjlllkklhiklmmllopmmmmkklmlnklkkmmmlmolnmnlmmmmlkmppmjlnmmmllklmmlkjklkkiiikkklkllmlnnlnmkilkjljkkkmkjjkjjhfhiklkllklmkjllkjjlmnmooooooononmllljjlkjmmjhijihklmkjjkjlkiikjkllmljjjilkjkmmlkmmmlmnoonnnmmmnmnooppooonooooppponppnmnooononnoopoooonmnoonnooooppooponoooponnooonolmlmmnmmlljlllkkkmmmljjilklklkkllllmkklmmnlkmmmlklllkkjjklnlkkllkjjlmkjjjkikjjijkmllkkknnnnnnnnnlmmmmmonnnmmmmnlmnoonmnnnnnoonnnnnnopnnnnonnnnnnnonoponnnnnonnnnmnmnnmnmmlnonnnnmnnmnnmmnnnnnoopooooopppooonmnmmnnnoonnoooppoppqooooppppppqrrqqqppqrrqprrqqqqqqpprqqppppqpopppppppoopoonoooonoppommnmmnnnlmnnonmlklllkkllkmnlnnmnnmnmlmnnmmllmnnnnnnnmmmmlmnnmlmnnnmmljjklllnnlkjllkjlmnmkdilmnlmmopmnmmklklmlijkhllmnnommmnklmmmnmmopmmmmmlllljkllmnmllmkijjiijjilkjkllllmiilkjjjkjjljjikjghhgkkllkkilkikljjmmmllmmmmmomllnmkmkjhillmnlnkklhgjkkijkkkjjikkkkkklmljklmlmllmkjmllmmonnooomlmommppppnnonopooppppoopnmnoooonnnnopononnnnpommnnoorononnooooppnnonoonmlklllllnlklmlkkkllmmmlklkkkkllllnmnlkllmkjkllkklklmkmlkmnonklklkjjklkkjjjjjjjkjjljkkjjmmnmnonnmnnnlmmmmnommnnnmnpoonnnnnnnononnoonnnoqqoononmnmnnooooppnnnnnnnnoonnnonmooooooonmlnnnnmnnnnonmnopooopqoooomnnonnnnooonnnooooopopoonooppppqpoqqqppqqrrpqrrrrqqqqpqrrqonoponoppopppppppponoononnoonmmmmmmmllnnonlmmlkklkklkllmmnmmnmmmllnoonnmmnommlmmmmmmnnnmonnmlmmlllllkkmmnmkjllmlkkmnnlijlmnlmlnnmlmmlmmllkllmmkklknonmmomoonnnmlmllllllklmnjlmmmnonnnmmmnnmlljkkijklmnlkkllgjmkkgkmlijhghjjkjmlklkjihkkjgklmlkkllkmnmjknoopmkjkklklklkklkkjjkkjkkkkjikmkjkkllllmnmmmnonnmmlklnmmmoonnonnnnooonnonnnnnmnpononponnopooonnnnonmnmnonmmmmnoonpopoononmmnnmlmllmmmkklllllllllllllllllllkijkjkljiijmkijkmljjklllklllklllkjkllmllmmljjjjlnllkllkjjkkjjjlllmmonppnnnooonmmnmmnlmnmnnoppoonnnnoponnopnmmmlllmnonnmnomnooonopooooooonnnnonnonnoonnnnnnmmoonnpomnoopnmloonoopononnnnoononoopnmnnooooooooooopqqppppnpqqrqqssrrrqqrqqrqpopqqqpoppoqponooppooqqpoooonoonnnmnnnnnmoononmmlmlkkllmkkiillklmlnnnnnmnnlmmmmnnllmmmmmmmmmnnnnnnnonnomlmmlmlkllmlkmmkklmlkklkkmlmllllmnmkmmlkkkkmmmnlkonlmnoonmmmmljjlmmmmnnmmnommmmlknnmmmnmnlmkkkkjmmmlnljikjjkkkkkjkljjjjhjkkjjjkkkjgkkkjklklkilmnmkiijklklmlmmljhkmlkliikljkklijjhjjjlmkjknllkkklmmlmonllmmjllomlmnnmnnnmnmmnlmnmnnonnoponmnonmnoopoonnnnnnnmnnnmmnmmnnnonnoonnmnnmmmnnmklmlkkmlllmlllllllmlklklkkkigiiijijhijjiikkjjlkjllllmmkjlkkjjkkkkklljiklmnnlkllnlkklllklkkmmmonmmmnnmnnnmonmmmmmmmnnnnnppnnnmnoooooonnonmkkmnomlmooonoponpoooonoonmmnnnnnnnnmnnnnmnnmnnnmnonmnopponnnoopooonoponoonnnonnpomnonnnopnooooopppqpppppprsrqsrqrqppqqpqpoopqppopqqqrqooppoooooopppoooponoonnoonnnnnnnljlmmllmoomlllkklllmnnmmmmlkmmlllmmnlmnlklmmmmmmmmnmljlmlnmllmlmllkkkkklkkklklkllllkkkkllllmlkmnmmmmlmjllihmommkknlllkjjjikmmllmnlmllmnonkklljklmmmljjjkkkmmlmlkjilmmkjnmmnhjkkihiijhgjhiiijilmnllmmnllmmmlkjjklkkihjljmiihjjjkjikkiijjjjjjikjkkkjlommlllklmmmmmllllmmnmlkmmnmnnnmnnnoommnnnnooopoppppoooooonmnommmlmopmllmnmmnmmmnmmmnmmnnnnmnnonmmlmmmlmmmmlllkjkkllllmkjkkllkkiikkkjjkkjjkkjkjkkkklkjkllkllkkkkkkkllnmkkkkklklkjljlmmknnllmmmnnnnmnonmnonmnpmmnnnnmmmmmmmnnoonononmmnnnnnmmmlmmooooqpooppomoonnnnnnnnnnnmnmmmmnmnnmnooonnnnnnnnnnnnnoooppoooopoonoonnoonmoonnnnoooponpppppppqqrsqqqqpqqqpppqqrrppqqpoooonopoonnoponnoopppppoooppppnnnmmomlmmllknnllmlmlklllmommmnjjmmmllmmmlllmmllkkllmmnmnmoonmllkjkllklllllllklkkmlljklllkikkkkkjklkllmnmmlnpmnlkjlkhhlnmlkkmllkklkkllnmkkllkllmljkmmmlllmklklmjkkhhjjkjikmkjljkkkkkjmljjhjiiiiijjhkjhkjjjkmlmmnmmommnllmkjijkmkjlpkijedkkihjjkjjkkkkjjklmlllmnmnnopnmmmmmmmlllllmllmnmmnnnmnnmmnnnoooonnnooooppoopoonoonnnomnmlnopnmmmnnmmmlmmllllmmmnmnnmponmnmmmllmmmllljhjkkllkklllllmlkjkkjjjjkkjijjkjikkllllllklljkkllkkkikkkkkkjiklkjjikkjkllmlmllmnnmmmmoomnnoonnnmmmnmmlmmmmnnmnooonnnnopmnnnnnnnnmmmppnopoopponnnoonooonnmmmmnmmmnmmlmmoonnmooonnnnoomnoooopppqqqqppoppopnllnnnnonoooopppqrqqpoqrqqqppppqqqppqqrqrrpqpppppoooooooonnooonmoooooooopqooonmnmmmmmmlklllljkmmmmmllmnmmnnmjkmmmllllmmmnnmnlklmmllnmllmmmmllklllmmnmlmmnlkllmmllmlmnmlkmmmlkilnmmmnonnmlnlmlllliijlmllkmnmlkkjiikmonkklkjkklljjnnlkllljlkkllmkihhjlkjllkllkkkjkmlnnhjjjkllkkjgimliklkjllijkljknnnmllmkkkiillillkifhgnljjiikkjkllkjlklmnmmlmmnnmonmnmlmmmmoonmmkmmonmmnoonoommnoonnonnoopoooppopnnnooppoonmmnmlnommmmmlllllnllmlmlklllklmmllmllmlllllmlllkllmlklmmlllllllkkkjkjjklkljikjjjklllkijkklllllllmkiijjkkkhiklklkijkjjkljjkjklmmmllmopnnnnnoomlmmnnmmnnnnnnnnnnnmnmlnopnmnnmmoommnppppppoqqooonpoooonmmnnmmmmllmmllmnmmmmnnnnnnoonooopppppppqpqrqoppooonnnnmnmmnopooooppppppppqqppponopqppppqqqqrqqpppponooooononmoooonnnoooooooonoooonnnnonlklnmmlmmmmllmllmllnnonmmmmnnmmmlmlmnmnllmnmklnmlllmmmmlkmomlkmlllmlkkklmmlmmllmmmmnmmmmllmllnmmlnnllmnmmllkkmlkllmnmkklllkiinpnlmlmlkkllnlmnmmmnmmmmmmmnjkmmlkihjkjjikjkklnlmmijllkkkkjikkllkjkjijhhiijiiknmllllkjlnmjjilmjfejklkiklkkkjkkllllmmmnnmmmnnoonnnonmllmnnnnmnnnonmnnnnoononnmmnoponmoppppoqppoonnooopopqopqomnoonmllnnlkkkkllljkjlmlkklllllllmlllmnlkkjjlllkkmmllkkjlkkkkmmkihklklmkkkkmllkkjjkklklkihjknmkkkklmlkllkjkkkkkkjllklmkkklllmmmmmmnnmmmonmmmmnnmonnooopnmlnnonnlmmnnmmlmommnnooooopoppnnooonnnonmnnnonmmnnkkllmmmmmnmnnmmnoonnpppppoppppnppponooponononnnnnonooooppppppppprqooonmooopppppprsqpqqqqpoppooqpnmnopooonnooooopnnonnopnoonnmjmmmnnmmmmmnnnnmmmmmllmmlmklnnmlmmmlmmnnonmonlmmmmmmmmmnnnnonmlmmjjjmmkmllmmmllmlmmlmlmmlkllmmmllnmllmnnlkklljkjkkmkllkklljjjkllkklmkgjkmolllmnllmmnmlmmmklmmllkmmkjhknkllljhjkjlmmkjkkkhgjillmkjjkjllkgikkjkijlkkjilmlkklmmgejkmlkllmlllllmmnnmlnonmmlnmlmnonmnmmmmllmmmllnnmmnmlmnmlmmnopoopqpooopooooopponmnnmmnnooppnmmnnmmmmmnmnlkkjkkjkklkjllkllmmllmmmmmlkllkkkkjjkkllkllkkkkljmoljkkkmnlkkkkkkjjjjkklkkkkjijkkkhillnmkjmmllllkkkkkklllnmklmllmmmmmnmmnonnnllmmlkmopnnooonopponnoonnnnoonmomnmloponopoooooooooooonmmmnmnnnnlkkkmnmmmnmmnnmmmnnnoooopppppppppppppooponnnnnnonnomnooooopoppppqrppqppoooppooopqrqqppppponooooonmlkmnomnnonopoooonmnnooopnnmnmmlmmonlmmnnmmnnllmmllmmmnlmnnlkmmmmmmmlmmlllkkmmmllljlmnmmmlmnomjijmmlmmmnmmmmmllmmmmmnmmmmnnmnmkmnmmnnllkkmllmnkllllkkkjiikkjlkkkkkkkllmmlnnkillmpmnokmopnnnmllmmlllmmmmllmljhjkkkiklkkijkljllkkcgikjijjkijfijiklklmnmlmlmkhkmlkkklmmnmmllklmlmmmmnmnnnllnmnomklmomllmnonnnnmnmnnmmmnnoonnoppoopqqoonqrponnonmmmmmoommlkllllmmmmllkllkkllkihlmjlmmnmmlllmmmllkkllllkjjkllmlllkkllkklllkkkjjjkjkkkljjkjiiklllkkmjjkjiikkjkllklnlnlllkljkllmmmllkjlnllmnmmmllnmnmmmmmmlmmnoooonnonoononoonlmnnnnnonllnopooooopopoopooooonnnonmnommkkmmlklnnomlmmmmlmmnonpqppppppppppnoopommmmnmnnmmmmmnnnopppoppopppponoooppopqpopqqpoppppoooqpopponommnnmnmmmkmnnnooooonoonnnonmlmmmlmnmmmmonnnnmmmmnlljihknoljkjklklklkkjjkikmnomnnmmmmmmllnmlklkklnljjjklmlmmlnmllmmmlnmmnnmommmmlmmllnmmnmmmmlklkkkkiijjlmmljkkljkljillnmllmmnomllljknolkihjjfkjijiklljmllkkkkijklljhggiifdhiighhkjiihjlkhjijjllmnnollkjkilnkllllmoolmlljkkjlnmmponnnmmmoonmlmmmmmmmnnmmnooomnnoomnnopoooqpoooponnopooonnnnnlmnnmmnnmlmlmmlklllkklkkkllljhkkjkkkllllmmllmmnmklmlkkjkmmmmllkikljkkmmlkkkkjjjjjljjjkllkjkjjkjkkllkjiiikklkkklmmmkmmkkklmlmlllllllklmnmnnnoponmoommmmnmmmnnnnnnnnnnnonnonmlmnmnmlnmnonnooonoppqononooopooomnmnollkkmlllmnnnmlmmmmmnmmnoopopooooppppoopoonommnnnnnommnnnooppooppppoonoonoopoooooopqpopoooooooppnnooonmnmmmmmmlmnnmoppnommnnmmnoomnopnjknonnonnmnnmnmmnmmljiklkjiiikmmmmonljllllllmllmnnmnnoomlmnmlmlllkjlklmlkloomlmnmlnmmmmmnnononmlmmmmnmmlmmklmklljiiijjikklnmlmnmmlljhjkllmlkkomlnpnlmmkklljhehihjigjkjkjkkkkjjljkkkjjjjhhhhfhjkjjjklgiljhjjhjilmmlmmmkkkjjjlnnmllppmmmnnnnmlnmnopnnnmnoomnnkkmnnlmopnnnnooonppoonnopoopooppppoopopponnnonnommnnnmmonmnmmmkkkjijkkkjjlkkkjklkklklllmmnmmmnnnmlkkljijllkjkkjijjhjlmlklkklkkjjjkiilklmklkkkkkjjkjjjjjjjlkjkkjkkllkkjikllllkkkkkkllmnmmmmmnnpomnnnnmnooooooonnnnnonnonnnnpooommmlmnlmmmnonnnoppononnpppponnnnnmllllllllnnmlmmmmlmlmnnoonoppoonpooooooopooonnooponnnnonoooonoooopqooopqooooooppooqqoppppppoopppommnnnnnonnnnnnoppnoprpnlmnnnmmommnnonllnonmmmlkmllpnmnnnpnllllklllmnonlnpmkjiklllllnnnnmnnnmmkkmllnlllkjllnkklllmnmlnmllmnnmmmnmmmnmlmmllkkkkkkkklmlkjiilkkllklmmlmnlkkmlkllllmlklmnlnonmmmijlnlikkkkkiijjkjjkllijjnjjmlikijkijhhjhkliiijiijjijljjiklmlmmmlljjhhklllonmmoonnnmmnmnnnlnnnnonmmnmnllmnmkmmnmoonnoonnpnnlknpoqpoppqrpopooonnmnnonnmnonmmnmlmllljkkkkiikklljklkkjkkkkkllkklnnnonnnmmmjlkklkkkjijmkjkkjkjkkkkkkkkjjkjkjijjjkkkkkjjlkiiiiiiiijkkjjjkklkkjkllkkklmlkkkllklmmmmnllmmnmnnnnnnonnooonnoooonononnoponnnoonmnnnnlmmnoponnooooonooonnmmmnnnmkjllnnmklmnnmllllllmnmmnnnooooppppppopqnppoooopooonnnnnooonnnnnnopnoppqppoooooonnoppopnnnnppnnmoononnnnonnonoooopponoqqnmnpponllllmllnnmlmmmllmnmlmonmnnmnnllmlkmmmnnmmmmmonlllllllmmjmlmlllklllnmklkljkjkkkllkklmnonmoonnmllnmmmnnllmllmllkkmmkkkkkhklllllljinmlkiikjijjjlkkllllmlklmnllkjkjjlmljlmllkklklkkjkklmkjlhgkjehhjkkmjkjjjhijljiigijikiiggknmnnmmmlmmljlmmmmmmmnmppnmmmnmmilmnmnmmmnonljlmnmlmnnnonnponmmnonnnoooopooooonopnnnnnmmnmmlnnlllmlllkkiilkiifhkkjjjlkjjkjkhikklkkmmmmonnmllkjmmljjjijjkmkjkjklkkjllkjjjkkjikhjjjjjijkiijjjjjjjjihijkkkkkkjkijkllkklklmllljklnnmlmmlmlllmmmnnnononmoononnnonnooonnnoonnnnnmmmmnnnnmnpponmnooooooonnnnmoonnmmkllllllmmmnmllmkljlmnoonnmooppppppqpponnoomnopommnonnnooponnnoooooopqpppoonnonoooopponnonppopnoonnooonoooonnnopoponopomnooonnmmlkllmmmlkmlmmmmmmmnnommmnnmlklllllnoomnnmmnommlkmmmmllnmkkkllmlkklkllklmllkkmlkkjllmllollmmlklmmmmnolmllllmlmnllllllklmlmmmnmmmmllllllkjjgjklnlkmllkmmlkjkkkjkkkkjkklljkklllmmljkmljifejifdhjighhjkijkjjkjkigkljiikjhhlmnlllllkikmnnnnmmnnnmnnmnmmmmnmlnpommmnmmnmmmlmkllmommonnnmmmmmnonnoooqppoponoononnnmmnmnmllmlkkkllkkjjkkkigkjhijjjjlljkjjjlljjkmllmllmmljjjkjjjkkkllllkkkjkkjjjjjikkjjjijjkkkkklkjijkklljjihjihhhikjjjklkjjlllklmllllmllmllmmmlllmmljkmmnmnnmnnonmnnoonnnnoonnnmmnmmllnnnnmnnmmmlnonooopoooonmnnoonmmmmjlmmllmmmmmmmmlmlmllmmmnonnooopoopppppoppooonnnommnnonnoopppooooppopooooonooooooooopppoooooopnnppmmnonononnoonnonooopppononnnnoonmllkjlmmllmonnmnmmnqpmnnnnmmmmmnmnnmnnnnmmmlklmkjilmomnnllmlmknnmkklllmmnlkklljlmmookmmlmmoomlmmmmmmnnnomnollmnlllmmmljmopnnnnnmlnmnmkkkjigiklkkmmllnigmnmklhiljkjjllkiklkjkkjjiiklkjjijijjkkjkkjijiiiiiihhgefiiggijihklkkmmkihhhoononnnnmnmmonmmmmmommmnnmmnnnmlnmlmmlmmmnmmmlnmlllnomnooppopppoooonnoonnmnnponnmlmmmmlllklkkklljjkjjjjikjkmklklmllkklmkkklmlnmjjjjkmlkjjjjkmlkjijjkkjijjkkklkijkjlmkklkkjkkjkjiihgjjjjijlkkjklkkkllklllllklmlmmnkkmmlmllnmlkmmnnnnmnmooopopqpnooonmnnnmmmmllmmommmmlmlmopnnnnnnnppnmlmmnnmmmnlkklnmlllmmmmlllmmmmlllmnnoooopppppopqopppoonnnnommnnnnnpqonoopponopppoppoooponoqpppppoppoppoonponnnnonnoooonopppoopponmnpnmmllllnnmmklmnllmnmnmmnnnpnmmnlmmmllmommlnnmlmmnmmllnkjlmnomnllmmmmkmmljjkljkkkklkkkjjlmoolkkjlmnomllmmmlllmoomkmmmmmllllllljlnmlmlmnmnpoonlijjjjjjjlmlllmmllmmklmjjjhhjjjkigkllkllkkijlkkkkjjjikkkkjjjjjkkkjijighjjjjghjjjjjljjkjiihhjmlmnmmllnnnnponnmmnnmmonmnnmmmlmnnmmnmmnoonnmjloonnoonnooppnnnooooonoomllnoonnnomnnmnmmmlllkklmlkljjkkkijjkklllklklllkklkjklkkllkjiikkjjjijllkkjlkkkjikkllkjklklkkjjkllkjikjijjijjijkjjijkkkjklkklllnlllllkkklmnnlklllkkjlmllllmnnnmnnoooonpponnnnnmmnnlmmmmllmnmmmmlmmnonnnnonmnnmmmmlmmnnmnmnmmmmllnmmoommmlmlllllmmnnnnonoooooopppoppoonmmopnmmooonppponoooooppqppooonnqnmopopoppoqppppoomonnnnnnmmnnonnoooooopppommnnmllnnmmnnmmmoonnmlmmlmnnmnmlkmmmllkmnonmmmmklnmmkmnnmmmmkmonnmmnnllmmmmlllmklkijjjjjjhlmlllklkllkllkmlmmnlmnomkkmlmmmlllklmlklnmlmmlmmmmmmkkllkkmmmkmnlkllmmmomklpljjhijjjigdikkkmnmlljmlkkjfikjjiiiiiijkkjifhjjijjikjfijligikjhijikghionoonnlkoonpnnnnnmnnmlnnmlnnoomnonjjmnnmmmmnnnmnnnnnnnnooponmlnnnoommnnllllnllmnmlllllmnlijjjikllijijiijjkkjjlkljjjjkijkkjkkjkjikkjjjhijjjjjiikjillkkkkkkkliijijjjjjkjjjjkjiijkkijhhjijllklllllkjkjkllllllllkllmmlmnnlkllmmlnnmmnmnononmonnmmooonnnnnmmmnnnmmnonmnnnmnmmnnnnnponmmnnnmmmnnnmmoonmmmmmmmmnnmllllmmmlllmmllnooooppppoopnoooooopponmnoonnpooooooonnonoonnoonoqpnnonpooppppoonoomonooooooonnnnnooooopqooonnmmnmlmmlmmmlmmnnmllllmlmllllllmnopnnnonnnmmnommmmlmmkmkklnnnonmmnmmkkllmnmnmlmnkkkllkmmlmlklnmkllljlllmnlmllllnlllllmmlkllmlllnonmmnljiikkiijlmlkkmmmllnnomlkmmoonlmnnkkjjjiiihhkkknnmllnmllmllljkklkkkklljiijijiihkkihjjkkjjjijighliihghopponnmkmpnnnnnonmnnnlmonmnnonmmnnjllmmmllkmonmmponnnnmnnmmnmklmmmmmlmllihkmlkkklkhijjkkkjkkjikjjijkighjkjijkkkkijjjjjjkljikkkjjlljiiiijjlkjhhkjjlmkklkjkkkjijlkjkkjjkjhhkkkijlkjjjijijlnmlkkkllljjllkkjkkkklkklkklmllmlmmnnmmmmoonnmnnnnllmmnnlmmnnonmnnmlnmmnoooonnmmmmnnnnmnmlmnnnmmmmmmnmmnmmmmmmmlmmmmlllmllmlmlljlmnnnpooqponppppppqoopoonmlnooopoonooooonmnoonnnpoopponnnnnoqpopopooonnnnnnnnnoommnooooonopnnoooonnmnmmlmlmmlnonmmmmllmmlmmmllmmmnnponnnmllnpnmmmmmllmkklmmklmmlmlmlllmmmlnmklnlkklmlmmlljkllkiknmklllnnllkkijjlljklnnmklmllmnjlommmnlmmmmljklmllkmmllnonmkmnnmmlmmnmlkjjklijjhikkjmmmmllmlmnmlmljjkijmljhhjjkjlhijigghjkigikkkjihhkjjiignnnnppmlnnnoonnoomnoqonoommmmnnmmmlmmmmmmmmnmmmmnommmnnonmnonnljlllmmllkkllllllklkkiikmlkkklmlkjijlkkjkjkkjjjjkkjjiijkjjjknnkhghjligkmmkjjjjjljijikllkkkjhjjjklljkkjlnkkklkjjlmkjiijjjjjklljjkllkkllkjjijkmkjjkmmklkjlmlnmlmmmnnnnmnnnmlmnmlloonmnnnonmnnmollnmmmnpnnnmnppoommnnnlmnnnmnnnnmnnnonmmmmmlllmlllkklllmlmmmnnnnnonoppoopoooopooqrpnmmmmnnopqponlnoooopopoooppooooonoonopoonoppooonnmmmmoonnnnnnnnmnnnmmmmnnmmmnnmmlmmlkkmnlkmmnnmmllmklllmmmnnnononmlmllnnnmomkllmlklkkkmnmmlmmlkmmmlnmlkkjkkjjlkljkjkkllklmllllklmmljjkkknllmkmoomlmmnnmlnpmlllllkllklmmljjklkjjnnlmmmmlnllmlikmmkijighijkmlkjjlllmmlllllkllkijlljiighkhklijlmjlkgjiijijiihhigghgecnnnnnnlmnnnnnonnnnoopononmlmmmmmmmlmnmmmllmmlmmlmmnmlmnnmmmonmnnmlklljkjklkkkkllkkkkiklllklkmlklkjkjjjjjkkijihiiijjiihgjklmnkjjjklkijkjjijjkjkihiijihjjihjjjkjkljkljllkjkkkjjjkkkjjjiiiijklmkklllljjkjjkknqmjjlnmkklllmlmmlmmmnnnmnnnnnmmonklnnmmnnnmmmnmnnmmmmmmlmmnmlmnmnonmnnnlmnnnmnonmnmmnonmmlmmlllllllkkjkjklmmlmmmlnnnooooponopppoooppnmmmlnonnnoonmonnoononoppooononooooooooooooppnonnnmnmoonnonoononnnnmmmkmmmmmnnmnnnmnmlmmkklmnnmmnmmlmmmmllnllmomlllmmlmmlllmllllmkllkllmlllkjmmnmklmmmllkkkjklkjjklkjijjkmkkjkljiijklkjmomkkmonmnnmnnlllmlijkkjjkkjjklkkjkkljkkllklklljjklmjjkigikjihgkjkkjkjkkkmmklmlmljkjkjiklmljhgiikllilkjlkikijkkjkkhhjigijihronnmmllnmmmnnnnmnonmmlmnmmnmmmlmmmmmnnmmmmmmnnmmnonlnnonmmmnmmnnmkkkkjikkjkllkjjjkklkjkllmkkjjjjijkijjjkjhijjhhjlkjjkjjkklkklkkllkjjkkkkkjkkliiijjiggijgjjjjjijjkllkjjjjjjijkjklkjijjjiijmmjkkjkkjkkjkjjkmljllmmllmmlllmmlmmmllmmnlmmnnmnnmmmlmmmoomnonnmmonmmnnlklmllmmmmmmmooonmmmmnnnnnnmmnnmmmnnmmllllnmklmkkkllllmmmmmnoonopppoooooooooonmmmmnomnnnnmmnnnopnnnooponooonnoponnopopppponoonnoommnmmnmnllnonnnnnmkllmmlonmmnmmmmmmlllmlmnmlmmllklkmlklklmlkllmlllmlllllkigjnmlmmmmmmmlkkmomllklmmnollkkllkllkkkkjjkkjjjjkljjjjjllkklklklmmllmmnmlkmnmlmmlkkkmkjkkikkmnmjmllllljlkihhikijkihhkjjjijjklkijjjkijijkikjjihjjjijkjjihhiihjiiiijiilkjkkikklklkjjhhionmmmnnmmlllonlmmnmnnmmmlmlmmlkmnmmmnmmmllmmnnmmmmnnmllmnnmllllkkkkklkjhjkjjjjkjjlkkkkjkkkjhikihjjliiijihhihjhfijkjijkkjkijiijjkjijkkjiillklkkihiihiihhiiiiiiiiiijkljjhiiijiijkjjjjkkkkiijjjjljiihijijjjkkjkllklkklkjmlllmnnnnlmonnnmmmmlklmmlknnnnmmnoommmmnnmnmmmmnnnlmlmmmlmnnnmmnmlmmmnmmmmnllmmlmmllmmnmlmmlkllkllnmnnnnnnnooonooooonnnnnoonnmmnnnnnmnnonnnnonnnoomonnoonnnnmnoooooooonmnnnnnnmmmonmnmmnmmnnnnmmnnmlkllmmmmppnmmmnmmlkllmmmmllllmmllmmmkjjlmlkkjkkmkjilklllkkllllmmmmkkmmlkmlllnomkkjkklkkllmjjjkkkjighkjjjjjjjkkikkhjjkkkllmkmmkllllkklkkkkikjjllmmmmmmnmllklkijkkiikjjjklkhhhihhhjjjjhhiikkkljjjhijkhfijkihifhhefjgihijjiiikljjjijjjjjhhimmlllmnmllmmonlmnmnmnnomllkmmlkmmnnnmmlmnmooonoonmmmnmlmnnnlkllkkkkkkkkjiijjjjjjikllkjkkighjklkilmliiiiiijihgffiijikllkkkihjjjjkkjjkkjijkkjjjkhfijjhijjijihhiijhhijljjijjhjjjjklkkijjkjheihhghihiiijiiijjkmllkkkljjkknlllllmlmmmnnmlmmlllllllmmnmmllnnnnnnnmmnmmlmmmmmmnnnmmmlnnpqnmnnnmmnnonnnnmlllkmnnmllkklmmlklmllmmmnoonnnnoponnnopononnoononnnoommnnnnnnnonoooooooooopoooonnoonnnnononnnnnononoopokkmnlklnmmlloommlkllkllmnonmmmnommkklmmllnlllmlkkllllmklmlklllklmkklkjkmljjlkkkkllkjlmmlmlllllmlkjkkmjkkjjjkklkkjllkjjkkjljijikkkkjlljllmnmllljkklkjllkkljklllmllkijknnllllkikkkjjjjikijjijjiiijjkkkjkkjjjkkhklkkkjiijjjighiifgfgfihfjlihijiilmlhgjjjihfijjhjllnmlmnonlnoonmnmlmmlmnnonnnnmnnmmmnnnmnnnnnmmlmmnnmnmlkklklkkjkjjjjjiiiiijijijkkjkkjiklllkkjiiihjkiiiijiiiijjjjjkklkkjjlljkkkjkklmkijkkjjijijihghhhiiiihiijkkkjjjkjhjiikkkjjlljijjhiihhjhghhjkiijikkkllkllklklnmkklklllmnmmmnmljhiklmlklllmllmnmnnnmmnmmmnmmnnonllmlllmmnmnpnljlmmmmnppmmmmnnmmmnomlkllkllllmmmlllmonnmmmnooooppoonnnnnnnmlmnnnnnnoooonnnnopoponopoonopponnommnoonnooonmnnnnonmnmmnmnomlmmllmmmmlkllmmmlnmmmnnmlnomnmmklkkkljjmmkjklnnmnommlkkklmmkkklkklkjikmmlllmllljfijjjjjmllllmllllkkijjlmlkkjjlmkjkkkkklllijjknmijklmnmllllkkmnlkklkllmlmmlklmllknpppnkmmkjkjiiigggfihhggiijjjlkiklijjihjmlkkkihbeijigikkjkjigggfiiiiijjkmnpkffmljkklkkklmmmnmmoommmmmnmnmnnljmnonmnnnmnnnmnoooommmmmlmlnmnnmmmmmmmllkkjlljihhihhkjjkgghikiijjkklljjkhhhhhijhiiiljiiikkijiiklllkkmljjkjjkmmomjijkjjijjljiihjjjjijjihjkkkjjkjgiiijjjkklmmkjjjhiijkjjijiiiiljjkjllkkljiklklkkklnmllmmmnmlmlkjgkllmlmmmlljmmmonmmmnmmnnmllmnnllmmmlllmnnnnmmonmnmnnnmmmnnmllmmnmlmnnlkklmmlmlkkmnmmmmnnooonooonooonnnnmllnnmnnnoonnoonmopoponppoopoooonnllmnooonoooolmnnoonnnnmnnoonmmmlmmllmllmlkllklmmmkllkkklmnmkkklllllmlkkklmnmmmlnmlkjklkkkklmkkllmklmmnmmmmkjhiklmnmnmlllpplllllhikkmljklkklkjkkkiihhjggjjjkkjkjjjlkkkmllmmkklkkmmmmllkkllllkmmnonlmnkjklkihfhhikiiijkkklilljjkjjjjjmnjhhhgcgjkklhiklkkmkjkifiijihikkkiilkjlmjhjollnmmnnmnnonnnmmmmmmnnmmllmmmmmomlnnnnonooommllmlklllmllmmmlmllkkkkmlihfhihhhijhgegjiiijkijjjiiihhjihhiiijjkljgjjjijjjlkjjiiklkkllllnomlkijjkjjijjiijiijjijkjihjjjjilmlhhijjhiijmkjigffhhjjjhjiiijhijiklkkkljjjijijlklklnlllmmlmmmmmlllmlklllllmmlnnmmmmmmlmnmnoonnnlmmmmllkkmnnmmopnnnnmmmmmmmommmllklmllmmkllklmmllllmmlmnmnnnnnnnooooooonnnmmmnnmnonpqoooonnopnmmnppnnnnnooonljknoonnnnnnmnnnnnnnmnoppononnnnlmlmmkkmnlllmmmlllmmnmlkjjljkjjlkllkkkkkllklmlllmmkkklkkklmljjkjiijklmkjkljlkjmnmnmmmmmlnmklllkkjlmlmlllklljlllkkkkklmkkkklkjkjkkkklmnmklkklmllmmnommlmmljknpnnnklnmlkllkkihkjjllkklljklikkjjijlllkkjikjkjgiiiljkkjjkklkkjjgijjgiiljgggilkkjggkmlnnmlmlnmnnmnnmmmnoommnnnllnnnmmnomlnnmmnmmmmllkkkmllmlkkjkkjhhihiffgijihihhiijkigihijkljhjiiiiikjjjjkjhhjjijiikkkihjkkjkjjkkllkklllllkkjlkjjjjjiifghiiiiiiikijjjljjknnjhjkjiijjjiijkjjikjijjjihkkjijkkjjjkklklkkjklkjkkllkiilmmmmlkkkklmkjkklkkmmmnnllmnmmllmoopnmnlllmmllklkkllnpoommnnmnmmnmnnnmnnnmmmmmllllllmmlmklnnmmnnmmnnonoonnoonnonmmlnnnonnnoommnnnnoonmnpponmmnnnpoooooppopnoonoonnmlmnnnmmopmlnnnoommollllllmkkmmmmnnononlmljllnmkkjjkklkkllkkkllkikkjikkllmllkkijlkjklkmllkkijkknolkklllllllklkkklllmmlmmmmlllkklknommlkjkkkllkkkkkllllkjjkjmmmklmmmmllmmkkkmnmkkmlkmpnlllmmljkkkkjihjjjjidekjiihkmkijiiijkihgggjihilljijiiigdffhhiiheiljjkkhkjjnonnmmmnlmmnnmoonllnonnnnnmmmmmmmnnllklmmmmlmmmllikklkkkkkkjjhhiiihigfhiihiiihhijkhgjiiiijjhhgghkkjiiijjiiijkjijijjjjjjiijkkkjkkkjillllklklllkklkjjjhgghfghihgjkjkkjkklllkjiijiiijjkjjlkjikjiijijiiiiijjkjjilmmkkjkkkllklmmmkkikllllmllllkllkkkmmlllnmmlllmmlkklnnnnmmlljmmlklmmnnmmnmmmmmmmnmmnllnnnmnnlllllllmmlllllmklmnmmllllnmmmnoooonnmmmmmnnnlnnnnnnnnnnonnonnnooonnnooopoooooooonnonnnnmmmmmmmnnmnnnmlmnooonnlllllmmmmlmmlnnmmllllmllklmlkkjkmnljjkkklkkkkllllllllllllkjlnljkmllmlllkklklmklkllklmmmkllklmmnllkllmllmmlmlllklmlighijjjhjjjjkjlkkjkllmmmlllklmmmooljllmlklllllmnmkkljkkklmlmmjlmkjifcjkkjjiiklkkjhiikljjihjhjkkgikjjiiiihjkjhhfikjlljhiihjlnnommmmnnmmmmmmomlklmmmmmmmmkmnmlmmmmmmmlmmnmlllkkkkkjjiikkihhhjklijkiijklihhhhgghhghijjiijjiihijgffhjkjijjiiiijjjjijjikjikmmlklkklllkjkkjklkjjkjiighihijikihjkjjijijjkkjijiifijjjjklmkkjijkjiijjjhijjiiiikkijiikkkkkkkkkjllmllmmlmmnmmlllllmmmmlmmlllmnmmmmlmmmnnlmnoponnmmmnnmmmmnmmmmnmlmmmmmmmmmmmlmmlllmllmmjlnnmmlmnmklnnnnmnoonooonmooononnnnnnnnnnnnopoooooonopqooooopomnooooppooppoonnnooononoonmnnnnlmnnnmlmmmnnmmmnmlmnmkikklkmlmllllkklnmllllllllnlkkklikmlllkmmljklkjklmlllmlmjmlmlkkikllmmlkklmlmkjlllklmlklllllkkkkljjjjjkkkjjjiijkmkjkkkllmmlllmmmllmmmllmnnkknmlmmonmmnmlnlihkjlmkkjlkiikljjlmnkjmllkjkjkkkljjkkkjjllkkkklnifhjjiijjjiijkkifcjlnnnmmmnnnnmllljlmlmmnnnnnnmmmmmllllmmllmmmlmkkkkkjjkkjjilliggijikkikkjjiiligighhhihhlkihijjjhhiiijjjjjkkhhiihghjkkkjlkiiigjmlllllllkklkkjijkjjjiiijhihiikkljijjkjjjikkkkjjjjjjkjjjjjjkkjjjijhijjkkijjkjjjjlkjkkikljjklmmmmmlllnooonmnnnmmmmmmkmmllmlllkklmnnmkiklmllnnonnmnnmmmmmmnmmnmnnmlnnnnmmllmmmnmmlllllkllkkklklmllllmmmmnnmnonnnnonnnnnoppnlmnnnmmnmnonpoononooooooopoonoonnooooopooonmnononnooonnnmnmmllllmlllmlmnmmmnmllnllnmmlllkkmlllklnmkkllmljjnnkkkljllmllkllkiklkklkmlkkljlkkkmlkmlmllmmkkllljikjlmlknnljlmmlmnlkkkjjjjikkjjijjjjijlkkkkkkkjklmonnmnoonmnnmmmmmmmnnmmlnnmlmmllmmllmlkmkklnnllkkkiilmjhiijljklkkjjjlliiijklllighhijjijijjkoligfihmmnlklmmnnlllmkmmlmonnnnonmnmmllmkklmmkkjkllijkjiiijiijihjjhijjijjjjkkjgijighikkijikolihikkjggjjijjkkkkjijjjkkjkkkjknnljijjlkkklmklkjlkkjjklihghiijiighiijjiihikljjikjjkijkkjkmjkjijjkkjiikjgjkjlliijkkkllllkkkllllkllmllmllklmlmmmmkllmllmnmllmmlmlmmlllmlmnkjlmmmmmmmnmlmmmmmnnmnmmmlmnmmononmmllmlmnllllllkkklkkkkkklkkllmlmmnoonommnnoonnnnnopnmmmnmmlmlmnpronnoomnnooopponoonnoonppoooooonnnooqoooooommnmmlmmmnmmnnlmlmmnnmlmnmllnmmmlllllmnmmmmkllmnmjgkmlmkkkklkklklnlikkjjllkjjjjkkkkjklmmmnlkmllllklkkkjjkmmnmklmjhklmlkklllllklkjkjllkjihklkjkkmmklmmnnnnmmmmmmlllllmllmlkjmpmkloonmmmlkmkjjlmkkjjiijghhjljkjhjkijiiheigihdfhikjkmjihhjiiihjjjknjgfghkklmjjjkllkllmmmnmlmmmmllmmmmmmmmnmllnnmlkjjjijjihiiihjikjijjlkjijljiijjjkjjjjiiihghikihgiighiijjkkjkjjjkkklmlkijiikllmmlmklmllkkkkkjklkkkklljjkjjjjjkhhjkjiiihjkjjiijkklkiijkkjjkjigiijkkkkklkkklmjikkkijklkjlkmmmlklllmklmmkllmlllllllmkijlmnlmlmnllmmmlmlllkllnmlllmllkjklmnmmonnnmmnllonlmmmmllljkklllklmlkkkklkkjjkkllkjllmnonoommnnoooooonmnnnmmllmmllmmnoooononnonopoooooooooonoooopoqppnmnooonnoooonlnnmnnnmonmlmmmkllmmmmnpnmmnmlmmmmmmmljjlllmmnnlkjllllkkklklklmlmmllllmlllkllkkjgkllllllnnmmlkklmmklllljkkllkllkkmnllmlkkljjllllmlllkijijjjkklllmnmknnlllmmnonnoooonmnmlnnnmlkklllklmlkkmmjkkkklkkkkkklkklmkkmljkkjklljklifijffhjjihiijkjiijghjgihfenmlmkkkljkmmmmmmmmmmllmlmmmmmmllmllmmmmmnnlifhjiiiihfghijjjjijjiijjhghjjlliiighiighhihhgeffhhijiikkjiijijklkknljjjkkkkkllllmmlkkjjklkkkjjjjjjiiijihhihfhiklkjjkjkjjhijlklljjklljjjjifjklllkkklklllmnlijkkkkkklmlmnmmklllmlklljlllkklllljlllllllmmmmmlmmlkklkklklllkkkkkkklkmllnnnnmnlllnmlmmmmmlllmmllkjllllmlkkkjkkjijkkkkmkllmnnnonllnooqponnmmnmmmnmmmnmlnoomnqonnooopponnnonmnnonoooooppppppononnmmnopqomnnnnmnmnnnnmnmlmmmmmnoonlmmlkkllnnlklkkjijllmnmllmlllkkkllmllllmmnnlkmnllkkllklilmllkklmmmnnmmmmnlllmmijjkkikmlllknmllkjkkikmklnljhkkjhlkjllmnnommnpmjhjlnmmnmnnlmmmmljnnmnmmmlkklmljllmlkkigjkjlkklkmlkmkkmjjkkihjhhlmlhejjjijjhjjggkiikkkjjkjkkifkonlmnomljkmlmmmlkkklkkkkllkkjjkljmmllllnlklkkghhiiiijijjjijijiiijjeffegjjjiijkkjihhjihhgffiiijkmmjjjlkkjkkkklkkklmljjklkkkkklkkjjkllkkjkkkjijmkijjjjjiiiiklljjkkkkkiikjhhjllllkkjihfikkklllklkkjigkjhhiikkkkklllljkkklkklljkklllkjkllllllmlmnmlllmllllllllkkllmllklmmlllmmnmmmmmmlnmmmmlllmmmlllllllkjkllkkkjkjjjjjjihjkkllmmmmlmnnoopoonoonnnnoonmmmmnnmmnnnnmnnnnnnoonnnnnpponnnnnmmnnopponooooonnmoooopommnnnnnlmlmmkklllmklljkllkllkkkklllkkkkllllkklllkllllkmllmlmmmlmlmmmmmlmmlklklkllkklkllkmnmmmlklllmmmiikkiijijlkkllmnmkjjlklkmnmmnjjlnljkghlmljllkklnmkkkkmlkllnommmmmmmlmlllmmlllllijijkkjkkjlnllkkmlkigikkihfkkiikkkijmkghjjjihfjifiijjjjomllmkjiijnmllmmlklllkkllkiijlkikkkllmjjkkkkllkkkljjmlkhfhjhhhihhhhiihikjikjjjigijjhgijkkjjjljjhikjikjjijjjhjjljjkkkkjkkkkklljjkkjjjjjmlkklmkkjijllljkjkkjjjjjjjhhjjjjhijiighhhhihijjkkkjifhhhjkjklllkljjkjjkkjikjjiikkjkkkjkkkkjklmkklmlkliijjmmlkklllmllmmmllmkkllkjkmomjjllkkkklkllmmmnnllmnmklnmmmmmkklmllkklkkkkjjkkkkkjjikklllkmnnnmlmnopqomnoononnonmmmmmmnmmoommnooonnnnnmnopppoonnooolnonoooonnnnoonnnnnnnnnnnnnmmmmmnmllkllkmlkkjklkkkiikkkkjmnmljjlmnllmmllllkklklllkmmmmllllnnmlmmlkkjjjjjkkjjlkjllmnlllllllnljjlmlklljjkkklklkkklmllklnnmmmnkklkjfhmnkjllklnnmkmmmnmlmmmnnnnnmmlkljijkmkjklllmlkljilkjkmmmnmkllihijjhjijjkjkklklnnmllkjiiijijlkijjjkjjkjjlljhllkklkklllkjhhjklmklljjjkkkkkklkjkllklkkijkjhhhjjiiiiihhiihhijiiihjjiiiijgghhihijkmmljjljkkiiiihggiihiijkljjjjkkklkklkkikjjknlkjkllkkkjkllkkkjjjikjjihikljjkjkkkighiiiiijjjkjjiiijhijjjlmlkkllmlllkjhhjijiikkkkkijkjkkjkkmmmlkmlkhhlmmmkkkkjknmllmkllkkkmllkkllljjjkjjkjkllllmmmmmmnpmlmnonlklllmnmlllklkkihiklkklllklkmomlmnnonnmmooononnomnnnnnmlmmmnnmmnomlmnopnoooonoooooponnnnnmnnonnoopqonnnmnmlnnonnmmomlmllnnmklllllmllkllkkjlllkkkkklllkkkkmkkkllkklmkkkkllllmmlllklllllllllkkkkkkklklkkmlkjlkkllklnlllnmnmlmkmlllkkkjkjjklmlhillllkllklkllkljlllnmlmmnnmmnnnlmmmmmkmonnmmmkjjkkikklllmnmlljjklkklklmmlllkijjjjmmkmnkkijlllnnmmklihijljihgiiihiijhkllllmmnmmlllkkllkkkjllkljjjjkjjjjmlklllkjklkkiiijjihhlkkiikjjjjiijjkjkkkkjkiihikkkkhhhkllkjjjkjjjkkjiijjjjjjjjijjjikkkkjiijjjkkjkkjihjlkkjjhjkkjklmmjiiijjljjjkmlkkjiijiihhihjjijjiikihjkijkkkljjlkklnlkjikllkjjkjiikjigihhillkllkklljikllkkkkkklllmmmmllllmomlkkkkklmmlkkjlkkkkklkjklmnnmmmnnmmlmnnmlnmljklllmnmllklllkkkjkklkllmmmnmnonmnnomnonmnnlmmmmlmnnmmnonnmnonnnoppnooooopnopoonnnnnnnnnoonnnnooonmmnoonnnnnklmmmlllmmlkkkkmmllliimjjkkkjikjjjklkllkkklljjkjkkklllljklnlkkklllmlmnmmlkmmmonllkjjlkkllkklkmlmnnonmmmmlljkkllmmllkkjkkkmjjjkihkkmmklmmmlllmnmlllmllmnnmmmmmmlmmnlllkljkmllmklkjjhiljjllmmklnkllkkkklkkklmmkjkikhhnllmlhjnljiegihjijjjkklmmnmlmmmmlllkijlllkjjkklkjjkjjjjijklkjjjijljkjkiikihijjihgkkkiijijjkjkkkijkjjljikllkijiihjigjjjjihijkkkjkmklkiihhhjijmlkjghkkjkjjkmljjlnlkjjjjjkjikkkjighijlkjjjjjihighhhhhhhijiiiijjhikkjiijklklmnlklmmjijkkjjjjjjijkihjjihikkkkllkkkjjjlljkkkkkllklkklmlllmmlkkjjklllmlllklkkkklmmlklmnmlmmmnnnmnnnnmmmllllllmmmmlllklllkkkjllmlklmmmnnnoonnnnoomnnmmmmmllmnnnoononnpqonnopnnopooonnoonnnnnponnonnoppnnnonmnmoonmnnnmmmmnmlmmnlllklllllmmklkkljjjiiiiijjjkkkklnnllllmlklmlkkllmlkhilllmnpnmmlkmlmmmkllljlllmlllljlkkklljjkkkjkkjmkkmmlmlkljjjiijkjihlllkklmlmmmjlmmljkmlmnmmllmmonmlnnnnonnmoomonnpmmmmimjikllmmllllkkmlkkigjmlljjiiidgkmpmkghijkiegjjjikjiklklklkllmnnmmllkkllljjjjhijjihgijijiilljjkkkkkjhjkjkjjhfihfghggjjijljiigighhhilljijkjjijgiijhijjjljkkjkkjjjjijjjjjjkkjjjiijhhiihmmkllljkkkkmjijikjjkjjjjiijjjkihiijiffhhhhhggihiiihiihhijjkjlkllkklllkklllmmmljikkjjiklkhjklkjklmllkljjjjjllkjkkkmkmmmlmmnnljkllllkmnmmkillkkklmkjlllmmmmlllllkmmnoooonnnmmmmmlmlllllllkllllllljjmmlkmmnnmnooponnopoonnpnmnmmnnmnnopoooonoooopooonoonnooonnnnmmonmnopoonlmnmmhlmnmmmmmmnmnlmmlmmkllkjklkjklihijlkkkkklljjkkkkkjkklllkklllljkklllmmmnkkknmkmmnmlnmlklmmnljlmmnmmmljkkkjllkkkllkmmllkjllkjjklkkkkmllkjklkklllkklljlllkkklkljlomlllllkklnmjmonnnonnonmllmpmmmnmmkjmllkikmkkiilmlihkjjjjkjijllmllklkjhhkiijjjkjijjkikldhkikmnnmllkllkmkjjjkjiiijkgfkliihikjhiiiiijhiijjkkkhfhjiiiijklljijigcfghghkljijjjjihiiikjjjjiilklliijiiklikkjjkllkjjihiihijjgjjiijjikkjjkiijjkkllkjllllkikjjjijjieehhggghhiiihiijjiijjjklllmmlllkkjjkklmlllkjjjiijjjjjjkljijllmmlklkkkkkkjjkkklkkmlkklklkkkkkkklllmmkkllkmmllllllkkllmnmkmnmoonoonoommnmlllmlllmlmllllklmmllmlmmmlmnnnmlnoooooppppnmonmmlmmopnnnppnnnnnonnnooooooonopqnmmnmmmnnnnnnnmmmnllklmmmmmmmlmmmmmmlmljkkiiklkjljijkklmlllkklkjkkklkikkkkkjikkkkkklllmnmllnpnnnmmmmllmlklmllmmlkmmlmlmnkkjkjlkkllmnmlmmkjknnmmllmmjlopnljjkkjkkkjjjkklkjllklkklilmlikllmnmmnnlmmmnnnmmlkljlopnlnomllmkkkjlkllkhhmmkkklkijijjiikjkjjjkjhjkmkjjkkkkjjjjijihimmmmomlkikllklkkjkiijijijhijkihgghggiedfgggiikjkjjijjkjhhjjjkkjhfhgfgiiihhjjijiijjhihjjiiiiihijkjiiijkkkkjjjjkjiiihjiijiijkkiijjjjjkjiklkkjiikklmkkmnmlkkjkljiihhhiihiihihijiiijjjkkjjlkkllmlkkjllkjkkkkkllkkkjjjjjjkhhjiijkkklmlmmmlllkklkkllkklkkkkllkklkjjjlklmlmmmmnnmlmlklmlmlkkkllmnoopoonnnnmmmmnnmmmmmmmmllmmllmlllmmmnmmmmnnmlmnnooonopponnonnnnnooonnoonnoponnnnnnoommonnponnnnnmnnnmmmnnonmmmmmlmmmmmlllmmnmmmnlmllllllllmnmkijkmllmnlkklkkkkjkkkllklkjkklklllmmnnkiknnmlklmllmmmmllmlmnnmmmmljjlmmmjjkllmmlmnnmmnljmnmlmllmkjllllhiijiihijihikkkkklklkjkmklkkjkkllmlklmmlllklkklllnnmnnmmonljknnlmllllllkklmljkkjjiilmhejllijkjkjjnkjkjjjliiikjhgjjijjmmmmlhklmljjjkjijhhjiiihiihhiiiihgghihggiikljjijkkkkkhiiffhjjhhhiiigjjjikiiighgiihiijiggiiihhiiijjjiijkjiijjjjijjjjjhkkiijjkjjjjjiigjlkiijklkijkklnomlmlkjihhgiiigihiiigifghhjjlmkjjjkkmlkkimmlkkllkkklmkjkjijkkkjjihmkkkkklmlllmmlkjjmmmllkklkklklllklkkkkkllklljkllllljlmmjjllllmnlllmnnnnnmnnmkkmnmmmmmmnommlkmnmmmnmkjlmmmllmmmmmnnopoooonnnnnmnnmnnnnnmnnnmmoononnnonnonnoonnnnnnnnomnnmnnnmnnnnonmmnnlmmmmlmnmllmmllkmnljjkkkllkkkjjjjllkkkkkkjkkmmlllklmmmlmmmnmlklkkkjklkllmmnmnmmmlllllmlljkmmlikkkklljknonnnopmlllkjikllklmmlllmmkjkjihfiiihhjljkjkjkjjjkkmlllkkkjlmklllklklllkkklllklllopoljlmmlllllmlmopnmnmlkkkkkmmjkmlmjijjjlkknmljjijihihhiilkiihjkmnnllmnmlkkkkhjjjjhhigiiijhgijhhhhiihiiiijlljikjjihgiihhjljjihhiijghjjjgggggdhgggiljiijighijhiijijjjkkhgjkkjjilkjkjjjkjjlljjhijkjhhijkkjijkkjkmnmmllllkjijihjiiiijiihfhgghhgiijjijjkllkkkkmmkkjkmkjjiijggiiijijjikiikjijlmmlllmllkjklklkllkkllkklmlkkkllmlllklljkkkkkkkljlljlkkjknmlmnnnlmomnnljlmmnnmmmnnommmlmmmnmmmlkllonlmmnnnnnnnoomnnonllmmnnnnmnnmmmnmmlnnnnmlmnnoooooommnnnmlmmlkklmmmmmmnnnnmmmmmnmmmmmmmmlmmllllllljlkjiklljijjjklmmkkjkkkjjjjllklmmlkklllkjjkkklklklnmnnnmmmllkjllkklihlmmlllmmmmmlnnnnnnnnlklllkjkjkllkiiiijkkjmmljjlkkkmmllmlllmllkllmlkjlnljlmllkjjkkkkklllnkmmmnmnmkiklmmmllllllklmkkjjkjjjhgkkijkklihijjlmlmoklmlllkkjijjmlkiinnooomlnmlmllkkkkkjjjiihhijiggiiiiihhiigihhhffihijihiijiiiijjjkiiijihfikjhhiijkkkjjjlnllligijjijjkjijmmliikjjkkjllkjjjjjljjljiijijhhhiihgiillklmnpnlmnnlkkkiikkkkhijhhihjkighhijjlkjkjjklmjkijllllkkjkjikiiijkkifhikikkjkjjkkjklkmllkkklllmmllkllkkkkmlkkkjkmmlmmlmkjjkkkkjjllllkkkllllmmmnnmmmnnmllmponnnmnnnlmmmmmnommmmlmnnmlklmmmmnnnnoonnnmnmmmmmmmnmmmnnnnnnnmmnmnnnnoopppnnnmnonmnmmmmmlmnmlmnmmnllnnmmmmlmnmllmmlkkkllllkikkklkkkkkghijlkklkkkjijijkkjkmlkjkjgikjkkklmjllnmmmmopmlllllllmllmllmllmlmljkjlmmnopnllmmmnnlllmmkhhkmlkmmkkkjiiiiiklllmnomllkklllmljjlmljjjjkkllmnmmmjjlnkilnnnmmmmlmllkmnlkmmmlljkklmlkkjkmkjjkjikkkjijmlllkjjljdhjihikkighimmnnllmmllljkjjjijjjjkihehhedfghhjiggihhhiffbeiihjjiikllighiiijlggiiiikiighiklkkljkjjiihhhiijiggikkljkkkkjjjjjjiikkikjijkjijjjjjjiigijiijiklljkmoonklmmmkkkjjkihiiiiijlmkkihijjklkkklmljiijkklmmllklkkkkkjiijijiiijnmnlkkkkllkklkkklkmmmlkllkjkklmlkkllkkmllmmlmommlijllmmjiklmmnlllmmlllmnommnnnmnnnnoonnnmnommnmmmmlmmmnnnnnmmlmmmmmnmnonmnnnonmmllnmmllnmnmmmnnnmmnomnnopoooonnomlnmnomlmmmmmmnmmmmlnmnonnnmmmnnmmlmmlmlklnllljkkiijkijjfeiiihkllnjkhijjklkllkjjlkkllllllmlkkmmmlkmnnljlllmlmlklklmlklmlllllklmmnnnmlnnmmnlkjjkkjkikllklmklkkijiikmkkkmlkjkkkklllmkjkklkljgggikjllkllllnmlllnmlllmnlmlllmmllllljjiklkkijjhkkhiikihkkjkjhkjjjjijjibeiiiijkifginmnmklmkjjkkjijhikkjkkggegihffghhihijiighgfggehihijjiikighhiiiijjjhijijhfefjkiijiiihhhihjkijkgehilkjjijjjijjjkljjkljkiikkjjjjihjjihfgijfgijkkkklmnmmllllkkjijjhihiihhhjjiiijjjjjkklklllkihkmkljllllmllkkjiihjjighhilmmkkkjkkkkkjkklnklmllkklkkmnmkklkkklllkklmlmopolkkllmlklkklmomlmmmlmmmnonlnomllmnmmnnmlnonmmnmllmlmmmnnmmnmmmnnmnonnnnnlnnnnmnmmlnmmmllmmnmmnnonmnnnonooooooomnnnmnonmmmmlmmmonnoomnnnmmmmmmlmmmmllnlmmknpnmllkjijkkhhiighhhgkjkkjjkkllljjkkkijkmmmnommmmmllmmmlmmmlkjljkmllmmlkkmnmlkllmnlmmonoonlmmllllklmjkkkkikkjjjkllmlllklmmllkmkeikkkkkkkkkkkjhjmlliikkjkjkllmnmlmmmmmnmmmjillmklmklmmlkklkklkhjijlmkjkjjjkkklkhjkkklkkjklkiihjhjjhkiqmlllljkjjkljlmjknmlmlhgggfhhggihhiijihkkiijhffhhhgghigghjihjjgijhhiihhhfcfihhikjjijiiiijjjijieikljihjjkjjklljkkjiiggfhiiiiijjhiiiiijklllkjkkjlkkkjjjjijkjjijiiiihhhfhjjiiijiijkjjjkllkjilmklkjkikkkljkllikkjkihgfghijkjllkmkjkjkllllmmlkklmlkkkllkjllljlmlllmnonnmmlkkjllllkkmlkjjkkkjklmmmmnmmmlmnnnmmmlllkmmnllnmmnnlmonnmmmmllmnnnmnnnmmmmnmllllmnmnnmmnoomlnooonnnnoommmmnnoonmnnnommmmlkmmlmlmnnmlmnmmmmnmllmmkkllllmlmonmmmmlklkkkkllkkijjlmkijlmmmkllllmlkkkkklmmlmnmmmllmllllmmkmmjkmlllkmnllmlijjmmllllmmmnnlljkmlkkmnllkjijgjjklllklmlllkklnmligikkkkkkkkijkkjjkjjmkkkkkmlklkmllklmlkmnnmnllonmmlmmlmllmlkklmlklnmmlllkjjklkljikjihijjkkjllljjiinkjigomllkljkjjihhikiikllkjhifffhighjhhlkihjljhgghgehgghhjjhjkihijkjikkjiihiiihfijjjjhiiihhiiiighhiijjiiihhjjiiijjiihihihhfghgghiiihijjjjklklmljlmlllkmlkkkijkjjjiikkjihghiijjiiigijjljgjkkjkkkkkjkkkjkmmlkllnmlkjjjkkkjkkkjijlklkijkmkllmlklllkkjklkkjllllmkllmmllmlllmmmlmmllkllllljijhikjkklmllmmlmmmmmmmmmnnmmmmnlmmlllklmllmnmlmmmnmnnnoppnmmmnnllmmmnnoonmnnnlmmnnnmmonnnmnommopnnnmnmmmmlkllmmllklmmmnmmmmmmnnnommlmmmlmmkkmmllmmlkkklkllkkkkkkmmkjkllklllmnlmkklkkklnmkllllmllkllnlllmllkklnmlillkklmlllllmllklllmlmmmmmmlkllkkkkjkikkjkkljkmmlllllmklkiklnnlkjkkkkklkllkkmllllkkllllkkllmllllmmljlkmmmljlmllmkjkjkijjjjkjkjkjjjkillljijjjfklljklnnmkkllookiggklkkjffgijkjjiicghjigghefiiffgihiifhhihfgbehgffggghihhjlkjlkjjjjihijkkhgiiiiiijiiihikljiiijkjikjhiijkkjijjkjhiiiijjihhjiiiijihjjkiijjkkmlklkjlnmljjkjijjijijjjkikkiiiihgihijijjklkkijkjkjjjkkklmlllkljlmklkkklkkkkkijkkjllkjkkkkkkkkkklkjkklllllllklmkklmkjjmmlklmnmmllkllkkkjjjjjkkmlkklkllkllmmmmmmnnnmlklmmlkllllmkmmmmmnnmnnmmmmmmopommmmnlllnmmmnmnnnonmmnnonmnnnnnmmooonoopoonnmnmnllmnnnllkikllklmmmnmmmmnnnmmnmlmnlkmlmllmnmkiljiklkkklkklllllklkjklkklkjjikkklmnkiiklmlkkllkjjllllmnlmkklklljlmllkkljjkkmlkjkmlkklmkkmlikllkkkjikkjijklkjllkmllljkjkmnnlklnlkihjiighhkkkkmnmlkjkklljkkllmnnnnlmmmmkkmllkkklljlkljjjlkkkllnljjlnollkhjknjjlmmmlmlklkjjjjjkkilkigjjlllkhhiiihgihgfghhhijjjifhhihffbfhggiihgiijiijjiijiijhigikkjhiggjhgihijiijiighiikihhijjhgjjkiilkjigjjjhijjihhiiiiihjihjhjkklkkkkkjkjkiijikkiiiiiijiijjkmjhgggfgehhiijkkjijklkkjjklklllkklkljikjlkjkkkklmkikkklmnlkkljkjkllljkkjjlnmkijkkkmlkllkjllnommllmmmllllllmmkikkklkllljkjlkkmlllmmmlkklmnmmmmlkklklmlmnnmmnonmnmmmnnmnnnmmmmnmllmmmmmmnnnnnnmnnonnnonnnnoonnononopnmmmmmmllmnmllkjkllmnmmnmmnmmmmmkkllmmlmmlklmkmlkkklkijlllklkklklkkkjkkklkkjkkjkkkkkkmmllmllmmlllllljkmllmmlllkljkkkkljjllkjlmnmlkjjklkjkkllkhkmlkikkkkkllijkkklllljknmlkhilllkklkjhjiijjighjjkkkkjkkkklklllmlnoonmmmmmnmkmnlkjhjklljkkkmomkllmljhjnolklmkjkmkjklljklmikkjjlhjkljkkigijkkjiehijhghiiihhiijjjkiiiihggfhhhihjjiiihihgghhgihihjiiijjiihijjiiiihghhikjjihiighiihijhhhgjihiihffikjhihhihhiihjjhiijkjmlkjjijiiijhigijjjjiiiijiijkjjjjighffhgfhghiiiijijjjkkkjjjjlljjkllljjjjlkjkjjjkmljjkklkkllkjjklkklljkllklmlkjkjkkkjkjkjiklnppomlmmlllkklkllkkkklmlkklkllllklllknnmkkjilmnmmnmlmlkkmmnnnnnmmnmnnmmmmmnnnlmonnmmlmlmonmmmnnnnnonoponmlnnnonnnnoommnnmmmmmmklmmmmmmklllmnnonmmnnmlmnlklnonmllmmllllmlllkkkjkkkkjjlkkkjllkkkkkkkijklljkllllllmmmkklmnmnlljilllpplmlkjiiklklklnmmnlkmnnmlknolkklmlljkllklljijjjihjjjkkklkjlnnnlkijkkjjjhjijjjmmkifjkkjkkllklljhlmmmlmnnllmmmllljlnllkjlknmlllklnnmlknnmjklmkkllkklnonlmllkijhghfgiehjigghkhijhghhfechheegiiihgikliijiiiiiihihiiiikjiiihhiegihijjjjjiijjijiihiijjjgghihhhihgghhgghjiijhhiiiihhhggjiihhfhiiiijjjjjjmllkjjkkjijjhhijkkkjjkkkjjjkjikkijiiighihgiiijjikkjjklmkjjijijklkjkkklljjjklkklljjkkkkjkjjiijjjkjkkjklllllmllllmkkkkkkkklkjklmmlmmllkklkkkkkllklmjjkkklllmlmmllllkkmnlmmmlmnmmnmmnmlklllmmnnllmlmmmmllmmmnonnnmnmlnnnnnmmnonmnnnnnnmmnnnnmnonnnnnonnnmllmnnlmnmklmmmmmkmmmmllmmmmlmnnmnommmllllllllkjlnkjjklkklkkkllklllklmkijkkkmmlkjklkkllmmnnmmlmmmomnmkknmnmmlljjllkkkjjlmnmmljkmmmlklmkljkmmmmmlllmmlkkkjjkmkkljkmnllnllkklkkkjklkjjkkjkkjkkjkjklmkikiikhjklkjlmnllmmkmlmjkkkmjklmmlllllljlnnjjkkkllkmlmlillopopmkjlmkjkkihfbhihhggjkjigdfhifeiieffgjhgghkligeeghgffehhkihiiiiiihhhghhihhiigiijiiijjjiihijiihhhhhfgfhiihffghiiihihhhiiiihgihhhhgihhiiklkjjijijihjjjiiijgiiijljijjjjjjkkkjjjjiiihihhgghilkjhkkjjjkkjjijjihjjjjlmkklkkkjkkiikkkkjjkkkjjjjjjjjjkllkjjjllmlkmlkkkllkklllkkllllklllkkklkiklklmklkjklllllllllmmnkklmlmlmonmnmnnmmmnmmmlllllmmmlmmnnmnmlmmmmnnmmmnmllmnnmllnonmnmlnnonmmnoonopnnnnnnonnnljnpnmlmmmmmllllllmkkkklmnlklnnnnnmlmmlllmlkklkllkkjkmmkhjkjjllmmkkknljiijlkjjjjijlkkkjklllllmmmmmmlklmmmllljjkmmkkjllllmmmlklmmmlllkkkkllkmlkkkklmlhhjklkklnmllopmklmklkklijjkljijjjjkjiijkjilooliljjjkkkkkklmnmllkijllnlknllkilmlllklljkkliilmllklmmmkfkloomnnkimolkmljhedfhkjjiiiihhfjhhffehcdcdggjjikjjjhgfgghfefhhggiiiiihihghjijijiihijjhhjkhhkiikigghihhgffgfhhgedfhggiiiihhjihiiiiiihjkjkjhiiiijlmjjjiijjkkjjjiijijjijklkjjjjjkkkjkhghiiiihhiijiiijkkiiklkjkllkjkjjjijijjihjjkjhijkjiijkjijjjkjjkkikkllllkjkklklklkkkllklllkkkjkkklkkllmlkjjllkjkjklkkkkkkklkkklmmlmlkkjklmmlllmmnnlklljkmmnmmmmlmmmmmmmllkjklllllllmnnmmmnnnmnmnnoonnmmnllnoppnnnooonnnmmmkllnnllmllmnmmlkklmllnnmmmmmmmlmlllkjkkkkkllkkklllkklkijkjlmlkklllkjhjjjjijkllkkkklkkklklmnmmlklmmnnnmmmmlmmnkljkkkkmmnollllmllmkjklmlkkklkkkllkijkkkmkjiilmjklmlllmllkllkkkjijkkjhllkkllkijklkgklkjikkkkmkjllkljggikklmmlmmlkllllkmlkkkllnklklmmklkkllkmnmmolmmnlpnmkfghhijiigiigfffiggdeccdegdegfghjijkihfhijhghhfgghgghgfgfdhghkjhfhhhiiifgjhhighihgdfggggfdeffgecggffhgfghhihghgijhjklllkjjihghhhjkjijjjjkjjjijjiiijiijjjijkijijihhhffggihhikkjkjigjjjkjkmlkjkkijjiijiiikjjjklkjjjkkjkjjjihiijjjkjjjkkkkmmlkjkmkkkjijjkkklkkkkkjkkjjjlllmjikkklkkkkklkkjjkkmlkkklmmlllllkllmlkllllmnlllmmmnmmmllmmmmlllmlllllllllmmmmnnnnlmnonnmnpponmmmlmmlmmnonnnnnnmmlmmmjlklmmmmmllmmmllklmnmmmnnmmmnmmnmlllklkkllmlllklmmlkkkjjjjkljkklkkkjikkjhgklkkkklklmnmlkklmllllmnmlmllllmmlkkkiillkllnmlkkljllkllkllmljjikkkjnkhgjjiilkkihijikkklnmlmmjklliijjkjjiklllmnklklmlkkmmljkkkjjkjhjiljiijklmmnmnonlllkkhjklkhkmlmmllmnmlmmmmnmnnnnnmonlmopnnijmhhhhiihfcdeeccb`efijihghjiihiiiihgghfehhihhihffhhfghghhedgjiiiihihighjhgihigegfgfggfhhghhhghhhdhhhfgihhgdghiiikkllljijjhhjihiiihihhimjhijjkiihjjjiijjjjiiiiffhhhhiihghikjkjiiijjjjijlkjjjkjjkjijljiijikjijjjhkljjkijijjjjjjjkkikkkllllllkklkljiklkkjkjjjijhhjklllkjkjikkjlmmllkklkkkjkmlkkllkllllmmllmlklkjkklonlllmmmmmmlkllllllkllllllmmlllmmnmlmmllmnnnnnnnmmnmmmlnnnnmmmmjknonmmmmllmllmnnlmmmmlllmmmmmnmnmnmmnonmlmmmlllllmlllmlklnnmlllllkkklllkmjkkkllljijkkjjkiikkklkkkkllkklmljlllklkklklkjkkjlmllmlllkklkkkllkkkkjjjjjjkjikkifiijjkkkjjjkllkkklkkkjkkmmiiijkjjkljlmnmkklmlklllllkjkkjjkjihhlkiijklmmmllnnmlmlljjklijmoonomkkmkklkmommmlmllmlmnllkjjghkihihijkggeehgdcaefjhgeeghhihfhiihhhhfghhhihgiiihhghfegiihgfihiihhjigijgggghghgfghjighhijhhfhijjiihjkighhhiiiiijiijjijjiijiiiijhiihiiihiiijiikjjkkjjkkjjjijiijjihhjjiijjiikjjjijjljkkkkkkkkllkkjjjjkjjjjkjjjjhkjijjjjjjjjjjkkklllmlkllklkiihjllkllmlkkkijjkjjjjjjklhhlllkjjjkkkkkkijkkjkljhkllkllmmnnmmlmmmkmlllkllmmnnmllmllmmlmmlmmmllmmmlmmllmnmlmmnlmmommmmmnmmlllmlmmnmmnllnpnmnnnmlmnllnnkjklmmmmmmlmlmlmlmnmmoomllmmmkjkjkklllljkkmnllollmkkjkkkjjkjklmkgijlmkjjikjlkkllklkkkjlnmllllkkkjjkkjhlmjjliikmmlljkllkjkkkmlkllkjkjijkkkjjkhkmjjjkllmmnmnoljkllmlkklkkjkkiigjmkkkijkjljjhhijkmmlliihjnkjjjkklklkllmmnmllkjllnmllmnnmmlmmlha`gjmmmnnmmmmmmjijijihhhhhhggihgfhhfe^_eggghffgfghghijihijhhhggihihijiihfefghggihhigijkhhfikifggghhijhhjlkihhhhhhghhhiiiijkiiigiiijjihiijjiiiiklhhihjihhhhjjhhjiihikjjjjjkjjjjihhhhhhhiijjkiiiijjjjjjknmkkjjklkjlkjkljijlljkjjjkjjkilkjjkjjijjkjkkkmlmllllkjkllkjjjkkjkkkkkkljjkjjkjjiijjiilkijjijjkjjkjjjihijlkjklllmmllmmmmllmlllkklklllllmmllmmlmmllmnmmmklnmlllllllllllmmlklonnnmmnnnmlmnmnnnmnnnmnmnnnnnmnmnmmmllklmllmmnnklmnmmlllnmmnlmmmlllkmmljjmmkkkllllllkklkjjjklklljlliihjkmkjiihkkkjkmmmkkllllllmlkklkjjkjklklmkkkkhilllmjllllkllklmkkjjijkkjkkjjjjfjljlllmmmmmooollmmjkkkklmmkkkjfilmmlklkklkjlijllmlmlmllkllgkliikkkkjllmmmkllllmlnnlmmmnmmnnnmjijklnmmmmllmmllkjllmmmfefefhgggiigffedfhgdgghgeghghiikkihhghhhhiihhhghgffgecghhiihhgiijihghjjihiiiijjjljiihghihjjijkighiihhigiihhiijkiiiihffhggjiggiljiljijkjiijjjiiijijlkkkjjjijihiihiijjjhhijjllkghklnlkjkklmlkkkkjhijjjjjjjjlkjikkkkjjjiijjjilkkljiklllmmlklkkkkkkkkjkjkjjjjjkkiiijkjjiiklkjjkkkiijjkkjjjklllklllmljkmmmmoomnljlmllmlllllklkkkkkkljiklkllklllkkklllkklmllllmmmnnnnlmmmmnnnnmmnnnnmmnnlmnnmnomlmmmmmmmmmmnllklllmlkklnnnmmmnmmmmmmlllkkkkkllllllmklljklkjjkllkjkjjlkhhkjjijjkkjkkklljjlkkllljjjkjilljijjkkkklmlkjjkjkklllmlllkkkkjjijklkijjkjjijjjikjjjlklllkjkjjgghkjhijikjkkjhjjjkjjjjmkkljjkklklkkkkklkkkjkjlmllmnmllmmlkkjllkllmnpppnmnllmmmlkjklllmjijmlllkjkkl_ehifeffgjghhffggihggeeddfhhijjmljiiiigfhihghjihgfijhikkjhijfgiiiihghghijjijiiihiihijiilkihhijihijiihjjjjjjjjjljjjiiggiihihghghiijjjiiihijihihjkiiiiijkihiijiihghjiiihjjjjlmlkkklmmlkkkkkjkjjjhiiiiihiiijjkklkjkkjijhjjjijlljjkjkllllmjjkkkklkjkkjjkkjlkjkkjjkjijjjijklijkmljihjkllkklkklmkkkllkjlnnmmoommmllmkjllkjkmkkkklmlkllllkkllllmlkklklkllkkkllllmmmmmllmnmmmllmlmmmnmlmmnmmnllmmmmmlmnnmllmlmllllklmkjlmmmmmlmonmmmmllkkklnlkjkjjklkkljiijjkkjkkjkkkklljiklkjlknmlkllkllllkllkkjkkjjjjihijklkklllnkijkkkkkjklklkkjkjkkjjijkjkklmklmlmklkikkklklllmlkijikkjklkjijkkkljkkhkkjijljjjjjlllllllllklnklkkkkllmmlllllllkkkkhhnmmmmoonmmlllljkklkkjhmjkkmlkkkkkhedhgghffhiihfcdefeffegggfgghhijjigijihihggjigiiihhihikjjiijihiiiigikihjjjihihifghhhjigjkiijkjihgegihgfgijkjjijjijkjjijjiiiihiiiijiijjjjihihihjjighjiijhiijkiiihhiiiihjjjjkkjihehlkkjkkjjjkkiijiihjggheiihhkkjkjjkjjkjijjlnmjjlkllkjkkkklkkjjjjkjklmmkkkkkkjikijkkkjjkjjjjliehijjjkkkkkjkllllmlkjlllllmlllllkjiikklkkllmlkmmllllllllllkllllklllllllkklllmmllllmmmmnmmlmnnlmmmlnnmmmmnmmlmnmmmmmmmmmlllllkjkkljjlmmmmnmnnnmlmlkkkllmmlkkkklkklllkkiiklkkijkjkllkkjjikkjjknonjkjlkkklllmllkkkjiiijjjjjkjlkjkkjjkkmmlmmkkllllmkkllkjkklkjikkjlmkllkkkjjjkkkmmlkjjihjkkmonlkkkkmljjhikkjijnmljimnnmllllmlklnllkjkmkjlklklkllllllljilmllmononnnmlklmkjkllmmkklmmlllllcdegijhgcghhgdcghfgghghgjgggghhfiijkkkihiggfchhhgfgihjiigfhhheghffhihhhjhgghggefghiiiigfhijhiiihiiijjiefgiiiikhiijkjiikkigijhhhihfgjihhhihhiihikjiijjjiiiijiihhihijjkkjiiiikkhffikkjkkjkjikiijiiiihgikkjjjkigghjijiiiijilljlljkklklkkkllmmlkkllkiklllkkkklkiijklkkkllkkjkjkjfijjjkmmiiiiillkklllklljjlkkkklijjjkkkkjjklkkllkkkljijllmmlmmlkkjklkkkklkjkklklmmnmmnpnmmoommmmmlmommnmnnmllmmmmmnnmkklkjkkkllkkklmmmmmlmmnmlnmljhkmllkkklllllkkjjjkkklkkkjjkljjmkllkjlmkiikkllikllklmlllllkljjllkklkkkjigiiikkjjklnmklnlkmlmnkjjllmjklkkjjlkkkkkkklkkkkkmkkjjkkikjiilnlkmllkkkkkkkkkkilljllmlimlkllkklmmlkmnlklhjjkkllkkkikkklkjlillklllmmkmmlkjjkkkkmllmnkllllijjkhgfgigghcdfhigjkgjihhfghjhfgihggegjihhhjiigfhjihfdfhiiiihhjlidiighghhihgihhhhihhhiiiigghhiiijjjijjjjhhgihgjjjlkjjkljijjjhhijhhjjkjjjjihijihijiihijijlkhfijkkjiiiiiifikjjjiiiijjjjkjiikkjihjhjlihiigghihhiikjiefijjhiijjjjjjkkkjijkkkkkkjjkkjjklkkllmljjkklkiijkkklkkkllljikjijlkjkmlkjijjklkkllkklkklmljhikjjjjjjkkkkmlllmmlkkkkjjlkkklmmlklkllkjjklkllkkkklmnnnmmmmnnnnmnnnmlmmnonmlklklllmmnonkkmlkklklmllklmlklnnnmnmlnmmmmlkklkjklkkkllklkjlkkkkkkijklkjjjllkklljjkmlkhhllklkmlkkkkkjklmljkjiiiikkjjjkkjjkmkkjkmmllmmnmmllmmmlllmmlljjlkjjjlkjiklkihjhhhiikjilmkkmkjkkkhjllmmlklljklklmljjklkllkjkkkkkmljjkljlllkklonlkilmlllmmmmmmllmkkjjijljkkjjmmmkjklkkmjhgggihfdcgkkhhhhlkhihghhhgiighghhigfggdejjhjiigggggcdhhhhiiihhiiiighjihhhiihikiiihhiihhgiijkkllllkkjjijkiijlmkkkkkjkkkkkjikjjikmmjjijjijiiiijjiihgijihhiijihgiihihghihiijjjjjjjkiiiijjhhhjjjihiiijghhhhjiihhhgdgkjiiijkjjjjkllljkllonkjkjjjkkkjjkjjkjkkkjljkkjjjjkihjlljiiihhjjjijlnmkklllllmlklkklkklmklkkllkjiiklmllmlmlkkkllklljjjlllkjjklnlllkjkkiilnmmmmnnmkmmmmmmmmmnnmkmnnmllmllknnlmlmnmllnmlkllmllllmmllmmmmllmmmnlmkijkjjjkkijklljjlmllmllkkmkkkkihkkkkkkkkkklllmkjikllkjlnlkhkmmllkiijikkjkkkllkllmklmlllnnlkkkkkkkmllmmmmlmllllklmmjjjjkkjijjklkkklihkmlklklllmlmnnnnnlmliklmkmnnnnnnmmnmllkkkklkklkkllllllmonmlmlmmllmnmkmnmkmmmnnmolihkmlmmllkllklghggihgfghdefefghigggijgfgihighhhkhghid`fgkjihhffgfffhihgiihihhiiifhgihfghiijjjikiijijjlkikjjjjlkjkkkjjkjjjjjjlkkkjkjkjjigjjjiiklllkjijhiiiiiiihihhghhhigfffdghhkihijhfhjjkkjijkjjijkkijkllkihighhgghhgjjgffiffhjiikkjjiijjjlnlkllkmmkijijikkigfiijjkkkjkkkkkkjkihihjkihiikjijijkmmkkkkkkkkjkkkjiklkjkkllkjkkkkhgkmmnmlkllklklllmlmlllklkkjjkllklklkkmmlommmnnmmmmmlkmllllmnnnooonnnmmmmnnmmlmllllllkiklllklkklmllmmlllkklljlkiijkkjjkjiklmklmnklkkkkjkhjjkjjkkhjjijkkjlkklklljlmmkjjjigjkkllkjkjjkiiklkllkllllmmnmnmlllllkllmlllmnlmmnmnmmlmmlkjkmljihkkjkjjjiiikmmllkkjlljklnnoonnlgllmmnmmmnnnnnnmmlkljkkkikiilnnlkkkonmlmmmkklliknmmlkkklmmnolkkielljjlklkjiggggfgfededddfggghggfhjfefhhihgfgihffeccffiihhfgegijigiigggggghhjigghgigghjjihjjkjjkijkkjjjkllklmlkijijjjijjjjkjjkjkjjjjihijljhjlnkiiihggjiihgijigiikkjkgghhhghhgiiijihijkkjjjijjiiiijjjjljijghihghfghhhhgghhghiihiijjjiijklmljjiikjkiijjjijkjiijiijjkkkkjjijjklkijjjkjiiijjijkhkmllkkljikkjlkkjkklkkkkmmkkkkkljikmnmlkllllklllllklkkijkkkjjkkkjjjlkkmmmmlmnmmnnnmmllnnmllmnmmnmlmnnnmnnlmmmllllmkllljlllllmlmmmolmmllmlklkjkkkiiikjjkkmkkllllmlkkkkjjjijjjkkjkikkjkkkjllkkkllklnnkhijkkklmljijjijkiijkklmllllmllnnmlmmnlkjkllmmlmmllknonllklllkkjkmmljjllllllllmmlmkkklkkiiklmmknmnmjlmmlllmlmljkmnmllllklkklllmmnppomnnliflmljjmkgkpmlhfghkkjklkjkjilmkkmmmmkkgghgghfefefhgffegghgghhhgghhfgfggggfghhegjgefedeehefgffghfegfhhhhhgiiiijijjhggiighhijghjliiiijjhiljhhiigijjkkkkjjlkjjjlkkkkjjjijjiiiiijikklihhhiihiighkkjiiihhghfhggjiiijjjjijjjiijiggihhghkjhhhfhghfhfdfefigghghhihiijkljjjjllkkljhjkjjjkkkklkkjijijjjjkkjkkjkkjklmkjhiikjhjkjjihjjjkkjkkkjlkkjjjklkkmmllkkkkllkkklkkkjkllkkkkkllllllkkllkkihikkkkmmllmmmlmmlmnmklmlmmmmmlnommmoonnnnnmkjlmmllllmmmmmmonllllllmmmmlmlkkklkjkmljjjkkjkkmklklllljlllkkkjjkklkkkkkklolkjmllkkmmklklljjjjikiiklihikkiijikkkigjkjjkkkjkllllmlllllonmmlllmmmonmmmmkkkidikkjjijlmnlklmlkkkljllllkkllllklmnonmllmmmmmlkjijlmmlkkkkllnmlmlljjklnqolkkmklmpmkjlmljgklklklkmlorpmlonkmmmlgeghfegffgfegf`_`dffgghhjkkhgfdaeedehffefhkiggffcbcdgifeffefedfgihhghiihghiihghhiiihfhgikljijiijjjkliikjijjjkjjkkjjgikkkkklljjkijjiiighjjjjihighihhhfceghghhiihiihjjijjiijjjkkkjjiiiihhhghhikkijjgghighhgggghihghhhhiiijkkjjjjjkmljhhjjjjjjjjljjjjiiiijjjijkmkjjjjjkmligijlkihjllkiiijkkjkjjikkkllkllkllllkllihkmkjjkkjjjjkkkkkkllllllllkklkkijjkkkkmmkkmmmmlmlllmklmmmlmnnnnmmmmnpmlmmmmmlmmnljlllmmmlmklllllklmmlllmllkkkkkklkijkkkjkkkllkklkljkkjklkijjijkjjkllklkklljkkkllkkkkklkkljjiiiiehijkjjkllkkjjkkjkkkklllllmlkkllllmlnkkllmnonmnlklkjjhjkkkkijkmmlkkkjkjjjjjhjkkjlkkkllknmnlkkmmmmmkllkjkmlkikmlklmjllilkjhjopnmlmkhilonkijlkkjkjkjkjhkklnmllmlikllmfghhjihhggeeeeeceffhdfffhjjhkjhfgghgggihgghhghggccddegfdacgfffihhhjgfhhgijhihgiihiikkiihjiiihiiijkiijjllijigjijlljiijkkiijjkjjijjjihjhgjkjjjihhgiigghhfijiihhijkjhjkjjkijjjikkjkjjjijkkiiifhhhggghgggghfiihhiihgiigjhiiiiikjjjkllmkjjjijjkjjjkkjjjkljgijjhjmlkkikkjikjhhjijkjgijkkknlkiikiggjjjjjkkkkkkklkjllklllkjikkkkkkkkklkkllkkmmllmllkjklljkkkkkkkklmmmmmllkkmmmmnommmnnmllmommnmmmmmmlkkjlnnnnopommlmllkkklkjkkjjlljlkkkkkjkjkkjjkkllkklklljjljikkjikklkklkkjjjighjihhjkjjjkkjjkkkllllkkjjjjkkjlkjijijjjklmkkkhkllllllmlkkljjlklmnmnnmmllkmljkmnkkkkkklkkjjljhhjifhjgjmkkkmmlmlkklkkiknnmkhikjjhikkilmlmkkmljikkmpnmmlmijiikmihijihijiiiijffkljkmkjijkjjjjihghhhfffeee]]bdefgfhhhhihiihfffdhhfghgfhghggfgedghgffgffijgfhhghggkiihiiiligghiijlkhgYeiffhhjihijjiijkiijjjijlnkjijighhijiiiiiiijhiijiijjiighhijiiihhiiijhhjiijikkkkjjkkkjjkkjjjhjklljjkihhjighiihhhhgihihhiijhhihgiijjjklkjlljkijjjjiijiiijkiiijlkhijjiillkjijkjhjhijjijklijjjkkkijkjkjjjjiiiiijlkklnmllkklmlkklkjkkkkkllllkklllkmllmllllkkkkkjkllklklmmmmmnmmmmnmlmnommmlnllllmmmmnlkllllkjjllmmmnppomnllmllkkkkkkjjllljklllllkklkjkjjkkkkkkjjijkkkklkjlllkkkklkjjjiigghhiihjihiiijklllkmkjjjjklkjjkkllllkliklkllkkkllkllmmlkjijjkllllmnmklmlllklkljklmkjkjjjhkkijjihjjjnmkkhjklmlkijjjijjjkkiijiiiikjjlmllmllljjijlojlmllghllklijjkkghhhiihijjjkjkjikjkmlillhhfdgjgeffgfefecffcdfghhhjjhgfghfefghighihihhhgffgfffefhgfiiihihiihihihhhhighihhhijjhighhijjjnkghhijiijhfikkihjjjkjhjiiiikjiiiijjjhiiihijjjiigghihhfffhihkiiiiiijllllkjiikmlijigihiklihiljhijhhihgghhhhihihhhiljiihhiijijkmljkkkkjjjjijjijjkjjhiijjjllkiijkjjhijjkkkjkkkkjijjjjjjjikkjjjkjihiiikjjlklknnlmlklkjkkklkkkkkkkllllllllllllmmllklllmmkllllmmllmlmmmmnnmmlklnmmmmkllmmmmmmmmlllmllkllmmmmmmlnnlmklllmlllkklkljkkkkkkllkklkkjjkkllkjkkjkkjkllkkkkkklkklkkjikkijiijghjkjjhiiegkjjkkklllkjkljkkjjklklkjijiiklkjklljjlmkkkkllkjkklmmnmlmmllmmllkkkkllkjhijkkkjklkkkjllkkklkjjhiljjjjllihhkkjihifjkhkkkjmmjjihlkljjijkjkkhikkkjllkjijjjjkklklklkljikklllklghggeeegfdffehifeggeffgfffikbaghghgfefgiieikkjiggfhgghjhhhiijighjjifdfggjkjjhgjjihiihiikjkkkkkiiiiiiihijhikjijjmmkihghkjjjjllkjifdfgiihhfjjhhhhhihgghigghijiijjiegjkijkjijkmljiiijkjjlihghhjiefgfdiigijfhhihiijkiijiihhjkiilnllkjjllmkjjjkjjkkjijjkjimljijkljikjijlljjhjkkihjjihjjiklkiijjijjjijjjkkjjklllljjkjjiijjiiklkkkjjkkkklklllllkllllklklllmnnnnnmllmljkmmlllmmnmlkmmmlmonnllmnnmlllklmlmmmlllllllmmlkmlklkkkkkklllllmllmlmmlklllllkklkjjkmlllkllnkklllkkkkkkjijjjjjjjkmmlkjkjkllmllllmnlkkmlljjkklijkkjjkkklmjikljhjnlmllmnmkljkllmmlklmnllllkjjkjiklklmkkkijlmmmllkklmkikkgikjjkklmjlkjkkkkkkkkklkkjjjihhhiigijjihhjkkijljhhfiijkjjmkkjlljeijjjkkklljk`dfeeefhhfgfghkecgia]digfhhhgeggggghggggfaghihgihhhgghhhiijjihjihggghghhiijgdfiigfghghhhgiijjiijijjhhglliijjghikkjhhfikjkjjknlijhijijjihhjiiihhhihhhiihghijijjjjiiijiiiiiihkkiihhiiihijhghiigefgfefhgiifihhijjjkjjjjjjiijihikkklkjkkkkjihhhhiikiijijkllkklkkkjkjikkkihghiighmkghjkjkjiijjjjjkjjjjkkkjkkklmlkkkjkjjjjjjkkllkkkjjlkllllllllkllkkllkklonnllllljkllmmmmmmmoomklmmmlmnmnmlllmmllllmllmllklllllmnonmomllkkllkmljlmmnlklkkkmmmlllllkllllkklklkklnnljlllmlkjjkkkkkkkklkiijiiijkjkllllkkkkjllkjijkkjjjlnmkkjkjkkklmlkkllmmmmmnlmllkkklkkkknmlllklkklllmkkmnmlklnlmlkjiklmlkjjhjihklmmlmnmllllkkjkklmkonjkhghjijhhklkghjkkihjigd`dgkjiklmkhhlkhjijjjjkjkjkbgecefddedeeabdeddedfjjggghggfegggefghifcbfgfeiiijghhhhgjiihgghhhgghiiiihiihihhhghiiihihfijihgfiikkghkjiijhijhihiighfhkkjiijiihikijkiiihhgffhhgijjihiiiighjkkjjijjiihjkkkjhhfghiihgghjkhhgfghgiihhigfhihfffghjkkjijkjjkikjjjjjiiihhikkjiijjiijihgijjlkkkjkjjjjjijkkjijjjjhiikjgefijkjkkkkkkkklllkjjjjkjkllklkkkjjkkjlmjklllnmkllllklmllllllmmlmmlkmmlllklllkkllmlkmnnnonmnmmmnnmmmllmnmmmmnmllmlmlklllnlklmmlmlmmnmllkkllkknlkkjkjjijlkklklkkklkllkllklmolkllljkkkjhijklllkkjljhjihgjlkkkkkllmkkkljkkkkjjkkijlmmmlkkkjlmllllmklmkllllllmmjklmllmllllnllmmlllllmnllljikmljjjkklllihhjkihjfbikmmlllkklkkllklmmmmlklkjllllkkkjkljjnmjhhjggjikjjklhhjjhiiillkijihijkfedcddb_][`baafhfegghiihjkjjhffhhgggfhigfghihhigikjhfhhfjhfihghhfgghhgihggeghgegjlkjhhiijihhhfehijhgijijjiiihggfhklifijkhhijhikkjijkihffhhhihiijlljijjkkjjjkjjjjjjihijjijihhgihjihjhhijhiihiihgiiiighggghiigghiihhjjiklkjjjjjikjiihiiijiijkiiiijiiiijjjiijhiihhjiijijjkmlihjjiijhhjjijlkjkkjjklkkkkjjkikmkkkkkjjklkjkkkjkkklmlkllkkkljllkkllnllllllljllmlllllllmmmmmnonmmlmmkklllljkmmlklllkkkllmlllllmmllllkmnnmmmnlkllllkjklkkjkkkjjjjkjkkklmkllmkjklmlkjkmljkkjkjjkklllkmmlkkllkkllkikkklmmkkllikkkmjikllllkklkkklklmlmlmmlklllmmllmlkklllmlkllllllmkkllklllmklolilmlllllllklkefjkjhhjiklmlnllmljlnlkjjmmlmllmmmlmkkkjmlkkkjlmjhhhjjiijihiihijkjjijjijkmlkmllmgdefeecdcdffdefggffikijjiigfhihhdgiijjkijjiijjjghjfgijhffiiijiihhiihgijigfghigfimlkijiifeghhihiijiiijjjihhijiigfjjggijiiiijjiikhhhghgfhhghiiijjiiihijkihjiihhijjhgiiihikjihiiiiihighhhgggghhghiijjhhhihfijihikihhijihjkjjjjjkkkjkjjijiiihhhifhihhjiiiijkkihhhghiijjjjijiiijkjjjilkkjkklkkjklkljjkkkkkijllkjklkjkliiiijkkjjllmkklllkklmllllmonlllkkmllmnllllmlkllmnmmmmlklllklllmkkllllkllkjklllllkkmkklllllkmnmmllmlklllkjikkjjkkkjjklllkkklmmkllllkkklkkhkklkjjjjlkikmlklmlllllmjjmmljkllmllllkkjkklmjikkklkkkjklljmjgjkllnmjkmlkklmmljkllkkkkllllklljlnmmmkkmnmomnllklkllllkkkiikkkklnjklnnnmmmmnmmkkhhmmnkjlmllkllkkjlkkjkkjjkjiiiijijjijkkjjllkjjikmopmkmkikfddfgcbgigjhgfgjhffijhjihhfeffhfgiihhihhhhghhiifghghhjjhhihijiihigghihiiihhhhhhhhhihiihhiijkjjjijiijihiihihiiiijjjjkljhhhjjggiifghhhhhiighijhijjjijjljjjjijjkjiiiiihhiijihijihghhihijihhgghhghiihjihhiiijiikjiiihjijkihijjiiiiiijkjjjiijjhhijiiijjkkjjkjkkjjjhijjjiijjkiijjjihjjkjkkjjkkkjijlkjjjjklkjjklmjkkjiikjiijjjjikkjjkllkkkkklmlllmmmmmnmklonllmmnnnmnnmnmmmmllllmmllllllmlkkklmlllkkkjjijkkkkkkkkllkllllkkkmmkjklmliijkjjjmmlkkllkkkkkkkjllnnmlkllkkmmlkllkjjklljkjkkjjkmoljjlkklklkklmlllmjjjhjiijjjklkkkjklkillmmmllmlkkjkkkjijkjkjjlnklklllnnnlkjmnnmmlmmlkkklklklmmlmjkkmomklmmllkkllmlkkmllklkkllmkjilllllkjijjhjegikjgghjjgehklmkjlkjgklmjjgikkhfeebdddghfdhgghfikjhjihhihiigeihhghihffghiihgghifgfddhhffffgggfgghgffihhiihiihhhhefhhgghhiiiijjjkiijjihghhiiijjkllnmmmkhigggfhihefihijhjjiijjijkkjklkljjjjjhhiijihjihhjiihgjjhhhihhijjiiihhgghigghhhihiiijhhhiiijhhjkkiijiiighiiiiijiijjkjiiijijjkkkjkkjjkjijijjijjiikjkiikjiihjjjjijjkjkkkkkkkjijkkjjkkjlmklkkihijjjklkjjkkjkkkllmlkkmnlmlnnmmmmmmlmmklmmmmnmoolmllmlkiklonllklklnmmmmmllllllkjlklllkkllklllkkkmlikklkkkklnmlkkkjkkklkklllklkkjkkklllmmmmpnlmmmlklkkmlklmkkjkjjklmonlklkkjjkkjkkkkkkkkjjkjjjjkkjijkkjlkjlllmmmkklllklmmjjijijjjkmkllllmmmnmmmmnmnnlmlmlkjklllkmlllkkknomlmlmlkkllmmklllklmljjlmmmljkmmmnomlljfkiijkiiheegeehikmlkkjgjkjljjlmklhcbdeedcegffjiggfbhhhiihjijkihghhihihhihihkjgghfhihggfhhffhiiffghhhggfghihhhjljiihghiijkiiihgfhiihhhiihgfhihiiiijjjnljijjjiihgghhkkhihhiiggljjlllkjkkkkjjighiiigikjjjiiiiiiiijiijiigijihhhihdcgjiffhfehiikjiiiiiiiighijikjjjiiiihhiiihhjijgijjjjjkjjjhikjlkkkkkkkjkkkkkkjjjkjighiikkhhjkjklkjjkkkjjjkkjkjkkjkjjjjhhkkiikjjjkjjijjkkjkkkllmmlmmmnlllljkmmmnnmllmonmmmmlmmlmlmmmmkjlllkllkkmmlmnmklkkmlkkllkllkklmllljjkljkkijkllkjjnljkkkllklkkkllmlllmmlllmlmmkkkklllmmmlkklllljijjklnllkijkklkjjklmjjllkjkkklklkkijjijjkkkklmkkllmlllmmlkjllllmkkjiklkkkkkllklmnmmmmmlmkllmlkmlnnlklmnljkgdgehikkjkmnnllmklljklmkllkilmkmkkkjkimnjhiiiiijjihhkllklnmkkllmlklkjkjgggfegfffeefggfedigfijjigjiiihijhhhhhhijhjihgeghlihhfghhghiiiiijigdhihiiiighiihhhjihhgjjighgggggggghhhggighiihijjjkkjhiijiihhhggikigiiiihikjiklihkkjjjlkiijljiihiiihhggfghjhkjiiijhhjiihiiiffgjkhiihhiiikijkjhijjjikjkljjkjlliiiijjjjijjkiilkklkjjkliijiijijjhijiijjjkkkjkmkjiijkjlkijjjkkjjjjijjjjkjlljjjijjjjiijjijjijkjjjjjjkjlllklllllllmlmllllklmnmnnnmmnmmmmmmlmnmllmlllkklmlkjkjklklnllkkkkkjkkkjklkkjjjjklklllkkkjkkkjjiilkkjjklmllmmmmmmllmlmmlmoklllkkmnmlkkkljjljjjjijkkkljlklnlklkkmmmnkjkklklkkkkjjjkljjlklklllmllklnnoommlkkkjlkjjjfhjmljklllllmnnnnmmmmnmmmmlloomljjjlmkjkgdhiijijikljiklnnlkjjlkkmmkgkmomkmnjkjlkjiihijklkkjjnkkjjmlihjjjjjjkkjkhgefggefgfghihhfgjihhfiiijghihhjjhiiijijijiijjihiihgfghgfhiihijkjhfhihiihhghhhiiihjghhghgfhhghhggfgfghghggghiijjlkjjkkkihhihhhfhhiihjkihjihihhiigijiijljhhkkijjkljihfhhgdfhjjffhhijjlkiiijkjihijiiiiijkhijjijjiijiijjjkkjkkkjjjijjkijkjlkjiihikiijjkjhiiiiiijiijjhhkkjkkjjkkjhjijkkjjkjjjkjjjkkkjjjlkkjjkjjjjjkjkkkjkkjjkkjjkkjkkkkklkjkkkllmlmmmmnmmnonmooonmmnnlmlmmlllmllkklllmlmmklllkkmmlkkkjjjknlkkljijjkjjmmklklmkkjhijkklkklkjklmlnmmmommklmlllllmlkjlmlnmkjklkkkjjjhjihhjjjkkklnommmmlmlnlkkjllkjjjjijjklkkllkjilkllkkjlnoopomllklklkkjkkikklklllmllmmmnnnnmnmmmnljkmlkkjjlmmnlkjjkkjkiijmpqommnnlklmlllmmmmmnonlmmihhljhhhhhhhijijjkkjjinpmlmlhfiikjjkggcgihhhghjgbdjhimkjighihfghgefiggggfiikkjjjkijjfeghhihijiikhhiihhheghghgihgehiikhhhhhehihifhihhhhihhhhhhijiiijihjhikiijihhhgihihijihighihhghijjijjiihijjjjjjjjjkiiiiikjiikjiggikkmnkkjhijjhgghiiihjkgihiihijjjgghiijjikkjjkjikljijikjkkmljjljijijjiikiikjjkllljjihijjlljjihijjiijkjkljijkjjjjjjjkkjijlkkjjjjkkjjjkkjjiijjkkkkjkklmmllllllnnmmkjllnmmmmmmnnonnnmmmmmnmlllmlllllkklmlkllkljkllklljjlkkllkjjjjjkkhiklkkllnmllkkkkkjjkjkmlkmllmllnlmkjmmmlmmlmmmlllmnmlkmmkjjjghjjjkkkkkkkjlllllnmlkkjlnmnlkjkkkkklikjkkkmllnlmmkmllmlkmmmmmmnmmlmmlklkkljkklmmmmmmmlmnmmllmmjkmoonkjlmmnlkmmkjkhjjjmnnqomlnomkklkklllklnlkjijkljefjghligiihijkjinmkllmmlmlkijhkjlmfhffgiihhjihhgihhhhiiihhhhihfeehhgc^fjjjkkjigfhihgjgeghjkjjiiihhhhggjkgfgijgfhkkljgjkkhiihgghjifhiiiiihiljiijhiiiiijjjjjjjijlhhihhhiihghjhhhhiiiijjjjiijiikkjihkkjhgghkkjijijijjkjijjjhhiiiihghjklihhiiiiijllihhhghijjijiijjjijjhhjjkiiiiifhkjijiklklmlkjiikjiiihjijjjkkhjjjikiiijkllkkjjjjjjkjjkkijkjjjjjijjjijjjkjijkjjjklllkmlllllmllkmnmkkllllmnnmmmlklmmmnmmmmmmmmnmlllkkllkkkklmkjjhkkljklkkllkkjihhkkkkkihjkklkkmlkkkkklklljijkkklklmlllllmlllmlmkjkllkklklkklllkllkkkkkjkllkjklkjjkjjkmkjjjkkjjlmjklklmljjijkkmlllkmlllllllllkmnnmllmllmlkklklkkklmlmmlnonnmnmllmnmmmmomlllnonlkllkkkiijkkkjklkklnnlklkpmkllkkklmljmmjjkjgjnkbgkjjiikmnlkmkjmpnjjjlkkjkm_cefhijhghhhgdggijihijihhiihfeeghgeejkikkkkklkiighiighhiijljijjjjikikjijijjjiljihhggkjfddghghjghhhhghhhgihhhiikjjjijiiihihfgiihhhhhhjhgihhiiijikjijjhkkgfjkjiifhiijjjjfhhhhjjggjliiijiigghggighhghhhihiihghighijihhiijkkjijkkjjiihihikiijihgikijjjjkkkjkiiiiiiiiijjjjjjihjkjkkihghjhhhjjijllklkkjjiiijkjjkjjjiijjjjjkjklkijjlmlmnmmmmmllklmlklmnlmnmmmmmmmmmmlllmnmmmmlnmmlkllllkjlllmmlkjjkklmlllmlkklllkkllkjkkllllmllllkkkmlllkkikljjjjjllkkjkmllklllkjijklklljklklkjjkjkjkiijkkkkklmknmlmmmmnnkjkjjjkkkjlljimkjjjlkjjkllmlkjlnlklklllkkmmnlmmmmkkkkkgjlnnnmnnomklmmnmmopokmlmllmpmlllllkkjlmkkkknllnmmlikjjmlkllllkkklmnmlmlnmkjjgjjjkjhjjnonmllmmkkkklihhiiecfgiihghggggfgghhiihhihgihihgdghihgijilkjjkjkijhhiijjjhhikiggijjhghiiigghiihkjighggihfdfhijjhhihhhhggijhhhhiijiijiijhfhihggjighhhghgegiffhiilijiijhggiigkljjihjiiiiijhhiiiklijkkiiigijhffiiiggdfihiighjhghihhhhiihijkkijkkjjhiiigihjlkihiiijjhiiijiihghiiiihiijijjjkkihijiiihiigfghiggghkjjjjjjijgijiijjjijkjjjkjiiiikkjhijlmmmlllkklmmkjkmlllkkkllnllmmnmmnmmljklmnmlkkmljkklmkjkklmlklkhkkmnmkllkllmnmmkmnnlkllllmlllkjlkkkkkklljkjjjkkjjjjjijmklljlkkkjiiijjkhhklmkjkmllkjjjkkjkkjllklklllmnpnkllljkllkillkkkmkkjikkkklnnllllnollllllkkjjkklkklllllllllmmlmnmmllkmnlkllokjmnlkjkmnlllmmmmmlnlkllmlkmnmmliilkkihlljkkllmlkjhklkkmkjkkkjkkjhlnmllkjiikkhgedhcddggdihghgfeeghhijjjjiijhhiiigghhgikihiijidgjjihihhihjhihijjihghiihijjihgggjkihikjiihikihhiihihhhggjjiillkkihjijihihjjiijiihiigehhggigdfggdffgjiighjjggiiegjijijlkijjiiiiijijjjjkjiiihfhhfeghfeghhhgihfhhgfgjljhhiiijkljikjkljijjkijkmjijjjjkkjijjijjjihiighiijiijijhihgggjjjjiihhghighiihjjjjjjjjjiijkkihiijjjijkjihgiijjiijklkllkklkllkkkkkllkjlkllmllmlmlklklkjikmmlllklllllkkjkljkljklkjkklnmllkklllllmllmnmllmllllllkjklkjklkjkjjjiiihjjklkjjkkjkjkjjjjihijkjijllmkjjkllkikjjiijjjkjjkjkklllnpmmlkmnlkjijkkiimllmkjjkllmlkllklkkklkjkklkjjkklmmnmkklkkijklmllkklmllllmnlllmomijkllkllllllmmlnnllmmlnmjlkiilhhhhhhijjjikiiigihiijiiihjmlkijmjlmjiacjjjigfelhhdcdffegegfdgiggilnjijkljkjkihggigfghhhgeghiikkimmihhhiiiiiijijiihhhlliiiiikjihiiiiiihhggadhhfhhfgghijllkjkjiiikjhfehhijjjjiihgghffiihiiklghjjjiiihiighhfceehjkjkiijiihehhhhjjjihkjijihhijihijhhhggggghhhhhhjkhghhihhiiiijjkkiiiiiiijiiijjijjijkjijkijkkkiijjjjhhhggghhhgghjjhjjjiiihgghhigikkkjijjjijkkiijjkjiiiiiihijiiijkkjjklkkllklkkkjijkkkjkjlmllkkklllkklljjllkkkkllmmlljklkjjkmmmkkkjklmlllmmmlklmmmmmmmmlmmllmmmljlllklmnlkjiiihhiiigfijklkklkkmnnnllllllmlkmmjjklllkjlkjkkjkjijkkjkmllmlommmmmlkkkkjkjhhjklnmkljjkkjjklkklklmkklmmlmllmnnopnllnkkjjjkkkmljlmnmllmmnmlkmkkkllklliikljkmmlllmnmmmllkjkijkjljjjkkjijjjkkkkkkmlllklllmmmnmijkjkkillklkhfhllkdceffhhggefjefhgihhhijikkghjjjiighigigijjihjhgijgdfggiihhgggggjgfhjhijiihikieggijkifhhhghhhhhhihhhhhihfehihgihihgghhhihikkjiggggghhhigjjhihiiiihhijhhhhhgghjhhjiiiijihijjjkkijjkjikhihfgidcfffgghgggghhihhjkihhhiihhgiiiijijigjkihhiiiiihighijijjjjiijljiijiiihhghhhhhijjiiiijggijghfghihiijjkkjjiiiiiiiihjiihggghhhhggijjkijjkkklllmmlljklkkkjkklnmkjjkkkllljkklkjkjhklkkkllklkkkjkmklkklkkmommmoomlkmljikllkllmlllkllkllllkklmkjjjijjijkkghkkkjkkkjjkkkllkklllllklmlkkllmlkkkjljgjjjklllmmllmmnnnmmmmnmlkkmljkklllkkkkjjjklklllmnonllmnnllllklnonmmllllllllmmnmjlmllllmmnonmnmlkklknoiikmllmmlmnlmkklkklihhiigihjlklhjljjkklmlmlhhlnnomjmmlmjjhadjhikifciggikfeea_ccbeefggghifggegfgfhhhjjhkgjkjjjhghihggiihgffgghgijhffhgffihfgiiiihiigfegfghhihhhgghgjhhgggehjhjihhfehggggikihhghidbfkheffigebhiihhikiijihgjhffgghfehjjkihikiijjiihijkjkjjkkiijjjhihhhfggggeefffeeffgggghhhghiiiiijjikihiijjiijihhiiiihgfgihjijkkjiiigihighhgfhjhhhhihfggeeefhhggiiiiihihiijkjiiigghhiijhgghhhhikiiiihjjjklllllmmlmkklmkiijlkkkkkjjjkjijlkhfgihigfjljjkkkjjkkkiijkjiklkkmmlkkllmnmmlkjlmllllmmkkkkkimnmlkjkjkihiijihijigfhjjkljjkkijkklkiijihhhjkjmlknmjjklmmlkkklmlmkkllkkllmliklkklkkjkjkjhhjjgkmkhkijokklkjlomlmmlmmjigjknmklmllllkkkkllmmmlllkkklmnnonnmlmlklllmmnmlnmkklnljjkljkkjjklkhkiijgllhhkkkjijeihhjkmnmlmjjjkffd[hihejjfghiiilega`\aegihefcbedeggggghfhhijjhliiihiiggijihijkhghghfghhgffhhgffhhkhjkiiihhfbdfegheggghhhiihfgfffcghijjigdehgffghhhfiihgecgggffgif`bghghhiigiiiiggggfgghhhhikjgiijhikiihgiijijjjjihiigccghfgfghjhffgggeegghihgihihhgikjiiijkjhijjhghhihhfgiigbdghijhjkjhijjjlkihfiiiiihghghhfddbgggheeghgikijhhhijhihjiihhijhiihhhhghikhfhhhjjjkllklkmmllkkjkkjiikkjijlkjkjjikkihbdfgifejkjjkjjjkmmkijjjiijklkmmmllmlkkmlklklliijlmojkhehjkmkkjjjhjigijigghhjiiijijkieijjikjmlddihhddfgggjkkkijlmlkkkjjmnmmlkmmnklkkmjlkjkmlkijikjjijihjjjijkllkikijllmmmmkmmmljkklljkmmkllkkjjijkjkkklliklmnmnommlmmmkjlnkkmlmmklkjmlljkgkkjjlmkihhgijkigfiihiijhjhghkkkjlljlllljdbihjjjhhhigijk \ No newline at end of file diff --git a/python/contrib/YOLOv5driver_assistant_system/src/model.yaml b/python/contrib/YOLOv5driver_assistant_system/src/model.yaml new file mode 100644 index 000000000..0a0d747f4 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/src/model.yaml @@ -0,0 +1,12 @@ +# parameters +img_size: [640, 640] # height, width +class_num: 80 # number of classes +conf_thres: 0.4 # object confidence threshold, conf>0.1 for nms_op +iou_thres: 0.5 # IOU threshold for NMS + +# anchors +anchors: + - [10,13, 16,30, 33,23] # P3/8 + - [30,61, 62,45, 59,119] # P4/16 + - [116,90, 156,198, 373,326] # P5/32 +stride: [8, 16, 32] diff --git a/python/contrib/YOLOv5driver_assistant_system/src/trafficline.py b/python/contrib/YOLOv5driver_assistant_system/src/trafficline.py new file mode 100644 index 000000000..e5d2f2784 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/src/trafficline.py @@ -0,0 +1,156 @@ +#-*- coding: utf-8 -*- + +# 通过OpenCV实现车道线检测 + +# Key Point: +# 1.打开视频文件 +# 2.循环遍历每一帧 +# 3.canny边缘检测,检测line +# 4.去除多余图像直线 +# 5.霍夫变换 +# 6.叠加变换与原始图像 +# 7.车道检测 +import math +import numpy as np +import cv2 as cv +import matplotlib.pyplot as plt + + + +# Tools +# Canny检测 +def do_canny(frame): + # 将每一帧转化为灰度图像,去除多余信息 + gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) + # 高斯滤波器,去除噪声,平滑图像 + blur = cv.GaussianBlur(gray, (5, 5), 0) + # 边缘检测 + # minVal = 50 + # maxVal = 150 + canny = cv.Canny(blur, 50, 80) + + return canny + + +# 图像分割,去除多余线条信息 +def do_segment(frame): + # 获取图像高度(注意CV的坐标系,正方形左上为0点,→和↓分别为x,y正方向) + height = frame.shape[0] + width = frame.shape[1] + + # 创建一个三角形的区域,指定三点 + polygons = np.array([[(0, 0), (0, 600), (600,600), (600,0),]]) + + # 创建一个mask,形状与frame相同,全为0值 + mask = np.zeros_like(frame) + + # 对该mask进行填充,做一个掩码 + # 三角形区域为1 + # 其余为0 + cv.fillPoly(mask, polygons, 255) + + # 将frame与mask做与,抠取需要区域 + segment = cv.bitwise_and(frame, mask) + + return segment + + +# 车道左右边界标定 +def calculate_lines(frame, lines): + # 建立两个空列表,用于存储左右车道边界坐标 + xielv = [] + trafficline = [] + emptyxielv = [] + # print(lines) + # 循环遍历lines + if lines is None: + return + for line in lines: + # 将线段信息从二维转化能到一维 + x1, y1, x2, y2 = line.reshape(4) + if abs(y2-y1) > 50: #过滤短线 + # 将一个线性多项式拟合到x和y坐标上,并返回一个描述斜率和y轴截距的系数向量 + parameters = np.polyfit((x1, x2), (y1, y2), 1) + slope = parameters[0] #斜率 + y_intercept = parameters[1] #截距 + + # 通过斜率大小,可以判断是左边界还是右边界 + # 很明显左边界slope<0(注意cv坐标系不同的) + # 右边界slope>0 + if abs(slope) > 0.2: + xielv.append(slope) + trafficline.append(x1) + if xielv == emptyxielv: + print("no traffic line") + return (-1,-1) + if len(xielv)>1: + return (xielv[0]+xielv[1])/2,(trafficline[0]+trafficline[1])/2 + else: + print("there is one line") + return (xielv[0],trafficline[0]) + + +def calculate_coordinate(frame,parameters): + # 获取斜率与截距 + slope, y_intercept = parameters + + # 设置初始y坐标为自顶向下(框架底部)的高度 + # 将最终的y坐标设置为框架底部上方150 + y1 = frame.shape[0] + y2 = int(y1-150) + # 根据y1=kx1+b,y2=kx2+b求取x1,x2 + x1 = int((y1-y_intercept)/slope) + x2 = int((y2-y_intercept)/slope) + return np.array([x1,y1,x2,y2]) + + +# 可视化车道线 +def visualize_lines(frame, lines): + lines_visualize = np.zeros_like(frame) + # 检测lines是否为空 + if lines is not None: + for x1, y1, x2, y2 in lines: + # 画线 + cv.line(frame, (x1, y1), (x2, y2), (0, 0, 255), 5) + + return frame + + +def findline(frame,perspective_transform): + # # 视频读取 + # cap = cv.VideoCapture(VEDIO_LOCATION) + # 当视频还是打开的时候,循环遍历每一帧 + # while (cap.isOpened()): + #透视变换 + lines = [] + center = [] + frame = cv.warpPerspective(frame, perspective_transform, (600, 600)) + # 边缘检测 + canny = do_canny(frame) + # cv.imshow("canny", canny) + # 图像分割,去除多余直线,只保留需要的直线 + # 原理见博文 + segment = do_segment(canny) + # cv.imshow("segment", segment) + # 原始空间中,利用Canny梯度,找到很多练成线的点 + # 利用霍夫变换,将这些点变换到霍夫空间中,转换为直线 + hough = [] + emptyhough = [] + hough = cv.HoughLinesP(segment, 2, np.pi/180, 100,\ + minLineLength=100, maxLineGap=50) + # cv.imshow("hough", hough) + # 将从hough检测到的多条线平均成一条线表示车道的左边界, + # 一条线表示车道的右边界 + # print(hough) + # print(hough) + if hough is None: + print("no hough") + return (-1,-1) + lines,center = calculate_lines(frame, hough) + # print("xielv",lines[0][0]+lines[1][0]) + # print(lines) + # 可视化 + # lines_visualize = visualize_lines(frame, lines) #显示 + # cv.imshow("lines",segment) + # cv.waitKey(0) + return lines,center diff --git a/python/contrib/YOLOv5driver_assistant_system/src/yolov5.py b/python/contrib/YOLOv5driver_assistant_system/src/yolov5.py new file mode 100644 index 000000000..e62853762 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/src/yolov5.py @@ -0,0 +1,120 @@ +"""yolov5""" +import numpy as np +import sys +import torch +import cv2 +sys.path.append("../../../common") +sys.path.append("../") +from acllite_imageproc import AclLiteImageProc +from presenteragent import presenter_datatype +FocalLength = 3.04 +LABEL = 1 +SCORE = 2 +TOP_LEFT_X = 3 +TOP_LEFT_Y = 4 +BOTTOM_RIGHT_X = 5 +BOTTOM_RIGHT_Y = 6 +labels = ["person", + "bicycle", "car", "motorbike", "aeroplane", + "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", "sofa", "potted plant", "bed", "dining table", + "toilet", "TV monitor", "laptop", "mouse", "remote", "keyboard", "cell phone", + "microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", + "scissors", "teddy bear", "hair drier", "toothbrush"] + +class Yolov5(object): + """yolov3""" + def __init__(self, acl_resource, model_width, model_height): + self._acl_resource = acl_resource + self._model_width = model_width + self._model_height = model_height + self._dvpp = AclLiteImageProc(acl_resource) + + def __del__(self): + if self._dvpp: + del self._dvpp + print("Release yolov3 resource finished") + + def pre_process(self, image): + """Use dvpp to scale the image to the required size of the model""" + # resized_image = self._dvpp.crop_and_paste(image, image.width, + # image.height, self._model_width, self._model_height) + resized_image = self._dvpp.resize(image,self._model_width,self._model_height) + if resized_image is None: + print("Resize image failed") + return None + #Output the scaled image and image information as inference input data + return resized_image + + def post_process(self, infer_output, origin_img,perspective_transform,WARPED_SIZE,pixels_per_meter): + """Analyze inference output data""" + detection_result_list,dis = self._analyze_inference_output(infer_output, + origin_img, + perspective_transform, + WARPED_SIZE, + pixels_per_meter) + #Convert yuv image to jpeg image + jpeg_image = self._dvpp.jpege(origin_img) + return jpeg_image, detection_result_list,dis + + def _analyze_inference_output(self, predn, origin_img,perspective_transform,WARPED_SIZE,pixels_per_meter): + # box = self.xyxy2xywh(predn[:,:4]) #xyxy + box = predn[:,:4] + #图像缩放比例 + scalex = origin_img.width / self._model_width + scaley = origin_img.height / self._model_height + # if scalex > scaley: + # scaley = scalex + #存放最终结果 + detection_result_list = [] + distance = [-1] + for p, b in zip(predn.tolist(), box.tolist()): + label = str(int(p[5])) + score = round(p[4],5) + # print("box",b) + detection_item = presenter_datatype.ObjectDetectionResult() + detection_item.confidence = score + detection_item.box.lt.x = int(b[0] * scalex) + detection_item.box.lt.y = int(b[1] * scaley) + detection_item.box.rb.x = int(b[2] * scalex) + detection_item.box.rb.y = int(b[3] * scaley) + if detection_item.box.lt.x<0:detection_item.box.lt.x = 0 + if detection_item.box.lt.y<0:detection_item.box.lt.y = 0 + if detection_item.box.rb.x<0:detection_item.box.rb.x = 0 + if detection_item.box.rb.y<0:detection_item.box.rb.y = 0 + print([detection_item.box.lt.x,detection_item.box.lt.y,detection_item.box.rb.x,detection_item.box.rb.y]) + #Organize the confidence into a string + #测算距离 + # print("b",b) + resized_box = [b[0]*1280/640,b[1]*720/640,b[2]*1280/960,b[3]*720/640] + distance = self.calculate_position(resized_box, perspective_transform, + WARPED_SIZE, pixels_per_meter) + # print("distance = ",distance) + #构建文本 + detection_item.result_text = "cup" + " " + str(round(detection_item.confidence*100,2)) + "%" + " dis=" + str(round(distance[0],2)) + detection_result_list.append(detection_item) + return detection_result_list,round(distance[0],2) + + def xyxy2xywh(self,x): + # Convert nx4 boxes from [x1, y1, x2, y2] to [x, y, w, h] where xy1=top-left, xy2=bottom-right + y = x.clone() if isinstance(x, torch.Tensor) else np.copy(x) + y[:, 0] = (x[:, 0] + x[:, 2]) / 2 # x center + y[:, 1] = (x[:, 1] + x[:, 3]) / 2 # y center + y[:, 2] = x[:, 2] - x[:, 0] # width + y[:, 3] = x[:, 3] - x[:, 1] # height + return y + def calculate_position(self,bbox, transform_matrix, warped_size, pix_per_meter): + if len(bbox) == 0: + print('Nothing') + else: + # print("bbox",bbox) + point = np.array((bbox[0] / 2 + bbox[2] / 2, bbox[3])).reshape(1, 1, -1) + pos = cv2.perspectiveTransform(point, transform_matrix).reshape(-1, 1) + return (warped_size[1] - pos[1]) / pix_per_meter[1] + 36 \ No newline at end of file diff --git a/python/contrib/YOLOv5driver_assistant_system/src/yolov5detect.py b/python/contrib/YOLOv5driver_assistant_system/src/yolov5detect.py new file mode 100644 index 000000000..cbc0eee04 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/src/yolov5detect.py @@ -0,0 +1,128 @@ +import sys +sys.path.append("../../../common") +sys.path.append("../") +project_path = sys.path[0] + "/../" +sys.path.append(project_path) +import datetime +import numpy as np +from cameracapture import CameraCapture +import presenteragent.presenter_channel as presenter_channel +from acllite_model import AclLiteModel +from acllite_resource import AclLiteResource +from yolov5 import Yolov5 + +import torch +from tqdm import tqdm +import numpy as np +from pathlib import Path +from common.util.dataset import coco80_to_coco91_class, correct_bbox, save_coco_json +try: + from utils.general import non_max_suppression, scale_coords # tag > 2.0 +except: + from utils.utils import non_max_suppression, scale_coords # tag = 2.0 + +import yaml +import json +import argparse +from ais_bench.infer.interface import InferSession, MemorySummary +from ais_bench.infer.summary import summary + +from utils.datasets import create_dataloader +from common.util.dataset import BatchDataLoader, evaluate +from common.util.model import forward_nms_op, forward_nms_script +import cv2 +MODEL_PATH = project_path + "/model/best.om" +MODEL_WIDTH = 640 +MODEL_HEIGHT = 640 +OBJECT_DETEC_CONF= project_path + "/scripts/object_detection.conf" +CAMERA_FRAME_WIDTH = 1280 +CAMERA_FRAME_HEIGHT = 720 +cfg_file = project_path + "/src/model.yaml" + +def main(): + """main""" + #Initialize acl + acl_resource = AclLiteResource() + acl_resource.init() + #Create a detection network instance, currently using the vgg_ssd network. + # When the detection network is replaced, instantiate a new network here + detect = Yolov5(acl_resource, MODEL_WIDTH, MODEL_HEIGHT) + #Load offline model + model = AclLiteModel(MODEL_PATH) + #Connect to the presenter server according to the configuration, + # and end the execution of the application if the connection fails + chan = presenter_channel.open_channel(OBJECT_DETEC_CONF) + if chan is None: + print("Open presenter channel failed") + return + #Open the CARAMER0 camera on the development board + cap = CameraCapture(1) + + with open(cfg_file) as f: + cfg = yaml.load(f, Loader=yaml.FullLoader) + while True: + pred_results = [] + #Read a picture from the camera + image = cap.read() + + if image is None: + print("Get memory from camera failed") + break + #The detection network processes images into model input data + model_input = detect.pre_process(image) + if model_input is None: + print("Pre process image failed") + break + #Send data to offline model inference + result = model.execute([model_input]) + # jpeg_image, detection_list = detect.post_process(result, image) + + padding = True + nb = 1 + if len(result) == 3: # number of output nodes is 3, each shape is (bs, na, no, ny, nx) + out = [] + for i in range(len(result)): + anchors = torch.tensor(cfg['anchors']) + stride = torch.tensor(cfg['stride']) + cls_num = cfg['class_num'] + if padding == True: + result[i] = result[i][:nb] + correct_bbox(result[i], anchors[i], stride[i], cls_num, out) + box_out = torch.cat(out, 1) + else: # only use the first output node, which shape is (bs, -1, no) + if padding == True: + result[0] = result[0][:nb] + box_out = torch.tensor(result[0]) + # non_max_suppression + boxout = nms(box_out, conf_thres=cfg["conf_thres"], iou_thres=cfg["iou_thres"]) + for idx, pred in enumerate(boxout): + #pred的维度决定了目标个数 + # save_coco_json(pred, pred_results, image_id, coco80_to_coco91_class()) + jpeg_image, detection_list = detect.post_process(pred, image) + print(jpeg_image.size) + if len(pred_results)!=0: + break + # 发送图片数据 + chan.send_detection_data(CAMERA_FRAME_WIDTH, CAMERA_FRAME_HEIGHT, + jpeg_image, detection_list) + +def nms(box_out, conf_thres=0.4, iou_thres=0.5): + try: + boxout = non_max_suppression(box_out, conf_thres=conf_thres, iou_thres=iou_thres, multi_label=True) + except: + boxout = non_max_suppression(box_out, conf_thres=conf_thres, iou_thres=iou_thres) + + return boxout + +if __name__ == '__main__': + main() + + + +# atc --model=yolov5s.onnx +# --framework=5 +# --output=yolov5 +# --soc_version=Ascend310 +# --insert_op_conf=aipp_nv12.cfg +# --input_shape="images:1,3,640,640" +# --output_type=FP16 --input_format=NCHW \ No newline at end of file diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/__init__.py b/python/contrib/YOLOv5driver_assistant_system/utils/__init__.py new file mode 100644 index 000000000..4658ed647 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/utils/__init__.py @@ -0,0 +1,37 @@ +# YOLOv5 🚀 by Ultralytics, GPL-3.0 license +""" +utils/initialization +""" + + +def notebook_init(verbose=True): + # Check system software and hardware + print('Checking setup...') + + import os + import shutil + + from utils.general import check_requirements, emojis, is_colab + from utils.torch_utils import select_device # imports + + check_requirements(('psutil', 'IPython')) + import psutil + from IPython import display # to display images and clear console output + + if is_colab(): + shutil.rmtree('/content/sample_data', ignore_errors=True) # remove colab /sample_data directory + + if verbose: + # System info + # gb = 1 / 1000 ** 3 # bytes to GB + gib = 1 / 1024 ** 3 # bytes to GiB + ram = psutil.virtual_memory().total + total, used, free = shutil.disk_usage("/") + display.clear_output() + s = f'({os.cpu_count()} CPUs, {ram * gib:.1f} GB RAM, {(total - free) * gib:.1f}/{total * gib:.1f} GB disk)' + else: + s = '' + + select_device(newline=False) + print(emojis(f'Setup complete ✅ {s}')) + return display diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/activations.py b/python/contrib/YOLOv5driver_assistant_system/utils/activations.py new file mode 100644 index 000000000..a4ff789cf --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/utils/activations.py @@ -0,0 +1,101 @@ +# YOLOv5 🚀 by Ultralytics, GPL-3.0 license +""" +Activation functions +""" + +import torch +import torch.nn as nn +import torch.nn.functional as F + + +# SiLU https://arxiv.org/pdf/1606.08415.pdf ---------------------------------------------------------------------------- +class SiLU(nn.Module): # export-friendly version of nn.SiLU() + @staticmethod + def forward(x): + return x * torch.sigmoid(x) + + +class Hardswish(nn.Module): # export-friendly version of nn.Hardswish() + @staticmethod + def forward(x): + # return x * F.hardsigmoid(x) # for TorchScript and CoreML + return x * F.hardtanh(x + 3, 0.0, 6.0) / 6.0 # for TorchScript, CoreML and ONNX + + +# Mish https://github.com/digantamisra98/Mish -------------------------------------------------------------------------- +class Mish(nn.Module): + @staticmethod + def forward(x): + return x * F.softplus(x).tanh() + + +class MemoryEfficientMish(nn.Module): + class F(torch.autograd.Function): + @staticmethod + def forward(ctx, x): + ctx.save_for_backward(x) + return x.mul(torch.tanh(F.softplus(x))) # x * tanh(ln(1 + exp(x))) + + @staticmethod + def backward(ctx, grad_output): + x = ctx.saved_tensors[0] + sx = torch.sigmoid(x) + fx = F.softplus(x).tanh() + return grad_output * (fx + x * sx * (1 - fx * fx)) + + def forward(self, x): + return self.F.apply(x) + + +# FReLU https://arxiv.org/abs/2007.11824 ------------------------------------------------------------------------------- +class FReLU(nn.Module): + def __init__(self, c1, k=3): # ch_in, kernel + super().__init__() + self.conv = nn.Conv2d(c1, c1, k, 1, 1, groups=c1, bias=False) + self.bn = nn.BatchNorm2d(c1) + + def forward(self, x): + return torch.max(x, self.bn(self.conv(x))) + + +# ACON https://arxiv.org/pdf/2009.04759.pdf ---------------------------------------------------------------------------- +class AconC(nn.Module): + r""" ACON activation (activate or not). + AconC: (p1*x-p2*x) * sigmoid(beta*(p1*x-p2*x)) + p2*x, beta is a learnable parameter + according to "Activate or Not: Learning Customized Activation" . + """ + + def __init__(self, c1): + super().__init__() + self.p1 = nn.Parameter(torch.randn(1, c1, 1, 1)) + self.p2 = nn.Parameter(torch.randn(1, c1, 1, 1)) + self.beta = nn.Parameter(torch.ones(1, c1, 1, 1)) + + def forward(self, x): + dpx = (self.p1 - self.p2) * x + return dpx * torch.sigmoid(self.beta * dpx) + self.p2 * x + + +class MetaAconC(nn.Module): + r""" ACON activation (activate or not). + MetaAconC: (p1*x-p2*x) * sigmoid(beta*(p1*x-p2*x)) + p2*x, beta is generated by a small network + according to "Activate or Not: Learning Customized Activation" . + """ + + def __init__(self, c1, k=1, s=1, r=16): # ch_in, kernel, stride, r + super().__init__() + c2 = max(r, c1 // r) + self.p1 = nn.Parameter(torch.randn(1, c1, 1, 1)) + self.p2 = nn.Parameter(torch.randn(1, c1, 1, 1)) + self.fc1 = nn.Conv2d(c1, c2, k, s, bias=True) + self.fc2 = nn.Conv2d(c2, c1, k, s, bias=True) + # self.bn1 = nn.BatchNorm2d(c2) + # self.bn2 = nn.BatchNorm2d(c1) + + def forward(self, x): + y = x.mean(dim=2, keepdims=True).mean(dim=3, keepdims=True) + # batch-size 1 bug/instabilities https://github.com/ultralytics/yolov5/issues/2891 + # beta = torch.sigmoid(self.bn2(self.fc2(self.bn1(self.fc1(y))))) # bug/unstable + beta = torch.sigmoid(self.fc2(self.fc1(y))) # bug patch BN layers removed + dpx = (self.p1 - self.p2) * x + return dpx * torch.sigmoid(beta * dpx) + self.p2 * x diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/augmentations.py b/python/contrib/YOLOv5driver_assistant_system/utils/augmentations.py new file mode 100644 index 000000000..0311b97b6 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/utils/augmentations.py @@ -0,0 +1,277 @@ +# YOLOv5 🚀 by Ultralytics, GPL-3.0 license +""" +Image augmentation functions +""" + +import math +import random + +import cv2 +import numpy as np + +from utils.general import LOGGER, check_version, colorstr, resample_segments, segment2box +from utils.metrics import bbox_ioa + + +class Albumentations: + # YOLOv5 Albumentations class (optional, only used if package is installed) + def __init__(self): + self.transform = None + try: + import albumentations as A + check_version(A.__version__, '1.0.3', hard=True) # version requirement + + self.transform = A.Compose([ + A.Blur(p=0.01), + A.MedianBlur(p=0.01), + A.ToGray(p=0.01), + A.CLAHE(p=0.01), + A.RandomBrightnessContrast(p=0.0), + A.RandomGamma(p=0.0), + A.ImageCompression(quality_lower=75, p=0.0)], + bbox_params=A.BboxParams(format='yolo', label_fields=['class_labels'])) + + LOGGER.info(colorstr('albumentations: ') + ', '.join(f'{x}' for x in self.transform.transforms if x.p)) + except ImportError: # package not installed, skip + pass + except Exception as e: + LOGGER.info(colorstr('albumentations: ') + f'{e}') + + def __call__(self, im, labels, p=1.0): + if self.transform and random.random() < p: + new = self.transform(image=im, bboxes=labels[:, 1:], class_labels=labels[:, 0]) # transformed + im, labels = new['image'], np.array([[c, *b] for c, b in zip(new['class_labels'], new['bboxes'])]) + return im, labels + + +def augment_hsv(im, hgain=0.5, sgain=0.5, vgain=0.5): + # HSV color-space augmentation + if hgain or sgain or vgain: + r = np.random.uniform(-1, 1, 3) * [hgain, sgain, vgain] + 1 # random gains + hue, sat, val = cv2.split(cv2.cvtColor(im, cv2.COLOR_BGR2HSV)) + dtype = im.dtype # uint8 + + x = np.arange(0, 256, dtype=r.dtype) + lut_hue = ((x * r[0]) % 180).astype(dtype) + lut_sat = np.clip(x * r[1], 0, 255).astype(dtype) + lut_val = np.clip(x * r[2], 0, 255).astype(dtype) + + im_hsv = cv2.merge((cv2.LUT(hue, lut_hue), cv2.LUT(sat, lut_sat), cv2.LUT(val, lut_val))) + cv2.cvtColor(im_hsv, cv2.COLOR_HSV2BGR, dst=im) # no return needed + + +def hist_equalize(im, clahe=True, bgr=False): + # Equalize histogram on BGR image 'im' with im.shape(n,m,3) and range 0-255 + yuv = cv2.cvtColor(im, cv2.COLOR_BGR2YUV if bgr else cv2.COLOR_RGB2YUV) + if clahe: + c = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)) + yuv[:, :, 0] = c.apply(yuv[:, :, 0]) + else: + yuv[:, :, 0] = cv2.equalizeHist(yuv[:, :, 0]) # equalize Y channel histogram + return cv2.cvtColor(yuv, cv2.COLOR_YUV2BGR if bgr else cv2.COLOR_YUV2RGB) # convert YUV image to RGB + + +def replicate(im, labels): + # Replicate labels + h, w = im.shape[:2] + boxes = labels[:, 1:].astype(int) + x1, y1, x2, y2 = boxes.T + s = ((x2 - x1) + (y2 - y1)) / 2 # side length (pixels) + for i in s.argsort()[:round(s.size * 0.5)]: # smallest indices + x1b, y1b, x2b, y2b = boxes[i] + bh, bw = y2b - y1b, x2b - x1b + yc, xc = int(random.uniform(0, h - bh)), int(random.uniform(0, w - bw)) # offset x, y + x1a, y1a, x2a, y2a = [xc, yc, xc + bw, yc + bh] + im[y1a:y2a, x1a:x2a] = im[y1b:y2b, x1b:x2b] # im4[ymin:ymax, xmin:xmax] + labels = np.append(labels, [[labels[i, 0], x1a, y1a, x2a, y2a]], axis=0) + + return im, labels + + +def letterbox(im, new_shape=(640, 640), color=(114, 114, 114), auto=True, scaleFill=False, scaleup=True, stride=32): + # Resize and pad image while meeting stride-multiple constraints + shape = im.shape[:2] # current shape [height, width] + if isinstance(new_shape, int): + new_shape = (new_shape, new_shape) + + # Scale ratio (new / old) + r = min(new_shape[0] / shape[0], new_shape[1] / shape[1]) + if not scaleup: # only scale down, do not scale up (for better val mAP) + r = min(r, 1.0) + + # Compute padding + ratio = r, r # width, height ratios + new_unpad = int(round(shape[1] * r)), int(round(shape[0] * r)) + dw, dh = new_shape[1] - new_unpad[0], new_shape[0] - new_unpad[1] # wh padding + if auto: # minimum rectangle + dw, dh = np.mod(dw, stride), np.mod(dh, stride) # wh padding + elif scaleFill: # stretch + dw, dh = 0.0, 0.0 + new_unpad = (new_shape[1], new_shape[0]) + ratio = new_shape[1] / shape[1], new_shape[0] / shape[0] # width, height ratios + + dw /= 2 # divide padding into 2 sides + dh /= 2 + + if shape[::-1] != new_unpad: # resize + im = cv2.resize(im, new_unpad, interpolation=cv2.INTER_LINEAR) + top, bottom = int(round(dh - 0.1)), int(round(dh + 0.1)) + left, right = int(round(dw - 0.1)), int(round(dw + 0.1)) + im = cv2.copyMakeBorder(im, top, bottom, left, right, cv2.BORDER_CONSTANT, value=color) # add border + return im, ratio, (dw, dh) + + +def random_perspective(im, targets=(), segments=(), degrees=10, translate=.1, scale=.1, shear=10, perspective=0.0, + border=(0, 0)): + # torchvision.transforms.RandomAffine(degrees=(-10, 10), translate=(0.1, 0.1), scale=(0.9, 1.1), shear=(-10, 10)) + # targets = [cls, xyxy] + + height = im.shape[0] + border[0] * 2 # shape(h,w,c) + width = im.shape[1] + border[1] * 2 + + # Center + C = np.eye(3) + C[0, 2] = -im.shape[1] / 2 # x translation (pixels) + C[1, 2] = -im.shape[0] / 2 # y translation (pixels) + + # Perspective + P = np.eye(3) + P[2, 0] = random.uniform(-perspective, perspective) # x perspective (about y) + P[2, 1] = random.uniform(-perspective, perspective) # y perspective (about x) + + # Rotation and Scale + R = np.eye(3) + a = random.uniform(-degrees, degrees) + # a += random.choice([-180, -90, 0, 90]) # add 90deg rotations to small rotations + s = random.uniform(1 - scale, 1 + scale) + # s = 2 ** random.uniform(-scale, scale) + R[:2] = cv2.getRotationMatrix2D(angle=a, center=(0, 0), scale=s) + + # Shear + S = np.eye(3) + S[0, 1] = math.tan(random.uniform(-shear, shear) * math.pi / 180) # x shear (deg) + S[1, 0] = math.tan(random.uniform(-shear, shear) * math.pi / 180) # y shear (deg) + + # Translation + T = np.eye(3) + T[0, 2] = random.uniform(0.5 - translate, 0.5 + translate) * width # x translation (pixels) + T[1, 2] = random.uniform(0.5 - translate, 0.5 + translate) * height # y translation (pixels) + + # Combined rotation matrix + M = T @ S @ R @ P @ C # order of operations (right to left) is IMPORTANT + if (border[0] != 0) or (border[1] != 0) or (M != np.eye(3)).any(): # image changed + if perspective: + im = cv2.warpPerspective(im, M, dsize=(width, height), borderValue=(114, 114, 114)) + else: # affine + im = cv2.warpAffine(im, M[:2], dsize=(width, height), borderValue=(114, 114, 114)) + + # Visualize + # import matplotlib.pyplot as plt + # ax = plt.subplots(1, 2, figsize=(12, 6))[1].ravel() + # ax[0].imshow(im[:, :, ::-1]) # base + # ax[1].imshow(im2[:, :, ::-1]) # warped + + # Transform label coordinates + n = len(targets) + if n: + use_segments = any(x.any() for x in segments) + new = np.zeros((n, 4)) + if use_segments: # warp segments + segments = resample_segments(segments) # upsample + for i, segment in enumerate(segments): + xy = np.ones((len(segment), 3)) + xy[:, :2] = segment + xy = xy @ M.T # transform + xy = xy[:, :2] / xy[:, 2:3] if perspective else xy[:, :2] # perspective rescale or affine + + # clip + new[i] = segment2box(xy, width, height) + + else: # warp boxes + xy = np.ones((n * 4, 3)) + xy[:, :2] = targets[:, [1, 2, 3, 4, 1, 4, 3, 2]].reshape(n * 4, 2) # x1y1, x2y2, x1y2, x2y1 + xy = xy @ M.T # transform + xy = (xy[:, :2] / xy[:, 2:3] if perspective else xy[:, :2]).reshape(n, 8) # perspective rescale or affine + + # create new boxes + x = xy[:, [0, 2, 4, 6]] + y = xy[:, [1, 3, 5, 7]] + new = np.concatenate((x.min(1), y.min(1), x.max(1), y.max(1))).reshape(4, n).T + + # clip + new[:, [0, 2]] = new[:, [0, 2]].clip(0, width) + new[:, [1, 3]] = new[:, [1, 3]].clip(0, height) + + # filter candidates + i = box_candidates(box1=targets[:, 1:5].T * s, box2=new.T, area_thr=0.01 if use_segments else 0.10) + targets = targets[i] + targets[:, 1:5] = new[i] + + return im, targets + + +def copy_paste(im, labels, segments, p=0.5): + # Implement Copy-Paste augmentation https://arxiv.org/abs/2012.07177, labels as nx5 np.array(cls, xyxy) + n = len(segments) + if p and n: + h, w, c = im.shape # height, width, channels + im_new = np.zeros(im.shape, np.uint8) + for j in random.sample(range(n), k=round(p * n)): + l, s = labels[j], segments[j] + box = w - l[3], l[2], w - l[1], l[4] + ioa = bbox_ioa(box, labels[:, 1:5]) # intersection over area + if (ioa < 0.30).all(): # allow 30% obscuration of existing labels + labels = np.concatenate((labels, [[l[0], *box]]), 0) + segments.append(np.concatenate((w - s[:, 0:1], s[:, 1:2]), 1)) + cv2.drawContours(im_new, [segments[j].astype(np.int32)], -1, (255, 255, 255), cv2.FILLED) + + result = cv2.bitwise_and(src1=im, src2=im_new) + result = cv2.flip(result, 1) # augment segments (flip left-right) + i = result > 0 # pixels to replace + # i[:, :] = result.max(2).reshape(h, w, 1) # act over ch + im[i] = result[i] # cv2.imwrite('debug.jpg', im) # debug + + return im, labels, segments + + +def cutout(im, labels, p=0.5): + # Applies image cutout augmentation https://arxiv.org/abs/1708.04552 + if random.random() < p: + h, w = im.shape[:2] + scales = [0.5] * 1 + [0.25] * 2 + [0.125] * 4 + [0.0625] * 8 + [0.03125] * 16 # image size fraction + for s in scales: + mask_h = random.randint(1, int(h * s)) # create random masks + mask_w = random.randint(1, int(w * s)) + + # box + xmin = max(0, random.randint(0, w) - mask_w // 2) + ymin = max(0, random.randint(0, h) - mask_h // 2) + xmax = min(w, xmin + mask_w) + ymax = min(h, ymin + mask_h) + + # apply random color mask + im[ymin:ymax, xmin:xmax] = [random.randint(64, 191) for _ in range(3)] + + # return unobscured labels + if len(labels) and s > 0.03: + box = np.array([xmin, ymin, xmax, ymax], dtype=np.float32) + ioa = bbox_ioa(box, labels[:, 1:5]) # intersection over area + labels = labels[ioa < 0.60] # remove >60% obscured labels + + return labels + + +def mixup(im, labels, im2, labels2): + # Applies MixUp augmentation https://arxiv.org/pdf/1710.09412.pdf + r = np.random.beta(32.0, 32.0) # mixup ratio, alpha=beta=32.0 + im = (im * r + im2 * (1 - r)).astype(np.uint8) + labels = np.concatenate((labels, labels2), 0) + return im, labels + + +def box_candidates(box1, box2, wh_thr=2, ar_thr=100, area_thr=0.1, eps=1e-16): # box1(4,n), box2(4,n) + # Compute candidate boxes: box1 before augment, box2 after augment, wh_thr (pixels), aspect_ratio_thr, area_ratio + w1, h1 = box1[2] - box1[0], box1[3] - box1[1] + w2, h2 = box2[2] - box2[0], box2[3] - box2[1] + ar = np.maximum(w2 / (h2 + eps), h2 / (w2 + eps)) # aspect ratio + return (w2 > wh_thr) & (h2 > wh_thr) & (w2 * h2 / (w1 * h1 + eps) > area_thr) & (ar < ar_thr) # candidates diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/autoanchor.py b/python/contrib/YOLOv5driver_assistant_system/utils/autoanchor.py new file mode 100644 index 000000000..27d6fb68b --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/utils/autoanchor.py @@ -0,0 +1,165 @@ +# YOLOv5 🚀 by Ultralytics, GPL-3.0 license +""" +AutoAnchor utils +""" + +import random + +import numpy as np +import torch +import yaml +from tqdm import tqdm + +from utils.general import LOGGER, colorstr, emojis + +PREFIX = colorstr('AutoAnchor: ') + + +def check_anchor_order(m): + # Check anchor order against stride order for YOLOv5 Detect() module m, and correct if necessary + a = m.anchors.prod(-1).view(-1) # anchor area + da = a[-1] - a[0] # delta a + ds = m.stride[-1] - m.stride[0] # delta s + if da.sign() != ds.sign(): # same order + LOGGER.info(f'{PREFIX}Reversing anchor order') + m.anchors[:] = m.anchors.flip(0) + + +def check_anchors(dataset, model, thr=4.0, imgsz=640): + # Check anchor fit to data, recompute if necessary + m = model.module.model[-1] if hasattr(model, 'module') else model.model[-1] # Detect() + shapes = imgsz * dataset.shapes / dataset.shapes.max(1, keepdims=True) + scale = np.random.uniform(0.9, 1.1, size=(shapes.shape[0], 1)) # augment scale + wh = torch.tensor(np.concatenate([l[:, 3:5] * s for s, l in zip(shapes * scale, dataset.labels)])).float() # wh + + def metric(k): # compute metric + r = wh[:, None] / k[None] + x = torch.min(r, 1 / r).min(2)[0] # ratio metric + best = x.max(1)[0] # best_x + aat = (x > 1 / thr).float().sum(1).mean() # anchors above threshold + bpr = (best > 1 / thr).float().mean() # best possible recall + return bpr, aat + + anchors = m.anchors.clone() * m.stride.to(m.anchors.device).view(-1, 1, 1) # current anchors + bpr, aat = metric(anchors.cpu().view(-1, 2)) + s = f'\n{PREFIX}{aat:.2f} anchors/target, {bpr:.3f} Best Possible Recall (BPR). ' + if bpr > 0.98: # threshold to recompute + LOGGER.info(emojis(f'{s}Current anchors are a good fit to dataset ✅')) + else: + LOGGER.info(emojis(f'{s}Anchors are a poor fit to dataset ⚠️, attempting to improve...')) + na = m.anchors.numel() // 2 # number of anchors + try: + anchors = kmean_anchors(dataset, n=na, img_size=imgsz, thr=thr, gen=1000, verbose=False) + except Exception as e: + LOGGER.info(f'{PREFIX}ERROR: {e}') + new_bpr = metric(anchors)[0] + if new_bpr > bpr: # replace anchors + anchors = torch.tensor(anchors, device=m.anchors.device).type_as(m.anchors) + m.anchors[:] = anchors.clone().view_as(m.anchors) / m.stride.to(m.anchors.device).view(-1, 1, 1) # loss + check_anchor_order(m) + LOGGER.info(f'{PREFIX}New anchors saved to model. Update model *.yaml to use these anchors in the future.') + else: + LOGGER.info(f'{PREFIX}Original anchors better than new anchors. Proceeding with original anchors.') + + +def kmean_anchors(dataset='./data/coco128.yaml', n=9, img_size=640, thr=4.0, gen=1000, verbose=True): + """ Creates kmeans-evolved anchors from training dataset + + Arguments: + dataset: path to data.yaml, or a loaded dataset + n: number of anchors + img_size: image size used for training + thr: anchor-label wh ratio threshold hyperparameter hyp['anchor_t'] used for training, default=4.0 + gen: generations to evolve anchors using genetic algorithm + verbose: print all results + + Return: + k: kmeans evolved anchors + + Usage: + from utils.autoanchor import *; _ = kmean_anchors() + """ + from scipy.cluster.vq import kmeans + + npr = np.random + thr = 1 / thr + + def metric(k, wh): # compute metrics + r = wh[:, None] / k[None] + x = torch.min(r, 1 / r).min(2)[0] # ratio metric + # x = wh_iou(wh, torch.tensor(k)) # iou metric + return x, x.max(1)[0] # x, best_x + + def anchor_fitness(k): # mutation fitness + _, best = metric(torch.tensor(k, dtype=torch.float32), wh) + return (best * (best > thr).float()).mean() # fitness + + def print_results(k, verbose=True): + k = k[np.argsort(k.prod(1))] # sort small to large + x, best = metric(k, wh0) + bpr, aat = (best > thr).float().mean(), (x > thr).float().mean() * n # best possible recall, anch > thr + s = f'{PREFIX}thr={thr:.2f}: {bpr:.4f} best possible recall, {aat:.2f} anchors past thr\n' \ + f'{PREFIX}n={n}, img_size={img_size}, metric_all={x.mean():.3f}/{best.mean():.3f}-mean/best, ' \ + f'past_thr={x[x > thr].mean():.3f}-mean: ' + for i, x in enumerate(k): + s += '%i,%i, ' % (round(x[0]), round(x[1])) + if verbose: + LOGGER.info(s[:-2]) + return k + + if isinstance(dataset, str): # *.yaml file + with open(dataset, errors='ignore') as f: + data_dict = yaml.safe_load(f) # model dict + from utils.datasets import LoadImagesAndLabels + dataset = LoadImagesAndLabels(data_dict['train'], augment=True, rect=True) + + # Get label wh + shapes = img_size * dataset.shapes / dataset.shapes.max(1, keepdims=True) + wh0 = np.concatenate([l[:, 3:5] * s for s, l in zip(shapes, dataset.labels)]) # wh + + # Filter + i = (wh0 < 3.0).any(1).sum() + if i: + LOGGER.info(f'{PREFIX}WARNING: Extremely small objects found. {i} of {len(wh0)} labels are < 3 pixels in size.') + wh = wh0[(wh0 >= 2.0).any(1)] # filter > 2 pixels + # wh = wh * (npr.rand(wh.shape[0], 1) * 0.9 + 0.1) # multiply by random scale 0-1 + + # Kmeans calculation + LOGGER.info(f'{PREFIX}Running kmeans for {n} anchors on {len(wh)} points...') + s = wh.std(0) # sigmas for whitening + k = kmeans(wh / s, n, iter=30)[0] * s # points + if len(k) != n: # kmeans may return fewer points than requested if wh is insufficient or too similar + LOGGER.warning(f'{PREFIX}WARNING: scipy.cluster.vq.kmeans returned only {len(k)} of {n} requested points') + k = np.sort(npr.rand(n * 2)).reshape(n, 2) * img_size # random init + wh = torch.tensor(wh, dtype=torch.float32) # filtered + wh0 = torch.tensor(wh0, dtype=torch.float32) # unfiltered + k = print_results(k, verbose=False) + + # Plot + # k, d = [None] * 20, [None] * 20 + # for i in tqdm(range(1, 21)): + # k[i-1], d[i-1] = kmeans(wh / s, i) # points, mean distance + # fig, ax = plt.subplots(1, 2, figsize=(14, 7), tight_layout=True) + # ax = ax.ravel() + # ax[0].plot(np.arange(1, 21), np.array(d) ** 2, marker='.') + # fig, ax = plt.subplots(1, 2, figsize=(14, 7)) # plot wh + # ax[0].hist(wh[wh[:, 0]<100, 0],400) + # ax[1].hist(wh[wh[:, 1]<100, 1],400) + # fig.savefig('wh.png', dpi=200) + + # Evolve + f, sh, mp, s = anchor_fitness(k), k.shape, 0.9, 0.1 # fitness, generations, mutation prob, sigma + pbar = tqdm(range(gen), desc=f'{PREFIX}Evolving anchors with Genetic Algorithm:') # progress bar + for _ in pbar: + v = np.ones(sh) + while (v == 1).all(): # mutate until a change occurs (prevent duplicates) + v = ((npr.random(sh) < mp) * random.random() * npr.randn(*sh) * s + 1).clip(0.3, 3.0) + kg = (k.copy() * v).clip(min=2.0) + fg = anchor_fitness(kg) + if fg > f: + f, k = fg, kg.copy() + pbar.desc = f'{PREFIX}Evolving anchors with Genetic Algorithm: fitness = {f:.4f}' + if verbose: + print_results(k, verbose) + + return print_results(k) diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/autobatch.py b/python/contrib/YOLOv5driver_assistant_system/utils/autobatch.py new file mode 100644 index 000000000..cb94f041e --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/utils/autobatch.py @@ -0,0 +1,57 @@ +# YOLOv5 🚀 by Ultralytics, GPL-3.0 license +""" +Auto-batch utils +""" + +from copy import deepcopy + +import numpy as np +import torch +from torch.cuda import amp + +from utils.general import LOGGER, colorstr +from utils.torch_utils import profile + + +def check_train_batch_size(model, imgsz=640): + # Check YOLOv5 training batch size + with amp.autocast(): + return autobatch(deepcopy(model).train(), imgsz) # compute optimal batch size + + +def autobatch(model, imgsz=640, fraction=0.9, batch_size=16): + # Automatically estimate best batch size to use `fraction` of available CUDA memory + # Usage: + # import torch + # from utils.autobatch import autobatch + # model = torch.hub.load('ultralytics/yolov5', 'yolov5s', autoshape=False) + # print(autobatch(model)) + + prefix = colorstr('AutoBatch: ') + LOGGER.info(f'{prefix}Computing optimal batch size for --imgsz {imgsz}') + device = next(model.parameters()).device # get model device + if device.type == 'cpu': + LOGGER.info(f'{prefix}CUDA not detected, using default CPU batch-size {batch_size}') + return batch_size + + d = str(device).upper() # 'CUDA:0' + properties = torch.cuda.get_device_properties(device) # device properties + t = properties.total_memory / 1024 ** 3 # (GiB) + r = torch.cuda.memory_reserved(device) / 1024 ** 3 # (GiB) + a = torch.cuda.memory_allocated(device) / 1024 ** 3 # (GiB) + f = t - (r + a) # free inside reserved + LOGGER.info(f'{prefix}{d} ({properties.name}) {t:.2f}G total, {r:.2f}G reserved, {a:.2f}G allocated, {f:.2f}G free') + + batch_sizes = [1, 2, 4, 8, 16] + try: + img = [torch.zeros(b, 3, imgsz, imgsz) for b in batch_sizes] + y = profile(img, model, n=3, device=device) + except Exception as e: + LOGGER.warning(f'{prefix}{e}') + + y = [x[2] for x in y if x] # memory [2] + batch_sizes = batch_sizes[:len(y)] + p = np.polyfit(batch_sizes, y, deg=1) # first degree polynomial fit + b = int((f * fraction - p[1]) / p[0]) # y intercept (optimal batch size) + LOGGER.info(f'{prefix}Using batch-size {b} for {d} {t * fraction:.2f}G/{t:.2f}G ({fraction * 100:.0f}%)') + return b diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/aws/__init__.py b/python/contrib/YOLOv5driver_assistant_system/utils/aws/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/aws/mime.sh b/python/contrib/YOLOv5driver_assistant_system/utils/aws/mime.sh new file mode 100644 index 000000000..c319a83cf --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/utils/aws/mime.sh @@ -0,0 +1,26 @@ +# AWS EC2 instance startup 'MIME' script https://aws.amazon.com/premiumsupport/knowledge-center/execute-user-data-ec2/ +# This script will run on every instance restart, not only on first start +# --- DO NOT COPY ABOVE COMMENTS WHEN PASTING INTO USERDATA --- + +Content-Type: multipart/mixed; boundary="//" +MIME-Version: 1.0 + +--// +Content-Type: text/cloud-config; charset="us-ascii" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Content-Disposition: attachment; filename="cloud-config.txt" + +#cloud-config +cloud_final_modules: +- [scripts-user, always] + +--// +Content-Type: text/x-shellscript; charset="us-ascii" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Content-Disposition: attachment; filename="userdata.txt" + +#!/bin/bash +# --- paste contents of userdata.sh here --- +--// diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/aws/resume.py b/python/contrib/YOLOv5driver_assistant_system/utils/aws/resume.py new file mode 100644 index 000000000..b21731c97 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/utils/aws/resume.py @@ -0,0 +1,40 @@ +# Resume all interrupted trainings in yolov5/ dir including DDP trainings +# Usage: $ python utils/aws/resume.py + +import os +import sys +from pathlib import Path + +import torch +import yaml + +FILE = Path(__file__).resolve() +ROOT = FILE.parents[2] # YOLOv5 root directory +if str(ROOT) not in sys.path: + sys.path.append(str(ROOT)) # add ROOT to PATH + +port = 0 # --master_port +path = Path('').resolve() +for last in path.rglob('*/**/last.pt'): + ckpt = torch.load(last) + if ckpt['optimizer'] is None: + continue + + # Load opt.yaml + with open(last.parent.parent / 'opt.yaml', errors='ignore') as f: + opt = yaml.safe_load(f) + + # Get device count + d = opt['device'].split(',') # devices + nd = len(d) # number of devices + ddp = nd > 1 or (nd == 0 and torch.cuda.device_count() > 1) # distributed data parallel + + if ddp: # multi-GPU + port += 1 + cmd = f'python -m torch.distributed.run --nproc_per_node {nd} --master_port {port} train.py --resume {last}' + else: # single-GPU + cmd = f'python train.py --resume {last}' + + cmd += ' > /dev/null 2>&1 &' # redirect output to dev/null and run in daemon thread + print(cmd) + os.system(cmd) diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/aws/userdata.sh b/python/contrib/YOLOv5driver_assistant_system/utils/aws/userdata.sh new file mode 100644 index 000000000..5fc1332ac --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/utils/aws/userdata.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# AWS EC2 instance startup script https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html +# This script will run only once on first instance start (for a re-start script see mime.sh) +# /home/ubuntu (ubuntu) or /home/ec2-user (amazon-linux) is working dir +# Use >300 GB SSD + +cd home/ubuntu +if [ ! -d yolov5 ]; then + echo "Running first-time script." # install dependencies, download COCO, pull Docker + git clone https://github.com/ultralytics/yolov5 -b master && sudo chmod -R 777 yolov5 + cd yolov5 + bash data/scripts/get_coco.sh && echo "COCO done." & + sudo docker pull ultralytics/yolov5:latest && echo "Docker done." & + python -m pip install --upgrade pip && pip install -r requirements.txt && python detect.py && echo "Requirements done." & + wait && echo "All tasks done." # finish background tasks +else + echo "Running re-start script." # resume interrupted runs + i=0 + list=$(sudo docker ps -qa) # container list i.e. $'one\ntwo\nthree\nfour' + while IFS= read -r id; do + ((i++)) + echo "restarting container $i: $id" + sudo docker start $id + # sudo docker exec -it $id python train.py --resume # single-GPU + sudo docker exec -d $id python utils/aws/resume.py # multi-scenario + done <<<"$list" +fi diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/benchmarks.py b/python/contrib/YOLOv5driver_assistant_system/utils/benchmarks.py new file mode 100644 index 000000000..962df812a --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/utils/benchmarks.py @@ -0,0 +1,92 @@ +# YOLOv5 🚀 by Ultralytics, GPL-3.0 license +""" +Run YOLOv5 benchmarks on all supported export formats + +Format | `export.py --include` | Model +--- | --- | --- +PyTorch | - | yolov5s.pt +TorchScript | `torchscript` | yolov5s.torchscript +ONNX | `onnx` | yolov5s.onnx +OpenVINO | `openvino` | yolov5s_openvino_model/ +TensorRT | `engine` | yolov5s.engine +CoreML | `coreml` | yolov5s.mlmodel +TensorFlow SavedModel | `saved_model` | yolov5s_saved_model/ +TensorFlow GraphDef | `pb` | yolov5s.pb +TensorFlow Lite | `tflite` | yolov5s.tflite +TensorFlow Edge TPU | `edgetpu` | yolov5s_edgetpu.tflite +TensorFlow.js | `tfjs` | yolov5s_web_model/ + +Requirements: + $ pip install -r requirements.txt coremltools onnx onnx-simplifier onnxruntime openvino-dev tensorflow-cpu # CPU + $ pip install -r requirements.txt coremltools onnx onnx-simplifier onnxruntime-gpu openvino-dev tensorflow # GPU + +Usage: + $ python utils/benchmarks.py --weights yolov5s.pt --img 640 +""" + +import argparse +import sys +import time +from pathlib import Path + +import pandas as pd + +FILE = Path(__file__).resolve() +ROOT = FILE.parents[1] # YOLOv5 root directory +if str(ROOT) not in sys.path: + sys.path.append(str(ROOT)) # add ROOT to PATH +# ROOT = ROOT.relative_to(Path.cwd()) # relative + +import export +import val +from utils import notebook_init +from utils.general import LOGGER, print_args + + +def run(weights=ROOT / 'yolov5s.pt', # weights path + imgsz=640, # inference size (pixels) + batch_size=1, # batch size + data=ROOT / 'data/coco128.yaml', # dataset.yaml path + ): + y, t = [], time.time() + formats = export.export_formats() + for i, (name, f, suffix) in formats.iterrows(): # index, (name, file, suffix) + try: + w = weights if f == '-' else export.run(weights=weights, imgsz=[imgsz], include=[f], device='cpu')[-1] + assert suffix in str(w), 'export failed' + result = val.run(data, w, batch_size, imgsz=imgsz, plots=False, device='cpu', task='benchmark') + metrics = result[0] # metrics (mp, mr, map50, map, *losses(box, obj, cls)) + speeds = result[2] # times (preprocess, inference, postprocess) + y.append([name, metrics[3], speeds[1]]) # mAP, t_inference + except Exception as e: + LOGGER.warning(f'WARNING: Benchmark failure for {name}: {e}') + y.append([name, None, None]) # mAP, t_inference + + # Print results + LOGGER.info('\n') + parse_opt() + notebook_init() # print system info + py = pd.DataFrame(y, columns=['Format', 'mAP@0.5:0.95', 'Inference time (ms)']) + LOGGER.info(f'\nBenchmarks complete ({time.time() - t:.2f}s)') + LOGGER.info(str(py)) + return py + + +def parse_opt(): + parser = argparse.ArgumentParser() + parser.add_argument('--weights', type=str, default=ROOT / 'yolov5s.pt', help='weights path') + parser.add_argument('--imgsz', '--img', '--img-size', type=int, default=640, help='inference size (pixels)') + parser.add_argument('--batch-size', type=int, default=1, help='batch size') + parser.add_argument('--data', type=str, default=ROOT / 'data/coco128.yaml', help='dataset.yaml path') + opt = parser.parse_args() + print_args(FILE.stem, opt) + return opt + + +def main(opt): + run(**vars(opt)) + + +if __name__ == "__main__": + opt = parse_opt() + main(opt) diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/callbacks.py b/python/contrib/YOLOv5driver_assistant_system/utils/callbacks.py new file mode 100644 index 000000000..c51c268f2 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/utils/callbacks.py @@ -0,0 +1,78 @@ +# YOLOv5 🚀 by Ultralytics, GPL-3.0 license +""" +Callback utils +""" + + +class Callbacks: + """" + Handles all registered callbacks for YOLOv5 Hooks + """ + + def __init__(self): + # Define the available callbacks + self._callbacks = { + 'on_pretrain_routine_start': [], + 'on_pretrain_routine_end': [], + + 'on_train_start': [], + 'on_train_epoch_start': [], + 'on_train_batch_start': [], + 'optimizer_step': [], + 'on_before_zero_grad': [], + 'on_train_batch_end': [], + 'on_train_epoch_end': [], + + 'on_val_start': [], + 'on_val_batch_start': [], + 'on_val_image_end': [], + 'on_val_batch_end': [], + 'on_val_end': [], + + 'on_fit_epoch_end': [], # fit = train + val + 'on_model_save': [], + 'on_train_end': [], + 'on_params_update': [], + 'teardown': [], + } + self.stop_training = False # set True to interrupt training + + def register_action(self, hook, name='', callback=None): + """ + Register a new action to a callback hook + + Args: + hook The callback hook name to register the action to + name The name of the action for later reference + callback The callback to fire + """ + assert hook in self._callbacks, f"hook '{hook}' not found in callbacks {self._callbacks}" + assert callable(callback), f"callback '{callback}' is not callable" + self._callbacks[hook].append({'name': name, 'callback': callback}) + + def get_registered_actions(self, hook=None): + """" + Returns all the registered actions by callback hook + + Args: + hook The name of the hook to check, defaults to all + """ + if hook: + return self._callbacks[hook] + else: + return self._callbacks + + def run(self, hook, *args, **kwargs): + """ + Loop through the registered actions and fire all callbacks + + Args: + hook The name of the hook to check, defaults to all + args Arguments to receive from YOLOv5 + kwargs Keyword Arguments to receive from YOLOv5 + """ + + assert hook in self._callbacks, f"hook '{hook}' not found in callbacks {self._callbacks}" + + for logger in self._callbacks[hook]: + logger['callback'](*args, **kwargs) diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/datasets.py b/python/contrib/YOLOv5driver_assistant_system/utils/datasets.py new file mode 100644 index 000000000..e132e04f6 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/utils/datasets.py @@ -0,0 +1,1037 @@ +# YOLOv5 🚀 by Ultralytics, GPL-3.0 license +""" +Dataloaders and dataset utils +""" + +import glob +import hashlib +import json +import math +import os +import random +import shutil +import time +from itertools import repeat +from multiprocessing.pool import Pool, ThreadPool +from pathlib import Path +from threading import Thread +from zipfile import ZipFile + +import cv2 +import numpy as np +import torch +import torch.nn.functional as F +import yaml +from PIL import ExifTags, Image, ImageOps +from torch.utils.data import DataLoader, Dataset, dataloader, distributed +from tqdm import tqdm + +from utils.augmentations import Albumentations, augment_hsv, copy_paste, letterbox, mixup, random_perspective +from utils.general import (DATASETS_DIR, LOGGER, NUM_THREADS, check_dataset, check_requirements, check_yaml, clean_str, + segments2boxes, xyn2xy, xywh2xyxy, xywhn2xyxy, xyxy2xywhn) +from utils.torch_utils import torch_distributed_zero_first + +# Parameters +HELP_URL = 'https://github.com/ultralytics/yolov5/wiki/Train-Custom-Data' +IMG_FORMATS = ['bmp', 'dng', 'jpeg', 'jpg', 'mpo', 'png', 'tif', 'tiff', 'webp'] # include image suffixes +VID_FORMATS = ['asf', 'avi', 'gif', 'm4v', 'mkv', 'mov', 'mp4', 'mpeg', 'mpg', 'wmv'] # include video suffixes + +# Get orientation exif tag +for orientation in ExifTags.TAGS.keys(): + if ExifTags.TAGS[orientation] == 'Orientation': + break + + +def get_hash(paths): + # Returns a single hash value of a list of paths (files or dirs) + size = sum(os.path.getsize(p) for p in paths if os.path.exists(p)) # sizes + h = hashlib.md5(str(size).encode()) # hash sizes + h.update(''.join(paths).encode()) # hash paths + return h.hexdigest() # return hash + + +def exif_size(img): + # Returns exif-corrected PIL size + s = img.size # (width, height) + try: + rotation = dict(img._getexif().items())[orientation] + if rotation == 6: # rotation 270 + s = (s[1], s[0]) + elif rotation == 8: # rotation 90 + s = (s[1], s[0]) + except Exception: + pass + + return s + + +def exif_transpose(image): + """ + Transpose a PIL image accordingly if it has an EXIF Orientation tag. + Inplace version of https://github.com/python-pillow/Pillow/blob/master/src/PIL/ImageOps.py exif_transpose() + + :param image: The image to transpose. + :return: An image. + """ + exif = image.getexif() + orientation = exif.get(0x0112, 1) # default 1 + if orientation > 1: + method = {2: Image.FLIP_LEFT_RIGHT, + 3: Image.ROTATE_180, + 4: Image.FLIP_TOP_BOTTOM, + 5: Image.TRANSPOSE, + 6: Image.ROTATE_270, + 7: Image.TRANSVERSE, + 8: Image.ROTATE_90, + }.get(orientation) + if method is not None: + image = image.transpose(method) + del exif[0x0112] + image.info["exif"] = exif.tobytes() + return image + + +def create_dataloader(path, imgsz, batch_size, stride, single_cls=False, hyp=None, augment=False, cache=False, pad=0.0, + rect=False, rank=-1, workers=8, image_weights=False, quad=False, prefix='', shuffle=False): + if rect and shuffle: + LOGGER.warning('WARNING: --rect is incompatible with DataLoader shuffle, setting shuffle=False') + shuffle = False + with torch_distributed_zero_first(rank): # init dataset *.cache only once if DDP + dataset = LoadImagesAndLabels(path, imgsz, batch_size, + augment=augment, # augmentation + hyp=hyp, # hyperparameters + rect=rect, # rectangular batches + cache_images=cache, + single_cls=single_cls, + stride=int(stride), + pad=pad, + image_weights=image_weights, + prefix=prefix) + + batch_size = min(batch_size, len(dataset)) + nd = torch.cuda.device_count() # number of CUDA devices + nw = min([os.cpu_count() // max(nd, 1), batch_size if batch_size > 1 else 0, workers]) # number of workers + sampler = None if rank == -1 else distributed.DistributedSampler(dataset, shuffle=shuffle) + loader = DataLoader if image_weights else InfiniteDataLoader # only DataLoader allows for attribute updates + return loader(dataset, + batch_size=batch_size, + shuffle=shuffle and sampler is None, + num_workers=nw, + sampler=sampler, + pin_memory=True, + collate_fn=LoadImagesAndLabels.collate_fn4 if quad else LoadImagesAndLabels.collate_fn), dataset + + +class InfiniteDataLoader(dataloader.DataLoader): + """ Dataloader that reuses workers + + Uses same syntax as vanilla DataLoader + """ + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + object.__setattr__(self, 'batch_sampler', _RepeatSampler(self.batch_sampler)) + self.iterator = super().__iter__() + + def __len__(self): + return len(self.batch_sampler.sampler) + + def __iter__(self): + for i in range(len(self)): + yield next(self.iterator) + + +class _RepeatSampler: + """ Sampler that repeats forever + + Args: + sampler (Sampler) + """ + + def __init__(self, sampler): + self.sampler = sampler + + def __iter__(self): + while True: + yield from iter(self.sampler) + + +class LoadImages: + # YOLOv5 image/video dataloader, i.e. `python detect.py --source image.jpg/vid.mp4` + def __init__(self, path, img_size=640, stride=32, auto=True): + p = str(Path(path).resolve()) # os-agnostic absolute path + if '*' in p: + files = sorted(glob.glob(p, recursive=True)) # glob + elif os.path.isdir(p): + files = sorted(glob.glob(os.path.join(p, '*.*'))) # dir + elif os.path.isfile(p): + files = [p] # files + else: + raise Exception(f'ERROR: {p} does not exist') + + images = [x for x in files if x.split('.')[-1].lower() in IMG_FORMATS] + videos = [x for x in files if x.split('.')[-1].lower() in VID_FORMATS] + ni, nv = len(images), len(videos) + + self.img_size = img_size + self.stride = stride + self.files = images + videos + self.nf = ni + nv # number of files + self.video_flag = [False] * ni + [True] * nv + self.mode = 'image' + self.auto = auto + if any(videos): + self.new_video(videos[0]) # new video + else: + self.cap = None + assert self.nf > 0, f'No images or videos found in {p}. ' \ + f'Supported formats are:\nimages: {IMG_FORMATS}\nvideos: {VID_FORMATS}' + + def __iter__(self): + self.count = 0 + return self + + def __next__(self): + if self.count == self.nf: + raise StopIteration + path = self.files[self.count] + + if self.video_flag[self.count]: + # Read video + self.mode = 'video' + ret_val, img0 = self.cap.read() + while not ret_val: + self.count += 1 + self.cap.release() + if self.count == self.nf: # last video + raise StopIteration + else: + path = self.files[self.count] + self.new_video(path) + ret_val, img0 = self.cap.read() + + self.frame += 1 + s = f'video {self.count + 1}/{self.nf} ({self.frame}/{self.frames}) {path}: ' + + else: + # Read image + self.count += 1 + img0 = cv2.imread(path) # BGR + assert img0 is not None, f'Image Not Found {path}' + s = f'image {self.count}/{self.nf} {path}: ' + + # Padded resize + img = letterbox(img0, self.img_size, stride=self.stride, auto=self.auto)[0] + + # Convert + img = img.transpose((2, 0, 1))[::-1] # HWC to CHW, BGR to RGB + img = np.ascontiguousarray(img) + + return path, img, img0, self.cap, s + + def new_video(self, path): + self.frame = 0 + self.cap = cv2.VideoCapture(path) + self.frames = int(self.cap.get(cv2.CAP_PROP_FRAME_COUNT)) + + def __len__(self): + return self.nf # number of files + + +class LoadWebcam: # for inference + # YOLOv5 local webcam dataloader, i.e. `python detect.py --source 0` + def __init__(self, pipe='0', img_size=640, stride=32): + self.img_size = img_size + self.stride = stride + self.pipe = eval(pipe) if pipe.isnumeric() else pipe + self.cap = cv2.VideoCapture(self.pipe) # video capture object + self.cap.set(cv2.CAP_PROP_BUFFERSIZE, 3) # set buffer size + + def __iter__(self): + self.count = -1 + return self + + def __next__(self): + self.count += 1 + if cv2.waitKey(1) == ord('q'): # q to quit + self.cap.release() + cv2.destroyAllWindows() + raise StopIteration + + # Read frame + ret_val, img0 = self.cap.read() + img0 = cv2.flip(img0, 1) # flip left-right + + # Print + assert ret_val, f'Camera Error {self.pipe}' + img_path = 'webcam.jpg' + s = f'webcam {self.count}: ' + + # Padded resize + img = letterbox(img0, self.img_size, stride=self.stride)[0] + + # Convert + img = img.transpose((2, 0, 1))[::-1] # HWC to CHW, BGR to RGB + img = np.ascontiguousarray(img) + + return img_path, img, img0, None, s + + def __len__(self): + return 0 + + +class LoadStreams: + # YOLOv5 streamloader, i.e. `python detect.py --source 'rtsp://example.com/media.mp4' # RTSP, RTMP, HTTP streams` + def __init__(self, sources='streams.txt', img_size=640, stride=32, auto=True): + self.mode = 'stream' + self.img_size = img_size + self.stride = stride + + if os.path.isfile(sources): + with open(sources) as f: + sources = [x.strip() for x in f.read().strip().splitlines() if len(x.strip())] + else: + sources = [sources] + + n = len(sources) + self.imgs, self.fps, self.frames, self.threads = [None] * n, [0] * n, [0] * n, [None] * n + self.sources = [clean_str(x) for x in sources] # clean source names for later + self.auto = auto + for i, s in enumerate(sources): # index, source + # Start thread to read frames from video stream + st = f'{i + 1}/{n}: {s}... ' + if 'youtube.com/' in s or 'youtu.be/' in s: # if source is YouTube video + check_requirements(('pafy', 'youtube_dl==2020.12.2')) + import pafy + s = pafy.new(s).getbest(preftype="mp4").url # YouTube URL + s = eval(s) if s.isnumeric() else s # i.e. s = '0' local webcam + cap = cv2.VideoCapture(s) + assert cap.isOpened(), f'{st}Failed to open {s}' + w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) + h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) + fps = cap.get(cv2.CAP_PROP_FPS) # warning: may return 0 or nan + self.frames[i] = max(int(cap.get(cv2.CAP_PROP_FRAME_COUNT)), 0) or float('inf') # infinite stream fallback + self.fps[i] = max((fps if math.isfinite(fps) else 0) % 100, 0) or 30 # 30 FPS fallback + + _, self.imgs[i] = cap.read() # guarantee first frame + self.threads[i] = Thread(target=self.update, args=([i, cap, s]), daemon=True) + LOGGER.info(f"{st} Success ({self.frames[i]} frames {w}x{h} at {self.fps[i]:.2f} FPS)") + self.threads[i].start() + LOGGER.info('') # newline + + # check for common shapes + s = np.stack([letterbox(x, self.img_size, stride=self.stride, auto=self.auto)[0].shape for x in self.imgs]) + self.rect = np.unique(s, axis=0).shape[0] == 1 # rect inference if all shapes equal + if not self.rect: + LOGGER.warning('WARNING: Stream shapes differ. For optimal performance supply similarly-shaped streams.') + + def update(self, i, cap, stream): + # Read stream `i` frames in daemon thread + n, f, read = 0, self.frames[i], 1 # frame number, frame array, inference every 'read' frame + while cap.isOpened() and n < f: + n += 1 + # _, self.imgs[index] = cap.read() + cap.grab() + if n % read == 0: + success, im = cap.retrieve() + if success: + self.imgs[i] = im + else: + LOGGER.warning('WARNING: Video stream unresponsive, please check your IP camera connection.') + self.imgs[i] = np.zeros_like(self.imgs[i]) + cap.open(stream) # re-open stream if signal was lost + time.sleep(1 / self.fps[i]) # wait time + + def __iter__(self): + self.count = -1 + return self + + def __next__(self): + self.count += 1 + if not all(x.is_alive() for x in self.threads) or cv2.waitKey(1) == ord('q'): # q to quit + cv2.destroyAllWindows() + raise StopIteration + + # Letterbox + img0 = self.imgs.copy() + img = [letterbox(x, self.img_size, stride=self.stride, auto=self.rect and self.auto)[0] for x in img0] + + # Stack + img = np.stack(img, 0) + + # Convert + img = img[..., ::-1].transpose((0, 3, 1, 2)) # BGR to RGB, BHWC to BCHW + img = np.ascontiguousarray(img) + + return self.sources, img, img0, None, '' + + def __len__(self): + return len(self.sources) # 1E12 frames = 32 streams at 30 FPS for 30 years + + +def img2label_paths(img_paths): + # Define label paths as a function of image paths + sa, sb = os.sep + 'images' + os.sep, os.sep + 'labels' + os.sep # /images/, /labels/ substrings + return [sb.join(x.rsplit(sa, 1)).rsplit('.', 1)[0] + '.txt' for x in img_paths] + + +class LoadImagesAndLabels(Dataset): + # YOLOv5 train_loader/val_loader, loads images and labels for training and validation + cache_version = 0.6 # dataset labels *.cache version + + def __init__(self, path, img_size=640, batch_size=16, augment=False, hyp=None, rect=False, image_weights=False, + cache_images=False, single_cls=False, stride=32, pad=0.0, prefix=''): + self.img_size = img_size + self.augment = augment + self.hyp = hyp + self.image_weights = image_weights + self.rect = False if image_weights else rect + self.mosaic = self.augment and not self.rect # load 4 images at a time into a mosaic (only during training) + self.mosaic_border = [-img_size // 2, -img_size // 2] + self.stride = stride + self.path = path + self.albumentations = Albumentations() if augment else None + + try: + f = [] # image files + for p in path if isinstance(path, list) else [path]: + p = Path(p) # os-agnostic + if p.is_dir(): # dir + f += glob.glob(str(p / '**' / '*.*'), recursive=True) + # f = list(p.rglob('*.*')) # pathlib + elif p.is_file(): # file + with open(p) as t: + t = t.read().strip().splitlines() + parent = str(p.parent) + os.sep + f += [x.replace('./', parent) if x.startswith('./') else x for x in t] # local to global path + # f += [p.parent / x.lstrip(os.sep) for x in t] # local to global path (pathlib) + else: + raise Exception(f'{prefix}{p} does not exist') + self.img_files = sorted(x.replace('/', os.sep) for x in f if x.split('.')[-1].lower() in IMG_FORMATS) + # self.img_files = sorted([x for x in f if x.suffix[1:].lower() in IMG_FORMATS]) # pathlib + assert self.img_files, f'{prefix}No images found' + except Exception as e: + raise Exception(f'{prefix}Error loading data from {path}: {e}\nSee {HELP_URL}') + + # Check cache + self.label_files = img2label_paths(self.img_files) # labels + cache_path = (p if p.is_file() else Path(self.label_files[0]).parent).with_suffix('.cache') + try: + cache, exists = np.load(cache_path, allow_pickle=True).item(), True # load dict + assert cache['version'] == self.cache_version # same version + assert cache['hash'] == get_hash(self.label_files + self.img_files) # same hash + except Exception: + cache, exists = self.cache_labels(cache_path, prefix), False # cache + + # Display cache + nf, nm, ne, nc, n = cache.pop('results') # found, missing, empty, corrupt, total + if exists: + d = f"Scanning '{cache_path}' images and labels... {nf} found, {nm} missing, {ne} empty, {nc} corrupt" + tqdm(None, desc=prefix + d, total=n, initial=n) # display cache results + if cache['msgs']: + LOGGER.info('\n'.join(cache['msgs'])) # display warnings + assert nf > 0 or not augment, f'{prefix}No labels in {cache_path}. Can not train without labels. See {HELP_URL}' + + # Read cache + [cache.pop(k) for k in ('hash', 'version', 'msgs')] # remove items + labels, shapes, self.segments = zip(*cache.values()) + self.labels = list(labels) + self.shapes = np.array(shapes, dtype=np.float64) + self.img_files = list(cache.keys()) # update + self.label_files = img2label_paths(cache.keys()) # update + n = len(shapes) # number of images + bi = np.floor(np.arange(n) / batch_size).astype(np.int) # batch index + nb = bi[-1] + 1 # number of batches + self.batch = bi # batch index of image + self.n = n + self.indices = range(n) + + # Update labels + include_class = [] # filter labels to include only these classes (optional) + include_class_array = np.array(include_class).reshape(1, -1) + for i, (label, segment) in enumerate(zip(self.labels, self.segments)): + if include_class: + j = (label[:, 0:1] == include_class_array).any(1) + self.labels[i] = label[j] + if segment: + self.segments[i] = segment[j] + if single_cls: # single-class training, merge all classes into 0 + self.labels[i][:, 0] = 0 + if segment: + self.segments[i][:, 0] = 0 + + # Rectangular Training + if self.rect: + # Sort by aspect ratio + s = self.shapes # wh + ar = s[:, 1] / s[:, 0] # aspect ratio + irect = ar.argsort() + self.img_files = [self.img_files[i] for i in irect] + self.label_files = [self.label_files[i] for i in irect] + self.labels = [self.labels[i] for i in irect] + self.shapes = s[irect] # wh + ar = ar[irect] + + # Set training image shapes + shapes = [[1, 1]] * nb + for i in range(nb): + ari = ar[bi == i] + mini, maxi = ari.min(), ari.max() + if maxi < 1: + shapes[i] = [maxi, 1] + elif mini > 1: + shapes[i] = [1, 1 / mini] + + self.batch_shapes = np.ceil(np.array(shapes) * img_size / stride + pad).astype(np.int) * stride + + # Cache images into RAM/disk for faster training (WARNING: large datasets may exceed system resources) + self.imgs, self.img_npy = [None] * n, [None] * n + if cache_images: + if cache_images == 'disk': + self.im_cache_dir = Path(Path(self.img_files[0]).parent.as_posix() + '_npy') + self.img_npy = [self.im_cache_dir / Path(f).with_suffix('.npy').name for f in self.img_files] + self.im_cache_dir.mkdir(parents=True, exist_ok=True) + gb = 0 # Gigabytes of cached images + self.img_hw0, self.img_hw = [None] * n, [None] * n + results = ThreadPool(NUM_THREADS).imap(self.load_image, range(n)) + pbar = tqdm(enumerate(results), total=n) + for i, x in pbar: + if cache_images == 'disk': + if not self.img_npy[i].exists(): + np.save(self.img_npy[i].as_posix(), x[0]) + gb += self.img_npy[i].stat().st_size + else: # 'ram' + self.imgs[i], self.img_hw0[i], self.img_hw[i] = x # im, hw_orig, hw_resized = load_image(self, i) + gb += self.imgs[i].nbytes + pbar.desc = f'{prefix}Caching images ({gb / 1E9:.1f}GB {cache_images})' + pbar.close() + + def cache_labels(self, path=Path('./labels.cache'), prefix=''): + # Cache dataset labels, check images and read shapes + x = {} # dict + nm, nf, ne, nc, msgs = 0, 0, 0, 0, [] # number missing, found, empty, corrupt, messages + desc = f"{prefix}Scanning '{path.parent / path.stem}' images and labels..." + with Pool(NUM_THREADS) as pool: + pbar = tqdm(pool.imap(verify_image_label, zip(self.img_files, self.label_files, repeat(prefix))), + desc=desc, total=len(self.img_files)) + for im_file, lb, shape, segments, nm_f, nf_f, ne_f, nc_f, msg in pbar: + nm += nm_f + nf += nf_f + ne += ne_f + nc += nc_f + if im_file: + x[im_file] = [lb, shape, segments] + if msg: + msgs.append(msg) + pbar.desc = f"{desc}{nf} found, {nm} missing, {ne} empty, {nc} corrupt" + + pbar.close() + if msgs: + LOGGER.info('\n'.join(msgs)) + if nf == 0: + LOGGER.warning(f'{prefix}WARNING: No labels found in {path}. See {HELP_URL}') + x['hash'] = get_hash(self.label_files + self.img_files) + x['results'] = nf, nm, ne, nc, len(self.img_files) + x['msgs'] = msgs # warnings + x['version'] = self.cache_version # cache version + try: + np.save(path, x) # save cache for next time + path.with_suffix('.cache.npy').rename(path) # remove .npy suffix + LOGGER.info(f'{prefix}New cache created: {path}') + except Exception as e: + LOGGER.warning(f'{prefix}WARNING: Cache directory {path.parent} is not writeable: {e}') # not writeable + return x + + def __len__(self): + return len(self.img_files) + + # def __iter__(self): + # self.count = -1 + # print('ran dataset iter') + # #self.shuffled_vector = np.random.permutation(self.nF) if self.augment else np.arange(self.nF) + # return self + + def __getitem__(self, index): + index = self.indices[index] # linear, shuffled, or image_weights + + hyp = self.hyp + mosaic = self.mosaic and random.random() < hyp['mosaic'] + if mosaic: + # Load mosaic + img, labels = self.load_mosaic(index) + shapes = None + + # MixUp augmentation + if random.random() < hyp['mixup']: + img, labels = mixup(img, labels, *self.load_mosaic(random.randint(0, self.n - 1))) + + else: + # Load image + img, (h0, w0), (h, w) = self.load_image(index) + + # Letterbox + shape = self.batch_shapes[self.batch[index]] if self.rect else self.img_size # final letterboxed shape + img, ratio, pad = letterbox(img, shape, auto=False, scaleup=self.augment) + shapes = (h0, w0), ((h / h0, w / w0), pad) # for COCO mAP rescaling + + labels = self.labels[index].copy() + if labels.size: # normalized xywh to pixel xyxy format + labels[:, 1:] = xywhn2xyxy(labels[:, 1:], ratio[0] * w, ratio[1] * h, padw=pad[0], padh=pad[1]) + + if self.augment: + img, labels = random_perspective(img, labels, + degrees=hyp['degrees'], + translate=hyp['translate'], + scale=hyp['scale'], + shear=hyp['shear'], + perspective=hyp['perspective']) + + nl = len(labels) # number of labels + if nl: + labels[:, 1:5] = xyxy2xywhn(labels[:, 1:5], w=img.shape[1], h=img.shape[0], clip=True, eps=1E-3) + + if self.augment: + # Albumentations + img, labels = self.albumentations(img, labels) + nl = len(labels) # update after albumentations + + # HSV color-space + augment_hsv(img, hgain=hyp['hsv_h'], sgain=hyp['hsv_s'], vgain=hyp['hsv_v']) + + # Flip up-down + if random.random() < hyp['flipud']: + img = np.flipud(img) + if nl: + labels[:, 2] = 1 - labels[:, 2] + + # Flip left-right + if random.random() < hyp['fliplr']: + img = np.fliplr(img) + if nl: + labels[:, 1] = 1 - labels[:, 1] + + # Cutouts + # labels = cutout(img, labels, p=0.5) + # nl = len(labels) # update after cutout + + labels_out = torch.zeros((nl, 6)) + if nl: + labels_out[:, 1:] = torch.from_numpy(labels) + + # Convert + img = img.transpose((2, 0, 1))[::-1] # HWC to CHW, BGR to RGB + img = np.ascontiguousarray(img) + + return torch.from_numpy(img), labels_out, self.img_files[index], shapes + + def load_image(self, i): + # loads 1 image from dataset index 'i', returns (im, original hw, resized hw) + im = self.imgs[i] + if im is None: # not cached in RAM + npy = self.img_npy[i] + if npy and npy.exists(): # load npy + im = np.load(npy) + else: # read image + f = self.img_files[i] + im = cv2.imread(f) # BGR + assert im is not None, f'Image Not Found {f}' + h0, w0 = im.shape[:2] # orig hw + r = self.img_size / max(h0, w0) # ratio + if r != 1: # if sizes are not equal + im = cv2.resize(im, + (int(w0 * r), int(h0 * r)), + interpolation=cv2.INTER_LINEAR if (self.augment or r > 1) else cv2.INTER_AREA) + return im, (h0, w0), im.shape[:2] # im, hw_original, hw_resized + else: + return self.imgs[i], self.img_hw0[i], self.img_hw[i] # im, hw_original, hw_resized + + def load_mosaic(self, index): + # YOLOv5 4-mosaic loader. Loads 1 image + 3 random images into a 4-image mosaic + labels4, segments4 = [], [] + s = self.img_size + yc, xc = (int(random.uniform(-x, 2 * s + x)) for x in self.mosaic_border) # mosaic center x, y + indices = [index] + random.choices(self.indices, k=3) # 3 additional image indices + random.shuffle(indices) + for i, index in enumerate(indices): + # Load image + img, _, (h, w) = self.load_image(index) + + # place img in img4 + if i == 0: # top left + img4 = np.full((s * 2, s * 2, img.shape[2]), 114, dtype=np.uint8) # base image with 4 tiles + x1a, y1a, x2a, y2a = max(xc - w, 0), max(yc - h, 0), xc, yc # xmin, ymin, xmax, ymax (large image) + x1b, y1b, x2b, y2b = w - (x2a - x1a), h - (y2a - y1a), w, h # xmin, ymin, xmax, ymax (small image) + elif i == 1: # top right + x1a, y1a, x2a, y2a = xc, max(yc - h, 0), min(xc + w, s * 2), yc + x1b, y1b, x2b, y2b = 0, h - (y2a - y1a), min(w, x2a - x1a), h + elif i == 2: # bottom left + x1a, y1a, x2a, y2a = max(xc - w, 0), yc, xc, min(s * 2, yc + h) + x1b, y1b, x2b, y2b = w - (x2a - x1a), 0, w, min(y2a - y1a, h) + elif i == 3: # bottom right + x1a, y1a, x2a, y2a = xc, yc, min(xc + w, s * 2), min(s * 2, yc + h) + x1b, y1b, x2b, y2b = 0, 0, min(w, x2a - x1a), min(y2a - y1a, h) + + img4[y1a:y2a, x1a:x2a] = img[y1b:y2b, x1b:x2b] # img4[ymin:ymax, xmin:xmax] + padw = x1a - x1b + padh = y1a - y1b + + # Labels + labels, segments = self.labels[index].copy(), self.segments[index].copy() + if labels.size: + labels[:, 1:] = xywhn2xyxy(labels[:, 1:], w, h, padw, padh) # normalized xywh to pixel xyxy format + segments = [xyn2xy(x, w, h, padw, padh) for x in segments] + labels4.append(labels) + segments4.extend(segments) + + # Concat/clip labels + labels4 = np.concatenate(labels4, 0) + for x in (labels4[:, 1:], *segments4): + np.clip(x, 0, 2 * s, out=x) # clip when using random_perspective() + # img4, labels4 = replicate(img4, labels4) # replicate + + # Augment + img4, labels4, segments4 = copy_paste(img4, labels4, segments4, p=self.hyp['copy_paste']) + img4, labels4 = random_perspective(img4, labels4, segments4, + degrees=self.hyp['degrees'], + translate=self.hyp['translate'], + scale=self.hyp['scale'], + shear=self.hyp['shear'], + perspective=self.hyp['perspective'], + border=self.mosaic_border) # border to remove + + return img4, labels4 + + def load_mosaic9(self, index): + # YOLOv5 9-mosaic loader. Loads 1 image + 8 random images into a 9-image mosaic + labels9, segments9 = [], [] + s = self.img_size + indices = [index] + random.choices(self.indices, k=8) # 8 additional image indices + random.shuffle(indices) + hp, wp = -1, -1 # height, width previous + for i, index in enumerate(indices): + # Load image + img, _, (h, w) = self.load_image(index) + + # place img in img9 + if i == 0: # center + img9 = np.full((s * 3, s * 3, img.shape[2]), 114, dtype=np.uint8) # base image with 4 tiles + h0, w0 = h, w + c = s, s, s + w, s + h # xmin, ymin, xmax, ymax (base) coordinates + elif i == 1: # top + c = s, s - h, s + w, s + elif i == 2: # top right + c = s + wp, s - h, s + wp + w, s + elif i == 3: # right + c = s + w0, s, s + w0 + w, s + h + elif i == 4: # bottom right + c = s + w0, s + hp, s + w0 + w, s + hp + h + elif i == 5: # bottom + c = s + w0 - w, s + h0, s + w0, s + h0 + h + elif i == 6: # bottom left + c = s + w0 - wp - w, s + h0, s + w0 - wp, s + h0 + h + elif i == 7: # left + c = s - w, s + h0 - h, s, s + h0 + elif i == 8: # top left + c = s - w, s + h0 - hp - h, s, s + h0 - hp + + padx, pady = c[:2] + x1, y1, x2, y2 = (max(x, 0) for x in c) # allocate coords + + # Labels + labels, segments = self.labels[index].copy(), self.segments[index].copy() + if labels.size: + labels[:, 1:] = xywhn2xyxy(labels[:, 1:], w, h, padx, pady) # normalized xywh to pixel xyxy format + segments = [xyn2xy(x, w, h, padx, pady) for x in segments] + labels9.append(labels) + segments9.extend(segments) + + # Image + img9[y1:y2, x1:x2] = img[y1 - pady:, x1 - padx:] # img9[ymin:ymax, xmin:xmax] + hp, wp = h, w # height, width previous + + # Offset + yc, xc = (int(random.uniform(0, s)) for _ in self.mosaic_border) # mosaic center x, y + img9 = img9[yc:yc + 2 * s, xc:xc + 2 * s] + + # Concat/clip labels + labels9 = np.concatenate(labels9, 0) + labels9[:, [1, 3]] -= xc + labels9[:, [2, 4]] -= yc + c = np.array([xc, yc]) # centers + segments9 = [x - c for x in segments9] + + for x in (labels9[:, 1:], *segments9): + np.clip(x, 0, 2 * s, out=x) # clip when using random_perspective() + # img9, labels9 = replicate(img9, labels9) # replicate + + # Augment + img9, labels9 = random_perspective(img9, labels9, segments9, + degrees=self.hyp['degrees'], + translate=self.hyp['translate'], + scale=self.hyp['scale'], + shear=self.hyp['shear'], + perspective=self.hyp['perspective'], + border=self.mosaic_border) # border to remove + + return img9, labels9 + + @staticmethod + def collate_fn(batch): + img, label, path, shapes = zip(*batch) # transposed + for i, lb in enumerate(label): + lb[:, 0] = i # add target image index for build_targets() + return torch.stack(img, 0), torch.cat(label, 0), path, shapes + + @staticmethod + def collate_fn4(batch): + img, label, path, shapes = zip(*batch) # transposed + n = len(shapes) // 4 + img4, label4, path4, shapes4 = [], [], path[:n], shapes[:n] + + ho = torch.tensor([[0.0, 0, 0, 1, 0, 0]]) + wo = torch.tensor([[0.0, 0, 1, 0, 0, 0]]) + s = torch.tensor([[1, 1, 0.5, 0.5, 0.5, 0.5]]) # scale + for i in range(n): # zidane torch.zeros(16,3,720,1280) # BCHW + i *= 4 + if random.random() < 0.5: + im = F.interpolate(img[i].unsqueeze(0).float(), scale_factor=2.0, mode='bilinear', align_corners=False)[ + 0].type(img[i].type()) + lb = label[i] + else: + im = torch.cat((torch.cat((img[i], img[i + 1]), 1), torch.cat((img[i + 2], img[i + 3]), 1)), 2) + lb = torch.cat((label[i], label[i + 1] + ho, label[i + 2] + wo, label[i + 3] + ho + wo), 0) * s + img4.append(im) + label4.append(lb) + + for i, lb in enumerate(label4): + lb[:, 0] = i # add target image index for build_targets() + + return torch.stack(img4, 0), torch.cat(label4, 0), path4, shapes4 + + +# Ancillary functions -------------------------------------------------------------------------------------------------- +def create_folder(path='./new'): + # Create folder + if os.path.exists(path): + shutil.rmtree(path) # delete output folder + os.makedirs(path) # make new output folder + + +def flatten_recursive(path=DATASETS_DIR / 'coco128'): + # Flatten a recursive directory by bringing all files to top level + new_path = Path(str(path) + '_flat') + create_folder(new_path) + for file in tqdm(glob.glob(str(Path(path)) + '/**/*.*', recursive=True)): + shutil.copyfile(file, new_path / Path(file).name) + + +def extract_boxes(path=DATASETS_DIR / 'coco128'): # from utils.datasets import *; extract_boxes() + # Convert detection dataset into classification dataset, with one directory per class + path = Path(path) # images dir + shutil.rmtree(path / 'classifier') if (path / 'classifier').is_dir() else None # remove existing + files = list(path.rglob('*.*')) + n = len(files) # number of files + for im_file in tqdm(files, total=n): + if im_file.suffix[1:] in IMG_FORMATS: + # image + im = cv2.imread(str(im_file))[..., ::-1] # BGR to RGB + h, w = im.shape[:2] + + # labels + lb_file = Path(img2label_paths([str(im_file)])[0]) + if Path(lb_file).exists(): + with open(lb_file) as f: + lb = np.array([x.split() for x in f.read().strip().splitlines()], dtype=np.float32) # labels + + for j, x in enumerate(lb): + c = int(x[0]) # class + f = (path / 'classifier') / f'{c}' / f'{path.stem}_{im_file.stem}_{j}.jpg' # new filename + if not f.parent.is_dir(): + f.parent.mkdir(parents=True) + + b = x[1:] * [w, h, w, h] # box + # b[2:] = b[2:].max() # rectangle to square + b[2:] = b[2:] * 1.2 + 3 # pad + b = xywh2xyxy(b.reshape(-1, 4)).ravel().astype(np.int) + + b[[0, 2]] = np.clip(b[[0, 2]], 0, w) # clip boxes outside of image + b[[1, 3]] = np.clip(b[[1, 3]], 0, h) + assert cv2.imwrite(str(f), im[b[1]:b[3], b[0]:b[2]]), f'box failure in {f}' + + +def autosplit(path=DATASETS_DIR / 'coco128/images', weights=(0.9, 0.1, 0.0), annotated_only=False): + """ Autosplit a dataset into train/val/test splits and save path/autosplit_*.txt files + Usage: from utils.datasets import *; autosplit() + Arguments + path: Path to images directory + weights: Train, val, test weights (list, tuple) + annotated_only: Only use images with an annotated txt file + """ + path = Path(path) # images dir + files = sorted(x for x in path.rglob('*.*') if x.suffix[1:].lower() in IMG_FORMATS) # image files only + n = len(files) # number of files + random.seed(0) # for reproducibility + indices = random.choices([0, 1, 2], weights=weights, k=n) # assign each image to a split + + txt = ['autosplit_train.txt', 'autosplit_val.txt', 'autosplit_test.txt'] # 3 txt files + [(path.parent / x).unlink(missing_ok=True) for x in txt] # remove existing + + print(f'Autosplitting images from {path}' + ', using *.txt labeled images only' * annotated_only) + for i, img in tqdm(zip(indices, files), total=n): + if not annotated_only or Path(img2label_paths([str(img)])[0]).exists(): # check label + with open(path.parent / txt[i], 'a') as f: + f.write('./' + img.relative_to(path.parent).as_posix() + '\n') # add image to txt file + + +def verify_image_label(args): + # Verify one image-label pair + im_file, lb_file, prefix = args + nm, nf, ne, nc, msg, segments = 0, 0, 0, 0, '', [] # number (missing, found, empty, corrupt), message, segments + try: + # verify images + im = Image.open(im_file) + im.verify() # PIL verify + shape = exif_size(im) # image size + assert (shape[0] > 9) & (shape[1] > 9), f'image size {shape} <10 pixels' + assert im.format.lower() in IMG_FORMATS, f'invalid image format {im.format}' + if im.format.lower() in ('jpg', 'jpeg'): + with open(im_file, 'rb') as f: + f.seek(-2, 2) + if f.read() != b'\xff\xd9': # corrupt JPEG + ImageOps.exif_transpose(Image.open(im_file)).save(im_file, 'JPEG', subsampling=0, quality=100) + msg = f'{prefix}WARNING: {im_file}: corrupt JPEG restored and saved' + + # verify labels + if os.path.isfile(lb_file): + nf = 1 # label found + with open(lb_file) as f: + lb = [x.split() for x in f.read().strip().splitlines() if len(x)] + if any([len(x) > 8 for x in lb]): # is segment + classes = np.array([x[0] for x in lb], dtype=np.float32) + segments = [np.array(x[1:], dtype=np.float32).reshape(-1, 2) for x in lb] # (cls, xy1...) + lb = np.concatenate((classes.reshape(-1, 1), segments2boxes(segments)), 1) # (cls, xywh) + lb = np.array(lb, dtype=np.float32) + nl = len(lb) + if nl: + assert lb.shape[1] == 5, f'labels require 5 columns, {lb.shape[1]} columns detected' + assert (lb >= 0).all(), f'negative label values {lb[lb < 0]}' + assert (lb[:, 1:] <= 1).all(), f'non-normalized or out of bounds coordinates {lb[:, 1:][lb[:, 1:] > 1]}' + _, i = np.unique(lb, axis=0, return_index=True) + if len(i) < nl: # duplicate row check + lb = lb[i] # remove duplicates + if segments: + segments = segments[i] + msg = f'{prefix}WARNING: {im_file}: {nl - len(i)} duplicate labels removed' + else: + ne = 1 # label empty + lb = np.zeros((0, 5), dtype=np.float32) + else: + nm = 1 # label missing + lb = np.zeros((0, 5), dtype=np.float32) + return im_file, lb, shape, segments, nm, nf, ne, nc, msg + except Exception as e: + nc = 1 + msg = f'{prefix}WARNING: {im_file}: ignoring corrupt image/label: {e}' + return [None, None, None, None, nm, nf, ne, nc, msg] + + +def dataset_stats(path='coco128.yaml', autodownload=False, verbose=False, profile=False, hub=False): + """ Return dataset statistics dictionary with images and instances counts per split per class + To run in parent directory: export PYTHONPATH="$PWD/yolov5" + Usage1: from utils.datasets import *; dataset_stats('coco128.yaml', autodownload=True) + Usage2: from utils.datasets import *; dataset_stats('path/to/coco128_with_yaml.zip') + Arguments + path: Path to data.yaml or data.zip (with data.yaml inside data.zip) + autodownload: Attempt to download dataset if not found locally + verbose: Print stats dictionary + """ + + def round_labels(labels): + # Update labels to integer class and 6 decimal place floats + return [[int(c), *(round(x, 4) for x in points)] for c, *points in labels] + + def unzip(path): + # Unzip data.zip TODO: CONSTRAINT: path/to/abc.zip MUST unzip to 'path/to/abc/' + if str(path).endswith('.zip'): # path is data.zip + assert Path(path).is_file(), f'Error unzipping {path}, file not found' + ZipFile(path).extractall(path=path.parent) # unzip + dir = path.with_suffix('') # dataset directory == zip name + return True, str(dir), next(dir.rglob('*.yaml')) # zipped, data_dir, yaml_path + else: # path is data.yaml + return False, None, path + + def hub_ops(f, max_dim=1920): + # HUB ops for 1 image 'f': resize and save at reduced quality in /dataset-hub for web/app viewing + f_new = im_dir / Path(f).name # dataset-hub image filename + try: # use PIL + im = Image.open(f) + r = max_dim / max(im.height, im.width) # ratio + if r < 1.0: # image too large + im = im.resize((int(im.width * r), int(im.height * r))) + im.save(f_new, 'JPEG', quality=75, optimize=True) # save + except Exception as e: # use OpenCV + print(f'WARNING: HUB ops PIL failure {f}: {e}') + im = cv2.imread(f) + im_height, im_width = im.shape[:2] + r = max_dim / max(im_height, im_width) # ratio + if r < 1.0: # image too large + im = cv2.resize(im, (int(im_width * r), int(im_height * r)), interpolation=cv2.INTER_AREA) + cv2.imwrite(str(f_new), im) + + zipped, data_dir, yaml_path = unzip(Path(path)) + with open(check_yaml(yaml_path), errors='ignore') as f: + data = yaml.safe_load(f) # data dict + if zipped: + data['path'] = data_dir # TODO: should this be dir.resolve()? + check_dataset(data, autodownload) # download dataset if missing + hub_dir = Path(data['path'] + ('-hub' if hub else '')) + stats = {'nc': data['nc'], 'names': data['names']} # statistics dictionary + for split in 'train', 'val', 'test': + if data.get(split) is None: + stats[split] = None # i.e. no test set + continue + x = [] + dataset = LoadImagesAndLabels(data[split]) # load dataset + for label in tqdm(dataset.labels, total=dataset.n, desc='Statistics'): + x.append(np.bincount(label[:, 0].astype(int), minlength=data['nc'])) + x = np.array(x) # shape(128x80) + stats[split] = {'instance_stats': {'total': int(x.sum()), 'per_class': x.sum(0).tolist()}, + 'image_stats': {'total': dataset.n, 'unlabelled': int(np.all(x == 0, 1).sum()), + 'per_class': (x > 0).sum(0).tolist()}, + 'labels': [{str(Path(k).name): round_labels(v.tolist())} for k, v in + zip(dataset.img_files, dataset.labels)]} + + if hub: + im_dir = hub_dir / 'images' + im_dir.mkdir(parents=True, exist_ok=True) + for _ in tqdm(ThreadPool(NUM_THREADS).imap(hub_ops, dataset.img_files), total=dataset.n, desc='HUB Ops'): + pass + + # Profile + stats_path = hub_dir / 'stats.json' + if profile: + for _ in range(1): + file = stats_path.with_suffix('.npy') + t1 = time.time() + np.save(file, stats) + t2 = time.time() + x = np.load(file, allow_pickle=True) + print(f'stats.npy times: {time.time() - t2:.3f}s read, {t2 - t1:.3f}s write') + + file = stats_path.with_suffix('.json') + t1 = time.time() + with open(file, 'w') as f: + json.dump(stats, f) # save stats *.json + t2 = time.time() + with open(file) as f: + x = json.load(f) # load hyps dict + print(f'stats.json times: {time.time() - t2:.3f}s read, {t2 - t1:.3f}s write') + + # Save, print and return + if hub: + print(f'Saving {stats_path.resolve()}...') + with open(stats_path, 'w') as f: + json.dump(stats, f) # save stats.json + if verbose: + print(json.dumps(stats, indent=2, sort_keys=False)) + return stats diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/downloads.py b/python/contrib/YOLOv5driver_assistant_system/utils/downloads.py new file mode 100644 index 000000000..d7b87cb2c --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/utils/downloads.py @@ -0,0 +1,153 @@ +# YOLOv5 🚀 by Ultralytics, GPL-3.0 license +""" +Download utils +""" + +import os +import platform +import subprocess +import time +import urllib +from pathlib import Path +from zipfile import ZipFile + +import requests +import torch + + +def gsutil_getsize(url=''): + # gs://bucket/file size https://cloud.google.com/storage/docs/gsutil/commands/du + s = subprocess.check_output(f'gsutil du {url}', shell=True).decode('utf-8') + return eval(s.split(' ')[0]) if len(s) else 0 # bytes + + +def safe_download(file, url, url2=None, min_bytes=1E0, error_msg=''): + # Attempts to download file from url or url2, checks and removes incomplete downloads < min_bytes + file = Path(file) + assert_msg = f"Downloaded file '{file}' does not exist or size is < min_bytes={min_bytes}" + try: # url1 + print(f'Downloading {url} to {file}...') + torch.hub.download_url_to_file(url, str(file)) + assert file.exists() and file.stat().st_size > min_bytes, assert_msg # check + except Exception as e: # url2 + file.unlink(missing_ok=True) # remove partial downloads + print(f'ERROR: {e}\nRe-attempting {url2 or url} to {file}...') + os.system(f"curl -L '{url2 or url}' -o '{file}' --retry 3 -C -") # curl download, retry and resume on fail + finally: + if not file.exists() or file.stat().st_size < min_bytes: # check + file.unlink(missing_ok=True) # remove partial downloads + print(f"ERROR: {assert_msg}\n{error_msg}") + print('') + + +def attempt_download(file, repo='ultralytics/yolov5'): # from utils.downloads import *; attempt_download() + # Attempt file download if does not exist + file = Path(str(file).strip().replace("'", '')) + + if not file.exists(): + # URL specified + name = Path(urllib.parse.unquote(str(file))).name # decode '%2F' to '/' etc. + if str(file).startswith(('http:/', 'https:/')): # download + url = str(file).replace(':/', '://') # Pathlib turns :// -> :/ + file = name.split('?')[0] # parse authentication https://url.com/file.txt?auth... + if Path(file).is_file(): + print(f'Found {url} locally at {file}') # file already exists + else: + safe_download(file=file, url=url, min_bytes=1E5) + return file + + # GitHub assets + file.parent.mkdir(parents=True, exist_ok=True) # make parent dir (if required) + try: + response = requests.get(f'https://api.github.com/repos/{repo}/releases/latest').json() # github api + assets = [x['name'] for x in response['assets']] # release assets, i.e. ['yolov5s.pt', 'yolov5m.pt', ...] + tag = response['tag_name'] # i.e. 'v1.0' + except Exception: # fallback plan + assets = ['yolov5n.pt', 'yolov5s.pt', 'yolov5m.pt', 'yolov5l.pt', 'yolov5x.pt', + 'yolov5n6.pt', 'yolov5s6.pt', 'yolov5m6.pt', 'yolov5l6.pt', 'yolov5x6.pt'] + try: + tag = subprocess.check_output('git tag', shell=True, stderr=subprocess.STDOUT).decode().split()[-1] + except Exception: + tag = 'v6.0' # current release + + if name in assets: + safe_download(file, + url=f'https://github.com/{repo}/releases/download/{tag}/{name}', + # url2=f'https://storage.googleapis.com/{repo}/ckpt/{name}', # backup url (optional) + min_bytes=1E5, + error_msg=f'{file} missing, try downloading from https://github.com/{repo}/releases/') + + return str(file) + + +def gdrive_download(id='16TiPfZj7htmTyhntwcZyEEAejOUxuT6m', file='tmp.zip'): + # Downloads a file from Google Drive. from yolov5.utils.downloads import *; gdrive_download() + t = time.time() + file = Path(file) + cookie = Path('cookie') # gdrive cookie + print(f'Downloading https://drive.google.com/uc?export=download&id={id} as {file}... ', end='') + file.unlink(missing_ok=True) # remove existing file + cookie.unlink(missing_ok=True) # remove existing cookie + + # Attempt file download + out = "NUL" if platform.system() == "Windows" else "/dev/null" + os.system(f'curl -c ./cookie -s -L "drive.google.com/uc?export=download&id={id}" > {out}') + if os.path.exists('cookie'): # large file + s = f'curl -Lb ./cookie "drive.google.com/uc?export=download&confirm={get_token()}&id={id}" -o {file}' + else: # small file + s = f'curl -s -L -o {file} "drive.google.com/uc?export=download&id={id}"' + r = os.system(s) # execute, capture return + cookie.unlink(missing_ok=True) # remove existing cookie + + # Error check + if r != 0: + file.unlink(missing_ok=True) # remove partial + print('Download error ') # raise Exception('Download error') + return r + + # Unzip if archive + if file.suffix == '.zip': + print('unzipping... ', end='') + ZipFile(file).extractall(path=file.parent) # unzip + file.unlink() # remove zip + + print(f'Done ({time.time() - t:.1f}s)') + return r + + +def get_token(cookie="./cookie"): + with open(cookie) as f: + for line in f: + if "download" in line: + return line.split()[-1] + return "" + +# Google utils: https://cloud.google.com/storage/docs/reference/libraries ---------------------------------------------- +# +# +# def upload_blob(bucket_name, source_file_name, destination_blob_name): +# # Uploads a file to a bucket +# # https://cloud.google.com/storage/docs/uploading-objects#storage-upload-object-python +# +# storage_client = storage.Client() +# bucket = storage_client.get_bucket(bucket_name) +# blob = bucket.blob(destination_blob_name) +# +# blob.upload_from_filename(source_file_name) +# +# print('File {} uploaded to {}.'.format( +# source_file_name, +# destination_blob_name)) +# +# +# def download_blob(bucket_name, source_blob_name, destination_file_name): +# # Uploads a blob from a bucket +# storage_client = storage.Client() +# bucket = storage_client.get_bucket(bucket_name) +# blob = bucket.blob(source_blob_name) +# +# blob.download_to_filename(destination_file_name) +# +# print('Blob {} downloaded to {}.'.format( +# source_blob_name, +# destination_file_name)) diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/flask_rest_api/README.md b/python/contrib/YOLOv5driver_assistant_system/utils/flask_rest_api/README.md new file mode 100644 index 000000000..a726acbd9 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/utils/flask_rest_api/README.md @@ -0,0 +1,73 @@ +# Flask REST API + +[REST](https://en.wikipedia.org/wiki/Representational_state_transfer) [API](https://en.wikipedia.org/wiki/API)s are +commonly used to expose Machine Learning (ML) models to other services. This folder contains an example REST API +created using Flask to expose the YOLOv5s model from [PyTorch Hub](https://pytorch.org/hub/ultralytics_yolov5/). + +## Requirements + +[Flask](https://palletsprojects.com/p/flask/) is required. Install with: + +```shell +$ pip install Flask +``` + +## Run + +After Flask installation run: + +```shell +$ python3 restapi.py --port 5000 +``` + +Then use [curl](https://curl.se/) to perform a request: + +```shell +$ curl -X POST -F image=@zidane.jpg 'http://localhost:5000/v1/object-detection/yolov5s' +``` + +The model inference results are returned as a JSON response: + +```json +[ + { + "class": 0, + "confidence": 0.8900438547, + "height": 0.9318675399, + "name": "person", + "width": 0.3264600933, + "xcenter": 0.7438579798, + "ycenter": 0.5207948685 + }, + { + "class": 0, + "confidence": 0.8440024257, + "height": 0.7155083418, + "name": "person", + "width": 0.6546785235, + "xcenter": 0.427829951, + "ycenter": 0.6334488392 + }, + { + "class": 27, + "confidence": 0.3771208823, + "height": 0.3902671337, + "name": "tie", + "width": 0.0696444362, + "xcenter": 0.3675483763, + "ycenter": 0.7991207838 + }, + { + "class": 27, + "confidence": 0.3527112305, + "height": 0.1540903747, + "name": "tie", + "width": 0.0336618312, + "xcenter": 0.7814827561, + "ycenter": 0.5065554976 + } +] +``` + +An example python script to perform inference using [requests](https://docs.python-requests.org/en/master/) is given +in `example_request.py` diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/flask_rest_api/example_request.py b/python/contrib/YOLOv5driver_assistant_system/utils/flask_rest_api/example_request.py new file mode 100644 index 000000000..ff21f30f9 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/utils/flask_rest_api/example_request.py @@ -0,0 +1,13 @@ +"""Perform test request""" +import pprint + +import requests + +DETECTION_URL = "http://localhost:5000/v1/object-detection/yolov5s" +TEST_IMAGE = "zidane.jpg" + +image_data = open(TEST_IMAGE, "rb").read() + +response = requests.post(DETECTION_URL, files={"image": image_data}).json() + +pprint.pprint(response) diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/flask_rest_api/restapi.py b/python/contrib/YOLOv5driver_assistant_system/utils/flask_rest_api/restapi.py new file mode 100644 index 000000000..b93ad16a0 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/utils/flask_rest_api/restapi.py @@ -0,0 +1,37 @@ +""" +Run a rest API exposing the yolov5s object detection model +""" +import argparse +import io + +import torch +from flask import Flask, request +from PIL import Image + +app = Flask(__name__) + +DETECTION_URL = "/v1/object-detection/yolov5s" + + +@app.route(DETECTION_URL, methods=["POST"]) +def predict(): + if not request.method == "POST": + return + + if request.files.get("image"): + image_file = request.files["image"] + image_bytes = image_file.read() + + img = Image.open(io.BytesIO(image_bytes)) + + results = model(img, size=640) # reduce size=320 for faster inference + return results.pandas().xyxy[0].to_json(orient="records") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Flask API exposing YOLOv5 model") + parser.add_argument("--port", default=5000, type=int, help="port number") + args = parser.parse_args() + + model = torch.hub.load("ultralytics/yolov5", "yolov5s", force_reload=True) # force_reload to recache + app.run(host="0.0.0.0", port=args.port) # debug=True causes Restarting with stat diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/general.py b/python/contrib/YOLOv5driver_assistant_system/utils/general.py new file mode 100644 index 000000000..3044b9c1a --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/utils/general.py @@ -0,0 +1,880 @@ +# YOLOv5 🚀 by Ultralytics, GPL-3.0 license +""" +General utils +""" + +import contextlib +import glob +import logging +import math +import os +import platform +import random +import re +import shutil +import signal +import time +import urllib +from itertools import repeat +from multiprocessing.pool import ThreadPool +from pathlib import Path +from subprocess import check_output +from zipfile import ZipFile + +import cv2 +import numpy as np +import pandas as pd +import pkg_resources as pkg +import torch +import torchvision +import yaml + +from utils.downloads import gsutil_getsize +from utils.metrics import box_iou, fitness + +# Settings +FILE = Path(__file__).resolve() +ROOT = FILE.parents[1] # YOLOv5 root directory +DATASETS_DIR = ROOT.parent / 'datasets' # YOLOv5 datasets directory +NUM_THREADS = min(8, max(1, os.cpu_count() - 1)) # number of YOLOv5 multiprocessing threads +VERBOSE = str(os.getenv('YOLOv5_VERBOSE', True)).lower() == 'true' # global verbose mode +FONT = 'Arial.ttf' # https://ultralytics.com/assets/Arial.ttf + +torch.set_printoptions(linewidth=320, precision=5, profile='long') +np.set_printoptions(linewidth=320, formatter={'float_kind': '{:11.5g}'.format}) # format short g, %precision=5 +pd.options.display.max_columns = 10 +cv2.setNumThreads(0) # prevent OpenCV from multithreading (incompatible with PyTorch DataLoader) +os.environ['NUMEXPR_MAX_THREADS'] = str(NUM_THREADS) # NumExpr max threads + + +def is_kaggle(): + # Is environment a Kaggle Notebook? + try: + assert os.environ.get('PWD') == '/kaggle/working' + assert os.environ.get('KAGGLE_URL_BASE') == 'https://www.kaggle.com' + return True + except AssertionError: + return False + + +def is_writeable(dir, test=False): + # Return True if directory has write permissions, test opening a file with write permissions if test=True + if test: # method 1 + file = Path(dir) / 'tmp.txt' + try: + with open(file, 'w'): # open file with write permissions + pass + file.unlink() # remove file + return True + except OSError: + return False + else: # method 2 + return os.access(dir, os.R_OK) # possible issues on Windows + + +def set_logging(name=None, verbose=VERBOSE): + # Sets level and returns logger + if is_kaggle(): + for h in logging.root.handlers: + logging.root.removeHandler(h) # remove all handlers associated with the root logger object + rank = int(os.getenv('RANK', -1)) # rank in world for Multi-GPU trainings + logging.basicConfig(format="%(message)s", level=logging.INFO if (verbose and rank in (-1, 0)) else logging.WARNING) + return logging.getLogger(name) + + +LOGGER = set_logging('yolov5') # define globally (used in train.py, val.py, detect.py, etc.) + + +def user_config_dir(dir='Ultralytics', env_var='YOLOV5_CONFIG_DIR'): + # Return path of user configuration directory. Prefer environment variable if exists. Make dir if required. + env = os.getenv(env_var) + if env: + path = Path(env) # use environment variable + else: + cfg = {'Windows': 'AppData/Roaming', 'Linux': '.config', 'Darwin': 'Library/Application Support'} # 3 OS dirs + path = Path.home() / cfg.get(platform.system(), '') # OS-specific config dir + path = (path if is_writeable(path) else Path('/tmp')) / dir # GCP and AWS lambda fix, only /tmp is writeable + path.mkdir(exist_ok=True) # make if required + return path + + +CONFIG_DIR = user_config_dir() # Ultralytics settings dir + + +class Profile(contextlib.ContextDecorator): + # Usage: @Profile() decorator or 'with Profile():' context manager + def __enter__(self): + self.start = time.time() + + def __exit__(self, type, value, traceback): + print(f'Profile results: {time.time() - self.start:.5f}s') + + +class Timeout(contextlib.ContextDecorator): + # Usage: @Timeout(seconds) decorator or 'with Timeout(seconds):' context manager + def __init__(self, seconds, *, timeout_msg='', suppress_timeout_errors=True): + self.seconds = int(seconds) + self.timeout_message = timeout_msg + self.suppress = bool(suppress_timeout_errors) + + def _timeout_handler(self, signum, frame): + raise TimeoutError(self.timeout_message) + + def __enter__(self): + signal.signal(signal.SIGALRM, self._timeout_handler) # Set handler for SIGALRM + signal.alarm(self.seconds) # start countdown for SIGALRM to be raised + + def __exit__(self, exc_type, exc_val, exc_tb): + signal.alarm(0) # Cancel SIGALRM if it's scheduled + if self.suppress and exc_type is TimeoutError: # Suppress TimeoutError + return True + + +class WorkingDirectory(contextlib.ContextDecorator): + # Usage: @WorkingDirectory(dir) decorator or 'with WorkingDirectory(dir):' context manager + def __init__(self, new_dir): + self.dir = new_dir # new dir + self.cwd = Path.cwd().resolve() # current dir + + def __enter__(self): + os.chdir(self.dir) + + def __exit__(self, exc_type, exc_val, exc_tb): + os.chdir(self.cwd) + + +def try_except(func): + # try-except function. Usage: @try_except decorator + def handler(*args, **kwargs): + try: + func(*args, **kwargs) + except Exception as e: + print(e) + + return handler + + +def methods(instance): + # Get class/instance methods + return [f for f in dir(instance) if callable(getattr(instance, f)) and not f.startswith("__")] + + +def print_args(name, opt): + # Print argparser arguments + LOGGER.info(colorstr(f'{name}: ') + ', '.join(f'{k}={v}' for k, v in vars(opt).items())) + + +def init_seeds(seed=0): + # Initialize random number generator (RNG) seeds https://pytorch.org/docs/stable/notes/randomness.html + # cudnn seed 0 settings are slower and more reproducible, else faster and less reproducible + import torch.backends.cudnn as cudnn + random.seed(seed) + np.random.seed(seed) + torch.manual_seed(seed) + cudnn.benchmark, cudnn.deterministic = (False, True) if seed == 0 else (True, False) + + +def intersect_dicts(da, db, exclude=()): + # Dictionary intersection of matching keys and shapes, omitting 'exclude' keys, using da values + return {k: v for k, v in da.items() if k in db and not any(x in k for x in exclude) and v.shape == db[k].shape} + + +def get_latest_run(search_dir='.'): + # Return path to most recent 'last.pt' in /runs (i.e. to --resume from) + last_list = glob.glob(f'{search_dir}/**/last*.pt', recursive=True) + return max(last_list, key=os.path.getctime) if last_list else '' + + +def is_docker(): + # Is environment a Docker container? + return Path('/workspace').exists() # or Path('/.dockerenv').exists() + + +def is_colab(): + # Is environment a Google Colab instance? + try: + import google.colab + return True + except ImportError: + return False + + +def is_pip(): + # Is file in a pip package? + return 'site-packages' in Path(__file__).resolve().parts + + +def is_ascii(s=''): + # Is string composed of all ASCII (no UTF) characters? (note str().isascii() introduced in python 3.7) + s = str(s) # convert list, tuple, None, etc. to str + return len(s.encode().decode('ascii', 'ignore')) == len(s) + + +def is_chinese(s='人工智能'): + # Is string composed of any Chinese characters? + return True if re.search('[\u4e00-\u9fff]', str(s)) else False + + +def emojis(str=''): + # Return platform-dependent emoji-safe version of string + return str.encode().decode('ascii', 'ignore') if platform.system() == 'Windows' else str + + +def file_size(path): + # Return file/dir size (MB) + path = Path(path) + if path.is_file(): + return path.stat().st_size / 1E6 + elif path.is_dir(): + return sum(f.stat().st_size for f in path.glob('**/*') if f.is_file()) / 1E6 + else: + return 0.0 + + +def check_online(): + # Check internet connectivity + import socket + try: + socket.create_connection(("1.1.1.1", 443), 5) # check host accessibility + return True + except OSError: + return False + + +@try_except +@WorkingDirectory(ROOT) +def check_git_status(): + # Recommend 'git pull' if code is out of date + msg = ', for updates see https://github.com/ultralytics/yolov5' + s = colorstr('github: ') # string + assert Path('.git').exists(), s + 'skipping check (not a git repository)' + msg + assert not is_docker(), s + 'skipping check (Docker image)' + msg + assert check_online(), s + 'skipping check (offline)' + msg + + cmd = 'git fetch && git config --get remote.origin.url' + url = check_output(cmd, shell=True, timeout=5).decode().strip().rstrip('.git') # git fetch + branch = check_output('git rev-parse --abbrev-ref HEAD', shell=True).decode().strip() # checked out + n = int(check_output(f'git rev-list {branch}..origin/master --count', shell=True)) # commits behind + if n > 0: + s += f"⚠️ YOLOv5 is out of date by {n} commit{'s' * (n > 1)}. Use `git pull` or `git clone {url}` to update." + else: + s += f'up to date with {url} ✅' + LOGGER.info(emojis(s)) # emoji-safe + + +def check_python(minimum='3.6.2'): + # Check current python version vs. required python version + check_version(platform.python_version(), minimum, name='Python ', hard=True) + + +def check_version(current='0.0.0', minimum='0.0.0', name='version ', pinned=False, hard=False, verbose=False): + # Check version vs. required version + current, minimum = (pkg.parse_version(x) for x in (current, minimum)) + result = (current == minimum) if pinned else (current >= minimum) # bool + s = f'{name}{minimum} required by YOLOv5, but {name}{current} is currently installed' # string + if hard: + assert result, s # assert min requirements met + if verbose and not result: + LOGGER.warning(s) + return result + + +@try_except +def check_requirements(requirements=ROOT / 'requirements.txt', exclude=(), install=True): + # Check installed dependencies meet requirements (pass *.txt file or list of packages) + prefix = colorstr('red', 'bold', 'requirements:') + check_python() # check python version + if isinstance(requirements, (str, Path)): # requirements.txt file + file = Path(requirements) + assert file.exists(), f"{prefix} {file.resolve()} not found, check failed." + with file.open() as f: + requirements = [f'{x.name}{x.specifier}' for x in pkg.parse_requirements(f) if x.name not in exclude] + else: # list or tuple of packages + requirements = [x for x in requirements if x not in exclude] + + n = 0 # number of packages updates + for r in requirements: + try: + pkg.require(r) + except Exception: # DistributionNotFound or VersionConflict if requirements not met + s = f"{prefix} {r} not found and is required by YOLOv5" + if install: + LOGGER.info(f"{s}, attempting auto-update...") + try: + assert check_online(), f"'pip install {r}' skipped (offline)" + LOGGER.info(check_output(f"pip install '{r}'", shell=True).decode()) + n += 1 + except Exception as e: + LOGGER.warning(f'{prefix} {e}') + else: + LOGGER.info(f'{s}. Please install and rerun your command.') + + if n: # if packages updated + source = file.resolve() if 'file' in locals() else requirements + s = f"{prefix} {n} package{'s' * (n > 1)} updated per {source}\n" \ + f"{prefix} ⚠️ {colorstr('bold', 'Restart runtime or rerun command for updates to take effect')}\n" + LOGGER.info(emojis(s)) + + +def check_img_size(imgsz, s=32, floor=0): + # Verify image size is a multiple of stride s in each dimension + if isinstance(imgsz, int): # integer i.e. img_size=640 + new_size = max(make_divisible(imgsz, int(s)), floor) + else: # list i.e. img_size=[640, 480] + new_size = [max(make_divisible(x, int(s)), floor) for x in imgsz] + if new_size != imgsz: + LOGGER.warning(f'WARNING: --img-size {imgsz} must be multiple of max stride {s}, updating to {new_size}') + return new_size + + +def check_imshow(): + # Check if environment supports image displays + try: + assert not is_docker(), 'cv2.imshow() is disabled in Docker environments' + assert not is_colab(), 'cv2.imshow() is disabled in Google Colab environments' + cv2.imshow('test', np.zeros((1, 1, 3))) + cv2.waitKey(1) + cv2.destroyAllWindows() + cv2.waitKey(1) + return True + except Exception as e: + LOGGER.warning(f'WARNING: Environment does not support cv2.imshow() or PIL Image.show() image displays\n{e}') + return False + + +def check_suffix(file='yolov5s.pt', suffix=('.pt',), msg=''): + # Check file(s) for acceptable suffix + if file and suffix: + if isinstance(suffix, str): + suffix = [suffix] + for f in file if isinstance(file, (list, tuple)) else [file]: + s = Path(f).suffix.lower() # file suffix + if len(s): + assert s in suffix, f"{msg}{f} acceptable suffix is {suffix}" + + +def check_yaml(file, suffix=('.yaml', '.yml')): + # Search/download YAML file (if necessary) and return path, checking suffix + return check_file(file, suffix) + + +def check_file(file, suffix=''): + # Search/download file (if necessary) and return path + check_suffix(file, suffix) # optional + file = str(file) # convert to str() + if Path(file).is_file() or file == '': # exists + return file + elif file.startswith(('http:/', 'https:/')): # download + url = str(Path(file)).replace(':/', '://') # Pathlib turns :// -> :/ + file = Path(urllib.parse.unquote(file).split('?')[0]).name # '%2F' to '/', split https://url.com/file.txt?auth + if Path(file).is_file(): + LOGGER.info(f'Found {url} locally at {file}') # file already exists + else: + LOGGER.info(f'Downloading {url} to {file}...') + torch.hub.download_url_to_file(url, file) + assert Path(file).exists() and Path(file).stat().st_size > 0, f'File download failed: {url}' # check + return file + else: # search + files = [] + for d in 'data', 'models', 'utils': # search directories + files.extend(glob.glob(str(ROOT / d / '**' / file), recursive=True)) # find file + assert len(files), f'File not found: {file}' # assert file was found + assert len(files) == 1, f"Multiple files match '{file}', specify exact path: {files}" # assert unique + return files[0] # return file + + +def check_font(font=FONT): + # Download font to CONFIG_DIR if necessary + font = Path(font) + if not font.exists() and not (CONFIG_DIR / font.name).exists(): + url = "https://ultralytics.com/assets/" + font.name + LOGGER.info(f'Downloading {url} to {CONFIG_DIR / font.name}...') + torch.hub.download_url_to_file(url, str(font), progress=False) + + +def check_dataset(data, autodownload=True): + # Download and/or unzip dataset if not found locally + # Usage: https://github.com/ultralytics/yolov5/releases/download/v1.0/coco128_with_yaml.zip + + # Download (optional) + extract_dir = '' + if isinstance(data, (str, Path)) and str(data).endswith('.zip'): # i.e. gs://bucket/dir/coco128.zip + download(data, dir=DATASETS_DIR, unzip=True, delete=False, curl=False, threads=1) + data = next((DATASETS_DIR / Path(data).stem).rglob('*.yaml')) + extract_dir, autodownload = data.parent, False + + # Read yaml (optional) + if isinstance(data, (str, Path)): + with open(data, errors='ignore') as f: + data = yaml.safe_load(f) # dictionary + + # Resolve paths + path = Path(extract_dir or data.get('path') or '') # optional 'path' default to '.' + if not path.is_absolute(): + path = (ROOT / path).resolve() + for k in 'train', 'val', 'test': + if data.get(k): # prepend path + data[k] = str(path / data[k]) if isinstance(data[k], str) else [str(path / x) for x in data[k]] + + # Parse yaml + assert 'nc' in data, "Dataset 'nc' key missing." + if 'names' not in data: + data['names'] = [f'class{i}' for i in range(data['nc'])] # assign class names if missing + train, val, test, s = (data.get(x) for x in ('train', 'val', 'test', 'download')) + if val: + val = [Path(x).resolve() for x in (val if isinstance(val, list) else [val])] # val path + if not all(x.exists() for x in val): + LOGGER.info('\nDataset not found, missing paths: %s' % [str(x) for x in val if not x.exists()]) + if s and autodownload: # download script + root = path.parent if 'path' in data else '..' # unzip directory i.e. '../' + if s.startswith('http') and s.endswith('.zip'): # URL + f = Path(s).name # filename + LOGGER.info(f'Downloading {s} to {f}...') + torch.hub.download_url_to_file(s, f) + Path(root).mkdir(parents=True, exist_ok=True) # create root + ZipFile(f).extractall(path=root) # unzip + Path(f).unlink() # remove zip + r = None # success + elif s.startswith('bash '): # bash script + LOGGER.info(f'Running {s} ...') + r = os.system(s) + else: # python script + r = exec(s, {'yaml': data}) # return None + LOGGER.info(f"Dataset autodownload {f'success, saved to {root}' if r in (0, None) else 'failure'}\n") + else: + raise Exception('Dataset not found.') + + return data # dictionary + + +def url2file(url): + # Convert URL to filename, i.e. https://url.com/file.txt?auth -> file.txt + url = str(Path(url)).replace(':/', '://') # Pathlib turns :// -> :/ + file = Path(urllib.parse.unquote(url)).name.split('?')[0] # '%2F' to '/', split https://url.com/file.txt?auth + return file + + +def download(url, dir='.', unzip=True, delete=True, curl=False, threads=1): + # Multi-threaded file download and unzip function, used in data.yaml for autodownload + def download_one(url, dir): + # Download 1 file + f = dir / Path(url).name # filename + if Path(url).is_file(): # exists in current path + Path(url).rename(f) # move to dir + elif not f.exists(): + LOGGER.info(f'Downloading {url} to {f}...') + if curl: + os.system(f"curl -L '{url}' -o '{f}' --retry 9 -C -") # curl download, retry and resume on fail + else: + torch.hub.download_url_to_file(url, f, progress=True) # torch download + if unzip and f.suffix in ('.zip', '.gz'): + LOGGER.info(f'Unzipping {f}...') + if f.suffix == '.zip': + ZipFile(f).extractall(path=dir) # unzip + elif f.suffix == '.gz': + os.system(f'tar xfz {f} --directory {f.parent}') # unzip + if delete: + f.unlink() # remove zip + + dir = Path(dir) + dir.mkdir(parents=True, exist_ok=True) # make directory + if threads > 1: + pool = ThreadPool(threads) + pool.imap(lambda x: download_one(*x), zip(url, repeat(dir))) # multi-threaded + pool.close() + pool.join() + else: + for u in [url] if isinstance(url, (str, Path)) else url: + download_one(u, dir) + + +def make_divisible(x, divisor): + # Returns nearest x divisible by divisor + if isinstance(divisor, torch.Tensor): + divisor = int(divisor.max()) # to int + return math.ceil(x / divisor) * divisor + + +def clean_str(s): + # Cleans a string by replacing special characters with underscore _ + return re.sub(pattern="[|@#!¡·$€%&()=?¿^*;:,¨´><+]", repl="_", string=s) + + +def one_cycle(y1=0.0, y2=1.0, steps=100): + # lambda function for sinusoidal ramp from y1 to y2 https://arxiv.org/pdf/1812.01187.pdf + return lambda x: ((1 - math.cos(x * math.pi / steps)) / 2) * (y2 - y1) + y1 + + +def colorstr(*input): + # Colors a string https://en.wikipedia.org/wiki/ANSI_escape_code, i.e. colorstr('blue', 'hello world') + *args, string = input if len(input) > 1 else ('blue', 'bold', input[0]) # color arguments, string + colors = {'black': '\033[30m', # basic colors + 'red': '\033[31m', + 'green': '\033[32m', + 'yellow': '\033[33m', + 'blue': '\033[34m', + 'magenta': '\033[35m', + 'cyan': '\033[36m', + 'white': '\033[37m', + 'bright_black': '\033[90m', # bright colors + 'bright_red': '\033[91m', + 'bright_green': '\033[92m', + 'bright_yellow': '\033[93m', + 'bright_blue': '\033[94m', + 'bright_magenta': '\033[95m', + 'bright_cyan': '\033[96m', + 'bright_white': '\033[97m', + 'end': '\033[0m', # misc + 'bold': '\033[1m', + 'underline': '\033[4m'} + return ''.join(colors[x] for x in args) + f'{string}' + colors['end'] + + +def labels_to_class_weights(labels, nc=80): + # Get class weights (inverse frequency) from training labels + if labels[0] is None: # no labels loaded + return torch.Tensor() + + labels = np.concatenate(labels, 0) # labels.shape = (866643, 5) for COCO + classes = labels[:, 0].astype(np.int) # labels = [class xywh] + weights = np.bincount(classes, minlength=nc) # occurrences per class + + # Prepend gridpoint count (for uCE training) + # gpi = ((320 / 32 * np.array([1, 2, 4])) ** 2 * 3).sum() # gridpoints per image + # weights = np.hstack([gpi * len(labels) - weights.sum() * 9, weights * 9]) ** 0.5 # prepend gridpoints to start + + weights[weights == 0] = 1 # replace empty bins with 1 + weights = 1 / weights # number of targets per class + weights /= weights.sum() # normalize + return torch.from_numpy(weights) + + +def labels_to_image_weights(labels, nc=80, class_weights=np.ones(80)): + # Produces image weights based on class_weights and image contents + class_counts = np.array([np.bincount(x[:, 0].astype(np.int), minlength=nc) for x in labels]) + image_weights = (class_weights.reshape(1, nc) * class_counts).sum(1) + # index = random.choices(range(n), weights=image_weights, k=1) # weight image sample + return image_weights + + +def coco80_to_coco91_class(): # converts 80-index (val2014) to 91-index (paper) + # https://tech.amikelive.com/node-718/what-object-categories-labels-are-in-coco-dataset/ + # a = np.loadtxt('data/coco.names', dtype='str', delimiter='\n') + # b = np.loadtxt('data/coco_paper.names', dtype='str', delimiter='\n') + # x1 = [list(a[i] == b).index(True) + 1 for i in range(80)] # darknet to coco + # x2 = [list(b[i] == a).index(True) if any(b[i] == a) else None for i in range(91)] # coco to darknet + x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 28, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 67, 70, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 84, 85, 86, 87, 88, 89, 90] + return x + + +def xyxy2xywh(x): + # Convert nx4 boxes from [x1, y1, x2, y2] to [x, y, w, h] where xy1=top-left, xy2=bottom-right + y = x.clone() if isinstance(x, torch.Tensor) else np.copy(x) + y[:, 0] = (x[:, 0] + x[:, 2]) / 2 # x center + y[:, 1] = (x[:, 1] + x[:, 3]) / 2 # y center + y[:, 2] = x[:, 2] - x[:, 0] # width + y[:, 3] = x[:, 3] - x[:, 1] # height + return y + + +def xywh2xyxy(x): + # Convert nx4 boxes from [x, y, w, h] to [x1, y1, x2, y2] where xy1=top-left, xy2=bottom-right + y = x.clone() if isinstance(x, torch.Tensor) else np.copy(x) + y[:, 0] = x[:, 0] - x[:, 2] / 2 # top left x + y[:, 1] = x[:, 1] - x[:, 3] / 2 # top left y + y[:, 2] = x[:, 0] + x[:, 2] / 2 # bottom right x + y[:, 3] = x[:, 1] + x[:, 3] / 2 # bottom right y + return y + + +def xywhn2xyxy(x, w=640, h=640, padw=0, padh=0): + # Convert nx4 boxes from [x, y, w, h] normalized to [x1, y1, x2, y2] where xy1=top-left, xy2=bottom-right + y = x.clone() if isinstance(x, torch.Tensor) else np.copy(x) + y[:, 0] = w * (x[:, 0] - x[:, 2] / 2) + padw # top left x + y[:, 1] = h * (x[:, 1] - x[:, 3] / 2) + padh # top left y + y[:, 2] = w * (x[:, 0] + x[:, 2] / 2) + padw # bottom right x + y[:, 3] = h * (x[:, 1] + x[:, 3] / 2) + padh # bottom right y + return y + + +def xyxy2xywhn(x, w=640, h=640, clip=False, eps=0.0): + # Convert nx4 boxes from [x1, y1, x2, y2] to [x, y, w, h] normalized where xy1=top-left, xy2=bottom-right + if clip: + clip_coords(x, (h - eps, w - eps)) # warning: inplace clip + y = x.clone() if isinstance(x, torch.Tensor) else np.copy(x) + y[:, 0] = ((x[:, 0] + x[:, 2]) / 2) / w # x center + y[:, 1] = ((x[:, 1] + x[:, 3]) / 2) / h # y center + y[:, 2] = (x[:, 2] - x[:, 0]) / w # width + y[:, 3] = (x[:, 3] - x[:, 1]) / h # height + return y + + +def xyn2xy(x, w=640, h=640, padw=0, padh=0): + # Convert normalized segments into pixel segments, shape (n,2) + y = x.clone() if isinstance(x, torch.Tensor) else np.copy(x) + y[:, 0] = w * x[:, 0] + padw # top left x + y[:, 1] = h * x[:, 1] + padh # top left y + return y + + +def segment2box(segment, width=640, height=640): + # Convert 1 segment label to 1 box label, applying inside-image constraint, i.e. (xy1, xy2, ...) to (xyxy) + x, y = segment.T # segment xy + inside = (x >= 0) & (y >= 0) & (x <= width) & (y <= height) + x, y, = x[inside], y[inside] + return np.array([x.min(), y.min(), x.max(), y.max()]) if any(x) else np.zeros((1, 4)) # xyxy + + +def segments2boxes(segments): + # Convert segment labels to box labels, i.e. (cls, xy1, xy2, ...) to (cls, xywh) + boxes = [] + for s in segments: + x, y = s.T # segment xy + boxes.append([x.min(), y.min(), x.max(), y.max()]) # cls, xyxy + return xyxy2xywh(np.array(boxes)) # cls, xywh + + +def resample_segments(segments, n=1000): + # Up-sample an (n,2) segment + for i, s in enumerate(segments): + x = np.linspace(0, len(s) - 1, n) + xp = np.arange(len(s)) + segments[i] = np.concatenate([np.interp(x, xp, s[:, i]) for i in range(2)]).reshape(2, -1).T # segment xy + return segments + + +def scale_coords(img1_shape, coords, img0_shape, ratio_pad=None): + # Rescale coords (xyxy) from img1_shape to img0_shape + if ratio_pad is None: # calculate from img0_shape + gain = min(img1_shape[0] / img0_shape[0], img1_shape[1] / img0_shape[1]) # gain = old / new + pad = (img1_shape[1] - img0_shape[1] * gain) / 2, (img1_shape[0] - img0_shape[0] * gain) / 2 # wh padding + else: + gain = ratio_pad[0][0] + pad = ratio_pad[1] + + coords[:, [0, 2]] -= pad[0] # x padding + coords[:, [1, 3]] -= pad[1] # y padding + coords[:, :4] /= gain + clip_coords(coords, img0_shape) + return coords + + +def clip_coords(boxes, shape): + # Clip bounding xyxy bounding boxes to image shape (height, width) + if isinstance(boxes, torch.Tensor): # faster individually + boxes[:, 0].clamp_(0, shape[1]) # x1 + boxes[:, 1].clamp_(0, shape[0]) # y1 + boxes[:, 2].clamp_(0, shape[1]) # x2 + boxes[:, 3].clamp_(0, shape[0]) # y2 + else: # np.array (faster grouped) + boxes[:, [0, 2]] = boxes[:, [0, 2]].clip(0, shape[1]) # x1, x2 + boxes[:, [1, 3]] = boxes[:, [1, 3]].clip(0, shape[0]) # y1, y2 + + +def non_max_suppression(prediction, conf_thres=0.25, iou_thres=0.45, classes=None, agnostic=False, multi_label=False, + labels=(), max_det=300): + """Runs Non-Maximum Suppression (NMS) on inference results + + Returns: + list of detections, on (n,6) tensor per image [xyxy, conf, cls] + """ + + nc = prediction.shape[2] - 5 # number of classes + xc = prediction[..., 4] > conf_thres # candidates + + # Checks + assert 0 <= conf_thres <= 1, f'Invalid Confidence threshold {conf_thres}, valid values are between 0.0 and 1.0' + assert 0 <= iou_thres <= 1, f'Invalid IoU {iou_thres}, valid values are between 0.0 and 1.0' + + # Settings + min_wh, max_wh = 2, 7680 # (pixels) minimum and maximum box width and height + max_nms = 30000 # maximum number of boxes into torchvision.ops.nms() + time_limit = 10.0 # seconds to quit after + redundant = True # require redundant detections + multi_label &= nc > 1 # multiple labels per box (adds 0.5ms/img) + merge = False # use merge-NMS + + t = time.time() + output = [torch.zeros((0, 6), device=prediction.device)] * prediction.shape[0] + for xi, x in enumerate(prediction): # image index, image inference + # Apply constraints + x[((x[..., 2:4] < min_wh) | (x[..., 2:4] > max_wh)).any(1), 4] = 0 # width-height + x = x[xc[xi]] # confidence + + # Cat apriori labels if autolabelling + if labels and len(labels[xi]): + lb = labels[xi] + v = torch.zeros((len(lb), nc + 5), device=x.device) + v[:, :4] = lb[:, 1:5] # box + v[:, 4] = 1.0 # conf + v[range(len(lb)), lb[:, 0].long() + 5] = 1.0 # cls + x = torch.cat((x, v), 0) + + # If none remain process next image + if not x.shape[0]: + continue + + # Compute conf + x[:, 5:] *= x[:, 4:5] # conf = obj_conf * cls_conf + + # Box (center x, center y, width, height) to (x1, y1, x2, y2) + box = xywh2xyxy(x[:, :4]) + + # Detections matrix nx6 (xyxy, conf, cls) + if multi_label: + i, j = (x[:, 5:] > conf_thres).nonzero(as_tuple=False).T + x = torch.cat((box[i], x[i, j + 5, None], j[:, None].float()), 1) + else: # best class only + conf, j = x[:, 5:].max(1, keepdim=True) + x = torch.cat((box, conf, j.float()), 1)[conf.view(-1) > conf_thres] + + # Filter by class + if classes is not None: + x = x[(x[:, 5:6] == torch.tensor(classes, device=x.device)).any(1)] + + # Apply finite constraint + # if not torch.isfinite(x).all(): + # x = x[torch.isfinite(x).all(1)] + + # Check shape + n = x.shape[0] # number of boxes + if not n: # no boxes + continue + elif n > max_nms: # excess boxes + x = x[x[:, 4].argsort(descending=True)[:max_nms]] # sort by confidence + + # Batched NMS + c = x[:, 5:6] * (0 if agnostic else max_wh) # classes + boxes, scores = x[:, :4] + c, x[:, 4] # boxes (offset by class), scores + i = torchvision.ops.nms(boxes, scores, iou_thres) # NMS + if i.shape[0] > max_det: # limit detections + i = i[:max_det] + if merge and (1 < n < 3E3): # Merge NMS (boxes merged using weighted mean) + # update boxes as boxes(i,4) = weights(i,n) * boxes(n,4) + iou = box_iou(boxes[i], boxes) > iou_thres # iou matrix + weights = iou * scores[None] # box weights + x[i, :4] = torch.mm(weights, x[:, :4]).float() / weights.sum(1, keepdim=True) # merged boxes + if redundant: + i = i[iou.sum(1) > 1] # require redundancy + + output[xi] = x[i] + if (time.time() - t) > time_limit: + LOGGER.warning(f'WARNING: NMS time limit {time_limit}s exceeded') + break # time limit exceeded + + return output + + +def strip_optimizer(f='best.pt', s=''): # from utils.general import *; strip_optimizer() + # Strip optimizer from 'f' to finalize training, optionally save as 's' + x = torch.load(f, map_location=torch.device('cpu')) + if x.get('ema'): + x['model'] = x['ema'] # replace model with ema + for k in 'optimizer', 'best_fitness', 'wandb_id', 'ema', 'updates': # keys + x[k] = None + x['epoch'] = -1 + x['model'].half() # to FP16 + for p in x['model'].parameters(): + p.requires_grad = False + torch.save(x, s or f) + mb = os.path.getsize(s or f) / 1E6 # filesize + LOGGER.info(f"Optimizer stripped from {f},{(' saved as %s,' % s) if s else ''} {mb:.1f}MB") + + +def print_mutation(results, hyp, save_dir, bucket, prefix=colorstr('evolve: ')): + evolve_csv = save_dir / 'evolve.csv' + evolve_yaml = save_dir / 'hyp_evolve.yaml' + keys = ('metrics/precision', 'metrics/recall', 'metrics/mAP_0.5', 'metrics/mAP_0.5:0.95', + 'val/box_loss', 'val/obj_loss', 'val/cls_loss') + tuple(hyp.keys()) # [results + hyps] + keys = tuple(x.strip() for x in keys) + vals = results + tuple(hyp.values()) + n = len(keys) + + # Download (optional) + if bucket: + url = f'gs://{bucket}/evolve.csv' + if gsutil_getsize(url) > (evolve_csv.stat().st_size if evolve_csv.exists() else 0): + os.system(f'gsutil cp {url} {save_dir}') # download evolve.csv if larger than local + + # Log to evolve.csv + s = '' if evolve_csv.exists() else (('%20s,' * n % keys).rstrip(',') + '\n') # add header + with open(evolve_csv, 'a') as f: + f.write(s + ('%20.5g,' * n % vals).rstrip(',') + '\n') + + # Save yaml + with open(evolve_yaml, 'w') as f: + data = pd.read_csv(evolve_csv) + data = data.rename(columns=lambda x: x.strip()) # strip keys + i = np.argmax(fitness(data.values[:, :4])) # + generations = len(data) + f.write('# YOLOv5 Hyperparameter Evolution Results\n' + + f'# Best generation: {i}\n' + + f'# Last generation: {generations - 1}\n' + + '# ' + ', '.join(f'{x.strip():>20s}' for x in keys[:7]) + '\n' + + '# ' + ', '.join(f'{x:>20.5g}' for x in data.values[i, :7]) + '\n\n') + yaml.safe_dump(data.loc[i][7:].to_dict(), f, sort_keys=False) + + # Print to screen + LOGGER.info(prefix + f'{generations} generations finished, current result:\n' + + prefix + ', '.join(f'{x.strip():>20s}' for x in keys) + '\n' + + prefix + ', '.join(f'{x:20.5g}' for x in vals) + '\n\n') + + if bucket: + os.system(f'gsutil cp {evolve_csv} {evolve_yaml} gs://{bucket}') # upload + + +def apply_classifier(x, model, img, im0): + # Apply a second stage classifier to YOLO outputs + # Example model = torchvision.models.__dict__['efficientnet_b0'](pretrained=True).to(device).eval() + im0 = [im0] if isinstance(im0, np.ndarray) else im0 + for i, d in enumerate(x): # per image + if d is not None and len(d): + d = d.clone() + + # Reshape and pad cutouts + b = xyxy2xywh(d[:, :4]) # boxes + b[:, 2:] = b[:, 2:].max(1)[0].unsqueeze(1) # rectangle to square + b[:, 2:] = b[:, 2:] * 1.3 + 30 # pad + d[:, :4] = xywh2xyxy(b).long() + + # Rescale boxes from img_size to im0 size + scale_coords(img.shape[2:], d[:, :4], im0[i].shape) + + # Classes + pred_cls1 = d[:, 5].long() + ims = [] + for j, a in enumerate(d): # per item + cutout = im0[i][int(a[1]):int(a[3]), int(a[0]):int(a[2])] + im = cv2.resize(cutout, (224, 224)) # BGR + # cv2.imwrite('example%i.jpg' % j, cutout) + + im = im[:, :, ::-1].transpose(2, 0, 1) # BGR to RGB, to 3x416x416 + im = np.ascontiguousarray(im, dtype=np.float32) # uint8 to float32 + im /= 255 # 0 - 255 to 0.0 - 1.0 + ims.append(im) + + pred_cls2 = model(torch.Tensor(ims).to(d.device)).argmax(1) # classifier prediction + x[i] = x[i][pred_cls1 == pred_cls2] # retain matching class detections + + return x + + +def increment_path(path, exist_ok=False, sep='', mkdir=False): + # Increment file or directory path, i.e. runs/exp --> runs/exp{sep}2, runs/exp{sep}3, ... etc. + path = Path(path) # os-agnostic + if path.exists() and not exist_ok: + path, suffix = (path.with_suffix(''), path.suffix) if path.is_file() else (path, '') + dirs = glob.glob(f"{path}{sep}*") # similar paths + matches = [re.search(rf"%s{sep}(\d+)" % path.stem, d) for d in dirs] + i = [int(m.groups()[0]) for m in matches if m] # indices + n = max(i) + 1 if i else 2 # increment number + path = Path(f"{path}{sep}{n}{suffix}") # increment path + if mkdir: + path.mkdir(parents=True, exist_ok=True) # make directory + return path + + +# Variables +NCOLS = 0 if is_docker() else shutil.get_terminal_size().columns # terminal window size for tqdm diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/google_app_engine/Dockerfile b/python/contrib/YOLOv5driver_assistant_system/utils/google_app_engine/Dockerfile new file mode 100644 index 000000000..0155618f4 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/utils/google_app_engine/Dockerfile @@ -0,0 +1,25 @@ +FROM gcr.io/google-appengine/python + +# Create a virtualenv for dependencies. This isolates these packages from +# system-level packages. +# Use -p python3 or -p python3.7 to select python version. Default is version 2. +RUN virtualenv /env -p python3 + +# Setting these environment variables are the same as running +# source /env/bin/activate. +ENV VIRTUAL_ENV /env +ENV PATH /env/bin:$PATH + +RUN apt-get update && apt-get install -y python-opencv + +# Copy the application's requirements.txt and run pip to install all +# dependencies into the virtualenv. +ADD requirements.txt /app/requirements.txt +RUN pip install -r /app/requirements.txt + +# Add the application source code. +ADD . /app + +# Run a WSGI server to serve the application. gunicorn must be declared as +# a dependency in requirements.txt. +CMD gunicorn -b :$PORT main:app diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/google_app_engine/additional_requirements.txt b/python/contrib/YOLOv5driver_assistant_system/utils/google_app_engine/additional_requirements.txt new file mode 100644 index 000000000..42d7ffc0e --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/utils/google_app_engine/additional_requirements.txt @@ -0,0 +1,4 @@ +# add these requirements in your app on top of the existing ones +pip==21.1 +Flask==1.0.2 +gunicorn==19.9.0 diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/google_app_engine/app.yaml b/python/contrib/YOLOv5driver_assistant_system/utils/google_app_engine/app.yaml new file mode 100644 index 000000000..5056b7c11 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/utils/google_app_engine/app.yaml @@ -0,0 +1,14 @@ +runtime: custom +env: flex + +service: yolov5app + +liveness_check: + initial_delay_sec: 600 + +manual_scaling: + instances: 1 +resources: + cpu: 1 + memory_gb: 4 + disk_size_gb: 20 diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/loggers/__init__.py b/python/contrib/YOLOv5driver_assistant_system/utils/loggers/__init__.py new file mode 100644 index 000000000..86ccf3844 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/utils/loggers/__init__.py @@ -0,0 +1,168 @@ +# YOLOv5 🚀 by Ultralytics, GPL-3.0 license +""" +Logging utils +""" + +import os +import warnings +from threading import Thread + +import pkg_resources as pkg +import torch +from torch.utils.tensorboard import SummaryWriter + +from utils.general import colorstr, emojis +from utils.loggers.wandb.wandb_utils import WandbLogger +from utils.plots import plot_images, plot_results +from utils.torch_utils import de_parallel + +LOGGERS = ('csv', 'tb', 'wandb') # text-file, TensorBoard, Weights & Biases +RANK = int(os.getenv('RANK', -1)) + +try: + import wandb + + assert hasattr(wandb, '__version__') # verify package import not local dir + if pkg.parse_version(wandb.__version__) >= pkg.parse_version('0.12.2') and RANK in [0, -1]: + try: + wandb_login_success = wandb.login(timeout=30) + except wandb.errors.UsageError: # known non-TTY terminal issue + wandb_login_success = False + if not wandb_login_success: + wandb = None +except (ImportError, AssertionError): + wandb = None + + +class Loggers(): + # YOLOv5 Loggers class + def __init__(self, save_dir=None, weights=None, opt=None, hyp=None, logger=None, include=LOGGERS): + self.save_dir = save_dir + self.weights = weights + self.opt = opt + self.hyp = hyp + self.logger = logger # for printing results to console + self.include = include + self.keys = ['train/box_loss', 'train/obj_loss', 'train/cls_loss', # train loss + 'metrics/precision', 'metrics/recall', 'metrics/mAP_0.5', 'metrics/mAP_0.5:0.95', # metrics + 'val/box_loss', 'val/obj_loss', 'val/cls_loss', # val loss + 'x/lr0', 'x/lr1', 'x/lr2'] # params + self.best_keys = ['best/epoch', 'best/precision', 'best/recall', 'best/mAP_0.5', 'best/mAP_0.5:0.95',] + for k in LOGGERS: + setattr(self, k, None) # init empty logger dictionary + self.csv = True # always log to csv + + # Message + if not wandb: + prefix = colorstr('Weights & Biases: ') + s = f"{prefix}run 'pip install wandb' to automatically track and visualize YOLOv5 🚀 runs (RECOMMENDED)" + print(emojis(s)) + + # TensorBoard + s = self.save_dir + if 'tb' in self.include and not self.opt.evolve: + prefix = colorstr('TensorBoard: ') + self.logger.info(f"{prefix}Start with 'tensorboard --logdir {s.parent}', view at http://localhost:6006/") + self.tb = SummaryWriter(str(s)) + + # W&B + if wandb and 'wandb' in self.include: + wandb_artifact_resume = isinstance(self.opt.resume, str) and self.opt.resume.startswith('wandb-artifact://') + run_id = torch.load(self.weights).get('wandb_id') if self.opt.resume and not wandb_artifact_resume else None + self.opt.hyp = self.hyp # add hyperparameters + self.wandb = WandbLogger(self.opt, run_id) + else: + self.wandb = None + + def on_pretrain_routine_end(self): + # Callback runs on pre-train routine end + paths = self.save_dir.glob('*labels*.jpg') # training labels + if self.wandb: + self.wandb.log({"Labels": [wandb.Image(str(x), caption=x.name) for x in paths]}) + + def on_train_batch_end(self, ni, model, imgs, targets, paths, plots, sync_bn): + # Callback runs on train batch end + if plots: + if ni == 0: + if not sync_bn: # tb.add_graph() --sync known issue https://github.com/ultralytics/yolov5/issues/3754 + with warnings.catch_warnings(): + warnings.simplefilter('ignore') # suppress jit trace warning + self.tb.add_graph(torch.jit.trace(de_parallel(model), imgs[0:1], strict=False), []) + if ni < 3: + f = self.save_dir / f'train_batch{ni}.jpg' # filename + Thread(target=plot_images, args=(imgs, targets, paths, f), daemon=True).start() + if self.wandb and ni == 10: + files = sorted(self.save_dir.glob('train*.jpg')) + self.wandb.log({'Mosaics': [wandb.Image(str(f), caption=f.name) for f in files if f.exists()]}) + + def on_train_epoch_end(self, epoch): + # Callback runs on train epoch end + if self.wandb: + self.wandb.current_epoch = epoch + 1 + + def on_val_image_end(self, pred, predn, path, names, im): + # Callback runs on val image end + if self.wandb: + self.wandb.val_one_image(pred, predn, path, names, im) + + def on_val_end(self): + # Callback runs on val end + if self.wandb: + files = sorted(self.save_dir.glob('val*.jpg')) + self.wandb.log({"Validation": [wandb.Image(str(f), caption=f.name) for f in files]}) + + def on_fit_epoch_end(self, vals, epoch, best_fitness, fi): + # Callback runs at the end of each fit (train+val) epoch + x = {k: v for k, v in zip(self.keys, vals)} # dict + if self.csv: + file = self.save_dir / 'results.csv' + n = len(x) + 1 # number of cols + s = '' if file.exists() else (('%20s,' * n % tuple(['epoch'] + self.keys)).rstrip(',') + '\n') # add header + with open(file, 'a') as f: + f.write(s + ('%20.5g,' * n % tuple([epoch] + vals)).rstrip(',') + '\n') + + if self.tb: + for k, v in x.items(): + self.tb.add_scalar(k, v, epoch) + + if self.wandb: + if best_fitness == fi: + best_results = [epoch] + vals[3:7] + for i, name in enumerate(self.best_keys): + self.wandb.wandb_run.summary[name] = best_results[i] # log best results in the summary + self.wandb.log(x) + self.wandb.end_epoch(best_result=best_fitness == fi) + + def on_model_save(self, last, epoch, final_epoch, best_fitness, fi): + # Callback runs on model save event + if self.wandb: + if ((epoch + 1) % self.opt.save_period == 0 and not final_epoch) and self.opt.save_period != -1: + self.wandb.log_model(last.parent, self.opt, epoch, fi, best_model=best_fitness == fi) + + def on_train_end(self, last, best, plots, epoch, results): + # Callback runs on training end + if plots: + plot_results(file=self.save_dir / 'results.csv') # save results.png + files = ['results.png', 'confusion_matrix.png', *(f'{x}_curve.png' for x in ('F1', 'PR', 'P', 'R'))] + files = [(self.save_dir / f) for f in files if (self.save_dir / f).exists()] # filter + + if self.tb: + import cv2 + for f in files: + self.tb.add_image(f.stem, cv2.imread(str(f))[..., ::-1], epoch, dataformats='HWC') + + if self.wandb: + self.wandb.log({k: v for k, v in zip(self.keys[3:10], results)}) # log best.pt val results + self.wandb.log({"Results": [wandb.Image(str(f), caption=f.name) for f in files]}) + # Calling wandb.log. TODO: Refactor this into WandbLogger.log_model + if not self.opt.evolve: + wandb.log_artifact(str(best if best.exists() else last), type='model', + name='run_' + self.wandb.wandb_run.id + '_model', + aliases=['latest', 'best', 'stripped']) + self.wandb.finish_run() + + def on_params_update(self, params): + # Update hyperparams or configs of the experiment + # params: A dict containing {param: value} pairs + if self.wandb: + self.wandb.wandb_run.config.update(params, allow_val_change=True) diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/loggers/wandb/README.md b/python/contrib/YOLOv5driver_assistant_system/utils/loggers/wandb/README.md new file mode 100644 index 000000000..63d999859 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/utils/loggers/wandb/README.md @@ -0,0 +1,152 @@ +📚 This guide explains how to use **Weights & Biases** (W&B) with YOLOv5 🚀. UPDATED 29 September 2021. +* [About Weights & Biases](#about-weights-&-biases) +* [First-Time Setup](#first-time-setup) +* [Viewing runs](#viewing-runs) +* [Disabling wandb](#disabling-wandb) +* [Advanced Usage: Dataset Versioning and Evaluation](#advanced-usage) +* [Reports: Share your work with the world!](#reports) + +## About Weights & Biases +Think of [W&B](https://wandb.ai/site?utm_campaign=repo_yolo_wandbtutorial) like GitHub for machine learning models. With a few lines of code, save everything you need to debug, compare and reproduce your models — architecture, hyperparameters, git commits, model weights, GPU usage, and even datasets and predictions. + +Used by top researchers including teams at OpenAI, Lyft, Github, and MILA, W&B is part of the new standard of best practices for machine learning. How W&B can help you optimize your machine learning workflows: + + * [Debug](https://wandb.ai/wandb/getting-started/reports/Visualize-Debug-Machine-Learning-Models--VmlldzoyNzY5MDk#Free-2) model performance in real time + * [GPU usage](https://wandb.ai/wandb/getting-started/reports/Visualize-Debug-Machine-Learning-Models--VmlldzoyNzY5MDk#System-4) visualized automatically + * [Custom charts](https://wandb.ai/wandb/customizable-charts/reports/Powerful-Custom-Charts-To-Debug-Model-Peformance--VmlldzoyNzY4ODI) for powerful, extensible visualization + * [Share insights](https://wandb.ai/wandb/getting-started/reports/Visualize-Debug-Machine-Learning-Models--VmlldzoyNzY5MDk#Share-8) interactively with collaborators + * [Optimize hyperparameters](https://docs.wandb.com/sweeps) efficiently + * [Track](https://docs.wandb.com/artifacts) datasets, pipelines, and production models + +## First-Time Setup +
+ Toggle Details +When you first train, W&B will prompt you to create a new account and will generate an **API key** for you. If you are an existing user you can retrieve your key from https://wandb.ai/authorize. This key is used to tell W&B where to log your data. You only need to supply your key once, and then it is remembered on the same device. + +W&B will create a cloud **project** (default is 'YOLOv5') for your training runs, and each new training run will be provided a unique run **name** within that project as project/name. You can also manually set your project and run name as: + + ```shell + $ python train.py --project ... --name ... + ``` + +YOLOv5 notebook example: Open In Colab Open In Kaggle +Screen Shot 2021-09-29 at 10 23 13 PM + + +
+ +## Viewing Runs +
+ Toggle Details +Run information streams from your environment to the W&B cloud console as you train. This allows you to monitor and even cancel runs in realtime . All important information is logged: + + * Training & Validation losses + * Metrics: Precision, Recall, mAP@0.5, mAP@0.5:0.95 + * Learning Rate over time + * A bounding box debugging panel, showing the training progress over time + * GPU: Type, **GPU Utilization**, power, temperature, **CUDA memory usage** + * System: Disk I/0, CPU utilization, RAM memory usage + * Your trained model as W&B Artifact + * Environment: OS and Python types, Git repository and state, **training command** + +

Weights & Biases dashboard

+
+ + ## Disabling wandb +* training after running `wandb disabled` inside that directory creates no wandb run +![Screenshot (84)](https://user-images.githubusercontent.com/15766192/143441777-c780bdd7-7cb4-4404-9559-b4316030a985.png) + +* To enable wandb again, run `wandb online` +![Screenshot (85)](https://user-images.githubusercontent.com/15766192/143441866-7191b2cb-22f0-4e0f-ae64-2dc47dc13078.png) + +## Advanced Usage +You can leverage W&B artifacts and Tables integration to easily visualize and manage your datasets, models and training evaluations. Here are some quick examples to get you started. +
+

1: Train and Log Evaluation simultaneousy

+ This is an extension of the previous section, but it'll also training after uploading the dataset. This also evaluation Table + Evaluation table compares your predictions and ground truths across the validation set for each epoch. It uses the references to the already uploaded datasets, + so no images will be uploaded from your system more than once. +
+ Usage + Code $ python train.py --upload_data val + +![Screenshot from 2021-11-21 17-40-06](https://user-images.githubusercontent.com/15766192/142761183-c1696d8c-3f38-45ab-991a-bb0dfd98ae7d.png) +
+ +

2. Visualize and Version Datasets

+ Log, visualize, dynamically query, and understand your data with W&B Tables. You can use the following command to log your dataset as a W&B Table. This will generate a {dataset}_wandb.yaml file which can be used to train from dataset artifact. +
+ Usage + Code $ python utils/logger/wandb/log_dataset.py --project ... --name ... --data .. + + ![Screenshot (64)](https://user-images.githubusercontent.com/15766192/128486078-d8433890-98a3-4d12-8986-b6c0e3fc64b9.png) +
+ +

3: Train using dataset artifact

+ When you upload a dataset as described in the first section, you get a new config file with an added `_wandb` to its name. This file contains the information that + can be used to train a model directly from the dataset artifact. This also logs evaluation +
+ Usage + Code $ python train.py --data {data}_wandb.yaml + +![Screenshot (72)](https://user-images.githubusercontent.com/15766192/128979739-4cf63aeb-a76f-483f-8861-1c0100b938a5.png) +
+ +

4: Save model checkpoints as artifacts

+ To enable saving and versioning checkpoints of your experiment, pass `--save_period n` with the base cammand, where `n` represents checkpoint interval. + You can also log both the dataset and model checkpoints simultaneously. If not passed, only the final model will be logged + +
+ Usage + Code $ python train.py --save_period 1 + +![Screenshot (68)](https://user-images.githubusercontent.com/15766192/128726138-ec6c1f60-639d-437d-b4ee-3acd9de47ef3.png) +
+ +
+ +

5: Resume runs from checkpoint artifacts.

+Any run can be resumed using artifacts if the --resume argument starts with wandb-artifact:// prefix followed by the run path, i.e, wandb-artifact://username/project/runid . This doesn't require the model checkpoint to be present on the local system. + +
+ Usage + Code $ python train.py --resume wandb-artifact://{run_path} + +![Screenshot (70)](https://user-images.githubusercontent.com/15766192/128728988-4e84b355-6c87-41ae-a591-14aecf45343e.png) +
+ +

6: Resume runs from dataset artifact & checkpoint artifacts.

+ Local dataset or model checkpoints are not required. This can be used to resume runs directly on a different device + The syntax is same as the previous section, but you'll need to lof both the dataset and model checkpoints as artifacts, i.e, set bot --upload_dataset or + train from _wandb.yaml file and set --save_period + +
+ Usage + Code $ python train.py --resume wandb-artifact://{run_path} + +![Screenshot (70)](https://user-images.githubusercontent.com/15766192/128728988-4e84b355-6c87-41ae-a591-14aecf45343e.png) +
+ + + +

Reports

+W&B Reports can be created from your saved runs for sharing online. Once a report is created you will receive a link you can use to publically share your results. Here is an example report created from the COCO128 tutorial trainings of all four YOLOv5 models ([link](https://wandb.ai/glenn-jocher/yolov5_tutorial/reports/YOLOv5-COCO128-Tutorial-Results--VmlldzozMDI5OTY)). + +Weights & Biases Reports + + +## Environments + +YOLOv5 may be run in any of the following up-to-date verified environments (with all dependencies including [CUDA](https://developer.nvidia.com/cuda)/[CUDNN](https://developer.nvidia.com/cudnn), [Python](https://www.python.org/) and [PyTorch](https://pytorch.org/) preinstalled): + +- **Google Colab and Kaggle** notebooks with free GPU: Open In Colab Open In Kaggle +- **Google Cloud** Deep Learning VM. See [GCP Quickstart Guide](https://github.com/ultralytics/yolov5/wiki/GCP-Quickstart) +- **Amazon** Deep Learning AMI. See [AWS Quickstart Guide](https://github.com/ultralytics/yolov5/wiki/AWS-Quickstart) +- **Docker Image**. See [Docker Quickstart Guide](https://github.com/ultralytics/yolov5/wiki/Docker-Quickstart) Docker Pulls + + +## Status + +![CI CPU testing](https://github.com/ultralytics/yolov5/workflows/CI%20CPU%20testing/badge.svg) + +If this badge is green, all [YOLOv5 GitHub Actions](https://github.com/ultralytics/yolov5/actions) Continuous Integration (CI) tests are currently passing. CI tests verify correct operation of YOLOv5 training ([train.py](https://github.com/ultralytics/yolov5/blob/master/train.py)), validation ([val.py](https://github.com/ultralytics/yolov5/blob/master/val.py)), inference ([detect.py](https://github.com/ultralytics/yolov5/blob/master/detect.py)) and export ([export.py](https://github.com/ultralytics/yolov5/blob/master/export.py)) on MacOS, Windows, and Ubuntu every 24 hours and on every commit. diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/loggers/wandb/__init__.py b/python/contrib/YOLOv5driver_assistant_system/utils/loggers/wandb/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/loggers/wandb/log_dataset.py b/python/contrib/YOLOv5driver_assistant_system/utils/loggers/wandb/log_dataset.py new file mode 100644 index 000000000..06e81fb69 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/utils/loggers/wandb/log_dataset.py @@ -0,0 +1,27 @@ +import argparse + +from wandb_utils import WandbLogger + +from utils.general import LOGGER + +WANDB_ARTIFACT_PREFIX = 'wandb-artifact://' + + +def create_dataset_artifact(opt): + logger = WandbLogger(opt, None, job_type='Dataset Creation') # TODO: return value unused + if not logger.wandb: + LOGGER.info("install wandb using `pip install wandb` to log the dataset") + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--data', type=str, default='data/coco128.yaml', help='data.yaml path') + parser.add_argument('--single-cls', action='store_true', help='train as single-class dataset') + parser.add_argument('--project', type=str, default='YOLOv5', help='name of W&B Project') + parser.add_argument('--entity', default=None, help='W&B entity') + parser.add_argument('--name', type=str, default='log dataset', help='name of W&B run') + + opt = parser.parse_args() + opt.resume = False # Explicitly disallow resume check for dataset upload job + + create_dataset_artifact(opt) diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/loggers/wandb/sweep.py b/python/contrib/YOLOv5driver_assistant_system/utils/loggers/wandb/sweep.py new file mode 100644 index 000000000..206059bc3 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/utils/loggers/wandb/sweep.py @@ -0,0 +1,41 @@ +import sys +from pathlib import Path + +import wandb + +FILE = Path(__file__).resolve() +ROOT = FILE.parents[3] # YOLOv5 root directory +if str(ROOT) not in sys.path: + sys.path.append(str(ROOT)) # add ROOT to PATH + +from train import parse_opt, train +from utils.callbacks import Callbacks +from utils.general import increment_path +from utils.torch_utils import select_device + + +def sweep(): + wandb.init() + # Get hyp dict from sweep agent + hyp_dict = vars(wandb.config).get("_items") + + # Workaround: get necessary opt args + opt = parse_opt(known=True) + opt.batch_size = hyp_dict.get("batch_size") + opt.save_dir = str(increment_path(Path(opt.project) / opt.name, exist_ok=opt.exist_ok or opt.evolve)) + opt.epochs = hyp_dict.get("epochs") + opt.nosave = True + opt.data = hyp_dict.get("data") + opt.weights = str(opt.weights) + opt.cfg = str(opt.cfg) + opt.data = str(opt.data) + opt.hyp = str(opt.hyp) + opt.project = str(opt.project) + device = select_device(opt.device, batch_size=opt.batch_size) + + # train + train(hyp_dict, opt, device, callbacks=Callbacks()) + + +if __name__ == "__main__": + sweep() diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/loggers/wandb/sweep.yaml b/python/contrib/YOLOv5driver_assistant_system/utils/loggers/wandb/sweep.yaml new file mode 100644 index 000000000..c7790d75f --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/utils/loggers/wandb/sweep.yaml @@ -0,0 +1,143 @@ +# Hyperparameters for training +# To set range- +# Provide min and max values as: +# parameter: +# +# min: scalar +# max: scalar +# OR +# +# Set a specific list of search space- +# parameter: +# values: [scalar1, scalar2, scalar3...] +# +# You can use grid, bayesian and hyperopt search strategy +# For more info on configuring sweeps visit - https://docs.wandb.ai/guides/sweeps/configuration + +program: utils/loggers/wandb/sweep.py +method: random +metric: + name: metrics/mAP_0.5 + goal: maximize + +parameters: + # hyperparameters: set either min, max range or values list + data: + value: "data/coco128.yaml" + batch_size: + values: [64] + epochs: + values: [10] + + lr0: + distribution: uniform + min: 1e-5 + max: 1e-1 + lrf: + distribution: uniform + min: 0.01 + max: 1.0 + momentum: + distribution: uniform + min: 0.6 + max: 0.98 + weight_decay: + distribution: uniform + min: 0.0 + max: 0.001 + warmup_epochs: + distribution: uniform + min: 0.0 + max: 5.0 + warmup_momentum: + distribution: uniform + min: 0.0 + max: 0.95 + warmup_bias_lr: + distribution: uniform + min: 0.0 + max: 0.2 + box: + distribution: uniform + min: 0.02 + max: 0.2 + cls: + distribution: uniform + min: 0.2 + max: 4.0 + cls_pw: + distribution: uniform + min: 0.5 + max: 2.0 + obj: + distribution: uniform + min: 0.2 + max: 4.0 + obj_pw: + distribution: uniform + min: 0.5 + max: 2.0 + iou_t: + distribution: uniform + min: 0.1 + max: 0.7 + anchor_t: + distribution: uniform + min: 2.0 + max: 8.0 + fl_gamma: + distribution: uniform + min: 0.0 + max: 0.1 + hsv_h: + distribution: uniform + min: 0.0 + max: 0.1 + hsv_s: + distribution: uniform + min: 0.0 + max: 0.9 + hsv_v: + distribution: uniform + min: 0.0 + max: 0.9 + degrees: + distribution: uniform + min: 0.0 + max: 45.0 + translate: + distribution: uniform + min: 0.0 + max: 0.9 + scale: + distribution: uniform + min: 0.0 + max: 0.9 + shear: + distribution: uniform + min: 0.0 + max: 10.0 + perspective: + distribution: uniform + min: 0.0 + max: 0.001 + flipud: + distribution: uniform + min: 0.0 + max: 1.0 + fliplr: + distribution: uniform + min: 0.0 + max: 1.0 + mosaic: + distribution: uniform + min: 0.0 + max: 1.0 + mixup: + distribution: uniform + min: 0.0 + max: 1.0 + copy_paste: + distribution: uniform + min: 0.0 + max: 1.0 diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/loggers/wandb/wandb_utils.py b/python/contrib/YOLOv5driver_assistant_system/utils/loggers/wandb/wandb_utils.py new file mode 100644 index 000000000..383543654 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/utils/loggers/wandb/wandb_utils.py @@ -0,0 +1,562 @@ +"""Utilities and tools for tracking runs with Weights & Biases.""" + +import logging +import os +import sys +from contextlib import contextmanager +from pathlib import Path +from typing import Dict + +import yaml +from tqdm import tqdm + +FILE = Path(__file__).resolve() +ROOT = FILE.parents[3] # YOLOv5 root directory +if str(ROOT) not in sys.path: + sys.path.append(str(ROOT)) # add ROOT to PATH + +from utils.datasets import LoadImagesAndLabels, img2label_paths +from utils.general import LOGGER, check_dataset, check_file + +try: + import wandb + + assert hasattr(wandb, '__version__') # verify package import not local dir +except (ImportError, AssertionError): + wandb = None + +RANK = int(os.getenv('RANK', -1)) +WANDB_ARTIFACT_PREFIX = 'wandb-artifact://' + + +def remove_prefix(from_string, prefix=WANDB_ARTIFACT_PREFIX): + return from_string[len(prefix):] + + +def check_wandb_config_file(data_config_file): + wandb_config = '_wandb.'.join(data_config_file.rsplit('.', 1)) # updated data.yaml path + if Path(wandb_config).is_file(): + return wandb_config + return data_config_file + + +def check_wandb_dataset(data_file): + is_trainset_wandb_artifact = False + is_valset_wandb_artifact = False + if check_file(data_file) and data_file.endswith('.yaml'): + with open(data_file, errors='ignore') as f: + data_dict = yaml.safe_load(f) + is_trainset_wandb_artifact = (isinstance(data_dict['train'], str) and + data_dict['train'].startswith(WANDB_ARTIFACT_PREFIX)) + is_valset_wandb_artifact = (isinstance(data_dict['val'], str) and + data_dict['val'].startswith(WANDB_ARTIFACT_PREFIX)) + if is_trainset_wandb_artifact or is_valset_wandb_artifact: + return data_dict + else: + return check_dataset(data_file) + + +def get_run_info(run_path): + run_path = Path(remove_prefix(run_path, WANDB_ARTIFACT_PREFIX)) + run_id = run_path.stem + project = run_path.parent.stem + entity = run_path.parent.parent.stem + model_artifact_name = 'run_' + run_id + '_model' + return entity, project, run_id, model_artifact_name + + +def check_wandb_resume(opt): + process_wandb_config_ddp_mode(opt) if RANK not in [-1, 0] else None + if isinstance(opt.resume, str): + if opt.resume.startswith(WANDB_ARTIFACT_PREFIX): + if RANK not in [-1, 0]: # For resuming DDP runs + entity, project, run_id, model_artifact_name = get_run_info(opt.resume) + api = wandb.Api() + artifact = api.artifact(entity + '/' + project + '/' + model_artifact_name + ':latest') + modeldir = artifact.download() + opt.weights = str(Path(modeldir) / "last.pt") + return True + return None + + +def process_wandb_config_ddp_mode(opt): + with open(check_file(opt.data), errors='ignore') as f: + data_dict = yaml.safe_load(f) # data dict + train_dir, val_dir = None, None + if isinstance(data_dict['train'], str) and data_dict['train'].startswith(WANDB_ARTIFACT_PREFIX): + api = wandb.Api() + train_artifact = api.artifact(remove_prefix(data_dict['train']) + ':' + opt.artifact_alias) + train_dir = train_artifact.download() + train_path = Path(train_dir) / 'data/images/' + data_dict['train'] = str(train_path) + + if isinstance(data_dict['val'], str) and data_dict['val'].startswith(WANDB_ARTIFACT_PREFIX): + api = wandb.Api() + val_artifact = api.artifact(remove_prefix(data_dict['val']) + ':' + opt.artifact_alias) + val_dir = val_artifact.download() + val_path = Path(val_dir) / 'data/images/' + data_dict['val'] = str(val_path) + if train_dir or val_dir: + ddp_data_path = str(Path(val_dir) / 'wandb_local_data.yaml') + with open(ddp_data_path, 'w') as f: + yaml.safe_dump(data_dict, f) + opt.data = ddp_data_path + + +class WandbLogger(): + """Log training runs, datasets, models, and predictions to Weights & Biases. + + This logger sends information to W&B at wandb.ai. By default, this information + includes hyperparameters, system configuration and metrics, model metrics, + and basic data metrics and analyses. + + By providing additional command line arguments to train.py, datasets, + models and predictions can also be logged. + + For more on how this logger is used, see the Weights & Biases documentation: + https://docs.wandb.com/guides/integrations/yolov5 + """ + + def __init__(self, opt, run_id=None, job_type='Training'): + """ + - Initialize WandbLogger instance + - Upload dataset if opt.upload_dataset is True + - Setup trainig processes if job_type is 'Training' + + arguments: + opt (namespace) -- Commandline arguments for this run + run_id (str) -- Run ID of W&B run to be resumed + job_type (str) -- To set the job_type for this run + + """ + # Pre-training routine -- + self.job_type = job_type + self.wandb, self.wandb_run = wandb, None if not wandb else wandb.run + self.val_artifact, self.train_artifact = None, None + self.train_artifact_path, self.val_artifact_path = None, None + self.result_artifact = None + self.val_table, self.result_table = None, None + self.bbox_media_panel_images = [] + self.val_table_path_map = None + self.max_imgs_to_log = 16 + self.wandb_artifact_data_dict = None + self.data_dict = None + # It's more elegant to stick to 1 wandb.init call, + # but useful config data is overwritten in the WandbLogger's wandb.init call + if isinstance(opt.resume, str): # checks resume from artifact + if opt.resume.startswith(WANDB_ARTIFACT_PREFIX): + entity, project, run_id, model_artifact_name = get_run_info(opt.resume) + model_artifact_name = WANDB_ARTIFACT_PREFIX + model_artifact_name + assert wandb, 'install wandb to resume wandb runs' + # Resume wandb-artifact:// runs here| workaround for not overwriting wandb.config + self.wandb_run = wandb.init(id=run_id, + project=project, + entity=entity, + resume='allow', + allow_val_change=True) + opt.resume = model_artifact_name + elif self.wandb: + self.wandb_run = wandb.init(config=opt, + resume="allow", + project='YOLOv5' if opt.project == 'runs/train' else Path(opt.project).stem, + entity=opt.entity, + name=opt.name if opt.name != 'exp' else None, + job_type=job_type, + id=run_id, + allow_val_change=True) if not wandb.run else wandb.run + if self.wandb_run: + if self.job_type == 'Training': + if opt.upload_dataset: + if not opt.resume: + self.wandb_artifact_data_dict = self.check_and_upload_dataset(opt) + + if opt.resume: + # resume from artifact + if isinstance(opt.resume, str) and opt.resume.startswith(WANDB_ARTIFACT_PREFIX): + self.data_dict = dict(self.wandb_run.config.data_dict) + else: # local resume + self.data_dict = check_wandb_dataset(opt.data) + else: + self.data_dict = check_wandb_dataset(opt.data) + self.wandb_artifact_data_dict = self.wandb_artifact_data_dict or self.data_dict + + # write data_dict to config. useful for resuming from artifacts. Do this only when not resuming. + self.wandb_run.config.update({'data_dict': self.wandb_artifact_data_dict}, + allow_val_change=True) + self.setup_training(opt) + + if self.job_type == 'Dataset Creation': + self.wandb_run.config.update({"upload_dataset": True}) + self.data_dict = self.check_and_upload_dataset(opt) + + def check_and_upload_dataset(self, opt): + """ + Check if the dataset format is compatible and upload it as W&B artifact + + arguments: + opt (namespace)-- Commandline arguments for current run + + returns: + Updated dataset info dictionary where local dataset paths are replaced by WAND_ARFACT_PREFIX links. + """ + assert wandb, 'Install wandb to upload dataset' + config_path = self.log_dataset_artifact(opt.data, + opt.single_cls, + 'YOLOv5' if opt.project == 'runs/train' else Path(opt.project).stem) + with open(config_path, errors='ignore') as f: + wandb_data_dict = yaml.safe_load(f) + return wandb_data_dict + + def setup_training(self, opt): + """ + Setup the necessary processes for training YOLO models: + - Attempt to download model checkpoint and dataset artifacts if opt.resume stats with WANDB_ARTIFACT_PREFIX + - Update data_dict, to contain info of previous run if resumed and the paths of dataset artifact if downloaded + - Setup log_dict, initialize bbox_interval + + arguments: + opt (namespace) -- commandline arguments for this run + + """ + self.log_dict, self.current_epoch = {}, 0 + self.bbox_interval = opt.bbox_interval + if isinstance(opt.resume, str): + modeldir, _ = self.download_model_artifact(opt) + if modeldir: + self.weights = Path(modeldir) / "last.pt" + config = self.wandb_run.config + opt.weights, opt.save_period, opt.batch_size, opt.bbox_interval, opt.epochs, opt.hyp, opt.imgsz = str( + self.weights), config.save_period, config.batch_size, config.bbox_interval, config.epochs,\ + config.hyp, config.imgsz + data_dict = self.data_dict + if self.val_artifact is None: # If --upload_dataset is set, use the existing artifact, don't download + self.train_artifact_path, self.train_artifact = self.download_dataset_artifact(data_dict.get('train'), + opt.artifact_alias) + self.val_artifact_path, self.val_artifact = self.download_dataset_artifact(data_dict.get('val'), + opt.artifact_alias) + + if self.train_artifact_path is not None: + train_path = Path(self.train_artifact_path) / 'data/images/' + data_dict['train'] = str(train_path) + if self.val_artifact_path is not None: + val_path = Path(self.val_artifact_path) / 'data/images/' + data_dict['val'] = str(val_path) + + if self.val_artifact is not None: + self.result_artifact = wandb.Artifact("run_" + wandb.run.id + "_progress", "evaluation") + columns = ["epoch", "id", "ground truth", "prediction"] + columns.extend(self.data_dict['names']) + self.result_table = wandb.Table(columns) + self.val_table = self.val_artifact.get("val") + if self.val_table_path_map is None: + self.map_val_table_path() + if opt.bbox_interval == -1: + self.bbox_interval = opt.bbox_interval = (opt.epochs // 10) if opt.epochs > 10 else 1 + if opt.evolve: + self.bbox_interval = opt.bbox_interval = opt.epochs + 1 + train_from_artifact = self.train_artifact_path is not None and self.val_artifact_path is not None + # Update the the data_dict to point to local artifacts dir + if train_from_artifact: + self.data_dict = data_dict + + def download_dataset_artifact(self, path, alias): + """ + download the model checkpoint artifact if the path starts with WANDB_ARTIFACT_PREFIX + + arguments: + path -- path of the dataset to be used for training + alias (str)-- alias of the artifact to be download/used for training + + returns: + (str, wandb.Artifact) -- path of the downladed dataset and it's corresponding artifact object if dataset + is found otherwise returns (None, None) + """ + if isinstance(path, str) and path.startswith(WANDB_ARTIFACT_PREFIX): + artifact_path = Path(remove_prefix(path, WANDB_ARTIFACT_PREFIX) + ":" + alias) + dataset_artifact = wandb.use_artifact(artifact_path.as_posix().replace("\\", "/")) + assert dataset_artifact is not None, "'Error: W&B dataset artifact doesn\'t exist'" + datadir = dataset_artifact.download() + return datadir, dataset_artifact + return None, None + + def download_model_artifact(self, opt): + """ + download the model checkpoint artifact if the resume path starts with WANDB_ARTIFACT_PREFIX + + arguments: + opt (namespace) -- Commandline arguments for this run + """ + if opt.resume.startswith(WANDB_ARTIFACT_PREFIX): + model_artifact = wandb.use_artifact(remove_prefix(opt.resume, WANDB_ARTIFACT_PREFIX) + ":latest") + assert model_artifact is not None, 'Error: W&B model artifact doesn\'t exist' + modeldir = model_artifact.download() + # epochs_trained = model_artifact.metadata.get('epochs_trained') + total_epochs = model_artifact.metadata.get('total_epochs') + is_finished = total_epochs is None + assert not is_finished, 'training is finished, can only resume incomplete runs.' + return modeldir, model_artifact + return None, None + + def log_model(self, path, opt, epoch, fitness_score, best_model=False): + """ + Log the model checkpoint as W&B artifact + + arguments: + path (Path) -- Path of directory containing the checkpoints + opt (namespace) -- Command line arguments for this run + epoch (int) -- Current epoch number + fitness_score (float) -- fitness score for current epoch + best_model (boolean) -- Boolean representing if the current checkpoint is the best yet. + """ + model_artifact = wandb.Artifact('run_' + wandb.run.id + '_model', type='model', metadata={ + 'original_url': str(path), + 'epochs_trained': epoch + 1, + 'save period': opt.save_period, + 'project': opt.project, + 'total_epochs': opt.epochs, + 'fitness_score': fitness_score + }) + model_artifact.add_file(str(path / 'last.pt'), name='last.pt') + wandb.log_artifact(model_artifact, + aliases=['latest', 'last', 'epoch ' + str(self.current_epoch), 'best' if best_model else '']) + LOGGER.info(f"Saving model artifact on epoch {epoch + 1}") + + def log_dataset_artifact(self, data_file, single_cls, project, overwrite_config=False): + """ + Log the dataset as W&B artifact and return the new data file with W&B links + + arguments: + data_file (str) -- the .yaml file with information about the dataset like - path, classes etc. + single_class (boolean) -- train multi-class data as single-class + project (str) -- project name. Used to construct the artifact path + overwrite_config (boolean) -- overwrites the data.yaml file if set to true otherwise creates a new + file with _wandb postfix. Eg -> data_wandb.yaml + + returns: + the new .yaml file with artifact links. it can be used to start training directly from artifacts + """ + upload_dataset = self.wandb_run.config.upload_dataset + log_val_only = isinstance(upload_dataset, str) and upload_dataset == 'val' + self.data_dict = check_dataset(data_file) # parse and check + data = dict(self.data_dict) + nc, names = (1, ['item']) if single_cls else (int(data['nc']), data['names']) + names = {k: v for k, v in enumerate(names)} # to index dictionary + + # log train set + if not log_val_only: + self.train_artifact = self.create_dataset_table(LoadImagesAndLabels( + data['train'], rect=True, batch_size=1), names, name='train') if data.get('train') else None + if data.get('train'): + data['train'] = WANDB_ARTIFACT_PREFIX + str(Path(project) / 'train') + + self.val_artifact = self.create_dataset_table(LoadImagesAndLabels( + data['val'], rect=True, batch_size=1), names, name='val') if data.get('val') else None + if data.get('val'): + data['val'] = WANDB_ARTIFACT_PREFIX + str(Path(project) / 'val') + + path = Path(data_file) + # create a _wandb.yaml file with artifacts links if both train and test set are logged + if not log_val_only: + path = (path.stem if overwrite_config else path.stem + '_wandb') + '.yaml' # updated data.yaml path + path = ROOT / 'data' / path + data.pop('download', None) + data.pop('path', None) + with open(path, 'w') as f: + yaml.safe_dump(data, f) + LOGGER.info(f"Created dataset config file {path}") + + if self.job_type == 'Training': # builds correct artifact pipeline graph + if not log_val_only: + self.wandb_run.log_artifact( + self.train_artifact) # calling use_artifact downloads the dataset. NOT NEEDED! + self.wandb_run.use_artifact(self.val_artifact) + self.val_artifact.wait() + self.val_table = self.val_artifact.get('val') + self.map_val_table_path() + else: + self.wandb_run.log_artifact(self.train_artifact) + self.wandb_run.log_artifact(self.val_artifact) + return path + + def map_val_table_path(self): + """ + Map the validation dataset Table like name of file -> it's id in the W&B Table. + Useful for - referencing artifacts for evaluation. + """ + self.val_table_path_map = {} + LOGGER.info("Mapping dataset") + for i, data in enumerate(tqdm(self.val_table.data)): + self.val_table_path_map[data[3]] = data[0] + + def create_dataset_table(self, dataset: LoadImagesAndLabels, class_to_id: Dict[int, str], name: str = 'dataset'): + """ + Create and return W&B artifact containing W&B Table of the dataset. + + arguments: + dataset -- instance of LoadImagesAndLabels class used to iterate over the data to build Table + class_to_id -- hash map that maps class ids to labels + name -- name of the artifact + + returns: + dataset artifact to be logged or used + """ + # TODO: Explore multiprocessing to slpit this loop parallely| This is essential for speeding up the the logging + artifact = wandb.Artifact(name=name, type="dataset") + img_files = tqdm([dataset.path]) if isinstance(dataset.path, str) and Path(dataset.path).is_dir() else None + img_files = tqdm(dataset.img_files) if not img_files else img_files + for img_file in img_files: + if Path(img_file).is_dir(): + artifact.add_dir(img_file, name='data/images') + labels_path = 'labels'.join(dataset.path.rsplit('images', 1)) + artifact.add_dir(labels_path, name='data/labels') + else: + artifact.add_file(img_file, name='data/images/' + Path(img_file).name) + label_file = Path(img2label_paths([img_file])[0]) + artifact.add_file(str(label_file), + name='data/labels/' + label_file.name) if label_file.exists() else None + table = wandb.Table(columns=["id", "train_image", "Classes", "name"]) + class_set = wandb.Classes([{'id': id, 'name': name} for id, name in class_to_id.items()]) + for si, (img, labels, paths, shapes) in enumerate(tqdm(dataset)): + box_data, img_classes = [], {} + for cls, *xywh in labels[:, 1:].tolist(): + cls = int(cls) + box_data.append({"position": {"middle": [xywh[0], xywh[1]], "width": xywh[2], "height": xywh[3]}, + "class_id": cls, + "box_caption": "%s" % (class_to_id[cls])}) + img_classes[cls] = class_to_id[cls] + boxes = {"ground_truth": {"box_data": box_data, "class_labels": class_to_id}} # inference-space + table.add_data(si, wandb.Image(paths, classes=class_set, boxes=boxes), list(img_classes.values()), + Path(paths).name) + artifact.add(table, name) + return artifact + + def log_training_progress(self, predn, path, names): + """ + Build evaluation Table. Uses reference from validation dataset table. + + arguments: + predn (list): list of predictions in the native space in the format - [xmin, ymin, xmax, ymax, confidence, class] + path (str): local path of the current evaluation image + names (dict(int, str)): hash map that maps class ids to labels + """ + class_set = wandb.Classes([{'id': id, 'name': name} for id, name in names.items()]) + box_data = [] + avg_conf_per_class = [0] * len(self.data_dict['names']) + pred_class_count = {} + for *xyxy, conf, cls in predn.tolist(): + if conf >= 0.25: + cls = int(cls) + box_data.append( + {"position": {"minX": xyxy[0], "minY": xyxy[1], "maxX": xyxy[2], "maxY": xyxy[3]}, + "class_id": cls, + "box_caption": f"{names[cls]} {conf:.3f}", + "scores": {"class_score": conf}, + "domain": "pixel"}) + avg_conf_per_class[cls] += conf + + if cls in pred_class_count: + pred_class_count[cls] += 1 + else: + pred_class_count[cls] = 1 + + for pred_class in pred_class_count.keys(): + avg_conf_per_class[pred_class] = avg_conf_per_class[pred_class] / pred_class_count[pred_class] + + boxes = {"predictions": {"box_data": box_data, "class_labels": names}} # inference-space + id = self.val_table_path_map[Path(path).name] + self.result_table.add_data(self.current_epoch, + id, + self.val_table.data[id][1], + wandb.Image(self.val_table.data[id][1], boxes=boxes, classes=class_set), + *avg_conf_per_class + ) + + def val_one_image(self, pred, predn, path, names, im): + """ + Log validation data for one image. updates the result Table if validation dataset is uploaded and log bbox media panel + + arguments: + pred (list): list of scaled predictions in the format - [xmin, ymin, xmax, ymax, confidence, class] + predn (list): list of predictions in the native space - [xmin, ymin, xmax, ymax, confidence, class] + path (str): local path of the current evaluation image + """ + if self.val_table and self.result_table: # Log Table if Val dataset is uploaded as artifact + self.log_training_progress(predn, path, names) + + if len(self.bbox_media_panel_images) < self.max_imgs_to_log and self.current_epoch > 0: + if self.current_epoch % self.bbox_interval == 0: + box_data = [{"position": {"minX": xyxy[0], "minY": xyxy[1], "maxX": xyxy[2], "maxY": xyxy[3]}, + "class_id": int(cls), + "box_caption": f"{names[int(cls)]} {conf:.3f}", + "scores": {"class_score": conf}, + "domain": "pixel"} for *xyxy, conf, cls in pred.tolist()] + boxes = {"predictions": {"box_data": box_data, "class_labels": names}} # inference-space + self.bbox_media_panel_images.append(wandb.Image(im, boxes=boxes, caption=path.name)) + + def log(self, log_dict): + """ + save the metrics to the logging dictionary + + arguments: + log_dict (Dict) -- metrics/media to be logged in current step + """ + if self.wandb_run: + for key, value in log_dict.items(): + self.log_dict[key] = value + + def end_epoch(self, best_result=False): + """ + commit the log_dict, model artifacts and Tables to W&B and flush the log_dict. + + arguments: + best_result (boolean): Boolean representing if the result of this evaluation is best or not + """ + if self.wandb_run: + with all_logging_disabled(): + if self.bbox_media_panel_images: + self.log_dict["BoundingBoxDebugger"] = self.bbox_media_panel_images + try: + wandb.log(self.log_dict) + except BaseException as e: + LOGGER.info( + f"An error occurred in wandb logger. The training will proceed without interruption. More info\n{e}") + self.wandb_run.finish() + self.wandb_run = None + + self.log_dict = {} + self.bbox_media_panel_images = [] + if self.result_artifact: + self.result_artifact.add(self.result_table, 'result') + wandb.log_artifact(self.result_artifact, aliases=['latest', 'last', 'epoch ' + str(self.current_epoch), + ('best' if best_result else '')]) + + wandb.log({"evaluation": self.result_table}) + columns = ["epoch", "id", "ground truth", "prediction"] + columns.extend(self.data_dict['names']) + self.result_table = wandb.Table(columns) + self.result_artifact = wandb.Artifact("run_" + wandb.run.id + "_progress", "evaluation") + + def finish_run(self): + """ + Log metrics if any and finish the current W&B run + """ + if self.wandb_run: + if self.log_dict: + with all_logging_disabled(): + wandb.log(self.log_dict) + wandb.run.finish() + + +@contextmanager +def all_logging_disabled(highest_level=logging.CRITICAL): + """ source - https://gist.github.com/simon-weber/7853144 + A context manager that will prevent any logging messages triggered during the body from being processed. + :param highest_level: the maximum logging level in use. + This would only need to be changed if a custom level greater than CRITICAL is defined. + """ + previous_level = logging.root.manager.disable + logging.disable(highest_level) + try: + yield + finally: + logging.disable(previous_level) diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/loss.py b/python/contrib/YOLOv5driver_assistant_system/utils/loss.py new file mode 100644 index 000000000..5aa9f017d --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/utils/loss.py @@ -0,0 +1,222 @@ +# YOLOv5 🚀 by Ultralytics, GPL-3.0 license +""" +Loss functions +""" + +import torch +import torch.nn as nn + +from utils.metrics import bbox_iou +from utils.torch_utils import de_parallel + + +def smooth_BCE(eps=0.1): # https://github.com/ultralytics/yolov3/issues/238#issuecomment-598028441 + # return positive, negative label smoothing BCE targets + return 1.0 - 0.5 * eps, 0.5 * eps + + +class BCEBlurWithLogitsLoss(nn.Module): + # BCEwithLogitLoss() with reduced missing label effects. + def __init__(self, alpha=0.05): + super().__init__() + self.loss_fcn = nn.BCEWithLogitsLoss(reduction='none') # must be nn.BCEWithLogitsLoss() + self.alpha = alpha + + def forward(self, pred, true): + loss = self.loss_fcn(pred, true) + pred = torch.sigmoid(pred) # prob from logits + dx = pred - true # reduce only missing label effects + # dx = (pred - true).abs() # reduce missing label and false label effects + alpha_factor = 1 - torch.exp((dx - 1) / (self.alpha + 1e-4)) + loss *= alpha_factor + return loss.mean() + + +class FocalLoss(nn.Module): + # Wraps focal loss around existing loss_fcn(), i.e. criteria = FocalLoss(nn.BCEWithLogitsLoss(), gamma=1.5) + def __init__(self, loss_fcn, gamma=1.5, alpha=0.25): + super().__init__() + self.loss_fcn = loss_fcn # must be nn.BCEWithLogitsLoss() + self.gamma = gamma + self.alpha = alpha + self.reduction = loss_fcn.reduction + self.loss_fcn.reduction = 'none' # required to apply FL to each element + + def forward(self, pred, true): + loss = self.loss_fcn(pred, true) + # p_t = torch.exp(-loss) + # loss *= self.alpha * (1.000001 - p_t) ** self.gamma # non-zero power for gradient stability + + # TF implementation https://github.com/tensorflow/addons/blob/v0.7.1/tensorflow_addons/losses/focal_loss.py + pred_prob = torch.sigmoid(pred) # prob from logits + p_t = true * pred_prob + (1 - true) * (1 - pred_prob) + alpha_factor = true * self.alpha + (1 - true) * (1 - self.alpha) + modulating_factor = (1.0 - p_t) ** self.gamma + loss *= alpha_factor * modulating_factor + + if self.reduction == 'mean': + return loss.mean() + elif self.reduction == 'sum': + return loss.sum() + else: # 'none' + return loss + + +class QFocalLoss(nn.Module): + # Wraps Quality focal loss around existing loss_fcn(), i.e. criteria = FocalLoss(nn.BCEWithLogitsLoss(), gamma=1.5) + def __init__(self, loss_fcn, gamma=1.5, alpha=0.25): + super().__init__() + self.loss_fcn = loss_fcn # must be nn.BCEWithLogitsLoss() + self.gamma = gamma + self.alpha = alpha + self.reduction = loss_fcn.reduction + self.loss_fcn.reduction = 'none' # required to apply FL to each element + + def forward(self, pred, true): + loss = self.loss_fcn(pred, true) + + pred_prob = torch.sigmoid(pred) # prob from logits + alpha_factor = true * self.alpha + (1 - true) * (1 - self.alpha) + modulating_factor = torch.abs(true - pred_prob) ** self.gamma + loss *= alpha_factor * modulating_factor + + if self.reduction == 'mean': + return loss.mean() + elif self.reduction == 'sum': + return loss.sum() + else: # 'none' + return loss + + +class ComputeLoss: + # Compute losses + def __init__(self, model, autobalance=False): + self.sort_obj_iou = False + device = next(model.parameters()).device # get model device + h = model.hyp # hyperparameters + + # Define criteria + BCEcls = nn.BCEWithLogitsLoss(pos_weight=torch.tensor([h['cls_pw']], device=device)) + BCEobj = nn.BCEWithLogitsLoss(pos_weight=torch.tensor([h['obj_pw']], device=device)) + + # Class label smoothing https://arxiv.org/pdf/1902.04103.pdf eqn 3 + self.cp, self.cn = smooth_BCE(eps=h.get('label_smoothing', 0.0)) # positive, negative BCE targets + + # Focal loss + g = h['fl_gamma'] # focal loss gamma + if g > 0: + BCEcls, BCEobj = FocalLoss(BCEcls, g), FocalLoss(BCEobj, g) + + det = de_parallel(model).model[-1] # Detect() module + self.balance = {3: [4.0, 1.0, 0.4]}.get(det.nl, [4.0, 1.0, 0.25, 0.06, 0.02]) # P3-P7 + self.ssi = list(det.stride).index(16) if autobalance else 0 # stride 16 index + self.BCEcls, self.BCEobj, self.gr, self.hyp, self.autobalance = BCEcls, BCEobj, 1.0, h, autobalance + for k in 'na', 'nc', 'nl', 'anchors': + setattr(self, k, getattr(det, k)) + + def __call__(self, p, targets): # predictions, targets, model + device = targets.device + lcls, lbox, lobj = torch.zeros(1, device=device), torch.zeros(1, device=device), torch.zeros(1, device=device) + tcls, tbox, indices, anchors = self.build_targets(p, targets) # targets + + # Losses + for i, pi in enumerate(p): # layer index, layer predictions + b, a, gj, gi = indices[i] # image, anchor, gridy, gridx + tobj = torch.zeros_like(pi[..., 0], device=device) # target obj + + n = b.shape[0] # number of targets + if n: + ps = pi[b, a, gj, gi] # prediction subset corresponding to targets + + # Regression + pxy = ps[:, :2].sigmoid() * 2 - 0.5 + pwh = (ps[:, 2:4].sigmoid() * 2) ** 2 * anchors[i] + pbox = torch.cat((pxy, pwh), 1) # predicted box + iou = bbox_iou(pbox.T, tbox[i], x1y1x2y2=False, CIoU=True) # iou(prediction, target) + lbox += (1.0 - iou).mean() # iou loss + + # Objectness + score_iou = iou.detach().clamp(0).type(tobj.dtype) + if self.sort_obj_iou: + sort_id = torch.argsort(score_iou) + b, a, gj, gi, score_iou = b[sort_id], a[sort_id], gj[sort_id], gi[sort_id], score_iou[sort_id] + tobj[b, a, gj, gi] = (1.0 - self.gr) + self.gr * score_iou # iou ratio + + # Classification + if self.nc > 1: # cls loss (only if multiple classes) + t = torch.full_like(ps[:, 5:], self.cn, device=device) # targets + t[range(n), tcls[i]] = self.cp + lcls += self.BCEcls(ps[:, 5:], t) # BCE + + # Append targets to text file + # with open('targets.txt', 'a') as file: + # [file.write('%11.5g ' * 4 % tuple(x) + '\n') for x in torch.cat((txy[i], twh[i]), 1)] + + obji = self.BCEobj(pi[..., 4], tobj) + lobj += obji * self.balance[i] # obj loss + if self.autobalance: + self.balance[i] = self.balance[i] * 0.9999 + 0.0001 / obji.detach().item() + + if self.autobalance: + self.balance = [x / self.balance[self.ssi] for x in self.balance] + lbox *= self.hyp['box'] + lobj *= self.hyp['obj'] + lcls *= self.hyp['cls'] + bs = tobj.shape[0] # batch size + + return (lbox + lobj + lcls) * bs, torch.cat((lbox, lobj, lcls)).detach() + + def build_targets(self, p, targets): + # Build targets for compute_loss(), input targets(image,class,x,y,w,h) + na, nt = self.na, targets.shape[0] # number of anchors, targets + tcls, tbox, indices, anch = [], [], [], [] + gain = torch.ones(7, device=targets.device) # normalized to gridspace gain + ai = torch.arange(na, device=targets.device).float().view(na, 1).repeat(1, nt) # same as .repeat_interleave(nt) + targets = torch.cat((targets.repeat(na, 1, 1), ai[:, :, None]), 2) # append anchor indices + + g = 0.5 # bias + off = torch.tensor([[0, 0], + [1, 0], [0, 1], [-1, 0], [0, -1], # j,k,l,m + # [1, 1], [1, -1], [-1, 1], [-1, -1], # jk,jm,lk,lm + ], device=targets.device).float() * g # offsets + + for i in range(self.nl): + anchors = self.anchors[i] + gain[2:6] = torch.tensor(p[i].shape)[[3, 2, 3, 2]] # xyxy gain + + # Match targets to anchors + t = targets * gain + if nt: + # Matches + r = t[:, :, 4:6] / anchors[:, None] # wh ratio + j = torch.max(r, 1 / r).max(2)[0] < self.hyp['anchor_t'] # compare + # j = wh_iou(anchors, t[:, 4:6]) > model.hyp['iou_t'] # iou(3,n)=wh_iou(anchors(3,2), gwh(n,2)) + t = t[j] # filter + + # Offsets + gxy = t[:, 2:4] # grid xy + gxi = gain[[2, 3]] - gxy # inverse + j, k = ((gxy % 1 < g) & (gxy > 1)).T + l, m = ((gxi % 1 < g) & (gxi > 1)).T + j = torch.stack((torch.ones_like(j), j, k, l, m)) + t = t.repeat((5, 1, 1))[j] + offsets = (torch.zeros_like(gxy)[None] + off[:, None])[j] + else: + t = targets[0] + offsets = 0 + + # Define + b, c = t[:, :2].long().T # image, class + gxy = t[:, 2:4] # grid xy + gwh = t[:, 4:6] # grid wh + gij = (gxy - offsets).long() + gi, gj = gij.T # grid xy indices + + # Append + a = t[:, 6].long() # anchor indices + indices.append((b, a, gj.clamp_(0, gain[3] - 1), gi.clamp_(0, gain[2] - 1))) # image, anchor, grid indices + tbox.append(torch.cat((gxy - gij, gwh), 1)) # box + anch.append(anchors[a]) # anchors + tcls.append(c) # class + + return tcls, tbox, indices, anch diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/metrics.py b/python/contrib/YOLOv5driver_assistant_system/utils/metrics.py new file mode 100644 index 000000000..857fa5d81 --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/utils/metrics.py @@ -0,0 +1,342 @@ +# YOLOv5 🚀 by Ultralytics, GPL-3.0 license +""" +Model validation metrics +""" + +import math +import warnings +from pathlib import Path + +import matplotlib.pyplot as plt +import numpy as np +import torch + + +def fitness(x): + # Model fitness as a weighted combination of metrics + w = [0.0, 0.0, 0.1, 0.9] # weights for [P, R, mAP@0.5, mAP@0.5:0.95] + return (x[:, :4] * w).sum(1) + + +def ap_per_class(tp, conf, pred_cls, target_cls, plot=False, save_dir='.', names=(), eps=1e-16): + """ Compute the average precision, given the recall and precision curves. + Source: https://github.com/rafaelpadilla/Object-Detection-Metrics. + # Arguments + tp: True positives (nparray, nx1 or nx10). + conf: Objectness value from 0-1 (nparray). + pred_cls: Predicted object classes (nparray). + target_cls: True object classes (nparray). + plot: Plot precision-recall curve at mAP@0.5 + save_dir: Plot save directory + # Returns + The average precision as computed in py-faster-rcnn. + """ + + # Sort by objectness + i = np.argsort(-conf) + tp, conf, pred_cls = tp[i], conf[i], pred_cls[i] + + # Find unique classes + unique_classes, nt = np.unique(target_cls, return_counts=True) + nc = unique_classes.shape[0] # number of classes, number of detections + + # Create Precision-Recall curve and compute AP for each class + px, py = np.linspace(0, 1, 1000), [] # for plotting + ap, p, r = np.zeros((nc, tp.shape[1])), np.zeros((nc, 1000)), np.zeros((nc, 1000)) + for ci, c in enumerate(unique_classes): + i = pred_cls == c + n_l = nt[ci] # number of labels + n_p = i.sum() # number of predictions + + if n_p == 0 or n_l == 0: + continue + else: + # Accumulate FPs and TPs + fpc = (1 - tp[i]).cumsum(0) + tpc = tp[i].cumsum(0) + + # Recall + recall = tpc / (n_l + eps) # recall curve + r[ci] = np.interp(-px, -conf[i], recall[:, 0], left=0) # negative x, xp because xp decreases + + # Precision + precision = tpc / (tpc + fpc) # precision curve + p[ci] = np.interp(-px, -conf[i], precision[:, 0], left=1) # p at pr_score + + # AP from recall-precision curve + for j in range(tp.shape[1]): + ap[ci, j], mpre, mrec = compute_ap(recall[:, j], precision[:, j]) + if plot and j == 0: + py.append(np.interp(px, mrec, mpre)) # precision at mAP@0.5 + + # Compute F1 (harmonic mean of precision and recall) + f1 = 2 * p * r / (p + r + eps) + names = [v for k, v in names.items() if k in unique_classes] # list: only classes that have data + names = {i: v for i, v in enumerate(names)} # to dict + if plot: + plot_pr_curve(px, py, ap, Path(save_dir) / 'PR_curve.png', names) + plot_mc_curve(px, f1, Path(save_dir) / 'F1_curve.png', names, ylabel='F1') + plot_mc_curve(px, p, Path(save_dir) / 'P_curve.png', names, ylabel='Precision') + plot_mc_curve(px, r, Path(save_dir) / 'R_curve.png', names, ylabel='Recall') + + i = f1.mean(0).argmax() # max F1 index + p, r, f1 = p[:, i], r[:, i], f1[:, i] + tp = (r * nt).round() # true positives + fp = (tp / (p + eps) - tp).round() # false positives + return tp, fp, p, r, f1, ap, unique_classes.astype('int32') + + +def compute_ap(recall, precision): + """ Compute the average precision, given the recall and precision curves + # Arguments + recall: The recall curve (list) + precision: The precision curve (list) + # Returns + Average precision, precision curve, recall curve + """ + + # Append sentinel values to beginning and end + mrec = np.concatenate(([0.0], recall, [1.0])) + mpre = np.concatenate(([1.0], precision, [0.0])) + + # Compute the precision envelope + mpre = np.flip(np.maximum.accumulate(np.flip(mpre))) + + # Integrate area under curve + method = 'interp' # methods: 'continuous', 'interp' + if method == 'interp': + x = np.linspace(0, 1, 101) # 101-point interp (COCO) + ap = np.trapz(np.interp(x, mrec, mpre), x) # integrate + else: # 'continuous' + i = np.where(mrec[1:] != mrec[:-1])[0] # points where x axis (recall) changes + ap = np.sum((mrec[i + 1] - mrec[i]) * mpre[i + 1]) # area under curve + + return ap, mpre, mrec + + +class ConfusionMatrix: + # Updated version of https://github.com/kaanakan/object_detection_confusion_matrix + def __init__(self, nc, conf=0.25, iou_thres=0.45): + self.matrix = np.zeros((nc + 1, nc + 1)) + self.nc = nc # number of classes + self.conf = conf + self.iou_thres = iou_thres + + def process_batch(self, detections, labels): + """ + Return intersection-over-union (Jaccard index) of boxes. + Both sets of boxes are expected to be in (x1, y1, x2, y2) format. + Arguments: + detections (Array[N, 6]), x1, y1, x2, y2, conf, class + labels (Array[M, 5]), class, x1, y1, x2, y2 + Returns: + None, updates confusion matrix accordingly + """ + detections = detections[detections[:, 4] > self.conf] + gt_classes = labels[:, 0].int() + detection_classes = detections[:, 5].int() + iou = box_iou(labels[:, 1:], detections[:, :4]) + + x = torch.where(iou > self.iou_thres) + if x[0].shape[0]: + matches = torch.cat((torch.stack(x, 1), iou[x[0], x[1]][:, None]), 1).cpu().numpy() + if x[0].shape[0] > 1: + matches = matches[matches[:, 2].argsort()[::-1]] + matches = matches[np.unique(matches[:, 1], return_index=True)[1]] + matches = matches[matches[:, 2].argsort()[::-1]] + matches = matches[np.unique(matches[:, 0], return_index=True)[1]] + else: + matches = np.zeros((0, 3)) + + n = matches.shape[0] > 0 + m0, m1, _ = matches.transpose().astype(np.int16) + for i, gc in enumerate(gt_classes): + j = m0 == i + if n and sum(j) == 1: + self.matrix[detection_classes[m1[j]], gc] += 1 # correct + else: + self.matrix[self.nc, gc] += 1 # background FP + + if n: + for i, dc in enumerate(detection_classes): + if not any(m1 == i): + self.matrix[dc, self.nc] += 1 # background FN + + def matrix(self): + return self.matrix + + def tp_fp(self): + tp = self.matrix.diagonal() # true positives + fp = self.matrix.sum(1) - tp # false positives + # fn = self.matrix.sum(0) - tp # false negatives (missed detections) + return tp[:-1], fp[:-1] # remove background class + + def plot(self, normalize=True, save_dir='', names=()): + try: + import seaborn as sn + + array = self.matrix / ((self.matrix.sum(0).reshape(1, -1) + 1E-9) if normalize else 1) # normalize columns + array[array < 0.005] = np.nan # don't annotate (would appear as 0.00) + + fig = plt.figure(figsize=(12, 9), tight_layout=True) + nc, nn = self.nc, len(names) # number of classes, names + sn.set(font_scale=1.0 if nc < 50 else 0.8) # for label size + labels = (0 < nn < 99) and (nn == nc) # apply names to ticklabels + with warnings.catch_warnings(): + warnings.simplefilter('ignore') # suppress empty matrix RuntimeWarning: All-NaN slice encountered + sn.heatmap(array, annot=nc < 30, annot_kws={"size": 8}, cmap='Blues', fmt='.2f', square=True, vmin=0.0, + xticklabels=names + ['background FP'] if labels else "auto", + yticklabels=names + ['background FN'] if labels else "auto").set_facecolor((1, 1, 1)) + fig.axes[0].set_xlabel('True') + fig.axes[0].set_ylabel('Predicted') + fig.savefig(Path(save_dir) / 'confusion_matrix.png', dpi=250) + plt.close() + except Exception as e: + print(f'WARNING: ConfusionMatrix plot failure: {e}') + + def print(self): + for i in range(self.nc + 1): + print(' '.join(map(str, self.matrix[i]))) + + +def bbox_iou(box1, box2, x1y1x2y2=True, GIoU=False, DIoU=False, CIoU=False, eps=1e-7): + # Returns the IoU of box1 to box2. box1 is 4, box2 is nx4 + box2 = box2.T + + # Get the coordinates of bounding boxes + if x1y1x2y2: # x1, y1, x2, y2 = box1 + b1_x1, b1_y1, b1_x2, b1_y2 = box1[0], box1[1], box1[2], box1[3] + b2_x1, b2_y1, b2_x2, b2_y2 = box2[0], box2[1], box2[2], box2[3] + else: # transform from xywh to xyxy + b1_x1, b1_x2 = box1[0] - box1[2] / 2, box1[0] + box1[2] / 2 + b1_y1, b1_y2 = box1[1] - box1[3] / 2, box1[1] + box1[3] / 2 + b2_x1, b2_x2 = box2[0] - box2[2] / 2, box2[0] + box2[2] / 2 + b2_y1, b2_y2 = box2[1] - box2[3] / 2, box2[1] + box2[3] / 2 + + # Intersection area + inter = (torch.min(b1_x2, b2_x2) - torch.max(b1_x1, b2_x1)).clamp(0) * \ + (torch.min(b1_y2, b2_y2) - torch.max(b1_y1, b2_y1)).clamp(0) + + # Union Area + w1, h1 = b1_x2 - b1_x1, b1_y2 - b1_y1 + eps + w2, h2 = b2_x2 - b2_x1, b2_y2 - b2_y1 + eps + union = w1 * h1 + w2 * h2 - inter + eps + + iou = inter / union + if CIoU or DIoU or GIoU: + cw = torch.max(b1_x2, b2_x2) - torch.min(b1_x1, b2_x1) # convex (smallest enclosing box) width + ch = torch.max(b1_y2, b2_y2) - torch.min(b1_y1, b2_y1) # convex height + if CIoU or DIoU: # Distance or Complete IoU https://arxiv.org/abs/1911.08287v1 + c2 = cw ** 2 + ch ** 2 + eps # convex diagonal squared + rho2 = ((b2_x1 + b2_x2 - b1_x1 - b1_x2) ** 2 + + (b2_y1 + b2_y2 - b1_y1 - b1_y2) ** 2) / 4 # center distance squared + if CIoU: # https://github.com/Zzh-tju/DIoU-SSD-pytorch/blob/master/utils/box/box_utils.py#L47 + v = (4 / math.pi ** 2) * torch.pow(torch.atan(w2 / h2) - torch.atan(w1 / h1), 2) + with torch.no_grad(): + alpha = v / (v - iou + (1 + eps)) + return iou - (rho2 / c2 + v * alpha) # CIoU + return iou - rho2 / c2 # DIoU + c_area = cw * ch + eps # convex area + return iou - (c_area - union) / c_area # GIoU https://arxiv.org/pdf/1902.09630.pdf + return iou # IoU + + +def box_iou(box1, box2): + # https://github.com/pytorch/vision/blob/master/torchvision/ops/boxes.py + """ + Return intersection-over-union (Jaccard index) of boxes. + Both sets of boxes are expected to be in (x1, y1, x2, y2) format. + Arguments: + box1 (Tensor[N, 4]) + box2 (Tensor[M, 4]) + Returns: + iou (Tensor[N, M]): the NxM matrix containing the pairwise + IoU values for every element in boxes1 and boxes2 + """ + + def box_area(box): + # box = 4xn + return (box[2] - box[0]) * (box[3] - box[1]) + + area1 = box_area(box1.T) + area2 = box_area(box2.T) + + # inter(N,M) = (rb(N,M,2) - lt(N,M,2)).clamp(0).prod(2) + inter = (torch.min(box1[:, None, 2:], box2[:, 2:]) - torch.max(box1[:, None, :2], box2[:, :2])).clamp(0).prod(2) + return inter / (area1[:, None] + area2 - inter) # iou = inter / (area1 + area2 - inter) + + +def bbox_ioa(box1, box2, eps=1E-7): + """ Returns the intersection over box2 area given box1, box2. Boxes are x1y1x2y2 + box1: np.array of shape(4) + box2: np.array of shape(nx4) + returns: np.array of shape(n) + """ + + box2 = box2.transpose() + + # Get the coordinates of bounding boxes + b1_x1, b1_y1, b1_x2, b1_y2 = box1[0], box1[1], box1[2], box1[3] + b2_x1, b2_y1, b2_x2, b2_y2 = box2[0], box2[1], box2[2], box2[3] + + # Intersection area + inter_area = (np.minimum(b1_x2, b2_x2) - np.maximum(b1_x1, b2_x1)).clip(0) * \ + (np.minimum(b1_y2, b2_y2) - np.maximum(b1_y1, b2_y1)).clip(0) + + # box2 area + box2_area = (b2_x2 - b2_x1) * (b2_y2 - b2_y1) + eps + + # Intersection over box2 area + return inter_area / box2_area + + +def wh_iou(wh1, wh2): + # Returns the nxm IoU matrix. wh1 is nx2, wh2 is mx2 + wh1 = wh1[:, None] # [N,1,2] + wh2 = wh2[None] # [1,M,2] + inter = torch.min(wh1, wh2).prod(2) # [N,M] + return inter / (wh1.prod(2) + wh2.prod(2) - inter) # iou = inter / (area1 + area2 - inter) + + +# Plots ---------------------------------------------------------------------------------------------------------------- + +def plot_pr_curve(px, py, ap, save_dir='pr_curve.png', names=()): + # Precision-recall curve + fig, ax = plt.subplots(1, 1, figsize=(9, 6), tight_layout=True) + py = np.stack(py, axis=1) + + if 0 < len(names) < 21: # display per-class legend if < 21 classes + for i, y in enumerate(py.T): + ax.plot(px, y, linewidth=1, label=f'{names[i]} {ap[i, 0]:.3f}') # plot(recall, precision) + else: + ax.plot(px, py, linewidth=1, color='grey') # plot(recall, precision) + + ax.plot(px, py.mean(1), linewidth=3, color='blue', label='all classes %.3f mAP@0.5' % ap[:, 0].mean()) + ax.set_xlabel('Recall') + ax.set_ylabel('Precision') + ax.set_xlim(0, 1) + ax.set_ylim(0, 1) + plt.legend(bbox_to_anchor=(1.04, 1), loc="upper left") + fig.savefig(Path(save_dir), dpi=250) + plt.close() + + +def plot_mc_curve(px, py, save_dir='mc_curve.png', names=(), xlabel='Confidence', ylabel='Metric'): + # Metric-confidence curve + fig, ax = plt.subplots(1, 1, figsize=(9, 6), tight_layout=True) + + if 0 < len(names) < 21: # display per-class legend if < 21 classes + for i, y in enumerate(py): + ax.plot(px, y, linewidth=1, label=f'{names[i]}') # plot(confidence, metric) + else: + ax.plot(px, py.T, linewidth=1, color='grey') # plot(confidence, metric) + + y = py.mean(0) + ax.plot(px, y, linewidth=3, color='blue', label=f'all classes {y.max():.2f} at {px[y.argmax()]:.3f}') + ax.set_xlabel(xlabel) + ax.set_ylabel(ylabel) + ax.set_xlim(0, 1) + ax.set_ylim(0, 1) + plt.legend(bbox_to_anchor=(1.04, 1), loc="upper left") + fig.savefig(Path(save_dir), dpi=250) + plt.close() diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/plots.py b/python/contrib/YOLOv5driver_assistant_system/utils/plots.py new file mode 100644 index 000000000..6c3f5bcae --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/utils/plots.py @@ -0,0 +1,471 @@ +# YOLOv5 🚀 by Ultralytics, GPL-3.0 license +""" +Plotting utils +""" + +import math +import os +from copy import copy +from pathlib import Path + +import cv2 +import matplotlib +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import seaborn as sn +import torch +from PIL import Image, ImageDraw, ImageFont + +from utils.general import (CONFIG_DIR, FONT, LOGGER, Timeout, check_font, check_requirements, clip_coords, + increment_path, is_ascii, is_chinese, try_except, xywh2xyxy, xyxy2xywh) +from utils.metrics import fitness + +# Settings +RANK = int(os.getenv('RANK', -1)) +matplotlib.rc('font', **{'size': 11}) +matplotlib.use('Agg') # for writing to files only + + +class Colors: + # Ultralytics color palette https://ultralytics.com/ + def __init__(self): + # hex = matplotlib.colors.TABLEAU_COLORS.values() + hex = ('FF3838', 'FF9D97', 'FF701F', 'FFB21D', 'CFD231', '48F90A', '92CC17', '3DDB86', '1A9334', '00D4BB', + '2C99A8', '00C2FF', '344593', '6473FF', '0018EC', '8438FF', '520085', 'CB38FF', 'FF95C8', 'FF37C7') + self.palette = [self.hex2rgb('#' + c) for c in hex] + self.n = len(self.palette) + + def __call__(self, i, bgr=False): + c = self.palette[int(i) % self.n] + return (c[2], c[1], c[0]) if bgr else c + + @staticmethod + def hex2rgb(h): # rgb order (PIL) + return tuple(int(h[1 + i:1 + i + 2], 16) for i in (0, 2, 4)) + + +colors = Colors() # create instance for 'from utils.plots import colors' + + +def check_pil_font(font=FONT, size=10): + # Return a PIL TrueType Font, downloading to CONFIG_DIR if necessary + font = Path(font) + font = font if font.exists() else (CONFIG_DIR / font.name) + try: + return ImageFont.truetype(str(font) if font.exists() else font.name, size) + except Exception: # download if missing + check_font(font) + try: + return ImageFont.truetype(str(font), size) + except TypeError: + check_requirements('Pillow>=8.4.0') # known issue https://github.com/ultralytics/yolov5/issues/5374 + + +class Annotator: + if RANK in (-1, 0): + check_pil_font() # download TTF if necessary + + # YOLOv5 Annotator for train/val mosaics and jpgs and detect/hub inference annotations + def __init__(self, im, line_width=None, font_size=None, font='Arial.ttf', pil=False, example='abc'): + assert im.data.contiguous, 'Image not contiguous. Apply np.ascontiguousarray(im) to Annotator() input images.' + self.pil = pil or not is_ascii(example) or is_chinese(example) + if self.pil: # use PIL + self.im = im if isinstance(im, Image.Image) else Image.fromarray(im) + self.draw = ImageDraw.Draw(self.im) + self.font = check_pil_font(font='Arial.Unicode.ttf' if is_chinese(example) else font, + size=font_size or max(round(sum(self.im.size) / 2 * 0.035), 12)) + else: # use cv2 + self.im = im + self.lw = line_width or max(round(sum(im.shape) / 2 * 0.003), 2) # line width + + def box_label(self, box, label='', color=(128, 128, 128), txt_color=(255, 255, 255)): + # Add one xyxy box to image with label + if self.pil or not is_ascii(label): + self.draw.rectangle(box, width=self.lw, outline=color) # box + if label: + w, h = self.font.getsize(label) # text width, height + outside = box[1] - h >= 0 # label fits outside box + self.draw.rectangle((box[0], + box[1] - h if outside else box[1], + box[0] + w + 1, + box[1] + 1 if outside else box[1] + h + 1), fill=color) + # self.draw.text((box[0], box[1]), label, fill=txt_color, font=self.font, anchor='ls') # for PIL>8.0 + self.draw.text((box[0], box[1] - h if outside else box[1]), label, fill=txt_color, font=self.font) + else: # cv2 + p1, p2 = (int(box[0]), int(box[1])), (int(box[2]), int(box[3])) + cv2.rectangle(self.im, p1, p2, color, thickness=self.lw, lineType=cv2.LINE_AA) + if label: + tf = max(self.lw - 1, 1) # font thickness + w, h = cv2.getTextSize(label, 0, fontScale=self.lw / 3, thickness=tf)[0] # text width, height + outside = p1[1] - h - 3 >= 0 # label fits outside box + p2 = p1[0] + w, p1[1] - h - 3 if outside else p1[1] + h + 3 + cv2.rectangle(self.im, p1, p2, color, -1, cv2.LINE_AA) # filled + cv2.putText(self.im, label, (p1[0], p1[1] - 2 if outside else p1[1] + h + 2), 0, self.lw / 3, txt_color, + thickness=tf, lineType=cv2.LINE_AA) + + def rectangle(self, xy, fill=None, outline=None, width=1): + # Add rectangle to image (PIL-only) + self.draw.rectangle(xy, fill, outline, width) + + def text(self, xy, text, txt_color=(255, 255, 255)): + # Add text to image (PIL-only) + w, h = self.font.getsize(text) # text width, height + self.draw.text((xy[0], xy[1] - h + 1), text, fill=txt_color, font=self.font) + + def result(self): + # Return annotated image as array + return np.asarray(self.im) + + +def feature_visualization(x, module_type, stage, n=32, save_dir=Path('runs/detect/exp')): + """ + x: Features to be visualized + module_type: Module type + stage: Module stage within model + n: Maximum number of feature maps to plot + save_dir: Directory to save results + """ + if 'Detect' not in module_type: + batch, channels, height, width = x.shape # batch, channels, height, width + if height > 1 and width > 1: + f = save_dir / f"stage{stage}_{module_type.split('.')[-1]}_features.png" # filename + + blocks = torch.chunk(x[0].cpu(), channels, dim=0) # select batch index 0, block by channels + n = min(n, channels) # number of plots + fig, ax = plt.subplots(math.ceil(n / 8), 8, tight_layout=True) # 8 rows x n/8 cols + ax = ax.ravel() + plt.subplots_adjust(wspace=0.05, hspace=0.05) + for i in range(n): + ax[i].imshow(blocks[i].squeeze()) # cmap='gray' + ax[i].axis('off') + + LOGGER.info(f'Saving {f}... ({n}/{channels})') + plt.savefig(f, dpi=300, bbox_inches='tight') + plt.close() + np.save(str(f.with_suffix('.npy')), x[0].cpu().numpy()) # npy save + + +def hist2d(x, y, n=100): + # 2d histogram used in labels.png and evolve.png + xedges, yedges = np.linspace(x.min(), x.max(), n), np.linspace(y.min(), y.max(), n) + hist, xedges, yedges = np.histogram2d(x, y, (xedges, yedges)) + xidx = np.clip(np.digitize(x, xedges) - 1, 0, hist.shape[0] - 1) + yidx = np.clip(np.digitize(y, yedges) - 1, 0, hist.shape[1] - 1) + return np.log(hist[xidx, yidx]) + + +def butter_lowpass_filtfilt(data, cutoff=1500, fs=50000, order=5): + from scipy.signal import butter, filtfilt + + # https://stackoverflow.com/questions/28536191/how-to-filter-smooth-with-scipy-numpy + def butter_lowpass(cutoff, fs, order): + nyq = 0.5 * fs + normal_cutoff = cutoff / nyq + return butter(order, normal_cutoff, btype='low', analog=False) + + b, a = butter_lowpass(cutoff, fs, order=order) + return filtfilt(b, a, data) # forward-backward filter + + +def output_to_target(output): + # Convert model output to target format [batch_id, class_id, x, y, w, h, conf] + targets = [] + for i, o in enumerate(output): + for *box, conf, cls in o.cpu().numpy(): + targets.append([i, cls, *list(*xyxy2xywh(np.array(box)[None])), conf]) + return np.array(targets) + + +def plot_images(images, targets, paths=None, fname='images.jpg', names=None, max_size=1920, max_subplots=16): + # Plot image grid with labels + if isinstance(images, torch.Tensor): + images = images.cpu().float().numpy() + if isinstance(targets, torch.Tensor): + targets = targets.cpu().numpy() + if np.max(images[0]) <= 1: + images *= 255 # de-normalise (optional) + bs, _, h, w = images.shape # batch size, _, height, width + bs = min(bs, max_subplots) # limit plot images + ns = np.ceil(bs ** 0.5) # number of subplots (square) + + # Build Image + mosaic = np.full((int(ns * h), int(ns * w), 3), 255, dtype=np.uint8) # init + for i, im in enumerate(images): + if i == max_subplots: # if last batch has fewer images than we expect + break + x, y = int(w * (i // ns)), int(h * (i % ns)) # block origin + im = im.transpose(1, 2, 0) + mosaic[y:y + h, x:x + w, :] = im + + # Resize (optional) + scale = max_size / ns / max(h, w) + if scale < 1: + h = math.ceil(scale * h) + w = math.ceil(scale * w) + mosaic = cv2.resize(mosaic, tuple(int(x * ns) for x in (w, h))) + + # Annotate + fs = int((h + w) * ns * 0.01) # font size + annotator = Annotator(mosaic, line_width=round(fs / 10), font_size=fs, pil=True, example=names) + for i in range(i + 1): + x, y = int(w * (i // ns)), int(h * (i % ns)) # block origin + annotator.rectangle([x, y, x + w, y + h], None, (255, 255, 255), width=2) # borders + if paths: + annotator.text((x + 5, y + 5 + h), text=Path(paths[i]).name[:40], txt_color=(220, 220, 220)) # filenames + if len(targets) > 0: + ti = targets[targets[:, 0] == i] # image targets + boxes = xywh2xyxy(ti[:, 2:6]).T + classes = ti[:, 1].astype('int') + labels = ti.shape[1] == 6 # labels if no conf column + conf = None if labels else ti[:, 6] # check for confidence presence (label vs pred) + + if boxes.shape[1]: + if boxes.max() <= 1.01: # if normalized with tolerance 0.01 + boxes[[0, 2]] *= w # scale to pixels + boxes[[1, 3]] *= h + elif scale < 1: # absolute coords need scale if image scales + boxes *= scale + boxes[[0, 2]] += x + boxes[[1, 3]] += y + for j, box in enumerate(boxes.T.tolist()): + cls = classes[j] + color = colors(cls) + cls = names[cls] if names else cls + if labels or conf[j] > 0.25: # 0.25 conf thresh + label = f'{cls}' if labels else f'{cls} {conf[j]:.1f}' + annotator.box_label(box, label, color=color) + annotator.im.save(fname) # save + + +def plot_lr_scheduler(optimizer, scheduler, epochs=300, save_dir=''): + # Plot LR simulating training for full epochs + optimizer, scheduler = copy(optimizer), copy(scheduler) # do not modify originals + y = [] + for _ in range(epochs): + scheduler.step() + y.append(optimizer.param_groups[0]['lr']) + plt.plot(y, '.-', label='LR') + plt.xlabel('epoch') + plt.ylabel('LR') + plt.grid() + plt.xlim(0, epochs) + plt.ylim(0) + plt.savefig(Path(save_dir) / 'LR.png', dpi=200) + plt.close() + + +def plot_val_txt(): # from utils.plots import *; plot_val() + # Plot val.txt histograms + x = np.loadtxt('val.txt', dtype=np.float32) + box = xyxy2xywh(x[:, :4]) + cx, cy = box[:, 0], box[:, 1] + + fig, ax = plt.subplots(1, 1, figsize=(6, 6), tight_layout=True) + ax.hist2d(cx, cy, bins=600, cmax=10, cmin=0) + ax.set_aspect('equal') + plt.savefig('hist2d.png', dpi=300) + + fig, ax = plt.subplots(1, 2, figsize=(12, 6), tight_layout=True) + ax[0].hist(cx, bins=600) + ax[1].hist(cy, bins=600) + plt.savefig('hist1d.png', dpi=200) + + +def plot_targets_txt(): # from utils.plots import *; plot_targets_txt() + # Plot targets.txt histograms + x = np.loadtxt('targets.txt', dtype=np.float32).T + s = ['x targets', 'y targets', 'width targets', 'height targets'] + fig, ax = plt.subplots(2, 2, figsize=(8, 8), tight_layout=True) + ax = ax.ravel() + for i in range(4): + ax[i].hist(x[i], bins=100, label=f'{x[i].mean():.3g} +/- {x[i].std():.3g}') + ax[i].legend() + ax[i].set_title(s[i]) + plt.savefig('targets.jpg', dpi=200) + + +def plot_val_study(file='', dir='', x=None): # from utils.plots import *; plot_val_study() + # Plot file=study.txt generated by val.py (or plot all study*.txt in dir) + save_dir = Path(file).parent if file else Path(dir) + plot2 = False # plot additional results + if plot2: + ax = plt.subplots(2, 4, figsize=(10, 6), tight_layout=True)[1].ravel() + + fig2, ax2 = plt.subplots(1, 1, figsize=(8, 4), tight_layout=True) + # for f in [save_dir / f'study_coco_{x}.txt' for x in ['yolov5n6', 'yolov5s6', 'yolov5m6', 'yolov5l6', 'yolov5x6']]: + for f in sorted(save_dir.glob('study*.txt')): + y = np.loadtxt(f, dtype=np.float32, usecols=[0, 1, 2, 3, 7, 8, 9], ndmin=2).T + x = np.arange(y.shape[1]) if x is None else np.array(x) + if plot2: + s = ['P', 'R', 'mAP@.5', 'mAP@.5:.95', 't_preprocess (ms/img)', 't_inference (ms/img)', 't_NMS (ms/img)'] + for i in range(7): + ax[i].plot(x, y[i], '.-', linewidth=2, markersize=8) + ax[i].set_title(s[i]) + + j = y[3].argmax() + 1 + ax2.plot(y[5, 1:j], y[3, 1:j] * 1E2, '.-', linewidth=2, markersize=8, + label=f.stem.replace('study_coco_', '').replace('yolo', 'YOLO')) + + ax2.plot(1E3 / np.array([209, 140, 97, 58, 35, 18]), [34.6, 40.5, 43.0, 47.5, 49.7, 51.5], + 'k.-', linewidth=2, markersize=8, alpha=.25, label='EfficientDet') + + ax2.grid(alpha=0.2) + ax2.set_yticks(np.arange(20, 60, 5)) + ax2.set_xlim(0, 57) + ax2.set_ylim(25, 55) + ax2.set_xlabel('GPU Speed (ms/img)') + ax2.set_ylabel('COCO AP val') + ax2.legend(loc='lower right') + f = save_dir / 'study.png' + print(f'Saving {f}...') + plt.savefig(f, dpi=300) + + +@try_except # known issue https://github.com/ultralytics/yolov5/issues/5395 +@Timeout(30) # known issue https://github.com/ultralytics/yolov5/issues/5611 +def plot_labels(labels, names=(), save_dir=Path('')): + # plot dataset labels + LOGGER.info(f"Plotting labels to {save_dir / 'labels.jpg'}... ") + c, b = labels[:, 0], labels[:, 1:].transpose() # classes, boxes + nc = int(c.max() + 1) # number of classes + x = pd.DataFrame(b.transpose(), columns=['x', 'y', 'width', 'height']) + + # seaborn correlogram + sn.pairplot(x, corner=True, diag_kind='auto', kind='hist', diag_kws=dict(bins=50), plot_kws=dict(pmax=0.9)) + plt.savefig(save_dir / 'labels_correlogram.jpg', dpi=200) + plt.close() + + # matplotlib labels + matplotlib.use('svg') # faster + ax = plt.subplots(2, 2, figsize=(8, 8), tight_layout=True)[1].ravel() + y = ax[0].hist(c, bins=np.linspace(0, nc, nc + 1) - 0.5, rwidth=0.8) + try: # color histogram bars by class + [y[2].patches[i].set_color([x / 255 for x in colors(i)]) for i in range(nc)] # known issue #3195 + except Exception: + pass + ax[0].set_ylabel('instances') + if 0 < len(names) < 30: + ax[0].set_xticks(range(len(names))) + ax[0].set_xticklabels(names, rotation=90, fontsize=10) + else: + ax[0].set_xlabel('classes') + sn.histplot(x, x='x', y='y', ax=ax[2], bins=50, pmax=0.9) + sn.histplot(x, x='width', y='height', ax=ax[3], bins=50, pmax=0.9) + + # rectangles + labels[:, 1:3] = 0.5 # center + labels[:, 1:] = xywh2xyxy(labels[:, 1:]) * 2000 + img = Image.fromarray(np.ones((2000, 2000, 3), dtype=np.uint8) * 255) + for cls, *box in labels[:1000]: + ImageDraw.Draw(img).rectangle(box, width=1, outline=colors(cls)) # plot + ax[1].imshow(img) + ax[1].axis('off') + + for a in [0, 1, 2, 3]: + for s in ['top', 'right', 'left', 'bottom']: + ax[a].spines[s].set_visible(False) + + plt.savefig(save_dir / 'labels.jpg', dpi=200) + matplotlib.use('Agg') + plt.close() + + +def plot_evolve(evolve_csv='path/to/evolve.csv'): # from utils.plots import *; plot_evolve() + # Plot evolve.csv hyp evolution results + evolve_csv = Path(evolve_csv) + data = pd.read_csv(evolve_csv) + keys = [x.strip() for x in data.columns] + x = data.values + f = fitness(x) + j = np.argmax(f) # max fitness index + plt.figure(figsize=(10, 12), tight_layout=True) + matplotlib.rc('font', **{'size': 8}) + print(f'Best results from row {j} of {evolve_csv}:') + for i, k in enumerate(keys[7:]): + v = x[:, 7 + i] + mu = v[j] # best single result + plt.subplot(6, 5, i + 1) + plt.scatter(v, f, c=hist2d(v, f, 20), cmap='viridis', alpha=.8, edgecolors='none') + plt.plot(mu, f.max(), 'k+', markersize=15) + plt.title(f'{k} = {mu:.3g}', fontdict={'size': 9}) # limit to 40 characters + if i % 5 != 0: + plt.yticks([]) + print(f'{k:>15}: {mu:.3g}') + f = evolve_csv.with_suffix('.png') # filename + plt.savefig(f, dpi=200) + plt.close() + print(f'Saved {f}') + + +def plot_results(file='path/to/results.csv', dir=''): + # Plot training results.csv. Usage: from utils.plots import *; plot_results('path/to/results.csv') + save_dir = Path(file).parent if file else Path(dir) + fig, ax = plt.subplots(2, 5, figsize=(12, 6), tight_layout=True) + ax = ax.ravel() + files = list(save_dir.glob('results*.csv')) + assert len(files), f'No results.csv files found in {save_dir.resolve()}, nothing to plot.' + for fi, f in enumerate(files): + try: + data = pd.read_csv(f) + s = [x.strip() for x in data.columns] + x = data.values[:, 0] + for i, j in enumerate([1, 2, 3, 4, 5, 8, 9, 10, 6, 7]): + y = data.values[:, j] + # y[y == 0] = np.nan # don't show zero values + ax[i].plot(x, y, marker='.', label=f.stem, linewidth=2, markersize=8) + ax[i].set_title(s[j], fontsize=12) + # if j in [8, 9, 10]: # share train and val loss y axes + # ax[i].get_shared_y_axes().join(ax[i], ax[i - 5]) + except Exception as e: + LOGGER.info(f'Warning: Plotting error for {f}: {e}') + ax[1].legend() + fig.savefig(save_dir / 'results.png', dpi=200) + plt.close() + + +def profile_idetection(start=0, stop=0, labels=(), save_dir=''): + # Plot iDetection '*.txt' per-image logs. from utils.plots import *; profile_idetection() + ax = plt.subplots(2, 4, figsize=(12, 6), tight_layout=True)[1].ravel() + s = ['Images', 'Free Storage (GB)', 'RAM Usage (GB)', 'Battery', 'dt_raw (ms)', 'dt_smooth (ms)', 'real-world FPS'] + files = list(Path(save_dir).glob('frames*.txt')) + for fi, f in enumerate(files): + try: + results = np.loadtxt(f, ndmin=2).T[:, 90:-30] # clip first and last rows + n = results.shape[1] # number of rows + x = np.arange(start, min(stop, n) if stop else n) + results = results[:, x] + t = (results[0] - results[0].min()) # set t0=0s + results[0] = x + for i, a in enumerate(ax): + if i < len(results): + label = labels[fi] if len(labels) else f.stem.replace('frames_', '') + a.plot(t, results[i], marker='.', label=label, linewidth=1, markersize=5) + a.set_title(s[i]) + a.set_xlabel('time (s)') + # if fi == len(files) - 1: + # a.set_ylim(bottom=0) + for side in ['top', 'right']: + a.spines[side].set_visible(False) + else: + a.remove() + except Exception as e: + print(f'Warning: Plotting error for {f}; {e}') + ax[1].legend() + plt.savefig(Path(save_dir) / 'idetection_profile.png', dpi=200) + + +def save_one_box(xyxy, im, file='image.jpg', gain=1.02, pad=10, square=False, BGR=False, save=True): + # Save image crop as {file} with crop size multiple {gain} and {pad} pixels. Save and/or return crop + xyxy = torch.tensor(xyxy).view(-1, 4) + b = xyxy2xywh(xyxy) # boxes + if square: + b[:, 2:] = b[:, 2:].max(1)[0].unsqueeze(1) # attempt rectangle to square + b[:, 2:] = b[:, 2:] * gain + pad # box wh * gain + pad + xyxy = xywh2xyxy(b).long() + clip_coords(xyxy, im.shape) + crop = im[int(xyxy[0, 1]):int(xyxy[0, 3]), int(xyxy[0, 0]):int(xyxy[0, 2]), ::(1 if BGR else -1)] + if save: + file.parent.mkdir(parents=True, exist_ok=True) # make directory + cv2.imwrite(str(increment_path(file).with_suffix('.jpg')), crop) + return crop diff --git a/python/contrib/YOLOv5driver_assistant_system/utils/torch_utils.py b/python/contrib/YOLOv5driver_assistant_system/utils/torch_utils.py new file mode 100644 index 000000000..c5257c6eb --- /dev/null +++ b/python/contrib/YOLOv5driver_assistant_system/utils/torch_utils.py @@ -0,0 +1,329 @@ +# YOLOv5 🚀 by Ultralytics, GPL-3.0 license +""" +PyTorch utils +""" + +import datetime +import math +import os +import platform +import subprocess +import time +import warnings +from contextlib import contextmanager +from copy import deepcopy +from pathlib import Path + +import torch +import torch.distributed as dist +import torch.nn as nn +import torch.nn.functional as F + +from utils.general import LOGGER + +try: + import thop # for FLOPs computation +except ImportError: + thop = None + +# Suppress PyTorch warnings +warnings.filterwarnings('ignore', message='User provided device_type of \'cuda\', but CUDA is not available. Disabling') + + +@contextmanager +def torch_distributed_zero_first(local_rank: int): + """ + Decorator to make all processes in distributed training wait for each local_master to do something. + """ + if local_rank not in [-1, 0]: + dist.barrier(device_ids=[local_rank]) + yield + if local_rank == 0: + dist.barrier(device_ids=[0]) + + +def date_modified(path=__file__): + # return human-readable file modification date, i.e. '2021-3-26' + t = datetime.datetime.fromtimestamp(Path(path).stat().st_mtime) + return f'{t.year}-{t.month}-{t.day}' + + +def git_describe(path=Path(__file__).parent): # path must be a directory + # return human-readable git description, i.e. v5.0-5-g3e25f1e https://git-scm.com/docs/git-describe + s = f'git -C {path} describe --tags --long --always' + try: + return subprocess.check_output(s, shell=True, stderr=subprocess.STDOUT).decode()[:-1] + except subprocess.CalledProcessError: + return '' # not a git repository + + +def device_count(): + # Returns number of CUDA devices available. Safe version of torch.cuda.device_count(). Only works on Linux. + assert platform.system() == 'Linux', 'device_count() function only works on Linux' + try: + cmd = 'nvidia-smi -L | wc -l' + return int(subprocess.run(cmd, shell=True, capture_output=True, check=True).stdout.decode().split()[-1]) + except Exception: + return 0 + + +def select_device(device='', batch_size=0, newline=True): + # device = 'cpu' or '0' or '0,1,2,3' + s = f'YOLOv5 🚀 {git_describe() or date_modified()} torch {torch.__version__} ' # string + device = str(device).strip().lower().replace('cuda:', '') # to string, 'cuda:0' to '0' + cpu = device == 'cpu' + if cpu: + os.environ['CUDA_VISIBLE_DEVICES'] = '-1' # force torch.cuda.is_available() = False + elif device: # non-cpu device requested + os.environ['CUDA_VISIBLE_DEVICES'] = device # set environment variable - must be before assert is_available() + assert torch.cuda.is_available() and torch.cuda.device_count() >= len(device.replace(',', '')), \ + f"Invalid CUDA '--device {device}' requested, use '--device cpu' or pass valid CUDA device(s)" + + cuda = not cpu and torch.cuda.is_available() + if cuda: + devices = device.split(',') if device else '0' # range(torch.cuda.device_count()) # i.e. 0,1,6,7 + n = len(devices) # device count + if n > 1 and batch_size > 0: # check batch_size is divisible by device_count + assert batch_size % n == 0, f'batch-size {batch_size} not multiple of GPU count {n}' + space = ' ' * (len(s) + 1) + for i, d in enumerate(devices): + p = torch.cuda.get_device_properties(i) + s += f"{'' if i == 0 else space}CUDA:{d} ({p.name}, {p.total_memory / 1024 ** 2:.0f}MiB)\n" # bytes to MB + else: + s += 'CPU\n' + + if not newline: + s = s.rstrip() + LOGGER.info(s.encode().decode('ascii', 'ignore') if platform.system() == 'Windows' else s) # emoji-safe + return torch.device('cuda:0' if cuda else 'cpu') + + +def time_sync(): + # pytorch-accurate time + if torch.cuda.is_available(): + torch.cuda.synchronize() + return time.time() + + +def profile(input, ops, n=10, device=None): + # YOLOv5 speed/memory/FLOPs profiler + # + # Usage: + # input = torch.randn(16, 3, 640, 640) + # m1 = lambda x: x * torch.sigmoid(x) + # m2 = nn.SiLU() + # profile(input, [m1, m2], n=100) # profile over 100 iterations + + results = [] + device = device or select_device() + print(f"{'Params':>12s}{'GFLOPs':>12s}{'GPU_mem (GB)':>14s}{'forward (ms)':>14s}{'backward (ms)':>14s}" + f"{'input':>24s}{'output':>24s}") + + for x in input if isinstance(input, list) else [input]: + x = x.to(device) + x.requires_grad = True + for m in ops if isinstance(ops, list) else [ops]: + m = m.to(device) if hasattr(m, 'to') else m # device + m = m.half() if hasattr(m, 'half') and isinstance(x, torch.Tensor) and x.dtype is torch.float16 else m + tf, tb, t = 0, 0, [0, 0, 0] # dt forward, backward + try: + flops = thop.profile(m, inputs=(x,), verbose=False)[0] / 1E9 * 2 # GFLOPs + except Exception: + flops = 0 + + try: + for _ in range(n): + t[0] = time_sync() + y = m(x) + t[1] = time_sync() + try: + _ = (sum(yi.sum() for yi in y) if isinstance(y, list) else y).sum().backward() + t[2] = time_sync() + except Exception: # no backward method + # print(e) # for debug + t[2] = float('nan') + tf += (t[1] - t[0]) * 1000 / n # ms per op forward + tb += (t[2] - t[1]) * 1000 / n # ms per op backward + mem = torch.cuda.memory_reserved() / 1E9 if torch.cuda.is_available() else 0 # (GB) + s_in = tuple(x.shape) if isinstance(x, torch.Tensor) else 'list' + s_out = tuple(y.shape) if isinstance(y, torch.Tensor) else 'list' + p = sum(list(x.numel() for x in m.parameters())) if isinstance(m, nn.Module) else 0 # parameters + print(f'{p:12}{flops:12.4g}{mem:>14.3f}{tf:14.4g}{tb:14.4g}{str(s_in):>24s}{str(s_out):>24s}') + results.append([p, flops, mem, tf, tb, s_in, s_out]) + except Exception as e: + print(e) + results.append(None) + torch.cuda.empty_cache() + return results + + +def is_parallel(model): + # Returns True if model is of type DP or DDP + return type(model) in (nn.parallel.DataParallel, nn.parallel.DistributedDataParallel) + + +def de_parallel(model): + # De-parallelize a model: returns single-GPU model if model is of type DP or DDP + return model.module if is_parallel(model) else model + + +def initialize_weights(model): + for m in model.modules(): + t = type(m) + if t is nn.Conv2d: + pass # nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu') + elif t is nn.BatchNorm2d: + m.eps = 1e-3 + m.momentum = 0.03 + elif t in [nn.Hardswish, nn.LeakyReLU, nn.ReLU, nn.ReLU6, nn.SiLU]: + m.inplace = True + + +def find_modules(model, mclass=nn.Conv2d): + # Finds layer indices matching module class 'mclass' + return [i for i, m in enumerate(model.module_list) if isinstance(m, mclass)] + + +def sparsity(model): + # Return global model sparsity + a, b = 0, 0 + for p in model.parameters(): + a += p.numel() + b += (p == 0).sum() + return b / a + + +def prune(model, amount=0.3): + # Prune model to requested global sparsity + import torch.nn.utils.prune as prune + print('Pruning model... ', end='') + for name, m in model.named_modules(): + if isinstance(m, nn.Conv2d): + prune.l1_unstructured(m, name='weight', amount=amount) # prune + prune.remove(m, 'weight') # make permanent + print(' %.3g global sparsity' % sparsity(model)) + + +def fuse_conv_and_bn(conv, bn): + # Fuse convolution and batchnorm layers https://tehnokv.com/posts/fusing-batchnorm-and-conv/ + fusedconv = nn.Conv2d(conv.in_channels, + conv.out_channels, + kernel_size=conv.kernel_size, + stride=conv.stride, + padding=conv.padding, + groups=conv.groups, + bias=True).requires_grad_(False).to(conv.weight.device) + + # prepare filters + w_conv = conv.weight.clone().view(conv.out_channels, -1) + w_bn = torch.diag(bn.weight.div(torch.sqrt(bn.eps + bn.running_var))) + fusedconv.weight.copy_(torch.mm(w_bn, w_conv).view(fusedconv.weight.shape)) + + # prepare spatial bias + b_conv = torch.zeros(conv.weight.size(0), device=conv.weight.device) if conv.bias is None else conv.bias + b_bn = bn.bias - bn.weight.mul(bn.running_mean).div(torch.sqrt(bn.running_var + bn.eps)) + fusedconv.bias.copy_(torch.mm(w_bn, b_conv.reshape(-1, 1)).reshape(-1) + b_bn) + + return fusedconv + + +def model_info(model, verbose=False, img_size=640): + # Model information. img_size may be int or list, i.e. img_size=640 or img_size=[640, 320] + n_p = sum(x.numel() for x in model.parameters()) # number parameters + n_g = sum(x.numel() for x in model.parameters() if x.requires_grad) # number gradients + if verbose: + print(f"{'layer':>5} {'name':>40} {'gradient':>9} {'parameters':>12} {'shape':>20} {'mu':>10} {'sigma':>10}") + for i, (name, p) in enumerate(model.named_parameters()): + name = name.replace('module_list.', '') + print('%5g %40s %9s %12g %20s %10.3g %10.3g' % + (i, name, p.requires_grad, p.numel(), list(p.shape), p.mean(), p.std())) + + try: # FLOPs + from thop import profile + stride = max(int(model.stride.max()), 32) if hasattr(model, 'stride') else 32 + img = torch.zeros((1, model.yaml.get('ch', 3), stride, stride), device=next(model.parameters()).device) # input + flops = profile(deepcopy(model), inputs=(img,), verbose=False)[0] / 1E9 * 2 # stride GFLOPs + img_size = img_size if isinstance(img_size, list) else [img_size, img_size] # expand if int/float + fs = ', %.1f GFLOPs' % (flops * img_size[0] / stride * img_size[1] / stride) # 640x640 GFLOPs + except (ImportError, Exception): + fs = '' + + LOGGER.info(f"Model Summary: {len(list(model.modules()))} layers, {n_p} parameters, {n_g} gradients{fs}") + + +def scale_img(img, ratio=1.0, same_shape=False, gs=32): # img(16,3,256,416) + # scales img(bs,3,y,x) by ratio constrained to gs-multiple + if ratio == 1.0: + return img + else: + h, w = img.shape[2:] + s = (int(h * ratio), int(w * ratio)) # new size + img = F.interpolate(img, size=s, mode='bilinear', align_corners=False) # resize + if not same_shape: # pad/crop img + h, w = (math.ceil(x * ratio / gs) * gs for x in (h, w)) + return F.pad(img, [0, w - s[1], 0, h - s[0]], value=0.447) # value = imagenet mean + + +def copy_attr(a, b, include=(), exclude=()): + # Copy attributes from b to a, options to only include [...] and to exclude [...] + for k, v in b.__dict__.items(): + if (len(include) and k not in include) or k.startswith('_') or k in exclude: + continue + else: + setattr(a, k, v) + + +class EarlyStopping: + # YOLOv5 simple early stopper + def __init__(self, patience=30): + self.best_fitness = 0.0 # i.e. mAP + self.best_epoch = 0 + self.patience = patience or float('inf') # epochs to wait after fitness stops improving to stop + self.possible_stop = False # possible stop may occur next epoch + + def __call__(self, epoch, fitness): + if fitness >= self.best_fitness: # >= 0 to allow for early zero-fitness stage of training + self.best_epoch = epoch + self.best_fitness = fitness + delta = epoch - self.best_epoch # epochs without improvement + self.possible_stop = delta >= (self.patience - 1) # possible stop may occur next epoch + stop = delta >= self.patience # stop training if patience exceeded + if stop: + LOGGER.info(f'Stopping training early as no improvement observed in last {self.patience} epochs. ' + f'Best results observed at epoch {self.best_epoch}, best model saved as best.pt.\n' + f'To update EarlyStopping(patience={self.patience}) pass a new patience value, ' + f'i.e. `python train.py --patience 300` or use `--patience 0` to disable EarlyStopping.') + return stop + + +class ModelEMA: + """ Updated Exponential Moving Average (EMA) from https://github.com/rwightman/pytorch-image-models + Keeps a moving average of everything in the model state_dict (parameters and buffers) + For EMA details see https://www.tensorflow.org/api_docs/python/tf/train/ExponentialMovingAverage + """ + + def __init__(self, model, decay=0.9999, updates=0): + # Create EMA + self.ema = deepcopy(de_parallel(model)).eval() # FP32 EMA + # if next(model.parameters()).device.type != 'cpu': + # self.ema.half() # FP16 EMA + self.updates = updates # number of EMA updates + self.decay = lambda x: decay * (1 - math.exp(-x / 2000)) # decay exponential ramp (to help early epochs) + for p in self.ema.parameters(): + p.requires_grad_(False) + + def update(self, model): + # Update EMA parameters + with torch.no_grad(): + self.updates += 1 + d = self.decay(self.updates) + + msd = de_parallel(model).state_dict() # model state_dict + for k, v in self.ema.state_dict().items(): + if v.dtype.is_floating_point: + v *= d + v += (1 - d) * msd[k].detach() + + def update_attr(self, model, include=(), exclude=('process_group', 'reducer')): + # Update EMA attributes + copy_attr(self.ema, model, include, exclude) -- Gitee