From 48858e0395417bb0c53ac9af883fcb3643e22741 Mon Sep 17 00:00:00 2001 From: michieltukker Date: Sun, 18 Feb 2024 15:44:58 +0100 Subject: [PATCH] Added container definitions and test environment --- Dockerfile | 8 ++-- docker-compose.yml | 77 ++++++++++++++++++++++++++++++++++ local_test/Dockerfile | 11 +++++ local_test/requirements.txt | 2 + local_test/test_app.py | 82 +++++++++++++++++++++++++++++++++++++ 5 files changed, 176 insertions(+), 4 deletions(-) create mode 100644 docker-compose.yml create mode 100644 local_test/Dockerfile create mode 100644 local_test/requirements.txt create mode 100644 local_test/test_app.py diff --git a/Dockerfile b/Dockerfile index 8a93d08..dbc48b3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,10 +2,10 @@ FROM python:3.11-bookworm WORKDIR /app -COPY ./requirements.txt . +COPY requirements.txt /app/requirements.txt -RUN pip install -r requirements.txt +RUN pip install -r /app/requirements.txt -COPY . . +COPY src/simulator_worker /app/ -ENTRYPOINT ./run.sh \ No newline at end of file +ENTRYPOINT python -m simulator_worker.simulator_worker \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..834c03e --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,77 @@ +version: "3.8" + +networks: + omotes: + + +volumes: + db-data: + broker-data: + influxdb_storage: + + +services: + rabbitmq: + image: bitnami/rabbitmq:3.8.27 + ports: + - "15672:15672" + - "5673:5672" + networks: + - omotes + healthcheck: + test: [ "CMD", "curl", "-f", "http://localhost:15672" ] + interval: 10s + timeout: 10s + retries: 5 + + omotes_influxdb: + image: influxdb:1.7 + ports: + - "${INFLUXDB_PORT}:${INFLUXDB_PORT}" + - "${INFLUXDB_RPC_PORT}:${INFLUXDB_RPC_PORT}" + networks: + - omotes + environment: + - INFLUXDB_ADMIN_USER=${INFLUXDB_ADMIN_USER} + - INFLUXDB_ADMIN_PASSWORD=${INFLUXDB_ADMIN_PASSWORD} + - INFLUXDB_HTTP_BIND_ADDRESS=:${INFLUXDB_PORT} + - INFLUXDB_BIND_ADDRESS=:${INFLUXDB_RPC_PORT} + - INFLUXDB_DB=omotes_timeseries + - INFLUXDB_WRITE_USER=${INFLUXDB_WRITE_USER} + - INFLUXDB_WRITE_USER_PASSWORD=${INFLUXDB_WRITE_USER_PASSWORD} + healthcheck: + test: + [ + "CMD", + "curl", + "-f", + "http://omotes_influxdb:${INFLUXDB_PORT}/ping" + ] + interval: 10s + timeout: 5s + volumes: + - influxdb_storage:/var/lib/influxdb + + simulator_worker: + build: + context: . + env_file: .env + networks: + - omotes + deploy: + replicas: 1 + depends_on: + rabbitmq: + condition: service_healthy + omotes_influxdb: + condition: service_healthy + + local_test: + build: + context: ./local_test + dockerfile: Dockerfile + networks: + - omotes + depends_on: + simulator_worker: + condition: service_started diff --git a/local_test/Dockerfile b/local_test/Dockerfile new file mode 100644 index 0000000..9590968 --- /dev/null +++ b/local_test/Dockerfile @@ -0,0 +1,11 @@ +FROM python:3.11-bookworm + +WORKDIR /app + +COPY ./requirements.txt . + +RUN pip install -r requirements.txt + +COPY . . + +ENTRYPOINT python -u test_app.py \ No newline at end of file diff --git a/local_test/requirements.txt b/local_test/requirements.txt new file mode 100644 index 0000000..8a5c52f --- /dev/null +++ b/local_test/requirements.txt @@ -0,0 +1,2 @@ +celery==5.3.5 +jsonpickle==3.0.2 \ No newline at end of file diff --git a/local_test/test_app.py b/local_test/test_app.py new file mode 100644 index 0000000..5618fc7 --- /dev/null +++ b/local_test/test_app.py @@ -0,0 +1,82 @@ +import sys +import threading +from typing import Any +from uuid import UUID, uuid4 + +import jsonpickle # type: ignore +from celery import Celery # type: ignore + +input_esdl_no_influx = "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KPGVzZGw6RW5lcmd5U3lzdGVtIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmVzZGw9Imh0dHA6Ly93d3cudG5vLm5sL2VzZGwiIG5hbWU9IlVudGl0bGVkIEVuZXJneVN5c3RlbSB3aXRoIHJldHVybiBuZXR3b3JrIiBpZD0iN2FjMDkyMzEtY2U2MC00YzI0LTgzMzgtOWMwMzE3Njk1YmE0X3dpdGhfcmV0dXJuX25ldHdvcmsiIGRlc2NyaXB0aW9uPSIiIGVzZGxWZXJzaW9uPSJ2MjIxMCIgdmVyc2lvbj0iMTQiPgogIDxlbmVyZ3lTeXN0ZW1JbmZvcm1hdGlvbiB4c2k6dHlwZT0iZXNkbDpFbmVyZ3lTeXN0ZW1JbmZvcm1hdGlvbiIgaWQ9ImU2NDczN2Q5LWQ3NzItNDcyMy1iMDkyLWEwYjM5N2FjMDBiMyI+CiAgICA8Y2FycmllcnMgeHNpOnR5cGU9ImVzZGw6Q2FycmllcnMiIGlkPSI5ZGZmMTNiOS03N2NkLTRiOTktODc3Ny02Yjc2ODBhMTU1YjYiPgogICAgICA8Y2FycmllciB4c2k6dHlwZT0iZXNkbDpIZWF0Q29tbW9kaXR5IiBpZD0iN2IzMmUyODctZDc3NS00ODBjLWIzMTctNjRmZmRhY2YxMmM5IiBuYW1lPSJIZWF0IiBzdXBwbHlUZW1wZXJhdHVyZT0iNzAuMCIvPgogICAgICA8Y2FycmllciB4c2k6dHlwZT0iZXNkbDpIZWF0Q29tbW9kaXR5IiByZXR1cm5UZW1wZXJhdHVyZT0iNDAuMCIgaWQ9IjdiMzJlMjg3LWQ3NzUtNDgwYy1iMzE3LTY0ZmZkYWNmMTJjOV9yZXQiIG5hbWU9IkhlYXRfcmV0Ii8+CiAgICA8L2NhcnJpZXJzPgogIDwvZW5lcmd5U3lzdGVtSW5mb3JtYXRpb24+CiAgPGluc3RhbmNlIHhzaTp0eXBlPSJlc2RsOkluc3RhbmNlIiBpZD0iZjg1MmI5NDEtOTlmZS00ODdiLWEyMGQtMDFiZWZmOWU3YzQzIiBuYW1lPSJVbnRpdGxlZCBJbnN0YW5jZSI+CiAgICA8YXJlYSB4c2k6dHlwZT0iZXNkbDpBcmVhIiBpZD0iZjRhY2M3ZWYtYTM3ZC00M2I3LTg3Y2ItOGFmNWI4MmUzZmVkIiBuYW1lPSJVbnRpdGxlZCBBcmVhIj4KICAgICAgPGFzc2V0IHhzaTp0eXBlPSJlc2RsOkhlYXRpbmdEZW1hbmQiIG5hbWU9IkhlYXRpbmdEZW1hbmRfMSIgaWQ9ImMyZDc3YWJjLTE2NTYtNDcyMi04NTA4LTdjNjQ1NzRlMDRlZiIgcG93ZXI9IjEwMDAwMDAwLjAiPgogICAgICAgIDxnZW9tZXRyeSB4c2k6dHlwZT0iZXNkbDpQb2ludCIgQ1JTPSJXR1M4NCIgbGF0PSI1Mi4wNDE5ODU4ODk0NDE0NiIgbG9uPSI0LjMwODg3MjIyMjkwMDM5MTUiLz4KICAgICAgICA8cG9ydCB4c2k6dHlwZT0iZXNkbDpJblBvcnQiIGNvbm5lY3RlZFRvPSIxZGZkYzE3Mi05MzU5LTQzNWEtODE1My0wYTY1NzkzMjIyM2EiIGlkPSIyYTg3MzE5NS1mYTZiLTQyNTAtODUxOS0wNDZmMDQwZmVkYjciIGNhcnJpZXI9IjdiMzJlMjg3LWQ3NzUtNDgwYy1iMzE3LTY0ZmZkYWNmMTJjOSIgbmFtZT0iSW4iLz4KICAgICAgICA8cG9ydCB4c2k6dHlwZT0iZXNkbDpPdXRQb3J0IiBpZD0iZWY3NGVhOGMtODliNC00MmUwLWE5OGMtNDExODYwODc2YzFhIiBjb25uZWN0ZWRUbz0iMThjZTY5MDYtNTk1Yy00NWU0LWFjZjAtZTA3ZjdkNzY0OGM2IiBjYXJyaWVyPSI3YjMyZTI4Ny1kNzc1LTQ4MGMtYjMxNy02NGZmZGFjZjEyYzlfcmV0IiBuYW1lPSJPdXQiLz4KICAgICAgICA8Y29zdEluZm9ybWF0aW9uIHhzaTp0eXBlPSJlc2RsOkNvc3RJbmZvcm1hdGlvbiIgaWQ9ImQ4YTY3MjQzLTRlNGUtNDNmOC05ODAxLWZkNDU3OWMwZWRkZiI+CiAgICAgICAgICA8aW5zdGFsbGF0aW9uQ29zdHMgeHNpOnR5cGU9ImVzZGw6U2luZ2xlVmFsdWUiIHZhbHVlPSIxMDAwMDAwLjAiIGlkPSJhY2NkODRiYy1kM2VkLTQ1MjgtYTFmZi1mOTA2YzQ4OTkxYTEiPgogICAgICAgICAgICA8cHJvZmlsZVF1YW50aXR5QW5kVW5pdCB4c2k6dHlwZT0iZXNkbDpRdWFudGl0eUFuZFVuaXRUeXBlIiB1bml0PSJFVVJPIiBwaHlzaWNhbFF1YW50aXR5PSJDT1NUIiBpZD0iYWU4YjgxZmItODU3Yi00MjgwLTllOTEtOTE5ZGQxYzc2NzVlIiBkZXNjcmlwdGlvbj0iQ29zdCBpbiBFVVIiLz4KICAgICAgICAgIDwvaW5zdGFsbGF0aW9uQ29zdHM+CiAgICAgICAgPC9jb3N0SW5mb3JtYXRpb24+CiAgICAgIDwvYXNzZXQ+CiAgICAgIDxhc3NldCB4c2k6dHlwZT0iZXNkbDpIZWF0aW5nRGVtYW5kIiBuYW1lPSJIZWF0aW5nRGVtYW5kXzIiIGlkPSI5MzUyZDk4NC0wZTIxLTRhZjYtOWM1Zi05MWY5ODRhYmZjZmQiIHBvd2VyPSIxMDAwMDAwMC4wIj4KICAgICAgICA8Z2VvbWV0cnkgeHNpOnR5cGU9ImVzZGw6UG9pbnQiIENSUz0iV0dTODQiIGxhdD0iNTIuMDQwMDI1OTAzNjk1NjgiIGxvbj0iNC4zMTA2MTAyOTQzNDIwNDIiLz4KICAgICAgICA8cG9ydCB4c2k6dHlwZT0iZXNkbDpJblBvcnQiIGNvbm5lY3RlZFRvPSI1M2E1NDQ0OC1hYmRiLTQxYWItYTUzZS00OTg1NTYwNjIyMTYiIGlkPSJhNGE3YzIzZS00ZDc3LTRiYmUtYjhiNC1kZGYyZDJkNmU5N2UiIGNhcnJpZXI9IjdiMzJlMjg3LWQ3NzUtNDgwYy1iMzE3LTY0ZmZkYWNmMTJjOSIgbmFtZT0iSW4iLz4KICAgICAgICA8cG9ydCB4c2k6dHlwZT0iZXNkbDpPdXRQb3J0IiBpZD0iYmY2ZTBiNmItYmFhYy00NjhiLWE5YmEtZjgzOTdiYWJmNWQ2IiBjb25uZWN0ZWRUbz0iZDEyNmY3OWUtYzQzZS00ZDlkLWE3Y2UtOGY1OGJlNjM0Njk1IiBjYXJyaWVyPSI3YjMyZTI4Ny1kNzc1LTQ4MGMtYjMxNy02NGZmZGFjZjEyYzlfcmV0IiBuYW1lPSJPdXQiLz4KICAgICAgICA8Y29zdEluZm9ybWF0aW9uIHhzaTp0eXBlPSJlc2RsOkNvc3RJbmZvcm1hdGlvbiIgaWQ9IjdkOTVkYzU4LTAyYjAtNDljZi1hN2E3LTU2MjNmZmZiNDA3OSI+CiAgICAgICAgICA8aW5zdGFsbGF0aW9uQ29zdHMgeHNpOnR5cGU9ImVzZGw6U2luZ2xlVmFsdWUiIHZhbHVlPSIxMDAwMDAwLjAiIGlkPSJjMzNhZjYyOS02ZmM1LTRkN2MtOWFjNC01YjFlMGRiMjk1YTUiPgogICAgICAgICAgICA8cHJvZmlsZVF1YW50aXR5QW5kVW5pdCB4c2k6dHlwZT0iZXNkbDpRdWFudGl0eUFuZFVuaXRUeXBlIiB1bml0PSJFVVJPIiBwaHlzaWNhbFF1YW50aXR5PSJDT1NUIiBpZD0iODkzMDE4MjYtYWNmMy00ZmVjLWIwM2MtN2RiMjc3ZGUwMDRhIiBkZXNjcmlwdGlvbj0iQ29zdCBpbiBFVVIiLz4KICAgICAgICAgIDwvaW5zdGFsbGF0aW9uQ29zdHM+CiAgICAgICAgPC9jb3N0SW5mb3JtYXRpb24+CiAgICAgIDwvYXNzZXQ+CiAgICAgIDxhc3NldCB4c2k6dHlwZT0iZXNkbDpIZWF0aW5nRGVtYW5kIiBuYW1lPSJIZWF0aW5nRGVtYW5kXzMiIGlkPSJlMjk1YTE1NS0zZmFiLTRhYjEtOTI1ZC03YmRiNTAwOTRmNDgiIHBvd2VyPSIxMDAwMDAwMC4wIj4KICAgICAgICA8Z2VvbWV0cnkgeHNpOnR5cGU9ImVzZGw6UG9pbnQiIGxhdD0iNTIuMDM3OTY4NDg2MTM3NjEiIGxvbj0iNC4zMTI2NDYwOTA5ODQzNDUiLz4KICAgICAgICA8cG9ydCB4c2k6dHlwZT0iZXNkbDpJblBvcnQiIGNvbm5lY3RlZFRvPSIxNmIxMzM3Yy01OTcwLTRlYjQtOTBkMy1lNTJkNTE0YTEzZGYiIGlkPSI3NzAwMjJlNi0zZTcxLTRlNTEtODU0NC0wZGJhODZjNDZhNWIiIGNhcnJpZXI9IjdiMzJlMjg3LWQ3NzUtNDgwYy1iMzE3LTY0ZmZkYWNmMTJjOSIgbmFtZT0iSW4iLz4KICAgICAgICA8cG9ydCB4c2k6dHlwZT0iZXNkbDpPdXRQb3J0IiBpZD0iOWMwMjViMTktNTdkMS00M2E4LWIyZTgtZGIzZTY4NDc1NmYyIiBjb25uZWN0ZWRUbz0iNWNkMGYyZTAtZDQ1Ni00OTA5LWE4MWMtNGIzMTJiMWJlODU3IiBjYXJyaWVyPSI3YjMyZTI4Ny1kNzc1LTQ4MGMtYjMxNy02NGZmZGFjZjEyYzlfcmV0IiBuYW1lPSJPdXQiLz4KICAgICAgICA8Y29zdEluZm9ybWF0aW9uIHhzaTp0eXBlPSJlc2RsOkNvc3RJbmZvcm1hdGlvbiIgaWQ9IjNkMDdiMTcxLWY2NWItNDEzZC05MDkwLTJkMWNkNTc4YTQ4OCI+CiAgICAgICAgICA8aW5zdGFsbGF0aW9uQ29zdHMgeHNpOnR5cGU9ImVzZGw6U2luZ2xlVmFsdWUiIHZhbHVlPSIxMDAwMDAwLjAiIGlkPSJhZTFkNmNkOC0yOTkwLTRhNzctYTc0Yy02NWViOWM5M2IwODQiPgogICAgICAgICAgICA8cHJvZmlsZVF1YW50aXR5QW5kVW5pdCB4c2k6dHlwZT0iZXNkbDpRdWFudGl0eUFuZFVuaXRUeXBlIiB1bml0PSJFVVJPIiBwaHlzaWNhbFF1YW50aXR5PSJDT1NUIiBpZD0iN2ZlYjI4Y2EtYmZiOC00YzBkLWIxYjUtYWIxYjM5N2UzOTRjIiBkZXNjcmlwdGlvbj0iQ29zdCBpbiBFVVIiLz4KICAgICAgICAgIDwvaW5zdGFsbGF0aW9uQ29zdHM+CiAgICAgICAgPC9jb3N0SW5mb3JtYXRpb24+CiAgICAgIDwvYXNzZXQ+CiAgICAgIDxhc3NldCB4c2k6dHlwZT0iZXNkbDpQaXBlIiByZWxhdGVkPSJQaXBlMV9yZXQiIGRpYW1ldGVyPSJETjQ1MCIgbmFtZT0iUGlwZTEiIGxlbmd0aD0iMjQ1LjciIGlubmVyRGlhbWV0ZXI9IjAuNDQ0NCIgaWQ9IlBpcGUxIiBvdXRlckRpYW1ldGVyPSIwLjYzIj4KICAgICAgICA8Z2VvbWV0cnkgeHNpOnR5cGU9ImVzZGw6TGluZSIgQ1JTPSJXR1M4NCI+CiAgICAgICAgICA8cG9pbnQgeHNpOnR5cGU9ImVzZGw6UG9pbnQiIGxhdD0iNTIuMDQ0Njk4MDUxMTkyMTQiIGxvbj0iNC4zMTAwNTIzOTQ4NjY5NDQiLz4KICAgICAgICAgIDxwb2ludCB4c2k6dHlwZT0iZXNkbDpQb2ludCIgbGF0PSI1Mi4wNDI3NDE0ODM4ODg0OSIgbG9uPSI0LjMxMTcyMDcyODg3NDIwNyIvPgogICAgICAgIDwvZ2VvbWV0cnk+CiAgICAgICAgPHBvcnQgeHNpOnR5cGU9ImVzZGw6SW5Qb3J0IiBjb25uZWN0ZWRUbz0iNDViZmM3ZDAtZWY1OS00ZjQ5LWIzN2EtODY3YjE4ZTA0Yjg2IiBpZD0iYjQ2MmQ1NjQtYThjMC00YWUwLWE0YWYtMzY5NThmMjQ1NWVhIiBjYXJyaWVyPSI3YjMyZTI4Ny1kNzc1LTQ4MGMtYjMxNy02NGZmZGFjZjEyYzkiIG5hbWU9IkluIi8+CiAgICAgICAgPHBvcnQgeHNpOnR5cGU9ImVzZGw6T3V0UG9ydCIgaWQ9IjY2NTkwZjk2LWEzOTctNGQ2Zi05Y2ZiLWU3ZDM0MjMyY2FkNiIgY29ubmVjdGVkVG89IjUxODUyODYxLWFlZWItNDYxZi1iOGVjLTA4ZjAwMGFiYzZkZCIgY2Fycmllcj0iN2IzMmUyODctZDc3NS00ODBjLWIzMTctNjRmZmRhY2YxMmM5IiBuYW1lPSJPdXQiLz4KICAgICAgICA8bWF0ZXJpYWwgeHNpOnR5cGU9ImVzZGw6Q29tcG91bmRNYXR0ZXIiIGNvbXBvdW5kVHlwZT0iTEFZRVJFRCI+CiAgICAgICAgICA8Y29tcG9uZW50IHhzaTp0eXBlPSJlc2RsOkNvbXBvdW5kTWF0dGVyQ29tcG9uZW50IiBsYXllcldpZHRoPSIwLjAwNjMiPgogICAgICAgICAgICA8bWF0dGVyIHhzaTp0eXBlPSJlc2RsOk1hdGVyaWFsIiB0aGVybWFsQ29uZHVjdGl2aXR5PSI1Mi4xNSIgbmFtZT0ic3RlZWwiIGlkPSIzNzFjMWQ3Mi1kZTM1LTQ1NTktOWIwZS00NzE3MmU1ZDFkODMiLz4KICAgICAgICAgIDwvY29tcG9uZW50PgogICAgICAgICAgPGNvbXBvbmVudCB4c2k6dHlwZT0iZXNkbDpDb21wb3VuZE1hdHRlckNvbXBvbmVudCIgbGF5ZXJXaWR0aD0iMC4wODA1Ij4KICAgICAgICAgICAgPG1hdHRlciB4c2k6dHlwZT0iZXNkbDpNYXRlcmlhbCIgdGhlcm1hbENvbmR1Y3Rpdml0eT0iMC4wMjciIG5hbWU9IlBVUiIgaWQ9ImRmMzBiZDM3LTJmYzQtNDk5My04MjhmLTFiN2NmMWU4MjAyYyIvPgogICAgICAgICAgPC9jb21wb25lbnQ+CiAgICAgICAgICA8Y29tcG9uZW50IHhzaTp0eXBlPSJlc2RsOkNvbXBvdW5kTWF0dGVyQ29tcG9uZW50IiBsYXllcldpZHRoPSIwLjAwNiI+CiAgICAgICAgICAgIDxtYXR0ZXIgeHNpOnR5cGU9ImVzZGw6TWF0ZXJpYWwiIHRoZXJtYWxDb25kdWN0aXZpdHk9IjAuNCIgbmFtZT0iSERQRSIgaWQ9ImY1M2RlMzdiLWE3MzUtNGIwZC1iMjI2LWE2YjcyMjAyOWEwMSIvPgogICAgICAgICAgPC9jb21wb25lbnQ+CiAgICAgICAgPC9tYXRlcmlhbD4KICAgICAgICA8ZGF0YVNvdXJjZSB4c2k6dHlwZT0iZXNkbDpEYXRhU291cmNlIiBhdHRyaWJ1dGlvbj0iaHR0cHM6Ly93d3cubG9nc3Rvci5jb20vbWVkaWEvNjUwNi9wcm9kdWN0LWNhdGFsb2d1ZS11ay0yMDIwMDMucGRmIiBuYW1lPSJMb2dzdG9yIFByb2R1Y3QgQ2F0YWxvZ3VlIFZlcnNpb24gMjAyMC4wMyIvPgogICAgICAgIDxjb3N0SW5mb3JtYXRpb24geHNpOnR5cGU9ImVzZGw6Q29zdEluZm9ybWF0aW9uIiBpZD0iZWMyZDc0MGMtMmYxMy00YjcwLWExYmItNmU0YTU2MTQxNGMyIj4KICAgICAgICAgIDxpbnZlc3RtZW50Q29zdHMgeHNpOnR5cGU9ImVzZGw6U2luZ2xlVmFsdWUiIG5hbWU9IkNvbWJpbmVkIGludmVzdG1lbnQgYW5kIGluc3RhbGxhdGlvbiBjb3N0cyIgaWQ9ImE0MDE2NWU4LTg4YmQtNDliOS04MWQ5LTI5ODgxMmFjMDE3MCIgdmFsdWU9IjM0MTcuOSI+CiAgICAgICAgICAgIDxwcm9maWxlUXVhbnRpdHlBbmRVbml0IHhzaTp0eXBlPSJlc2RsOlF1YW50aXR5QW5kVW5pdFR5cGUiIGlkPSJkMGFlYmM3Ni0yMDFiLTRiMmQtODFmZS01NTI2OWZjZWZlM2IiIGRlc2NyaXB0aW9uPSJDb3N0cyBpbiBFVVIvbSIgcGVyVW5pdD0iTUVUUkUiIHBoeXNpY2FsUXVhbnRpdHk9IkNPU1QiIHVuaXQ9IkVVUk8iLz4KICAgICAgICAgIDwvaW52ZXN0bWVudENvc3RzPgogICAgICAgIDwvY29zdEluZm9ybWF0aW9uPgogICAgICA8L2Fzc2V0PgogICAgICA8YXNzZXQgeHNpOnR5cGU9ImVzZGw6UGlwZSIgcmVsYXRlZD0iUGlwZTJfcmV0IiBkaWFtZXRlcj0iRE40NTAiIG5hbWU9IlBpcGUyIiBsZW5ndGg9IjE5NS40IiBpbm5lckRpYW1ldGVyPSIwLjQ0NDQiIGlkPSJQaXBlMiIgb3V0ZXJEaWFtZXRlcj0iMC42MyI+CiAgICAgICAgPGdlb21ldHJ5IHhzaTp0eXBlPSJlc2RsOkxpbmUiIENSUz0iV0dTODQiPgogICAgICAgICAgPHBvaW50IHhzaTp0eXBlPSJlc2RsOlBvaW50IiBsYXQ9IjUyLjA0MjcxMTc4ODI3ODAxIiBsb249IjQuMzExNjI5NTMzNzY3NzAxIi8+CiAgICAgICAgICA8cG9pbnQgeHNpOnR5cGU9ImVzZGw6UG9pbnQiIGxhdD0iNTIuMDQyMDIyMTg0NjYzMjYiIGxvbj0iNC4zMDkwMDA5Njg5MzMxMDYiLz4KICAgICAgICA8L2dlb21ldHJ5PgogICAgICAgIDxwb3J0IHhzaTp0eXBlPSJlc2RsOkluUG9ydCIgY29ubmVjdGVkVG89ImMwZWFjNGRiLWY1ZGEtNDdmMy04MjAyLTg0MzhkMDAwYmQzMiIgaWQ9IjVmNjU1MjBkLTYxZWUtNGY2OC04MDAyLTI3MWY0OGYxZGFlZSIgY2Fycmllcj0iN2IzMmUyODctZDc3NS00ODBjLWIzMTctNjRmZmRhY2YxMmM5IiBuYW1lPSJJbiIvPgogICAgICAgIDxwb3J0IHhzaTp0eXBlPSJlc2RsOk91dFBvcnQiIGlkPSIxZGZkYzE3Mi05MzU5LTQzNWEtODE1My0wYTY1NzkzMjIyM2EiIGNvbm5lY3RlZFRvPSIyYTg3MzE5NS1mYTZiLTQyNTAtODUxOS0wNDZmMDQwZmVkYjciIGNhcnJpZXI9IjdiMzJlMjg3LWQ3NzUtNDgwYy1iMzE3LTY0ZmZkYWNmMTJjOSIgbmFtZT0iT3V0Ii8+CiAgICAgICAgPG1hdGVyaWFsIHhzaTp0eXBlPSJlc2RsOkNvbXBvdW5kTWF0dGVyIiBjb21wb3VuZFR5cGU9IkxBWUVSRUQiPgogICAgICAgICAgPGNvbXBvbmVudCB4c2k6dHlwZT0iZXNkbDpDb21wb3VuZE1hdHRlckNvbXBvbmVudCIgbGF5ZXJXaWR0aD0iMC4wMDYzIj4KICAgICAgICAgICAgPG1hdHRlciB4c2k6dHlwZT0iZXNkbDpNYXRlcmlhbCIgdGhlcm1hbENvbmR1Y3Rpdml0eT0iNTIuMTUiIG5hbWU9InN0ZWVsIiBpZD0iMzcxYzFkNzItZGUzNS00NTU5LTliMGUtNDcxNzJlNWQxZDgzIi8+CiAgICAgICAgICA8L2NvbXBvbmVudD4KICAgICAgICAgIDxjb21wb25lbnQgeHNpOnR5cGU9ImVzZGw6Q29tcG91bmRNYXR0ZXJDb21wb25lbnQiIGxheWVyV2lkdGg9IjAuMDgwNSI+CiAgICAgICAgICAgIDxtYXR0ZXIgeHNpOnR5cGU9ImVzZGw6TWF0ZXJpYWwiIHRoZXJtYWxDb25kdWN0aXZpdHk9IjAuMDI3IiBuYW1lPSJQVVIiIGlkPSJkZjMwYmQzNy0yZmM0LTQ5OTMtODI4Zi0xYjdjZjFlODIwMmMiLz4KICAgICAgICAgIDwvY29tcG9uZW50PgogICAgICAgICAgPGNvbXBvbmVudCB4c2k6dHlwZT0iZXNkbDpDb21wb3VuZE1hdHRlckNvbXBvbmVudCIgbGF5ZXJXaWR0aD0iMC4wMDYiPgogICAgICAgICAgICA8bWF0dGVyIHhzaTp0eXBlPSJlc2RsOk1hdGVyaWFsIiB0aGVybWFsQ29uZHVjdGl2aXR5PSIwLjQiIG5hbWU9IkhEUEUiIGlkPSJmNTNkZTM3Yi1hNzM1LTRiMGQtYjIyNi1hNmI3MjIwMjlhMDEiLz4KICAgICAgICAgIDwvY29tcG9uZW50PgogICAgICAgIDwvbWF0ZXJpYWw+CiAgICAgICAgPGRhdGFTb3VyY2UgeHNpOnR5cGU9ImVzZGw6RGF0YVNvdXJjZSIgYXR0cmlidXRpb249Imh0dHBzOi8vd3d3LmxvZ3N0b3IuY29tL21lZGlhLzY1MDYvcHJvZHVjdC1jYXRhbG9ndWUtdWstMjAyMDAzLnBkZiIgbmFtZT0iTG9nc3RvciBQcm9kdWN0IENhdGFsb2d1ZSBWZXJzaW9uIDIwMjAuMDMiLz4KICAgICAgICA8Y29zdEluZm9ybWF0aW9uIHhzaTp0eXBlPSJlc2RsOkNvc3RJbmZvcm1hdGlvbiIgaWQ9ImM4MTQwYjNiLTk5ZGMtNGVlMC1iMDM0LTEwNTBiNGZkMTk0NiI+CiAgICAgICAgICA8aW52ZXN0bWVudENvc3RzIHhzaTp0eXBlPSJlc2RsOlNpbmdsZVZhbHVlIiBuYW1lPSJDb21iaW5lZCBpbnZlc3RtZW50IGFuZCBpbnN0YWxsYXRpb24gY29zdHMiIGlkPSJhNDAxNjVlOC04OGJkLTQ5YjktODFkOS0yOTg4MTJhYzAxNzAiIHZhbHVlPSIzNDE3LjkiPgogICAgICAgICAgICA8cHJvZmlsZVF1YW50aXR5QW5kVW5pdCB4c2k6dHlwZT0iZXNkbDpRdWFudGl0eUFuZFVuaXRUeXBlIiBpZD0iZDBhZWJjNzYtMjAxYi00YjJkLTgxZmUtNTUyNjlmY2VmZTNiIiBkZXNjcmlwdGlvbj0iQ29zdHMgaW4gRVVSL20iIHBlclVuaXQ9Ik1FVFJFIiBwaHlzaWNhbFF1YW50aXR5PSJDT1NUIiB1bml0PSJFVVJPIi8+CiAgICAgICAgICA8L2ludmVzdG1lbnRDb3N0cz4KICAgICAgICA8L2Nvc3RJbmZvcm1hdGlvbj4KICAgICAgPC9hc3NldD4KICAgICAgPGFzc2V0IHhzaTp0eXBlPSJlc2RsOlBpcGUiIHJlbGF0ZWQ9IlBpcGUzX3JldCIgZGlhbWV0ZXI9IkRONDUwIiBuYW1lPSJQaXBlMyIgbGVuZ3RoPSIyNDEuNiIgaW5uZXJEaWFtZXRlcj0iMC40NDQ0IiBpZD0iUGlwZTMiIG91dGVyRGlhbWV0ZXI9IjAuNjMiPgogICAgICAgIDxnZW9tZXRyeSB4c2k6dHlwZT0iZXNkbDpMaW5lIiBDUlM9IldHUzg0Ij4KICAgICAgICAgIDxwb2ludCB4c2k6dHlwZT0iZXNkbDpQb2ludCIgbGF0PSI1Mi4wNDI3MDg0ODg3NjQ1MDQiIGxvbj0iNC4zMTE3NTgyNzk4MDA0MTYiLz4KICAgICAgICAgIDxwb2ludCB4c2k6dHlwZT0iZXNkbDpQb2ludCIgbGF0PSI1Mi4wNDA3ODQ4MzA5MzE1NiIgbG9uPSI0LjMxMzM5OTc5MTcxNzUzIi8+CiAgICAgICAgPC9nZW9tZXRyeT4KICAgICAgICA8cG9ydCB4c2k6dHlwZT0iZXNkbDpJblBvcnQiIGNvbm5lY3RlZFRvPSJjMGVhYzRkYi1mNWRhLTQ3ZjMtODIwMi04NDM4ZDAwMGJkMzIiIGlkPSI1NzhlYzQxNC0zZjExLTQzMGUtYTg5My02MGVhNzc4NDhmZjUiIGNhcnJpZXI9IjdiMzJlMjg3LWQ3NzUtNDgwYy1iMzE3LTY0ZmZkYWNmMTJjOSIgbmFtZT0iSW4iLz4KICAgICAgICA8cG9ydCB4c2k6dHlwZT0iZXNkbDpPdXRQb3J0IiBpZD0iZGMxYmM5NGYtMjZmMi00YTQ5LWEzYmYtZDA2MTRiMWYwZGYyIiBjb25uZWN0ZWRUbz0iZTBhZGY4MGEtYjZmMy00YzEyLWE0MzktZGFiNGU1NTUyMDJhIiBjYXJyaWVyPSI3YjMyZTI4Ny1kNzc1LTQ4MGMtYjMxNy02NGZmZGFjZjEyYzkiIG5hbWU9Ik91dCIvPgogICAgICAgIDxtYXRlcmlhbCB4c2k6dHlwZT0iZXNkbDpDb21wb3VuZE1hdHRlciIgY29tcG91bmRUeXBlPSJMQVlFUkVEIj4KICAgICAgICAgIDxjb21wb25lbnQgeHNpOnR5cGU9ImVzZGw6Q29tcG91bmRNYXR0ZXJDb21wb25lbnQiIGxheWVyV2lkdGg9IjAuMDA2MyI+CiAgICAgICAgICAgIDxtYXR0ZXIgeHNpOnR5cGU9ImVzZGw6TWF0ZXJpYWwiIHRoZXJtYWxDb25kdWN0aXZpdHk9IjUyLjE1IiBuYW1lPSJzdGVlbCIgaWQ9IjM3MWMxZDcyLWRlMzUtNDU1OS05YjBlLTQ3MTcyZTVkMWQ4MyIvPgogICAgICAgICAgPC9jb21wb25lbnQ+CiAgICAgICAgICA8Y29tcG9uZW50IHhzaTp0eXBlPSJlc2RsOkNvbXBvdW5kTWF0dGVyQ29tcG9uZW50IiBsYXllcldpZHRoPSIwLjA4MDUiPgogICAgICAgICAgICA8bWF0dGVyIHhzaTp0eXBlPSJlc2RsOk1hdGVyaWFsIiB0aGVybWFsQ29uZHVjdGl2aXR5PSIwLjAyNyIgbmFtZT0iUFVSIiBpZD0iZGYzMGJkMzctMmZjNC00OTkzLTgyOGYtMWI3Y2YxZTgyMDJjIi8+CiAgICAgICAgICA8L2NvbXBvbmVudD4KICAgICAgICAgIDxjb21wb25lbnQgeHNpOnR5cGU9ImVzZGw6Q29tcG91bmRNYXR0ZXJDb21wb25lbnQiIGxheWVyV2lkdGg9IjAuMDA2Ij4KICAgICAgICAgICAgPG1hdHRlciB4c2k6dHlwZT0iZXNkbDpNYXRlcmlhbCIgdGhlcm1hbENvbmR1Y3Rpdml0eT0iMC40IiBuYW1lPSJIRFBFIiBpZD0iZjUzZGUzN2ItYTczNS00YjBkLWIyMjYtYTZiNzIyMDI5YTAxIi8+CiAgICAgICAgICA8L2NvbXBvbmVudD4KICAgICAgICA8L21hdGVyaWFsPgogICAgICAgIDxkYXRhU291cmNlIHhzaTp0eXBlPSJlc2RsOkRhdGFTb3VyY2UiIGF0dHJpYnV0aW9uPSJodHRwczovL3d3dy5sb2dzdG9yLmNvbS9tZWRpYS82NTA2L3Byb2R1Y3QtY2F0YWxvZ3VlLXVrLTIwMjAwMy5wZGYiIG5hbWU9IkxvZ3N0b3IgUHJvZHVjdCBDYXRhbG9ndWUgVmVyc2lvbiAyMDIwLjAzIi8+CiAgICAgICAgPGNvc3RJbmZvcm1hdGlvbiB4c2k6dHlwZT0iZXNkbDpDb3N0SW5mb3JtYXRpb24iIGlkPSI4ODNhZmMxMy0wOThlLTQ3YjQtYWEzMC1hZTNjM2UyNWY5YjEiPgogICAgICAgICAgPGludmVzdG1lbnRDb3N0cyB4c2k6dHlwZT0iZXNkbDpTaW5nbGVWYWx1ZSIgbmFtZT0iQ29tYmluZWQgaW52ZXN0bWVudCBhbmQgaW5zdGFsbGF0aW9uIGNvc3RzIiBpZD0iYTQwMTY1ZTgtODhiZC00OWI5LTgxZDktMjk4ODEyYWMwMTcwIiB2YWx1ZT0iMzQxNy45Ij4KICAgICAgICAgICAgPHByb2ZpbGVRdWFudGl0eUFuZFVuaXQgeHNpOnR5cGU9ImVzZGw6UXVhbnRpdHlBbmRVbml0VHlwZSIgaWQ9ImQwYWViYzc2LTIwMWItNGIyZC04MWZlLTU1MjY5ZmNlZmUzYiIgZGVzY3JpcHRpb249IkNvc3RzIGluIEVVUi9tIiBwZXJVbml0PSJNRVRSRSIgcGh5c2ljYWxRdWFudGl0eT0iQ09TVCIgdW5pdD0iRVVSTyIvPgogICAgICAgICAgPC9pbnZlc3RtZW50Q29zdHM+CiAgICAgICAgPC9jb3N0SW5mb3JtYXRpb24+CiAgICAgIDwvYXNzZXQ+CiAgICAgIDxhc3NldCB4c2k6dHlwZT0iZXNkbDpQaXBlIiByZWxhdGVkPSJQaXBlNF9yZXQiIGRpYW1ldGVyPSJETjQ1MCIgbmFtZT0iUGlwZTQiIGxlbmd0aD0iMTg5LjciIGlubmVyRGlhbWV0ZXI9IjAuNDQ0NCIgaWQ9IlBpcGU0IiBvdXRlckRpYW1ldGVyPSIwLjYzIj4KICAgICAgICA8Z2VvbWV0cnkgeHNpOnR5cGU9ImVzZGw6TGluZSIgQ1JTPSJXR1M4NCI+CiAgICAgICAgICA8cG9pbnQgeHNpOnR5cGU9ImVzZGw6UG9pbnQiIGxhdD0iNTIuMDQwNzYxNzMzMzM2MjIiIGxvbj0iNC4zMTMzMjQ2ODk4NjUxMTMiLz4KICAgICAgICAgIDxwb2ludCB4c2k6dHlwZT0iZXNkbDpQb2ludCIgbGF0PSI1Mi4wNDAwNzIwOTk2MzQ4NyIgbG9uPSI0LjMxMDc4NzMyMDEzNzAyNSIvPgogICAgICAgIDwvZ2VvbWV0cnk+CiAgICAgICAgPHBvcnQgeHNpOnR5cGU9ImVzZGw6SW5Qb3J0IiBjb25uZWN0ZWRUbz0iZWQ3NWIyMTAtNmI1YS00ODhlLThhOGQtZWZlNTcwYzg0OTkwIiBpZD0iNGI5MmU0MTgtNGNhNi00NzY1LTg1YWItY2UzMGY0MTI3YmYwIiBjYXJyaWVyPSI3YjMyZTI4Ny1kNzc1LTQ4MGMtYjMxNy02NGZmZGFjZjEyYzkiIG5hbWU9IkluIi8+CiAgICAgICAgPHBvcnQgeHNpOnR5cGU9ImVzZGw6T3V0UG9ydCIgaWQ9IjUzYTU0NDQ4LWFiZGItNDFhYi1hNTNlLTQ5ODU1NjA2MjIxNiIgY29ubmVjdGVkVG89ImE0YTdjMjNlLTRkNzctNGJiZS1iOGI0LWRkZjJkMmQ2ZTk3ZSIgY2Fycmllcj0iN2IzMmUyODctZDc3NS00ODBjLWIzMTctNjRmZmRhY2YxMmM5IiBuYW1lPSJPdXQiLz4KICAgICAgICA8bWF0ZXJpYWwgeHNpOnR5cGU9ImVzZGw6Q29tcG91bmRNYXR0ZXIiIGNvbXBvdW5kVHlwZT0iTEFZRVJFRCI+CiAgICAgICAgICA8Y29tcG9uZW50IHhzaTp0eXBlPSJlc2RsOkNvbXBvdW5kTWF0dGVyQ29tcG9uZW50IiBsYXllcldpZHRoPSIwLjAwNjMiPgogICAgICAgICAgICA8bWF0dGVyIHhzaTp0eXBlPSJlc2RsOk1hdGVyaWFsIiB0aGVybWFsQ29uZHVjdGl2aXR5PSI1Mi4xNSIgbmFtZT0ic3RlZWwiIGlkPSIzNzFjMWQ3Mi1kZTM1LTQ1NTktOWIwZS00NzE3MmU1ZDFkODMiLz4KICAgICAgICAgIDwvY29tcG9uZW50PgogICAgICAgICAgPGNvbXBvbmVudCB4c2k6dHlwZT0iZXNkbDpDb21wb3VuZE1hdHRlckNvbXBvbmVudCIgbGF5ZXJXaWR0aD0iMC4wODA1Ij4KICAgICAgICAgICAgPG1hdHRlciB4c2k6dHlwZT0iZXNkbDpNYXRlcmlhbCIgdGhlcm1hbENvbmR1Y3Rpdml0eT0iMC4wMjciIG5hbWU9IlBVUiIgaWQ9ImRmMzBiZDM3LTJmYzQtNDk5My04MjhmLTFiN2NmMWU4MjAyYyIvPgogICAgICAgICAgPC9jb21wb25lbnQ+CiAgICAgICAgICA8Y29tcG9uZW50IHhzaTp0eXBlPSJlc2RsOkNvbXBvdW5kTWF0dGVyQ29tcG9uZW50IiBsYXllcldpZHRoPSIwLjAwNiI+CiAgICAgICAgICAgIDxtYXR0ZXIgeHNpOnR5cGU9ImVzZGw6TWF0ZXJpYWwiIHRoZXJtYWxDb25kdWN0aXZpdHk9IjAuNCIgbmFtZT0iSERQRSIgaWQ9ImY1M2RlMzdiLWE3MzUtNGIwZC1iMjI2LWE2YjcyMjAyOWEwMSIvPgogICAgICAgICAgPC9jb21wb25lbnQ+CiAgICAgICAgPC9tYXRlcmlhbD4KICAgICAgICA8ZGF0YVNvdXJjZSB4c2k6dHlwZT0iZXNkbDpEYXRhU291cmNlIiBhdHRyaWJ1dGlvbj0iaHR0cHM6Ly93d3cubG9nc3Rvci5jb20vbWVkaWEvNjUwNi9wcm9kdWN0LWNhdGFsb2d1ZS11ay0yMDIwMDMucGRmIiBuYW1lPSJMb2dzdG9yIFByb2R1Y3QgQ2F0YWxvZ3VlIFZlcnNpb24gMjAyMC4wMyIvPgogICAgICAgIDxjb3N0SW5mb3JtYXRpb24geHNpOnR5cGU9ImVzZGw6Q29zdEluZm9ybWF0aW9uIiBpZD0iYjFkZDA0MjctZjhjYS00NTI1LTgxOTItOGE4OTU0ZjJiZTFjIj4KICAgICAgICAgIDxpbnZlc3RtZW50Q29zdHMgeHNpOnR5cGU9ImVzZGw6U2luZ2xlVmFsdWUiIG5hbWU9IkNvbWJpbmVkIGludmVzdG1lbnQgYW5kIGluc3RhbGxhdGlvbiBjb3N0cyIgaWQ9ImE0MDE2NWU4LTg4YmQtNDliOS04MWQ5LTI5ODgxMmFjMDE3MCIgdmFsdWU9IjM0MTcuOSI+CiAgICAgICAgICAgIDxwcm9maWxlUXVhbnRpdHlBbmRVbml0IHhzaTp0eXBlPSJlc2RsOlF1YW50aXR5QW5kVW5pdFR5cGUiIGlkPSJkMGFlYmM3Ni0yMDFiLTRiMmQtODFmZS01NTI2OWZjZWZlM2IiIGRlc2NyaXB0aW9uPSJDb3N0cyBpbiBFVVIvbSIgcGVyVW5pdD0iTUVUUkUiIHBoeXNpY2FsUXVhbnRpdHk9IkNPU1QiIHVuaXQ9IkVVUk8iLz4KICAgICAgICAgIDwvaW52ZXN0bWVudENvc3RzPgogICAgICAgIDwvY29zdEluZm9ybWF0aW9uPgogICAgICA8L2Fzc2V0PgogICAgICA8YXNzZXQgeHNpOnR5cGU9ImVzZGw6UGlwZSIgcmVsYXRlZD0iUGlwZTVfcmV0IiBkaWFtZXRlcj0iRE40NTAiIG5hbWU9IlBpcGU1IiBsZW5ndGg9IjI0NC42IiBpbm5lckRpYW1ldGVyPSIwLjQ0NDQiIGlkPSJQaXBlNSIgb3V0ZXJEaWFtZXRlcj0iMC42MyI+CiAgICAgICAgPGdlb21ldHJ5IHhzaTp0eXBlPSJlc2RsOkxpbmUiIENSUz0iV0dTODQiPgogICAgICAgICAgPHBvaW50IHhzaTp0eXBlPSJlc2RsOlBvaW50IiBsYXQ9IjUyLjA0MDczODYzNTcyODk4IiBsb249IjQuMzEzNDUzNDM1ODk3ODI4Ii8+CiAgICAgICAgICA8cG9pbnQgeHNpOnR5cGU9ImVzZGw6UG9pbnQiIGxhdD0iNTIuMDM4Nzk4Mzk0MTA5MzgiIGxvbj0iNC4zMTUxMzc4NjMxNTkxODEiLz4KICAgICAgICA8L2dlb21ldHJ5PgogICAgICAgIDxwb3J0IHhzaTp0eXBlPSJlc2RsOkluUG9ydCIgY29ubmVjdGVkVG89ImVkNzViMjEwLTZiNWEtNDg4ZS04YThkLWVmZTU3MGM4NDk5MCIgaWQ9ImQxY2UxN2ZlLTU3MmQtNGFkZS1hNmUxLWEzZDNhYTBmYWI2NCIgY2Fycmllcj0iN2IzMmUyODctZDc3NS00ODBjLWIzMTctNjRmZmRhY2YxMmM5IiBuYW1lPSJJbiIvPgogICAgICAgIDxwb3J0IHhzaTp0eXBlPSJlc2RsOk91dFBvcnQiIGlkPSI4ZjFiZWE1Mi1lMzIyLTRkMzQtYWQ0My03ZDFlOTcyNDNkNjIiIGNvbm5lY3RlZFRvPSIxY2I5MjNiNS0yYTY5LTQ2ZDktODc0Yy02OGQ1NTJlZjU1NzYiIGNhcnJpZXI9IjdiMzJlMjg3LWQ3NzUtNDgwYy1iMzE3LTY0ZmZkYWNmMTJjOSIgbmFtZT0iT3V0Ii8+CiAgICAgICAgPG1hdGVyaWFsIHhzaTp0eXBlPSJlc2RsOkNvbXBvdW5kTWF0dGVyIiBjb21wb3VuZFR5cGU9IkxBWUVSRUQiPgogICAgICAgICAgPGNvbXBvbmVudCB4c2k6dHlwZT0iZXNkbDpDb21wb3VuZE1hdHRlckNvbXBvbmVudCIgbGF5ZXJXaWR0aD0iMC4wMDYzIj4KICAgICAgICAgICAgPG1hdHRlciB4c2k6dHlwZT0iZXNkbDpNYXRlcmlhbCIgdGhlcm1hbENvbmR1Y3Rpdml0eT0iNTIuMTUiIG5hbWU9InN0ZWVsIiBpZD0iMzcxYzFkNzItZGUzNS00NTU5LTliMGUtNDcxNzJlNWQxZDgzIi8+CiAgICAgICAgICA8L2NvbXBvbmVudD4KICAgICAgICAgIDxjb21wb25lbnQgeHNpOnR5cGU9ImVzZGw6Q29tcG91bmRNYXR0ZXJDb21wb25lbnQiIGxheWVyV2lkdGg9IjAuMDgwNSI+CiAgICAgICAgICAgIDxtYXR0ZXIgeHNpOnR5cGU9ImVzZGw6TWF0ZXJpYWwiIHRoZXJtYWxDb25kdWN0aXZpdHk9IjAuMDI3IiBuYW1lPSJQVVIiIGlkPSJkZjMwYmQzNy0yZmM0LTQ5OTMtODI4Zi0xYjdjZjFlODIwMmMiLz4KICAgICAgICAgIDwvY29tcG9uZW50PgogICAgICAgICAgPGNvbXBvbmVudCB4c2k6dHlwZT0iZXNkbDpDb21wb3VuZE1hdHRlckNvbXBvbmVudCIgbGF5ZXJXaWR0aD0iMC4wMDYiPgogICAgICAgICAgICA8bWF0dGVyIHhzaTp0eXBlPSJlc2RsOk1hdGVyaWFsIiB0aGVybWFsQ29uZHVjdGl2aXR5PSIwLjQiIG5hbWU9IkhEUEUiIGlkPSJmNTNkZTM3Yi1hNzM1LTRiMGQtYjIyNi1hNmI3MjIwMjlhMDEiLz4KICAgICAgICAgIDwvY29tcG9uZW50PgogICAgICAgIDwvbWF0ZXJpYWw+CiAgICAgICAgPGRhdGFTb3VyY2UgeHNpOnR5cGU9ImVzZGw6RGF0YVNvdXJjZSIgYXR0cmlidXRpb249Imh0dHBzOi8vd3d3LmxvZ3N0b3IuY29tL21lZGlhLzY1MDYvcHJvZHVjdC1jYXRhbG9ndWUtdWstMjAyMDAzLnBkZiIgbmFtZT0iTG9nc3RvciBQcm9kdWN0IENhdGFsb2d1ZSBWZXJzaW9uIDIwMjAuMDMiLz4KICAgICAgICA8Y29zdEluZm9ybWF0aW9uIHhzaTp0eXBlPSJlc2RsOkNvc3RJbmZvcm1hdGlvbiIgaWQ9ImQ5MTMyMzAxLTFmNDktNGMzMS1iMzhmLTRlNjUwYzE4YTk4NCI+CiAgICAgICAgICA8aW52ZXN0bWVudENvc3RzIHhzaTp0eXBlPSJlc2RsOlNpbmdsZVZhbHVlIiBuYW1lPSJDb21iaW5lZCBpbnZlc3RtZW50IGFuZCBpbnN0YWxsYXRpb24gY29zdHMiIGlkPSJhNDAxNjVlOC04OGJkLTQ5YjktODFkOS0yOTg4MTJhYzAxNzAiIHZhbHVlPSIzNDE3LjkiPgogICAgICAgICAgICA8cHJvZmlsZVF1YW50aXR5QW5kVW5pdCB4c2k6dHlwZT0iZXNkbDpRdWFudGl0eUFuZFVuaXRUeXBlIiBpZD0iZDBhZWJjNzYtMjAxYi00YjJkLTgxZmUtNTUyNjlmY2VmZTNiIiBkZXNjcmlwdGlvbj0iQ29zdHMgaW4gRVVSL20iIHBlclVuaXQ9Ik1FVFJFIiBwaHlzaWNhbFF1YW50aXR5PSJDT1NUIiB1bml0PSJFVVJPIi8+CiAgICAgICAgICA8L2ludmVzdG1lbnRDb3N0cz4KICAgICAgICA8L2Nvc3RJbmZvcm1hdGlvbj4KICAgICAgPC9hc3NldD4KICAgICAgPGFzc2V0IHhzaTp0eXBlPSJlc2RsOlBpcGUiIHJlbGF0ZWQ9IlBpcGU2X3JldCIgZGlhbWV0ZXI9IkRONDUwIiBuYW1lPSJQaXBlNiIgbGVuZ3RoPSIxNzYuNiIgaW5uZXJEaWFtZXRlcj0iMC40NDQ0IiBpZD0iUGlwZTYiIG91dGVyRGlhbWV0ZXI9IjAuNjMiPgogICAgICAgIDxnZW9tZXRyeSB4c2k6dHlwZT0iZXNkbDpMaW5lIiBDUlM9IldHUzg0Ij4KICAgICAgICAgIDxwb2ludCB4c2k6dHlwZT0iZXNkbDpQb2ludCIgbGF0PSI1Mi4wMzg3NTIxOTY4NTM4OSIgbG9uPSI0LjMxNTA5NDk0NzgxNDk0MiIvPgogICAgICAgICAgPHBvaW50IHhzaTp0eXBlPSJlc2RsOlBvaW50IiBsYXQ9IjUyLjAzODAxMzAzNDI3MjkyIiBsb249IjQuMzEyODA5NzA1NzM0MjU0Ii8+CiAgICAgICAgPC9nZW9tZXRyeT4KICAgICAgICA8cG9ydCB4c2k6dHlwZT0iZXNkbDpJblBvcnQiIGNvbm5lY3RlZFRvPSJhMDJlNDFhYi05OWY4LTQ2ZDMtYjJkMS1iZTQ0YWE1Yjc5MTQiIGlkPSI3ZjE2MmEzMC03ZTQxLTRkN2YtYjAxMS1mZmNmNGMxNjUxZjgiIGNhcnJpZXI9IjdiMzJlMjg3LWQ3NzUtNDgwYy1iMzE3LTY0ZmZkYWNmMTJjOSIgbmFtZT0iSW4iLz4KICAgICAgICA8cG9ydCB4c2k6dHlwZT0iZXNkbDpPdXRQb3J0IiBpZD0iMTZiMTMzN2MtNTk3MC00ZWI0LTkwZDMtZTUyZDUxNGExM2RmIiBjb25uZWN0ZWRUbz0iNzcwMDIyZTYtM2U3MS00ZTUxLTg1NDQtMGRiYTg2YzQ2YTViIiBjYXJyaWVyPSI3YjMyZTI4Ny1kNzc1LTQ4MGMtYjMxNy02NGZmZGFjZjEyYzkiIG5hbWU9Ik91dCIvPgogICAgICAgIDxtYXRlcmlhbCB4c2k6dHlwZT0iZXNkbDpDb21wb3VuZE1hdHRlciIgY29tcG91bmRUeXBlPSJMQVlFUkVEIj4KICAgICAgICAgIDxjb21wb25lbnQgeHNpOnR5cGU9ImVzZGw6Q29tcG91bmRNYXR0ZXJDb21wb25lbnQiIGxheWVyV2lkdGg9IjAuMDA2MyI+CiAgICAgICAgICAgIDxtYXR0ZXIgeHNpOnR5cGU9ImVzZGw6TWF0ZXJpYWwiIHRoZXJtYWxDb25kdWN0aXZpdHk9IjUyLjE1IiBuYW1lPSJzdGVlbCIgaWQ9IjM3MWMxZDcyLWRlMzUtNDU1OS05YjBlLTQ3MTcyZTVkMWQ4MyIvPgogICAgICAgICAgPC9jb21wb25lbnQ+CiAgICAgICAgICA8Y29tcG9uZW50IHhzaTp0eXBlPSJlc2RsOkNvbXBvdW5kTWF0dGVyQ29tcG9uZW50IiBsYXllcldpZHRoPSIwLjA4MDUiPgogICAgICAgICAgICA8bWF0dGVyIHhzaTp0eXBlPSJlc2RsOk1hdGVyaWFsIiB0aGVybWFsQ29uZHVjdGl2aXR5PSIwLjAyNyIgbmFtZT0iUFVSIiBpZD0iZGYzMGJkMzctMmZjNC00OTkzLTgyOGYtMWI3Y2YxZTgyMDJjIi8+CiAgICAgICAgICA8L2NvbXBvbmVudD4KICAgICAgICAgIDxjb21wb25lbnQgeHNpOnR5cGU9ImVzZGw6Q29tcG91bmRNYXR0ZXJDb21wb25lbnQiIGxheWVyV2lkdGg9IjAuMDA2Ij4KICAgICAgICAgICAgPG1hdHRlciB4c2k6dHlwZT0iZXNkbDpNYXRlcmlhbCIgdGhlcm1hbENvbmR1Y3Rpdml0eT0iMC40IiBuYW1lPSJIRFBFIiBpZD0iZjUzZGUzN2ItYTczNS00YjBkLWIyMjYtYTZiNzIyMDI5YTAxIi8+CiAgICAgICAgICA8L2NvbXBvbmVudD4KICAgICAgICA8L21hdGVyaWFsPgogICAgICAgIDxkYXRhU291cmNlIHhzaTp0eXBlPSJlc2RsOkRhdGFTb3VyY2UiIGF0dHJpYnV0aW9uPSJodHRwczovL3d3dy5sb2dzdG9yLmNvbS9tZWRpYS82NTA2L3Byb2R1Y3QtY2F0YWxvZ3VlLXVrLTIwMjAwMy5wZGYiIG5hbWU9IkxvZ3N0b3IgUHJvZHVjdCBDYXRhbG9ndWUgVmVyc2lvbiAyMDIwLjAzIi8+CiAgICAgICAgPGNvc3RJbmZvcm1hdGlvbiB4c2k6dHlwZT0iZXNkbDpDb3N0SW5mb3JtYXRpb24iIGlkPSI3NjJhZWVjNi1hYzVkLTRlNTQtYjMyZi0zZGE5MjliZDY3MTMiPgogICAgICAgICAgPGludmVzdG1lbnRDb3N0cyB4c2k6dHlwZT0iZXNkbDpTaW5nbGVWYWx1ZSIgbmFtZT0iQ29tYmluZWQgaW52ZXN0bWVudCBhbmQgaW5zdGFsbGF0aW9uIGNvc3RzIiBpZD0iYTQwMTY1ZTgtODhiZC00OWI5LTgxZDktMjk4ODEyYWMwMTcwIiB2YWx1ZT0iMzQxNy45Ij4KICAgICAgICAgICAgPHByb2ZpbGVRdWFudGl0eUFuZFVuaXQgeHNpOnR5cGU9ImVzZGw6UXVhbnRpdHlBbmRVbml0VHlwZSIgaWQ9ImQwYWViYzc2LTIwMWItNGIyZC04MWZlLTU1MjY5ZmNlZmUzYiIgZGVzY3JpcHRpb249IkNvc3RzIGluIEVVUi9tIiBwZXJVbml0PSJNRVRSRSIgcGh5c2ljYWxRdWFudGl0eT0iQ09TVCIgdW5pdD0iRVVSTyIvPgogICAgICAgICAgPC9pbnZlc3RtZW50Q29zdHM+CiAgICAgICAgPC9jb3N0SW5mb3JtYXRpb24+CiAgICAgIDwvYXNzZXQ+CiAgICAgIDxhc3NldCB4c2k6dHlwZT0iZXNkbDpIZWF0UHJvZHVjZXIiIHBvd2VyPSIzMDAwMDAwLjAiIG5hbWU9IkhlYXRQcm9kdWNlcl8xIiBpZD0iMzI0YjAzNzEtYjczOC00ZjU1LWE5NzgtMzMwNmVlODE2MzhjIj4KICAgICAgICA8Z2VvbWV0cnkgeHNpOnR5cGU9ImVzZGw6UG9pbnQiIGxhdD0iNTIuMDQ0NzY0MDM4NDc4MjUiIGxvbj0iNC4zMDk5NzcyOTMwMTQ1MjciLz4KICAgICAgICA8cG9ydCB4c2k6dHlwZT0iZXNkbDpPdXRQb3J0IiBpZD0iNDViZmM3ZDAtZWY1OS00ZjQ5LWIzN2EtODY3YjE4ZTA0Yjg2IiBjb25uZWN0ZWRUbz0iYjQ2MmQ1NjQtYThjMC00YWUwLWE0YWYtMzY5NThmMjQ1NWVhIiBjYXJyaWVyPSI3YjMyZTI4Ny1kNzc1LTQ4MGMtYjMxNy02NGZmZGFjZjEyYzkiIG5hbWU9Ik91dCIvPgogICAgICAgIDxwb3J0IHhzaTp0eXBlPSJlc2RsOkluUG9ydCIgY29ubmVjdGVkVG89ImUzMWUxMmMyLThmODAtNGFlZC05ZTRiLTkxODQ0NWEzMjk5NiIgaWQ9ImJhOWNhMDg0LWI3MWYtNDJhMy04ODRhLWYyZjJiM2FlNDI2NSIgY2Fycmllcj0iN2IzMmUyODctZDc3NS00ODBjLWIzMTctNjRmZmRhY2YxMmM5X3JldCIgbmFtZT0iSW4iLz4KICAgICAgICA8Y29zdEluZm9ybWF0aW9uIHhzaTp0eXBlPSJlc2RsOkNvc3RJbmZvcm1hdGlvbiIgaWQ9IjI4ZTliODUzLWU0MDctNDliMC1iZTY2LTE1NzJjMTJkYzgxMSI+CiAgICAgICAgICA8aW5zdGFsbGF0aW9uQ29zdHMgeHNpOnR5cGU9ImVzZGw6U2luZ2xlVmFsdWUiIHZhbHVlPSIzMDAwMDAuMCIgaWQ9ImNjYmE0M2E1LWM0YzgtNDgxOC1hMzM5LTc2MmIzMzg1ZjU2MiI+CiAgICAgICAgICAgIDxwcm9maWxlUXVhbnRpdHlBbmRVbml0IHhzaTp0eXBlPSJlc2RsOlF1YW50aXR5QW5kVW5pdFR5cGUiIHVuaXQ9IkVVUk8iIHBoeXNpY2FsUXVhbnRpdHk9IkNPU1QiIGlkPSI2OTI0MDMxYy0wNTQ4LTRiMzMtYTM0MS0zZDAzYzVjMmI1YTAiIGRlc2NyaXB0aW9uPSJDb3N0IGluIEVVUiIvPgogICAgICAgICAgPC9pbnN0YWxsYXRpb25Db3N0cz4KICAgICAgICAgIDxpbnZlc3RtZW50Q29zdHMgeHNpOnR5cGU9ImVzZGw6U2luZ2xlVmFsdWUiIHZhbHVlPSI5MDAwMDAuMCIgaWQ9ImI2Yzg1MjU5LTkyMTEtNDE3Zi1iOWRiLTg5ZmI0NzNmMmYxYyI+CiAgICAgICAgICAgIDxwcm9maWxlUXVhbnRpdHlBbmRVbml0IHhzaTp0eXBlPSJlc2RsOlF1YW50aXR5QW5kVW5pdFR5cGUiIGlkPSI0N2ZjYmZmMi1mMGYxLTQ4ZDktYjdjMS03ZTM0YTkwYjE1MzkiIGRlc2NyaXB0aW9uPSJDb3N0IGluIEVVUi9NVyIgcGVyVW5pdD0iV0FUVCIgcGVyTXVsdGlwbGllcj0iTUVHQSIgdW5pdD0iRVVSTyIgcGh5c2ljYWxRdWFudGl0eT0iQ09TVCIvPgogICAgICAgICAgPC9pbnZlc3RtZW50Q29zdHM+CiAgICAgICAgICA8dmFyaWFibGVPcGVyYXRpb25hbEFuZE1haW50ZW5hbmNlQ29zdHMgeHNpOnR5cGU9ImVzZGw6U2luZ2xlVmFsdWUiIHZhbHVlPSIxNS4wIiBpZD0iYjkwYzY1OWYtNGQ4Ny00NDAyLWIwNDItOTBhNzU5NGU3MDE2Ij4KICAgICAgICAgICAgPHByb2ZpbGVRdWFudGl0eUFuZFVuaXQgeHNpOnR5cGU9ImVzZGw6UXVhbnRpdHlBbmRVbml0VHlwZSIgaWQ9IjBkOTQ4NDA2LTc4NjQtNGVmZi1iYzY1LTc2NzA1MzNiZjE4YiIgZGVzY3JpcHRpb249IkNvc3QgaW4gRVVSL01XaCIgcGVyVW5pdD0iV0FUVEhPVVIiIHBlck11bHRpcGxpZXI9Ik1FR0EiIHVuaXQ9IkVVUk8iIHBoeXNpY2FsUXVhbnRpdHk9IkNPU1QiLz4KICAgICAgICAgIDwvdmFyaWFibGVPcGVyYXRpb25hbEFuZE1haW50ZW5hbmNlQ29zdHM+CiAgICAgICAgICA8bWFyZ2luYWxDb3N0cyB4c2k6dHlwZT0iZXNkbDpTaW5nbGVWYWx1ZSIgdmFsdWU9IjIuMCIgaWQ9IjgzNzdjNTE0LTc2YTItNDU5Mi04YzljLWYyZTQyOTgzNzA5OCI+CiAgICAgICAgICAgIDxwcm9maWxlUXVhbnRpdHlBbmRVbml0IHhzaTp0eXBlPSJlc2RsOlF1YW50aXR5QW5kVW5pdFR5cGUiIGlkPSI4OGU3ODM1OC0xMzQ0LTQ1YzItOGJiYy01MWRlMDY2MDAzYjEiIHBoeXNpY2FsUXVhbnRpdHk9IkNPU1QiIGRlc2NyaXB0aW9uPSJDb3N0IGluIEVVUiIgdW5pdD0iRVVSTyIvPgogICAgICAgICAgPC9tYXJnaW5hbENvc3RzPgogICAgICAgIDwvY29zdEluZm9ybWF0aW9uPgogICAgICA8L2Fzc2V0PgogICAgICA8YXNzZXQgeHNpOnR5cGU9ImVzZGw6Sm9pbnQiIG5hbWU9IkpvaW50XzEiIGlkPSJmOTZkMDJkNy0xOWQxLTRhMGItODg2OS0yZDE4MGYzOWI3ZTYiPgogICAgICAgIDxnZW9tZXRyeSB4c2k6dHlwZT0iZXNkbDpQb2ludCIgQ1JTPSJXR1M4NCIgbGF0PSI1Mi4wNDI3MjA4NjE5Mzg4NTQiIGxvbj0iNC4zMTE2OTUyNDc4ODg1NjYiLz4KICAgICAgICA8cG9ydCB4c2k6dHlwZT0iZXNkbDpJblBvcnQiIGNvbm5lY3RlZFRvPSI2NjU5MGY5Ni1hMzk3LTRkNmYtOWNmYi1lN2QzNDIzMmNhZDYgZjk2NmJhZGUtMWZhZC00NTNmLThlYzItNDA2MmVjNzBiYzdiIiBpZD0iNTE4NTI4NjEtYWVlYi00NjFmLWI4ZWMtMDhmMDAwYWJjNmRkIiBjYXJyaWVyPSI3YjMyZTI4Ny1kNzc1LTQ4MGMtYjMxNy02NGZmZGFjZjEyYzkiIG5hbWU9IkluIi8+CiAgICAgICAgPHBvcnQgeHNpOnR5cGU9ImVzZGw6T3V0UG9ydCIgaWQ9ImMwZWFjNGRiLWY1ZGEtNDdmMy04MjAyLTg0MzhkMDAwYmQzMiIgY29ubmVjdGVkVG89IjVmNjU1MjBkLTYxZWUtNGY2OC04MDAyLTI3MWY0OGYxZGFlZSA1NzhlYzQxNC0zZjExLTQzMGUtYTg5My02MGVhNzc4NDhmZjUgMmNjNzczZWUtYjU2Mi00ZTFmLWExZDEtYTI2NTZlMTA5MDdkIiBjYXJyaWVyPSI3YjMyZTI4Ny1kNzc1LTQ4MGMtYjMxNy02NGZmZGFjZjEyYzkiIG5hbWU9Ik91dCIvPgogICAgICA8L2Fzc2V0PgogICAgICA8YXNzZXQgeHNpOnR5cGU9ImVzZGw6Sm9pbnQiIG5hbWU9IkpvaW50XzIiIGlkPSJkNzRkYjliYS1iODZjLTQ4NmEtODkxMS0zZmYzNjhhZTYzYTMiPgogICAgICAgIDxnZW9tZXRyeSB4c2k6dHlwZT0iZXNkbDpQb2ludCIgQ1JTPSJXR1M4NCIgbGF0PSI1Mi4wNDA3NTY3ODM4NDk5NyIgbG9uPSI0LjMxMzM3Mjk2OTYyNzM4MSIvPgogICAgICAgIDxwb3J0IHhzaTp0eXBlPSJlc2RsOkluUG9ydCIgY29ubmVjdGVkVG89ImRjMWJjOTRmLTI2ZjItNGE0OS1hM2JmLWQwNjE0YjFmMGRmMiIgaWQ9ImUwYWRmODBhLWI2ZjMtNGMxMi1hNDM5LWRhYjRlNTU1MjAyYSIgY2Fycmllcj0iN2IzMmUyODctZDc3NS00ODBjLWIzMTctNjRmZmRhY2YxMmM5IiBuYW1lPSJJbiIvPgogICAgICAgIDxwb3J0IHhzaTp0eXBlPSJlc2RsOk91dFBvcnQiIGlkPSJlZDc1YjIxMC02YjVhLTQ4OGUtOGE4ZC1lZmU1NzBjODQ5OTAiIGNvbm5lY3RlZFRvPSI0YjkyZTQxOC00Y2E2LTQ3NjUtODVhYi1jZTMwZjQxMjdiZjAgZDFjZTE3ZmUtNTcyZC00YWRlLWE2ZTEtYTNkM2FhMGZhYjY0IiBjYXJyaWVyPSI3YjMyZTI4Ny1kNzc1LTQ4MGMtYjMxNy02NGZmZGFjZjEyYzkiIG5hbWU9Ik91dCIvPgogICAgICA8L2Fzc2V0PgogICAgICA8YXNzZXQgeHNpOnR5cGU9ImVzZGw6Sm9pbnQiIG5hbWU9IkpvaW50XzMiIGlkPSJkYTJmMTJkYy0wYjc0LTQ3MTktYmM1MC0xOGQ4NDc1MjRkYjMiPgogICAgICAgIDxnZW9tZXRyeSB4c2k6dHlwZT0iZXNkbDpQb2ludCIgQ1JTPSJXR1M4NCIgbGF0PSI1Mi4wMzg3NzAzNDU3ODEzOTQiIGxvbj0iNC4zMTUxMjcxMzQzMjMxMjEiLz4KICAgICAgICA8cG9ydCB4c2k6dHlwZT0iZXNkbDpJblBvcnQiIGNvbm5lY3RlZFRvPSI4ZjFiZWE1Mi1lMzIyLTRkMzQtYWQ0My03ZDFlOTcyNDNkNjIiIGlkPSIxY2I5MjNiNS0yYTY5LTQ2ZDktODc0Yy02OGQ1NTJlZjU1NzYiIGNhcnJpZXI9IjdiMzJlMjg3LWQ3NzUtNDgwYy1iMzE3LTY0ZmZkYWNmMTJjOSIgbmFtZT0iSW4iLz4KICAgICAgICA8cG9ydCB4c2k6dHlwZT0iZXNkbDpPdXRQb3J0IiBpZD0iYTAyZTQxYWItOTlmOC00NmQzLWIyZDEtYmU0NGFhNWI3OTE0IiBjb25uZWN0ZWRUbz0iN2YxNjJhMzAtN2U0MS00ZDdmLWIwMTEtZmZjZjRjMTY1MWY4IiBjYXJyaWVyPSI3YjMyZTI4Ny1kNzc1LTQ4MGMtYjMxNy02NGZmZGFjZjEyYzkiIG5hbWU9Ik91dCIvPgogICAgICA8L2Fzc2V0PgogICAgICA8YXNzZXQgeHNpOnR5cGU9ImVzZGw6QVRFUyIgYXF1aWZlck5ldFRvR3Jvc3M9IjEuMCIgbmFtZT0iQVRFU18wMzNjIiBhcXVpZmVyVGhpY2tuZXNzPSI0NS4wIiBtYXhEaXNjaGFyZ2VSYXRlPSIxMTYxMDAwMC4wIiB3ZWxsQ2FzaW5nU2l6ZT0iMTMuMCIgYXF1aWZlckFuaXNvdHJvcHk9IjQuMCIgYXF1aWZlclBvcm9zaXR5PSIwLjMiIGFxdWlmZXJNaWRUZW1wZXJhdHVyZT0iMTcuMCIgYXF1aWZlclRvcERlcHRoPSIzMDAuMCIgaWQ9IjAzM2MyNTk4LTVjMWEtNDhiNy05M2IxLWM3NDZiODE4MTlmZiIgd2VsbERpc3RhbmNlPSIxNTAuMCIgbWF4Q2hhcmdlUmF0ZT0iMTE2MTAwMDAuMCIgc2FsaW5pdHk9IjEwMDAwLjAiIGFxdWlmZXJQZXJtZWFiaWxpdHk9IjEwMDAwLjAiPgogICAgICAgIDxnZW9tZXRyeSB4c2k6dHlwZT0iZXNkbDpQb2ludCIgbG9uPSI0LjMxNDk0NDc0NDExMDEwOCIgbGF0PSI1Mi4wNDM5MjU5OTI3MDYxOSIvPgogICAgICAgIDxkYXRhU291cmNlIHhzaTp0eXBlPSJlc2RsOkRhdGFTb3VyY2UiIGRlc2NyaXB0aW9uPSJUaGlzIGRhdGEgd2FzIGdlbmVyYXRlZCB1c2luZyB0aGUgJ2tvc3Rlbl9wZXJfYXNzZXQueHNseCcgZmlsZSBpbiB0aGUgJ0tlbnRhbGxlbicgZGlyZWN0b3J5IG9mIFdhcm1pbmdVcCBwcm9qZWN0IDFEIiBhdHRyaWJ1dGlvbj0iIiBuYW1lPSJXYXJtaW5nVXAgZmFjdHNoZWV0OiBIVC1BVEVTIChoaWdoKSIvPgogICAgICAgIDxwb3J0IHhzaTp0eXBlPSJlc2RsOkluUG9ydCIgY29ubmVjdGVkVG89IjAxYzg4MmY3LWVjMTUtNGQzNC05ZjQzLTgxODE5NzJmMjUwMCIgaWQ9IjZiODNlNzRkLTVmZjEtNGZmYS04YmQ0LWRlMTE1NGI1NDFlMiIgY2Fycmllcj0iN2IzMmUyODctZDc3NS00ODBjLWIzMTctNjRmZmRhY2YxMmM5IiBuYW1lPSJJblBvcnQiLz4KICAgICAgICA8cG9ydCB4c2k6dHlwZT0iZXNkbDpPdXRQb3J0IiBpZD0iMTFlMzU4OWItOWEyZC00OTdlLWJjMmYtZmZmM2UzNGQ2ZWZlIiBjb25uZWN0ZWRUbz0iY2FkMTYyNTMtZjAwMS00N2YwLWFlYjAtMWU1MzJmNTIxM2U3IiBjYXJyaWVyPSI3YjMyZTI4Ny1kNzc1LTQ4MGMtYjMxNy02NGZmZGFjZjEyYzlfcmV0IiBuYW1lPSJPdXRQb3J0Ii8+CiAgICAgICAgPGNvc3RJbmZvcm1hdGlvbiB4c2k6dHlwZT0iZXNkbDpDb3N0SW5mb3JtYXRpb24iPgogICAgICAgICAgPHZhcmlhYmxlT3BlcmF0aW9uYWxDb3N0cyB4c2k6dHlwZT0iZXNkbDpTaW5nbGVWYWx1ZSIgdmFsdWU9IjYuMCIgaWQ9IjdhNzg5Yjk1LTkzYmItNDE1Yi1hYmJkLTRlY2JiNmFkNjBjOSI+CiAgICAgICAgICAgIDxwcm9maWxlUXVhbnRpdHlBbmRVbml0IHhzaTp0eXBlPSJlc2RsOlF1YW50aXR5QW5kVW5pdFR5cGUiIGlkPSJjNTIzMzRjOS1iYzVkLTQxZjQtYjkzZC0xMGU3Yjc2OWYyODEiIGRlc2NyaXB0aW9uPSJDb3N0IGluIEVVUi9NV2giIHBlclVuaXQ9IldBVFRIT1VSIiBwZXJNdWx0aXBsaWVyPSJNRUdBIiB1bml0PSJFVVJPIiBwaHlzaWNhbFF1YW50aXR5PSJDT1NUIi8+CiAgICAgICAgICA8L3ZhcmlhYmxlT3BlcmF0aW9uYWxDb3N0cz4KICAgICAgICAgIDxpbnZlc3RtZW50Q29zdHMgeHNpOnR5cGU9ImVzZGw6U2luZ2xlVmFsdWUiIHZhbHVlPSIyMzMzNTkuMCI+CiAgICAgICAgICAgIDxwcm9maWxlUXVhbnRpdHlBbmRVbml0IHhzaTp0eXBlPSJlc2RsOlF1YW50aXR5QW5kVW5pdFR5cGUiIGlkPSJhM2I1Y2RkOS0zNjRiLTQyNjItYmNlNS00NjU4YzVmMWJhYzkiIGRlc2NyaXB0aW9uPSJDb3N0IGluIEVVUi9NVyIgcGVyVW5pdD0iV0FUVCIgcGVyTXVsdGlwbGllcj0iTUVHQSIgdW5pdD0iRVVSTyIvPgogICAgICAgICAgPC9pbnZlc3RtZW50Q29zdHM+CiAgICAgICAgICA8aW5zdGFsbGF0aW9uQ29zdHMgeHNpOnR5cGU9ImVzZGw6U2luZ2xlVmFsdWUiIHZhbHVlPSIxMDAwMDAwLjAiIGlkPSIyMjUyODk3Mi0xOTIwLTQyZDgtOWUwYy0xMTVmNDE5YzMxZDEiPgogICAgICAgICAgICA8cHJvZmlsZVF1YW50aXR5QW5kVW5pdCB4c2k6dHlwZT0iZXNkbDpRdWFudGl0eUFuZFVuaXRUeXBlIiBpZD0iNjIwYTg1MjktNDNlYy00Njc0LThlZDMtMTBiZWZhZmYwNzQyIiBwaHlzaWNhbFF1YW50aXR5PSJDT1NUIiBkZXNjcmlwdGlvbj0iQ29zdCBpbiBFVVIiIHVuaXQ9IkVVUk8iLz4KICAgICAgICAgIDwvaW5zdGFsbGF0aW9uQ29zdHM+CiAgICAgICAgPC9jb3N0SW5mb3JtYXRpb24+CiAgICAgIDwvYXNzZXQ+CiAgICAgIDxhc3NldCB4c2k6dHlwZT0iZXNkbDpKb2ludCIgbmFtZT0iSm9pbnRfMV9yZXQiIGlkPSI2ZDk3NzAwYy1hM2Q3LTQxMjctYjY0Yy1mMDhlZTJlMzA4ZjkiPgogICAgICAgIDxnZW9tZXRyeSB4c2k6dHlwZT0iZXNkbDpQb2ludCIgQ1JTPSJXR1M4NCIgbGF0PSI1Mi4wNDI4MTA4NjIwMjg4NSIgbG9uPSI0LjMxMTA3NDQwMjY2NTY0OSIvPgogICAgICAgIDxwb3J0IHhzaTp0eXBlPSJlc2RsOk91dFBvcnQiIGlkPSIyOTEzZTY0NS1iMDI3LTQyOWUtYmY1ZC0yMmFjZTk2YTM5ZmEiIGNvbm5lY3RlZFRvPSJkZDUwZTYwMy1jODdjLTRjZGItODJiYi00ODZlYmVlNzcyNTUgNDJlOWY4NmItZWE5Ni00OTkyLWJmM2YtOWNiYWU4YTRhMzljIiBjYXJyaWVyPSI3YjMyZTI4Ny1kNzc1LTQ4MGMtYjMxNy02NGZmZGFjZjEyYzlfcmV0IiBuYW1lPSJyZXRfcG9ydCIvPgogICAgICAgIDxwb3J0IHhzaTp0eXBlPSJlc2RsOkluUG9ydCIgY29ubmVjdGVkVG89IjA0MzFiOGEwLWE4ZDEtNDM3NS1iMzQ4LTM3YTQ3NWFkZDQ3YSA2YjY1NWViMS0yYjY2LTQ1NWYtOTBhMy0wZGQ2ZjI4NDRmYWIgNmNjYjAwNWMtNDVkNC00MjIwLTkyODYtY2M4Zjc3YjAzZWM2IiBpZD0iNzg5MzEyNWQtZDgyZi00ZmU4LWFhZWEtNWZiNmFmZWNjNjM1IiBjYXJyaWVyPSI3YjMyZTI4Ny1kNzc1LTQ4MGMtYjMxNy02NGZmZGFjZjEyYzlfcmV0IiBuYW1lPSJyZXRfcG9ydCIvPgogICAgICA8L2Fzc2V0PgogICAgICA8YXNzZXQgeHNpOnR5cGU9ImVzZGw6Sm9pbnQiIG5hbWU9IkpvaW50XzJfcmV0IiBpZD0iZTYxNWM3N2EtYmI3NS00MTFiLTkyYzItNTQ5ZWZiZGY4ZWM4Ij4KICAgICAgICA8Z2VvbWV0cnkgeHNpOnR5cGU9ImVzZGw6UG9pbnQiIENSUz0iV0dTODQiIGxhdD0iNTIuMDQwODQ2NzgzOTM5OTciIGxvbj0iNC4zMTI3NDYyNDU1Mjk1MzYiLz4KICAgICAgICA8cG9ydCB4c2k6dHlwZT0iZXNkbDpJblBvcnQiIGNvbm5lY3RlZFRvPSJiMzE4N2VmOS1jZDBiLTRlYTgtOTBlNC1lYWIzOWZhMjI1ZTkgNGIzOTczYWItNmU0Yi00OGFmLTk0N2QtNTJjNmQzMGYyMGVhIiBpZD0iYTFiNzE5Y2ItZjczNS00YTMwLWEwZDItY2Y2OTQ1YjNhZmExIiBjYXJyaWVyPSI3YjMyZTI4Ny1kNzc1LTQ4MGMtYjMxNy02NGZmZGFjZjEyYzlfcmV0IiBuYW1lPSJyZXRfcG9ydCIvPgogICAgICAgIDxwb3J0IHhzaTp0eXBlPSJlc2RsOk91dFBvcnQiIGlkPSIyZGQ3OTYxYi00NmNlLTQwMjctODRiNi1jYzI2ODRhMDNhN2IiIGNvbm5lY3RlZFRvPSIwNjUwZDg1MC01OGE5LTQ1YjMtODMxMy1hMzE1NmEwNjE5ODgiIGNhcnJpZXI9IjdiMzJlMjg3LWQ3NzUtNDgwYy1iMzE3LTY0ZmZkYWNmMTJjOV9yZXQiIG5hbWU9InJldF9wb3J0Ii8+CiAgICAgIDwvYXNzZXQ+CiAgICAgIDxhc3NldCB4c2k6dHlwZT0iZXNkbDpKb2ludCIgbmFtZT0iSm9pbnRfM19yZXQiIGlkPSJhOTBkMTQ2Zi1lMjM0LTQ1OWMtOTc0ZS03ODY3YWZiYmIzZjAiPgogICAgICAgIDxnZW9tZXRyeSB4c2k6dHlwZT0iZXNkbDpQb2ludCIgQ1JTPSJXR1M4NCIgbGF0PSI1Mi4wMzg4NjAzNDU4NzEzOSIgbG9uPSI0LjMxNDQ5NDM0NzU3NjM0NCIvPgogICAgICAgIDxwb3J0IHhzaTp0eXBlPSJlc2RsOkluUG9ydCIgY29ubmVjdGVkVG89IjIwNDVhY2E5LTRlNTAtNDJlYy05OWRlLWZiY2ZmYTYyN2E4NiIgaWQ9ImYzNmI5NzY3LThlNjQtNDc0NC04Y2QwLTA4YWNiMmFlODczYiIgY2Fycmllcj0iN2IzMmUyODctZDc3NS00ODBjLWIzMTctNjRmZmRhY2YxMmM5X3JldCIgbmFtZT0icmV0X3BvcnQiLz4KICAgICAgICA8cG9ydCB4c2k6dHlwZT0iZXNkbDpPdXRQb3J0IiBpZD0iNTljY2RkZGMtODkzYi00MTUyLThiYzQtMDE2OGU3ZTc0YmYzIiBjb25uZWN0ZWRUbz0iMmI3YzNhY2ItNjlhNy00OTdkLWE3MmYtYjk4ZGIxODk4NDFjIiBjYXJyaWVyPSI3YjMyZTI4Ny1kNzc1LTQ4MGMtYjMxNy02NGZmZGFjZjEyYzlfcmV0IiBuYW1lPSJyZXRfcG9ydCIvPgogICAgICA8L2Fzc2V0PgogICAgICA8YXNzZXQgeHNpOnR5cGU9ImVzZGw6UGlwZSIgcmVsYXRlZD0iUGlwZTEiIGRpYW1ldGVyPSJETjQ1MCIgbmFtZT0iUGlwZTFfcmV0IiBsZW5ndGg9IjI0NS43IiBpbm5lckRpYW1ldGVyPSIwLjQ0NDQiIGlkPSJQaXBlMV9yZXQiIG91dGVyRGlhbWV0ZXI9IjAuNjMiPgogICAgICAgIDxnZW9tZXRyeSB4c2k6dHlwZT0iZXNkbDpMaW5lIj4KICAgICAgICAgIDxwb2ludCB4c2k6dHlwZT0iZXNkbDpQb2ludCIgQ1JTPSJXR1M4NCIgbGF0PSI1Mi4wNDI4MzE0ODM5Nzg0OSIgbG9uPSI0LjMxMTA5OTk0NDc3OTE4MiIvPgogICAgICAgICAgPHBvaW50IHhzaTp0eXBlPSJlc2RsOlBvaW50IiBDUlM9IldHUzg0IiBsYXQ9IjUyLjA0NDc4ODA1MTI4MjE0IiBsb249IjQuMzA5NDM3MzU1MDMzMDA2Ii8+CiAgICAgICAgPC9nZW9tZXRyeT4KICAgICAgICA8cG9ydCB4c2k6dHlwZT0iZXNkbDpJblBvcnQiIGNvbm5lY3RlZFRvPSIyOTEzZTY0NS1iMDI3LTQyOWUtYmY1ZC0yMmFjZTk2YTM5ZmEiIGlkPSJkZDUwZTYwMy1jODdjLTRjZGItODJiYi00ODZlYmVlNzcyNTUiIGNhcnJpZXI9IjdiMzJlMjg3LWQ3NzUtNDgwYy1iMzE3LTY0ZmZkYWNmMTJjOV9yZXQiIG5hbWU9IkluX3JldCIvPgogICAgICAgIDxwb3J0IHhzaTp0eXBlPSJlc2RsOk91dFBvcnQiIGlkPSJlMzFlMTJjMi04ZjgwLTRhZWQtOWU0Yi05MTg0NDVhMzI5OTYiIGNvbm5lY3RlZFRvPSJiYTljYTA4NC1iNzFmLTQyYTMtODg0YS1mMmYyYjNhZTQyNjUiIGNhcnJpZXI9IjdiMzJlMjg3LWQ3NzUtNDgwYy1iMzE3LTY0ZmZkYWNmMTJjOV9yZXQiIG5hbWU9Ik91dF9yZXQiLz4KICAgICAgICA8Y29zdEluZm9ybWF0aW9uIHhzaTp0eXBlPSJlc2RsOkNvc3RJbmZvcm1hdGlvbiIgaWQ9IjAzYzA3MjkzLWY2ZDQtNGFhNi1hMjk3LTUzMTJjNGQxYzI3ZSI+CiAgICAgICAgICA8aW52ZXN0bWVudENvc3RzIHhzaTp0eXBlPSJlc2RsOlNpbmdsZVZhbHVlIiB2YWx1ZT0iMzQxNy45IiBpZD0iOWI0NDkxNDQtZDBiZi00NWI5LTg4MjItMTVkYmExZDQxMjZkIj4KICAgICAgICAgICAgPHByb2ZpbGVRdWFudGl0eUFuZFVuaXQgeHNpOnR5cGU9ImVzZGw6UXVhbnRpdHlBbmRVbml0VHlwZSIgaWQ9IjZkYmUwOTNmLWY2ZGQtNDliNC05ZDVlLWEyY2Q1Nzg2MTFiZSIgZGVzY3JpcHRpb249IkNvc3QgaW4gRVVSL20iIHBlclVuaXQ9Ik1FVFJFIiBwaHlzaWNhbFF1YW50aXR5PSJDT1NUIiB1bml0PSJFVVJPIi8+CiAgICAgICAgICA8L2ludmVzdG1lbnRDb3N0cz4KICAgICAgICA8L2Nvc3RJbmZvcm1hdGlvbj4KICAgICAgPC9hc3NldD4KICAgICAgPGFzc2V0IHhzaTp0eXBlPSJlc2RsOlBpcGUiIHJlbGF0ZWQ9IlBpcGUyIiBkaWFtZXRlcj0iRE40NTAiIG5hbWU9IlBpcGUyX3JldCIgbGVuZ3RoPSIxOTUuNCIgaW5uZXJEaWFtZXRlcj0iMC40NDQ0IiBpZD0iUGlwZTJfcmV0IiBvdXRlckRpYW1ldGVyPSIwLjYzIj4KICAgICAgICA8Z2VvbWV0cnkgeHNpOnR5cGU9ImVzZGw6TGluZSI+CiAgICAgICAgICA8cG9pbnQgeHNpOnR5cGU9ImVzZGw6UG9pbnQiIENSUz0iV0dTODQiIGxhdD0iNTIuMDQyMTEyMTg0NzUzMjYiIGxvbj0iNC4zMDgzNzgwNDUzODY2OTEiLz4KICAgICAgICAgIDxwb2ludCB4c2k6dHlwZT0iZXNkbDpQb2ludCIgQ1JTPSJXR1M4NCIgbGF0PSI1Mi4wNDI4MDE3ODgzNjgwMSIgbG9uPSI0LjMxMTAwODY2MTY0NDYwNiIvPgogICAgICAgIDwvZ2VvbWV0cnk+CiAgICAgICAgPHBvcnQgeHNpOnR5cGU9ImVzZGw6SW5Qb3J0IiBjb25uZWN0ZWRUbz0iZWY3NGVhOGMtODliNC00MmUwLWE5OGMtNDExODYwODc2YzFhIiBpZD0iMThjZTY5MDYtNTk1Yy00NWU0LWFjZjAtZTA3ZjdkNzY0OGM2IiBjYXJyaWVyPSI3YjMyZTI4Ny1kNzc1LTQ4MGMtYjMxNy02NGZmZGFjZjEyYzlfcmV0IiBuYW1lPSJJbl9yZXQiLz4KICAgICAgICA8cG9ydCB4c2k6dHlwZT0iZXNkbDpPdXRQb3J0IiBpZD0iMDQzMWI4YTAtYThkMS00Mzc1LWIzNDgtMzdhNDc1YWRkNDdhIiBjb25uZWN0ZWRUbz0iNzg5MzEyNWQtZDgyZi00ZmU4LWFhZWEtNWZiNmFmZWNjNjM1IiBjYXJyaWVyPSI3YjMyZTI4Ny1kNzc1LTQ4MGMtYjMxNy02NGZmZGFjZjEyYzlfcmV0IiBuYW1lPSJPdXRfcmV0Ii8+CiAgICAgICAgPGNvc3RJbmZvcm1hdGlvbiB4c2k6dHlwZT0iZXNkbDpDb3N0SW5mb3JtYXRpb24iIGlkPSJiZWM4MzA3MC0yYzUxLTQ4MjUtODJmMy05MjQzNGJkM2U1OWMiPgogICAgICAgICAgPGludmVzdG1lbnRDb3N0cyB4c2k6dHlwZT0iZXNkbDpTaW5nbGVWYWx1ZSIgdmFsdWU9IjM0MTcuOSIgaWQ9IjFjMzMwMjRjLTk5YzgtNDE2OC1iMzUzLTlmMDk5YjU5ZWI2MCI+CiAgICAgICAgICAgIDxwcm9maWxlUXVhbnRpdHlBbmRVbml0IHhzaTp0eXBlPSJlc2RsOlF1YW50aXR5QW5kVW5pdFR5cGUiIGlkPSIyNmZkYjhiZi02NDEzLTQyNzItYTU2Yi1iMDg0ODIzYWM1NzQiIGRlc2NyaXB0aW9uPSJDb3N0IGluIEVVUi9tIiBwZXJVbml0PSJNRVRSRSIgcGh5c2ljYWxRdWFudGl0eT0iQ09TVCIgdW5pdD0iRVVSTyIvPgogICAgICAgICAgPC9pbnZlc3RtZW50Q29zdHM+CiAgICAgICAgPC9jb3N0SW5mb3JtYXRpb24+CiAgICAgIDwvYXNzZXQ+CiAgICAgIDxhc3NldCB4c2k6dHlwZT0iZXNkbDpQaXBlIiByZWxhdGVkPSJQaXBlMyIgZGlhbWV0ZXI9IkRONDUwIiBuYW1lPSJQaXBlM19yZXQiIGxlbmd0aD0iMjQxLjYiIGlubmVyRGlhbWV0ZXI9IjAuNDQ0NCIgaWQ9IlBpcGUzX3JldCIgb3V0ZXJEaWFtZXRlcj0iMC42MyI+CiAgICAgICAgPGdlb21ldHJ5IHhzaTp0eXBlPSJlc2RsOkxpbmUiPgogICAgICAgICAgPHBvaW50IHhzaTp0eXBlPSJlc2RsOlBvaW50IiBDUlM9IldHUzg0IiBsYXQ9IjUyLjA0MDg3NDgzMTAyMTU1NCIgbG9uPSI0LjMxMjc3MzE1MjM3MDcwNSIvPgogICAgICAgICAgPHBvaW50IHhzaTp0eXBlPSJlc2RsOlBvaW50IiBDUlM9IldHUzg0IiBsYXQ9IjUyLjA0Mjc5ODQ4ODg1NDUiIGxvbj0iNC4zMTExMzczOTc4OTQ4NDU1Ii8+CiAgICAgICAgPC9nZW9tZXRyeT4KICAgICAgICA8cG9ydCB4c2k6dHlwZT0iZXNkbDpJblBvcnQiIGNvbm5lY3RlZFRvPSIyZGQ3OTYxYi00NmNlLTQwMjctODRiNi1jYzI2ODRhMDNhN2IiIGlkPSIwNjUwZDg1MC01OGE5LTQ1YjMtODMxMy1hMzE1NmEwNjE5ODgiIGNhcnJpZXI9IjdiMzJlMjg3LWQ3NzUtNDgwYy1iMzE3LTY0ZmZkYWNmMTJjOV9yZXQiIG5hbWU9IkluX3JldCIvPgogICAgICAgIDxwb3J0IHhzaTp0eXBlPSJlc2RsOk91dFBvcnQiIGlkPSI2YjY1NWViMS0yYjY2LTQ1NWYtOTBhMy0wZGQ2ZjI4NDRmYWIiIGNvbm5lY3RlZFRvPSI3ODkzMTI1ZC1kODJmLTRmZTgtYWFlYS01ZmI2YWZlY2M2MzUiIGNhcnJpZXI9IjdiMzJlMjg3LWQ3NzUtNDgwYy1iMzE3LTY0ZmZkYWNmMTJjOV9yZXQiIG5hbWU9Ik91dF9yZXQiLz4KICAgICAgICA8Y29zdEluZm9ybWF0aW9uIHhzaTp0eXBlPSJlc2RsOkNvc3RJbmZvcm1hdGlvbiIgaWQ9IjM4ZjJmMGY3LWY4MTQtNGJhZi1hZTNhLTM2NWFmMWI4NzJkYiI+CiAgICAgICAgICA8aW52ZXN0bWVudENvc3RzIHhzaTp0eXBlPSJlc2RsOlNpbmdsZVZhbHVlIiB2YWx1ZT0iMzQxNy45IiBpZD0iNzgyMjE2NTktNzI5NC00ODMwLTgwMmMtNjdlMzgzNjRiMWYwIj4KICAgICAgICAgICAgPHByb2ZpbGVRdWFudGl0eUFuZFVuaXQgeHNpOnR5cGU9ImVzZGw6UXVhbnRpdHlBbmRVbml0VHlwZSIgaWQ9IjE5ZjYzYjYxLTQ1M2QtNDIxMy1iZGM2LTg2ZjY1NDY4ZmVjOSIgZGVzY3JpcHRpb249IkNvc3QgaW4gRVVSL20iIHBlclVuaXQ9Ik1FVFJFIiBwaHlzaWNhbFF1YW50aXR5PSJDT1NUIiB1bml0PSJFVVJPIi8+CiAgICAgICAgICA8L2ludmVzdG1lbnRDb3N0cz4KICAgICAgICA8L2Nvc3RJbmZvcm1hdGlvbj4KICAgICAgPC9hc3NldD4KICAgICAgPGFzc2V0IHhzaTp0eXBlPSJlc2RsOlBpcGUiIHJlbGF0ZWQ9IlBpcGU0IiBkaWFtZXRlcj0iRE40NTAiIG5hbWU9IlBpcGU0X3JldCIgbGVuZ3RoPSIxODkuNyIgaW5uZXJEaWFtZXRlcj0iMC40NDQ0IiBpZD0iUGlwZTRfcmV0IiBvdXRlckRpYW1ldGVyPSIwLjYzIj4KICAgICAgICA8Z2VvbWV0cnkgeHNpOnR5cGU9ImVzZGw6TGluZSI+CiAgICAgICAgICA8cG9pbnQgeHNpOnR5cGU9ImVzZGw6UG9pbnQiIENSUz0iV0dTODQiIGxhdD0iNTIuMDQwMTYyMDk5NzI0ODciIGxvbj0iNC4zMTAxNTg1MTk4MTI2ODQiLz4KICAgICAgICAgIDxwb2ludCB4c2k6dHlwZT0iZXNkbDpQb2ludCIgQ1JTPSJXR1M4NCIgbGF0PSI1Mi4wNDA4NTE3MzM0MjYyMTYiIGxvbj0iNC4zMTI2OTc5ODA3MjUwMzYiLz4KICAgICAgICA8L2dlb21ldHJ5PgogICAgICAgIDxwb3J0IHhzaTp0eXBlPSJlc2RsOkluUG9ydCIgY29ubmVjdGVkVG89ImJmNmUwYjZiLWJhYWMtNDY4Yi1hOWJhLWY4Mzk3YmFiZjVkNiIgaWQ9ImQxMjZmNzllLWM0M2UtNGQ5ZC1hN2NlLThmNThiZTYzNDY5NSIgY2Fycmllcj0iN2IzMmUyODctZDc3NS00ODBjLWIzMTctNjRmZmRhY2YxMmM5X3JldCIgbmFtZT0iSW5fcmV0Ii8+CiAgICAgICAgPHBvcnQgeHNpOnR5cGU9ImVzZGw6T3V0UG9ydCIgaWQ9ImIzMTg3ZWY5LWNkMGItNGVhOC05MGU0LWVhYjM5ZmEyMjVlOSIgY29ubmVjdGVkVG89ImExYjcxOWNiLWY3MzUtNGEzMC1hMGQyLWNmNjk0NWIzYWZhMSIgY2Fycmllcj0iN2IzMmUyODctZDc3NS00ODBjLWIzMTctNjRmZmRhY2YxMmM5X3JldCIgbmFtZT0iT3V0X3JldCIvPgogICAgICAgIDxjb3N0SW5mb3JtYXRpb24geHNpOnR5cGU9ImVzZGw6Q29zdEluZm9ybWF0aW9uIiBpZD0iMmExNTQ1NmUtZDIzZS00MDY0LThkZWUtYzA1ODhkM2IwNWRjIj4KICAgICAgICAgIDxpbnZlc3RtZW50Q29zdHMgeHNpOnR5cGU9ImVzZGw6U2luZ2xlVmFsdWUiIHZhbHVlPSIzNDE3LjkiIGlkPSIwMjk3Yjk2YS1jMzJjLTQxZjgtODY1My0wMDg1NjU5ZGJhMjkiPgogICAgICAgICAgICA8cHJvZmlsZVF1YW50aXR5QW5kVW5pdCB4c2k6dHlwZT0iZXNkbDpRdWFudGl0eUFuZFVuaXRUeXBlIiBpZD0iOTg2OWIwZDItZGZhMy00MTQ4LTg2YWItZGRkMWNiNDNiN2M3IiBkZXNjcmlwdGlvbj0iQ29zdCBpbiBFVVIvbSIgcGVyVW5pdD0iTUVUUkUiIHBoeXNpY2FsUXVhbnRpdHk9IkNPU1QiIHVuaXQ9IkVVUk8iLz4KICAgICAgICAgIDwvaW52ZXN0bWVudENvc3RzPgogICAgICAgIDwvY29zdEluZm9ybWF0aW9uPgogICAgICA8L2Fzc2V0PgogICAgICA8YXNzZXQgeHNpOnR5cGU9ImVzZGw6UGlwZSIgcmVsYXRlZD0iUGlwZTUiIGRpYW1ldGVyPSJETjQ1MCIgbmFtZT0iUGlwZTVfcmV0IiBsZW5ndGg9IjI0NC42IiBpbm5lckRpYW1ldGVyPSIwLjQ0NDQiIGlkPSJQaXBlNV9yZXQiIG91dGVyRGlhbWV0ZXI9IjAuNjMiPgogICAgICAgIDxnZW9tZXRyeSB4c2k6dHlwZT0iZXNkbDpMaW5lIj4KICAgICAgICAgIDxwb2ludCB4c2k6dHlwZT0iZXNkbDpQb2ludCIgQ1JTPSJXR1M4NCIgbGF0PSI1Mi4wMzg4ODgzOTQxOTkzNzUiIGxvbj0iNC4zMTQ1MDUxNjI4NTAxODgiLz4KICAgICAgICAgIDxwb2ludCB4c2k6dHlwZT0iZXNkbDpQb2ludCIgQ1JTPSJXR1M4NCIgbGF0PSI1Mi4wNDA4Mjg2MzU4MTg5NzYiIGxvbj0iNC4zMTI4MjY2NTY5NDg1NzkiLz4KICAgICAgICA8L2dlb21ldHJ5PgogICAgICAgIDxwb3J0IHhzaTp0eXBlPSJlc2RsOkluUG9ydCIgY29ubmVjdGVkVG89IjU5Y2NkZGRjLTg5M2ItNDE1Mi04YmM0LTAxNjhlN2U3NGJmMyIgaWQ9IjJiN2MzYWNiLTY5YTctNDk3ZC1hNzJmLWI5OGRiMTg5ODQxYyIgY2Fycmllcj0iN2IzMmUyODctZDc3NS00ODBjLWIzMTctNjRmZmRhY2YxMmM5X3JldCIgbmFtZT0iSW5fcmV0Ii8+CiAgICAgICAgPHBvcnQgeHNpOnR5cGU9ImVzZGw6T3V0UG9ydCIgaWQ9IjRiMzk3M2FiLTZlNGItNDhhZi05NDdkLTUyYzZkMzBmMjBlYSIgY29ubmVjdGVkVG89ImExYjcxOWNiLWY3MzUtNGEzMC1hMGQyLWNmNjk0NWIzYWZhMSIgY2Fycmllcj0iN2IzMmUyODctZDc3NS00ODBjLWIzMTctNjRmZmRhY2YxMmM5X3JldCIgbmFtZT0iT3V0X3JldCIvPgogICAgICAgIDxjb3N0SW5mb3JtYXRpb24geHNpOnR5cGU9ImVzZGw6Q29zdEluZm9ybWF0aW9uIiBpZD0iMzg3ZWI0NTgtNGUzZS00ZTBkLWJmMWMtMGNhMmQ3N2FhNGRkIj4KICAgICAgICAgIDxpbnZlc3RtZW50Q29zdHMgeHNpOnR5cGU9ImVzZGw6U2luZ2xlVmFsdWUiIHZhbHVlPSIzNDE3LjkiIGlkPSJiNzhhYzhhNy05ZDBlLTQ2MDMtODIxYi1mZWJmNThiNDhiYjMiPgogICAgICAgICAgICA8cHJvZmlsZVF1YW50aXR5QW5kVW5pdCB4c2k6dHlwZT0iZXNkbDpRdWFudGl0eUFuZFVuaXRUeXBlIiBpZD0iZDY1NDc4MDEtMGViNy00ZWQ0LTk1OTctMWU3OWNjMDkzNjIyIiBkZXNjcmlwdGlvbj0iQ29zdCBpbiBFVVIvbSIgcGVyVW5pdD0iTUVUUkUiIHBoeXNpY2FsUXVhbnRpdHk9IkNPU1QiIHVuaXQ9IkVVUk8iLz4KICAgICAgICAgIDwvaW52ZXN0bWVudENvc3RzPgogICAgICAgIDwvY29zdEluZm9ybWF0aW9uPgogICAgICA8L2Fzc2V0PgogICAgICA8YXNzZXQgeHNpOnR5cGU9ImVzZGw6UGlwZSIgcmVsYXRlZD0iUGlwZTYiIGRpYW1ldGVyPSJETjQ1MCIgbmFtZT0iUGlwZTZfcmV0IiBsZW5ndGg9IjE3Ni42IiBpbm5lckRpYW1ldGVyPSIwLjQ0NDQiIGlkPSJQaXBlNl9yZXQiIG91dGVyRGlhbWV0ZXI9IjAuNjMiPgogICAgICAgIDxnZW9tZXRyeSB4c2k6dHlwZT0iZXNkbDpMaW5lIj4KICAgICAgICAgIDxwb2ludCB4c2k6dHlwZT0iZXNkbDpQb2ludCIgQ1JTPSJXR1M4NCIgbGF0PSI1Mi4wMzgxMDMwMzQzNjI5MiIgbG9uPSI0LjMxMjE3NDU3NTk5NjczMiIvPgogICAgICAgICAgPHBvaW50IHhzaTp0eXBlPSJlc2RsOlBvaW50IiBDUlM9IldHUzg0IiBsYXQ9IjUyLjAzODg0MjE5Njk0Mzg5IiBsb249IjQuMzE0NDYyMTA1MTI0OTU1Ii8+CiAgICAgICAgPC9nZW9tZXRyeT4KICAgICAgICA8cG9ydCB4c2k6dHlwZT0iZXNkbDpJblBvcnQiIGNvbm5lY3RlZFRvPSI5YzAyNWIxOS01N2QxLTQzYTgtYjJlOC1kYjNlNjg0NzU2ZjIiIGlkPSI1Y2QwZjJlMC1kNDU2LTQ5MDktYTgxYy00YjMxMmIxYmU4NTciIGNhcnJpZXI9IjdiMzJlMjg3LWQ3NzUtNDgwYy1iMzE3LTY0ZmZkYWNmMTJjOV9yZXQiIG5hbWU9IkluX3JldCIvPgogICAgICAgIDxwb3J0IHhzaTp0eXBlPSJlc2RsOk91dFBvcnQiIGlkPSIyMDQ1YWNhOS00ZTUwLTQyZWMtOTlkZS1mYmNmZmE2MjdhODYiIGNvbm5lY3RlZFRvPSJmMzZiOTc2Ny04ZTY0LTQ3NDQtOGNkMC0wOGFjYjJhZTg3M2IiIGNhcnJpZXI9IjdiMzJlMjg3LWQ3NzUtNDgwYy1iMzE3LTY0ZmZkYWNmMTJjOV9yZXQiIG5hbWU9Ik91dF9yZXQiLz4KICAgICAgICA8Y29zdEluZm9ybWF0aW9uIHhzaTp0eXBlPSJlc2RsOkNvc3RJbmZvcm1hdGlvbiIgaWQ9ImNiYmI3NGJhLWJhNmYtNGYxNy1hNzhmLTNiM2MwN2NlNTMxZCI+CiAgICAgICAgICA8aW52ZXN0bWVudENvc3RzIHhzaTp0eXBlPSJlc2RsOlNpbmdsZVZhbHVlIiB2YWx1ZT0iMzQxNy45IiBpZD0iYWU1ZjRmNWYtMTMyMy00YTNiLTk4YzgtZmFjYTMyMWEwMGM3Ij4KICAgICAgICAgICAgPHByb2ZpbGVRdWFudGl0eUFuZFVuaXQgeHNpOnR5cGU9ImVzZGw6UXVhbnRpdHlBbmRVbml0VHlwZSIgaWQ9IjE4NTcwYjIwLWI4MjAtNDNkMC05NTJhLWI2ZWFmMTY2YzYzOSIgZGVzY3JpcHRpb249IkNvc3QgaW4gRVVSL20iIHBlclVuaXQ9Ik1FVFJFIiBwaHlzaWNhbFF1YW50aXR5PSJDT1NUIiB1bml0PSJFVVJPIi8+CiAgICAgICAgICA8L2ludmVzdG1lbnRDb3N0cz4KICAgICAgICA8L2Nvc3RJbmZvcm1hdGlvbj4KICAgICAgPC9hc3NldD4KICAgICAgPGFzc2V0IHhzaTp0eXBlPSJlc2RsOkhlYXRQcm9kdWNlciIgcG93ZXI9IjI1MDAwMDAuMCIgbmFtZT0iSGVhdFByb2R1Y2VyXzIiIGlkPSJkYTAwZGRmYy1jZmE0LTRmMjEtYjViZS03YzY5ZDJiZjUzYmIiPgogICAgICAgIDxnZW9tZXRyeSB4c2k6dHlwZT0iZXNkbDpQb2ludCIgbG9uPSI0LjMxMTcyNjA5MzI5MjIzNyIgQ1JTPSJXR1M4NCIgbGF0PSI1Mi4wNDQ4NzYyMTY2NDEwMyIvPgogICAgICAgIDxwb3J0IHhzaTp0eXBlPSJlc2RsOk91dFBvcnQiIGlkPSI4ODZlNTQzMC1iZWMxLTQ0ZTMtYmFiNi0yMjFjNDUxOGM4MTAiIGNvbm5lY3RlZFRvPSJiYmZlZDgzMC0wNzFkLTRkMDItYmRkZC1lNzA5MjQ3YzgzMzciIGNhcnJpZXI9IjdiMzJlMjg3LWQ3NzUtNDgwYy1iMzE3LTY0ZmZkYWNmMTJjOSIgbmFtZT0iT3V0Ii8+CiAgICAgICAgPHBvcnQgeHNpOnR5cGU9ImVzZGw6SW5Qb3J0IiBjb25uZWN0ZWRUbz0iZGY2Zjg5ZDAtNzg3Mi00ODkxLTkzNGYtZGU0MDdmNmFhMTQyIiBpZD0iYzdlZDg5MTUtZGRkMC00N2Y4LTkzZDYtMWRhYmZiNWQzMjBiIiBjYXJyaWVyPSI3YjMyZTI4Ny1kNzc1LTQ4MGMtYjMxNy02NGZmZGFjZjEyYzlfcmV0IiBuYW1lPSJJbiIvPgogICAgICAgIDxjb3N0SW5mb3JtYXRpb24geHNpOnR5cGU9ImVzZGw6Q29zdEluZm9ybWF0aW9uIiBpZD0iZDU5ZmUwYzQtNTE1Ni00ZGNmLWIyNTktNmFjNjg1NTI0MWM2Ij4KICAgICAgICAgIDx2YXJpYWJsZU9wZXJhdGlvbmFsQ29zdHMgeHNpOnR5cGU9ImVzZGw6U2luZ2xlVmFsdWUiIHZhbHVlPSI2LjAiIGlkPSI3YTc4OWI5NS05M2JiLTQxNWItYWJiZC00ZWNiYjZhZDYwYzkiPgogICAgICAgICAgICA8cHJvZmlsZVF1YW50aXR5QW5kVW5pdCB4c2k6dHlwZT0iZXNkbDpRdWFudGl0eUFuZFVuaXRUeXBlIiBpZD0iYzUyMzM0YzktYmM1ZC00MWY0LWI5M2QtMTBlN2I3NjlmMjgxIiBkZXNjcmlwdGlvbj0iQ29zdCBpbiBFVVIvTVdoIiBwZXJVbml0PSJXQVRUSE9VUiIgcGVyTXVsdGlwbGllcj0iTUVHQSIgdW5pdD0iRVVSTyIgcGh5c2ljYWxRdWFudGl0eT0iQ09TVCIvPgogICAgICAgICAgPC92YXJpYWJsZU9wZXJhdGlvbmFsQ29zdHM+CiAgICAgICAgICA8aW5zdGFsbGF0aW9uQ29zdHMgeHNpOnR5cGU9ImVzZGw6U2luZ2xlVmFsdWUiIHZhbHVlPSIxMDAwMDAuMCIgaWQ9IjJiMmY0YjkzLTMyYzctNGYyMC05NzIzLTU5MDBjYzc2ZmUyMCI+CiAgICAgICAgICAgIDxwcm9maWxlUXVhbnRpdHlBbmRVbml0IHhzaTp0eXBlPSJlc2RsOlF1YW50aXR5QW5kVW5pdFR5cGUiIGlkPSJiMDk3NWVlZi0yZTEzLTRiN2YtYjg5YS02NGE0NzE4M2U4Y2MiIHBoeXNpY2FsUXVhbnRpdHk9IkNPU1QiIGRlc2NyaXB0aW9uPSJDb3N0IGluIEVVUiIgdW5pdD0iRVVSTyIvPgogICAgICAgICAgPC9pbnN0YWxsYXRpb25Db3N0cz4KICAgICAgICAgIDxpbnZlc3RtZW50Q29zdHMgeHNpOnR5cGU9ImVzZGw6U2luZ2xlVmFsdWUiIHZhbHVlPSIxMDAwMDAuMCIgaWQ9IjM2MzNjZDA5LTlmODctNGQ4ZC1hNWY4LTA0MzFiYWI5NTc2ZCI+CiAgICAgICAgICAgIDxwcm9maWxlUXVhbnRpdHlBbmRVbml0IHhzaTp0eXBlPSJlc2RsOlF1YW50aXR5QW5kVW5pdFR5cGUiIGlkPSI4OGEwMDlmZi0wZWViLTQ4YjEtOWViMy02MGRiYTA0YjNlNzkiIGRlc2NyaXB0aW9uPSJDb3N0IGluIEVVUi9NVyIgcGVyVW5pdD0iV0FUVCIgcGVyTXVsdGlwbGllcj0iTUVHQSIgdW5pdD0iRVVSTyIgcGh5c2ljYWxRdWFudGl0eT0iQ09TVCIvPgogICAgICAgICAgPC9pbnZlc3RtZW50Q29zdHM+CiAgICAgICAgICA8bWFyZ2luYWxDb3N0cyB4c2k6dHlwZT0iZXNkbDpTaW5nbGVWYWx1ZSIgdmFsdWU9IjEuMCIgaWQ9IjNmNzNiZDI2LWI5MjMtNGUyYS04ZjhlLTQzNWM4YTc4M2Q4ZCI+CiAgICAgICAgICAgIDxwcm9maWxlUXVhbnRpdHlBbmRVbml0IHhzaTp0eXBlPSJlc2RsOlF1YW50aXR5QW5kVW5pdFR5cGUiIGlkPSJhMTA4NmE3Ny1hMmQxLTRhOWItYTZmMi1hZGYwZTQzODBlY2EiIHBoeXNpY2FsUXVhbnRpdHk9IkNPU1QiIGRlc2NyaXB0aW9uPSJDb3N0IGluIEVVUiIgdW5pdD0iRVVSTyIvPgogICAgICAgICAgPC9tYXJnaW5hbENvc3RzPgogICAgICAgIDwvY29zdEluZm9ybWF0aW9uPgogICAgICA8L2Fzc2V0PgogICAgICA8YXNzZXQgeHNpOnR5cGU9ImVzZGw6UGlwZSIgZGlhbWV0ZXI9IkRONDUwIiBuYW1lPSJQaXBlX2Y2ZTUiIGxlbmd0aD0iMjM5LjciIGlubmVyRGlhbWV0ZXI9IjAuNDQ0NCIgaWQ9ImY2ZTVhNzYwLTAxZDUtNDM0MS1iZjE1LWI4ZDMzYjdiZWE1MCIgb3V0ZXJEaWFtZXRlcj0iMC42MyI+CiAgICAgICAgPGdlb21ldHJ5IHhzaTp0eXBlPSJlc2RsOkxpbmUiIENSUz0iV0dTODQiPgogICAgICAgICAgPHBvaW50IHhzaTp0eXBlPSJlc2RsOlBvaW50IiBsb249IjQuMzExNzI2MDkzMjkyMjM3IiBsYXQ9IjUyLjA0NDg3NjIxNjY0MTAzIi8+CiAgICAgICAgICA8cG9pbnQgeHNpOnR5cGU9ImVzZGw6UG9pbnQiIGxvbj0iNC4zMTE2OTUyNDc4ODg1NjYiIGxhdD0iNTIuMDQyNzIwODYxOTM4ODU0Ii8+CiAgICAgICAgPC9nZW9tZXRyeT4KICAgICAgICA8cG9ydCB4c2k6dHlwZT0iZXNkbDpJblBvcnQiIGNvbm5lY3RlZFRvPSI4ODZlNTQzMC1iZWMxLTQ0ZTMtYmFiNi0yMjFjNDUxOGM4MTAiIGlkPSJiYmZlZDgzMC0wNzFkLTRkMDItYmRkZC1lNzA5MjQ3YzgzMzciIGNhcnJpZXI9IjdiMzJlMjg3LWQ3NzUtNDgwYy1iMzE3LTY0ZmZkYWNmMTJjOSIgbmFtZT0iSW4iLz4KICAgICAgICA8cG9ydCB4c2k6dHlwZT0iZXNkbDpPdXRQb3J0IiBpZD0iZjk2NmJhZGUtMWZhZC00NTNmLThlYzItNDA2MmVjNzBiYzdiIiBjb25uZWN0ZWRUbz0iNTE4NTI4NjEtYWVlYi00NjFmLWI4ZWMtMDhmMDAwYWJjNmRkIiBjYXJyaWVyPSI3YjMyZTI4Ny1kNzc1LTQ4MGMtYjMxNy02NGZmZGFjZjEyYzkiIG5hbWU9Ik91dCIvPgogICAgICAgIDxtYXRlcmlhbCB4c2k6dHlwZT0iZXNkbDpDb21wb3VuZE1hdHRlciIgY29tcG91bmRUeXBlPSJMQVlFUkVEIj4KICAgICAgICAgIDxjb21wb25lbnQgeHNpOnR5cGU9ImVzZGw6Q29tcG91bmRNYXR0ZXJDb21wb25lbnQiIGxheWVyV2lkdGg9IjAuMDA2MyI+CiAgICAgICAgICAgIDxtYXR0ZXIgeHNpOnR5cGU9ImVzZGw6TWF0ZXJpYWwiIHRoZXJtYWxDb25kdWN0aXZpdHk9IjUyLjE1IiBuYW1lPSJzdGVlbCIgaWQ9IjM3MWMxZDcyLWRlMzUtNDU1OS05YjBlLTQ3MTcyZTVkMWQ4MyIvPgogICAgICAgICAgPC9jb21wb25lbnQ+CiAgICAgICAgICA8Y29tcG9uZW50IHhzaTp0eXBlPSJlc2RsOkNvbXBvdW5kTWF0dGVyQ29tcG9uZW50IiBsYXllcldpZHRoPSIwLjA4MDUiPgogICAgICAgICAgICA8bWF0dGVyIHhzaTp0eXBlPSJlc2RsOk1hdGVyaWFsIiB0aGVybWFsQ29uZHVjdGl2aXR5PSIwLjAyNyIgbmFtZT0iUFVSIiBpZD0iZGYzMGJkMzctMmZjNC00OTkzLTgyOGYtMWI3Y2YxZTgyMDJjIi8+CiAgICAgICAgICA8L2NvbXBvbmVudD4KICAgICAgICAgIDxjb21wb25lbnQgeHNpOnR5cGU9ImVzZGw6Q29tcG91bmRNYXR0ZXJDb21wb25lbnQiIGxheWVyV2lkdGg9IjAuMDA2Ij4KICAgICAgICAgICAgPG1hdHRlciB4c2k6dHlwZT0iZXNkbDpNYXRlcmlhbCIgdGhlcm1hbENvbmR1Y3Rpdml0eT0iMC40IiBuYW1lPSJIRFBFIiBpZD0iZjUzZGUzN2ItYTczNS00YjBkLWIyMjYtYTZiNzIyMDI5YTAxIi8+CiAgICAgICAgICA8L2NvbXBvbmVudD4KICAgICAgICA8L21hdGVyaWFsPgogICAgICAgIDxkYXRhU291cmNlIHhzaTp0eXBlPSJlc2RsOkRhdGFTb3VyY2UiIGF0dHJpYnV0aW9uPSJodHRwczovL3d3dy5sb2dzdG9yLmNvbS9tZWRpYS82NTA2L3Byb2R1Y3QtY2F0YWxvZ3VlLXVrLTIwMjAwMy5wZGYiIG5hbWU9IkxvZ3N0b3IgUHJvZHVjdCBDYXRhbG9ndWUgVmVyc2lvbiAyMDIwLjAzIi8+CiAgICAgICAgPGNvc3RJbmZvcm1hdGlvbiB4c2k6dHlwZT0iZXNkbDpDb3N0SW5mb3JtYXRpb24iIGlkPSIyMmZiMmU4NS03YTgxLTQzNzEtYjZhYi02ZDUxMDFiOGNhNDUiPgogICAgICAgICAgPGludmVzdG1lbnRDb3N0cyB4c2k6dHlwZT0iZXNkbDpTaW5nbGVWYWx1ZSIgbmFtZT0iQ29tYmluZWQgaW52ZXN0bWVudCBhbmQgaW5zdGFsbGF0aW9uIGNvc3RzIiBpZD0iYTQwMTY1ZTgtODhiZC00OWI5LTgxZDktMjk4ODEyYWMwMTcwIiB2YWx1ZT0iMzQxNy45Ij4KICAgICAgICAgICAgPHByb2ZpbGVRdWFudGl0eUFuZFVuaXQgeHNpOnR5cGU9ImVzZGw6UXVhbnRpdHlBbmRVbml0VHlwZSIgaWQ9ImQwYWViYzc2LTIwMWItNGIyZC04MWZlLTU1MjY5ZmNlZmUzYiIgZGVzY3JpcHRpb249IkNvc3RzIGluIEVVUi9tIiBwZXJVbml0PSJNRVRSRSIgcGh5c2ljYWxRdWFudGl0eT0iQ09TVCIgdW5pdD0iRVVSTyIvPgogICAgICAgICAgPC9pbnZlc3RtZW50Q29zdHM+CiAgICAgICAgPC9jb3N0SW5mb3JtYXRpb24+CiAgICAgIDwvYXNzZXQ+CiAgICAgIDxhc3NldCB4c2k6dHlwZT0iZXNkbDpQaXBlIiBkaWFtZXRlcj0iRE40NTAiIG5hbWU9IlBpcGVfZjZlNV9yZXQiIGxlbmd0aD0iMjMzLjkiIGlubmVyRGlhbWV0ZXI9IjAuNDQ0NCIgaWQ9IjBkYjkxNTE1LTQxOGEtNGJjYi05ZDk5LTkwNDdjMWNhOGJkZiIgb3V0ZXJEaWFtZXRlcj0iMC42MyI+CiAgICAgICAgPGdlb21ldHJ5IHhzaTp0eXBlPSJlc2RsOkxpbmUiIENSUz0iV0dTODQiPgogICAgICAgICAgPHBvaW50IHhzaTp0eXBlPSJlc2RsOlBvaW50IiBsb249IjQuMzExMDc0NDAyNjY1NjQ5IiBsYXQ9IjUyLjA0MjgxMDg2MjAyODg1Ii8+CiAgICAgICAgICA8cG9pbnQgeHNpOnR5cGU9ImVzZGw6UG9pbnQiIGxvbj0iNC4zMTE3MjYwOTMyOTIyMzciIGxhdD0iNTIuMDQ0ODc2MjE2NjQxMDMiLz4KICAgICAgICA8L2dlb21ldHJ5PgogICAgICAgIDxwb3J0IHhzaTp0eXBlPSJlc2RsOkluUG9ydCIgY29ubmVjdGVkVG89IjI5MTNlNjQ1LWIwMjctNDI5ZS1iZjVkLTIyYWNlOTZhMzlmYSIgaWQ9IjQyZTlmODZiLWVhOTYtNDk5Mi1iZjNmLTljYmFlOGE0YTM5YyIgY2Fycmllcj0iN2IzMmUyODctZDc3NS00ODBjLWIzMTctNjRmZmRhY2YxMmM5X3JldCIgbmFtZT0iSW4iLz4KICAgICAgICA8cG9ydCB4c2k6dHlwZT0iZXNkbDpPdXRQb3J0IiBpZD0iZGY2Zjg5ZDAtNzg3Mi00ODkxLTkzNGYtZGU0MDdmNmFhMTQyIiBjb25uZWN0ZWRUbz0iYzdlZDg5MTUtZGRkMC00N2Y4LTkzZDYtMWRhYmZiNWQzMjBiIiBjYXJyaWVyPSI3YjMyZTI4Ny1kNzc1LTQ4MGMtYjMxNy02NGZmZGFjZjEyYzlfcmV0IiBuYW1lPSJPdXQiLz4KICAgICAgICA8bWF0ZXJpYWwgeHNpOnR5cGU9ImVzZGw6Q29tcG91bmRNYXR0ZXIiIGNvbXBvdW5kVHlwZT0iTEFZRVJFRCI+CiAgICAgICAgICA8Y29tcG9uZW50IHhzaTp0eXBlPSJlc2RsOkNvbXBvdW5kTWF0dGVyQ29tcG9uZW50IiBsYXllcldpZHRoPSIwLjAwNjMiPgogICAgICAgICAgICA8bWF0dGVyIHhzaTp0eXBlPSJlc2RsOk1hdGVyaWFsIiB0aGVybWFsQ29uZHVjdGl2aXR5PSI1Mi4xNSIgbmFtZT0ic3RlZWwiIGlkPSIzNzFjMWQ3Mi1kZTM1LTQ1NTktOWIwZS00NzE3MmU1ZDFkODMiLz4KICAgICAgICAgIDwvY29tcG9uZW50PgogICAgICAgICAgPGNvbXBvbmVudCB4c2k6dHlwZT0iZXNkbDpDb21wb3VuZE1hdHRlckNvbXBvbmVudCIgbGF5ZXJXaWR0aD0iMC4wODA1Ij4KICAgICAgICAgICAgPG1hdHRlciB4c2k6dHlwZT0iZXNkbDpNYXRlcmlhbCIgdGhlcm1hbENvbmR1Y3Rpdml0eT0iMC4wMjciIG5hbWU9IlBVUiIgaWQ9ImRmMzBiZDM3LTJmYzQtNDk5My04MjhmLTFiN2NmMWU4MjAyYyIvPgogICAgICAgICAgPC9jb21wb25lbnQ+CiAgICAgICAgICA8Y29tcG9uZW50IHhzaTp0eXBlPSJlc2RsOkNvbXBvdW5kTWF0dGVyQ29tcG9uZW50IiBsYXllcldpZHRoPSIwLjAwNiI+CiAgICAgICAgICAgIDxtYXR0ZXIgeHNpOnR5cGU9ImVzZGw6TWF0ZXJpYWwiIHRoZXJtYWxDb25kdWN0aXZpdHk9IjAuNCIgbmFtZT0iSERQRSIgaWQ9ImY1M2RlMzdiLWE3MzUtNGIwZC1iMjI2LWE2YjcyMjAyOWEwMSIvPgogICAgICAgICAgPC9jb21wb25lbnQ+CiAgICAgICAgPC9tYXRlcmlhbD4KICAgICAgICA8ZGF0YVNvdXJjZSB4c2k6dHlwZT0iZXNkbDpEYXRhU291cmNlIiBhdHRyaWJ1dGlvbj0iaHR0cHM6Ly93d3cubG9nc3Rvci5jb20vbWVkaWEvNjUwNi9wcm9kdWN0LWNhdGFsb2d1ZS11ay0yMDIwMDMucGRmIiBuYW1lPSJMb2dzdG9yIFByb2R1Y3QgQ2F0YWxvZ3VlIFZlcnNpb24gMjAyMC4wMyIvPgogICAgICAgIDxjb3N0SW5mb3JtYXRpb24geHNpOnR5cGU9ImVzZGw6Q29zdEluZm9ybWF0aW9uIiBpZD0iN2NiYzljMzItM2Q3ZC00NGUxLWFiNzMtNTk4NDU5Mjk0ZjBjIj4KICAgICAgICAgIDxpbnZlc3RtZW50Q29zdHMgeHNpOnR5cGU9ImVzZGw6U2luZ2xlVmFsdWUiIG5hbWU9IkNvbWJpbmVkIGludmVzdG1lbnQgYW5kIGluc3RhbGxhdGlvbiBjb3N0cyIgaWQ9ImE0MDE2NWU4LTg4YmQtNDliOS04MWQ5LTI5ODgxMmFjMDE3MCIgdmFsdWU9IjM0MTcuOSI+CiAgICAgICAgICAgIDxwcm9maWxlUXVhbnRpdHlBbmRVbml0IHhzaTp0eXBlPSJlc2RsOlF1YW50aXR5QW5kVW5pdFR5cGUiIGlkPSJkMGFlYmM3Ni0yMDFiLTRiMmQtODFmZS01NTI2OWZjZWZlM2IiIGRlc2NyaXB0aW9uPSJDb3N0cyBpbiBFVVIvbSIgcGVyVW5pdD0iTUVUUkUiIHBoeXNpY2FsUXVhbnRpdHk9IkNPU1QiIHVuaXQ9IkVVUk8iLz4KICAgICAgICAgIDwvaW52ZXN0bWVudENvc3RzPgogICAgICAgIDwvY29zdEluZm9ybWF0aW9uPgogICAgICA8L2Fzc2V0PgogICAgICA8YXNzZXQgeHNpOnR5cGU9ImVzZGw6UGlwZSIgZGlhbWV0ZXI9IkRONDAwIiBuYW1lPSJQaXBlX2IyYTQiIG91dGVyRGlhbWV0ZXI9IjAuNjMiIGlkPSJiMmE0MTQ5Yi1hYjVjLTQ2ZmItODA3ZS1hYjU2N2Q4NTljMmEiIGlubmVyRGlhbWV0ZXI9IjAuMzkzOCIgbGVuZ3RoPSIyNTkuNSI+CiAgICAgICAgPGdlb21ldHJ5IHhzaTp0eXBlPSJlc2RsOkxpbmUiIENSUz0iV0dTODQiPgogICAgICAgICAgPHBvaW50IHhzaTp0eXBlPSJlc2RsOlBvaW50IiBsb249IjQuMzExNjk1MjQ3ODg4NTY2IiBsYXQ9IjUyLjA0MjcyMDg2MTkzODg1NCIvPgogICAgICAgICAgPHBvaW50IHhzaTp0eXBlPSJlc2RsOlBvaW50IiBsb249IjQuMzE0OTQ0NzQ0MTEwMTA4IiBsYXQ9IjUyLjA0MzkyNTk5MjcwNjE5Ii8+CiAgICAgICAgPC9nZW9tZXRyeT4KICAgICAgICA8bWF0ZXJpYWwgeHNpOnR5cGU9ImVzZGw6Q29tcG91bmRNYXR0ZXIiIGNvbXBvdW5kVHlwZT0iTEFZRVJFRCI+CiAgICAgICAgICA8Y29tcG9uZW50IHhzaTp0eXBlPSJlc2RsOkNvbXBvdW5kTWF0dGVyQ29tcG9uZW50IiBsYXllcldpZHRoPSIwLjAwNjMiPgogICAgICAgICAgICA8bWF0dGVyIHhzaTp0eXBlPSJlc2RsOk1hdGVyaWFsIiB0aGVybWFsQ29uZHVjdGl2aXR5PSI1Mi4xNSIgaWQ9ImFlMzJkMzBiLTRlMGQtNDQ3MC1hNGYwLTRiYTdiZDI1ODA3MCIgbmFtZT0ic3RlZWwiLz4KICAgICAgICAgIDwvY29tcG9uZW50PgogICAgICAgICAgPGNvbXBvbmVudCB4c2k6dHlwZT0iZXNkbDpDb21wb3VuZE1hdHRlckNvbXBvbmVudCIgbGF5ZXJXaWR0aD0iMC4xMDUyIj4KICAgICAgICAgICAgPG1hdHRlciB4c2k6dHlwZT0iZXNkbDpNYXRlcmlhbCIgdGhlcm1hbENvbmR1Y3Rpdml0eT0iMC4wMjciIGlkPSI1ZDU5MWI1OC0yY2Y4LTRkOTQtOTFlYi1iZTc3M2UxYzI1ZWUiIG5hbWU9IlBVUiIvPgogICAgICAgICAgPC9jb21wb25lbnQ+CiAgICAgICAgICA8Y29tcG9uZW50IHhzaTp0eXBlPSJlc2RsOkNvbXBvdW5kTWF0dGVyQ29tcG9uZW50IiBsYXllcldpZHRoPSIwLjAwNjYiPgogICAgICAgICAgICA8bWF0dGVyIHhzaTp0eXBlPSJlc2RsOk1hdGVyaWFsIiB0aGVybWFsQ29uZHVjdGl2aXR5PSIwLjQiIGlkPSI4YTAyNzljYy1hZmJmLTQ2ZmItYTU5MC0zMzk2MGNlMzA2MTMiIG5hbWU9IkhEUEUiLz4KICAgICAgICAgIDwvY29tcG9uZW50PgogICAgICAgIDwvbWF0ZXJpYWw+CiAgICAgICAgPHBvcnQgeHNpOnR5cGU9ImVzZGw6SW5Qb3J0IiBjb25uZWN0ZWRUbz0iYzBlYWM0ZGItZjVkYS00N2YzLTgyMDItODQzOGQwMDBiZDMyIiBpZD0iMmNjNzczZWUtYjU2Mi00ZTFmLWExZDEtYTI2NTZlMTA5MDdkIiBjYXJyaWVyPSI3YjMyZTI4Ny1kNzc1LTQ4MGMtYjMxNy02NGZmZGFjZjEyYzkiIG5hbWU9IkluIi8+CiAgICAgICAgPHBvcnQgeHNpOnR5cGU9ImVzZGw6T3V0UG9ydCIgaWQ9IjAxYzg4MmY3LWVjMTUtNGQzNC05ZjQzLTgxODE5NzJmMjUwMCIgY29ubmVjdGVkVG89IjZiODNlNzRkLTVmZjEtNGZmYS04YmQ0LWRlMTE1NGI1NDFlMiIgY2Fycmllcj0iN2IzMmUyODctZDc3NS00ODBjLWIzMTctNjRmZmRhY2YxMmM5IiBuYW1lPSJPdXQiLz4KICAgICAgICA8ZGF0YVNvdXJjZSB4c2k6dHlwZT0iZXNkbDpEYXRhU291cmNlIiBhdHRyaWJ1dGlvbj0iaHR0cHM6Ly93d3cubG9nc3Rvci5jb20vbWVkaWEvNjUwNi9wcm9kdWN0LWNhdGFsb2d1ZS11ay0yMDIwMDMucGRmIiBuYW1lPSJMb2dzdG9yIFByb2R1Y3QgQ2F0YWxvZ3VlIFZlcnNpb24gMjAyMC4wMyIvPgogICAgICAgIDxjb3N0SW5mb3JtYXRpb24geHNpOnR5cGU9ImVzZGw6Q29zdEluZm9ybWF0aW9uIiBpZD0iZmFjYjYxMGEtMWJiYy00NTAzLThlMDItOWE3Njc1NThlY2RmIj4KICAgICAgICAgIDxpbnZlc3RtZW50Q29zdHMgeHNpOnR5cGU9ImVzZGw6U2luZ2xlVmFsdWUiIG5hbWU9IkNvbWJpbmVkIGludmVzdG1lbnQgYW5kIGluc3RhbGxhdGlvbiBjb3N0cyIgaWQ9IjU2NmQzZjI2LWY4NWEtNDhiNC1iMDZhLTVmZDYyYWM2ZmE2MSIgdmFsdWU9IjI4NDAuNiI+CiAgICAgICAgICAgIDxwcm9maWxlUXVhbnRpdHlBbmRVbml0IHhzaTp0eXBlPSJlc2RsOlF1YW50aXR5QW5kVW5pdFR5cGUiIGlkPSI1YjEwODVlNC01NjQyLTRjMWQtYWE3Yy1iZmI3NzkzZDRlNjQiIGRlc2NyaXB0aW9uPSJDb3N0cyBpbiBFVVIvbSIgcGVyVW5pdD0iTUVUUkUiIHBoeXNpY2FsUXVhbnRpdHk9IkNPU1QiIHVuaXQ9IkVVUk8iLz4KICAgICAgICAgIDwvaW52ZXN0bWVudENvc3RzPgogICAgICAgIDwvY29zdEluZm9ybWF0aW9uPgogICAgICA8L2Fzc2V0PgogICAgICA8YXNzZXQgeHNpOnR5cGU9ImVzZGw6UGlwZSIgZGlhbWV0ZXI9IkRONDAwIiBuYW1lPSJQaXBlX2IyYTRfcmV0IiBvdXRlckRpYW1ldGVyPSIwLjYzIiBpZD0iYTUyNzYwMzAtYTM0Ny00NWI1LTliOGItMWNkYTNhZGE0NTkwIiBpbm5lckRpYW1ldGVyPSIwLjM5MzgiIGxlbmd0aD0iMjU5LjEiPgogICAgICAgIDxnZW9tZXRyeSB4c2k6dHlwZT0iZXNkbDpMaW5lIiBDUlM9IldHUzg0Ij4KICAgICAgICAgIDxwb2ludCB4c2k6dHlwZT0iZXNkbDpQb2ludCIgbG9uPSI0LjMxNDUwNDg2MTgzMTY2NiIgbGF0PSI1Mi4wNDQwMzE1NzQxNDEwNjYiLz4KICAgICAgICAgIDxwb2ludCB4c2k6dHlwZT0iZXNkbDpQb2ludCIgbG9uPSI0LjMxMTE4OTY1MTQ4OTI1OSIgbGF0PSI1Mi4wNDI5MDMxNTk2NDM5MiIvPgogICAgICAgIDwvZ2VvbWV0cnk+CiAgICAgICAgPG1hdGVyaWFsIHhzaTp0eXBlPSJlc2RsOkNvbXBvdW5kTWF0dGVyIiBjb21wb3VuZFR5cGU9IkxBWUVSRUQiPgogICAgICAgICAgPGNvbXBvbmVudCB4c2k6dHlwZT0iZXNkbDpDb21wb3VuZE1hdHRlckNvbXBvbmVudCIgbGF5ZXJXaWR0aD0iMC4wMDYzIj4KICAgICAgICAgICAgPG1hdHRlciB4c2k6dHlwZT0iZXNkbDpNYXRlcmlhbCIgdGhlcm1hbENvbmR1Y3Rpdml0eT0iNTIuMTUiIGlkPSJhZTMyZDMwYi00ZTBkLTQ0NzAtYTRmMC00YmE3YmQyNTgwNzAiIG5hbWU9InN0ZWVsIi8+CiAgICAgICAgICA8L2NvbXBvbmVudD4KICAgICAgICAgIDxjb21wb25lbnQgeHNpOnR5cGU9ImVzZGw6Q29tcG91bmRNYXR0ZXJDb21wb25lbnQiIGxheWVyV2lkdGg9IjAuMTA1MiI+CiAgICAgICAgICAgIDxtYXR0ZXIgeHNpOnR5cGU9ImVzZGw6TWF0ZXJpYWwiIHRoZXJtYWxDb25kdWN0aXZpdHk9IjAuMDI3IiBpZD0iNWQ1OTFiNTgtMmNmOC00ZDk0LTkxZWItYmU3NzNlMWMyNWVlIiBuYW1lPSJQVVIiLz4KICAgICAgICAgIDwvY29tcG9uZW50PgogICAgICAgICAgPGNvbXBvbmVudCB4c2k6dHlwZT0iZXNkbDpDb21wb3VuZE1hdHRlckNvbXBvbmVudCIgbGF5ZXJXaWR0aD0iMC4wMDY2Ij4KICAgICAgICAgICAgPG1hdHRlciB4c2k6dHlwZT0iZXNkbDpNYXRlcmlhbCIgdGhlcm1hbENvbmR1Y3Rpdml0eT0iMC40IiBpZD0iOGEwMjc5Y2MtYWZiZi00NmZiLWE1OTAtMzM5NjBjZTMwNjEzIiBuYW1lPSJIRFBFIi8+CiAgICAgICAgICA8L2NvbXBvbmVudD4KICAgICAgICA8L21hdGVyaWFsPgogICAgICAgIDxwb3J0IHhzaTp0eXBlPSJlc2RsOkluUG9ydCIgY29ubmVjdGVkVG89IjExZTM1ODliLTlhMmQtNDk3ZS1iYzJmLWZmZjNlMzRkNmVmZSIgaWQ9ImNhZDE2MjUzLWYwMDEtNDdmMC1hZWIwLTFlNTMyZjUyMTNlNyIgY2Fycmllcj0iN2IzMmUyODctZDc3NS00ODBjLWIzMTctNjRmZmRhY2YxMmM5X3JldCIgbmFtZT0iSW4iLz4KICAgICAgICA8cG9ydCB4c2k6dHlwZT0iZXNkbDpPdXRQb3J0IiBpZD0iNmNjYjAwNWMtNDVkNC00MjIwLTkyODYtY2M4Zjc3YjAzZWM2IiBjb25uZWN0ZWRUbz0iNzg5MzEyNWQtZDgyZi00ZmU4LWFhZWEtNWZiNmFmZWNjNjM1IiBjYXJyaWVyPSI3YjMyZTI4Ny1kNzc1LTQ4MGMtYjMxNy02NGZmZGFjZjEyYzlfcmV0IiBuYW1lPSJPdXQiLz4KICAgICAgICA8ZGF0YVNvdXJjZSB4c2k6dHlwZT0iZXNkbDpEYXRhU291cmNlIiBhdHRyaWJ1dGlvbj0iaHR0cHM6Ly93d3cubG9nc3Rvci5jb20vbWVkaWEvNjUwNi9wcm9kdWN0LWNhdGFsb2d1ZS11ay0yMDIwMDMucGRmIiBuYW1lPSJMb2dzdG9yIFByb2R1Y3QgQ2F0YWxvZ3VlIFZlcnNpb24gMjAyMC4wMyIvPgogICAgICAgIDxjb3N0SW5mb3JtYXRpb24geHNpOnR5cGU9ImVzZGw6Q29zdEluZm9ybWF0aW9uIiBpZD0iMGRkNTcxY2ItYjdkYS00ZGU0LWJkZWMtNmFkNWE0MjMzNTU4Ij4KICAgICAgICAgIDxpbnZlc3RtZW50Q29zdHMgeHNpOnR5cGU9ImVzZGw6U2luZ2xlVmFsdWUiIG5hbWU9IkNvbWJpbmVkIGludmVzdG1lbnQgYW5kIGluc3RhbGxhdGlvbiBjb3N0cyIgaWQ9IjU2NmQzZjI2LWY4NWEtNDhiNC1iMDZhLTVmZDYyYWM2ZmE2MSIgdmFsdWU9IjI4NDAuNiI+CiAgICAgICAgICAgIDxwcm9maWxlUXVhbnRpdHlBbmRVbml0IHhzaTp0eXBlPSJlc2RsOlF1YW50aXR5QW5kVW5pdFR5cGUiIGlkPSI1YjEwODVlNC01NjQyLTRjMWQtYWE3Yy1iZmI3NzkzZDRlNjQiIGRlc2NyaXB0aW9uPSJDb3N0cyBpbiBFVVIvbSIgcGVyVW5pdD0iTUVUUkUiIHBoeXNpY2FsUXVhbnRpdHk9IkNPU1QiIHVuaXQ9IkVVUk8iLz4KICAgICAgICAgIDwvaW52ZXN0bWVudENvc3RzPgogICAgICAgIDwvY29zdEluZm9ybWF0aW9uPgogICAgICA8L2Fzc2V0PgogICAgPC9hcmVhPgogIDwvaW5zdGFuY2U+CjwvZXNkbDpFbmVyZ3lTeXN0ZW0+Cg==" # noqa + +print("Application started") + +app = Celery( + "omotes", + broker="amqp://user:bitnami@rabbitmq", + backend="rpc://user:bitnami@rabbitmq", + worker_prefetch_multiplier=1, + task_acks_late=True, + task_reject_on_worker_lost=True, + # task_serializer="pickle", + # result_serializer="pickle", + # accept_content=["application/json", "application/x-python-serialize"], +) +print("Celery started") + + +def task_monitor() -> None: + def on_event(event: dict[str, str]) -> None: + print("EVENT HAPPENED: ", event["type"]) + + def on_progress_update(event: Any) -> None: + print( + "################################ TASK PROGRESS UPDATED: ", + event["progress"]["fraction"] * 100, + ) + + while True: + try: + with app.connection() as conn: + recv = app.events.Receiver( + conn, + handlers={ + "task-failed": on_event, + "task-succeeded": on_event, + "task-sent": on_event, + "task-received": on_event, + "task-revoked": on_event, + "task-started": on_event, + "task-progress-update": on_progress_update, + # OR: '*' : on_event + }, + ) + recv.capture(limit=None, timeout=None) + except (KeyboardInterrupt, SystemExit): + print("EXCEPTION KEYBOARD INTERRUPT") + sys.exit() + + +def print_result(result: dict[str, str], task_name: str) -> None: + if "error_message" in result: + print( + f"Error message: {result['error_message']}, exit code: {result['exit_code']} " + "from task: {task_name}" + ) + print(f"logs: {result['logs']} from task: {task_name}") + else: + print(f"Received logs: '{result['logs']}' from task: {task_name}") + print(f"Output ESDL: '{result['output_esdl']}' from task: {task_name}") + + +t = threading.Thread(target=task_monitor) +t.daemon = True +t.start() + +q_name = "grow" +simulator_job_id: UUID = uuid4() + +optimizer_task = app.signature( + "simulator", (simulator_job_id, input_esdl_no_influx), queue=q_name +).delay() +print("waiting for tasks...") +print_result(jsonpickle.decode(optimizer_task.get()), "optimizer-task")